From b5de72a6d17b10822efe6c4b49ac54e2c06e430f Mon Sep 17 00:00:00 2001 From: Emanuele Trabattoni Date: Sun, 22 Jun 2025 12:35:19 +0200 Subject: [PATCH] Fixed formatting --- lib/I2C/I2C_Driver.cpp | 136 ++++++++++++++++----------------- lib/I2C/I2C_Driver.h | 29 +++---- lib/RTC/WS_PCF85063.cpp | 164 ++++++++++++++++++++-------------------- lib/RTC/WS_PCF85063.h | 111 ++++++++++++--------------- 4 files changed, 217 insertions(+), 223 deletions(-) diff --git a/lib/I2C/I2C_Driver.cpp b/lib/I2C/I2C_Driver.cpp index dc16728..837f4db 100644 --- a/lib/I2C/I2C_Driver.cpp +++ b/lib/I2C/I2C_Driver.cpp @@ -3,78 +3,78 @@ namespace drivers { - I2C::I2C() + I2C::I2C() + { + Wire.begin(I2C_SDA_PIN, I2C_SCL_PIN); + isInitialized = true; + } + + I2C::~I2C() + { + Wire.end(); + isInitialized = true; + } + + const bool I2C::Read(const uint8_t deviceAddr, const uint8_t deviceReg, const uint8_t len, std::vector &data) + { + busy.try_lock(); + Wire.beginTransmission(deviceAddr); + Wire.write(deviceReg); + switch (Wire.endTransmission(true)) { - Wire.begin(I2C_SDA_PIN, I2C_SCL_PIN); - isInitialized = true; + case 0: + break; // no error, break switch + case 1: + log_e("Data to long to fit in buffer: [%d]", len); + case 2: + log_e("Received NAK on address transmit"); + case 3: + log_e("Received NAK on data transmit"); + case 4: + log_e("Unknown Error"); + return false; + } + const uint8_t nBytes = Wire.requestFrom(deviceAddr, len); + if (nBytes < len) + { + log_w("Received data is less than expected: len[%d], nBytes[%d]", len, nBytes); + } + data.clear(); + data.resize(nBytes); // resize out buffer to received data len, no check if data len is correct + for (auto i = 0; i < nBytes; i++) + { + data[i] = static_cast(Wire.read()); + } + busy.unlock(); + return true; + } + + const bool I2C::Write(const uint8_t deviceAddr, const uint8_t deviceReg, const std::vector &data) + { + busy.lock(); + Wire.beginTransmission(deviceAddr); + Wire.write(deviceReg); + for (auto d : data) + { + Wire.write(d); } - I2C::~I2C() + switch (Wire.endTransmission(true)) { - Wire.end(); - isInitialized = true; - } - - const bool I2C::Read(const uint8_t deviceAddr, const uint8_t deviceReg, const uint8_t len, std::vector &data) - { - busy.try_lock(); - Wire.beginTransmission(deviceAddr); - Wire.write(deviceReg); - switch (Wire.endTransmission(true)) - { - case 0: - break; // no error, break switch - case 1: - log_e("Data to long to fit in buffer: [%d]", len); - case 2: - log_e("Received NAK on address transmit"); - case 3: - log_e("Received NAK on data transmit"); - case 4: - log_e("Unknown Error"); - return false; - } - const uint8_t nBytes = Wire.requestFrom(deviceAddr, len); - if (nBytes < len) - { - log_w("Received data is less than expected: len[%d], nBytes[%d]", len, nBytes); - } - data.clear(); - data.resize(nBytes); // resize out buffer to received data len, no check if data len is correct - for (auto i = 0; i < nBytes; i++) - { - data[i] = static_cast(Wire.read()); - } - busy.unlock(); - return true; - } - - const bool I2C::Write(const uint8_t deviceAddr, const uint8_t deviceReg, const std::vector &data) - { - busy.lock(); - Wire.beginTransmission(deviceAddr); - Wire.write(deviceReg); - for (auto d : data) - { - Wire.write(d); - } - - switch (Wire.endTransmission(true)) - { - case 0: - break; // no error, break switch - case 1: - log_e("Data to long to fit in buffer: [%d]", data.size()); - case 2: - log_e("Received NAK on address transmit"); - case 3: - log_e("Received NAK on data transmit"); - case 4: - log_e("Unknown Error"); - return false; - } - busy.unlock(); - return true; + case 0: + break; // no error, break switch + case 1: + log_e("Data to long to fit in buffer: [%d]", data.size()); + case 2: + log_e("Received NAK on address transmit"); + case 3: + log_e("Received NAK on data transmit"); + case 4: + log_e("Unknown Error"); + return false; } + busy.unlock(); + return true; + } } // namespace drivers diff --git a/lib/I2C/I2C_Driver.h b/lib/I2C/I2C_Driver.h index c982c3d..f32a870 100644 --- a/lib/I2C/I2C_Driver.h +++ b/lib/I2C/I2C_Driver.h @@ -1,25 +1,26 @@ #pragma once -#include +#include #include #include -#define I2C_SCL_PIN 41 -#define I2C_SDA_PIN 42 +#define I2C_SCL_PIN 41 +#define I2C_SDA_PIN 42 -namespace drivers { - - class I2C { - private: - bool isInitialized = false; - std::mutex busy; +namespace drivers +{ - public: - I2C(void); - ~I2C(void); + class I2C + { + private: + bool isInitialized = false; + std::mutex busy; - const bool Read(const uint8_t deviceAddr, const uint8_t deviceReg, const uint8_t len, std::vector &data); - const bool Write(const uint8_t deviceAddr, const uint8_t deviceReg, const std::vector &data); + public: + I2C(void); + ~I2C(void); + const bool Read(const uint8_t deviceAddr, const uint8_t deviceReg, const uint8_t len, std::vector &data); + const bool Write(const uint8_t deviceAddr, const uint8_t deviceReg, const std::vector &data); }; } diff --git a/lib/RTC/WS_PCF85063.cpp b/lib/RTC/WS_PCF85063.cpp index c69201a..7000ab2 100644 --- a/lib/RTC/WS_PCF85063.cpp +++ b/lib/RTC/WS_PCF85063.cpp @@ -1,82 +1,84 @@ #include "WS_PCF85063.h" -datetime_t datetime= {0}; -datetime_t Update_datetime= {0}; +datetime_t datetime = {0}; +datetime_t Update_datetime = {0}; static uint8_t decToBcd(int val); static int bcdToDec(uint8_t val); - -void Time_printf(void *parameter) { - while(1){ - char datetime_str[50]; - datetime_to_str(datetime_str,datetime); - printf("Time:%s\r\n",datetime_str); - vTaskDelay(pdMS_TO_TICKS(500)); - } - vTaskDelete(NULL); -} -void PCF85063_Init(void) // PCF85063 initialized +void Time_printf(void *parameter) { - uint8_t Value = RTC_CTRL_1_DEFAULT|RTC_CTRL_1_CAP_SEL; + while (1) + { + char datetime_str[50]; + datetime_to_str(datetime_str, datetime); + printf("Time:%s\r\n", datetime_str); + vTaskDelay(pdMS_TO_TICKS(500)); + } + vTaskDelete(NULL); +} +void PCF85063_Init(void) // PCF85063 initialized +{ + uint8_t Value = RTC_CTRL_1_DEFAULT | RTC_CTRL_1_CAP_SEL; I2C_Write(PCF85063_ADDRESS, RTC_CTRL_1_ADDR, &Value, 1); - I2C_Read(PCF85063_ADDRESS, RTC_CTRL_1_ADDR, &Value, 1); - if(Value & RTC_CTRL_1_STOP) - printf("PCF85063 failed to be initialized.state :%d\r\n",Value); + I2C_Read(PCF85063_ADDRESS, RTC_CTRL_1_ADDR, &Value, 1); + if (Value & RTC_CTRL_1_STOP) + printf("PCF85063 failed to be initialized.state :%d\r\n", Value); else - printf("PCF85063 is running,state :%d\r\n",Value); - - // - // Update_datetime.year = 2024; - // Update_datetime.month = 9; - // Update_datetime.day = 20; - // Update_datetime.dotw = 5; - // Update_datetime.hour = 9; - // Update_datetime.minute = 50; - // Update_datetime.second = 0; - // PCF85063_Set_All(Update_datetime); - xTaskCreatePinnedToCore( - PCF85063Task, - "PCF85063Task", - 4096, - NULL, - 3, - NULL, - 0 - ); - // xTaskCreatePinnedToCore( - // Time_printf, - // "Time_printf", - // 4096, - // NULL, - // 3, - // NULL, - // 0 - // ); + printf("PCF85063 is running,state :%d\r\n", Value); + + // + // Update_datetime.year = 2024; + // Update_datetime.month = 9; + // Update_datetime.day = 20; + // Update_datetime.dotw = 5; + // Update_datetime.hour = 9; + // Update_datetime.minute = 50; + // Update_datetime.second = 0; + // PCF85063_Set_All(Update_datetime); + xTaskCreatePinnedToCore( + PCF85063Task, + "PCF85063Task", + 4096, + NULL, + 3, + NULL, + 0); + // xTaskCreatePinnedToCore( + // Time_printf, + // "Time_printf", + // 4096, + // NULL, + // 3, + // NULL, + // 0 + // ); } -void PCF85063Task(void *parameter) { - while(1){ - PCF85063_Read_Time(&datetime); - vTaskDelay(pdMS_TO_TICKS(100)); - } - vTaskDelete(NULL); -} - -void PCF85063_Reset() // Reset PCF85063 +void PCF85063Task(void *parameter) { - uint8_t Value = RTC_CTRL_1_DEFAULT|RTC_CTRL_1_CAP_SEL|RTC_CTRL_1_SR; + while (1) + { + PCF85063_Read_Time(&datetime); + vTaskDelay(pdMS_TO_TICKS(100)); + } + vTaskDelete(NULL); +} + +void PCF85063_Reset() // Reset PCF85063 +{ + uint8_t Value = RTC_CTRL_1_DEFAULT | RTC_CTRL_1_CAP_SEL | RTC_CTRL_1_SR; esp_err_t ret = I2C_Write(PCF85063_ADDRESS, RTC_CTRL_1_ADDR, &Value, 1); - if(ret != ESP_OK) + if (ret != ESP_OK) printf("PCF85063 : Reset failure\r\n"); } -void PCF85063_Set_Time(datetime_t time) // Set Time +void PCF85063_Set_Time(datetime_t time) // Set Time { uint8_t buf[3] = {decToBcd(time.second), decToBcd(time.minute), decToBcd(time.hour)}; esp_err_t ret = I2C_Write(PCF85063_ADDRESS, RTC_SECOND_ADDR, buf, sizeof(buf)); - if(ret != ESP_OK) + if (ret != ESP_OK) printf("PCF85063 : Time setting failure\r\n"); } void PCF85063_Set_Date(datetime_t date) // Set Date @@ -86,7 +88,7 @@ void PCF85063_Set_Date(datetime_t date) // Set Date decToBcd(date.month), decToBcd(date.year - YEAR_OFFSET)}; esp_err_t ret = I2C_Write(PCF85063_ADDRESS, RTC_DAY_ADDR, buf, sizeof(buf)); - if(ret != ESP_OK) + if (ret != ESP_OK) printf("PCF85063 : Date setting failed\r\n"); } @@ -100,7 +102,7 @@ void PCF85063_Set_All(datetime_t time) // Set Time And Date decToBcd(time.month), decToBcd(time.year - YEAR_OFFSET)}; esp_err_t ret = I2C_Write(PCF85063_ADDRESS, RTC_SECOND_ADDR, buf, sizeof(buf)); - if(ret != ESP_OK) + if (ret != ESP_OK) printf("PCF85063 : Failed to set the date and time\r\n"); } @@ -108,9 +110,10 @@ void PCF85063_Read_Time(datetime_t *time) // Read Time And Date { uint8_t buf[7] = {0}; esp_err_t ret = I2C_Read(PCF85063_ADDRESS, RTC_SECOND_ADDR, buf, sizeof(buf)); - if(ret != ESP_OK) + if (ret != ESP_OK) printf("PCF85063 : Time read failure\r\n"); - else{ + else + { time->second = bcdToDec(buf[0] & 0x7F); time->minute = bcdToDec(buf[1] & 0x7F); time->hour = bcdToDec(buf[2] & 0x3F); @@ -126,7 +129,7 @@ void PCF85063_Enable_Alarm() // Enable Alarm and Clear Alarm flag uint8_t Value = RTC_CTRL_2_DEFAULT | RTC_CTRL_2_AIE; Value &= ~RTC_CTRL_2_AF; esp_err_t ret = I2C_Write(PCF85063_ADDRESS, RTC_CTRL_2_ADDR, &Value, 1); - if(ret != ESP_OK) + if (ret != ESP_OK) printf("PCF85063 : Failed to enable Alarm Flag and Clear Alarm Flag \r\n"); } @@ -134,28 +137,28 @@ uint8_t PCF85063_Get_Alarm_Flag() // Get Alarm flag { uint8_t Value = 0; esp_err_t ret = I2C_Read(PCF85063_ADDRESS, RTC_CTRL_2_ADDR, &Value, 1); - if(ret != ESP_OK) + if (ret != ESP_OK) printf("PCF85063 : Failed to obtain a warning flag.\r\n"); else Value &= RTC_CTRL_2_AF | RTC_CTRL_2_AIE; - //printf("Value = 0x%x",Value); + // printf("Value = 0x%x",Value); return Value; } void PCF85063_Set_Alarm(datetime_t time) // Set Alarm { - uint8_t buf[5] ={ - decToBcd(time.second)&(~RTC_ALARM), - decToBcd(time.minute)&(~RTC_ALARM), - decToBcd(time.hour)&(~RTC_ALARM), - //decToBcd(time.day)&(~RTC_ALARM), - //decToBcd(time.dotw)&(~RTC_ALARM) - RTC_ALARM, //disalbe day - RTC_ALARM //disalbe weekday + uint8_t buf[5] = { + decToBcd(time.second) & (~RTC_ALARM), + decToBcd(time.minute) & (~RTC_ALARM), + decToBcd(time.hour) & (~RTC_ALARM), + // decToBcd(time.day)&(~RTC_ALARM), + // decToBcd(time.dotw)&(~RTC_ALARM) + RTC_ALARM, // disalbe day + RTC_ALARM // disalbe weekday }; esp_err_t ret = I2C_Write(PCF85063_ADDRESS, RTC_SECOND_ALARM, buf, sizeof(buf)); - if(ret != ESP_OK) + if (ret != ESP_OK) printf("PCF85063 : Failed to set alarm flag\r\n"); } @@ -163,9 +166,10 @@ void PCF85063_Read_Alarm(datetime_t *time) // Read Alarm { uint8_t buf[5] = {0}; esp_err_t ret = I2C_Read(PCF85063_ADDRESS, RTC_SECOND_ALARM, buf, sizeof(buf)); - if(ret != ESP_OK) + if (ret != ESP_OK) printf("PCF85063 : Failed to read the alarm sign\r\n"); - else{ + else + { time->second = bcdToDec(buf[0] & 0x7F); time->minute = bcdToDec(buf[1] & 0x7F); time->hour = bcdToDec(buf[2] & 0x3F); @@ -182,8 +186,8 @@ static int bcdToDec(uint8_t val) // Convert binary coded decimal to normal decim { return (int)((val / 16 * 10) + (val % 16)); } -void datetime_to_str(char *datetime_str,datetime_t time) +void datetime_to_str(char *datetime_str, datetime_t time) { - sprintf(datetime_str, " %d.%d.%d %d:%d:%d %s", time.year, time.month, + sprintf(datetime_str, " %d.%d.%d %d:%d:%d %s", time.year, time.month, time.day, time.hour, time.minute, time.second, Week[time.dotw]); -} \ No newline at end of file +} \ No newline at end of file diff --git a/lib/RTC/WS_PCF85063.h b/lib/RTC/WS_PCF85063.h index 984d73e..51c013d 100644 --- a/lib/RTC/WS_PCF85063.h +++ b/lib/RTC/WS_PCF85063.h @@ -2,64 +2,65 @@ #include "I2C_Driver.h" -//PCF85063_ADDRESS -#define PCF85063_ADDRESS (0x51) -// -#define YEAR_OFFSET (1970) +// PCF85063_ADDRESS +#define PCF85063_ADDRESS (0x51) + +#define YEAR_OFFSET (1970) // registar overview - crtl & status reg -#define RTC_CTRL_1_ADDR (0x00) -#define RTC_CTRL_2_ADDR (0x01) -#define RTC_OFFSET_ADDR (0x02) -#define RTC_RAM_by_ADDR (0x03) +#define RTC_CTRL_1_ADDR (0x00) +#define RTC_CTRL_2_ADDR (0x01) +#define RTC_OFFSET_ADDR (0x02) +#define RTC_RAM_by_ADDR (0x03) // registar overview - time & data reg -#define RTC_SECOND_ADDR (0x04) -#define RTC_MINUTE_ADDR (0x05) -#define RTC_HOUR_ADDR (0x06) -#define RTC_DAY_ADDR (0x07) -#define RTC_WDAY_ADDR (0x08) -#define RTC_MONTH_ADDR (0x09) -#define RTC_YEAR_ADDR (0x0A) // years 0-99; calculate real year = 1970 + RCC reg year +#define RTC_SECOND_ADDR (0x04) +#define RTC_MINUTE_ADDR (0x05) +#define RTC_HOUR_ADDR (0x06) +#define RTC_DAY_ADDR (0x07) +#define RTC_WDAY_ADDR (0x08) +#define RTC_MONTH_ADDR (0x09) +#define RTC_YEAR_ADDR (0x0A) // years 0-99; calculate real year = 1970 + RCC reg year // registar overview - alarm reg -#define RTC_SECOND_ALARM (0x0B) -#define RTC_MINUTE_ALARM (0x0C) -#define RTC_HOUR_ALARM (0x0D) -#define RTC_DAY_ALARM (0x0E) -#define RTC_WDAY_ALARM (0x0F) +#define RTC_SECOND_ALARM (0x0B) +#define RTC_MINUTE_ALARM (0x0C) +#define RTC_HOUR_ALARM (0x0D) +#define RTC_DAY_ALARM (0x0E) +#define RTC_WDAY_ALARM (0x0F) // registar overview - timer reg -#define RTC_TIMER_VAL (0x10) -#define RTC_TIMER_MODE (0x11) +#define RTC_TIMER_VAL (0x10) +#define RTC_TIMER_MODE (0x11) -//RTC_CTRL_1 registar +// RTC_CTRL_1 registar #define RTC_CTRL_1_EXT_TEST (0x80) -#define RTC_CTRL_1_STOP (0x20) //0-RTC clock runs 1- RTC clock is stopped -#define RTC_CTRL_1_SR (0X10) //0-no software reset 1-initiate software rese -#define RTC_CTRL_1_CIE (0X04) //0-no correction interrupt generated 1-interrupt pulses are generated at every correction cycle -#define RTC_CTRL_1_12_24 (0X02) //0-24H 1-12H -#define RTC_CTRL_1_CAP_SEL (0X01) //0-7PF 1-12.5PF +#define RTC_CTRL_1_STOP (0x20) // 0-RTC clock runs 1- RTC clock is stopped +#define RTC_CTRL_1_SR (0X10) // 0-no software reset 1-initiate software rese +#define RTC_CTRL_1_CIE (0X04) // 0-no correction interrupt generated 1-interrupt pulses are generated at every correction cycle +#define RTC_CTRL_1_12_24 (0X02) // 0-24H 1-12H +#define RTC_CTRL_1_CAP_SEL (0X01) // 0-7PF 1-12.5PF -//RTC_CTRL_2 registar -#define RTC_CTRL_2_AIE (0X80) //alarm interrupt 0-disalbe 1-enable -#define RTC_CTRL_2_AF (0X40) //alarm flag 0-inactive/cleared 1-active/unchanged -#define RTC_CTRL_2_MI (0X20) //minute interrupt 0-disalbe 1-enable -#define RTC_CTRL_2_HMI (0X10) //half minute interrupt -#define RTC_CTRL_2_TF (0X08) +// RTC_CTRL_2 registar +#define RTC_CTRL_2_AIE (0X80) // alarm interrupt 0-disalbe 1-enable +#define RTC_CTRL_2_AF (0X40) // alarm flag 0-inactive/cleared 1-active/unchanged +#define RTC_CTRL_2_MI (0X20) // minute interrupt 0-disalbe 1-enable +#define RTC_CTRL_2_HMI (0X10) // half minute interrupt +#define RTC_CTRL_2_TF (0X08) // -#define RTC_OFFSET_MODE (0X80) +#define RTC_OFFSET_MODE (0X80) // -#define RTC_TIMER_MODE_TE (0X04) //timer enable 0-disalbe 1-enable -#define RTC_TIMER_MODE_TIE (0X02) //timer interrupt enable 0-disalbe 1-enable -#define RTC_TIMER_MODE_TI_TP (0X01) //timer interrupt mode 0-interrupt follows timer flag 1-interrupt generates a pulse +#define RTC_TIMER_MODE_TE (0X04) // timer enable 0-disalbe 1-enable +#define RTC_TIMER_MODE_TIE (0X02) // timer interrupt enable 0-disalbe 1-enable +#define RTC_TIMER_MODE_TI_TP (0X01) // timer interrupt mode 0-interrupt follows timer flag 1-interrupt generates a pulse -// format -#define RTC_ALARM (0x80) // set AEN_x registers -#define RTC_CTRL_1_DEFAULT (0x00) -#define RTC_CTRL_2_DEFAULT (0x00) +// format +#define RTC_ALARM (0x80) // set AEN_x registers +#define RTC_CTRL_1_DEFAULT (0x00) +#define RTC_CTRL_2_DEFAULT (0x00) -#define RTC_TIMER_FLAG (0x08) +#define RTC_TIMER_FLAG (0x08) -typedef struct { +typedef struct +{ uint16_t year; uint8_t month; uint8_t day; @@ -67,11 +68,10 @@ typedef struct { uint8_t hour; uint8_t minute; uint8_t second; -}datetime_t; +} datetime_t; - -const unsigned char MonthStr[12][4] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov","Dec"}; -const unsigned char Week[7][5] = {"SUN","Mon","Tues","Wed","Thur","Fri","Sat"}; +const unsigned char MonthStr[12][4] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; +const unsigned char Week[7][4] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; extern datetime_t datetime; void PCF85063_Init(void); @@ -84,20 +84,9 @@ void PCF85063_Set_All(datetime_t time); void PCF85063_Read_Time(datetime_t *time); - void PCF85063_Enable_Alarm(void); -uint8_t PCF85063_Get_Alarm_Flag(); +uint8_t PCF85063_Get_Alarm_Flag(void); void PCF85063_Set_Alarm(datetime_t time); void PCF85063_Read_Alarm(datetime_t *time); -void datetime_to_str(char *datetime_str,datetime_t time); - - -// weekday format -// 0 - sunday -// 1 - monday -// 2 - tuesday -// 3 - wednesday -// 4 - thursday -// 5 - friday -// 6 - saturday \ No newline at end of file +void datetime_to_str(char *datetime_str, datetime_t time);