mirror of
https://github.com/eddyem/stm32samples.git
synced 2025-12-06 02:35:23 +03:00
174 lines
5.1 KiB
C
174 lines
5.1 KiB
C
/*
|
|
* This file is part of the canonmanage project.
|
|
* Copyright 2022 Edward V. Emelianov <edward.emelianoff@gmail.com>.
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#include <string.h>
|
|
|
|
#include "adc.h"
|
|
#include "canproto.h" // errors
|
|
#include "flash.h"
|
|
#include "hardware.h"
|
|
#include "proto.h"
|
|
#include "strfunc.h"
|
|
#include "usb.h"
|
|
#include "version.inc"
|
|
|
|
const char* helpmsg =
|
|
"https://github.com/eddyem/stm32samples/tree/master/F1-nolib/Hall_linear build#" BUILD_NUMBER " @ " BUILD_DATE "\n"
|
|
"a - get ADC value (raw*Mul/Div)\n"
|
|
"d - change Div\n"
|
|
"m - change Mul\n"
|
|
"r - get Raw ADC value\n"
|
|
"u - get ADC voltage (*100)\n"
|
|
"\t\tdebugging/conf commands:\n"
|
|
"D - dump current config\n"
|
|
"E - erase full flash storage\n"
|
|
"F - reinit flashstorage\n"
|
|
"I - set CAN ID (11 bit)\n"
|
|
"M - show MCU temperature (*10)\n"
|
|
"R - software reset\n"
|
|
"S - set CAN speed (9600-3000000 baud)\n"
|
|
"T - show Tms value\n"
|
|
"V - get Vdd (*100)\n"
|
|
"X - save current config to flash\n"
|
|
;
|
|
|
|
static const char* const errors_txt[ERR_AMOUNT] = {
|
|
[ERR_OK] = "OK"
|
|
,[ERR_BADPAR] = "badpar"
|
|
,[ERR_BADVAL] = "badval"
|
|
,[ERR_WRONGLEN] = "wronglen"
|
|
,[ERR_BADCMD] = "badcmd"
|
|
,[ERR_CANTRUN] = "cantrun"
|
|
};
|
|
|
|
static void errtext(errcodes e){
|
|
if(e != ERR_OK) USB_sendstr("error=");
|
|
USB_sendstr(errors_txt[e]);
|
|
newline();
|
|
}
|
|
|
|
|
|
void parse_cmd(const char *buf){
|
|
int ret = ERR_CANTRUN;
|
|
if(!buf || *buf == 0) return;
|
|
uint32_t U, nan = 0;
|
|
if(buf[1] == '\n' || !buf[1]){ // one symbol commands
|
|
switch(*buf){
|
|
case 'D': // dump current config
|
|
dump_userconf();
|
|
return;
|
|
break;
|
|
case 'E': // erase full flash storage
|
|
if(0 == erase_storage(-1)) ret = ERR_OK;
|
|
break;
|
|
case 'F': // reinit flashstorage
|
|
flashstorage_init();
|
|
ret = ERR_OK;
|
|
break;
|
|
case 'M':
|
|
USB_sendstr("MCUt=");
|
|
printu(getMCUtemp());
|
|
newline(); return;
|
|
break;
|
|
case 'R': // software reset
|
|
USB_sendstr("Soft reset\n");
|
|
NVIC_SystemReset();
|
|
break;
|
|
case 'T': // show Tms value
|
|
USB_sendstr("Tms=");
|
|
printu(Tms);
|
|
newline(); return;
|
|
break;
|
|
case 'V':
|
|
USB_sendstr("VDD=");
|
|
printu(getVdd());
|
|
newline(); return;
|
|
break;
|
|
case 'X': // save current config to flash
|
|
if(0 == store_userconf()) ret = ERR_OK;
|
|
break;
|
|
case 'a': // get ADC value (raw*Mul/Div)
|
|
U = getADCval(ADC_CH_0) * the_conf.Mul;
|
|
USB_sendstr("ADC="); printu(U/the_conf.Div);
|
|
newline(); return;
|
|
break;
|
|
case 'r': // get Raw ADC value
|
|
USB_sendstr("ADCraw=");
|
|
printu(getADCval(ADC_CH_0));
|
|
newline(); return;
|
|
break;
|
|
case 'u': // get ADC voltage
|
|
USB_sendstr("ADCv=");
|
|
printu(getADCvoltage(ADC_CH_0));
|
|
newline(); return;
|
|
break;
|
|
default:
|
|
USB_sendstr(helpmsg);
|
|
return;
|
|
}
|
|
goto ret;
|
|
}
|
|
char cmd = *buf++;
|
|
const char *nxt = getnum(buf, &U);
|
|
if(nxt == buf){
|
|
nan = 1;
|
|
ret = ERR_BADVAL;
|
|
}
|
|
switch(cmd){ // long messages
|
|
case 'I': // can ID
|
|
if(nan) break;
|
|
else if(U >= 0x800) ret = ERR_WRONGLEN;
|
|
else{
|
|
the_conf.canID = U;
|
|
ret = ERR_OK;
|
|
}
|
|
break;
|
|
case 'S': // can speed
|
|
if(nan) break;
|
|
if(U < CAN_MIN_SPEED || U > CAN_MAX_SPEED) ret = ERR_WRONGLEN;
|
|
else{
|
|
the_conf.canspeed = U;
|
|
ret = ERR_OK;
|
|
}
|
|
break;
|
|
case 'd': // Divisor
|
|
if(nan) break;
|
|
if(U < 1 ) ret = ERR_WRONGLEN;
|
|
else{
|
|
the_conf.Div = U;
|
|
ret = ERR_OK;
|
|
}
|
|
break;
|
|
case 'm': // Multiplier
|
|
if(nan) break;
|
|
if(U < 1 || U > 1<<20) ret = ERR_WRONGLEN;
|
|
else{
|
|
the_conf.Mul = U;
|
|
ret = ERR_OK;
|
|
}
|
|
break;
|
|
default:
|
|
USB_sendstr(helpmsg);
|
|
return;
|
|
}
|
|
ret:
|
|
errtext(ret);
|
|
}
|
|
|
|
|