Revision 1678f270 core/src/aos_main.cpp

View differences:

core/src/aos_main.cpp
1 1
/*
2 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.
3
Copyright (C) 2016..2019  Thomas Schöpping et al.
4 4

  
5 5
This program is free software: you can redistribute it and/or modify
6 6
it under the terms of the GNU General Public License as published by
......
61 61
 */
62 62
#define DELAYEVENT_MASK                         EVENT_MASK(4)
63 63

  
64
#if (AMIROOS_CFG_SSSP_ENABLE == true)
64
#if (AMIROOS_CFG_SSSP_ENABLE == true) || defined(__DOXYGEN__)
65 65

  
66 66
/**
67 67
 * @brief   CAN message identifier for initialization of the SSSP stack initialization sequence.
......
78 78
 */
79 79
#define SSSP_STACKINIT_CANMSGID_ABORT           0x001
80 80

  
81
#endif
81
#else /* AMIROOS_CFG_SSSP_ENABLE == false */
82

  
83
/**
84
 * @brief   Default shutdown mode if SSSP is unavailable.
85
 */
86
#define AOS_SHUTDOWN_DEFAULT                    AOS_SHUTDOWN_DEEPSLEEP
87

  
88
#endif /* AMIROOS_CFG_SSSP_ENABLE */
82 89

  
83 90
/**
84 91
 * @brief   CAN message identifier for calender synchronization message.
......
106 113
 * @brief   I/O shell channel for the programmer interface.
107 114
 */
108 115
static AosShellChannel _stdshellchannel;
109
#endif
110
#endif
116
#endif /* AMIROOS_CFG_SHELL_ENABLE == true */
117
#endif /* defined(MODULE_HAL_PROGIF) */
111 118

  
112 119
/*
113 120
 * hook to add further static variables
......
125 132
static inline void _unexpectedEventError(const eventmask_t mask, const eventflags_t flags)
126 133
{
127 134
#if (AMIROOS_CFG_DBG == true)
128
    aosprintf("CTRL: unexpected/unknown event received. mask: 0x%08X; flags: 0x%08X\n", mask, flags);
135
  aosprintf("CTRL: unexpected/unknown event received. mask: 0x%08X; flags: 0x%08X\n", mask, flags);
129 136
#else
130
    (void)(mask);
131
    (void)(flags);
137
  (void)(mask);
138
  (void)(flags);
132 139
#endif
133
    return;
140
  return;
134 141
}
135 142

  
136

  
137
#if (AMIROOS_CFG_SSSP_ENABLE == true)
143
#if (AMIROOS_CFG_SSSP_ENABLE == true) || defined(__DOXYGEN__)
138 144
/**
139 145
 * @brief   Callback function to be used during SSSP stack initialization sequence.
140 146
 *
......
142 148
 */
143 149
static void _ssspTimerCallback(void* par)
144 150
{
145
    aosDbgCheck(par != NULL);
151
  aosDbgCheck(par != NULL);
146 152

  
147
    chSysLockFromISR();
148
    chEvtBroadcastI((event_source_t*)par);
149
    chSysUnlockFromISR();
153
  chSysLockFromISR();
154
  chEvtBroadcastI((event_source_t*)par);
155
  chSysUnlockFromISR();
150 156

  
151
    return;
157
  return;
152 158
}
153
#endif
159
#endif /* AMIROOS_CFG_SSSP_ENABLE == true */
160

  
154 161
/**
155 162
 * @brief   Helper function to serialize data.
156 163
 *
......
160 167
 */
161 168
inline void _serialize(uint8_t* dst, const uint64_t src, const uint8_t n)
162 169
{
163
    aosDbgCheck(dst != NULL);
164
    aosDbgCheck(n > 0 && n <= 8);
170
  aosDbgCheck(dst != NULL);
171
  aosDbgCheck(n > 0 && n <= 8);
165 172

  
166
    for (uint8_t byte = 0; byte < n; ++byte) {
167
        dst[byte] = (uint8_t)((src >> (byte * 8)) & 0xFF);
168
    }
173
  for (uint8_t byte = 0; byte < n; ++byte) {
174
    dst[byte] = (uint8_t)((src >> (byte * 8)) & 0xFF);
175
  }
169 176

  
170
    return;
177
  return;
171 178
}
172 179

  
173 180
/**
......
180 187
 */
181 188
inline uint64_t _deserialize(uint8_t* src, const uint8_t n)
182 189
{
183
    aosDbgCheck(src != NULL);
184
    aosDbgCheck(n > 0 && n <= 8);
190
  aosDbgCheck(src != NULL);
191
  aosDbgCheck(n > 0 && n <= 8);
185 192

  
186
    uint64_t result = 0;
187
    for (uint8_t byte = 0; byte < n; ++byte) {
188
        result |= ((uint64_t)src[byte]) << (byte * 8);
189
    }
193
  uint64_t result = 0;
194
  for (uint8_t byte = 0; byte < n; ++byte) {
195
    result |= ((uint64_t)src[byte]) << (byte * 8);
196
  }
190 197

  
191
    return result;
198
  return result;
192 199
}
193 200

  
194 201
/**
......
210 217
 */
211 218
inline uint64_t _TM2U64(struct tm* src)
212 219
{
213
    aosDbgCheck(src != NULL);
214

  
215
    return (((uint64_t)(src->tm_sec  & 0x0000003F) << (0))               |
216
            ((uint64_t)(src->tm_min  & 0x0000003F) << (6))               |
217
            ((uint64_t)(src->tm_hour & 0x0000001F) << (12))              |
218
            ((uint64_t)(src->tm_mday & 0x0000001F) << (17))              |
219
            ((uint64_t)(src->tm_mon  & 0x0000000F) << (22))              |
220
            ((uint64_t)(src->tm_year & 0x00FFFFFF) << (26))              |
221
            ((uint64_t)(src->tm_wday & 0x00000007) << (50))              |
222
            ((uint64_t)(src->tm_yday & 0x000001FF) << (53))              |
223
            ((uint64_t)((src->tm_isdst == 0) ? 0 : (src->tm_isdst > 0) ? 1 : 2) << (62)));
220
  aosDbgCheck(src != NULL);
221

  
222
  return (((uint64_t)(src->tm_sec  & 0x0000003F) << (0))               |
223
          ((uint64_t)(src->tm_min  & 0x0000003F) << (6))               |
224
          ((uint64_t)(src->tm_hour & 0x0000001F) << (12))              |
225
          ((uint64_t)(src->tm_mday & 0x0000001F) << (17))              |
226
          ((uint64_t)(src->tm_mon  & 0x0000000F) << (22))              |
227
          ((uint64_t)(src->tm_year & 0x00FFFFFF) << (26))              |
228
          ((uint64_t)(src->tm_wday & 0x00000007) << (50))              |
229
          ((uint64_t)(src->tm_yday & 0x000001FF) << (53))              |
230
          ((uint64_t)((src->tm_isdst == 0) ? 0 : (src->tm_isdst > 0) ? 1 : 2) << (62)));
224 231
}
225 232

  
226 233
/**
......
233 240
 */
234 241
inline void _U642TM(struct tm* dst, const uint64_t src)
235 242
{
236
    aosDbgCheck(dst != NULL);
237

  
238
    dst->tm_sec  = (src >> 0)  & 0x0000003F;
239
    dst->tm_min  = (src >> 6)  & 0x0000003F;
240
    dst->tm_hour = (src >> 12) & 0x0000001F;
241
    dst->tm_mday = (src >> 17) & 0x0000001F;
242
    dst->tm_mon  = (src >> 22) & 0x0000000F;
243
    dst->tm_year = (src >> 26) & 0x00FFFFFF;
244
    dst->tm_wday = (src >> 50) & 0x00000007;
245
    dst->tm_yday = (src >> 53) & 0x000001FF;
246
    dst->tm_isdst = (((src >> 62) & 0x03) == 0) ? 0 : (((src >> 62) & 0x03) > 0) ? 1 : -1;
247

  
248
    return;
243
  aosDbgCheck(dst != NULL);
244

  
245
  dst->tm_sec  = (src >> 0)  & 0x0000003F;
246
  dst->tm_min  = (src >> 6)  & 0x0000003F;
247
  dst->tm_hour = (src >> 12) & 0x0000001F;
248
  dst->tm_mday = (src >> 17) & 0x0000001F;
249
  dst->tm_mon  = (src >> 22) & 0x0000000F;
250
  dst->tm_year = (src >> 26) & 0x00FFFFFF;
251
  dst->tm_wday = (src >> 50) & 0x00000007;
252
  dst->tm_yday = (src >> 53) & 0x000001FF;
253
  dst->tm_isdst = (((src >> 62) & 0x03) == 0) ? 0 : (((src >> 62) & 0x03) > 0) ? 1 : -1;
254

  
255
  return;
249 256
}
250
#if (AMIROOS_CFG_SSSP_ENABLE == true)
257

  
258
#if (AMIROOS_CFG_SSSP_ENABLE == true) || defined(__DOXYGEN__)
251 259
/**
252 260
 * @brief   Implementation of the SSSP module stack initialization sequence (startup phase 3).
253 261
 *
......
257 265
 */
