25 #ifndef ACE_SEGMENT_WRITER_NUMBER_WRITER_H
26 #define ACE_SEGMENT_WRITER_NUMBER_WRITER_H
29 #include "PatternWriter.h"
31 namespace ace_segment {
34 const uint8_t kNumHexCharPatterns = 18;
37 extern const uint8_t kHexCharPatterns[kNumHexCharPatterns];
54 typedef uint8_t hexchar_t;
57 const hexchar_t kHexCharSpace = 0x10;
60 const hexchar_t kHexCharMinus = 0x11;
71 template <
typename T_LED_MODULE>
80 T_LED_MODULE&
ledModule() {
return mPatternWriter.ledModule(); }
91 writeInternalHexCharAt(
92 pos, ((uint8_t) c < kNumHexCharPatterns) ? c : kHexCharSpace);
97 for (uint8_t i = 0; i < len; ++i) {
104 uint8_t low = (b & 0x0F);
106 uint8_t high = (b & 0x0F);
108 writeInternalHexCharAt(pos++, high);
109 writeInternalHexCharAt(pos++, low);
114 uint8_t low = (w & 0xFF);
115 uint8_t high = (w >> 8) & 0xFF;
137 int8_t boxSize = 0) {
139 const uint8_t bufSize = 5;
140 hexchar_t buf[bufSize];
141 uint8_t start = toDecimal(num, buf, bufSize);
143 return writeHexCharsInsideBoxAt(
144 pos, &buf[start], bufSize - start, boxSize);
151 int8_t boxSize = 0) {
154 bool negative = num < 0;
155 uint16_t absNum = negative ? -num : num;
157 const uint8_t bufSize = 6;
158 hexchar_t buf[bufSize];
159 uint8_t start = toDecimal(absNum, buf, bufSize);
161 buf[--start] = kHexCharMinus;
164 return writeHexCharsInsideBoxAt(
165 pos, &buf[start], bufSize - start, boxSize);
181 uint8_t high = num / 10;
182 uint8_t low = num - high * 10;
193 mPatternWriter.writeDecimalPointAt(pos, state);
204 void clearToEnd(uint8_t pos) { mPatternWriter.clearToEnd(pos); }
212 void writeInternalHexCharAt(uint8_t pos, hexchar_t c) {
213 uint8_t pattern = pgm_read_byte(&kHexCharPatterns[(uint8_t) c]);
214 mPatternWriter.writePatternAt(pos, pattern);
218 void writeInternalHexCharsAt(uint8_t pos,
const hexchar_t s[],
220 for (uint8_t i = 0; i < len; ++i) {
221 writeInternalHexCharAt(pos++, s[i]);
231 uint8_t writeHexCharsInsideBoxAt(
237 uint8_t absBoxSize = (boxSize < 0) ? -boxSize : boxSize;
240 if (len >= absBoxSize) {
241 writeInternalHexCharsAt(pos, s, len);
246 uint8_t padSize = absBoxSize - len;
249 writeInternalHexCharsAt(pos, s, len);
251 while (padSize--) writeInternalHexCharAt(pos++, kHexCharSpace);
254 while (padSize--) writeInternalHexCharAt(pos++, kHexCharSpace);
255 writeInternalHexCharsAt(pos, s, len);
274 uint8_t toDecimal(uint16_t num, hexchar_t buf[], uint8_t bufSize) {
275 uint8_t pos = bufSize;
281 uint16_t quot = num / 10;
282 buf[--pos] = num - quot * 10;
289 PatternWriter<T_LED_MODULE> mPatternWriter;