V1.1 For EVIC
Dependencies: SDFileSystem max32630fthr USBDevice
Diff: CmdHandler.cpp
- Revision:
- 1:7530b7eb757a
- Child:
- 3:35b05d91568d
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/CmdHandler.cpp Thu May 28 02:30:39 2020 +0000 @@ -0,0 +1,393 @@ +#include "mbed.h" +#include "cmsis_os.h" +#include "max32630fthr.h" +#include "USBSerial.h" +#include "CmdHandler.h" + +#include "DUT_RegConfig.h" +//#include "Config.h" +#include "ServoRun.h" + +GLOBAL_CMD_VAR g_cmd; + +//extern CONFIG g_config; +extern DUTREG dut_reg[DUT_REG_NUM]; +extern uint8_t histogram[10][1024]; +extern uint8_t histogram_mode; +extern uint8_t histogram_tdc; +extern uint8_t Firmware[8192]; +extern uint8_t dcr_matrix[17][9*2]; + +uint8_t _uart_send_pbuff[CMD_BUF_LEN] = {0x00}; + +uint8_t UserTxBufferFS[2048]; + +uint8_t sys_cfg_save = 0; + +//extern Queue<uint8_t, 2048> cmd_queue; +extern USBSerial microUSB; +extern DigitalOut rLED; +extern DigitalOut xSHUT; +extern InterruptIn chip_int; + +extern uint16_t histogram_pos_num; +extern uint16_t histogram_per_pos; + +void CmdHandleTask(void) +{ + uint8_t ret; + uint16_t i=0; + uint8_t uart_val = 0; + uint16_t _pbuff_len = 0; + + while(1) { + ret = microUSB.buf.dequeue(&uart_val); + if(ret == 1) { + if(g_cmd.valid_flag == 0) { //None Header + if(uart_val == 0x5A) { //Already find header + g_cmd.valid_flag = 1; + i=0; + g_cmd.buf[i++] = uart_val; + } else { + i=0; + } + } else if(g_cmd.valid_flag == 1) { //已经找到了帧头 + if(i < CMD_BUF_LEN) { + g_cmd.buf[i++] = uart_val; + if(i>=4) { //根据协议长度区判断接收的协议帧大小 + _pbuff_len = ((g_cmd.buf[3]&0x00ff)<<8) + g_cmd.buf[2]; + if(i == (_pbuff_len+5)) { //一包结束 + g_cmd.package_len = i; + DealUart1OnePackage(g_cmd.buf, g_cmd.package_len); + i = 0; + g_cmd.valid_flag = 0; + continue; + } else if((_pbuff_len+5)>=CMD_BUF_LEN) { + i = 0; + g_cmd.valid_flag = 0; + continue; + } + } + } else { + i = 0; + g_cmd.valid_flag = 0;; + } + } + } else { + i = 0; + g_cmd.valid_flag = 0; + wait_ms(50); + //osDelay(50); + } + } + +} + +uint8_t Check_Sum(uint8_t *_pbuff, uint16_t _cmdLen) +{ + uint8_t cmd_sum=0; + uint16_t i; + + for(i=0; i<_cmdLen; i++) { + cmd_sum += _pbuff[i]; + } + cmd_sum = (~cmd_sum); + + return cmd_sum; +} + +//协议相关命令的发送 +void UART_CmdAckSend(uint8_t ack_cmd, uint8_t register_addr, uint8_t *pbuff, uint16_t pbuff_len) +{ + while(g_cmd.send_flag == 1) { + wait_ms(50); + } + + g_cmd.send_flag = 1; + + UserTxBufferFS[0] = 0x5a; + UserTxBufferFS[1] = 0x00; + uint16_t i=1, j=0; + uint16_t _uart_pbuff_len = 0; + + _uart_pbuff_len = pbuff_len+1; + UserTxBufferFS[i++]= ack_cmd; + UserTxBufferFS[i++]= (_uart_pbuff_len&0x00ff); + UserTxBufferFS[i++]= (_uart_pbuff_len>>8); + UserTxBufferFS[i++]= register_addr; + for(j=0; j<pbuff_len; j++) { + UserTxBufferFS[i++] = pbuff[j]; + } + UserTxBufferFS[i++] = Check_Sum(&UserTxBufferFS[1], _uart_pbuff_len+3); + + uint16_t k = 0; + + while(i > 64) { + microUSB.writeBlock(&UserTxBufferFS[k], 64); + i -= 64; + k += 64; + } + microUSB.writeBlock(&UserTxBufferFS[k], i); + g_cmd.send_flag = 0; +} + + +void DealUart1OnePackage(uint8_t *pd, uint16_t cmdLen) +{ + uint16_t _pd_len = 0; + + _pd_len = ((pd[3]&0x00ff)<<8) + pd[2]; + + if(pd[_pd_len+4] != Check_Sum(&pd[1],_pd_len+3)) { //校验不正确,直接返回 + return; + } + + switch(pd[4]) { + case REGISTER_CMD: //寄存器操作 + if(pd[1] == 0x00) { //读 + //rLED = LED_ON; + if(HandleReadReg() == 0) + UART_CmdAckSend(READ_CMD | 0x80, REGISTER_CMD, _uart_send_pbuff, DUT_REG_NUM*2); + else + UART_CmdAckSend(READ_CMD | 0x10, REGISTER_CMD, _uart_send_pbuff, 2); + } else if(pd[1] == 0x01) { //写 + //rLED = LED_OFF; + if(HandleWriteReg(pd, cmdLen) == 0) + UART_CmdAckSend(WRITE_CMD | 0x80, REGISTER_CMD, _uart_send_pbuff, 2); + else + UART_CmdAckSend(WRITE_CMD | 0x10, REGISTER_CMD, _uart_send_pbuff, 2); + } + break; + + case VAN_SINGLE_MEAS:// 单次测量 + if(HandleOneTimeMeasure() == 0) + UART_CmdAckSend(READ_CMD | 0x80, VAN_SINGLE_MEAS, _uart_send_pbuff, 4); + else + UART_CmdAckSend(READ_CMD | 0x10, VAN_SINGLE_MEAS, _uart_send_pbuff, 2); + break; + + case VAN_CONTIU_MEAS:// 连续测量 + if(HandleContinuousMeasure(pd) == 0) + UART_CmdAckSend(READ_CMD | 0x80, VAN_CONTIU_MEAS, _uart_send_pbuff, 2); + else + UART_CmdAckSend(READ_CMD | 0x10, VAN_CONTIU_MEAS, _uart_send_pbuff, 2); + break; + + case VAN_READ_HIST_CMD://读取Histogram + if(pd[5] == 0xF0) + { + WriteOneReg(REG_SYS_CFG, sys_cfg_save); + histogram_mode = 0; + } + else if(pd[5] == 0xF1) + { + ReadOneReg(REG_SYS_CFG, &sys_cfg_save); + WriteOneReg(REG_SYS_CFG, 0x01); + histogram_mode = 2; + } + else if(pd[5] == 0xF2) + { + ReadOneReg(REG_SYS_CFG, &sys_cfg_save); + WriteOneReg(REG_SYS_CFG, 0x01); + histogram_mode = 4; + } + else + { + ReadOneReg(REG_SYS_CFG, &sys_cfg_save); + WriteOneReg(REG_SYS_CFG, 0x01); + histogram_mode = 1; + histogram_tdc = pd[5]; + } + + break; + case VAN_STEP_HISTOGRAM_CMD: + if(pd[5] == 0xF0) { + WriteOneReg(REG_SYS_CFG, sys_cfg_save); + histogram_mode = 0; + } else if(pd[5] == 0xF1) { + ReadOneReg(REG_SYS_CFG, &sys_cfg_save); + WriteOneReg(REG_SYS_CFG, 0x01); + histogram_mode = 3; + histogram_pos_num = pd[6] + pd[7]*256; + histogram_per_pos = pd[8] + pd[9]*256; + } + break; + + case VAN_MOVING_CTL_CMD: + ServoRun(pd[5], pd[6] + pd[7]*256); + break; + + case VAN_DOWN_FW_CMD: + if(HandleDownloadFW(pd, cmdLen) == 0) + UART_CmdAckSend(WRITE_CMD | 0x80, VAN_DOWN_FW_CMD, _uart_send_pbuff, 2); + else + UART_CmdAckSend(WRITE_CMD | 0x10, VAN_DOWN_FW_CMD, _uart_send_pbuff, 2); + break; + + case CHIP_RST_CMD: + HandleChipReset(); + break; + + case CHIP_EN_CMD: + //HandleChipEnable(pd[5]); + break; + + case INT_ENABLE_CMD: + if(pd[5] == 1) + chip_int.disable_irq(); + break; + + case VAN_DCR_TEST_CMD: + if(DCRTest(pd[5], pd[6]) == 0) + UART_CmdAckSend(READ_CMD | 0x80, VAN_DCR_TEST_CMD, (uint8_t*)dcr_matrix, 17*9*2); + else + UART_CmdAckSend(READ_CMD | 0x10, VAN_DCR_TEST_CMD, _uart_send_pbuff, 2); + break; + + case VAN_DELAYLINE_TEST_CMD: + if(DelayLineTest(pd[5], _uart_send_pbuff) == 0) + UART_CmdAckSend(READ_CMD | 0x80, VAN_DELAYLINE_TEST_CMD, _uart_send_pbuff, 144); + else + UART_CmdAckSend(READ_CMD | 0x10, VAN_DELAYLINE_TEST_CMD, _uart_send_pbuff, 2); + break; + + case VAN_GET_TDC_PHASE_CMD: + if(GetTdcPhase(_uart_send_pbuff) == 0) + UART_CmdAckSend(READ_CMD | 0x80, VAN_GET_TDC_PHASE_CMD, _uart_send_pbuff, 2); + else + UART_CmdAckSend(READ_CMD | 0x10, VAN_GET_TDC_PHASE_CMD, _uart_send_pbuff, 2); + break; + + default: + + break; + } + +} + + +uint8_t HandleWriteReg(uint8_t *pd, uint16_t cmdLen) +{ + uint16_t _pd_len = 0; + uint16_t reg_num = 0; + + _pd_len = ((pd[3]&0x00ff)<<8) + pd[2]; + + reg_num = (_pd_len - 1)/2; + + for(uint16_t i = 0; i < reg_num; i++) { + //dut_reg[pd[5+2*i]].value = pd[5+2*i+1]; + WriteOneReg(pd[5+2*i], pd[5+2*i+1]); + } + + return 0; +} + +uint8_t HandleReadReg(void) +{ + uint8_t ret = 0; + + ret = ReadAllRegToTable(); + if(ret == 0) { + memcpy(_uart_send_pbuff, &dut_reg, DUT_REG_NUM*2); + } + + return ret; +} + +uint8_t HandleOneTimeMeasure(void) +{ + return OneTimeMeasure((uint16_t*)_uart_send_pbuff, (uint16_t*)(_uart_send_pbuff + 2)); +} + +uint8_t HandleContinuousMeasure(uint8_t *pd) +{ + if(pd[5] == 0x00) + return StopContinuousMeasure(); + else + return ContinuousMeasure(); +} + +uint8_t HandleReadHistogram(uint8_t tdc_idx) +{ + _uart_send_pbuff[0] = tdc_idx; + + memcpy(&_uart_send_pbuff[1], histogram[tdc_idx], 1024); + + UART_CmdAckSend(READ_CMD | 0x80, VAN_READ_HIST_CMD, _uart_send_pbuff, 1025); + return 0; +} + +uint8_t HandleDownloadFW(uint8_t *pd, uint16_t cmdLen) +{ + static uint8_t pkg_num = 0; + uint8_t ret = 0; + uint8_t pkg_idx = pd[5]; + uint16_t pkg_len = ((pd[3]&0x00ff)<<8) + pd[2] - 2; + static uint16_t pkg_saved = 0; + + if(pkg_idx == 0) { //第一包固件 + printf("Fist Pkg of FW arrived.\n"); + memset(Firmware, 0x00, 8192); + pkg_num = 0; + pkg_saved = 0; + + memcpy(Firmware + pkg_saved, &pd[6], pkg_len); + pkg_num++; + pkg_saved += pkg_len; + } else if(pkg_idx == 0xF0) { + printf("Last Pkg of FW arrived. Begin to Download to Chip.\n"); + //DebugArray(Firmware, pkg_saved);//For Debug + ret = WriteFW(pkg_saved); + } else if(pkg_idx == 0xF1) { + printf("Firmware transmission has been halt.\n"); + memset(Firmware, 0x00, 8192); + pkg_num = 0; + pkg_saved = 0; + } else { + memcpy(Firmware + pkg_saved, &pd[6], pkg_len); + pkg_num++; + pkg_saved += pkg_len; + } + + if(ret == 0) { + printf("Firmware download successfully.\n"); + } + + _uart_send_pbuff[0] = pkg_idx; + + return ret; +} + +uint8_t HandleContinuousMeasureReport(uint16_t lsb, uint16_t milimeter) +{ + memcpy(_uart_send_pbuff, &lsb, 2); + memcpy(_uart_send_pbuff + 2, &milimeter, 2); + + UART_CmdAckSend(READ_CMD | 0x80, VAN_CONTIU_MEAS, _uart_send_pbuff, 4); + + return 0; +} + +void HandleChipReset(void) +{ + xSHUT = 0; + wait_ms(30); + xSHUT = 1; +} + +void HandleFreqReport(float* V_I_Value) +{ + uint32_t temp_byte = 0; + + _uart_send_pbuff[0] = 0; + _uart_send_pbuff[1] = 0; + memset(&_uart_send_pbuff[2], 0x00, 11); + + for(uint8_t i = 0; i < 10; i++) { + temp_byte = V_I_Value[i]; + memcpy(_uart_send_pbuff + 13 + 4*i, &temp_byte, 4); + } + + UART_CmdAckSend(READ_CMD | 0x80, FREQ_REPORT, _uart_send_pbuff, 53); +}