#include #include #include #include #include #include "Debug.h" #include "main.h" #include "bsp.h" #include "dc_motor.h" #if (USE_DEBUG != 0) #define DEBUG_CMD_CNT 8 const DBGFunType DebugFun[DEBUG_CMD_CNT]; static char buff[BUFSIZE]; volatile uint16_t iw=0; /* buffer write index*/ static uint16_t ir=0; /* buffer read index*/ static uint16_t DebugRxTimeOut1mSCnt; static char RxBuff[128]; static uint8_t RxLen = 0; void vcom_Print(uint8_t sLen); void vcom_Send( char *format, ... ) { va_list args; va_start(args, format); uint8_t len; char tempBuff[DEBUG_BUFF_SIZE_MAX]; //uint32_t primask_bit; uint8_t offset = 0; //primask_bit = __get_PRIMASK(); //__disable_irq(); /*convert into string at buff[0] of length iw*/ len = vsprintf(&tempBuff[0], format, args); while(offset < len) { if((len - offset) < BUFSIZE) { memcpy(&buff[0], &tempBuff[offset], len - offset); vcom_Print(len - offset); offset = len; } else { memcpy(&buff[0], &tempBuff[offset], BUFSIZE); offset += BUFSIZE; vcom_Print(BUFSIZE); } } //__set_PRIMASK(primask_bit); //__enable_irq(); va_end(args); } // 定义一个函数vcom_Print,用于打印字符串 void vcom_Print(uint8_t sLen) { // 定义一个字符指针CurChar char* CurChar; // 初始化ir ir = 0; // 当ir小于sLen时,循环执行 while(ir < sLen) { // 获取字符指针CurChar CurChar = &buff[ir++]; // 调用DebugUartSend函数,发送CurChar指向的字符,次数为1 DebugUartSend((uint8_t*)CurChar, 1); } } // 定义一个函数vcom_Send2,用于发送字符串 void vcom_Send2(uint8_t *sData, uint16_t len) { // 遍历sData,将每个元素发送到DebugUartSend for(int i = 0; i < len; i++) { DebugUartSend(&sData[i], 1); } } void DebugLoopHandler(void) { int argc = 0; char *argv[10], *argp; if(DebugRxTimeOut1mSCnt > 0 || RxLen == 0) return; //for(argv[argc] = strtok(RxBuff, " "); argv[argc] != NULL; argv[++argc] = strtok(NULL, " ")); // 解析字符串,将参数放入argv数组中 argp = strtok(RxBuff, " "); for(int i = 0; i < 10; i++) { if(argp != NULL) { argv[argc++] = argp; argp = strtok(NULL, " "); } else if(argc > 0){ argc--; break; } } // 获取第一个参数,并将其赋值给argp argp = strtok(argv[argc], "'\r'"); // 如果argp不为空,则将argp的值赋值给argv[argc],并将argc加1 if(argp != NULL) { argv[argc++] = argp; } // 否则,将RxLen设置为0,并返回 else { RxLen = 0; return; } // 遍历DebugFun数组,查找argv[0]是否与DBGCmd匹配,若匹配则调用DBGExec函数 for(int i = 0; i < DEBUG_CMD_CNT; i++) { if(strcmp(argv[0], DebugFun[i].DBGCmd) == 0) DebugFun[i].DBGExec(argc, argv); } memset(RxBuff, 0x00, 128); RxLen = 0; } uint32_t RxTimeCurrent; uint32_t RxTimeLast = 0; // 函数:Dbg1msRoutine // 功能:1ms调试时钟routine void Dbg1msRoutine(void) { // 如果1ms调试时钟计数器大于0 if(DebugRxTimeOut1mSCnt > 0) // 1ms调试时钟计数器减1 DebugRxTimeOut1mSCnt--; } // 定义函数DbgUsartRxIrqCallback,用于处理串口接收中断 void DbgUsartRxIrqCallback(void) { // 如果1分钟超时计数器为0,则清空RxLen if(DebugRxTimeOut1mSCnt == 0) RxLen = 0; // 重置1分钟超时计数器 DebugRxTimeOut1mSCnt = 3; // 读取串口接收到的数据 uint8_t Data = DbgUartRec(); // 如果RxLen小于128,则将数据添加到RxBuff中 if(RxLen < 128) { RxBuff[RxLen++] = Data; } // DBG_LOG("RxBuff = %s\n", RxBuff); // RS485_Flag=1;//接收标志为置1 } void DebugTest(int argc, char *argv[]) { // 如果参数个数小于2,则返回 if(argc < 2) return; // 如果参数为“?”,则打印帮助信息 if(strcmp(argv[1], "?") == 0) { DBG_LOG("Debug Cmd:\r\n\ disp task on/off -->Open the task display.\r\n"); return; } // 如果参数为“on”,则打印“Test ON” if(strcmp(argv[1], "on") == 0) { // TestOn(); DBG_LOG("Test ON\r\n"); } // 如果参数为“off”,则打印“Test OFF” else if(strcmp(argv[1], "off") == 0) { // TestOFF(); DBG_LOG("Test OFF\r\n"); } } #if 0 void DebugCmdGps(int argc, char *argv[]) { if(argc < 2) return; if(strcmp(argv[1], "?") == 0) { DBG_LOG("Debug Cmd:\r\n\ gps on/off -->Turn the gps on or off.\r\n"); return; } if(strcmp(argv[1], "on") == 0) { GPSStart(); } else if(strcmp(argv[1], "off") == 0) { GPSStop(); } } #endif void DebugCmdHelp(int argc, char *argv[]) { DBG_LOG("Debug Cmd:\r\n\ disp task on/off -->Open the task display.\r\n\ help\ motor\ level\ wave\ "); } #if 0 //// 定义一个无参函数DebugReadData,用于读取数据 //void DebugReadData(int argc, char *argv[]) //{ // // 定义一个无符号32位整数ADReadStart,初始值为0 // uint32_t ADReadStart = 0; // // 定义一个ADData_t类型的数组ADBuff,大小为640 // ADData_t ADBuff[640]; // // // 当ADReadStart小于SDCARD_BLOCK_MAX时,循环执行 // while(ADReadStart < SDCARD_BLOCK_MAX) { // // 使用SDCardReadBlocks函数读取数据,从ADReadStart开始,读取10个块,数据存储在ADBuff中 // SDCardReadBlocks(ADReadStart, 10, (uint8_t *)ADBuff); // // 遍历ADBuff数组,将每个元素打印出来 // for(int i = 0; i < 640; i++) { // DBG_LOG("%d\t%d\t%d\t%d\r\n", ADBuff[i].AD0, ADBuff[i].AD1, ADBuff[i].AD2, ADBuff[i].AD3); // } // // ADReadStart加10 // ADReadStart += 10; // } //} //// 定义一个函数SetTime,参数为int argc和char *argv[] //void SetTime(int argc, char *argv[]) //{ // // 定义一个字符数组test,并初始化为0 // char test[10] = 0; // // 定义一个整数num,并初始化为0 // int num = 0; // // 如果argc小于2,则返回 // if(argc < 2) // return; // // 如果argv[1]等于"?",则打印提示信息 // if(strcmp(argv[1], "?") == 0) // { // DBG_LOG("SetTime Cmd:\r\n\ // disp task on/off -->Open the task display.\r\n"); // return; // } // // 将argv[1]的值复制到test // memcpy(test, (char *)argv[1], 10); // // 将test转换为整数 // num = atoi(test); // // 调用TimeSync函数,并将num作为参数传入 // TimeSync(num); //} #endif extern uint8_t KeyASta; extern uint8_t KeyBSta; extern uint8_t RunSta; void MotorSwitch(int argc, char *argv[]) { // 如果参数个数小于2,则返回 if(argc < 2) return; // 如果第一个参数为?,则打印帮助信息 if(strcmp(argv[1], "?") == 0) { DBG_LOG("DCMotor Cmd:\r\n\ motor F/R/S -->Turn the motor on or off.\r\n"); return; } // 如果第一个参数为on,则开启SonarWork if(strcmp(argv[1], "R") == 0) { KeyASta = true; Motor_Control(MOTOR_CMD_REVERSE); DBG_LOG("Motor FORWARD\r\n"); } // 如果第一个参数为off,则关闭SonarWork else if(strcmp(argv[1], "F") == 0) { KeyBSta = true; Motor_Control(MOTOR_CMD_FORWARD); DBG_LOG("Motor REVERSE\r\n"); } else if(strcmp(argv[1], "S") == 0) { KeyASta = false; KeyBSta = false; Motor_Control(MOTOR_CMD_STOP); DBG_LOG("Motor OFF\r\n"); } } extern void GradeControl(ControlLevel_m level); void LevelSwitch(int argc, char *argv[]) { // 如果参数个数小于2,则返回 if(argc < 2) return; // 如果参数为“?”,则打印帮助信息 if(strcmp(argv[1], "?") == 0) { DBG_LOG("level Cmd:\r\n\ level 1/2/3/4/5 -->Select control level.\r\n"); return; } // 如果参数为“1”,则打印“Set control level: 1” if(strcmp(argv[1], "1") == 0) { App.Para.Layout.ControlLevel = LEVEL_1;//等级1 SAVE_APP_PARA((uint32_t *)&App.Para); DBG_LOG("Set control level: 1\r\n"); DBG_LOG("SystemReset...\r\n"); NVIC_SystemReset(); } // 如果参数为“2”,则打印“Set control level: 2” else if(strcmp(argv[1], "2") == 0) { App.Para.Layout.ControlLevel = LEVEL_2;//等级2 SAVE_APP_PARA((uint32_t *)&App.Para); DBG_LOG("Set control level: 2\r\n"); DBG_LOG("SystemReset...\r\n"); NVIC_SystemReset(); } // 如果参数为“3”,则打印“Set control level: 1” else if(strcmp(argv[1], "3") == 0) { App.Para.Layout.ControlLevel = LEVEL_3;//等级3 SAVE_APP_PARA((uint32_t *)&App.Para); DBG_LOG("Set control level: 3\r\n"); DBG_LOG("SystemReset...\r\n"); NVIC_SystemReset(); } // 如果参数为“4”,则打印“Set control level: 4” else if(strcmp(argv[1], "4") == 0) { App.Para.Layout.ControlLevel = LEVEL_4;//等级4 SAVE_APP_PARA((uint32_t *)&App.Para); DBG_LOG("Set control level: 4\r\n"); DBG_LOG("SystemReset...\r\n"); NVIC_SystemReset(); } // 如果参数为“5”,则打印“Set control level: 5” else if(strcmp(argv[1], "5") == 0) { App.Para.Layout.ControlLevel = LEVEL_5;//等级5 SAVE_APP_PARA((uint32_t *)&App.Para); DBG_LOG("Set control level: 5\r\n"); DBG_LOG("SystemReset...\r\n"); NVIC_SystemReset(); } } void DBGWave_on_off(int argc, char *argv[]) { // 如果参数个数小于2,则返回 if(argc < 2) return; // 如果参数为“?”,则打印帮助信息 if(strcmp(argv[1], "?") == 0) { DBG_LOG("wave Cmd:\r\n\ wave on/off -->Turn on or off waveform output.\r\n"); return; } // 如果参数为“on”,则打印“Test ON” if(strcmp(argv[1], "on") == 0) { App.Para.Layout.DBGWaveOut = true; SAVE_APP_PARA((uint32_t *)&App.Para); DBG_LOG("Waveform output on.\r\n"); } // 如果参数为“off”,则打印“Test OFF” else if(strcmp(argv[1], "off") == 0) { App.Para.Layout.DBGWaveOut = false; SAVE_APP_PARA((uint32_t *)&App.Para); DBG_LOG("Waveform output off.\r\n"); } } const DBGFunType DebugFun[DEBUG_CMD_CNT] = { "help", DebugCmdHelp, "motor", MotorSwitch, "level", LevelSwitch, "wave", DBGWave_on_off, }; #endif