Files
RingClock/Core/Src/myComms.c
2026-04-03 19:13:28 +02:00

255 lines
3.8 KiB
C

/*
* 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,
cmd_SetTime,
cmd_GetTime,
cmd_setColour_hour,
cmd_setColour_minute,
cmd_setColour_second,
cmd_setColour_background,
cmd_readNV,
cmd_writeNV,
cmd_setColour_second
};
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);
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));
}