etisserant@0: /* etisserant@0: This file is part of CanFestival, a library implementing CanOpen Stack. etisserant@0: etisserant@0: Copyright (C): Edouard TISSERANT and Francis DUPIN etisserant@0: etisserant@0: See COPYING file for copyrights details. etisserant@0: etisserant@0: This library is free software; you can redistribute it and/or etisserant@0: modify it under the terms of the GNU Lesser General Public etisserant@0: License as published by the Free Software Foundation; either etisserant@0: version 2.1 of the License, or (at your option) any later version. etisserant@0: etisserant@0: This library is distributed in the hope that it will be useful, etisserant@0: but WITHOUT ANY WARRANTY; without even the implied warranty of etisserant@0: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU etisserant@0: Lesser General Public License for more details. etisserant@0: etisserant@0: You should have received a copy of the GNU Lesser General Public etisserant@0: License along with this library; if not, write to the Free Software etisserant@0: Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA etisserant@0: */ etisserant@0: etisserant@0: #include "Master.h" etisserant@0: #include "Slave.h" etisserant@0: #include "TestMasterSlave.h" etisserant@0: groke6@381: extern s_BOARD MasterBoard; etisserant@0: /*****************************************************************************/ etisserant@378: void TestMaster_heartbeatError(CO_Data* d, UNS8 heartbeatID) etisserant@0: { etisserant@0: eprintf("TestMaster_heartbeatError %d\n", heartbeatID); etisserant@0: } etisserant@0: etisserant@154: /******************************************************** etisserant@154: * ConfigureSlaveNode is responsible to etisserant@154: * - setup master RPDO 1 to receive TPDO 1 from id 2 etisserant@154: * - setup master RPDO 2 to receive TPDO 2 from id 2 etisserant@154: ********************************************************/ etisserant@378: void TestMaster_initialisation(CO_Data* d) etisserant@0: { etisserant@154: UNS32 PDO1_COBID = 0x0182; etisserant@154: UNS32 PDO2_COBID = 0x0282; etisserant@540: UNS32 size = sizeof(UNS32); groke6@362: UNS32 SINC_cicle=0; groke6@362: UNS8 data_type = 0; greg@179: etisserant@0: eprintf("TestMaster_initialisation\n"); etisserant@154: etisserant@154: /***************************************** etisserant@154: * Define RPDOs to match slave ID=2 TPDOs* etisserant@154: *****************************************/ etisserant@175: writeLocalDict( &TestMaster_Data, /*CO_Data* d*/ etisserant@154: 0x1400, /*UNS16 index*/ etisserant@154: 0x01, /*UNS8 subind*/ etisserant@154: &PDO1_COBID, /*void * pSourceData,*/ etisserant@154: &size, /* UNS8 * pExpectedSize*/ etisserant@154: RW); /* UNS8 checkAccess */ etisserant@154: etisserant@175: writeLocalDict( &TestMaster_Data, /*CO_Data* d*/ etisserant@154: 0x1401, /*UNS16 index*/ etisserant@154: 0x01, /*UNS8 subind*/ etisserant@154: &PDO2_COBID, /*void * pSourceData,*/ etisserant@154: &size, /* UNS8 * pExpectedSize*/ etisserant@154: RW); /* UNS8 checkAccess */ groke6@381: etisserant@154: } etisserant@154: greg@179: // Step counts number of times ConfigureSlaveNode is called greg@454: static int init_step = 0; greg@179: greg@179: /*Froward declaration*/ greg@179: static void ConfigureSlaveNode(CO_Data* d, UNS8 nodeId); greg@179: greg@179: /**/ greg@179: static void CheckSDOAndContinue(CO_Data* d, UNS8 nodeId) greg@179: { greg@179: UNS32 abortCode; greg@179: if(getWriteResultNetworkDict (d, nodeId, &abortCode) != SDO_FINISHED) greg@179: eprintf("Master : Failed in initializing slave %2.2x, step %d, AbortCode :%4.4x \n", nodeId, init_step, abortCode); greg@179: greg@179: /* Finalise last SDO transfer with this node */ greg@179: closeSDOtransfer(&TestMaster_Data, nodeId, SDO_CLIENT); greg@179: greg@179: ConfigureSlaveNode(d, nodeId); greg@179: } greg@179: etisserant@154: /******************************************************** etisserant@154: * ConfigureSlaveNode is responsible to groke6@381: * - setup slave TPDO 1 transmit type groke6@381: * - setup slave TPDO 2 transmit type etisserant@154: * - switch to operational mode etisserant@154: * - send NMT to slave etisserant@154: ******************************************************** etisserant@154: * This an example of : etisserant@154: * Network Dictionary Access (SDO) with Callback etisserant@154: * Slave node state change request (NMT) etisserant@154: ******************************************************** groke6@381: * This is called first by TestMaster_post_SlaveBootup etisserant@154: * then it called again each time a SDO exchange is etisserant@154: * finished. etisserant@154: ********************************************************/ greg@179: etisserant@154: static void ConfigureSlaveNode(CO_Data* d, UNS8 nodeId) etisserant@154: { greg@179: /* Master configure heartbeat producer time at 1000 ms greg@179: * for slave node-id 0x02 by DCF concise */ greg@179: greg@179: UNS8 Transmission_Type = 0x01; etisserant@154: UNS8 res; etisserant@154: eprintf("Master : ConfigureSlaveNode %2.2x\n", nodeId); etisserant@154: greg@179: switch(++init_step){ etisserant@154: case 1: /*First step : setup Slave's TPDO 1 to be transmitted on SYNC*/ etisserant@154: eprintf("Master : set slave %2.2x TPDO 1 transmit type\n", nodeId); etisserant@154: res = writeNetworkDictCallBack (d, /*CO_Data* d*/ greg@179: nodeId, /*UNS8 nodeId*/ etisserant@154: 0x1800, /*UNS16 index*/ etisserant@154: 0x02, /*UNS8 subindex*/ etisserant@154: 1, /*UNS8 count*/ etisserant@154: 0, /*UNS8 dataType*/ etisserant@154: &Transmission_Type,/*void *data*/ fbeaulier@664: CheckSDOAndContinue, /*SDOCallback_t Callback*/ fbeaulier@664: 0); /* use block mode */ greg@179: break; greg@179: etisserant@154: case 2: /*Second step*/ etisserant@154: eprintf("Master : set slave %2.2x TPDO 2 transmit type\n", nodeId); etisserant@154: writeNetworkDictCallBack (d, /*CO_Data* d*/ greg@179: nodeId, /*UNS8 nodeId*/ etisserant@154: 0x1801, /*UNS16 index*/ etisserant@154: 0x02, /*UNS16 index*/ etisserant@154: 1, /*UNS8 count*/ etisserant@154: 0, /*UNS8 dataType*/ etisserant@154: &Transmission_Type,/*void *data*/ fbeaulier@664: CheckSDOAndContinue, /*SDOCallback_t Callback*/ fbeaulier@664: 0); /* use block mode */ greg@179: break; greg@179: case 3: greg@179: greg@179: /****************************** START *******************************/ greg@179: etisserant@154: /* Put the master in operational mode */ etisserant@154: setState(d, Operational); greg@179: etisserant@154: /* Ask slave node to go in operational mode */ etisserant@154: masterSendNMTstateChange (d, nodeId, NMT_Start_Node); greg@179: etisserant@154: } etisserant@0: } etisserant@0: etisserant@343: etisserant@378: void TestMaster_preOperational(CO_Data* d) etisserant@0: { etisserant@0: eprintf("TestMaster_preOperational\n"); etisserant@0: } etisserant@0: etisserant@378: void TestMaster_operational(CO_Data* d) etisserant@0: { etisserant@0: eprintf("TestMaster_operational\n"); etisserant@0: } etisserant@0: etisserant@378: void TestMaster_stopped(CO_Data* d) etisserant@0: { etisserant@0: eprintf("TestMaster_stopped\n"); etisserant@0: } etisserant@0: etisserant@378: void TestMaster_post_sync(CO_Data* d) etisserant@0: { etisserant@0: eprintf("TestMaster_post_sync\n"); etisserant@236: eprintf("Master: %d %d %d %d %d %d %d %d %d %x %x %d %d\n", etisserant@236: MasterMap1, etisserant@236: MasterMap2, etisserant@236: MasterMap3, etisserant@236: MasterMap4, etisserant@236: MasterMap5, etisserant@236: MasterMap6, etisserant@236: MasterMap7, etisserant@236: MasterMap8, etisserant@236: MasterMap9, etisserant@236: MasterMap10, etisserant@236: MasterMap11, etisserant@236: MasterMap12, etisserant@236: MasterMap13); etisserant@0: } etisserant@0: etisserant@378: void TestMaster_post_emcy(CO_Data* d, UNS8 nodeID, UNS16 errCode, UNS8 errReg) luis@284: { luis@284: eprintf("Master received EMCY message. Node: %2.2x ErrorCode: %4.4x ErrorRegister: %2.2x\n", nodeID, errCode, errReg); luis@284: } luis@284: etisserant@0: char query_result = 0; etisserant@0: char waiting_answer = 0; etisserant@0: etisserant@236: static void CheckSDO(CO_Data* d, UNS8 nodeId) etisserant@236: { etisserant@236: UNS32 abortCode; etisserant@236: if(getWriteResultNetworkDict (d, nodeId, &abortCode) != SDO_FINISHED) etisserant@236: eprintf("Master : Failed in changing Slave's transmit type AbortCode :%4.4x \n", abortCode); etisserant@236: etisserant@236: /* Finalise last SDO transfer with this node */ etisserant@236: closeSDOtransfer(&TestMaster_Data, nodeId, SDO_CLIENT); etisserant@236: } etisserant@236: etisserant@236: etisserant@236: static int MasterSyncCount = 0; etisserant@378: void TestMaster_post_TPDO(CO_Data* d) etisserant@0: { etisserant@236: eprintf("TestMaster_post_TPDO MasterSyncCount = %d \n", MasterSyncCount); etisserant@236: if(MasterSyncCount % 17 == 0){ etisserant@236: eprintf("Master : Ask RTR PDO (0x1402)\n"); etisserant@236: sendPDOrequest(&TestMaster_Data, 0x1402 ); etisserant@236: sendPDOrequest(&TestMaster_Data, 0x1403 ); etisserant@236: } etisserant@236: if(MasterSyncCount % 50 == 0){ greg@592: UNS8 transmitiontype; etisserant@236: eprintf("Master : Change slave's transmit type to 0xFF\n"); greg@592: transmitiontype = 0xFF; etisserant@236: writeNetworkDictCallBack (&TestMaster_Data, /*CO_Data* d*/ etisserant@236: 2, /*UNS8 nodeId*/ etisserant@236: 0x1802, /*UNS16 index*/ etisserant@236: 0x02, /*UNS16 index*/ etisserant@236: 1, /*UNS8 count*/ etisserant@236: 0, /*UNS8 dataType*/ etisserant@236: &transmitiontype,/*void *data*/ fbeaulier@664: CheckSDO, /*SDOCallback_t Callback*/ fbeaulier@664: 0); /* use block mode */ fbeaulier@664: } etisserant@236: if(MasterSyncCount % 50 == 25){ greg@592: UNS8 transmitiontype = 0x00; etisserant@236: eprintf("Master : Change slave's transmit type to 0x00\n"); etisserant@236: writeNetworkDictCallBack (&TestMaster_Data, /*CO_Data* d*/ etisserant@236: 2, /*UNS8 nodeId*/ etisserant@236: 0x1802, /*UNS16 index*/ etisserant@236: 0x02, /*UNS16 index*/ etisserant@236: 1, /*UNS8 count*/ etisserant@236: 0, /*UNS8 dataType*/ etisserant@236: &transmitiontype,/*void *data*/ fbeaulier@664: CheckSDO, /*SDOCallback_t Callback*/ fbeaulier@664: 0); /* use block mode */ etisserant@236: } etisserant@236: MasterSyncCount++; etisserant@236: } etisserant@343: etisserant@378: void TestMaster_post_SlaveBootup(CO_Data* d, UNS8 nodeid) etisserant@343: { etisserant@343: eprintf("TestMaster_post_SlaveBootup %x\n", nodeid); groke6@362: groke6@381: ConfigureSlaveNode(d, nodeid); groke6@381: }