Display hour on screen, Started implementing write time
authorandre Ebersold <andre.ebersold@free.fr>
Thu, 2 Nov 2023 21:09:16 +0000 (22:09 +0100)
committerandre Ebersold <andre.ebersold@free.fr>
Thu, 2 Nov 2023 21:09:16 +0000 (22:09 +0100)
Application/WorkhourMeter/WorkMeterHandler.cpp
Application/WorkhourMeter/WorkMeterHandler.h
Application/WorkhourMeter/main.cpp
HAL/Abstract/ILCD.h [new file with mode: 0644]
HAL/Abstract/IRtc.h
HAL/Drivers/DS3231.cpp
HAL/Drivers/DS3231.h
HAL/Drivers/LiquidCrystal.cpp
HAL/Drivers/LiquidCrystal.h
Metadata/WorkMeterParamIds.h

index 03dd2593ce9ba93b980233e215ee297ac8ee9363..85219613aacdd090b72b946d58e7b8cecbb9ade4 100644 (file)
@@ -1,38 +1,89 @@
 #include "Utils/StdTypes.h"
 #include "Application/ITask.h"
 #include "Abstract/IRtc.h"
+#include "Abstract/ILCD.h"
 #include "Platform/IParameterHandler.h"
 
-#include "Metadata/PowerswitchParamIds.h"
+#include "Metadata/WorkmeterParamIds.h"
 #include "WorkMeterHandler.h"
 
 
-WorkMeterHandler::WorkMeterHandler(IRtc *argRtc,IParameterHandler *argPH)
-  : m_Rtc(argRtc), m_Params(argPH),m_Ticks(0)
+WorkMeterHandler::WorkMeterHandler(IRtc *argRtc,ILCD *argLCD,IParameterHandler *argPH)
+  : m_Rtc(argRtc), m_LCD(argLCD),m_Params(argPH),m_Ticks(0)
 {
     Uint8_t i = 0;     
-    m_Params->writeValue(PID_Switch1,i);
-    m_Params->writeValue(PID_Switch2,i);
-    m_Params->writeValue(PID_Switch3,i);
+    m_Params->writeValue(PID_Seconde,i);
+    m_Params->writeValue(PID_Minute,i);
+    m_Params->writeValue(PID_Hour,i);
     m_Time.seconds = 10;
+    m_Params->registerListener(PID_BackLight,this); /* State on or off */
+#if 1
+    m_Params->registerListener(PID_Hour,this); /* State on or off */
+    m_Params->registerListener(PID_Minute,this); /* State on or off */
+#endif
 }
 
 void WorkMeterHandler::onWriteValue(const Uint8_t paramID,const Uint8_t _val) 
 {
+    switch (paramID)
+    {
+        case PID_Seconde:
+           m_Time.seconds = _val;
+        break;
+        case PID_Minute:
+           m_Time.min = _val;
+            //m_Rtc->setTime(m_Time);
+        break;
+        case PID_Hour:
+           m_Time.hour = _val;
+            //m_Rtc->setTime(m_Time);
+        break;
+        case PID_BackLight:
+            m_LCD->setDisplay(_val);
+        break;
+       default:
+       ;
+    }
 }
 
 void WorkMeterHandler::onWriteValue(const Uint8_t paramID,const Float32_t _val) 
 {
 }
 
+void WorkMeterHandler::timeToString()
+{
+    m_StrTime[0] = (m_Time.hour / 10) + 0x30;
+    m_StrTime[1] = ((m_Time.hour)  -( (m_Time.hour / 10) *10 )) + 0x30;
+    m_StrTime[2] = ':'; 
+    m_StrTime[3] = (m_Time.min / 10 ) + 0x30;
+    m_StrTime[4] = (m_Time.min - (( m_Time.min / 10) * 10 ))  +0x30;
+    m_StrTime[5] = ':'; 
+    m_StrTime[6] = (m_Time.seconds / 10) + 0x30;
+    m_StrTime[7] = ((m_Time.seconds)  -( (m_Time.seconds / 10) *10 )) + 0x30;
+    m_StrTime[8] = 0;
+}
+
 void WorkMeterHandler::run()
 {
-    if (m_Ticks++ > 50)
+    if (m_Ticks++ > 100)
     {
         m_Rtc->getTime(m_Time);
-        m_Params->writeValue(PID_Switch1,m_Time.seconds);
-        m_Params->writeValue(PID_Switch2,m_Time.min);
-        m_Params->writeValue(PID_Switch3,m_Time.hour);
+        m_Params->writeValue(PID_Seconde,m_Time.seconds);
+        m_Params->writeValue(PID_Minute,m_Time.min);
+        m_Params->writeValue(PID_Hour,m_Time.hour);
         m_Ticks = 0;
     }
+    switch (m_Ticks)
+    {
+        case 8:
+            timeToString();
+           break;
+        case 10:
+            m_LCD->setCursor(4,6);
+            //m_LCD->setCursor(6,0);
+           break;
+        case 25:
+            m_LCD->print(m_StrTime);
+           break;
+    };
 }
