Statistics
| Branch: | Tag: | Revision:

amiro-os / os / core / src / aos_main.cpp @ 6b53f6bf

History | View | Annotate | Download (13.405 KB)

1
/*
2
AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
3
Copyright (C) 2016..2018  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
#include <amiroos.h>
20
#include <module.h>
21

    
22
/*
23
 * hook to add further includes
24
 */
25
#if defined(AMIROOS_CFG_MAIN_EXTRA_INCLUDE_HEADER)
26
#include AMIROOS_CFG_MAIN_EXTRA_INCLUDE_HEADER
27
#endif
28

    
29
/**
30
 * @brief   Event mask to identify I/O events.
31
 */
32
#define IOEVENT_MASK                            EVENT_MASK(0)
33

    
34
/**
35
 * @brief   Event mask to identify OS events.
36
 */
37
#define OSEVENT_MASK                            EVENT_MASK(1)
38

    
39
/**
40
 * @brief   Listener object for I/O events.
41
 */
42
static event_listener_t _eventListenerIO;
43

    
44
/**
45
 * @brief   Listener object for OS events.
46
 */
47
static event_listener_t _eventListenerOS;
48

    
49
#if defined(MODULE_HAL_PROGIF) || defined(__DOXYGEN__)
50
/**
51
 * @brief   I/O channel for the programmer interface.
52
 */
53
static AosIOChannel _stdiochannel;
54

    
55
#if (AMIROOS_CFG_SHELL_ENABLE == true) || defined(__DOXYGEN__)
56
/**
57
 * @brief   I/O shell channel for the programmer interface.
58
 */
59
static AosShellChannel _stdshellchannel;
60
#endif
61
#endif
62

    
63
/*
64
 * hook to add further static variables
65
 */
66
#if defined(AMIROOS_CFG_MAIN_EXTRA_STATIC_VARIABLES)
67
AMIROOS_CFG_MAIN_EXTRA_STATIC_VARIABLES
68
#endif
69

    
70
/**
71
 * @brief   Prints an error message about an unexpected event.
72
 *
73
 * @param[in] mask    The event mask.
74
 * @param[in] flags   The event flags.
75
 */
76
static inline void _unexpectedEventError(eventmask_t mask, eventflags_t flags)
77
{
78
#if (AMIROOS_CFG_DBG == true)
79
  aosprintf("unexpected/unknown event received. mask: 0x%08X; flags: 0x%08X\n", mask, flags);
80
#else
81
  (void)mask;
82
  (void)flags;
83
#endif
84
  return;
85
}
86

    
87
/**
88
 * @brief   Application entry point.
89
 */
90
int main(void)
91
{
92
  // local variables
93
  eventmask_t eventmask = 0;
94
  eventflags_t eventflags = 0;
95
  aos_shutdown_t shutdown = AOS_SHUTDOWN_NONE;
96
#if defined(AMIROOS_CFG_MAIN_EXTRA_THREAD_VARIABLES)
97
  AMIROOS_CFG_MAIN_EXTRA_THREAD_VARIABLES
98
#endif
99

    
100
  /*
101
   * ##########################################################################
102
   * # system initialization                                                  #
103
   * ##########################################################################
104
   */
105

    
106
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_0)
107
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_0_ARGS)
108
  AMIROOS_CFG_MAIN_INIT_HOOK_0(AMIROOS_CFG_MAIN_INIT_HOOK_0_ARGS);
109
#else
110
  AMIROOS_CFG_MAIN_INIT_HOOK_0();
111
#endif
112
#endif
113

    
114
  /* hardware, kernel, and operating system initialization */
115
  // ChibiOS/HAL and custom hal additions (if any)
116
  halInit();
117
#ifdef MODULE_INIT_HAL_EXTRA
118
  MODULE_INIT_HAL_EXTRA();
119
#endif
120

    
121
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_1)
122
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_1_ARGS)
123
  AMIROOS_CFG_MAIN_INIT_HOOK_1(AMIROOS_CFG_MAIN_INIT_HOOK_1_ARGS);
124
#else
125
  AMIROOS_CFG_MAIN_INIT_HOOK_1();
126
#endif
127
#endif
128

    
129
  // ChibiOS/RT kernel and custom kernel additions (if any)
130
  chSysInit();
131
#ifdef MODULE_INIT_KERNEL_EXTRA
132
  MODULE_INIT_KERNEL_EXTRA();
