Revision cda14729 core/src/aos_main.cpp

View differences:

core/src/aos_main.cpp
19 19
/**
20 20
 * @file    aos_main.cpp
21 21
 * @brief   Main function.
22
 * @details Main function with SSSP and initialization,
23
 *          extendable via hooks.
24 22
 *
25 23
 * @addtogroup aos_system
26 24
 * @{
......
40 38
/******************************************************************************/
41 39

  
42 40
/**
43
 * @brief   Event mask to identify I/O events.
41
 * @brief   Event mask to identify GPIO events.
44 42
 */
45
#define IOEVENT_MASK                            EVENT_MASK(0)
43
#define EVENTMASK_GPIO                          EVENT_MASK(0)
46 44

  
47 45
/**
48 46
 * @brief   Event mask to identify OS events.
49 47
 */
50
#define OSEVENT_MASK                            EVENT_MASK(1)
48
#define EVENTMASK_OS                            EVENT_MASK(1)
51 49

  
52
/**
53
 * @brief   Event mask to idetify CAN events.
54
 */
55
#define CANEVENT_MASK                           EVENT_MASK(2)
56

  
57
/**
58
 * @brief   Event mask to idetify timeout events.
59
 */
60
#define TIMEOUTEVENT_MASK                       EVENT_MASK(3)
61

  
62
/**
63
 * @brief   Event mask to idetify signal delay events.
64
 */
65
#define DELAYEVENT_MASK                         EVENT_MASK(4)
66

  
67
#if ((AMIROOS_CFG_SSSP_ENABLE == true) && (HAL_USE_CAN == TRUE)) || defined(__DOXYGEN__)
68
#define SSSP_STAGE3_ENABLE                      true
69
#else /* (AMIROOS_CFG_SSSP_ENABLE == true) && (HAL_USE_CAN == TRUE) */
70
#define SSSP_STAGE3_ENABLE                      false
71
#endif /* (AMIROOS_CFG_SSSP_ENABLE == true) && (HAL_USE_CAN == TRUE) */
72

  
73
#if (SSSP_STAGE3_ENABLE == true) || defined(__DOXYGEN__)
74

  
75
/**
76
 * @brief   CAN message identifier for initialization of the SSSP stack initialization sequence.
77
 */
78
#define SSSP_STACKINIT_CANMSGID_INIT            0x003
79

  
80
/**
81
 * @brief   CAN message identifier for transmitting module IDs during the SSSP stack initialization sequence.
82
 */
83
#define SSSP_STACKINIT_CANMSGID_MODULEID        0x002
50
#if (AMIROOS_CFG_SSSP_ENABLE == true) || defined(__DOXYGEN__)
84 51

  
85 52
/**
86
 * @brief   CAN message identifier for abortion of the SSSP stack initialization sequence.
53
 * @brief   Event mask to identify SSSP timer events.
87 54
 */
88
#define SSSP_STACKINIT_CANMSGID_ABORT           0x001
55
#define EVENTMASK_SSSPTIMER                     EVENT_MASK(2)
89 56

  
90
#endif /* (SSSP_STAGE3_ENABLE == true) */
91

  
92
#if (AMIROOS_CFG_SSSP_ENABLE != true) || defined(__DOXYGEN__)
93
/**
94
 * @brief   Default shutdown mode if SSSP is unavailable.
95
 */
96
#define AOS_SHUTDOWN_DEFAULT                    AOS_SHUTDOWN_DEEPSLEEP
97 57
#endif /* (AMIROOS_CFG_SSSP_ENABLE == true) */
98 58

  
99
#if (HAL_USE_CAN == TRUE) || defined(__DOXYGEN__)
100
/**
101
 * @brief   CAN message identifier for calender synchronization message.
102
 */
103
#define CALENDERSYNC_CANMSGID                   0x004
104
#endif /* (HAL_USE_CAN == TRUE) */
105

  
106 59
/******************************************************************************/
107 60
/* EXPORTED VARIABLES                                                         */
108 61
/******************************************************************************/
......
116 69
/******************************************************************************/
117 70

  
118 71
/**
119
 * @brief   Listener object for I/O events.
72
 * @brief   Listener object for GPIO events.
120 73
 */
121
static event_listener_t _eventListenerIO;
74
static event_listener_t _eventListenerGPIO;
122 75

  
123 76
/**
124 77
 * @brief   Listener object for OS events.
......
126 79
static event_listener_t _eventListenerOS;
127 80

  
128 81
#if defined(MODULE_HAL_PROGIF) || defined(__DOXYGEN__)
82

  
129 83
/**
130 84
 * @brief   I/O channel for the programmer interface.
131 85
 */
132 86
static AosIOChannel _stdiochannel;
133 87

  
134
#if (AMIROOS_CFG_SHELL_ENABLE == true) || (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
88
#endif /* (AMIROOS_CFG_SHELL_ENABLE == true) */
89

  
90
#if (AMIROOS_CFG_SHELL_ENABLE == true) || defined(__DOXYGEN__)
91

  
135 92
/**
136 93
 * @brief   I/O shell channel for the programmer interface.
137 94
 */
138 95
static AosShellChannel _stdshellchannel;
139
#endif /* (AMIROOS_CFG_SHELL_ENABLE == true) || (AMIROOS_CFG_TESTS_ENABLE == true)*/
96

  
140 97
#endif /* defined(MODULE_HAL_PROGIF) */
141 98

  
142 99
/*
......
167 124
  return;
168 125
}
169 126

  
170
#if (SSSP_STAGE3_ENABLE == true) || defined(__DOXYGEN__)
171
/**
172
 * @brief   Callback function to be used during SSSP stack initialization sequence.
173
 *
174
 * @param[in] par   A pointer to an @p event_source_t to be fired.
175
 */
176
static void _ssspTimerCallback(void* par)
177
{
178
  aosDbgCheck(par != NULL);
179

  
180
  chSysLockFromISR();
181
  chEvtBroadcastI((event_source_t*)par);
182
  chSysUnlockFromISR();
183

  
184
  return;
185
}
186
#endif /* (SSSP_STAGE3_ENABLE == true) */
187

  
188 127
/**
189 128
 * @brief   Helper function to serialize data.
190 129
 *
......
286 225

  
287 226
#endif /* (HAL_USE_RTC == TRUE) */
288 227

  
289
#if (SSSP_STAGE3_ENABLE) || defined(__DOXYGEN__)
290
/**
291
 * @brief   Implementation of the SSSP module stack initialization sequence (startup phase 3).
292
 *
293
 * @return Shutdown value.
294
 * @retval AOS_SHUTDOWN_NONE      No shutdown signal received
295
 * @retval AOS_SHUTDOWN_PASSIVE   Shutdown signal received.
296
 */
