Statistics
| Branch: | Tag: | Revision:

amiro-os / core / src / aos_main.cpp @ c218345a

History | View | Annotate | Download (35.213 KB)

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

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 53710ca3 Marc Rothmann
/**
20
 * @file    aos_main.cpp
21
 * @brief   Main function.
22
 *
23
 * @addtogroup aos_system
24
 * @{
25
 */
26
27 3940ba8a Thomas Schöpping
#include <amiroos.h>
28 e545e620 Thomas Schöpping
29 b6b45e4c Thomas Schöpping
/*
30
 * hook to add further includes
31
 */
32 512abac1 Thomas Schöpping
#if defined(AMIROOS_CFG_MAIN_EXTRA_INCLUDE_HEADER)
33
#include AMIROOS_CFG_MAIN_EXTRA_INCLUDE_HEADER
34 7de0cc90 Thomas Schöpping
#endif /* defined(AMIROOS_CFG_MAIN_EXTRA_INCLUDE_HEADER) */
35 b6b45e4c Thomas Schöpping
36 f3ac1c96 Thomas Schöpping
/******************************************************************************/
37
/* LOCAL DEFINITIONS                                                          */
38
/******************************************************************************/
39
40 e545e620 Thomas Schöpping
/**
41 cda14729 Thomas Schöpping
 * @brief   Event mask to identify GPIO events.
42 e545e620 Thomas Schöpping
 */
43 cda14729 Thomas Schöpping
#define EVENTMASK_GPIO                          EVENT_MASK(0)
44 e545e620 Thomas Schöpping
45
/**
46
 * @brief   Event mask to identify OS events.
47
 */
48 cda14729 Thomas Schöpping
#define EVENTMASK_OS                            EVENT_MASK(1)
49 e545e620 Thomas Schöpping
50 cda14729 Thomas Schöpping
#if (AMIROOS_CFG_SSSP_ENABLE == true) || defined(__DOXYGEN__)
51 933df08e Thomas Schöpping
52
/**
53 cda14729 Thomas Schöpping
 * @brief   Event mask to identify SSSP timer events.
54 933df08e Thomas Schöpping
 */
55 cda14729 Thomas Schöpping
#define EVENTMASK_SSSPTIMER                     EVENT_MASK(2)
56 933df08e Thomas Schöpping
57 7de0cc90 Thomas Schöpping
#endif /* (AMIROOS_CFG_SSSP_ENABLE == true) */
58 9ebb11a9 Thomas Schöpping
59 f3ac1c96 Thomas Schöpping
/******************************************************************************/
60
/* EXPORTED VARIABLES                                                         */
61
/******************************************************************************/
62
63
/******************************************************************************/
64
/* LOCAL TYPES                                                                */
65
/******************************************************************************/
66
67
/******************************************************************************/
68
/* LOCAL VARIABLES                                                            */
69
/******************************************************************************/
70
71 9461fadc Thomas Schöpping
/**
72 cda14729 Thomas Schöpping
 * @brief   Listener object for GPIO events.
73 e545e620 Thomas Schöpping
 */
74 cda14729 Thomas Schöpping
static event_listener_t _eventListenerGPIO;
75 e545e620 Thomas Schöpping
76
/**
77
 * @brief   Listener object for OS events.
78
 */
79
static event_listener_t _eventListenerOS;
80
81
#if defined(MODULE_HAL_PROGIF) || defined(__DOXYGEN__)
82 cda14729 Thomas Schöpping
83 e545e620 Thomas Schöpping
/**
84 ba516b61 Thomas Schöpping
 * @brief   I/O channel for the programmer interface.
85 e545e620 Thomas Schöpping
 */
86 ba516b61 Thomas Schöpping
static AosIOChannel _stdiochannel;
87
88 afcf6d89 Thomas Schöpping
#endif /* defined(MODULE_HAL_PROGIF) */
89 cda14729 Thomas Schöpping
90
#if (AMIROOS_CFG_SHELL_ENABLE == true) || defined(__DOXYGEN__)
91
92 ba516b61 Thomas Schöpping
/**
93
 * @brief   I/O shell channel for the programmer interface.
94
 */
95
static AosShellChannel _stdshellchannel;
96 cda14729 Thomas Schöpping
97 47e89ebf Thomas Schöpping
#endif /* (AMIROOS_CFG_SHELL_ENABLE == true) */
98 e545e620 Thomas Schöpping
99 b6b45e4c Thomas Schöpping
/*
100
 * hook to add further static variables
101
 */
102
#if defined(AMIROOS_CFG_MAIN_EXTRA_STATIC_VARIABLES)
103
AMIROOS_CFG_MAIN_EXTRA_STATIC_VARIABLES
104 7de0cc90 Thomas Schöpping
#endif /* defined(AMIROOS_CFG_MAIN_EXTRA_STATIC_VARIABLES) */
105 b6b45e4c Thomas Schöpping
106 f3ac1c96 Thomas Schöpping
/******************************************************************************/
107
/* LOCAL FUNCTIONS                                                            */
108
/******************************************************************************/
109
110 e545e620 Thomas Schöpping
/**
111
 * @brief   Prints an error message about an unexpected event.
112
 *
113
 * @param[in] mask    The event mask.
114
 * @param[in] flags   The event flags.
115
 */
116 933df08e Thomas Schöpping
static inline void _unexpectedEventError(const eventmask_t mask, const eventflags_t flags)
117 e545e620 Thomas Schöpping
{
118 6b53f6bf Thomas Schöpping
#if (AMIROOS_CFG_DBG == true)
119 1e5f7648 Thomas Schöpping
  aosprintf("CTRL: unexpected/unknown event received. mask: 0x%08X; flags: 0x%08X\n", mask, flags);
120 7de0cc90 Thomas Schöpping
#else /* (AMIROOS_CFG_DBG == true) */
121 933df08e Thomas Schöpping
  (void)(mask);
122
  (void)(flags);
123 7de0cc90 Thomas Schöpping
#endif /* (AMIROOS_CFG_DBG == true) */
124 3e1a9c79 Thomas Schöpping
  return;
125 933df08e Thomas Schöpping
}
126
127 e545e620 Thomas Schöpping
/**
128 9461fadc Thomas Schöpping
 * @brief   Helper function to serialize data.
129 933df08e Thomas Schöpping
 *
130
 * @param[out]  dst   Pointer to the output buffer.
131 9461fadc Thomas Schöpping
 * @param[in]   src   Data to be serialized.
132
 * @param[in]   n     Number of bytes to serialize.
133 933df08e Thomas Schöpping
 */
134 9461fadc Thomas Schöpping
inline void _serialize(uint8_t* dst, const uint64_t src, const uint8_t n)
135 933df08e Thomas Schöpping
{
136
  aosDbgCheck(dst != NULL);
137 9461fadc Thomas Schöpping
  aosDbgCheck(n > 0 && n <= 8);
138 933df08e Thomas Schöpping
139 9461fadc Thomas Schöpping
  for (uint8_t byte = 0; byte < n; ++byte) {
140 933df08e Thomas Schöpping
    dst[byte] = (uint8_t)((src >> (byte * 8)) & 0xFF);
141
  }
142
143
  return;
144
}
145
146
/**
147 9461fadc Thomas Schöpping
 * @brief   Helper function to deserialize data.
148 933df08e Thomas Schöpping
 *
149
 * @param[in] src   Pointer to the buffer of data to be deserialzed.
150 9461fadc Thomas Schöpping
 * @param[in] n     Number of bytes to deserialize.
151 933df08e Thomas Schöpping
 *
152
 * @return    The deserialized 32 bit data.
153
 */
