canfestival/cf_runtime.c
author laurent
Mon, 25 Jun 2012 12:13:58 +0200
changeset 780 70632f4612a1
parent 776 c81397b665b6
child 778 4f9e6d9a3d98
permissions -rw-r--r--
Fix bug when deleting conf tree node and conf tree node editor opened for this same node
52
eaffcd0a2f03 Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff changeset
     1
eaffcd0a2f03 Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff changeset
     2
#include "canfestival.h"
776
c81397b665b6 Fixed generated CF code to match latest changes
Edouard Tisserant
parents: 721
diff changeset
     3
#include "dcf.h"
52
eaffcd0a2f03 Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff changeset
     4
178
2390b409eb93 Added PLC tick alignement on external synchronization source feature.
etisserant
parents: 174
diff changeset
     5
/* CanFestival nodes generated OD headers*/
52
eaffcd0a2f03 Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff changeset
     6
%(nodes_includes)s
eaffcd0a2f03 Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff changeset
     7
eaffcd0a2f03 Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff changeset
     8
#define BOARD_DECL(nodename, busname, baudrate)\
eaffcd0a2f03 Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff changeset
     9
    s_BOARD nodename##Board = {busname, baudrate};
eaffcd0a2f03 Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff changeset
    10
178
2390b409eb93 Added PLC tick alignement on external synchronization source feature.
etisserant
parents: 174
diff changeset
    11
/* CAN channels declaration */
52
eaffcd0a2f03 Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff changeset
    12
%(board_decls)s
eaffcd0a2f03 Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff changeset
    13
178
2390b409eb93 Added PLC tick alignement on external synchronization source feature.
etisserant
parents: 174
diff changeset
    14
/* Keep track of init level to cleanup correctly */
52
eaffcd0a2f03 Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff changeset
    15
static int init_level=0;
178
2390b409eb93 Added PLC tick alignement on external synchronization source feature.
etisserant
parents: 174
diff changeset
    16
/* Retrieve PLC cycle time */
57
3b53f9a509d9 Basic CANOpen master node test compiles and run.
etisserant
parents: 52
diff changeset
    17
extern int common_ticktime__;
52
eaffcd0a2f03 Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff changeset
    18
178
2390b409eb93 Added PLC tick alignement on external synchronization source feature.
etisserant
parents: 174
diff changeset
    19
/* Per master node slavebootup callbacks. Checks that
2390b409eb93 Added PLC tick alignement on external synchronization source feature.
etisserant
parents: 174
diff changeset
    20
 * every node have booted before calling Master_post_SlaveBootup */
169
8e87b69286c0 SlaveBootup now set operational state for both local node and network nodes only when all nodes declared in network edit have been initialized.
etisserant
parents: 160
diff changeset
    21
%(slavebootups)s
8e87b69286c0 SlaveBootup now set operational state for both local node and network nodes only when all nodes declared in network edit have been initialized.
etisserant
parents: 160
diff changeset
    22
178
2390b409eb93 Added PLC tick alignement on external synchronization source feature.
etisserant
parents: 174
diff changeset
    23
/* One slave node post_sync callback.
336
ae3488c79283 Fixed bug : Segmentation fault or locks when stop PLC if no CAN network.
greg
parents: 235
diff changeset
    24
 * Used to align PLC tick-time on CANopen SYNC
178
2390b409eb93 Added PLC tick alignement on external synchronization source feature.
etisserant
parents: 174
diff changeset
    25
 */
2390b409eb93 Added PLC tick alignement on external synchronization source feature.
etisserant
parents: 174
diff changeset
    26
%(post_sync)s
2390b409eb93 Added PLC tick alignement on external synchronization source feature.
etisserant
parents: 174
diff changeset
    27
2390b409eb93 Added PLC tick alignement on external synchronization source feature.
etisserant
parents: 174
diff changeset
    28