297
aos_shutdown_t _ssspModuleStackInitialization(void)
298
{
299
  // local types
300
  /**
301
   * @brief   States for the internal state machine to implement SSSP startup stage 3.
302
   */
303
  typedef enum {
304
    STAGE_3_1,                  /**< Initiation of SSSP startup stage 3. */
305
    STAGE_3_2,                  /**< Starting the sequence and broadcasting the first ID. */
306
    STAGE_3_3_WAITFORFIRSTID,   /**< Waiting for first ID after initiation. */
307
    STAGE_3_3_WAITFORIDORSIG,   /**< Waiting for next ID or activation of neighbor signal. */
308
    STAGE_3_3_WAITFORID,        /**< Waiting for next ID (after the module has set its own ID). */
309
    STAGE_3_4_FINISH,           /**< Successful finish of stage 3. */
310
    STAGE_3_4_ABORT_ACTIVE,     /**< Aborting stage 3 (active). */
311
    STAGE_3_4_ABORT,            /**< Aborting stage 3 (passive). */
312
  } sssp_modulestackinitstage_t;
313

  
314
  typedef struct {
315
    bool loop     : 1;
316
    bool wfe      : 1;
317
    bool wfe_next : 1;
318
  } flags_t;
319

  
320
  // local variables
321
  aos_shutdown_t shutdown = AOS_SHUTDOWN_NONE;
322
  sssp_modulestackinitstage_t stage = STAGE_3_1;
323
  eventmask_t eventmask = 0;
324
  eventflags_t ioflags = 0;
325
  event_source_t eventSourceTimeout;
326
  event_source_t eventSourceDelay;
327
  event_listener_t eventListenerTimeout;
328
  event_listener_t eventListenerDelay;
329
  event_listener_t eventListenerCan;
330
  virtual_timer_t timerTimeout;
331
  virtual_timer_t timerDelay;
332
  CANTxFrame canTxFrame;
333
  CANRxFrame canRxFrame;
334
#if (AMIROOS_CFG_SSSP_STACK_START != true) || (AMIROOS_CFG_DBG == true)
335
  aos_ssspmoduleid_t lastid = 0;
336
#endif /* (AMIROOS_CFG_SSSP_STACK_START != true) || (AMIROOS_CFG_DBG == true) */
337
  flags_t flags;
338
  aos_timestamp_t uptime;
339

  
340
  // initialize local varibles
341
  chEvtObjectInit(&eventSourceTimeout);
342
  chEvtObjectInit(&eventSourceDelay);
343
  chVTObjectInit(&timerTimeout);
344
  chVTObjectInit(&timerDelay);
345
  canTxFrame.RTR = CAN_RTR_DATA;
346
  canTxFrame.IDE = CAN_IDE_STD;
347
  flags.loop = true;
348
  flags.wfe = false; // do not wait for events in the initial iteration of the FSM loop
349
  flags.wfe_next = true;
350

  
351
  // initialize system variables
352
  aos.sssp.stage = AOS_SSSP_STARTUP_3_1;
353
  aos.sssp.moduleId = 0;
354

  
355
  // listen to events (timout, delay, CAN receive)
356
  chEvtRegisterMask(&eventSourceTimeout, &eventListenerTimeout, TIMEOUTEVENT_MASK);
357
  chEvtRegisterMask(&eventSourceDelay, &eventListenerDelay, DELAYEVENT_MASK);
358
  chEvtRegisterMask(&MODULE_HAL_CAN.rxfull_event, &eventListenerCan, CANEVENT_MASK);
359

  
360
  /*
361
   * FSM in a loop.
362
   *
363
   * This is a fully event-based FSM for the module stack initialization
364
   * sequence, defined by SSSP as startup stage 3. There are five different
365
   * events that can occur at this point:
366
   *  I/O events: The input level of an input pin has changed. Such events must
367
   *              be handled differently depending on the current state. Most
368
   *              of the time, however, such events can be ignored.
369
   *  OS events:  Such events are only available after this stage completed and
370
   *              thus should never occur. However, there is an optional hook
371
   *              to handle such events, nevertheless.
372
   *  CAN events: At least one CAN message was received. Note that this event
373
   *              will only fire again if all input buffers have been cleared.
374
   *  timeouts:   If some module does not support the sequence of there is any
375
   *              issue, such a case is detected via timeouts and must be
376
   *              handled accordingly (see abort state). In some cases, it is
377
   *              possible that a timeout event occurres 'simultaneously' with
378
   *              some other event. This can be caused by several timing issues
379
   *              and is a valid situation. As a result, any other events
380
   *              should be handled before the timeout event. If the other
381
   *              events are expected and valid, this implementation requires
382
   *              the timeout event flag to be cleared explicitely. Otherwise
383
   *              it is evaluated at the end of each iteration of the loop.
384
   *  delays:     Depending on the current state, delays are required by SSSP
385
   *              for timing of the sequential activation of signals.
386
   */
387
  aosDbgPrintf("SSSP stack initialization sequence:\n");
388
  while (flags.loop) {
389
#if (AMIROOS_CFG_DBG == true)
390
    switch (stage) {
391
      case STAGE_3_1:
392
        aosDbgPrintf(">>> 3-1\n");
393
        break;
394
      case STAGE_3_2:
395
        aosDbgPrintf(">>> 3-2\n");
396
        break;
397
      case STAGE_3_3_WAITFORFIRSTID:
398
        aosDbgPrintf(">>> 3-3 (1st ID)\n");
399
        break;
400
      case STAGE_3_3_WAITFORIDORSIG:
401
        aosDbgPrintf(">>> 3-3 (ID/sig)\n");
402
        break;
403
      case STAGE_3_3_WAITFORID:
404
        aosDbgPrintf(">>> 3-3 (ID)\n");
405
        break;
406
      case STAGE_3_4_FINISH:
407
        aosDbgPrintf(">>> 3-4 (finish)\n");
408
        break;
409
      case STAGE_3_4_ABORT_ACTIVE:
410
        aosDbgPrintf(">>> 3-4 (active abort)\n");
411
        break;
412
      case STAGE_3_4_ABORT:
413
        aosDbgPrintf(">>> 3-4 (abort)\n");
414
        break;
415
    }
416
#endif /* (AMIROOS_CFG_DBG == true) */
417

  
418
    // reset wfe flag for the next iteration
419
    flags.wfe_next = true;
420

  
421
    // waiting for events (may be skipped)
422
    if (flags.wfe) {
423
      // wait for any event to occur
424
      aosDbgPrintf("WFE...");
425
      eventmask = chEvtWaitAnyTimeout(ALL_EVENTS, chTimeUS2I(AOS_SYSTEM_SSSP_TIMEOUT));
426
      aosDbgPrintf("\t0x%08X", eventmask);
427
    } else {
428
      aosDbgPrintf("WFE skipped");
429
      eventmask = 0;
430
    }
431
    aosSysGetUptime(&uptime);
432
    aosDbgPrintf("\t%04ums\n", (uint32_t)(uptime / MICROSECONDS_PER_MILLISECOND));
433

  
434
    /*
435
     * execute some general tasks and high priority events
436
     */
437
    // no event occurred at all
438
    if ((flags.wfe) && (eventmask == 0)) {
439
      aosDbgPrintf("ERR: no evt\n");
440
      // enforce timeout event
441
      chEvtBroadcast(&eventSourceTimeout);
442
      continue;
443
    }
444
    // if an IO event occurred
445
    if (eventmask & _eventListenerIO.events) {
446
      ioflags = chEvtGetAndClearFlags(&_eventListenerIO);
447
      aosDbgPrintf("INFO: IO evt (0x%08X)\n", ioflags);
448
      // a power-down event occurred
449
      if (ioflags & MODULE_SSSP_EVENTFLAGS_PD) {
450
        aosDbgPrintf("PD evt\n");
451
        // deactivate S and UP
452
        aosDbgPrintf("disabling S\n");
453
        apalControlGpioSet(&moduleSsspGpioSync, APAL_GPIO_OFF);
454
#if (AMIROOS_CFG_SSSP_STACK_END != true)
455
        aosDbgPrintf("disabling UP\n");
456
        apalControlGpioSet(&moduleSsspGpioUp, APAL_GPIO_OFF);
457
#endif /* (AMIROOS_CFG_SSSP_STACK_END != true) */
458
        // set shutdown flag and exit the loop
459
        shutdown = AOS_SHUTDOWN_PASSIVE;
460
        break;
461
      }
462
      // the S signal was deactivated
463
      if (ioflags & MODULE_SSSP_EVENTFLAGS_SYNC) {
464
        apalControlGpioState_t sstate;
465
        apalControlGpioGet(&moduleSsspGpioSync, &sstate);
466
        if (sstate == APAL_GPIO_ON) {
467
          aosDbgPrintf("S evt (enabled)\n");
468
        } else {
469
          aosDbgPrintf("S evt (disabled)\n");
470
          // either finish or abort
471
          if ((stage == STAGE_3_3_WAITFORID) && (aos.sssp.moduleId != 0)) {
472
            stage = STAGE_3_4_FINISH;
473
          } else if (stage != STAGE_3_4_ABORT) {
474
            stage = STAGE_3_4_ABORT_ACTIVE;
475
          }
476
        }
477
      }
478
    }
479
    // an OS event occurred
480
    if (eventmask & _eventListenerOS.events) {
481
      aosDbgPrintf("WARN: OS evt\n");
482
      // get the flags
483
      eventflags_t oseventflags = chEvtGetAndClearFlags(&_eventListenerOS);
484
      // there should be no OS events at this point
485
#if defined(MODULE_SSSP_STARTUP_3_OSEVENT_HOOK)
486
      MODULE_SSSP_STARTUP_3_OSEVENT_HOOK(eventmask, eventflags);
487
#else /* defined(MODULE_SSSP_STARTUP_3_OSEVENT_HOOK) */
488
      _unexpectedEventError(eventmask, oseventflags);
489
#endif /* defined(MODULE_SSSP_STARTUP_3_OSEVENT_HOOK) */
490
    }
491
    // if a CAN event occurred
492
    if ((eventmask & eventListenerCan.events)) {
493
      aosDbgPrintf("CAN evt\n");
494
      // fetch message
495
      if (flags.wfe) {
496
        canReceiveTimeout(&MODULE_HAL_CAN, CAN_ANY_MAILBOX, &canRxFrame, TIME_IMMEDIATE);
497
        aosDbgPrintf("CAN <- 0x%03X\n", canRxFrame.SID);
498
      }
499
      // identify and handle abort messgaes
500
      if (canRxFrame.SID == SSSP_STACKINIT_CANMSGID_ABORT) {
501
        stage = STAGE_3_4_ABORT;
502
      }
503
      // warn if a unexpected message was received
504
      else if ((canRxFrame.SID != SSSP_STACKINIT_CANMSGID_INIT) &&
505
               (canRxFrame.SID != SSSP_STACKINIT_CANMSGID_MODULEID)) {
506
        aosDbgPrintf("WARN: unknown msg\n");
507
      }
508
      // any further pending messages are fetched at the end of the loop
509
    }
510
    // if a timeout event occurred
511
    if (eventmask & eventListenerTimeout.events) {
512
      aosDbgPrintf("timeout evt\n");
513
      // is handled at the end of the loop (or must be cleared by FSM)
514
    }
515
    // if a delay event occurred
516
    if (eventmask & eventListenerDelay.events) {
517
      aosDbgPrintf("delay evt\n");
518
      // is handled by FSM
519
    }
520

  
521
    /*
522
     * this is the actual FSM
523
     */
524
    switch (stage) {
525
      case STAGE_3_1:
526
      {
527
        aos.sssp.stage = AOS_SSSP_STARTUP_3_1;
528

  
529
        // there was no event at all (skipped wfe)
530
        if (eventmask == 0 && flags.wfe == false) {
531
#if (AMIROOS_CFG_SSSP_MASTER == true)
532
          // initialize the stage by transmitting an according CAN message
533
          aosDbgPrintf("CAN -> init\n");
534
          canTxFrame.DLC = 0;
535
          canTxFrame.SID = SSSP_STACKINIT_CANMSGID_INIT;
536
          if (canTransmitTimeout(&MODULE_HAL_CAN, CAN_ANY_MAILBOX, &canTxFrame, TIME_IMMEDIATE) != MSG_OK) {
537
            chEvtBroadcast(&eventSourceTimeout);
538
            break;
539
          }
540
          // activate S
541
          aosDbgPrintf("enabling S\n");
542
          apalControlGpioSet(&moduleSsspGpioSync, APAL_GPIO_ON);
543
#if (AMIROOS_CFG_SSSP_STACK_START == true)
544
          // proceed immediately
545
          stage = STAGE_3_2;
546
          flags.wfe_next = false;
547
#else /* (AMIROOS_CFG_SSSP_STACK_START == true) */
548
          // set the timeout timer
549
          chVTSet(&timerTimeout, chTimeUS2I(AOS_SYSTEM_SSSP_TIMEOUT), _ssspTimerCallback, &eventSourceTimeout);
550
          // proceed
551
          stage = STAGE_3_3_WAITFORFIRSTID;
552
#endif /* (AMIROOS_CFG_SSSP_STACK_START == true) */
553
#else /* (AMIROOS_CFG_SSSP_MASTER == true) */
554
          // set the timeout timer
555
          chVTSet(&timerTimeout, chTimeUS2I(AOS_SYSTEM_SSSP_TIMEOUT), _ssspTimerCallback, &eventSourceTimeout);
556
#endif /* (AMIROOS_CFG_SSSP_MASTER == true) */
557
        }
558

  
559
#if (AMIROOS_CFG_SSSP_MASTER != true)
560
        // a CAN message was received
561
        else if (eventmask & eventListenerCan.events) {
562
          // if an initiation message was received
563
          if (canRxFrame.DLC == 0 &&
564
              canRxFrame.RTR == CAN_RTR_DATA &&
565
              canRxFrame.IDE == CAN_IDE_STD &&
566
              canRxFrame.SID == SSSP_STACKINIT_CANMSGID_INIT) {
567
            aosDbgPrintf("init msg\n");
568
            // reset the timeout timer and clear pending flags
569
            chVTReset(&timerTimeout);
570
            chEvtWaitAnyTimeout(eventListenerTimeout.events, TIME_IMMEDIATE);
571
            eventmask &= ~(eventListenerTimeout.events);
572
            // activate S
573
            aosDbgPrintf("enabling S\n");
574
            apalControlGpioSet(&moduleSsspGpioSync, APAL_GPIO_ON);
575
#if (AMIROOS_CFG_SSSP_STACK_START == true)
576
            // proceed
577
            stage = STAGE_3_2;
578
            flags.wfe_next = false;
579
#else /* (AMIROOS_CFG_SSSP_STACK_START == true) */
580
            // set the timeout timer
581
            chVTSet(&timerTimeout, chTimeUS2I(AOS_SYSTEM_SSSP_TIMEOUT), _ssspTimerCallback, &eventSourceTimeout);
582
            // proceed
583
            stage = STAGE_3_3_WAITFORFIRSTID;
584
#endif /* (AMIROOS_CFG_SSSP_STACK_START == true) */
585
          }
586
        }
587
#endif /* (AMIROOS_CFG_SSSP_MASTER != true) */
588

  
589
        break;
590
      } /* end of STAGE_3_1 */
591

  
592
      case STAGE_3_2:
593
      {
594
#if (AMIROOS_CFG_SSSP_STACK_START == true)
595
        aos.sssp.stage = AOS_SSSP_STARTUP_3_2;
596

  
597
        // if this stage was just entered
598
        if (flags.wfe == false) {
599
          // set the module ID
600
          aos.sssp.moduleId = 1;
601
          // broadcast module ID
602
          aosDbgPrintf("CAN -> ID (%u)\n", aos.sssp.moduleId);
603
          canTxFrame.DLC = 4;
604
          canTxFrame.SID = SSSP_STACKINIT_CANMSGID_MODULEID;
605
          _serialize(canTxFrame.data8, aos.sssp.moduleId, 4);
606
          if (canTransmitTimeout(&MODULE_HAL_CAN, CAN_ANY_MAILBOX, &canTxFrame, TIME_IMMEDIATE) != MSG_OK) {
607
            chEvtBroadcast(&eventSourceTimeout);
608
            break;
609
          }
610
#if (AMIROOS_CFG_DBG == true)
611
          lastid = aos.sssp.moduleId;
612
#endif /* (AMIROOS_CFG_DBG == true) */
613
#if (AMIROOS_CFG_SSSP_STACK_END == true)
614
          // sequence is already over
615
          // deactivate S
616
          aosDbgPrintf("disabling S\n");
617
          apalControlGpioSet(&moduleSsspGpioSync, APAL_GPIO_OFF);
618
          // proceed
619
          stage = STAGE_3_3_WAITFORID;
620
#else /* (AMIROOS_CFG_SSSP_STACK_END == true) */
621
          // set the delay timer so the UP signal is activated later
622
          chVTSet(&timerDelay, chTimeUS2I(AMIROOS_CFG_SSSP_SIGNALDELAY), _ssspTimerCallback, &eventSourceDelay);
623
#endif /* (AMIROOS_CFG_SSSP_STACK_END == true) */
624
        }
625

  
626
        // if a delay event occurred
627
        if (eventmask & eventListenerDelay.events) {
628
          // activate UP
629
          aosDbgPrintf("enabling UP\n");
630
          apalControlGpioSet(&moduleSsspGpioUp, APAL_GPIO_ON);
631
          // deactivate S
632
          aosDbgPrintf("disabling S\n");
633
          apalControlGpioSet(&moduleSsspGpioSync, APAL_GPIO_OFF);
634
          // explicitely clear timeout event flag
635
          chEvtWaitAnyTimeout(eventListenerTimeout.events, TIME_IMMEDIATE);
636
          eventmask &= ~(eventListenerTimeout.events);
637
          // proceed
638
          stage = STAGE_3_3_WAITFORID;
639
        }
640
#endif /* (AMIROOS_CFG_SSSP_STACK_START == true) */
641

  
642
        break;
643
      } /* end of STAGE_3_2 */
644

  
645
      case STAGE_3_3_WAITFORFIRSTID:
646
      {
647
#if (AMIROOS_CFG_SSSP_STACK_START != true)
648
        aos.sssp.stage = AOS_SSSP_STARTUP_3_3;
649

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

  
681
      case STAGE_3_3_WAITFORIDORSIG:
682
      {
683
#if (AMIROOS_CFG_SSSP_STACK_START != true)
684
        aos.sssp.stage = AOS_SSSP_STARTUP_3_3;
685

  
686
        // a CAN message was received
687
        if (eventmask & eventListenerCan.events) {
688
          // if an ID message was received
689
          if (canRxFrame.DLC == 4 &&
690
              canRxFrame.RTR == CAN_RTR_DATA &&
691
              canRxFrame.IDE == CAN_IDE_STD &&
692
              canRxFrame.SID == SSSP_STACKINIT_CANMSGID_MODULEID) {
693
            aosDbgPrintf("ID (%u)\n", (uint32_t)_deserialize(canRxFrame.data8, 4));
694
            // validate received ID
695
            if (lastid < _deserialize(canRxFrame.data8, 4)) {
696
              // store received ID
697
              lastid = _deserialize(canRxFrame.data8, 4);
698
              // restart timeout timer
699
              chVTSet(&timerTimeout, chTimeUS2I(AOS_SYSTEM_SSSP_TIMEOUT), _ssspTimerCallback, &eventSourceTimeout);
700
            } else {
701
              aosDbgPrintf("ERR: invalid ID\n");
702
              // abort
703
              stage = STAGE_3_4_ABORT_ACTIVE;
704
              flags.wfe_next = false;
705
            }
706
            // explicitely clear timeout event flag
707
            chEvtWaitAnyTimeout(eventListenerTimeout.events, TIME_IMMEDIATE);
708
            eventmask &= ~(eventListenerTimeout.events);
709
          }
710
        }
711

  
712
        // if an IO event was received (DN signal)
713
        if ((eventmask & _eventListenerIO.events) && (ioflags & MODULE_SSSP_EVENTFLAGS_DN)) {
714
          aosDbgPrintf("DN evt\n");
715
          // reset timeout timer
716
          chVTReset(&timerTimeout);
717
          chEvtWaitAnyTimeout(eventListenerTimeout.events, TIME_IMMEDIATE);
718
          eventmask &= ~(eventListenerTimeout.events);
719
          // increment and broadcast ID
720
          aos.sssp.moduleId = lastid + 1;
721
          aosDbgPrintf("CAN -> ID (%u)\n", aos.sssp.moduleId);
722
          canTxFrame.DLC = 4;
723
          canTxFrame.SID = SSSP_STACKINIT_CANMSGID_MODULEID;
724
          _serialize(canTxFrame.data8, aos.sssp.moduleId, 4);
725
          if (canTransmitTimeout(&MODULE_HAL_CAN, CAN_ANY_MAILBOX, &canTxFrame, TIME_IMMEDIATE) != MSG_OK) {
726
            chEvtBroadcast(&eventSourceTimeout);
727
            break;
728
          }
729
          // set delay timer
730
          chVTSet(&timerDelay, chTimeUS2I(AMIROOS_CFG_SSSP_SIGNALDELAY), _ssspTimerCallback, &eventSourceDelay);
731
        }
732

  
733
        // if a delay event occurred
734
        if (eventmask & eventListenerDelay.events) {
735
#if (AMIROOS_CFG_SSSP_STACK_END != true)
736
          // activate UP
737
          aosDbgPrintf("enabling UP\n");
738
          apalControlGpioSet(&moduleSsspGpioUp, APAL_GPIO_ON);
739
#endif /* (AMIROOS_CFG_SSSP_STACK_END != true) */
740
          // deactivate S
741
          aosDbgPrintf("disabling S\n");
742
          apalControlGpioSet(&moduleSsspGpioSync, APAL_GPIO_OFF);
743
          // reset the timeout timer
744
          chVTSet(&timerTimeout, chTimeUS2I(AOS_SYSTEM_SSSP_TIMEOUT), _ssspTimerCallback, &eventSourceTimeout);
745
          chEvtWaitAnyTimeout(eventListenerTimeout.events, TIME_IMMEDIATE);
746
          eventmask &= ~(eventListenerTimeout.events);
747
          // proceed
748
          stage = STAGE_3_3_WAITFORID;
749
        }
750
#endif /* (AMIROOS_CFG_SSSP_STACK_START != true) */
751

  
752
        break;
753
      } /* end of STAGE_3_3_WAITFORIDORSIG */
754

  
755
      case STAGE_3_3_WAITFORID:
756
      {
757
        aos.sssp.stage = AOS_SSSP_STARTUP_3_3;
758

  
759
#if (AMIROOS_CFG_SSSP_STACK_END != true)
760
        // a CAN message was received
761
        if (eventmask & eventListenerCan.events) {
762
          // if an ID message was received
763
          if (canRxFrame.DLC == 4 &&
764
              canRxFrame.RTR == CAN_RTR_DATA &&
765
              canRxFrame.IDE == CAN_IDE_STD &&
766
              canRxFrame.SID == SSSP_STACKINIT_CANMSGID_MODULEID) {
767
#if (AMIROOS_CFG_SSSP_STACK_START != true) || (AMIROOS_CFG_DBG == true)
768
            // Plausibility of the received ID is not checked at this point but is done by other modules still in a previous stage.
769
            lastid = _deserialize(canRxFrame.data8, 4);
770
            aosDbgPrintf("ID (%u)\n", lastid);
771
#endif /* (AMIROOS_CFG_SSSP_STACK_START != true) || (AMIROOS_CFG_DBG == true) */
772
            // restart timeout timer
773
            chVTSet(&timerTimeout, chTimeUS2I(AOS_SYSTEM_SSSP_TIMEOUT), _ssspTimerCallback, &eventSourceTimeout);
774
            chEvtWaitAnyTimeout(eventListenerTimeout.events, TIME_IMMEDIATE);
775
            eventmask &= ~(eventListenerTimeout.events);
776
          }
777
        }
778
#endif /* (AMIROOS_CFG_SSSP_STACK_END != true) */
779

  
780
        break;
781
      } /* end of STAGE_3_3_WAITFORID */
782

  
783
      case STAGE_3_4_FINISH:
784
      {
785
        aos.sssp.stage = AOS_SSSP_STARTUP_3_4;
786

  
787
        // if an IO event was received (S signal)
788
        if ((eventmask & _eventListenerIO.events) && (ioflags & MODULE_SSSP_EVENTFLAGS_SYNC)) {
789
          // reset the timeout timer
790
          chVTReset(&timerTimeout);
791
          chEvtWaitAnyTimeout(eventListenerTimeout.events, TIME_IMMEDIATE);
792
          eventmask &= ~(eventListenerTimeout.events);
793
          //set the delay timer
794
          chVTSet(&timerDelay, chTimeUS2I(AOS_SYSTEM_SSSP_TIMEOUT), _ssspTimerCallback, &eventSourceDelay);
795
        }
796

  
797
        // if a CAN event was received
798
        if (eventmask & eventListenerCan.events) {
799
          // if an abort message was received
800
          if (canRxFrame.SID == SSSP_STACKINIT_CANMSGID_ABORT) {
801
            aosDbgPrintf("abort msg\n");
802
            // reset the delay timer
803
            chVTReset(&timerDelay);
804
            chEvtWaitAnyTimeout(eventListenerDelay.events, TIME_IMMEDIATE);
805
            eventmask &= ~(eventListenerDelay.events);
806
            // proceed
807
            stage = STAGE_3_4_ABORT;
808
          }
809
        }
810

  
811
        // if a delay timer event occurred
812
        if (eventmask & eventListenerDelay.events) {
813
          aosDbgPrintf("sequence sucessful\n");
814
          // sequence finished sucessfully
815
          flags.loop = false;
816
        }
817

  
818
        break;
819
      } /* end of STAGE_3_4_FINISH */
820

  
821
      case STAGE_3_4_ABORT_ACTIVE:
822
      {
823
        aos.sssp.stage = AOS_SSSP_STARTUP_3_4;
824

  
825
        // emit abort message
826
        canTxFrame.DLC = 0;
827
        canTxFrame.SID = SSSP_STACKINIT_CANMSGID_ABORT;
828
        canTransmitTimeout(&MODULE_HAL_CAN, CAN_ANY_MAILBOX, &canTxFrame, TIME_INFINITE);
829
        aosDbgPrintf("CAN -> abort\n");
830
        // clear timeout flag
831
        eventmask &= ~(eventListenerTimeout.events);
832
        // proceed immediately
833
        stage = STAGE_3_4_ABORT;
834
        flags.wfe_next = false;
835
        break;
836
      } /* end of STAGE_3_4_ABORT_ACTIVE */
837

  
838
      case STAGE_3_4_ABORT:
839
      {
840
        aos.sssp.stage = AOS_SSSP_STARTUP_3_4;
841

  
842
        // deactivate S
843
        aosDbgPrintf("disabling SYNC\n");
844
        apalControlGpioSet(&moduleSsspGpioSync, APAL_GPIO_OFF);
845
        // invalidate module ID
846
        aos.sssp.moduleId = 0;
847

  
848
        // if an IO event was received (S signal)
849
        if ((eventmask & _eventListenerIO.events) && (ioflags & MODULE_SSSP_EVENTFLAGS_SYNC)) {
850
          aosDbgPrintf("sequence aborted\n");
851
          // exit the sequence
852
          flags.loop = false;
853
        }
854

  
855
        break;
856
      } /* end of STAGE_3_4_ABORT */
857
    } /* end of switch(stage) */
858

  
859
    // fetch pending CAN message (if any)
860
    if ((eventmask & eventListenerCan.events) && (canReceiveTimeout(&MODULE_HAL_CAN, CAN_ANY_MAILBOX, &canRxFrame, TIME_IMMEDIATE) == MSG_OK)) {
861
      aosDbgPrintf("CAN <- 0x%03X\n", canRxFrame.SID);
862
      flags.wfe_next = false;
863
    }
864

  
865
    // handle unhandled timeout events
866
    if (eventmask & eventListenerTimeout.events) {
867
      aosDbgPrintf("ERR: timeout evt\n");
868
      // abort
869
      flags.wfe_next = false;
870
      stage = STAGE_3_4_ABORT_ACTIVE;
871
    }
872

  
873
    // apply wfe value for next iteration
874
    flags.wfe = flags.wfe_next;
875
  } /* end of FSM loop */
876

  
877
  // unregister all events (timeout, delay, CAN receive)
878
  chEvtUnregister(&eventSourceTimeout, &eventListenerTimeout);
879
  chEvtUnregister(&eventSourceDelay, &eventListenerDelay);
880
  chEvtUnregister(&MODULE_HAL_CAN.rxfull_event, &eventListenerCan);
881
  // clear any pending events (timeout, delay, CAN receive)
882
  chEvtWaitAllTimeout(TIMEOUTEVENT_MASK | DELAYEVENT_MASK | CANEVENT_MASK, TIME_IMMEDIATE);
883

  
884
  // reset all control signals
885
#if (AMIROOS_CFG_SSSP_STACK_END != true)
886
  aosDbgPrintf("disabling UP\n");
887
  apalControlGpioSet(&moduleSsspGpioUp, APAL_GPIO_OFF);
888
#endif /* (AMIROOS_CFG_SSSP_STACK_END != true) */
889
  aosDbgPrintf("disabling S\n");
890
  apalControlGpioSet(&moduleSsspGpioSync, APAL_GPIO_OFF);
891
  aosSysGetUptime(&uptime);
892
  aosDbgPrintf("done\t%04ums\n", (uint32_t)(uptime / MICROSECONDS_PER_MILLISECOND));
893

  
894
  return shutdown;
895
}
896
#endif /* (SSSP_STAGE3_ENABLE == true) */
897

  
898 228
/**
899 229
 * @brief   Application entry point.
900 230
 */
......
903 233
  // local variables
904 234
  eventmask_t eventmask = 0;
905 235
  eventflags_t eventflags = 0;
906
  eventflags_t ioeventflagsmask = AMIROOS_CFG_MAIN_LOOP_IOEVENT_MASK;
907 236
  aos_shutdown_t shutdown = AOS_SHUTDOWN_NONE;
908 237
#if defined(AMIROOS_CFG_MAIN_EXTRA_THREAD_VARIABLES)
909 238
  AMIROOS_CFG_MAIN_EXTRA_THREAD_VARIABLES
......
915 244
   * ##########################################################################
916 245
   */
917 246

  
918
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_0)
919
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_0_ARGS)
920
  AMIROOS_CFG_MAIN_INIT_HOOK_0(AMIROOS_CFG_MAIN_INIT_HOOK_0_ARGS);
