Implemented setDate and getDate on DS3231 and Workmeter
authorandre Ebersold <andre.ebersold@free.fr>
Sat, 25 Nov 2023 09:11:19 +0000 (10:11 +0100)
committerandre Ebersold <andre.ebersold@free.fr>
Sat, 25 Nov 2023 09:11:19 +0000 (10:11 +0100)
Application/WorkhourMeter/CMakeLists.txt
Application/WorkhourMeter/Led0.cpp
Application/WorkhourMeter/WorkMeterHandler.cpp
Application/WorkhourMeter/WorkMeterHandler.h
HAL/Abstract/IRtc.h
HAL/Drivers/DS3231.cpp
Metadata/WorkMeterParamIds.h
Metadata/WorkMeterParameterTable.cpp
Platform/IParameterHandler.h
Platform/ParameterHandler.cpp

index 4f90315f27cc254c97eeb78a65b59ff8e3e86ca6..87e02bd3d081ade0c3aec7a22727b00fad82e5b8 100644 (file)
@@ -9,6 +9,11 @@ add_avr_executable(
    Scheduler.cpp
    )
 
+set_target_properties(
+       workmeter-${AVR_MCU}.elf PROPERTIES
+    COMPILE_DEFINITIONS WORKMETER_PARAMETERS
+    )
+
 target_link_libraries(
   workmeter-${AVR_MCU}.elf
   avrHAL-${AVR_MCU}
index 48c915328835c37188bdae1ec5efa2e6e14dec55..a5870caad2090fc36af056cc59ba5f6bd630de8a 100644 (file)
@@ -8,7 +8,7 @@
 //#include <avr/io.h>
 #include <Utils/StdTypes.h>
 #include <Platform/IParameterHandler.h>
-#include <Metadata/PowerswitchParamIds.h>
+#include <Metadata/WorkMeterParamIds.h>
 #include "Led0.h"
 
 /**
index c9b5fb5485b4a59a1b484e0b3a67f285a787c3de..e9f0e51a11d7a237769db53b54a4c185de165a7c 100644 (file)
@@ -11,7 +11,7 @@
 
 
 WorkMeterHandler::WorkMeterHandler(IRtc *argRtc,ILCD *argLCD,IParameterHandler *argPH,PN532 *argPN532)
-  : m_Rtc(argRtc), m_LCD(argLCD),m_NFC(argPN532),m_Params(argPH),m_Ticks(0),m_State(ST_IDLE)
+  : m_Rtc(argRtc), m_LCD(argLCD),m_NFC(argPN532),m_Params(argPH),m_Ticks(0),m_State(ST_INIT)
 {
     Uint8_t i = 0;     
     m_Params->writeValue(PID_Seconde,i);
@@ -24,8 +24,21 @@ WorkMeterHandler::WorkMeterHandler(IRtc *argRtc,ILCD *argLCD,IParameterHandler *
     m_Params->registerListener(PID_Hour,this); /* State on or off */
     m_Params->registerListener(PID_Minute,this); /* State on or off */
 
+    m_Params->registerListener(PID_Anne,this); /* Write Date to RTC */
+    m_Params->registerListener(PID_Mois,this); /* Write Date to RTC */
+    m_Params->registerListener(PID_Jour,this); /* Write Date to RTC */
 }
 
+void WorkMeterHandler::onWriteValue(const Uint8_t paramID,const Uint16_t _val) 
+{
+    switch (paramID)
+    {
+        case PID_Anne:
+            m_Date.year = _val;
+            m_State = ST_SET_DATE;
+        break;
+    }
+}
 void WorkMeterHandler::onWriteValue(const Uint8_t paramID,const Uint8_t _val) 
 {
     switch (paramID)
@@ -41,6 +54,14 @@ void WorkMeterHandler::onWriteValue(const Uint8_t paramID,const Uint8_t _val)
             m_Time.hour = _val;
             m_State = ST_SET_TIME;
         break;
+        case PID_Jour:
+            m_Date.day = _val;
+            m_State = ST_SET_DATE;
+        break;
+        case PID_Mois:
+            m_Date.month = _val;
+            m_State = ST_SET_DATE;
+        break;
         case PID_BackLight:
             m_LCD->setDisplay(_val);
         break;
@@ -63,10 +84,14 @@ void WorkMeterHandler::timeToString()
     m_StrTime[2] = ':'; 
     m_StrTime[3] = (m_Time.min / 10 ) + 0x30;
     m_StrTime[4] = (m_Time.min - (( m_Time.min / 10) * 10 ))  +0x30;
+#if 0
     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;
+#else
+    m_StrTime[5] = 0;
+#endif
 }
        
 void WorkMeterHandler::getTime()
@@ -81,6 +106,14 @@ void WorkMeterHandler::setTime()
 {
 }
 
