diff -r 0d84d95790d9 -r 16c8ceea8f18 examples/AppliSlave_Linux/appli.c --- a/examples/AppliSlave_Linux/appli.c Tue Feb 13 17:21:19 2007 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,344 +0,0 @@ -/* -This file is part of CanFestival, a library implementing CanOpen Stack. - -Copyright (C): Edouard TISSERANT and Francis DUPIN - -See COPYING file for copyrights details. - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License as published by the Free Software Foundation; either -version 2.1 of the License, or (at your option) any later version. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include "def.h" -#include "can.h" -#include "canOpenDriver.h" -#include "sdo.h" -#include "pdo.h" -#include "init.h" -#include "timer.h" -#include "lifegrd.h" - -#include "nmtSlave.h" - -// Adlink 7841 or Peak PCI/CAN board -// --------------------------------- - -// 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_250K -# define BAUDRATE CAN_BAUD_250K -#else -// Appli have been compiled for Adlink-arbraca. Baudrate not used -# define BAUDRATE 0 -#endif - -s_BOARD board = {"1", BAUDRATE}; - - -// The variables sent or updated by PDO -// ----------------------------------------------------- -extern UNS8 seconds; // Mapped at index 0x2000, subindex 0x1 -extern UNS8 minutes; // Mapped at index 0x2000, subindex 0x2 -extern UNS8 hours; // Mapped at index 0x2000, subindex 0x3 -extern UNS8 day; // Mapped at index 0x2000, subindex 0x4 -extern UNS32 canopenErrNB; // Mapped at index 0x6000, subindex 0x0 -extern UNS32 canopenErrVAL; // Mapped at index 0x6001, subindex 0x0 - -// Required definition variables -// ----------------------------- -// The variables that you should define for debugging. -// They are used by the macro MSG_ERR and MSG_WAR in applicfg.h -// if the node is a slave, they can be mapped in the object dictionnary. -// if not null, allow the printing of message to the console -// Could be managed by PDO -UNS8 printMsgErrToConsole = 1; -UNS8 printMsgWarToConsole = 1; - - - -/*************************User's variables declaration**************************/ -struct tm date; -struct tm *ptrdate; -struct tm date_prec; -time_t tme; -UNS8 lastSecond; -e_nodeState lastState; -pthread_t threadRcvMsg; -pthread_t threadHeartbeatAndSDO; -UNS8 sendingError = 0; - - -/******************************prototypes*****************************/ -/* You *must* have these 2 functions in your code*/ -void heartbeatError(UNS8 heartbeatID); -void SD0timeoutError(UNS8 bus_id, UNS8 line); - -UNS8 scanSDOtimeout(void); -void preOperational(void); -void operational(void); -void stopped(void); -void waitMessage(void); -void waitMessage_heartbeat(void); - -/*********************************************************************/ -void heartbeatError(UNS8 heartbeatID) -{ - MSG_ERR(0x1F00, "!!! No heart beat received from node : ", heartbeatID); -} - -/*****************************************************************************/ -void SD0timeoutError (UNS8 bus_id, UNS8 line) -{ - // Informations on what occurs are in transfers[bus_id][line].... - // See scanSDOtimeout() in sdo.c -} - -/*********************************** THREADS **********************************/ -//------------------------------------------------------------------------------ -// Wait for a received message -void waitMessage( void ) -{ - while (1) { - receiveMsgHandler(0); // blocked until new message - } -} - -//------------------------------------------------------------------------------ -// Heartbeat Manager (sending and receiving) and test SDO timeout -void heartbeatAndSDO(void) -{ - while (1) { - heartbeatMGR(); - // Check if some SDO response are missing - scanSDOtimeout(); - // Sleep 10 ms - usleep(10000); - } -} - -/*********************************************************************/ -void preOperational( void ) -{ - /* Init some variables */ - canopenErrNB = 0; - canopenErrVAL = 0; -} - - -/********************************************************************/ -void operational( void ) -{ - /* read systeme date */ - tme = time (&tme); - ptrdate = gmtime(&tme); - date = *ptrdate; - - /* Update the dictionary */ - day = date.tm_mday; - hours = date.tm_hour; - minutes = date.tm_min; - seconds = date.tm_sec; - - - if ( date_prec.tm_min != date.tm_min ) { - MSG_WAR(0x3F00, "event : minutes change -> node decides to send it. Value : ", date.tm_min); - sendPDOevent( 0, &minutes ); - date_prec = date; - } - if (canopenErrNB == 0) - sendingError = 0; - - if (lastSecond != seconds) { - MSG_WAR (0x3F50, "Seconds = ", seconds); - if ((seconds == 50) && (sendingError == 0)) - { - MSG_ERR(0x1F55, "DEMO of ERROR. Sent by PDO. Value : ", 0xABCD); - sendingError = 1; - } - - if (canopenErrNB) { - MSG_WAR(0x3F56, "ERROR nb : ", canopenErrNB); - } - lastSecond = seconds; - - } -} - - -/*****************************************************************************/ -void stopped( void ) -{ -} - -void help() -{ - printf("**************************************************************\n"); - printf("* AppliSlave *\n"); - printf("* [-b b] *\n"); - printf("* *\n"); - printf("* b : bus [default 1] *\n"); - printf("* *\n"); - printf("* This exemple run AppliSlave on bus 0 *\n"); - printf("* AppliSlave -b 0 *\n"); - printf("* *\n"); - printf("**************************************************************\n"); -} - -/****************************************************************************/ -/*************************** MAIN *****************************************/ -/****************************************************************************/ -int main(int argc,char **argv) -{ - - HANDLE ok; - UNS32 * pSize; - UNS32 size; - pSize = &size; - char c; - extern char *optarg; - - while ((c = getopt(argc, argv, "-b:")) != EOF) - { - switch(c) - { - case 'b' : - if (optarg[0] == 0) - { - help(); - exit(1); - } - board.busname = optarg; - break; - default: - help(); - exit(1); - } - } - - // Global initialization before launching the threads. (also done in init mode. - /* Defining the node Id */ - setNodeId(0x05); - MSG_WAR(0x3F06, "My node ID is : ", getNodeId()); - initCANopenMain(); - initTimer( ); - heartbeatInit(); - initResetMode(); - - /* Launch the thread to receive the messages */ - pthread_create( &threadRcvMsg, NULL, (void *)&waitMessage, NULL); - /* Launch the thread to manage the heartbeat */ - pthread_create( &threadHeartbeatAndSDO, NULL, (void *)&heartbeatAndSDO, NULL); - - /* open the communication with the board */ - ok = f_can_open(& board); - if (ok == NULL) { - MSG_ERR(0x1F02,"Unable to open the board", 0); - MSG_ERR(0x1F03,"Edit includeMakefileLinux to verify that the application is configured for the good board", 0); - exit (-1); - } - else { - MSG_WAR(0x3F03, "Board 1 opened ", 0); - /* slave's state initialization */ - setState(Initialisation); - lastState = Unknown_state; - - - while(1) { /* slave's state machine */ - switch( getState() ) { - case Initialisation: - if (lastState != getState()) - MSG_WAR(0X3F05, "I am in INITIALISATION mode ", 0); - /* Defining the node Id */ - setNodeId(0x05); - MSG_WAR(0x3F06, "My node ID is : ", getNodeId()); - // Node identity ? - { - UNS8 *data; - UNS8 size; - UNS8 dataType; - // Manufacturer Device name (default = empty string) - getODentry(0x1008, 0x0, (void **)&data, &size, &dataType, 0); - MSG_WAR(0x3F09, data, 0); - // Manufacturer Hardware version. (default = compilation. date) - getODentry(0x1009, 0x0, (void **)&data, &size, &dataType, 0); - MSG_WAR(0x3F09, data, 0); - // Manufacturer Software version. (default = compilation. time) - getODentry(0x100A, 0x0, (void **)&data, &size, &dataType, 0); - MSG_WAR(0x3F09, data, 0); - } - - initCANopenMain(); - initTimer( ); - heartbeatInit(); - initResetMode(); - /* the slave send an NMT trame to say to the master - that it is going to enter into operational state - In fact, you must send the boot-up when you are in - operational mode ! - */ - - /* change automatically into pre_operational state */ - lastState = getState(); - setState(Pre_operational); - break; - - case Pre_operational: - if (lastState != getState()) - { - MSG_WAR(0X3F11, "I am in PRE_OPERATIONAL mode ", 0); - // Some stuff to do when the node enter in pre-operational mode - initPreOperationalMode(); - } - if (lastState == Initialisation) - slaveSendBootUp(0); - lastState = getState(); - preOperational( ); - break; - - case Operational: - if (lastState != getState()) - MSG_WAR(0X3F12, "I am in OPERATIONAL mode ", 0); - lastState = getState(); - operational( ); - break; - - case Stopped: - if (lastState != getState()) - MSG_WAR(0X3F13, "I am in STOPPED mode", 0); - lastState = getState(); - stopped( ); - break; - }//end switch case - // Sleep 10 ms - usleep(10000); - }//end while - }//end else - - - return 0; -} -