+static void nm_set_timer_now(struct NM_Main *nm) {
+ nm->tv.tv_sec = 0;
+ nm->tv.tv_usec = 0;
+ nm->timer_reason = NM_TIMER_NOW;
+}
+
+static void nm_set_timer_normal(struct NM_Main *nm) {
+ nm->tv.tv_sec = 0;
+ nm->tv.tv_usec = NM_USECS_NORMAL_TURN;
+ nm->timer_reason = NM_TIMER_NORMAL;
+}
+
+static void nm_set_timer_awol(struct NM_Main *nm) {
+ nm->tv.tv_sec = 0;
+ nm->tv.tv_usec = NM_USECS_NODE_AWOL;
+ nm->timer_reason = NM_TIMER_AWOL;
+}
+
+/*
+static void nm_set_timer_limphome(struct NM_Main *nm) {
+ nm->tv.tv_sec = 0;
+ nm->tv.tv_usec = NM_USECS_LIMPHOME;
+ nm->timer_reason = NM_TIMER_LIMPHOME;
+}
+*/
+
static void nm_update_my_next_id(struct NM_Main *nm) {
unsigned id = nm->my_id;
nm->nodes[nm->my_id].state = NM_MAIN_LOGIN;
- nm->tv.tv_sec = 0;
- nm->tv.tv_usec = 0;
+ nm_set_timer_now(nm);
+
/* IMPORTANT: The caller needs to check for
* timeouts first, i.e. no other NM frames
* are received until our correcting login
* Reset the timeout so anyone we missed
* can send its login frame to correct us.
*/
- nm->tv.tv_sec = 0;
- nm->tv.tv_usec = NM_USECS_NORMAL_TURN;
+ nm_set_timer_normal(nm);
} else {
/* We just got some random ON message.
* Reset the timer looking out for broken
* connectivity.
*/
- nm->tv.tv_sec = 0;
- nm->tv.tv_usec = NM_USECS_NODE_AWOL;
+ nm_set_timer_awol(nm);
}
break;
case NM_MAIN_LOGIN:
* we do reset the timeout.
*/
if (next != sender) {
- nm->tv.tv_sec = 0;
- nm->tv.tv_usec = NM_USECS_NODE_AWOL;
+ nm_set_timer_awol(nm);
}
break;
case NM_MAIN_LIMPHOME:
static void nm_timeout_callback(struct NM_Main *nm, struct can_frame *frame)
{
- nm->tv.tv_sec = 0;
- nm->tv.tv_usec = NM_USECS_NODE_AWOL;
+ nm_set_timer_awol(nm);
nm_buildframe(nm, frame);
}
NM_State state;
};
+
+enum timer_reason {
+ NM_TIMER_NOW,
+ NM_TIMER_NORMAL,
+ NM_TIMER_AWOL,
+ NM_TIMER_LIMPHOME,
+};
+
struct NM_Main {
unsigned max_nodes;
struct NM_Node *nodes;
NM_ID my_id;
canid_t can_base;
+
struct timeval tv;
+ enum timer_reason timer_reason;
};
/* This timeout is 500 ms in:
* - 0x19 (RCD 310, Bosch)
*/
-#define NM_USECS_LIMP_HOME 500000
+#define NM_USECS_LIMPHOME 500000
#endif /* __VW_NM_H__ */