/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-03-12 21:11:20 UTC
  • Revision ID: tim@ed.am-20120312211120-r86cs574yxztgqij
added time set mode, made text renderer's buffer auto reset/output

Show diffs side-by-side

added added

removed removed

79
79
#include "button.h"
80
80
#include "time.h"
81
81
#include "Arduino.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"
 
82
#include "analogue_clock.h"
 
83
#include "digital_clock.h"
 
84
#include "test_pattern.h"
 
85
#include "settings_mode.h"
87
86
#include "text.h"
88
87
#include "text_renderer.h"
89
88
#include "common.h"
113
112
static int _major_mode = 0;
114
113
static int _minor_mode = 0;
115
114
 
116
 
#define SETTINGS_MODE_IDX 1
117
 
#define MAIN_MODE_IDX 0
 
115
#define MAIN_MODE_IDX 1
 
116
#define SETTINGS_MODE_IDX 0
118
117
 
119
118
#define ANALOGUE_CLOCK_IDX 0
120
119
#define DIGITAL_CLOCK_IDX 1
121
 
#define INFO_MODE_IDX 2
122
 
#define TEST_PATTERN_IDX 3
 
120
#define TEST_PATTERN_IDX 2
123
121
 
124
122
//_____________________________________________________________________________
125
123
//                                                                         code
128
126
// activate the current minor mode
129
127
void activate_minor_mode()
130
128
{
131
 
        // reset text
132
 
        Text::reset();
133
 
        leds_off();
134
 
 
135
 
        // give the mode a chance to init
136
129
        switch( _minor_mode ) {
137
130
        case ANALOGUE_CLOCK_IDX: analogue_clock_activate(); break;
138
131
        case DIGITAL_CLOCK_IDX: digital_clock_activate(); break;
139
 
        case INFO_MODE_IDX: info_mode_activate(); break;
140
132
        }
 
133
 
 
134
        // reset text
 
135
        Text::reset();
 
136
        leds_off();
141
137
}
142
138
 
143
139
 
144
140
// activate major mode
145
141
void activate_major_mode()
146
142
{
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
143
        switch( _major_mode ) {
156
144
        case MAIN_MODE_IDX: activate_minor_mode(); break;
157
145
        case SETTINGS_MODE_IDX: settings_mode_activate(); break;
158
146
        }
 
147
 
 
148
        // reset text
 
149
        Text::reset();
 
150
        leds_off();
159
151
}
160
152
 
161
153
 
174
166
                                switch( _minor_mode ) {
175
167
                                case ANALOGUE_CLOCK_IDX: analogue_clock_press(); break;
176
168
                                case DIGITAL_CLOCK_IDX: digital_clock_press(); break;
177
 
                                case INFO_MODE_IDX: info_mode_press(); break;
178
169
                                }
179
170
                                break;
180
171
                        case SETTINGS_MODE_IDX: settings_mode_press(); break;
185
176
                        // long press
186
177
                        switch( _major_mode ) {
187
178
                        case MAIN_MODE_IDX:
188
 
                                if( ++_minor_mode >= 4 )
 
179
                                if( ++_minor_mode >= 3 )
189
180
                                        _minor_mode = 0;
190
181
                                activate_minor_mode();
191
182
                                break;
226
217
                        switch( _minor_mode ) {
227
218
                        case ANALOGUE_CLOCK_IDX: analogue_clock_draw_reset(); break;
228
219
                        case DIGITAL_CLOCK_IDX: digital_clock_draw_reset(); break;
229
 
                        case INFO_MODE_IDX: info_mode_draw_reset(); break;
230
220
                        }
231
221
                        break;
232
222
                case SETTINGS_MODE_IDX: settings_mode_draw_reset(); break;
243
233
                case ANALOGUE_CLOCK_IDX: analogue_clock_draw( segment ); break;
244
234
                case DIGITAL_CLOCK_IDX: digital_clock_draw( segment ); break;
245
235
                case TEST_PATTERN_IDX: test_pattern_draw( segment ); break;
246
 
                case INFO_MODE_IDX: info_mode_draw( segment ); break;
247
236
                }
248
237
                break;
249
238
        case SETTINGS_MODE_IDX: settings_mode_draw( segment ); break;
250
239
        }
251
 
        Text::post_draw();
252
240
 
253
241
        // draw any text that was rendered
254
242
        TextRenderer::output_buffer();
305
293
}
306
294
 
307
295
 
308
 
// ISR to handle the pulses from the fan's tachometer
 
296
// ISR to handle the pulses from the fan's tachiometer
309
297
void fan_pulse_handler()
310
298
{
311
299
        // the fan actually sends two pulses per revolution. These pulses
325
313
// main setup
326
314
void setup()
327
315
{
328
 
        // set up an interrupt handler on pin 2 to notice fan pulses
 
316
        // set up an interrupt handler on pin 2 to nitice fan pulses
329
317
        attachInterrupt( 0, fan_pulse_handler, RISING );
330
318
        digitalWrite( 2, HIGH );
331
319
  
342
330
        // initialise RTC
343
331
        Time::init();
344
332
 
345
 
        // init text renderer
346
 
        TextRenderer::init();
347
 
 
348
333
        // activate the minor mode
349
334
        activate_major_mode();
350
335
}