133
#endif
134

    
135
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_2)
136
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_2_ARGS)
137
  AMIROOS_CFG_MAIN_INIT_HOOK_2(AMIROOS_CFG_MAIN_INIT_HOOK_2_ARGS);
138
#else
139
  AMIROOS_CFG_MAIN_INIT_HOOK_2();
140
#endif
141
#endif
142

    
143
  // AMiRo-OS and custom OS additions (if any)
144
#if (AMIROOS_CFG_SHELL_ENABLE == true)
145
  aosSysInit(moduleShellPrompt);
146
#else
147
  aosSysInit();
148
#endif
149
#ifdef MODULE_INIT_OS_EXTRA
150
  MODULE_INIT_OS_EXTRA();
151
#endif
152

    
153
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_3)
154
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_3_ARGS)
155
  AMIROOS_CFG_MAIN_INIT_HOOK_3(AMIROOS_CFG_MAIN_INIT_HOOK_3_ARGS);
156
#else
157
  AMIROOS_CFG_MAIN_INIT_HOOK_3();
158
#endif
159
#endif
160

    
161
#if (AMIROOS_CFG_TESTS_ENABLE == true)
162
#if defined(MODULE_INIT_TESTS)
163
  MODULE_INIT_TESTS();
164
#else
165
  #warning "MODULE_INIT_TESTS not defined"
166
#endif
167
#endif
168

    
169
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_4)
170
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_4_ARGS)
171
  AMIROOS_CFG_MAIN_INIT_HOOK_4(AMIROOS_CFG_MAIN_INIT_HOOK_4_ARGS);
172
#else
173
  AMIROOS_CFG_MAIN_INIT_HOOK_4();
174
#endif
175
#endif
176

    
177
  /* event associations */
178
  chEvtRegisterMask(&aos.events.io, &_eventListenerIO, IOEVENT_MASK);
179
  chEvtRegisterMask(&aos.events.os, &_eventListenerOS, OSEVENT_MASK);
180

    
181
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_5)
182
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_5_ARGS)
183
  AMIROOS_CFG_MAIN_INIT_HOOK_5(AMIROOS_CFG_MAIN_INIT_HOOK_5_ARGS);
184
#else
185
  AMIROOS_CFG_MAIN_INIT_HOOK_5();
186
#endif
187
#endif
188

    
189
  /* periphery communication initialization */
190
  // CAN (mandatory)
191
  canStart(&MODULE_HAL_CAN, &moduleHalCanConfig);
192
  // module specific initialization (if any)
193
#ifdef MODULE_INIT_PERIPHERY_COMM
194
  MODULE_INIT_PERIPHERY_COMM();
195
#endif
196
  // user interface (if any)
197
#ifdef MODULE_HAL_PROGIF
198
  aosIOChannelInit(&_stdiochannel, (BaseAsynchronousChannel*)&MODULE_HAL_PROGIF);
199
  aosIOChannelOutputEnable(&_stdiochannel);
200
  aosIOStreamAddChannel(&aos.iostream, &_stdiochannel);
201
#if (AMIROOS_CFG_SHELL_ENABLE == true)
202
  aosShellChannelInit(&_stdshellchannel, (BaseAsynchronousChannel*)&MODULE_HAL_PROGIF);
203
  aosShellChannelInputEnable(&_stdshellchannel);
204
  aosShellChannelOutputEnable(&_stdshellchannel);
205
  aosShellStreamAddChannel(&aos.shell.stream, &_stdshellchannel);
206
#endif
207
#endif
208

    
209
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_6)
210
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_6_ARGS)
211
  AMIROOS_CFG_MAIN_INIT_HOOK_6(AMIROOS_CFG_MAIN_INIT_HOOK_6_ARGS);
212
#else
213
  AMIROOS_CFG_MAIN_INIT_HOOK_6();
214
#endif
215
#endif
216

    
217
  /* module is ready -> print welcome prompt */
218
  aosprintf("\n");
219
  aosprintf("######################################################################\n");
220
  aosprintf("# AMiRo-OS is an operating system designed for the Autonomous Mini   #\n");
221
  aosprintf("# Robot (AMiRo) platform.                                            #\n");
222
  aosprintf("# Copyright (C) 2016..2018  Thomas Schöpping et al.                  #\n");
223
  aosprintf("#                                                                    #\n");
224
  aosprintf("# This is free software; see the source for copying conditions.      #\n");
225
  aosprintf("# There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR  #\n");