154 9461fadc Thomas Schöpping
inline uint64_t _deserialize(uint8_t* src, const uint8_t n)
155 933df08e Thomas Schöpping
{
156
  aosDbgCheck(src != NULL);
157 9461fadc Thomas Schöpping
  aosDbgCheck(n > 0 && n <= 8);
158 933df08e Thomas Schöpping
159 9461fadc Thomas Schöpping
  uint64_t result = 0;
160
  for (uint8_t byte = 0; byte < n; ++byte) {
161
    result |= ((uint64_t)src[byte]) << (byte * 8);
162
  }
163
164
  return result;
165
}
166
167 23437e98 Thomas Schöpping
#if (HAL_USE_RTC == TRUE) || defined(__DOXYGEN__)
168
169 9461fadc Thomas Schöpping
/**
170
 * @brief   Converter function to encode a TM value to a single unsigned 64 bit integer.
171
 *
172
 * @details Contents of the TM struct are mapped as follows:
173
 *            bits  |63     62|61      53|52    50|49         26|25     22|21     17|16     12|11      6|5       0|
174
 *            #bits |       2 |        9 |      3 |          24 |       4 |       5 |       5 |       6 |       6 |
175
 *            value |   isdst |     yday |   wday |        year |     mon |    mday |    hour |     min |     sec |
176
 *            range | special | [0, 365] | [0, 6] | [1900, ...] | [0, 11] | [1, 31] | [0, 23] | [0, 59] | [0, 61] |
177
 *          The Daylight Saving Time Flag (isdsst) is encoded as follows:
178
 *            DST not in effect         -> 0
179
 *            DST in effect             -> 1
180
 *            no information available  -> 2
181
 *
182
 * @param[in] src   Pointer to the TM struct to encode.
183
 *
184
 * @return  An unsigned 64 bit integer, which holds the encoded time value.
185
 */
186
inline uint64_t _TM2U64(struct tm* src)
187
{
188
  aosDbgCheck(src != NULL);
189
190
  return (((uint64_t)(src->tm_sec  & 0x0000003F) << (0))               |
191
          ((uint64_t)(src->tm_min  & 0x0000003F) << (6))               |
192
          ((uint64_t)(src->tm_hour & 0x0000001F) << (12))              |
193
          ((uint64_t)(src->tm_mday & 0x0000001F) << (17))              |
194
          ((uint64_t)(src->tm_mon  & 0x0000000F) << (22))              |
195
          ((uint64_t)(src->tm_year & 0x00FFFFFF) << (26))              |
196
          ((uint64_t)(src->tm_wday & 0x00000007) << (50))              |
197
          ((uint64_t)(src->tm_yday & 0x000001FF) << (53))              |
198
          ((uint64_t)((src->tm_isdst == 0) ? 0 : (src->tm_isdst > 0) ? 1 : 2) << (62)));
199
}
200
201
/**
202
 * @brief   Converter functiomn to retrieve the encoded TM value from an unsigned 64 bit integer.
203
 *
204
 * @details For information on the encoding, please refer to @p _TM2U64 function.
205
 *
206
 * @param[out] dst  The TM struct to fill with the decoded values.
207
 * @param[in]  src  Unsigned 64 bit integer holding the encoded TM value.
208
 */
209
inline void _U642TM(struct tm* dst, const uint64_t src)
210
{
211
  aosDbgCheck(dst != NULL);
212
213
  dst->tm_sec  = (src >> 0)  & 0x0000003F;
214
  dst->tm_min  = (src >> 6)  & 0x0000003F;
215
  dst->tm_hour = (src >> 12) & 0x0000001F;
216
  dst->tm_mday = (src >> 17) & 0x0000001F;
217
  dst->tm_mon  = (src >> 22) & 0x0000000F;
218
  dst->tm_year = (src >> 26) & 0x00FFFFFF;
219
  dst->tm_wday = (src >> 50) & 0x00000007;
220
  dst->tm_yday = (src >> 53) & 0x000001FF;
221
  dst->tm_isdst = (((src >> 62) & 0x03) == 0) ? 0 : (((src >> 62) & 0x03) > 0) ? 1 : -1;
222
223
  return;
224 933df08e Thomas Schöpping
}
225
226 7de0cc90 Thomas Schöpping
#endif /* (HAL_USE_RTC == TRUE) */
227 23437e98 Thomas Schöpping
228 933df08e Thomas Schöpping
/**
229 e545e620 Thomas Schöpping
 * @brief   Application entry point.
230
 */
