287 lines
6.5 KiB
C
287 lines
6.5 KiB
C
|
|
|||
|
#include "slaveMcuDataParse.h"
|
|||
|
#include "slaveMcuComm.h"
|
|||
|
|
|||
|
static void stateMachine(void);
|
|||
|
|
|||
|
/* ״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
static uint8_t analysisWait(void);
|
|||
|
static uint8_t analysisStartFlagSL(void);
|
|||
|
static uint8_t analysisPortSL(void);
|
|||
|
static uint8_t analysisLengthSL(void);
|
|||
|
static uint8_t analysisEndFlagSL(void);
|
|||
|
|
|||
|
/**
|
|||
|
* @brief ״̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* @param
|
|||
|
* @retval
|
|||
|
*/
|
|||
|
void stateMachine(void)
|
|||
|
{
|
|||
|
if (state == wait) {
|
|||
|
if (analysisWait() == TRUE) {
|
|||
|
mcuUartRxTime = xTaskGetTickCount();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
else if (state == startFlagSL) {
|
|||
|
analysisStartFlagSL();
|
|||
|
}
|
|||
|
|
|||
|
else if (state == portSL) {
|
|||
|
analysisPortSL();
|
|||
|
}
|
|||
|
|
|||
|
else if (state == lengthSL) {
|
|||
|
analysisLengthSL();
|
|||
|
}
|
|||
|
|
|||
|
else if (state == endFlagSL) {
|
|||
|
analysisEndFlagSL();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/**
|
|||
|
* @brief ״̬ wait
|
|||
|
* @param
|
|||
|
* @retval 0:<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD>
|
|||
|
1:<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD>
|
|||
|
*/
|
|||
|
#define waitMaxLen 2
|
|||
|
uint8_t analysisWait(void)
|
|||
|
{
|
|||
|
if (mcuUartRxBufferIndex >= 2) {
|
|||
|
/* <><CDB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><D6A1>ͷ */
|
|||
|
if (mcuUartRxBuffer[0] == 'S' && mcuUartRxBuffer[1] == 'L') {
|
|||
|
// log_info("startFlagSL\n");
|
|||
|
state = startFlagSL;
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (mcuUartRxBufferIndex < waitMaxLen) {
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
state = wait;
|
|||
|
mcuUartRxBufferIndex--;
|
|||
|
memcpy(mcuUartRxBuffer, mcuUartRxBuffer + 1, mcuUartRxBufferIndex);
|
|||
|
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @brief ״̬ startFlagSL
|
|||
|
* @param
|
|||
|
* @retval 0:<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD>
|
|||
|
1:<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD>
|
|||
|
*/
|
|||
|
uint8_t analysisStartFlagSL(void)
|
|||
|
{
|
|||
|
/* У<><D0A3><EFBFBD>˿ں<CBBF> */
|
|||
|
if (mcuUartRxBuffer[2] < 13) {
|
|||
|
// log_info("portSL\n");
|
|||
|
state = portSL;
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
// log_error("portSL %d \n", gw485RxBuffer[2]);
|
|||
|
state = wait;
|
|||
|
mcuUartRxBufferIndex--;
|
|||
|
memcpy(mcuUartRxBuffer, mcuUartRxBuffer + 1, mcuUartRxBufferIndex);
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @brief ״̬ portSL
|
|||
|
* @param
|
|||
|
* @retval 0:<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD>
|
|||
|
1:<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD>
|
|||
|
*/
|
|||
|
#define PortSLMaxLen 5
|
|||
|
uint8_t analysisPortSL(void)
|
|||
|
{
|
|||
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><DDB0>Ķ<EFBFBD> */
|
|||
|
if (mcuUartRxBufferIndex >= PortSLMaxLen) {
|
|||
|
uint32_t tempLen = 0;
|
|||
|
tempLen = (mcuUartRxBuffer[3] << 8) | mcuUartRxBuffer[4];
|
|||
|
|
|||
|
if (tempLen <= 1024) {
|
|||
|
// log_info("lengthSL\n");
|
|||
|
state = lengthSL;
|
|||
|
frameLength = 6 + tempLen;
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (mcuUartRxBufferIndex < PortSLMaxLen) {
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
// log_error("lengthSL %d \n", (gw485RxBuffer[3] << 8) | gw485RxBuffer[4]);
|
|||
|
|
|||
|
state = wait;
|
|||
|
mcuUartRxBufferIndex--;
|
|||
|
memcpy(mcuUartRxBuffer, mcuUartRxBuffer + 1, mcuUartRxBufferIndex);
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @brief ״̬ lengthSL
|
|||
|
* @param
|
|||
|
* @retval 0:<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD>
|
|||
|
1:<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD>
|
|||
|
*/
|
|||
|
#define LengthSLMaxLen frameLength
|
|||
|
uint8_t analysisLengthSL(void)
|
|||
|
{
|
|||
|
/* <20><><EFBFBD><EFBFBD>֡β */
|
|||
|
if (mcuUartRxBufferIndex >= LengthSLMaxLen) {
|
|||
|
if (mcuUartRxBuffer[LengthSLMaxLen - 1] == 0x17) {
|
|||
|
// log_info("endFlagSL\n");
|
|||
|
state = endFlagSL;
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (mcuUartRxBufferIndex < LengthSLMaxLen) {
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
// log_info("endFlagSL %d\n", gw485RxBuffer[LengthSLMaxLen - 1]);
|
|||
|
|
|||
|
state = wait;
|
|||
|
mcuUartRxBufferIndex--;
|
|||
|
memcpy(mcuUartRxBuffer, mcuUartRxBuffer + 1, mcuUartRxBufferIndex);
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @brief ״̬ endFlagSL
|
|||
|
* @param
|
|||
|
* @retval 0:<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD>
|
|||
|
1:<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD>
|
|||
|
*/
|
|||
|
uint8_t analysisEndFlagSL(void)
|
|||
|
{
|
|||
|
uint32_t tempLen = 0;
|
|||
|
tempLen = (mcuUartRxBuffer[3] << 8) | mcuUartRxBuffer[4];
|
|||
|
|
|||
|
if (mcuUartRxBuffer[2] == SlaveMcu) {
|
|||
|
slaveFrameDataAnalyze(mcuUartRxBuffer, mcuUartRxBufferIndex);
|
|||
|
mcuUartRxBufferIndex = 0;
|
|||
|
state = wait;
|
|||
|
return 1;
|
|||
|
}
|
|||
|
|
|||
|
//ϵͳ<CFB5>ڴ治<DAB4>㣬<EFBFBD><E3A3AC>ȥ<EFBFBD><C8A5>ǰ<EFBFBD><C7B0>
|
|||
|
if (xPortGetFreeHeapSize() < tempLen + 1024) {
|
|||
|
goto err;
|
|||
|
}
|
|||
|
|
|||
|
/* <20><><EFBFBD>ڲ<EFBFBD>ͬͨ<CDAC>˿ڣ<CBBF><DAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ľṹ<C4BD>岻ͬ */
|
|||
|
uint8_t *Buff;
|
|||
|
|
|||
|
Buff = (uint8_t *)pvPortMalloc(tempLen + slaveQueueUartSendInfoSize);
|
|||
|
slaveQueueUartSendInfo *sendBuff = (slaveQueueUartSendInfo *)Buff;
|
|||
|
sendBuff->length = tempLen;
|
|||
|
sendBuff->data = Buff + slaveQueueUartSendInfoSize;
|
|||
|
memcpy((char *)sendBuff->data, (char *)&mcuUartRxBuffer[5], tempLen);
|
|||
|
|
|||
|
|
|||
|
/* ͨ<><CDA8><EFBFBD><EFBFBD>ͬ<EFBFBD>Ķ˿ڽ<CBBF><DABD><EFBFBD><EFBFBD>ݷ<EFBFBD><DDB7>͵<EFBFBD><CDB5><EFBFBD>ͬ<EFBFBD>ĵط<C4B5> */
|
|||
|
if (mcuUartRxBuffer[2] == J1) {
|
|||
|
if (uxQueueSpacesAvailable(J1_485_Queue)) {
|
|||
|
xQueueSend(J1_485_Queue, &Buff, 10);
|
|||
|
}
|
|||
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ռ䣬<D5BC>ͷ<EFBFBD><CDB7>ڴ棬<DAB4>˳<EFBFBD> */
|
|||
|
else {
|
|||
|
vPortFree(Buff);
|
|||
|
}
|
|||
|
}
|
|||
|
else if (mcuUartRxBuffer[2] == J3) {
|
|||
|
if (uxQueueSpacesAvailable(J3_485_Queue)) {
|
|||
|
xQueueSend(J3_485_Queue, &Buff, 10);
|
|||
|
}
|
|||
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ռ䣬<D5BC>ͷ<EFBFBD><CDB7>ڴ棬<DAB4>˳<EFBFBD> */
|
|||
|
else {
|
|||
|
vPortFree(Buff);
|
|||
|
}
|
|||
|
}
|
|||
|
else if (mcuUartRxBuffer[2] == J5) {
|
|||
|
if (uxQueueSpacesAvailable(J5_485_Queue)) {
|
|||
|
xQueueSend(J5_485_Queue, &Buff, 10);
|
|||
|
}
|
|||
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ռ䣬<D5BC>ͷ<EFBFBD><CDB7>ڴ棬<DAB4>˳<EFBFBD> */
|
|||
|
else {
|
|||
|
vPortFree(Buff);
|
|||
|
}
|
|||
|
}
|
|||
|
else if (mcuUartRxBuffer[2] == J7) {
|
|||
|
if (uxQueueSpacesAvailable(J7_485_Queue)) {
|
|||
|
xQueueSend(J7_485_Queue, &Buff, 10);
|
|||
|
}
|
|||
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ռ䣬<D5BC>ͷ<EFBFBD><CDB7>ڴ棬<DAB4>˳<EFBFBD> */
|
|||
|
else {
|
|||
|
vPortFree(Buff);
|
|||
|
}
|
|||
|
}
|
|||
|
else if (mcuUartRxBuffer[2] == J8) {
|
|||
|
if (uxQueueSpacesAvailable(J8_485_Queue)) {
|
|||
|
xQueueSend(J8_485_Queue, &Buff, 10);
|
|||
|
}
|
|||
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ռ䣬<D5BC>ͷ<EFBFBD><CDB7>ڴ棬<DAB4>˳<EFBFBD> */
|
|||
|
else {
|
|||
|
vPortFree(Buff);
|
|||
|
}
|
|||
|
}
|
|||
|
else if (mcuUartRxBuffer[2] == J9) {
|
|||
|
if (uxQueueSpacesAvailable(J9_485_Queue)) {
|
|||
|
xQueueSend(J9_485_Queue, &Buff, 10);
|
|||
|
}
|
|||
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ռ䣬<D5BC>ͷ<EFBFBD><CDB7>ڴ棬<DAB4>˳<EFBFBD> */
|
|||
|
else {
|
|||
|
vPortFree(Buff);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
err:
|
|||
|
//<2F><><EFBFBD><EFBFBD>buff
|
|||
|
state = wait;
|
|||
|
mcuUartRxBufferIndex = 0;
|
|||
|
return 1;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD>鷢<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* @param device <EFBFBD><EFBFBD><EFBFBD>ڽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD>鷢<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵĴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>豸
|
|||
|
* @retval
|
|||
|
*/
|
|||
|
void slaveMcuUartDataAnalysis(device_handle device)
|
|||
|
{
|
|||
|
/* ÿ<>κ<EFBFBD><CEBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4>10ms */
|
|||
|
static uint32_t tickstart = 0U;
|
|||
|
tickstart = xTaskGetTickCount();
|
|||
|
|
|||
|
/* 2Sδ<53><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ֡<D2BB><D6A1><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
if (getTickDiff(mcuUartRxTime) >= tick_2S) {
|
|||
|
mcuUartRxTime = xTaskGetTickCount();
|
|||
|
mcuUartRxBufferIndex = 0;
|
|||
|
state = wait;
|
|||
|
}
|
|||
|
|
|||
|
while (uart_dev_char_present(device) == 1 && ((xTaskGetTickCount() - tickstart) < 5)) {
|
|||
|
mcuUartRxBuffer[mcuUartRxBufferIndex++] = uart_dev_in_char(device);
|
|||
|
stateMachine();
|
|||
|
}
|
|||
|
|
|||
|
if (uart_dev_char_present(device) != 1 && state != wait) {
|
|||
|
stateMachine();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|