diff -r 003cc3c63855 -r f49e5a6b7804 doc/doxygen/html/TestMasterSlave_8c-source.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/doxygen/html/TestMasterSlave_8c-source.html Fri Jun 08 09:23:56 2007 +0200 @@ -0,0 +1,267 @@ + + +CanFestival: examples/TestMasterSlave/TestMasterSlave.c Source File + + + + +
+
+
+
+ +

TestMasterSlave.c

Go to the documentation of this file.
00001 /*
+00002 This file is part of CanFestival, a library implementing CanOpen Stack. 
+00003 
+00004 Copyright (C): Edouard TISSERANT and Francis DUPIN
+00005 
+00006 See COPYING file for copyrights details.
+00007 
+00008 This library is free software; you can redistribute it and/or
+00009 modify it under the terms of the GNU Lesser General Public
+00010 License as published by the Free Software Foundation; either
+00011 version 2.1 of the License, or (at your option) any later version.
+00012 
+00013 This library is distributed in the hope that it will be useful,
+00014 but WITHOUT ANY WARRANTY; without even the implied warranty of
+00015 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+00016 Lesser General Public License for more details.
+00017 
+00018 You should have received a copy of the GNU Lesser General Public
+00019 License along with this library; if not, write to the Free Software
+00020 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+00021 */
+00022 
+00023 #if defined(WIN32) && !defined(__CYGWIN__)
+00024 #include <windows.h>
+00025 #include "getopt.h"
+00026 void pause(void)
+00027 {
+00028         system("PAUSE");
+00029 }
+00030 #else
+00031 #include <stdio.h>
+00032 #include <string.h>
+00033 #include <unistd.h>
+00034 #include <stdlib.h>
+00035 #include <signal.h>
+00036 #endif
+00037 
+00038 #include "canfestival.h"
+00039 //#include <can_driver.h>
+00040 //#include <timers_driver.h>
+00041 
+00042 #include "Master.h"
+00043 #include "Slave.h"
+00044 #include "TestMasterSlave.h"
+00045 
+00046 UNS32 OnMasterMap1Update(CO_Data* d, const indextable * unsused_indextable, UNS8 unsused_bSubindex)
+00047 {
+00048         eprintf("OnSlaveMap1Update:%d\n", SlaveMap1);
+00049         return 0;
+00050 }
+00051 
+00052 s_BOARD SlaveBoard = {"0", "125K"};
+00053 s_BOARD MasterBoard = {"1", "125K"};
+00054 
+00055 #if !defined(WIN32) || defined(__CYGWIN__)
+00056 void catch_signal(int sig)
+00057 {
+00058   signal(SIGTERM, catch_signal);
+00059   signal(SIGINT, catch_signal);
+00060   eprintf("Got Signal %d\n",sig);
+00061 }
+00062 #endif
+00063 
+00064 void help()
+00065 {
+00066   printf("**************************************************************\n");
+00067   printf("*  TestMasterSlave                                           *\n");
+00068   printf("*                                                            *\n");
+00069   printf("*  A simple example for PC. It does implement 2 CanOpen      *\n");
+00070   printf("*  nodes in the same process. A master and a slave. Both     *\n");
+00071   printf("*  communicate together, exchanging periodically NMT, SYNC,  *\n");
+00072   printf("*  SDO and PDO. Master configure heartbeat producer time     *\n");
+00073   printf("*  at 1000 ms for slave node-id 0x02 by concise DCF.         *\n");                                  
+00074   printf("*                                                            *\n");
+00075   printf("*   Usage:                                                   *\n");
+00076   printf("*   ./TestMasterSlave  [OPTIONS]                             *\n");
+00077   printf("*                                                            *\n");
+00078   printf("*   OPTIONS:                                                 *\n");
+00079   printf("*     -l : Can library [\"libcanfestival_can_virtual.so\"]     *\n");
+00080   printf("*                                                            *\n");
+00081   printf("*    Slave:                                                  *\n");
+00082   printf("*     -s : bus name [\"0\"]                                    *\n");
+00083   printf("*     -S : 1M,500K,250K,125K,100K,50K,20K,10K,none(disable)  *\n");
+00084   printf("*                                                            *\n");
+00085   printf("*    Master:                                                 *\n");
+00086   printf("*     -m : bus name [\"1\"]                                    *\n");
+00087   printf("*     -M : 1M,500K,250K,125K,100K,50K,20K,10K,none(disable)  *\n");
+00088   printf("*                                                            *\n");
+00089   printf("**************************************************************\n");
+00090 }
+00091 
+00092 /***************************  INIT  *****************************************/
+00093 void InitNodes(CO_Data* d, UNS32 id)
+00094 {
+00095         /****************************** INITIALISATION SLAVE *******************************/
+00096         if(strcmp(SlaveBoard.baudrate, "none")) {
+00097                 /* Defining the node Id */
+00098                 setNodeId(&TestSlave_Data, 0x02);
+00099                 /* init */
+00100                 setState(&TestSlave_Data, Initialisation);
+00101         }
+00102 
+00103         /****************************** INITIALISATION MASTER *******************************/
+00104         if(strcmp(MasterBoard.baudrate, "none")){
+00105                 RegisterSetODentryCallBack(&TestMaster_Data, 0x2000, 0, &OnMasterMap1Update);
+00106                 
+00107                 /* Defining the node Id */
+00108                 setNodeId(&TestMaster_Data, 0x01);
+00109 
+00110                 /* init */
+00111                 setState(&TestMaster_Data, Initialisation);
+00112                         
+00113         }
+00114 }
+00115 
+00116 /****************************************************************************/
+00117 /***************************  MAIN  *****************************************/
+00118 /****************************************************************************/
+00119 int main(int argc,char **argv)
+00120 {
+00121 
+00122   int c;
+00123   extern char *optarg;
+00124   char* LibraryPath="libcanfestival_can_virtual.so";
+00125 
+00126   while ((c = getopt(argc, argv, "-m:s:M:S:l:")) != EOF)
+00127   {
+00128     switch(c)
+00129     {
+00130       case 's' :
+00131         if (optarg[0] == 0)
+00132         {
+00133           help();
+00134           exit(1);
+00135         }
+00136         SlaveBoard.busname = optarg;
+00137         break;
+00138       case 'm' :
+00139         if (optarg[0] == 0)
+00140         {
+00141           help();
+00142           exit(1);
+00143         }
+00144         MasterBoard.busname = optarg;
+00145         break;
+00146       case 'S' :
+00147         if (optarg[0] == 0)
+00148         {
+00149           help();
+00150           exit(1);
+00151         }
+00152         SlaveBoard.baudrate = optarg;
+00153         break;
+00154       case 'M' :
+00155         if (optarg[0] == 0)
+00156         {
+00157           help();
+00158           exit(1);
+00159         }
+00160         MasterBoard.baudrate = optarg;
+00161         break;
+00162       case 'l' :
+00163         if (optarg[0] == 0)
+00164         {
+00165           help();
+00166           exit(1);
+00167         }
+00168         LibraryPath = optarg;
+00169         break;
+00170       default:
+00171         help();
+00172         exit(1);
+00173     }
+00174   }
+00175 
+00176 #if !defined(WIN32) || defined(__CYGWIN__)
+00177   /* install signal handler for manual break */
+00178         signal(SIGTERM, catch_signal);
+00179         signal(SIGINT, catch_signal);
+00180 #endif
+00181 
+00182 #ifndef NOT_USE_DYNAMIC_LOADING
+00183         LoadCanDriver(LibraryPath);
+00184 #endif          
+00185         // Open CAN devices
+00186 
+00187         if(strcmp(SlaveBoard.baudrate, "none")){
+00188                 
+00189                 TestSlave_Data.heartbeatError = TestSlave_heartbeatError;
+00190                 TestSlave_Data.initialisation = TestSlave_initialisation;
+00191                 TestSlave_Data.preOperational = TestSlave_preOperational;
+00192                 TestSlave_Data.operational = TestSlave_operational;
+00193                 TestSlave_Data.stopped = TestSlave_stopped;
+00194                 TestSlave_Data.post_sync = TestSlave_post_sync;
+00195                 TestSlave_Data.post_TPDO = TestSlave_post_TPDO;
+00196                 TestSlave_Data.storeODSubIndex = TestSlave_storeODSubIndex;             
+00197 
+00198                 if(!canOpen(&SlaveBoard,&TestSlave_Data)){
+00199                         eprintf("Cannot open Slave Board (%s,%s)\n",SlaveBoard.busname, SlaveBoard.baudrate);
+00200                         goto fail_slave;
+00201                 }
+00202         }
+00203         if(strcmp(MasterBoard.baudrate, "none")){
+00204                 
+00205                 TestMaster_Data.heartbeatError = TestMaster_heartbeatError;
+00206                 TestMaster_Data.initialisation = TestMaster_initialisation;
+00207                 TestMaster_Data.preOperational = TestMaster_preOperational;
+00208                 TestMaster_Data.operational = TestMaster_operational;
+00209                 TestMaster_Data.stopped = TestMaster_stopped;
+00210                 TestMaster_Data.post_sync = TestMaster_post_sync;
+00211                 TestMaster_Data.post_TPDO = TestMaster_post_TPDO;
+00212                 
+00213                 if(!canOpen(&MasterBoard,&TestMaster_Data)){
+00214                         eprintf("Cannot open Master Board (%s,%s)\n",MasterBoard.busname, MasterBoard.baudrate);
+00215                         goto fail_master;
+00216                 }
+00217         }
+00218 
+00219         // Start timer thread
+00220         StartTimerLoop(&InitNodes);
+00221 
+00222         // wait Ctrl-C
+00223         
+00224         pause();
+00225         eprintf("Finishing.\n");
+00226         
+00227         masterSendNMTstateChange (&TestMaster_Data, 0x02, NMT_Reset_Node);
+00228         eprintf("reset\n");
+00229         // Stop master
+00230         setState(&TestMaster_Data, Stopped);
+00231         
+00232         // Stop timer thread
+00233         StopTimerLoop();
+00234         
+00235         // Close CAN devices (and can threads)
+00236         if(strcmp(SlaveBoard.baudrate, "none")) canClose(&TestSlave_Data);
+00237 fail_master:
+00238         if(strcmp(MasterBoard.baudrate, "none")) canClose(&TestMaster_Data);    
+00239 fail_slave:
+00240         return 0;
+00241 }
+

Generated on Fri Jun 8 08:51:39 2007 for CanFestival by  + +doxygen 1.5.1
+ +