Statistics
| Branch: | Tag: | Revision:

amiro-os / core / inc / aos_shell.h @ 7368d8da

History | View | Annotate | Download (10.933 KB)

1
/*
2
AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
3
Copyright (C) 2016..2020  Thomas Schöpping et al.
4

5
This program is free software: you can redistribute it and/or modify
6
it under the terms of the GNU General Public License as published by
7
the Free Software Foundation, either version 3 of the License, or
8
(at your option) any later version.
9

10
This program is distributed in the hope that it will be useful,
11
but WITHOUT ANY WARRANTY; without even the implied warranty of
12
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
GNU General Public License for more details.
14

15
You should have received a copy of the GNU General Public License
16
along with this program.  If not, see <http://www.gnu.org/licenses/>.
17
*/
18

    
19
/**
20
 * @file    aos_shell.h
21
 * @brief   Shell macros and structures.
22
 *
23
 * @addtogroup aos_shell
24
 * @{
25
 */
26

    
27
#ifndef AMIROOS_SHELL_H
28
#define AMIROOS_SHELL_H
29

    
30
#include <amiroos.h>
31

    
32
#if (AMIROOS_CFG_SHELL_ENABLE == true) || defined(__DOXYGEN__)
33

    
34
/******************************************************************************/
35
/* CONSTANTS                                                                  */
36
/******************************************************************************/
37

    
38
/**
39
 * @brief   Size of the escape sequence buffer.
40
 */
41
#if !defined(AOS_SHELL_ESCSEQUENCE_LENGTH) || defined(__DOXYGEN__)
42
#define AOS_SHELL_ESCSEQUENCE_LENGTH              8
43
#endif
44

    
45
/**
46
 * @brief   Shell event flag that is emitted when the thread starts.
47
 */
48
#define AOS_SHELL_EVTFLAG_START                   ((eventflags_t)(1 << 0))
49

    
50
/**
51
 * @brief   Shell event flag that is emitted when a command is executed.
52
 */
53
#define AOS_SHELL_EVTFLAG_EXECUTE                 ((eventflags_t)(1 << 1))
54

    
55
/**
56
 * @brief   Shell event flag that is emitted when a command execution finished.
57
 */
58
#define AOS_SHELL_EVTFLAG_DONE                    ((eventflags_t)(1 << 2))
59

    
60
/**
61
 * @brief   Shell event flag that is emitted when the shread stops.
62
 */
63
#define AOS_SHELL_EVTFLAG_EXIT                    ((eventflags_t)(1 << 3))
64

    
65
/**
66
 * @brief   Shell event flag that is emitted when an I/O error occurred.
67
 */
68
#define AOS_SHELL_EVTFLAG_IOERROR                 ((eventflags_t)(1 << 4))
69

    
70
/**
71
 * @brief   Shell input configuration for replacing content by user input.
72
 */
73
#define AOS_SHELL_CONFIG_INPUT_OVERWRITE          (1 << 0)
74

    
75
/**
76
 * @brief   Shell prompt configuration print a minimalistic prompt.
77
 */
78
#define AOS_SHELL_CONFIG_PROMPT_MINIMAL           (1 << 1)
79

    
80
/**
81
 * @brief   Shell prompt configuration to additionally print the system uptime with the prompt.
82
 */
83
#define AOS_SHELL_CONFIG_PROMPT_UPTIME            (1 << 2)
84

    
85
/**
86
 * @brief   Shell prompt configuration to additionally print the date and time with the prompt.
87
 */
88
#define AOS_SHELL_CONFIG_PROMPT_DATETIME          (2 << 2)
89

    
90
/**
91
 * @brief   Shell prompt configuration to additionally print the system uptime with the prompt.
92
 */
93
#define AOS_SHELL_CONFIG_MATCH_CASE               (1 << 4)
94

    
95
/**
96
 * @brief   Shell I/O channel flag whether the channel is attached to a list.
97
 */
98
#define AOS_SHELLCHANNEL_ATTACHED                 (1 << 0)
99

    
100
/**
101
 * @brief   Shell I/O channel flag whether the channel is enabled as input.
102
 */
103
#define AOS_SHELLCHANNEL_INPUT_ENABLED            (1 << 1)
104

    
105
/**
106
 * @brief   Shell I/O channel flag whether the channel is enabled as output.
107
 */