+void WorkMeterHandler::getDate()
+{
+    m_Rtc->getDate(m_Date);
+    m_Params->writeValue(PID_Jour,m_Date.day);
+    m_Params->writeValue(PID_Mois,m_Date.month);
+    m_Params->writeValue(PID_Anne,m_Date.year);
+}
+
 /**
  * Cycle of scheduler is 10ms. So the cycle below is 1s
  *
@@ -94,6 +127,9 @@ void WorkMeterHandler::run()
     }
     switch (m_State)
     {
+       case ST_INIT:
+        m_State = ST_GET_DATE;
+       break;
         case ST_IDLE:
         m_State = ST_GET_TIME;
        break;
@@ -105,6 +141,12 @@ void WorkMeterHandler::run()
            getTime();
            m_State = ST_DISP_UPDATE_CURSOR;
         break;
+        case ST_SET_DATE:
+            m_Rtc->setDate(m_Date);
+            m_State = ST_WAIT;
+        case ST_GET_DATE:
+           getDate();
+           m_State = ST_GET_TIME;
         case ST_DISP_UPDATE_CURSOR_TAG:
             m_LCD->setCursor(11,0);
             m_State = ST_DISP_UPDATE_TAG;
index d326b7955e1969097c60a6165aa0525f1b843c97..265c551109550f41aa1f1b2a510825e087f2a021 100644 (file)
@@ -4,9 +4,12 @@
 class WorkMeterHandler : public ITask, public  IParameterListener
 {
     enum eStates {
-      ST_IDLE
+      ST_INIT
+      ,ST_IDLE
       ,ST_GET_TIME
       ,ST_SET_TIME
+      ,ST_GET_DATE
+      ,ST_SET_DATE
       ,ST_WAIT_BADGE
       ,ST_WAIT
       ,ST_DISP_UPDATE_TIME
@@ -22,12 +25,16 @@ class WorkMeterHandler : public ITask, public  IParameterListener
 
         void onWriteValue(const Uint8_t paramID,const Uint8_t _val) ;
         
+       void onWriteValue(const Uint8_t paramID,const Uint16_t _val) ;
+        
         void onWriteValue(const Uint8_t paramID,const Float32_t _val) ;
     private:
         void timeToString();
         /**/
         void getTime();
         /**/
+        void getDate();
+        /**/
         void setTime();
     
         Bool_t tagPresenceChanged();
@@ -40,6 +47,7 @@ class WorkMeterHandler : public ITask, public  IParameterListener
         PN532 *m_NFC;
         IParameterHandler *m_Params;
         RtcTime_t          m_Time;
+        RtcDate_t          m_Date;
         Uint32_t           m_Ticks;
         Uint8_t            m_State;
         Bool_t             m_TagChange;
index ec1abd167a741ae7c5937ff8b4e76c953ea62044..ef1bd79aa88e7628af07a40ce5bf9ec07d254134 100644 (file)
@@ -11,10 +11,10 @@ typedef struct {
 } RtcTime_t;
 
 typedef struct {
+    Uint16_t year;
     Uint8_t weekDay;
     Uint8_t day;
     Uint8_t month;
-    Uint16_t year;
 } RtcDate_t;
 /**
  * \brief Abstract interface of services an Rtc must Provide
index 93068943ad89b5badc5d7c66274bfb8df27d884b..857f5d3640b698159f27de03ea9a467427188039 100644 (file)
@@ -83,12 +83,30 @@ void DS3231::setDate(const RtcDate_t &argDate)
 {
     Uint8_t cmd[5] ; 
     // Day of the week
-    cmd[0] = 0;
-    itsII2C->write(DS3231_ADDRESS,cmd,1);
+    cmd[0]  = 0x04;
+    cmd[1]  = (argDate.day / 10) << 4;
+    cmd[1] |= argDate.day - ((argDate.day / 10) *10);
+    cmd[2]  = 0x00; // Set Century to true
+    cmd[2] |= (argDate.month / 10) << 4;
+    cmd[2] |= argDate.month - ((argDate.month / 10) * 10);
+    Uint8_t shiftYear = static_cast<Uint8_t>((argDate.year - 2000));
+    cmd[3] = (shiftYear / 10) <<4;
+    cmd[3] |= (shiftYear - ( (shiftYear / 10) * 10 ));
+    itsII2C->write(DS3231_ADDRESS,cmd,4);
 }
     
 void DS3231::getDate(RtcDate_t &argDate)
 {
+    Uint8_t cmd[5] ; 
+    // Day of the week
+    cmd[0] = 0x04;
+    itsII2C->write(DS3231_ADDRESS,cmd,1);
+    itsII2C->read(DS3231_ADDRESS,cmd,3);
+    argDate.day    = cmd[0] & 0x0F;
+    argDate.day   += ((cmd[0] & 0xF0)>>4) * 10;
+    argDate.month = ((cmd[1] &0x70)>>4 ) * 10 + (cmd[1] &0x0F) ;
+    argDate.year  = ( (cmd[1] & 0x80)>>7 ) * 100 + 2000 ;
+    argDate.year += ( ((cmd[2] & 0xF0)>>4 ) * 10 ) + (cmd[2] & 0x0F);
 }
 
 void DS3231::toString(Uint8_t *argOutTime)
index 4e9509761b25da250fc8b07598373a1153b57273..d4c717a6bd9d16d85ce23f84a8527432a03f7c28 100644 (file)
@@ -11,19 +11,22 @@ enum ParameterIds {
     , 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_Display    =  7 /* Set On/Off Display */