226
  aosprintf("# A PARTICULAR PURPOSE.                                              #\n");
227
  aosprintf("# The development of this software was supported by the Excellence   #\n");
228
  aosprintf("# Cluster EXC 227 Cognitive Interaction Technology. The Excellence   #\n");
229
  aosprintf("# Cluster EXC 227 is a grant of the Deutsche Forschungsgemeinschaft  #\n");
230
  aosprintf("# (DFG) in the context of the German Excellence Initiative.          #\n");
231
  aosprintf("######################################################################\n");
232
  aosprintf("\n");
233

    
234
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_7)
235
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_7_ARGS)
236
  AMIROOS_CFG_MAIN_INIT_HOOK_7(AMIROOS_CFG_MAIN_INIT_HOOK_7_ARGS);
237
#else
238
  AMIROOS_CFG_MAIN_INIT_HOOK_7();
239
#endif
240
#endif
241

    
242
  /* SSSP startup OS synchronization phase (end of startup stage 2) */
243
  while ((eventmask = aosSysSsspStartupOsInitSyncCheck(&_eventListenerIO)) != 0) {
244
    /*
245
     * This code is executed if the received event was not about the SYS_SYNC control signal.
246
     * The returned event could be caused by any listener (not only the argument).
247
     */
248
    // unexpected IO events
249
    if (eventmask & _eventListenerIO.events) {
250
      eventflags = chEvtGetAndClearFlags(&_eventListenerIO);
251
#ifdef MODULE_SSSP_STARTUP_OSINIT_OUTRO_IOEVENT_HOOK
252
      MODULE_SSSP_STARTUP_OSINIT_OUTRO_IOEVENT_HOOK(eventmask, eventflags);
253
#else
254
      _unexpectedEventError(eventmask, eventflags);
255
#endif
256
    }
257
    // unexpected OS event
258
    else if (eventmask & _eventListenerOS.events) {
259
      eventflags = chEvtGetAndClearFlags(&_eventListenerOS);
260
      _unexpectedEventError(eventmask, eventflags);
261
    }
262
    // unknown event (must never occur, thus disabled for release builds)
263
    else {
264
      _unexpectedEventError(eventmask, eventflags);
265
    }
266
  }
267

    
268
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_8)
269
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_8_ARGS)
270
  AMIROOS_CFG_MAIN_INIT_HOOK_8(AMIROOS_CFG_MAIN_INIT_HOOK_8_ARGS);
271
#else
272
  AMIROOS_CFG_MAIN_INIT_HOOK_8();
273
#endif
274
#endif
275

    
276
  /* completely start AMiRo-OS */
277
  aosSysStart();
278

    
279
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_9)
280
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_9_ARGS)
281
  AMIROOS_CFG_MAIN_INIT_HOOK_9(AMIROOS_CFG_MAIN_INIT_HOOK_9_ARGS);
282
#else
283
  AMIROOS_CFG_MAIN_INIT_HOOK_9();
284
#endif
285
#endif
286

    
287
  /*
288
   * ##########################################################################
289
   * # infinite loop                                                          #
290
   * ##########################################################################
291
   */
292

    
293
  // sleep until a shutdown event is received
