76
76
******************************************************************************/
80
78
#include "config.h"
82
#include "mode_switcher.h"
82
#include "switcher_major_mode.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
108
105
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 };
110
115
//_____________________________________________________________________________
114
// check for button presses
119
// perform button events
120
void doButtonEvents()
118
int event = button.update();
123
inc_draw_mode = true;
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();
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 );
144
151
// draw a display segment
145
152
void drawNextSegment( bool reset )
147
static ModeSwitcher mode_switcher;
148
static bool init = false;
152
mode_switcher.activate();
155
154
// keep track of segment
156
155
#if CLOCK_FORWARD
157
156
static int segment = ( NUM_SEGMENTS - CLOCK_SHIFT ) % NUM_SEGMENTS;
249
248
// set up mode-switch button on pin 3
250
249
pinMode( 3, INPUT );
251
250
digitalWrite( 3, HIGH );
252
button.add_event_at( 5, 1 );
253
button.add_event_at( 1000, 2 );
254
button.add_event_at( 4000, 3 );
251
static int event_times[] = { 5, 500, 4000, 0 };
252
button.set_event_times( event_times );
257
Serial.begin( 9600 );
254
// set up major modes
255
static SwitcherMajorMode switcher_major_mode;
257
major_modes[ mode++ ] = &switcher_major_mode;
258
major_modes[ 0 ]->activate();
264
265
// if there has been a new pulse, we'll be resetting the display
265
266
bool reset = new_pulse_at? true : false;
267
271
// only do this stuff at the start of a display cycle, to ensure
268
272
// that no state changes mid-display
275
// calculate segment times
276
calculateSegmentTimes();
274
278
// keep track of time
275
279
Time &time = Time::get_instance();
282
// perform button events
279
286
// draw this segment
280
287
drawNextSegment( reset );
282
// do we need to recalculate segment times?
284
calculateSegmentTimes();
286
289
// wait till it's time to draw the next segment
287
waitTillNextSegment( reset );
290
waitTillEndOfSegment( reset );