25 #ifndef ACE_SEGMENT_LED_MATRIX_DIRECT_H
26 #define ACE_SEGMENT_LED_MATRIX_DIRECT_H
29 #include "../hw/GpioInterface.h"
30 #include "LedMatrixBase.h"
32 class LedMatrixDirectTest_drawElements;
34 namespace ace_segment {
43 template <
typename T_GPIOI = GpioInterface>
47 uint8_t elementOnPattern,
48 uint8_t groupOnPattern,
50 const uint8_t* elementPins,
52 const uint8_t* groupPins
55 mElementPins(elementPins),
56 mGroupPins(groupPins),
57 mNumElements(numElements),
63 uint8_t output = (0x00 ^ mElementXorMask) & 0x1;
64 for (uint8_t element = 0; element < mNumElements; element++) {
65 uint8_t elementPin = mElementPins[element];
66 T_GPIOI::pinMode(elementPin, OUTPUT);
67 T_GPIOI::digitalWrite(elementPin, output);
71 output = (0x00 ^ mGroupXorMask) & 0x1;
72 for (uint8_t group = 0; group < mNumGroups; group++) {
73 uint8_t pin = mGroupPins[group];
74 T_GPIOI::pinMode(pin, OUTPUT);
75 T_GPIOI::digitalWrite(pin, output);
81 for (uint8_t element = 0; element < mNumElements; element++) {
82 uint8_t elementPin = mElementPins[element];
83 T_GPIOI::pinMode(elementPin, INPUT);
87 for (uint8_t group = 0; group < mNumGroups; group++) {
88 uint8_t pin = mGroupPins[group];
89 T_GPIOI::pinMode(pin, INPUT);
93 void draw(uint8_t group, uint8_t elementPattern)
const {
94 if (group != mPrevGroup) {
95 disableGroup(mPrevGroup);
98 drawElements(elementPattern);
103 void enableGroup(uint8_t group)
const {
104 writeGroupPin(group, 0x1);
108 void disableGroup(uint8_t group)
const {
109 writeGroupPin(group, 0x0);
114 for (uint8_t group = 0; group < mNumGroups; group++) {
121 friend class ::LedMatrixDirectTest_drawElements;
124 void drawElements(uint8_t pattern)
const {
125 for (uint8_t element = 0; element < mNumElements; element++) {
126 writeElementPin(element, pattern);
132 void writeElementPin(uint8_t element, uint8_t output)
const {
133 uint8_t elementPin = mElementPins[element];
134 T_GPIOI::digitalWrite(elementPin, (output ^ mElementXorMask) & 0x1);
138 void writeGroupPin(uint8_t group, uint8_t output)
const {
139 uint8_t groupPin = mGroupPins[group];
140 T_GPIOI::digitalWrite(groupPin, (output ^ mGroupXorMask) & 0x1);
144 const uint8_t*
const mElementPins;
145 const uint8_t*
const mGroupPins;
146 uint8_t
const mNumElements;
147 uint8_t
const mNumGroups;
150 mutable uint8_t mPrevGroup = 0;