#define NODE_FORCE_SYNC(nodename) \
57
3b53f9a509d9 Basic CANOpen master node test compiles and run.
etisserant
parents: 52
diff changeset
    29
    /* Artificially force sync state to 1 so that it is not started */\
3b53f9a509d9 Basic CANOpen master node test compiles and run.
etisserant
parents: 52
diff changeset
    30
    nodename##_Data.CurrentCommunicationState.csSYNC = -1;\
3b53f9a509d9 Basic CANOpen master node test compiles and run.
etisserant
parents: 52
diff changeset
    31
    /* Force sync period to common_ticktime__ so that other node can read it*/\
3b53f9a509d9 Basic CANOpen master node test compiles and run.
etisserant
parents: 52
diff changeset
    32
    *nodename##_Data.COB_ID_Sync = 0x40000080;\
178
2390b409eb93 Added PLC tick alignement on external synchronization source feature.
etisserant
parents: 174
diff changeset
    33
    *nodename##_Data.Sync_Cycle_Period = common_ticktime__ * 1000;
2390b409eb93 Added PLC tick alignement on external synchronization source feature.
etisserant
parents: 174
diff changeset
    34
2390b409eb93 Added PLC tick alignement on external synchronization source feature.
etisserant
parents: 174
diff changeset
    35
#define NODE_INIT(nodename, nodeid) \
52
eaffcd0a2f03 Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff changeset
    36
    /* Defining the node Id */\
