Convert To CMake to use CLion + New comm system to send / receive array of data and not one by one

This commit is contained in:
acki
2025-12-11 22:59:12 +01:00
parent 79ccd83cc0
commit 19e8ec39cd
6 changed files with 228 additions and 43 deletions

View File

@@ -35,3 +35,8 @@ SourcePath#1=..\USB_Device\Target
SourcePath#2=..\Core\Src
SourceFiles=;
[PreviousUsedCMakes]
SourceFiles=Core\Src\main.c;USB_Device\App\usb_device.c;USB_Device\Target\usbd_conf.c;USB_Device\App\usbd_desc.c;USB_Device\App\usbd_cdc_if.c;Core\Src\stm32g4xx_it.c;Core\Src\stm32g4xx_hal_msp.c;Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_pcd.c;Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_pcd_ex.c;Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_ll_usb.c;Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal.c;Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_rcc.c;Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_rcc_ex.c;Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_flash.c;Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_flash_ex.c;Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_flash_ramfunc.c;Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_gpio.c;Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_exti.c;Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_dma.c;Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_dma_ex.c;Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_pwr.c;Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_pwr_ex.c;Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_cortex.c;Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_i2c.c;Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_i2c_ex.c;Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_tim.c;Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_tim_ex.c;Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_uart.c;Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_uart_ex.c;Middlewares\ST\STM32_USB_Device_Library\Core\Src\usbd_core.c;Middlewares\ST\STM32_USB_Device_Library\Core\Src\usbd_ctlreq.c;Middlewares\ST\STM32_USB_Device_Library\Core\Src\usbd_ioreq.c;Middlewares\ST\STM32_USB_Device_Library\Class\CDC\Src\usbd_cdc.c;Drivers\CMSIS\Device\ST\STM32G4xx\Source\Templates\system_stm32g4xx.c;Core\Src\system_stm32g4xx.c;Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_pcd.c;Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_pcd_ex.c;Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_ll_usb.c;Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal.c;Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_rcc.c;Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_rcc_ex.c;Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_flash.c;Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_flash_ex.c;Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_flash_ramfunc.c;Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_gpio.c;Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_exti.c;Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_dma.c;Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_dma_ex.c;Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_pwr.c;Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_pwr_ex.c;Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_cortex.c;Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_i2c.c;Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_i2c_ex.c;Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_tim.c;Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_tim_ex.c;Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_uart.c;Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_uart_ex.c;Middlewares\ST\STM32_USB_Device_Library\Core\Src\usbd_core.c;Middlewares\ST\STM32_USB_Device_Library\Core\Src\usbd_ctlreq.c;Middlewares\ST\STM32_USB_Device_Library\Core\Src\usbd_ioreq.c;Middlewares\ST\STM32_USB_Device_Library\Class\CDC\Src\usbd_cdc.c;Drivers\CMSIS\Device\ST\STM32G4xx\Source\Templates\system_stm32g4xx.c;Core\Src\system_stm32g4xx.c;;;Middlewares\ST\STM32_USB_Device_Library\Core\Src\usbd_core.c;Middlewares\ST\STM32_USB_Device_Library\Core\Src\usbd_ctlreq.c;Middlewares\ST\STM32_USB_Device_Library\Core\Src\usbd_ioreq.c;Middlewares\ST\STM32_USB_Device_Library\Class\CDC\Src\usbd_cdc.c;
HeaderPath=Drivers\STM32G4xx_HAL_Driver\Inc;Drivers\STM32G4xx_HAL_Driver\Inc\Legacy;Middlewares\ST\STM32_USB_Device_Library\Core\Inc;Middlewares\ST\STM32_USB_Device_Library\Class\CDC\Inc;Drivers\CMSIS\Device\ST\STM32G4xx\Include;Drivers\CMSIS\Include;USB_Device\App;USB_Device\Target;Core\Inc;
CDefines=USE_HAL_DRIVER;STM32G491xx;USE_HAL_DRIVER;USE_HAL_DRIVER;

View File

@@ -5,7 +5,7 @@
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="1707420184305140588" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="85726625939271877" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<language-scope id="org.eclipse.cdt.core.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/>
</provider>
@@ -16,7 +16,7 @@
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="1707420184305140588" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="85726625939271877" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<language-scope id="org.eclipse.cdt.core.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/>
</provider>

View File

