95 lines
2.8 KiB
C++
95 lines
2.8 KiB
C++
#include "SevenSegmentNeoPixel.h"
|
|
#include <string.h>
|
|
|
|
// 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;
|
|
}
|