eaffcd0a2f03 Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff changeset
    37
    setNodeId(&nodename##_Data, nodeid);\
eaffcd0a2f03 Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff changeset
    38
    /* init */\
eaffcd0a2f03 Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff changeset
    39
    setState(&nodename##_Data, Initialisation);
eaffcd0a2f03 Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff changeset
    40
178
2390b409eb93 Added PLC tick alignement on external synchronization source feature.
etisserant
parents: 174
diff changeset
    41
#define NODE_MASTER_INIT(nodename, nodeid) \
336
ae3488c79283 Fixed bug : Segmentation fault or locks when stop PLC if no CAN network.
greg
parents: 235
diff changeset
    42
    NODE_FORCE_SYNC(nodename) \
ae3488c79283 Fixed bug : Segmentation fault or locks when stop PLC if no CAN network.
greg
parents: 235
diff changeset
    43
    NODE_INIT(nodename, nodeid)
178
2390b409eb93 Added PLC tick alignement on external synchronization source feature.
etisserant
parents: 174
diff changeset
    44
2390b409eb93 Added PLC tick alignement on external synchronization source feature.
etisserant
parents: 174
diff changeset
    45
#define NODE_SLAVE_INIT(nodename, nodeid) \
336
ae3488c79283 Fixed bug : Segmentation fault or locks when stop PLC if no CAN network.
greg
parents: 235
diff changeset
    46
    NODE_INIT(nodename, nodeid)
178
2390b409eb93 Added PLC tick alignement on external synchronization source feature.
etisserant
parents: 174
diff changeset
    47
52
eaffcd0a2f03 Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff changeset
    48
void InitNodes(CO_Data* d, UNS32 id)
eaffcd0a2f03 Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff changeset
    49
{
336
ae3488c79283 Fixed bug : Segmentation fault or locks when stop PLC if no CAN network.
greg
parents: 235
diff changeset
    50
    %(slavebootup_register)s
ae3488c79283 Fixed bug : Segmentation fault or locks when stop PLC if no CAN network.
greg
parents: 235
diff changeset
    51
    %(post_sync_register)s
52
eaffcd0a2f03 Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff changeset
    52
    %(nodes_init)s
eaffcd0a2f03 Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff changeset
    53
}
eaffcd0a2f03 Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff changeset
    54
336
ae3488c79283 Fixed bug : Segmentation fault or locks when stop PLC if no CAN network.
greg
parents: 235
diff changeset
    55
#define NODE_STOP(nodename) \
ae3488c79283 Fixed bug : Segmentation fault or locks when stop PLC if no CAN network.
greg
parents: 235
diff changeset
    56
    if(init_level-- > 0)\
ae3488c79283 Fixed bug : Segmentation fault or locks when stop PLC if no CAN network.
greg
parents: 235
diff changeset
    57
    {\
ae3488c79283 Fixed bug : Segmentation fault or locks when stop PLC if no CAN network.
greg
parents: 235
diff changeset
    58
        masterSendNMTstateChange(&nodename##_Data, 0, NMT_Reset_Node);\
ae3488c79283 Fixed bug : Segmentation fault or locks when stop PLC if no CAN network.
greg
parents: 235
diff changeset
    59
        setState(&nodename##_Data, Stopped);\
ae3488c79283 Fixed bug : Segmentation fault or locks when stop PLC if no CAN network.
greg
parents: 235
diff changeset
    60
    }
ae3488c79283 Fixed bug : Segmentation fault or locks when stop PLC if no CAN network.
greg
parents: 235
diff changeset
    61
144
7818ec7b5c53 add Exit function and StopTimerLoop arg to match with recent changes in CanFestival
greg
parents: 137
diff changeset
    62
void Exit(CO_Data* d, UNS32 id)
7818ec7b5c53 add Exit function and StopTimerLoop arg to match with recent changes in CanFestival
greg
parents: 137
diff changeset
    63
{
336
ae3488c79283 Fixed bug : Segmentation fault or locks when stop PLC if no CAN network.
greg
parents: 235
diff changeset
    64
    %(nodes_stop)s
144
7818ec7b5c53 add Exit function and StopTimerLoop arg to match with recent changes in CanFestival
greg
parents: 137
diff changeset
    65
}
7818ec7b5c53 add Exit function and StopTimerLoop arg to match with recent changes in CanFestival
greg
parents: 137
diff changeset
    66
52
eaffcd0a2f03 Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff changeset
    67
#define NODE_CLOSE(nodename) \
336
ae3488c79283 Fixed bug : Segmentation fault or locks when stop PLC if no CAN network.
greg
parents: 235
diff changeset
    68
    if(init_level_c-- > 0)\
52
eaffcd0a2f03 Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff changeset
    69
    {\
336
ae3488c79283 Fixed bug : Segmentation fault or locks when stop PLC if no CAN network.
greg
parents: 235
diff changeset
    70
      canClose(&nodename##_Data);\
52
eaffcd0a2f03 Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff changeset
    71
    }
eaffcd0a2f03 Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff changeset
    72
512
36aeab46f27d Improved CanFEstival support for LPC - now build and link plugin generated files
edouard
parents: 360
diff changeset
    73
void __cleanup_%(locstr)s(void)
52
eaffcd0a2f03 Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff changeset
    74
{
eaffcd0a2f03 Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff changeset
    75
    // Stop timer thread
203
cb9901076a21 Added concepts :
etisserant
parents: 178
diff changeset
    76
    if(init_level-- > 0){
360
32339ad7d9ae update cf_runtime.c (now call TimerInit and TimerCleanup on win32 platform)
greg
parents: 336
diff changeset
    77
    int init_level_c = init_level;
144
7818ec7b5c53 add Exit function and StopTimerLoop arg to match with recent changes in CanFestival
greg
parents: 137
diff changeset
    78
        StopTimerLoop(&Exit);
203
cb9901076a21 Added concepts :
etisserant
parents: 178
diff changeset
    79
        %(nodes_close)s
336
ae3488c79283 Fixed bug : Segmentation fault or locks when stop PLC if no CAN network.
greg
parents: 235
diff changeset
    80
    }
360
32339ad7d9ae update cf_runtime.c (now call TimerInit and TimerCleanup on win32 platform)
greg
parents: 336
diff changeset
    81
32339ad7d9ae update cf_runtime.c (now call TimerInit and TimerCleanup on win32 platform)
greg
parents: 336
diff changeset
    82
    TimerCleanup();
52
eaffcd0a2f03 Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff changeset
    83
}
eaffcd0a2f03 Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff changeset
    84
512
36aeab46f27d Improved CanFEstival support for LPC - now build and link plugin generated files
edouard
parents: 360
diff changeset
    85
#ifndef stderr
36aeab46f27d Improved CanFEstival support for LPC - now build and link plugin generated files
edouard
parents: 360
diff changeset
    86
#define fprintf(...)
36aeab46f27d Improved CanFEstival support for LPC - now build and link plugin generated files
edouard
parents: 360
diff changeset
    87
#define fflush(...)
36aeab46f27d Improved CanFEstival support for LPC - now build and link plugin generated files
edouard
parents: 360
diff changeset
    88
#endif
36aeab46f27d Improved CanFEstival support for LPC - now build and link plugin generated files
edouard
parents: 360
diff changeset
    89
52
eaffcd0a2f03 Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff changeset
    90
#define NODE_OPEN(nodename)\
eaffcd0a2f03 Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff changeset
    91
    if(!canOpen(&nodename##Board,&nodename##_Data)){\
235
a66e150f2888 Improved debug data feedback.
etisserant
parents: 203
diff changeset
    92
        fprintf(stderr,"Cannot open CAN intefrace %%s at speed %%s\n for CANopen node \"" #nodename "\"",nodename##Board.busname, nodename##Board.baudrate);\
a66e150f2888 Improved debug data feedback.
etisserant
parents: 203
diff changeset
    93
        fflush(stderr);\
52
eaffcd0a2f03 Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff changeset
    94
        return -1;\
eaffcd0a2f03 Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff changeset
    95
    }\
eaffcd0a2f03 Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff changeset
    96
    init_level++;
eaffcd0a2f03 Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff changeset
    97
eaffcd0a2f03 Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff changeset
    98
/***************************  INIT  *****************************************/
eaffcd0a2f03 Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff changeset
    99
int __init_%(locstr)s(int argc,char **argv)
eaffcd0a2f03 Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff changeset
   100
{
57
3b53f9a509d9 Basic CANOpen master node test compiles and run.
etisserant
parents: 52
diff changeset
   101
#ifndef NOT_USE_DYNAMIC_LOADING
75
9ad18a387a96 Windows related enhancements
etisserant
parents: 59
diff changeset
   102
    if( !LoadCanDriver("%(candriver)s") ){
57
3b53f9a509d9 Basic CANOpen master node test compiles and run.
etisserant
parents: 52
diff changeset
   103
        fprintf(stderr, "Cannot load CAN interface library for CanFestival (%(candriver)s)\n");\
512
36aeab46f27d Improved CanFEstival support for LPC - now build and link plugin generated files
edouard
parents: 360
diff changeset
   104
        fflush(stderr);\
36aeab46f27d Improved CanFEstival support for LPC - now build and link plugin generated files
edouard
parents: 360
diff changeset
   105
        return -1;\
57
3b53f9a509d9 Basic CANOpen master node test compiles and run.
etisserant
parents: 52
diff changeset
   106
    }
336
ae3488c79283 Fixed bug : Segmentation fault or locks when stop PLC if no CAN network.
greg
parents: 235
diff changeset
   107
#endif
360
32339ad7d9ae update cf_runtime.c (now call TimerInit and TimerCleanup on win32 platform)
greg
parents: 336
diff changeset
   108
32339ad7d9ae update cf_runtime.c (now call TimerInit and TimerCleanup on win32 platform)
greg
parents: 336
diff changeset
   109
    TimerInit();
336
ae3488c79283 Fixed bug : Segmentation fault or locks when stop PLC if no CAN network.
greg
parents: 235
diff changeset
   110
52
eaffcd0a2f03 Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff changeset
   111
    %(nodes_open)s
eaffcd0a2f03 Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff changeset
   112
eaffcd0a2f03 Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff changeset
   113
    // Start timer thread
eaffcd0a2f03 Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff changeset
   114
    StartTimerLoop(&InitNodes);
57
3b53f9a509d9 Basic CANOpen master node test compiles and run.
etisserant
parents: 52
diff changeset
   115
    init_level++;
52
eaffcd0a2f03 Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff changeset
   116
    return 0;
eaffcd0a2f03 Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff changeset
   117
}
eaffcd0a2f03 Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff changeset
   118
57
3b53f9a509d9 Basic CANOpen master node test compiles and run.
etisserant
parents: 52
diff changeset
   119
#define NODE_SEND_SYNC(nodename)\
776
c81397b665b6 Fixed generated CF code to match latest changes
Edouard Tisserant
parents: 721
diff changeset
   120
    if(getState(&nodename##_Data)==Operational){\
c81397b665b6 Fixed generated CF code to match latest changes
Edouard Tisserant
parents: 721
diff changeset
   121
        sendSYNCMessage(&nodename##_Data);\
c81397b665b6 Fixed generated CF code to match latest changes
Edouard Tisserant
parents: 721
diff changeset
   122
    }
57
3b53f9a509d9 Basic CANOpen master node test compiles and run.
etisserant
parents: 52
diff changeset
   123
512
36aeab46f27d Improved CanFEstival support for LPC - now build and link plugin generated files
edouard
parents: 360
diff changeset
   124
void __retrieve_%(locstr)s(void)
52
eaffcd0a2f03 Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff changeset
   125
{
57
3b53f9a509d9 Basic CANOpen master node test compiles and run.
etisserant
parents: 52
diff changeset
   126
    /* Locks the stack, so that no changes occurs while PLC access variables
336
ae3488c79283 Fixed bug : Segmentation fault or locks when stop PLC if no CAN network.
greg
parents: 235
diff changeset
   127
     * TODO : implement buffers to avoid such a big lock
57
3b53f9a509d9 Basic CANOpen master node test compiles and run.
etisserant
parents: 52
diff changeset
   128
     *  */
52
eaffcd0a2f03 Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff changeset
   129
    EnterMutex();
178
2390b409eb93 Added PLC tick alignement on external synchronization source feature.
etisserant
parents: 174
diff changeset
   130
    /* Send Sync */
57
3b53f9a509d9 Basic CANOpen master node test compiles and run.
etisserant
parents: 52
diff changeset
   131
    %(nodes_send_sync)s
52
eaffcd0a2f03 Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff changeset
   132
}
eaffcd0a2f03 Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff changeset
   133
57
3b53f9a509d9 Basic CANOpen master node test compiles and run.
etisserant
parents: 52
diff changeset
   134
#define NODE_PROCEED_SYNC(nodename)\
3b53f9a509d9 Basic CANOpen master node test compiles and run.
etisserant
parents: 52
diff changeset
   135
    proceedSYNC(&nodename##_Data);
3b53f9a509d9 Basic CANOpen master node test compiles and run.
etisserant
parents: 52
diff changeset
   136
512
36aeab46f27d Improved CanFEstival support for LPC - now build and link plugin generated files
edouard
parents: 360
diff changeset
   137
void __publish_%(locstr)s(void)
52
eaffcd0a2f03 Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff changeset
   138
{
178
2390b409eb93 Added PLC tick alignement on external synchronization source feature.
etisserant
parents: 174
diff changeset
   139
    /* Process sync event */
57
3b53f9a509d9 Basic CANOpen master node test compiles and run.
etisserant
parents: 52
diff changeset
   140
    %(nodes_proceed_sync)s
52
eaffcd0a2f03 Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff changeset
   141
    LeaveMutex();
eaffcd0a2f03 Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff changeset
   142
}
eaffcd0a2f03 Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff changeset
   143