25 #ifndef ACE_SEGMENT_LED_MATRIX_SINGLE_SHIFT_REGISTER_H
26 #define ACE_SEGMENT_LED_MATRIX_SINGLE_SHIFT_REGISTER_H
29 #include "LedMatrixBase.h"
31 class LedMatrixSingleShiftRegisterTest_drawElements;
33 namespace ace_segment {
49 template<
typename H,
typename SA>
55 uint8_t groupOnPattern,
56 uint8_t elementOnPattern,
58 const uint8_t* groupPins
62 mSpiAdapter(spiAdapter),
63 mGroupPins(groupPins),
69 uint8_t output = (0x00 ^ mGroupXorMask) & 0x1;
70 for (uint8_t group = 0; group < mNumGroups; group++) {
71 uint8_t pin = mGroupPins[group];
72 mHardware.pinMode(pin, OUTPUT);
73 mHardware.digitalWrite(pin, output);
79 for (uint8_t group = 0; group < mNumGroups; group++) {
80 uint8_t pin = mGroupPins[group];
81 mHardware.pinMode(pin, INPUT);
85 void draw(uint8_t group, uint8_t elementPattern)
const {
86 if (group != mPrevGroup) {
87 disableGroup(mPrevGroup);
90 drawElements(elementPattern);
95 void enableGroup(uint8_t group)
const {
96 writeGroupPin(group, 0x1);
100 void disableGroup(uint8_t group)
const {
101 writeGroupPin(group, 0x0);
106 for (uint8_t group = 0; group < mNumGroups; group++) {
113 friend class ::LedMatrixSingleShiftRegisterTest_drawElements;
116 void drawElements(uint8_t pattern)
const {
117 uint8_t actualPattern = pattern ^ mElementXorMask;
118 mSpiAdapter.transfer(actualPattern);
122 void writeGroupPin(uint8_t group, uint8_t output)
const {
123 uint8_t groupPin = mGroupPins[group];
124 mHardware.digitalWrite(groupPin, (output ^ mGroupXorMask) & 0x1);
129 const SA& mSpiAdapter;
130 const uint8_t*
const mGroupPins;
131 uint8_t
const mNumGroups;
134 mutable uint8_t mPrevGroup = 0;