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

main.c

Go to the documentation of this file.
00001 /**************************************************************************
+00002 CanFestival3 win32 port example
+00003 
+00004 This sample demonstrates CanFestival usage with Win32
+00005 
+00006 Program implements master node. It starts CANOpen slave node, modifies OD, 
+00007 performs SDO reads and prints some slave node information.
+00008 
+00009 Usage:
+00010 
+00011     win32test <node_id>
+00012 
+00013   where node_id is node ID in decimal format
+00014 
+00015 You should have CanFestival-3.dll CAN-uVCCM.dll in the search path to run this sample.
+00016 Code will work with non-UNICODE CanFestival-3.dll CAN-uVCCM.dll libraries.
+00017 
+00018 Sample can work on other platdorms as well.
+00019 
+00020 Copyright (C) 2007  Leonid Tochinski (ltochinski AT chattenassociates DOT com)
+00021 ***************************************************************************/
+00022 
+00023 #include <stdio.h>
+00024 #include <stdlib.h> 
+00025 #include "win32test.h"
+00026 #include "canfestival.h"
+00027 
+00028 #ifdef WIN32
+00029 #define sleep_proc(ms) Sleep(ms)
+00030 #define uptime_ms_proc() GetTickCount()
+00031 #else
+00032 #include <time.h> 
+00033 #define sleep_proc(ms)
+00034 #define uptime_ms_proc (1000*(time()%86400))  // TOD
+00035 #endif
+00036 
+00037 UNS8 GetChangeStateResults(UNS8 node_id, UNS8 expected_state, unsigned long timeout_ms)
+00038    {
+00039    unsigned long start_time = 0;
+00040    
+00041    // reset nodes state
+00042    win32test_Data.NMTable[node_id] = Unknown_state;
+00043 
+00044    // request node state
+00045    masterRequestNodeState(&win32test_Data, node_id);
+00046    
+00047    start_time = uptime_ms_proc();
+00048    while(uptime_ms_proc() - start_time < timeout_ms)
+00049       {
+00050       if (getNodeState(&win32test_Data, node_id) == expected_state)
+00051          return 0;
+00052       sleep_proc(1);   
+00053       }
+00054    return 0xFF;
+00055    }
+00056 
+00057 UNS8 ReadSDO(UNS8 nodeId, UNS16 index, UNS8 subIndex, UNS8 dataType, void* data, UNS8* size)
+00058    {
+00059    UNS32 abortCode = 0;
+00060    UNS8 res = SDO_UPLOAD_IN_PROGRESS;
+00061    // Read SDO
+00062    UNS8 err = readNetworkDict (&win32test_Data, nodeId, index, subIndex, dataType);
+00063    if (err)
+00064       return 0xFF;
+00065    for(;;)
+00066       {
+00067       res = getReadResultNetworkDict (&win32test_Data, nodeId, data, size, &abortCode);
+00068       if (res != SDO_UPLOAD_IN_PROGRESS)
+00069          break;   
+00070       sleep_proc(1);
+00071       continue;
+00072       }
+00073    closeSDOtransfer(&win32test_Data, nodeId, SDO_CLIENT);
+00074    if (res == SDO_FINISHED)
+00075       return 0;
+00076    return 0xFF;   
+00077    }
+00078 
+00079 int main(int argc, char *argv[])
+00080   {
+00081    UNS8 node_id = 0;
+00082    s_BOARD MasterBoard = {"1", "125K"};
+00083    char* dll_file_name;
+00084 
+00085    /* process command line arguments */
+00086    if (argc < 2)
+00087       {
+00088       printf("USAGE: win32test node_id [dll_file_name]\n");
+00089       return 1;
+00090       }
+00091 
+00092    node_id = atoi(argv[1]);
+00093    if (node_id < 2 || node_id > 127)
+00094       {
+00095       printf("ERROR: node_id shoule be >=2 and <= 127\n");
+00096       return 1;
+00097       }
+00098 
+00099       if (argc > 2)
+00100                 dll_file_name = argv[2];
+00101           else
+00102                 dll_file_name = "can_uvccm_win32.dll";
+00103 
+00104    // load can driver
+00105    if (!LoadCanDriver(dll_file_name))
+00106       {
+00107       printf("ERROR: could not load diver %s\n", dll_file_name);
+00108       return 1;
+00109       }
+00110    
+00111    if (canOpen(&MasterBoard,&win32test_Data))
+00112       {
+00113       /* Defining the node Id */
+00114       setNodeId(&win32test_Data, 0x01);
+00115 
+00116       /* init */
+00117       setState(&win32test_Data, Initialisation);
+00118 
+00119       /****************************** START *******************************/
+00120       /* Put the master in operational mode */
+00121       setState(&win32test_Data, Operational);
+00122 
+00123       /* Ask slave node to go in operational mode */
+00124       masterSendNMTstateChange (&win32test_Data, 0, NMT_Start_Node);
+00125 
+00126       printf("\nStarting node %d (%xh) ...\n",(int)node_id,(int)node_id);
+00127       
+00128       /* wait untill mode will switch to operational state*/
+00129       if (GetChangeStateResults(node_id, Operational, 3000) != 0xFF)
+00130          {
+00131          /* modify Client SDO 1 Parameter */
+00132          UNS32 COB_ID_Client_to_Server_Transmit_SDO = 0x600 + node_id;
+00133          UNS32 COB_ID_Server_to_Client_Receive_SDO  = 0x580 + node_id;
+00134          UNS32 Node_ID_of_the_SDO_Server = node_id;
+00135          UNS8 ExpectedSize = sizeof (UNS32);
+00136 
+00137          if (OD_SUCCESSFUL ==  writeLocalDict(&win32test_Data, 0x1280, 1, &COB_ID_Client_to_Server_Transmit_SDO, &ExpectedSize, RW) 
+00138               && OD_SUCCESSFUL ==  writeLocalDict(&win32test_Data, 0x1280, 2, &COB_ID_Server_to_Client_Receive_SDO, &ExpectedSize, RW) 
+00139               && OD_SUCCESSFUL ==  writeLocalDict(&win32test_Data, 0x1280, 3, &Node_ID_of_the_SDO_Server, &ExpectedSize, RW))
+00140             {
+00141             UNS32 dev_type = 0;
+00142             char device_name[64]="";
+00143             char hw_ver[64]="";
+00144             char sw_ver[64]="";   
+00145             UNS32 vendor_id = 0;            
+00146             UNS32 prod_code = 0;
+00147             UNS32 ser_num = 0;
+00148             UNS8 size;
+00149             UNS8 res;
+00150 
+00151             printf("\nnode_id: %d (%xh) info\n",(int)node_id,(int)node_id);
+00152             printf("********************************************\n");
+00153 
+00154             size = sizeof (dev_type);
+00155             res = ReadSDO(node_id, 0x1000, 0, uint32, &dev_type, &size);
+00156             printf("device type: %d\n",dev_type & 0xFFFF);
+00157            
+00158             size = sizeof (device_name);
+00159             res = ReadSDO(node_id, 0x1008, 0, visible_string, device_name, &size);
+00160             printf("device name: %s\n",device_name);
+00161 
+00162             size = sizeof (hw_ver);
+00163             res = ReadSDO(node_id, 0x1009, 0, visible_string, hw_ver, &size);
+00164             printf("HW version: %s\n",hw_ver);
+00165 
+00166             size = sizeof (sw_ver);
+00167             res = ReadSDO(node_id, 0x100A, 0, visible_string, sw_ver, &size);
+00168             printf("SW version: %s\n",sw_ver);            
+00169             
+00170             size = sizeof (vendor_id);
+00171             res = ReadSDO(node_id, 0x1018, 1, uint32, &vendor_id, &size);
+00172             printf("vendor id: %d\n",vendor_id);
+00173 
+00174             size = sizeof (prod_code);
+00175             res = ReadSDO(node_id, 0x1018, 2, uint32, &prod_code, &size);
+00176             printf("product code: %d\n",prod_code);
+00177 
+00178             size = sizeof (ser_num);
+00179             res = ReadSDO(node_id, 0x1018, 4, uint32, &ser_num, &size);
+00180             printf("serial number: %d\n",ser_num);
+00181             
+00182             printf("********************************************\n");
+00183             } 
+00184          else
+00185             {
+00186             printf("ERROR: Object dictionary access failed\n");
+00187             }
+00188          }
+00189       else
+00190          {
+00191          printf("ERROR: node_id %d (%xh) is not responding\n",(int)node_id,(int)node_id);
+00192          }
+00193          
+00194       masterSendNMTstateChange (&win32test_Data, 0x02, NMT_Stop_Node);
+00195 
+00196       setState(&win32test_Data, Stopped);
+00197       
+00198       canClose(&win32test_Data);
+00199       }
+00200    return 0;
+00201   }
+00202   
+00203   
+

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