258 266
aos_shutdown_t _ssspModuleStackInitialization(void)
259 267
{
260
    // local types
261
    /**
268
  // local types
269
  /**
262 270
   * @brief   States for the internal state machine to implement SSSP startup stage 3.
263 271
   */
264
    typedef enum {
265
        STAGE_3_1,                  /**< Initiation of SSSP startup stage 3. */
266
        STAGE_3_2,                  /**< Starting the sequence and broadcasting the first ID. */
267
        STAGE_3_3_WAITFORFIRSTID,   /**< Waiting for first ID after initiation. */
268
        STAGE_3_3_WAITFORIDORSIG,   /**< Waiting for next ID or activation of neighbor signal. */
269
        STAGE_3_3_WAITFORID,        /**< Waiting for next ID (after the module has set its own ID). */
270
        STAGE_3_4_FINISH,           /**< Successful finish of stage 3. */
271
        STAGE_3_4_ABORT_ACTIVE,     /**< Aborting stage 3 (active). */
272
        STAGE_3_4_ABORT,            /**< Aborting stage 3 (passive). */
273
    } sssp_modulestackinitstage_t;
274

  
275
    typedef struct {
276
        bool loop     : 1;
277
        bool wfe      : 1;
278
        bool wfe_next : 1;
279
    } flags_t;
280

  
281
    // local variables
282
    aos_shutdown_t shutdown = AOS_SHUTDOWN_NONE;
283
    sssp_modulestackinitstage_t stage = STAGE_3_1;
284
    eventmask_t eventmask = 0;
285
    eventflags_t ioflags;
286
    event_source_t eventSourceTimeout;
287
    event_source_t eventSourceDelay;
288
    event_listener_t eventListenerTimeout;
289
    event_listener_t eventListenerDelay;
290
    event_listener_t eventListenerCan;
291
    virtual_timer_t timerTimeout;
292
    virtual_timer_t timerDelay;
293
    CANTxFrame canTxFrame;
294
    CANRxFrame canRxFrame;
272
  typedef enum {
273
    STAGE_3_1,                  /**< Initiation of SSSP startup stage 3. */
274
    STAGE_3_2,                  /**< Starting the sequence and broadcasting the first ID. */
275
    STAGE_3_3_WAITFORFIRSTID,   /**< Waiting for first ID after initiation. */
276
    STAGE_3_3_WAITFORIDORSIG,   /**< Waiting for next ID or activation of neighbor signal. */
277
    STAGE_3_3_WAITFORID,        /**< Waiting for next ID (after the module has set its own ID). */
278
    STAGE_3_4_FINISH,           /**< Successful finish of stage 3. */
279
    STAGE_3_4_ABORT_ACTIVE,     /**< Aborting stage 3 (active). */
280
    STAGE_3_4_ABORT,            /**< Aborting stage 3 (passive). */
281
  } sssp_modulestackinitstage_t;
282

  
283
  typedef struct {
284
    bool loop     : 1;
285
    bool wfe      : 1;
286
    bool wfe_next : 1;
287
  } flags_t;
288

  
289
  // local variables
290
  aos_shutdown_t shutdown = AOS_SHUTDOWN_NONE;
291
  sssp_modulestackinitstage_t stage = STAGE_3_1;
292
  eventmask_t eventmask = 0;
293
  eventflags_t ioflags = 0;
294
  event_source_t eventSourceTimeout;
295
  event_source_t eventSourceDelay;
296
  event_listener_t eventListenerTimeout;
297
  event_listener_t eventListenerDelay;
298
  event_listener_t eventListenerCan;
299
  virtual_timer_t timerTimeout;
300
  virtual_timer_t timerDelay;
301
  CANTxFrame canTxFrame;
302
  CANRxFrame canRxFrame;
295 303
#if (AMIROOS_CFG_SSSP_STACK_START != true) || (AMIROOS_CFG_DBG == true)
296
    aos_ssspmoduleid_t lastid = 0;
297
#endif
298
    flags_t flags;
299

  
300
    // initialize local varibles
301
    chEvtObjectInit(&eventSourceTimeout);
302
    chEvtObjectInit(&eventSourceDelay);
303
    chVTObjectInit(&timerTimeout);
304
    chVTObjectInit(&timerDelay);
305
    canTxFrame.RTR = CAN_RTR_DATA;
306
    canTxFrame.IDE = CAN_IDE_STD;
307
    flags.loop = true;
308
    flags.wfe = false; // do not wait for events in the initial iteration of the FSM loop
309
    flags.wfe_next = true;
310

  
311
    // initialize system variables
312
    aos.sssp.stage = AOS_SSSP_STARTUP_3_1;
313
    aos.sssp.moduleId = 0;
314

  
315
    // listen to events (timout, delay, CAN receive)
316
    chEvtRegisterMask(&eventSourceTimeout, &eventListenerTimeout, TIMEOUTEVENT_MASK);
317
    chEvtRegisterMask(&eventSourceDelay, &eventListenerDelay, DELAYEVENT_MASK);
318
    chEvtRegisterMask(&MODULE_HAL_CAN.rxfull_event, &eventListenerCan, CANEVENT_MASK);
319

  
320
    /*
304
  aos_ssspmoduleid_t lastid = 0;
305
#endif
306
  flags_t flags;
307
  aos_timestamp_t uptime;
308

  
309
  // initialize local varibles
310
  chEvtObjectInit(&eventSourceTimeout);
311
  chEvtObjectInit(&eventSourceDelay);
312
  chVTObjectInit(&timerTimeout);
313
  chVTObjectInit(&timerDelay);
314
  canTxFrame.RTR = CAN_RTR_DATA;
315
  canTxFrame.IDE = CAN_IDE_STD;
316
  flags.loop = true;
317
  flags.wfe = false; // do not wait for events in the initial iteration of the FSM loop
318
  flags.wfe_next = true;
319

  
320
  // initialize system variables
321
  aos.sssp.stage = AOS_SSSP_STARTUP_3_1;
322
  aos.sssp.moduleId = 0;
323

  
324
  // listen to events (timout, delay, CAN receive)
325
  chEvtRegisterMask(&eventSourceTimeout, &eventListenerTimeout, TIMEOUTEVENT_MASK);
326
  chEvtRegisterMask(&eventSourceDelay, &eventListenerDelay, DELAYEVENT_MASK);
327
  chEvtRegisterMask(&MODULE_HAL_CAN.rxfull_event, &eventListenerCan, CANEVENT_MASK);
328

  
329
  /*
321 330
   * FSM in a loop.
322 331
   *
323 332
   * This is a fully event-based FSM for the module stack initialization
......
344 353
   *  delays:     Depending on the current state, delays are required by SSSP
345 354
   *              for timing of the sequential activation of signals.
346 355
   */
347
    aosDbgPrintf("SSSP stack initialization sequence:\n");
348
    while (flags.loop) {
356
  aosDbgPrintf("SSSP stack initialization sequence:\n");
357
  while (flags.loop) {
349 358
#if (AMIROOS_CFG_DBG == true)
350
        switch (stage) {
351
        case STAGE_3_1:
352
            aosDbgPrintf(">>> 3-1\n");
353
            break;
354
        case STAGE_3_2:
355
            aosDbgPrintf(">>> 3-2\n");
356
            break;
357
        case STAGE_3_3_WAITFORFIRSTID:
358
            aosDbgPrintf(">>> 3-3 (1st ID)\n");
359
            break;
360
        case STAGE_3_3_WAITFORIDORSIG:
361
            aosDbgPrintf(">>> 3-3 (ID/sig)\n");
362
            break;
363
        case STAGE_3_3_WAITFORID:
364
            aosDbgPrintf(">>> 3-3 (ID)\n");
365
            break;
366
        case STAGE_3_4_FINISH:
367
            aosDbgPrintf(">>> 3-4 (finish)\n");
368
            break;
369
        case STAGE_3_4_ABORT_ACTIVE:
370
            aosDbgPrintf(">>> 3-4 (active abort)\n");
371
            break;
372
        case STAGE_3_4_ABORT:
373
            aosDbgPrintf(">>> 3-4 (abort)\n");
374
            break;
375
        }
359
    switch (stage) {
360
      case STAGE_3_1:
361
        aosDbgPrintf(">>> 3-1\n");
362
        break;
363
      case STAGE_3_2:
364
        aosDbgPrintf(">>> 3-2\n");
365
        break;
366
      case STAGE_3_3_WAITFORFIRSTID:
367
        aosDbgPrintf(">>> 3-3 (1st ID)\n");
368
        break;
369
      case STAGE_3_3_WAITFORIDORSIG:
370
        aosDbgPrintf(">>> 3-3 (ID/sig)\n");
371
        break;
372
      case STAGE_3_3_WAITFORID:
373
        aosDbgPrintf(">>> 3-3 (ID)\n");
374
        break;
375
      case STAGE_3_4_FINISH:
376
        aosDbgPrintf(">>> 3-4 (finish)\n");
377
        break;
378
      case STAGE_3_4_ABORT_ACTIVE:
379
        aosDbgPrintf(">>> 3-4 (active abort)\n");
380
        break;
381
      case STAGE_3_4_ABORT:
382
        aosDbgPrintf(">>> 3-4 (abort)\n");
383
        break;
384
    }
376 385
#endif
377 386

  
378
        // reset wfe flag for the next iteration
379
        flags.wfe_next = true;
387
    // reset wfe flag for the next iteration
388
    flags.wfe_next = true;
380 389

  
381
        // waiting for events may be skipped
382
        if (flags.wfe) {
383
            // wait for any event to occur
384
            aosDbgPrintf("WFE...");
385
            eventmask = chEvtWaitAnyTimeout(ALL_EVENTS, chTimeUS2I(AOS_SYSTEM_SSSP_TIMEOUT));
386
            aosDbgPrintf("\t0x%08X", eventmask);
387
        } else {
388
            aosDbgPrintf("WFE skipped");
389
        }
390
        aos_timestamp_t uptime;
391
        aosSysGetUptime(&uptime);
392
        aosDbgPrintf("\t%04ums\n", (uint32_t)(uptime / 1000));
390
    // waiting for events (may be skipped)
391
    if (flags.wfe) {
392
      // wait for any event to occur
393
      aosDbgPrintf("WFE...");
394
      eventmask = chEvtWaitAnyTimeout(ALL_EVENTS, chTimeUS2I(AOS_SYSTEM_SSSP_TIMEOUT));
395
      aosDbgPrintf("\t0x%08X", eventmask);
396
    } else {
397
      aosDbgPrintf("WFE skipped");
398
      eventmask = 0;
399
    }
400
    aosSysGetUptime(&uptime);
401
    aosDbgPrintf("\t%04ums\n", (uint32_t)(uptime / MICROSECONDS_PER_MILLISECOND));
393 402

  
394
        /*
403
    /*
395 404
     * execute some general tasks and high priority events
396 405
     */
397
        // no event occurred at all
398
        if ((flags.wfe) && (eventmask == 0)) {
399
            aosDbgPrintf("ERR: no evt\n");
400
            // enforce timeout event
401
            chEvtBroadcast(&eventSourceTimeout);
402
            continue;
403
        }
404
        // if an IO event occurred
405
        if (eventmask & _eventListenerIO.events) {
406
            ioflags = chEvtGetAndClearFlags(&_eventListenerIO);
407
            aosDbgPrintf("INFO: IO evt (0x%08X)\n", ioflags);
408
            // a power-down event occurred
409
            if (ioflags & MODULE_SSSP_EVENTFLAGS_PD) {
410
                aosDbgPrintf("PD evt\n");
411
                // deactivate S and UP
412
                apalControlGpioSet(&moduleSsspGpioSync, APAL_GPIO_OFF);
406
    // no event occurred at all
407
    if ((flags.wfe) && (eventmask == 0)) {
408
      aosDbgPrintf("ERR: no evt\n");
409
      // enforce timeout event
410
      chEvtBroadcast(&eventSourceTimeout);
411
      continue;
412
    }
413
    // if an IO event occurred
414
    if (eventmask & _eventListenerIO.events) {
415
      ioflags = chEvtGetAndClearFlags(&_eventListenerIO);
416
      aosDbgPrintf("INFO: IO evt (0x%08X)\n", ioflags);
417
      // a power-down event occurred
418
      if (ioflags & MODULE_SSSP_EVENTFLAGS_PD) {
419
        aosDbgPrintf("PD evt\n");
420
        // deactivate S and UP
421
        aosDbgPrintf("disabling S\n");
422
        apalControlGpioSet(&moduleSsspGpioSync, APAL_GPIO_OFF);
413 423
#if (AMIROOS_CFG_SSSP_STACK_END != true)
414
                apalControlGpioSet(&moduleSsspGpioUp, APAL_GPIO_OFF);
415
#endif
416
                // set shutdown flag and exit the loop
417
                shutdown = AOS_SHUTDOWN_PASSIVE;
418
                break;
419
            }
420
            // the S signal was deactivated
421
            if (ioflags & MODULE_SSSP_EVENTFLAGS_SYNC) {
422
                apalControlGpioState_t sstate;
423
                apalControlGpioGet(&moduleSsspGpioSync, &sstate);
424
                if (sstate == APAL_GPIO_OFF) {
425
                    aosDbgPrintf("-S evt\n");
426
                    // either finish or abort
427
                    if ((stage == STAGE_3_3_WAITFORID) && (aos.sssp.moduleId != 0)) {
428
                        stage = STAGE_3_4_FINISH;
429
                    } else if (stage != STAGE_3_4_ABORT) {
430
                        stage = STAGE_3_4_ABORT_ACTIVE;
431
                    }
432
                }
433
            }
424
        aosDbgPrintf("disabling UP\n");
425
        apalControlGpioSet(&moduleSsspGpioUp, APAL_GPIO_OFF);
426
#endif
427
        // set shutdown flag and exit the loop
428
        shutdown = AOS_SHUTDOWN_PASSIVE;
429
        break;
430
      }
431
      // the S signal was deactivated
432
      if (ioflags & MODULE_SSSP_EVENTFLAGS_SYNC) {
433
        apalControlGpioState_t sstate;
434
        apalControlGpioGet(&moduleSsspGpioSync, &sstate);
435
        if (sstate == APAL_GPIO_ON) {
436
          aosDbgPrintf("S evt (enabled)\n");
437
        } else {
438
          aosDbgPrintf("S evt (disabled)\n");
439
          // either finish or abort
440
          if ((stage == STAGE_3_3_WAITFORID) && (aos.sssp.moduleId != 0)) {
441
            stage = STAGE_3_4_FINISH;
442
          } else if (stage != STAGE_3_4_ABORT) {
443
            stage = STAGE_3_4_ABORT_ACTIVE;
444
          }
434 445
        }
435
        // an OS event occurred
436
        if (eventmask & _eventListenerOS.events) {
437
            aosDbgPrintf("WARN: OS evt\n");
438
            // get the flags
439
            eventflags_t oseventflags = chEvtGetAndClearFlags(&_eventListenerOS);
440
            // there should be no OS events at this point
446
      }
447
    }
448
    // an OS event occurred
449
    if (eventmask & _eventListenerOS.events) {
450
      aosDbgPrintf("WARN: OS evt\n");
451
      // get the flags
452
      eventflags_t oseventflags = chEvtGetAndClearFlags(&_eventListenerOS);
453
      // there should be no OS events at this point
441 454
#ifdef MODULE_SSSP_STARTUP_3_OSEVENT_HOOK
442
            MODULE_SSSP_STARTUP_3_OSEVENT_HOOK(eventmask, eventflags);
455
      MODULE_SSSP_STARTUP_3_OSEVENT_HOOK(eventmask, eventflags);
443 456
#else
444
            _unexpectedEventError(eventmask, oseventflags);
457
      _unexpectedEventError(eventmask, oseventflags);
445 458
#endif
446
        }
447
        // if a CAN event occurred
448
        if ((eventmask & eventListenerCan.events)) {
449
            // fetch message
450
            if (flags.wfe) {
451
                canReceiveTimeout(&MODULE_HAL_CAN, CAN_ANY_MAILBOX, &canRxFrame, TIME_IMMEDIATE);
452
                aosDbgPrintf("CAN <- 0x%03X\n", canRxFrame.SID);
453
            }
454
            // identify and handle abort messgaes
455
            if (canRxFrame.SID == SSSP_STACKINIT_CANMSGID_ABORT) {
456
                stage = STAGE_3_4_ABORT;
457
            }
458
            // warn if a unexpected message was received
459
            else if ((canRxFrame.SID != SSSP_STACKINIT_CANMSGID_INIT) &&
460
                     (canRxFrame.SID != SSSP_STACKINIT_CANMSGID_MODULEID)) {
461
                aosDbgPrintf("WARN: unknown msg\n");
462
            }
463
            // any further pending messages are fetched at the end of the loop
464
        }
465
        // if a timeout event occurred
466
        if (eventmask & eventListenerTimeout.events) {
467
            // is handled at the end of the loop (or must be cleared by FSM)
468
        }
469
        // if a delay event occurred
470
        if (eventmask & eventListenerDelay.events) {
471
            // is handled by FSM
472
        }
459
    }
460
    // if a CAN event occurred
461
    if ((eventmask & eventListenerCan.events)) {
462
      aosDbgPrintf("CAN evt\n");
463
      // fetch message
464
      if (flags.wfe) {
465
        canReceiveTimeout(&MODULE_HAL_CAN, CAN_ANY_MAILBOX, &canRxFrame, TIME_IMMEDIATE);
466
        aosDbgPrintf("CAN <- 0x%03X\n", canRxFrame.SID);
467
      }
468
      // identify and handle abort messgaes
469
      if (canRxFrame.SID == SSSP_STACKINIT_CANMSGID_ABORT) {
470
        stage = STAGE_3_4_ABORT;
471
      }
472
      // warn if a unexpected message was received
473
      else if ((canRxFrame.SID != SSSP_STACKINIT_CANMSGID_INIT) &&
474
               (canRxFrame.SID != SSSP_STACKINIT_CANMSGID_MODULEID)) {
475
        aosDbgPrintf("WARN: unknown msg\n");
476
      }
477
      // any further pending messages are fetched at the end of the loop
478
    }
479
    // if a timeout event occurred
480
    if (eventmask & eventListenerTimeout.events) {
481
      aosDbgPrintf("timeout evt\n");
482
      // is handled at the end of the loop (or must be cleared by FSM)
483
    }
484
    // if a delay event occurred
485
    if (eventmask & eventListenerDelay.events) {
486
      aosDbgPrintf("delay evt\n");
487
      // is handled by FSM
488
    }
473 489

  
474
        /*
490
    /*
475 491
     * this is the actual FSM
476 492
     */
477
        switch (stage) {
478
        case STAGE_3_1:
479
        {
480
            aos.sssp.stage = AOS_SSSP_STARTUP_3_1;
493
    switch (stage) {
494
      case STAGE_3_1:
495
      {
496
        aos.sssp.stage = AOS_SSSP_STARTUP_3_1;
481 497

  
482
            // there was no event at all (skipped wfe)
483
            if (eventmask == 0 && flags.wfe == false) {
498
        // there was no event at all (skipped wfe)
499
        if (eventmask == 0 && flags.wfe == false) {
484 500
#if (AMIROOS_CFG_SSSP_MASTER == true)
485
                // initialize the stage by transmitting an according CAN message
486
                aosDbgPrintf("CAN -> init\n");
487
                canTxFrame.DLC = 0;
488
                canTxFrame.SID = SSSP_STACKINIT_CANMSGID_INIT;
489
                if (canTransmitTimeout(&MODULE_HAL_CAN, CAN_ANY_MAILBOX, &canTxFrame, TIME_IMMEDIATE) != MSG_OK) {
490
                    chEvtBroadcast(&eventSourceTimeout);
491
                    break;
492
                }
493
                // activate S
494
                aosDbgPrintf("S+\n");
495
                apalControlGpioSet(&moduleSsspGpioSync, APAL_GPIO_ON);
501
          // initialize the stage by transmitting an according CAN message
502
          aosDbgPrintf("CAN -> init\n");
503
          canTxFrame.DLC = 0;
504
          canTxFrame.SID = SSSP_STACKINIT_CANMSGID_INIT;
505
          if (canTransmitTimeout(&MODULE_HAL_CAN, CAN_ANY_MAILBOX, &canTxFrame, TIME_IMMEDIATE) != MSG_OK) {
506
            chEvtBroadcast(&eventSourceTimeout);
507
            break;
508
          }
509
          // activate S
510
          aosDbgPrintf("enabling S\n");
511
          apalControlGpioSet(&moduleSsspGpioSync, APAL_GPIO_ON);
496 512
#if (AMIROOS_CFG_SSSP_STACK_START == true)
497
                // proceed immediately
498
                stage = STAGE_3_2;
499
                flags.wfe_next = false;
513
          // proceed immediately
514
          stage = STAGE_3_2;
515
          flags.wfe_next = false;
500 516
#else
501
                // set the timeout timer
502
                chVTSet(&timerTimeout, chTimeUS2I(AOS_SYSTEM_SSSP_TIMEOUT), _ssspTimerCallback, &eventSourceTimeout);
503
                // proceed
504
                stage = STAGE_3_3_WAITFORFIRSTID;
517
          // set the timeout timer
518
          chVTSet(&timerTimeout, chTimeUS2I(AOS_SYSTEM_SSSP_TIMEOUT), _ssspTimerCallback, &eventSourceTimeout);
519
          // proceed
520
          stage = STAGE_3_3_WAITFORFIRSTID;
505 521
#endif
506 522
#else
507
                // set the timeout timer
508
                chVTSet(&timerTimeout, chTimeUS2I(AOS_SYSTEM_SSSP_TIMEOUT), _ssspTimerCallback, &eventSourceTimeout);
523
          // set the timeout timer
524
          chVTSet(&timerTimeout, chTimeUS2I(AOS_SYSTEM_SSSP_TIMEOUT), _ssspTimerCallback, &eventSourceTimeout);
509 525
#endif
510
            }
526
        }
511 527

  
512 528
#if (AMIROOS_CFG_SSSP_MASTER != true)
513
            // a CAN message was received
514
            else if (eventmask & eventListenerCan.events) {
515
                // if an initiation message was received
516
                if (canRxFrame.DLC == 0 &&
517
                        canRxFrame.RTR == CAN_RTR_DATA &&
518
                        canRxFrame.IDE == CAN_IDE_STD &&
519
                        canRxFrame.SID == SSSP_STACKINIT_CANMSGID_INIT) {
520
                    aosDbgPrintf("init msg\n");
521
                    // reset the timeout timer and clear pending flags
522
                    chVTReset(&timerTimeout);
523
                    chEvtWaitAnyTimeout(eventListenerTimeout.events, TIME_IMMEDIATE);
524
                    eventmask &= ~(eventListenerTimeout.events);
525
                    // activate S
526
                    aosDbgPrintf("S+\n");
527
                    apalControlGpioSet(&moduleSsspGpioSync, APAL_GPIO_ON);
529
        // a CAN message was received
530
        else if (eventmask & eventListenerCan.events) {
531
          // if an initiation message was received
532
          if (canRxFrame.DLC == 0 &&
533
              canRxFrame.RTR == CAN_RTR_DATA &&
534
              canRxFrame.IDE == CAN_IDE_STD &&
535
              canRxFrame.SID == SSSP_STACKINIT_CANMSGID_INIT) {
536
            aosDbgPrintf("init msg\n");
537
            // reset the timeout timer and clear pending flags
538
            chVTReset(&timerTimeout);
539
            chEvtWaitAnyTimeout(eventListenerTimeout.events, TIME_IMMEDIATE);
540
            eventmask &= ~(eventListenerTimeout.events);
541
            // activate S
542
            aosDbgPrintf("enabling S\n");
543
            apalControlGpioSet(&moduleSsspGpioSync, APAL_GPIO_ON);
528 544
#if (AMIROOS_CFG_SSSP_STACK_START == true)
529
                    // proceed
530
                    stage = STAGE_3_2;
531
                    flags.wfe_next = false;
545
            // proceed
546
            stage = STAGE_3_2;
547
            flags.wfe_next = false;
532 548
#else
533
                    // set the timeout timer
534
                    chVTSet(&timerTimeout, chTimeUS2I(AOS_SYSTEM_SSSP_TIMEOUT), _ssspTimerCallback, &eventSourceTimeout);
535
                    // proceed
536
                    stage = STAGE_3_3_WAITFORFIRSTID;
549
            // set the timeout timer
550
            chVTSet(&timerTimeout, chTimeUS2I(AOS_SYSTEM_SSSP_TIMEOUT), _ssspTimerCallback, &eventSourceTimeout);
551
            // proceed
552
            stage = STAGE_3_3_WAITFORFIRSTID;
537 553
#endif
538
                }
539
            }
554
          }
555
        }
540 556
#endif
541 557

  
542
            break;
543
        } /* end of STAGE_3_1 */
558
        break;
559
      } /* end of STAGE_3_1 */
544 560

  
545
        case STAGE_3_2:
546
        {
561
      case STAGE_3_2:
562
      {
547 563
#if (AMIROOS_CFG_SSSP_STACK_START == true)
548
            aos.sssp.stage = AOS_SSSP_STARTUP_3_2;
549

  
550
            // if this stage was just entered
551
            if (flags.wfe == false) {
552
                // set the module ID
553
                aos.sssp.moduleId = 1;
554
                // broadcast module ID
555
                aosDbgPrintf("CAN -> ID (%u)\n", aos.sssp.moduleId);
556
                canTxFrame.DLC = 4;
557
                canTxFrame.SID = SSSP_STACKINIT_CANMSGID_MODULEID;
558
                _serialize(canTxFrame.data8, aos.sssp.moduleId, 4);
559
                if (canTransmitTimeout(&MODULE_HAL_CAN, CAN_ANY_MAILBOX, &canTxFrame, TIME_IMMEDIATE) != MSG_OK) {
560
                    chEvtBroadcast(&eventSourceTimeout);
561
                    break;
562
                }
564
        aos.sssp.stage = AOS_SSSP_STARTUP_3_2;
565

  
566
        // if this stage was just entered
567
        if (flags.wfe == false) {
568
          // set the module ID
569
          aos.sssp.moduleId = 1;
570
          // broadcast module ID
571
          aosDbgPrintf("CAN -> ID (%u)\n", aos.sssp.moduleId);
572
          canTxFrame.DLC = 4;
573
          canTxFrame.SID = SSSP_STACKINIT_CANMSGID_MODULEID;
574
          _serialize(canTxFrame.data8, aos.sssp.moduleId, 4);
575
          if (canTransmitTimeout(&MODULE_HAL_CAN, CAN_ANY_MAILBOX, &canTxFrame, TIME_IMMEDIATE) != MSG_OK) {
576
            chEvtBroadcast(&eventSourceTimeout);
577
            break;
578
          }
563 579
#if (AMIROOS_CFG_SSSP_STACK_START != true) || (AMIROOS_CFG_DBG == true)
564
                lastid = aos.sssp.moduleId;
580
          lastid = aos.sssp.moduleId;
565 581
#endif
566 582
#if (AMIROOS_CFG_SSSP_STACK_END == true)
567
                // sequence is already over
568
                // deactivate S
569
                aosDbgPrintf("S-\n");
570
                apalControlGpioSet(&moduleSsspGpioSync, APAL_GPIO_OFF);
571
                // proceed
572
                stage = STAGE_3_3_WAITFORID;
583
          // sequence is already over
584
          // deactivate S
585
          aosDbgPrintf("disabling S\n");
586
          apalControlGpioSet(&moduleSsspGpioSync, APAL_GPIO_OFF);
587
          // proceed
588
          stage = STAGE_3_3_WAITFORID;
573 589
#else
574
                // set the delay timer so the UP signal is activated later
575
                chVTSet(&timerDelay, chTimeUS2I(AMIROOS_CFG_SSSP_SIGNALDELAY), _ssspTimerCallback, &eventSourceDelay);
590
          // set the delay timer so the UP signal is activated later
591
          chVTSet(&timerDelay, chTimeUS2I(AMIROOS_CFG_SSSP_SIGNALDELAY), _ssspTimerCallback, &eventSourceDelay);
576 592
#endif
577
            }
593
        }
578 594

  
579
            // if a delay event occurred
580
            if (eventmask & eventListenerDelay.events) {
581
                // activate UP
582
                aosDbgPrintf("UP+\n");
583
                apalControlGpioSet(&moduleSsspGpioUp, APAL_GPIO_ON);
584
                // deactivate S
585
                aosDbgPrintf("S-\n");
586
                apalControlGpioSet(&moduleSsspGpioSync, APAL_GPIO_OFF);
587
                // explicitely clear timeout event flag
588
                chEvtWaitAnyTimeout(eventListenerTimeout.events, TIME_IMMEDIATE);
589
                eventmask &= ~(eventListenerTimeout.events);
590
                // proceed
591
                stage = STAGE_3_3_WAITFORID;
592
            }
595
        // if a delay event occurred
596
        if (eventmask & eventListenerDelay.events) {
597
          // activate UP
598
          aosDbgPrintf("enabling UP\n");
599
          apalControlGpioSet(&moduleSsspGpioUp, APAL_GPIO_ON);
600
          // deactivate S
601
          aosDbgPrintf("disabling S\n");
602
          apalControlGpioSet(&moduleSsspGpioSync, APAL_GPIO_OFF);
603
          // explicitely clear timeout event flag
604
          chEvtWaitAnyTimeout(eventListenerTimeout.events, TIME_IMMEDIATE);
605
          eventmask &= ~(eventListenerTimeout.events);
606
          // proceed
607
          stage = STAGE_3_3_WAITFORID;
608
        }
593 609
#endif
594 610

  
595
            break;
596
        } /* end of STAGE_3_2 */
611
        break;
612
      } /* end of STAGE_3_2 */
597 613

  
598
        case STAGE_3_3_WAITFORFIRSTID:
599
        {
614
      case STAGE_3_3_WAITFORFIRSTID:
615
      {
600 616
#if (AMIROOS_CFG_SSSP_STACK_START != true)
601
            aos.sssp.stage = AOS_SSSP_STARTUP_3_3;
602

  
603
            // a CAN message was received
604
            if (eventmask & eventListenerCan.events) {
605
                // if an ID message was received
606
                if (canRxFrame.DLC == 4 &&
607
                        canRxFrame.RTR == CAN_RTR_DATA &&
608
                        canRxFrame.IDE == CAN_IDE_STD &&
609
                        canRxFrame.SID == SSSP_STACKINIT_CANMSGID_MODULEID) {
610
                    aosDbgPrintf("ID (%u)\n", (uint32_t)_deserialize(canRxFrame.data8, 4));
611
                    // validate received ID
612
                    if (lastid < _deserialize(canRxFrame.data8, 4)) {
613
                        // store received ID
614
                        lastid = _deserialize(canRxFrame.data8, 4);
615
                        // restart timeout timer
616
                        chVTSet(&timerTimeout, chTimeUS2I(AOS_SYSTEM_SSSP_TIMEOUT), _ssspTimerCallback, &eventSourceTimeout);
617
                        // proceed
618
                        stage = STAGE_3_3_WAITFORIDORSIG;
619
                    } else {
620
                        aosDbgPrintf("ERR: invalid ID\n");
621
                        // abort
622
                        stage = STAGE_3_4_ABORT_ACTIVE;
623
                        flags.wfe_next = false;
624
                    }
625
                    // explicitely clear timeout event flag
626
                    chEvtWaitAnyTimeout(eventListenerTimeout.events, TIME_IMMEDIATE);
627
                    eventmask &= ~(eventListenerTimeout.events);
628
                }
617
        aos.sssp.stage = AOS_SSSP_STARTUP_3_3;
618

  
619
        // a CAN message was received
620
        if (eventmask & eventListenerCan.events) {
621
          // if an ID message was received
622
          if (canRxFrame.DLC == 4 &&
623
              canRxFrame.RTR == CAN_RTR_DATA &&
624
              canRxFrame.IDE == CAN_IDE_STD &&
625
              canRxFrame.SID == SSSP_STACKINIT_CANMSGID_MODULEID) {
626
            aosDbgPrintf("ID (%u)\n", (uint32_t)_deserialize(canRxFrame.data8, 4));
627
            // validate received ID
628
            if (lastid < _deserialize(canRxFrame.data8, 4)) {
629
              // store received ID
630
              lastid = _deserialize(canRxFrame.data8, 4);
631
              // restart timeout timer
632
              chVTSet(&timerTimeout, chTimeUS2I(AOS_SYSTEM_SSSP_TIMEOUT), _ssspTimerCallback, &eventSourceTimeout);
633
              // proceed
634
              stage = STAGE_3_3_WAITFORIDORSIG;
635
            } else {
636
              aosDbgPrintf("ERR: invalid ID\n");
637
              // abort
638
              stage = STAGE_3_4_ABORT_ACTIVE;
639
              flags.wfe_next = false;
629 640
            }
641
            // explicitely clear timeout event flag
642
            chEvtWaitAnyTimeout(eventListenerTimeout.events, TIME_IMMEDIATE);
643
            eventmask &= ~(eventListenerTimeout.events);
644
          }
645
        }
630 646
#endif
631
            break;
632
        } /* end of STAGE_3_3_WAITFORFIRSTID */
647
        break;
648
      } /* end of STAGE_3_3_WAITFORFIRSTID */
633 649

  
634
        case STAGE_3_3_WAITFORIDORSIG:
635
        {
650
      case STAGE_3_3_WAITFORIDORSIG:
651
      {
636 652
#if (AMIROOS_CFG_SSSP_STACK_START != true)
637
            aos.sssp.stage = AOS_SSSP_STARTUP_3_3;
638

  
639
            // a CAN message was received
640
            if (eventmask & eventListenerCan.events) {
641
                // if an ID message was received
642
                if (canRxFrame.DLC == 4 &&
643
                        canRxFrame.RTR == CAN_RTR_DATA &&
644
                        canRxFrame.IDE == CAN_IDE_STD &&
645
                        canRxFrame.SID == SSSP_STACKINIT_CANMSGID_MODULEID) {
646
                    aosDbgPrintf("ID (%u)\n", (uint32_t)_deserialize(canRxFrame.data8, 4));
647
                    // validate received ID
648
                    if (lastid < _deserialize(canRxFrame.data8, 4)) {
649
                        // store received ID
650
                        lastid = _deserialize(canRxFrame.data8, 4);
651
                        // restart timeout timer
652
                        chVTSet(&timerTimeout, chTimeUS2I(AOS_SYSTEM_SSSP_TIMEOUT), _ssspTimerCallback, &eventSourceTimeout);
653
                    } else {
654
                        aosDbgPrintf("ERR: invalid ID\n");
655
                        // abort
656
                        stage = STAGE_3_4_ABORT_ACTIVE;
657
                        flags.wfe_next = false;
658
                    }
659
                    // explicitely clear timeout event flag
660
                    chEvtWaitAnyTimeout(eventListenerTimeout.events, TIME_IMMEDIATE);
661
                    eventmask &= ~(eventListenerTimeout.events);
662
                }
653
        aos.sssp.stage = AOS_SSSP_STARTUP_3_3;
654

  
655
        // a CAN message was received
656
        if (eventmask & eventListenerCan.events) {
657
          // if an ID message was received
658
          if (canRxFrame.DLC == 4 &&
659
              canRxFrame.RTR == CAN_RTR_DATA &&
660
              canRxFrame.IDE == CAN_IDE_STD &&
661
              canRxFrame.SID == SSSP_STACKINIT_CANMSGID_MODULEID) {
662
            aosDbgPrintf("ID (%u)\n", (uint32_t)_deserialize(canRxFrame.data8, 4));
663
            // validate received ID
664
            if (lastid < _deserialize(canRxFrame.data8, 4)) {
665
              // store received ID
666
              lastid = _deserialize(canRxFrame.data8, 4);
667
              // restart timeout timer
668
              chVTSet(&timerTimeout, chTimeUS2I(AOS_SYSTEM_SSSP_TIMEOUT), _ssspTimerCallback, &eventSourceTimeout);
669
            } else {
670
              aosDbgPrintf("ERR: invalid ID\n");
671
              // abort
672
              stage = STAGE_3_4_ABORT_ACTIVE;
673
              flags.wfe_next = false;
663 674
            }
675
            // explicitely clear timeout event flag
676
            chEvtWaitAnyTimeout(eventListenerTimeout.events, TIME_IMMEDIATE);
677
            eventmask &= ~(eventListenerTimeout.events);
678
          }
679
        }
664 680

  
665
            // if an IO event was received (DN signal)
666
            if ((eventmask & _eventListenerIO.events) && (ioflags & MODULE_SSSP_EVENTFLAGS_DN)) {
667
                aosDbgPrintf("DN <-\n");
668
                // reset timeout timer
669
                chVTReset(&timerTimeout);
670
                chEvtWaitAnyTimeout(eventListenerTimeout.events, TIME_IMMEDIATE);
671
                eventmask &= ~(eventListenerTimeout.events);
672
                // increment and broadcast ID
673
                aos.sssp.moduleId = lastid + 1;
674
                aosDbgPrintf("CAN -> ID (%u)\n", aos.sssp.moduleId);
675
                canTxFrame.DLC = 4;
676
                canTxFrame.SID = SSSP_STACKINIT_CANMSGID_MODULEID;
677
                _serialize(canTxFrame.data8, aos.sssp.moduleId, 4);
678
                if (canTransmitTimeout(&MODULE_HAL_CAN, CAN_ANY_MAILBOX, &canTxFrame, TIME_IMMEDIATE) != MSG_OK) {
679
                    chEvtBroadcast(&eventSourceTimeout);
680
                    break;
681
                }
682
                // set delay timer
683
                chVTSet(&timerDelay, chTimeUS2I(AMIROOS_CFG_SSSP_SIGNALDELAY), _ssspTimerCallback, &eventSourceDelay);
684
            }
681
        // if an IO event was received (DN signal)
682
        if ((eventmask & _eventListenerIO.events) && (ioflags & MODULE_SSSP_EVENTFLAGS_DN)) {
683
          aosDbgPrintf("DN evt\n");
684
          // reset timeout timer
685
          chVTReset(&timerTimeout);
686
          chEvtWaitAnyTimeout(eventListenerTimeout.events, TIME_IMMEDIATE);
687
          eventmask &= ~(eventListenerTimeout.events);
688
          // increment and broadcast ID
689
          aos.sssp.moduleId = lastid + 1;
690
          aosDbgPrintf("CAN -> ID (%u)\n", aos.sssp.moduleId);
691
          canTxFrame.DLC = 4;
692
          canTxFrame.SID = SSSP_STACKINIT_CANMSGID_MODULEID;
693
          _serialize(canTxFrame.data8, aos.sssp.moduleId, 4);
694
          if (canTransmitTimeout(&MODULE_HAL_CAN, CAN_ANY_MAILBOX, &canTxFrame, TIME_IMMEDIATE) != MSG_OK) {
695
            chEvtBroadcast(&eventSourceTimeout);
696
            break;
697
          }
698
          // set delay timer
699
          chVTSet(&timerDelay, chTimeUS2I(AMIROOS_CFG_SSSP_SIGNALDELAY), _ssspTimerCallback, &eventSourceDelay);
700
        }
685 701

  
686
            // if a delay event occurred
687
            if (eventmask & eventListenerDelay.events) {
702
        // if a delay event occurred
703
        if (eventmask & eventListenerDelay.events) {
688 704
#if (AMIROOS_CFG_SSSP_STACK_END != true)
689
                // activate UP
690
                aosDbgPrintf("UP+\n");
691
                apalControlGpioSet(&moduleSsspGpioUp, APAL_GPIO_ON);
692
#endif
693
                // deactivate S
694
                aosDbgPrintf("S-\n");
695
                apalControlGpioSet(&moduleSsspGpioSync, APAL_GPIO_OFF);
696
                // reset the timeout timer
697
                chVTSet(&timerTimeout, chTimeUS2I(AOS_SYSTEM_SSSP_TIMEOUT), _ssspTimerCallback, &eventSourceTimeout);
698
                chEvtWaitAnyTimeout(eventListenerTimeout.events, TIME_IMMEDIATE);
699
                eventmask &= ~(eventListenerTimeout.events);
700
                // proceed
701
                stage = STAGE_3_3_WAITFORID;
702
            }
705
          // activate UP
706
          aosDbgPrintf("enabling UP\n");
707
          apalControlGpioSet(&moduleSsspGpioUp, APAL_GPIO_ON);
708
#endif
709
          // deactivate S
710
          aosDbgPrintf("disabling S\n");
711
          apalControlGpioSet(&moduleSsspGpioSync, APAL_GPIO_OFF);
712
          // reset the timeout timer
713
          chVTSet(&timerTimeout, chTimeUS2I(AOS_SYSTEM_SSSP_TIMEOUT), _ssspTimerCallback, &eventSourceTimeout);
714
          chEvtWaitAnyTimeout(eventListenerTimeout.events, TIME_IMMEDIATE);
715
          eventmask &= ~(eventListenerTimeout.events);
716
          // proceed
717
          stage = STAGE_3_3_WAITFORID;
718
        }
703 719
#endif
704 720

  
705
            break;
706
        } /* end of STAGE_3_3_WAITFORIDORSIG */
721
        break;
722
      } /* end of STAGE_3_3_WAITFORIDORSIG */
707 723

  
708
        case STAGE_3_3_WAITFORID:
709
        {
710
            aos.sssp.stage = AOS_SSSP_STARTUP_3_3;
724
      case STAGE_3_3_WAITFORID:
725
      {
726
        aos.sssp.stage = AOS_SSSP_STARTUP_3_3;
711 727

  
712 728
#if (AMIROOS_CFG_SSSP_STACK_END != true)
713
            // a CAN message was received
714
            if (eventmask & eventListenerCan.events) {
715
                // if an ID message was received
716
                if (canRxFrame.DLC == 4 &&
717
                        canRxFrame.RTR == CAN_RTR_DATA &&
718
                        canRxFrame.IDE == CAN_IDE_STD &&
719
                        canRxFrame.SID == SSSP_STACKINIT_CANMSGID_MODULEID) {
729
        // a CAN message was received
730
        if (eventmask & eventListenerCan.events) {
731
          // if an ID message was received
732
          if (canRxFrame.DLC == 4 &&
733
              canRxFrame.RTR == CAN_RTR_DATA &&
734
              canRxFrame.IDE == CAN_IDE_STD &&
735
              canRxFrame.SID == SSSP_STACKINIT_CANMSGID_MODULEID) {
720 736
#if (AMIROOS_CFG_SSSP_STACK_START != true) || (AMIROOS_CFG_DBG == true)
721
                    // Plausibility of the received ID is not checked at this point but is done by other modules still in a previous stage.
722
                    lastid = _deserialize(canRxFrame.data8, 4);
723
                    aosDbgPrintf("ID (%u)\n", lastid);
724
#endif
725
                    // restart timeout timer
726
                    chVTSet(&timerTimeout, chTimeUS2I(AOS_SYSTEM_SSSP_TIMEOUT), _ssspTimerCallback, &eventSourceTimeout);
727
                    chEvtWaitAnyTimeout(eventListenerTimeout.events, TIME_IMMEDIATE);
728
                    eventmask &= ~(eventListenerTimeout.events);
729
                }
730
            }
737
            // Plausibility of the received ID is not checked at this point but is done by other modules still in a previous stage.
738
            lastid = _deserialize(canRxFrame.data8, 4);
739
            aosDbgPrintf("ID (%u)\n", lastid);
740
#endif
741
            // restart timeout timer
742
            chVTSet(&timerTimeout, chTimeUS2I(AOS_SYSTEM_SSSP_TIMEOUT), _ssspTimerCallback, &eventSourceTimeout);
743
            chEvtWaitAnyTimeout(eventListenerTimeout.events, TIME_IMMEDIATE);
744
            eventmask &= ~(eventListenerTimeout.events);
745
          }
746
        }
731 747
#endif
732 748

  
733
            break;
734
        } /* end of STAGE_3_3_WAITFORID */
735

  
736
        case STAGE_3_4_FINISH:
737
        {
738
            aos.sssp.stage = AOS_SSSP_STARTUP_3_4;
739

  
740
            // if an IO event was received (S signal)
741
            if ((eventmask & _eventListenerIO.events) && (ioflags & MODULE_SSSP_EVENTFLAGS_SYNC)) {
742
                // reset the timeout timer
743
                chVTReset(&timerTimeout);
744
                chEvtWaitAnyTimeout(eventListenerTimeout.events, TIME_IMMEDIATE);
745
                eventmask &= ~(eventListenerTimeout.events);
746
                //set the delay timer
747
                chVTSet(&timerDelay, chTimeUS2I(AOS_SYSTEM_SSSP_TIMEOUT), _ssspTimerCallback, &eventSourceDelay);
748
            }
749
        break;
750
      } /* end of STAGE_3_3_WAITFORID */
749 751

  
750
            // if a CAN event was received
751
            if (eventmask & eventListenerCan.events) {
752
                // if an abort message was received
753
                if (canRxFrame.SID == SSSP_STACKINIT_CANMSGID_ABORT) {
754
                    aosDbgPrintf("abort msg\n");
755
                    // reset the delay timer
756
                    chVTReset(&timerDelay);
757
                    chEvtWaitAnyTimeout(eventListenerDelay.events, TIME_IMMEDIATE);
758
                    eventmask &= ~(eventListenerDelay.events);
759
                    // proceed
760
                    stage = STAGE_3_4_ABORT;
761
                }
762
            }
752
      case STAGE_3_4_FINISH:
753
      {
754
        aos.sssp.stage = AOS_SSSP_STARTUP_3_4;
763 755

  
764
            // if a delay timer event occurred
765
            if (eventmask & eventListenerDelay.events) {
766
                aosDbgPrintf("sequence sucessful\n");
767
                // sequence finished sucessfully
768
                flags.loop = false;
769
            }
756
        // if an IO event was received (S signal)
757
        if ((eventmask & _eventListenerIO.events) && (ioflags & MODULE_SSSP_EVENTFLAGS_SYNC)) {
758
          // reset the timeout timer
759
          chVTReset(&timerTimeout);
760
          chEvtWaitAnyTimeout(eventListenerTimeout.events, TIME_IMMEDIATE);
761
          eventmask &= ~(eventListenerTimeout.events);
762
          //set the delay timer
763
          chVTSet(&timerDelay, chTimeUS2I(AOS_SYSTEM_SSSP_TIMEOUT), _ssspTimerCallback, &eventSourceDelay);
764
        }
770 765

  
771
            break;
772
        } /* end of STAGE_3_4_FINISH */
773

  
774
        case STAGE_3_4_ABORT_ACTIVE:
775
        {
776
            aos.sssp.stage = AOS_SSSP_STARTUP_3_4;
777

  
778
            // emit abort message
779
            canTxFrame.DLC = 0;
780
            canTxFrame.SID = SSSP_STACKINIT_CANMSGID_ABORT;
781
            canTransmitTimeout(&MODULE_HAL_CAN, CAN_ANY_MAILBOX, &canTxFrame, TIME_INFINITE);
782
            aosDbgPrintf("CAN -> abort\n");
783
            // clear timeout flag
784
            eventmask &= ~(eventListenerTimeout.events);
785
            // proceed immediately
766
        // if a CAN event was received
767
        if (eventmask & eventListenerCan.events) {
768
          // if an abort message was received
769
          if (canRxFrame.SID == SSSP_STACKINIT_CANMSGID_ABORT) {
770
            aosDbgPrintf("abort msg\n");
771
            // reset the delay timer
772
            chVTReset(&timerDelay);
773
            chEvtWaitAnyTimeout(eventListenerDelay.events, TIME_IMMEDIATE);
774
            eventmask &= ~(eventListenerDelay.events);
775
            // proceed
786 776
            stage = STAGE_3_4_ABORT;
787
            flags.wfe_next = false;
788
            break;
789
        } /* end of STAGE_3_4_ABORT_ACTIVE */
790

  
791
        case STAGE_3_4_ABORT:
792
        {
793
            aos.sssp.stage = AOS_SSSP_STARTUP_3_4;
794

  
795
            // deactivate S
796
            aosDbgPrintf("S-\n");
797
            apalControlGpioSet(&moduleSsspGpioSync, APAL_GPIO_OFF);
798
            // invalidate module ID
799
            aos.sssp.moduleId = 0;
800

  
801
            // if an IO event was received (S signal)
802
            if ((eventmask & _eventListenerIO.events) && (ioflags & MODULE_SSSP_EVENTFLAGS_SYNC)) {
803
                aosDbgPrintf("sequence aborted\n");
804
                // exit the sequence
805
                flags.loop = false;
806
            }
807

  
808
            break;
809
        } /* end of STAGE_3_4_ABORT */
777
          }
810 778
        }
811 779

  
812
        // fetch pending CAN message (if any)
813
        if ((eventmask & eventListenerCan.events) && (canReceiveTimeout(&MODULE_HAL_CAN, CAN_ANY_MAILBOX, &canRxFrame, TIME_IMMEDIATE) == MSG_OK)) {
814
            aosDbgPrintf("CAN <- 0x%03X\n", canRxFrame.SID);
815
            flags.wfe_next = false;
780
        // if a delay timer event occurred
781
        if (eventmask & eventListenerDelay.events) {
782
          aosDbgPrintf("sequence sucessful\n");
783
          // sequence finished sucessfully
784
          flags.loop = false;
816 785
        }
817 786

  
818
        // handle unhandled timeout events
819
        if (eventmask & eventListenerTimeout.events) {
820
            aosDbgPrintf("ERR: timeout evt\n");
821
            // abort
822
            flags.wfe_next = false;
823
            stage = STAGE_3_4_ABORT_ACTIVE;
787
        break;
788
      } /* end of STAGE_3_4_FINISH */
789

  
790
      case STAGE_3_4_ABORT_ACTIVE:
791
      {
792
        aos.sssp.stage = AOS_SSSP_STARTUP_3_4;
793

  
794
        // emit abort message
795
        canTxFrame.DLC = 0;
796
        canTxFrame.SID = SSSP_STACKINIT_CANMSGID_ABORT;
797
        canTransmitTimeout(&MODULE_HAL_CAN, CAN_ANY_MAILBOX, &canTxFrame, TIME_INFINITE);
798
        aosDbgPrintf("CAN -> abort\n");
799
        // clear timeout flag
800
        eventmask &= ~(eventListenerTimeout.events);
801
        // proceed immediately
802
        stage = STAGE_3_4_ABORT;
803
        flags.wfe_next = false;
804
        break;
805
      } /* end of STAGE_3_4_ABORT_ACTIVE */
806

  
807
      case STAGE_3_4_ABORT:
808
      {
809
        aos.sssp.stage = AOS_SSSP_STARTUP_3_4;
810

  
811
        // deactivate S
812
        aosDbgPrintf("disabling SYNC\n");
813
        apalControlGpioSet(&moduleSsspGpioSync, APAL_GPIO_OFF);
814
        // invalidate module ID
815
        aos.sssp.moduleId = 0;
816

  
817
        // if an IO event was received (S signal)
818
        if ((eventmask & _eventListenerIO.events) && (ioflags & MODULE_SSSP_EVENTFLAGS_SYNC)) {
819
          aosDbgPrintf("sequence aborted\n");
820
          // exit the sequence
821
          flags.loop = false;
824 822
        }
825 823

  
826
        // apply wfe value for next iteration
827
        flags.wfe = flags.wfe_next;
828
    } /* end of FSM loop */
829
    aosDbgPrintf("\n");
824
        break;
825
      } /* end of STAGE_3_4_ABORT */
826
    } /* end of switch(stage) */
830 827

  
831
    // unregister all events (timeout, delay, CAN receive)
832
    chEvtUnregister(&eventSourceTimeout, &eventListenerTimeout);
833
    chEvtUnregister(&eventSourceDelay, &eventListenerDelay);
834
    chEvtUnregister(&MODULE_HAL_CAN.rxfull_event, &eventListenerCan);
835
    // clear any pending events (timeout, delay, CAN receive)
836
    chEvtWaitAllTimeout(TIMEOUTEVENT_MASK | DELAYEVENT_MASK | CANEVENT_MASK, TIME_IMMEDIATE);
828
    // fetch pending CAN message (if any)
829
    if ((eventmask & eventListenerCan.events) && (canReceiveTimeout(&MODULE_HAL_CAN, CAN_ANY_MAILBOX, &canRxFrame, TIME_IMMEDIATE) == MSG_OK)) {
830
      aosDbgPrintf("CAN <- 0x%03X\n", canRxFrame.SID);
831
      flags.wfe_next = false;
832
    }
833

  
834
    // handle unhandled timeout events
835
    if (eventmask & eventListenerTimeout.events) {
836
      aosDbgPrintf("ERR: timeout evt\n");
837
      // abort
838
      flags.wfe_next = false;
839
      stage = STAGE_3_4_ABORT_ACTIVE;
840
    }
837 841

  
838
    // reset all control signals
842
    // apply wfe value for next iteration
843
    flags.wfe = flags.wfe_next;
844
  } /* end of FSM loop */
845

  
846
  // unregister all events (timeout, delay, CAN receive)
847
  chEvtUnregister(&eventSourceTimeout, &eventListenerTimeout);
848
  chEvtUnregister(&eventSourceDelay, &eventListenerDelay);
849
  chEvtUnregister(&MODULE_HAL_CAN.rxfull_event, &eventListenerCan);
850
  // clear any pending events (timeout, delay, CAN receive)
851
  chEvtWaitAllTimeout(TIMEOUTEVENT_MASK | DELAYEVENT_MASK | CANEVENT_MASK, TIME_IMMEDIATE);
852

  
853
  // reset all control signals
839 854
#if (AMIROOS_CFG_SSSP_STACK_END != true)
840
    apalControlGpioSet(&moduleSsspGpioUp, APAL_GPIO_OFF);
855
  aosDbgPrintf("disabling UP\n");
856
  apalControlGpioSet(&moduleSsspGpioUp, APAL_GPIO_OFF);
841 857
#endif
842
    apalControlGpioSet(&moduleSsspGpioSync, APAL_GPIO_OFF);
858
  aosDbgPrintf("disabling S\n");
859
  apalControlGpioSet(&moduleSsspGpioSync, APAL_GPIO_OFF);
860
  aosSysGetUptime(&uptime);
861
  aosDbgPrintf("done\t%04ums\n", (uint32_t)(uptime / MICROSECONDS_PER_MILLISECOND));
843 862

  
844
    return shutdown;
863
  return shutdown;
845 864
}
846
#endif
865
#endif /* AMIROOS_CFG_SSSP_ENABLE == true */
866

  
847 867
/**
848 868
 * @brief   Application entry point.
849 869
 */
850 870
int main(void)
851 871
{
852
    // local variables
853
    eventmask_t eventmask = 0;
854
    eventflags_t eventflags = 0;
855
    aos_shutdown_t shutdown = AOS_SHUTDOWN_NONE;
872
  // local variables
873
  eventmask_t eventmask = 0;
874
  eventflags_t eventflags = 0;
875
  eventflags_t ioeventflagsmask = AMIROOS_CFG_MAIN_LOOP_IOEVENT_MASK;
876
  aos_shutdown_t shutdown = AOS_SHUTDOWN_NONE;
856 877
#if defined(AMIROOS_CFG_MAIN_EXTRA_THREAD_VARIABLES)
857
    AMIROOS_CFG_MAIN_EXTRA_THREAD_VARIABLES
858
        #endif
859

  
860
            /*
861
           * ##########################################################################
862
           * # system initialization                                                  #
863
           * ##########################################################################
864
           */
865

  
866
        #if defined(AMIROOS_CFG_MAIN_INIT_HOOK_0)
867
        #if defined(AMIROOS_CFG_MAIN_INIT_HOOK_0_ARGS)
868
            AMIROOS_CFG_MAIN_INIT_HOOK_0(AMIROOS_CFG_MAIN_INIT_HOOK_0_ARGS);
878
  AMIROOS_CFG_MAIN_EXTRA_THREAD_VARIABLES
879
#endif
880

  
881
  /*
882
   * ##########################################################################
883
   * # system initialization                                                  #
884
   * ##########################################################################
885
   */
886

  
887
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_0)
888
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_0_ARGS)
889
  AMIROOS_CFG_MAIN_INIT_HOOK_0(AMIROOS_CFG_MAIN_INIT_HOOK_0_ARGS);
869 890
#else
870
            AMIROOS_CFG_MAIN_INIT_HOOK_0();
891
  AMIROOS_CFG_MAIN_INIT_HOOK_0();
871 892
#endif
872 893
#endif
873 894

  
874
    /* hardware, kernel, and operating system initialization */
875
    // ChibiOS/HAL and custom hal additions (if any)
876
    halInit();
895
  /* hardware, kernel, and operating system initialization */
896
  // ChibiOS/HAL and custom hal additions (if any)
897
  halInit();
877 898
#ifdef MODULE_INIT_HAL_EXTRA
878
    MODULE_INIT_HAL_EXTRA();
899
  MODULE_INIT_HAL_EXTRA();
879 900
#endif
880 901

  
881 902
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_1)
882 903
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_1_ARGS)
883
    AMIROOS_CFG_MAIN_INIT_HOOK_1(AMIROOS_CFG_MAIN_INIT_HOOK_1_ARGS);
904
  AMIROOS_CFG_MAIN_INIT_HOOK_1(AMIROOS_CFG_MAIN_INIT_HOOK_1_ARGS);
884 905
#else
885
    AMIROOS_CFG_MAIN_INIT_HOOK_1();
906
  AMIROOS_CFG_MAIN_INIT_HOOK_1();
886 907
#endif
887 908
#endif
888 909

  
889
    // ChibiOS/RT kernel and custom kernel additions (if any)
890
    chSysInit();
910
  // ChibiOS/RT kernel and custom kernel additions (if any)
911
  chSysInit();
891 912
#ifdef MODULE_INIT_KERNEL_EXTRA
892
    MODULE_INIT_KERNEL_EXTRA();
913
  MODULE_INIT_KERNEL_EXTRA();
893 914
#endif
894 915

  
895 916
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_2)
896 917
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_2_ARGS)
897
    AMIROOS_CFG_MAIN_INIT_HOOK_2(AMIROOS_CFG_MAIN_INIT_HOOK_2_ARGS);
918
  AMIROOS_CFG_MAIN_INIT_HOOK_2(AMIROOS_CFG_MAIN_INIT_HOOK_2_ARGS);
898 919
#else
899
    AMIROOS_CFG_MAIN_INIT_HOOK_2();
920
  AMIROOS_CFG_MAIN_INIT_HOOK_2();
900 921
#endif
901 922
#endif
902 923

  
903
    // AMiRo-OS and custom OS additions (if any)
924
  // AMiRo-OS and custom OS additions (if any)
904 925
#if (AMIROOS_CFG_SHELL_ENABLE == true)
905
    aosSysInit(moduleShellPrompt);
926
  aosSysInit(moduleShellPrompt);
906 927
#else
907
    aosSysInit();
928
  aosSysInit();
908 929
#endif
909 930
#ifdef MODULE_INIT_OS_EXTRA
910
    MODULE_INIT_OS_EXTRA();
931
  MODULE_INIT_OS_EXTRA();
911 932
#endif
912 933

  
913 934
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_3)
914 935
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_3_ARGS)
915
    AMIROOS_CFG_MAIN_INIT_HOOK_3(AMIROOS_CFG_MAIN_INIT_HOOK_3_ARGS);
