]> rtime.felk.cvut.cz Git - CanFestival-3.git/blobdiff - examples/TestMasterSlave/Master.c
Removed some warnings.
[CanFestival-3.git] / examples / TestMasterSlave / Master.c
index 3c1314fe08c0fb3f0f01c0f6322a6239c16d14a4..2a8716eb5e66da2c8dfccb15d2aee5ffdb7eb588 100644 (file)
@@ -24,8 +24,9 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 #include "Slave.h"
 #include "TestMasterSlave.h"
 
+extern s_BOARD MasterBoard;
 /*****************************************************************************/
-void TestMaster_heartbeatError(UNS8 heartbeatID)
+void TestMaster_heartbeatError(CO_Data* d, UNS8 heartbeatID)
 {
        eprintf("TestMaster_heartbeatError %d\n", heartbeatID);
 }
@@ -35,36 +36,58 @@ void TestMaster_heartbeatError(UNS8 heartbeatID)
  *  - setup master RPDO 1 to receive TPDO 1 from id 2
  *  - setup master RPDO 2 to receive TPDO 2 from id 2
  ********************************************************/
-void TestMaster_initialisation()
+void TestMaster_initialisation(CO_Data* d)
 {
        UNS32 PDO1_COBID = 0x0182; 
        UNS32 PDO2_COBID = 0x0282;
-       UNS8 size = sizeof(UNS32); 
-
+       UNS32 size = sizeof(UNS32); 
+       UNS32 SINC_cicle=0;
+       UNS8 data_type = 0;
+       
        eprintf("TestMaster_initialisation\n");
 
        /*****************************************
         * Define RPDOs to match slave ID=2 TPDOs*
         *****************************************/
-       setODentry( &TestMaster_Data, /*CO_Data* d*/
+       writeLocalDict( &TestMaster_Data, /*CO_Data* d*/
                        0x1400, /*UNS16 index*/
                        0x01, /*UNS8 subind*/ 
                        &PDO1_COBID, /*void * pSourceData,*/ 
                        &size, /* UNS8 * pExpectedSize*/
                        RW);  /* UNS8 checkAccess */
                        
-       setODentry( &TestMaster_Data, /*CO_Data* d*/
+       writeLocalDict( &TestMaster_Data, /*CO_Data* d*/
                        0x1401, /*UNS16 index*/
                        0x01, /*UNS8 subind*/ 
                        &PDO2_COBID, /*void * pSourceData,*/ 
                        &size, /* UNS8 * pExpectedSize*/
                        RW);  /* UNS8 checkAccess */
+                                       
+}
+
+// Step counts number of times ConfigureSlaveNode is called
+static int init_step = 0;
+
+/*Froward declaration*/
+static void ConfigureSlaveNode(CO_Data* d, UNS8 nodeId);
+
+/**/
+static void CheckSDOAndContinue(CO_Data* d, UNS8 nodeId)
+{
+       UNS32 abortCode;        
+       if(getWriteResultNetworkDict (d, nodeId, &abortCode) != SDO_FINISHED)
+               eprintf("Master : Failed in initializing slave %2.2x, step %d, AbortCode :%4.4x \n", nodeId, init_step, abortCode);
+
+       /* Finalise last SDO transfer with this node */
+       closeSDOtransfer(&TestMaster_Data, nodeId, SDO_CLIENT);
+
+       ConfigureSlaveNode(d, nodeId);
 }
 
 /********************************************************
  * ConfigureSlaveNode is responsible to
- *  - setup slave TPDO 1 transmit time
- *  - setup slave TPDO 2 transmit time
+ *  - setup slave TPDO 1 transmit type
+ *  - setup slave TPDO 2 transmit type
  *  - switch to operational mode
  *  - send NMT to slave
  ********************************************************
@@ -72,102 +95,117 @@ void TestMaster_initialisation()
  * Network Dictionary Access (SDO) with Callback 
  * Slave node state change request (NMT) 
  ********************************************************
- * This is called first by TestMaster_preOperational
+ * This is called first by TestMaster_post_SlaveBootup
  * then it called again each time a SDO exchange is
  * finished.
  ********************************************************/
 static void ConfigureSlaveNode(CO_Data* d, UNS8 nodeId)
 {
-       // Step counts number of times ConfigureSlaveNode is called
-       static step = 1;
-       
-       UNS8 Transmission_Type = 0x01; 
+       /* Master configure heartbeat producer time at 1000 ms 
+        * for slave node-id 0x02 by DCF concise */
+        
+       UNS8 Transmission_Type = 0x01;
        UNS32 abortCode;
        UNS8 res;
        eprintf("Master : ConfigureSlaveNode %2.2x\n", nodeId);
 
-       switch(step++){
+       switch(++init_step){
                case 1: /*First step : setup Slave's TPDO 1 to be transmitted on SYNC*/
                        eprintf("Master : set slave %2.2x TPDO 1 transmit type\n", nodeId);
                        res = writeNetworkDictCallBack (d, /*CO_Data* d*/
-                                       *TestSlave_Data.bDeviceNodeId, /*UNS8 nodeId*/
+                                       nodeId, /*UNS8 nodeId*/
                                        0x1800, /*UNS16 index*/
                                        0x02, /*UNS8 subindex*/
                                        1, /*UNS8 count*/
                                        0, /*UNS8 dataType*/
                                        &Transmission_Type,/*void *data*/
-                                       ConfigureSlaveNode); /*SDOCallback_t Callback*/                 break;
+                                       CheckSDOAndContinue); /*SDOCallback_t Callback*/
+                                       break;
+               
                case 2: /*Second step*/
-                       /*check and warn for previous slave OD access error*/
-                       if(getWriteResultNetworkDict (d, nodeId, &abortCode) != SDO_FINISHED)
-                               eprintf("Master : Couldn't set slave %2.2x TPDO 1 transmit type. AbortCode :%4.4x \n", nodeId, abortCode);
-
-                       /* Finalise last SDO transfer with this node */
-                       closeSDOtransfer(&TestMaster_Data,
-                                       *TestSlave_Data.bDeviceNodeId,
-                                       SDO_CLIENT);
-                                       
-                       /*Setup Slave's TPDO 1 to be transmitted on SYNC*/
                        eprintf("Master : set slave %2.2x TPDO 2 transmit type\n", nodeId);
                        writeNetworkDictCallBack (d, /*CO_Data* d*/
-                                       *TestSlave_Data.bDeviceNodeId, /*UNS8 nodeId*/
+                                       nodeId, /*UNS8 nodeId*/
                                        0x1801, /*UNS16 index*/
                                        0x02, /*UNS16 index*/
                                        1, /*UNS8 count*/
                                        0, /*UNS8 dataType*/
                                        &Transmission_Type,/*void *data*/
-                                       ConfigureSlaveNode); /*SDOCallback_t Callback*/
-                       break;
-               case 3: /*Last step*/
-                       /*check and warn for previous slave OD access error*/
-                       if(getWriteResultNetworkDict (d, nodeId, &abortCode) != SDO_FINISHED)
-                               eprintf("Master : Couldn't set slave %2.2x TPDO 2 transmit type. AbortCode :%4.4x \n", nodeId, abortCode);
-
-                       /* Finalise last SDO transfer with this node */
-                       closeSDOtransfer(&TestMaster_Data,
-                                       *TestSlave_Data.bDeviceNodeId,
-                                       SDO_CLIENT);
-
+                                       CheckSDOAndContinue); /*SDOCallback_t Callback*/
+                                       break;
+               case 3: 
+               
+               /****************************** START *******************************/
+               
                        /* Put the master in operational mode */
                        setState(d, Operational);
-                         
+                
                        /* Ask slave node to go in operational mode */
                        masterSendNMTstateChange (d, nodeId, NMT_Start_Node);
-       }
                        
+       }
 }
 
