diff -r 6efc85c5493e -r 1c1e3599d66a doc/doxygen/html/TestMasterMicroMod_8c-source.html --- a/doc/doxygen/html/TestMasterMicroMod_8c-source.html Mon Feb 11 11:00:12 2008 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,508 +0,0 @@ - -
-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 <unistd.h> -00032 #include <stdio.h> -00033 #include <string.h> -00034 #include <stdlib.h> -00035 #include <signal.h> -00036 #endif -00037 -00038 #include "canfestival.h" -00039 #include "TestMasterMicroMod.h" -00040 #include "TestMaster.h" -00041 UNS8 slavenodeid; -00042 -00043 -00044 /*****************************************************************************/ -00045 void TestMaster_heartbeatError(UNS8 heartbeatID) -00046 { -00047 eprintf("TestMaster_heartbeatError %d\n", heartbeatID); -00048 } -00049 -00050 /******************************************************** -00051 * ConfigureSlaveNode is responsible to -00052 * - setup master RPDO 1 to receive TPDO 1 from id 0x40 -00053 * - setup master TPDO 1 to send RPDO 1 to id 0x40 -00054 ********************************************************/ -00055 void TestMaster_initialisation() -00056 { -00057 UNS32 PDO1_COBID = 0x0180 + slavenodeid; -00058 UNS32 PDO2_COBID = 0x0200 + slavenodeid; -00059 UNS8 size = sizeof(UNS32); -00060 -00061 eprintf("TestMaster_initialisation\n"); -00062 -00063 /***************************************** -00064 * Define RPDOs to match slave ID=0x40 TPDOs* -00065 *****************************************/ -00066 writeLocalDict( &TestMaster_Data, /*CO_Data* d*/ -00067 0x1400, /*UNS16 index*/ -00068 0x01, /*UNS8 subind*/ -00069 &PDO1_COBID, /*void * pSourceData,*/ -00070 &size, /* UNS8 * pExpectedSize*/ -00071 RW); /* UNS8 checkAccess */ -00072 -00073 -00074 /***************************************** -00075 * Define TPDOs to match slave ID=0x40 RPDOs* -00076 *****************************************/ -00077 writeLocalDict( &TestMaster_Data, /*CO_Data* d*/ -00078 0x1800, /*UNS16 index*/ -00079 0x01, /*UNS8 subind*/ -00080 &PDO2_COBID, /*void * pSourceData,*/ -00081 &size, /* UNS8 * pExpectedSize*/ -00082 RW); /* UNS8 checkAccess */ -00083 } -00084 -00085 static init_step = 0; -00086 -00087 /*Froward declaration*/ -00088 static void ConfigureSlaveNode(CO_Data* d, UNS8 nodeId); -00089 -00090 -00091 static void CheckSDOAndContinue(CO_Data* d, UNS8 nodeId) -00092 { -00093 UNS32 abortCode; -00094 -00095 if(getWriteResultNetworkDict (d, nodeId, &abortCode) != SDO_FINISHED) -00096 eprintf("Master : Failed in initializing slave %2.2x, step %d, AbortCode :%4.4x \n", nodeId, init_step, abortCode); -00097 -00098 /* Finalise last SDO transfer with this node */ -00099 closeSDOtransfer(&TestMaster_Data, nodeId, SDO_CLIENT); -00100 -00101 ConfigureSlaveNode(d, nodeId); -00102 } -00103 -00104 /******************************************************** -00105 * ConfigureSlaveNode is responsible to -00106 * - setup slave TPDO 1 transmit time -00107 * - setup slave TPDO 2 transmit time -00108 * - setup slave Heartbeat Producer time -00109 * - switch to operational mode -00110 * - send NMT to slave -00111 ******************************************************** -00112 * This an example of : -00113 * Network Dictionary Access (SDO) with Callback -00114 * Slave node state change request (NMT) -00115 ******************************************************** -00116 * This is called first by TestMaster_preOperational -00117 * then it called again each time a SDO exchange is -00118 * finished. -00119 ********************************************************/ -00120 static void ConfigureSlaveNode(CO_Data* d, UNS8 nodeId) -00121 { -00122 UNS8 res; -00123 eprintf("Master : ConfigureSlaveNode %2.2x\n", nodeId); -00124 switch(++init_step){ -00125 case 1: -00126 { /*disable Slave's TPDO 1 */ -00127 UNS32 TPDO_COBId = 0x80000180 + nodeId; -00128 -00129 eprintf("Master : disable slave %2.2x TPDO 1 \n", nodeId); -00130 res = writeNetworkDictCallBack (d, /*CO_Data* d*/ -00132 nodeId, /*UNS8 nodeId*/ -00133 0x1800, /*UNS16 index*/ -00134 0x01, /*UNS8 subindex*/ -00135 4, /*UNS8 count*/ -00136 0, /*UNS8 dataType*/ -00137 &TPDO_COBId,/*void *data*/ -00138 CheckSDOAndContinue); /*SDOCallback_t Callback*/ -00139 } -00140 break; -00141 -00142 case 2: -00143 { /*setup Slave's TPDO 1 to be transmitted on SYNC*/ -00144 UNS8 Transmission_Type = 0x01; -00145 -00146 eprintf("Master : set slave %2.2x TPDO 1 transmit type\n", nodeId); -00147 res = writeNetworkDictCallBack (d, /*CO_Data* d*/ -00149 nodeId, /*UNS8 nodeId*/ -00150 0x1800, /*UNS16 index*/ -00151 0x02, /*UNS8 subindex*/ -00152 1, /*UNS8 count*/ -00153 0, /*UNS8 dataType*/ -00154 &Transmission_Type,/*void *data*/ -00155 CheckSDOAndContinue); /*SDOCallback_t Callback*/ -00156 } -00157 break; -00158 -00159 case 3: -00160 { /*re-enable Slave's TPDO 1 */ -00161 UNS32 TPDO_COBId = 0x00000180 + nodeId; -00162 -00163 eprintf("Master : re-enable slave %2.2x TPDO 1\n", nodeId); -00164 res = writeNetworkDictCallBack (d, /*CO_Data* d*/ -00166 nodeId, /*UNS8 nodeId*/ -00167 0x1800, /*UNS16 index*/ -00168 0x01, /*UNS8 subindex*/ -00169 4, /*UNS8 count*/ -00170 0, /*UNS8 dataType*/ -00171 &TPDO_COBId,/*void *data*/ -00172 CheckSDOAndContinue); /*SDOCallback_t Callback*/ -00173 } -00174 break; -00175 -00176 case 4: -00177 { /*disable Slave's TPDO 2 */ -00178 UNS32 TPDO_COBId = 0x80000200 + nodeId; -00179 -00180 eprintf("Master : disable slave %2.2x RPDO 1\n", nodeId); -00181 res = writeNetworkDictCallBack (d, /*CO_Data* d*/ -00183 nodeId, /*UNS8 nodeId*/ -00184 0x1400, /*UNS16 index*/ -00185 0x01, /*UNS8 subindex*/ -00186 4, /*UNS8 count*/ -00187 0, /*UNS8 dataType*/ -00188 &TPDO_COBId,/*void *data*/ -00189 CheckSDOAndContinue); /*SDOCallback_t Callback*/ -00190 } -00191 break; -00192 -00193 -00194 case 5: -00195 { -00196 UNS8 Transmission_Type = 0x01; -00197 -00198 eprintf("Master : set slave %2.2x RPDO 1 receive type\n", nodeId); -00199 res = writeNetworkDictCallBack (d, /*CO_Data* d*/ -00201 nodeId, /*UNS8 nodeId*/ -00202 0x1400, /*UNS16 index*/ -00203 0x02, /*UNS8 subindex*/ -00204 1, /*UNS8 count*/ -00205 0, /*UNS8 dataType*/ -00206 &Transmission_Type,/*void *data*/ -00207 CheckSDOAndContinue); /*SDOCallback_t Callback*/ -00208 } -00209 break; -00210 -00211 case 6: -00212 { /*re-enable Slave's TPDO 1 */ -00213 UNS32 TPDO_COBId = 0x00000200 + nodeId; -00214 -00215 eprintf("Master : re-enable %2.2x RPDO 1\n", nodeId); -00216 res = writeNetworkDictCallBack (d, /*CO_Data* d*/ -00218 nodeId, /*UNS8 nodeId*/ -00219 0x1400, /*UNS16 index*/ -00220 0x01, /*UNS8 subindex*/ -00221 4, /*UNS8 count*/ -00222 0, /*UNS8 dataType*/ -00223 &TPDO_COBId,/*void *data*/ -00224 CheckSDOAndContinue); /*SDOCallback_t Callback*/ -00225 } -00226 break; -00227 -00228 case 7: -00229 { -00230 UNS16 Heartbeat_Producer_Time = 0x03E8; -00231 eprintf("Master : set slave %2.2x heartbeat producer time \n", nodeId); -00232 res = writeNetworkDictCallBack (d, /*CO_Data* d*/ -00234 nodeId, /*UNS8 nodeId*/ -00235 0x1017, /*UNS16 index*/ -00236 0x00, /*UNS8 subindex*/ -00237 2, /*UNS8 count*/ -00238 0, /*UNS8 dataType*/ -00239 &Heartbeat_Producer_Time,/*void *data*/ -00240 CheckSDOAndContinue); /*SDOCallback_t Callback*/ -00241 } -00242 break; -00243 -00244 case 8: -00245 { /*disable Slave's TPDO 2 */ -00246 UNS32 TPDO_COBId = 0x80000280 + nodeId; -00247 -00248 eprintf("Master : disable slave %2.2x TPDO 2 \n", nodeId); -00249 res = writeNetworkDictCallBack (d, /*CO_Data* d*/ -00251 nodeId, /*UNS8 nodeId*/ -00252 0x1801, /*UNS16 index*/ -00253 0x01, /*UNS8 subindex*/ -00254 4, /*UNS8 count*/ -00255 0, /*UNS8 dataType*/ -00256 &TPDO_COBId,/*void *data*/ -00257 CheckSDOAndContinue); /*SDOCallback_t Callback*/ -00258 } -00259 break; -00260 -00261 case 9: -00262 { /*disable Slave's TPDO 3 */ -00263 UNS32 TPDO_COBId = 0x80000380 + nodeId; -00264 -00265 eprintf("Master : disable slave %2.2x TPDO 3 \n", nodeId); -00266 res = writeNetworkDictCallBack (d, /*CO_Data* d*/ -00268 nodeId, /*UNS8 nodeId*/ -00269 0x1802, /*UNS16 index*/ -00270 0x01, /*UNS8 subindex*/ -00271 4, /*UNS8 count*/ -00272 0, /*UNS8 dataType*/ -00273 &TPDO_COBId,/*void *data*/ -00274 CheckSDOAndContinue); /*SDOCallback_t Callback*/ -00275 } -00276 break; -00277 -00278 case 10: -00279 { /*disable Slave's TPDO 2 */ -00280 UNS32 TPDO_COBId = 0x80000480 + nodeId; -00281 -00282 eprintf("Master : disable slave %2.2x TPDO 4 \n", nodeId); -00283 res = writeNetworkDictCallBack (d, /*CO_Data* d*/ -00285 nodeId, /*UNS8 nodeId*/ -00286 0x1803, /*UNS16 index*/ -00287 0x01, /*UNS8 subindex*/ -00288 4, /*UNS8 count*/ -00289 0, /*UNS8 dataType*/ -00290 &TPDO_COBId,/*void *data*/ -00291 CheckSDOAndContinue); /*SDOCallback_t Callback*/ -00292 } -00293 break; -00294 -00295 case 11: -00296 /* Put the master in operational mode */ -00297 setState(d, Operational); -00298 -00299 /* Ask slave node to go in operational mode */ -00300 masterSendNMTstateChange (d, nodeId, NMT_Start_Node); -00301 } -00302 -00303 } -00304 -00305 void TestMaster_preOperational() -00306 { -00307 -00308 eprintf("TestMaster_preOperational\n"); -00309 ConfigureSlaveNode(&TestMaster_Data, slavenodeid); -00310 -00311 } -00312 -00313 void TestMaster_operational() -00314 { -00315 eprintf("TestMaster_operational\n"); -00316 } -00317 -00318 void TestMaster_stopped() -00319 { -00320 eprintf("TestMaster_stopped\n"); -00321 } -00322 -00323 void TestMaster_post_sync() -00324 { -00325 DO++; -00326 eprintf("MicroMod Digital Out: %2.2x\n",DO); -00327 eprintf("MicroMod Digital In (by bit): DI1: %2.2x DI2: %2.2x DI3: %2.2x DI4: %2.2x DI5: %2.2x DI6: %2.2x DI7: %2.2x DI8: %2.2x\n",DI1,DI2,DI3,DI4,DI5,DI6,DI7,DI8); -00328 } -00329 -00330 void TestMaster_post_TPDO() -00331 { -00332 // eprintf("TestMaster_post_TPDO\n"); -00333 } -00334 -00335 //s_BOARD SlaveBoard = {"0", "500K"}; -00336 s_BOARD MasterBoard = {"32", "125K"}; -00337 -00338 #if !defined(WIN32) || defined(__CYGWIN__) -00339 void catch_signal(int sig) -00340 { -00341 signal(SIGTERM, catch_signal); -00342 signal(SIGINT, catch_signal); -00343 -00344 eprintf("Got Signal %d\n",sig); -00345 } -00346 #endif -00347 -00348 void help() -00349 { -00350 printf("**************************************************************\n"); -00351 printf("* TestMasterMicroMod *\n"); -00352 printf("* *\n"); -00353 printf("* A simple example for PC. *\n"); -00354 printf("* A CanOpen master that control a MicroMod module: *\n"); -00355 printf("* - setup module TPDO 1 transmit type *\n"); -00356 printf("* - setup module RPDO 1 transmit type *\n"); -00357 printf("* - setup module hearbeatbeat period *\n"); -00358 printf("* - disable others TPDOs *\n"); -00359 printf("* - set state to operational *\n"); -00360 printf("* - send periodic SYNC *\n"); -00361 printf("* - send periodic RPDO 1 to Micromod (digital output) *\n"); -00362 printf("* - listen Micromod's TPDO 1 (digital input) *\n"); -00363 printf("* - Mapping RPDO 1 bit per bit (digital input) *\n"); -00364 printf("* *\n"); -00365 printf("* Usage: *\n"); -00366 printf("* ./TestMasterMicroMod [OPTIONS] *\n"); -00367 printf("* *\n"); -00368 printf("* OPTIONS: *\n"); -00369 printf("* -l : Can library [\"libcanfestival_can_virtual.so\"] *\n"); -00370 printf("* *\n"); -00371 printf("* Slave: *\n"); -00372 printf("* -i : Slave Node id format [0x01 , 0x7F] *\n"); -00373 printf("* *\n"); -00374 printf("* Master: *\n"); -00375 printf("* -m : bus name [\"1\"] *\n"); -00376 printf("* -M : 1M,500K,250K,125K,100K,50K,20K,10K *\n"); -00377 printf("* *\n"); -00378 printf("**************************************************************\n"); -00379 } -00380 -00381 /*************************** INIT *****************************************/ -00382 void InitNodes(CO_Data* d, UNS32 id) -00383 { -00384 /****************************** INITIALISATION MASTER *******************************/ -00385 if(MasterBoard.baudrate){ -00386 /* Defining the node Id */ -00387 setNodeId(&TestMaster_Data, 0x01); -00388 -00389 /* init */ -00390 setState(&TestMaster_Data, Initialisation); -00391 } -00392 } -00393 -00394 /****************************************************************************/ -00395 /*************************** MAIN *****************************************/ -00396 /****************************************************************************/ -00397 int main(int argc,char **argv) -00398 { -00399 -00400 int c; -00401 extern char *optarg; -00402 char* LibraryPath="libcanfestival_can_virtual.so"; -00403 char *snodeid; -00404 while ((c = getopt(argc, argv, "-m:s:M:S:l:i:")) != EOF) -00405 { -00406 switch(c) -00407 { -00408 case 'm' : -00409 if (optarg[0] == 0) -00410 { -00411 help(); -00412 exit(1); -00413 } -00414 MasterBoard.busname = optarg; -00415 break; -00416 case 'M' : -00417 if (optarg[0] == 0) -00418 { -00419 help(); -00420 exit(1); -00421 } -00422 MasterBoard.baudrate = optarg; -00423 break; -00424 case 'l' : -00425 if (optarg[0] == 0) -00426 { -00427 help(); -00428 exit(1); -00429 } -00430 LibraryPath = optarg; -00431 break; -00432 case 'i' : -00433 if (optarg[0] == 0) -00434 { -00435 help(); -00436 exit(1); -00437 } -00438 snodeid = optarg; -00439 sscanf(snodeid,"%x",&slavenodeid); -00440 break; -00441 default: -00442 help(); -00443 exit(1); -00444 } -00445 } -00446 -00447 #if !defined(WIN32) || defined(__CYGWIN__) -00448 /* install signal handler for manual break */ -00449 signal(SIGTERM, catch_signal); -00450 signal(SIGINT, catch_signal); -00451 #endif -00452 -00453 #ifndef NOT_USE_DYNAMIC_LOADING -00454 LoadCanDriver(LibraryPath); -00455 #endif -00456 -00457 TestMaster_Data.heartbeatError = TestMaster_heartbeatError; -00458 TestMaster_Data.initialisation = TestMaster_initialisation; -00459 TestMaster_Data.preOperational = TestMaster_preOperational; -00460 TestMaster_Data.operational = TestMaster_operational; -00461 TestMaster_Data.stopped = TestMaster_stopped; -00462 TestMaster_Data.post_sync = TestMaster_post_sync; -00463 TestMaster_Data.post_TPDO = TestMaster_post_TPDO; -00464 -00465 if(!canOpen(&MasterBoard,&TestMaster_Data)){ -00466 eprintf("Cannot open Master Board\n"); -00467 goto fail_master; -00468 } -00469 -00470 // Start timer thread -00471 StartTimerLoop(&InitNodes); -00472 -00473 // wait Ctrl-C -00474 pause(); -00475 eprintf("Finishing.\n"); -00476 -00477 // Reset the slave node for next use (will stop emitting heartbeat) -00478 masterSendNMTstateChange (&TestMaster_Data, slavenodeid, NMT_Reset_Node); -00479 -00480 // Stop master -00481 setState(&TestMaster_Data, Stopped); -00482 -00483 // Stop timer thread -00484 StopTimerLoop(); -00485 -00486 fail_master: -00487 if(MasterBoard.baudrate) canClose(&TestMaster_Data); -00488 -00489 return 0; -00490 } -00491 -00492 -