uart_tasks.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477
  1. /*
  2. * uart_tasks.c
  3. *
  4. * Created on: Aug 14, 2024
  5. * Author: jakubski
  6. */
  7. #include "cmsis_os.h"
  8. #include "main.h"
  9. #include <stdio.h>
  10. #include <string.h>
  11. #include "interprocess_data.h"
  12. #include "measurements.h"
  13. #include "mock_tasks.h"
  14. #include "uart_tasks.h"
  15. enum SerialReceiverStates { srWaitForHeader, srCheckCrc, srRecieveData, srExecuteCmd, srFail, srFinish, srLast };
  16. // osThreadId_t uart8RecieveTaskHandle;
  17. // osThreadId_t uart8TransmitTaskHandle;
  18. // osSemaphoreDef_t uart8RxSemaphoreDef;
  19. // osSemaphoreId_t uart8RxSemaphore = NULL;
  20. // osMessageQueueId_t uart8DecodedFrameDataTaskQueue;
  21. // osMessageQueueId_t uart8SendCmdToSlaveQueue;
  22. extern UART_HandleTypeDef huart8;
  23. extern DMA_HandleTypeDef hdma_uart8_rx;
  24. extern CRC_HandleTypeDef hcrc;
  25. uint8_t uart8RxBuffer[UART8_RX_BUFF_SIZE] = { 0 };
  26. uint8_t uart8TxBuffer[UART8_TX_BUFF_SIZE] = { 0 };
  27. uint8_t uart8TaskFrameData[INPUT_DATA_BUFF_SIZE] = { 0 };
  28. uint8_t boardToUartNumberMap[SLAVES_COUNT] = { /*1*/ 8, 3, 6, 2 };
  29. UartTaskData uart1TaskData = { 0 }; // Board 1
  30. UartTaskData uart3TaskData = { 0 }; // Board 2
  31. UartTaskData uart6TaskData = { 0 }; // Board 3
  32. UartTaskData uart2TaskData = { 0 }; // Board 4
  33. UartTaskData uart8TaskData = { 0 }; // Debug
  34. UartTaskData* uartTasks[] = { &uart8TaskData, NULL };
  35. uint8_t outputDataBuffer[OUTPUT_DATA_BUFF_SIZE];
  36. uint16_t outputDataBufferPos = 0;
  37. //extern uint32_t slaveLastSeen[SLAVES_COUNT];
  38. //extern RESMeasurements resMeasurements[SLAVES_COUNT];
  39. //extern SesnorsInfo sensorsInfo[SLAVES_COUNT];
  40. //extern osMutexId_t resMeasurementsMutex;
  41. //extern osMutexId_t sensorsInfoMutex;
  42. RESMeasurements resMeasurements[SLAVES_COUNT] = { 0 };
  43. SesnorsInfo sensorsInfo[SLAVES_COUNT] = { 0 };
  44. uint32_t slaveLastSeen[SLAVES_COUNT] = { 0 };
  45. osMutexId_t resMeasurementsMutex;
  46. osMutexId_t sensorsInfoMutex;
  47. extern RNG_HandleTypeDef hrng;
  48. void Uart8TasksInit (void) {
  49. osThreadAttr_t osThreadAttrRxUart = { 0 };
  50. osThreadAttr_t osThreadAttrTxUart = { 0 };
  51. #if 0
  52. osMessageQueueAttr_t uartRxMsgQueueAttr = { 0 };
  53. uartRxMsgQueueAttr.name = "uart8RxMsgQueue";
  54. uart8DecodedFrameDataTaskQueue = osMessageQueueNew(4, sizeof(SerialProtocolFrameData), &uartRxMsgQueueAttr);
  55. uart8TaskData.processDataQueue = uart8DecodedFrameDataTaskQueue;
  56. #else
  57. // uart8TaskData.processDataQueue = NULL;
  58. #endif
  59. uart8TaskData.processRxDataMsgBuffer = xMessageBufferCreate( INPUT_DATA_BUFF_SIZE );
  60. // uart8TaskData.processDataCb = Uart8ReceivedDataProcessCallback;
  61. uart8TaskData.processDataCb = NULL;
  62. osThreadAttrRxUart.name = "os_thread_uart8_rx";
  63. osThreadAttrRxUart.stack_size = configMINIMAL_STACK_SIZE * 2;
  64. osThreadAttrRxUart.priority = (osPriority_t)osPriorityHigh;
  65. // uart8RxSemaphoreDef.name = "uart8RxSemaphore";
  66. // uart8RxSemaphore = osSemaphoreNew(1, 1, NULL);
  67. uart8TaskData.uartRxBuffer = uart8RxBuffer;
  68. uart8TaskData.uartRxBufferLen = UART8_RX_BUFF_SIZE;
  69. uart8TaskData.uartTxBuffer = uart8TxBuffer;
  70. uart8TaskData.uartRxBufferLen = UART8_TX_BUFF_SIZE;
  71. uart8TaskData.frameData = uart8TaskFrameData;
  72. uart8TaskData.frameDataLen = UART8_RX_BUFF_SIZE;
  73. uart8TaskData.huart = &huart8;
  74. uart8TaskData.uartNumber = 8;
  75. uart8TaskData.uartRecieveTaskHandle = osThreadNew (UartRxTask, &uart8TaskData, &osThreadAttrRxUart);
  76. osMessageQueueAttr_t uartTxMsgQueueAttr = { 0 };
  77. uartTxMsgQueueAttr.name = "uart8TxMsgQueue";
  78. uart8TaskData.sendCmdToSlaveQueue = osMessageQueueNew (16, sizeof (InterProcessData), &uartTxMsgQueueAttr);
  79. osThreadAttrTxUart.name = "os_thread_uart8_tx";
  80. osThreadAttrTxUart.stack_size = configMINIMAL_STACK_SIZE * 4;
  81. osThreadAttrTxUart.priority = (osPriority_t)osPriorityNormal;
  82. uart8TaskData.uartTransmitTaskHandle = osThreadNew (UartTxTask, &uart8TaskData, &osThreadAttrTxUart);
  83. }
  84. void HAL_UART_RxCpltCallback (UART_HandleTypeDef* huart) {
  85. // osSemaphoreRelease(uart8RxSemaphore);
  86. }
  87. void HAL_UARTEx_RxEventCallback (UART_HandleTypeDef* huart, uint16_t Size) {
  88. if (huart->Instance == UART8) {
  89. HandleUartRxCallback (&uart8TaskData, huart, Size);
  90. }
  91. }
  92. void HAL_UART_TxCpltCallback (UART_HandleTypeDef* huart) {
  93. if (huart->Instance == UART8) {
  94. }
  95. }
  96. void HandleUartRxCallback (UartTaskData* uartTaskData, UART_HandleTypeDef* huart, uint16_t Size) {
  97. BaseType_t pxHigherPriorityTaskWoken = pdFALSE;
  98. osMutexAcquire (uartTaskData->rxDataBufferMutex, osWaitForever);
  99. memcpy (&(uartTaskData->frameData[uartTaskData->frameBytesCount]), uartTaskData->uartRxBuffer, Size);
  100. uartTaskData->frameBytesCount += Size;
  101. osMutexRelease (uartTaskData->rxDataBufferMutex);
  102. xTaskNotifyFromISR (uartTaskData->uartRecieveTaskHandle, Size, eSetValueWithOverwrite, &pxHigherPriorityTaskWoken);
  103. // HAL_UARTEx_ReceiveToIdle_DMA(huart, uart8RxBuffer, UART8_RX_BUFF_SIZE);
  104. // __HAL_DMA_DISABLE_IT(&hdma_uart8_rx, DMA_IT_HT);
  105. HAL_UARTEx_ReceiveToIdle_IT (uartTaskData->huart, uartTaskData->uartRxBuffer, uartTaskData->uartRxBufferLen);
  106. portEND_SWITCHING_ISR (pxHigherPriorityTaskWoken);
  107. }
  108. void UartRxTask (void* argument) {
  109. UartTaskData* uartTaskData = (UartTaskData*)argument;
  110. SerialProtocolFrameData spFrameData = { 0 };
  111. uint32_t bytesRec = 0;
  112. uint32_t crc = 0;
  113. uint16_t frameCommandRaw = 0x0000;
  114. uint16_t frameBytesCount = 0;
  115. uint16_t frameCrc = 0;
  116. uint16_t frameTotalLength = 0;
  117. uint16_t dataToSend = 0;
  118. portBASE_TYPE crcPass = pdFAIL;
  119. portBASE_TYPE proceed = pdFALSE;
  120. portBASE_TYPE frameTimeout = pdFAIL;
  121. enum SerialReceiverStates receverState = srWaitForHeader;
  122. uartTaskData->rxDataBufferMutex = osMutexNew (NULL);
  123. HAL_UARTEx_ReceiveToIdle_IT (uartTaskData->huart, uartTaskData->uartRxBuffer, uartTaskData->uartRxBufferLen);
  124. // HAL_UARTEx_ReceiveToIdle_DMA(&huart8, uart8RxBuffer, 32);
  125. while (pdTRUE) {
  126. // HAL_UART_Receive_IT(&huart8, uart8RxBuffer, 1);
  127. // if(osSemaphoreAcquire(uart8RxSemaphore, pdMS_TO_TICKS(1000)) !=
  128. // osOK) if(xTaskNotifyWait(0, 0, &bytesRec, portMAX_DELAY) == pdTrue)
  129. frameTimeout = !(xTaskNotifyWait (0, 0, &bytesRec, pdMS_TO_TICKS (FRAME_TIMEOUT_MS)));
  130. osMutexAcquire (uartTaskData->rxDataBufferMutex, osWaitForever);
  131. frameBytesCount = uartTaskData->frameBytesCount;
  132. osMutexRelease (uartTaskData->rxDataBufferMutex);
  133. if ((frameTimeout == pdTRUE) && (frameBytesCount > 0)) {
  134. receverState = srFail;
  135. proceed = pdTRUE;
  136. } else {
  137. if (frameTimeout == pdFALSE) {
  138. proceed = pdTRUE;
  139. #if UART_TASK_LOGS
  140. printf ("Uart%d: RX bytes received: %ld\n", uartTaskData->uartNumber, bytesRec);
  141. #endif
  142. } else {
  143. if (uartTaskData->huart->RxState == HAL_UART_STATE_READY) {
  144. HAL_UARTEx_ReceiveToIdle_IT (uartTaskData->huart, uartTaskData->uartRxBuffer, uartTaskData->uartRxBufferLen);
  145. }
  146. }
  147. }
  148. while (proceed) {
  149. switch (receverState) {
  150. case srWaitForHeader:
  151. osMutexAcquire (uartTaskData->rxDataBufferMutex, osWaitForever);
  152. if (uartTaskData->frameData[0] == FRAME_INDICATOR) {
  153. if (frameBytesCount > FRAME_ID_LENGTH) {
  154. spFrameData.frameHeader.frameId =
  155. CONVERT_BYTES_TO_SHORT_WORD (&(uartTaskData->frameData[FRAME_HEADER_LENGTH - FRAME_RESP_STAT_LENGTH - FRAME_DATALEN_LENGTH - FRAME_ID_LENGTH - FRAME_COMMAND_LENGTH]));
  156. }
  157. if (frameBytesCount > FRAME_ID_LENGTH + FRAME_COMMAND_LENGTH) {
  158. frameCommandRaw = CONVERT_BYTES_TO_SHORT_WORD (&(uartTaskData->frameData[FRAME_HEADER_LENGTH - FRAME_RESP_STAT_LENGTH - FRAME_DATALEN_LENGTH - FRAME_COMMAND_LENGTH]));
  159. spFrameData.frameHeader.frameCommand = (SerialProtocolCommands)(frameCommandRaw & 0x7FFF);
  160. spFrameData.frameHeader.isResponseFrame = (frameCommandRaw & 0x8000) != 0 ? pdTRUE : pdFALSE;
  161. }
  162. if ((frameBytesCount > FRAME_ID_LENGTH + FRAME_COMMAND_LENGTH + FRAME_RESP_STAT_LENGTH) && ((spFrameData.frameHeader.frameCommand & 0x8000) != 0)) {
  163. spFrameData.frameHeader.respStatus = (SerialProtocolRespStatus)(uartTaskData->frameData[FRAME_ID_LENGTH + FRAME_COMMAND_LENGTH + FRAME_RESP_STAT_LENGTH]);
  164. }
  165. if (frameBytesCount >= FRAME_HEADER_LENGTH) {
  166. spFrameData.frameHeader.frameDataLength = CONVERT_BYTES_TO_SHORT_WORD (&(uartTaskData->frameData[FRAME_HEADER_LENGTH - FRAME_RESP_STAT_LENGTH - FRAME_DATALEN_LENGTH]));
  167. frameTotalLength = FRAME_HEADER_LENGTH + spFrameData.frameHeader.frameDataLength + FRAME_CRC_LENGTH;
  168. receverState = srRecieveData;
  169. } else {
  170. proceed = pdFALSE;
  171. }
  172. } else {
  173. if (frameBytesCount > 0) {
  174. receverState = srFail;
  175. } else {
  176. proceed = pdFALSE;
  177. }
  178. }
  179. osMutexRelease (uartTaskData->rxDataBufferMutex);
  180. break;
  181. case srRecieveData:
  182. if (frameBytesCount >= frameTotalLength) {
  183. receverState = srCheckCrc;
  184. } else {
  185. proceed = pdFALSE;
  186. }
  187. break;
  188. case srCheckCrc:
  189. osMutexAcquire (uartTaskData->rxDataBufferMutex, osWaitForever);
  190. frameCrc = CONVERT_BYTES_TO_SHORT_WORD (&(uartTaskData->frameData[frameTotalLength - FRAME_CRC_LENGTH]));
  191. crc = HAL_CRC_Calculate (&hcrc, (uint32_t*)(uartTaskData->frameData), frameTotalLength - FRAME_CRC_LENGTH);
  192. osMutexRelease (uartTaskData->rxDataBufferMutex);
  193. crcPass = frameCrc == crc;
  194. if (crcPass) {
  195. #if UART_TASK_LOGS
  196. printf ("Uart%d: Frame CRC PASS\n", uartTaskData->uartNumber);
  197. #endif
  198. receverState = srExecuteCmd;
  199. } else {
  200. receverState = srFail;
  201. }
  202. break;
  203. case srExecuteCmd:
  204. if (/*(uartTaskData->processDataQueue != NULL) || */(uartTaskData->processDataCb != NULL) || (uartTaskData->processRxDataMsgBuffer != NULL)) {
  205. osMutexAcquire (uartTaskData->rxDataBufferMutex, osWaitForever);
  206. memcpy (spFrameData.dataBuffer, &(uartTaskData->frameData[FRAME_HEADER_LENGTH]), spFrameData.frameHeader.frameDataLength);
  207. osMutexRelease (uartTaskData->rxDataBufferMutex);
  208. }
  209. // if (uartTaskData->processDataQueue != NULL) {
  210. // osMessageQueuePut (uartTaskData->processDataQueue, &spFrameData, 0, osWaitForever);
  211. // }
  212. if (uartTaskData->processRxDataMsgBuffer != NULL) {
  213. if(xMessageBufferSend (uartTaskData->processRxDataMsgBuffer, &spFrameData, sizeof (SerialProtocolFrameHeader) + spFrameData.frameHeader.frameDataLength, pdMS_TO_TICKS (200)) == pdFALSE)
  214. {
  215. receverState = srFail;
  216. break;
  217. }
  218. }
  219. if (uartTaskData->processDataCb != NULL) {
  220. uartTaskData->processDataCb (uartTaskData, &spFrameData);
  221. }
  222. receverState = srFinish;
  223. break;
  224. case srFail:
  225. dataToSend = 0;
  226. if ((frameTimeout == pdTRUE) && (frameBytesCount > 2)) {
  227. dataToSend = PrepareRespFrame (uart8TxBuffer, spFrameData.frameHeader.frameId, spFrameData.frameHeader.frameCommand, spTimeout, NULL, 0);
  228. #if UART_TASK_LOGS
  229. printf ("Uart%d: RX data receiver timeout!\n", uartTaskData->uartNumber);
  230. #endif
  231. } else if (!crcPass) {
  232. dataToSend = PrepareRespFrame (uart8TxBuffer, spFrameData.frameHeader.frameId, spFrameData.frameHeader.frameCommand, spCrcFail, NULL, 0);
  233. #if UART_TASK_LOGS
  234. printf ("Uart%d: Frame CRC FAIL\n", uartTaskData->uartNumber);
  235. #endif
  236. }
  237. else
  238. {
  239. dataToSend = PrepareRespFrame (uart8TxBuffer, spFrameData.frameHeader.frameId, spFrameData.frameHeader.frameCommand, spInternalError, NULL, 0);
  240. }
  241. if (dataToSend > 0) {
  242. HAL_UART_Transmit_IT (&huart8, uart8TxBuffer, dataToSend);
  243. }
  244. #if UART_TASK_LOGS
  245. printf ("Uart%d: TX bytes sent: %d\n", dataToSend, uartTaskData->uartNumber);
  246. #endif
  247. receverState = srFinish;
  248. break;
  249. case srFinish:
  250. default:
  251. osMutexAcquire (uartTaskData->rxDataBufferMutex, osWaitForever);
  252. uartTaskData->frameBytesCount = 0;
  253. osMutexRelease (uartTaskData->rxDataBufferMutex);
  254. spFrameData.frameHeader.frameCommand = spUnknown;
  255. frameTotalLength = 0;
  256. outputDataBufferPos = 0;
  257. receverState = srWaitForHeader;
  258. proceed = pdFALSE;
  259. break;
  260. }
  261. }
  262. }
  263. }
  264. void Uart8ReceivedDataProcessCallback (void* arg, SerialProtocolFrameData* spFrameData) {
  265. UartTaskData* uartTaskData = (UartTaskData*)arg;
  266. uint16_t dataToSend = 0;
  267. switch (spFrameData->frameHeader.frameCommand) {
  268. case spGetElectricalMeasurments:
  269. float slaveVoltage = 48.0 + rndflt (0.5);
  270. slaveVoltage = 48.0 + rndflt (1);
  271. WriteDataToBuffer (outputDataBuffer, &outputDataBufferPos, &slaveVoltage, sizeof (float));
  272. WriteDataToBuffer (outputDataBuffer, &outputDataBufferPos, &slaveVoltage, sizeof (float));
  273. slaveVoltage = 47.5 + rndflt (0.5);
  274. WriteDataToBuffer (outputDataBuffer, &outputDataBufferPos, &slaveVoltage, sizeof (float));
  275. break;
  276. case spGetSensorMeasurments: break;
  277. default: break;
  278. }
  279. if (outputDataBufferPos > 0) {
  280. dataToSend = PrepareRespFrame (uart8TxBuffer, spFrameData->frameHeader.frameId, spFrameData->frameHeader.frameCommand, spOK, outputDataBuffer, outputDataBufferPos);
  281. }
  282. if (dataToSend > 0) {
  283. // HAL_UART_Transmit_DMA(&huart8, uart8TxBuffer, dataToSend);
  284. HAL_UART_Transmit_IT (uartTaskData->huart, uart8TxBuffer, dataToSend);
  285. }
  286. #if UART_TASK_LOGS
  287. printf ("Uart%d: TX bytes sent: %d\n", uartTaskData->uartNumber, dataToSend);
  288. #endif
  289. }
  290. void ReadMeasSetFromBuffer(uint8_t* buff, uint16_t* buffPos, float* dataSet)
  291. {
  292. for(uint8_t i = 0; i < 3; i++)
  293. {
  294. ReadFloatFromBuffer(buff, buffPos, &dataSet[i]);
  295. }
  296. }
  297. void UartTxTask (void* argument) {
  298. UartTaskData* const uartTaskData = (UartTaskData*)argument;
  299. InterProcessData data = { 0 };
  300. SerialProtocolFrameData frameData = { 0 };
  301. size_t bytesInMsg;
  302. uint16_t frameId = 0;
  303. uint32_t rndVal = 0;
  304. uint16_t bytesToSend = 0;
  305. SerialProtocolCommands frameCommand = spUnknown;
  306. uint16_t inputDataBufferPos = 0;
  307. uint8_t boardNumber = 0;
  308. while (pdTRUE) {
  309. if (uartTaskData->sendCmdToSlaveQueue != NULL) {
  310. osMessageQueueGet (uartTaskData->sendCmdToSlaveQueue, &data, 0, osWaitForever);
  311. HAL_RNG_GenerateRandomNumber (&hrng, &rndVal);
  312. frameId = (uint16_t)(rndVal & 0xFFFF);
  313. frameCommand = data.spCommand;
  314. outputDataBufferPos = 0;
  315. memset (outputDataBuffer, 0x00, OUTPUT_DATA_BUFF_SIZE);
  316. switch (frameCommand) {
  317. case spSetFanSpeed:
  318. case spSetMotorXOn:
  319. case spSetMotorYOn:
  320. WriteDataToBuffer (outputDataBuffer, &outputDataBufferPos, &data.values.integerValues.value[0], sizeof (float));
  321. WriteDataToBuffer (outputDataBuffer, &outputDataBufferPos, &data.values.integerValues.value[1], sizeof (float));
  322. break;
  323. case spSetDiodeOn: WriteDataToBuffer (outputDataBuffer, &outputDataBufferPos, &data.values.integerValues.value[0], sizeof (float)); break;
  324. case spSetmotorXMaxCurrent:
  325. case spSetmotorYMaxCurrent: WriteDataToBuffer (outputDataBuffer, &outputDataBufferPos, &data.values.flaotValues.value[0], sizeof (float)); break;
  326. case spGetElectricalMeasurments:
  327. case spGetSensorMeasurments: break;
  328. default: continue; break;
  329. }
  330. bytesToSend = PrepareReqFrame (uart8TxBuffer, frameId, frameCommand, outputDataBuffer, outputDataBufferPos);
  331. HAL_UART_Transmit_IT (uartTaskData->huart, uart8TxBuffer, bytesToSend);
  332. bytesInMsg = xMessageBufferReceive (uartTaskData->processRxDataMsgBuffer, &frameData, INPUT_DATA_BUFF_SIZE, pdMS_TO_TICKS (1000));
  333. for(boardNumber = 0; boardNumber < SLAVES_COUNT; boardNumber++)
  334. {
  335. if(boardToUartNumberMap[boardNumber] == uartTaskData->uartNumber)
  336. {
  337. break;
  338. }
  339. }
  340. if (bytesInMsg == 0) {
  341. if (frameCommand == spGetElectricalMeasurments)
  342. {
  343. osMutexAcquire (resMeasurementsMutex, osWaitForever);
  344. slaveLastSeen[boardNumber]++;
  345. osMutexRelease(resMeasurementsMutex);
  346. }
  347. #if UART_TASK_LOGS
  348. printf ("Uart%d: Response timeout for frameId 0x%x\n", uartTaskData->uartNumber, frameId);
  349. #endif
  350. } else {
  351. if ((frameId == frameData.frameHeader.frameId) && (frameData.frameHeader.respStatus == spOK)) {
  352. #if UART_TASK_LOGS
  353. printf ("Uart%d: Response for frameId 0x%x OK\n", uartTaskData->uartNumber, frameId);
  354. #endif
  355. slaveLastSeen[boardNumber] = 0;
  356. switch(frameData.frameHeader.frameCommand)
  357. {
  358. case spGetElectricalMeasurments:
  359. osMutexAcquire (resMeasurementsMutex, osWaitForever);
  360. RESMeasurements *resMeas = &resMeasurements[boardNumber];
  361. inputDataBufferPos = 0;
  362. ReadMeasSetFromBuffer(frameData.dataBuffer, &inputDataBufferPos, resMeas->voltageRMS);
  363. ReadMeasSetFromBuffer(frameData.dataBuffer, &inputDataBufferPos, resMeas->voltagePeak);
  364. ReadMeasSetFromBuffer(frameData.dataBuffer, &inputDataBufferPos, resMeas->currentRMS);
  365. ReadMeasSetFromBuffer(frameData.dataBuffer, &inputDataBufferPos, resMeas->currentPeak);
  366. ReadMeasSetFromBuffer(frameData.dataBuffer, &inputDataBufferPos, resMeas->power);
  367. osMutexRelease(resMeasurementsMutex);
  368. break;
  369. case spGetSensorMeasurments:
  370. osMutexAcquire (sensorsInfoMutex, osWaitForever);
  371. inputDataBufferPos = 0;
  372. SesnorsInfo* sensors = &sensorsInfo[boardNumber];
  373. ReadFloatFromBuffer(frameData.dataBuffer, &inputDataBufferPos, &sensors->pvTemperature[0]);
  374. ReadFloatFromBuffer(frameData.dataBuffer, &inputDataBufferPos, &sensors->pvTemperature[1]);
  375. ReadFloatFromBuffer(frameData.dataBuffer, &inputDataBufferPos, &sensors->fanVoltage);
  376. ReadFloatFromBuffer(frameData.dataBuffer, &inputDataBufferPos, &sensors->pvEncoder);
  377. ReadByteFromBufer(frameData.dataBuffer, &inputDataBufferPos, &sensors->motorXStatus);
  378. ReadByteFromBufer(frameData.dataBuffer, &inputDataBufferPos, &sensors->motorYStatus);
  379. ReadFloatFromBuffer(frameData.dataBuffer, &inputDataBufferPos, &sensors->motorXAveCurrent);
  380. ReadFloatFromBuffer(frameData.dataBuffer, &inputDataBufferPos, &sensors->motorYAveCurrent);
  381. ReadFloatFromBuffer(frameData.dataBuffer, &inputDataBufferPos, &sensors->motorXPeakCurrent);
  382. ReadFloatFromBuffer(frameData.dataBuffer, &inputDataBufferPos, &sensors->motorYPeakCurrent);
  383. ReadByteFromBufer(frameData.dataBuffer, &inputDataBufferPos, &sensors->limitSwitchUp);
  384. ReadByteFromBufer(frameData.dataBuffer, &inputDataBufferPos, &sensors->limitSwitchDown);
  385. ReadByteFromBufer(frameData.dataBuffer, &inputDataBufferPos, &sensors->limitSwitchCenter);
  386. ReadByteFromBufer(frameData.dataBuffer, &inputDataBufferPos, &sensors->powerSupplyFailMask);
  387. osMutexRelease(sensorsInfoMutex);
  388. break;
  389. default:
  390. break;
  391. }
  392. }
  393. }
  394. } else {
  395. osDelay (pdMS_TO_TICKS (1000));
  396. }
  397. }
  398. }
  399. void MeasurmentsReqSchedulerTaskInit (void) {
  400. osThreadAttr_t osThreadAttrMeasurmentsReqSchedulerTask = { 0 };
  401. osThreadAttrMeasurmentsReqSchedulerTask.name = "os_thread_XXX";
  402. osThreadAttrMeasurmentsReqSchedulerTask.stack_size = configMINIMAL_STACK_SIZE * 2;
  403. osThreadAttrMeasurmentsReqSchedulerTask.priority = (osPriority_t)osPriorityNormal;
  404. osThreadNew (MeasurmentsReqSchedulerTask, uartTasks, &osThreadAttrMeasurmentsReqSchedulerTask);
  405. }
  406. void MeasurmentsReqSchedulerTask (void* argument) {
  407. while (pdTRUE) {
  408. __uintptr_t* ptr = (__uintptr_t*)argument;
  409. while (*ptr != 0) {
  410. UartTaskData* uartTask = (UartTaskData*)*ptr;
  411. if (uartTask->sendCmdToSlaveQueue != NULL) {
  412. InterProcessData data = { 0 };
  413. uint8_t boardNumber = 0;
  414. for(boardNumber = 0; boardNumber < SLAVES_COUNT; boardNumber++)
  415. {
  416. if(boardToUartNumberMap[boardNumber] == uartTask->uartNumber)
  417. {
  418. break;
  419. }
  420. }
  421. data.spCommand = spGetElectricalMeasurments;
  422. osMessageQueuePut (uartTask->sendCmdToSlaveQueue, &data, 0, (TickType_t)100);
  423. osMutexAcquire (resMeasurementsMutex, osWaitForever);
  424. if(slaveLastSeen[boardNumber] == 0)
  425. {
  426. data.spCommand = spGetSensorMeasurments;
  427. osMessageQueuePut (uartTask->sendCmdToSlaveQueue, &data, 0, (TickType_t)100);
  428. }
  429. osMutexRelease(resMeasurementsMutex);
  430. }
  431. ptr++;
  432. }
  433. osDelay (pdMS_TO_TICKS (1000));
  434. }
  435. }