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: etisserant@0: /*****************************************************************************/ etisserant@0: void TestMaster_heartbeatError(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@0: void TestMaster_initialisation() etisserant@0: { etisserant@154: UNS32 PDO1_COBID = 0x0182; etisserant@154: UNS32 PDO2_COBID = 0x0282; etisserant@154: UNS8 size = sizeof(UNS32); 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 */ etisserant@154: } etisserant@154: greg@179: // Step counts number of times ConfigureSlaveNode is called greg@179: static 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 etisserant@154: * - setup slave TPDO 1 transmit time etisserant@154: * - setup slave TPDO 2 transmit time 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: ******************************************************** etisserant@154: * This is called first by TestMaster_preOperational 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: UNS32 abortCode; 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*/ greg@179: CheckSDOAndContinue); /*SDOCallback_t Callback*/ 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*/ greg@179: CheckSDOAndContinue); /*SDOCallback_t Callback*/ 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@0: void TestMaster_preOperational() etisserant@0: { etisserant@154: etisserant@0: eprintf("TestMaster_preOperational\n"); greg@179: ConfigureSlaveNode(&TestMaster_Data, 0x02); etisserant@154: etisserant@0: } etisserant@0: etisserant@0: void TestMaster_operational() etisserant@0: { etisserant@0: eprintf("TestMaster_operational\n"); etisserant@0: } etisserant@0: etisserant@0: void TestMaster_stopped() etisserant@0: { etisserant@0: eprintf("TestMaster_stopped\n"); etisserant@0: } etisserant@0: etisserant@0: void TestMaster_post_sync() etisserant@0: { etisserant@0: eprintf("TestMaster_post_sync\n"); greg@201: eprintf("Master: %d %d %d %d %d %d %d %d %d %x %x\n",MasterMap1,MasterMap2 ,MasterMap3, MasterMap4,MasterMap5,MasterMap6,MasterMap7,MasterMap8,MasterMap9,MasterMap10,MasterMap11); etisserant@0: } etisserant@0: etisserant@0: char query_result = 0; etisserant@0: char waiting_answer = 0; etisserant@0: etisserant@0: void TestMaster_post_TPDO() etisserant@0: { etisserant@0: eprintf("TestMaster_post_TPDO\n"); greg@179: // etisserant@0: // { etisserant@0: // char zero = 0; etisserant@0: // if(MasterMap4 > 0x80){ etisserant@0: // writeNetworkDict ( etisserant@0: // &TestMaster_Data, etisserant@0: // TestSlave_Data->bDeviceNodeId, etisserant@0: // 0x2002, etisserant@0: // 0x00, etisserant@0: // 1, etisserant@0: // 0, etisserant@0: // &zero); etisserant@0: // } etisserant@0: // } etisserant@0: etisserant@0: if(waiting_answer){ etisserant@0: UNS32 abortCode; etisserant@0: UNS8 size; etisserant@0: switch(getReadResultNetworkDict ( etisserant@0: &TestMaster_Data, greg@201: 0x02, etisserant@0: &query_result, etisserant@0: &size, etisserant@0: &abortCode)) etisserant@0: { etisserant@0: case SDO_FINISHED: etisserant@0: /* Do something with result here !!*/ etisserant@0: eprintf("Got SDO answer (0x2002, 0x00), %d %d\n",query_result,size); etisserant@0: case SDO_ABORTED_RCV: etisserant@0: case SDO_ABORTED_INTERNAL: etisserant@0: case SDO_RESET: etisserant@0: waiting_answer = 0; etisserant@0: closeSDOtransfer( etisserant@0: &TestMaster_Data, greg@201: 0x02, etisserant@0: SDO_CLIENT); etisserant@0: break; etisserant@0: case SDO_DOWNLOAD_IN_PROGRESS: etisserant@0: case SDO_UPLOAD_IN_PROGRESS: etisserant@0: break; etisserant@0: } etisserant@0: }else if(MasterMap1 % 10 == 0){ etisserant@0: readNetworkDict ( etisserant@0: &TestMaster_Data, greg@201: 0x02, etisserant@0: 0x2002, etisserant@0: 0x00, etisserant@0: 0); etisserant@0: waiting_answer = 1; etisserant@0: } greg@179: }