921
#else /* defined(AMIROOS_CFG_MAIN_INIT_HOOK_0_ARGS) */
922
  AMIROOS_CFG_MAIN_INIT_HOOK_0();
923
#endif /* defined(AMIROOS_CFG_MAIN_INIT_HOOK_0_ARGS) */
924
#endif /* defined(AMIROOS_CFG_MAIN_INIT_HOOK_0) */
925

  
926 247
  /* hardware, kernel, and operating system initialization */
927 248
  // ChibiOS/HAL and custom hal additions (if any)
928 249
  halInit();
......
930 251
  MODULE_INIT_HAL_EXTRA();
931 252
#endif /* defined(MODULE_INIT_HAL_EXTRA) */
932 253

  
933
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_1)
934
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_1_ARGS)
935
  AMIROOS_CFG_MAIN_INIT_HOOK_1(AMIROOS_CFG_MAIN_INIT_HOOK_1_ARGS);
936
#else /* defined(AMIROOS_CFG_MAIN_INIT_HOOK_1_ARGS) */
937
  AMIROOS_CFG_MAIN_INIT_HOOK_1();
938
#endif /* defined(AMIROOS_CFG_MAIN_INIT_HOOK_1_ARGS) */
939
#endif /* defined(AMIROOS_CFG_MAIN_INIT_HOOK_1) */
940

  
941 254
  // ChibiOS/RT kernel and custom kernel additions (if any)
