|
@@ -11,25 +11,21 @@
|
|
#include <stdio.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <string.h>
|
|
|
|
|
|
|
|
+#include "interprocess_data.h"
|
|
#include "measurements.h"
|
|
#include "measurements.h"
|
|
#include "mock_tasks.h"
|
|
#include "mock_tasks.h"
|
|
#include "uart_tasks.h"
|
|
#include "uart_tasks.h"
|
|
|
|
|
|
-enum SerialReceiverStates {
|
|
|
|
- srWaitForHeader,
|
|
|
|
- srCheckCrc,
|
|
|
|
- srRecieveData,
|
|
|
|
- srExecuteCmd,
|
|
|
|
- srFail,
|
|
|
|
- srFinish,
|
|
|
|
- srLast
|
|
|
|
-};
|
|
|
|
-
|
|
|
|
-osThreadId_t uart8RecieveTaskHandle;
|
|
|
|
-// osSemaphoreDef_t uart8RxSemaphoreDef;
|
|
|
|
-// osSemaphoreId_t uart8RxSemaphore = NULL;
|
|
|
|
-
|
|
|
|
-osMessageQueueId_t uart8DecodedFrameDataTaskQueue;
|
|
|
|
|
|
+enum SerialReceiverStates { srWaitForHeader, srCheckCrc, srRecieveData, srExecuteCmd, srFail, srFinish, srLast };
|
|
|
|
+
|
|
|
|
+// osThreadId_t uart8RecieveTaskHandle;
|
|
|
|
+// osThreadId_t uart8TransmitTaskHandle;
|
|
|
|
+// osSemaphoreDef_t uart8RxSemaphoreDef;
|
|
|
|
+// osSemaphoreId_t uart8RxSemaphore = NULL;
|
|
|
|
+
|
|
|
|
+// osMessageQueueId_t uart8DecodedFrameDataTaskQueue;
|
|
|
|
+// osMessageQueueId_t uart8SendCmdToSlaveQueue;
|
|
|
|
+
|
|
extern UART_HandleTypeDef huart8;
|
|
extern UART_HandleTypeDef huart8;
|
|
extern DMA_HandleTypeDef hdma_uart8_rx;
|
|
extern DMA_HandleTypeDef hdma_uart8_rx;
|
|
extern CRC_HandleTypeDef hcrc;
|
|
extern CRC_HandleTypeDef hcrc;
|
|
@@ -38,7 +34,11 @@ uint8_t uart8RxBuffer[UART8_RX_BUFF_SIZE] = { 0 };
|
|
uint8_t uart8TxBuffer[UART8_TX_BUFF_SIZE] = { 0 };
|
|
uint8_t uart8TxBuffer[UART8_TX_BUFF_SIZE] = { 0 };
|
|
uint8_t uart8TaskFrameData[INPUT_DATA_BUFF_SIZE] = { 0 };
|
|
uint8_t uart8TaskFrameData[INPUT_DATA_BUFF_SIZE] = { 0 };
|
|
|
|
|
|
-UartTaskData uart8TaskData = { 0 };
|
|
|
|
|
|
+UartTaskData uart1TaskData = { 0 }; // Board 1
|
|
|
|
+UartTaskData uart3TaskData = { 0 }; // Board 2
|
|
|
|
+UartTaskData uart6TaskData = { 0 }; // Board 3
|
|
|
|
+UartTaskData uart2TaskData = { 0 }; // Board 4
|
|
|
|
+UartTaskData uart8TaskData = { 0 }; // Debug
|
|
|
|
|
|
uint8_t outputDataBuffer[OUTPUT_DATA_BUFF_SIZE];
|
|
uint8_t outputDataBuffer[OUTPUT_DATA_BUFF_SIZE];
|
|
uint16_t outputDataBufferPos = 0;
|
|
uint16_t outputDataBufferPos = 0;
|
|
@@ -48,37 +48,51 @@ extern SesnorsInfo sensorsInfo[SLAVES_COUNT];
|
|
extern osMutexId_t resMeasurementsMutex;
|
|
extern osMutexId_t resMeasurementsMutex;
|
|
extern osMutexId_t sensorsInfoMutex;
|
|
extern osMutexId_t sensorsInfoMutex;
|
|
|
|
|
|
|
|
+extern RNG_HandleTypeDef hrng;
|
|
|
|
+
|
|
|
|
|
|
-void Uart8RxTaskInit (void) {
|
|
|
|
- osThreadAttr_t osThreadAttrUart8 = { 0 };
|
|
|
|
|
|
+void Uart8TasksInit (void) {
|
|
|
|
+ osThreadAttr_t osThreadAttrRxUart = { 0 };
|
|
|
|
+ osThreadAttr_t osThreadAttrTxUart = { 0 };
|
|
#if 0
|
|
#if 0
|
|
- osMessageQueueAttr_t uartRxMsgQueueAttr;
|
|
|
|
|
|
+ osMessageQueueAttr_t uartRxMsgQueueAttr = { 0 };
|
|
uartRxMsgQueueAttr.name = "uart8RxMsgQueue";
|
|
uartRxMsgQueueAttr.name = "uart8RxMsgQueue";
|
|
uart8DecodedFrameDataTaskQueue = osMessageQueueNew(4, sizeof(SerialProtocolFrameData), &uartRxMsgQueueAttr);
|
|
uart8DecodedFrameDataTaskQueue = osMessageQueueNew(4, sizeof(SerialProtocolFrameData), &uartRxMsgQueueAttr);
|
|
uart8TaskData.processDataQueue = uart8DecodedFrameDataTaskQueue;
|
|
uart8TaskData.processDataQueue = uart8DecodedFrameDataTaskQueue;
|
|
#else
|
|
#else
|
|
- uart8TaskData.processDataQueue = NULL;
|
|
|
|
|
|
+// uart8TaskData.processDataQueue = NULL;
|
|
#endif
|
|
#endif
|
|
|
|
|
|
- uart8TaskData.processDataCb = Uart8ReceivedDataProcessCallback;
|
|
|
|
|
|
+ uart8TaskData.processRxDataMsgBuffer = xMessageBufferCreate( INPUT_DATA_BUFF_SIZE );
|
|
|
|
+// uart8TaskData.processDataCb = Uart8ReceivedDataProcessCallback;
|
|
|
|
+ uart8TaskData.processDataCb = NULL;
|
|
|
|
|
|
- osThreadAttrUart8.name = "os_thread_uart8_rx";
|
|
|
|
- osThreadAttrUart8.stack_size = configMINIMAL_STACK_SIZE * 2;
|
|
|
|
- osThreadAttrUart8.priority = (osPriority_t)osPriorityHigh;
|
|
|
|
|
|
+ osThreadAttrRxUart.name = "os_thread_uart8_rx";
|
|
|
|
+ osThreadAttrRxUart.stack_size = configMINIMAL_STACK_SIZE * 2;
|
|
|
|
+ osThreadAttrRxUart.priority = (osPriority_t)osPriorityHigh;
|
|
|
|
|
|
// uart8RxSemaphoreDef.name = "uart8RxSemaphore";
|
|
// uart8RxSemaphoreDef.name = "uart8RxSemaphore";
|
|
// uart8RxSemaphore = osSemaphoreNew(1, 1, NULL);
|
|
// uart8RxSemaphore = osSemaphoreNew(1, 1, NULL);
|
|
|
|
|
|
- uart8TaskData.uartRxBuffer = uart8RxBuffer;
|
|
|
|
- uart8TaskData.uartRxBufferLen = UART8_RX_BUFF_SIZE;
|
|
|
|
- uart8TaskData.uartTxBuffer = uart8TxBuffer;
|
|
|
|
- uart8TaskData.uartRxBufferLen = UART8_TX_BUFF_SIZE;
|
|
|
|
- uart8TaskData.frameData = uart8TaskFrameData;
|
|
|
|
- uart8TaskData.frameDataLen = UART8_RX_BUFF_SIZE;
|
|
|
|
- uart8TaskData.huart = &huart8;
|
|
|
|
- uart8TaskData.uartNumber = 8;
|
|
|
|
- uart8RecieveTaskHandle = osThreadNew (UartRxTask, &uart8TaskData, &osThreadAttrUart8);
|
|
|
|
- uart8TaskData.uartRecieveTaskHandle = uart8RecieveTaskHandle;
|
|
|
|
|
|
+ uart8TaskData.uartRxBuffer = uart8RxBuffer;
|
|
|
|
+ uart8TaskData.uartRxBufferLen = UART8_RX_BUFF_SIZE;
|
|
|
|
+ uart8TaskData.uartTxBuffer = uart8TxBuffer;
|
|
|
|
+ uart8TaskData.uartRxBufferLen = UART8_TX_BUFF_SIZE;
|
|
|
|
+ uart8TaskData.frameData = uart8TaskFrameData;
|
|
|
|
+ uart8TaskData.frameDataLen = UART8_RX_BUFF_SIZE;
|
|
|
|
+ uart8TaskData.huart = &huart8;
|
|
|
|
+ uart8TaskData.uartNumber = 8;
|
|
|
|
+ uart8TaskData.uartRecieveTaskHandle = osThreadNew (UartRxTask, &uart8TaskData, &osThreadAttrRxUart);
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ osMessageQueueAttr_t uartTxMsgQueueAttr = { 0 };
|
|
|
|
+ uartTxMsgQueueAttr.name = "uart8TxMsgQueue";
|
|
|
|
+ uart8TaskData.sendCmdToSlaveQueue = osMessageQueueNew (16, sizeof (InterProcessData), &uartTxMsgQueueAttr);
|
|
|
|
+
|
|
|
|
+ osThreadAttrTxUart.name = "os_thread_uart8_tx";
|
|
|
|
+ osThreadAttrTxUart.stack_size = configMINIMAL_STACK_SIZE * 4;
|
|
|
|
+ osThreadAttrTxUart.priority = (osPriority_t)osPriorityNormal;
|
|
|
|
+ uart8TaskData.uartTransmitTaskHandle = osThreadNew (UartTxTask, &uart8TaskData, &osThreadAttrTxUart);
|
|
}
|
|
}
|
|
|
|
|
|
void HAL_UART_RxCpltCallback (UART_HandleTypeDef* huart) {
|
|
void HAL_UART_RxCpltCallback (UART_HandleTypeDef* huart) {
|
|
@@ -99,16 +113,13 @@ void HAL_UART_TxCpltCallback (UART_HandleTypeDef* huart) {
|
|
void HandleUartRxCallback (UartTaskData* uartTaskData, UART_HandleTypeDef* huart, uint16_t Size) {
|
|
void HandleUartRxCallback (UartTaskData* uartTaskData, UART_HandleTypeDef* huart, uint16_t Size) {
|
|
BaseType_t pxHigherPriorityTaskWoken = pdFALSE;
|
|
BaseType_t pxHigherPriorityTaskWoken = pdFALSE;
|
|
osMutexAcquire (uartTaskData->rxDataBufferMutex, osWaitForever);
|
|
osMutexAcquire (uartTaskData->rxDataBufferMutex, osWaitForever);
|
|
- memcpy (&(uartTaskData->frameData[uartTaskData->frameBytesCount]),
|
|
|
|
- uartTaskData->uartRxBuffer, Size);
|
|
|
|
|
|
+ memcpy (&(uartTaskData->frameData[uartTaskData->frameBytesCount]), uartTaskData->uartRxBuffer, Size);
|
|
uartTaskData->frameBytesCount += Size;
|
|
uartTaskData->frameBytesCount += Size;
|
|
osMutexRelease (uartTaskData->rxDataBufferMutex);
|
|
osMutexRelease (uartTaskData->rxDataBufferMutex);
|
|
- xTaskNotifyFromISR (uartTaskData->uartRecieveTaskHandle, Size,
|
|
|
|
- eSetValueWithOverwrite, &pxHigherPriorityTaskWoken);
|
|
|
|
|
|
+ xTaskNotifyFromISR (uartTaskData->uartRecieveTaskHandle, Size, eSetValueWithOverwrite, &pxHigherPriorityTaskWoken);
|
|
// HAL_UARTEx_ReceiveToIdle_DMA(huart, uart8RxBuffer, UART8_RX_BUFF_SIZE);
|
|
// HAL_UARTEx_ReceiveToIdle_DMA(huart, uart8RxBuffer, UART8_RX_BUFF_SIZE);
|
|
// __HAL_DMA_DISABLE_IT(&hdma_uart8_rx, DMA_IT_HT);
|
|
// __HAL_DMA_DISABLE_IT(&hdma_uart8_rx, DMA_IT_HT);
|
|
- HAL_UARTEx_ReceiveToIdle_IT (uartTaskData->huart,
|
|
|
|
- uartTaskData->uartRxBuffer, uartTaskData->uartRxBufferLen);
|
|
|
|
|
|
+ HAL_UARTEx_ReceiveToIdle_IT (uartTaskData->huart, uartTaskData->uartRxBuffer, uartTaskData->uartRxBufferLen);
|
|
portEND_SWITCHING_ISR (pxHigherPriorityTaskWoken);
|
|
portEND_SWITCHING_ISR (pxHigherPriorityTaskWoken);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -128,15 +139,13 @@ void UartRxTask (void* argument) {
|
|
enum SerialReceiverStates receverState = srWaitForHeader;
|
|
enum SerialReceiverStates receverState = srWaitForHeader;
|
|
|
|
|
|
uartTaskData->rxDataBufferMutex = osMutexNew (NULL);
|
|
uartTaskData->rxDataBufferMutex = osMutexNew (NULL);
|
|
- HAL_UARTEx_ReceiveToIdle_IT (uartTaskData->huart,
|
|
|
|
- uartTaskData->uartRxBuffer, uartTaskData->uartRxBufferLen);
|
|
|
|
|
|
+ HAL_UARTEx_ReceiveToIdle_IT (uartTaskData->huart, uartTaskData->uartRxBuffer, uartTaskData->uartRxBufferLen);
|
|
// HAL_UARTEx_ReceiveToIdle_DMA(&huart8, uart8RxBuffer, 32);
|
|
// HAL_UARTEx_ReceiveToIdle_DMA(&huart8, uart8RxBuffer, 32);
|
|
while (pdTRUE) {
|
|
while (pdTRUE) {
|
|
// HAL_UART_Receive_IT(&huart8, uart8RxBuffer, 1);
|
|
// HAL_UART_Receive_IT(&huart8, uart8RxBuffer, 1);
|
|
// if(osSemaphoreAcquire(uart8RxSemaphore, pdMS_TO_TICKS(1000)) !=
|
|
// if(osSemaphoreAcquire(uart8RxSemaphore, pdMS_TO_TICKS(1000)) !=
|
|
// osOK) if(xTaskNotifyWait(0, 0, &bytesRec, portMAX_DELAY) == pdTrue)
|
|
// osOK) if(xTaskNotifyWait(0, 0, &bytesRec, portMAX_DELAY) == pdTrue)
|
|
- frameTimeout =
|
|
|
|
- !(xTaskNotifyWait (0, 0, &bytesRec, pdMS_TO_TICKS (FRAME_TIMEOUT_MS)));
|
|
|
|
|
|
+ frameTimeout = !(xTaskNotifyWait (0, 0, &bytesRec, pdMS_TO_TICKS (FRAME_TIMEOUT_MS)));
|
|
|
|
|
|
osMutexAcquire (uartTaskData->rxDataBufferMutex, osWaitForever);
|
|
osMutexAcquire (uartTaskData->rxDataBufferMutex, osWaitForever);
|
|
frameBytesCount = uartTaskData->frameBytesCount;
|
|
frameBytesCount = uartTaskData->frameBytesCount;
|
|
@@ -152,8 +161,7 @@ void UartRxTask (void* argument) {
|
|
#endif
|
|
#endif
|
|
} else {
|
|
} else {
|
|
if (uartTaskData->huart->RxState == HAL_UART_STATE_READY) {
|
|
if (uartTaskData->huart->RxState == HAL_UART_STATE_READY) {
|
|
- HAL_UARTEx_ReceiveToIdle_IT (uartTaskData->huart,
|
|
|
|
- uartTaskData->uartRxBuffer, uartTaskData->uartRxBufferLen);
|
|
|
|
|
|
+ HAL_UARTEx_ReceiveToIdle_IT (uartTaskData->huart, uartTaskData->uartRxBuffer, uartTaskData->uartRxBufferLen);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -164,31 +172,21 @@ void UartRxTask (void* argument) {
|
|
osMutexAcquire (uartTaskData->rxDataBufferMutex, osWaitForever);
|
|
osMutexAcquire (uartTaskData->rxDataBufferMutex, osWaitForever);
|
|
if (uartTaskData->frameData[0] == FRAME_INDICATOR) {
|
|
if (uartTaskData->frameData[0] == FRAME_INDICATOR) {
|
|
if (frameBytesCount > FRAME_ID_LENGTH) {
|
|
if (frameBytesCount > FRAME_ID_LENGTH) {
|
|
- spFrameData.frameId = CONVERT_BYTES_TO_SHORT_WORD (
|
|
|
|
- &(uartTaskData->frameData[FRAME_HEADER_LENGTH - FRAME_RESP_STAT_LENGTH -
|
|
|
|
- FRAME_DATALEN_LENGTH - FRAME_ID_LENGTH - FRAME_COMMAND_LENGTH]));
|
|
|
|
|
|
+ spFrameData.frameHeader.frameId =
|
|
|
|
+ CONVERT_BYTES_TO_SHORT_WORD (&(uartTaskData->frameData[FRAME_HEADER_LENGTH - FRAME_RESP_STAT_LENGTH - FRAME_DATALEN_LENGTH - FRAME_ID_LENGTH - FRAME_COMMAND_LENGTH]));
|
|
}
|
|
}
|
|
if (frameBytesCount > FRAME_ID_LENGTH + FRAME_COMMAND_LENGTH) {
|
|
if (frameBytesCount > FRAME_ID_LENGTH + FRAME_COMMAND_LENGTH) {
|
|
- frameCommandRaw = CONVERT_BYTES_TO_SHORT_WORD (
|
|
|
|
- &(uartTaskData->frameData[FRAME_HEADER_LENGTH - FRAME_RESP_STAT_LENGTH -
|
|
|
|
- FRAME_DATALEN_LENGTH - FRAME_COMMAND_LENGTH]));
|
|
|
|
- spFrameData.frameCommand =
|
|
|
|
- (enum SerialProtocolCommands) (frameCommandRaw & 0x7FFF);
|
|
|
|
- spFrameData.isResponseFrame =
|
|
|
|
- (frameCommandRaw & 0x8000) != 0 ? pdTRUE : pdFALSE;
|
|
|
|
|
|
+ frameCommandRaw = CONVERT_BYTES_TO_SHORT_WORD (&(uartTaskData->frameData[FRAME_HEADER_LENGTH - FRAME_RESP_STAT_LENGTH - FRAME_DATALEN_LENGTH - FRAME_COMMAND_LENGTH]));
|
|
|
|
+ spFrameData.frameHeader.frameCommand = (SerialProtocolCommands)(frameCommandRaw & 0x7FFF);
|
|
|
|
+ spFrameData.frameHeader.isResponseFrame = (frameCommandRaw & 0x8000) != 0 ? pdTRUE : pdFALSE;
|
|
}
|
|
}
|
|
- if ((frameBytesCount > FRAME_ID_LENGTH + FRAME_COMMAND_LENGTH + FRAME_RESP_STAT_LENGTH) &&
|
|
|
|
- ((spFrameData.frameCommand & 0x8000) != 0)) {
|
|
|
|
- spFrameData.respStatus = (enum SerialProtocolRespStatus) (
|
|
|
|
- uartTaskData->frameData[FRAME_ID_LENGTH + FRAME_COMMAND_LENGTH + FRAME_RESP_STAT_LENGTH]);
|
|
|
|
|
|
+ if ((frameBytesCount > FRAME_ID_LENGTH + FRAME_COMMAND_LENGTH + FRAME_RESP_STAT_LENGTH) && ((spFrameData.frameHeader.frameCommand & 0x8000) != 0)) {
|
|
|
|
+ spFrameData.frameHeader.respStatus = (SerialProtocolRespStatus)(uartTaskData->frameData[FRAME_ID_LENGTH + FRAME_COMMAND_LENGTH + FRAME_RESP_STAT_LENGTH]);
|
|
}
|
|
}
|
|
-
|
|
|
|
if (frameBytesCount >= FRAME_HEADER_LENGTH) {
|
|
if (frameBytesCount >= FRAME_HEADER_LENGTH) {
|
|
- spFrameData.frameDataLength = CONVERT_BYTES_TO_SHORT_WORD (
|
|
|
|
- &(uartTaskData->frameData[FRAME_HEADER_LENGTH - FRAME_RESP_STAT_LENGTH - FRAME_DATALEN_LENGTH]));
|
|
|
|
- frameTotalLength = FRAME_HEADER_LENGTH +
|
|
|
|
- spFrameData.frameDataLength + FRAME_CRC_LENGTH;
|
|
|
|
- receverState = srRecieveData;
|
|
|
|
|
|
+ spFrameData.frameHeader.frameDataLength = CONVERT_BYTES_TO_SHORT_WORD (&(uartTaskData->frameData[FRAME_HEADER_LENGTH - FRAME_RESP_STAT_LENGTH - FRAME_DATALEN_LENGTH]));
|
|
|
|
+ frameTotalLength = FRAME_HEADER_LENGTH + spFrameData.frameHeader.frameDataLength + FRAME_CRC_LENGTH;
|
|
|
|
+ receverState = srRecieveData;
|
|
} else {
|
|
} else {
|
|
proceed = pdFALSE;
|
|
proceed = pdFALSE;
|
|
}
|
|
}
|
|
@@ -210,10 +208,8 @@ void UartRxTask (void* argument) {
|
|
break;
|
|
break;
|
|
case srCheckCrc:
|
|
case srCheckCrc:
|
|
osMutexAcquire (uartTaskData->rxDataBufferMutex, osWaitForever);
|
|
osMutexAcquire (uartTaskData->rxDataBufferMutex, osWaitForever);
|
|
- frameCrc = CONVERT_BYTES_TO_SHORT_WORD (
|
|
|
|
- &(uartTaskData->frameData[frameTotalLength - FRAME_CRC_LENGTH]));
|
|
|
|
- crc = HAL_CRC_Calculate (&hcrc, (uint32_t*)(uartTaskData->frameData),
|
|
|
|
- frameTotalLength - FRAME_CRC_LENGTH);
|
|
|
|
|
|
+ frameCrc = CONVERT_BYTES_TO_SHORT_WORD (&(uartTaskData->frameData[frameTotalLength - FRAME_CRC_LENGTH]));
|
|
|
|
+ crc = HAL_CRC_Calculate (&hcrc, (uint32_t*)(uartTaskData->frameData), frameTotalLength - FRAME_CRC_LENGTH);
|
|
osMutexRelease (uartTaskData->rxDataBufferMutex);
|
|
osMutexRelease (uartTaskData->rxDataBufferMutex);
|
|
crcPass = frameCrc == crc;
|
|
crcPass = frameCrc == crc;
|
|
if (crcPass) {
|
|
if (crcPass) {
|
|
@@ -226,18 +222,21 @@ void UartRxTask (void* argument) {
|
|
}
|
|
}
|
|
break;
|
|
break;
|
|
case srExecuteCmd:
|
|
case srExecuteCmd:
|
|
- if ((uartTaskData->processDataQueue != NULL) ||
|
|
|
|
- (uartTaskData->processDataCb != NULL)) {
|
|
|
|
|
|
+ if (/*(uartTaskData->processDataQueue != NULL) || */(uartTaskData->processDataCb != NULL) || (uartTaskData->processRxDataMsgBuffer != NULL)) {
|
|
osMutexAcquire (uartTaskData->rxDataBufferMutex, osWaitForever);
|
|
osMutexAcquire (uartTaskData->rxDataBufferMutex, osWaitForever);
|
|
- memcpy (spFrameData.dataBuffer,
|
|
|
|
- &(uartTaskData->frameData[FRAME_HEADER_LENGTH]),
|
|
|
|
- spFrameData.frameDataLength);
|
|
|
|
|
|
+ memcpy (spFrameData.dataBuffer, &(uartTaskData->frameData[FRAME_HEADER_LENGTH]), spFrameData.frameHeader.frameDataLength);
|
|
osMutexRelease (uartTaskData->rxDataBufferMutex);
|
|
osMutexRelease (uartTaskData->rxDataBufferMutex);
|
|
}
|
|
}
|
|
|
|
|
|
- if (uartTaskData->processDataQueue != NULL) {
|
|
|
|
- osMessageQueuePut (uartTaskData->processDataQueue,
|
|
|
|
- &spFrameData, 0, osWaitForever);
|
|
|
|
|
|
+// if (uartTaskData->processDataQueue != NULL) {
|
|
|
|
+// osMessageQueuePut (uartTaskData->processDataQueue, &spFrameData, 0, osWaitForever);
|
|
|
|
+// }
|
|
|
|
+ if (uartTaskData->processRxDataMsgBuffer != NULL) {
|
|
|
|
+ if(xMessageBufferSend (uartTaskData->processRxDataMsgBuffer, &spFrameData, sizeof (SerialProtocolFrameHeader) + spFrameData.frameHeader.frameDataLength, pdMS_TO_TICKS (200)) == pdFALSE)
|
|
|
|
+ {
|
|
|
|
+ receverState = srFail;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
if (uartTaskData->processDataCb != NULL) {
|
|
if (uartTaskData->processDataCb != NULL) {
|
|
uartTaskData->processDataCb (uartTaskData, &spFrameData);
|
|
uartTaskData->processDataCb (uartTaskData, &spFrameData);
|
|
@@ -247,18 +246,20 @@ void UartRxTask (void* argument) {
|
|
case srFail:
|
|
case srFail:
|
|
dataToSend = 0;
|
|
dataToSend = 0;
|
|
if ((frameTimeout == pdTRUE) && (frameBytesCount > 2)) {
|
|
if ((frameTimeout == pdTRUE) && (frameBytesCount > 2)) {
|
|
- dataToSend = PrepareRespFrame (uart8TxBuffer, spFrameData.frameId,
|
|
|
|
- spFrameData.frameCommand, spTimeout, NULL, 0);
|
|
|
|
|
|
+ dataToSend = PrepareRespFrame (uart8TxBuffer, spFrameData.frameHeader.frameId, spFrameData.frameHeader.frameCommand, spTimeout, NULL, 0);
|
|
#if UART_TASK_LOGS
|
|
#if UART_TASK_LOGS
|
|
printf ("Uart%d: RX data receiver timeout!\n", uartTaskData->uartNumber);
|
|
printf ("Uart%d: RX data receiver timeout!\n", uartTaskData->uartNumber);
|
|
#endif
|
|
#endif
|
|
} else if (!crcPass) {
|
|
} else if (!crcPass) {
|
|
- dataToSend = PrepareRespFrame (uart8TxBuffer, spFrameData.frameId,
|
|
|
|
- spFrameData.frameCommand, spCrcFail, NULL, 0);
|
|
|
|
|
|
+ dataToSend = PrepareRespFrame (uart8TxBuffer, spFrameData.frameHeader.frameId, spFrameData.frameHeader.frameCommand, spCrcFail, NULL, 0);
|
|
#if UART_TASK_LOGS
|
|
#if UART_TASK_LOGS
|
|
printf ("Uart%d: Frame CRC FAIL\n", uartTaskData->uartNumber);
|
|
printf ("Uart%d: Frame CRC FAIL\n", uartTaskData->uartNumber);
|
|
#endif
|
|
#endif
|
|
}
|
|
}
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ dataToSend = PrepareRespFrame (uart8TxBuffer, spFrameData.frameHeader.frameId, spFrameData.frameHeader.frameCommand, spInternalError, NULL, 0);
|
|
|
|
+ }
|
|
if (dataToSend > 0) {
|
|
if (dataToSend > 0) {
|
|
HAL_UART_Transmit_IT (&huart8, uart8TxBuffer, dataToSend);
|
|
HAL_UART_Transmit_IT (&huart8, uart8TxBuffer, dataToSend);
|
|
}
|
|
}
|
|
@@ -272,11 +273,11 @@ void UartRxTask (void* argument) {
|
|
osMutexAcquire (uartTaskData->rxDataBufferMutex, osWaitForever);
|
|
osMutexAcquire (uartTaskData->rxDataBufferMutex, osWaitForever);
|
|
uartTaskData->frameBytesCount = 0;
|
|
uartTaskData->frameBytesCount = 0;
|
|
osMutexRelease (uartTaskData->rxDataBufferMutex);
|
|
osMutexRelease (uartTaskData->rxDataBufferMutex);
|
|
- spFrameData.frameCommand = spUnknown;
|
|
|
|
- frameTotalLength = 0;
|
|
|
|
- outputDataBufferPos = 0;
|
|
|
|
- receverState = srWaitForHeader;
|
|
|
|
- proceed = pdFALSE;
|
|
|
|
|
|
+ spFrameData.frameHeader.frameCommand = spUnknown;
|
|
|
|
+ frameTotalLength = 0;
|
|
|
|
+ outputDataBufferPos = 0;
|
|
|
|
+ receverState = srWaitForHeader;
|
|
|
|
+ proceed = pdFALSE;
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -286,30 +287,23 @@ void UartRxTask (void* argument) {
|
|
void Uart8ReceivedDataProcessCallback (void* arg, SerialProtocolFrameData* spFrameData) {
|
|
void Uart8ReceivedDataProcessCallback (void* arg, SerialProtocolFrameData* spFrameData) {
|
|
UartTaskData* uartTaskData = (UartTaskData*)arg;
|
|
UartTaskData* uartTaskData = (UartTaskData*)arg;
|
|
uint16_t dataToSend = 0;
|
|
uint16_t dataToSend = 0;
|
|
- switch (spFrameData->frameCommand) {
|
|
|
|
- case spGetAllMeasurments:
|
|
|
|
|
|
+ switch (spFrameData->frameHeader.frameCommand) {
|
|
|
|
+ case spGetElectricalMeasurments:
|
|
float slaveVoltage = 48.0 + rndflt (0.5);
|
|
float slaveVoltage = 48.0 + rndflt (0.5);
|
|
- WriteDataToBuffer (
|
|
|
|
- outputDataBuffer, &outputDataBufferPos, &slaveVoltage, sizeof (float));
|
|
|
|
slaveVoltage = 48.0 + rndflt (1);
|
|
slaveVoltage = 48.0 + rndflt (1);
|
|
- WriteDataToBuffer (
|
|
|
|
- outputDataBuffer, &outputDataBufferPos, &slaveVoltage, sizeof (float));
|
|
|
|
|
|
+ WriteDataToBuffer (outputDataBuffer, &outputDataBufferPos, &slaveVoltage, sizeof (float));
|
|
|
|
+ WriteDataToBuffer (outputDataBuffer, &outputDataBufferPos, &slaveVoltage, sizeof (float));
|
|
slaveVoltage = 47.5 + rndflt (0.5);
|
|
slaveVoltage = 47.5 + rndflt (0.5);
|
|
- WriteDataToBuffer (
|
|
|
|
- outputDataBuffer, &outputDataBufferPos, &slaveVoltage, sizeof (float));
|
|
|
|
|
|
+ WriteDataToBuffer (outputDataBuffer, &outputDataBufferPos, &slaveVoltage, sizeof (float));
|
|
break;
|
|
break;
|
|
- case spGetVoltageMeasurments: break;
|
|
|
|
- case spGetCurrentMeasurments: break;
|
|
|
|
- case spGetPowerMeasurments: break;
|
|
|
|
- case spGetPVTemperatureMeasurment: break;
|
|
|
|
|
|
+ case spGetSensorMeasurments: break;
|
|
default: break;
|
|
default: break;
|
|
}
|
|
}
|
|
if (outputDataBufferPos > 0) {
|
|
if (outputDataBufferPos > 0) {
|
|
- dataToSend = PrepareRespFrame (uart8TxBuffer, spFrameData->frameId,
|
|
|
|
- spFrameData->frameCommand, spOK, outputDataBuffer, outputDataBufferPos);
|
|
|
|
|
|
+ dataToSend = PrepareRespFrame (uart8TxBuffer, spFrameData->frameHeader.frameId, spFrameData->frameHeader.frameCommand, spOK, outputDataBuffer, outputDataBufferPos);
|
|
}
|
|
}
|
|
if (dataToSend > 0) {
|
|
if (dataToSend > 0) {
|
|
- // HAL_UART_Transmit_DMA(&huart8, uart8TxBuffer, dataToSend);
|
|
|
|
|
|
+ // HAL_UART_Transmit_DMA(&huart8, uart8TxBuffer, dataToSend);
|
|
HAL_UART_Transmit_IT (uartTaskData->huart, uart8TxBuffer, dataToSend);
|
|
HAL_UART_Transmit_IT (uartTaskData->huart, uart8TxBuffer, dataToSend);
|
|
}
|
|
}
|
|
#if UART_TASK_LOGS
|
|
#if UART_TASK_LOGS
|
|
@@ -318,7 +312,62 @@ void Uart8ReceivedDataProcessCallback (void* arg, SerialProtocolFrameData* spFra
|
|
}
|
|
}
|
|
|
|
|
|
void UartTxTask (void* argument) {
|
|
void UartTxTask (void* argument) {
|
|
|
|
+ UartTaskData* const uartTaskData = (UartTaskData*)argument;
|
|
|
|
+ InterProcessData data = { 0 };
|
|
|
|
+ SerialProtocolFrameData frameData = { 0 };
|
|
|
|
+ size_t bytesInMsg;
|
|
|
|
+ uint16_t frameId = 0;
|
|
|
|
+ uint32_t rndVal = 0;
|
|
|
|
+ uint16_t bytesToSend = 0;
|
|
|
|
+ SerialProtocolCommands frameCommand = spUnknown;
|
|
|
|
+
|
|
while (pdTRUE) {
|
|
while (pdTRUE) {
|
|
- osDelay (pdMS_TO_TICKS (1000));
|
|
|
|
|
|
+ if (uartTaskData->sendCmdToSlaveQueue != NULL) {
|
|
|
|
+ osMessageQueueGet (uartTaskData->sendCmdToSlaveQueue, &data, 0, osWaitForever);
|
|
|
|
+ HAL_RNG_GenerateRandomNumber (&hrng, &rndVal);
|
|
|
|
+ frameId = (uint16_t)(rndVal & 0xFFFF);
|
|
|
|
+ frameCommand = data.spCommand;
|
|
|
|
+ outputDataBufferPos = 0;
|
|
|
|
+ memset(outputDataBuffer, 0x00, OUTPUT_DATA_BUFF_SIZE);
|
|
|
|
+ switch(frameCommand)
|
|
|
|
+ {
|
|
|
|
+ case spSetFanSpeed:
|
|
|
|
+ case spSetMotorXOn:
|
|
|
|
+ case spSetMotorYOn:
|
|
|
|
+ WriteDataToBuffer (outputDataBuffer, &outputDataBufferPos, &data.values.integerValues.value[0], sizeof (float));
|
|
|
|
+ WriteDataToBuffer (outputDataBuffer, &outputDataBufferPos, &data.values.integerValues.value[1], sizeof (float));
|
|
|
|
+ break;
|
|
|
|
+ case spSetDiodeOn:
|
|
|
|
+ WriteDataToBuffer (outputDataBuffer, &outputDataBufferPos, &data.values.integerValues.value[0], sizeof (float));
|
|
|
|
+ break;
|
|
|
|
+ case spSetmotorXMaxCurrent:
|
|
|
|
+ case spSetmotorYMaxCurrent:
|
|
|
|
+ WriteDataToBuffer (outputDataBuffer, &outputDataBufferPos, &data.values.flaotValues.value[0], sizeof (float));
|
|
|
|
+ break;
|
|
|
|
+ case spGetElectricalMeasurments:
|
|
|
|
+ case spGetSensorMeasurments:
|
|
|
|
+ break;
|
|
|
|
+ default:
|
|
|
|
+ continue;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ bytesToSend = PrepareReqFrame (uart8TxBuffer, frameId, frameCommand, outputDataBuffer, outputDataBufferPos);
|
|
|
|
+ HAL_UART_Transmit_IT (uartTaskData->huart, uart8TxBuffer, bytesToSend);
|
|
|
|
+ bytesInMsg = xMessageBufferReceive (uartTaskData->processRxDataMsgBuffer, &frameData, INPUT_DATA_BUFF_SIZE, pdMS_TO_TICKS (1000));
|
|
|
|
+ if(bytesInMsg == 0)
|
|
|
|
+ {
|
|
|
|
+ printf("Response timeout for frameId 0x%x\n", frameId);
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ if ( (frameId == frameData.frameHeader.frameId) && (frameData.frameHeader.respStatus == spOK))
|
|
|
|
+ {
|
|
|
|
+ printf("Response for frameId 0x%x OK\n", frameId);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ osDelay (pdMS_TO_TICKS (1000));
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|