gateway_mcu/CH32V303-FreeRTOS/App/application/Host/Src/hostMcuDataParse.c

299 lines
7.0 KiB
C
Raw Normal View History

#include "hostMcuDataParse.h"
#include "hostMcuComm.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) {
su806UartRxTime = 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 (su806RxBufferIndex >= 2) {
/* ͸<><CDB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><D6A1>ͷ */
if (su806RxBuffer[0] == 'S' && su806RxBuffer[1] == 'L') {
// log_info("startFlagSL\n");
state = startFlagSL;
return TRUE;
}
}
if (su806RxBufferIndex < waitMaxLen) {
return FALSE;
}
state = wait;
su806RxBufferIndex--;
memcpy(su806RxBuffer, su806RxBuffer + 1, su806RxBufferIndex);
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 (su806RxBuffer[2] < 13) {
// log_info("portSL\n");
state = portSL;
return TRUE;
}
// log_error("portSL %d \n", gw485RxBuffer[2]);
state = wait;
su806RxBufferIndex--;
memcpy(su806RxBuffer, su806RxBuffer + 1, su806RxBufferIndex);
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 (su806RxBufferIndex >= PortSLMaxLen) {
uint32_t tempLen = 0;
tempLen = (su806RxBuffer[3] << 8) | su806RxBuffer[4];
if (tempLen <= 1024) {
// log_info("lengthSL\n");
state = lengthSL;
frameLength = 6 + tempLen;
return TRUE;
}
}
if (su806RxBufferIndex < PortSLMaxLen) {
return FALSE;
}
// log_error("lengthSL %d \n", (gw485RxBuffer[3] << 8) | gw485RxBuffer[4]);
state = wait;
su806RxBufferIndex--;
memcpy(su806RxBuffer, su806RxBuffer + 1, su806RxBufferIndex);
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 (su806RxBufferIndex >= LengthSLMaxLen) {
if (su806RxBuffer[LengthSLMaxLen - 1] == 0x17) {
// log_info("endFlagSL\n");
state = endFlagSL;
return TRUE;
}
}
if (su806RxBufferIndex < LengthSLMaxLen) {
return FALSE;
}
// log_info("endFlagSL %d\n", gw485RxBuffer[LengthSLMaxLen - 1]);
state = wait;
su806RxBufferIndex--;
memcpy(su806RxBuffer, su806RxBuffer + 1, su806RxBufferIndex);
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 = (su806RxBuffer[3] << 8) | su806RxBuffer[4];
if (su806RxBuffer[2] == HostMcu) {
hostFrameDataAnalyze(su806RxBuffer, su806RxBufferIndex);
su806RxBufferIndex = 0;
state = wait;
return 1;
}
//ϵͳ<CFB5>ڴ治<DAB4><EFBFBD><E3A3AC>ȥ<EFBFBD><C8A5>ǰ<EFBFBD><C7B0>
if (xPortGetFreeHeapSize() < tempLen + 1024) {
goto err;
}
uint8_t *Buff;
/* <20><><EFBFBD>ڴ<EFBFBD>mcu<63><75><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>ԭ<EFBFBD><EFBFBD><E2B2BB><EFBFBD>ķ<EFBFBD><C4B7>͵<EFBFBD><CDB5><EFBFBD>mcu<63><75> */
if (su806RxBuffer[2] == J1
|| su806RxBuffer[2] == J3
|| su806RxBuffer[2] == J5
|| su806RxBuffer[2] == J7
|| su806RxBuffer[2] == J8
|| su806RxBuffer[2] == J9
|| su806RxBuffer[2] == SlaveMcu) {
Buff = (uint8_t *)pvPortMalloc(tempLen + hostQueueUartSendInfoSize + 6);
hostQueueUartSendInfo *sendBuff = (hostQueueUartSendInfo *)Buff;
sendBuff->length = tempLen + 6;
sendBuff->data = Buff + hostQueueUartSendInfoSize;
memcpy((char *)sendBuff->data, (char *)su806RxBuffer, tempLen + 6);
if (uxQueueSpacesAvailable(hostMcu_uart_Queue)) {
xQueueSend(hostMcu_uart_Queue, &Buff, 10);
}
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޿ռ<D5BC>ͷ<EFBFBD><CDB7>ڴ棬<DAB4>˳<EFBFBD> */
else {
vPortFree(Buff);
}
}
Buff = (uint8_t *)pvPortMalloc(tempLen + hostQueueUartSendInfoSize);
hostQueueUartSendInfo *sendBuff = (hostQueueUartSendInfo *)Buff;
sendBuff->length = tempLen;
sendBuff->data = Buff + hostQueueUartSendInfoSize;
memcpy((char *)sendBuff->data, (char *)&su806RxBuffer[5], tempLen);
/* ͨ<><CDA8><EFBFBD><EFBFBD>ͬ<EFBFBD>Ķ˿ڽ<CBBF><DABD><EFBFBD><EFBFBD>ݷ<EFBFBD><DDB7>͵<EFBFBD><CDB5><EFBFBD>ͬ<EFBFBD>ĵط<C4B5> */
if (su806RxBuffer[2] == J0) {
if (uxQueueSpacesAvailable(J0_485_Queue)) {
xQueueSend(J0_485_Queue, &Buff, 10);
}
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޿ռ<D5BC>ͷ<EFBFBD><CDB7>ڴ棬<DAB4>˳<EFBFBD> */
else {
vPortFree(Buff);
}
}
else if (su806RxBuffer[2] == J2) {
if (uxQueueSpacesAvailable(J2_485_Queue)) {
xQueueSend(J2_485_Queue, &Buff, 10);
}
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޿ռ<D5BC>ͷ<EFBFBD><CDB7>ڴ棬<DAB4>˳<EFBFBD> */
else {
vPortFree(Buff);
}
}
else if (su806RxBuffer[2] == J4) {
if (uxQueueSpacesAvailable(J4_485_Queue)) {
xQueueSend(J4_485_Queue, &Buff, 10);
}
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޿ռ<D5BC>ͷ<EFBFBD><CDB7>ڴ棬<DAB4>˳<EFBFBD> */
else {
vPortFree(Buff);
}
}
else if (su806RxBuffer[2] == J6) {
if (uxQueueSpacesAvailable(J6_485_Queue)) {
xQueueSend(J6_485_Queue, &Buff, 10);
}
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޿ռ<D5BC>ͷ<EFBFBD><CDB7>ڴ棬<DAB4>˳<EFBFBD> */
else {
vPortFree(Buff);
}
}
else if (su806RxBuffer[2] == Lora) {
if (uxQueueSpacesAvailable(lora_uart_Queue)) {
xQueueSend(lora_uart_Queue, &Buff, 10);
}
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޿ռ<D5BC>ͷ<EFBFBD><CDB7>ڴ棬<DAB4>˳<EFBFBD> */
else {
vPortFree(Buff);
}
}
err:
//<2F><><EFBFBD><EFBFBD>buff
state = wait;
su806RxBufferIndex = 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 hostMcuUartDataAnalysis(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(su806UartRxTime) >= tick_2S) {
su806UartRxTime = xTaskGetTickCount();
su806RxBufferIndex = 0;
state = wait;
}
while (uart_dev_char_present(device) == 1 && ((xTaskGetTickCount() - tickstart) < 5)) {
su806RxBuffer[su806RxBufferIndex++] = uart_dev_in_char(device);
stateMachine();
}
if (uart_dev_char_present(device) != 1 && state != wait) {
stateMachine();
}
}