936
  AMIROOS_CFG_MAIN_INIT_HOOK_3(AMIROOS_CFG_MAIN_INIT_HOOK_3_ARGS);
916 937
#else
917
    AMIROOS_CFG_MAIN_INIT_HOOK_3();
938
  AMIROOS_CFG_MAIN_INIT_HOOK_3();
918 939
#endif
919 940
#endif
920 941

  
921 942
#if (AMIROOS_CFG_TESTS_ENABLE == true)
922 943
#if defined(MODULE_INIT_TESTS)
923
    MODULE_INIT_TESTS();
944
  MODULE_INIT_TESTS();
924 945
#else
925
#warning "MODULE_INIT_TESTS not defined"
946
  #warning "MODULE_INIT_TESTS() not defined"
926 947
#endif
927 948
#endif
928 949

  
929 950
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_4)
930 951
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_4_ARGS)
931
    AMIROOS_CFG_MAIN_INIT_HOOK_4(AMIROOS_CFG_MAIN_INIT_HOOK_4_ARGS);
952
  AMIROOS_CFG_MAIN_INIT_HOOK_4(AMIROOS_CFG_MAIN_INIT_HOOK_4_ARGS);
932 953
#else
933
    AMIROOS_CFG_MAIN_INIT_HOOK_4();
