]> rtime.felk.cvut.cz Git - CanFestival-3.git/blobdiff - examples/TestMasterSlave/TestMasterSlave.c
- add RTAI support
[CanFestival-3.git] / examples / TestMasterSlave / TestMasterSlave.c
index 01e0226435f8ec5596db1097d45e8835c51885ba..021e39a328c8dae7d5a0955ae2aa964c434603ce 100644 (file)
@@ -20,142 +20,119 @@ License along with this library; if not, write to the Free Software
 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */
 
+#if defined(WIN32) && !defined(__CYGWIN__)
+#include <windows.h>
+#include "getopt.h"
+void pause(void)
+{
+       system("PAUSE");
+}
+#else
 #include <stdio.h>
 #include <string.h>
-#include <sys/time.h>
 #include <unistd.h>
 #include <stdlib.h>
 #include <signal.h>
+#endif
 
-#include <applicfg.h>
-#include <can_driver.h>
-#include <timers_driver.h>
+#include "canfestival.h"
+//#include <can_driver.h>
+//#include <timers_driver.h>
 
 #include "Master.h"
 #include "Slave.h"
 #include "TestMasterSlave.h"
 
-#define MyCase(fc) case fc: eprintf(#fc);break;
-void print_message(Message *m)
-{
-       int i;
-       switch(m->cob_id.w >> 7)
-       {
-               MyCase(SYNC)
-               MyCase(TIME_STAMP)
-               MyCase(PDO1tx)
-               MyCase(PDO1rx)
-               MyCase(PDO2tx)
-               MyCase(PDO2rx)
-               MyCase(PDO3tx)
-               MyCase(PDO3rx)
-               MyCase(PDO4tx)
-               MyCase(PDO4rx)
-               MyCase(SDOtx)
-               MyCase(SDOrx)
-               MyCase(NODE_GUARD)
-               MyCase(NMT)
-       }
-       eprintf(" rtr:%d", m->rtr);
-       eprintf(" len:%d", m->len);
-       for (i = 0 ; i < m->len ; i++)
-               eprintf(" %02x", m->data[i]);
-       eprintf("\n");
-}
-
 UNS32 OnMasterMap1Update(CO_Data* d, const indextable * unsused_indextable, UNS8 unsused_bSubindex)
 {
        eprintf("OnSlaveMap1Update:%d\n", SlaveMap1);
        return 0;
 }
 
+s_BOARD SlaveBoard = {"0", "125K"};
+s_BOARD MasterBoard = {"1", "125K"};
 
-
-void InitNodes(CO_Data* d, UNS32 id)
-{
-//  TestSlave_Index2000_callbacks[0] = &OnMasterMap1Update;
-  RegisterSetODentryCallBack(&TestMaster_Data, 0x2000, 0, &OnMasterMap1Update);
-
-  /****************************** INITIALISATION MASTER *******************************/
-  /* Defining the node Id */
-  setNodeId(&TestMaster_Data, 0x01);
-
-  /* init */
-  setState(&TestMaster_Data, Initialisation);
-
-  /****************************** INITIALISATION SLAVE *******************************/
-  /* Defining the node Id */
-  setNodeId(&TestSlave_Data, 0x02);
-
-  /* init */
-  setState(&TestSlave_Data, Initialisation);
-
-  /****************************** START *******************************/
-  /* Put the master in operational mode */
-  setState(&TestMaster_Data, Operational);
-  
-  masterSendNMTstateChange (&TestMaster_Data, 0x02, NMT_Start_Node);
-       
-}
-
-CAN_HANDLE SlaveCanHandle;
-CAN_HANDLE MasterCanHandle;
-
-// Baudrate values for Peak board :
-// CAN_BAUD_1M CAN_BAUD_500K CAN_BAUD_250K CAN_BAUD_125K CAN_BAUD_100K CAN_BAUD_50K
-// CAN_BAUD_20K CAN_BAUD_10K CAN_BAUD_5K
-
-#ifdef CAN_BAUD_500K
-// Appli have been compiled for Peak. Baudrate is defined
-# define BAUDRATE CAN_BAUD_500K
-#else
-// Appli have been compiled for Generic. Baudrate not used
-# define BAUDRATE 0
-#endif
-
+#if !defined(WIN32) || defined(__CYGWIN__)
 void catch_signal(int sig)
 {
   signal(SIGTERM, catch_signal);
   signal(SIGINT, catch_signal);
-  stopTimer();
-  eprintf("Got Sigterm - Finishing.\n");
+  eprintf("Got Signal %d\n",sig);
 }
