/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-09 20:53:26 UTC
  • Revision ID: tim@ed.am-20120509205326-23nmnh3i05hotlro
moved modes to a subdirectory

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 "text.h"
 
87
#include "text_renderer.h"
 
88
#include "common.h"
85
89
 
86
90
//_____________________________________________________________________________
87
91
//                                                                         data
108
112
static int _major_mode = 0;
109
113
static int _minor_mode = 0;
110
114
 
111
 
#define MAIN_MODE_IDX 0
 
115
#define MAIN_MODE_IDX 1
 
116
#define SETTINGS_MODE_IDX 0
112
117
 
113
118
#define ANALOGUE_CLOCK_IDX 0
114
119
#define DIGITAL_CLOCK_IDX 1
121
126
// activate the current minor mode
122
127
void activate_minor_mode()
123
128
{
 
129
        // reset text
 
130
        Text::reset();
 
131
        leds_off();
 
132
 
 
133
        // give the mode a chance to init
124
134
        switch( _minor_mode ) {
125
135
        case ANALOGUE_CLOCK_IDX: analogue_clock_activate(); break;
126
136
        case DIGITAL_CLOCK_IDX: digital_clock_activate(); break;
127
137
        }
128
138
}
129
139
 
 
140
 
 
141
// activate major mode
 
142
void activate_major_mode()
 
143
{
 
144
        // reset text
 
145
        Text::reset();
 
146
        leds_off();
 
147
 
 
148
        // reset buttons
 
149
        _button.set_press_mode( _major_mode != SETTINGS_MODE_IDX );
 
150
 
 
151
        // give the mode a chance to init
 
152
        switch( _major_mode ) {
 
153
        case MAIN_MODE_IDX: activate_minor_mode(); break;
 
154
        case SETTINGS_MODE_IDX: settings_mode_activate(); break;
 
155
        }
 
156
}
 
157
 
 
158
 
130
159
// perform button events
131
160
void do_button_events()
132
161
{
144
173
                                case DIGITAL_CLOCK_IDX: digital_clock_press(); break;
145
174
                                }
146
175
                                break;
 
176
                        case SETTINGS_MODE_IDX: settings_mode_press(); break;
147
177
                        }
148
178
                        break;
149
179
 
153
183
                        case MAIN_MODE_IDX:
154
184
                                if( ++_minor_mode >= 3 )
155
185
                                        _minor_mode = 0;
156
 
                                switch( _minor_mode ) {
157
 
                                case DIGITAL_CLOCK_IDX: digital_clock_activate(); break;
158
 
                                }
 
186
                                activate_minor_mode();
159
187
                                break;
 
188
                        case SETTINGS_MODE_IDX: settings_mode_long_press(); break;
160
189
                        }
161
190
                        break;
162
191
 
163
192
                case 3:
164
193
                        // looooong press (change major mode)
165
 
                        if( ++_major_mode > 0 )
 
194
                        if( ++_major_mode > 1 )
166
195
                                _major_mode = 0;
167
 
                        switch( _major_mode ) {
168
 
                        case MAIN_MODE_IDX: _minor_mode = 0; break;
169
 
                        }
170
 
                        activate_minor_mode();
 
196
                        activate_major_mode();
171
197
                        break;
172
198
                }
173
199
        }
186
212
        if( reset ) segment = NUM_SEGMENTS - 1 - CLOCK_SHIFT;
187
213
#endif
188
214
 
 
215
        // reset the text renderer
 
216
        TextRenderer::reset_buffer();
 
217
 
189
218
        // frame reset
190
219
        if( reset ) {
191
220
                switch( _major_mode ) {
195
224
                        case DIGITAL_CLOCK_IDX: digital_clock_draw_reset(); break;
196
225
                        }
197
226
                        break;
 
227
                case SETTINGS_MODE_IDX: settings_mode_draw_reset(); break;
198
228
                }
 
229
 
 
230
                // tell the text services we're starting a new frame
 
231
                Text::draw_reset();
199
232
        }
200
233
 
201
234
        // draw
207
240
                case TEST_PATTERN_IDX: test_pattern_draw( segment ); break;
208
241
                }
209
242
                break;
 
243
        case SETTINGS_MODE_IDX: settings_mode_draw( segment ); break;
210
244
        }
211
245
 
 
246
        // draw any text that was rendered
 
247
        TextRenderer::output_buffer();
 
248
 
212
249
#if CLOCK_FORWARD
213
250
        if( ++segment >= NUM_SEGMENTS ) segment = 0;
214
251
#else
298
335
        // initialise RTC
299
336
        Time::init();
300
337
 
 
338
        // init text renderer
 
339
        TextRenderer::init();
 
340
 
301
341
        // activate the minor mode
302
 
        switch( _major_mode ) {
303
 
        case MAIN_MODE_IDX: activate_minor_mode(); break;
304
 
        }
 
342
        activate_major_mode();
305
343
}
306
344
 
307
345