954
  AMIROOS_CFG_MAIN_INIT_HOOK_4();
934 955
#endif
935 956
#endif
936 957

  
958
  /* event associations */
937 959
#if (AMIROOS_CFG_SSSP_ENABLE == true)
938
    /* event associations */
939
#if (AMIROOS_CFG_SSSP_STACK_START == true) && (AMIROOS_CFG_SSSP_STACK_END == true)
940
    chEvtRegisterMaskWithFlags(&aos.events.io, &_eventListenerIO, IOEVENT_MASK, MODULE_SSSP_EVENTFLAGS_PD | MODULE_SSSP_EVENTFLAGS_SYNC);
941
#elif (AMIROOS_CFG_SSSP_STACK_START == true)
942
    chEvtRegisterMaskWithFlags(&aos.events.io, &_eventListenerIO, IOEVENT_MASK, MODULE_SSSP_EVENTFLAGS_PD | MODULE_SSSP_EVENTFLAGS_SYNC | MODULE_SSSP_EVENTFLAGS_UP);
943
#elif (AMIROOS_CFG_SSSP_STACK_END == true)
944
    chEvtRegisterMaskWithFlags(&aos.events.io, &_eventListenerIO, IOEVENT_MASK, MODULE_SSSP_EVENTFLAGS_PD | MODULE_SSSP_EVENTFLAGS_SYNC | MODULE_SSSP_EVENTFLAGS_DN);
