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