1 /*******************************************************************
2 Components for embedded applications builded for
3 laboratory and medical instruments firmware
5 cmd_proc.h - text line command processor
6 designed for instruments control and setup
9 Copyright (C) 2001-2009 by Pavel Pisa pisa@cmp.felk.cvut.cz
10 (C) 2002-2009 by PiKRON Ltd. http://www.pikron.com
11 (C) 2007 by Michal Sojka <sojkam1@fel.cvut.cz>
13 This file can be used and copied according to next
15 - MPL - Mozilla Public License
16 - GPL - GNU Public License
17 - other license provided by project originators
18 *******************************************************************/
23 #define CMD_PROC_WITH_FILE
25 #ifdef CMD_PROC_WITH_FILE
29 #define FL_ELB_ECHO 0x10 /* Read characters are echoed back */
30 #define FL_ELB_INSEND 0x20 /* The line is currently being sent */
31 #define FL_ELB_NOCRLF 0x40 /* CR and/or LF will not start the new line */
32 #define CMD_DES_CONTINUE_AT_ID ((cmd_des_t*)1)
33 #define CMD_DES_INCLUDE_SUBLIST_ID ((cmd_des_t*)2)
34 #define CMD_DES_CONTINUE_AT(list) CMD_DES_CONTINUE_AT_ID,((cmd_des_t*)list)
35 #define CMD_DES_INCLUDE_SUBLIST(list) CMD_DES_INCLUDE_SUBLIST_ID,((cmd_des_t*)list)
37 /* generic cmd_io structure */
39 /* buffer for in/out line collection */
41 int flg; /* FL_ELB_xxx */
42 int inbuf; /* Index to store new characters */
43 int alloc; /* Size of the buffer pointed by buf */
45 int lastch; /* Last characted added to the buffer.
46 * If FL_ELB_INSEND is set, lastch is
47 * index of last sent char. */
51 /* Structure for character input output. It is used either for direct
52 * access to IO device or for buffered IO. In the later case,
53 * priv.edline is used to store buffer information. */
54 typedef struct cmd_io{
55 int (*putc)(struct cmd_io *cmd_io,int ch);
56 int (*getc)(struct cmd_io *cmd_io);
57 int (*write)(struct cmd_io *cmd_io,const void *buf,int count);
58 int (*read)(struct cmd_io *cmd_io,void *buf,int count);
63 struct cmd_io *io_stack;
69 #ifdef CMD_PROC_WITH_FILE
74 #endif /*CMD_PROC_WITH_FILE*/
81 static inline int cmd_io_putc(struct cmd_io *cmd_io,int ch)
82 { if(!cmd_io->putc) return -1;
83 return (*cmd_io->putc)(cmd_io,ch);
86 static inline int cmd_io_getc(struct cmd_io *cmd_io)
87 { if(!cmd_io->getc) return -1;
88 return (*cmd_io->getc)(cmd_io);
91 static inline int cmd_io_write(struct cmd_io *cmd_io,const void *buf,int count)
92 { if(!cmd_io->write) return -1;
93 return (*cmd_io->write)(cmd_io,buf,count);
96 static inline int cmd_io_read(struct cmd_io *cmd_io,void *buf,int count)
97 { if(!cmd_io->read) return -1;
98 return (*cmd_io->read)(cmd_io,buf,count);
101 int cmd_io_puts(cmd_io_t *cmd_io, const char *str);
103 int cmd_io_line_putc(cmd_io_t *cmd_io,int ch);
105 int cmd_io_write_bychar(cmd_io_t *cmd_io,const void *buf,int count);
107 int cmd_io_read_bychar(cmd_io_t *cmd_io,void *buf,int count);
109 /* command descriptions */
111 #define CDESM_OPCHR 0x10 /* Command uses operation character */
112 #define CDESM_RD 0x01 /* Value read is possible */
113 #define CDESM_WR 0x02 /* Value write is possible */
114 #define CDESM_RW (CDESM_RD|CDESM_WR) /* Both */
115 #define CDESM_SPACE_SEP 0x20 /* Whitespace separated params - replaces space with '\0' */
118 * Command descriptor.
120 * Command name may contain the following wildcards:
121 * - '?' stands for one alphanumeric character
122 * - '#' stands for one digit
123 * - '*' stands for any number of alphanumeric characters at the end of the command
125 * The fnc() function is passed the following information as the param array:
126 * - param[0] points to the command (the longest sequence of alphanumeric characters)
127 * If CDESM_OPCHR is specified in the command descriptor then
128 * - param[1] points to the first wildcard in the command or is NULL for commands without wildcard in the name
129 * - param[2] points to the operation character (':' or '?') and
130 * - param[3] points to the string after the operation character (after skipping whitespace)
131 * If CDESM_OPCHR is not specified then
132 * If the command name contains a wildcard,
133 * - param[1] points to the first wildcard in the command and
134 * If the command has any parameters
135 * - param[1] or param[2] (depending on the presence of a wildcard)
136 * points to the beginning of those parameters (after skipping
139 * If CDESM_SPACE_SEP is specified in the command descriptor, then
140 * the command arguments are split at whitespace by '\0'
141 * characters and stored in the next unused param elements. Param
142 * array can contain up to 9 elements.
144 * The param elements are always terminated by NULL element.
146 typedef struct cmd_des{
147 int code; /* Application specific code */
148 int mode; /* CDESM_* constants */
149 char *name; /* Name of the command with possible wildcards */
151 int (*fnc)(cmd_io_t *cmd_io, const struct cmd_des *des, char *param[]);
155 #define CMDERR_BADCMD 2
156 #define CMDERR_OPCHAR 10
157 #define CMDERR_WRPERM 11
158 #define CMDERR_RDPERM 12
159 #define CMDERR_GARBAG 13
160 #define CMDERR_BADSEP 14
161 #define CMDERR_BADCFG 15
162 #define CMDERR_NOMEM 16
163 #define CMDERR_BADSUF 17
164 #define CMDERR_BADPAR 20
165 #define CMDERR_VALOOR 21
166 #define CMDERR_BADREG 40
167 #define CMDERR_BSYREG 41
168 #define CMDERR_BADDIO 50
169 #define CMDERR_NODEV 60
170 #define CMDERR_TIMEOUT 61
171 #define CMDERR_EIO 62
173 int cmd_opchar_check(cmd_io_t *cmd_io, const struct cmd_des *des, char *param[]);
175 int cmd_num_suffix(cmd_io_t *cmd_io, const struct cmd_des *des, char *param[], unsigned *val);
177 int proc_cmd_line(cmd_io_t *cmd_io, cmd_des_t const **des_arr, char *line);
179 int i2str(char *s,long val,int len,int form);
181 int cmd_do_stamp(cmd_io_t *cmd_io, const struct cmd_des *des, char *param[]);
183 int cmd_do_help(cmd_io_t *cmd_io, const struct cmd_des *des, char *param[]);
185 int cmd_do_rw_short(cmd_io_t *cmd_io, const struct cmd_des *des, char *param[]);
187 int cmd_do_rw_int(cmd_io_t *cmd_io, const struct cmd_des *des, char *param[]);
189 int cmd_do_rw_long(cmd_io_t *cmd_io, const struct cmd_des *des, char *param[]);
191 int cmd_do_rw_bitflag(cmd_io_t *cmd_io, const struct cmd_des *des, char *param[]);
193 int cmd_opchar_replong(cmd_io_t *cmd_io, char *param[], long val,int len,int form);
195 int cmd_processor_run(cmd_io_t *cmd_io, cmd_des_t const **commands);
197 #endif /* _CMD_PROC_H_ */
199 /* Local Variables: */
200 /* c-basic-offset: 2 */