942 255
  chSysInit();
943 256
#if defined(MODULE_INIT_KERNEL_EXTRA)
944 257
  MODULE_INIT_KERNEL_EXTRA();
945 258
#endif /* defined(MODULE_INIT_KERNEL_EXTRA) */
946 259

  
947
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_2)
948
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_2_ARGS)
949
  AMIROOS_CFG_MAIN_INIT_HOOK_2(AMIROOS_CFG_MAIN_INIT_HOOK_2_ARGS);
950
#else /* defined(AMIROOS_CFG_MAIN_INIT_HOOK_2_ARGS) */
951
  AMIROOS_CFG_MAIN_INIT_HOOK_2();
952
#endif /* defined(AMIROOS_CFG_MAIN_INIT_HOOK_2_ARGS) */
953
#endif /* defined(AMIROOS_CFG_MAIN_INIT_HOOK_2) */
954

  
955 260
  // AMiRo-OS, additional interrupts and custom OS additions (if any)
956
#if (AMIROOS_CFG_SHELL_ENABLE == true) || (AMIROOS_CFG_TESTS_ENABLE == true)
261
#if (AMIROOS_CFG_SHELL_ENABLE == true)
957 262
  aosSysInit(moduleShellPrompt);
958
#else /* (AMIROOS_CFG_SHELL_ENABLE == true) || (AMIROOS_CFG_TESTS_ENABLE == true) */
263
#else /* (AMIROOS_CFG_SHELL_ENABLE == true) */
959 264
  aosSysInit();
960
#endif /* (AMIROOS_CFG_SHELL_ENABLE == true) || (AMIROOS_CFG_TESTS_ENABLE == true) */
265
#endif /* (AMIROOS_CFG_SHELL_ENABLE == true) */
961 266
#if defined(MODULE_INIT_INTERRUPTS)
962 267
  MODULE_INIT_INTERRUPTS();
963 268
#endif
......
965 270
  MODULE_INIT_OS_EXTRA();
966 271
#endif /* defined(MODULE_INIT_OS_EXTRA) */
967 272

  
968
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_3)
969
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_3_ARGS)
970
  AMIROOS_CFG_MAIN_INIT_HOOK_3(AMIROOS_CFG_MAIN_INIT_HOOK_3_ARGS);