231
int main(void)
232
{
233
  // local variables
234
  eventmask_t eventmask = 0;
235
  eventflags_t eventflags = 0;
236
  aos_shutdown_t shutdown = AOS_SHUTDOWN_NONE;
237 b6b45e4c Thomas Schöpping
#if defined(AMIROOS_CFG_MAIN_EXTRA_THREAD_VARIABLES)
238
  AMIROOS_CFG_MAIN_EXTRA_THREAD_VARIABLES
239 7de0cc90 Thomas Schöpping
#endif /* defined(AMIROOS_CFG_MAIN_EXTRA_THREAD_VARIABLES) */
240 e545e620 Thomas Schöpping
241
  /*
242
   * ##########################################################################
243
   * # system initialization                                                  #
244
   * ##########################################################################
245
   */
246
247
  /* hardware, kernel, and operating system initialization */
248
  // ChibiOS/HAL and custom hal additions (if any)
249
  halInit();
250 7de0cc90 Thomas Schöpping
#if defined(MODULE_INIT_HAL_EXTRA)
251 e545e620 Thomas Schöpping
  MODULE_INIT_HAL_EXTRA();
252 7de0cc90 Thomas Schöpping
#endif /* defined(MODULE_INIT_HAL_EXTRA) */
253 e545e620 Thomas Schöpping
254
  // ChibiOS/RT kernel and custom kernel additions (if any)
255
  chSysInit();
256 7de0cc90 Thomas Schöpping
#if defined(MODULE_INIT_KERNEL_EXTRA)
257 e545e620 Thomas Schöpping
  MODULE_INIT_KERNEL_EXTRA();
258 7de0cc90 Thomas Schöpping
#endif /* defined(MODULE_INIT_KERNEL_EXTRA) */
259 e545e620 Thomas Schöpping
260 3106e8cc Thomas Schöpping
  // AMiRo-OS, additional interrupts and custom OS additions (if any)
261 cda14729 Thomas Schöpping
#if (AMIROOS_CFG_SHELL_ENABLE == true)
262 6b53f6bf Thomas Schöpping
  aosSysInit(moduleShellPrompt);
263 cda14729 Thomas Schöpping
#else /* (AMIROOS_CFG_SHELL_ENABLE == true) */
264 47e89ebf Thomas Schöpping
  aosSysInit(NULL);
265 cda14729 Thomas Schöpping
#endif /* (AMIROOS_CFG_SHELL_ENABLE == true) */
266 3106e8cc Thomas Schöpping
#if defined(MODULE_INIT_INTERRUPTS)
267
  MODULE_INIT_INTERRUPTS();
268
#endif
269 7de0cc90 Thomas Schöpping
#if defined(MODULE_INIT_OS_EXTRA)
270 e545e620 Thomas Schöpping
  MODULE_INIT_OS_EXTRA();
271 7de0cc90 Thomas Schöpping
#endif /* defined(MODULE_INIT_OS_EXTRA) */
272 e545e620 Thomas Schöpping
273
  /* event associations */
274 9ebb11a9 Thomas Schöpping
#if (AMIROOS_CFG_SSSP_ENABLE == true)
275 cda14729 Thomas Schöpping
  {
276
    eventflags_t flagsmask = AMIROOS_CFG_MAIN_LOOP_GPIOEVENT_FLAGSMASK | MODULE_SSSP_EVENTFLAG_PD | MODULE_SSSP_EVENTFLAG_S;
277 c218345a Thomas Schöpping
#if (AMIROOS_CFG_SSSP_MSI == true)
278 2920c6b7 Thomas Schöpping
#if (AMIROOS_CFG_SSSP_STACK_START != true)
279 cda14729 Thomas Schöpping
    flagsmask |= MODULE_SSSP_EVENTFLAG_DN;
280 7de0cc90 Thomas Schöpping
#endif /* (AMIROOS_CFG_SSSP_STACK_START != true) */
281 2920c6b7 Thomas Schöpping
#if (AMIROOS_CFG_SSSP_STACK_END != true)
282 cda14729 Thomas Schöpping
    flagsmask |= MODULE_SSSP_EVENTFLAG_UP;
283 7de0cc90 Thomas Schöpping
#endif /* (AMIROOS_CFG_SSSP_STACK_END != true) */
284 c218345a Thomas Schöpping
#endif /* (AMIROOS_CFG_SSSP_MSI == true) */
285 cda14729 Thomas Schöpping
    chEvtRegisterMaskWithFlags(&aos.events.gpio, &_eventListenerGPIO, EVENTMASK_GPIO, flagsmask);
286
  }
287
#else /* (AMIROOS_CFG_SSSP_ENABLE == true) */
288
  if (AMIROOS_CFG_MAIN_LOOP_GPIOEVENT_FLAGSMASK) {
289
    chEvtRegisterMaskWithFlags(&aos.events.gpio, &_eventListenerGPIO, EVENTMASK_GPIO, AMIROOS_CFG_MAIN_LOOP_GPIOEVENT_FLAGSMASK);
290
  }
291 7de0cc90 Thomas Schöpping
#endif /* (AMIROOS_CFG_SSSP_ENABLE == true) */
292 cda14729 Thomas Schöpping
  chEvtRegisterMask(&aos.events.os, &_eventListenerOS, EVENTMASK_OS);
293
294
#if (AMIROOS_CFG_SSSP_ENABLE == true) && (AMIROOS_CFG_SSSP_STARTUP == true)
295
296
  /* perform SSSP basic initialization stage */
297
298
#if defined(MODULE_SSSP_BASICINIT_HOOK)
299
#if defined(MODULE_SSSP_BASICINIT_HOOK_ARGS)
300
  MODULE_SSSP_BASICINIT_HOOK(MODULE_SSSP_BASICINIT_HOOK_ARGS);
301
#else /* defined(MODULE_SSSP_BASICINIT_HOOK_ARGS) */
302
  MODULE_SSSP_BASICINIT_HOOK();
303
#endif /* defined(MODULE_SSSP_BASICINIT_HOOK_ARGS) */
304
#endif /* defined(MODULE_SSSP_BASICINIT_HOOK) */
305
306
  // proceed to startup stage 1.2
307
#if (AMIROOS_CFG_SSSP_MASTER == true)
308
  while ((shutdown == AOS_SHUTDOWN_NONE) && (aosSsspProceed(NULL, 0, EVENTMASK_SSSPTIMER, &eventmask) != AOS_SUCCESS)) {
309
    /*
310
     * This code is executed if the received event was not about the delay.
311
     * The received event could be casued by any listener.
312
     */
313
    // GPIO event
314
    if (eventmask & _eventListenerGPIO.events) {
315
      eventflags = chEvtGetAndClearFlags(&_eventListenerGPIO);
316
      // PD event
317
      if (eventflags & MODULE_SSSP_EVENTFLAG_PD) {
318
        shutdown = AOS_SHUTDOWN_PASSIVE;
319
      } else {
320
#if defined(MODULE_SSSP_STARTUP_1_1_GPIOEVENT_HOOK)
321
        MODULE_SSSP_STARTUP_1_1_GPIOEVENT_HOOK(eventmask, eventflags);
322
#else /* defined(MODULE_SSSP_STARTUP_1_1_GPIOEVENT_HOOK) */
323
        /* silently ignore any other GPIO events */
324
#endif /* defined(MODULE_SSSP_STARTUP_1_1_GPIOEVENT_HOOK) */
325
      }
326
    }
327
    // OS event
328
    else if (eventmask & _eventListenerOS.events) {
329
      eventflags = chEvtGetAndClearFlags(&_eventListenerOS);
330
      _unexpectedEventError(eventmask, eventflags);
331
    }
332
    // unknown event
333
    else {
334
      _unexpectedEventError(eventmask, 0);
335
    }
336 2920c6b7 Thomas Schöpping
  }
337 cda14729 Thomas Schöpping
  if (shutdown == AOS_SHUTDOWN_NONE) {
338
    aosDbgAssert(aos.sssp.stage == AOS_SSSP_STAGE_STARTUP_1_2);
339
  }
340
#else /* (AMIROOS_CFG_SSSP_MASTER == true) */
341
  if (shutdown == AOS_SHUTDOWN_NONE) {
342
    aosSsspProceed(NULL, 0, 0, NULL);
343
    aosDbgAssert(aos.sssp.stage == AOS_SSSP_STAGE_STARTUP_1_2);
344
  }
345
#endif /* (AMIROOS_CFG_SSSP_MASTER == true) */
346 e545e620 Thomas Schöpping
347 cda14729 Thomas Schöpping
  // proceed to startup stage 1.3
348
  while ((shutdown == AOS_SHUTDOWN_NONE) && (aosSsspProceed(&_eventListenerGPIO, MODULE_SSSP_EVENTFLAG_S, EVENTMASK_GPIO, &eventmask) != AOS_SUCCESS)) {
349
    /*
350
     * This code is executed if the received event was not about a deactivation of the snychronization signal.
351
     * The received event could be caused by any listener.
352
     */
353
    // GPIO event
354
    if (eventmask & _eventListenerGPIO.events) {
355
      eventflags = chEvtGetAndClearFlags(&_eventListenerGPIO);
356
      // PD event
357
      if (eventflags & MODULE_SSSP_EVENTFLAG_PD) {
358
        shutdown = AOS_SHUTDOWN_PASSIVE;
359
      } else {
360
#if defined(MODULE_SSSP_STARTUP_1_2_GPIOEVENT_HOOK)
361
        MODULE_SSSP_STARTUP_1_2_GPIOEVENT_HOOK(eventmask, eventflags);
362
#else /* defined(MODULE_SSSP_STARTUP_1_2_GPIOEVENT_HOOK) */
363
        /* silently ignore any other GPIO events */
364
#endif /* defined(MODULE_SSSP_STARTUP_1_2_GPIOEVENT_HOOK) */
365
      }
366
    }
367
    // OS event
368
    else if (eventmask & _eventListenerOS.events) {
369
      eventflags = chEvtGetAndClearFlags(&_eventListenerOS);
370
      _unexpectedEventError(eventmask, eventflags);
371
    }
372
    // unknown event
373
    else {
374
      _unexpectedEventError(eventmask, 0);
375
    }
376
  }
377
  if (shutdown == AOS_SHUTDOWN_NONE) {
378
    aosDbgAssert(aos.sssp.stage == AOS_SSSP_STAGE_STARTUP_1_3);
379
  }
380
381
  // proceed to startup stage 2.1
382
#if (AMIROOS_CFG_SSSP_MASTER == true)
383
  while ((shutdown == AOS_SHUTDOWN_NONE) && (aosSsspProceed(NULL, 0, EVENTMASK_SSSPTIMER, &eventmask) != AOS_SUCCESS)) {
384
    /*
385
     * This code is executed if the received event was not about the delay.
386
     * The received event could be caused by any listener.
387
     */
388
    // GPIO event
389
    if (eventmask & _eventListenerGPIO.events) {
390
      eventflags = chEvtGetAndClearFlags(&_eventListenerGPIO);
391
      // PD event
392
      if (eventflags & MODULE_SSSP_EVENTFLAG_PD) {
393
        shutdown = AOS_SHUTDOWN_PASSIVE;
394
      } else {
395
#if defined(MODULE_SSSP_STARTUP_1_3_GPIOEVENT_HOOK)
396
        MODULE_SSSP_STARTUP_1_3_GPIOEVENT_HOOK(eventmask, eventflags);
397
#else /* defined(MODULE_SSSP_STARTUP_1_3_GPIOEVENT_HOOK) */
398
        /* silently ignore any other GPIO events */
399
#endif /* defined(MODULE_SSSP_STARTUP_1_3_GPIOEVENT_HOOK) */
400
      }
401
    }
402
    // OS event
403
    else if (eventmask & _eventListenerOS.events) {
404
      eventflags = chEvtGetAndClearFlags(&_eventListenerOS);
405
      _unexpectedEventError(eventmask, eventflags);
406
    }
407
    // unknown event
408
    else {
409
      _unexpectedEventError(eventmask, 0);
410
    }
411
  }
412
#else /* (AMIROOS_CFG_SSSP_MASTER == true) */
413 510b93cc Thomas Schöpping
  while ((shutdown == AOS_SHUTDOWN_NONE) && (aosSsspProceed(&_eventListenerGPIO, MODULE_SSSP_EVENTFLAG_S, EVENTMASK_GPIO, &eventmask) != AOS_SUCCESS)) {
414 cda14729 Thomas Schöpping
    /*
415
     * This code is executed if the received event was not about a deactivation of the snychronization signal.
416
     * The received event could be caused by any listener.
417
     */
418
    // GPIO event
419
    if (eventmask & _eventListenerGPIO.events) {
420
      eventflags = chEvtGetAndClearFlags(&_eventListenerGPIO);
421
      // PD event
422
      if (eventflags & MODULE_SSSP_EVENTFLAG_PD) {
423
        shutdown = AOS_SHUTDOWN_PASSIVE;
424
      } else {
425
#if defined(MODULE_SSSP_STARTUP_1_2_GPIOEVENT_HOOK)
426
        MODULE_SSSP_STARTUP_1_2_GPIOEVENT_HOOK(eventmask, eventflags);
427
#else /* defined(MODULE_SSSP_STARTUP_1_2_GPIOEVENT_HOOK) */
428
        /* silently ignore any other GPIO events */
429
#endif /* defined(MODULE_SSSP_STARTUP_1_2_GPIOEVENT_HOOK) */
430
      }
431
    }
432
    // OS event
433
    else if (eventmask & _eventListenerOS.events) {
434
      eventflags = chEvtGetAndClearFlags(&_eventListenerOS);
435
      _unexpectedEventError(eventmask, eventflags);
436
    }
437
    // unknown event
438
    else {
439
      _unexpectedEventError(eventmask, 0);
440
    }
441
  }
442
#endif /* (AMIROOS_CFG_SSSP_MASTER == true) */
443
  if (shutdown == AOS_SHUTDOWN_NONE) {
444
    aosDbgAssert(aos.sssp.stage == AOS_SSSP_STAGE_STARTUP_2_1);
445
  }
446
447
#endif /* (AMIROOS_CFG_SSSP_ENABLE == true) && (AMIROOS_CFG_SSSP_STARTUP == true) */
448
449
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_1)
450
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_1_ARGS)
451
  AMIROOS_CFG_MAIN_INIT_HOOK_1(AMIROOS_CFG_MAIN_INIT_HOOK_1_ARGS);
