}
/* If we're currently stuck in Limp Home mode, and we can see
- * someone else's messages, reset and re-login.
+ * someone else's messages: reset counters, reset NM, re-login.
*/
if (nm->nodes[nm->my_id].state == NM_MAIN_LIMPHOME) {
- nm_reset(nm);
+ nm_initreset(nm);
return;
}
static void nm_timeout_callback(struct NM_Main *nm, struct can_frame *frame)
{
- nm_buildframe(nm, frame);
-
switch(nm->timer_reason) {
case NM_TIMER_NOW:
/* We're due to log in */
+ nm_buildframe(nm, frame);
+
+ if ((nm->nodes[nm->my_id].state & NM_MAIN_MASK)
+ != NM_MAIN_LOGIN) {
+
+ printf("BUG: TIMER_NOW expired in non-ON state %u\n",
+ nm->nodes[nm->my_id].state & NM_MAIN_MASK);
+ }
/* We're going to be ready, let's
* change state (RCD 310 behavior)
*/
nm->nodes[nm->my_id].state = NM_MAIN_ON;
+
nm_set_timer_normal(nm);
break;
case NM_TIMER_NORMAL:
/* We're due to send our own ring message */
- switch(nm->nodes[nm->my_id].state & NM_MAIN_MASK) {
- case NM_MAIN_ON:
- break;
- default:
- printf("BUG: TIMER_NORMAL expired in non-ON state\n");
- break;
+ nm_buildframe(nm, frame);
+
+ if ((nm->nodes[nm->my_id].state & NM_MAIN_MASK)
+ != NM_MAIN_ON) {
+
+ printf("BUG: TIMER_NORMAL expired in non-ON state %u\n",
+ nm->nodes[nm->my_id].state & NM_MAIN_MASK);
}
+
nm_set_timer_awol(nm);
break;
case NM_TIMER_AWOL:
* Reset everything and start over.
*/
nm_reset(nm);
+ nm_buildframe(nm, frame);
break;
case NM_TIMER_LIMPHOME:
+ printf("Limp home timer expired again :(\n");
+
+ nm_buildframe(nm, frame);
nm_set_timer_limphome(nm);
break;
}