2 This file is part of CanFestival, a library implementing CanOpen Stack.
4 Copyright (C): Edouard TISSERANT and Francis DUPIN
6 See COPYING file for copyrights details.
8 This library is free software; you can redistribute it and/or
9 modify it under the terms of the GNU Lesser General Public
10 License as published by the Free Software Foundation; either
11 version 2.1 of the License, or (at your option) any later version.
13 This library is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public
19 License along with this library; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 #if defined(WIN32) && !defined(__CYGWIN__)
38 #include "canfestival.h"
39 //#include <can_driver.h>
40 //#include <timers_driver.h>
44 #include "TestMasterSlave.h"
46 UNS32 OnMasterMap1Update(CO_Data* d, const indextable * unsused_indextable, UNS8 unsused_bSubindex)
48 eprintf("OnSlaveMap1Update:%d\n", SlaveMap1);
52 s_BOARD SlaveBoard = {"0", "125K"};
53 s_BOARD MasterBoard = {"1", "125K"};
55 #if !defined(WIN32) || defined(__CYGWIN__)
56 void catch_signal(int sig)
58 signal(SIGTERM, catch_signal);
59 signal(SIGINT, catch_signal);
60 eprintf("Got Signal %d\n",sig);
66 printf("**************************************************************\n");
67 printf("* TestMasterSlave *\n");
69 printf("* A simple example for PC. It does implement 2 CanOpen *\n");
70 printf("* nodes in the same process. A master and a slave. Both *\n");
71 printf("* communicate together, exchanging periodically NMT, SYNC, *\n");
72 printf("* SDO and PDO. Master configure heartbeat producer time *\n");
73 printf("* at 1000 ms for slave node-id 0x02 by concise DCF. *\n");
75 printf("* Usage: *\n");
76 printf("* ./TestMasterSlave [OPTIONS] *\n");
78 printf("* OPTIONS: *\n");
79 printf("* -l : Can library [\"libcanfestival_can_virtual.so\"] *\n");
81 printf("* Slave: *\n");
82 printf("* -s : bus name [\"0\"] *\n");
83 printf("* -S : 1M,500K,250K,125K,100K,50K,20K,10K,none(disable) *\n");
85 printf("* Master: *\n");
86 printf("* -m : bus name [\"1\"] *\n");
87 printf("* -M : 1M,500K,250K,125K,100K,50K,20K,10K,none(disable) *\n");
89 printf("**************************************************************\n");
92 /*************************** INIT *****************************************/
93 void InitNodes(CO_Data* d, UNS32 id)
95 /****************************** INITIALISATION SLAVE *******************************/
96 if(strcmp(SlaveBoard.baudrate, "none")) {
97 setNodeId(&TestSlave_Data, 0x02);
100 setState(&TestSlave_Data, Initialisation);
103 /****************************** INITIALISATION MASTER *******************************/
104 if(strcmp(MasterBoard.baudrate, "none")){
105 RegisterSetODentryCallBack(&TestMaster_Data, 0x2000, 0, &OnMasterMap1Update);
107 /* Defining the node Id */
108 setNodeId(&TestMaster_Data, 0x01);
111 setState(&TestMaster_Data, Initialisation);
116 /*************************** EXIT *****************************************/
117 void Exit(CO_Data* d, UNS32 id)
119 masterSendNMTstateChange(&TestMaster_Data, 0x02, NMT_Reset_Node);
122 setState(&TestMaster_Data, Stopped);
125 /****************************************************************************/
126 /*************************** MAIN *****************************************/
127 /****************************************************************************/
128 int main(int argc,char **argv)
133 char* LibraryPath="../../drivers/can_virtual/libcanfestival_can_virtual.so";
135 while ((c = getopt(argc, argv, "-m:s:M:S:l:")) != EOF)
145 SlaveBoard.busname = optarg;
153 MasterBoard.busname = optarg;
161 SlaveBoard.baudrate = optarg;
169 MasterBoard.baudrate = optarg;
177 LibraryPath = optarg;
185 #if !defined(WIN32) || defined(__CYGWIN__)
186 /* install signal handler for manual break */
187 signal(SIGTERM, catch_signal);
188 signal(SIGINT, catch_signal);
192 #ifndef NOT_USE_DYNAMIC_LOADING
193 if (LoadCanDriver(LibraryPath) == NULL)
194 printf("Unable to load library: %s\n",LibraryPath);
198 if(strcmp(SlaveBoard.baudrate, "none")){
200 TestSlave_Data.heartbeatError = TestSlave_heartbeatError;
201 TestSlave_Data.initialisation = TestSlave_initialisation;
202 TestSlave_Data.preOperational = TestSlave_preOperational;
203 TestSlave_Data.operational = TestSlave_operational;
204 TestSlave_Data.stopped = TestSlave_stopped;
205 TestSlave_Data.post_sync = TestSlave_post_sync;
206 TestSlave_Data.post_TPDO = TestSlave_post_TPDO;
207 TestSlave_Data.storeODSubIndex = TestSlave_storeODSubIndex;
208 TestSlave_Data.post_emcy = TestSlave_post_emcy;
210 if(!canOpen(&SlaveBoard,&TestSlave_Data)){
211 eprintf("Cannot open Slave Board (%s,%s)\n",SlaveBoard.busname, SlaveBoard.baudrate);
215 if(strcmp(MasterBoard.baudrate, "none")){
217 TestMaster_Data.heartbeatError = TestMaster_heartbeatError;
218 TestMaster_Data.initialisation = TestMaster_initialisation;
219 TestMaster_Data.preOperational = TestMaster_preOperational;
220 TestMaster_Data.operational = TestMaster_operational;
221 TestMaster_Data.stopped = TestMaster_stopped;
222 TestMaster_Data.post_sync = TestMaster_post_sync;
223 TestMaster_Data.post_TPDO = TestMaster_post_TPDO;
224 TestMaster_Data.post_emcy = TestMaster_post_emcy;
225 TestMaster_Data.post_SlaveBootup=TestMaster_post_SlaveBootup;
227 if(!canOpen(&MasterBoard,&TestMaster_Data)){
228 eprintf("Cannot open Master Board (%s,%s)\n",MasterBoard.busname, MasterBoard.baudrate);
233 // Start timer thread
234 StartTimerLoop(&InitNodes);
240 StopTimerLoop(&Exit);
242 // Close CAN devices (and can threads)
243 if(strcmp(MasterBoard.baudrate, "none")) canClose(&TestMaster_Data);
245 if(strcmp(SlaveBoard.baudrate, "none")) canClose(&TestSlave_Data);