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>
56 uint8_t elementOnPattern,
57 uint8_t groupOnPattern,
59 const uint8_t* elementPins,
61 const uint8_t* groupPins
64 mElementPins(elementPins),
65 mGroupPins(groupPins),
66 mNumElements(numElements),
72 uint8_t output = (0x00 ^ mElementXorMask) & 0x1;
73 for (uint8_t element = 0; element < mNumElements; element++) {
74 uint8_t elementPin = mElementPins[element];
75 T_GPIOI::pinMode(elementPin, OUTPUT);
76 T_GPIOI::digitalWrite(elementPin, output);
80 output = (0x00 ^ mGroupXorMask) & 0x1;
81 for (uint8_t group = 0; group < mNumGroups; group++) {
82 uint8_t pin = mGroupPins[group];
83 T_GPIOI::pinMode(pin, OUTPUT);
84 T_GPIOI::digitalWrite(pin, output);
90 for (uint8_t element = 0; element < mNumElements; element++) {
91 uint8_t elementPin = mElementPins[element];
92 T_GPIOI::pinMode(elementPin, INPUT);
96 for (uint8_t group = 0; group < mNumGroups; group++) {
97 uint8_t pin = mGroupPins[group];
98 T_GPIOI::pinMode(pin, INPUT);
102 void draw(uint8_t group, uint8_t elementPattern)
const {
103 if (group != mPrevGroup) {
104 disableGroup(mPrevGroup);
107 drawElements(elementPattern);
112 void enableGroup(uint8_t group)
const {
113 writeGroupPin(group, 0x1);
117 void disableGroup(uint8_t group)
const {
118 writeGroupPin(group, 0x0);
123 for (uint8_t group = 0; group < mNumGroups; group++) {
130 friend class ::LedMatrixDirectTest_drawElements;
133 void drawElements(uint8_t pattern)
const {
134 for (uint8_t element = 0; element < mNumElements; element++) {
135 writeElementPin(element, pattern);
141 void writeElementPin(uint8_t element, uint8_t output)
const {
142 uint8_t elementPin = mElementPins[element];
143 T_GPIOI::digitalWrite(elementPin, (output ^ mElementXorMask) & 0x1);
147 void writeGroupPin(uint8_t group, uint8_t output)
const {
148 uint8_t groupPin = mGroupPins[group];
149 T_GPIOI::digitalWrite(groupPin, (output ^ mGroupXorMask) & 0x1);
153 const uint8_t*
const mElementPins;
154 const uint8_t*
const mGroupPins;
155 uint8_t
const mNumElements;
156 uint8_t
const mNumGroups;
159 mutable uint8_t mPrevGroup = 0;