344 lines
8.2 KiB
Plaintext
344 lines
8.2 KiB
Plaintext
#include "global.th"
|
|
#include "command.th"
|
|
#include "config_work.th"
|
|
#include "braker.th"
|
|
#include "net.th"
|
|
#include "encoder.th"
|
|
#include "common.th"
|
|
|
|
static string debug_commands[]= {
|
|
"debug_enc_level", // 0
|
|
"debug_enc_state", // 1
|
|
"debug_relay_reply", // 2
|
|
"debug_relay_show", // 3
|
|
"debug_sensors", // 4
|
|
"debug_showtime", // 5
|
|
"" // Разделитель. не удалять
|
|
};
|
|
|
|
|
|
static string enc_commands[]= {
|
|
"enc_set_window", // 0
|
|
"enc_calibrate_start", // 1
|
|
"enc_calibrate_end", // 2
|
|
"" // Разделитель. не удалять
|
|
};
|
|
static string sys_commands[]= {
|
|
"systeminfo", // 0
|
|
"ip", // 1
|
|
"reset","reboot", // 2
|
|
"setbraker", // 3
|
|
"setencoder", // 4
|
|
"setconfig", // 5
|
|
"getconfig", // 6
|
|
"",
|
|
"" // Разделитель. не удалять
|
|
};
|
|
static string cmdbuffer = "";
|
|
string cmd;
|
|
string params;
|
|
string pars[10];
|
|
int par_num;
|
|
void on_sock_inband() // обработка поступивших команд
|
|
{
|
|
cmdbuffer += sock.getinband();
|
|
unsigned char position = instr(1,cmdbuffer,chr(sock.endchar),1);
|
|
while (position != 0){
|
|
string cmdline = left(cmdbuffer,position);
|
|
cmdbuffer = right(cmdbuffer,len(cmdbuffer)-position);
|
|
d("{cmd} line: "+cmdline);
|
|
unsigned char cmdlen = instr(1,cmdline,chr('='),1);
|
|
if (cmdlen==0)
|
|
cmdlen = instr(1,cmdline,chr('&'),1);
|
|
cmd = left(cmdline,cmdlen-1);
|
|
params = mid(cmdline,cmdlen+1,position-cmdlen-1);
|
|
getParams(params);
|
|
|
|
if (left(cmd,3)=="enc"){
|
|
cmd_replay(cmd_encoder());
|
|
}else if(left(cmd,5)=="debug"){
|
|
cmd_replay(cmd_debug());
|
|
}else {
|
|
cmd_replay(cmd_system());
|
|
}
|
|
position = instr(1,cmdbuffer,chr(sock.endchar),1);
|
|
}
|
|
}
|
|
|
|
string cmd_system(){
|
|
string result;
|
|
bool save = true;
|
|
int i = indexOfArray(sys_commands,cmd);
|
|
if (i >= 0){
|
|
switch (i){
|
|
case 0: // systeminfo
|
|
result = cmd_systeminfo();
|
|
save = false;
|
|
break;
|
|
case 1: // ip
|
|
result = cmd_ip(params);
|
|
break;
|
|
case 2: // reset
|
|
case 3: // reboot
|
|
cmd_replay("{cmd} Rebooting...");
|
|
cmd_reset();
|
|
save = false;
|
|
break;
|
|
case 4: // setbraker
|
|
result = cmd_setbraker();
|
|
break;
|
|
case 5: // setencoder
|
|
result = cmd_setencoder();
|
|
break;
|
|
case 6: // setconfig
|
|
string r;
|
|
string s;
|
|
unsigned char x;
|
|
string p = toLower1(pars[0]);
|
|
if (p=="off"||p=="none"){
|
|
s=chr(255);
|
|
stor.setdata(s,5);
|
|
config.STORE_LOCATON = NONE;
|
|
save=false;
|
|
fd.mount();
|
|
fd.delete("config");
|
|
}else if(p=="flash"){
|
|
s=chr(3);
|
|
stor.setdata(s,5);
|
|
config.STORE_LOCATON = FLASH;
|
|
config.FLASH_SIZE = 1024;
|
|
config.FLASH_FILES = 10;
|
|
|
|
}else if(p=="eprom"){
|
|
s=chr(6);
|
|
stor.setdata(s,5);
|
|
config.STORE_LOCATON = EEPROM;
|
|
|
|
}
|
|
|
|
break;
|
|
case 7: // getconfig
|
|
save = false;
|
|
char strconfig[1000];
|
|
char *ptr = get_config(strconfig);
|
|
char *out = strconfig;
|
|
int length = ptr - out;
|
|
d(str(length));
|
|
while (out < ptr){
|
|
string s;
|
|
char *ss = s;
|
|
if (out+100 <ptr){
|
|
memcpy(ss,out,100);
|
|
*(ss-2)=100;
|
|
}else{
|
|
memcpy(ss,out,ptr-out);
|
|
|
|
*(ss-2)=ptr-out;
|
|
}
|
|
d(s);
|
|
out+=100;
|
|
}
|
|
|
|
break;
|
|
default:
|
|
result = "{cmd}: Unknown command: "+cmd;
|
|
}
|
|
if (save) config_save();
|
|
}else
|
|
result = "{cmd}: Unknown command: "+cmd;
|
|
|
|
return result;
|
|
}
|
|
|
|
string cmd_debug(){
|
|
string result;
|
|
int i = indexOfArray(debug_commands,cmd);
|
|
if (i >= 0){
|
|
switch (i){
|
|
case 0: // debug_enc_level
|
|
config.debug.EncoderDebug= val(pars[0]);
|
|
result = "Debug encoder level SET="+str(config.debug.EncoderDebug);
|
|
break;
|
|
case 1: // debug_enc_state
|
|
config.debug.EncoderStateMode= val(pars[0]);
|
|
result = "Debug encoder work with state SET="+str(config.debug.EncoderStateMode);
|
|
break;
|
|
case 2: // debug_relay_reply
|
|
config.debug.RelayReply = val(pars[0])>0;
|
|
result = "Debug relay reply SET="+(config.debug.RelayReply? "TRUE":"FALSE");
|
|
break;
|
|
case 3: // debug_relay_show
|
|
config.debug.RelayShow = val(pars[0])>0;
|
|
result = "Debug relay show SET="+(config.debug.RelayShow? "TRUE":"FALSE");
|
|
break;
|
|
case 4: // debug_sensors
|
|
config.debug.SensorsLook = val(pars[0])>0;
|
|
result = "Debug sensors SET="+(config.debug.SensorsLook? "TRUE":"FALSE");
|
|
break;
|
|
case 5: // debug_showtime
|
|
config.debug.ShowTime = val(pars[0])>0;
|
|
result = "Debug show time SET="+(config.debug.ShowTime? "TRUE":"FALSE");
|
|
break;
|
|
default:
|
|
result = "{cmd}: Unknown command: "+cmd;
|
|
}
|
|
}else
|
|
result = "{cmd}: Unknown command: "+cmd;
|
|
|
|
return result;
|
|
}
|
|
|
|
string cmd_encoder(){
|
|
string result;
|
|
bool save = true;
|
|
int i = indexOfArray(enc_commands,cmd);
|
|
if (i >= 0){
|
|
switch (i){
|
|
case 0: // enc_set_window
|
|
config.EncoderCfg.windowWidth = val(pars[0]);
|
|
result = "Encoder window SET="+str(config.EncoderCfg.windowWidth);
|
|
save = true;
|
|
break;
|
|
case 1: // "enc_calibrate_start", // 1
|
|
case 2: // "enc_calibrate_end", // 2
|
|
result = cmd_enc_calibre();
|
|
break;
|
|
default:
|
|
result = "{cmd}: Unknown command: "+cmd;
|
|
break;
|
|
}
|
|
}else
|
|
result = "{cmd}: Unknown command: "+cmd;
|
|
if (save) config_save();
|
|
return result;
|
|
}
|
|
|
|
|
|
void cmd_replay(string message){
|
|
d(message);
|
|
sock.setsendinband(chr(sock.escchar)+" "+message+chr(sock.endchar)+chr(13)+chr(10));
|
|
}
|
|
|
|
string cmd_setencoder(){
|
|
string message;
|
|
config.EncoderCfg.encoderPort = pars[0];
|
|
config.EncoderCfg.encoderMode = pars[1];
|
|
config.EncoderCfg.encoderInterval = pars[2];
|
|
string ports;
|
|
string port = pars[par_num];
|
|
int n = 1;
|
|
int p = instr(1,port,".",1);
|
|
while (p>0){
|
|
ports+=chr(val(mid(port,n,n-p)));
|
|
n = p+1;
|
|
p = instr(n,port,".",1);
|
|
}
|
|
ports += chr(val(mid(port,n,len(port)-n+1)));
|
|
|
|
config.EncoderCfg.workedPorts = ports;
|
|
config_save();
|
|
encoder_init();
|
|
string mess= "Энкодер настроен: Порт: "+str(pars[0])+ ", Режим: "+str(pars[1])+ ", Интервал: "+str(pars[2])+ ", Рабочие порты: "+pars[par_num];
|
|
d(mess);
|
|
return mess;
|
|
}
|
|
string cmd_enc_calibre(){
|
|
int mode = val(pars[0]);
|
|
enc_calibrate_mode(mode);
|
|
if (mode >0){
|
|
return "Запушена калибровка энкодера в режиме "+str(mode);
|
|
}
|
|
return "Остановлен режим калибровки энкодера. Среднее значение: " + str(enc_calibrate_result());
|
|
}
|
|
string cmd_systeminfo(){
|
|
return "platform='"+ PLATFORM+"', version='" + VERSION + "', uptime=" + str(sys.timercountms)+"";
|
|
}
|
|
|
|
void cmd_reset()
|
|
{
|
|
d("{cmd} Rebooting...");
|
|
unsigned int w = sys.timercount;
|
|
while (sys.timercount - w < 2){
|
|
doevents;
|
|
}
|
|
sock.close();
|
|
w = sys.timercount;
|
|
while (sys.timercount-w < 2){
|
|
doevents;
|
|
}
|
|
sys.reboot();
|
|
}
|
|
string cmd_ip(string params)
|
|
{
|
|
string result="";
|
|
string vip = validate_id(params);
|
|
if (vip != params){
|
|
return "{cmd}.ip - Invalid IP: [ "+params+" ]";
|
|
}
|
|
|
|
unsigned char x = stor.setdata(ddval(vip),0);
|
|
doevents;
|
|
if (x == 4){
|
|
config.IP = vip;
|
|
config_save();
|
|
result = ("{cmd}.ip set to [ " + ddstr(stor.getdata(1,4))+" ] after reboot");
|
|
d(result);
|
|
doevents;
|
|
}
|
|
else
|
|
{
|
|
sock.setsendinband(chr(sock.escchar)+" ERROR STORE IP "+chr(sock.endchar));
|
|
doevents;
|
|
}
|
|
return result;
|
|
}
|
|
string cmd_setbraker()
|
|
{
|
|
unsigned char n, p, num ;
|
|
unsigned long t;
|
|
string vals = "";
|
|
n = 1;
|
|
p = instr(1,params,",",1);
|
|
while (p>0){
|
|
vals+=chr(val(mid(params,n,n-p)));
|
|
n = p+1;
|
|
p = instr(n,params,",",1);
|
|
}
|
|
num = pars[0];
|
|
if (toLower1(pars[1])=="off"){
|
|
config.BRAKERS[num-1].Enable = false;
|
|
brakers_init();
|
|
return "OK: Braker "+str(num)+" now OFF";
|
|
}
|
|
float timeout = (strtof(pars[par_num])*1000);
|
|
braker_init(num,val(pars[2]),val(vals[3]),val(vals[1]),timeout);
|
|
string message;
|
|
if (val(pars[1])>0){
|
|
message = "OK: Num="+str(num)+", Rel="+pars[1]+", Sens="+pars[2]+", Drop="+pars[3]+", Timeout="+ ftostr(timeout/1000,FTOSTR_MODE_PLAIN,4)+" sec.";
|
|
}else{
|
|
message = "OK: Num="+str(num)+" DISABLED";
|
|
}
|
|
d(message);
|
|
return message;
|
|
}
|
|
|
|
void getParams(string params){
|
|
|
|
for (int i=0;i<10;i++){
|
|
pars[i]="";
|
|
}
|
|
unsigned char n, p, num ;
|
|
unsigned long t;
|
|
string vals = "";
|
|
par_num = 0;
|
|
n = 1;
|
|
p = instr(1,params,",",1);
|
|
while (p>0){
|
|
pars[par_num] = mid(params,n,p-n);
|
|
n = p+1;
|
|
par_num++;
|
|
p = instr(n,params,",",1);
|
|
}
|
|
pars[par_num] = mid(params,n,len(params)-n+1);
|
|
|
|
} |