/elec/propeller-clock

To get this branch, use:
bzr branch http://bzr.ed.am/elec/propeller-clock

« back to all changes in this revision

Viewing changes to src/propeller-clock.cc

  • Committer: Tim Marston
  • Date: 2012-05-17 22:49:11 UTC
  • Revision ID: tim@ed.am-20120517224911-dbd9dtcpl14xlhi0
rewrote/fixed button event triggering code

Show diffs side-by-side

added added

removed removed

Lines of Context:
79
79
#include "button.h"
80
80
#include "time.h"
81
81
#include "Arduino.h"
82
 
#include "analogue_clock.h"
83
 
#include "digital_clock.h"
84
 
#include "test_pattern.h"
 
82
#include "modes/analogue_clock.h"
 
83
#include "modes/digital_clock.h"
 
84
#include "modes/test_pattern.h"
 
85
#include "modes/settings_mode.h"
 
86
#include "modes/info_mode.h"
 
87
#include "text.h"
 
88
#include "text_renderer.h"
 
89
#include "common.h"
85
90
 
86
91
//_____________________________________________________________________________
87
92
//                                                                         data
108
113
static int _major_mode = 0;
109
114
static int _minor_mode = 0;
110
115
 
111
 
#define MAIN_MODE_IDX 0
 
116
#define MAIN_MODE_IDX 1
 
117
#define SETTINGS_MODE_IDX 0
112
118
 
113
119
#define ANALOGUE_CLOCK_IDX 0
114
120
#define DIGITAL_CLOCK_IDX 1
115
121
#define TEST_PATTERN_IDX 2
 
122
#define INFO_MODE_IDX 3
116
123
 
117
124
//_____________________________________________________________________________
118
125
//                                                                         code
121
128
// activate the current minor mode
122
129
void activate_minor_mode()
123
130
{
 
131
        // reset text
 
132
        Text::reset();
 
133
        leds_off();
 
134
 
 
135
        // give the mode a chance to init
124
136
        switch( _minor_mode ) {
125
137
        case ANALOGUE_CLOCK_IDX: analogue_clock_activate(); break;
126
138
        case DIGITAL_CLOCK_IDX: digital_clock_activate(); break;
127
 
        }
128
 
}
 
139
        case INFO_MODE_IDX: info_mode_activate(); break;
 
140
        }
 
141
}
 
142
 
 
143
 
 
144
// activate major mode
 
145
void activate_major_mode()
 
146
{
 
147
        // reset text
 
148
        Text::reset();
 
149
        leds_off();
 
150
 
 
151
        // reset buttons
 
152
        _button.set_press_mode( _major_mode != SETTINGS_MODE_IDX );
 
153
 
 
154
        // give the mode a chance to init
 
155
        switch( _major_mode ) {
 
156
        case MAIN_MODE_IDX: activate_minor_mode(); break;
 
157
        case SETTINGS_MODE_IDX: settings_mode_activate(); break;
 
158
        }
 
159
}
 
160
 
129
161
 
130
162
// perform button events
131
163
void do_button_events()
142
174
                                switch( _minor_mode ) {
143
175
                                case ANALOGUE_CLOCK_IDX: analogue_clock_press(); break;
144
176
                                case DIGITAL_CLOCK_IDX: digital_clock_press(); break;
 
177
                                case INFO_MODE_IDX: info_mode_press(); break;
145
178
                                }
146
179
                                break;
 
180
                        case SETTINGS_MODE_IDX: settings_mode_press(); break;
147
181
                        }
148
182
                        break;
149
183
 
153
187
                        case MAIN_MODE_IDX:
154
188
                                if( ++_minor_mode >= 3 )
155
189
                                        _minor_mode = 0;
156
 
                                switch( _minor_mode ) {
157
 
                                case DIGITAL_CLOCK_IDX: digital_clock_activate(); break;
158
 
                                }
 
190
                                activate_minor_mode();
159
191
                                break;
 
192
                        case SETTINGS_MODE_IDX: settings_mode_long_press(); break;
160
193
                        }
161
194
                        break;
162
195
 
163
196
                case 3:
164
197
                        // looooong press (change major mode)
165
 
                        if( ++_major_mode > 0 )
 
198
                        if( ++_major_mode > 1 )
166
199
                                _major_mode = 0;
167
 
                        switch( _major_mode ) {
168
 
                        case MAIN_MODE_IDX: _minor_mode = 0; break;
169
 
                        }
170
 
                        activate_minor_mode();
 
200
                        activate_major_mode();
171
201
                        break;
172
202
                }
173
203
        }
186
216
        if( reset ) segment = NUM_SEGMENTS - 1 - CLOCK_SHIFT;
187
217
#endif
188
218
 
 
219
        // reset the text renderer
 
220
        TextRenderer::reset_buffer();
 
221
 
189
222
        // frame reset
190
223
        if( reset ) {
191
224
                switch( _major_mode ) {
193
226
                        switch( _minor_mode ) {
194
227
                        case ANALOGUE_CLOCK_IDX: analogue_clock_draw_reset(); break;
195
228
                        case DIGITAL_CLOCK_IDX: digital_clock_draw_reset(); break;
 
229
                        case INFO_MODE_IDX: info_mode_draw_reset(); break;
196
230
                        }
197
231
                        break;
 
232
                case SETTINGS_MODE_IDX: settings_mode_draw_reset(); break;
198
233
                }
 
234
 
 
235
                // tell the text services we're starting a new frame
 
236
                Text::draw_reset();
199
237
        }
200
238
 
201
239
        // draw
205
243
                case ANALOGUE_CLOCK_IDX: analogue_clock_draw( segment ); break;
206
244
                case DIGITAL_CLOCK_IDX: digital_clock_draw( segment ); break;
207
245
                case TEST_PATTERN_IDX: test_pattern_draw( segment ); break;
 
246
                case INFO_MODE_IDX: info_mode_draw( segment ); break;
208
247
                }
209
248
                break;
 
249
        case SETTINGS_MODE_IDX: settings_mode_draw( segment ); break;
210
250
        }
211
251
 
 
252
        // draw any text that was rendered
 
253
        TextRenderer::output_buffer();
 
254
 
212
255
#if CLOCK_FORWARD
213
256
        if( ++segment >= NUM_SEGMENTS ) segment = 0;
214
257
#else
261
304
}
262
305
 
263
306
 
264
 
// ISR to handle the pulses from the fan's tachiometer
 
307
// ISR to handle the pulses from the fan's tachometer
265
308
void fan_pulse_handler()
266
309
{
267
310
        // the fan actually sends two pulses per revolution. These pulses
281
324
// main setup
282
325
void setup()
283
326
{
284
 
        // set up an interrupt handler on pin 2 to nitice fan pulses
 
327
        // set up an interrupt handler on pin 2 to notice fan pulses
285
328
        attachInterrupt( 0, fan_pulse_handler, RISING );
286
329
        digitalWrite( 2, HIGH );
287
330
  
298
341
        // initialise RTC
299
342
        Time::init();
300
343
 
 
344
        // init text renderer
 
345
        TextRenderer::init();
 
346
 
301
347
        // activate the minor mode
302
 
        switch( _major_mode ) {
303
 
        case MAIN_MODE_IDX: activate_minor_mode(); break;
304
 
        }
 
348
        activate_major_mode();
305
349
}
306
350
 
307
351