#include "main_task.h" #include "uart.h" #include "gpio.h" #include "cfg.h" #include "IAP.h" #include "protocol.h" #include "process.h" #include "crc16.h" #include #include "osif.h" /** * Uart0_RxDataHandle * * @return none * * @brief 主任务处理函数 */ void Uart1_RxDataHandle(void) { uint8_t* rxbuf = uart1_info.recv_buffer; uint16_t rx_len = uart1_info.recv_len; uint8_t* txbuf = uart1_info.send_buffer; uint16_t txbuf_size = UART1_TRANSMIT_DATA_POOL_COUNT; uint16_t tx_len = 0; uint16_t cmd; uint16_t crc; uint16_t ret_len = 0; uint8_t ret_write = RET_OK; if(rx_len > 2){ //check rs485 addr if(config->addr == rxbuf[0] || BROADCAST_ADDR == rxbuf[0]){ #if 1 // check crc crc = ((uint16_t)rxbuf[rx_len-2]<<8) | rxbuf[rx_len-1]; if (crc == crc16(rxbuf, rx_len-2)) { //copy 地址、功能码、命令、到发送buf memcpy(txbuf, (void *)rxbuf, 4); tx_len +=4; if(MODBUS_FUNC_READ == rxbuf[1]){ cmd = ((uint16_t)rxbuf[2]<<8) | rxbuf[3]; switch(cmd){ case Cmd_FirmwareVersion: ret_len = Read_FirmwareVersion(txbuf+tx_len, txbuf_size-tx_len); break; case Cmd_HardwareVersion: ret_len = Read_HardwareVersion(txbuf+tx_len, txbuf_size-tx_len); break; case Cmd_DeviceID: ret_len = Read_Deviceid(txbuf+tx_len, txbuf_size-tx_len); break; case Cmd_DeviceType: ret_len = Read_Devicetype(txbuf+tx_len, txbuf_size-tx_len); break; case Cmd_Addr: ret_len = Read_Addr(txbuf+tx_len, txbuf_size-tx_len); break; case Cmd_Baudrate: ret_len = Read_Baudrate(txbuf+tx_len, txbuf_size-tx_len); break; case Cmd_BvStatus: ret_len = Read_BvStatus(txbuf+tx_len, txbuf_size-tx_len); break; default: txbuf[1] |= 0x80; txbuf[tx_len] = INVALID_COMMAND; ret_len = 1; break; }; if(0 == ret_len){ // error occur txbuf[1] |= 0x80; txbuf[tx_len] = DEVICE_FAULT; ret_len = 1; } tx_len += ret_len; crc = crc16(txbuf, tx_len); txbuf[tx_len++] = (uint8_t)((crc>>8) & 0x00ff); txbuf[tx_len++] = (uint8_t)(crc & 0x00ff); Uart1_TransmitData(txbuf, tx_len); }else if(MODBUS_FUNC_WRITE == rxbuf[1]){ ret_write = RET_OK; cmd = ((uint16_t)rxbuf[2]<<8) | rxbuf[3]; switch(cmd){ case Cmd_HardwareVersion: ret_write = Write_HardwareVersion(rxbuf+4, rx_len-4-2); break; case Cmd_DeviceID: ret_write = Write_Deviceid(rxbuf+4, rx_len-4-2); break; case Cmd_DeviceType: ret_write = Write_Devicetype(rxbuf+4, rx_len-4-2); break; case Cmd_Addr: ret_write = Write_Addr(rxbuf+4, rx_len-4-2); break; case Cmd_Baudrate: ret_write = Write_Baudrate(rxbuf+4, rx_len-4-2); break; case Cmd_Reboot: //NVIC_SystemReset(); ret_write = RET_NEED_REBOOT; break; case Cmd_Reset: ResetConfig(); ret_write = RET_NEED_SAVE|RET_NEED_REBOOT; //NVIC_SystemReset(); break; case Cmd_ControlSV: ret_write = Control_SValve(rxbuf+4, rx_len-4-2); break; case Cmd_TriggerVO: ret_write = Trigger_VoicOutput(rxbuf+4, rx_len-4-2); break; case Cmd_TriggerSendRaw: ret_write = Trigger_SendRaw(rxbuf+4, rx_len-4-2); break; case Cmd_TriggerSendFiltered: ret_write = Trigger_SendFiltered(rxbuf+4, rx_len-4-2); break; case Cmd_IapUpgrade: tx_len += IAP_CmdHandle(rxbuf+tx_len, rx_len-4-2, txbuf+tx_len); if(1 == iap_reboot){ ret_write |= RET_NEED_REBOOT; } break; default: ret_write = RET_CMDINVALID; break; }; if((ret_write&RET_ERROR_MASK) > 0){ if((ret_write&RET_DATAINVALID) > 0){ txbuf[1] |= 0x80; txbuf[tx_len++] = INVALID_DATA; }else if((ret_write&RET_CMDINVALID) > 0){ txbuf[1] |= 0x80; txbuf[tx_len++] = INVALID_COMMAND; } }else{ if(Cmd_IapUpgrade != cmd){ //copy the whole rx frame memcpy(txbuf, (void *)rxbuf, rx_len-2); tx_len =rx_len-2; }else{ //升级命令,啥都不用做 } } crc = crc16(txbuf, tx_len); txbuf[tx_len++] = (uint8_t)((crc>>8) & 0x00ff); txbuf[tx_len++] = (uint8_t)(crc & 0x00ff); Uart1_TransmitData(txbuf, tx_len); if((ret_write&RET_NEED_SAVE) > 0 ){ SaveConfig(); } if((ret_write&RET_NEED_REBOOT) > 0 ){ OSIF_TimeDelay(100); NVIC_SystemReset(); } }else{ //function code no exist txbuf[1] |= 0x80; txbuf[tx_len++] = INVALID_FUNCTION_CODE; crc = crc16(txbuf, tx_len); txbuf[tx_len++] = (uint8_t)((crc>>8) & 0x00ff); txbuf[tx_len++] = (uint8_t)(crc & 0x00ff); Uart1_TransmitData(txbuf, tx_len); } } #else memcpy(txbuf, (void *)rxbuf, rx_len); tx_len +=rx_len; Uart1_TransmitData(txbuf, tx_len); #endif } } //END rx_len if(rx_len > 0){ Uart1_RecvData(); } } /** * Task_Init * * @return none * * @brief 初始化 */ void Task_Init(void) { Process_Init(); #if 1 Uart1_Initialize(); memcpy(uart1_info.send_buffer, (void *)"Booted", 6); uart1_info.send_len = 6; Uart1_TransmitData(uart1_info.send_buffer, uart1_info.send_len); Uart1_RecvData(); #endif } /** * Task_Handle * * @return none * * @brief 主任务处理函数 */ void Task_Handle(void) { Process_RunLedPrd(); Uart1_RxDataHandle(); Process_Alg(); }