108
#define AOS_SHELLCHANNEL_OUTPUT_ENABLED           (1 << 2)
109

    
110
/******************************************************************************/
111
/* SETTINGS                                                                   */
112
/******************************************************************************/
113

    
114
/******************************************************************************/
115
/* CHECKS                                                                     */
116
/******************************************************************************/
117

    
118
/******************************************************************************/
119
/* DATA STRUCTURES AND TYPES                                                  */
120
/******************************************************************************/
121

    
122
/**
123
 * @brief   AosShellChannel specific methods.
124
 */
125
#define _aos_shell_channel_methods                                          \
126
  _base_asynchronous_channel_methods
127

    
128
/**
129
 * @brief   AosShellChannel specific data.
130
 */
131
#define _aos_shell_channel_data                                             \
132
  /* pointer to a BaseAsynchronousChannel object */                         \
133
  BaseAsynchronousChannel* asyncchannel;                                    \
134
  /* event listener for the associated BaseAsynchronousChannel */           \
135
  event_listener_t listener;                                                \
136
  /* pointer to the next chennal in a AosShellStream */                     \
137
  struct aos_shellchannel* next;                                            \
138
  /* flags related to the channel */                                        \
139
  uint8_t flags;
140

    
141
/**
142
 * @extends BaseAsynchronousChannelVMT
143
 *
144
 * @brief   AosShellChannel virtual methods table.
145
 */
146
struct AosShellChannelVMT {
147
  _aos_shell_channel_methods
148
};
149

    
150
/**
151
 * @extends BaseAsynchronousChannel
152
 *
153
 * @brief   Shell channel class.
154
 * @details This class implements an asynchronous I/O channel.
155
 */
156
typedef struct aos_shellchannel {
157
  /** @brief Virtual Methods Table. */
158
  const struct AosShellChannelVMT* vmt;
159
  _aos_shell_channel_data
160
} AosShellChannel;
161

    
162
/**
163
 * @brief   AosShellStream methods.
164
 */
165
#define _aos_shellstream_methods                                            \
166
  _base_sequential_stream_methods
167

    
168
/**
169
 * @brief   AosShellStream data.
170
 */
171
#define _aos_shellstream_data                                               \
172
  /* Pointer to the first channel in a list. */                             \
173
  AosShellChannel* channel;
174

    
175
/**
176
 * @extends BaseSequentialStream
177
 *
178
 * @brief   AosShellStream virtual methods table.
179
 */
180
struct AosShellStreamVMT {
181
  _aos_shellstream_methods
182
};
183

    
184
/**
185
 * @extends BaseSequentialStream
186
 *
187
 * @brief   Shell Stream class.
188
 * @details This class implements an base sequential stream.
189
 * @todo    So far only output but no input is supported.
190
 */
191
typedef struct aos_shellstream {
192
  const struct AosShellStreamVMT* vmt;
193
  _aos_shellstream_data
194
} AosShellStream;
195

    
196
/**
197
 * @brief   Shell command calback type.
198
 *
199
 * @param[in] stream  Stream to print to.
200
 * @param[in] argc    Number of arguments.
201
 * @param[in] argv    List of arguments.
202
 */
203
typedef int (*aos_shellcmdcb_t)(BaseSequentialStream* stream, int argc, char* argv[]);
204

    
205
/**
206
 * @brief   Shell command structure.
207
 */
208
typedef struct aos_shellcommand {
209
  /**
210
   * @brief   Command name.
211
   */
212
  const char* name;
213

    
214
  /**
215
   * @brief   Callback function.
216
   */
217
  aos_shellcmdcb_t callback;
218

    
219
  /**
220
   * @brief   Pointer to next command in a singly linked list.
221
   */
222
  struct aos_shellcommand* next;
223

    
224
} aos_shellcommand_t;
225

    
226
/**
227
 * @brief   Execution status of a shell command.
228
 */
229
typedef struct aos_shellexecstatus {
230
  /**
231
   * @brief   Pointer to the command that was executed.
232
   */
233
  aos_shellcommand_t* command;
234

    
235
  /**
236
   * @brief   Return value of the executed command.
237
   */
238
  int retval;
239
} aos_shellexecstatus_t;
240

    
241
/**
242
 * @brief   Shell structure.
243
 */
