From abfd935f41072cad937b8b1a1d5c30c6d52ea893 Mon Sep 17 00:00:00 2001 From: andre Ebersold Date: Sat, 25 Nov 2023 10:11:19 +0100 Subject: [PATCH] Implemented setDate and getDate on DS3231 and Workmeter --- Application/WorkhourMeter/CMakeLists.txt | 5 +++ Application/WorkhourMeter/Led0.cpp | 2 +- .../WorkhourMeter/WorkMeterHandler.cpp | 44 ++++++++++++++++++- Application/WorkhourMeter/WorkMeterHandler.h | 10 ++++- HAL/Abstract/IRtc.h | 2 +- HAL/Drivers/DS3231.cpp | 22 +++++++++- Metadata/WorkMeterParamIds.h | 31 +++++++------ Metadata/WorkMeterParameterTable.cpp | 3 ++ Platform/IParameterHandler.h | 1 + Platform/ParameterHandler.cpp | 4 +- 10 files changed, 102 insertions(+), 22 deletions(-) diff --git a/Application/WorkhourMeter/CMakeLists.txt b/Application/WorkhourMeter/CMakeLists.txt index 4f90315..87e02bd 100644 --- a/Application/WorkhourMeter/CMakeLists.txt +++ b/Application/WorkhourMeter/CMakeLists.txt @@ -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} diff --git a/Application/WorkhourMeter/Led0.cpp b/Application/WorkhourMeter/Led0.cpp index 48c9153..a5870ca 100644 --- a/Application/WorkhourMeter/Led0.cpp +++ b/Application/WorkhourMeter/Led0.cpp @@ -8,7 +8,7 @@ //#include #include #include -#include +#include #include "Led0.h" /** diff --git a/Application/WorkhourMeter/WorkMeterHandler.cpp b/Application/WorkhourMeter/WorkMeterHandler.cpp index c9b5fb5..e9f0e51 100644 --- a/Application/WorkhourMeter/WorkMeterHandler.cpp +++ b/Application/WorkhourMeter/WorkMeterHandler.cpp @@ -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; diff --git a/Application/WorkhourMeter/WorkMeterHandler.h b/Application/WorkhourMeter/WorkMeterHandler.h index d326b79..265c551 100644 --- a/Application/WorkhourMeter/WorkMeterHandler.h +++ b/Application/WorkhourMeter/WorkMeterHandler.h @@ -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; diff --git a/HAL/Abstract/IRtc.h b/HAL/Abstract/IRtc.h index ec1abd1..ef1bd79 100644 --- a/HAL/Abstract/IRtc.h +++ b/HAL/Abstract/IRtc.h @@ -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 diff --git a/HAL/Drivers/DS3231.cpp b/HAL/Drivers/DS3231.cpp index 9306894..857f5d3 100644 --- a/HAL/Drivers/DS3231.cpp +++ b/HAL/Drivers/DS3231.cpp @@ -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((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) diff --git a/Metadata/WorkMeterParamIds.h b/Metadata/WorkMeterParamIds.h index 4e95097..d4c717a 100644 --- a/Metadata/WorkMeterParamIds.h +++ b/Metadata/WorkMeterParamIds.h @@ -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 diff --git a/Metadata/WorkMeterParameterTable.cpp b/Metadata/WorkMeterParameterTable.cpp index 14bb05f..f2fbed2 100644 --- a/Metadata/WorkMeterParameterTable.cpp +++ b/Metadata/WorkMeterParameterTable.cpp @@ -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)} diff --git a/Platform/IParameterHandler.h b/Platform/IParameterHandler.h index 7fe580f..19cc5f3 100644 --- a/Platform/IParameterHandler.h +++ b/Platform/IParameterHandler.h @@ -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; }; diff --git a/Platform/ParameterHandler.cpp b/Platform/ParameterHandler.cpp index 5715633..1a6739e 100644 --- a/Platform/ParameterHandler.cpp +++ b/Platform/ParameterHandler.cpp @@ -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); } } } -- 2.30.2