1 /*******************************************************************
2 Motion and Robotic System (MARS) aplication components
4 appl_coordmv.c - application specific coordinated
5 motions control support
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>
22 #include <pxmc_coordmv.h>
24 #include <pxmc_cmds.h>
27 #include "appl_defs.h"
29 int pxmc_coordmv_process(void)
31 /* coordinator bottom handling */
32 if (pxmc_coordmv_state.mcs_flg & MCS_BOTT_m){
33 pxmc_coordmv_bottom(&pxmc_coordmv_state);
39 int cmd_do_coordmv(cmd_io_t *cmd_io, const struct cmd_des *des, char *param[])
41 pxmc_coordmv_state_t *mcs_state = &pxmc_coordmv_state;
42 int con_cnt = mcs_state->mcs_con_cnt;
44 long final[con_cnt], val;
48 if(*param[2]!=':') return -CMDERR_OPCHAR;
50 if ((long)(des->info[1]) & 1) { /* coordinated movement with time */
51 if (si_long(&s, &mintim, 10) <0 ) return -CMDERR_BADPAR;
52 if (mintim < 0) return -CMDERR_BADPAR;
53 if (si_fndsep(&s,",") <=0 ) return -CMDERR_BADSEP;
55 if (!con_cnt) return -CMDERR_BADCFG;
58 if(si_long(&s, &val, 10) <0 ) return -CMDERR_BADPAR;
59 mcs = pxmc_coordmv_indx2mcs(mcs_state, i);
60 if(!mcs) return -CMDERR_BADREG;
61 final[i] = val << PXMC_SUBDIV(mcs);
62 if(++i >= con_cnt) break;
63 if(si_fndsep(&s, ",") <= 0) return -CMDERR_BADSEP;
66 if(*s) return -CMDERR_GARBAG;
68 if ((long)(des->info[1]) & 2){
69 if (pxmc_coordmv_relmv(mcs_state, con_cnt, final, mintim)<0)
72 if (pxmc_coordmv_absmv(mcs_state, con_cnt, final, mintim)<0)
79 int cmd_do_coordspline(cmd_io_t *cmd_io, const struct cmd_des *des, char *param[])
81 pxmc_coordmv_state_t *mcs_state = &pxmc_coordmv_state;
82 int con_cnt = mcs_state->mcs_con_cnt;
83 long spline_param[con_cnt * PXMC_SPLINE_ORDER_MAX];
92 if (*param[2] != ':') return -CMDERR_OPCHAR;
94 if ((long)(des->info[1]) & 1) { /* coordinated movement with time */
95 if (si_long(&s,&mintim, 10)<0) return -CMDERR_BADPAR;
96 if (mintim<0) return -CMDERR_BADPAR;
97 if (si_fndsep(&s, ",")<=0) return -CMDERR_BADSEP;
99 if (!con_cnt) return -CMDERR_BADCFG;
101 if (si_long(&s,&order, 10) <0 ) return -CMDERR_BADPAR;
102 if (mintim <0 ) return -CMDERR_BADPAR;
103 if (si_fndsep(&s, ",") <= 0) return -CMDERR_BADSEP;
105 if ((order <= 0) || (order > PXMC_SPLINE_ORDER_MAX))
106 return -CMDERR_BADPAR;
110 if (si_long(&s, &val, 10) < 0) return -CMDERR_BADPAR;
111 mcs = pxmc_coordmv_indx2mcs(mcs_state, a);
112 if (!mcs) return -CMDERR_BADREG;
113 spline_param[i] = val << PXMC_SUBDIV(mcs);;
117 if (++a >= con_cnt) break;
119 if (si_fndsep(&s, ",") <= 0) return -CMDERR_BADSEP;
122 if(*s) return -CMDERR_GARBAG;
124 if (pxmc_coordmv_spline(mcs_state, i, spline_param, order, mintim) < 0)
130 int cmd_do_coordgrp(cmd_io_t *cmd_io, const struct cmd_des *des, char *param[])
132 pxmc_coordmv_state_t *mcs_state = &pxmc_coordmv_state;
133 pxmc_state_list_t *reg_list = mcs_state->mcs_con_list;
134 int reg_max = reg_list->pxml_cnt;
137 int con_indx[reg_max];
140 if (*param[2] != ':') return -CMDERR_OPCHAR;
146 if (chan >= reg_max) return -CMDERR_BADREG;
147 con_indx[con_cnt] = chan;
149 if ((ret = si_fndsep(&s, ",")) < 0) return -CMDERR_BADSEP;
153 return pxmc_coordmv_grp(mcs_state, con_cnt, con_indx);
156 cmd_des_t const cmd_des_coordmv={0, CDESM_OPCHR|CDESM_WR,
157 "COORDMV","initiate coordinated movement to point f1,f2,...",cmd_do_coordmv,
159 cmd_des_t const cmd_des_coordmvt={0, CDESM_OPCHR|CDESM_WR,
160 "COORDMVT","coord. movement with time to point mintime,f1,f2,...",cmd_do_coordmv,
162 cmd_des_t const cmd_des_coordrelmvt={0, CDESM_OPCHR|CDESM_WR,
163 "COORDRELMVT","coord. relative movement with time to point mintime,f1,f2,...",
166 cmd_des_t const cmd_des_coordsplinet={0, CDESM_OPCHR|CDESM_WR,
167 "COORDSPLINET","coord. spline movement with time to point mintime,order,a11,a12,...,a21,..",
170 cmd_des_t const cmd_des_coordgrp={0, CDESM_OPCHR|CDESM_WR,
171 "COORDGRP","group axes for COORDMV, for ex. C,D,F",cmd_do_coordgrp,
173 cmd_des_t const cmd_des_coorddiscont={0, CDESM_OPCHR|CDESM_RW,
174 "COORDDISCONT","max relative discontinuity between segs",cmd_do_rw_long,
175 {(char*)&pxmc_coordmv_state.mcs_disca,
178 cmd_des_t const *const cmd_pxmc_coordmv[]={
181 &cmd_des_coordrelmvt,
182 &cmd_des_coordsplinet,
184 &cmd_des_coorddiscont,