#include "SevenSegmentNeoPixel.h" #include // Standard digit segment patterns const uint8_t SevenSegmentNeoPixel::_segmentPatterns[10][7] = { {1,1,1,1,1,1,0}, // 0 {0,0,1,1,0,0,0}, // 1 {0,1,1,0,1,1,1}, // 2 {0,1,1,1,1,0,1}, // 3 {1,0,1,1,0,0,1}, // 4 {1,1,0,1,1,0,1}, // 5 {1,1,0,1,1,1,1}, // 6 {0,1,1,1,0,0,0}, // 7 {1,1,1,1,1,1,1}, // 8 {1,1,1,1,1,0,1} // 9 }; SevenSegmentNeoPixel::SevenSegmentNeoPixel(uint8_t digits, uint8_t pixelsPerSegment, uint8_t pin, const uint8_t* segmentOrder, neoPixelType type) : _digits(digits), _pixelsPerSegment(pixelsPerSegment), _pixelsPerDigit(pixelsPerSegment * _segmentsPerDigit), _numPixels(digits * pixelsPerSegment * _segmentsPerDigit), _strip(_numPixels, pin, type) { if (segmentOrder) { memcpy(_segmentOrder, segmentOrder, 7); } else { for (uint8_t i = 0; i < 7; ++i) _segmentOrder[i] = i; } } void SevenSegmentNeoPixel::begin() { _strip.begin(); _strip.show(); } void SevenSegmentNeoPixel::clear() { _strip.clear(); } void SevenSegmentNeoPixel::show() { _strip.show(); } void SevenSegmentNeoPixel::setBrightness(uint8_t brightness) { _strip.setBrightness(brightness); } void SevenSegmentNeoPixel::setDigit(uint8_t digitIndex, uint8_t value, uint32_t color) { if (digitIndex >= _digits || value > 9) return; for (uint8_t seg = 0; seg < _segmentsPerDigit; ++seg) { uint8_t physSeg = _segmentOrder[seg]; uint16_t start = getPixelOffset(digitIndex, physSeg); if (_segmentPatterns[value][seg]) { for (uint8_t i = 0; i < _pixelsPerSegment; ++i) { _strip.setPixelColor(start + i, color); } } else { for (uint8_t i = 0; i < _pixelsPerSegment; ++i) { _strip.setPixelColor(start + i, 0); } } } } void SevenSegmentNeoPixel::setAll(uint8_t value, uint32_t color) { for (uint8_t d = 0; d < _digits; ++d) { setDigit(d, value, color); } } void SevenSegmentNeoPixel::setSegments(uint8_t digitIndex, const uint8_t segments[7], uint32_t color) { if (digitIndex >= _digits) return; for (uint8_t seg = 0; seg < _segmentsPerDigit; ++seg) { uint8_t physSeg = _segmentOrder[seg]; uint16_t start = getPixelOffset(digitIndex, physSeg); for (uint8_t i = 0; i < _pixelsPerSegment; ++i) { _strip.setPixelColor(start + i, segments[seg] ? color : 0); } } } Adafruit_NeoPixel& SevenSegmentNeoPixel::getStrip() { return _strip; } const uint8_t* SevenSegmentNeoPixel::getSegmentPattern(uint8_t digit) { if (digit < 10) return _segmentPatterns[digit]; else return nullptr; } uint16_t SevenSegmentNeoPixel::getPixelOffset(uint8_t digitIndex, uint8_t segmentIndex) const { return digitIndex * _pixelsPerDigit + segmentIndex * _pixelsPerSegment; }