971
#else /* defined(AMIROOS_CFG_MAIN_INIT_HOOK_3_ARGS) */
972
  AMIROOS_CFG_MAIN_INIT_HOOK_3();
973
#endif /* defined(AMIROOS_CFG_MAIN_INIT_HOOK_3_ARGS) */
974
#endif /* defined(AMIROOS_CFG_MAIN_INIT_HOOK_3) */
975

  
976 273
  /* event associations */
977 274
#if (AMIROOS_CFG_SSSP_ENABLE == true)
978
  ioeventflagsmask |= MODULE_SSSP_EVENTFLAGS_PD | MODULE_SSSP_EVENTFLAGS_SYNC;
275
  {
276
    eventflags_t flagsmask = AMIROOS_CFG_MAIN_LOOP_GPIOEVENT_FLAGSMASK | MODULE_SSSP_EVENTFLAG_PD | MODULE_SSSP_EVENTFLAG_S;
979 277
#if (AMIROOS_CFG_SSSP_STACK_START != true)
980
  ioeventflagsmask |= MODULE_SSSP_EVENTFLAGS_DN;
278
    flagsmask |= MODULE_SSSP_EVENTFLAG_DN;
981 279
#endif /* (AMIROOS_CFG_SSSP_STACK_START != true) */
982 280
#if (AMIROOS_CFG_SSSP_STACK_END != true)
983
  ioeventflagsmask |= MODULE_SSSP_EVENTFLAGS_UP;
281
    flagsmask |= MODULE_SSSP_EVENTFLAG_UP;
984 282
#endif /* (AMIROOS_CFG_SSSP_STACK_END != true) */
283
    chEvtRegisterMaskWithFlags(&aos.events.gpio, &_eventListenerGPIO, EVENTMASK_GPIO, flagsmask);
284
  }
285
#else /* (AMIROOS_CFG_SSSP_ENABLE == true) */
286
  if (AMIROOS_CFG_MAIN_LOOP_GPIOEVENT_FLAGSMASK) {
287
    chEvtRegisterMaskWithFlags(&aos.events.gpio, &_eventListenerGPIO, EVENTMASK_GPIO, AMIROOS_CFG_MAIN_LOOP_GPIOEVENT_FLAGSMASK);
288
  }
985 289
#endif /* (AMIROOS_CFG_SSSP_ENABLE == true) */
986
  if (ioeventflagsmask != 0) {
987
    chEvtRegisterMaskWithFlags(&aos.events.io, &_eventListenerIO, IOEVENT_MASK, ioeventflagsmask);
290
  chEvtRegisterMask(&aos.events.os, &_eventListenerOS, EVENTMASK_OS);
291

  
292
#if (AMIROOS_CFG_SSSP_ENABLE == true) && (AMIROOS_CFG_SSSP_STARTUP == true)
293

  
294
  /* perform SSSP basic initialization stage */
295

  
296
#if defined(MODULE_SSSP_BASICINIT_HOOK)
297
#if defined(MODULE_SSSP_BASICINIT_HOOK_ARGS)
298
  MODULE_SSSP_BASICINIT_HOOK(MODULE_SSSP_BASICINIT_HOOK_ARGS);
299
#else /* defined(MODULE_SSSP_BASICINIT_HOOK_ARGS) */
300
  MODULE_SSSP_BASICINIT_HOOK();
301
#endif /* defined(MODULE_SSSP_BASICINIT_HOOK_ARGS) */
302
#endif /* defined(MODULE_SSSP_BASICINIT_HOOK) */
303

  
304
  // proceed to startup stage 1.2
305
#if (AMIROOS_CFG_SSSP_MASTER == true)
306
  while ((shutdown == AOS_SHUTDOWN_NONE) && (aosSsspProceed(NULL, 0, EVENTMASK_SSSPTIMER, &eventmask) != AOS_SUCCESS)) {
307
    /*
308
     * This code is executed if the received event was not about the delay.
309
     * The received event could be casued by any listener.
310
     */
311
    // GPIO event
312
    if (eventmask & _eventListenerGPIO.events) {
313
      eventflags = chEvtGetAndClearFlags(&_eventListenerGPIO);
314
      // PD event
315
      if (eventflags & MODULE_SSSP_EVENTFLAG_PD) {
316
        shutdown = AOS_SHUTDOWN_PASSIVE;
317
      } else {
318
#if defined(MODULE_SSSP_STARTUP_1_1_GPIOEVENT_HOOK)
319
        MODULE_SSSP_STARTUP_1_1_GPIOEVENT_HOOK(eventmask, eventflags);
320
#else /* defined(MODULE_SSSP_STARTUP_1_1_GPIOEVENT_HOOK) */
321
        /* silently ignore any other GPIO events */
322
#endif /* defined(MODULE_SSSP_STARTUP_1_1_GPIOEVENT_HOOK) */
323
      }
324
    }
325
    // OS event
326
    else if (eventmask & _eventListenerOS.events) {
327
      eventflags = chEvtGetAndClearFlags(&_eventListenerOS);
328
      _unexpectedEventError(eventmask, eventflags);
329
    }
330
    // unknown event
331
    else {
332
      _unexpectedEventError(eventmask, 0);
333
    }
988 334
  }
989
  chEvtRegisterMask(&aos.events.os, &_eventListenerOS, OSEVENT_MASK);
335
  if (shutdown == AOS_SHUTDOWN_NONE) {
336
    aosDbgAssert(aos.sssp.stage == AOS_SSSP_STAGE_STARTUP_1_2);
337
  }
338
#else /* (AMIROOS_CFG_SSSP_MASTER == true) */
339
  if (shutdown == AOS_SHUTDOWN_NONE) {
340
    aosSsspProceed(NULL, 0, 0, NULL);
341
    aosDbgAssert(aos.sssp.stage == AOS_SSSP_STAGE_STARTUP_1_2);
342
  }
343
#endif /* (AMIROOS_CFG_SSSP_MASTER == true) */
990 344

  
991
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_4)
992
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_4_ARGS)
993
  AMIROOS_CFG_MAIN_INIT_HOOK_4(AMIROOS_CFG_MAIN_INIT_HOOK_4_ARGS);
994
#else /* defined(AMIROOS_CFG_MAIN_INIT_HOOK_4_ARGS) */
995
  AMIROOS_CFG_MAIN_INIT_HOOK_4();
996
#endif /* defined(AMIROOS_CFG_MAIN_INIT_HOOK_4_ARGS) */
997
#endif /* defined(AMIROOS_CFG_MAIN_INIT_HOOK_4) */
345
  // proceed to startup stage 1.3
346
  while ((shutdown == AOS_SHUTDOWN_NONE) && (aosSsspProceed(&_eventListenerGPIO, MODULE_SSSP_EVENTFLAG_S, EVENTMASK_GPIO, &eventmask) != AOS_SUCCESS)) {
347
    /*
348
     * This code is executed if the received event was not about a deactivation of the snychronization signal.
349
     * The received event could be caused by any listener.
350
     */
351
    // GPIO event
352
    if (eventmask & _eventListenerGPIO.events) {
353
      eventflags = chEvtGetAndClearFlags(&_eventListenerGPIO);
354
      // PD event
355
      if (eventflags & MODULE_SSSP_EVENTFLAG_PD) {
356
        shutdown = AOS_SHUTDOWN_PASSIVE;
357
      } else {
358
#if defined(MODULE_SSSP_STARTUP_1_2_GPIOEVENT_HOOK)
359
        MODULE_SSSP_STARTUP_1_2_GPIOEVENT_HOOK(eventmask, eventflags);
360
#else /* defined(MODULE_SSSP_STARTUP_1_2_GPIOEVENT_HOOK) */
361
        /* silently ignore any other GPIO events */
362
#endif /* defined(MODULE_SSSP_STARTUP_1_2_GPIOEVENT_HOOK) */
363
      }
364
    }
365
    // OS event
366
    else if (eventmask & _eventListenerOS.events) {
367
      eventflags = chEvtGetAndClearFlags(&_eventListenerOS);
368
      _unexpectedEventError(eventmask, eventflags);
369
    }
370
    // unknown event
371
    else {
372
      _unexpectedEventError(eventmask, 0);
373
    }
374
  }
375
  if (shutdown == AOS_SHUTDOWN_NONE) {
376
    aosDbgAssert(aos.sssp.stage == AOS_SSSP_STAGE_STARTUP_1_3);
377
  }
378

  
379
  // proceed to startup stage 2.1
380
#if (AMIROOS_CFG_SSSP_MASTER == true)
381
  while ((shutdown == AOS_SHUTDOWN_NONE) && (aosSsspProceed(NULL, 0, EVENTMASK_SSSPTIMER, &eventmask) != AOS_SUCCESS)) {
382
    /*
383
     * This code is executed if the received event was not about the delay.
384
     * The received event could be caused by any listener.
385
     */
386
    // GPIO event
387
    if (eventmask & _eventListenerGPIO.events) {
388
      eventflags = chEvtGetAndClearFlags(&_eventListenerGPIO);
389
      // PD event
390
      if (eventflags & MODULE_SSSP_EVENTFLAG_PD) {
391
        shutdown = AOS_SHUTDOWN_PASSIVE;
392
      } else {
393
#if defined(MODULE_SSSP_STARTUP_1_3_GPIOEVENT_HOOK)
394
        MODULE_SSSP_STARTUP_1_3_GPIOEVENT_HOOK(eventmask, eventflags);
395
#else /* defined(MODULE_SSSP_STARTUP_1_3_GPIOEVENT_HOOK) */
396
        /* silently ignore any other GPIO events */
397
#endif /* defined(MODULE_SSSP_STARTUP_1_3_GPIOEVENT_HOOK) */
398
      }
399
    }
400
    // OS event
401
    else if (eventmask & _eventListenerOS.events) {
402
      eventflags = chEvtGetAndClearFlags(&_eventListenerOS);
403
      _unexpectedEventError(eventmask, eventflags);
404
    }
405
    // unknown event
406
    else {
407
      _unexpectedEventError(eventmask, 0);
408
    }
409
  }
