From b9e02bf77865c0f4e7e1dc4a8b880e8a323b27a1 Mon Sep 17 00:00:00 2001 From: andre Ebersold Date: Thu, 2 Nov 2023 22:09:16 +0100 Subject: [PATCH] Display hour on screen, Started implementing write time --- .../WorkhourMeter/WorkMeterHandler.cpp | 71 ++++++++++++++++--- Application/WorkhourMeter/WorkMeterHandler.h | 6 +- Application/WorkhourMeter/main.cpp | 12 ++-- HAL/Abstract/ILCD.h | 21 ++++++ HAL/Abstract/IRtc.h | 10 +++ HAL/Drivers/DS3231.cpp | 32 ++++++++- HAL/Drivers/DS3231.h | 8 ++- HAL/Drivers/LiquidCrystal.cpp | 33 ++++++++- HAL/Drivers/LiquidCrystal.h | 6 +- Metadata/WorkMeterParamIds.h | 10 +-- 10 files changed, 181 insertions(+), 28 deletions(-) create mode 100644 HAL/Abstract/ILCD.h diff --git a/Application/WorkhourMeter/WorkMeterHandler.cpp b/Application/WorkhourMeter/WorkMeterHandler.cpp index 03dd259..8521961 100644 --- a/Application/WorkhourMeter/WorkMeterHandler.cpp +++ b/Application/WorkhourMeter/WorkMeterHandler.cpp @@ -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; + }; } diff --git a/Application/WorkhourMeter/WorkMeterHandler.h b/Application/WorkhourMeter/WorkMeterHandler.h index f531120..65d88a1 100644 --- a/Application/WorkhourMeter/WorkMeterHandler.h +++ b/Application/WorkhourMeter/WorkMeterHandler.h @@ -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; diff --git a/Application/WorkhourMeter/main.cpp b/Application/WorkhourMeter/main.cpp index f209884..6e2316e 100644 --- a/Application/WorkhourMeter/main.cpp +++ b/Application/WorkhourMeter/main.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -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(0x4E) - //,static_cast(0x40) ,static_cast(16) ,static_cast(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 index 0000000..b5c5838 --- /dev/null +++ b/HAL/Abstract/ILCD.h @@ -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 diff --git a/HAL/Abstract/IRtc.h b/HAL/Abstract/IRtc.h index 7d46330..ec1abd1 100644 --- a/HAL/Abstract/IRtc.h +++ b/HAL/Abstract/IRtc.h @@ -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; }; diff --git a/HAL/Drivers/DS3231.cpp b/HAL/Drivers/DS3231.cpp index fb617a1..fe78ec4 100644 --- a/HAL/Drivers/DS3231.cpp +++ b/HAL/Drivers/DS3231.cpp @@ -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) { } diff --git a/HAL/Drivers/DS3231.h b/HAL/Drivers/DS3231.h index beeee42..4021ba1 100644 --- a/HAL/Drivers/DS3231.h +++ b/HAL/Drivers/DS3231.h @@ -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; diff --git a/HAL/Drivers/LiquidCrystal.cpp b/HAL/Drivers/LiquidCrystal.cpp index 20b9c36..4219b45 100644 --- a/HAL/Drivers/LiquidCrystal.cpp +++ b/HAL/Drivers/LiquidCrystal.cpp @@ -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) diff --git a/HAL/Drivers/LiquidCrystal.h b/HAL/Drivers/LiquidCrystal.h index 2ffae21..920adfc 100644 --- a/HAL/Drivers/LiquidCrystal.h +++ b/HAL/Drivers/LiquidCrystal.h @@ -51,7 +51,7 @@ /** * */ -class LiquidCrystal +class LiquidCrystal : public ILCD { public: LiquidCrystal(II2C *argII2C,Uint8_t lcd_Addr, Uint8_t argCols,Uint8_t argRows); @@ -66,6 +66,10 @@ class LiquidCrystal void setCursor(Uint8_t col,Uint8_t row); + void setBacklight(Bool_t _on); + + void setDisplay(Bool_t argOn) ; + inline void write(Uint8_t _char) { send(_char,Rs); }; private: inline void command(Uint8_t argValue) { send (argValue,0) ; } ; diff --git a/Metadata/WorkMeterParamIds.h b/Metadata/WorkMeterParamIds.h index 78a641f..42c9594 100644 --- a/Metadata/WorkMeterParamIds.h +++ b/Metadata/WorkMeterParamIds.h @@ -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 */ -- 2.30.2