/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 12:31:16 UTC
  • Revision ID: tim@ed.am-20120310123116-l348p5btgecmdj1q
added realtime clock test

Show diffs side-by-side

added added

removed removed

28
28
 
29
29
 * a PC fan is wired up to a 12V power supply
30
30
 
31
 
 * the fan's SENSE (tachometer) pin connected to pin 2 on the
32
 
   Arduino.
 
31
 * the fan's SENSE (tachiometer) pin connected to pin 2 on the
 
32
   arduino.
33
33
 
34
 
 * the pins 4 to 13 on the Arduino should directly drive an LED (the
 
34
 * the pins 4 to 13 on the arduino should directly drive an LED (the
35
35
   LED on pin 4 is in the centre of the clock face and the LED on pin
36
36
   13 is at the outside.
37
37
 
38
38
 * if a longer hand (and a larger clock face) is desired, pin 4 can be
39
39
   used to indirectly drive a transistor which in turn drives several
40
 
   LEDs that turn on and off in unison in the centre of the clock.
 
40
   LEDs that turn on anf off in unison in the centre of the clock.
41
41
 
42
42
 * a button should be attached to pin 3 that grounds it when pressed.
43
43
 
44
 
 * A DS1307 remote clock is connected via I2C on analogue pins 4 and 5.
 
44
 * A DS1307 remote clock is connected via I2C on analog pins 4 and 5.
45
45
 
46
46
Implementation details:
47
47
 
50
50
 * the timing of the drawing of the clock face is recalculated with
51
51
   every rotation of the propeller.
52
52
    
53
 
 * a PC fan actually sends 2 tachometer pulses per revolution, so the
 
53
 * a PC fan actually sends 2 tachiometer pulses per revolution, so the
54
54
   software skips every other one. This means that the clock may
55
55
   appear upside-down if started with the propeller in the wrong
56
 
   position. You will need to experiment to discover the position that
 
56
   position. You will need to experiment to dicsover the position that
57
57
   the propeller must be in when starting the clock.
58
58
    
59
59
Usage instructions:
82
82
#include "analogue_clock.h"
83
83
#include "digital_clock.h"
84
84
#include "test_pattern.h"
85
 
#include "settings_mode.h"
86
 
#include "text.h"
87
 
#include "text_renderer.h"
88
 
#include "common.h"
89
85
 
90
86
//_____________________________________________________________________________
91
87
//                                                                         data
112
108
static int _major_mode = 0;
113
109
static int _minor_mode = 0;
114
110
 
115
 
#define MAIN_MODE_IDX 1
116
 
#define SETTINGS_MODE_IDX 0
 
111
#define MAIN_MODE_IDX 0
117
112
 
118
113
#define ANALOGUE_CLOCK_IDX 0
119
114
#define DIGITAL_CLOCK_IDX 1
127
122
void activate_minor_mode()
128
123
{
129
124
        switch( _minor_mode ) {
130
 
        case ANALOGUE_CLOCK_IDX: analogue_clock_activate(); break;
131
125
        case DIGITAL_CLOCK_IDX: digital_clock_activate(); break;
132
126
        }
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
 
 
 
127
}
153
128
 
154
129
// perform button events
155
130
void do_button_events()
168
143
                                case DIGITAL_CLOCK_IDX: digital_clock_press(); break;
169
144
                                }
170
145
                                break;
171
 
                        case SETTINGS_MODE_IDX: settings_mode_press(); break;
172
146
                        }
173
147
                        break;
174
148
 
178
152
                        case MAIN_MODE_IDX:
179
153
                                if( ++_minor_mode >= 3 )
180
154
                                        _minor_mode = 0;
181
 
                                activate_minor_mode();
 
155
                                switch( _minor_mode ) {
 
156
                                case DIGITAL_CLOCK_IDX: digital_clock_activate(); break;
 
157
                                }
182
158
                                break;
183
 
                        case SETTINGS_MODE_IDX: settings_mode_long_press(); break;
184
159
                        }
185
160
                        break;
186
161
 
187
162
                case 3:
188
163
                        // looooong press (change major mode)
189
 
                        if( ++_major_mode > 1 )
 
164
                        if( ++_major_mode > 0 )
190
165
                                _major_mode = 0;
191
 
                        activate_major_mode();
 
166
                        switch( _major_mode ) {
 
167
                        case MAIN_MODE_IDX: _minor_mode = 0; break;
 
168
                        }
 
169
                        activate_minor_mode();
192
170
                        break;
193
171
                }
194
172
        }
207
185
        if( reset ) segment = NUM_SEGMENTS - 1 - CLOCK_SHIFT;
208
186
#endif
209
187
 
210
 
        // reset the text renderer
211
 
        TextRenderer::reset_buffer();
212
 
 
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
 
                }
224
 
 
225
 
                // tell the text services we're starting a new frame
226
 
                Text::draw_reset();
227
 
        }
228
 
 
229
188
        // draw
230
189
        switch( _major_mode ) {
231
190
        case MAIN_MODE_IDX:
235
194
                case TEST_PATTERN_IDX: test_pattern_draw( segment ); break;
236
195
                }
237
196
                break;
238
 
        case SETTINGS_MODE_IDX: settings_mode_draw( segment ); break;
239
197
        }
240
198
 
241
 
        // draw any text that was rendered
242
 
        TextRenderer::output_buffer();
243
 
 
244
199
#if CLOCK_FORWARD
245
200
        if( ++segment >= NUM_SEGMENTS ) segment = 0;
246
201
#else
327
282
        static int event_times[] = { 5, 500, 4000, 0 };
328
283
        _button.set_event_times( event_times );
329
284
 
330
 
        // initialise RTC
 
285
        // get time from RTC
331
286
        Time::init();
332
287
 
333
288
        // activate the minor mode
334
 
        activate_major_mode();
 
289
        switch( _major_mode ) {
 
290
        case MAIN_MODE_IDX: activate_minor_mode(); break;
 
291
        }
335
292
}
336
293
 
337
294