|
@@ -34,12 +34,16 @@ 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 };
|
|
|
|
|
|
|
|
+uint8_t boardToUartNumberMap[SLAVES_COUNT] = { /*1*/ 8, 3, 6, 2 };
|
|
|
|
+
|
|
UartTaskData uart1TaskData = { 0 }; // Board 1
|
|
UartTaskData uart1TaskData = { 0 }; // Board 1
|
|
UartTaskData uart3TaskData = { 0 }; // Board 2
|
|
UartTaskData uart3TaskData = { 0 }; // Board 2
|
|
UartTaskData uart6TaskData = { 0 }; // Board 3
|
|
UartTaskData uart6TaskData = { 0 }; // Board 3
|
|
UartTaskData uart2TaskData = { 0 }; // Board 4
|
|
UartTaskData uart2TaskData = { 0 }; // Board 4
|
|
UartTaskData uart8TaskData = { 0 }; // Debug
|
|
UartTaskData uart8TaskData = { 0 }; // Debug
|
|
|
|
|
|
|
|
+UartTaskData* uartTasks[] = { &uart8TaskData, NULL };
|
|
|
|
+
|
|
uint8_t outputDataBuffer[OUTPUT_DATA_BUFF_SIZE];
|
|
uint8_t outputDataBuffer[OUTPUT_DATA_BUFF_SIZE];
|
|
uint16_t outputDataBufferPos = 0;
|
|
uint16_t outputDataBufferPos = 0;
|
|
|
|
|
|
@@ -311,6 +315,14 @@ void Uart8ReceivedDataProcessCallback (void* arg, SerialProtocolFrameData* spFra
|
|
#endif
|
|
#endif
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+void ReadMeasSetFromBuffer(uint8_t* buff, uint16_t* buffPos, float* dataSet)
|
|
|
|
+{
|
|
|
|
+ for(uint8_t i = 0; i < 3; i++)
|
|
|
|
+ {
|
|
|
|
+ ReadFloatFromBuffer(buff, buffPos, &dataSet[i]);
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
void UartTxTask (void* argument) {
|
|
void UartTxTask (void* argument) {
|
|
UartTaskData* const uartTaskData = (UartTaskData*)argument;
|
|
UartTaskData* const uartTaskData = (UartTaskData*)argument;
|
|
InterProcessData data = { 0 };
|
|
InterProcessData data = { 0 };
|
|
@@ -320,54 +332,99 @@ void UartTxTask (void* argument) {
|
|
uint32_t rndVal = 0;
|
|
uint32_t rndVal = 0;
|
|
uint16_t bytesToSend = 0;
|
|
uint16_t bytesToSend = 0;
|
|
SerialProtocolCommands frameCommand = spUnknown;
|
|
SerialProtocolCommands frameCommand = spUnknown;
|
|
|
|
+ uint16_t inputDataBufferPos = 0;
|
|
|
|
|
|
while (pdTRUE) {
|
|
while (pdTRUE) {
|
|
if (uartTaskData->sendCmdToSlaveQueue != NULL) {
|
|
if (uartTaskData->sendCmdToSlaveQueue != NULL) {
|
|
osMessageQueueGet (uartTaskData->sendCmdToSlaveQueue, &data, 0, osWaitForever);
|
|
osMessageQueueGet (uartTaskData->sendCmdToSlaveQueue, &data, 0, osWaitForever);
|
|
HAL_RNG_GenerateRandomNumber (&hrng, &rndVal);
|
|
HAL_RNG_GenerateRandomNumber (&hrng, &rndVal);
|
|
- frameId = (uint16_t)(rndVal & 0xFFFF);
|
|
|
|
- frameCommand = data.spCommand;
|
|
|
|
|
|
+ frameId = (uint16_t)(rndVal & 0xFFFF);
|
|
|
|
+ frameCommand = data.spCommand;
|
|
outputDataBufferPos = 0;
|
|
outputDataBufferPos = 0;
|
|
- memset(outputDataBuffer, 0x00, OUTPUT_DATA_BUFF_SIZE);
|
|
|
|
- switch(frameCommand)
|
|
|
|
- {
|
|
|
|
|
|
+ memset (outputDataBuffer, 0x00, OUTPUT_DATA_BUFF_SIZE);
|
|
|
|
+ switch (frameCommand) {
|
|
case spSetFanSpeed:
|
|
case spSetFanSpeed:
|
|
case spSetMotorXOn:
|
|
case spSetMotorXOn:
|
|
case spSetMotorYOn:
|
|
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;
|
|
|
|
|
|
+ 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 spSetmotorXMaxCurrent:
|
|
- case spSetmotorYMaxCurrent:
|
|
|
|
- WriteDataToBuffer (outputDataBuffer, &outputDataBufferPos, &data.values.flaotValues.value[0], sizeof (float));
|
|
|
|
- break;
|
|
|
|
|
|
+ case spSetmotorYMaxCurrent: WriteDataToBuffer (outputDataBuffer, &outputDataBufferPos, &data.values.flaotValues.value[0], sizeof (float)); break;
|
|
case spGetElectricalMeasurments:
|
|
case spGetElectricalMeasurments:
|
|
- case spGetSensorMeasurments:
|
|
|
|
- break;
|
|
|
|
- default:
|
|
|
|
- continue;
|
|
|
|
- break;
|
|
|
|
|
|
+ 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);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
|
|
+ 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) {
|
|
|
|
+#if UART_TASK_LOGS
|
|
|
|
+ printf ("Uart%d: Response timeout for frameId 0x%x\n", uartTaskData->uartNumber, frameId);
|
|
|
|
+#endif
|
|
|
|
+ } else {
|
|
|
|
+ if ((frameId == frameData.frameHeader.frameId) && (frameData.frameHeader.respStatus == spOK)) {
|
|
|
|
+#if UART_TASK_LOGS
|
|
|
|
+ printf ("Uart%d: Response for frameId 0x%x OK\n", uartTaskData->uartNumber, frameId);
|
|
|
|
+#endif
|
|
|
|
+ switch(frameData.frameHeader.frameCommand)
|
|
|
|
+ {
|
|
|
|
+ case spGetElectricalMeasurments:
|
|
|
|
+ uint8_t boardNumber;
|
|
|
|
+ osMutexAcquire (resMeasurementsMutex, osWaitForever);
|
|
|
|
+ for(boardNumber = 0; boardNumber < SLAVES_COUNT; boardNumber++)
|
|
|
|
+ {
|
|
|
|
+ if(boardToUartNumberMap[boardNumber] == uartTaskData->uartNumber)
|
|
|
|
+ {
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ RESMeasurements *resMeas = &resMeasurements[boardNumber];
|
|
|
|
+ inputDataBufferPos = 0;
|
|
|
|
+ ReadMeasSetFromBuffer(frameData.dataBuffer, &inputDataBufferPos, resMeas->voltageRMS);
|
|
|
|
+ ReadMeasSetFromBuffer(frameData.dataBuffer, &inputDataBufferPos, resMeas->voltagePeak);
|
|
|
|
+ ReadMeasSetFromBuffer(frameData.dataBuffer, &inputDataBufferPos, resMeas->currentRMS);
|
|
|
|
+ ReadMeasSetFromBuffer(frameData.dataBuffer, &inputDataBufferPos, resMeas->currentPeak);
|
|
|
|
+ ReadMeasSetFromBuffer(frameData.dataBuffer, &inputDataBufferPos, resMeas->power);
|
|
|
|
+ osMutexRelease(resMeasurementsMutex);
|
|
|
|
+ break;
|
|
|
|
+ default:
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
} else {
|
|
} else {
|
|
osDelay (pdMS_TO_TICKS (1000));
|
|
osDelay (pdMS_TO_TICKS (1000));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+void MeasurmentsReqSchedulerTaskTaskInit (void) {
|
|
|
|
+ osThreadAttr_t osThreadAttrMeasurmentsReqSchedulerTask = { 0 };
|
|
|
|
+
|
|
|
|
+ osThreadAttrMeasurmentsReqSchedulerTask.name = "os_thread_XXX";
|
|
|
|
+ osThreadAttrMeasurmentsReqSchedulerTask.stack_size = configMINIMAL_STACK_SIZE * 2;
|
|
|
|
+ osThreadAttrMeasurmentsReqSchedulerTask.priority = (osPriority_t)osPriorityNormal;
|
|
|
|
+
|
|
|
|
+ osThreadNew (MeasurmentsReqSchedulerTask, uartTasks, &osThreadAttrMeasurmentsReqSchedulerTask);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void MeasurmentsReqSchedulerTask (void* argument) {
|
|
|
|
+ while (pdTRUE) {
|
|
|
|
+ __uintptr_t* ptr = (__uintptr_t*)argument;
|
|
|
|
+ while (*ptr != 0) {
|
|
|
|
+ UartTaskData* uartTask = (UartTaskData*)*ptr;
|
|
|
|
+ if (uartTask->sendCmdToSlaveQueue != NULL) {
|
|
|
|
+ InterProcessData data = { 0 };
|
|
|
|
+ data.spCommand = spGetElectricalMeasurments;
|
|
|
|
+ osMessageQueuePut (uartTask->sendCmdToSlaveQueue, &data, 0, (TickType_t)100);
|
|
|
|
+ // data.spCommand = spGetSensorMeasurments;
|
|
|
|
+ // osMessageQueuePut (uartTask->sendCmdToSlaveQueue, &data, 0, (TickType_t)100);
|
|
|
|
+ }
|
|
|
|
+ ptr++;
|
|
|
|
+ }
|
|
|
|
+ osDelay (pdMS_TO_TICKS (1000));
|
|
|
|
+ }
|
|
|
|
+}
|