Richard Parker / EALCD
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();
 }