@@ -17,12 +17,24 @@ class SecondsFrame {
1717private:
1818 void setInitFrameSector ();
1919 void frameLogic ();
20+ bool checkIfFrameLoopShouldRun () const ;
21+ void updateMillisCounters ();
22+ bool checkIfFrameInit () const ;
23+ bool checkIftoRunFrameLogic () const ;
24+ uint16_t calcCurrentSecondFrameVariable ();
25+ void handleFrameSectorToggle ();
26+ void handleFrameSector ();
27+ void toggleFrameSectorUpToCurrent ();
28+ bool isFullMinute () const ;
29+ void handleFullMinute ();
30+ void handleSecondFrameChange ();
31+ void updateLedsIfClockworkMode ();
2032
2133public:
2234 SecondsFrame (const uint8_t num);
2335 ~SecondsFrame ();
2436
25- void setup ();
37+ void initFrame ();
2638 void loop ();
2739};
2840
@@ -41,86 +53,167 @@ SecondsFrame::SecondsFrame(const uint8_t num) {
4153 previousMillis = 0 ;
4254}
4355
56+ // ------------------------------------------------------------------------------
57+ // Helper functions
58+ // ------------------------------------------------------------------------------
59+
60+ bool SecondsFrame::checkIfFrameLoopShouldRun () const {
61+ return usedUhrType->numPixelsFrameMatrix () == 0 ;
62+ }
63+
64+ // ------------------------------------------------------------------------------
65+
66+ void SecondsFrame::updateMillisCounters () {
67+ unsigned long currentMillis = millis ();
68+ countMillisFrameIntervall += currentMillis - previousMillis;
69+ previousMillis = currentMillis;
70+ }
71+
72+ // ------------------------------------------------------------------------------
73+
74+ bool SecondsFrame::checkIfFrameInit () const {
75+ return G.progInit && G.prog == COMMAND_IDLE;
76+ }
77+
78+ // ------------------------------------------------------------------------------
79+
80+ bool SecondsFrame::checkIftoRunFrameLogic () const {
81+ return countMillisFrameIntervall >= frameIntervall;
82+ }
83+
84+ // ------------------------------------------------------------------------------
85+
86+ uint16_t SecondsFrame::calcCurrentSecondFrameVariable () {
87+ return _second / (60 .f / numFramePixels);
88+ }
89+
90+ // ------------------------------------------------------------------------------
91+
92+ void SecondsFrame::handleFrameSectorToggle () {
93+ if (_minute % 2 == 1 ) {
94+ memset (frameArray, true , sizeof (frameArray));
95+ }
96+ toggleFrameSectorUpToCurrent ();
97+ }
98+
99+ // ------------------------------------------------------------------------------
100+
101+ void SecondsFrame::handleFrameSector () { toggleFrameSectorUpToCurrent (); }
102+
103+ // ------------------------------------------------------------------------------
104+
105+ void SecondsFrame::toggleFrameSectorUpToCurrent () {
106+ for (uint8_t i = 0 ; i <= _secondFrame; i++) {
107+ frameArray[i] = !frameArray[i];
108+ }
109+ }
110+
44111// ------------------------------------------------------------------------------
45112
46113void SecondsFrame::setInitFrameSector () {
114+ memset (frameArray, false , sizeof (frameArray)); // Clear the frame array
115+
47116 switch (G.secondVariant ) {
48117 case SecondVariant::FrameSectorToggle:
49- if (_minute % 2 == 1 ) {
50- memset (frameArray, true , sizeof (numFramePixels));
51- }
52- /* intentianally no break */
118+ handleFrameSectorToggle ();
119+ break ;
53120 case SecondVariant::FrameSector:
54- for (uint8_t i = 0 ; i <= _secondFrame; i++) {
55- frameArray[i] = !frameArray[i];
56- }
121+ handleFrameSector ();
57122 break ;
58123 default :
124+ Serial.println (" [ERROR] frame.h - Invalid second variant" );
59125 break ;
60126 }
61127}
62128
63129// ------------------------------------------------------------------------------
64130
65- void SecondsFrame::setup () {
131+ void SecondsFrame::initFrame () {
66132 led.clearFrame ();
67- _secondFrame = _second / ( 60 . f / numFramePixels );
133+ _secondFrame = calcCurrentSecondFrameVariable ( );
68134 setInitFrameSector ();
69135 parametersChanged = true ;
70136}
71137
72138// ------------------------------------------------------------------------------
73139
140+ bool SecondsFrame::isFullMinute () const {
141+ return _secondFrame == numFramePixels;
142+ }
143+
144+ // ------------------------------------------------------------------------------
145+
146+ void SecondsFrame::handleFullMinute () {
147+ led.clearFrame ();
148+ memset (frameArray, false , sizeof (frameArray));
149+ _secondFrame = 0 ;
150+ setInitFrameSector ();
151+ }
152+
153+ // ------------------------------------------------------------------------------
154+
155+ void SecondsFrame::handleSecondFrameChange () {
156+ switch (G.secondVariant ) {
157+ case SecondVariant::FrameDot:
158+ frameArray[_secondFrame] = true ;
159+ if (_secondFrame != 0 ) {
160+ frameArray[_secondFrame - 1 ] = false ;
161+ }
162+ break ;
163+ case SecondVariant::FrameSector:
164+ case SecondVariant::FrameSectorToggle:
165+ frameArray[_secondFrame] = !frameArray[_secondFrame];
166+ break ;
167+ default :
168+ break ;
169+ }
170+ }
171+
172+ // ------------------------------------------------------------------------------
173+
174+ void SecondsFrame::updateLedsIfClockworkMode () {
175+ if (G.prog == COMMAND_IDLE && G.conf == COMMAND_IDLE) {
176+ led.clearFrame ();
177+ parametersChanged = true ;
178+ G.prog = COMMAND_MODE_WORD_CLOCK;
179+ }
180+ }
181+
182+ // ------------------------------------------------------------------------------
183+
74184void SecondsFrame::frameLogic () {
75185 countMillisFrameIntervall = 0 ;
76186 _secondFrame++;
77187
78- /* Every full minute */
79- if (_secondFrame == numFramePixels) {
80- led.clearFrame ();
81- memset (frameArray, false , sizeof (frameArray));
82- setInitFrameSector ();
83- _secondFrame = 0 ;
188+ if (isFullMinute ()) {
189+ handleFullMinute ();
84190 }
85191
86- /* Every (Frame-)Second*/
87192 if (lastSecondFrame != _secondFrame) {
88- switch (G.secondVariant ) {
89- case SecondVariant::FrameDot:
90- frameArray[_secondFrame] = true ;
91- if (_secondFrame != 0 ) {
92- frameArray[_secondFrame - 1 ] = false ;
93- }
94- break ;
95- case SecondVariant::FrameSector:
96- case SecondVariant::FrameSectorToggle:
97- frameArray[_secondFrame] = !frameArray[_secondFrame];
98- break ;
99- default :
100- break ;
101- }
193+ handleSecondFrameChange ();
102194 lastSecondFrame = _secondFrame;
103195 }
104196
105- /* Update LEDs corrosponding with mode Clockwork*/
106- if (G.prog == 0 && G.conf == 0 ) {
107- led.clear ();
108- G.prog = COMMAND_MODE_WORD_CLOCK;
109- }
197+ updateLedsIfClockworkMode ();
110198}
111199
200+ // ------------------------------------------------------------------------------
201+ // Loop function for SecondsFrame
112202// ------------------------------------------------------------------------------
113203
114204void SecondsFrame::loop () {
115- unsigned long currentMillis = millis ();
116- countMillisFrameIntervall += currentMillis - previousMillis ;
117- previousMillis = currentMillis;
205+ if ( checkIfFrameLoopShouldRun ()) {
206+ return ;
207+ }
118208
119- if (G.progInit && G.prog == 0 ) {
120- setup ();
209+ updateMillisCounters ();
210+
211+ if (checkIfFrameInit ()) {
212+ initFrame ();
121213 G.progInit = false ;
122214 }
123- if (countMillisFrameIntervall >= frameIntervall) {
215+
216+ if (checkIftoRunFrameLogic ()) {
124217 frameLogic ();
125218 }
126219}
0 commit comments