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 etisserant@0: #include etisserant@0: #include etisserant@0: #include etisserant@0: #include etisserant@0: #include etisserant@0: etisserant@0: #include etisserant@0: #include etisserant@0: #include etisserant@0: etisserant@0: #include "Master.h" etisserant@0: #include "Slave.h" etisserant@0: #include "TestMasterSlave.h" etisserant@0: etisserant@0: #define MyCase(fc) case fc: eprintf(#fc);break; etisserant@0: void print_message(Message *m) etisserant@0: { etisserant@0: int i; etisserant@0: switch(m->cob_id.w >> 7) etisserant@0: { etisserant@0: MyCase(SYNC) etisserant@0: MyCase(TIME_STAMP) etisserant@0: MyCase(PDO1tx) etisserant@0: MyCase(PDO1rx) etisserant@0: MyCase(PDO2tx) etisserant@0: MyCase(PDO2rx) etisserant@0: MyCase(PDO3tx) etisserant@0: MyCase(PDO3rx) etisserant@0: MyCase(PDO4tx) etisserant@0: MyCase(PDO4rx) etisserant@0: MyCase(SDOtx) etisserant@0: MyCase(SDOrx) etisserant@0: MyCase(NODE_GUARD) etisserant@0: MyCase(NMT) etisserant@0: } etisserant@0: eprintf(" rtr:%d", m->rtr); etisserant@0: eprintf(" len:%d", m->len); etisserant@0: for (i = 0 ; i < m->len ; i++) etisserant@0: eprintf(" %02x", m->data[i]); etisserant@0: eprintf("\n"); etisserant@0: } etisserant@0: etisserant@0: UNS32 OnMasterMap1Update(CO_Data* d, const indextable * unsused_indextable, UNS8 unsused_bSubindex) etisserant@0: { etisserant@0: eprintf("OnSlaveMap1Update:%d\n", SlaveMap1); lbessard@31: return 0; etisserant@0: } etisserant@0: etisserant@0: etisserant@0: etisserant@0: void InitNodes(CO_Data* d, UNS32 id) etisserant@0: { etisserant@0: // TestSlave_Index2000_callbacks[0] = &OnMasterMap1Update; etisserant@0: RegisterSetODentryCallBack(&TestMaster_Data, 0x2000, 0, &OnMasterMap1Update); etisserant@0: etisserant@0: /****************************** INITIALISATION MASTER *******************************/ etisserant@0: /* Defining the node Id */ etisserant@0: setNodeId(&TestMaster_Data, 0x01); etisserant@0: etisserant@0: /* init */ etisserant@0: setState(&TestMaster_Data, Initialisation); etisserant@0: etisserant@0: /****************************** INITIALISATION SLAVE *******************************/ etisserant@0: /* Defining the node Id */ etisserant@0: setNodeId(&TestSlave_Data, 0x02); etisserant@0: etisserant@0: /* init */ etisserant@0: setState(&TestSlave_Data, Initialisation); etisserant@0: etisserant@0: /****************************** START *******************************/ etisserant@0: /* Put the master in operational mode */ etisserant@0: setState(&TestMaster_Data, Operational); etisserant@0: etisserant@0: masterSendNMTstateChange (&TestMaster_Data, 0x02, NMT_Start_Node); etisserant@0: etisserant@0: } etisserant@0: etisserant@0: CAN_HANDLE SlaveCanHandle; etisserant@0: CAN_HANDLE MasterCanHandle; etisserant@0: etisserant@0: // Baudrate values for Peak board : etisserant@0: // CAN_BAUD_1M CAN_BAUD_500K CAN_BAUD_250K CAN_BAUD_125K CAN_BAUD_100K CAN_BAUD_50K etisserant@0: // CAN_BAUD_20K CAN_BAUD_10K CAN_BAUD_5K etisserant@0: etisserant@0: #ifdef CAN_BAUD_500K etisserant@0: // Appli have been compiled for Peak. Baudrate is defined etisserant@0: # define BAUDRATE CAN_BAUD_500K etisserant@0: #else etisserant@0: // Appli have been compiled for Generic. Baudrate not used etisserant@0: # define BAUDRATE 0 etisserant@0: #endif etisserant@0: etisserant@0: void catch_signal(int sig) etisserant@0: { etisserant@0: signal(SIGTERM, catch_signal); etisserant@0: signal(SIGINT, catch_signal); etisserant@0: stopTimer(); etisserant@0: eprintf("Got Sigterm - Finishing.\n"); etisserant@0: } etisserant@0: etisserant@0: etisserant@0: void help() etisserant@0: { etisserant@0: printf("**************************************************************\n"); etisserant@0: printf("* TestMasterSlave *\n"); etisserant@0: printf("* *\n"); etisserant@0: printf("* A simple example for PC. It does implement 2 CanOpen *\n"); etisserant@0: printf("* nodes in the same process. A master and a slave. Both *\n"); etisserant@0: printf("* communicate together, exchanging periodically NMT, SYNC, *\n"); etisserant@0: printf("* SDO and PDO. *\n"); etisserant@0: printf("* *\n"); etisserant@0: printf("* If you have chosen virtual CAN driver, just type *\n"); etisserant@0: printf("* ./TestMasterSlave *\n"); etisserant@0: printf("* *\n"); lbessard@31: printf("* Else you need to specify bus: *\n"); etisserant@0: printf("* *\n"); etisserant@0: printf("* -s : slave CAN bus [default 0, peak first PCI] *\n"); etisserant@0: printf("* -m : master CAN bus [default 1, peak second PCI] *\n"); etisserant@0: printf("* *\n"); etisserant@0: printf("**************************************************************\n"); etisserant@0: } etisserant@0: etisserant@0: /****************************************************************************/ etisserant@0: /*************************** MAIN *****************************************/ etisserant@0: /****************************************************************************/ etisserant@0: int main(int argc,char **argv) etisserant@0: { etisserant@0: s_BOARD SlaveBoard = {"0", BAUDRATE, &TestSlave_Data}; etisserant@0: s_BOARD MasterBoard = {"1", BAUDRATE, &TestMaster_Data}; etisserant@0: etisserant@0: etisserant@0: char c; etisserant@0: extern char *optarg; etisserant@0: etisserant@0: while ((c = getopt(argc, argv, "-m:s:")) != EOF) etisserant@0: { etisserant@0: switch(c) etisserant@0: { etisserant@0: case 's' : etisserant@0: if (optarg[0] == 0) etisserant@0: { etisserant@0: help(); etisserant@0: exit(1); etisserant@0: } etisserant@0: SlaveBoard.busname = optarg; etisserant@0: break; etisserant@0: case 'm' : etisserant@0: if (optarg[0] == 0) etisserant@0: { etisserant@0: help(); etisserant@0: exit(1); etisserant@0: } etisserant@0: MasterBoard.busname = optarg; etisserant@0: break; etisserant@0: default: etisserant@0: help(); etisserant@0: exit(1); etisserant@0: } etisserant@0: } etisserant@0: etisserant@0: /* install signal handler for manual break */ etisserant@0: signal(SIGTERM, catch_signal); etisserant@0: signal(SIGINT, catch_signal); etisserant@0: etisserant@0: // Open CAN devices etisserant@0: SlaveCanHandle = canOpen(&SlaveBoard); etisserant@0: MasterCanHandle = canOpen(&MasterBoard); etisserant@0: etisserant@0: // Will call InitNodes, and wait and handle next timer events. etisserant@0: TimerLoop(&InitNodes); etisserant@0: etisserant@0: // Close CAN devices etisserant@0: canClose(SlaveCanHandle); etisserant@0: canClose(MasterCanHandle); etisserant@0: etisserant@0: etisserant@0: return 0; etisserant@0: }