294
  while (shutdown == AOS_SHUTDOWN_NONE) {
295
    // wait for an event
296
#if (AMIROOS_CFG_MAIN_LOOP_TIMEOUT != 0)
297
    eventmask = chEvtWaitOneTimeout(ALL_EVENTS, US2ST_LLD(AMIROOS_CFG_MAIN_LOOP_TIMEOUT));
298
#else
299
    eventmask = chEvtWaitOne(ALL_EVENTS);
300
#endif
301

    
302
#if defined(AMIROOS_CFG_MAIN_LOOP_HOOK_0)
303
#if defined(AMIROOS_CFG_MAIN_LOOP_HOOK_0_ARGS)
304
    AMIROOS_CFG_MAIN_LOOP_HOOK_0(AMIROOS_CFG_MAIN_LOOP_HOOK_0_ARGS);
305
#else
306
    AMIROOS_CFG_MAIN_LOOP_HOOK_0();
307
#endif
308
#endif
309

    
310
    switch (eventmask) {
311
      // if this was an I/O event
312
      case IOEVENT_MASK:
313
        // evaluate flags
314
        eventflags = chEvtGetAndClearFlags(&_eventListenerIO);
315
        // PD event
316
        if (eventflags & MODULE_SSSP_EVENTFLAGS_PD) {
317
          shutdown = AOS_SHUTDOWN_PASSIVE;
318
        }
319
        // all other events
320
#ifdef MODULE_MAIN_LOOP_IO_EVENT
321
        else {
322
          MODULE_MAIN_LOOP_IO_EVENT(eventmask, eventflags);
323
        }
324
#endif
325
        break;
326

    
327
      // if this was an OS event
328
      case OSEVENT_MASK:
329
        // evaluate flags
330
        eventflags = chEvtGetAndClearFlags(&_eventListenerOS);
331
        switch (eventflags) {
332
          case AOS_SYSTEM_EVENTFLAGS_HIBERNATE:
333
            shutdown = AOS_SHUTDOWN_HIBERNATE;
334
            break;
335
          case AOS_SYSTEM_EVENTFLAGS_DEEPSLEEP:
336
            shutdown = AOS_SHUTDOWN_DEEPSLEEP;
337
            break;
338
          case AOS_SYSTEM_EVENTFLAGS_TRANSPORTATION:
339
            shutdown = AOS_SHUTDOWN_TRANSPORTATION;
340
            break;
341
          case AOS_SYSTEM_EVENTFLAGS_RESTART:
342
            shutdown = AOS_SHUTDOWN_RESTART;
343
            break;
344
          default:
345
            _unexpectedEventError(eventmask, eventflags);
346
            break;
347
        }
348
        break;
349

    
350
      // if this was any other event (should be impossible to occur)
351
      default:
352
        eventflags = 0;
353
        _unexpectedEventError(eventmask, eventflags);
354
        break;
355
    }
356

    
357
#if defined(AMIROOS_CFG_MAIN_LOOP_HOOK_1)
358
#if defined(AMIROOS_CFG_MAIN_LOOP_HOOK_1_ARGS)
359
    AMIROOS_CFG_MAIN_LOOP_HOOK_1(AMIROOS_CFG_MAIN_LOOP_HOOK_1_ARGS);
360
#else
361
    AMIROOS_CFG_MAIN_LOOP_HOOK_1();
362
#endif
363
#endif
364
  }
365

    
366
  /*
367
   * ##########################################################################
368
   * # system shutdown                                                        #
369
   * ##########################################################################
370
   */
371

    
372
#if defined(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_0)
373
#if defined(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_0_ARGS)
374
    AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_0(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_0_ARGS);
375
#else
376
    AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_0();
377
#endif
378
#endif
379

    
380
  // initialize/acknowledge shutdown
381
  aosSysShutdownInit(shutdown);
382

    
383
#if defined(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_1)
384
#if defined(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_1_ARGS)
385
    AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_1(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_1_ARGS);
386
#else
387
    AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_1();
388
#endif
389
#endif
390

    
391
  // stop system threads
392
  aosSysStop();
393

    
394
#if defined(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_2)
395
#if defined(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_2_ARGS)
396
    AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_2(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_2_ARGS);
397
#else
398
    AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_2();
399
#endif
400
#endif
401

    
402
  // deinitialize system
403
  aosSysDeinit();
404

    
405
#if defined(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_3)
406
#if defined(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_3_ARGS)
407
    AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_3(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_3_ARGS);
408
#else
409
    AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_3();
410
#endif
411
#endif
412

    
413
  /* stop all periphery communication */
414
  // CAN (mandatory)
415
  canStop(&MODULE_HAL_CAN);
416
#ifdef MODULE_SHUTDOWN_PERIPHERY_COMM
417
  MODULE_SHUTDOWN_PERIPHERY_COMM();
418
#endif
419

    
420
#if defined(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_4)
421
#if defined(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_4_ARGS)
422
    AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_4(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_4_ARGS);
423
#else
424
    AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_4();
425
#endif
426
#endif
427

    
428
  // finally hand over to bootloader
429
  aosSysShutdownFinal(&MODULE_HAL_EXT, shutdown);
430

    
431
  /*
432
   * ##########################################################################
433
   * # after shutdown/restart                                                 #
434
   * ##########################################################################
435
   *
436
   * NOTE: This code will not be executed, since the bootloader callbacks will stop/restart the MCU.
437
   *       It is included nevertheless for the sake of completeness and to explicitely indicate,
438
   *       which subsystems should NOT be shut down.
439
   */
440

    
441
  // return an error, since this code should not be executed
442
  return -1;
443
}