Richard Parker / EALCD
Committer:
richardparker
Date:
Mon Nov 01 13:07:40 2010 +0000
Revision:
7:6cf21b018420
Parent:
4:f8f7f4f9c58d
Embedded Artists LCD panel:- Version 0.7

Who changed what in which revision?

UserRevisionLine numberNew contents of line
richardparker 3:24fbf4dbd7e5 1 // Copyright 2010 Richard Parker
richardparker 3:24fbf4dbd7e5 2
richardparker 3:24fbf4dbd7e5 3 #include "mbed.h"
richardparker 3:24fbf4dbd7e5 4
richardparker 3:24fbf4dbd7e5 5 #include "EASettings.h"
richardparker 3:24fbf4dbd7e5 6
richardparker 3:24fbf4dbd7e5 7 #include "../screen/EALCD.h"
richardparker 3:24fbf4dbd7e5 8 #include "../screen/EATouch.h"
richardparker 3:24fbf4dbd7e5 9 #include "../manager/EATouchManager.h"
richardparker 3:24fbf4dbd7e5 10 #include "../widgets/EAButton.h"
richardparker 4:f8f7f4f9c58d 11 #include "../widgets/EACompass.h"
richardparker 3:24fbf4dbd7e5 12
richardparker 4:f8f7f4f9c58d 13 #include "HMC6352.h"
richardparker 4:f8f7f4f9c58d 14
richardparker 4:f8f7f4f9c58d 15 EASettings::EASettings(EALCD& lcd, EATouch& touch, EATouchManager& manager, HMC6352& compass)
richardparker 3:24fbf4dbd7e5 16 : _lcd(lcd),
richardparker 3:24fbf4dbd7e5 17 _touch(touch),
richardparker 3:24fbf4dbd7e5 18 _manager(manager),
richardparker 4:f8f7f4f9c58d 19 _compass(compass),
richardparker 3:24fbf4dbd7e5 20 _time(NULL),
richardparker 4:f8f7f4f9c58d 21 _compassCircle(NULL),
richardparker 3:24fbf4dbd7e5 22 _launchBox(NULL),
richardparker 3:24fbf4dbd7e5 23 _returnBox(NULL),
richardparker 3:24fbf4dbd7e5 24 _touchBox(NULL),
richardparker 3:24fbf4dbd7e5 25 _dateBox(NULL),
richardparker 3:24fbf4dbd7e5 26 _compassBox(NULL),
richardparker 3:24fbf4dbd7e5 27 _nextBox(NULL),
richardparker 3:24fbf4dbd7e5 28 _prevBox(NULL),
richardparker 3:24fbf4dbd7e5 29 _incBox(NULL),
richardparker 3:24fbf4dbd7e5 30 _decBox(NULL),
richardparker 3:24fbf4dbd7e5 31 _state(EASettings::STATE_ENDED)
richardparker 3:24fbf4dbd7e5 32 {
richardparker 3:24fbf4dbd7e5 33 // Actually start the RTC without this call RTC is not running.
richardparker 3:24fbf4dbd7e5 34 set_time(0);
richardparker 3:24fbf4dbd7e5 35 time_t seconds = time(NULL);
richardparker 3:24fbf4dbd7e5 36 _time = localtime(&seconds);
richardparker 3:24fbf4dbd7e5 37 }
richardparker 3:24fbf4dbd7e5 38
richardparker 3:24fbf4dbd7e5 39 EASettings::~EASettings()
richardparker 3:24fbf4dbd7e5 40 {
richardparker 3:24fbf4dbd7e5 41 }
richardparker 3:24fbf4dbd7e5 42
richardparker 3:24fbf4dbd7e5 43 void EASettings::start()
richardparker 3:24fbf4dbd7e5 44 {
richardparker 3:24fbf4dbd7e5 45 _state = EASettings::STATE_IDLE;
richardparker 3:24fbf4dbd7e5 46 _drawLaunchButton();
richardparker 3:24fbf4dbd7e5 47 }
richardparker 3:24fbf4dbd7e5 48
richardparker 4:f8f7f4f9c58d 49 void EASettings::tick()
richardparker 4:f8f7f4f9c58d 50 {
richardparker 4:f8f7f4f9c58d 51 // Do action depending on the state that in.
richardparker 4:f8f7f4f9c58d 52 switch(state())
richardparker 4:f8f7f4f9c58d 53 {
richardparker 4:f8f7f4f9c58d 54 case EASettings::STATE_COMPASS:
richardparker 4:f8f7f4f9c58d 55 _updateCompass();
richardparker 4:f8f7f4f9c58d 56 break;
richardparker 4:f8f7f4f9c58d 57 }
richardparker 4:f8f7f4f9c58d 58 }
richardparker 4:f8f7f4f9c58d 59
richardparker 3:24fbf4dbd7e5 60 void EASettings::actionHandler(EAHitBox* box, short x, short y)
richardparker 3:24fbf4dbd7e5 61 {
richardparker 3:24fbf4dbd7e5 62 State nextState = EASettings::STATE_IDLE;
richardparker 3:24fbf4dbd7e5 63
richardparker 3:24fbf4dbd7e5 64 // Disable hit boxs from previous screens.
richardparker 3:24fbf4dbd7e5 65 _disableHitBoxs();
richardparker 3:24fbf4dbd7e5 66
richardparker 3:24fbf4dbd7e5 67 // Do action depending on the state that in.
richardparker 3:24fbf4dbd7e5 68 switch(state())
richardparker 3:24fbf4dbd7e5 69 {
richardparker 3:24fbf4dbd7e5 70 case EASettings::STATE_IDLE:
richardparker 3:24fbf4dbd7e5 71 _drawPortal();
richardparker 3:24fbf4dbd7e5 72 nextState = EASettings::STATE_PORTAL;
richardparker 3:24fbf4dbd7e5 73 break;
richardparker 3:24fbf4dbd7e5 74 case EASettings::STATE_PORTAL:
richardparker 3:24fbf4dbd7e5 75 if (box == _returnBox->hitBox())
richardparker 3:24fbf4dbd7e5 76 {
richardparker 3:24fbf4dbd7e5 77 nextState = EASettings::STATE_ENDED;
richardparker 3:24fbf4dbd7e5 78 }
richardparker 3:24fbf4dbd7e5 79 else if (box == _touchBox->hitBox())
richardparker 3:24fbf4dbd7e5 80 {
richardparker 3:24fbf4dbd7e5 81 _touch.calibrate();
richardparker 3:24fbf4dbd7e5 82 _drawPortal();
richardparker 3:24fbf4dbd7e5 83 nextState = EASettings::STATE_PORTAL;
richardparker 3:24fbf4dbd7e5 84 }
richardparker 3:24fbf4dbd7e5 85 else if (box == _dateBox->hitBox())
richardparker 3:24fbf4dbd7e5 86 {
richardparker 3:24fbf4dbd7e5 87 _drawDate();
richardparker 3:24fbf4dbd7e5 88 _state = EASettings::STATE_DATE_SECOND;
richardparker 3:24fbf4dbd7e5 89 nextState = _nextDate();
richardparker 4:f8f7f4f9c58d 90 }
richardparker 4:f8f7f4f9c58d 91 else if (box == _compassBox->hitBox())
richardparker 4:f8f7f4f9c58d 92 {
richardparker 4:f8f7f4f9c58d 93 _drawCompass();
richardparker 4:f8f7f4f9c58d 94 nextState = EASettings::STATE_COMPASS;
richardparker 3:24fbf4dbd7e5 95 } else {
richardparker 3:24fbf4dbd7e5 96 _drawPortal();
richardparker 3:24fbf4dbd7e5 97 nextState = EASettings::STATE_PORTAL;
richardparker 3:24fbf4dbd7e5 98 }
richardparker 3:24fbf4dbd7e5 99 break;
richardparker 4:f8f7f4f9c58d 100 case EASettings::STATE_COMPASS:
richardparker 4:f8f7f4f9c58d 101 if (box == _returnBox->hitBox())
richardparker 4:f8f7f4f9c58d 102 {
richardparker 4:f8f7f4f9c58d 103 _drawPortal();
richardparker 4:f8f7f4f9c58d 104 nextState = EASettings::STATE_PORTAL;
richardparker 4:f8f7f4f9c58d 105 } else {
richardparker 4:f8f7f4f9c58d 106 _drawCompass();
richardparker 4:f8f7f4f9c58d 107 nextState = EASettings::STATE_COMPASS;
richardparker 4:f8f7f4f9c58d 108 }
richardparker 4:f8f7f4f9c58d 109 break;
richardparker 3:24fbf4dbd7e5 110 case EASettings::STATE_DATE_DAY:
richardparker 3:24fbf4dbd7e5 111 case EASettings::STATE_DATE_MONTH:
richardparker 3:24fbf4dbd7e5 112 case EASettings::STATE_DATE_YEAR:
richardparker 3:24fbf4dbd7e5 113 case EASettings::STATE_DATE_HOUR:
richardparker 3:24fbf4dbd7e5 114 case EASettings::STATE_DATE_MINUTE:
richardparker 3:24fbf4dbd7e5 115 case EASettings::STATE_DATE_SECOND:
richardparker 3:24fbf4dbd7e5 116 if (box == _returnBox->hitBox())
richardparker 3:24fbf4dbd7e5 117 {
richardparker 4:f8f7f4f9c58d 118 set_time(mktime(_time));
richardparker 3:24fbf4dbd7e5 119 _drawPortal();
richardparker 3:24fbf4dbd7e5 120 nextState = EASettings::STATE_PORTAL;
richardparker 3:24fbf4dbd7e5 121 }
richardparker 3:24fbf4dbd7e5 122 else if (box == _nextBox->hitBox())
richardparker 3:24fbf4dbd7e5 123 {
richardparker 3:24fbf4dbd7e5 124 nextState = _nextDate();
richardparker 3:24fbf4dbd7e5 125 }
richardparker 3:24fbf4dbd7e5 126 else if (box == _prevBox->hitBox())
richardparker 3:24fbf4dbd7e5 127 {
richardparker 3:24fbf4dbd7e5 128 nextState = _prevDate();
richardparker 3:24fbf4dbd7e5 129 }
richardparker 3:24fbf4dbd7e5 130 else if (box == _incBox->hitBox())
richardparker 3:24fbf4dbd7e5 131 {
richardparker 3:24fbf4dbd7e5 132 nextState = _incDate();
richardparker 3:24fbf4dbd7e5 133 }
richardparker 3:24fbf4dbd7e5 134 else if (box == _decBox->hitBox())
richardparker 3:24fbf4dbd7e5 135 {
richardparker 3:24fbf4dbd7e5 136 nextState = _decDate();
richardparker 3:24fbf4dbd7e5 137 } else {
richardparker 3:24fbf4dbd7e5 138 _drawPortal();
richardparker 3:24fbf4dbd7e5 139 nextState = EASettings::STATE_PORTAL;
richardparker 3:24fbf4dbd7e5 140 }
richardparker 3:24fbf4dbd7e5 141 _enableDateButtons();
richardparker 3:24fbf4dbd7e5 142 break;
richardparker 3:24fbf4dbd7e5 143 default:
richardparker 3:24fbf4dbd7e5 144 nextState = EASettings::STATE_ENDED;
richardparker 3:24fbf4dbd7e5 145 break;
richardparker 3:24fbf4dbd7e5 146 }
richardparker 3:24fbf4dbd7e5 147
richardparker 3:24fbf4dbd7e5 148 _state = nextState;
richardparker 3:24fbf4dbd7e5 149 }
richardparker 3:24fbf4dbd7e5 150
richardparker 3:24fbf4dbd7e5 151 void EASettings::_disableHitBoxs()
richardparker 3:24fbf4dbd7e5 152 {
richardparker 3:24fbf4dbd7e5 153 if (_launchBox != NULL)
richardparker 3:24fbf4dbd7e5 154 {
richardparker 3:24fbf4dbd7e5 155 _launchBox->setEnabled(false);
richardparker 3:24fbf4dbd7e5 156 }
richardparker 3:24fbf4dbd7e5 157
richardparker 3:24fbf4dbd7e5 158 if (_returnBox != NULL)
richardparker 3:24fbf4dbd7e5 159 {
richardparker 3:24fbf4dbd7e5 160 _returnBox->setEnabled(false);
richardparker 3:24fbf4dbd7e5 161 }
richardparker 3:24fbf4dbd7e5 162
richardparker 3:24fbf4dbd7e5 163 if (_touchBox != NULL)
richardparker 3:24fbf4dbd7e5 164 {
richardparker 3:24fbf4dbd7e5 165 _touchBox->setEnabled(false);
richardparker 3:24fbf4dbd7e5 166 }
richardparker 3:24fbf4dbd7e5 167
richardparker 3:24fbf4dbd7e5 168 if (_dateBox != NULL)
richardparker 3:24fbf4dbd7e5 169 {
richardparker 3:24fbf4dbd7e5 170 _dateBox->setEnabled(false);
richardparker 3:24fbf4dbd7e5 171 }
richardparker 3:24fbf4dbd7e5 172
richardparker 3:24fbf4dbd7e5 173 if (_compassBox != NULL)
richardparker 3:24fbf4dbd7e5 174 {
richardparker 3:24fbf4dbd7e5 175 _compassBox->setEnabled(false);
richardparker 3:24fbf4dbd7e5 176 }
richardparker 3:24fbf4dbd7e5 177
richardparker 3:24fbf4dbd7e5 178 if (_nextBox != NULL)
richardparker 3:24fbf4dbd7e5 179 {
richardparker 3:24fbf4dbd7e5 180 _nextBox->setEnabled(false);
richardparker 3:24fbf4dbd7e5 181 }
richardparker 3:24fbf4dbd7e5 182
richardparker 3:24fbf4dbd7e5 183 if (_prevBox != NULL)
richardparker 3:24fbf4dbd7e5 184 {
richardparker 3:24fbf4dbd7e5 185 _prevBox->setEnabled(false);
richardparker 3:24fbf4dbd7e5 186 }
richardparker 3:24fbf4dbd7e5 187
richardparker 3:24fbf4dbd7e5 188 if (_incBox != NULL)
richardparker 3:24fbf4dbd7e5 189 {
richardparker 3:24fbf4dbd7e5 190 _incBox->setEnabled(false);
richardparker 3:24fbf4dbd7e5 191 }
richardparker 3:24fbf4dbd7e5 192
richardparker 3:24fbf4dbd7e5 193 if (_decBox != NULL)
richardparker 3:24fbf4dbd7e5 194 {
richardparker 3:24fbf4dbd7e5 195 _decBox->setEnabled(false);
richardparker 3:24fbf4dbd7e5 196 }
richardparker 3:24fbf4dbd7e5 197 }
richardparker 3:24fbf4dbd7e5 198
richardparker 3:24fbf4dbd7e5 199 void EASettings::_drawLaunchButton()
richardparker 3:24fbf4dbd7e5 200 {
richardparker 3:24fbf4dbd7e5 201 // Setup colours and clear screen to known background.
richardparker 3:24fbf4dbd7e5 202 EAColor white = EAColor(0xFF, 0xFF, 0xFF);
richardparker 3:24fbf4dbd7e5 203 EAColor black = EAColor(0x00, 0x00, 0x00);
richardparker 3:24fbf4dbd7e5 204
richardparker 4:f8f7f4f9c58d 205 EAFont font;
richardparker 3:24fbf4dbd7e5 206 EABrush brush = _lcd.brush();
richardparker 3:24fbf4dbd7e5 207 EAPen pen = _lcd.pen();
richardparker 3:24fbf4dbd7e5 208
richardparker 4:f8f7f4f9c58d 209 font.load("/local/large.fnt");
richardparker 4:f8f7f4f9c58d 210 _lcd.setFont(font);
richardparker 4:f8f7f4f9c58d 211
richardparker 3:24fbf4dbd7e5 212 brush.setColor(black);
richardparker 3:24fbf4dbd7e5 213 _lcd.setBrush(brush);
richardparker 3:24fbf4dbd7e5 214
richardparker 3:24fbf4dbd7e5 215 pen.setColor(white);
richardparker 3:24fbf4dbd7e5 216 _lcd.setPen(pen);
richardparker 3:24fbf4dbd7e5 217
richardparker 3:24fbf4dbd7e5 218 // Create hit box if not already available.
richardparker 3:24fbf4dbd7e5 219 if (_launchBox == NULL)
richardparker 3:24fbf4dbd7e5 220 {
richardparker 4:f8f7f4f9c58d 221 _launchBox = new EAButton(_manager, _lcd.width()-60, _lcd.height()-60, 60, 60, "S", this);
richardparker 3:24fbf4dbd7e5 222 } else {
richardparker 3:24fbf4dbd7e5 223 _launchBox->setEnabled(true);
richardparker 3:24fbf4dbd7e5 224 }
richardparker 3:24fbf4dbd7e5 225 _launchBox->paint(_lcd);
richardparker 3:24fbf4dbd7e5 226 }
richardparker 3:24fbf4dbd7e5 227
richardparker 3:24fbf4dbd7e5 228 void EASettings::_drawPortal()
richardparker 3:24fbf4dbd7e5 229 {
richardparker 3:24fbf4dbd7e5 230 // Setup colours and clear screen to known background.
richardparker 3:24fbf4dbd7e5 231 EAColor white = EAColor(0xFF, 0xFF, 0xFF);
richardparker 3:24fbf4dbd7e5 232 EAColor black = EAColor(0x00, 0x00, 0x00);
richardparker 3:24fbf4dbd7e5 233
richardparker 3:24fbf4dbd7e5 234 EAFont font;
richardparker 3:24fbf4dbd7e5 235 EABrush brush = _lcd.brush();
richardparker 3:24fbf4dbd7e5 236 EAPen pen = _lcd.pen();
richardparker 3:24fbf4dbd7e5 237
richardparker 3:24fbf4dbd7e5 238 font.load("/local/large.fnt");
richardparker 3:24fbf4dbd7e5 239 _lcd.setFont(font);
richardparker 7:6cf21b018420 240
richardparker 7:6cf21b018420 241 // DEBUG
richardparker 7:6cf21b018420 242 printf("Font set\r\n");
richardparker 3:24fbf4dbd7e5 243
richardparker 3:24fbf4dbd7e5 244 brush.setColor(black);
richardparker 3:24fbf4dbd7e5 245 _lcd.setBrush(brush);
richardparker 3:24fbf4dbd7e5 246
richardparker 3:24fbf4dbd7e5 247 pen.setColor(white);
richardparker 3:24fbf4dbd7e5 248 _lcd.setPen(pen);
richardparker 3:24fbf4dbd7e5 249
richardparker 3:24fbf4dbd7e5 250 // Clear the screen to draw the buttons on.
richardparker 3:24fbf4dbd7e5 251 _lcd.clearScreen();
richardparker 3:24fbf4dbd7e5 252
richardparker 3:24fbf4dbd7e5 253 // Draw title.
richardparker 3:24fbf4dbd7e5 254 _lcd.drawText((_lcd.width()/2)-(size()*2)+50, 10, "Settings");
richardparker 3:24fbf4dbd7e5 255
richardparker 3:24fbf4dbd7e5 256 // Create hit box if not already available.
richardparker 3:24fbf4dbd7e5 257 if (_compassBox == NULL)
richardparker 3:24fbf4dbd7e5 258 {
richardparker 3:24fbf4dbd7e5 259 _compassBox = new EAButton(_manager, (_lcd.width()/2)-(size()*2), _lcd.height()-(size()*5), size()*4, size(), "Calibrate Compass", this);
richardparker 3:24fbf4dbd7e5 260 } else {
richardparker 3:24fbf4dbd7e5 261 _compassBox->setEnabled(true);
richardparker 3:24fbf4dbd7e5 262 }
richardparker 3:24fbf4dbd7e5 263 _compassBox->paint(_lcd);
richardparker 3:24fbf4dbd7e5 264
richardparker 3:24fbf4dbd7e5 265 // Create hit box if not already available.
richardparker 3:24fbf4dbd7e5 266 if (_dateBox == NULL)
richardparker 3:24fbf4dbd7e5 267 {
richardparker 3:24fbf4dbd7e5 268 _dateBox = new EAButton(_manager, (_lcd.width()/2)-(size()*2), _lcd.height()-(size()*4), size()*4, size(), "Set Date", this);
richardparker 3:24fbf4dbd7e5 269 } else {
richardparker 3:24fbf4dbd7e5 270 _dateBox->setEnabled(true);
richardparker 3:24fbf4dbd7e5 271 }
richardparker 3:24fbf4dbd7e5 272 _dateBox->paint(_lcd);
richardparker 3:24fbf4dbd7e5 273
richardparker 3:24fbf4dbd7e5 274 // Create hit box if not already available.
richardparker 3:24fbf4dbd7e5 275 if (_touchBox == NULL)
richardparker 3:24fbf4dbd7e5 276 {
richardparker 3:24fbf4dbd7e5 277 _touchBox = new EAButton(_manager, (_lcd.width()/2)-(size()*2), _lcd.height()-(size()*3), size()*4, size(), "Touch Calibration", this);
richardparker 3:24fbf4dbd7e5 278 } else {
richardparker 3:24fbf4dbd7e5 279 _touchBox->setEnabled(true);
richardparker 3:24fbf4dbd7e5 280 }
richardparker 3:24fbf4dbd7e5 281 _touchBox->paint(_lcd);
richardparker 3:24fbf4dbd7e5 282
richardparker 3:24fbf4dbd7e5 283 // Create hit box if not already available.
richardparker 3:24fbf4dbd7e5 284 if (_returnBox == NULL)
richardparker 3:24fbf4dbd7e5 285 {
richardparker 3:24fbf4dbd7e5 286 _returnBox = new EAButton(_manager, (_lcd.width()/2)-(size()*2), _lcd.height()-(size()*2), size()*4, size(), "Return...", this);
richardparker 3:24fbf4dbd7e5 287 } else {
richardparker 3:24fbf4dbd7e5 288 _returnBox->setEnabled(true);
richardparker 3:24fbf4dbd7e5 289 }
richardparker 3:24fbf4dbd7e5 290 _returnBox->paint(_lcd);
richardparker 3:24fbf4dbd7e5 291
richardparker 3:24fbf4dbd7e5 292 }
richardparker 3:24fbf4dbd7e5 293
richardparker 4:f8f7f4f9c58d 294 void EASettings::_updateCompass()
richardparker 4:f8f7f4f9c58d 295 {
richardparker 4:f8f7f4f9c58d 296 float angle = _compass.getHeading();
richardparker 4:f8f7f4f9c58d 297 angle = (angle * PI)/180;
richardparker 4:f8f7f4f9c58d 298
richardparker 4:f8f7f4f9c58d 299 if (_compassCircle != NULL)
richardparker 4:f8f7f4f9c58d 300 {
richardparker 4:f8f7f4f9c58d 301 _compassCircle->update(_lcd, angle);
richardparker 4:f8f7f4f9c58d 302 }
richardparker 4:f8f7f4f9c58d 303 }
richardparker 4:f8f7f4f9c58d 304
richardparker 4:f8f7f4f9c58d 305 void EASettings::_drawCompass()
richardparker 4:f8f7f4f9c58d 306 {
richardparker 4:f8f7f4f9c58d 307 // Setup colours and clear screen to known background.
richardparker 4:f8f7f4f9c58d 308 EAColor white = EAColor(0xFF, 0xFF, 0xFF);
richardparker 4:f8f7f4f9c58d 309 EAColor black = EAColor(0x00, 0x00, 0x00);
richardparker 4:f8f7f4f9c58d 310
richardparker 4:f8f7f4f9c58d 311 EAFont font;
richardparker 4:f8f7f4f9c58d 312 EABrush brush = _lcd.brush();
richardparker 4:f8f7f4f9c58d 313 EAPen pen = _lcd.pen();
richardparker 4:f8f7f4f9c58d 314
richardparker 4:f8f7f4f9c58d 315 font.load("/local/large.fnt");
richardparker 4:f8f7f4f9c58d 316 _lcd.setFont(font);
richardparker 4:f8f7f4f9c58d 317
richardparker 4:f8f7f4f9c58d 318 brush.setColor(black);
richardparker 4:f8f7f4f9c58d 319 _lcd.setBrush(brush);
richardparker 4:f8f7f4f9c58d 320
richardparker 4:f8f7f4f9c58d 321 pen.setColor(white);
richardparker 4:f8f7f4f9c58d 322 _lcd.setPen(pen);
richardparker 4:f8f7f4f9c58d 323
richardparker 4:f8f7f4f9c58d 324 // Clear the screen to draw the buttons on.
richardparker 4:f8f7f4f9c58d 325 _lcd.clearScreen();
richardparker 4:f8f7f4f9c58d 326
richardparker 4:f8f7f4f9c58d 327 // Draw title.
richardparker 4:f8f7f4f9c58d 328 _lcd.drawText((_lcd.width()/2)-(size()*2), 10, "Compass Calibration");
richardparker 4:f8f7f4f9c58d 329
richardparker 4:f8f7f4f9c58d 330 // Create compass if not already available.
richardparker 4:f8f7f4f9c58d 331 if (_compassCircle == NULL)
richardparker 4:f8f7f4f9c58d 332 {
richardparker 4:f8f7f4f9c58d 333 _compassCircle = new EACompass((_lcd.width()/2)-(size()*1.5), (_lcd.height()/2)-(size()*1.5)-25, size()*3, 0);
richardparker 4:f8f7f4f9c58d 334 }
richardparker 4:f8f7f4f9c58d 335 _compassCircle->paint(_lcd);
richardparker 4:f8f7f4f9c58d 336
richardparker 4:f8f7f4f9c58d 337 // Create hit box if not already available.
richardparker 4:f8f7f4f9c58d 338 if (_returnBox == NULL)
richardparker 4:f8f7f4f9c58d 339 {
richardparker 4:f8f7f4f9c58d 340 _returnBox = new EAButton(_manager, (_lcd.width()/2)-(size()*2), _lcd.height()-(size()*2), size()*4, size(), "Return...", this);
richardparker 4:f8f7f4f9c58d 341 } else {
richardparker 4:f8f7f4f9c58d 342 _returnBox->setEnabled(true);
richardparker 4:f8f7f4f9c58d 343 }
richardparker 4:f8f7f4f9c58d 344 _returnBox->paint(_lcd);
richardparker 4:f8f7f4f9c58d 345 }
richardparker 4:f8f7f4f9c58d 346
richardparker 3:24fbf4dbd7e5 347 void EASettings::_drawDate()
richardparker 3:24fbf4dbd7e5 348 {
richardparker 3:24fbf4dbd7e5 349 // Setup colours and clear screen to known background.
richardparker 3:24fbf4dbd7e5 350 EAColor white = EAColor(0xFF, 0xFF, 0xFF);
richardparker 3:24fbf4dbd7e5 351 EAColor black = EAColor(0x00, 0x00, 0x00);
richardparker 3:24fbf4dbd7e5 352
richardparker 3:24fbf4dbd7e5 353 EAFont font;
richardparker 3:24fbf4dbd7e5 354 EABrush brush = _lcd.brush();
richardparker 3:24fbf4dbd7e5 355 EAPen pen = _lcd.pen();
richardparker 3:24fbf4dbd7e5 356
richardparker 3:24fbf4dbd7e5 357 font.load("/local/large.fnt");
richardparker 3:24fbf4dbd7e5 358 _lcd.setFont(font);
richardparker 3:24fbf4dbd7e5 359
richardparker 3:24fbf4dbd7e5 360 brush.setColor(black);
richardparker 3:24fbf4dbd7e5 361 _lcd.setBrush(brush);
richardparker 3:24fbf4dbd7e5 362
richardparker 3:24fbf4dbd7e5 363 pen.setColor(white);
richardparker 3:24fbf4dbd7e5 364 _lcd.setPen(pen);
richardparker 3:24fbf4dbd7e5 365
richardparker 3:24fbf4dbd7e5 366 // Clear the screen to draw the buttons on.
richardparker 3:24fbf4dbd7e5 367 _lcd.clearScreen();
richardparker 3:24fbf4dbd7e5 368
richardparker 3:24fbf4dbd7e5 369 // Draw title.
richardparker 3:24fbf4dbd7e5 370 _lcd.drawText((_lcd.width()/2)-(size()*2)+50, 10, "Date/Time");
richardparker 3:24fbf4dbd7e5 371
richardparker 3:24fbf4dbd7e5 372 // Draw date.
richardparker 3:24fbf4dbd7e5 373 char buffer[5];
richardparker 3:24fbf4dbd7e5 374 short y = 60;
richardparker 3:24fbf4dbd7e5 375 short x = (_lcd.width()/2)-(size()*2)-25;
richardparker 3:24fbf4dbd7e5 376
richardparker 3:24fbf4dbd7e5 377 // Update cached time.
richardparker 3:24fbf4dbd7e5 378 time_t seconds = time(NULL);
richardparker 3:24fbf4dbd7e5 379 _time = localtime(&seconds);
richardparker 3:24fbf4dbd7e5 380
richardparker 3:24fbf4dbd7e5 381 // Put the day of the month into the buffer and display.
richardparker 3:24fbf4dbd7e5 382 sprintf(buffer, "%02d", _time->tm_mday);
richardparker 3:24fbf4dbd7e5 383 _lcd.drawText(x, y, buffer);
richardparker 3:24fbf4dbd7e5 384
richardparker 3:24fbf4dbd7e5 385 // Display spacer.
richardparker 3:24fbf4dbd7e5 386 _lcd.drawText(x+20, y, "/");
richardparker 3:24fbf4dbd7e5 387
richardparker 3:24fbf4dbd7e5 388 // Put the month into the buffer and display.
richardparker 3:24fbf4dbd7e5 389 sprintf(buffer, "%02d", _time->tm_mon+1);
richardparker 3:24fbf4dbd7e5 390 _lcd.drawText(x+30, y, buffer);
richardparker 3:24fbf4dbd7e5 391
richardparker 3:24fbf4dbd7e5 392 // Display spacer.
richardparker 3:24fbf4dbd7e5 393 _lcd.drawText(x+50, y, "/");
richardparker 3:24fbf4dbd7e5 394
richardparker 3:24fbf4dbd7e5 395 // Put the month into the buffer and display.
richardparker 3:24fbf4dbd7e5 396 sprintf(buffer, "%04d", _time->tm_year+1900);
richardparker 3:24fbf4dbd7e5 397 _lcd.drawText(x+60, y, buffer);
richardparker 3:24fbf4dbd7e5 398
richardparker 3:24fbf4dbd7e5 399 // Put the hour into the buffer and display.
richardparker 3:24fbf4dbd7e5 400 sprintf(buffer, "%02d", _time->tm_hour);
richardparker 3:24fbf4dbd7e5 401 _lcd.drawText(x+120, y, buffer);
richardparker 3:24fbf4dbd7e5 402
richardparker 3:24fbf4dbd7e5 403 // Display spacer.
richardparker 3:24fbf4dbd7e5 404 _lcd.drawText(x+140, y, ":");
richardparker 3:24fbf4dbd7e5 405
richardparker 3:24fbf4dbd7e5 406 // Put the minute into the buffer and display.
richardparker 3:24fbf4dbd7e5 407 sprintf(buffer, "%02d", _time->tm_min);
richardparker 3:24fbf4dbd7e5 408 _lcd.drawText(x+150, y, buffer);
richardparker 3:24fbf4dbd7e5 409
richardparker 3:24fbf4dbd7e5 410 // Display spacer.
richardparker 3:24fbf4dbd7e5 411 _lcd.drawText(x+170, y, ":");
richardparker 3:24fbf4dbd7e5 412
richardparker 3:24fbf4dbd7e5 413 // Put the minute into the buffer and display.
richardparker 3:24fbf4dbd7e5 414 sprintf(buffer, "%02d", _time->tm_sec);
richardparker 3:24fbf4dbd7e5 415 _lcd.drawText(x+180, y, buffer);
richardparker 3:24fbf4dbd7e5 416
richardparker 3:24fbf4dbd7e5 417 _enableDateButtons();
richardparker 3:24fbf4dbd7e5 418 _prevBox->paint(_lcd);
richardparker 3:24fbf4dbd7e5 419 _nextBox->paint(_lcd);
richardparker 3:24fbf4dbd7e5 420 _decBox->paint(_lcd);
richardparker 3:24fbf4dbd7e5 421 _incBox->paint(_lcd);
richardparker 3:24fbf4dbd7e5 422 _returnBox->paint(_lcd);
richardparker 3:24fbf4dbd7e5 423 }
richardparker 3:24fbf4dbd7e5 424
richardparker 3:24fbf4dbd7e5 425 void EASettings::_enableDateButtons()
richardparker 3:24fbf4dbd7e5 426 {
richardparker 3:24fbf4dbd7e5 427 // Create hit box if not already available.
richardparker 3:24fbf4dbd7e5 428 if (_prevBox == NULL)
richardparker 3:24fbf4dbd7e5 429 {
richardparker 3:24fbf4dbd7e5 430 _prevBox = new EAButton(_manager, (_lcd.width()/2)-(size()*3), _lcd.height()-(size()*3.5), size(), size(), "<", this);
richardparker 3:24fbf4dbd7e5 431 } else {
richardparker 3:24fbf4dbd7e5 432 _prevBox->setEnabled(true);
richardparker 3:24fbf4dbd7e5 433 }
richardparker 3:24fbf4dbd7e5 434
richardparker 3:24fbf4dbd7e5 435 // Create hit box if not already available.
richardparker 3:24fbf4dbd7e5 436 if (_nextBox == NULL)
richardparker 3:24fbf4dbd7e5 437 {
richardparker 3:24fbf4dbd7e5 438 _nextBox = new EAButton(_manager, (_lcd.width()/2)-(size()*1.5), _lcd.height()-(size()*3.5), size(), size(), ">", this);
richardparker 3:24fbf4dbd7e5 439 } else {
richardparker 3:24fbf4dbd7e5 440 _nextBox->setEnabled(true);
richardparker 3:24fbf4dbd7e5 441 }
richardparker 3:24fbf4dbd7e5 442
richardparker 3:24fbf4dbd7e5 443 // Create hit box if not already available.
richardparker 3:24fbf4dbd7e5 444 if (_decBox == NULL)
richardparker 3:24fbf4dbd7e5 445 {
richardparker 3:24fbf4dbd7e5 446 _decBox = new EAButton(_manager, (_lcd.width()/2)+(size()*0.5), _lcd.height()-(size()*3.5), size(), size(), "-", this);
richardparker 3:24fbf4dbd7e5 447 } else {
richardparker 3:24fbf4dbd7e5 448 _decBox->setEnabled(true);
richardparker 3:24fbf4dbd7e5 449 }
richardparker 3:24fbf4dbd7e5 450
richardparker 3:24fbf4dbd7e5 451 // Create hit box if not already available.
richardparker 3:24fbf4dbd7e5 452 if (_incBox == NULL)
richardparker 3:24fbf4dbd7e5 453 {
richardparker 3:24fbf4dbd7e5 454 _incBox = new EAButton(_manager, (_lcd.width()/2)+(size()*2), _lcd.height()-(size()*3.5), size(), size(), "+", this);
richardparker 3:24fbf4dbd7e5 455 } else {
richardparker 3:24fbf4dbd7e5 456 _incBox->setEnabled(true);
richardparker 3:24fbf4dbd7e5 457 }
richardparker 3:24fbf4dbd7e5 458
richardparker 3:24fbf4dbd7e5 459 // Create hit box if not already available.
richardparker 3:24fbf4dbd7e5 460 if (_returnBox == NULL)
richardparker 3:24fbf4dbd7e5 461 {
richardparker 3:24fbf4dbd7e5 462 _returnBox = new EAButton(_manager, (_lcd.width()/2)-(size()*2), _lcd.height()-(size()*2), size()*4, size(), "Return...", this);
richardparker 3:24fbf4dbd7e5 463 } else {
richardparker 3:24fbf4dbd7e5 464 _returnBox->setEnabled(true);
richardparker 3:24fbf4dbd7e5 465 }
richardparker 3:24fbf4dbd7e5 466 }
richardparker 3:24fbf4dbd7e5 467
richardparker 3:24fbf4dbd7e5 468 EASettings::State EASettings::_incDate()
richardparker 3:24fbf4dbd7e5 469 {
richardparker 4:f8f7f4f9c58d 470 char buffer[5];
richardparker 4:f8f7f4f9c58d 471 short y = 60;
richardparker 4:f8f7f4f9c58d 472 short x = (_lcd.width()/2)-(size()*2)-25;
richardparker 4:f8f7f4f9c58d 473 tm oldTime = *_time;
richardparker 4:f8f7f4f9c58d 474
richardparker 4:f8f7f4f9c58d 475 // Setup colours and clear screen to known background.
richardparker 4:f8f7f4f9c58d 476 EAColor white = EAColor(0xFF, 0xFF, 0xFF);
richardparker 4:f8f7f4f9c58d 477 EAColor black = EAColor(0x00, 0x00, 0x00);
richardparker 4:f8f7f4f9c58d 478
richardparker 4:f8f7f4f9c58d 479 EAFont font;
richardparker 4:f8f7f4f9c58d 480 EABrush brush = _lcd.brush();
richardparker 4:f8f7f4f9c58d 481 EAPen pen = _lcd.pen();
richardparker 4:f8f7f4f9c58d 482
richardparker 4:f8f7f4f9c58d 483 font.load("/local/large.fnt");
richardparker 4:f8f7f4f9c58d 484 _lcd.setFont(font);
richardparker 4:f8f7f4f9c58d 485
richardparker 4:f8f7f4f9c58d 486 brush.setColor(black);
richardparker 4:f8f7f4f9c58d 487 _lcd.setBrush(brush);
richardparker 4:f8f7f4f9c58d 488
richardparker 4:f8f7f4f9c58d 489 pen.setColor(black);
richardparker 4:f8f7f4f9c58d 490 _lcd.setPen(pen);
richardparker 4:f8f7f4f9c58d 491
richardparker 4:f8f7f4f9c58d 492 // Now clear selection box.
richardparker 4:f8f7f4f9c58d 493 switch (state())
richardparker 4:f8f7f4f9c58d 494 {
richardparker 4:f8f7f4f9c58d 495 default:
richardparker 4:f8f7f4f9c58d 496 case EASettings::STATE_DATE_DAY:
richardparker 4:f8f7f4f9c58d 497 _time->tm_mday = (int)(_time->tm_mday+1) % 32;
richardparker 4:f8f7f4f9c58d 498 if (_time->tm_mday == 0) _time->tm_mday = 1;
richardparker 4:f8f7f4f9c58d 499 break;
richardparker 4:f8f7f4f9c58d 500 case EASettings::STATE_DATE_MONTH:
richardparker 4:f8f7f4f9c58d 501 _time->tm_mon = (int)(_time->tm_mon+1) % 12;
richardparker 4:f8f7f4f9c58d 502 printf("Month: %d\r\n", _time->tm_mon);
richardparker 4:f8f7f4f9c58d 503 break;
richardparker 4:f8f7f4f9c58d 504 case EASettings::STATE_DATE_YEAR:
richardparker 4:f8f7f4f9c58d 505 _time->tm_year++;
richardparker 4:f8f7f4f9c58d 506 break;
richardparker 4:f8f7f4f9c58d 507 case EASettings::STATE_DATE_HOUR:
richardparker 4:f8f7f4f9c58d 508 _time->tm_hour = (int)(_time->tm_hour+1) % 60;
richardparker 4:f8f7f4f9c58d 509 break;
richardparker 4:f8f7f4f9c58d 510 case EASettings::STATE_DATE_MINUTE:
richardparker 4:f8f7f4f9c58d 511 _time->tm_min = (int)(_time->tm_min+1) % 60;
richardparker 4:f8f7f4f9c58d 512 break;
richardparker 4:f8f7f4f9c58d 513 case EASettings::STATE_DATE_SECOND:
richardparker 4:f8f7f4f9c58d 514 _time->tm_sec = (int)(_time->tm_sec+1) % 60;
richardparker 4:f8f7f4f9c58d 515 break;
richardparker 4:f8f7f4f9c58d 516 }
richardparker 4:f8f7f4f9c58d 517
richardparker 4:f8f7f4f9c58d 518 // This converts to a valid value e.g. the value is too large for the month.
richardparker 4:f8f7f4f9c58d 519 time_t seconds = mktime(_time);
richardparker 4:f8f7f4f9c58d 520 printf("Time value is: %d\r\n", seconds);
richardparker 4:f8f7f4f9c58d 521 if (seconds == (time_t)-1)
richardparker 4:f8f7f4f9c58d 522 {
richardparker 4:f8f7f4f9c58d 523 printf("Bad time, not changing time...\r\n");
richardparker 4:f8f7f4f9c58d 524 *_time = oldTime;
richardparker 4:f8f7f4f9c58d 525 } else {
richardparker 4:f8f7f4f9c58d 526 _time = localtime(&seconds);
richardparker 4:f8f7f4f9c58d 527 }
richardparker 4:f8f7f4f9c58d 528
richardparker 4:f8f7f4f9c58d 529 if (oldTime.tm_mday != _time->tm_mday)
richardparker 4:f8f7f4f9c58d 530 {
richardparker 4:f8f7f4f9c58d 531 _lcd.drawFilledRect(x, y, 20, 20);
richardparker 4:f8f7f4f9c58d 532 sprintf(buffer, "%02d", _time->tm_mday);
richardparker 4:f8f7f4f9c58d 533 pen.setColor(white);
richardparker 4:f8f7f4f9c58d 534 _lcd.setPen(pen);
richardparker 4:f8f7f4f9c58d 535 _lcd.drawText(x, y, buffer);
richardparker 4:f8f7f4f9c58d 536 pen.setColor(black);
richardparker 4:f8f7f4f9c58d 537 _lcd.setPen(pen);
richardparker 4:f8f7f4f9c58d 538 }
richardparker 4:f8f7f4f9c58d 539 if (oldTime.tm_mon != _time->tm_mon)
richardparker 4:f8f7f4f9c58d 540 {
richardparker 4:f8f7f4f9c58d 541 _lcd.drawFilledRect(x+30, y, 20, 20);
richardparker 4:f8f7f4f9c58d 542 sprintf(buffer, "%02d", _time->tm_mon+1);
richardparker 4:f8f7f4f9c58d 543 pen.setColor(white);
richardparker 4:f8f7f4f9c58d 544 _lcd.setPen(pen);
richardparker 4:f8f7f4f9c58d 545 _lcd.drawText(x+30, y, buffer);
richardparker 4:f8f7f4f9c58d 546 pen.setColor(black);
richardparker 4:f8f7f4f9c58d 547 _lcd.setPen(pen);
richardparker 4:f8f7f4f9c58d 548 }
richardparker 4:f8f7f4f9c58d 549 if (oldTime.tm_year != _time->tm_year)
richardparker 4:f8f7f4f9c58d 550 {
richardparker 4:f8f7f4f9c58d 551 _lcd.drawFilledRect(x+60, y, 40, 20);
richardparker 4:f8f7f4f9c58d 552 sprintf(buffer, "%04d", _time->tm_year+1900);
richardparker 4:f8f7f4f9c58d 553 pen.setColor(white);
richardparker 4:f8f7f4f9c58d 554 _lcd.setPen(pen);
richardparker 4:f8f7f4f9c58d 555 _lcd.drawText(x+60, y, buffer);
richardparker 4:f8f7f4f9c58d 556 pen.setColor(black);
richardparker 4:f8f7f4f9c58d 557 _lcd.setPen(pen);
richardparker 4:f8f7f4f9c58d 558 }
richardparker 4:f8f7f4f9c58d 559 if (oldTime.tm_hour != _time->tm_hour)
richardparker 4:f8f7f4f9c58d 560 {
richardparker 4:f8f7f4f9c58d 561 _lcd.drawFilledRect(x+120, y, 20, 20);
richardparker 4:f8f7f4f9c58d 562 sprintf(buffer, "%02d", _time->tm_hour);
richardparker 4:f8f7f4f9c58d 563 pen.setColor(white);
richardparker 4:f8f7f4f9c58d 564 _lcd.setPen(pen);
richardparker 4:f8f7f4f9c58d 565 _lcd.drawText(x+120, y, buffer);
richardparker 4:f8f7f4f9c58d 566 pen.setColor(black);
richardparker 4:f8f7f4f9c58d 567 _lcd.setPen(pen);
richardparker 4:f8f7f4f9c58d 568 }
richardparker 4:f8f7f4f9c58d 569 if (oldTime.tm_min != _time->tm_min)
richardparker 4:f8f7f4f9c58d 570 {
richardparker 4:f8f7f4f9c58d 571 _lcd.drawFilledRect(x+150, y, 20, 20);
richardparker 4:f8f7f4f9c58d 572 sprintf(buffer, "%02d", _time->tm_min);
richardparker 4:f8f7f4f9c58d 573 pen.setColor(white);
richardparker 4:f8f7f4f9c58d 574 _lcd.setPen(pen);
richardparker 4:f8f7f4f9c58d 575 _lcd.drawText(x+150, y, buffer);
richardparker 4:f8f7f4f9c58d 576 pen.setColor(black);
richardparker 4:f8f7f4f9c58d 577 _lcd.setPen(pen);
richardparker 4:f8f7f4f9c58d 578 }
richardparker 4:f8f7f4f9c58d 579 if (oldTime.tm_sec != _time->tm_sec)
richardparker 4:f8f7f4f9c58d 580 {
richardparker 4:f8f7f4f9c58d 581 _lcd.drawFilledRect(x+180, y, 20, 20);
richardparker 4:f8f7f4f9c58d 582 sprintf(buffer, "%02d", _time->tm_sec);
richardparker 4:f8f7f4f9c58d 583 pen.setColor(white);
richardparker 4:f8f7f4f9c58d 584 _lcd.setPen(pen);
richardparker 4:f8f7f4f9c58d 585 _lcd.drawText(x+180, y, buffer);
richardparker 4:f8f7f4f9c58d 586 pen.setColor(black);
richardparker 4:f8f7f4f9c58d 587 _lcd.setPen(pen);
richardparker 4:f8f7f4f9c58d 588 }
richardparker 4:f8f7f4f9c58d 589
richardparker 4:f8f7f4f9c58d 590 pen.setColor(white);
richardparker 4:f8f7f4f9c58d 591 _lcd.setPen(pen);
richardparker 4:f8f7f4f9c58d 592
richardparker 4:f8f7f4f9c58d 593 // Now redraw selection box.
richardparker 4:f8f7f4f9c58d 594 switch (state())
richardparker 4:f8f7f4f9c58d 595 {
richardparker 4:f8f7f4f9c58d 596 default:
richardparker 4:f8f7f4f9c58d 597 case EASettings::STATE_DATE_DAY:
richardparker 4:f8f7f4f9c58d 598 _lcd.drawRect(x, y, 20, 20);
richardparker 4:f8f7f4f9c58d 599 break;
richardparker 4:f8f7f4f9c58d 600 case EASettings::STATE_DATE_MONTH:
richardparker 4:f8f7f4f9c58d 601 _lcd.drawRect(x+30, y, 20, 20);
richardparker 4:f8f7f4f9c58d 602 break;
richardparker 4:f8f7f4f9c58d 603 case EASettings::STATE_DATE_YEAR:
richardparker 4:f8f7f4f9c58d 604 _lcd.drawRect(x+60, y, 40, 20);
richardparker 4:f8f7f4f9c58d 605 break;
richardparker 4:f8f7f4f9c58d 606 case EASettings::STATE_DATE_HOUR:
richardparker 4:f8f7f4f9c58d 607 _lcd.drawRect(x+120, y, 20, 20);
richardparker 4:f8f7f4f9c58d 608 break;
richardparker 4:f8f7f4f9c58d 609 case EASettings::STATE_DATE_MINUTE:
richardparker 4:f8f7f4f9c58d 610 _lcd.drawRect(x+150, y, 20, 20);
richardparker 4:f8f7f4f9c58d 611 break;
richardparker 4:f8f7f4f9c58d 612 case EASettings::STATE_DATE_SECOND:
richardparker 4:f8f7f4f9c58d 613 _lcd.drawRect(x+180, y, 20, 20);
richardparker 4:f8f7f4f9c58d 614 break;
richardparker 4:f8f7f4f9c58d 615 }
richardparker 4:f8f7f4f9c58d 616
richardparker 3:24fbf4dbd7e5 617 return state();
richardparker 3:24fbf4dbd7e5 618 }
richardparker 3:24fbf4dbd7e5 619
richardparker 3:24fbf4dbd7e5 620 EASettings::State EASettings::_decDate()
richardparker 3:24fbf4dbd7e5 621 {
richardparker 4:f8f7f4f9c58d 622 char buffer[5];
richardparker 4:f8f7f4f9c58d 623 short y = 60;
richardparker 4:f8f7f4f9c58d 624 short x = (_lcd.width()/2)-(size()*2)-25;
richardparker 4:f8f7f4f9c58d 625 tm oldTime = *_time;
richardparker 4:f8f7f4f9c58d 626
richardparker 4:f8f7f4f9c58d 627 // Setup colours and clear screen to known background.
richardparker 4:f8f7f4f9c58d 628 EAColor white = EAColor(0xFF, 0xFF, 0xFF);
richardparker 4:f8f7f4f9c58d 629 EAColor black = EAColor(0x00, 0x00, 0x00);
richardparker 4:f8f7f4f9c58d 630
richardparker 4:f8f7f4f9c58d 631 EAFont font;
richardparker 4:f8f7f4f9c58d 632 EABrush brush = _lcd.brush();
richardparker 4:f8f7f4f9c58d 633 EAPen pen = _lcd.pen();
richardparker 4:f8f7f4f9c58d 634
richardparker 4:f8f7f4f9c58d 635 font.load("/local/large.fnt");
richardparker 4:f8f7f4f9c58d 636 _lcd.setFont(font);
richardparker 4:f8f7f4f9c58d 637
richardparker 4:f8f7f4f9c58d 638 brush.setColor(black);
richardparker 4:f8f7f4f9c58d 639 _lcd.setBrush(brush);
richardparker 4:f8f7f4f9c58d 640
richardparker 4:f8f7f4f9c58d 641 pen.setColor(black);
richardparker 4:f8f7f4f9c58d 642 _lcd.setPen(pen);
richardparker 4:f8f7f4f9c58d 643
richardparker 4:f8f7f4f9c58d 644 switch (state())
richardparker 4:f8f7f4f9c58d 645 {
richardparker 4:f8f7f4f9c58d 646 default:
richardparker 4:f8f7f4f9c58d 647 case EASettings::STATE_DATE_DAY:
richardparker 4:f8f7f4f9c58d 648 _time->tm_mday = (int)(_time->tm_mday-1) % 32;
richardparker 4:f8f7f4f9c58d 649 if (_time->tm_mday == 0) _time->tm_mday = 31;
richardparker 4:f8f7f4f9c58d 650 break;
richardparker 4:f8f7f4f9c58d 651 case EASettings::STATE_DATE_MONTH:
richardparker 4:f8f7f4f9c58d 652 _time->tm_mon = (int)(_time->tm_mon-1) % 12;
richardparker 4:f8f7f4f9c58d 653 break;
richardparker 4:f8f7f4f9c58d 654 case EASettings::STATE_DATE_YEAR:
richardparker 4:f8f7f4f9c58d 655 if (_time->tm_year > 70)
richardparker 4:f8f7f4f9c58d 656 {
richardparker 4:f8f7f4f9c58d 657 _time->tm_year--;
richardparker 4:f8f7f4f9c58d 658 }
richardparker 4:f8f7f4f9c58d 659 break;
richardparker 4:f8f7f4f9c58d 660 case EASettings::STATE_DATE_HOUR:
richardparker 4:f8f7f4f9c58d 661 _time->tm_hour = (int)(_time->tm_hour-1) % 60;
richardparker 4:f8f7f4f9c58d 662 break;
richardparker 4:f8f7f4f9c58d 663 case EASettings::STATE_DATE_MINUTE:
richardparker 4:f8f7f4f9c58d 664 _time->tm_min = (int)(_time->tm_min-1) % 60;
richardparker 4:f8f7f4f9c58d 665 break;
richardparker 4:f8f7f4f9c58d 666 case EASettings::STATE_DATE_SECOND:
richardparker 4:f8f7f4f9c58d 667 _time->tm_sec = (int)(_time->tm_sec-1) % 60;
richardparker 4:f8f7f4f9c58d 668 break;
richardparker 4:f8f7f4f9c58d 669 }
richardparker 4:f8f7f4f9c58d 670
richardparker 4:f8f7f4f9c58d 671 // This converts to a valid value e.g. the value is too large for the month.
richardparker 4:f8f7f4f9c58d 672 time_t seconds = mktime(_time);
richardparker 4:f8f7f4f9c58d 673 printf("Time value is: %d\r\n", seconds);
richardparker 4:f8f7f4f9c58d 674 if (seconds == (time_t)-1)
richardparker 4:f8f7f4f9c58d 675 {
richardparker 4:f8f7f4f9c58d 676 printf("Bad time, not changing time...\r\n");
richardparker 4:f8f7f4f9c58d 677 *_time = oldTime;
richardparker 4:f8f7f4f9c58d 678 } else {
richardparker 4:f8f7f4f9c58d 679 _time = localtime(&seconds);
richardparker 4:f8f7f4f9c58d 680 }
richardparker 4:f8f7f4f9c58d 681
richardparker 4:f8f7f4f9c58d 682 if (oldTime.tm_mday != _time->tm_mday)
richardparker 4:f8f7f4f9c58d 683 {
richardparker 4:f8f7f4f9c58d 684 _lcd.drawFilledRect(x, y, 20, 20);
richardparker 4:f8f7f4f9c58d 685 sprintf(buffer, "%02d", _time->tm_mday);
richardparker 4:f8f7f4f9c58d 686 pen.setColor(white);
richardparker 4:f8f7f4f9c58d 687 _lcd.setPen(pen);
richardparker 4:f8f7f4f9c58d 688 _lcd.drawText(x, y, buffer);
richardparker 4:f8f7f4f9c58d 689 pen.setColor(black);
richardparker 4:f8f7f4f9c58d 690 _lcd.setPen(pen);
richardparker 4:f8f7f4f9c58d 691 }
richardparker 4:f8f7f4f9c58d 692 if (oldTime.tm_mon != _time->tm_mon)
richardparker 4:f8f7f4f9c58d 693 {
richardparker 4:f8f7f4f9c58d 694 _lcd.drawFilledRect(x+30, y, 20, 20);
richardparker 4:f8f7f4f9c58d 695 sprintf(buffer, "%02d", _time->tm_mon+1);
richardparker 4:f8f7f4f9c58d 696 pen.setColor(white);
richardparker 4:f8f7f4f9c58d 697 _lcd.setPen(pen);
richardparker 4:f8f7f4f9c58d 698 _lcd.drawText(x+30, y, buffer);
richardparker 4:f8f7f4f9c58d 699 pen.setColor(black);
richardparker 4:f8f7f4f9c58d 700 _lcd.setPen(pen);
richardparker 4:f8f7f4f9c58d 701 }
richardparker 4:f8f7f4f9c58d 702 if (oldTime.tm_year != _time->tm_year)
richardparker 4:f8f7f4f9c58d 703 {
richardparker 4:f8f7f4f9c58d 704 _lcd.drawFilledRect(x+60, y, 40, 20);
richardparker 4:f8f7f4f9c58d 705 sprintf(buffer, "%04d", _time->tm_year+1900);
richardparker 4:f8f7f4f9c58d 706 pen.setColor(white);
richardparker 4:f8f7f4f9c58d 707 _lcd.setPen(pen);
richardparker 4:f8f7f4f9c58d 708 _lcd.drawText(x+60, y, buffer);
richardparker 4:f8f7f4f9c58d 709 pen.setColor(black);
richardparker 4:f8f7f4f9c58d 710 _lcd.setPen(pen);
richardparker 4:f8f7f4f9c58d 711 }
richardparker 4:f8f7f4f9c58d 712 if (oldTime.tm_hour != _time->tm_hour)
richardparker 4:f8f7f4f9c58d 713 {
richardparker 4:f8f7f4f9c58d 714 _lcd.drawFilledRect(x+120, y, 20, 20);
richardparker 4:f8f7f4f9c58d 715 sprintf(buffer, "%02d", _time->tm_hour);
richardparker 4:f8f7f4f9c58d 716 pen.setColor(white);
richardparker 4:f8f7f4f9c58d 717 _lcd.setPen(pen);
richardparker 4:f8f7f4f9c58d 718 _lcd.drawText(x+120, y, buffer);
richardparker 4:f8f7f4f9c58d 719 pen.setColor(black);
richardparker 4:f8f7f4f9c58d 720 _lcd.setPen(pen);
richardparker 4:f8f7f4f9c58d 721 }
richardparker 4:f8f7f4f9c58d 722 if (oldTime.tm_min != _time->tm_min)
richardparker 4:f8f7f4f9c58d 723 {
richardparker 4:f8f7f4f9c58d 724 _lcd.drawFilledRect(x+150, y, 20, 20);
richardparker 4:f8f7f4f9c58d 725 sprintf(buffer, "%02d", _time->tm_min);
richardparker 4:f8f7f4f9c58d 726 pen.setColor(white);
richardparker 4:f8f7f4f9c58d 727 _lcd.setPen(pen);
richardparker 4:f8f7f4f9c58d 728 _lcd.drawText(x+150, y, buffer);
richardparker 4:f8f7f4f9c58d 729 pen.setColor(black);
richardparker 4:f8f7f4f9c58d 730 _lcd.setPen(pen);
richardparker 4:f8f7f4f9c58d 731 }
richardparker 4:f8f7f4f9c58d 732 if (oldTime.tm_sec != _time->tm_sec)
richardparker 4:f8f7f4f9c58d 733 {
richardparker 4:f8f7f4f9c58d 734 _lcd.drawFilledRect(x+180, y, 20, 20);
richardparker 4:f8f7f4f9c58d 735 sprintf(buffer, "%02d", _time->tm_sec);
richardparker 4:f8f7f4f9c58d 736 pen.setColor(white);
richardparker 4:f8f7f4f9c58d 737 _lcd.setPen(pen);
richardparker 4:f8f7f4f9c58d 738 _lcd.drawText(x+180, y, buffer);
richardparker 4:f8f7f4f9c58d 739 pen.setColor(black);
richardparker 4:f8f7f4f9c58d 740 _lcd.setPen(pen);
richardparker 4:f8f7f4f9c58d 741 }
richardparker 4:f8f7f4f9c58d 742
richardparker 4:f8f7f4f9c58d 743 pen.setColor(white);
richardparker 4:f8f7f4f9c58d 744 _lcd.setPen(pen);
richardparker 4:f8f7f4f9c58d 745
richardparker 4:f8f7f4f9c58d 746 // Now redraw selection box.
richardparker 4:f8f7f4f9c58d 747 switch (state())
richardparker 4:f8f7f4f9c58d 748 {
richardparker 4:f8f7f4f9c58d 749 default:
richardparker 4:f8f7f4f9c58d 750 case EASettings::STATE_DATE_DAY:
richardparker 4:f8f7f4f9c58d 751 _lcd.drawRect(x, y, 20, 20);
richardparker 4:f8f7f4f9c58d 752 break;
richardparker 4:f8f7f4f9c58d 753 case EASettings::STATE_DATE_MONTH:
richardparker 4:f8f7f4f9c58d 754 _lcd.drawRect(x+30, y, 20, 20);
richardparker 4:f8f7f4f9c58d 755 break;
richardparker 4:f8f7f4f9c58d 756 case EASettings::STATE_DATE_YEAR:
richardparker 4:f8f7f4f9c58d 757 _lcd.drawRect(x+60, y, 40, 20);
richardparker 4:f8f7f4f9c58d 758 break;
richardparker 4:f8f7f4f9c58d 759 case EASettings::STATE_DATE_HOUR:
richardparker 4:f8f7f4f9c58d 760 _lcd.drawRect(x+120, y, 20, 20);
richardparker 4:f8f7f4f9c58d 761 break;
richardparker 4:f8f7f4f9c58d 762 case EASettings::STATE_DATE_MINUTE:
richardparker 4:f8f7f4f9c58d 763 _lcd.drawRect(x+150, y, 20, 20);
richardparker 4:f8f7f4f9c58d 764 break;
richardparker 4:f8f7f4f9c58d 765 case EASettings::STATE_DATE_SECOND:
richardparker 4:f8f7f4f9c58d 766 _lcd.drawRect(x+180, y, 20, 20);
richardparker 4:f8f7f4f9c58d 767 break;
richardparker 4:f8f7f4f9c58d 768 }
richardparker 3:24fbf4dbd7e5 769
richardparker 3:24fbf4dbd7e5 770 return state();
richardparker 3:24fbf4dbd7e5 771 }
richardparker 3:24fbf4dbd7e5 772
richardparker 3:24fbf4dbd7e5 773 EASettings::State EASettings::_nextDate()
richardparker 3:24fbf4dbd7e5 774 {
richardparker 3:24fbf4dbd7e5 775 short y = 60;
richardparker 3:24fbf4dbd7e5 776 short x = (_lcd.width()/2)-(size()*2)-25;
richardparker 3:24fbf4dbd7e5 777
richardparker 3:24fbf4dbd7e5 778 EASettings::State nextState = EASettings::STATE_IDLE;
richardparker 3:24fbf4dbd7e5 779
richardparker 3:24fbf4dbd7e5 780 // Setup colours and clear screen to known background.
richardparker 3:24fbf4dbd7e5 781 EAColor white = EAColor(0xFF, 0xFF, 0xFF);
richardparker 3:24fbf4dbd7e5 782 EAColor black = EAColor(0x00, 0x00, 0x00);
richardparker 3:24fbf4dbd7e5 783
richardparker 3:24fbf4dbd7e5 784 EABrush brush = _lcd.brush();
richardparker 3:24fbf4dbd7e5 785 EAPen pen = _lcd.pen();
richardparker 3:24fbf4dbd7e5 786
richardparker 3:24fbf4dbd7e5 787 brush.setColor(white);
richardparker 3:24fbf4dbd7e5 788 _lcd.setBrush(brush);
richardparker 3:24fbf4dbd7e5 789
richardparker 3:24fbf4dbd7e5 790 pen.setColor(black);
richardparker 3:24fbf4dbd7e5 791 _lcd.setPen(pen);
richardparker 3:24fbf4dbd7e5 792
richardparker 3:24fbf4dbd7e5 793 // Now clear selection box.
richardparker 3:24fbf4dbd7e5 794 switch (state())
richardparker 3:24fbf4dbd7e5 795 {
richardparker 3:24fbf4dbd7e5 796 default:
richardparker 3:24fbf4dbd7e5 797 case EASettings::STATE_DATE_DAY:
richardparker 3:24fbf4dbd7e5 798 _lcd.drawRect(x, y, 20, 20);
richardparker 3:24fbf4dbd7e5 799 break;
richardparker 3:24fbf4dbd7e5 800 case EASettings::STATE_DATE_MONTH:
richardparker 3:24fbf4dbd7e5 801 _lcd.drawRect(x+30, y, 20, 20);
richardparker 3:24fbf4dbd7e5 802 break;
richardparker 3:24fbf4dbd7e5 803 case EASettings::STATE_DATE_YEAR:
richardparker 3:24fbf4dbd7e5 804 _lcd.drawRect(x+60, y, 40, 20);
richardparker 3:24fbf4dbd7e5 805 break;
richardparker 3:24fbf4dbd7e5 806 case EASettings::STATE_DATE_HOUR:
richardparker 3:24fbf4dbd7e5 807 _lcd.drawRect(x+120, y, 20, 20);
richardparker 3:24fbf4dbd7e5 808 break;
richardparker 3:24fbf4dbd7e5 809 case EASettings::STATE_DATE_MINUTE:
richardparker 3:24fbf4dbd7e5 810 _lcd.drawRect(x+150, y, 20, 20);
richardparker 3:24fbf4dbd7e5 811 break;
richardparker 3:24fbf4dbd7e5 812 case EASettings::STATE_DATE_SECOND:
richardparker 3:24fbf4dbd7e5 813 _lcd.drawRect(x+180, y, 20, 20);
richardparker 3:24fbf4dbd7e5 814 break;
richardparker 3:24fbf4dbd7e5 815 }
richardparker 3:24fbf4dbd7e5 816
richardparker 3:24fbf4dbd7e5 817 brush.setColor(black);
richardparker 3:24fbf4dbd7e5 818 _lcd.setBrush(brush);
richardparker 3:24fbf4dbd7e5 819
richardparker 3:24fbf4dbd7e5 820 pen.setColor(white);
richardparker 3:24fbf4dbd7e5 821 _lcd.setPen(pen);
richardparker 3:24fbf4dbd7e5 822
richardparker 3:24fbf4dbd7e5 823 // Now draw selection box.
richardparker 3:24fbf4dbd7e5 824 switch (state())
richardparker 3:24fbf4dbd7e5 825 {
richardparker 3:24fbf4dbd7e5 826 default:
richardparker 3:24fbf4dbd7e5 827 case EASettings::STATE_DATE_DAY:
richardparker 3:24fbf4dbd7e5 828 nextState = EASettings::STATE_DATE_MONTH;
richardparker 3:24fbf4dbd7e5 829 _lcd.drawRect(x+30, y, 20, 20);
richardparker 3:24fbf4dbd7e5 830 break;
richardparker 3:24fbf4dbd7e5 831 case EASettings::STATE_DATE_MONTH:
richardparker 3:24fbf4dbd7e5 832 nextState = EASettings::STATE_DATE_YEAR;
richardparker 3:24fbf4dbd7e5 833 _lcd.drawRect(x+60, y, 40, 20);
richardparker 3:24fbf4dbd7e5 834 break;
richardparker 3:24fbf4dbd7e5 835 case EASettings::STATE_DATE_YEAR:
richardparker 3:24fbf4dbd7e5 836 nextState = EASettings::STATE_DATE_HOUR;
richardparker 3:24fbf4dbd7e5 837 _lcd.drawRect(x+120, y, 20, 20);
richardparker 3:24fbf4dbd7e5 838 break;
richardparker 3:24fbf4dbd7e5 839 case EASettings::STATE_DATE_HOUR:
richardparker 3:24fbf4dbd7e5 840 nextState = EASettings::STATE_DATE_MINUTE;
richardparker 3:24fbf4dbd7e5 841 _lcd.drawRect(x+150, y, 20, 20);
richardparker 3:24fbf4dbd7e5 842 break;
richardparker 3:24fbf4dbd7e5 843 case EASettings::STATE_DATE_MINUTE:
richardparker 3:24fbf4dbd7e5 844 nextState = EASettings::STATE_DATE_SECOND;
richardparker 3:24fbf4dbd7e5 845 _lcd.drawRect(x+180, y, 20, 20);
richardparker 3:24fbf4dbd7e5 846 break;
richardparker 3:24fbf4dbd7e5 847 case EASettings::STATE_DATE_SECOND:
richardparker 3:24fbf4dbd7e5 848 nextState = EASettings::STATE_DATE_DAY;
richardparker 3:24fbf4dbd7e5 849 _lcd.drawRect(x, y, 20, 20);
richardparker 3:24fbf4dbd7e5 850 break;
richardparker 3:24fbf4dbd7e5 851 }
richardparker 3:24fbf4dbd7e5 852
richardparker 3:24fbf4dbd7e5 853 return nextState;
richardparker 3:24fbf4dbd7e5 854 }
richardparker 3:24fbf4dbd7e5 855
richardparker 3:24fbf4dbd7e5 856 EASettings::State EASettings::_prevDate()
richardparker 3:24fbf4dbd7e5 857 {
richardparker 3:24fbf4dbd7e5 858 short y = 60;
richardparker 3:24fbf4dbd7e5 859 short x = (_lcd.width()/2)-(size()*2)-25;
richardparker 3:24fbf4dbd7e5 860
richardparker 3:24fbf4dbd7e5 861 EASettings::State prevState = EASettings::STATE_IDLE;
richardparker 3:24fbf4dbd7e5 862
richardparker 3:24fbf4dbd7e5 863 // Setup colours and clear screen to known background.
richardparker 3:24fbf4dbd7e5 864 EAColor white = EAColor(0xFF, 0xFF, 0xFF);
richardparker 3:24fbf4dbd7e5 865 EAColor black = EAColor(0x00, 0x00, 0x00);
richardparker 3:24fbf4dbd7e5 866
richardparker 3:24fbf4dbd7e5 867 EABrush brush = _lcd.brush();
richardparker 3:24fbf4dbd7e5 868 EAPen pen = _lcd.pen();
richardparker 3:24fbf4dbd7e5 869
richardparker 3:24fbf4dbd7e5 870 brush.setColor(white);
richardparker 3:24fbf4dbd7e5 871 _lcd.setBrush(brush);
richardparker 3:24fbf4dbd7e5 872
richardparker 3:24fbf4dbd7e5 873 pen.setColor(black);
richardparker 3:24fbf4dbd7e5 874 _lcd.setPen(pen);
richardparker 3:24fbf4dbd7e5 875
richardparker 3:24fbf4dbd7e5 876 // Now clear selection box.
richardparker 3:24fbf4dbd7e5 877 switch (state())
richardparker 3:24fbf4dbd7e5 878 {
richardparker 3:24fbf4dbd7e5 879 default:
richardparker 3:24fbf4dbd7e5 880 case EASettings::STATE_DATE_DAY:
richardparker 3:24fbf4dbd7e5 881 _lcd.drawRect(x, y, 20, 20);
richardparker 3:24fbf4dbd7e5 882 break;
richardparker 3:24fbf4dbd7e5 883 case EASettings::STATE_DATE_MONTH:
richardparker 3:24fbf4dbd7e5 884 _lcd.drawRect(x+30, y, 20, 20);
richardparker 3:24fbf4dbd7e5 885 break;
richardparker 3:24fbf4dbd7e5 886 case EASettings::STATE_DATE_YEAR:
richardparker 3:24fbf4dbd7e5 887 _lcd.drawRect(x+60, y, 40, 20);
richardparker 3:24fbf4dbd7e5 888 break;
richardparker 3:24fbf4dbd7e5 889 case EASettings::STATE_DATE_HOUR:
richardparker 3:24fbf4dbd7e5 890 _lcd.drawRect(x+120, y, 20, 20);
richardparker 3:24fbf4dbd7e5 891 break;
richardparker 3:24fbf4dbd7e5 892 case EASettings::STATE_DATE_MINUTE:
richardparker 3:24fbf4dbd7e5 893 _lcd.drawRect(x+150, y, 20, 20);
richardparker 3:24fbf4dbd7e5 894 break;
richardparker 3:24fbf4dbd7e5 895 case EASettings::STATE_DATE_SECOND:
richardparker 3:24fbf4dbd7e5 896 _lcd.drawRect(x+180, y, 20, 20);
richardparker 3:24fbf4dbd7e5 897 break;
richardparker 3:24fbf4dbd7e5 898 }
richardparker 3:24fbf4dbd7e5 899
richardparker 3:24fbf4dbd7e5 900 brush.setColor(black);
richardparker 3:24fbf4dbd7e5 901 _lcd.setBrush(brush);
richardparker 3:24fbf4dbd7e5 902
richardparker 3:24fbf4dbd7e5 903 pen.setColor(white);
richardparker 3:24fbf4dbd7e5 904 _lcd.setPen(pen);
richardparker 3:24fbf4dbd7e5 905
richardparker 3:24fbf4dbd7e5 906 // Now draw selection box.
richardparker 3:24fbf4dbd7e5 907 switch (state())
richardparker 3:24fbf4dbd7e5 908 {
richardparker 3:24fbf4dbd7e5 909 default:
richardparker 3:24fbf4dbd7e5 910 case EASettings::STATE_DATE_DAY:
richardparker 3:24fbf4dbd7e5 911 prevState = EASettings::STATE_DATE_SECOND;
richardparker 3:24fbf4dbd7e5 912 _lcd.drawRect(x+180, y, 20, 20);
richardparker 3:24fbf4dbd7e5 913 break;
richardparker 3:24fbf4dbd7e5 914 case EASettings::STATE_DATE_MONTH:
richardparker 3:24fbf4dbd7e5 915 prevState = EASettings::STATE_DATE_DAY;
richardparker 3:24fbf4dbd7e5 916 _lcd.drawRect(x, y, 20, 20);
richardparker 3:24fbf4dbd7e5 917 break;
richardparker 3:24fbf4dbd7e5 918 case EASettings::STATE_DATE_YEAR:
richardparker 3:24fbf4dbd7e5 919 prevState = EASettings::STATE_DATE_MONTH;
richardparker 3:24fbf4dbd7e5 920 _lcd.drawRect(x+30, y, 20, 20);
richardparker 3:24fbf4dbd7e5 921 break;
richardparker 3:24fbf4dbd7e5 922 case EASettings::STATE_DATE_HOUR:
richardparker 3:24fbf4dbd7e5 923 prevState = EASettings::STATE_DATE_YEAR;
richardparker 3:24fbf4dbd7e5 924 _lcd.drawRect(x+60, y, 40, 20);
richardparker 3:24fbf4dbd7e5 925 break;
richardparker 3:24fbf4dbd7e5 926 case EASettings::STATE_DATE_MINUTE:
richardparker 3:24fbf4dbd7e5 927 prevState = EASettings::STATE_DATE_HOUR;
richardparker 3:24fbf4dbd7e5 928 _lcd.drawRect(x+120, y, 20, 20);
richardparker 3:24fbf4dbd7e5 929 break;
richardparker 3:24fbf4dbd7e5 930 case EASettings::STATE_DATE_SECOND:
richardparker 3:24fbf4dbd7e5 931 prevState = EASettings::STATE_DATE_MINUTE;
richardparker 3:24fbf4dbd7e5 932 _lcd.drawRect(x+150, y, 20, 20);
richardparker 3:24fbf4dbd7e5 933 break;
richardparker 3:24fbf4dbd7e5 934 }
richardparker 3:24fbf4dbd7e5 935
richardparker 3:24fbf4dbd7e5 936 return prevState;
richardparker 3:24fbf4dbd7e5 937 }
richardparker 3:24fbf4dbd7e5 938