406 lines
9.4 KiB
C
406 lines
9.4 KiB
C
#include <string.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <stdarg.h>
|
|
#include <stdarg.h>
|
|
|
|
#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
|
|
|
|
|