1 /*******************************************************************
2 Motion and Robotic System (MARS) aplication components
4 appl_cmds.c - application specific commands - mainly global
5 PXMC state manipulation for RoCoN
7 Copyright (C) 2001-2014 by Pavel Pisa - originator
9 (C) 2001-2014 by PiKRON Ltd. - originator
12 This file can be used and copied according to next
14 - GPL - GNU Public License
15 - other license provided by project originators
17 *******************************************************************/
20 #include <system_def.h>
24 #include <pxmc_coordmv.h>
26 #include <pxmc_cmds.h>
29 #include "appl_defs.h"
32 #define __STRINGIFY(x) #x /* stringify without expanding x */
35 #define STRINGIFY(x) __STRINGIFY(x) /* expand x, then stringify */
38 int sqrtll_main(int argc, char *argv[]);
39 int cmd_do_stop_all(cmd_io_t *cmd_io, const struct cmd_des *des, char *param[]);
40 int cmd_do_release_all(cmd_io_t *cmd_io, const struct cmd_des *des, char *param[]);
41 int cmd_do_status_bsybits(cmd_io_t *cmd_io, const struct cmd_des *des, char *param[]);
42 int cmd_do_axst_all(cmd_io_t *cmd_io, const struct cmd_des *des, char *param[]);
43 int cmd_do_cer_all(cmd_io_t *cmd_io, const struct cmd_des *des, char *param[]);
44 int cmd_do_clr_all(cmd_io_t *cmd_io, const struct cmd_des *des, char *param[]);
46 unsigned short statchk_power_stop = 0;
47 unsigned short statchk_power_off = 0;
48 int appl_errstop_mode = 0;
49 int appl_idlerel_time = 0;
51 int cmd_do_status_all(cmd_io_t *cmd_io, const struct cmd_des *des, char *param[])
58 if((opchar=cmd_opchar_check(cmd_io,des,param))<0) return opchar;
61 pxmc_for_each_mcs(i, mcs) {
65 if(pxmc_coordmv_checkst(&pxmc_coordmv_state)>=2)
66 val|=PXMS_CQF_m; /* coordinator coomand queue full */
69 if(statchk_power_stop)
73 return cmd_opchar_replong(cmd_io, param, val, 0, 0);
78 int cmd_do_pthalign(cmd_io_t *cmd_io, const struct cmd_des *des, char *param[])
83 if((mcs=cmd_opchar_getreg(cmd_io,des,param))==NULL) return -CMDERR_BADREG;
86 return cmd_opchar_replong(cmd_io, param, (long)mcs->pxms_ptmark, 0, 0);
89 if(*param[2]!=':') return -CMDERR_OPCHAR;
91 res = pxmc_rocon_pthalalign(mcs, 20);
94 return -CMDERR_BADDIO;
99 int cmd_do_reg_type(cmd_io_t *cmd_io, const struct cmd_des *des, char *param[])
104 if((mcs=cmd_opchar_getreg(cmd_io,des,param))==NULL) return -CMDERR_BADREG;
107 return cmd_opchar_replong(cmd_io, param, pxmc_get_reg_type(mcs), 0, 0);
110 if(*param[2]!=':') return -CMDERR_OPCHAR;
112 if(mcs->pxms_flg&PXMS_BSY_m) return -CMDERR_BSYREG;
115 val=pxmc_set_reg_type(mcs, val);
124 * cmd_do_axis_mode - checks the command format and busy flag validity, calls pxmc_axis_mode
126 * if pxmc_axis_mode returns -1, cmd_do_axis_mode returns -1.
128 int cmd_do_axis_mode(cmd_io_t *cmd_io, const struct cmd_des *des, char *param[])
133 if((mcs=cmd_opchar_getreg(cmd_io,des,param))==NULL) return -CMDERR_BADREG;
136 return cmd_opchar_replong(cmd_io, param, pxmc_axis_rdmode(mcs), 0, 0);
139 if(*param[2]!=':') return -CMDERR_OPCHAR;
141 if(mcs->pxms_flg&PXMS_BSY_m) return -CMDERR_BSYREG;
144 val=pxmc_axis_mode(mcs,val);
151 int cmd_do_axes_outmap(cmd_io_t *cmd_io, const struct cmd_des *des, char *param[])
159 int exes_cnt = pxmc_main_list.pxml_cnt > 0? pxmc_main_list.pxml_cnt : 0;
160 pxmc_info_t outmap[exes_cnt];
167 cmd_io_write(cmd_io,param[0],param[2]-param[0]);
169 pxmc_for_each_mcs(mcs_idx, mcs)
171 cmd_io_putc(cmd_io, mcs_idx? ',' : '=');
173 val = mcs->pxms_out_info;
174 i2str(str, val, 0, 0);
175 cmd_io_write(cmd_io,str,strlen(str));
177 cmd_io_putc(cmd_io, 'X');
184 if(*param[2]!=':') return -CMDERR_OPCHAR;
191 if (mcs_idx >= exes_cnt - 1)
192 return -CMDERR_BADREG;
194 if (si_long(&ps, &val, 0) < 0)
195 return -CMDERR_BADPAR;
198 return -CMDERR_BADPAR;
200 outmap[++mcs_idx] = val;
206 return -CMDERR_BADSEP;
209 while (mcs_idx < exes_cnt - 1) {
211 mcs = pxmc_main_list.pxml_arr[mcs_idx];
213 val = pxmc_axis_rdmode(mcs);
214 val = pxmc_axis_out_chans4mode(val);
216 out_chan = outmap[mcs_idx] + val;
219 outmap[++mcs_idx] = out_chan;
222 pxmc_for_each_mcs(mcs_idx, mcs)
226 if(mcs->pxms_flg & PXMS_BSY_m)
227 return -CMDERR_BSYREG;
228 pxmc_axis_release(mcs);
229 val = pxmc_axis_mode(mcs, PXMC_AXIS_MODE_NOCHANGE);
234 pxmc_for_each_mcs(mcs_idx, mcs)
238 mcs->pxms_out_info = outmap[mcs_idx];
239 val = pxmc_axis_mode(mcs, PXMC_AXIS_MODE_NOCHANGE);
248 int cmd_do_ioecho(cmd_io_t *cmd_io, const struct cmd_des *des, char *param[])
253 if((opchar=cmd_opchar_check(cmd_io, des, param))<0) return opchar;
257 cmd_io->priv.ed_line.in->flg &= ~FL_ELB_ECHO;
259 cmd_io->priv.ed_line.in->flg |= FL_ELB_ECHO;
260 else return -CMDERR_BADPAR;
262 cmd_io_write(cmd_io, param[0], param[2]-param[0]);
263 cmd_io_putc(cmd_io,'=');
264 cmd_io_putc(cmd_io,cmd_io->priv.ed_line.in->flg & FL_ELB_ECHO?'1':'0');
269 const char software_ver[]="LX_ROCON v"STRINGIFY(SW_VER_MAJOR)"."STRINGIFY(SW_VER_MINOR)
270 " build Pi "__DATE__" "__TIME__;
272 int cmd_do_ver(cmd_io_t *cmd_io, const struct cmd_des *des, char *param[])
274 if(*param[2]!='?') return -CMDERR_OPCHAR;
275 cmd_io_write(cmd_io,param[0],param[2]-param[0]);
276 cmd_io_putc(cmd_io,'=');
277 cmd_io_write(cmd_io,software_ver,strlen(software_ver));
281 int cmd_do_spmax(cmd_io_t *cmd_io, const struct cmd_des *des, char *param[])
283 if(*param[2]!='?') return -CMDERR_OPCHAR;
284 return cmd_opchar_replong(cmd_io, param, pxmc_sfi_spent_time_max, 0, 0);
285 pxmc_sfi_spent_time_max = 0;
289 int cmd_do_sqrtll(cmd_io_t *cmd_io, const struct cmd_des *des, char *param[])
293 sqrtll_main(!ps?1: !*ps? 1: 2, param);
297 cmd_des_t const cmd_des_cer_all={0, CDESM_OPCHR,"PURGE","clear error flags and release failded axes",
299 cmd_des_t const cmd_des_clr_all={0, CDESM_OPCHR,
300 "CLEAR",0,cmd_do_clr_all,{}};
301 cmd_des_t const cmd_des_stop_all={0, CDESM_OPCHR,
302 "STOP","stop all motions",cmd_do_stop_all,{}};
303 cmd_des_t const cmd_des_release_all={0, CDESM_OPCHR,
304 "RELEASE","releases all axes closed loop control",cmd_do_release_all,{}};
305 cmd_des_t const cmd_des_status_all={0, CDESM_OPCHR|CDESM_RD,
306 "ST","system status bits encoded in number",
307 cmd_do_status_all,{}};
308 cmd_des_t const cmd_des_status_bsybits={0, CDESM_OPCHR|CDESM_RD,
309 "STBSYBITS","busy bits of all axes in one number",
310 cmd_do_status_bsybits,{}};
311 cmd_des_t const cmd_des_stamp={0, CDESM_OPCHR,
312 "STAMP","host communication stamp",
314 cmd_des_t const cmd_des_pthalign={0, CDESM_OPCHR|CDESM_RW,"PTHALIGN?","run alignement of phase according to HAL",
317 cmd_des_t const cmd_des_reg_type={0, CDESM_OPCHR|CDESM_RW,
318 "REGTYPE?","select controller structure and type",cmd_do_reg_type,
320 cmd_des_t const cmd_des_axis_mode={0, CDESM_OPCHR|CDESM_WR,
321 "REGMODE?","axis working mode",cmd_do_axis_mode,
323 cmd_des_t const cmd_des_axes_outmap={0, CDESM_OPCHR|CDESM_WR,
324 "REGOUTMAP","map outputs to axes",cmd_do_axes_outmap,
326 cmd_des_t const cmd_des_errstop={0, CDESM_OPCHR|CDESM_RW,
327 "ERRSTOP","stop all axes at error",cmd_do_rw_int,
328 {(char*)&appl_errstop_mode,
330 cmd_des_t const cmd_des_idlerel={0, CDESM_OPCHR|CDESM_RW,
331 "IDLEREL","release controllers after ? seconds",cmd_do_rw_int,
332 {(char*)&appl_idlerel_time,
334 cmd_des_t const cmd_des_echo={0, CDESM_OPCHR|CDESM_RW,
335 "ECHO","enable echoing of received character",cmd_do_ioecho,{}};
336 cmd_des_t const cmd_des_ver={0, CDESM_OPCHR|CDESM_RD,
337 "VER","software version",cmd_do_ver,{}};
338 cmd_des_t const cmd_des_spmax={0, CDESM_OPCHR|CDESM_RD,
339 "SPMAX","read and reset maximal time spent in isr",
341 cmd_des_t const cmd_des_sqrtll={0, 0,"sqrtll","test 64-bit square root computation",
345 cmd_des_t const *const cmd_appl_specific[]={
349 &cmd_des_release_all,
351 &cmd_des_status_bsybits,
356 &cmd_des_axes_outmap,