410
#else /* (AMIROOS_CFG_SSSP_MASTER == true) */
411
  while ((shutdown == AOS_SHUTDOWN_NONE) && (aosSsspProceed(&_eventListenerGPIO, MODULE_SSSP_EVENTFLAG_S, EVENTMASK_GPIO, &eventmask) != AOS_SUCCES)) {
412
    /*
413
     * This code is executed if the received event was not about a deactivation of the snychronization signal.
414
     * The received event could be caused by any listener.
415
     */
416
    // GPIO event
417
    if (eventmask & _eventListenerGPIO.events) {
418
      eventflags = chEvtGetAndClearFlags(&_eventListenerGPIO);
419
      // PD event
420
      if (eventflags & MODULE_SSSP_EVENTFLAG_PD) {
421
        shutdown = AOS_SHUTDOWN_PASSIVE;
422
      } else {
423
#if defined(MODULE_SSSP_STARTUP_1_2_GPIOEVENT_HOOK)
424
        MODULE_SSSP_STARTUP_1_2_GPIOEVENT_HOOK(eventmask, eventflags);
425
#else /* defined(MODULE_SSSP_STARTUP_1_2_GPIOEVENT_HOOK) */
426
        /* silently ignore any other GPIO events */
427
#endif /* defined(MODULE_SSSP_STARTUP_1_2_GPIOEVENT_HOOK) */
428
      }
429
    }
430
    // OS event
431
    else if (eventmask & _eventListenerOS.events) {
432
      eventflags = chEvtGetAndClearFlags(&_eventListenerOS);
433
      _unexpectedEventError(eventmask, eventflags);
434
    }
435
    // unknown event
436
    else {
437
      _unexpectedEventError(eventmask, 0);
438
    }
439
  }
440
#endif /* (AMIROOS_CFG_SSSP_MASTER == true) */
441
  if (shutdown == AOS_SHUTDOWN_NONE) {
442
    aosDbgAssert(aos.sssp.stage == AOS_SSSP_STAGE_STARTUP_2_1);
443
  }
444

  
445
#endif /* (AMIROOS_CFG_SSSP_ENABLE == true) && (AMIROOS_CFG_SSSP_STARTUP == true) */
446

  
447
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_1)
448
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_1_ARGS)
449
  AMIROOS_CFG_MAIN_INIT_HOOK_1(AMIROOS_CFG_MAIN_INIT_HOOK_1_ARGS);
450
#else /* defined(AMIROOS_CFG_MAIN_INIT_HOOK_1_ARGS) */
451
  AMIROOS_CFG_MAIN_INIT_HOOK_1();
452
#endif /* defined(AMIROOS_CFG_MAIN_INIT_HOOK_1_ARGS) */
453
#endif /* defined(AMIROOS_CFG_MAIN_INIT_HOOK_1) */
998 454

  
999 455
  /* periphery communication interfaces initialization */
1000
  // module specific initialization (if any)
1001 456
#if defined(MODULE_INIT_PERIPHERY_IF)
457
  // module specific initialization
1002 458
  MODULE_INIT_PERIPHERY_IF();
1003 459
#endif /* defined(MODULE_INIT_PERIPHERY_IF) */
1004
#if ((SSSP_STAGE3_ENABLE == true) && (HAL_USE_CAN == TRUE))
1005
  // CAN
1006
  if (MODULE_HAL_CAN.state == CAN_STOP) {
1007
    canStart(&MODULE_HAL_CAN, &moduleHalCanConfig);
1008
  }
1009
#endif /* (SSSP_STAGE3_ENABLE == true) && (HAL_USE_CAN == TRUE) */
1010
  // user interface (if any)
1011 460
#if defined(MODULE_HAL_PROGIF)
461
  // user interface
1012 462
  aosIOChannelInit(&_stdiochannel, (BaseAsynchronousChannel*)&MODULE_HAL_PROGIF);
1013 463
  aosIOChannelOutputEnable(&_stdiochannel);
1014 464
  aosIOStreamAddChannel(&aos.iostream, &_stdiochannel);
1015
#if (AMIROOS_CFG_SHELL_ENABLE == true) || (AMIROOS_CFG_TESTS_ENABLE == true)
465
#if (AMIROOS_CFG_SHELL_ENABLE == true)
1016 466
  aosShellChannelInit(&_stdshellchannel, (BaseAsynchronousChannel*)&MODULE_HAL_PROGIF);
1017 467
  aosShellChannelInputEnable(&_stdshellchannel);
1018 468
  aosShellChannelOutputEnable(&_stdshellchannel);
1019 469
  aosShellStreamAddChannel(&aos.shell.stream, &_stdshellchannel);
1020
#endif /* (AMIROOS_CFG_SHELL_ENABLE == true) || (AMIROOS_CFG_TESTS_ENABLE == true) */
470
#endif /* (AMIROOS_CFG_SHELL_ENABLE == true) */
1021 471
#endif /* defined(MODULE_HAL_PROGIF) */
1022 472

  
1023
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_5)
1024
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_5_ARGS)
1025
  AMIROOS_CFG_MAIN_INIT_HOOK_5(AMIROOS_CFG_MAIN_INIT_HOOK_5_ARGS);
1026
#else /* defined(AMIROOS_CFG_MAIN_INIT_HOOK_5_ARGS) */
1027
  AMIROOS_CFG_MAIN_INIT_HOOK_5();
1028
#endif /* defined(AMIROOS_CFG_MAIN_INIT_HOOK_5_ARGS) */
1029
#endif /* defined(AMIROOS_CFG_MAIN_INIT_HOOK_5) */
473
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_2)
474
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_2_ARGS)
475
  AMIROOS_CFG_MAIN_INIT_HOOK_2(AMIROOS_CFG_MAIN_INIT_HOOK_2_ARGS);
476
#else /* defined(AMIROOS_CFG_MAIN_INIT_HOOK_2_ARGS) */
477
  AMIROOS_CFG_MAIN_INIT_HOOK_2();
478
#endif /* defined(AMIROOS_CFG_MAIN_INIT_HOOK_2_ARGS) */
479
#endif /* defined(AMIROOS_CFG_MAIN_INIT_HOOK_2) */
1030 480

  
1031 481
  /* module is ready -> print welcome prompt */
1032 482
  aosprintf("\n");
......
1045 495
  aosprintf("######################################################################\n");
1046 496
  aosprintf("\n");
1047 497

  
1048
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_6)
1049
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_6_ARGS)
1050
  AMIROOS_CFG_MAIN_INIT_HOOK_6(AMIROOS_CFG_MAIN_INIT_HOOK_6_ARGS);
1051
#else /* defined(AMIROOS_CFG_MAIN_INIT_HOOK_6_ARGS) */
1052
  AMIROOS_CFG_MAIN_INIT_HOOK_6();
1053
#endif /* defined(AMIROOS_CFG_MAIN_INIT_HOOK_6_ARGS) */
1054
#endif /* defined(AMIROOS_CFG_MAIN_INIT_HOOK_6) */
498
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_3)
499
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_3_ARGS)
500
  AMIROOS_CFG_MAIN_INIT_HOOK_3(AMIROOS_CFG_MAIN_INIT_HOOK_3_ARGS);
501
#else /* defined(AMIROOS_CFG_MAIN_INIT_HOOK_3_ARGS) */
502
  AMIROOS_CFG_MAIN_INIT_HOOK_3();
503
#endif /* defined(AMIROOS_CFG_MAIN_INIT_HOOK_3_ARGS) */
504
#endif /* defined(AMIROOS_CFG_MAIN_INIT_HOOK_3) */
1055 505

  
1056 506
#if (AMIROOS_CFG_TESTS_ENABLE == true)
1057 507
#if defined(MODULE_INIT_TESTS)
......
1061 511
#endif /* defined(MODULE_INIT_TESTS) */
1062 512
#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
1063 513

  
1064
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_7)
1065
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_7_ARGS)
1066
  AMIROOS_CFG_MAIN_INIT_HOOK_7(AMIROOS_CFG_MAIN_INIT_HOOK_7_ARGS);
1067
#else /* defined(AMIROOS_CFG_MAIN_INIT_HOOK_7_ARGS) */
1068
  AMIROOS_CFG_MAIN_INIT_HOOK_7();
1069
#endif /* defined(AMIROOS_CFG_MAIN_INIT_HOOK_7_ARGS) */
1070
#endif /* defined(AMIROOS_CFG_MAIN_INIT_HOOK_7) */
514
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_4)
515
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_4_ARGS)
516
  AMIROOS_CFG_MAIN_INIT_HOOK_4(AMIROOS_CFG_MAIN_INIT_HOOK_4_ARGS);
517
#else /* defined(AMIROOS_CFG_MAIN_INIT_HOOK_4_ARGS) */
518
  AMIROOS_CFG_MAIN_INIT_HOOK_4();
519
#endif /* defined(AMIROOS_CFG_MAIN_INIT_HOOK_4_ARGS) */
520
#endif /* defined(AMIROOS_CFG_MAIN_INIT_HOOK_4) */
1071 521

  
1072 522
#if (AMIROOS_CFG_SSSP_ENABLE == true)
1073
  /* SSSP startup OS synchronization phase (end of startup stage 2) */