+#endif
 
-
-void help()
+void help(void)
 {
   printf("**************************************************************\n");
   printf("*  TestMasterSlave                                           *\n");
   printf("*                                                            *\n");
   printf("*  A simple example for PC. It does implement 2 CanOpen      *\n");
   printf("*  nodes in the same process. A master and a slave. Both     *\n");
-  printf("*   communicate together, exchanging periodically NMT, SYNC, *\n");
-  printf("*   SDO and PDO.                                             *\n");
+  printf("*  communicate together, exchanging periodically NMT, SYNC,  *\n");
+  printf("*  SDO and PDO. Master configure heartbeat producer time     *\n");
+  printf("*  at 1000 ms for slave node-id 0x02 by concise DCF.         *\n");                                  
+  printf("*                                                            *\n");
+  printf("*   Usage:                                                   *\n");
+  printf("*   ./TestMasterSlave  [OPTIONS]                             *\n");
   printf("*                                                            *\n");
-  printf("*   If you have chosen virtual CAN driver, just type         *\n");
-  printf("*   ./TestMasterSlave                                        *\n");
+  printf("*   OPTIONS:                                                 *\n");
+  printf("*     -l : Can library [\"libcanfestival_can_virtual.so\"]     *\n");
   printf("*                                                            *\n");
-  printf("*   Else you need to specify bus:                            *\n");
+  printf("*    Slave:                                                  *\n");
+  printf("*     -s : bus name [\"0\"]                                    *\n");
+  printf("*     -S : 1M,500K,250K,125K,100K,50K,20K,10K,none(disable)  *\n");
   printf("*                                                            *\n");
-  printf("*     -s : slave CAN bus [default 0, peak first PCI]         *\n");
-  printf("*     -m : master CAN bus [default 1, peak second PCI]       *\n");
+  printf("*    Master:                                                 *\n");
+  printf("*     -m : bus name [\"1\"]                                    *\n");
+  printf("*     -M : 1M,500K,250K,125K,100K,50K,20K,10K,none(disable)  *\n");
   printf("*                                                            *\n");
   printf("**************************************************************\n");
 }
 
+/***************************  INIT  *****************************************/
+void InitNodes(CO_Data* d, UNS32 id)
+{
+       /****************************** INITIALISATION SLAVE *******************************/
+       if(strcmp(SlaveBoard.baudrate, "none")) {
+               setNodeId(&TestSlave_Data, 0x02);
+
+               /* init */
+               setState(&TestSlave_Data, Initialisation);
+       }
+
+       /****************************** INITIALISATION MASTER *******************************/
+       if(strcmp(MasterBoard.baudrate, "none")){
+               RegisterSetODentryCallBack(&TestMaster_Data, 0x2000, 0, &OnMasterMap1Update);
+               
+               /* Defining the node Id */
+               setNodeId(&TestMaster_Data, 0x01);
+
+               /* init */
+               setState(&TestMaster_Data, Initialisation);
+                       
+       }
+}
+
+/***************************  EXIT  *****************************************/
+void Exit(CO_Data* d, UNS32 id)
+{
+       masterSendNMTstateChange(&TestMaster_Data, 0x02, NMT_Reset_Node);    
+    
+    //Stop master
+       setState(&TestMaster_Data, Stopped);
+}
+
 /****************************************************************************/
 /***************************  MAIN  *****************************************/
 /****************************************************************************/
 int main(int argc,char **argv)
 {
-       s_BOARD SlaveBoard = {"0", BAUDRATE, &TestSlave_Data};
-       s_BOARD MasterBoard = {"1", BAUDRATE, &TestMaster_Data};
 
-
-  char c;
+  int c;
   extern char *optarg;
+  char* LibraryPath="../../drivers/can_virtual/libcanfestival_can_virtual.so";
 
-  while ((c = getopt(argc, argv, "-m:s:")) != EOF)
+  while ((c = getopt(argc, argv, "-m:s:M:S:l:")) != EOF)
   {
     switch(c)
     {
@@ -175,27 +152,98 @@ int main(int argc,char **argv)
         }
         MasterBoard.busname = optarg;
         break;
+      case 'S' :
+        if (optarg[0] == 0)
+        {
+          help();
+          exit(1);
+        }
+        SlaveBoard.baudrate = optarg;
+        break;
+      case 'M' :
+        if (optarg[0] == 0)
+        {
+          help();
+          exit(1);
+        }
+        MasterBoard.baudrate = optarg;
+        break;
+      case 'l' :
+        if (optarg[0] == 0)
+        {
+          help();
+          exit(1);
+        }
+        LibraryPath = optarg;
+        break;
       default:
         help();
         exit(1);
     }
   }
 
