/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-10 13:04:29 UTC
  • Revision ID: tim@ed.am-20120310130429-310w5ejo968mc6mo
cleaned-up notes

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