plugins/canfestival/cf_runtime.c
changeset 178 2390b409eb93
parent 174 dc81d1d0f463
child 203 cb9901076a21
equal deleted inserted replaced
177:8b3faaf3715e 178:2390b409eb93
     1 
     1 
     2 #include "canfestival.h"
     2 #include "canfestival.h"
     3 
     3 
       
     4 /* CanFestival nodes generated OD headers*/
     4 %(nodes_includes)s
     5 %(nodes_includes)s
     5 
     6 
     6 #define BOARD_DECL(nodename, busname, baudrate)\
     7 #define BOARD_DECL(nodename, busname, baudrate)\
     7     s_BOARD nodename##Board = {busname, baudrate};
     8     s_BOARD nodename##Board = {busname, baudrate};
     8 
     9 
       
    10 /* CAN channels declaration */
     9 %(board_decls)s
    11 %(board_decls)s
    10 
    12 
       
    13 /* Keep track of init level to cleanup correctly */
    11 static int init_level=0;
    14 static int init_level=0;
       
    15 /* Retrieve PLC cycle time */
    12 extern int common_ticktime__;
    16 extern int common_ticktime__;
    13 
    17 
       
    18 /* Called once all NetworkEdit declares slaves have booted*/
    14 static void Master_post_SlaveBootup(CO_Data* d, UNS8 nodeId)
    19 static void Master_post_SlaveBootup(CO_Data* d, UNS8 nodeId)
    15 {
    20 {
    16     /* Put the master in operational mode */
    21     /* Put the master in operational mode */
    17     setState(d, Operational);
    22     setState(d, Operational);
    18       
    23       
    19     /* Ask slave node to go in operational mode */
    24     /* Ask slave node to go in operational mode */
    20     masterSendNMTstateChange (d, 0, NMT_Start_Node);
    25     masterSendNMTstateChange (d, 0, NMT_Start_Node);
    21 }
    26 }
    22 
    27 
       
    28 /* Per master node slavebootup callbacks. Checks that
       
    29  * every node have booted before calling Master_post_SlaveBootup */
    23 %(slavebootups)s
    30 %(slavebootups)s
    24 
    31 
    25 #define NODE_INIT(nodename, nodeid) \
    32 /* One slave node post_sync callback.
       
    33  * Used to align PLC tick-time on CANopen SYNC 
       
    34  */
       
    35 %(post_sync)s
       
    36 
       
    37 #define NODE_FORCE_SYNC(nodename) \
    26     /* 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 */\
    27     nodename##_Data.CurrentCommunicationState.csSYNC = -1;\
    39     nodename##_Data.CurrentCommunicationState.csSYNC = -1;\
    28     /* Force sync period to common_ticktime__ so that other node can read it*/\
    40     /* Force sync period to common_ticktime__ so that other node can read it*/\
    29     *nodename##_Data.COB_ID_Sync = 0x40000080;\
    41     *nodename##_Data.COB_ID_Sync = 0x40000080;\
    30     *nodename##_Data.Sync_Cycle_Period = common_ticktime__ * 1000;\
    42     *nodename##_Data.Sync_Cycle_Period = common_ticktime__ * 1000;
       
    43 
       
    44 #define NODE_INIT(nodename, nodeid) \
    31     /* Defining the node Id */\
    45     /* Defining the node Id */\
    32     setNodeId(&nodename##_Data, nodeid);\
    46     setNodeId(&nodename##_Data, nodeid);\
    33     /* init */\
    47     /* init */\
    34     setState(&nodename##_Data, Initialisation);
    48     setState(&nodename##_Data, Initialisation);
    35 
    49 
       
    50 #define NODE_MASTER_INIT(nodename, nodeid) \
       
    51 	NODE_FORCE_SYNC(nodename) \
       
    52 	NODE_INIT(nodename, nodeid)
       
    53 
       
    54 #define NODE_SLAVE_INIT(nodename, nodeid) \
       
    55 	NODE_INIT(nodename, nodeid)
       
    56 
    36 void InitNodes(CO_Data* d, UNS32 id)
    57 void InitNodes(CO_Data* d, UNS32 id)
    37 {
    58 {
       
    59 	%(slavebootup_register)s
       
    60 	%(post_sync_register)s
    38     %(nodes_init)s
    61     %(nodes_init)s
    39 	%(slavebootup_register)s
       
    40 }
    62 }
    41 
    63 
    42 void Exit(CO_Data* d, UNS32 id)
    64 void Exit(CO_Data* d, UNS32 id)
    43 {
    65 {
    44 }
    66 }
   101 {
   123 {
   102     /* Locks the stack, so that no changes occurs while PLC access variables
   124     /* Locks the stack, so that no changes occurs while PLC access variables
   103      * TODO : implement buffers to avoid such a big lock  
   125      * TODO : implement buffers to avoid such a big lock  
   104      *  */
   126      *  */
   105     EnterMutex();
   127     EnterMutex();
   106     /*Send Sync */
   128     /* Send Sync */
   107     %(nodes_send_sync)s
   129     %(nodes_send_sync)s
   108 }
   130 }
   109 
   131 
   110 #define NODE_PROCEED_SYNC(nodename)\
   132 #define NODE_PROCEED_SYNC(nodename)\
   111     proceedSYNC(&nodename##_Data);
   133     proceedSYNC(&nodename##_Data);
   112 
   134 
   113 void __publish_%(locstr)s()
   135 void __publish_%(locstr)s()
   114 {
   136 {
   115     /*Call SendPDOEvent */
   137     /* Process sync event */
   116     %(nodes_proceed_sync)s
   138     %(nodes_proceed_sync)s
   117     LeaveMutex();
   139     LeaveMutex();
   118 }
   140 }
   119 
   141