equal
deleted
inserted
replaced
48 void SaveNode(CO_Data* d, UNS8 nodeId); |
48 void SaveNode(CO_Data* d, UNS8 nodeId); |
49 static UNS8 read_consise_dcf_next_entry(CO_Data* d, UNS8 nodeId); |
49 static UNS8 read_consise_dcf_next_entry(CO_Data* d, UNS8 nodeId); |
50 static UNS8 write_consise_dcf_next_entry(CO_Data* d, UNS8 nodeId); |
50 static UNS8 write_consise_dcf_next_entry(CO_Data* d, UNS8 nodeId); |
51 UNS8 init_consise_dcf(CO_Data* d,UNS8 nodeId); |
51 UNS8 init_consise_dcf(CO_Data* d,UNS8 nodeId); |
52 |
52 |
|
53 |
|
54 inline void start_node(CO_Data* d, UNS8 nodeId){ |
|
55 /* Ask slave node to go in operational mode */ |
|
56 masterSendNMTstateChange (d, nodeId, NMT_Start_Node); |
|
57 d->NMTable[nodeId] = Operational; |
|
58 } |
|
59 |
53 /** |
60 /** |
54 ** @brief Function to be called from post_SlaveBootup |
61 ** @brief Function to be called from post_SlaveBootup |
55 ** |
62 ** |
56 ** @param d |
63 ** @param d |
57 ** @param nodeId |
64 ** @param nodeId |
59 UNS8 check_and_start_node(CO_Data* d, UNS8 nodeId) |
66 UNS8 check_and_start_node(CO_Data* d, UNS8 nodeId) |
60 { |
67 { |
61 if(d->dcf_status != DCF_STATUS_INIT) |
68 if(d->dcf_status != DCF_STATUS_INIT) |
62 return 0; |
69 return 0; |
63 if((init_consise_dcf(d, nodeId) == 0) || (read_consise_dcf_next_entry(d, nodeId) == 0)){ |
70 if((init_consise_dcf(d, nodeId) == 0) || (read_consise_dcf_next_entry(d, nodeId) == 0)){ |
64 /* Ask slave node to go in operational mode */ |
71 start_node(d, nodeId); |
65 masterSendNMTstateChange (d, nodeId, NMT_Start_Node); |
|
66 d->NMTable[nodeId] = Operational; |
|
67 return 1; |
72 return 1; |
68 } |
73 } |
69 d->dcf_status = DCF_STATUS_READ_CHECK; |
74 d->dcf_status = DCF_STATUS_READ_CHECK; |
70 return 2; |
75 return 2; |
|
76 } |
|
77 |
|
78 inline void start_and_seek_node(CO_Data* d, UNS8 nodeId){ |
|
79 UNS8 node; |
|
80 start_node(d,nodeId); |
|
81 /* Look for other nodes waiting to be started */ |
|
82 for(node = 0 ; node<NMT_MAX_NODE_ID ; node++){ |
|
83 if(d->NMTable[node] != Initialisation) |
|
84 continue; |
|
85 if(check_and_start_node(d, node) == 2) |
|
86 return; |
|
87 } |
|
88 /* No more node to start. Let's start our own node */ |
|
89 setState(d, Operational); |
71 } |
90 } |
72 |
91 |
73 /** |
92 /** |
74 ** |
93 ** |
75 ** |
94 ** |
92 if(buf[size] != d->dcf_data[size]) |
111 if(buf[size] != d->dcf_data[size]) |
93 match = 0; |
112 match = 0; |
94 } |
113 } |
95 if(match) { |
114 if(match) { |
96 if(read_consise_dcf_next_entry(d, nodeId) == 0){ |
115 if(read_consise_dcf_next_entry(d, nodeId) == 0){ |
97 masterSendNMTstateChange (d, nodeId, NMT_Start_Node); |
116 start_and_seek_node(d, nodeId); |
98 d->NMTable[nodeId] = Operational; |
|
99 d->dcf_status = DCF_STATUS_INIT; |
|
100 /* Look for other nodes waiting to be started */ |
|
101 for(node = 0 ; node<NMT_MAX_NODE_ID ; node++){ |
|
102 if(d->NMTable[node] != Initialisation) |
|
103 continue; |
|
104 if(check_and_start_node(d, node) == 2) |
|
105 break; |
|
106 } |
|
107 } |
117 } |
108 } |
118 } |
109 else { /* Data received does not match : start rewriting all */ |
119 else { /* Data received does not match : start rewriting all */ |
110 if((init_consise_dcf(d, nodeId) == 0) || (write_consise_dcf_next_entry(d, nodeId) == 0)) |
120 if((init_consise_dcf(d, nodeId) == 0) || (write_consise_dcf_next_entry(d, nodeId) == 0)) |
111 goto dcferror; |
121 goto dcferror; |
119 if(write_consise_dcf_next_entry(d, nodeId) == 0){ |
129 if(write_consise_dcf_next_entry(d, nodeId) == 0){ |
120 #ifdef DCF_SAVE_NODE |
130 #ifdef DCF_SAVE_NODE |
121 SaveNode(d, nodeId); |
131 SaveNode(d, nodeId); |
122 d->dcf_status = DCF_STATUS_SAVED; |
132 d->dcf_status = DCF_STATUS_SAVED; |
123 #else //DCF_SAVE_NODE |
133 #else //DCF_SAVE_NODE |
124 masterSendNMTstateChange (d, nodeId, NMT_Start_Node); |
134 start_and_seek_node(d,nodeId); |
125 d->NMTable[nodeId] = Operational; |
|
126 d->dcf_status = DCF_STATUS_INIT; |
|
127 /* Look for other nodes waiting to be started */ |
|
128 for(node = 0 ; node<NMT_MAX_NODE_ID ; node++){ |
|
129 if(d->NMTable[node] != Initialisation) |
|
130 continue; |
|
131 if(check_and_start_node(d, node) == 2) |
|
132 break; |
|
133 } |
|
134 #endif //DCF_SAVE_NODE |
135 #endif //DCF_SAVE_NODE |
135 } |
136 } |
136 } |
137 } |
137 else if(d->dcf_status == DCF_STATUS_SAVED){ |
138 else if(d->dcf_status == DCF_STATUS_SAVED){ |
138 // printf("DCF_STATUS_SAVED \n"); |
139 // printf("DCF_STATUS_SAVED \n"); |