244
typedef struct aos_shell {
245
  /**
246
   * @brief   Pointer to the thread object.
247
   */
248
  thread_t* thread;
249

    
250
  /**
251
   * @brief   Event source.
252
   */
253
  event_source_t eventSource;
254

    
255
  /**
256
   * @brief   Listener for OS related events.
257
   */
258
  event_listener_t osEventListener;
259

    
260
  /**
261
     * @brief   Pointer to the first I/O channel.
262
     */
263
  AosShellStream stream;
264

    
265
  /**
266
   * @brief   String to printed as prompt.
267
   */
268
  const char* prompt;
269

    
270
  /**
271
   * @brief   Pointer to the first element of the singly linked list of commands.
272
   * @details Commands are ordered alphabetically in the list.
273
   */
274
  aos_shellcommand_t* commands;
275

    
276
  /**
277
   * @brief   Execution status of the most recent command.
278
   */
279
  aos_shellexecstatus_t execstatus;
280

    
281
  /**
282
   * @brief   Structure containing all input data.
283
   */
284
  struct {
285
    /**
286
     * @brief   Input buffer.
287
     * @details This buffer is interpreted as two dimensional array.
288
     *          It contains @p nentries elements of @p linewidth size each.
289
     */
290
    char* buffer;
291

    
292
    /**
293
     * @brief   Number of entries in the buffer.
294
     * @note    Must be >0.
295
     */
296
    size_t nentries;
297

    
298
    /**
299
     * @brief   Width of each input line.
300
     * @brief   Must be >0.
301
     */
302
    size_t linewidth;
303

    
304
    /**
305
     * @brief   Size of the argument buffer.
306
     * @note    Must be >0.
307
     */
308
    size_t nargs;
309
  } input;
310

    
311
  /**
312
   * @brief   Configuration flags.
313
   */
314
  uint8_t config;
315
} aos_shell_t;
316

    
317
/******************************************************************************/
318
/* MACROS                                                                     */
319
/******************************************************************************/
320

    
321
/**
322
 * @brief   Initializes a shell command object.
323
 *
324
 * @param[in] var       Name of the object variable to be initialized.
325
 * @param[in] name      Shell command name.
326
 * @param[in] callback  Pointer to the callback function.
327
 */
328
#define AOS_SHELL_COMMAND(var, name, callback) aos_shellcommand_t var = {     \
329
  /* name     */ name,                                                        \
330
  /* callback */ callback,                                                    \
331
  /* next     */ NULL,                                                        \
332
}
333

    
334
/******************************************************************************/
335
/* EXTERN DECLARATIONS                                                        */
336
/******************************************************************************/
337

    
338
#if defined(__cplusplus)
339
extern "C" {
340
#endif /* defined(__cplusplus) */
341
  void aosShellInit(aos_shell_t* shell, const char* prompt, char inbuf[], size_t entries, size_t linewidth, size_t numargs);
342
  void aosShellStreamInit(AosShellStream* stream);
343
  void aosShellChannelInit(AosShellChannel* channel, BaseAsynchronousChannel* asyncchannel);
344
  aos_status_t aosShellAddCommand(aos_shell_t* shell, aos_shellcommand_t* cmd);
345
  aos_status_t aosShellRemoveCommand(aos_shell_t* shell, char* cmd, aos_shellcommand_t** removed);
346
  unsigned int aosShellCountCommands(aos_shell_t* shell);
347
  void aosShellStreamAddChannel(AosShellStream* stream, AosShellChannel* channel);
348
  aos_status_t aosShellStreamRemoveChannel(AosShellStream* stream, AosShellChannel* channel);
349
  void aosShellChannelInputEnable(AosShellChannel* channel);
350
  void aosShellChannelInputDisable( AosShellChannel* channel);
351
  void aosShellChannelOutputEnable(AosShellChannel* channel);
352
  void aosShellChannelOutputDisable(AosShellChannel* channel);
353
  THD_FUNCTION(aosShellThread, shell);
354
#if defined(__cplusplus)
355
}
356
#endif /* defined(__cplusplus) */
357

    
358
/******************************************************************************/
359
/* INLINE FUNCTIONS                                                           */
360
/******************************************************************************/
361

    
362
#endif /* (AMIROOS_CFG_SHELL_ENABLE == true) */
363

    
364
#endif /* AMIROOS_SHELL_H */
365

    
366
/** @} */