index f5311202b4aa5279c2bf6c11d62670b58e757f3f..65d88a1ad4385a2fc643c08b1456d75f973c49b9 100644 (file)
@@ -4,7 +4,7 @@
 class WorkMeterHandler : public ITask, public  IParameterListener
 {
     public:
-        WorkMeterHandler(IRtc *argRTC,IParameterHandler *argPH);
+        WorkMeterHandler(IRtc *argRTC,ILCD *argLCD,IParameterHandler *argPH);
 
         void run();
 
@@ -12,7 +12,11 @@ class WorkMeterHandler : public ITask, public  IParameterListener
         
         void onWriteValue(const Uint8_t paramID,const Float32_t _val) ;
     private:
+       void timeToString();
+    private:
+       Uint8_t m_StrTime[9];
         IRtc *m_Rtc;
+        ILCD *m_LCD;
         IParameterHandler *m_Params;
         RtcTime_t          m_Time;
         Uint32_t           m_Ticks;
index f2098842d36697f7b831d686e723b09509ec8e1b..6e2316e56d596bca8edb6bed005b7db1ffd7f48d 100644 (file)
@@ -13,6 +13,7 @@
 #include <Abstract/IUart.h>
 #include <Abstract/II2C.h>
 #include <Abstract/IRtc.h>
+#include <Abstract/ILCD.h>
 #include <Abstract/ISwitch.h>
 #include <Abstract/IEeprom.h>
 #include <Application/ITask.h>
@@ -51,10 +52,10 @@ class Scheduler : public IInterruptActivity
   private:
       enum TIME_SLOTS {
               FIRST_TIME_SLOT        =  0,
-              BLOCK2_FIRST_TIME_SLOT =  10,
-              BLOCK3_FIRST_TIME_SLOT =  30,
-              LAST_TIME_SLOT         =  60,
-              TIME_SLOT_COUNT        = 99 
+              BLOCK2_FIRST_TIME_SLOT =  30,
+              BLOCK3_FIRST_TIME_SLOT =  60,
+              LAST_TIME_SLOT         =  99,
+              TIME_SLOT_COUNT        = 99  // :( not used 
       };
       enum ETASK_ID {
               TASK1      = 0,
@@ -173,14 +174,13 @@ int main(void)
    DS3231               gRtc(&gI2c);
    LiquidCrystal        lcd(&gI2c
                           ,static_cast<Uint8_t>(0x4E)
-                          //,static_cast<Uint8_t>(0x40)
                           ,static_cast<Uint8_t>(16)
                           ,static_cast<Uint8_t>(2));
    AvrEeprom            gEeprom;
    NetString            netstring(&uart);
    CommunicationHandler gCom(&netstring,&gParam);
    PersistentStorage    gStorage(&gEeprom,&gParam);
-   WorkMeterHandler     gWorkMeter(&gRtc,&gParam);
+   WorkMeterHandler     gWorkMeter(&gRtc,&lcd,&gParam);
    Scheduler            sched(&led,&netstring,&gCom,&gWorkMeter,&gStorage);
 
    uart.init();
diff --git a/HAL/Abstract/ILCD.h b/HAL/Abstract/ILCD.h
new file mode 100644 (file)
index 0000000..b5c5838
--- /dev/null
@@ -0,0 +1,21 @@
+#ifndef __ILCD_H__
+#define __ILCD_H__
+
+/**
+ * Common Interface to communicate with LCD
+ *  either SPI or I2C or what ever
+ */
+class ILCD
+{
+    public:
+    ILCD()  {} ;
+
+    virtual void print(const Uint8_t *argStr) = 0;
+
+    virtual void setBacklight(Bool_t argOn) = 0;
+    /* Display On or Off */
+    virtual void setDisplay(Bool_t argOn) = 0;
+    
+    virtual void setCursor(Uint8_t col,Uint8_t row) = 0;
+};
+#endif
index 7d46330f1c27726ee5ee97ba38042d4c22da6571..ec1abd167a741ae7c5937ff8b4e76c953ea62044 100644 (file)
@@ -10,6 +10,12 @@ typedef struct {
     Uint8_t year;
 } RtcTime_t;
 
+typedef struct {
+    Uint8_t weekDay;
+    Uint8_t day;
+    Uint8_t month;
+    Uint16_t year;
+} RtcDate_t;
 /**
  * \brief Abstract interface of services an Rtc must Provide
  *
@@ -21,6 +27,10 @@ class IRtc
     
     virtual void getTime(RtcTime_t &argTime) = 0;
 
+    virtual void setDate(const RtcDate_t &argDate) = 0;
+    
+    virtual void getDate(RtcDate_t &argDate) = 0;
+
     virtual void toString(Uint8_t *argOutTime) = 0;
 };
 
index fb617a1e911e712af19d9a3a43cbcf96edce7b15..fe78ec4ea12b243274c7235a4224721aabba72e8 100644 (file)
@@ -27,7 +27,13 @@ void DS3231::getTime(RtcTime_t &argTime)
     {
         argTime.seconds = (cmd[1] & 0x0F) + ( ( (cmd[1]>>4) & 0x07) * 10);
         argTime.min     = (cmd[2] & 0x0F) + ( ( (cmd[2]>>4) & 0x07) * 10);
-        argTime.hour    = (cmd[3] & 0x0F) + ( ( (cmd[3]>>4) & 0x03) * 10);
+       if ( cmd[3] & 0x40)
+       {
+            argTime.hour    = (cmd[3] & 0x0F) + ( ( (cmd[3]>>4) & 0x01) * 10);
+       } else 
+       {
+            argTime.hour    = (cmd[3] & 0x0F) + ( ( (cmd[3]>>4) & 0x03) * 10);
+       }
     }
 #else
     itsII2C->write(DS3231_ADDRESS,cmd,1);
@@ -36,6 +42,30 @@ void DS3231::getTime(RtcTime_t &argTime)
 }
 
 void DS3231::setTime(const RtcTime_t &argTime)
+{
+    Uint8_t cmd[5] ; 
+    cmd[0] = 0x00;
+    cmd[1] = (argTime.seconds / 10)<<4;
+    cmd[1] |= (argTime.seconds - (argTime.seconds/10));
+    // Set Minutes
+    cmd[2] = (argTime.min / 10)<<4;
+    cmd[2] |= (argTime.min - (argTime.min/10) );
+    // Hours
+    cmd[3] = (argTime.hour / 10)<<4;
+    cmd[3] |= ( argTime.hour - (argTime.hour/10) ) | 0x40;
+    
+    itsII2C->write(DS3231_ADDRESS,cmd,4);
+}
+    
+void DS3231::setDate(const RtcDate_t &argDate)
+{
+    Uint8_t cmd[5] ; 
+    // Day of the week
+    cmd[0] = 0;
+    itsII2C->write(DS3231_ADDRESS,cmd,1);
+}
+    
+void DS3231::getDate(RtcDate_t &argDate)
 {
 }
 
index beeee42137fccaf7f310a16c3ca0a25ad702e83a..4021ba19f944f6d82bcd1717c831bb3bf79770ee 100644 (file)
@@ -10,9 +10,13 @@ class DS3231 : public IRtc
         DS3231(II2C *);
 
         void getTime(RtcTime_t &argTime);
-        
+
         void setTime(const RtcTime_t &argTime);
-    
+
+        void setDate(const RtcDate_t &argDate) ;
+
+        void getDate(RtcDate_t &argDate) ;
+
         void toString(Uint8_t *argOutTime);
     private:
         II2C *itsII2C;
index 20b9c36d59b221e054062837c41c3935cc1ca162..4219b45b59e8f3ba91a2563f525e409c74d9db23 100644 (file)
@@ -2,13 +2,14 @@
 #include "Utils/StdTypes.h"
 
 #include "Abstract/II2C.h"
+#include "Abstract/ILCD.h"
 #include "Drivers/LiquidCrystal.h"
 
 
 LiquidCrystal::LiquidCrystal(II2C *argII2C,Uint8_t lcd_Addr, Uint8_t argCols,Uint8_t argRows)
 : itsII2C(argII2C),m_LCDaddr(lcd_Addr)
        , m_Cols(argCols),m_Rows(argRows)
-       , m_BackLight(LCD_NOBACKLIGHT)
+       , m_BackLight(LCD_BACKLIGHT)
        , m_DispFunction(LCD_2LINE)
        , m_DispMode(LCD_ENTRYLEFT | LCD_ENTRYSHIFTDECREMENT)
        , m_DispCtrl(LCD_DISPLAYON | LCD_CURSOROFF | LCD_BLINKOFF)
@@ -49,6 +50,8 @@ void LiquidCrystal::init()
     command(LCD_DISPLAYCONTROL | m_DispCtrl);
 
     clear();
+    
+    command(LCD_ENTRYMODESET | m_DispMode);
 
     home();
 }
@@ -69,11 +72,37 @@ void LiquidCrystal::setCursor(Uint8_t col,Uint8_t row)
     Uint8_t row_offsets[] = {0x00,0x40,0x14,0x54};
     if ( row > m_Rows)
     {
-         row = m_Rows -1;
+         row = m_Rows - 1;
     }
     command(LCD_SETDDRAMADDR |( col + row_offsets[row]));
 }
 
+void LiquidCrystal::setBacklight(Bool_t _on)
+{
+    if ( _on ) 
+    {
+        m_BackLight = LCD_BACKLIGHT;
+    }
+    else
+    {
+        m_BackLight = LCD_NOBACKLIGHT;
+    }
+    expanderWrite(0);
+}
+
+void LiquidCrystal::setDisplay(Bool_t _on)
+{
+    if ( _on ) 
+    {
+        m_DispCtrl &= ~LCD_DISPLAYON ;
+    }
+    else
+    {
+        m_DispCtrl |= LCD_DISPLAYON ;
+    }
+    command(LCD_DISPLAYCONTROL | m_DispCtrl);
+
+}
 
 /* Lowest level */
 void LiquidCrystal::send(Uint8_t argValue, Uint8_t argMode)
index 2ffae21dd19192e7ad6950d79e3d55e67cab6d80..920adfc0b98af4d074ace89b13e7380d3b296747 100644 (file)
@@ -51,7 +51,7 @@
 /**\r
  *\r
  */\r
-class LiquidCrystal\r
+class LiquidCrystal : public ILCD\r
 {\r
     public:\r
        LiquidCrystal(II2C *argII2C,Uint8_t lcd_Addr, Uint8_t argCols,Uint8_t argRows);\r
@@ -66,6 +66,10 @@ class LiquidCrystal
 \r
        void setCursor(Uint8_t col,Uint8_t row);\r
 \r
+       void setBacklight(Bool_t _on);\r
+    \r
+       void setDisplay(Bool_t argOn) ;\r
+\r
        inline void write(Uint8_t _char) { send(_char,Rs); };\r
     private:\r
        inline void command(Uint8_t argValue) { send (argValue,0) ; } ;\r
index 78a641f601470d74d2270b6cf714e51f30ddb57d..42c9594bd210f68e1f6639930db9e8026dbff46c 100644 (file)
@@ -8,13 +8,13 @@
  */
 enum ParameterIds {
       PID_SwitchAll  =  0 /* State on or off */
-    , PID_Switch1    =  1 /* On / Off Socket 1 */
-    , PID_Switch2    =  2 /* On / Off Socket 2 */
-    , PID_Switch3    =  3 /* On / Off Socket 3 */
-    , PID_Switch4    =  4 /* On / Off Socket 4 */
+    , PID_Seconde    =  1 /* On / Off Socket 1 */
+    , PID_Minute     =  2 /* On / Off Socket 2 */
+    , PID_Hour       =  3 /* On / Off Socket 3 */
+    , PID_BackLight  =  4 /* On / Off Socket 4 */
     , PID_LedCycle   =  5 /* Ye Blinking led cycle. 0 is off */
     , PID_LedState   =  6 /* Set let state ... */
-    , PID_DelayP1    =  7
+    , PID_Display    =  7 /* Set On/Off Display */
     , PID_DelayP2    =  8
     , PID_DelayP3    =  9 /* Cycle Per rotation used in closed loop  */
     , PID_DelayP4    = 10 /* Set PID constant factor   */