-void TestMaster_preOperational()
-{
 
+void TestMaster_preOperational(CO_Data* d)
+{
        eprintf("TestMaster_preOperational\n");
-       ConfigureSlaveNode(&TestMaster_Data, 2);
-       
 }
 
-void TestMaster_operational()
+void TestMaster_operational(CO_Data* d)
 {
        eprintf("TestMaster_operational\n");
 }
 
-void TestMaster_stopped()
+void TestMaster_stopped(CO_Data* d)
 {
        eprintf("TestMaster_stopped\n");
 }
 
-void TestMaster_post_sync()
+void TestMaster_post_sync(CO_Data* d)
 {
        eprintf("TestMaster_post_sync\n");
-       eprintf("Master: %d %d %d %d\n",MasterMap1, MasterMap2, MasterMap3, MasterMap4);
+       eprintf("Master: %d %d %d %d %d %d %d %d %d %x %x %d %d\n",
+               MasterMap1,
+               MasterMap2,
+               MasterMap3, 
+               MasterMap4,
+               MasterMap5,
+               MasterMap6,
+               MasterMap7,
+               MasterMap8,
+               MasterMap9,
+               MasterMap10,
+               MasterMap11,
+               MasterMap12,
+               MasterMap13);
+}
+
+void TestMaster_post_emcy(CO_Data* d, UNS8 nodeID, UNS16 errCode, UNS8 errReg)
+{
+       eprintf("Master received EMCY message. Node: %2.2x  ErrorCode: %4.4x  ErrorRegister: %2.2x\n", nodeID, errCode, errReg);
 }
 
 char query_result = 0;
 char waiting_answer = 0;
 
-void TestMaster_post_TPDO()
+static void CheckSDO(CO_Data* d, UNS8 nodeId)
 {
-       eprintf("TestMaster_post_TPDO\n");
+       UNS32 abortCode;        
+       if(getWriteResultNetworkDict (d, nodeId, &abortCode) != SDO_FINISHED)
+               eprintf("Master : Failed in changing Slave's transmit type AbortCode :%4.4x \n", abortCode);
+
+       /* Finalise last SDO transfer with this node */
+       closeSDOtransfer(&TestMaster_Data, nodeId, SDO_CLIENT);
+}
+
 
+static int MasterSyncCount = 0;
+void TestMaster_post_TPDO(CO_Data* d)
+{
+       eprintf("TestMaster_post_TPDO MasterSyncCount = %d \n", MasterSyncCount);
+//
 //     {
 //             char zero = 0;
 //             if(MasterMap4 > 0x80){
@@ -182,12 +220,13 @@ void TestMaster_post_TPDO()
 //             }
 //     }
 
+#if 0
        if(waiting_answer){
                UNS32 abortCode;                        
-               UNS8 size;                      
+               UNS8 size = 1;                  
                switch(getReadResultNetworkDict (
                        &TestMaster_Data, 
-                       *TestSlave_Data.bDeviceNodeId,
+                       0x02,
                        &query_result,
                        &size,
                        &abortCode))
@@ -201,21 +240,58 @@ void TestMaster_post_TPDO()
                                waiting_answer = 0;
                                closeSDOtransfer(
                                        &TestMaster_Data,
-                                       *TestSlave_Data.        bDeviceNodeId,
+                                       0x02,
                                        SDO_CLIENT);
                        break;
                        case SDO_DOWNLOAD_IN_PROGRESS:
                        case SDO_UPLOAD_IN_PROGRESS:
                        break;
                }
-       }else if(MasterMap1 % 10 == 0){
+       }else if(MasterSyncCount % 10 == 0){
                readNetworkDict (
                        &TestMaster_Data,
-                       *TestSlave_Data.bDeviceNodeId,
+                       0x02,
                        0x2002,
                        0x00,
                        0);
                waiting_answer = 1;
        }
-               
+#endif 
+       if(MasterSyncCount % 17 == 0){
+               eprintf("Master : Ask RTR PDO (0x1402)\n");
+               sendPDOrequest(&TestMaster_Data, 0x1402 );
+               sendPDOrequest(&TestMaster_Data, 0x1403 );
+       }
+       if(MasterSyncCount % 50 == 0){
+               eprintf("Master : Change slave's transmit type to 0xFF\n");
+               UNS8 transmitiontype = 0xFF;
+               writeNetworkDictCallBack (&TestMaster_Data, /*CO_Data* d*/
+                                       2, /*UNS8 nodeId*/
+                                       0x1802, /*UNS16 index*/
+                                       0x02, /*UNS16 index*/
+                                       1, /*UNS8 count*/
+                                       0, /*UNS8 dataType*/
+                                       &transmitiontype,/*void *data*/
+                                       CheckSDO); /*SDOCallback_t Callback*/
+       }
+       if(MasterSyncCount % 50 == 25){
+               eprintf("Master : Change slave's transmit type to 0x00\n");
+               UNS8 transmitiontype = 0x00;
+               writeNetworkDictCallBack (&TestMaster_Data, /*CO_Data* d*/
+                                       2, /*UNS8 nodeId*/
+                                       0x1802, /*UNS16 index*/
+                                       0x02, /*UNS16 index*/
+                                       1, /*UNS8 count*/
+                                       0, /*UNS8 dataType*/
+                                       &transmitiontype,/*void *data*/
+                                       CheckSDO); /*SDOCallback_t Callback*/
+       }
+       MasterSyncCount++;
+}
+
+void TestMaster_post_SlaveBootup(CO_Data* d, UNS8 nodeid)
+{
+       eprintf("TestMaster_post_SlaveBootup %x\n", nodeid);
+       
+       ConfigureSlaveNode(d, nodeid);
 }