NNP STM Generic Remote Module git-main
Loading...
Searching...
No Matches
lifegrd.c
Go to the documentation of this file.
1
13#include <data.h>
14#include "lifegrd.h"
15#include "canfestival.h"
16#include "sysdep.h"
17#include "ObjDict.h"
18
19/*Internals prototypes*/
22UNS32 OnHearbeatProducerUpdate(CO_Data* d, const indextable * unsused_indextable, UNS8 unsused_bSubindex);
23
33e_nodeState getNodeState (CO_Data* d, UNS8 nodeId)
34{
35 e_nodeState networkNodeState = d->NMTable[nodeId];
36 return networkNodeState;
37}
38
39/*
40 * @ingroup heartbeat
41 * @brief The Consumer Timer Callback
42 * @param *d Pointer on a CAN object data structure
43 * @param id
44 */
46{
47 /*MSG_WAR(0x00, "ConsumerHearbeatAlarm", 0x00);*/
48
49 /* timer has been notified and is now free (non periodic)*/
50 /* -> avoid deleting re-assigned timer if message is received too late*/
51 d->ConsumerHeartBeatTimers[id]=TIMER_NONE;
52 /* set node state */
53 //d->NMTable[nodeId] = Disconnected;
55 (*d->heartbeatError)(d, (UNS8)( ((d->ConsumerHeartbeatEntries[id]) & (UNS32)0x00FF0000) >> (UNS8)16 ));
56}
57
69{
70 UNS8 nodeId = (UNS8) GET_NODE_ID((*m));
71
72 if((m->rtr == 1) )
77 {
84 if (nodeId == *d->bDeviceNodeId )
85 {
86 Message msg;
87 UNS16 tmp = *d->bDeviceNodeId + 0x700;
88 msg.cob_id = UNS16_LE(tmp);
89 msg.len = (UNS8)0x01;
90 msg.rtr = 0;
91 msg.data[0] = d->nodeState;
92 if (d->toggle)
93 {
94 msg.data[0] |= 0x80 ;
95 d->toggle = 0 ;
96 }
97 else
98 d->toggle = 1 ;
99 /* send the nodeguard response. */
100 MSG_WAR(0x3130, "Sending NMT Nodeguard to master, state: ", d->nodeState);
101 canSend(d->canHandle, &msg);
102 }
103
104 }
105 else
106 { /* incoming slave heartbeat */
107 MSG_WAR(0x3110, "Received NMT nodeId : ", nodeId);
108 /* the slave's state receievd is stored in the NMTable */
109 /* The state is stored on 7 bit */
110 d->NMTable[nodeId] = (e_nodeState) ((*m).data[0] & 0x7F) ;
111
112 /* Boot-Up frame reception - removed by JDCC*/
113
114 if( d->NMTable[nodeId] != Unknown_state )
115 {
116 UNS8 index, ConsummerHeartBeat_nodeId ;
117 for( index = (UNS8)0x00; index < *d->ConsumerHeartbeatCount; index++ )
118 {
119 ConsummerHeartBeat_nodeId = (UNS8)( ((d->ConsumerHeartbeatEntries[index]) & (UNS32)0x00FF0000) >> (UNS8)16 );
120 if ( nodeId == ConsummerHeartBeat_nodeId )
121 {
122 TIMEVAL time = ( (d->ConsumerHeartbeatEntries[index]) & (UNS32)0x0000FFFF ) ;
123 /* Renew alarm for next heartbeat. */
124
125 DelAlarm(d->ConsumerHeartBeatTimers[index]);
126 d->ConsumerHeartBeatTimers[index] = SetAlarm(d, index, &ConsumerHearbeatAlarm, MS_TO_TIMEVAL(time), 0);
127 }
128 }
129
130 }
131
132 }
133}
134
142{
143 if(*d->ProducerHeartBeatTime)
144 {
145 Message msg;
146 /* Time expired, the heartbeat must be sent immediately
147 ** generate the correct node-id: this is done by the offset 1792
148 ** (decimal) and additionaly
149 ** the node-id of this device.
150 */
151 UNS16 tmp = *d->bDeviceNodeId + 0x700;
152 msg.cob_id = UNS16_LE(tmp);
153 msg.len = (UNS8)0x01;
154 msg.rtr = 0;
155 msg.data[0] = d->nodeState; /* No toggle for heartbeat !*/
156 /* send the heartbeat */
157 MSG_WAR(0x3130, "Producing heartbeat: ", d->nodeState);
158 canSend(d->canHandle, &msg);
159
160 }
161 else
162 {
163 d->ProducerHeartBeatTimer = DelAlarm(d->ProducerHeartBeatTimer);
164 }
165}
166
175UNS32 OnHeartbeatProducerUpdate(CO_Data* d, const indextable * unsused_indextable, UNS8 unsused_bSubindex)
176{
177 heartbeatStop(d);
178 heartbeatInit(d);
179 return 0;
180}
181
190{
191 UNS8 index; /* Index to scan the table of heartbeat consumers */
193 d->toggle = 0;
194
195 for( index = (UNS8)0x00; index < *d->ConsumerHeartbeatCount; index++ )
196 {
197 TIMEVAL time = (UNS16) ( (d->ConsumerHeartbeatEntries[index]) & (UNS32)0x0000FFFF ) ;
198 /* MSG_WAR(0x3121, "should_time : ", should_time ) ; */
199 if ( time )
200 {
201 d->ConsumerHeartBeatTimers[index] = SetAlarm(d, index, &ConsumerHearbeatAlarm, MS_TO_TIMEVAL(time), 0);
202 }
203 }
204
205 if ( *d->ProducerHeartBeatTime )
206 {
207 TIMEVAL time = *d->ProducerHeartBeatTime;
208 ProducerHearbeatAlarm(d, 0); //JML send out first heartbeat
209
210 d->ProducerHeartBeatTimer = SetAlarm(d, 0, &ProducerHearbeatAlarm, MS_TO_TIMEVAL(time), MS_TO_TIMEVAL(time));
211 }
212}
213
220{
221 UNS8 index;
222 for( index = (UNS8)0x00; index < *d->ConsumerHeartbeatCount; index++ )
223 {
224 d->ConsumerHeartBeatTimers[index] = DelAlarm(d->ConsumerHeartBeatTimers[index]);
225 }
226
227 d->ProducerHeartBeatTimer = DelAlarm(d->ProducerHeartBeatTimer);
228}
229
236void _heartbeatError(CO_Data* d, UNS8 heartbeatID){}
237
244void _post_SlaveBootup(CO_Data* d, UNS8 SlaveID){}
This file is generated by the NNP Tool – Object Dictionary Editor, as originally developed by CAN Fes...
#define UNS8
Unsigned int8 representation in CANFest.
Definition applicfg.h:25
#define UNS16
Unsigned int16 representation in CANFest.
Definition applicfg.h:26
#define MSG_WAR(num, str, val)
Definition of MSG_WAR.
Definition applicfg.h:64
#define UNS32
Unsigned int32 representation in CANFest.
Definition applicfg.h:27
UNS32 OnHeartbeatProducerUpdate(CO_Data *d, const indextable *unsused_indextable, UNS8 unsused_bSubindex)
This is called when Index 0x1017 is updated.
Definition lifegrd.c:175
void heartbeatStop(CO_Data *d)
Stop heartbeat consumer and producer.
Definition lifegrd.c:219
void ProducerHearbeatAlarm(CO_Data *d, UNS32 id)
the Consumer Timer Callback. Heartbeat has been modified to include module Serial Number
Definition lifegrd.c:141
void processNODE_GUARD(CO_Data *d, Message *m)
This function is responsible to process a canopen-message which seams to be an NMT Error Control Mess...
Definition lifegrd.c:68
void heartbeatInit(CO_Data *d)
Start heartbeat consumer and producer with respect to 0x1016 and 0x1017 object dictionary entries.
Definition lifegrd.c:189
void _heartbeatError(CO_Data *d, UNS8 heartbeatID)
heartbeat Error
Definition lifegrd.c:236
void _post_SlaveBootup(CO_Data *d, UNS8 SlaveID)
post slave bootup
Definition lifegrd.c:244
UNS32 RegisterSetODentryCallBack(CO_Data *d, UNS16 wIndex, UNS8 bSubindex, ODCallback_t Callback)
<BRIEF>
Definition objacces.c:357
e_nodeState getNodeState(CO_Data *d, UNS8 nodeId)
To read the state of a node This can be used by the master after having sent a life guard request,...
Definition lifegrd.c:33
TIMER_HANDLE SetAlarm(CO_Data *d, UNS32 id, TimerCallback_t callback, TIMEVAL value, TIMEVAL period)
Set an alarm to execute a callback function when expired.
Definition timer.c:37
TIMER_HANDLE DelAlarm(TIMER_HANDLE handle)
Delete an alarm before expiring.
Definition timer.c:83
void ConsumerHearbeatAlarm(CO_Data *d, UNS32 id)
Definition lifegrd.c:45
Definition can.h:13
UNS16 cob_id
Definition can.h:14
UNS8 data[8]
Definition can.h:17
UNS8 rtr
Definition can.h:15
UNS8 len
Definition can.h:16
This structure contains all necessary informations to define a CANOpen node.
Definition data.h:44