From 4d01405ad9016a393aad94d927c0445609114a8f Mon Sep 17 00:00:00 2001 From: ackimixs Date: Sat, 20 Dec 2025 21:45:57 +0100 Subject: [PATCH] fix (not tested) --- .settings/language.settings.xml | 4 ++-- Core/Src/actio.c | 4 ++-- Core/Src/comm.c | 31 ++++++++++++++++++++++++++++++- 3 files changed, 34 insertions(+), 5 deletions(-) diff --git a/.settings/language.settings.xml b/.settings/language.settings.xml index ba65c38..4dfee89 100644 --- a/.settings/language.settings.xml +++ b/.settings/language.settings.xml @@ -5,7 +5,7 @@ - + @@ -16,7 +16,7 @@ - + diff --git a/Core/Src/actio.c b/Core/Src/actio.c index 9f9b0ca..d454120 100644 --- a/Core/Src/actio.c +++ b/Core/Src/actio.c @@ -51,10 +51,10 @@ void PCA9685_SetPWMFrequency(uint8_t Address, uint16_t frequency) if(frequency >= 1526) prescale = 0x03; else if(frequency <= 24) prescale = 0xFF; // internal 25 MHz oscillator as in the datasheet page no 1/52 - else prescale = 25000000 / (4096 * frequency); + else prescale = (uint8_t)(25000000 / (4096 * frequency)) - 1; // prescale changes 3 to 255 for 1526Hz to 24Hz as in the datasheet page no 1/52 PCA9685_SetBit(Address, PCA9685_MODE1, PCA9685_MODE1_SLEEP_BIT, 1); - HAL_I2C_Mem_Write(&hi2c1, Address, PCA9685_PRE_SCALE, 1, &prescale, 1, 10); + HAL_I2C_Mem_Write(&hi2c1, Address << 1, PCA9685_PRE_SCALE, 1, &prescale, 1, 10); PCA9685_SetBit(Address, PCA9685_MODE1, PCA9685_MODE1_SLEEP_BIT, 0); PCA9685_SetBit(Address, PCA9685_MODE1, PCA9685_MODE1_RESTART_BIT, 1); } diff --git a/Core/Src/comm.c b/Core/Src/comm.c index 1f83210..2c3eecb 100644 --- a/Core/Src/comm.c +++ b/Core/Src/comm.c @@ -7,6 +7,7 @@ #define USB_RX_BUFFER_SIZE 256 static char usb_rx_buffer[USB_RX_BUFFER_SIZE]; +static uint16_t usb_rx_len = 0; // ==================== Événements en attente d'ACK ==================== @@ -283,7 +284,7 @@ void USBProtocol_ProcessCommand(char *cmd) { } } -void USBProtocol_Receive(uint8_t* Buf, uint32_t Len) { +/*void USBProtocol_Receive(uint8_t* Buf, uint32_t Len) { if (Len >= USB_RX_BUFFER_SIZE) return; memcpy(usb_rx_buffer, Buf, Len); usb_rx_buffer[Len] = '\0'; @@ -293,4 +294,32 @@ void USBProtocol_Receive(uint8_t* Buf, uint32_t Len) { USBProtocol_ProcessCommand(line); line = strtok(NULL, "\n"); } +}*/ + +void USBProtocol_Receive(uint8_t* Buf, uint32_t Len) +{ + if (Len == 0) return; + + /* overflow protection */ + if (usb_rx_len + Len >= USB_RX_BUFFER_SIZE) { + usb_rx_len = 0; // drop frame safely + return; + } + + memcpy(&usb_rx_buffer[usb_rx_len], Buf, Len); + usb_rx_len += Len; + usb_rx_buffer[usb_rx_len] = '\0'; + + char *start = usb_rx_buffer; + char *nl; + + while ((nl = strchr(start, '\n')) != NULL) { + *nl = '\0'; + USBProtocol_ProcessCommand(start); + start = nl + 1; + } + + /* keep remaining partial command */ + usb_rx_len = strlen(start); + memmove(usb_rx_buffer, start, usb_rx_len); } \ No newline at end of file