-       /* install signal handler for manual break */
+#if !defined(WIN32) || defined(__CYGWIN__)
+  /* install signal handler for manual break */
        signal(SIGTERM, catch_signal);
        signal(SIGINT, catch_signal);
-       
+       TimerInit();
+#endif
+
+#ifndef NOT_USE_DYNAMIC_LOADING
+       if (LoadCanDriver(LibraryPath) == NULL)
+           printf("Unable to load library: %s\n",LibraryPath);
+#endif         
        // Open CAN devices
-       SlaveCanHandle = canOpen(&SlaveBoard);
-       MasterCanHandle = canOpen(&MasterBoard);        
-       
-       // Will call InitNodes, and wait and handle next timer events.
-       TimerLoop(&InitNodes);
-       
-       // Close CAN devices
-       canClose(SlaveCanHandle);
-       canClose(MasterCanHandle);      
-       
 
-  return 0;
+       if(strcmp(SlaveBoard.baudrate, "none")){
+               
+               TestSlave_Data.heartbeatError = TestSlave_heartbeatError;
+               TestSlave_Data.initialisation = TestSlave_initialisation;
+               TestSlave_Data.preOperational = TestSlave_preOperational;
+               TestSlave_Data.operational = TestSlave_operational;
+               TestSlave_Data.stopped = TestSlave_stopped;
+               TestSlave_Data.post_sync = TestSlave_post_sync;
+               TestSlave_Data.post_TPDO = TestSlave_post_TPDO;
+               TestSlave_Data.storeODSubIndex = TestSlave_storeODSubIndex;
+               TestSlave_Data.post_emcy = TestSlave_post_emcy;
+
+               if(!canOpen(&SlaveBoard,&TestSlave_Data)){
+                       eprintf("Cannot open Slave Board (%s,%s)\n",SlaveBoard.busname, SlaveBoard.baudrate);
+                       goto fail_slave;
+               }
+       }
+       if(strcmp(MasterBoard.baudrate, "none")){
+               
+               TestMaster_Data.heartbeatError = TestMaster_heartbeatError;
+               TestMaster_Data.initialisation = TestMaster_initialisation;
+               TestMaster_Data.preOperational = TestMaster_preOperational;
+               TestMaster_Data.operational = TestMaster_operational;
+               TestMaster_Data.stopped = TestMaster_stopped;
+               TestMaster_Data.post_sync = TestMaster_post_sync;
+               TestMaster_Data.post_TPDO = TestMaster_post_TPDO;
+               TestMaster_Data.post_emcy = TestMaster_post_emcy;
+               TestMaster_Data.post_SlaveBootup=TestMaster_post_SlaveBootup;
+               
+               if(!canOpen(&MasterBoard,&TestMaster_Data)){
+                       eprintf("Cannot open Master Board (%s,%s)\n",MasterBoard.busname, MasterBoard.baudrate);
+                       goto fail_master;
+               }
+       }
+
+       // Start timer thread
+       StartTimerLoop(&InitNodes);
+
+       // wait Ctrl-C
+       pause();
+
+       // Stop timer thread
+       StopTimerLoop(&Exit);
+       
+       // Close CAN devices (and can threads)
+       if(strcmp(MasterBoard.baudrate, "none")) canClose(&TestMaster_Data);    
+fail_master:
+       if(strcmp(SlaveBoard.baudrate, "none")) canClose(&TestSlave_Data);
+fail_slave:
+       TimerCleanup();
+       return 0;
 }