plugins/canfestival/cf_runtime.c
changeset 336 ae3488c79283
parent 235 a66e150f2888
child 360 32339ad7d9ae
equal deleted inserted replaced
335:c5f3f71e7260 336:ae3488c79283
    18 /* Called once all NetworkEdit declares slaves have booted*/
    18 /* Called once all NetworkEdit declares slaves have booted*/
    19 static void Master_post_SlaveBootup(CO_Data* d, UNS8 nodeId)
    19 static void Master_post_SlaveBootup(CO_Data* d, UNS8 nodeId)
    20 {
    20 {
    21     /* Put the master in operational mode */
    21     /* Put the master in operational mode */
    22     setState(d, Operational);
    22     setState(d, Operational);
    23       
    23 
    24     /* Ask slave node to go in operational mode */
    24     /* Ask slave node to go in operational mode */
    25     masterSendNMTstateChange (d, 0, NMT_Start_Node);
    25     masterSendNMTstateChange (d, 0, NMT_Start_Node);
    26 }
    26 }
    27 
    27 
    28 /* Per master node slavebootup callbacks. Checks that
    28 /* Per master node slavebootup callbacks. Checks that
    29  * every node have booted before calling Master_post_SlaveBootup */
    29  * every node have booted before calling Master_post_SlaveBootup */
    30 %(slavebootups)s
    30 %(slavebootups)s
    31 
    31 
    32 /* One slave node post_sync callback.
    32 /* One slave node post_sync callback.
    33  * Used to align PLC tick-time on CANopen SYNC 
    33  * Used to align PLC tick-time on CANopen SYNC
    34  */
    34  */
    35 %(post_sync)s
    35 %(post_sync)s
    36 
    36 
    37 #define NODE_FORCE_SYNC(nodename) \
    37 #define NODE_FORCE_SYNC(nodename) \
    38     /* Artificially force sync state to 1 so that it is not started */\
    38     /* Artificially force sync state to 1 so that it is not started */\
    46     setNodeId(&nodename##_Data, nodeid);\
    46     setNodeId(&nodename##_Data, nodeid);\
    47     /* init */\
    47     /* init */\
    48     setState(&nodename##_Data, Initialisation);
    48     setState(&nodename##_Data, Initialisation);
    49 
    49 
    50 #define NODE_MASTER_INIT(nodename, nodeid) \
    50 #define NODE_MASTER_INIT(nodename, nodeid) \
    51 	NODE_FORCE_SYNC(nodename) \
    51     NODE_FORCE_SYNC(nodename) \
    52 	NODE_INIT(nodename, nodeid)
    52     NODE_INIT(nodename, nodeid)
    53 
    53 
    54 #define NODE_SLAVE_INIT(nodename, nodeid) \
    54 #define NODE_SLAVE_INIT(nodename, nodeid) \
    55 	NODE_INIT(nodename, nodeid)
    55     NODE_INIT(nodename, nodeid)
    56 
    56 
    57 void InitNodes(CO_Data* d, UNS32 id)
    57 void InitNodes(CO_Data* d, UNS32 id)
    58 {
    58 {
    59 	%(slavebootup_register)s
    59     %(slavebootup_register)s
    60 	%(post_sync_register)s
    60     %(post_sync_register)s
    61     %(nodes_init)s
    61     %(nodes_init)s
    62 }
    62 }
    63 
    63 
       
    64 #define NODE_STOP(nodename) \
       
    65     if(init_level-- > 0)\
       
    66     {\
       
    67         masterSendNMTstateChange(&nodename##_Data, 0, NMT_Reset_Node);\
       
    68         setState(&nodename##_Data, Stopped);\
       
    69     }
       
    70 
    64 void Exit(CO_Data* d, UNS32 id)
    71 void Exit(CO_Data* d, UNS32 id)
    65 {
    72 {
       
    73     %(nodes_stop)s
    66 }
    74 }
    67 
    75 
    68 #define NODE_CLOSE(nodename) \
    76 #define NODE_CLOSE(nodename) \
    69     if(init_level-- > 0)\
    77     if(init_level_c-- > 0)\
    70     {\
    78     {\
    71         EnterMutex();\
    79       canClose(&nodename##_Data);\
    72         masterSendNMTstateChange(&nodename##_Data, 0, NMT_Reset_Node);\
       
    73         setState(&nodename##_Data, Stopped);\
       
    74         LeaveMutex();\
       
    75         canClose(&nodename##_Data);\
       
    76     }
    80     }
    77 
    81 
    78 void __cleanup_%(locstr)s()
    82 void __cleanup_%(locstr)s()
    79 {
    83 {
    80     // Stop timer thread
    84     // Stop timer thread
    81     if(init_level-- > 0){
    85     if(init_level-- > 0){
       
    86     int init_level_c = init_level;	
    82         StopTimerLoop(&Exit);
    87         StopTimerLoop(&Exit);
    83         %(nodes_close)s
    88         %(nodes_close)s
    84    }
    89     }
    85     #if !defined(WIN32) || defined(__CYGWIN__)
    90     #if !defined(WIN32) || defined(__CYGWIN__)
    86    		TimerCleanup();
    91         TimerCleanup();
    87     #endif
    92     #endif
    88 }
    93 }
    89 
    94 
    90 #define NODE_OPEN(nodename)\
    95 #define NODE_OPEN(nodename)\
    91     if(!canOpen(&nodename##Board,&nodename##_Data)){\
    96     if(!canOpen(&nodename##Board,&nodename##_Data)){\
   102     if( !LoadCanDriver("%(candriver)s") ){
   107     if( !LoadCanDriver("%(candriver)s") ){
   103         fprintf(stderr, "Cannot load CAN interface library for CanFestival (%(candriver)s)\n");\
   108         fprintf(stderr, "Cannot load CAN interface library for CanFestival (%(candriver)s)\n");\
   104         fflush(stderr);
   109         fflush(stderr);
   105         return -1;
   110         return -1;
   106     }
   111     }
   107 #endif      
   112 #endif
   108 	#if !defined(WIN32) || defined(__CYGWIN__)
   113     #if !defined(WIN32) || defined(__CYGWIN__)
   109 		TimerInit();
   114         TimerInit();
   110 	#endif
   115     #endif
   111 	
   116 
   112     %(nodes_open)s
   117     %(nodes_open)s
   113 
   118 
   114     // Start timer thread
   119     // Start timer thread
   115     StartTimerLoop(&InitNodes);
   120     StartTimerLoop(&InitNodes);
   116     init_level++;
   121     init_level++;
   121     sendSYNCMessage(&nodename##_Data);
   126     sendSYNCMessage(&nodename##_Data);
   122 
   127 
   123 void __retrieve_%(locstr)s()
   128 void __retrieve_%(locstr)s()
   124 {
   129 {
   125     /* Locks the stack, so that no changes occurs while PLC access variables
   130     /* Locks the stack, so that no changes occurs while PLC access variables
   126      * TODO : implement buffers to avoid such a big lock  
   131      * TODO : implement buffers to avoid such a big lock
   127      *  */
   132      *  */
   128     EnterMutex();
   133     EnterMutex();
   129     /* Send Sync */
   134     /* Send Sync */
   130     %(nodes_send_sync)s
   135     %(nodes_send_sync)s
   131 }
   136 }