1074
  while ((shutdown == AOS_SHUTDOWN_NONE) && (eventmask = aosSysSsspStartupOsInitSyncCheck(&_eventListenerIO)) != 0) {
523

  
524
  // proceed to startup stage 2.2
525
#if (AMIROOS_CFG_SSSP_MASTER == true)
526
  while ((shutdown == AOS_SHUTDOWN_NONE) && (aosSsspProceed(NULL, 0, EVENTMASK_SSSPTIMER, &eventmask) != AOS_SUCCESS)) {
1075 527
    /*
1076
     * This code is executed if the received event was not about the SYS_SYNC control signal.
1077
     * The returned event could be caused by any listener (not only the argument).
528
     * This code is executed if the received event was not about the delay.
529
     * The received event could be caused by any listener.
1078 530
     */
1079
    // IO event
1080
    if (eventmask & _eventListenerIO.events) {
1081
      eventflags = chEvtGetAndClearFlags(&_eventListenerIO);
531
    // GPIO event
532
    if (eventmask & _eventListenerGPIO.events) {
533
      eventflags = chEvtGetAndClearFlags(&_eventListenerGPIO);
1082 534
      // PD event
1083
      if (eventflags & MODULE_SSSP_EVENTFLAGS_PD) {
535
      if (eventflags & MODULE_SSSP_EVENTFLAG_PD) {
1084 536
        shutdown = AOS_SHUTDOWN_PASSIVE;
1085 537
      } else {
1086
#if defined(MODULE_SSSP_STARTUP_2_2_IOEVENT_HOOK)
1087
        MODULE_SSSP_STARTUP_2_2_IOEVENT_HOOK(eventmask, eventflags);
1088
#else /* defined(MODULE_SSSP_STARTUP_2_2_IOEVENT_HOOK) */
1089
        // ignore any other IO events
1090
#endif /* defined(MODULE_SSSP_STARTUP_2_2_IOEVENT_HOOK) */
538
#if defined(MODULE_SSSP_STARTUP_1_3_GPIOEVENT_HOOK)
539
        MODULE_SSSP_STARTUP_1_3_GPIOEVENT_HOOK(eventmask, eventflags);
540
#else /* defined(MODULE_SSSP_STARTUP_1_3_GPIOEVENT_HOOK) */
541
        /* silently ignore any other GPIO events */
542
#endif /* defined(MODULE_SSSP_STARTUP_1_3_GPIOEVENT_HOOK) */
1091 543
      }
1092 544
    }
1093 545
    // OS event
......
1100 552
      _unexpectedEventError(eventmask, 0);
1101 553
    }
1102 554
  }
1103

  
1104
#if (HAL_USE_CAN == TRUE)
1105

  
1106
  /*
1107
   * There must be no delays at this point, thus no hook is allowed.
1108
   */
1109

  
1110
  /* SSSP startup stage 3 (module stack initialization) */
1111 555
  if (shutdown == AOS_SHUTDOWN_NONE) {
1112
    shutdown = _ssspModuleStackInitialization();
556
    aosDbgAssert(aos.sssp.stage == AOS_SSSP_STAGE_STARTUP_2_2);
1113 557
  }
1114

  
1115
  /*
1116
   * There must be no delays at this point, thus no hook is allowed.
1117
   */
1118

  
1119
#if (HAL_USE_RTC == TRUE)
1120
  /* synchronize calendars */
1121
  if (shutdown == AOS_SHUTDOWN_NONE) {
1122
#if (AMIROOS_CFG_SSSP_MASTER == true)
1123
    CANTxFrame frame;
1124
    struct tm t;
1125
    uint64_t encoded;
1126

  
1127
    frame.DLC = 8;
1128
    frame.RTR = CAN_RTR_DATA;
1129
    frame.IDE = CAN_IDE_STD;
1130
    frame.SID = CALENDERSYNC_CANMSGID;
1131

  
1132
    aosDbgPrintf("transmitting current date/time...\t");
1133
    // get current date & time
1134
    aosSysGetDateTime(&t);
1135
    // encode
1136
    encoded = _TM2U64(&t);
1137
    // serialize
1138
    _serialize(frame.data8, encoded, 8);
1139
    // transmit
1140
    canTransmitTimeout(&MODULE_HAL_CAN, CAN_ANY_MAILBOX, &frame, TIME_IMMEDIATE);
1141

  
1142
    aosDbgPrintf("done\n");
1143 558
#else /* (AMIROOS_CFG_SSSP_MASTER == true) */
1144
    CANRxFrame frame;
1145
    uint64_t encoded;
1146
    struct tm t;
559
  if (shutdown == AOS_SHUTDOWN_NONE) {
560
    aosSsspProceed(NULL, 0, 0, NULL);
561
    aosDbgAssert(aos.sssp.stage == AOS_SSSP_STAGE_STARTUP_2_2);
562
  }
563
#endif /* (AMIROOS_CFG_SSSP_MASTER == true) */
1147 564

  
1148
    aosDbgPrintf("receiving current date/time...\t");
1149
    // receive message
1150
#if (AMIROOS_CFG_DBG == true)
1151
    // increase timeout in debug mode due to additional delays introduced by the many prinf() calls
1152
    if (canReceiveTimeout(&MODULE_HAL_CAN, CAN_ANY_MAILBOX, &frame, chTimeUS2I(10 * AOS_SYSTEM_SSSP_TIMEOUT)) == MSG_OK) {
1153
#else /* (AMIROOS_CFG_DBG == true) */
1154
    if (canReceiveTimeout(&MODULE_HAL_CAN, CAN_ANY_MAILBOX, &frame, chTimeUS2I(AOS_SYSTEM_SSSP_TIMEOUT)) == MSG_OK) {
1155
#endif /* (AMIROOS_CFG_DBG == true) */
1156
      // validate message
1157
      if (frame.DLC == 8 &&
1158
          frame.RTR == CAN_RTR_DATA &&
1159
          frame.IDE == CAN_IDE_STD &&
1160
          frame.SID == CALENDERSYNC_CANMSGID) {
1161
        // deserialize
1162
        encoded = _deserialize(frame.data8, 8);
1163
        // decode
1164
        _U642TM(&t, encoded);
1165
        // set current date & time
1166
        aosSysSetDateTime(&t);
1167
        aosDbgPrintf("success\n");
565
  // proceed to startup stage 3 (MSI is enabled), or to operation phase (no MSI)
566
  while ((shutdown == AOS_SHUTDOWN_NONE) && (aosSsspProceed(&_eventListenerGPIO, MODULE_SSSP_EVENTFLAG_S, EVENTMASK_GPIO, &eventmask) != AOS_SUCCESS)) {
567
    /*
568
     * This code is executed if the received event was not about a deactivation of the snychronization signal.
569
     * The received event could be caused by any listener.
570
     */
571
    // GPIO event
572
    if (eventmask & _eventListenerGPIO.events) {
573
      eventflags = chEvtGetAndClearFlags(&_eventListenerGPIO);
574
      // PD event
575
      if (eventflags & MODULE_SSSP_EVENTFLAG_PD) {
576
        shutdown = AOS_SHUTDOWN_PASSIVE;
1168 577
      } else {
1169
        aosDbgPrintf("fail (invalid message)\n");
578
#if defined(MODULE_SSSP_STARTUP_2_2_GPIOEVENT_HOOK)
579
        MODULE_SSSP_STARTUP_2_2_GPIOEVENT_HOOK(eventmask, eventflags);
580
#else /* defined(MODULE_SSSP_STARTUP_2_2_GPIOEVENT_HOOK) */
581
        /* silently ignore any other GPIO events */
582
#endif /* defined(MODULE_SSSP_STARTUP_2_2_GPIOEVENT_HOOK) */
1170 583
      }
1171
    } else {
1172
      aosDbgPrintf("fail (timeout)\n");
1173 584
    }
1174
#endif /* (AMIROOS_CFG_SSSP_MASTER == true) */
1175
    aosDbgPrintf("\n");
585
    // OS event
586
    else if (eventmask & _eventListenerOS.events) {
587
      eventflags = chEvtGetAndClearFlags(&_eventListenerOS);
588
      _unexpectedEventError(eventmask, eventflags);
589
    }
590
    // unknown event
591
    else {
592
      _unexpectedEventError(eventmask, 0);
593
    }
594
  }
595
  if (shutdown == AOS_SHUTDOWN_NONE) {
596
#if (AMIROOS_CFG_SSSP_MSI == true)
597
    aosDbgAssert(aos.sssp.stage == AOS_SSSP_STAGE_STARTUP_3_1);
598
#else /* (AMIROOS_CFG_SSSP_MSI == true) */
599
    aosDbgAssert(aos.sssp.stage == AOS_SSSP_STAGE_OPERATION);
600
#endif /* (AMIROOS_CFG_SSSP_MSI == true) */
1176 601
  }
1177
#endif /* (HAL_USE_RTC == TRUE) */
1178
#endif /* (HAL_USE_CAN == TRUE) */
1179
#endif /* (AMIROOS_CFG_SSSP_ENABLE == true) */
1180 602

  
1181
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_8)
1182
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_8_ARGS)
1183
  AMIROOS_CFG_MAIN_INIT_HOOK_8(AMIROOS_CFG_MAIN_INIT_HOOK_8_ARGS);
1184
#else /* defined(AMIROOS_CFG_MAIN_INIT_HOOK_8_ARGS) */
1185
  AMIROOS_CFG_MAIN_INIT_HOOK_8();
1186
#endif /* defined(AMIROOS_CFG_MAIN_INIT_HOOK_8_ARGS) */
1187
#endif /* defined(AMIROOS_CFG_MAIN_INIT_HOOK_8) */
603
  // start the internal system uptime counter
604
  aosSysStartUptime();
605

  
606
  /*
607
   * There must be no delays at this point, thus no hook allowed.
608
   */
609

  
610
#if (AMIROOS_CFG_SSSP_MSI == true)
611

  
612
  //TODO
613

  
614
#endif /* (AMIROOS_CFG_SSSP_MSI == true) */
615

  
616
#endif /* (AMIROOS_CFG_SSSP_ENABLE == true) */
1188 617

  
1189 618
  /* completely start AMiRo-OS */
1190 619
  if (shutdown == AOS_SHUTDOWN_NONE) {
1191 620
    aosSysStart();
1192 621
  }
1193 622

  
1194
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_9)
1195
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_9_ARGS)
1196
  AMIROOS_CFG_MAIN_INIT_HOOK_9(AMIROOS_CFG_MAIN_INIT_HOOK_9_ARGS);
1197
#else /* defined(AMIROOS_CFG_MAIN_INIT_HOOK_9_ARGS) */
1198
  AMIROOS_CFG_MAIN_INIT_HOOK_9();
1199
#endif /* defined(AMIROOS_CFG_MAIN_INIT_HOOK_9_ARGS) */
1200
#endif /* defined(AMIROOS_CFG_MAIN_INIT_HOOK_9) */
623
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_5)
624
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_5_ARGS)
625
  AMIROOS_CFG_MAIN_INIT_HOOK_5(AMIROOS_CFG_MAIN_INIT_HOOK_5_ARGS);
626
#else /* defined(AMIROOS_CFG_MAIN_INIT_HOOK_5_ARGS) */
627
  AMIROOS_CFG_MAIN_INIT_HOOK_5();
628
#endif /* defined(AMIROOS_CFG_MAIN_INIT_HOOK_5_ARGS) */
629
#endif /* defined(AMIROOS_CFG_MAIN_INIT_HOOK_5) */
1201 630

  
1202 631
  /*
1203 632
   * ##########################################################################
......
1214 643
    eventmask = chEvtWaitOne(ALL_EVENTS);
1215 644
#endif /* (AMIROOS_CFG_MAIN_LOOP_TIMEOUT != 0) */
1216 645

  
1217
#if defined(AMIROOS_CFG_MAIN_LOOP_HOOK_0)
1218
#if defined(AMIROOS_CFG_MAIN_LOOP_HOOK_0_ARGS)
1219
    AMIROOS_CFG_MAIN_LOOP_HOOK_0(AMIROOS_CFG_MAIN_LOOP_HOOK_0_ARGS);