452
#else /* defined(AMIROOS_CFG_MAIN_INIT_HOOK_1_ARGS) */
453
  AMIROOS_CFG_MAIN_INIT_HOOK_1();
454
#endif /* defined(AMIROOS_CFG_MAIN_INIT_HOOK_1_ARGS) */
455
#endif /* defined(AMIROOS_CFG_MAIN_INIT_HOOK_1) */
456 e545e620 Thomas Schöpping
457 4c72a54c Thomas Schöpping
  /* periphery communication interfaces initialization */
458
#if defined(MODULE_INIT_PERIPHERY_IF)
459 cda14729 Thomas Schöpping
  // module specific initialization
460 4c72a54c Thomas Schöpping
  MODULE_INIT_PERIPHERY_IF();
461
#endif /* defined(MODULE_INIT_PERIPHERY_IF) */
462 7de0cc90 Thomas Schöpping
#if defined(MODULE_HAL_PROGIF)
463 cda14729 Thomas Schöpping
  // user interface
464 ba516b61 Thomas Schöpping
  aosIOChannelInit(&_stdiochannel, (BaseAsynchronousChannel*)&MODULE_HAL_PROGIF);
465
  aosIOChannelOutputEnable(&_stdiochannel);
466
  aosIOStreamAddChannel(&aos.iostream, &_stdiochannel);
467 cda14729 Thomas Schöpping
#if (AMIROOS_CFG_SHELL_ENABLE == true)
468 dd8738ea Thomas Schöpping
  aosShellChannelInit(&_stdshellchannel, (BaseAsynchronousChannel*)&MODULE_HAL_PROGIF);
469 ba516b61 Thomas Schöpping
  aosShellChannelInputEnable(&_stdshellchannel);
470
  aosShellChannelOutputEnable(&_stdshellchannel);
471 6b53f6bf Thomas Schöpping
  aosShellStreamAddChannel(&aos.shell.stream, &_stdshellchannel);
472 cda14729 Thomas Schöpping
#endif /* (AMIROOS_CFG_SHELL_ENABLE == true) */
473 7de0cc90 Thomas Schöpping
#endif /* defined(MODULE_HAL_PROGIF) */
474 e545e620 Thomas Schöpping
475 cda14729 Thomas Schöpping
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_2)
476
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_2_ARGS)
477
  AMIROOS_CFG_MAIN_INIT_HOOK_2(AMIROOS_CFG_MAIN_INIT_HOOK_2_ARGS);
478
#else /* defined(AMIROOS_CFG_MAIN_INIT_HOOK_2_ARGS) */
479
  AMIROOS_CFG_MAIN_INIT_HOOK_2();
480
#endif /* defined(AMIROOS_CFG_MAIN_INIT_HOOK_2_ARGS) */
481
#endif /* defined(AMIROOS_CFG_MAIN_INIT_HOOK_2) */
482 e545e620 Thomas Schöpping
483
  /* module is ready -> print welcome prompt */
484
  aosprintf("\n");
485
  aosprintf("######################################################################\n");
486
  aosprintf("# AMiRo-OS is an operating system designed for the Autonomous Mini   #\n");
487
  aosprintf("# Robot (AMiRo) platform.                                            #\n");
488 84f0ce9e Thomas Schöpping
  aosprintf("# Copyright (C) 2016..2019  Thomas Schöpping et al.                  #\n");
489 e545e620 Thomas Schöpping
  aosprintf("#                                                                    #\n");
490
  aosprintf("# This is free software; see the source for copying conditions.      #\n");
491
  aosprintf("# There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR  #\n");
