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