/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: edam
  • Date: 2012-05-18 12:11:01 UTC
  • Revision ID: tim@ed.am-20120518121101-0wik922hyvjkcjdi
switched back to using classes for modes

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"
 
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
86
#include "modes/info_mode.h"
 
87
#include "modes/test_pattern_mode.h"
87
88
#include "text.h"
88
89
#include "text_renderer.h"
89
90
#include "common.h"
109
110
// the button
110
111
static Button _button( 3 );
111
112
 
112
 
// modes
113
 
static int _major_mode = 0;
114
 
static int _minor_mode = 0;
115
 
 
116
 
#define SETTINGS_MODE_IDX 1
117
 
#define MAIN_MODE_IDX 0
118
 
 
119
 
#define ANALOGUE_CLOCK_IDX 0
120
 
#define DIGITAL_CLOCK_IDX 1
121
 
#define INFO_MODE_IDX 2
122
 
#define TEST_PATTERN_IDX 3
 
113
// major modes
 
114
static MajorMode *_modes[ 3 ];
 
115
 
 
116
// current major mode
 
117
static int _mode = 0;
123
118
 
124
119
//_____________________________________________________________________________
125
120
//                                                                         code
126
121
 
127
 
 
128
 
// activate the current minor mode
129
 
void activate_minor_mode()
130
 
{
131
 
        // reset text
132
 
        Text::reset();
133
 
        leds_off();
134
 
 
135
 
        // give the mode a chance to init
136
 
        switch( _minor_mode ) {
137
 
        case ANALOGUE_CLOCK_IDX: analogue_clock_activate(); break;
138
 
        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
 
 
161
 
 
162
122
// perform button events
163
123
void do_button_events()
164
124
{
169
129
                {
170
130
                case 1:
171
131
                        // short press
172
 
                        switch( _major_mode ) {
173
 
                        case MAIN_MODE_IDX:
174
 
                                switch( _minor_mode ) {
175
 
                                case ANALOGUE_CLOCK_IDX: analogue_clock_press(); break;
176
 
                                case DIGITAL_CLOCK_IDX: digital_clock_press(); break;
177
 
                                case INFO_MODE_IDX: info_mode_press(); break;
178
 
                                }
179
 
                                break;
180
 
                        case SETTINGS_MODE_IDX: settings_mode_press(); break;
181
 
                        }
 
132
                        _modes[ _mode ]->press();
182
133
                        break;
183
 
 
184
134
                case 2:
185
135
                        // long press
186
 
                        switch( _major_mode ) {
187
 
                        case MAIN_MODE_IDX:
188
 
                                if( ++_minor_mode >= 4 )
189
 
                                        _minor_mode = 0;
190
 
                                activate_minor_mode();
191
 
                                break;
192
 
                        case SETTINGS_MODE_IDX: settings_mode_long_press(); break;
193
 
                        }
 
136
                        _modes[ _mode ]->long_press();
194
137
                        break;
195
 
 
196
138
                case 3:
197
139
                        // looooong press (change major mode)
198
 
                        if( ++_major_mode > 1 )
199
 
                                _major_mode = 0;
200
 
                        activate_major_mode();
 
140
                        _modes[ _mode ]->deactivate();
 
141
                        if( !_modes[ ++_mode ] ) _mode = 0;
 
142
                        _modes[ _mode ]->activate();
201
143
                        break;
202
144
                }
203
145
        }
216
158
        if( reset ) segment = NUM_SEGMENTS - 1 - CLOCK_SHIFT;
217
159
#endif
218
160
 
219
 
        // reset the text renderer
 
161
        // reset the text renderer's buffer
220
162
        TextRenderer::reset_buffer();
221
163
 
222
 
        // frame reset
223
 
        if( reset ) {
224
 
                switch( _major_mode ) {
225
 
                case MAIN_MODE_IDX:
226
 
                        switch( _minor_mode ) {
227
 
                        case ANALOGUE_CLOCK_IDX: analogue_clock_draw_reset(); break;
228
 
                        case DIGITAL_CLOCK_IDX: digital_clock_draw_reset(); break;
229
 
                        case INFO_MODE_IDX: info_mode_draw_reset(); break;
230
 
                        }
231
 
                        break;
232
 
                case SETTINGS_MODE_IDX: settings_mode_draw_reset(); break;
233
 
                }
 
164
        if( reset )
 
165
        {
 
166
                _modes[ _mode ]->draw_reset();
234
167
 
235
168
                // tell the text services we're starting a new frame
236
169
                Text::draw_reset();
237
170
        }
238
171
 
239
172
        // draw
240
 
        switch( _major_mode ) {
241
 
        case MAIN_MODE_IDX:
242
 
                switch( _minor_mode ) {
243
 
                case ANALOGUE_CLOCK_IDX: analogue_clock_draw( segment ); break;
244
 
                case DIGITAL_CLOCK_IDX: digital_clock_draw( segment ); break;
245
 
                case TEST_PATTERN_IDX: test_pattern_draw( segment ); break;
246
 
                case INFO_MODE_IDX: info_mode_draw( segment ); break;
247
 
                }
248
 
                break;
249
 
        case SETTINGS_MODE_IDX: settings_mode_draw( segment ); break;
250
 
        }
 
173
        _modes[ _mode ]->draw( segment );
 
174
 
 
175
        // TODO: remove this hack
251
176
        Text::post_draw();
252
177
 
253
 
        // draw any text that was rendered
 
178
        // draw text rednerer's buffer
254
179
        TextRenderer::output_buffer();
255
180
 
256
181
#if CLOCK_FORWARD
345
270
        // init text renderer
346
271
        TextRenderer::init();
347
272
 
348
 
        // activate the minor mode
349
 
        activate_major_mode();
 
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();
350
288
}
351
289
 
352
290