76
76
******************************************************************************/
78
80
#include "config.h"
82
#include "switcher_major_mode.h"
82
#include "mode_switcher.h"
83
83
#include "drawer.h"
85
85
//_____________________________________________________________________________
101
101
static unsigned long segment_step_sub_step = 0;
102
102
static unsigned long segment_step_sub = 0;
104
// flag to indicate that the drawing mode should be cycled to the next one
105
static bool inc_draw_mode = false;
107
// a bounce-managed button
105
108
static Button button( 3 );
108
static int major_mode = 0;
110
#define MAX_MAJOR_MODES 5
113
static MajorMode *major_modes[ MAX_MAJOR_MODES ] = { 0 };
115
110
//_____________________________________________________________________________
119
// perform button events
120
void doButtonEvents()
114
// check for button presses
122
// loop through pending events
123
while( int event = button.get_event() )
129
major_modes[ major_mode ]->press();
134
major_modes[ major_mode ]->long_press();
138
// looooong press (change major mode)
140
if( ++major_mode >= MAX_MAJOR_MODES )
142
} while( major_modes[ major_mode ] == NULL );
143
major_modes[ major_mode ]->activate();
118
int event = button.update();
123
inc_draw_mode = true;
129
// turn an led on/off
130
void ledOn( int num, bool on )
132
if( num < 0 || num > 9 ) return;
134
// convert to pin no.
137
// pin 4 needs to be inverted (it's driving a PNP)
138
if( num == 4 ) on = !on;
140
digitalWrite( num, on? HIGH : LOW );
151
144
// draw a display segment
152
145
void drawNextSegment( bool reset )
147
static ModeSwitcher mode_switcher;
148
static bool init = false;
152
mode_switcher.activate();
154
155
// keep track of segment
155
156
#if CLOCK_FORWARD
156
157
static int segment = ( NUM_SEGMENTS - CLOCK_SHIFT ) % NUM_SEGMENTS;
248
249
// set up mode-switch button on pin 3
249
250
pinMode( 3, INPUT );
250
251
digitalWrite( 3, HIGH );
251
static int event_times[] = { 5, 1000, 4000, 0 };
252
button.set_event_times( event_times );
252
button.add_event_at( 5, 1 );
253
button.add_event_at( 1000, 2 );
254
button.add_event_at( 4000, 3 );
254
// set up major modes
255
static SwitcherMajorMode switcher_major_mode;
257
major_modes[ mode++ ] = &switcher_major_mode;
258
major_modes[ 0 ]->activate();
257
Serial.begin( 9600 );
265
264
// if there has been a new pulse, we'll be resetting the display
266
265
bool reset = new_pulse_at? true : false;
271
267
// only do this stuff at the start of a display cycle, to ensure
272
268
// that no state changes mid-display
275
// calculate segment times
276
calculateSegmentTimes();
278
274
// keep track of time
279
275
Time &time = Time::get_instance();
282
// perform button events
286
279
// draw this segment
287
280
drawNextSegment( reset );
282
// do we need to recalculate segment times?
284
calculateSegmentTimes();
289
286
// wait till it's time to draw the next segment
290
waitTillEndOfSegment( reset );
287
waitTillNextSegment( reset );