/* * myComms.c * * Created on: Mar 27, 2026 * Author: ewars */ #include "usbd_cdc_if.h" #include "stdio.h" #include "myComms.h" #include "clock.h" #include "ds1307.h" #define NV_COLOUR_HOURS_ADDR 0x08 #define NV_COLOUR_MINUTES_ADDR 0x0B #define NV_COLOUR_SECONDS_ADDR 0x0E #define NV_COLOUR_BACKGND_ADDR 0x11 typedef struct { uint8_t cmdId; struct{ uint8_t pByte_3; uint8_t pByte_2; uint8_t pByte_1; uint8_t pByte_0; } bytes; uint8_t crc; } uartMessage_s; static void cmd_readNV(uint32_t data); static void cmd_writeNV(uint32_t data); static uint8_t nok[] = "NOK\n"; static uint8_t ok[] = "OK\n"; uint8_t myId[] = "Clock\n"; uint8_t UART_RxBuf[6] = {0}; uint8_t RxComplete_fl = 0; void (*commands[])(uint32_t) = { cmd_WhoAmI, // 0 cmd_GetTime, // 1 cmd_GetMonthDay, // 2 cmd_GetYear, // 3 cmd_GetTimeZone, // 4 cmd_SetTime, // 5 cmd_SetMonthDay, // 6 cmd_SetYear, // 7 cmd_setColour_hour, // 8 cmd_setColour_minute, // 9 cmd_setColour_second, // 10 cmd_setColour_background, // 11 cmd_Set_TimeZone, // 12 cmd_readNV, // 13 cmd_writeNV, // 14 }; void cmd_GetTimeZone(uint32_t d){ } void cmd_GetYear(uint32_t d){ } void cmd_GetMonthDay(uint32_t d){ } void cmd_SetYear(uint32_t year){ } void cmd_SetMonthDay(uint32_t){ } void cmd_Set_TimeZone(uint32_t){ } static void cmd_readNV(uint32_t data){ HAL_StatusTypeDef status = HAL_ERROR; uint8_t addr = (uint8_t) data; uint8_t respBuf[3] = {0}; status = ds1307_read_user_RAM(addr, respBuf, sizeof(respBuf)); if(HAL_OK == status){ CDC_Transmit_FS(respBuf, sizeof(respBuf)); } else{ CDC_Transmit_FS(nok, sizeof(nok)); } } static void cmd_writeNV(uint32_t data){ HAL_StatusTypeDef status = HAL_ERROR; status = ds1307_write_user_RAM(UART_RxBuf[1], &UART_RxBuf[2], 3); switch(UART_RxBuf[1]){ case NV_COLOUR_HOURS_ADDR: clock_setColourHours(UART_RxBuf[2], UART_RxBuf[3], UART_RxBuf[4]); break; case NV_COLOUR_MINUTES_ADDR: clock_setColourMinutes(UART_RxBuf[2], UART_RxBuf[3], UART_RxBuf[4]); break; case NV_COLOUR_SECONDS_ADDR: clock_setColourSeconds(UART_RxBuf[2], UART_RxBuf[3], UART_RxBuf[4]); break; case NV_COLOUR_BACKGND_ADDR: clock_setColourBackground(UART_RxBuf[2], UART_RxBuf[3], UART_RxBuf[4]); break; default: break; } if(HAL_OK == status){ CDC_Transmit_FS(ok, sizeof(ok)); } else{ CDC_Transmit_FS(nok, sizeof(nok)); } } void setRxFlag(void){ RxComplete_fl = 1; } void RxCpltCallback(){ if(RxComplete_fl == 1){ RxComplete_fl = 0; cmd_UART_Request(); } } void cmd_UART_Request(void){ uartMessage_s* msg = (uartMessage_s*) &UART_RxBuf[0]; cmd_RunCommand((uint8_t) msg->cmdId, (uint32_t*) &msg->bytes); } void cmd_RunCommand(commands_e cmd, uint32_t* input){ uint32_t i = *input; if(cmd < com_MAX_command){ commands[cmd](i); } } void cmd_WhoAmI(uint32_t){ CDC_Transmit_FS(myId, sizeof(myId)); } void cmd_SetTime(uint32_t time){ uint8_t h, m, s; h = time & 0xFF; m = time >> 8 & 0xFF; s = time >> 16 & 0xFF; ds1307_set_hour(h); ds1307_set_minutes(m); ds1307_set_second(s); CDC_Transmit_FS(ok, sizeof(ok)); } void cmd_GetTime(uint32_t time){ extern ds1307_dev_t my_rtc; uint8_t msg[6] = {0}; //uint8_t resp[] = "Hello Ewaryst\n"; // sprintf(resp, "%d, %d, %d, \n", my_rtc.hours, my_rtc.minutes, my_rtc.seconds); msg[0] = com_getTime + 200; msg[1] = my_rtc.hours; msg[2] = my_rtc.minutes; msg[3] = my_rtc.seconds; msg[4] = 251; msg[5] = 44; CDC_Transmit_FS(msg, sizeof(msg)); } void cmd_setColour_hour(uint32_t colour){ uint8_t r, g, b; r = colour & 0xFF; g = colour >> 8 & 0xFF; b = colour >> 16 & 0xFF; clock_setColourHours(r, g, b); uint8_t nv[] = { NV_COLOUR_HOURS_ADDR, r, g, b }; cmd_writeNV((uint32_t) nv); CDC_Transmit_FS(ok, sizeof(ok)); } void cmd_setColour_minute(uint32_t colour){ uint8_t r, g, b; r = colour & 0xFF; g = colour >> 8 & 0xFF; b = colour >> 16 & 0xFF; clock_setColourMinutes(r, g, b); uint8_t nv[] = { NV_COLOUR_MINUTES_ADDR, r, g, b }; cmd_writeNV((uint32_t) nv); CDC_Transmit_FS(ok, sizeof(ok)); } void cmd_setColour_second(uint32_t colour){ uint8_t r, g, b; r = colour & 0xFF; g = colour >> 8 & 0xFF; b = colour >> 16 & 0xFF; clock_setColourSeconds(r, g, b); uint8_t nv[] = { NV_COLOUR_SECONDS_ADDR, r, g, b }; cmd_writeNV((uint32_t) nv); CDC_Transmit_FS(ok, sizeof(ok)); } void cmd_setColour_background(uint32_t colour){ uint8_t r, g, b; r = colour & 0xFF; g = colour >> 8 & 0xFF; b = colour >> 16 & 0xFF; clock_setColourBackground(r, g, b); uint8_t nv[] = { NV_COLOUR_BACKGND_ADDR, r, g, b }; cmd_writeNV((uint32_t) nv); CDC_Transmit_FS(ok, sizeof(ok)); }