1220
#else /* defined(AMIROOS_CFG_MAIN_LOOP_HOOK_0_ARGS) */
1221
    AMIROOS_CFG_MAIN_LOOP_HOOK_0();
1222
#endif /* defined(AMIROOS_CFG_MAIN_LOOP_HOOK_0_ARGS) */
1223
#endif /* defined(AMIROOS_CFG_MAIN_LOOP_HOOK_0) */
646
#if defined(AMIROOS_CFG_MAIN_LOOP_HOOK_1)
647
#if defined(AMIROOS_CFG_MAIN_LOOP_HOOK_1_ARGS)
648
    AMIROOS_CFG_MAIN_LOOP_HOOK_1(AMIROOS_CFG_MAIN_LOOP_HOOK_1_ARGS);
649
#else /* defined(AMIROOS_CFG_MAIN_LOOP_HOOK_1_ARGS) */
650
    AMIROOS_CFG_MAIN_LOOP_HOOK_1();
651
#endif /* defined(AMIROOS_CFG_MAIN_LOOP_HOOK_1_ARGS) */
652
#endif /* defined(AMIROOS_CFG_MAIN_LOOP_HOOK_1) */
1224 653

  
1225 654
    switch (eventmask) {
1226
      // if this was an I/O event
1227
      case IOEVENT_MASK:
655
      // if this was an GPIO event
656
      case EVENTMASK_GPIO:
1228 657
        // evaluate flags
1229
        eventflags = chEvtGetAndClearFlags(&_eventListenerIO);
658
        eventflags = chEvtGetAndClearFlags(&_eventListenerGPIO);
1230 659
#if (AMIROOS_CFG_SSSP_ENABLE == true)
1231 660
        // PD event
1232
        if (eventflags & MODULE_SSSP_EVENTFLAGS_PD) {
661
        if (eventflags & MODULE_SSSP_EVENTFLAG_PD) {
662
          aosSsspShutdownInit();
1233 663
          shutdown = AOS_SHUTDOWN_PASSIVE;
1234 664
        }
1235 665
        // all other events
1236
#if defined(MODULE_MAIN_LOOP_IO_EVENT)
666
#if defined(MODULE_MAIN_LOOP_GPIOEVENT)
1237 667
        else {
1238
          MODULE_MAIN_LOOP_IO_EVENT(eventflags);
668
          MODULE_MAIN_LOOP_GPIOEVENT(eventflags);
1239 669
        }
1240
#endif /* defined(MODULE_MAIN_LOOP_IO_EVENT) */
670
#endif /* defined(MODULE_MAIN_LOOP_GPIOEVENT) */
1241 671
#else /* (AMIROOS_CFG_SSSP_ENABLE == true) */
1242
#if defined(MODULE_MAIN_LOOP_IO_EVENT)
1243
        MODULE_MAIN_LOOP_IO_EVENT(eventflags);
1244
#endif /* defined(MODULE_MAIN_LOOP_IO_EVENT) */
672
#if defined(MODULE_MAIN_LOOP_GPIOEVENT)
673
        MODULE_MAIN_LOOP_GPIOEVENT(eventflags);
674
#endif /* defined(MODULE_MAIN_LOOP_GPIOEVENT) */
1245 675
#endif /* (AMIROOS_CFG_SSSP_ENABLE == true) */
1246 676
        break;
1247 677

  
1248 678
      // if this was an OS event
1249
      case OSEVENT_MASK:
679
      case EVENTMASK_OS:
1250 680
        // evaluate flags
1251 681
        eventflags = chEvtGetAndClearFlags(&_eventListenerOS);
1252 682
        switch (eventflags) {
1253
#if (AMIROOS_CFG_SSSP_ENABLE == true)
1254
          case AOS_SYSTEM_EVENTFLAGS_HIBERNATE:
683
#if (AMIROOS_CFG_BOOTLOADER == AOS_BOOTLOADER_NONE)
684
          case AOS_SYSTEM_EVENTFLAGS_SHUTDOWN_MASK:
685
            shutdown = AOS_SHUTDOWN_ACTIVE;
686
            break;
687
#elif (AMIROOS_CFG_BOOTLOADER == AOS_BOOTLOADER_AMiRoBLT)
688
          case AOS_SYSTEM_EVENTFLAGS_SHUTDOWN_HIBERNATE:
1255 689
            shutdown = AOS_SHUTDOWN_HIBERNATE;
1256 690
            break;
1257
          case AOS_SYSTEM_EVENTFLAGS_DEEPSLEEP:
691
          case AOS_SYSTEM_EVENTFLAGS_SHUTDOWN_DEEPSLEEP:
1258 692
            shutdown = AOS_SHUTDOWN_DEEPSLEEP;
1259 693
            break;
1260
          case AOS_SYSTEM_EVENTFLAGS_TRANSPORTATION:
694
          case AOS_SYSTEM_EVENTFLAGS_SHUTDOWN_TRANSPORTATION:
1261 695
            shutdown = AOS_SHUTDOWN_TRANSPORTATION;
1262 696
            break;
1263
          case AOS_SYSTEM_EVENTFLAGS_RESTART:
697
          case AOS_SYSTEM_EVENTFLAGS_SHUTDOWN_RESTART:
1264 698
            shutdown = AOS_SHUTDOWN_RESTART;
1265 699
            break;
1266
#else /* (AMIROOS_CFG_SSSP_ENABLE == true) */
1267
          case AOS_SYSTEM_EVENTFLAGS_SHUTDOWN:
1268
            shutdown = AOS_SHUTDOWN_DEFAULT;
700
          case AOS_SYSTEM_EVENTFLAGS_SHUTDOWN_PASSIVE:
701
            _unexpectedEventError(eventmask, eventflags);
1269 702
            break;
1270
#endif /* (AMIROOS_CFG_SSSP_ENABLE == true) */
703
#endif /* (AMIROOS_CFG_BOOTLOADER == X) */
1271 704
          default:
1272 705
            _unexpectedEventError(eventmask, eventflags);
1273 706
            break;
......
1283 716
        break;
1284 717
    }
1285 718

  
1286
#if defined(AMIROOS_CFG_MAIN_LOOP_HOOK_1)
1287
#if defined(AMIROOS_CFG_MAIN_LOOP_HOOK_1_ARGS)
1288
    AMIROOS_CFG_MAIN_LOOP_HOOK_1(AMIROOS_CFG_MAIN_LOOP_HOOK_1_ARGS);
1289
#else /* defined(AMIROOS_CFG_MAIN_LOOP_HOOK_1_ARGS) */
1290
    AMIROOS_CFG_MAIN_LOOP_HOOK_1();
1291
#endif /* defined(AMIROOS_CFG_MAIN_LOOP_HOOK_1_ARGS) */
1292
#endif /* defined(AMIROOS_CFG_MAIN_LOOP_HOOK_1) */
719
#if defined(AMIROOS_CFG_MAIN_LOOP_HOOK_2)
720
#if defined(AMIROOS_CFG_MAIN_LOOP_HOOK_2_ARGS)
721
    AMIROOS_CFG_MAIN_LOOP_HOOK_2(AMIROOS_CFG_MAIN_LOOP_HOOK_2_ARGS);
722
#else /* defined(AMIROOS_CFG_MAIN_LOOP_HOOK_2_ARGS) */
723
    AMIROOS_CFG_MAIN_LOOP_HOOK_2();
724
#endif /* defined(AMIROOS_CFG_MAIN_LOOP_HOOK_2_ARGS) */
725
#endif /* defined(AMIROOS_CFG_MAIN_LOOP_HOOK_2) */
1293 726
  }
1294 727

  
1295 728
  /*
......
1298 731
   * ##########################################################################
1299 732
   */
1300 733

  
1301
#if defined(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_0)
1302
#if defined(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_0_ARGS)
1303
    AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_0(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_0_ARGS);
1304
#else /* defined(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_0_ARGS) */
1305
    AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_0();
1306
#endif /* defined(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_0_ARGS) */
1307
#endif /* defined(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_0) */
734
  aosDbgAssert(shutdown != AOS_SHUTDOWN_NONE);
1308 735

  
1309 736
  // initialize/acknowledge shutdown
1310 737
  aosSysShutdownInit(shutdown);
738
#if (AMIROOS_CFG_SSSP_ENABLE == true)
739
  aosDbgAssert(aos.sssp.stage == AOS_SSSP_STAGE_SHUTDOWN_1_2);
740
#endif /* (AMIROOS_CFG_SSSP_ENABLE == true) */
1311 741

  
1312 742
#if defined(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_1)
1313 743
#if defined(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_1_ARGS)
1314
    AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_1(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_1_ARGS);
744
  AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_1(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_1_ARGS);
1315 745
#else /* defined(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_1_ARGS) */
1316
    AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_1();
746
  AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_1();
1317 747
#endif /* defined(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_1_ARGS) */
1318 748
#endif /* defined(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_1) */
1319 749

  
1320
  // stop system threads
750
  // wait for all threads to terminate
1321 751
  aosSysStop();
1322 752

  
1323 753
#if defined(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_2)
1324 754
#if defined(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_2_ARGS)
1325
    AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_2(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_2_ARGS);
755
  AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_2(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_2_ARGS);
1326 756
#else /* defined(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_2_ARGS) */
1327
    AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_2();
757
  AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_2();
1328 758
#endif /* defined(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_2_ARGS) */
1329 759
#endif /* defined(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_2) */
1330 760

  
......
1333 763

  
1334 764
#if defined(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_3)
1335 765
#if defined(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_3_ARGS)
1336
    AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_3(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_3_ARGS);
766
  AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_3(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_3_ARGS);
1337 767
#else /* defined(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_3_ARGS) */
1338
    AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_3();
768
  AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_3();
1339 769
#endif /* defined(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_3_ARGS) */
1340 770
#endif /* defined(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_3) */
1341 771

  
......
1343 773
#if defined(MODULE_SHUTDOWN_PERIPHERY_IF)
1344 774
  MODULE_SHUTDOWN_PERIPHERY_IF();
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff