From 62df997ad9880c430b2d2f9154fbed6a0d80f13a Mon Sep 17 00:00:00 2001 From: andre Ebersold Date: Thu, 26 Oct 2023 22:30:28 +0200 Subject: [PATCH] I2C is working. I'm able to read seconds, minutes, and hours --- Application/WorkhourMeter/CMakeLists.txt | 1 + .../WorkhourMeter/WorkMeterHandler.cpp | 38 ++++ Application/WorkhourMeter/WorkMeterHandler.h | 21 +++ Application/WorkhourMeter/main.cpp | 12 +- HAL/AVR/AvrI2C.cpp | 178 +++++++++++++++++- HAL/AVR/AvrI2C.h | 50 ++++- HAL/Abstract/II2C.h | 10 +- HAL/Drivers/DS3231.cpp | 24 ++- Metadata/CMakeLists.txt | 17 +- Metadata/ParameterTable.h | 7 + Metadata/WorkMeterParamIds.h | 29 +++ Metadata/WorkMeterParameterTable.cpp | 29 +++ Platform/CMakeLists.txt | 34 ++++ Platform/ParameterHandler.cpp | 97 ++++++++++ Platform/ParameterHandler.h | 34 ++++ 15 files changed, 550 insertions(+), 31 deletions(-) create mode 100644 Application/WorkhourMeter/WorkMeterHandler.cpp create mode 100644 Application/WorkhourMeter/WorkMeterHandler.h create mode 100644 Metadata/ParameterTable.h create mode 100644 Metadata/WorkMeterParamIds.h create mode 100644 Metadata/WorkMeterParameterTable.cpp create mode 100644 Platform/ParameterHandler.cpp create mode 100644 Platform/ParameterHandler.h diff --git a/Application/WorkhourMeter/CMakeLists.txt b/Application/WorkhourMeter/CMakeLists.txt index 51e7506..113c8a2 100644 --- a/Application/WorkhourMeter/CMakeLists.txt +++ b/Application/WorkhourMeter/CMakeLists.txt @@ -5,6 +5,7 @@ add_avr_executable( workmeter main.cpp Led0.cpp + WorkMeterHandler.cpp ) target_link_libraries( diff --git a/Application/WorkhourMeter/WorkMeterHandler.cpp b/Application/WorkhourMeter/WorkMeterHandler.cpp new file mode 100644 index 0000000..03dd259 --- /dev/null +++ b/Application/WorkhourMeter/WorkMeterHandler.cpp @@ -0,0 +1,38 @@ +#include "Utils/StdTypes.h" +#include "Application/ITask.h" +#include "Abstract/IRtc.h" +#include "Platform/IParameterHandler.h" + +#include "Metadata/PowerswitchParamIds.h" +#include "WorkMeterHandler.h" + + +WorkMeterHandler::WorkMeterHandler(IRtc *argRtc,IParameterHandler *argPH) + : m_Rtc(argRtc), 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_Time.seconds = 10; +} + +void WorkMeterHandler::onWriteValue(const Uint8_t paramID,const Uint8_t _val) +{ +} + +void WorkMeterHandler::onWriteValue(const Uint8_t paramID,const Float32_t _val) +{ +} + +void WorkMeterHandler::run() +{ + if (m_Ticks++ > 50) + { + 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_Ticks = 0; + } +} diff --git a/Application/WorkhourMeter/WorkMeterHandler.h b/Application/WorkhourMeter/WorkMeterHandler.h new file mode 100644 index 0000000..f531120 --- /dev/null +++ b/Application/WorkhourMeter/WorkMeterHandler.h @@ -0,0 +1,21 @@ +#ifndef __WORKMETERHANDLER_H__ +#define __WORKMETERHANDLER_H__ + +class WorkMeterHandler : public ITask, public IParameterListener +{ + public: + WorkMeterHandler(IRtc *argRTC,IParameterHandler *argPH); + + void run(); + + void onWriteValue(const Uint8_t paramID,const Uint8_t _val) ; + + void onWriteValue(const Uint8_t paramID,const Float32_t _val) ; + private: + IRtc *m_Rtc; + IParameterHandler *m_Params; + RtcTime_t m_Time; + Uint32_t m_Ticks; +}; + +#endif diff --git a/Application/WorkhourMeter/main.cpp b/Application/WorkhourMeter/main.cpp index dfde31d..126bdfd 100644 --- a/Application/WorkhourMeter/main.cpp +++ b/Application/WorkhourMeter/main.cpp @@ -31,6 +31,7 @@ #include #include #include "Led0.h" +#include "WorkMeterHandler.h" #if 0 #include "Switch.h" #include "PowerswitchHandler.h" @@ -67,14 +68,14 @@ class Scheduler : public IInterruptActivity static Task_type gTasks[TASK_COUNT]; public: - Scheduler(Led0 *_led,IProtocolLayer2 *_net,CommunicationHandler *_com,IRtc *_argRtc + Scheduler(Led0 *_led,IProtocolLayer2 *_net,CommunicationHandler *_com,ITask *_argRtc ,ITask *_Storage ) : m_Led(_led) , m_Netstring(_net) , m_Com(_com) - , m_Rtc(_argRtc) + , m_WorkMeter(_argRtc) , m_Storage(_Storage) , m_CurrentTimeslot(FIRST_TIME_SLOT) , m_CurrentTask(TASK1) @@ -89,7 +90,7 @@ class Scheduler : public IInterruptActivity { case TASK1: //m_Adc->run(); - m_Rtc->getTime(m_Time); + m_WorkMeter->run(); //m_Led->tick(); break; case TASK2: @@ -132,7 +133,7 @@ class Scheduler : public IInterruptActivity Led0 *m_Led; IProtocolLayer2 *m_Netstring; CommunicationHandler *m_Com; - IRtc *m_Rtc; + ITask *m_WorkMeter; ITask *m_Storage; volatile TIME_SLOTS m_CurrentTimeslot; ETASK_ID m_CurrentTask; @@ -173,7 +174,8 @@ int main(void) NetString netstring(&uart); CommunicationHandler gCom(&netstring,&gParam); PersistentStorage gStorage(&gEeprom,&gParam); - Scheduler sched(&led,&netstring,&gCom,&gRtc,&gStorage); + WorkMeterHandler gWorkMeter(&gRtc,&gParam); + Scheduler sched(&led,&netstring,&gCom,&gWorkMeter,&gStorage); uart.init(); gI2c.init(); diff --git a/HAL/AVR/AvrI2C.cpp b/HAL/AVR/AvrI2C.cpp index e76bc7b..167d6d2 100644 --- a/HAL/AVR/AvrI2C.cpp +++ b/HAL/AVR/AvrI2C.cpp @@ -10,19 +10,39 @@ #endif #define SCL_CLOCK 400000 +#define START +#define MT_SLA_ACK +#define TW_SDA_PIN PORTC4 +#define TW_SCL_PIN PORTC5 + +#define I2C_ERROR 0 +#define I2C_SUCCESS 1 + AvrI2C::AvrI2C() + : m_Received(0) { } void AvrI2C::init() { TWSR = 0; // no prescaler - TWBR = ((F_CPU/SCL_CLOCK)-16)/2; - TWCR = (1<<(TWINT))|(1<read(DS3231_ADDRESS,cmd,2); - - argTime.seconds = cmd[1]; + Uint8_t cmd[9] ; + cmd[0] = 0x00; cmd[1] = 128; +#if 1 + Bool_t success = itsII2C->read(DS3231_ADDRESS,cmd[0],&cmd[1],8); + + if (!success) + { + argTime.seconds = 255; + } else + { + 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); + } +#else + itsII2C->write(DS3231_ADDRESS,cmd,1); + itsII2C->read(DS3231_ADDRESS,&argTime.seconds,1); +#endif } void DS3231::setTime(const RtcTime_t &argTime) diff --git a/Metadata/CMakeLists.txt b/Metadata/CMakeLists.txt index 37acbe5..f6cb12b 100644 --- a/Metadata/CMakeLists.txt +++ b/Metadata/CMakeLists.txt @@ -2,17 +2,22 @@ # simple AVR library ##################################################################### add_avr_library( - avrPowerswitchParameters - PowerswitchParameterTable.cpp + avrPowerswitchParameters + PowerswitchParameterTable.cpp ) add_avr_library( - avrDCMotorParameters - DCMotorParameterTable.cpp + avrDCMotorParameters + DCMotorParameterTable.cpp ) add_avr_library( - avrShutterCtrlParameters - ShutterCtrlParameterTable.cpp + avrShutterCtrlParameters + ShutterCtrlParameterTable.cpp + ) + +add_avr_library( + avrWorkMeterParameters + WorkMeterParameterTable.cpp ) diff --git a/Metadata/ParameterTable.h b/Metadata/ParameterTable.h new file mode 100644 index 0000000..45a52d0 --- /dev/null +++ b/Metadata/ParameterTable.h @@ -0,0 +1,7 @@ +#ifndef POWERSWITCHPARAMETERTABLE_H__ +#define POWERSWITCHPARAMETERTABLE_H__ + +#include "Metadata/Metadata.h" +extern +ParameterValue m_Values[PID_MAX]; +#endif diff --git a/Metadata/WorkMeterParamIds.h b/Metadata/WorkMeterParamIds.h new file mode 100644 index 0000000..78a641f --- /dev/null +++ b/Metadata/WorkMeterParamIds.h @@ -0,0 +1,29 @@ +#ifndef __DCMOTORPARAMIDS_H__ +#define __DCMOTORPARAMIDS_H__ + + +/** + * Maybe put this in an include file + * DCMotorParamIds.h + */ +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_LedCycle = 5 /* Ye Blinking led cycle. 0 is off */ + , PID_LedState = 6 /* Set let state ... */ + , PID_DelayP1 = 7 + , PID_DelayP2 = 8 + , PID_DelayP3 = 9 /* Cycle Per rotation used in closed loop */ + , PID_DelayP4 = 10 /* Set PID constant factor */ + , PID_Ki = 11 /* Set PID integral factor */ + , PID_Kd = 12 /* Set PID derivation factor */ + , PID_MAConsPwm = 13 /* Pwm modulation instruction, Applied in open loop, ignore in closed loop */ + , PID_MAConsRpm = 14 /* Rpm instruction used as reference in closed loop */ + , PID_LowLevelError1 = 15 /* Low Level Error1 up to 32 errors */ + , PID_LowLevelError2 = 16 /* Low Level Error2 up to 32 errors */ + , PID_MAX = 17 +}; +#endif diff --git a/Metadata/WorkMeterParameterTable.cpp b/Metadata/WorkMeterParameterTable.cpp new file mode 100644 index 0000000..a2cdf6b --- /dev/null +++ b/Metadata/WorkMeterParameterTable.cpp @@ -0,0 +1,29 @@ +#include +#include // for itoa +#include "Metadata/Metadata.h" +#include "Platform/IParameterHandler.h" +#include "WorkMeterParamIds.h" +#include "ParameterTable.h" + + +ParameterValue m_Values[PID_MAX] = +{ + {0,NULL} + ,{0,NULL} + ,{0,NULL} + ,{0,NULL} + ,{0,NULL} + ,{0,NULL} + ,{0,NULL} + ,{0,NULL} + ,{0,NULL} + ,{0,NULL} + ,{0,NULL} + ,{0,NULL} + ,{0,NULL} + ,{0,NULL} + ,{0,NULL} + ,{0,NULL} + ,{0,NULL} + +}; diff --git a/Platform/CMakeLists.txt b/Platform/CMakeLists.txt index 244b2d2..283bf36 100644 --- a/Platform/CMakeLists.txt +++ b/Platform/CMakeLists.txt @@ -7,15 +7,49 @@ add_avr_library( PersistentStorage.cpp ) +set_target_properties( + avrPtf${MCU_TYPE_FOR_FILENAME} PROPERTIES + COMPILE_DEFINITIONS DCMOTOR_PARAMETERS +) + +# +# +# add_avr_library( avrPS-Ptf PowerswitchParameterHandler.cpp PersistentStorage.cpp ) +set_target_properties( + avrPtf${MCU_TYPE_FOR_FILENAME} PROPERTIES + COMPILE_DEFINITIONS POWERSWITCH_PARAMETERS +) +# +# +# add_avr_library( avrSC-Ptf ShutterCtrlParameterHandler.cpp PersistentStorage.cpp ) +set_target_properties( + avrPtf${MCU_TYPE_FOR_FILENAME} PROPERTIES + COMPILE_DEFINITIONS SHUTTERCTRL_PARAMETERS +) + +# +# +# +add_avr_library( + avrWM-Ptf + ParameterHandler.cpp + PersistentStorage.cpp + ) + +set_target_properties( + avrWM-Ptf${MCU_TYPE_FOR_FILENAME} PROPERTIES + COMPILE_DEFINITIONS WORKMETER_PARAMETERS +) + diff --git a/Platform/ParameterHandler.cpp b/Platform/ParameterHandler.cpp new file mode 100644 index 0000000..345c4ce --- /dev/null +++ b/Platform/ParameterHandler.cpp @@ -0,0 +1,97 @@ +#include + +#include +#ifdef POWERSWITCH_PARAMETERS +#include +#include +#elif defined(WORKMETER_PARAMETERS) +#include +#include +#endif +#include + +ParameterHandler::ParameterHandler() +{ + +} +/// +void +ParameterHandler::readValue(const uint8_t paramID,uint8_t &_val) +{ + if (paramID < PID_MAX) + { + _val = m_Values[paramID].u.m_U8; + } +} + +/// +void +ParameterHandler::writeValue(const uint8_t paramID,const uint8_t _val) +{ + if (paramID < PID_MAX) + { + m_Values[paramID].u.m_U8 = _val; + if (m_Values[paramID].m_Listener != 0 ) + { + m_Values[paramID].m_Listener->onWriteValue(paramID,_val); + } + } +} + +/// Handle UInt16_t +void +ParameterHandler::readValue(const uint8_t paramID,uint16_t &_val) +{ + if (paramID < PID_MAX) + { + _val = m_Values[paramID].u.m_U16; + } +} + +/// +void +ParameterHandler::writeValue(const uint8_t paramID,const uint16_t _val) +{ + if (paramID < PID_MAX) + { + 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); + } + } +} + +/// Handle Float32_t +void +ParameterHandler::readValue(const uint8_t paramID,Float32_t &_val) +{ + if (paramID < PID_MAX) + { + _val = m_Values[paramID].u.m_Float; + } +} + +/// +void +ParameterHandler::writeValue(const uint8_t paramID,const Float32_t _val) +{ + if (paramID < PID_MAX) + { + m_Values[paramID].u.m_Float = _val; + if (m_Values[paramID].m_Listener != 0 ) + { + m_Values[paramID].m_Listener->onWriteValue(paramID,m_Values[paramID].u.m_Float); + } + } +} + +void +ParameterHandler::registerListener(const uint8_t paramID,IParameterListener *_val) +{ + if (paramID < PID_MAX) + { + m_Values[paramID].m_Listener = _val; + } + +} diff --git a/Platform/ParameterHandler.h b/Platform/ParameterHandler.h new file mode 100644 index 0000000..5b75a53 --- /dev/null +++ b/Platform/ParameterHandler.h @@ -0,0 +1,34 @@ +#ifndef __PARAMETERHANDLER_H__ +#define __PARAMETERHANDLER_H__ + + +/** + * @brief storage class + * + */ +class ParameterHandler : public IParameterHandler +{ + public: + ParameterHandler(); + /// + virtual void readValue(const uint8_t paramID,uint8_t &_val); + /// + virtual void writeValue(const uint8_t paramID,const uint8_t _val); + /// + virtual void readValue(const uint8_t paramID,uint16_t &_val); + /// + virtual void writeValue(const uint8_t paramID,const uint16_t _val); + + /// + virtual void readValue(const uint8_t paramID,Float32_t &_val) ; + /// + virtual void writeValue(const uint8_t paramID,const Float32_t _val) ; + /// + /// + virtual void registerListener(const uint8_t paramID,IParameterListener *_val); + + + private: +}; + +#endif -- 2.30.2