-    , PID_RFFirmwareVersion  =  8
-    , PID_FirmwareVersion    =  9 /* Cycle Per rotation used in closed loop  */
-    , PID_BadgePresent       = 10 /* Set PID constant factor   */
-    , PID_BadgeCount         = 11 /* Set PID integral factor   */
-    , PID_BadgeLength        = 12 /* Badge ID length             */
-    , PID_BadgeLow           = 13 /* Write 4 bytes low badge ID  */
-    , PID_BadgeHigh          = 14 /* When 7 bytes Length add the 3 high bytes here */
-    , PID_LowLevelError1  = 15 /* Low Level Error1  up to 32 errors */
-    , PID_LowLevelError2  = 16 /* Low Level Error2  up to 32 errors */
-    , PID_MAX        = 17
+    , PID_Jour       =  4 /* On / Off Socket 3 */
+    , PID_Mois       =  5 /* On / Off Socket 3 */
+    , PID_Anne       =  6 /* On / Off Socket 3 */
+    , PID_BackLight  =  7 /* On / Off Socket 4 */
+    , PID_LedCycle   =  8 /* Ye Blinking led cycle. 0 is off */
+    , PID_LedState   =  9 /* Set let state ... */
+    , PID_Display    =  10 /* Set On/Off Display */
+    , PID_RFFirmwareVersion  = 11
+    , PID_FirmwareVersion    = 12 /* Cycle Per rotation used in closed loop  */
+    , PID_BadgePresent       = 13 /* Set PID constant factor   */
+    , PID_BadgeCount         = 14 /* Set PID integral factor   */
+    , PID_BadgeLength        = 14 /* Badge ID length             */
+    , PID_BadgeLow           = 16 /* Write 4 bytes low badge ID  */
+    , PID_BadgeHigh          = 17 /* When 7 bytes Length add the 3 high bytes here */
+    , PID_LowLevelError1  = 18 /* Low Level Error1  up to 32 errors */
+    , PID_LowLevelError2  = 19 /* Low Level Error2  up to 32 errors */
+    , PID_MAX        = 20
 };
 #endif
index 14bb05fc77819973c6c5460032a9da719dd27401..f2fbed2969a5393730b9fd693e1a5f8fa402c696 100644 (file)
@@ -18,6 +18,9 @@ ParameterValue m_Values[PID_MAX] =
   ,{0,NULL , (TYPE_U8<<4) | (NONE<<2) | (RW)}
   ,{0,NULL , (TYPE_U8<<4) | (NONE<<2) | (RW)}
   ,{0,NULL , (TYPE_U8<<4) | (NONE<<2) | (RW)}
+  ,{0,NULL , (TYPE_I32<<4) | (NONE<<2) | (RW)}
+  ,{0,NULL , (TYPE_U8<<4) | (NONE<<2) | (RW)}
+  ,{0,NULL , (TYPE_U8<<4) | (NONE<<2) | (RW)}
   ,{0,NULL , (TYPE_U8<<4) | (NONE<<2) | (RW)}
   ,{0,NULL , (TYPE_U8<<4) | (NONE<<2) | (RW)}
   ,{0,NULL , (TYPE_U8<<4) | (NONE<<2) | (RW)}
index 7fe580ffdcadfc963a3c3fe91989d523ea6c5583..19cc5f325c25847da97a3b6a9db49abd0dcc37a0 100644 (file)
@@ -15,6 +15,7 @@ class IParameterListener
         IParameterListener() {};
         
        virtual void onWriteValue(const uint8_t paramID,const uint8_t   _val) = 0;
+       virtual void onWriteValue(const uint8_t paramID,const uint16_t  _val) = 0;
 
         virtual void onWriteValue(const uint8_t paramID,const Float32_t _val) = 0;
 };
index 571563340f224d95a77e608b300f28b587d73f67..1a6739e9231804afa885c6b1555586b21f6b62af 100644 (file)
@@ -63,7 +63,7 @@ ParameterHandler::writeValue(const uint8_t paramID,const uint16_t _val)
         m_Values[paramID].u.m_U16 = _val;
         if (m_Values[paramID].m_Listener != 0 )
         {
-            m_Values[paramID].m_Listener->onWriteValue(paramID,m_Values[paramID].u.m_U8);
+            m_Values[paramID].m_Listener->onWriteValue(paramID,m_Values[paramID].u.m_U16);
         }
     } 
 }
@@ -87,7 +87,7 @@ ParameterHandler::writeValue(const uint8_t paramID,const uint32_t _val)
         m_Values[paramID].u.m_U32 = _val;
         if (m_Values[paramID].m_Listener != 0 )
         {
-            m_Values[paramID].m_Listener->onWriteValue(paramID,m_Values[paramID].u.m_U8);
+            m_Values[paramID].m_Listener->onWriteValue(paramID,m_Values[paramID].u.m_U16);
         }
     } 
 }