]> rtime.felk.cvut.cz Git - CanFestival-3.git/blobdiff - src/states.c
Preliminary implementation of Event Timer and Inhibit Timer driven TPDO
[CanFestival-3.git] / src / states.c
index 46e93f218fb107763ce8e15055220c5a62fe5ec9..79f1e84f23eb289d56195936b5dd223da777fb19 100644 (file)
@@ -19,29 +19,49 @@ You should have received a copy of the GNU Lesser General Public
 License along with this library; if not, write to the Free Software
 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */
+/*!
+** @file   states.c
+** @author Edouard TISSERANT and Francis DUPIN
+** @date   Tue Jun  5 09:32:32 2007
+**
+** @brief
+**
+**
+*/
 
 #include "states.h"
 #include "def.h"
-
+#include "dcf.h"
 #include "nmtSlave.h"
 
-#ifdef LED_ENABLE
-#include "led.h"
-#else
-#define led_set_state(a,b)
-#endif
-
-// Prototypes for internals functions
+/** Prototypes for internals functions */
+/*!                                                                                                
+**                                                                                                 
+**                                                                                                 
+** @param d                                                                                        
+** @param newCommunicationState                                                                    
+**/     
 void switchCommunicationState(CO_Data* d, 
        s_state_communication *newCommunicationState);
        
-/*****************************************************************************/
+/*!                                                                                                
+**                                                                                                 
+**                                                                                                 
+** @param d                                                                                        
+**                                                                                                 
+** @return                                                                                         
+**/    
 e_nodeState getState(CO_Data* d)
 {
   return d->nodeState;
 }
 
