|
@@ -12,29 +12,41 @@
|
|
|
#include <string.h>
|
|
|
|
|
|
#include "interprocess_data.h"
|
|
|
-#include "measurements.h"
|
|
|
#include "mock_tasks.h"
|
|
|
#include "uart_tasks.h"
|
|
|
|
|
|
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 huart1;
|
|
|
+extern UART_HandleTypeDef huart2;
|
|
|
+extern UART_HandleTypeDef huart3;
|
|
|
+extern UART_HandleTypeDef huart6;
|
|
|
extern UART_HandleTypeDef huart8;
|
|
|
extern DMA_HandleTypeDef hdma_uart8_rx;
|
|
|
extern CRC_HandleTypeDef hcrc;
|
|
|
|
|
|
+uint8_t uart1RxBuffer[UART1_RX_BUFF_SIZE] = { 0 };
|
|
|
+uint8_t uart1TxBuffer[UART1_TX_BUFF_SIZE] = { 0 };
|
|
|
+uint8_t uart1TaskFrameData[INPUT_DATA_BUFF_SIZE] = { 0 };
|
|
|
+
|
|
|
+uint8_t uart2RxBuffer[UART2_RX_BUFF_SIZE] = { 0 };
|
|
|
+uint8_t uart2TxBuffer[UART2_TX_BUFF_SIZE] = { 0 };
|
|
|
+uint8_t uart2TaskFrameData[INPUT_DATA_BUFF_SIZE] = { 0 };
|
|
|
+
|
|
|
+uint8_t uart3RxBuffer[UART3_RX_BUFF_SIZE] = { 0 };
|
|
|
+uint8_t uart3TxBuffer[UART3_TX_BUFF_SIZE] = { 0 };
|
|
|
+uint8_t uart3TaskFrameData[INPUT_DATA_BUFF_SIZE] = { 0 };
|
|
|
+
|
|
|
+uint8_t uart6RxBuffer[UART6_RX_BUFF_SIZE] = { 0 };
|
|
|
+uint8_t uart6TxBuffer[UART6_TX_BUFF_SIZE] = { 0 };
|
|
|
+uint8_t uart6TaskFrameData[INPUT_DATA_BUFF_SIZE] = { 0 };
|
|
|
+
|
|
|
uint8_t uart8RxBuffer[UART8_RX_BUFF_SIZE] = { 0 };
|
|
|
uint8_t uart8TxBuffer[UART8_TX_BUFF_SIZE] = { 0 };
|
|
|
uint8_t uart8TaskFrameData[INPUT_DATA_BUFF_SIZE] = { 0 };
|
|
|
|
|
|
-uint8_t boardToUartNumberMap[SLAVES_COUNT] = { /*1*/ 8, 3, 6, 2 };
|
|
|
+//uint8_t boardToUartNumberMap[SLAVES_COUNT] = { 8, 3, 6, 2 };
|
|
|
+uint8_t boardToUartNumberMap[SLAVES_COUNT] = { 1, 3, 6, 2 };
|
|
|
|
|
|
UartTaskData uart1TaskData = { 0 }; // Board 1
|
|
|
UartTaskData uart3TaskData = { 0 }; // Board 2
|
|
@@ -42,17 +54,12 @@ UartTaskData uart6TaskData = { 0 }; // Board 3
|
|
|
UartTaskData uart2TaskData = { 0 }; // Board 4
|
|
|
UartTaskData uart8TaskData = { 0 }; // Debug
|
|
|
|
|
|
-UartTaskData* uartTasks[] = { &uart8TaskData, NULL };
|
|
|
+//UartTaskData* uartTasks[] = { &uart8TaskData, &uart3TaskData, &uart6TaskData, &uart2TaskData, NULL, };
|
|
|
+UartTaskData* uartTasks[] = { &uart1TaskData, &uart3TaskData, &uart6TaskData, &uart2TaskData, NULL, };
|
|
|
|
|
|
uint8_t outputDataBuffer[OUTPUT_DATA_BUFF_SIZE];
|
|
|
uint16_t outputDataBufferPos = 0;
|
|
|
|
|
|
-
|
|
|
-//extern uint32_t slaveLastSeen[SLAVES_COUNT];
|
|
|
-//extern RESMeasurements resMeasurements[SLAVES_COUNT];
|
|
|
-//extern SesnorsInfo sensorsInfo[SLAVES_COUNT];
|
|
|
-//extern osMutexId_t resMeasurementsMutex;
|
|
|
-//extern osMutexId_t sensorsInfoMutex;
|
|
|
RESMeasurements resMeasurements[SLAVES_COUNT] = { 0 };
|
|
|
SesnorsInfo sensorsInfo[SLAVES_COUNT] = { 0 };
|
|
|
uint32_t slaveLastSeen[SLAVES_COUNT] = { 0 };
|
|
@@ -61,49 +68,82 @@ osMutexId_t sensorsInfoMutex;
|
|
|
|
|
|
extern RNG_HandleTypeDef hrng;
|
|
|
|
|
|
+void UartTasksInit (void) {
|
|
|
+ uart1TaskData.uartRxBuffer = uart1RxBuffer;
|
|
|
+ uart1TaskData.uartRxBufferLen = UART1_RX_BUFF_SIZE;
|
|
|
+ uart1TaskData.uartTxBuffer = uart1TxBuffer;
|
|
|
+ uart1TaskData.uartRxBufferLen = UART1_TX_BUFF_SIZE;
|
|
|
+ uart1TaskData.frameData = uart1TaskFrameData;
|
|
|
+ uart1TaskData.frameDataLen = UART1_RX_BUFF_SIZE;
|
|
|
+ uart1TaskData.huart = &huart1;
|
|
|
+ uart1TaskData.uartNumber = 1;
|
|
|
+
|
|
|
+ uart2TaskData.uartRxBuffer = uart2RxBuffer;
|
|
|
+ uart2TaskData.uartRxBufferLen = UART2_RX_BUFF_SIZE;
|
|
|
+ uart2TaskData.uartTxBuffer = uart2TxBuffer;
|
|
|
+ uart2TaskData.uartRxBufferLen = UART2_TX_BUFF_SIZE;
|
|
|
+ uart2TaskData.frameData = uart2TaskFrameData;
|
|
|
+ uart2TaskData.frameDataLen = UART2_RX_BUFF_SIZE;
|
|
|
+ uart2TaskData.huart = &huart2;
|
|
|
+ uart2TaskData.uartNumber = 2;
|
|
|
+
|
|
|
+ uart3TaskData.uartRxBuffer = uart3RxBuffer;
|
|
|
+ uart3TaskData.uartRxBufferLen = UART3_RX_BUFF_SIZE;
|
|
|
+ uart3TaskData.uartTxBuffer = uart3TxBuffer;
|
|
|
+ uart3TaskData.uartRxBufferLen = UART3_TX_BUFF_SIZE;
|
|
|
+ uart3TaskData.frameData = uart3TaskFrameData;
|
|
|
+ uart3TaskData.frameDataLen = UART3_RX_BUFF_SIZE;
|
|
|
+ uart3TaskData.huart = &huart3;
|
|
|
+ uart3TaskData.uartNumber = 3;
|
|
|
+
|
|
|
+ uart6TaskData.uartRxBuffer = uart6RxBuffer;
|
|
|
+ uart6TaskData.uartRxBufferLen = UART6_RX_BUFF_SIZE;
|
|
|
+ uart6TaskData.uartTxBuffer = uart6TxBuffer;
|
|
|
+ uart6TaskData.uartRxBufferLen = UART6_TX_BUFF_SIZE;
|
|
|
+ uart6TaskData.frameData = uart6TaskFrameData;
|
|
|
+ uart6TaskData.frameDataLen = UART6_RX_BUFF_SIZE;
|
|
|
+ uart6TaskData.huart = &huart6;
|
|
|
+ uart6TaskData.uartNumber = 6;
|
|
|
+
|
|
|
+ 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;
|
|
|
+
|
|
|
+ UartTaskCreate (&uart1TaskData);
|
|
|
+ UartTaskCreate (&uart2TaskData);
|
|
|
+ UartTaskCreate (&uart3TaskData);
|
|
|
+ UartTaskCreate (&uart6TaskData);
|
|
|
+ UartTaskCreate (&uart8TaskData);
|
|
|
+}
|
|
|
|
|
|
-void Uart8TasksInit (void) {
|
|
|
+void UartTaskCreate (UartTaskData* uartTaskData) {
|
|
|
osThreadAttr_t osThreadAttrRxUart = { 0 };
|
|
|
osThreadAttr_t osThreadAttrTxUart = { 0 };
|
|
|
-#if 0
|
|
|
- osMessageQueueAttr_t uartRxMsgQueueAttr = { 0 };
|
|
|
- uartRxMsgQueueAttr.name = "uart8RxMsgQueue";
|
|
|
- uart8DecodedFrameDataTaskQueue = osMessageQueueNew(4, sizeof(SerialProtocolFrameData), &uartRxMsgQueueAttr);
|
|
|
- uart8TaskData.processDataQueue = uart8DecodedFrameDataTaskQueue;
|
|
|
-#else
|
|
|
-// uart8TaskData.processDataQueue = NULL;
|
|
|
-#endif
|
|
|
|
|
|
- uart8TaskData.processRxDataMsgBuffer = xMessageBufferCreate( INPUT_DATA_BUFF_SIZE );
|
|
|
-// uart8TaskData.processDataCb = Uart8ReceivedDataProcessCallback;
|
|
|
- uart8TaskData.processDataCb = NULL;
|
|
|
+ uartTaskData->processRxDataMsgBuffer = xMessageBufferCreate (INPUT_DATA_BUFF_SIZE);
|
|
|
+ uartTaskData->processDataCb = NULL;
|
|
|
|
|
|
- osThreadAttrRxUart.name = "os_thread_uart8_rx";
|
|
|
+ // osThreadAttrRxUart.name = "os_thread_uart1_rx";
|
|
|
osThreadAttrRxUart.stack_size = configMINIMAL_STACK_SIZE * 2;
|
|
|
osThreadAttrRxUart.priority = (osPriority_t)osPriorityHigh;
|
|
|
|
|
|
- // uart8RxSemaphoreDef.name = "uart8RxSemaphore";
|
|
|
- // 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;
|
|
|
- uart8TaskData.uartRecieveTaskHandle = osThreadNew (UartRxTask, &uart8TaskData, &osThreadAttrRxUart);
|
|
|
+ uartTaskData->uartRecieveTaskHandle = osThreadNew (UartRxTask, uartTaskData, &osThreadAttrRxUart);
|
|
|
|
|
|
|
|
|
osMessageQueueAttr_t uartTxMsgQueueAttr = { 0 };
|
|
|
- uartTxMsgQueueAttr.name = "uart8TxMsgQueue";
|
|
|
- uart8TaskData.sendCmdToSlaveQueue = osMessageQueueNew (16, sizeof (InterProcessData), &uartTxMsgQueueAttr);
|
|
|
+ // uartTxMsgQueueAttr.name = "uart1TxMsgQueue";
|
|
|
+ uartTaskData->sendCmdToSlaveQueue = osMessageQueueNew (16, sizeof (InterProcessData), &uartTxMsgQueueAttr);
|
|
|
|
|
|
- osThreadAttrTxUart.name = "os_thread_uart8_tx";
|
|
|
+ // osThreadAttrTxUart.name = "os_thread_uart1_tx";
|
|
|
osThreadAttrTxUart.stack_size = configMINIMAL_STACK_SIZE * 4;
|
|
|
osThreadAttrTxUart.priority = (osPriority_t)osPriorityNormal;
|
|
|
- uart8TaskData.uartTransmitTaskHandle = osThreadNew (UartTxTask, &uart8TaskData, &osThreadAttrTxUart);
|
|
|
+ uartTaskData->uartTransmitTaskHandle = osThreadNew (UartTxTask, uartTaskData, &osThreadAttrTxUart);
|
|
|
}
|
|
|
|
|
|
void HAL_UART_RxCpltCallback (UART_HandleTypeDef* huart) {
|
|
@@ -111,7 +151,15 @@ void HAL_UART_RxCpltCallback (UART_HandleTypeDef* huart) {
|
|
|
}
|
|
|
|
|
|
void HAL_UARTEx_RxEventCallback (UART_HandleTypeDef* huart, uint16_t Size) {
|
|
|
- if (huart->Instance == UART8) {
|
|
|
+ if (huart->Instance == USART1) {
|
|
|
+ HandleUartRxCallback (&uart1TaskData, huart, Size);
|
|
|
+ } else if (huart->Instance == USART2) {
|
|
|
+ HandleUartRxCallback (&uart2TaskData, huart, Size);
|
|
|
+ } else if (huart->Instance == USART3) {
|
|
|
+ HandleUartRxCallback (&uart3TaskData, huart, Size);
|
|
|
+ } else if (huart->Instance == USART6) {
|
|
|
+ HandleUartRxCallback (&uart6TaskData, huart, Size);
|
|
|
+ } else if (huart->Instance == UART8) {
|
|
|
HandleUartRxCallback (&uart8TaskData, huart, Size);
|
|
|
}
|
|
|
}
|
|
@@ -233,15 +281,11 @@ void UartRxTask (void* argument) {
|
|
|
}
|
|
|
break;
|
|
|
case srExecuteCmd:
|
|
|
- if (/*(uartTaskData->processDataQueue != NULL) || */(uartTaskData->processDataCb != NULL) || (uartTaskData->processRxDataMsgBuffer != NULL)) {
|
|
|
+ if ((uartTaskData->processDataCb != NULL) || (uartTaskData->processRxDataMsgBuffer != NULL)) {
|
|
|
osMutexAcquire (uartTaskData->rxDataBufferMutex, osWaitForever);
|
|
|
memcpy (spFrameData.dataBuffer, &(uartTaskData->frameData[FRAME_HEADER_LENGTH]), spFrameData.frameHeader.frameDataLength);
|
|
|
osMutexRelease (uartTaskData->rxDataBufferMutex);
|
|
|
}
|
|
|
-
|
|
|
-// 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)
|
|
|
{
|
|
@@ -257,22 +301,22 @@ void UartRxTask (void* argument) {
|
|
|
case srFail:
|
|
|
dataToSend = 0;
|
|
|
if ((frameTimeout == pdTRUE) && (frameBytesCount > 2)) {
|
|
|
- dataToSend = PrepareRespFrame (uart8TxBuffer, spFrameData.frameHeader.frameId, spFrameData.frameHeader.frameCommand, spTimeout, NULL, 0);
|
|
|
+ dataToSend = PrepareRespFrame (uartTaskData->uartTxBuffer, spFrameData.frameHeader.frameId, spFrameData.frameHeader.frameCommand, spTimeout, NULL, 0);
|
|
|
#if UART_TASK_LOGS
|
|
|
printf ("Uart%d: RX data receiver timeout!\n", uartTaskData->uartNumber);
|
|
|
#endif
|
|
|
} else if (!crcPass) {
|
|
|
- dataToSend = PrepareRespFrame (uart8TxBuffer, spFrameData.frameHeader.frameId, spFrameData.frameHeader.frameCommand, spCrcFail, NULL, 0);
|
|
|
+ dataToSend = PrepareRespFrame (uartTaskData->uartTxBuffer, spFrameData.frameHeader.frameId, spFrameData.frameHeader.frameCommand, spCrcFail, NULL, 0);
|
|
|
#if UART_TASK_LOGS
|
|
|
printf ("Uart%d: Frame CRC FAIL\n", uartTaskData->uartNumber);
|
|
|
#endif
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- dataToSend = PrepareRespFrame (uart8TxBuffer, spFrameData.frameHeader.frameId, spFrameData.frameHeader.frameCommand, spInternalError, NULL, 0);
|
|
|
+ dataToSend = PrepareRespFrame (uartTaskData->uartTxBuffer, spFrameData.frameHeader.frameId, spFrameData.frameHeader.frameCommand, spInternalError, NULL, 0);
|
|
|
}
|
|
|
if (dataToSend > 0) {
|
|
|
- HAL_UART_Transmit_IT (&huart8, uart8TxBuffer, dataToSend);
|
|
|
+ HAL_UART_Transmit_IT (uartTaskData->huart, uartTaskData->uartTxBuffer, dataToSend);
|
|
|
}
|
|
|
#if UART_TASK_LOGS
|
|
|
printf ("Uart%d: TX bytes sent: %d\n", dataToSend, uartTaskData->uartNumber);
|
|
@@ -295,33 +339,6 @@ void UartRxTask (void* argument) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-void Uart8ReceivedDataProcessCallback (void* arg, SerialProtocolFrameData* spFrameData) {
|
|
|
- UartTaskData* uartTaskData = (UartTaskData*)arg;
|
|
|
- uint16_t dataToSend = 0;
|
|
|
- switch (spFrameData->frameHeader.frameCommand) {
|
|
|
- case spGetElectricalMeasurments:
|
|
|
- float slaveVoltage = 48.0 + rndflt (0.5);
|
|
|
- slaveVoltage = 48.0 + rndflt (1);
|
|
|
- WriteDataToBuffer (outputDataBuffer, &outputDataBufferPos, &slaveVoltage, sizeof (float));
|
|
|
- WriteDataToBuffer (outputDataBuffer, &outputDataBufferPos, &slaveVoltage, sizeof (float));
|
|
|
- slaveVoltage = 47.5 + rndflt (0.5);
|
|
|
- WriteDataToBuffer (outputDataBuffer, &outputDataBufferPos, &slaveVoltage, sizeof (float));
|
|
|
- break;
|
|
|
- case spGetSensorMeasurments: break;
|
|
|
- default: break;
|
|
|
- }
|
|
|
- if (outputDataBufferPos > 0) {
|
|
|
- dataToSend = PrepareRespFrame (uart8TxBuffer, spFrameData->frameHeader.frameId, spFrameData->frameHeader.frameCommand, spOK, outputDataBuffer, outputDataBufferPos);
|
|
|
- }
|
|
|
- if (dataToSend > 0) {
|
|
|
- // HAL_UART_Transmit_DMA(&huart8, uart8TxBuffer, dataToSend);
|
|
|
- HAL_UART_Transmit_IT (uartTaskData->huart, uart8TxBuffer, dataToSend);
|
|
|
- }
|
|
|
-#if UART_TASK_LOGS
|
|
|
- printf ("Uart%d: TX bytes sent: %d\n", uartTaskData->uartNumber, dataToSend);
|
|
|
-#endif
|
|
|
-}
|
|
|
-
|
|
|
void ReadMeasSetFromBuffer(uint8_t* buff, uint16_t* buffPos, float* dataSet)
|
|
|
{
|
|
|
for(uint8_t i = 0; i < 3; i++)
|
|
@@ -365,8 +382,8 @@ void UartTxTask (void* argument) {
|
|
|
default: continue; break;
|
|
|
}
|
|
|
|
|
|
- bytesToSend = PrepareReqFrame (uart8TxBuffer, frameId, frameCommand, outputDataBuffer, outputDataBufferPos);
|
|
|
- HAL_UART_Transmit_IT (uartTaskData->huart, uart8TxBuffer, bytesToSend);
|
|
|
+ bytesToSend = PrepareReqFrame (uartTaskData->uartTxBuffer, frameId, frameCommand, outputDataBuffer, outputDataBufferPos);
|
|
|
+ HAL_UART_Transmit_IT (uartTaskData->huart, uartTaskData->uartTxBuffer, bytesToSend);
|
|
|
bytesInMsg = xMessageBufferReceive (uartTaskData->processRxDataMsgBuffer, &frameData, INPUT_DATA_BUFF_SIZE, pdMS_TO_TICKS (1000));
|
|
|
for(boardNumber = 0; boardNumber < SLAVES_COUNT; boardNumber++)
|
|
|
{
|
|
@@ -472,6 +489,6 @@ void MeasurmentsReqSchedulerTask (void* argument) {
|
|
|
}
|
|
|
ptr++;
|
|
|
}
|
|
|
- osDelay (pdMS_TO_TICKS (1000));
|
|
|
+ osDelay (pdMS_TO_TICKS (MEASURMENTS_SCHEDULER_INTERVAL_MS));
|
|
|
}
|
|
|
}
|