tibbo_line/command.tc

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);
}