From aa5cb18aea7924df7eaf50dd95dd9d1bbccb58af Mon Sep 17 00:00:00 2001 From: Candas1 Date: Mon, 11 Jan 2021 21:34:17 +0100 Subject: [PATCH] Handle usart overflow mode --- Inc/comms.h | 6 +- Src/comms.c | 448 ++++++++++++++++++++++++---------------------------- Src/util.c | 11 +- 3 files changed, 221 insertions(+), 244 deletions(-) diff --git a/Inc/comms.h b/Inc/comms.h index 30b24ba..f942270 100644 --- a/Inc/comms.h +++ b/Inc/comms.h @@ -42,10 +42,10 @@ enum types {UINT8_T,UINT16_T,UINT32_T,INT8_T,INT16_T,INT32_T,INT,FLOAT}; #define ADD_PARAM(var) typename(var),&var -int32_t ExtToInt(uint8_t index,int32_t value); +int32_t extToInt(uint8_t index,int32_t value); int8_t setParamValInt(uint8_t index, int32_t newValue); int8_t setParamValExt(uint8_t index, int32_t newValue); -int32_t IntToExt(uint8_t index,int32_t value); +int32_t intToExt(uint8_t index,int32_t value); int32_t getParamValInt(uint8_t index); int32_t getParamValExt(uint8_t index); @@ -61,6 +61,7 @@ int8_t printAllParamHelp(); int8_t printParamVal(); int8_t printParamDef(uint8_t index); int8_t printAllParamDef(); +void printError(uint8_t errornum ); int8_t watchParamVal(uint8_t index); int8_t findCommand(uint8_t *userCommand, uint32_t len); @@ -97,6 +98,7 @@ struct parameter_entry_struct { void *valueR; const uint16_t addr; const int32_t init; + const uint8_t initFormat; const int32_t min; const int32_t max; const uint8_t div; diff --git a/Src/comms.c b/Src/comms.c index c61f34e..5302c7e 100644 --- a/Src/comms.c +++ b/Src/comms.c @@ -30,7 +30,16 @@ #include "util.h" #include "comms.h" -#if defined(DEBUG_SERIAL_PROTOCOL) +#if defined(DEBUG_SERIAL_PROTOCOL) && (defined(DEBUG_SERIAL_USART2) || defined(DEBUG_SERIAL_USART3)) + +#ifdef CONTROL_ADC + #define RAW_MIN 0 + #define RAW_MAX 4095 +#else + #define RAW_MIN -1000 + #define RAW_MAX 1000 +#endif + #define MAX_PARAM_WATCH 15 @@ -71,116 +80,125 @@ const command_entry commands[] = { enum paramTypes {PARAMETER,VARIABLE}; const parameter_entry params[] = { // CONTROL PARAMETERS - // Type ,Name ,Datatype ,ValueL ptr ,ValueR ,EEPRM Addr ,Init ,Min ,Max ,Div ,Mul ,Fix ,Callback Function ,Help text - {PARAMETER ,"CTRL_MOD" ,ADD_PARAM(ctrlModReqRaw) ,NULL ,0 ,CTRL_MOD_REQ ,1 ,3 ,0 ,0 ,0 ,NULL ,"Ctrl mode 1:VLT 2:SPD 3:TRQ"}, - {PARAMETER ,"CTRL_TYP" ,ADD_PARAM(rtP_Left.z_ctrlTypSel) ,&rtP_Right.z_ctrlTypSel ,0 ,CTRL_TYP_SEL ,0 ,2 ,0 ,0 ,0 ,NULL ,"Ctrl type 0:COM 1:SIN 2:FOC"}, - {PARAMETER ,"I_MOT_MAX" ,ADD_PARAM(rtP_Left.i_max) ,&rtP_Right.i_max ,1 ,I_MOT_MAX ,1 ,40 ,A2BIT_CONV ,0 ,4 ,NULL ,"Max phase current A"}, - {PARAMETER ,"N_MOT_MAX" ,ADD_PARAM(rtP_Left.n_max) ,&rtP_Right.n_max ,2 ,N_MOT_MAX ,10 ,2000 ,0 ,0 ,4 ,NULL ,"Max motor RPM"}, - {PARAMETER ,"FI_WEAK_ENA" ,ADD_PARAM(rtP_Left.b_fieldWeakEna) ,&rtP_Right.b_fieldWeakEna ,0 ,FIELD_WEAK_ENA ,0 ,1 ,0 ,0 ,0 ,NULL ,"Enable field weak"}, - {PARAMETER ,"FI_WEAK_HI" ,ADD_PARAM(rtP_Left.r_fieldWeakHi) ,&rtP_Right.r_fieldWeakHi ,0 ,FIELD_WEAK_HI ,0 ,1500 ,0 ,0 ,4 ,Input_Lim_Init ,"Field weak high RPM"}, - {PARAMETER ,"FI_WEAK_LO" ,ADD_PARAM(rtP_Left.r_fieldWeakLo) ,&rtP_Right.r_fieldWeakLo ,0 ,FIELD_WEAK_LO ,0 ,1000 ,0 ,0 ,4 ,Input_Lim_Init ,"Field weak low RPM"}, - {PARAMETER ,"FI_WEAK_MAX" ,ADD_PARAM(rtP_Left.id_fieldWeakMax) ,&rtP_Right.id_fieldWeakMax,0 ,FIELD_WEAK_MAX ,0 ,20 ,A2BIT_CONV ,0 ,4 ,NULL ,"Field weak max current A(FOC)"}, - {PARAMETER ,"PHA_ADV_MAX" ,ADD_PARAM(rtP_Left.a_phaAdvMax) ,&rtP_Right.a_phaAdvMax ,0 ,PHASE_ADV_MAX ,0 ,55 ,0 ,0 ,4 ,NULL ,"Max Phase Adv angle Deg(SIN)"}, + // Type ,Name ,Datatype ,ValueL ptr ,ValueR ,EEPRM Addr ,Init Int/Ext ,Min ,Max ,Div ,Mul ,Fix ,Callback Function ,Help text + {PARAMETER ,"CTRL_MOD" ,ADD_PARAM(ctrlModReqRaw) ,NULL ,0 ,CTRL_MOD_REQ ,0 ,1 ,3 ,0 ,0 ,0 ,NULL ,"Ctrl mode 1:VLT 2:SPD 3:TRQ"}, + {PARAMETER ,"CTRL_TYP" ,ADD_PARAM(rtP_Left.z_ctrlTypSel) ,&rtP_Right.z_ctrlTypSel ,0 ,CTRL_TYP_SEL ,0 ,0 ,2 ,0 ,0 ,0 ,NULL ,"Ctrl type 0:COM 1:SIN 2:FOC"}, + {PARAMETER ,"I_MOT_MAX" ,ADD_PARAM(rtP_Left.i_max) ,&rtP_Right.i_max ,1 ,I_MOT_MAX ,1 ,1 ,40 ,A2BIT_CONV ,0 ,4 ,NULL ,"Max phase current A"}, + {PARAMETER ,"N_MOT_MAX" ,ADD_PARAM(rtP_Left.n_max) ,&rtP_Right.n_max ,2 ,N_MOT_MAX ,1 ,10 ,2000 ,0 ,0 ,4 ,NULL ,"Max motor RPM"}, + {PARAMETER ,"FI_WEAK_ENA" ,ADD_PARAM(rtP_Left.b_fieldWeakEna) ,&rtP_Right.b_fieldWeakEna ,0 ,FIELD_WEAK_ENA ,0 ,0 ,1 ,0 ,0 ,0 ,NULL ,"Enable field weak"}, + {PARAMETER ,"FI_WEAK_HI" ,ADD_PARAM(rtP_Left.r_fieldWeakHi) ,&rtP_Right.r_fieldWeakHi ,0 ,FIELD_WEAK_HI ,1 ,0 ,1500 ,0 ,0 ,4 ,Input_Lim_Init ,"Field weak high RPM"}, + {PARAMETER ,"FI_WEAK_LO" ,ADD_PARAM(rtP_Left.r_fieldWeakLo) ,&rtP_Right.r_fieldWeakLo ,0 ,FIELD_WEAK_LO ,1 ,0 ,1000 ,0 ,0 ,4 ,Input_Lim_Init ,"Field weak low RPM"}, + {PARAMETER ,"FI_WEAK_MAX" ,ADD_PARAM(rtP_Left.id_fieldWeakMax) ,&rtP_Right.id_fieldWeakMax,0 ,FIELD_WEAK_MAX ,1 ,0 ,20 ,A2BIT_CONV ,0 ,4 ,NULL ,"Field weak max current A(FOC)"}, + {PARAMETER ,"PHA_ADV_MAX" ,ADD_PARAM(rtP_Left.a_phaAdvMax) ,&rtP_Right.a_phaAdvMax ,0 ,PHASE_ADV_MAX ,1 ,0 ,55 ,0 ,0 ,4 ,NULL ,"Max Phase Adv angle Deg(SIN)"}, // INPUT PARAMETERS - // Type ,Name ,ValueL ptr ,ValueR ,EEPRM Addr ,Init ,Min ,Max ,Div ,Mul ,Fix ,Callback Function ,Help text - {PARAMETER ,"PRI_IN1_TYP" ,ADD_PARAM(input1[0].typ) ,NULL ,3 ,0 ,0 ,3 ,0 ,0 ,0 ,0 ,"Input1 type"}, - {PARAMETER ,"PRI_IN1_MIN" ,ADD_PARAM(input1[0].min) ,NULL ,4 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,"Input1 min"}, - {PARAMETER ,"PRI_IN1_MID" ,ADD_PARAM(input1[0].mid) ,NULL ,5 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,"Input1 mid"}, - {PARAMETER ,"PRI_IN1_MAX" ,ADD_PARAM(input1[0].max) ,NULL ,6 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,"Input1 max"}, - {PARAMETER ,"PRI_IN2_TYP" ,ADD_PARAM(input2[0].typ) ,NULL ,7 ,0 ,0 ,3 ,0 ,0 ,0 ,0 ,"Input2 type"}, - {PARAMETER ,"PRI_IN2_MIN" ,ADD_PARAM(input2[0].min) ,NULL ,8 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,"Input2 min"}, - {PARAMETER ,"PRI_IN2_MID" ,ADD_PARAM(input2[0].mid) ,NULL ,9 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,"Input2 mid"}, - {PARAMETER ,"PRI_IN2_MAX" ,ADD_PARAM(input2[0].max) ,NULL ,10 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,"Input2 max"}, - {VARIABLE ,"PRI_IN1_RAW" ,ADD_PARAM(input1[0].raw) ,NULL ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,"Input1 raw"}, - {VARIABLE ,"PRI_IN2_RAW" ,ADD_PARAM(input2[0].raw) ,NULL ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,"Input2 raw"}, - {VARIABLE ,"PRI_IN1_CMD" ,ADD_PARAM(input1[0].cmd) ,NULL ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,"Input1 cmd"}, - {VARIABLE ,"PRI_IN2_CMD" ,ADD_PARAM(input2[0].cmd) ,NULL ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,"Input2 cmd"}, + // Type ,Name ,ValueL ptr ,ValueR ,EEPRM Addr ,Init Int/Ext ,Min ,Max ,Div ,Mul ,Fix ,Callback Function ,Help text + {VARIABLE ,"IN1_RAW" ,ADD_PARAM(input1[0].raw) ,NULL ,0 ,0 ,0 ,RAW_MIN,RAW_MAX,0 ,0 ,0 ,0 ,"Input1 raw"}, + {PARAMETER ,"IN1_TYP" ,ADD_PARAM(input1[0].typ) ,NULL ,3 ,0 ,0 ,0 ,3 ,0 ,0 ,0 ,0 ,"Input1 type"}, + {PARAMETER ,"IN1_MIN" ,ADD_PARAM(input1[0].min) ,NULL ,4 ,RAW_MIN ,0 ,RAW_MIN,RAW_MAX,0 ,0 ,0 ,0 ,"Input1 min"}, + {PARAMETER ,"IN1_MID" ,ADD_PARAM(input1[0].mid) ,NULL ,5 ,0 ,0 ,RAW_MIN,RAW_MAX,0 ,0 ,0 ,0 ,"Input1 mid"}, + {PARAMETER ,"IN1_MAX" ,ADD_PARAM(input1[0].max) ,NULL ,6 ,RAW_MAX ,0 ,RAW_MIN,RAW_MAX,0 ,0 ,0 ,0 ,"Input1 max"}, + {VARIABLE ,"IN1_CMD" ,ADD_PARAM(input1[0].cmd) ,NULL ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,"Input1 cmd"}, + + {VARIABLE ,"IN2_RAW" ,ADD_PARAM(input2[0].raw) ,NULL ,0 ,0 ,0 ,RAW_MIN,RAW_MAX,0 ,0 ,0 ,0 ,"Input2 raw"}, + {PARAMETER ,"IN2_TYP" ,ADD_PARAM(input2[0].typ) ,NULL ,7 ,0 ,0 ,0 ,3 ,0 ,0 ,0 ,0 ,"Input2 type"}, + {PARAMETER ,"IN2_MIN" ,ADD_PARAM(input2[0].min) ,NULL ,8 ,RAW_MIN ,0 ,RAW_MIN,RAW_MAX,0 ,0 ,0 ,0 ,"Input2 min"}, + {PARAMETER ,"IN2_MID" ,ADD_PARAM(input2[0].mid) ,NULL ,9 ,0 ,0 ,RAW_MIN,RAW_MAX,0 ,0 ,0 ,0 ,"Input2 mid"}, + {PARAMETER ,"IN2_MAX" ,ADD_PARAM(input2[0].max) ,NULL ,10 ,RAW_MAX ,0 ,RAW_MIN,RAW_MAX,0 ,0 ,0 ,0 ,"Input2 max"}, + {VARIABLE ,"IN2_CMD" ,ADD_PARAM(input2[0].cmd) ,NULL ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,"Input2 cmd"}, #if defined(PRI_INPUT1) && defined(PRI_INPUT2) && defined(AUX_INPUT1) && defined(AUX_INPUT2) - {PARAMETER ,"AUX_IN1_TYP" ,ADD_PARAM(input1[1].typ) ,NULL ,11 ,0 ,0 ,3 ,0 ,0 ,0 ,0 ,"Aux. input1 type"}, - {PARAMETER ,"AUX_IN1_MIN" ,ADD_PARAM(input1[1].min) ,NULL ,12 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,"Aux. input1 min"}, - {PARAMETER ,"AUX_IN1_MID" ,ADD_PARAM(input1[1].mid) ,NULL ,13 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,"Aux. input1 mid"}, - {PARAMETER ,"AUX_IN1_MAX" ,ADD_PARAM(input1[1].max) ,NULL ,14 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,"Aux. input1 max"}, - {PARAMETER ,"AUX_IN2_TYP" ,ADD_PARAM(input2[1].typ) ,NULL ,15 ,0 ,0 ,3 ,0 ,0 ,0 ,0 ,"Aux. input2 type"}, - {PARAMETER ,"AUX_IN2_MIN" ,ADD_PARAM(input2[1].min) ,NULL ,16 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,"Aux. input2 min"}, - {PARAMETER ,"AUX_IN2_MID" ,ADD_PARAM(input2[1].mid) ,NULL ,17 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,"Aux. input2 mid"}, - {PARAMETER ,"AUX_IN2_MAX" ,ADD_PARAM(input2[1].max) ,NULL ,18 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,"Aux. input2 max"}, - {VARIABLE ,"AUX_IN1_RAW" ,ADD_PARAM(input1[1].raw) ,NULL ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,"Aux. input1 raw"}, - {VARIABLE ,"AUX_IN2_RAW" ,ADD_PARAM(input2[1].raw) ,NULL ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,"Aux. input2 raw"}, - {VARIABLE ,"AUX_IN1_CMD" ,ADD_PARAM(input1[1].cmd) ,NULL ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,"Aux. input1 cmd"}, - {VARIABLE ,"AUX_IN2_CMD" ,ADD_PARAM(input2[1].cmd) ,NULL ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,"Aux. input2 cmd"}, + // Type ,Name ,ValueL ptr ,ValueR ,EEPRM Addr ,Init Int/Ext ,Min ,Max ,Div ,Mul ,Fix ,Callback Function ,Help text + {VARIABLE ,"AUX_IN1_RAW" ,ADD_PARAM(input1[1].raw) ,NULL ,0 ,0 ,0 ,RAW_MIN,RAW_MAX,0 ,0 ,0 ,0 ,"Aux. input1 raw"}, + {PARAMETER ,"AUX_IN1_TYP" ,ADD_PARAM(input1[1].typ) ,NULL ,11 ,0 ,0 ,0 ,3 ,0 ,0 ,0 ,0 ,"Aux. input1 type"}, + {PARAMETER ,"AUX_IN1_MIN" ,ADD_PARAM(input1[1].min) ,NULL ,12 ,RAW_MIN ,0 ,RAW_MIN,RAW_MAX,0 ,0 ,0 ,0 ,"Aux. input1 min"}, + {PARAMETER ,"AUX_IN1_MID" ,ADD_PARAM(input1[1].mid) ,NULL ,13 ,0 ,0 ,RAW_MIN,RAW_MAX,0 ,0 ,0 ,0 ,"Aux. input1 mid"}, + {PARAMETER ,"AUX_IN1_MAX" ,ADD_PARAM(input1[1].max) ,NULL ,14 ,RAW_MAX ,0 ,RAW_MIN,RAW_MAX,0 ,0 ,0 ,0 ,"Aux. input1 max"}, + {VARIABLE ,"AUX_IN1_CMD" ,ADD_PARAM(input1[1].cmd) ,NULL ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,"Aux. input1 cmd"}, + + {VARIABLE ,"AUX_IN2_RAW" ,ADD_PARAM(input2[1].raw) ,NULL ,0 ,0 ,0 ,RAW_MIN,RAW_MAX,0 ,0 ,0 ,0 ,"Aux. input2 raw"}, + {PARAMETER ,"AUX_IN2_TYP" ,ADD_PARAM(input2[1].typ) ,NULL ,15 ,0 ,0 ,0 ,3 ,0 ,0 ,0 ,0 ,"Aux. input2 type"}, + {PARAMETER ,"AUX_IN2_MIN" ,ADD_PARAM(input2[1].min) ,NULL ,16 ,RAW_MIN ,0 ,RAW_MIN,RAW_MAX,0 ,0 ,0 ,0 ,"Aux. input2 min"}, + {PARAMETER ,"AUX_IN2_MID" ,ADD_PARAM(input2[1].mid) ,NULL ,17 ,0 ,0 ,RAW_MIN,RAW_MAX,0 ,0 ,0 ,0 ,"Aux. input2 mid"}, + {PARAMETER ,"AUX_IN2_MAX" ,ADD_PARAM(input2[1].max) ,NULL ,18 ,RAW_MAX ,0 ,RAW_MIN,RAW_MAX,0 ,0 ,0 ,0 ,"Aux. input2 max"}, + {VARIABLE ,"AUX_IN2_CMD" ,ADD_PARAM(input2[1].cmd) ,NULL ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,"Aux. input2 cmd"}, #endif // FEEDBACK - // Type ,Name ,Datatype, ValueL ptr ,ValueR ,EEPRM Addr ,Init ,Min ,Max ,Div ,Mul ,Fix ,Callback Function ,Help text - {VARIABLE ,"I_DC_LINK" ,ADD_PARAM(rtU_Left.i_DCLink) ,&rtU_Right.i_DCLink ,0 ,0 ,0 ,0 ,A2BIT_CONV ,0 ,0 ,NULL ,"DC Link current A"}, - {VARIABLE ,"SPD_AVG" ,ADD_PARAM(speedAvg) ,NULL ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,NULL ,"Motor Measured Avg RPM"}, - {VARIABLE ,"SPDL" ,ADD_PARAM(rtY_Left.n_mot) ,NULL ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,NULL ,"Left Motor Measured RPM"}, - {VARIABLE ,"SPDR" ,ADD_PARAM(rtY_Right.n_mot) ,NULL ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,NULL ,"Right Motor Measured RPM"}, - {VARIABLE ,"RATE" ,0 , NULL ,NULL ,0 ,RATE ,0 ,0 ,0 ,0 ,4 ,NULL ,"Rate *10"}, - {VARIABLE ,"SPD_COEF" ,0 , NULL ,NULL ,0 ,SPEED_COEFFICIENT ,0 ,0 ,0 ,10 ,14 ,NULL ,"Speed Coefficient *10"}, - {VARIABLE ,"STR_COEF" ,0 , NULL ,NULL ,0 ,STEER_COEFFICIENT ,0 ,0 ,0 ,10 ,14 ,NULL ,"Steer Coefficient *10"}, - {VARIABLE ,"BATV" ,ADD_PARAM(adc_buffer.batt1) ,NULL ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,NULL ,"Battery voltage *100"}, - //{VARIABLE ,"TEMP" ,ADD_PARAM(board_temp_deg_c) ,NULL ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,NULL ,"Temperature °C *10"}, + // Type ,Name ,Datatype, ValueL ptr ,ValueR ,EEPRM Addr ,Init Int/Ext ,Min ,Max ,Div ,Mul ,Fix ,Callback Function ,Help text + {VARIABLE ,"I_DC_LINK" ,ADD_PARAM(rtU_Left.i_DCLink) ,&rtU_Right.i_DCLink ,0 ,0 ,0 ,0 ,0 ,A2BIT_CONV ,100 ,0 ,NULL ,"DC Link current A *100"}, + {VARIABLE ,"SPD_AVG" ,ADD_PARAM(speedAvg) ,NULL ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,NULL ,"Motor Measured Avg RPM"}, + {VARIABLE ,"SPDL" ,ADD_PARAM(rtY_Left.n_mot) ,NULL ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,NULL ,"Left Motor Measured RPM"}, + {VARIABLE ,"SPDR" ,ADD_PARAM(rtY_Right.n_mot) ,NULL ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,NULL ,"Right Motor Measured RPM"}, + {VARIABLE ,"RATE" ,0 , NULL ,NULL ,0 ,RATE ,0 ,0 ,0 ,0 ,0 ,4 ,NULL ,"Rate *10"}, + {VARIABLE ,"SPD_COEF" ,0 , NULL ,NULL ,0 ,SPEED_COEFFICIENT ,0 ,0 ,0 ,0 ,10 ,14 ,NULL ,"Speed Coefficient *10"}, + {VARIABLE ,"STR_COEF" ,0 , NULL ,NULL ,0 ,STEER_COEFFICIENT ,0 ,0 ,0 ,0 ,10 ,14 ,NULL ,"Steer Coefficient *10"}, + {VARIABLE ,"BATV" ,ADD_PARAM(adc_buffer.batt1) ,NULL ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,NULL ,"Battery voltage *100"}, + //{VARIABLE ,"TEMP" ,ADD_PARAM(board_temp_deg_c) ,NULL ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,NULL ,"Temperature °C *10"}, }; + +const char *errors[9] = { + "Command not found", // Err1 + "Parameter not found", // Err2 + "This command cannot be used with a Variable", // Err3 + "Value not in range", // Err4 + "Value expected", // Err5 + "Start of line expected", // Err6 + "End of line expected", // Err7 + "Parameter expected", // Err8 + "Uncaught error" // Err9 + "Watch list is full" // Err10 +}; + debug_command command; int8_t watchParamList[MAX_PARAM_WATCH] = {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}; -// Translate from External format to Internal Format -int32_t ExtToInt(uint8_t index,int32_t value){ - // Multiply to translate to internal format - if(params[index].div) value *= params[index].div; - // Shift to translate to internal format - if (params[index].fix) value <<= params[index].fix; - // Divide for small number - if(params[index].mul) value /= params[index].mul; - return value; -} - // Set Param with Value from external format int8_t setParamValExt(uint8_t index, int32_t value) { int8_t ret = 0; // check min and max before conversion to internal values if (IN_RANGE(value,params[index].min,params[index].max)){ - ret = setParamValInt(index,ExtToInt(index,value)); + ret = setParamValInt(index,extToInt(index,value)); printParamDef(index); }else{ - printf("! Value %li out of range [min:%li max:%li]\r\n",value,params[index].min,params[index].max); + printError(4); // Error - Value out of range } return ret; } // Set Param with value from internal format int8_t setParamValInt(uint8_t index, int32_t newValue) { - int32_t value = newValue; - if (*(int32_t*)params[index].valueL != value){ + int32_t oldValue = getParamValInt(index); + if (oldValue != newValue){ // if value is different, beep, cast and assign new value switch (params[index].datatype){ case UINT8_T: - if (params[index].valueL != NULL) *(uint8_t*)params[index].valueL = value; - if (params[index].valueR != NULL) *(uint8_t*)params[index].valueR = value; + if (params[index].valueL != NULL) *(uint8_t*)params[index].valueL = newValue; + if (params[index].valueR != NULL) *(uint8_t*)params[index].valueR = newValue; break; case UINT16_T: - if (params[index].valueL != NULL) *(uint16_t*)params[index].valueL = value; - if (params[index].valueR != NULL) *(uint16_t*)params[index].valueR = value; + if (params[index].valueL != NULL) *(uint16_t*)params[index].valueL = newValue; + if (params[index].valueR != NULL) *(uint16_t*)params[index].valueR = newValue; break; case UINT32_T: - if (params[index].valueL != NULL) *(uint32_t*)params[index].valueL = value; - if (params[index].valueR != NULL) *(uint32_t*)params[index].valueR = value; + if (params[index].valueL != NULL) *(uint32_t*)params[index].valueL = newValue; + if (params[index].valueR != NULL) *(uint32_t*)params[index].valueR = newValue; break; case INT8_T: - if (params[index].valueL != NULL) *(int8_t*)params[index].valueL = value; - if (params[index].valueR != NULL) *(int8_t*)params[index].valueR = value; + if (params[index].valueL != NULL) *(int8_t*)params[index].valueL = newValue; + if (params[index].valueR != NULL) *(int8_t*)params[index].valueR = newValue; break; case INT16_T: - if (params[index].valueL != NULL) *(int16_t*)params[index].valueL = value; - if (params[index].valueR != NULL) *(int16_t*)params[index].valueR = value; + if (params[index].valueL != NULL) *(int16_t*)params[index].valueL = newValue; + if (params[index].valueR != NULL) *(int16_t*)params[index].valueR = newValue; break; case INT32_T: - if (params[index].valueL != NULL) *(int32_t*)params[index].valueL = value; - if (params[index].valueR != NULL) *(int32_t*)params[index].valueR = value; + if (params[index].valueL != NULL) *(int32_t*)params[index].valueL = newValue; + if (params[index].valueR != NULL) *(int32_t*)params[index].valueR = newValue; break; } + + // Beep if value was modified + beepShort(5); } // Run callback function if assigned @@ -190,7 +208,7 @@ int8_t setParamValInt(uint8_t index, int32_t newValue) { // Get Parameter Internal value and translate to external int32_t getParamValExt(uint8_t index) { - return IntToExt(index,getParamValInt(index)); + return intToExt(index,getParamValInt(index)); } // Get Parameter Internal Value @@ -256,7 +274,7 @@ int8_t watchParamVal(uint8_t index){ watchParamList[i] = index; return 1; } - printf("! Watch list is full\r\n"); + printError(10); return 0; } return 1; @@ -272,15 +290,15 @@ int8_t printParamVal(){ return 1; } -// Print help for parameter +// Print help for Command int8_t printCommandHelp(uint8_t index){ - printf("? %s:%s\r\n",commands[index].name,commands[index].help); + printf("? %s:\"%s\"\r\n",commands[index].name,commands[index].help); return 1; } // Print help for parameter int8_t printParamHelp(uint8_t index){ - printf("? %s:%s ",params[index].name,params[index].help); + printf("? %s:\"%s\" ",params[index].name,params[index].help); if (params[index].type == PARAMETER) printf("[min:%li max:%li]",params[index].min,params[index].max); printf("\r\n"); return 1; @@ -308,9 +326,9 @@ int8_t printAllParamHelp(){ return 1; } -// Print definition for parameter +// Print definition(name,value,initial value, min, max) for parameter int8_t printParamDef(uint8_t index){ - printf("# name:%s value:%li init:%li min:%li max:%li\r\n", + printf("# name:\"%s\" value:%li init:%li min:%li max:%li\r\n", params[index].name, // Parameter Name getParamValExt(index), // Parameter Value translated to external format getParamInitExt(index), // Parameter Init Value translated to external format @@ -319,15 +337,23 @@ int8_t printParamDef(uint8_t index){ return 1; } -// Print definition for all parameters +// Print definition(name,value,initial value, min, max) for all parameters int8_t printAllParamDef(){ for(int i=0;i 0){ + printError(command.error); + command.error = 0; + return; } - - if (command.error != 0){command.error = 0;return;}; + + // Nothing to do if (command.semaphore == 0) return; int8_t ret = 0; @@ -582,89 +635,4 @@ void process_debug() } } -/* -void handle_input(uint8_t *userCommand, uint32_t len) -{ - - int8_t cindex = -1; - int8_t pindex = -1; - uint8_t size = 0; - int8_t ret = 0; - - // Find Command - cindex = findCommand(userCommand,len); - if (cindex == -1){ - printf("! Command not found\r\n"); - return; - } - - // Skip command characters - size = strlen(commands[cindex].name); - {len-=size;userCommand+=size;} - // Skip if space - if (*userCommand == 0x20){len-=1;userCommand+=1;} - - if ( (*userCommand == '\n' || *userCommand == '\r') && - commands[cindex].callback_function0 != NULL){ - // This function needs no parameter - ret = (*commands[cindex].callback_function0)(); - if (ret==1){printf("OK\r\n");} - return; - } - - // Find parameter - pindex = findParam(userCommand,len); - if (pindex == -1){ - printf("! Parameter not found\r\n"); - return; - } - - if (commands[cindex].type == WRITE && params[pindex].type == VARIABLE){ - printf("! This command cannot be used with a Variable\r\n"); - return; - } - - if (commands[cindex].callback_function1 != NULL){ - // This function needs only a parameter - ret = (*commands[cindex].callback_function1)(pindex); - if (ret==1){printf("OK\r\n");} - return; - } - - // Skip parameter characters - size = strlen(params[pindex].name); - {len-=size;userCommand+=size;} - // Skip if space - if (*userCommand == 0x20){len-=1;userCommand+=1;} - - - int32_t value = 0; - int8_t sign = 1; - int8_t count = 0; - - // Read sign - if (*userCommand == '-'){len-=1;userCommand+=1;sign =-1;} - // Read value - for (value=0; (unsigned)*userCommand-'0'<10; userCommand++){ - value=10*value+(*userCommand-'0'); - count++; - if (value>MAX_int16_T){printf("! Value not in range\r\n");return;} - } - - if (count == 0){ - printf("! Value required\r\n"); - return; - } - - // Apply sign - value*= sign; - - if (commands[cindex].callback_function2 != NULL){ - // This function needs an additional parameter - ret = (*commands[cindex].callback_function2)(pindex,value); - if (ret==1){printf("OK\r\n");} - } - -}*/ - #endif \ No newline at end of file diff --git a/Src/util.c b/Src/util.c index 5f8bf88..1a0f305 100644 --- a/Src/util.c +++ b/Src/util.c @@ -1133,14 +1133,21 @@ void usart3_rx_check(void) #endif #if defined(DEBUG_SERIAL_USART3) + uint8_t *ptr; + if (pos != old_pos) { // Check change in received data if (pos > old_pos) { // "Linear" buffer mode: check if current position is over previous one usart_process_debug(&rx_buffer_R[old_pos], pos - old_pos); // Process data } else { // "Overflow" buffer mode - usart_process_debug(&rx_buffer_R[old_pos], rx_buffer_R_len - old_pos); // First Process data from the end of buffer + ptr = (uint8_t *) malloc( sizeof(uint8_t) * (rx_buffer_R_len - old_pos + pos) ); + memcpy(ptr,&rx_buffer_R[old_pos],rx_buffer_R_len - old_pos); // First Process data from the end of buffer if (pos > 0) { // Check and continue with beginning of buffer - usart_process_debug(&rx_buffer_R[0], pos); // Process remaining data + ptr += rx_buffer_R_len - old_pos; + memcpy(ptr,&rx_buffer_R[0], pos); // Process remaining data } + ptr -= rx_buffer_R_len - old_pos; + usart_process_debug(ptr, rx_buffer_R_len - old_pos + pos); + free( ptr ); } } #endif // DEBUG_SERIAL_USART3