492
  aosprintf("# A PARTICULAR PURPOSE.                                              #\n");
493
  aosprintf("# The development of this software was supported by the Excellence   #\n");
494
  aosprintf("# Cluster EXC 227 Cognitive Interaction Technology. The Excellence   #\n");
495
  aosprintf("# Cluster EXC 227 is a grant of the Deutsche Forschungsgemeinschaft  #\n");
496
  aosprintf("# (DFG) in the context of the German Excellence Initiative.          #\n");
497
  aosprintf("######################################################################\n");
498
  aosprintf("\n");
499
500 cda14729 Thomas Schöpping
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_3)
501
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_3_ARGS)
502
  AMIROOS_CFG_MAIN_INIT_HOOK_3(AMIROOS_CFG_MAIN_INIT_HOOK_3_ARGS);
503
#else /* defined(AMIROOS_CFG_MAIN_INIT_HOOK_3_ARGS) */
504
  AMIROOS_CFG_MAIN_INIT_HOOK_3();
505
#endif /* defined(AMIROOS_CFG_MAIN_INIT_HOOK_3_ARGS) */
506
#endif /* defined(AMIROOS_CFG_MAIN_INIT_HOOK_3) */
507 7de40828 Thomas Schöpping
508
#if (AMIROOS_CFG_TESTS_ENABLE == true)
509
#if defined(MODULE_INIT_TESTS)
510
  MODULE_INIT_TESTS();
511 7de0cc90 Thomas Schöpping
#else /* defined(MODULE_INIT_TESTS) */
512
  #warning "AMIROOS_CFG_TESTS_ENABLE set to true, but MODULE_INIT_TESTS() not defined"
513
#endif /* defined(MODULE_INIT_TESTS) */
514
#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
515 7de40828 Thomas Schöpping
516 cda14729 Thomas Schöpping
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_4)
517
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_4_ARGS)
518
  AMIROOS_CFG_MAIN_INIT_HOOK_4(AMIROOS_CFG_MAIN_INIT_HOOK_4_ARGS);
519
#else /* defined(AMIROOS_CFG_MAIN_INIT_HOOK_4_ARGS) */
520
  AMIROOS_CFG_MAIN_INIT_HOOK_4();
521
#endif /* defined(AMIROOS_CFG_MAIN_INIT_HOOK_4_ARGS) */
522
#endif /* defined(AMIROOS_CFG_MAIN_INIT_HOOK_4) */
523 e545e620 Thomas Schöpping
524 9ebb11a9 Thomas Schöpping
#if (AMIROOS_CFG_SSSP_ENABLE == true)
525 cda14729 Thomas Schöpping
526
  // proceed to startup stage 2.2
527
#if (AMIROOS_CFG_SSSP_MASTER == true)
528
  while ((shutdown == AOS_SHUTDOWN_NONE) && (aosSsspProceed(NULL, 0, EVENTMASK_SSSPTIMER, &eventmask) != AOS_SUCCESS)) {
529 e545e620 Thomas Schöpping
    /*
530 cda14729 Thomas Schöpping
     * This code is executed if the received event was not about the delay.
531
     * The received event could be caused by any listener.
532 e545e620 Thomas Schöpping
     */
533 cda14729 Thomas Schöpping
    // GPIO event
534
    if (eventmask & _eventListenerGPIO.events) {
535
      eventflags = chEvtGetAndClearFlags(&_eventListenerGPIO);
536 9461fadc Thomas Schöpping
      // PD event
537 cda14729 Thomas Schöpping
      if (eventflags & MODULE_SSSP_EVENTFLAG_PD) {
538 9461fadc Thomas Schöpping
        shutdown = AOS_SHUTDOWN_PASSIVE;
539
      } else {
540 cda14729 Thomas Schöpping
#if defined(MODULE_SSSP_STARTUP_1_3_GPIOEVENT_HOOK)
541
        MODULE_SSSP_STARTUP_1_3_GPIOEVENT_HOOK(eventmask, eventflags);
542
#else /* defined(MODULE_SSSP_STARTUP_1_3_GPIOEVENT_HOOK) */
543
        /* silently ignore any other GPIO events */
544
#endif /* defined(MODULE_SSSP_STARTUP_1_3_GPIOEVENT_HOOK) */
545 9461fadc Thomas Schöpping
      }
546 e545e620 Thomas Schöpping
    }
547 9461fadc Thomas Schöpping
    // OS event
548 e545e620 Thomas Schöpping
    else if (eventmask & _eventListenerOS.events) {
549
      eventflags = chEvtGetAndClearFlags(&_eventListenerOS);
550
      _unexpectedEventError(eventmask, eventflags);
551
    }
552 9461fadc Thomas Schöpping
    // unknown event
553 e545e620 Thomas Schöpping
    else {
554 933df08e Thomas Schöpping
      _unexpectedEventError(eventmask, 0);
555 e545e620 Thomas Schöpping
    }
556
  }
557 9461fadc Thomas Schöpping
  if (shutdown == AOS_SHUTDOWN_NONE) {
558 cda14729 Thomas Schöpping
    aosDbgAssert(aos.sssp.stage == AOS_SSSP_STAGE_STARTUP_2_2);
559 9461fadc Thomas Schöpping
  }
560 7de0cc90 Thomas Schöpping
#else /* (AMIROOS_CFG_SSSP_MASTER == true) */
561 cda14729 Thomas Schöpping
  if (shutdown == AOS_SHUTDOWN_NONE) {
562
    aosSsspProceed(NULL, 0, 0, NULL);
563
    aosDbgAssert(aos.sssp.stage == AOS_SSSP_STAGE_STARTUP_2_2);
564
  }
565
#endif /* (AMIROOS_CFG_SSSP_MASTER == true) */
566 9461fadc Thomas Schöpping
567 cda14729 Thomas Schöpping
  // proceed to startup stage 3 (MSI is enabled), or to operation phase (no MSI)
568
  while ((shutdown == AOS_SHUTDOWN_NONE) && (aosSsspProceed(&_eventListenerGPIO, MODULE_SSSP_EVENTFLAG_S, EVENTMASK_GPIO, &eventmask) != AOS_SUCCESS)) {
569
    /*
570
     * This code is executed if the received event was not about a deactivation of the snychronization signal.
571
     * The received event could be caused by any listener.
572
     */
573
    // GPIO event
574
    if (eventmask & _eventListenerGPIO.events) {
575
      eventflags = chEvtGetAndClearFlags(&_eventListenerGPIO);
576
      // PD event
577
      if (eventflags & MODULE_SSSP_EVENTFLAG_PD) {
578
        shutdown = AOS_SHUTDOWN_PASSIVE;
579 9461fadc Thomas Schöpping
      } else {
580 cda14729 Thomas Schöpping
#if defined(MODULE_SSSP_STARTUP_2_2_GPIOEVENT_HOOK)
581
        MODULE_SSSP_STARTUP_2_2_GPIOEVENT_HOOK(eventmask, eventflags);
582
#else /* defined(MODULE_SSSP_STARTUP_2_2_GPIOEVENT_HOOK) */
583
        /* silently ignore any other GPIO events */
584
#endif /* defined(MODULE_SSSP_STARTUP_2_2_GPIOEVENT_HOOK) */
585 9461fadc Thomas Schöpping
      }
586
    }
587 cda14729 Thomas Schöpping
    // OS event
588
    else if (eventmask & _eventListenerOS.events) {
589
      eventflags = chEvtGetAndClearFlags(&_eventListenerOS);
590
      _unexpectedEventError(eventmask, eventflags);
591
    }
592
    // unknown event
593
    else {
594
      _unexpectedEventError(eventmask, 0);
595
    }
596
  }
