Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: extras/EASettings.cpp
- Revision:
- 4:f8f7f4f9c58d
- Parent:
- 3:24fbf4dbd7e5
- Child:
- 7:6cf21b018420
--- a/extras/EASettings.cpp Wed Mar 31 22:22:21 2010 +0000 +++ b/extras/EASettings.cpp Mon Apr 26 21:37:54 2010 +0000 @@ -8,12 +8,17 @@ #include "../screen/EATouch.h" #include "../manager/EATouchManager.h" #include "../widgets/EAButton.h" +#include "../widgets/EACompass.h" -EASettings::EASettings(EALCD& lcd, EATouch& touch, EATouchManager& manager) +#include "HMC6352.h" + +EASettings::EASettings(EALCD& lcd, EATouch& touch, EATouchManager& manager, HMC6352& compass) : _lcd(lcd), _touch(touch), _manager(manager), + _compass(compass), _time(NULL), + _compassCircle(NULL), _launchBox(NULL), _returnBox(NULL), _touchBox(NULL), @@ -41,14 +46,21 @@ _drawLaunchButton(); } +void EASettings::tick() +{ + // Do action depending on the state that in. + switch(state()) + { + case EASettings::STATE_COMPASS: + _updateCompass(); + break; + } +} + void EASettings::actionHandler(EAHitBox* box, short x, short y) { State nextState = EASettings::STATE_IDLE; - // DEBUG - Serial pc(USBTX, USBRX); - pc.printf("Hello yessd!!!\r\n"); - // Disable hit boxs from previous screens. _disableHitBoxs(); @@ -75,11 +87,26 @@ _drawDate(); _state = EASettings::STATE_DATE_SECOND; nextState = _nextDate(); + } + else if (box == _compassBox->hitBox()) + { + _drawCompass(); + nextState = EASettings::STATE_COMPASS; } else { _drawPortal(); nextState = EASettings::STATE_PORTAL; } break; + case EASettings::STATE_COMPASS: + if (box == _returnBox->hitBox()) + { + _drawPortal(); + nextState = EASettings::STATE_PORTAL; + } else { + _drawCompass(); + nextState = EASettings::STATE_COMPASS; + } + break; case EASettings::STATE_DATE_DAY: case EASettings::STATE_DATE_MONTH: case EASettings::STATE_DATE_YEAR: @@ -88,6 +115,7 @@ case EASettings::STATE_DATE_SECOND: if (box == _returnBox->hitBox()) { + set_time(mktime(_time)); _drawPortal(); nextState = EASettings::STATE_PORTAL; } @@ -174,9 +202,13 @@ EAColor white = EAColor(0xFF, 0xFF, 0xFF); EAColor black = EAColor(0x00, 0x00, 0x00); + EAFont font; EABrush brush = _lcd.brush(); EAPen pen = _lcd.pen(); + font.load("/local/large.fnt"); + _lcd.setFont(font); + brush.setColor(black); _lcd.setBrush(brush); @@ -186,7 +218,7 @@ // Create hit box if not already available. if (_launchBox == NULL) { - _launchBox = new EAButton(_manager, _lcd.width()-size(), _lcd.height()-size(), size(), size(), "S", this); + _launchBox = new EAButton(_manager, _lcd.width()-60, _lcd.height()-60, 60, 60, "S", this); } else { _launchBox->setEnabled(true); } @@ -256,6 +288,59 @@ } +void EASettings::_updateCompass() +{ + float angle = _compass.getHeading(); + angle = (angle * PI)/180; + + if (_compassCircle != NULL) + { + _compassCircle->update(_lcd, angle); + } +} + +void EASettings::_drawCompass() +{ + // Setup colours and clear screen to known background. + EAColor white = EAColor(0xFF, 0xFF, 0xFF); + EAColor black = EAColor(0x00, 0x00, 0x00); + + EAFont font; + EABrush brush = _lcd.brush(); + EAPen pen = _lcd.pen(); + + font.load("/local/large.fnt"); + _lcd.setFont(font); + + brush.setColor(black); + _lcd.setBrush(brush); + + pen.setColor(white); + _lcd.setPen(pen); + + // Clear the screen to draw the buttons on. + _lcd.clearScreen(); + + // Draw title. + _lcd.drawText((_lcd.width()/2)-(size()*2), 10, "Compass Calibration"); + + // Create compass if not already available. + if (_compassCircle == NULL) + { + _compassCircle = new EACompass((_lcd.width()/2)-(size()*1.5), (_lcd.height()/2)-(size()*1.5)-25, size()*3, 0); + } + _compassCircle->paint(_lcd); + + // Create hit box if not already available. + if (_returnBox == NULL) + { + _returnBox = new EAButton(_manager, (_lcd.width()/2)-(size()*2), _lcd.height()-(size()*2), size()*4, size(), "Return...", this); + } else { + _returnBox->setEnabled(true); + } + _returnBox->paint(_lcd); +} + void EASettings::_drawDate() { // Setup colours and clear screen to known background. @@ -379,11 +464,305 @@ EASettings::State EASettings::_incDate() { + char buffer[5]; + short y = 60; + short x = (_lcd.width()/2)-(size()*2)-25; + tm oldTime = *_time; + + // Setup colours and clear screen to known background. + EAColor white = EAColor(0xFF, 0xFF, 0xFF); + EAColor black = EAColor(0x00, 0x00, 0x00); + + EAFont font; + EABrush brush = _lcd.brush(); + EAPen pen = _lcd.pen(); + + font.load("/local/large.fnt"); + _lcd.setFont(font); + + brush.setColor(black); + _lcd.setBrush(brush); + + pen.setColor(black); + _lcd.setPen(pen); + + // Now clear selection box. + switch (state()) + { + default: + case EASettings::STATE_DATE_DAY: + _time->tm_mday = (int)(_time->tm_mday+1) % 32; + if (_time->tm_mday == 0) _time->tm_mday = 1; + break; + case EASettings::STATE_DATE_MONTH: + _time->tm_mon = (int)(_time->tm_mon+1) % 12; + printf("Month: %d\r\n", _time->tm_mon); + break; + case EASettings::STATE_DATE_YEAR: + _time->tm_year++; + break; + case EASettings::STATE_DATE_HOUR: + _time->tm_hour = (int)(_time->tm_hour+1) % 60; + break; + case EASettings::STATE_DATE_MINUTE: + _time->tm_min = (int)(_time->tm_min+1) % 60; + break; + case EASettings::STATE_DATE_SECOND: + _time->tm_sec = (int)(_time->tm_sec+1) % 60; + break; + } + + // This converts to a valid value e.g. the value is too large for the month. + time_t seconds = mktime(_time); + printf("Time value is: %d\r\n", seconds); + if (seconds == (time_t)-1) + { + printf("Bad time, not changing time...\r\n"); + *_time = oldTime; + } else { + _time = localtime(&seconds); + } + + if (oldTime.tm_mday != _time->tm_mday) + { + _lcd.drawFilledRect(x, y, 20, 20); + sprintf(buffer, "%02d", _time->tm_mday); + pen.setColor(white); + _lcd.setPen(pen); + _lcd.drawText(x, y, buffer); + pen.setColor(black); + _lcd.setPen(pen); + } + if (oldTime.tm_mon != _time->tm_mon) + { + _lcd.drawFilledRect(x+30, y, 20, 20); + sprintf(buffer, "%02d", _time->tm_mon+1); + pen.setColor(white); + _lcd.setPen(pen); + _lcd.drawText(x+30, y, buffer); + pen.setColor(black); + _lcd.setPen(pen); + } + if (oldTime.tm_year != _time->tm_year) + { + _lcd.drawFilledRect(x+60, y, 40, 20); + sprintf(buffer, "%04d", _time->tm_year+1900); + pen.setColor(white); + _lcd.setPen(pen); + _lcd.drawText(x+60, y, buffer); + pen.setColor(black); + _lcd.setPen(pen); + } + if (oldTime.tm_hour != _time->tm_hour) + { + _lcd.drawFilledRect(x+120, y, 20, 20); + sprintf(buffer, "%02d", _time->tm_hour); + pen.setColor(white); + _lcd.setPen(pen); + _lcd.drawText(x+120, y, buffer); + pen.setColor(black); + _lcd.setPen(pen); + } + if (oldTime.tm_min != _time->tm_min) + { + _lcd.drawFilledRect(x+150, y, 20, 20); + sprintf(buffer, "%02d", _time->tm_min); + pen.setColor(white); + _lcd.setPen(pen); + _lcd.drawText(x+150, y, buffer); + pen.setColor(black); + _lcd.setPen(pen); + } + if (oldTime.tm_sec != _time->tm_sec) + { + _lcd.drawFilledRect(x+180, y, 20, 20); + sprintf(buffer, "%02d", _time->tm_sec); + pen.setColor(white); + _lcd.setPen(pen); + _lcd.drawText(x+180, y, buffer); + pen.setColor(black); + _lcd.setPen(pen); + } + + pen.setColor(white); + _lcd.setPen(pen); + + // Now redraw selection box. + switch (state()) + { + default: + case EASettings::STATE_DATE_DAY: + _lcd.drawRect(x, y, 20, 20); + break; + case EASettings::STATE_DATE_MONTH: + _lcd.drawRect(x+30, y, 20, 20); + break; + case EASettings::STATE_DATE_YEAR: + _lcd.drawRect(x+60, y, 40, 20); + break; + case EASettings::STATE_DATE_HOUR: + _lcd.drawRect(x+120, y, 20, 20); + break; + case EASettings::STATE_DATE_MINUTE: + _lcd.drawRect(x+150, y, 20, 20); + break; + case EASettings::STATE_DATE_SECOND: + _lcd.drawRect(x+180, y, 20, 20); + break; + } + return state(); } EASettings::State EASettings::_decDate() { + char buffer[5]; + short y = 60; + short x = (_lcd.width()/2)-(size()*2)-25; + tm oldTime = *_time; + + // Setup colours and clear screen to known background. + EAColor white = EAColor(0xFF, 0xFF, 0xFF); + EAColor black = EAColor(0x00, 0x00, 0x00); + + EAFont font; + EABrush brush = _lcd.brush(); + EAPen pen = _lcd.pen(); + + font.load("/local/large.fnt"); + _lcd.setFont(font); + + brush.setColor(black); + _lcd.setBrush(brush); + + pen.setColor(black); + _lcd.setPen(pen); + + switch (state()) + { + default: + case EASettings::STATE_DATE_DAY: + _time->tm_mday = (int)(_time->tm_mday-1) % 32; + if (_time->tm_mday == 0) _time->tm_mday = 31; + break; + case EASettings::STATE_DATE_MONTH: + _time->tm_mon = (int)(_time->tm_mon-1) % 12; + break; + case EASettings::STATE_DATE_YEAR: + if (_time->tm_year > 70) + { + _time->tm_year--; + } + break; + case EASettings::STATE_DATE_HOUR: + _time->tm_hour = (int)(_time->tm_hour-1) % 60; + break; + case EASettings::STATE_DATE_MINUTE: + _time->tm_min = (int)(_time->tm_min-1) % 60; + break; + case EASettings::STATE_DATE_SECOND: + _time->tm_sec = (int)(_time->tm_sec-1) % 60; + break; + } + + // This converts to a valid value e.g. the value is too large for the month. + time_t seconds = mktime(_time); + printf("Time value is: %d\r\n", seconds); + if (seconds == (time_t)-1) + { + printf("Bad time, not changing time...\r\n"); + *_time = oldTime; + } else { + _time = localtime(&seconds); + } + + if (oldTime.tm_mday != _time->tm_mday) + { + _lcd.drawFilledRect(x, y, 20, 20); + sprintf(buffer, "%02d", _time->tm_mday); + pen.setColor(white); + _lcd.setPen(pen); + _lcd.drawText(x, y, buffer); + pen.setColor(black); + _lcd.setPen(pen); + } + if (oldTime.tm_mon != _time->tm_mon) + { + _lcd.drawFilledRect(x+30, y, 20, 20); + sprintf(buffer, "%02d", _time->tm_mon+1); + pen.setColor(white); + _lcd.setPen(pen); + _lcd.drawText(x+30, y, buffer); + pen.setColor(black); + _lcd.setPen(pen); + } + if (oldTime.tm_year != _time->tm_year) + { + _lcd.drawFilledRect(x+60, y, 40, 20); + sprintf(buffer, "%04d", _time->tm_year+1900); + pen.setColor(white); + _lcd.setPen(pen); + _lcd.drawText(x+60, y, buffer); + pen.setColor(black); + _lcd.setPen(pen); + } + if (oldTime.tm_hour != _time->tm_hour) + { + _lcd.drawFilledRect(x+120, y, 20, 20); + sprintf(buffer, "%02d", _time->tm_hour); + pen.setColor(white); + _lcd.setPen(pen); + _lcd.drawText(x+120, y, buffer); + pen.setColor(black); + _lcd.setPen(pen); + } + if (oldTime.tm_min != _time->tm_min) + { + _lcd.drawFilledRect(x+150, y, 20, 20); + sprintf(buffer, "%02d", _time->tm_min); + pen.setColor(white); + _lcd.setPen(pen); + _lcd.drawText(x+150, y, buffer); + pen.setColor(black); + _lcd.setPen(pen); + } + if (oldTime.tm_sec != _time->tm_sec) + { + _lcd.drawFilledRect(x+180, y, 20, 20); + sprintf(buffer, "%02d", _time->tm_sec); + pen.setColor(white); + _lcd.setPen(pen); + _lcd.drawText(x+180, y, buffer); + pen.setColor(black); + _lcd.setPen(pen); + } + + pen.setColor(white); + _lcd.setPen(pen); + + // Now redraw selection box. + switch (state()) + { + default: + case EASettings::STATE_DATE_DAY: + _lcd.drawRect(x, y, 20, 20); + break; + case EASettings::STATE_DATE_MONTH: + _lcd.drawRect(x+30, y, 20, 20); + break; + case EASettings::STATE_DATE_YEAR: + _lcd.drawRect(x+60, y, 40, 20); + break; + case EASettings::STATE_DATE_HOUR: + _lcd.drawRect(x+120, y, 20, 20); + break; + case EASettings::STATE_DATE_MINUTE: + _lcd.drawRect(x+150, y, 20, 20); + break; + case EASettings::STATE_DATE_SECOND: + _lcd.drawRect(x+180, y, 20, 20); + break; + } return state(); }