src/dcf.c
changeset 742 10e165c6743c
parent 699 c26ea35559f8
child 756 4ac6fd44595b
equal deleted inserted replaced
741:b1a73ddc514b 742:10e165c6743c
    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");