#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;
+ };
}
class WorkMeterHandler : public ITask, public IParameterListener
{
public:
- WorkMeterHandler(IRtc *argRTC,IParameterHandler *argPH);
+ WorkMeterHandler(IRtc *argRTC,ILCD *argLCD,IParameterHandler *argPH);
void run();
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;
#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>
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,
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();
--- /dev/null
+#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
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
*
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;
};
{
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);
}
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)
{
}
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;
#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)
command(LCD_DISPLAYCONTROL | m_DispCtrl);
clear();
+
+ command(LCD_ENTRYMODESET | m_DispMode);
home();
}
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)
/**\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
\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
*/
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 */