945
#else
946
    chEvtRegisterMaskWithFlags(&aos.events.io, &_eventListenerIO, IOEVENT_MASK, MODULE_SSSP_EVENTFLAGS_PD | MODULE_SSSP_EVENTFLAGS_SYNC | MODULE_SSSP_EVENTFLAGS_DN | MODULE_SSSP_EVENTFLAGS_UP);
960
  ioeventflagsmask |= MODULE_SSSP_EVENTFLAGS_PD | MODULE_SSSP_EVENTFLAGS_SYNC;
961
#if (AMIROOS_CFG_SSSP_STACK_START != true)
962
  ioeventflagsmask |= MODULE_SSSP_EVENTFLAGS_DN;
947 963
#endif
948
#endif // end of AMIROOS_CFG_SSSP_ENABLE condition
949
    chEvtRegisterMask(&aos.events.os, &_eventListenerOS, OSEVENT_MASK);
964
#if (AMIROOS_CFG_SSSP_STACK_END != true)
965
  ioeventflagsmask |= MODULE_SSSP_EVENTFLAGS_UP;
966
#endif
967
#endif /* AMIROOS_CFG_SSSP_ENABLE == true */
968
  if (ioeventflagsmask != 0) {
969
    chEvtRegisterMaskWithFlags(&aos.events.io, &_eventListenerIO, IOEVENT_MASK, ioeventflagsmask);
970
  }