-/*****************************************************************************/
+/*!                                                                                                
+**                                                                                                 
+**                                                                                                 
+** @param d                                                                                        
+** @param m                                                                                        
+**/  
 void canDispatch(CO_Data* d, Message *m)
 {
         switch(m->cob_id.w >> 7)
@@ -50,7 +70,7 @@ void canDispatch(CO_Data* d, Message *m)
                        if(d->CurrentCommunicationState.csSYNC)
                                proceedSYNC(d,m);
                        break;
-               //case TIME_STAMP:
+               /* case TIME_STAMP: */
                case PDO1tx:
                case PDO1rx:
                case PDO2tx:
@@ -72,92 +92,102 @@ void canDispatch(CO_Data* d, Message *m)
                                proceedNODE_GUARD(d,m);
                        break;
                case NMT:
-                       if (d->iam_a_slave)
+                       if (*(d->iam_a_slave))
                        {
                                proceedNMTstateChange(d,m);
                        }
-#ifdef CANOPEN_LSS_ENABLE
-               default:
-                       if (m->cob_id.w == 0x7E4 || m->cob_id.w == 0x705)
-                       {
-                               proceedLSS(d,m);
-                       }
-#endif
        }
 }
 
 #define StartOrStop(CommType, FuncStart, FuncStop) \
        if(newCommunicationState->CommType && !d->CurrentCommunicationState.CommType){\
-               MSG_ERR(0x9999,#FuncStart, 9999);\
+               MSG_WAR(0x9999,#FuncStart, 9999);\
                d->CurrentCommunicationState.CommType = 1;\
                FuncStart;\
        }else if(!newCommunicationState->CommType && d->CurrentCommunicationState.CommType){\
-               MSG_ERR(0x9999,#FuncStop, 9999);\
+               MSG_WAR(0x9999,#FuncStop, 9999);\
                d->CurrentCommunicationState.CommType = 0;\
                FuncStop;\
        }
 #define None
-       
-/*****************************************************************************/
+
+/*!                                                                                                
+**                                                                                                 
+**                                                                                                 
+** @param d                                                                                        
+** @param newCommunicationState                                                                    
+**/    
 void switchCommunicationState(CO_Data* d, s_state_communication *newCommunicationState)
 {
        StartOrStop(csSDO,      None,           resetSDO(d))
        StartOrStop(csSYNC,     startSYNC(d),           stopSYNC(d))
        StartOrStop(csHeartbeat,        heartbeatInit(d),       heartbeatStop(d))
-//     StartOrStop(Emergency,,)
-       StartOrStop(csPDO,      None,   None)
+/*     StartOrStop(Emergency,,) */
+       StartOrStop(csPDO,      PDOInit(d),     PDOStop(d))
        StartOrStop(csBoot_Up,  None,   slaveSendBootUp(d))
 }
 
-/*****************************************************************************/
+/*!                                                                                                
+**                                                                                                 
+**                                                                                                 
+** @param d                                                                                        
+** @param newState                                                                                 
+**                                                                                                 
+** @return                                                                                         
+**/  
 UNS8 setState(CO_Data* d, e_nodeState newState)
 {
+       UNS16 wIndex = 0x1F22;
+       const indextable *ptrTable;
+       ODCallback_t *Callback;
+       UNS32 errorCode;
        while(newState != d->nodeState){
                switch( newState ){
                        case Initialisation:
                        {
-                               s_state_communication newCommunicationState = {
-                                       csBoot_Up: 1,
-                                       csSDO: 0,
-                                       csEmergency: 0,
-                                       csSYNC: 0,
-                                       csHeartbeat: 0,
-                                       csPDO: 0};
-                               // This will force a second loop for the state switch
+                               s_state_communication newCommunicationState = {1, 0, 0, 0, 0, 0};
+                               /* This will force a second loop for the state switch */
                                d->nodeState = Initialisation;
                                newState = Pre_operational;
                                switchCommunicationState(d, &newCommunicationState);
-                               // call user app related state func.
+                               /* call user app related state func. */
                                (*d->initialisation)();
+                               
                        }
                        break;
                                                                
                        case Pre_operational:
                        {
-                               s_state_communication newCommunicationState = {
-                                       csBoot_Up: 0,
-                                       csSDO: 1,
-                                       csEmergency: 1,
-                                       csSYNC: 1,
-                                       csHeartbeat: 1,
-                                       csPDO: 0};
+                               
+                               s_state_communication newCommunicationState = {0, 1, 1, 1, 1, 0};
                                d->nodeState = Pre_operational;
                                newState = Pre_operational;
                                switchCommunicationState(d, &newCommunicationState);
-                               (*d->preOperational)();
+                               if (!(*(d->iam_a_slave)))
+                               {
+                                       ptrTable =(*d->scanIndexOD)(wIndex, &errorCode, &Callback);
+                                       
+                                       if (errorCode != OD_SUCCESSFUL)
+                                               {
+                                                       (*d->preOperational)();
+                                               }
+                                       else
+                                               {
+                                                       UNS32 res;
+                                                       res = decompo_dcf(d,0x01);
+                                               }                               
+                               }
+                               else 
+                               {
+                                       (*d->preOperational)();
+                               }
                        }
                        break;
                                                                
                        case Operational:
                        if(d->nodeState == Initialisation) return 0xFF;
                        {
-                               s_state_communication newCommunicationState = {
-                                       csBoot_Up: 0,
-                                       csSDO: 1,
-                                       csEmergency: 1,
-                                       csSYNC: 1,
-                                       csHeartbeat: 1,
-                                       csPDO: 1};
+                               s_state_communication newCommunicationState = {0, 1, 1, 1, 1, 1};
                                d->nodeState = Operational;
                                newState = Operational;
                                switchCommunicationState(d, &newCommunicationState);
@@ -168,13 +198,7 @@ UNS8 setState(CO_Data* d, e_nodeState newState)
                        case Stopped:
                        if(d->nodeState == Initialisation) return 0xFF;
                        {
-                               s_state_communication newCommunicationState = {
-                                       csBoot_Up: 0,
-                                       csSDO: 0,
-                                       csEmergency: 0,
-                                       csSYNC: 0,
-                                       csHeartbeat: 1,
-                                       csPDO: 0};
+                               s_state_communication newCommunicationState = {0, 0, 0, 0, 1, 0};
                                d->nodeState = Stopped;
                                newState = Stopped;
                                switchCommunicationState(d, &newCommunicationState);
@@ -184,51 +208,63 @@ UNS8 setState(CO_Data* d, e_nodeState newState)
                        
                        default:
                                return 0xFF;
-               }//end switch case
-
-               led_set_state(d, newState);             
+               }/* end switch case */
+       
        }
        return 0;
 }
 
-/*****************************************************************************/
+/*!                                                                                                
+**                                                                                                 
+**                                                                                                 
+** @param d                                                                                        
+**                                                                                                 
+** @return                                                                                         
+**/ 
 UNS8 getNodeId(CO_Data* d)
 {
   return *d->bDeviceNodeId;
 }
 
-/*****************************************************************************/
+/*!                                                                                                
+**                                                                                                 
+**                                                                                                 
+** @param d                                                                                        
+** @param nodeId                                                                                   
+**/   
 void setNodeId(CO_Data* d, UNS8 nodeId)
 {
   UNS16 offset = d->firstIndex->SDO_SVR;
   if(offset){
-      //cob_id_client = 0x600 + nodeId;
+      /* cob_id_client = 0x600 + nodeId; */
       *(UNS32*)d->objdict[offset].pSubindex[1].pObject = 0x600 + nodeId;
-      //cob_id_server = 0x580 + nodeId;
+      /* cob_id_server = 0x580 + nodeId; */
       *(UNS32*)d->objdict[offset].pSubindex[2].pObject = 0x580 + nodeId;
-      // node Id client. As we do not know the value, we put the node Id Server
-      //*(UNS8*)d->objdict[offset].pSubindex[3].pObject = nodeId;
+      /* node Id client. As we do not know the value, we put the node Id Server */
+      /* *(UNS8*)d->objdict[offset].pSubindex[3].pObject = nodeId; */
   }
 
-  // ** Initialize the server(s) SDO parameters
-  // Remember that only one SDO server is allowed, defined at index 0x1200
-  // ** Initialize the client(s) SDO parameters  
-  // Nothing to initialize (no default values required by the DS 401)
-  // ** Initialize the receive PDO communication parameters. Only for 0x1400 to 0x1403
+  /* 
+       Initialize the server(s) SDO parameters
+       Remember that only one SDO server is allowed, defined at index 0x1200   
+               
+       Initialize the client(s) SDO parameters         
+       Nothing to initialize (no default values required by the DS 401)        
+       Initialize the receive PDO communication parameters. Only for 0x1400 to 0x1403 
+  */
   {
     UNS8 i = 0;
     UNS16 offset = d->firstIndex->PDO_RCV;
     UNS16 lastIndex = d->lastIndex->PDO_RCV;
     UNS32 cobID[] = {0x200, 0x300, 0x400, 0x500};
     if( offset ) while( (offset <= lastIndex) && (i < 4)) {
-      if(*(UNS32*)d->objdict[offset].pSubindex[1].pObject == cobID[i] + *d->bDeviceNodeId)
+      //if(*(UNS32*)d->objdict[offset].pSubindex[1].pObject == cobID[i] + *d->bDeviceNodeId)
              *(UNS32*)d->objdict[offset].pSubindex[1].pObject = cobID[i] + nodeId;
       i ++;
       offset ++;
     }
   }
-  // ** Initialize the transmit PDO communication parameters. Only for 0x1800 to 0x1803
+  /* ** Initialize the transmit PDO communication parameters. Only for 0x1800 to 0x1803 */
   {
     UNS8 i = 0;
     UNS16 offset = d->firstIndex->PDO_TRS;
@@ -236,12 +272,17 @@ void setNodeId(CO_Data* d, UNS8 nodeId)
     UNS32 cobID[] = {0x180, 0x280, 0x380, 0x480};
     i = 0;
     if( offset ) while ((offset <= lastIndex) && (i < 4)) {
-      if(*(UNS32*)d->objdict[offset].pSubindex[1].pObject == cobID[i] + *d->bDeviceNodeId)
+      //if(*(UNS32*)d->objdict[offset].pSubindex[1].pObject == cobID[i] + *d->bDeviceNodeId)
              *(UNS32*)d->objdict[offset].pSubindex[1].pObject = cobID[i] + nodeId;
       i ++;
       offset ++;
     }
   }
-  // bDeviceNodeId is defined in the object dictionary.
+  /* bDeviceNodeId is defined in the object dictionary. */
   *d->bDeviceNodeId = nodeId;
 }
+
+void _initialisation(){}
+void _preOperational(){}
+void _operational(){}
+void _stopped(){}