Revision 85e62aaf

View differences:

core/src/aos_main.cpp
125 125
static inline void _unexpectedEventError(const eventmask_t mask, const eventflags_t flags)
126 126
{
127 127
#if (AMIROOS_CFG_DBG == true)
128
  aosprintf("CTRL: unexpected/unknown event received. mask: 0x%08X; flags: 0x%08X\n", mask, flags);
128
    aosprintf("CTRL: unexpected/unknown event received. mask: 0x%08X; flags: 0x%08X\n", mask, flags);
129 129
#else
130
  (void)(mask);
131
  (void)(flags);
130
    (void)(mask);
131
    (void)(flags);
132 132
#endif
133
  return;
133
    return;
134 134
}
135 135

  
136 136

  
......
142 142
 */
143 143
static void _ssspTimerCallback(void* par)
144 144
{
145
  aosDbgCheck(par != NULL);
145
    aosDbgCheck(par != NULL);
146 146

  
147
  chSysLockFromISR();
148
  chEvtBroadcastI((event_source_t*)par);
149
  chSysUnlockFromISR();
147
    chSysLockFromISR();
148
    chEvtBroadcastI((event_source_t*)par);
149
    chSysUnlockFromISR();
150 150

  
151
  return;
151
    return;
152 152
}
153 153
#endif
154 154
/**
......
160 160
 */
161 161
inline void _serialize(uint8_t* dst, const uint64_t src, const uint8_t n)
162 162
{
163
  aosDbgCheck(dst != NULL);
164
  aosDbgCheck(n > 0 && n <= 8);
163
    aosDbgCheck(dst != NULL);
164
    aosDbgCheck(n > 0 && n <= 8);
165 165

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

  
170
  return;
170
    return;
171 171
}
172 172

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

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

  
191
  return result;
191
    return result;
192 192
}
193 193

  
194 194
/**
......
210 210
 */
211 211
inline uint64_t _TM2U64(struct tm* src)
212 212
{
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)));
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)));
224 224
}
225 225

  
226 226
/**
......
233 233
 */
234 234
inline void _U642TM(struct tm* dst, const uint64_t src)
235 235
{
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;
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;
249 249
}
250 250
#if (AMIROOS_CFG_SSSP_ENABLE == true)
251 251
/**
......
257 257
 */
258 258
aos_shutdown_t _ssspModuleStackInitialization(void)
259 259
{
260
  // local types
261
  /**
260
    // local types
261
    /**
262 262
   * @brief   States for the internal state machine to implement SSSP startup stage 3.
263 263
   */
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;
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;
295 295
#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
  /*
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
    /*
321 321
   * FSM in a loop.
322 322
   *
323 323
   * This is a fully event-based FSM for the module stack initialization
......
344 344
   *  delays:     Depending on the current state, delays are required by SSSP
345 345
   *              for timing of the sequential activation of signals.
346 346
   */
347
  aosDbgPrintf("SSSP stack initialization sequence:\n");
348
  while (flags.loop) {
347
    aosDbgPrintf("SSSP stack initialization sequence:\n");
348
    while (flags.loop) {
349 349
#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
    }
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
        }
376 376
#endif
377 377

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

  
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));
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));
393 393

  
394
    /*
394
        /*
395 395
     * execute some general tasks and high priority events
396 396
     */
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);
413
  #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
          }
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;
432 403
        }
433
      }
434
    }
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
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);
413
#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;