971
  chEvtRegisterMask(&aos.events.os, &_eventListenerOS, OSEVENT_MASK);
950 972

  
951 973
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_5)
952 974
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_5_ARGS)
953
    AMIROOS_CFG_MAIN_INIT_HOOK_5(AMIROOS_CFG_MAIN_INIT_HOOK_5_ARGS);
975
  AMIROOS_CFG_MAIN_INIT_HOOK_5(AMIROOS_CFG_MAIN_INIT_HOOK_5_ARGS);
954 976
#else
955
    AMIROOS_CFG_MAIN_INIT_HOOK_5();
977
  AMIROOS_CFG_MAIN_INIT_HOOK_5();
956 978
#endif
957 979
#endif
958 980

  
959
    /* periphery communication initialization */
960
    // CAN (mandatory)
961
    canStart(&MODULE_HAL_CAN, &moduleHalCanConfig);
962

  
963
    // module specific initialization (if any)
981
  /* periphery communication initialization */
982
  // CAN (mandatory)
983
  canStart(&MODULE_HAL_CAN, &moduleHalCanConfig);
984
  // module specific initialization (if any)
964 985
#ifdef MODULE_INIT_PERIPHERY_COMM
965
    MODULE_INIT_PERIPHERY_COMM();
986
  MODULE_INIT_PERIPHERY_COMM();
966 987
#endif
967
    // user interface (if any)
988
  // user interface (if any)
968 989
#ifdef MODULE_HAL_PROGIF
969
    aosIOChannelInit(&_stdiochannel, (BaseAsynchronousChannel*)&MODULE_HAL_PROGIF);
970
    aosIOChannelOutputEnable(&_stdiochannel);
971
    aosIOStreamAddChannel(&aos.iostream, &_stdiochannel);
990
  aosIOChannelInit(&_stdiochannel, (BaseAsynchronousChannel*)&MODULE_HAL_PROGIF);
991
  aosIOChannelOutputEnable(&_stdiochannel);
992
  aosIOStreamAddChannel(&aos.iostream, &_stdiochannel);
972 993
#if (AMIROOS_CFG_SHELL_ENABLE == true)
973
    aosShellChannelInit(&_stdshellchannel, (BaseAsynchronousChannel*)&MODULE_HAL_PROGIF);
974
    aosShellChannelInputEnable(&_stdshellchannel);
975
    aosShellChannelOutputEnable(&_stdshellchannel);
976
    aosShellStreamAddChannel(&aos.shell.stream, &_stdshellchannel);
994
  aosShellChannelInit(&_stdshellchannel, (BaseAsynchronousChannel*)&MODULE_HAL_PROGIF);
