/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

1
 
/* -*- mode: c++; compile-command: "make"; -*- */
 
1
/* -*- mode: c++; compile-command: "BOARD=pro5v make"; -*- */
2
2
/*
3
3
 * propeller-clock.ino
4
4
 *
79
79
#include "button.h"
80
80
#include "time.h"
81
81
#include "Arduino.h"
82
 
#include "modes/switcher_major_mode.h"
83
 
#include "modes/settings_major_mode.h"
84
 
#include "modes/analogue_clock_mode.h"
85
 
#include "modes/digital_clock_mode.h"
86
 
#include "modes/info_mode.h"
87
 
#include "modes/test_pattern_mode.h"
 
82
#include "analogue_clock.h"
 
83
#include "digital_clock.h"
 
84
#include "test_pattern.h"
 
85
#include "settings_mode.h"
88
86
#include "text.h"
89
87
#include "text_renderer.h"
90
88
#include "common.h"
110
108
// the button
111
109
static Button _button( 3 );
112
110
 
113
 
// major modes
114
 
static MajorMode *_modes[ 3 ];
115
 
 
116
 
// current major mode
117
 
static int _mode = 0;
 
111
// modes
 
112
static int _major_mode = 0;
 
113
static int _minor_mode = 0;
 
114
 
 
115
#define MAIN_MODE_IDX 1
 
116
#define SETTINGS_MODE_IDX 0
 
117
 
 
118
#define ANALOGUE_CLOCK_IDX 0
 
119
#define DIGITAL_CLOCK_IDX 1
 
120
#define TEST_PATTERN_IDX 2
118
121
 
119
122
//_____________________________________________________________________________
120
123
//                                                                         code
121
124
 
 
125
 
 
126
// activate the current minor mode
 
127
void activate_minor_mode()
 
128
{
 
129
        switch( _minor_mode ) {
 
130
        case ANALOGUE_CLOCK_IDX: analogue_clock_activate(); break;
 
131
        case DIGITAL_CLOCK_IDX: digital_clock_activate(); break;
 
132
        }
 
133
 
 
134
        // reset text
 
135
        Text::reset();
 
136
        leds_off();
 
137
}
 
138
 
 
139
 
 
140
// activate major mode
 
141
void activate_major_mode()
 
142
{
 
143
        switch( _major_mode ) {
 
144
        case MAIN_MODE_IDX: activate_minor_mode(); break;
 
145
        case SETTINGS_MODE_IDX: settings_mode_activate(); break;
 
146
        }
 
147
 
 
148
        // reset text
 
149
        Text::reset();
 
150
        leds_off();
 
151
}
 
152
 
 
153
 
122
154
// perform button events
123
155
void do_button_events()
124
156
{
129
161
                {
130
162
                case 1:
131
163
                        // short press
132
 
                        _modes[ _mode ]->press();
 
164
                        switch( _major_mode ) {
 
165
                        case MAIN_MODE_IDX:
 
166
                                switch( _minor_mode ) {
 
167
                                case ANALOGUE_CLOCK_IDX: analogue_clock_press(); break;
 
168
                                case DIGITAL_CLOCK_IDX: digital_clock_press(); break;
 
169
                                }
 
170
                                break;
 
171
                        case SETTINGS_MODE_IDX: settings_mode_press(); break;
 
172
                        }
133
173
                        break;
 
174
 
134
175
                case 2:
135
176
                        // long press
136
 
                        _modes[ _mode ]->long_press();
 
177
                        switch( _major_mode ) {
 
178
                        case MAIN_MODE_IDX:
 
179
                                if( ++_minor_mode >= 3 )
 
180
                                        _minor_mode = 0;
 
181
                                activate_minor_mode();
 
182
                                break;
 
183
                        case SETTINGS_MODE_IDX: settings_mode_long_press(); break;
 
184
                        }
137
185
                        break;
 
186
 
138
187
                case 3:
139
188
                        // looooong press (change major mode)
140
 
                        _modes[ _mode ]->deactivate();
141
 
                        if( !_modes[ ++_mode ] ) _mode = 0;
142
 
                        _modes[ _mode ]->activate();
 
189
                        if( ++_major_mode > 1 )
 
190
                                _major_mode = 0;
 
191
                        activate_major_mode();
143
192
                        break;
144
193
                }
145
194
        }
158
207
        if( reset ) segment = NUM_SEGMENTS - 1 - CLOCK_SHIFT;
159
208
#endif
160
209
 
161
 
        // reset the text renderer's buffer
 
210
        // reset the text renderer
162
211
        TextRenderer::reset_buffer();
163
212
 
164
 
        if( reset )
165
 
        {
166
 
                _modes[ _mode ]->draw_reset();
 
213
        // frame reset
 
214
        if( reset ) {
 
215
                switch( _major_mode ) {
 
216
                case MAIN_MODE_IDX:
 
217
                        switch( _minor_mode ) {
 
218
                        case ANALOGUE_CLOCK_IDX: analogue_clock_draw_reset(); break;
 
219
                        case DIGITAL_CLOCK_IDX: digital_clock_draw_reset(); break;
 
220
                        }
 
221
                        break;
 
222
                case SETTINGS_MODE_IDX: settings_mode_draw_reset(); break;
 
223
                }
167
224
 
168
225
                // tell the text services we're starting a new frame
169
226
                Text::draw_reset();
170
227
        }
171
228
 
172
229
        // draw
173
 
        _modes[ _mode ]->draw( segment );
174
 
 
175
 
        // TODO: remove this hack
176
 
        Text::post_draw();
177
 
 
178
 
        // draw text rednerer's buffer
 
230
        switch( _major_mode ) {
 
231
        case MAIN_MODE_IDX:
 
232
                switch( _minor_mode ) {
 
233
                case ANALOGUE_CLOCK_IDX: analogue_clock_draw( segment ); break;
 
234
                case DIGITAL_CLOCK_IDX: digital_clock_draw( segment ); break;
 
235
                case TEST_PATTERN_IDX: test_pattern_draw( segment ); break;
 
236
                }
 
237
                break;
 
238
        case SETTINGS_MODE_IDX: settings_mode_draw( segment ); break;
 
239
        }
 
240
 
 
241
        // draw any text that was rendered
179
242
        TextRenderer::output_buffer();
180
243
 
181
244
#if CLOCK_FORWARD
230
293
}
231
294
 
232
295
 
233
 
// ISR to handle the pulses from the fan's tachometer
 
296
// ISR to handle the pulses from the fan's tachiometer
234
297
void fan_pulse_handler()
235
298
{
236
299
        // the fan actually sends two pulses per revolution. These pulses
250
313
// main setup
251
314
void setup()
252
315
{
253
 
        // 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
254
317
        attachInterrupt( 0, fan_pulse_handler, RISING );
255
318
        digitalWrite( 2, HIGH );
256
319
  
267
330
        // initialise RTC
268
331
        Time::init();
269
332
 
270
 
        // init text renderer
271
 
        TextRenderer::init();
272
 
 
273
 
        // reset text
274
 
        Text::reset();
275
 
        leds_off();
276
 
 
277
 
        static SwitcherMajorMode switcher;
278
 
        static SettingsMajorMode settings;
279
 
 
280
 
        // add major modes
281
 
        int mode = 0;
282
 
        _modes[ mode++ ] = &switcher;
283
 
        _modes[ mode++ ] = &settings;
284
 
        _modes[ mode ] = 0;
285
 
 
286
 
        // activate the current major mode
287
 
        _modes[ _mode ]->activate();
 
333
        // activate the minor mode
 
334
        activate_major_mode();
288
335
}
289
336
 
290
337