597
  if (shutdown == AOS_SHUTDOWN_NONE) {
598
#if (AMIROOS_CFG_SSSP_MSI == true)
599
    aosDbgAssert(aos.sssp.stage == AOS_SSSP_STAGE_STARTUP_3_1);
600
#else /* (AMIROOS_CFG_SSSP_MSI == true) */
601
    aosDbgAssert(aos.sssp.stage == AOS_SSSP_STAGE_OPERATION);
602
#endif /* (AMIROOS_CFG_SSSP_MSI == true) */
603 9461fadc Thomas Schöpping
  }
604 933df08e Thomas Schöpping
605 cda14729 Thomas Schöpping
  /*
606 c218345a Thomas Schöpping
   * There must be no delay at this point, thus no hook allowed.
607 cda14729 Thomas Schöpping
   */
608
609
#if (AMIROOS_CFG_SSSP_MSI == true)
610
611 c218345a Thomas Schöpping
  //TODO: MSI
612 cda14729 Thomas Schöpping
613 c218345a Thomas Schöpping
#if (HAL_USE_RTC == TRUE)
614
615
  //TODO: Calendar synchronization
616
617
#endif /* (HAL_USE_RTC == TRUE) */
618 cda14729 Thomas Schöpping
#endif /* (AMIROOS_CFG_SSSP_MSI == true) */
619
620
#endif /* (AMIROOS_CFG_SSSP_ENABLE == true) */
621 e545e620 Thomas Schöpping
622
  /* completely start AMiRo-OS */
623 933df08e Thomas Schöpping
  if (shutdown == AOS_SHUTDOWN_NONE) {
624
    aosSysStart();
625
  }
626 e545e620 Thomas Schöpping
627 cda14729 Thomas Schöpping
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_5)
628
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_5_ARGS)
629
  AMIROOS_CFG_MAIN_INIT_HOOK_5(AMIROOS_CFG_MAIN_INIT_HOOK_5_ARGS);
630
#else /* defined(AMIROOS_CFG_MAIN_INIT_HOOK_5_ARGS) */
631
  AMIROOS_CFG_MAIN_INIT_HOOK_5();
632
#endif /* defined(AMIROOS_CFG_MAIN_INIT_HOOK_5_ARGS) */
633
#endif /* defined(AMIROOS_CFG_MAIN_INIT_HOOK_5) */
634 e545e620 Thomas Schöpping
635
  /*
636
   * ##########################################################################
637
   * # infinite loop                                                          #
638
   * ##########################################################################
639
   */
640
641 c218345a Thomas Schöpping
#if (AMIROOS_CFG_SSSP_ENABLE == true)
642
  /* ignore all SSSP signal events, except for PD and configured events */
643
  eventflags = MODULE_SSSP_EVENTFLAG_S;
644
#if (AMIROOS_CFG_SSSP_MSI == true)
645
#if (AMIROOS_CFG_SSSP_STACK_START != true)
646
  eventflags |= MODULE_SSSP_EVENTFLAG_DN;
647
#endif /* (AMIROOS_CFG_SSSP_STACK_START != true) */
648
#if (AMIROOS_CFG_SSSP_STACK_END != true)
649
  eventflags |= MODULE_SSSP_EVENTFLAG_UP;
650
#endif /* (AMIROOS_CFG_SSSP_STACK_END != true) */
651
#endif /* (AMIROOS_CFG_SSSP_MSI == true) */
652
  eventflags &= ~((eventflags_t)AMIROOS_CFG_MAIN_LOOP_GPIOEVENT_FLAGSMASK);
653
  _eventListenerGPIO.wflags &= ~eventflags;
654
#endif /* (AMIROOS_CFG_SSSP_ENABLE == true) */
655
656 e545e620 Thomas Schöpping
  // sleep until a shutdown event is received
