Update firmware version to 1.0.10, add hv_tick parameter to PSU control, enhance serial control with response handling, and improve stop button control logic.
This commit is contained in:
+53
-12
@@ -2,12 +2,15 @@
|
||||
#include "usart.h"
|
||||
#include "board.h"
|
||||
#include "serial.h"
|
||||
#include "debug.h"
|
||||
|
||||
// Приватные функции
|
||||
static uint32_t calculate_crc32(const uint8_t* data, uint16_t length);
|
||||
static uint16_t encode_packet(const uint8_t* payload, uint16_t payload_len, uint8_t* output, uint8_t response_code);
|
||||
static uint8_t parse_packet(const uint8_t* packet_data, uint16_t packet_len, ReceivedCommand_t* out_cmd);
|
||||
static uint8_t process_received_packet(SerialControl_t *ctx, const uint8_t* packet_data, uint16_t packet_len);
|
||||
static void SC_ArmUart2Rx(void);
|
||||
static void SC_ArmUart5Rx(void);
|
||||
|
||||
uint8_t test_crc_invalid = 0;
|
||||
|
||||
@@ -76,8 +79,8 @@ void SC_Init() {
|
||||
|
||||
void SC_Task() {
|
||||
// Запуск приема в режиме прерывания с ожиданием idle
|
||||
if((huart2.RxState == HAL_UART_STATE_READY) && (serial_control.command_ready == 0)) HAL_UARTEx_ReceiveToIdle_IT(&huart2, serial_control.rx_buffer, MAX_RX_BUFFER_SIZE - 1);
|
||||
if((huart5.RxState == HAL_UART_STATE_READY)) HAL_UARTEx_ReceiveToIdle_IT(&huart5, serial_iso.rx_buffer, MAX_RX_BUFFER_SIZE - 1);
|
||||
SC_ArmUart2Rx();
|
||||
SC_ArmUart5Rx();
|
||||
|
||||
// Проверка таймаута отправки пакета (больше 100 мс)
|
||||
if (huart2.gState == HAL_UART_STATE_BUSY_TX && serial_control.tx_tick != 0) {
|
||||
@@ -92,31 +95,57 @@ void SC_Task() {
|
||||
|
||||
// Проверка наличия принятой команды для обработки
|
||||
if (serial_control.command_ready && (huart2.gState != HAL_UART_STATE_BUSY_TX)) {
|
||||
// HAL_Delay(2);
|
||||
g_sc_command_source = SC_SOURCE_UART2;
|
||||
SC_CommandHandler(&serial_control.received_command);
|
||||
HAL_UARTEx_ReceiveToIdle_IT(&huart2, serial_control.rx_buffer, MAX_RX_BUFFER_SIZE - 1);
|
||||
serial_control.command_ready = 0; // Сбрасываем флаг
|
||||
SC_ArmUart2Rx();
|
||||
}
|
||||
|
||||
if (serial_control.response_pending && (huart2.gState != HAL_UART_STATE_BUSY_TX)) {
|
||||
SC_SendPacket(NULL, 0, serial_control.response_code);
|
||||
serial_control.response_pending = 0;
|
||||
}
|
||||
|
||||
if (serial_iso.command_ready) {
|
||||
g_sc_command_source = SC_SOURCE_UART5;
|
||||
SC_CommandHandler((ReceivedCommand_t*)&serial_iso.received_command);
|
||||
serial_iso.command_ready = 0;
|
||||
SC_ArmUart5Rx();
|
||||
}
|
||||
}
|
||||
|
||||
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size) {
|
||||
if (huart->Instance == huart2.Instance) {
|
||||
if(!process_received_packet(&serial_control, serial_control.rx_buffer, Size)){
|
||||
SC_SendPacket(NULL, 0, RESP_INVALID);
|
||||
if (!process_received_packet(&serial_control, serial_control.rx_buffer, Size)) {
|
||||
serial_control.response_pending = 1;
|
||||
serial_control.response_code = RESP_INVALID;
|
||||
SC_ArmUart2Rx();
|
||||
}
|
||||
g_sc_command_source = SC_SOURCE_UART2;
|
||||
HAL_UARTEx_ReceiveToIdle_IT(&huart2, serial_control.rx_buffer, MAX_RX_BUFFER_SIZE - 1);
|
||||
} else if (huart->Instance == huart5.Instance) {
|
||||
if (process_received_packet(&serial_iso, serial_iso.rx_buffer, Size)) {
|
||||
g_sc_command_source = SC_SOURCE_UART5;
|
||||
SC_CommandHandler((ReceivedCommand_t*)&serial_iso.received_command);
|
||||
if (!process_received_packet(&serial_iso, serial_iso.rx_buffer, Size)) {
|
||||
SC_ArmUart5Rx();
|
||||
}
|
||||
HAL_UARTEx_ReceiveToIdle_IT(&huart5, serial_iso.rx_buffer, MAX_RX_BUFFER_SIZE - 1);
|
||||
} else if (huart->Instance == huart3.Instance) {
|
||||
CCS_RxEventCallback(huart, Size);
|
||||
}
|
||||
}
|
||||
|
||||
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) {
|
||||
if (huart->Instance == huart2.Instance) {
|
||||
uint32_t uart_error = HAL_UART_GetError(huart);
|
||||
log_printf(LOG_WARN, "USART2 rx error: 0x%08lx\n", uart_error);
|
||||
SC_ArmUart2Rx();
|
||||
} else if (huart->Instance == huart5.Instance) {
|
||||
uint32_t uart_error = HAL_UART_GetError(huart);
|
||||
log_printf(LOG_WARN, "UART5 rx error: 0x%08lx\n", uart_error);
|
||||
SC_ArmUart5Rx();
|
||||
} else if (huart->Instance == huart3.Instance) {
|
||||
uint32_t uart_error = HAL_UART_GetError(huart);
|
||||
log_printf(LOG_WARN, "USART3 rx error: 0x%08lx\n", uart_error);
|
||||
CCS_RxArm();
|
||||
}
|
||||
}
|
||||
|
||||
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) {
|
||||
if (huart->Instance == huart2.Instance) {
|
||||
HAL_GPIO_WritePin(USART2_DIR_GPIO_Port, USART2_DIR_Pin, GPIO_PIN_RESET);
|
||||
@@ -124,6 +153,18 @@ void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) {
|
||||
}
|
||||
}
|
||||
|
||||
static void SC_ArmUart2Rx(void) {
|
||||
if ((&huart2)->RxState == HAL_UART_STATE_READY && serial_control.command_ready == 0) {
|
||||
(void)HAL_UARTEx_ReceiveToIdle_IT(&huart2, serial_control.rx_buffer, MAX_RX_BUFFER_SIZE - 1);
|
||||
}
|
||||
}
|
||||
|
||||
static void SC_ArmUart5Rx(void) {
|
||||
if ((&huart5)->RxState == HAL_UART_STATE_READY && serial_iso.command_ready == 0) {
|
||||
(void)HAL_UARTEx_ReceiveToIdle_IT(&huart5, serial_iso.rx_buffer, MAX_RX_BUFFER_SIZE - 1);
|
||||
}
|
||||
}
|
||||
|
||||
// Приватные функции реализации
|
||||
|
||||
// Полностью программная реализация CRC-32 (полином CRC32_POLYNOMIAL, порядок little-endian)
|
||||
|
||||
Reference in New Issue
Block a user