From 88c1a4cf5769482a5538a43a6b0cd4b5b72af041 Mon Sep 17 00:00:00 2001 From: cfif Date: Wed, 8 Apr 2026 14:14:06 +0300 Subject: [PATCH] Init --- ArbiterCommand.c | 170 ++++++++++++++++++++++++++++++++++++++++++++++- ArbiterCommand.h | 48 +++++++++++++ 2 files changed, 215 insertions(+), 3 deletions(-) diff --git a/ArbiterCommand.c b/ArbiterCommand.c index a8d801d..e644840 100644 --- a/ArbiterCommand.c +++ b/ArbiterCommand.c @@ -8,6 +8,7 @@ #include "AtCmdCommonProtected.h" #include "AsciiStringParsingUtils.h" #include "memory.h" +#include /* void sendOk(tAtCmd *AtCmd) { @@ -445,7 +446,7 @@ static _Noreturn void Serial_UART_Thread(tTaskSerial *env) { // if (osMutexAcquire(env->access, 1000) == osOK) { - SerialCommand_Scheduler(env); + SerialCommand_Scheduler(env); // osMutexRelease(env->access); // } @@ -504,7 +505,7 @@ static _Noreturn void Serial_USB_Thread(tTaskSerial *env) { // if (osMutexAcquire(env->access, 1000) == osOK) { - SerialCommand_Scheduler(env); + SerialCommand_Scheduler(env); // osMutexRelease(env->access); // } @@ -521,4 +522,167 @@ void TaskSerialUSB_StartThread(tTaskSerial *env) { //конец ------------------------------Обработчик UART USB команд------------------------------------------------------- //конец ------------------------------Обработчик UART USB команд------------------------------------------------------- -//конец ------------------------------Обработчик UART USB команд------------------------------------------------------- \ No newline at end of file +//конец ------------------------------Обработчик UART USB команд------------------------------------------------------- + + + +void toAddPrefixStr(char *out, char *in, size_t len) { + + if (len <= strlen(in)) { + out[0] = '\0'; + strcat(out, in); + return; + } + + size_t countPrefix = len - strlen(in); + + for (size_t i = 0; i < countPrefix; ++i) + out[i] = '0'; + + out[countPrefix] = '\0'; + + strcat(out, in); +} + + +void SerialReceivedCommand_Scheduler(tTaskReceivedSerial *env) { + uint16_t recv; + + if (env->from_uart == FROM_UART) { + recv = env->ioCAN->receive0(env->ioCAN->env, (uint8_t *) &env->canFrame, 1, 1000); + + } else { + recv = env->ioCAN->receive1(env->ioCAN->env, (uint8_t *) &env->canFrame, 1, 1000); + } + + env->text[0] = '\0'; + + if (env->canFrame.id_type == CAN_ID_STANDARD) { + strcat(env->text, "T"); // команда + + strcat(env->text, "00"); // Без ожидания OK + strcat(env->text, "00"); // признак команда (00) + utoa(env->canFrame.standard_id, env->buf, 16); + toAddPrefixStr(env->bufWithPrefix, env->buf, 4); + strcat(env->text, env->bufWithPrefix); // Адрес + + for (uint8_t i = 0; i < env->canFrame.dlc; ++i) { + utoa(env->canFrame.data[i], env->buf, 16); + toAddPrefixStr(env->bufWithPrefix, env->buf, 2); + strcat(env->text, env->bufWithPrefix); // Адрес + } + + strcat(env->text, "\r\n"); // CR + } else { + strcat(env->text, "t"); // команда + + strcat(env->text, "00"); // Без ожидания OK + strcat(env->text, "00"); // признак команда (00) + utoa(env->canFrame.extended_id, env->buf, 16); + toAddPrefixStr(env->bufWithPrefix, env->buf, 8); + strcat(env->text, env->bufWithPrefix); // Адрес + + for (uint8_t i = 0; i < env->canFrame.dlc; ++i) { + utoa(env->canFrame.data[i], env->buf, 16); + toAddPrefixStr(env->bufWithPrefix, env->buf, 2); + strcat(env->text, env->bufWithPrefix); // Адрес + } + + strcat(env->text, "\r\n"); // CR + } + + env->ioUART->transmit(env->ioUART->env, (uint8_t *)env->text, strlen(env->text), 1000); +} + + + +//начало ------------------------------Обработчик очереди ВХОДЯЩИХ UART команд----------------------------------------------------------- +//начало ------------------------------Обработчик очереди ВХОДЯЩИХ UART команд----------------------------------------------------------- +//начало ------------------------------Обработчик очереди ВХОДЯЩИХ UART команд----------------------------------------------------------- + +void Task_RECEIVED_SerialUART_Init(tTaskReceivedSerial *env, + tSerialPortFrameIO *ioCAN, + tFrom_uart from_uart, + tSerialPortIO *ioUART) { + +// env->access = osMutexNew(NULL); + env->from_uart = from_uart; + env->ioUART = ioUART; + env->ioCAN = ioCAN; + + SerialPortClearRxBuffer(env->ioUART); + + InitThreadAtrStatic(&env->thread.attr, "SerialReceivedCanUART", env->thread.controlBlock, env->thread.stack, + osPriorityNormal); +} + + +static _Noreturn void Serial_RECEIVED_UART_Thread(tTaskReceivedSerial *env) { + for (;;) { + +// if (osMutexAcquire(env->access, 1000) == osOK) { + + SerialReceivedCommand_Scheduler(env); + +// osMutexRelease(env->access); +// } + + SystemDelayMs(1); + } +} + +void Task_RECEIVED_SerialUART_StartThread(tTaskReceivedSerial *env) { + if (!env->thread.id) { + env->thread.id = osThreadNew((osThreadFunc_t) (Serial_RECEIVED_UART_Thread), (void *) (env), &env->thread.attr); + } +} + +//конец ------------------------------Обработчик очереди ВХОДЯЩИХ UART команд----------------------------------------------------------- +//конец ------------------------------Обработчик очереди ВХОДЯЩИХ UART команд----------------------------------------------------------- +//конец ------------------------------Обработчик очереди ВХОДЯЩИХ UART команд----------------------------------------------------------- + + +//начало ------------------------------Обработчик очереди ВХОДЯЩИХ UART USB команд------------------------------------------------------- +//начало ------------------------------Обработчик очереди ВХОДЯЩИХ UART USB команд------------------------------------------------------- +//начало ------------------------------Обработчик очереди ВХОДЯЩИХ UART USB команд------------------------------------------------------- + +void Task_RECEIVED_SerialUSB_Init(tTaskReceivedSerial *env, + tSerialPortFrameIO *ioCAN, + tFrom_uart from_uart, + tSerialPortIO *ioUART) { + +// env->access = osMutexNew(NULL); + env->from_uart = from_uart; + env->ioUART = ioUART; + env->ioCAN = ioCAN; + + SerialPortClearRxBuffer(env->ioUART); + + InitThreadAtrStatic(&env->thread.attr, "SerialReceivedCanUSB", env->thread.controlBlock, env->thread.stack, + osPriorityNormal); +} + + +static _Noreturn void Serial_RECEIVED_USB_Thread(tTaskReceivedSerial *env) { + for (;;) { + +// if (osMutexAcquire(env->access, 1000) == osOK) { + + SerialReceivedCommand_Scheduler(env); + +// osMutexRelease(env->access); +// } + + SystemDelayMs(1); + } +} + +void Task_RECEIVED_SerialUSB_StartThread(tTaskReceivedSerial *env) { + if (!env->thread.id) { + env->thread.id = osThreadNew((osThreadFunc_t) (Serial_RECEIVED_USB_Thread), (void *) (env), &env->thread.attr); + } +} + +//конец ------------------------------Обработчик очереди ВХОДЯЩИХ UART USB команд------------------------------------------------------- +//конец ------------------------------Обработчик очереди ВХОДЯЩИХ UART USB команд------------------------------------------------------- +//конец ------------------------------Обработчик очереди ВХОДЯЩИХ UART USB команд------------------------------------------------------- \ No newline at end of file diff --git a/ArbiterCommand.h b/ArbiterCommand.h index cc78893..8cae4eb 100644 --- a/ArbiterCommand.h +++ b/ArbiterCommand.h @@ -81,6 +81,29 @@ typedef struct { } tTaskSerial; + +typedef struct { + tSerialPortFrameIO *ioCAN; + tSerialPortIO *ioUART; + tFrom_uart from_uart; +// osMutexId_t access; + + can_rx_message_type canFrame; + + char text[32]; + + char buf[32]; + char bufWithPrefix[32]; + + struct { + osThreadId_t id; + uint32_t stack[1024]; + StaticTask_t controlBlock; + osThreadAttr_t attr; + } thread; + +} tTaskReceivedSerial; + void TaskSerialUART_Init(tTaskSerial *env, tFrom_uart from_uart, tSerialPortIO *ioUART, @@ -124,4 +147,29 @@ void TaskSerialToCanSpontany_Init(tTaskSerialToCanSpontany *env, void TaskSerialToCanSpontany_StartThread(tTaskSerialToCanSpontany *env); + + + + + +void Task_RECEIVED_SerialUART_Init(tTaskReceivedSerial *env, + tSerialPortFrameIO *ioCAN, + tFrom_uart from_uart, + tSerialPortIO *ioUART); + +void Task_RECEIVED_SerialUART_StartThread(tTaskReceivedSerial *env); + + + +void Task_RECEIVED_SerialUSB_Init(tTaskReceivedSerial *env, + tSerialPortFrameIO *ioCAN, + tFrom_uart from_uart, + tSerialPortIO *ioUART); + +void Task_RECEIVED_SerialUSB_StartThread(tTaskReceivedSerial *env); + + + + + #endif //HVAC_DEV_ARBITERCOMMAND_H