657
  while (shutdown == AOS_SHUTDOWN_NONE) {
658
    // wait for an event
659
#if (AMIROOS_CFG_MAIN_LOOP_TIMEOUT != 0)
660 1e5f7648 Thomas Schöpping
    eventmask = chEvtWaitOneTimeout(ALL_EVENTS, chTimeUS2I(AMIROOS_CFG_MAIN_LOOP_TIMEOUT));
661 7de0cc90 Thomas Schöpping
#else /* (AMIROOS_CFG_MAIN_LOOP_TIMEOUT != 0) */
662 e545e620 Thomas Schöpping
    eventmask = chEvtWaitOne(ALL_EVENTS);
663 7de0cc90 Thomas Schöpping
#endif /* (AMIROOS_CFG_MAIN_LOOP_TIMEOUT != 0) */
664 e545e620 Thomas Schöpping
665 cda14729 Thomas Schöpping
#if defined(AMIROOS_CFG_MAIN_LOOP_HOOK_1)
666
#if defined(AMIROOS_CFG_MAIN_LOOP_HOOK_1_ARGS)
667
    AMIROOS_CFG_MAIN_LOOP_HOOK_1(AMIROOS_CFG_MAIN_LOOP_HOOK_1_ARGS);
668
#else /* defined(AMIROOS_CFG_MAIN_LOOP_HOOK_1_ARGS) */
669
    AMIROOS_CFG_MAIN_LOOP_HOOK_1();
670
#endif /* defined(AMIROOS_CFG_MAIN_LOOP_HOOK_1_ARGS) */
671
#endif /* defined(AMIROOS_CFG_MAIN_LOOP_HOOK_1) */
672 e545e620 Thomas Schöpping
673
    switch (eventmask) {
674 cda14729 Thomas Schöpping
      // if this was an GPIO event
675
      case EVENTMASK_GPIO:
676 e545e620 Thomas Schöpping
        // evaluate flags
677 cda14729 Thomas Schöpping
        eventflags = chEvtGetAndClearFlags(&_eventListenerGPIO);
678 9ebb11a9 Thomas Schöpping
#if (AMIROOS_CFG_SSSP_ENABLE == true)
679 e545e620 Thomas Schöpping
        // PD event
680 cda14729 Thomas Schöpping
        if (eventflags & MODULE_SSSP_EVENTFLAG_PD) {
681 c218345a Thomas Schöpping
          aosSsspShutdownInit(false);
682 e545e620 Thomas Schöpping
          shutdown = AOS_SHUTDOWN_PASSIVE;
683
        }
684
        // all other events
685 cda14729 Thomas Schöpping
#if defined(MODULE_MAIN_LOOP_GPIOEVENT)
686 e545e620 Thomas Schöpping
        else {
687 cda14729 Thomas Schöpping
          MODULE_MAIN_LOOP_GPIOEVENT(eventflags);
688 e545e620 Thomas Schöpping
        }
689 cda14729 Thomas Schöpping
#endif /* defined(MODULE_MAIN_LOOP_GPIOEVENT) */
690 7de0cc90 Thomas Schöpping
#else /* (AMIROOS_CFG_SSSP_ENABLE == true) */
691 cda14729 Thomas Schöpping
#if defined(MODULE_MAIN_LOOP_GPIOEVENT)
692
        MODULE_MAIN_LOOP_GPIOEVENT(eventflags);
693
#endif /* defined(MODULE_MAIN_LOOP_GPIOEVENT) */
694 7de0cc90 Thomas Schöpping
#endif /* (AMIROOS_CFG_SSSP_ENABLE == true) */
695 e545e620 Thomas Schöpping
        break;
696
697
      // if this was an OS event
698 cda14729 Thomas Schöpping
      case EVENTMASK_OS:
699 e545e620 Thomas Schöpping
        // evaluate flags
700
        eventflags = chEvtGetAndClearFlags(&_eventListenerOS);
701
        switch (eventflags) {
702 cda14729 Thomas Schöpping
#if (AMIROOS_CFG_BOOTLOADER == AOS_BOOTLOADER_NONE)
703
          case AOS_SYSTEM_EVENTFLAGS_SHUTDOWN_MASK:
704
            shutdown = AOS_SHUTDOWN_ACTIVE;
705
            break;
706
#elif (AMIROOS_CFG_BOOTLOADER == AOS_BOOTLOADER_AMiRoBLT)
707
          case AOS_SYSTEM_EVENTFLAGS_SHUTDOWN_HIBERNATE:
708 e545e620 Thomas Schöpping
            shutdown = AOS_SHUTDOWN_HIBERNATE;
709
            break;
710 cda14729 Thomas Schöpping
          case AOS_SYSTEM_EVENTFLAGS_SHUTDOWN_DEEPSLEEP:
711 e545e620 Thomas Schöpping
            shutdown = AOS_SHUTDOWN_DEEPSLEEP;
712
            break;
713 cda14729 Thomas Schöpping
          case AOS_SYSTEM_EVENTFLAGS_SHUTDOWN_TRANSPORTATION:
714 e545e620 Thomas Schöpping
            shutdown = AOS_SHUTDOWN_TRANSPORTATION;
715
            break;
716 cda14729 Thomas Schöpping
          case AOS_SYSTEM_EVENTFLAGS_SHUTDOWN_RESTART:
717 e545e620 Thomas Schöpping
            shutdown = AOS_SHUTDOWN_RESTART;
718
            break;
719 cda14729 Thomas Schöpping
          case AOS_SYSTEM_EVENTFLAGS_SHUTDOWN_PASSIVE:
720
            _unexpectedEventError(eventmask, eventflags);
721 1d3e002f Thomas Schöpping
            break;
722 cda14729 Thomas Schöpping
#endif /* (AMIROOS_CFG_BOOTLOADER == X) */
723 e545e620 Thomas Schöpping
          default:
724
            _unexpectedEventError(eventmask, eventflags);
725
            break;
726
        }
727
        break;
728
729
      // if this was any other event (should be impossible to occur)
730
      default:
731
        eventflags = 0;
732 41fc7088 Thomas Schöpping
#if (AMIROOS_CFG_MAIN_LOOP_TIMEOUT == 0)
733 e545e620 Thomas Schöpping
        _unexpectedEventError(eventmask, eventflags);
734 7de0cc90 Thomas Schöpping
#endif /* (AMIROOS_CFG_MAIN_LOOP_TIMEOUT == 0) */
735 e545e620 Thomas Schöpping
        break;
736
    }
737
738 c218345a Thomas Schöpping
#if (AMIROOS_CFG_SSSP_ENABLE == true)
739
740
    /*
741
     * Re-anable the S signal GPIO event.
742
     * Note that events for the optional signals UP and DN are not enabled as they are not utilized during SSSP shutdown phase.
743
     */
744
    chSysLock();
745
    _eventListenerGPIO.wflags |= MODULE_SSSP_EVENTFLAG_S;
746
    chSysUnlock();
747
748
#endif /* (AMIROOS_CFG_SSSP_ENABLE == true) */
749
750 cda14729 Thomas Schöpping
#if defined(AMIROOS_CFG_MAIN_LOOP_HOOK_2)
751
#if defined(AMIROOS_CFG_MAIN_LOOP_HOOK_2_ARGS)
752
    AMIROOS_CFG_MAIN_LOOP_HOOK_2(AMIROOS_CFG_MAIN_LOOP_HOOK_2_ARGS);
753
#else /* defined(AMIROOS_CFG_MAIN_LOOP_HOOK_2_ARGS) */
754
    AMIROOS_CFG_MAIN_LOOP_HOOK_2();
755
#endif /* defined(AMIROOS_CFG_MAIN_LOOP_HOOK_2_ARGS) */
756
#endif /* defined(AMIROOS_CFG_MAIN_LOOP_HOOK_2) */
757 e545e620 Thomas Schöpping
  }
758
759
  /*
760
   * ##########################################################################
761
   * # system shutdown                                                        #
762
   * ##########################################################################
763
   */
764
765 cda14729 Thomas Schöpping
  aosDbgAssert(shutdown != AOS_SHUTDOWN_NONE);
766 e545e620 Thomas Schöpping
767
  // initialize/acknowledge shutdown
768
  aosSysShutdownInit(shutdown);
769 cda14729 Thomas Schöpping
#if (AMIROOS_CFG_SSSP_ENABLE == true)
770
  aosDbgAssert(aos.sssp.stage == AOS_SSSP_STAGE_SHUTDOWN_1_2);
771
#endif /* (AMIROOS_CFG_SSSP_ENABLE == true) */
772 e545e620 Thomas Schöpping
773
#if defined(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_1)
774
#if defined(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_1_ARGS)
775 cda14729 Thomas Schöpping
  AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_1(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_1_ARGS);
776 7de0cc90 Thomas Schöpping
#else /* defined(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_1_ARGS) */
777 cda14729 Thomas Schöpping
  AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_1();
778 7de0cc90 Thomas Schöpping
#endif /* defined(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_1_ARGS) */
779
#endif /* defined(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_1) */
780 e545e620 Thomas Schöpping
781 cda14729 Thomas Schöpping
  // wait for all threads to terminate
782 e545e620 Thomas Schöpping
  aosSysStop();
783
784
#if defined(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_2)
785
#if defined(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_2_ARGS)
786 cda14729 Thomas Schöpping
  AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_2(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_2_ARGS);
787 7de0cc90 Thomas Schöpping
#else /* defined(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_2_ARGS) */
788 cda14729 Thomas Schöpping
  AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_2();
789 7de0cc90 Thomas Schöpping
#endif /* defined(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_2_ARGS) */
790
#endif /* defined(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_2) */
791 e545e620 Thomas Schöpping
792
  // deinitialize system
793
  aosSysDeinit();
794
795
#if defined(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_3)
796
#if defined(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_3_ARGS)
797 cda14729 Thomas Schöpping
  AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_3(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_3_ARGS);
798 7de0cc90 Thomas Schöpping
#else /* defined(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_3_ARGS) */
799 cda14729 Thomas Schöpping
  AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_3();
800 7de0cc90 Thomas Schöpping
#endif /* defined(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_3_ARGS) */
801
#endif /* defined(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_3) */
802 e545e620 Thomas Schöpping
803 4c72a54c Thomas Schöpping
  /* stop all periphery communication interfaces */
804
#if defined(MODULE_SHUTDOWN_PERIPHERY_IF)
805
  MODULE_SHUTDOWN_PERIPHERY_IF();
806
#endif /* defined(MODULE_SHUTDOWN_PERIPHERY_IF) */
807 e545e620 Thomas Schöpping
808
#if defined(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_4)
809
#if defined(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_4_ARGS)
810 cda14729 Thomas Schöpping
  AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_4(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_4_ARGS);
811 7de0cc90 Thomas Schöpping
#else /* defined(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_4_ARGS) */
812 cda14729 Thomas Schöpping
  AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_4();
813 7de0cc90 Thomas Schöpping
#endif /* defined(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_4_ARGS) */
814
#endif /* defined(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_4) */
815 e545e620 Thomas Schöpping
816 cda14729 Thomas Schöpping
#if (AMIROOS_CFG_SSSP_ENABLE == true)
817
818
  // proceed to SSSP shutdown stage 1.3
