@@ -17,12 +17,24 @@ class SecondsFrame {
17
17
private:
18
18
void setInitFrameSector ();
19
19
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 ();
20
32
21
33
public:
22
34
SecondsFrame (const uint8_t num);
23
35
~SecondsFrame ();
24
36
25
- void setup ();
37
+ void initFrame ();
26
38
void loop ();
27
39
};
28
40
@@ -41,86 +53,167 @@ SecondsFrame::SecondsFrame(const uint8_t num) {
41
53
previousMillis = 0 ;
42
54
}
43
55
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
+
44
111
// ------------------------------------------------------------------------------
45
112
46
113
void SecondsFrame::setInitFrameSector () {
114
+ memset (frameArray, false , sizeof (frameArray)); // Clear the frame array
115
+
47
116
switch (G.secondVariant ) {
48
117
case SecondVariant::FrameSectorToggle:
49
- if (_minute % 2 == 1 ) {
50
- memset (frameArray, true , sizeof (numFramePixels));
51
- }
52
- /* intentianally no break */
118
+ handleFrameSectorToggle ();
119
+ break ;
53
120
case SecondVariant::FrameSector:
54
- for (uint8_t i = 0 ; i <= _secondFrame; i++) {
55
- frameArray[i] = !frameArray[i];
56
- }
121
+ handleFrameSector ();
57
122
break ;
58
123
default :
124
+ Serial.println (" [ERROR] frame.h - Invalid second variant" );
59
125
break ;
60
126
}
61
127
}
62
128
63
129
// ------------------------------------------------------------------------------
64
130
65
- void SecondsFrame::setup () {
131
+ void SecondsFrame::initFrame () {
66
132
led.clearFrame ();
67
- _secondFrame = _second / ( 60 . f / numFramePixels );
133
+ _secondFrame = calcCurrentSecondFrameVariable ( );
68
134
setInitFrameSector ();
69
135
parametersChanged = true ;
70
136
}
71
137
72
138
// ------------------------------------------------------------------------------
73
139
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
+
74
184
void SecondsFrame::frameLogic () {
75
185
countMillisFrameIntervall = 0 ;
76
186
_secondFrame++;
77
187
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 ();
84
190
}
85
191
86
- /* Every (Frame-)Second*/
87
192
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 ();
102
194
lastSecondFrame = _secondFrame;
103
195
}
104
196
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 ();
110
198
}
111
199
200
+ // ------------------------------------------------------------------------------
201
+ // Loop function for SecondsFrame
112
202
// ------------------------------------------------------------------------------
113
203
114
204
void SecondsFrame::loop () {
115
- unsigned long currentMillis = millis ();
116
- countMillisFrameIntervall += currentMillis - previousMillis ;
117
- previousMillis = currentMillis;
205
+ if ( checkIfFrameLoopShouldRun ()) {
206
+ return ;
207
+ }
118
208
119
- if (G.progInit && G.prog == 0 ) {
120
- setup ();
209
+ updateMillisCounters ();
210
+
211
+ if (checkIfFrameInit ()) {
212
+ initFrame ();
121
213
G.progInit = false ;
122
214
}
123
- if (countMillisFrameIntervall >= frameIntervall) {
215
+
216
+ if (checkIftoRunFrameLogic ()) {
124
217
frameLogic ();
125
218
}
126
219
}
0 commit comments