@@ -38,6 +38,7 @@ void PCA9685_ContinuousServoStop(uint8_t Channel);
void PCA9685_LEDOn(uint8_t Channel);
void PCA9685_LEDOff(uint8_t Channel);
uint16_t getServoPos(uint16_t servoNum);
uint16_t getRelayState(uint16_t relayNum);
uint16_t getAscPos();
void moveServo(uint16_t servoNum, uint16_t posNum);
void moveRelay(uint16_t relayNum, uint16_t state);

View File

@@ -211,6 +211,11 @@ uint16_t getServoPos(uint16_t servoNum){
return act.positionServo[servoNum];
}
uint16_t getRelayState(uint16_t relayNum)
{
return HAL_GPIO_ReadPin(act.relayPorts[relayNum-1], act.relayPortsNumbers[relayNum-1]);
}
uint16_t getAscPos(){
return act.positionAscenseur;
}

View File

@@ -26,7 +26,7 @@ static PendingEvent pendingEvents[MAX_PENDING_EVENTS];
// ==================== Fonctions utilitaires ====================
void send_event(int idx) {
char msg[64];
char msg[128];
sprintf(msg, "EVENT;%s;%s\n", pendingEvents[idx].evt, pendingEvents[idx].info);
CDC_Transmit_FS((uint8_t*)msg, strlen(msg));
}
@@ -35,7 +35,9 @@ void queue_event(const char *evt, const char *info) {
for (int i = 0; i < MAX_PENDING_EVENTS; ++i) {
if (!pendingEvents[i].active) {
strncpy(pendingEvents[i].evt, evt, sizeof(pendingEvents[i].evt) - 1);
pendingEvents[i].evt[sizeof(pendingEvents[i].evt)-1] = '\0';
strncpy(pendingEvents[i].info, info, sizeof(pendingEvents[i].info) - 1);
pendingEvents[i].info[sizeof(pendingEvents[i].info)-1] = '\0';
pendingEvents[i].lastSentTimestamp = HAL_GetTick();
pendingEvents[i].retryCount = 0;
pendingEvents[i].active = 1;
@@ -59,7 +61,7 @@ void check_event_timeouts(void) {
// ==================== Traitement du protocole ====================
void USBProtocol_ProcessCommand(char *cmd) {
char response[128];
char response[256];
char *type = strtok(cmd, ";");
char *arg1 = strtok(NULL, ";");
char *arg2 = strtok(NULL, ";");
@@ -68,51 +70,223 @@ void USBProtocol_ProcessCommand(char *cmd) {
if (!type || !arg1 || !arg2) return;
if (strcmp(type, "GET") == 0) {
if (strncmp(arg1, "SERVO", 5) == 0 && strcmp(arg2, "POS") == 0) {
int n = atoi(arg1 + 5);
int pos = getServoPos(n);
sprintf(response, "SET;%s;%s;%d\n", arg1, arg2, pos);
if (strcmp(arg1, "SERVO") == 0 && strcmp(arg2, "POS") == 0) {
if (!arg3) {
snprintf(response, sizeof(response), "KO;SET;%s;%s\n", arg1, arg2);
CDC_Transmit_FS((uint8_t*)response, strlen(response));
return;
}
int n = atoi(arg3);
if (n <= 0) {
snprintf(response, sizeof(response), "SET;%s;%s;0\n", arg1, arg2);
CDC_Transmit_FS((uint8_t*)response, strlen(response));
return;
}
size_t off = 0;
int success = 1;
off += snprintf(response + off, sizeof(response) - off, "SET;%s;%s;%d", arg1, arg2, n);
for (int i = 0; i < n; ++i) {
char *servoIdStr = strtok(NULL, ";");
if (!servoIdStr) {
success = 0;
break;
}
int servoId = atoi(servoIdStr);
int pos = getServoPos(servoId);
/* append \";id;pos\" for each servo, check remaining buffer */
int wrote = snprintf(response + off, sizeof(response) - off, ";%d;%d", servoId, pos);
if (wrote < 0 || (size_t)wrote >= sizeof(response) - off) {
success = 0;
break;
}
off += wrote;
}
if (!success) {
snprintf(response, sizeof(response), "KO;SET;%s;%s\n", arg1, arg2);
} else {
/* terminate with newline */
if (off < sizeof(response) - 1) {
response[off++] = '\n';
response[off] = '\0';
} else {
/* fallback if no room for newline */
response[sizeof(response) - 1] = '\0';
}
}
CDC_Transmit_FS((uint8_t*)response, strlen(response));
} else if (strcmp(arg1, "RELAY") == 0 && strcmp(arg2, "STATE") == 0) {
if (!arg3) {
snprintf(response, sizeof(response), "KO;SET;%s;%s\n", arg1, arg2);
CDC_Transmit_FS((uint8_t*)response, strlen(response));
return;
}
int n = atoi(arg3);
if (n <= 0) {
snprintf(response, sizeof(response), "SET;%s;%s;0\n", arg1, arg2);
CDC_Transmit_FS((uint8_t*)response, strlen(response));
return;
}
size_t off = 0;
int success = 1;
off += snprintf(response + off, sizeof(response) - off, "SET;%s;%s;%d", arg1, arg2, n);
for (int i = 0; i < n; ++i) {
char *relayIdStr = strtok(NULL, ";");
if (!relayIdStr) {
success = 0;
break;
}
int relayId = atoi(relayIdStr);
int state = getRelayState(relayId);
int wrote = snprintf(response + off, sizeof(response) - off, ";%d;%d", relayId, state);
if (wrote < 0 || (size_t)wrote >= sizeof(response) - off) {
success = 0;
break;
}
off += wrote;
}
if (!success) {
snprintf(response, sizeof(response), "KO;SET;%s;%s\n", arg1, arg2);
} else {
if (off < sizeof(response) - 1) {
response[off++] = '\n';
response[off] = '\0';
} else {
response[sizeof(response) - 1] = '\0';
}
}
CDC_Transmit_FS((uint8_t*)response, strlen(response));
}
} else if (strcmp(type, "SET") == 0 && arg3) {
int val = atoi(arg3);
bool success = 1;
int success = 1;
if (strcmp(arg1, "TIR") == 0 && strcmp(arg2, "ARM") == 0) {
int val = atoi(arg3);
if(val){
armTirette();
armTirette();
} else {
disarmTirette();
disarmTirette();
}
} else if (strncmp(arg1, "SERVO", 5) == 0 && strncmp(arg2, "POS", 3) == 0){
int n = atoi(arg1 + 5);
int pos = atoi(arg2 + 3);
setServoPosValue(n, pos, val);
}
sprintf(response, "%s;%s;%s;%d\n", success ? "OK" : "KO", arg1, arg2, val);
CDC_Transmit_FS((uint8_t*)response, strlen(response));
} else if (strcmp(type, "MOV") == 0) {
bool success = 1;
if (strncmp(arg1, "SERVO", 5) == 0) {
int n = atoi(arg1 + 5);
int pos = atoi(arg2 + 3);
if(n == 5){
if(pos == 1){
PCA9685_ContinuousServoRun(n);
} else {
PCA9685_ContinuousServoStop(n);
}
} else {
moveServo(n, pos);
}
} else if (strncmp(arg1, "RELAY", 5) == 0) {
int n = atoi(arg1 + 5);
int state = atoi(arg2);
moveRelay(n, state);
}
sprintf(response, "%s;%s;%s\n", success ? "OK" : "KO", arg1, arg2);
CDC_Transmit_FS((uint8_t*)response, strlen(response));
sprintf(response, "%s;%s;%s;%d\n", success ? "OK" : "KO", arg1, arg2, val);
CDC_Transmit_FS((uint8_t*)response, strlen(response));
} else if (strcmp(arg1, "SERVO") == 0 && strcmp(arg2, "POS") == 0){
int n = atoi(arg3);
size_t off = 0;
off += snprintf(response + off, sizeof(response) - off, "%s;%s;%s;%d", "OK", arg1, arg2, n);
for (int i = 0; i < n; ++i) {
char *servoIdStr = strtok(NULL, ";");
char *posStr = strtok(NULL, ";");
char *angleStr = strtok(NULL, ";");
if (!servoIdStr || !posStr || !angleStr) {
success = 0;
break;
}
int servoId = atoi(servoIdStr);
int pos = atoi(posStr);
int angle = atoi(angleStr);
setServoPosValue(servoId, pos, angle);
int wrote = snprintf(response + off, sizeof(response) - off, ";%d;%d", servoId, pos);
if (wrote < 0 || (size_t)wrote >= sizeof(response) - off) {
success = 0;
break;
}
off += wrote;
}
if (!success) {
snprintf(response, sizeof(response), "KO;%s;%s\n", arg1, arg2);
} else {
if (off < sizeof(response) - 1) {
response[off++] = '\n';
response[off] = '\0';
} else {
response[sizeof(response) - 1] = '\0';
}
}
CDC_Transmit_FS((uint8_t*)response, strlen(response));
}
} else if (strcmp(type, "MOV") == 0) {
int success = 1;
if (strcmp(arg1, "SERVO") == 0) {
int n = atoi(arg2);
size_t off = 0;
off += snprintf(response + off, sizeof(response) - off, "%s;%s;%s;%d", "OK", arg1, arg2, n);
for (int i = 0; i < n; ++i) {
char *servoIdStr = strtok(NULL, ";");
char *posStr = strtok(NULL, ";");
if (!servoIdStr || !posStr) {
success = 0;
break;
}
int servoId = atoi(servoIdStr);
int pos = atoi(posStr);
moveServo(servoId, pos);
int wrote = snprintf(response + off, sizeof(response) - off, ";%d;%d", servoId, pos);
if (wrote < 0 || (size_t)wrote >= sizeof(response) - off) {
success = 0;
break;
}
off += wrote;
}
if (!success) {
snprintf(response, sizeof(response), "KO;MOV;%s;%s\n", arg1, arg2);
} else {
if (off < sizeof(response) - 1) {
response[off++] = '\n';
response[off] = '\0';
} else {
response[sizeof(response) - 1] = '\0';
}
}
CDC_Transmit_FS((uint8_t*)response, strlen(response));
} else if (strcmp(arg1, "RELAY") == 0) {
int n = atoi(arg2);
size_t off = 0;
off += snprintf(response + off, sizeof(response) - off, "%s;%s;%s;%d", "OK", arg1, arg2, n);
for (int i = 0; i < n; ++i) {
char *relayIdStr = strtok(NULL, ";");
char *stateStr = strtok(NULL, ";");
if (!relayIdStr || !stateStr) {
success = 0;
break;
}
int relayId = atoi(relayIdStr);
int state = atoi(stateStr);
moveRelay(relayId, state);
int wrote = snprintf(response + off, sizeof(response) - off, ";%d;%d", relayId, state);
if (wrote < 0 || (size_t)wrote >= sizeof(response) - off) {
success = 0;
break;
}
off += wrote;
}
if (!success) {
snprintf(response, sizeof(response), "KO;MOV;%s;%s\n", arg1, arg2);
} else {
if (off < sizeof(response) - 1) {
response[off++] = '\n';
response[off] = '\0';
} else {
response[sizeof(response) - 1] = '\0';
}
}
CDC_Transmit_FS((uint8_t*)response, strlen(response));
}
} else if (strcmp(type, "ACK") == 0) {
// Réception d'un ACK d'évènement
for (int i = 0; i < MAX_PENDING_EVENTS; ++i) {

View File

@@ -129,6 +129,7 @@ PF1-OSC_OUT.Signal=GPIO_Output
PinOutPanel.RotationAngle=0
ProjectManager.AskForMigrate=true
ProjectManager.BackupPrevious=false
ProjectManager.CompilerLinker=GCC
ProjectManager.CompilerOptimize=6
ProjectManager.ComputerToolchain=false
ProjectManager.CoupleFile=false
@@ -152,11 +153,11 @@ ProjectManager.ProjectName=pcb_actio
ProjectManager.ProjectStructure=
ProjectManager.RegisterCallBack=
ProjectManager.StackSize=0x400
ProjectManager.TargetToolchain=STM32CubeIDE
ProjectManager.TargetToolchain=CMake
ProjectManager.ToolChainLocation=
ProjectManager.UAScriptAfterPath=
ProjectManager.UAScriptBeforePath=
ProjectManager.UnderRoot=true
ProjectManager.UnderRoot=false
ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_I2C1_Init-I2C1-false-HAL-true,4-MX_USART1_UART_Init-USART1-false-HAL-true,5-MX_USB_Device_Init-USB_DEVICE-false-HAL-false,6-MX_TIM1_Init-TIM1-false-HAL-true
RCC.AHBFreq_Value=16000000
RCC.APB1Freq_Value=16000000
@@ -222,4 +223,3 @@ VP_TIM1_VS_no_output1.Signal=TIM1_VS_no_output1
VP_USB_DEVICE_VS_USB_DEVICE_CDC_FS.Mode=CDC_FS
VP_USB_DEVICE_VS_USB_DEVICE_CDC_FS.Signal=USB_DEVICE_VS_USB_DEVICE_CDC_FS
board=custom
isbadioc=false