CaryCoders / Mbed 2 deprecated SX1276_GPS

Dependencies:   SX1276Lib AdaFruit_RGBLCD MCP23017 mbed

Fork of AdaFruit_RGBLCD by Justin Howard

Files at this revision

API Documentation at this revision

Comitter:
vtraveller
Date:
Thu Aug 14 10:47:27 2014 +0000
Parent:
16:9e1edf28393f
Child:
18:fae7e61ea160
Commit message:
Added mode indication to modules (allows them to change behavior based on mode changes. Means you can have a module change state but not commit the change until you leave that state.

Changed in this revision

MenuManager.cpp Show annotated file Show diff for this revision Revisions of this file
MenuManager.h Show annotated file Show diff for this revision Revisions of this file
Modules/SyncModule.cpp Show annotated file Show diff for this revision Revisions of this file
Modules/SyncModule.h Show annotated file Show diff for this revision Revisions of this file
Modules/TempModule.h Show annotated file Show diff for this revision Revisions of this file
Modules/TimeModule.h Show annotated file Show diff for this revision Revisions of this file
Modules/module.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/MenuManager.cpp	Tue Aug 12 04:28:23 2014 +0000
+++ b/MenuManager.cpp	Thu Aug 14 10:47:27 2014 +0000
@@ -14,7 +14,7 @@
     : m_pModules(in_pModules)
     , m_nModules(in_nModules)
     , m_cLCD(in_cLCD)
-    , m_eMode(eModeMenu)
+    , m_eMode(Module::eModeLast)
     , m_nMenuPos(0)
     , m_nIndex(0)
     , m_nCursorX(0)
@@ -64,7 +64,8 @@
 
 void MenuManager::loop()
 {
-    m_eMode = eModeMenu;
+    setMode(Module::eModeMenu);
+    
     m_nMenuPos = 0;    
     m_nIndex = 0;    
 
@@ -83,7 +84,7 @@
         {
             switch (m_eMode)
             {
-                case eModeMenu:
+                case Module::eModeMenu:
                     showModules(true);
                     
                     int nOffsetX = m_pModules[m_nMenuPos]->getCursorOffset(m_nIndex);
@@ -101,10 +102,11 @@
     // Change mode based on select
     if (in_nKeys & BUTTON_SELECT)
     {
-        m_eMode = (EModes)((m_eMode + 1) % eModeLast);
+        Module::EModes eMode = (Module::EModes)((m_eMode + 1) % Module::eModeLast);        
+        setMode(eMode);
         
         // Start at top corner
-        if (eModeSelect == m_eMode)
+        if (Module::eModeSelect == m_eMode)
         {
             m_nIndex = 0;
             m_nCursorY = 0;
@@ -113,7 +115,7 @@
 
     switch (m_eMode)
     {                
-        case eModeMenu:
+        case Module::eModeMenu:
             setCursor(false,false);
             showTracking(false);
                                 
@@ -123,7 +125,7 @@
             m_nMenuPos = m_nMenuPos % m_nModules;                    
             break;
             
-        case eModeSelect:
+        case Module::eModeSelect:
             setCursor(true,false);
             showTracking(true);
                                                     
@@ -134,7 +136,7 @@
             if (in_nKeys & BUTTON_RIGHT) m_nIndex++;
             break;
             
-        case eModeChange:
+        case Module::eModeChange:
             setCursor(false,true);
             showTracking(true);
             
@@ -158,6 +160,16 @@
     if (in_bBlink) m_cLCD.blink(); else m_cLCD.noBlink();     
 }
 
+void MenuManager::setMode(Module::EModes in_eMode)
+{
+    m_eMode = in_eMode;
+    
+    for (size_t i = 0; i < m_nModules; i++)
+    {    
+        m_pModules[i]->onModeChange(m_eMode);
+    }
+}
+
 void MenuManager::showModules(bool in_bRefresh)
 {
     m_cLCD.setCursor(2,0);
--- a/MenuManager.h	Tue Aug 12 04:28:23 2014 +0000
+++ b/MenuManager.h	Thu Aug 14 10:47:27 2014 +0000
@@ -2,16 +2,7 @@
 #define __MENUMANAGER_H__
 
 class MenuManager
-{
-protected:    
-    enum EModes
-    {
-        eModeMenu = 0,
-        eModeSelect,
-        eModeChange,
-        eModeLast
-    };
-    
+{    
 public:
     MenuManager
     (
@@ -31,6 +22,7 @@
         bool        in_bCursor,
         bool        in_bBlink
     );
+    void setMode(Module::EModes in_eMode);    
     void showModules(bool in_bRefresh = false);
     void showTracking(bool in_bShow);
     void updateDisplay();
@@ -39,7 +31,7 @@
     Module **               m_pModules;
     size_t                  m_nModules;    
     Adafruit_RGBLCDShield & m_cLCD;
-    EModes                  m_eMode;
+    Module::EModes          m_eMode;
     size_t                  m_nMenuPos;
     size_t                  m_nIndex;
     int                     m_nCursorX, m_nCursorY;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Modules/SyncModule.cpp	Thu Aug 14 10:47:27 2014 +0000
@@ -0,0 +1,71 @@
+#include "mbed.h"
+#include "SyncModule.h"
+#include "extra_chars.h"
+
+SyncModule::SyncModule
+(
+    Serial &    in_cDisplay,
+    RTclock &   in_cPrecisionClock,
+    RTclock &   in_cClock
+)
+    : Module(in_cDisplay)
+    , m_cPrecisionClock(in_cPrecisionClock)
+    , m_cClock(in_cClock)
+    , m_eMode(eModeLast)    
+    , m_bSync(false)
+{
+}
+
+SyncModule::~SyncModule()
+{
+}
+
+void SyncModule::change
+(
+    size_t      /* in_nIndex */,
+    bool        /* in_bUp */
+)
+{
+    m_bSync = (m_bSync) ? false : true;
+}
+
+int SyncModule::getCursorOffset(size_t & inout_nIndex)
+{
+    return m_bSync ? 13 : 12;
+}
+
+void SyncModule::onModeChange(EModes in_eMode)
+{
+    EModes eOldMode = m_eMode;
+    m_eMode = in_eMode;
+
+    if (eModeChange != eOldMode) return;    
+    if (eModeMenu != m_eMode) return;
+    
+    if (m_bSync)
+    {
+        // Sync the internal mbed clock (stdlib)
+        m_cPrecisionClock.mapTime();
+        
+        // Sync the precision clock with the inaccurate RTC
+        tm sTM;
+        m_cPrecisionClock.getTime(sTM);
+        m_cClock.setTime(sTM,true);
+        
+        m_bSync = false;    
+    }
+}
+
+void SyncModule::show(bool /*in_bRefresh*/)
+{
+    switch (m_eMode)
+    {
+        case eModeChange:
+        case eModeSelect:
+            m_cDisplay.printf("Sync Time? %s   ",m_bSync ? "yes" : "no");
+            break;
+            
+        default:
+            m_cDisplay.printf("Sync Time %c     ",eRight);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Modules/SyncModule.h	Thu Aug 14 10:47:27 2014 +0000
@@ -0,0 +1,35 @@
+#ifndef __SYNCMODULE_H__
+#define __SYNCMODULE_H__
+
+#include "module.h"
+#include "RTclock.h"
+
+class SyncModule
+    : public Module
+{
+public:
+    SyncModule
+    (
+        Serial &    in_cDisplay,
+        RTclock &   in_cPrecisionClock,
+        RTclock &   in_cClock
+    );
+    virtual ~SyncModule();
+    
+    virtual void    change
+                    (
+                        size_t      in_nIndex,
+                        bool        in_bUp
+                    );
+    virtual int     getCursorOffset(size_t & inout_nIndex);
+    virtual void    onModeChange(EModes in_eMode);
+    virtual void    show(bool in_bRefresh);
+        
+protected:
+    RTclock &       m_cPrecisionClock;
+    RTclock &       m_cClock;
+    EModes          m_eMode;
+    bool            m_bSync;    
+};
+
+#endif /* __SYNCMODULE_H__ */
--- a/Modules/TempModule.h	Tue Aug 12 04:28:23 2014 +0000
+++ b/Modules/TempModule.h	Thu Aug 14 10:47:27 2014 +0000
@@ -17,7 +17,7 @@
                     );
     virtual int     getCursorOffset(size_t & inout_nIndex);
     virtual void    show(bool in_bRefresh);
-    
+
 protected:
     int     m_nTemp;
 };
--- a/Modules/TimeModule.h	Tue Aug 12 04:28:23 2014 +0000
+++ b/Modules/TimeModule.h	Thu Aug 14 10:47:27 2014 +0000
@@ -23,7 +23,7 @@
                     );    
     virtual int     getCursorOffset(size_t & inout_nIndex);
     virtual void    show(bool in_bRefresh);
-    
+        
 protected:
     RTclock &       m_cRTclock;
     tm              m_sLastTM;
--- a/Modules/module.h	Tue Aug 12 04:28:23 2014 +0000
+++ b/Modules/module.h	Thu Aug 14 10:47:27 2014 +0000
@@ -8,6 +8,15 @@
 class Module
 {
 public:
+    enum EModes
+    {
+        eModeMenu = 0,
+        eModeSelect,
+        eModeChange,
+        eModeLast
+    };
+    
+public:
     Module(Serial & in_cDisplay);
     virtual ~Module();
     
@@ -20,6 +29,8 @@
                     { ; }
     virtual int     getCursorOffset(size_t & inout_nIndex)
                     { return -1; }
+    virtual void    onModeChange(EModes in_eMode)
+                    { ; }
     virtual void    show(bool in_bRefresh) = 0;
     
 protected:
--- a/main.cpp	Tue Aug 12 04:28:23 2014 +0000
+++ b/main.cpp	Thu Aug 14 10:47:27 2014 +0000
@@ -7,6 +7,7 @@
 #include "TempModule.h"
 #include "TimeModule.h"
 #include "TitleModule.h"
+#include "SyncModule.h"
 
 #include "MenuManager.h"
 
@@ -16,18 +17,22 @@
 {    
     MCP23017 cMCP23017 = MCP23017(I2C_SDA, I2C_SCL, 0x40, true);
     Adafruit_RGBLCDShield cLCD(cMCP23017);
-    RTclock cRTclock(I2C_SDA, I2C_SCL);
+    
+    RTclock cPrecisionClock(I2C_SDA, I2C_SCL);
+    RTclock cClock(D3, D6);
 
     // Spin up RTC
-    cRTclock.mapTime();
-    
+    cPrecisionClock.mapTime();
+        
     // Set up display modules    
     Module * aModules[] =
     {
         new TitleModule(cLCD),
-        new TimeModule(cLCD,cRTclock),
-        new DateModule(cLCD,cRTclock),
+        new TimeModule(cLCD,cPrecisionClock),
+        new TimeModule(cLCD,cClock),
+        new DateModule(cLCD,cPrecisionClock),
         new TempModule(cLCD),
+        new SyncModule(cLCD,cPrecisionClock,cClock),
     };
 
     // Set up the menu manager