plugins/canfestival/cf_runtime.c
changeset 57 3b53f9a509d9
parent 52 eaffcd0a2f03
child 59 b6ff896ff58b
equal deleted inserted replaced
56:b0555fa71812 57:3b53f9a509d9
     7     s_BOARD nodename##Board = {busname, baudrate};
     7     s_BOARD nodename##Board = {busname, baudrate};
     8 
     8 
     9 %(board_decls)s
     9 %(board_decls)s
    10 
    10 
    11 static int init_level=0;
    11 static int init_level=0;
       
    12 extern int common_ticktime__;
    12 
    13 
    13 #define NODE_INIT(nodename, nodeid) \
    14 #define NODE_INIT(nodename, nodeid) \
       
    15     /* Artificially force sync state to 1 so that it is not started */\
       
    16     nodename##_Data.CurrentCommunicationState.csSYNC = -1;\
       
    17     /* Force sync period to common_ticktime__ so that other node can read it*/\
       
    18     *nodename##_Data.COB_ID_Sync = 0x40000080;\
       
    19     *nodename##_Data.Sync_Cycle_Period = common_ticktime__ * 1000;\
    14     /* Defining the node Id */\
    20     /* Defining the node Id */\
    15     setNodeId(&nodename##_Data, nodeid);\
    21     setNodeId(&nodename##_Data, nodeid);\
    16     /* init */\
    22     /* init */\
    17     setState(&nodename##_Data, Initialisation);
    23     setState(&nodename##_Data, Initialisation);
    18 
    24 
    20 {
    26 {
    21     %(nodes_init)s
    27     %(nodes_init)s
    22 }
    28 }
    23 
    29 
    24 #define NODE_CLOSE(nodename) \
    30 #define NODE_CLOSE(nodename) \
    25     if(init_level--)\
    31     if(init_level-- > 0)\
    26     {\
    32     {\
    27         EnterMutex();\
    33         EnterMutex();\
    28         setState(&nodename##_Data, Stopped);\
    34         setState(&nodename##_Data, Stopped);\
    29         LeaveMutex();\
    35         LeaveMutex();\
    30         canClose(&nodename##_Data);\
    36         canClose(&nodename##_Data);\
    33 void __cleanup_%(locstr)s()
    39 void __cleanup_%(locstr)s()
    34 {
    40 {
    35     %(nodes_close)s
    41     %(nodes_close)s
    36     
    42     
    37     // Stop timer thread
    43     // Stop timer thread
    38     StopTimerLoop();
    44     if(init_level-- > 0)
       
    45         StopTimerLoop();
    39 
    46 
    40 }
    47 }
    41 
    48 
    42 #define NODE_OPEN(nodename)\
    49 #define NODE_OPEN(nodename)\
    43     if(!canOpen(&nodename##Board,&nodename##_Data)){\
    50     if(!canOpen(&nodename##Board,&nodename##_Data)){\
    44         printf("Cannot open " #nodename " Board (%%s,%%s)\n",nodename##Board.busname, nodename##Board.baudrate);\
    51         printf("Cannot open " #nodename " Board (%%s,%%s)\n",nodename##Board.busname, nodename##Board.baudrate);\
    45         __cleanup_%(locstr)s();\
       
    46         return -1;\
    52         return -1;\
    47     }\
    53     }\
    48     init_level++;
    54     init_level++;
    49 
    55 
    50 /***************************  INIT  *****************************************/
    56 /***************************  INIT  *****************************************/
    51 int __init_%(locstr)s(int argc,char **argv)
    57 int __init_%(locstr)s(int argc,char **argv)
    52 {
    58 {
       
    59 #ifndef NOT_USE_DYNAMIC_LOADING
       
    60     if( !LoadCanDriver("libcanfestival_can_%(candriver)s.so") ){
       
    61         fprintf(stderr, "Cannot load CAN interface library for CanFestival (%(candriver)s)\n");\
       
    62         return -1;
       
    63     }
       
    64 #endif      
    53 
    65 
    54     %(nodes_open)s
    66     %(nodes_open)s
    55 
    67 
    56 #ifndef NOT_USE_DYNAMIC_LOADING
       
    57     LoadCanDriver("libcanfestival_can_%(candriver)s.so");
       
    58 #endif      
       
    59     // Start timer thread
    68     // Start timer thread
    60     StartTimerLoop(&InitNodes);
    69     StartTimerLoop(&InitNodes);
       
    70     init_level++;
    61     return 0;
    71     return 0;
    62 }
    72 }
    63 
    73 
       
    74 #define NODE_SEND_SYNC(nodename)\
       
    75     sendSYNCMessage(&nodename##_Data);
       
    76 
    64 void __retrive_%(locstr)s()
    77 void __retrive_%(locstr)s()
    65 {
    78 {
    66     /*TODO: Send Sync */
    79     /* Locks the stack, so that no changes occurs while PLC access variables
       
    80      * TODO : implement buffers to avoid such a big lock  
       
    81      *  */
    67     EnterMutex();
    82     EnterMutex();
       
    83     /*Send Sync */
       
    84     %(nodes_send_sync)s
    68 }
    85 }
       
    86 
       
    87 #define NODE_PROCEED_SYNC(nodename)\
       
    88     proceedSYNC(&nodename##_Data);
    69 
    89 
    70 void __publish_%(locstr)s()
    90 void __publish_%(locstr)s()
    71 {
    91 {
    72     /*TODO: Call SendPDOEvent */
    92     /*Call SendPDOEvent */
       
    93     %(nodes_proceed_sync)s
    73     LeaveMutex();
    94     LeaveMutex();
    74 }
    95 }
    75 
    96