819
  aosSsspProceed(NULL, 0, 0, NULL);
820
  aosDbgAssert(aos.sssp.stage == AOS_SSSP_STAGE_SHUTDOWN_1_3);
821
822
#if (AMIROOS_CFG_SSSP_SHUTDOWN == true)
823
824
  /* AMiRo-OS performs SSSP shutdown phase
825
   * NOTE:
826
   * The initiating module could deactivate PD at this point to indicate a restart rather than a shutdown request.
827
   * AMiRo-OS does not support restart though, thus the signal is not changed.
828
   */
829
830
  // proceed to SSSP shutdown stage 2.1
831
  while (aosSsspProceed(&_eventListenerGPIO, MODULE_SSSP_EVENTFLAG_S, EVENTMASK_GPIO, &eventmask) != AOS_SUCCESS) {
832
    /*
833
     * This code is executed if the received event was not about a deactivation of the synchronization signal.
834
     * The received event could be caused by any listener.
835
     */
836
    // GPIO event
837
    if (eventmask & _eventListenerGPIO.events) {
838
      eventflags = chEvtGetAndClearFlags(&_eventListenerGPIO);
839
#if defined(MODULE_SSSP_SHUTDOWN_1_3_GPIOEVENT_HOOK)
840
        MODULE_SSSP_SHUTDOWN_1_3_GPIOEVENT_HOOK(eventmask, eventflags);
841
#else /* defined(MODULE_SSSP_SHUTDOWN_1_3_GPIOEVENT_HOOK) */
842
        /* silently ignore any other GPIO events */
843
#endif /* defined(MODULE_SSSP_SHUTDOWN_1_3_GPIOEVENT_HOOK) */
844
    }
845
    // OS event
846
    else if (eventmask & _eventListenerOS.events) {
847
      eventflags = chEvtGetAndClearFlags(&_eventListenerOS);
848
      _unexpectedEventError(eventmask, eventflags);
849
    }
850
    // unknown event
851
    else {
852
      _unexpectedEventError(eventmask, 0);
853
    }
854
  }
855
  aosDbgAssert(aos.sssp.stage == AOS_SSSP_STAGE_SHUTDOWN_2_1);
856
857
  // proceed to SSSP shutdown stage 2.2
858
  aosSsspProceed(NULL, 0, 0, &eventmask);
859
  aosDbgAssert(aos.sssp.stage == AOS_SSSP_STAGE_SHUTDOWN_2_2);
860
  if (shutdown == AOS_SHUTDOWN_PASSIVE) {
861
    aosDbgPrintf("%s request received\n", eventmask ? "shutdown" : "restart");
862
  }
863
  /* NOTE:
864
   * Actually the call of aosSsspProceed() returned an indicator, whether a shutdown or restart has been initiated.
865
   * Since AMiRo-OS does not support restart, this return value is ignored and shutdown is assumed.
866
   */
867
868
  // the initiating module broadcasts the shutdown identifier
869
  if (shutdown != AOS_SHUTDOWN_PASSIVE) {
870
    // since AMiRo-OS does not support multiple ways to shutdown or restart, the special identifier 0 is broadcasted.
871
    aosSsspShutdownBroadcastIdentifier(0);
872
  }
873
  // passive modules receive the broadcasted identifier
874
  else {
875
    unsigned int identifier = 0;
876
877
    // receive the identifier, which specifies the type of shutdown/restart
878
    while ((eventmask = aosSsspShutdownWaitForIdentifierPulse(&_eventListenerGPIO, MODULE_SSSP_EVENTFLAG_S, EVENTMASK_SSSPTIMER, &identifier)) != EVENTMASK_SSSPTIMER) {
879
      // GPIO event
880
      if (eventmask & _eventListenerGPIO.events) {
881
        eventflags = chEvtGetAndClearFlags(&_eventListenerGPIO);
882
#if defined(MODULE_SSSP_SHUTDOWN_2_2_GPIOEVENT_HOOK)
883
        MODULE_SSSP_SHUTDOWN_2_2_GPIOEVENT_HOOK(eventmask, eventflags);
884
#else /* defined(MODULE_SSSP_SHUTDOWN_2_2_GPIOEVENT_HOOK) */
885
        /* silently ignore any other GPIO events */
886
#endif /* defined(MODULE_SSSP_SHUTDOWN_2_2_GPIOEVENT_HOOK) */
887
        /* silently ignore any GPIO events */
888
      }
889
      // OS event
890
      else if (eventmask & _eventListenerOS.events) {
891
        eventflags = chEvtGetAndClearFlags(&_eventListenerOS);
892
        _unexpectedEventError(eventmask, eventflags);
893
      }
894
      // unknown event
895
      else {
896
        _unexpectedEventError(eventmask, 0);
897
      }
898
    }
899
900
    // Since AMiRo-OS does not support multiple ways to shutdown or restart, the identifier is ignored.
901
  }
902
903
  // proceed to SSSP shutdown stage 2.3
904
  aosSsspProceed(NULL, 0, 0, NULL);
905
  aosDbgAssert(aos.sssp.stage == AOS_SSSP_STAGE_SHUTDOWN_2_3);
906 e545e620 Thomas Schöpping
907
  /*
908 cda14729 Thomas Schöpping
   * Since AMiRo-OS does only support one basic shutdown and no restart at all, the final shutdown is kept very simple.
909 e545e620 Thomas Schöpping
   */
910
911 cda14729 Thomas Schöpping
  // disable interrupts
912
  irqDeinit();
913
  chSysDisable();
914
915
  chThdExit(MSG_OK);
916
  return MSG_OK;
917
918
#else /* (AMIROOS_CFG_SSSP_SHUTDOWN == true) */
919
920
  /* hand over to the bootloader to perform SSSP shutdown phase */
921
  aosSysShutdownToBootloader(shutdown);
922
923
  aosDbgAssertMsg(false, "AMiRo-OS must not proceed to this point!");
924
  chThdExit(MSG_RESET);
925
  return MSG_RESET;
926
927
#endif /* (AMIROOS_CFG_SSSP_SHUTDOWN == true) */
928
929
#else /* (AMIROOS_CFG_SSSP_ENABLE == true) */
930
931
  /*
932
   * Depending on the configured bootloader, trivial shutdown is either executed by AMiRo-OS or by that bootloader.
933
   */
934
#if (AMIROOS_CFG_BOOTLOADER == AOS_BOOTLOADER_NONE)
935
936
  /* AMiRo-OS performs trivial shutdown */
937
938
  // disable interrupts
939
  irqDeinit();
940
  chSysDisable();
941
942
  chThdExit(MSG_OK);
943
  return MSG_OK;
944
945
#elif (AMIROOS_CFG_BOOTLOADER == AOS_BOOTLOADER_AMiRoBLT)
946
947
  /* AMiRo-BLT performns shutdown */
948
  aosSysShutdownToBootloader(shutdown);
949
950
  aosDbgAssertMsg(false, "AMiRo-OS must not proceed to this point!");
951
  chThdExit(MSG_RESET);
952
  return MSG_RESET;
953
954
#endif /* (AMIROOS_CFG_BOOTLOADER == X) */
955
#endif /* (AMIROOS_CFG_SSSP_ENABLE == true) */
956 e545e620 Thomas Schöpping
}
957 53710ca3 Marc Rothmann
958 f3ac1c96 Thomas Schöpping
/******************************************************************************/
959
/* EXPORTED FUNCTIONS                                                         */
960
/******************************************************************************/
961
962 53710ca3 Marc Rothmann
/** @} */