995
  aosShellChannelInputEnable(&_stdshellchannel);
996
  aosShellChannelOutputEnable(&_stdshellchannel);
997
  aosShellStreamAddChannel(&aos.shell.stream, &_stdshellchannel);
977 998
#endif
978 999
#endif
979 1000

  
980 1001
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_6)
981 1002
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_6_ARGS)
982
    AMIROOS_CFG_MAIN_INIT_HOOK_6(AMIROOS_CFG_MAIN_INIT_HOOK_6_ARGS);
1003
  AMIROOS_CFG_MAIN_INIT_HOOK_6(AMIROOS_CFG_MAIN_INIT_HOOK_6_ARGS);
983 1004
#else
984
    AMIROOS_CFG_MAIN_INIT_HOOK_6();
985
#endif
986
#endif
987
    //  for (unsigned int hase = 0; hase < 10; ++hase) {
988
    //      //toggle LED
989
    //      palClearLine(LINE_LED_GREEN);
990
    //      chThdSleepMilliseconds(1500);
991
    //      palSetLine(LINE_LED_GREEN);
992
    //      chThdSleepMilliseconds(500);
993
    //  }
994
    //  chprintf((BaseSequentialStream*)&SD2, "Hallo Welt!\n");
995

  
996
    /* module is ready -> print welcome prompt */
997
    aosprintf("\n");
998
    aosprintf("######################################################################\n");
999
    aosprintf("# AMiRo-OS is an operating system designed for the Autonomous Mini   #\n");
1000
    aosprintf("# Robot (AMiRo) platform.                                            #\n");
1001
    aosprintf("# Copyright (C) 2016..2018  Thomas Schöpping et al.                  #\n");
1002
    aosprintf("#                                                                    #\n");
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff