src/states.c
author fbeaulier
Tue, 16 Aug 2011 14:15:52 +0200
changeset 663 70fc3603e36f
parent 517 003679edc437
child 668 ba53613e94e4
permissions -rw-r--r--
timers_unix.c : remove sigint and sigterm catch
sdo : Allow multiple servers
The sdo transfer struct is not anymore referenced by server's node id but by
client or server number in the OD. Node id is not relevant in SDO transfert.
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
     1
/*
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
     2
This file is part of CanFestival, a library implementing CanOpen Stack. 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
     3
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
     4
Copyright (C): Edouard TISSERANT and Francis DUPIN
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
     5
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
     6
See COPYING file for copyrights details.
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
     7
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
     8
This library is free software; you can redistribute it and/or
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
     9
modify it under the terms of the GNU Lesser General Public
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    10
License as published by the Free Software Foundation; either
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    11
version 2.1 of the License, or (at your option) any later version.
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    12
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    13
This library is distributed in the hope that it will be useful,
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    14
but WITHOUT ANY WARRANTY; without even the implied warranty of
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    15
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    16
Lesser General Public License for more details.
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    17
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    18
You should have received a copy of the GNU Lesser General Public
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    19
License along with this library; if not, write to the Free Software
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    20
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    21
*/
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    22
/*!
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    23
** @file   states.c
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    24
** @author Edouard TISSERANT and Francis DUPIN
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    25
** @date   Tue Jun  5 09:32:32 2007
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    26
**
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    27
** @brief
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    28
**
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    29
**
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    30
*/
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    31
378
d2abf6c8c27b As requested long ago, added CoData* parameter to all this applications callback, let application designer use identical callback for multiple nodes, and reduce source code length.
etisserant
parents: 370
diff changeset
    32
#include "data.h"
370
6fecf36df407 Fixed some endianization problems caused by switch to UNS16 for cob_id member in CAN messages. To be continued.
etisserant
parents: 365
diff changeset
    33
#include "sysdep.h"
6fecf36df407 Fixed some endianization problems caused by switch to UNS16 for cob_id member in CAN messages. To be continued.
etisserant
parents: 365
diff changeset
    34
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    35
/** Prototypes for internals functions */
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    36
/*!                                                                                                
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    37
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    38
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    39
** @param d                                                                                        
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    40
** @param newCommunicationState                                                                    
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    41
**/     
53
73bc47a0db55 Add prototypes
frdupin
parents: 14
diff changeset
    42
void switchCommunicationState(CO_Data* d, 
73bc47a0db55 Add prototypes
frdupin
parents: 14
diff changeset
    43
	s_state_communication *newCommunicationState);
73bc47a0db55 Add prototypes
frdupin
parents: 14
diff changeset
    44
	
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    45
/*!                                                                                                
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    46
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    47
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    48
** @param d                                                                                        
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    49
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    50
** @return                                                                                         
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    51
**/    
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    52
e_nodeState getState(CO_Data* d)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    53
{
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    54
  return d->nodeState;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    55
}
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    56
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    57
/*!                                                                                                
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    58
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    59
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    60
** @param d                                                                                        
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    61
** @param m                                                                                        
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    62
**/  
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    63
void canDispatch(CO_Data* d, Message *m)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    64
{
370
6fecf36df407 Fixed some endianization problems caused by switch to UNS16 for cob_id member in CAN messages. To be continued.
etisserant
parents: 365
diff changeset
    65
	UNS16 cob_id = UNS16_LE(m->cob_id);
6fecf36df407 Fixed some endianization problems caused by switch to UNS16 for cob_id member in CAN messages. To be continued.
etisserant
parents: 365
diff changeset
    66
	 switch(cob_id >> 7)
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    67
	{
284
24bf3d692993 Implemented EMCY objects.
luis
parents: 263
diff changeset
    68
		case SYNC:		/* can be a SYNC or a EMCY message */
370
6fecf36df407 Fixed some endianization problems caused by switch to UNS16 for cob_id member in CAN messages. To be continued.
etisserant
parents: 365
diff changeset
    69
			if(cob_id == 0x080)	/* SYNC */
284
24bf3d692993 Implemented EMCY objects.
luis
parents: 263
diff changeset
    70
			{
24bf3d692993 Implemented EMCY objects.
luis
parents: 263
diff changeset
    71
				if(d->CurrentCommunicationState.csSYNC)
24bf3d692993 Implemented EMCY objects.
luis
parents: 263
diff changeset
    72
					proceedSYNC(d);
24bf3d692993 Implemented EMCY objects.
luis
parents: 263
diff changeset
    73
			} else 		/* EMCY */
24bf3d692993 Implemented EMCY objects.
luis
parents: 263
diff changeset
    74
				if(d->CurrentCommunicationState.csEmergency)
24bf3d692993 Implemented EMCY objects.
luis
parents: 263
diff changeset
    75
					proceedEMCY(d,m);
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    76
			break;
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
    77
		/* case TIME_STAMP: */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    78
		case PDO1tx:
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    79
		case PDO1rx:
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    80
		case PDO2tx:
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    81
		case PDO2rx:
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    82
		case PDO3tx:
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    83
		case PDO3rx:
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    84
		case PDO4tx:
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    85
		case PDO4rx:
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    86
			if (d->CurrentCommunicationState.csPDO)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    87
				proceedPDO(d,m);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    88
			break;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    89
		case SDOtx:
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    90
		case SDOrx:
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    91
			if (d->CurrentCommunicationState.csSDO)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    92
				proceedSDO(d,m);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    93
			break;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    94
		case NODE_GUARD:
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    95
			if (d->CurrentCommunicationState.csHeartbeat)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    96
				proceedNODE_GUARD(d,m);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    97
			break;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    98
		case NMT:
88
b6e0b91d073a pointer bogue for *(d->iam_a_slave)
frdupin
parents: 71
diff changeset
    99
			if (*(d->iam_a_slave))
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   100
			{
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   101
				proceedNMTstateChange(d,m);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   102
			}
343
118c1cabd0b0 Primary LSS support, thanks to Jorge Berzosa.
etisserant
parents: 320
diff changeset
   103
#ifdef CO_ENABLE_LSS
118c1cabd0b0 Primary LSS support, thanks to Jorge Berzosa.
etisserant
parents: 320
diff changeset
   104
		case LSS:
118c1cabd0b0 Primary LSS support, thanks to Jorge Berzosa.
etisserant
parents: 320
diff changeset
   105
			if (!d->CurrentCommunicationState.csLSS)break;
370
6fecf36df407 Fixed some endianization problems caused by switch to UNS16 for cob_id member in CAN messages. To be continued.
etisserant
parents: 365
diff changeset
   106
			if ((*(d->iam_a_slave)) && cob_id==MLSS_ADRESS)
343
118c1cabd0b0 Primary LSS support, thanks to Jorge Berzosa.
etisserant
parents: 320
diff changeset
   107
			{
118c1cabd0b0 Primary LSS support, thanks to Jorge Berzosa.
etisserant
parents: 320
diff changeset
   108
				proceedLSS_Slave(d,m);
118c1cabd0b0 Primary LSS support, thanks to Jorge Berzosa.
etisserant
parents: 320
diff changeset
   109
			}
370
6fecf36df407 Fixed some endianization problems caused by switch to UNS16 for cob_id member in CAN messages. To be continued.
etisserant
parents: 365
diff changeset
   110
			else if(!(*(d->iam_a_slave)) && cob_id==SLSS_ADRESS)
343
118c1cabd0b0 Primary LSS support, thanks to Jorge Berzosa.
etisserant
parents: 320
diff changeset
   111
			{
118c1cabd0b0 Primary LSS support, thanks to Jorge Berzosa.
etisserant
parents: 320
diff changeset
   112
				proceedLSS_Master(d,m);
118c1cabd0b0 Primary LSS support, thanks to Jorge Berzosa.
etisserant
parents: 320
diff changeset
   113
			}
118c1cabd0b0 Primary LSS support, thanks to Jorge Berzosa.
etisserant
parents: 320
diff changeset
   114
			break;
118c1cabd0b0 Primary LSS support, thanks to Jorge Berzosa.
etisserant
parents: 320
diff changeset
   115
#endif
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   116
	}
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   117
}
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   118
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   119
#define StartOrStop(CommType, FuncStart, FuncStop) \
291
6165554cbfe9 Some tricks in communication services status struct (states.c) and in sync.c to fit with Beremiz generated node code.
etisserant
parents: 284
diff changeset
   120
	if(newCommunicationState->CommType && d->CurrentCommunicationState.CommType == 0){\
195
1510dd61ead0 Added debug level opt in configure and re-enabled debug macros.
etisserant
parents: 183
diff changeset
   121
		MSG_WAR(0x9999,#FuncStart, 9999);\
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   122
		d->CurrentCommunicationState.CommType = 1;\
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   123
		FuncStart;\
291
6165554cbfe9 Some tricks in communication services status struct (states.c) and in sync.c to fit with Beremiz generated node code.
etisserant
parents: 284
diff changeset
   124
	}else if(!newCommunicationState->CommType && d->CurrentCommunicationState.CommType == 1){\
195
1510dd61ead0 Added debug level opt in configure and re-enabled debug macros.
etisserant
parents: 183
diff changeset
   125
		MSG_WAR(0x9999,#FuncStop, 9999);\
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   126
		d->CurrentCommunicationState.CommType = 0;\
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   127
		FuncStop;\
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   128
	}
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   129
#define None
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   130
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   131
/*!                                                                                                
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   132
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   133
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   134
** @param d                                                                                        
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   135
** @param newCommunicationState                                                                    
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   136
**/  	
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   137
void switchCommunicationState(CO_Data* d, s_state_communication *newCommunicationState)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   138
{
381
854c43cdc24a added TestMasterSlaveLSS. LSS protocol revised.
groke6
parents: 378
diff changeset
   139
#ifdef CO_ENABLE_LSS
854c43cdc24a added TestMasterSlaveLSS. LSS protocol revised.
groke6
parents: 378
diff changeset
   140
	StartOrStop(csLSS,	startLSS(d),	stopLSS(d))
854c43cdc24a added TestMasterSlaveLSS. LSS protocol revised.
groke6
parents: 378
diff changeset
   141
#endif
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   142
	StartOrStop(csSDO,	None,		resetSDO(d))
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   143
	StartOrStop(csSYNC,	startSYNC(d),		stopSYNC(d))
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   144
	StartOrStop(csHeartbeat,	heartbeatInit(d),	heartbeatStop(d))
284
24bf3d692993 Implemented EMCY objects.
luis
parents: 263
diff changeset
   145
	StartOrStop(csEmergency,	emergencyInit(d),	emergencyStop(d)) 
235
f812bf6b7237 Preliminary implementation of Event Timer and Inhibit Timer driven TPDO
etisserant
parents: 215
diff changeset
   146
	StartOrStop(csPDO,	PDOInit(d),	PDOStop(d))
14
1fbdf88163b3 d?placement de l'envoi du bootup
dejoigny
parents: 0
diff changeset
   147
	StartOrStop(csBoot_Up,	None,	slaveSendBootUp(d))
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   148
}
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   149
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   150
/*!                                                                                                
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   151
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   152
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   153
** @param d                                                                                        
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   154
** @param newState                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   155
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   156
** @return                                                                                         
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   157
**/  
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   158
UNS8 setState(CO_Data* d, e_nodeState newState)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   159
{
378
d2abf6c8c27b As requested long ago, added CoData* parameter to all this applications callback, let application designer use identical callback for multiple nodes, and reduce source code length.
etisserant
parents: 370
diff changeset
   160
	if(newState != d->nodeState){
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   161
		switch( newState ){
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   162
			case Initialisation:
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   163
			{
343
118c1cabd0b0 Primary LSS support, thanks to Jorge Berzosa.
etisserant
parents: 320
diff changeset
   164
				s_state_communication newCommunicationState = {1, 0, 0, 0, 0, 0, 0};
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   165
				d->nodeState = Initialisation;
378
d2abf6c8c27b As requested long ago, added CoData* parameter to all this applications callback, let application designer use identical callback for multiple nodes, and reduce source code length.
etisserant
parents: 370
diff changeset
   166
				switchCommunicationState(d, &newCommunicationState);
d2abf6c8c27b As requested long ago, added CoData* parameter to all this applications callback, let application designer use identical callback for multiple nodes, and reduce source code length.
etisserant
parents: 370
diff changeset
   167
				/* call user app init callback now. */
d2abf6c8c27b As requested long ago, added CoData* parameter to all this applications callback, let application designer use identical callback for multiple nodes, and reduce source code length.
etisserant
parents: 370
diff changeset
   168
				/* d->initialisation MUST NOT CALL SetState */
d2abf6c8c27b As requested long ago, added CoData* parameter to all this applications callback, let application designer use identical callback for multiple nodes, and reduce source code length.
etisserant
parents: 370
diff changeset
   169
				(*d->initialisation)(d);				
d2abf6c8c27b As requested long ago, added CoData* parameter to all this applications callback, let application designer use identical callback for multiple nodes, and reduce source code length.
etisserant
parents: 370
diff changeset
   170
			}
d2abf6c8c27b As requested long ago, added CoData* parameter to all this applications callback, let application designer use identical callback for multiple nodes, and reduce source code length.
etisserant
parents: 370
diff changeset
   171
d2abf6c8c27b As requested long ago, added CoData* parameter to all this applications callback, let application designer use identical callback for multiple nodes, and reduce source code length.
etisserant
parents: 370
diff changeset
   172
			/* Automatic transition - No break statement ! */
d2abf6c8c27b As requested long ago, added CoData* parameter to all this applications callback, let application designer use identical callback for multiple nodes, and reduce source code length.
etisserant
parents: 370
diff changeset
   173
			/* Transition from Initialisation to Pre_operational */
d2abf6c8c27b As requested long ago, added CoData* parameter to all this applications callback, let application designer use identical callback for multiple nodes, and reduce source code length.
etisserant
parents: 370
diff changeset
   174
			/* is automatic as defined in DS301. */
d2abf6c8c27b As requested long ago, added CoData* parameter to all this applications callback, let application designer use identical callback for multiple nodes, and reduce source code length.
etisserant
parents: 370
diff changeset
   175
			/* App don't have to call SetState(d, Pre_operational) */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   176
								
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   177
			case Pre_operational:
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   178
			{
178
01d81faa3350 Add concise DCF support
greg
parents: 152
diff changeset
   179
				
343
118c1cabd0b0 Primary LSS support, thanks to Jorge Berzosa.
etisserant
parents: 320
diff changeset
   180
				s_state_communication newCommunicationState = {0, 1, 1, 1, 1, 0, 1};
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   181
				d->nodeState = Pre_operational;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   182
				switchCommunicationState(d, &newCommunicationState);
178
01d81faa3350 Add concise DCF support
greg
parents: 152
diff changeset
   183
				if (!(*(d->iam_a_slave)))
01d81faa3350 Add concise DCF support
greg
parents: 152
diff changeset
   184
				{
349
1e6dd4ef46b9 fixed the DCF-LSS conflict
groke6
parents: 345
diff changeset
   185
					masterSendNMTstateChange (d, 0, NMT_Reset_Node);
178
01d81faa3350 Add concise DCF support
greg
parents: 152
diff changeset
   186
				}
378
d2abf6c8c27b As requested long ago, added CoData* parameter to all this applications callback, let application designer use identical callback for multiple nodes, and reduce source code length.
etisserant
parents: 370
diff changeset
   187
                (*d->preOperational)(d);
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   188
			}
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   189
			break;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   190
								
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   191
			case Operational:
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   192
			if(d->nodeState == Initialisation) return 0xFF;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   193
			{
343
118c1cabd0b0 Primary LSS support, thanks to Jorge Berzosa.
etisserant
parents: 320
diff changeset
   194
				s_state_communication newCommunicationState = {0, 1, 1, 1, 1, 1, 0};
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   195
				d->nodeState = Operational;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   196
				newState = Operational;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   197
				switchCommunicationState(d, &newCommunicationState);
378
d2abf6c8c27b As requested long ago, added CoData* parameter to all this applications callback, let application designer use identical callback for multiple nodes, and reduce source code length.
etisserant
parents: 370
diff changeset
   198
				(*d->operational)(d);
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   199
			}
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   200
			break;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   201
						
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   202
			case Stopped:
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   203
			if(d->nodeState == Initialisation) return 0xFF;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   204
			{
343
118c1cabd0b0 Primary LSS support, thanks to Jorge Berzosa.
etisserant
parents: 320
diff changeset
   205
				s_state_communication newCommunicationState = {0, 0, 0, 0, 1, 0, 1};
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   206
				d->nodeState = Stopped;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   207
				newState = Stopped;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   208
				switchCommunicationState(d, &newCommunicationState);
378
d2abf6c8c27b As requested long ago, added CoData* parameter to all this applications callback, let application designer use identical callback for multiple nodes, and reduce source code length.
etisserant
parents: 370
diff changeset
   209
				(*d->stopped)(d);
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   210
			}
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   211
			break;
381
854c43cdc24a added TestMasterSlaveLSS. LSS protocol revised.
groke6
parents: 378
diff changeset
   212
			default:
854c43cdc24a added TestMasterSlaveLSS. LSS protocol revised.
groke6
parents: 378
diff changeset
   213
				return 0xFF;
854c43cdc24a added TestMasterSlaveLSS. LSS protocol revised.
groke6
parents: 378
diff changeset
   214
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   215
		}/* end switch case */
94
bdf4c86be6b2 Removed all non-supported and uncontrolled source code. Please refer to CVS version "Before_..." to see old code.
etisserant
parents: 88
diff changeset
   216
	
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   217
	}
378
d2abf6c8c27b As requested long ago, added CoData* parameter to all this applications callback, let application designer use identical callback for multiple nodes, and reduce source code length.
etisserant
parents: 370
diff changeset
   218
	/* d->nodeState contains the final state */
d2abf6c8c27b As requested long ago, added CoData* parameter to all this applications callback, let application designer use identical callback for multiple nodes, and reduce source code length.
etisserant
parents: 370
diff changeset
   219
	/* may not be the requested state */
d2abf6c8c27b As requested long ago, added CoData* parameter to all this applications callback, let application designer use identical callback for multiple nodes, and reduce source code length.
etisserant
parents: 370
diff changeset
   220
    return d->nodeState;  
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   221
}
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   222
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   223
/*!                                                                                                
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   224
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   225
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   226
** @param d                                                                                        
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   227
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   228
** @return                                                                                         
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   229
**/ 
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   230
UNS8 getNodeId(CO_Data* d)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   231
{
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   232
  return *d->bDeviceNodeId;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   233
}
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   234
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   235
/*!                                                                                                
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   236
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   237
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   238
** @param d                                                                                        
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   239
** @param nodeId                                                                                   
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   240
**/   
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   241
void setNodeId(CO_Data* d, UNS8 nodeId)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   242
{
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   243
  UNS16 offset = d->firstIndex->SDO_SVR;
343
118c1cabd0b0 Primary LSS support, thanks to Jorge Berzosa.
etisserant
parents: 320
diff changeset
   244
  
118c1cabd0b0 Primary LSS support, thanks to Jorge Berzosa.
etisserant
parents: 320
diff changeset
   245
#ifdef CO_ENABLE_LSS
381
854c43cdc24a added TestMasterSlaveLSS. LSS protocol revised.
groke6
parents: 378
diff changeset
   246
  d->lss_transfer.nodeID=nodeId;
517
003679edc437 FastScan review
groke6
parents: 447
diff changeset
   247
  if(nodeId==0xFF){
343
118c1cabd0b0 Primary LSS support, thanks to Jorge Berzosa.
etisserant
parents: 320
diff changeset
   248
  	*d->bDeviceNodeId = nodeId;
118c1cabd0b0 Primary LSS support, thanks to Jorge Berzosa.
etisserant
parents: 320
diff changeset
   249
  	return;
118c1cabd0b0 Primary LSS support, thanks to Jorge Berzosa.
etisserant
parents: 320
diff changeset
   250
  }
517
003679edc437 FastScan review
groke6
parents: 447
diff changeset
   251
  else
343
118c1cabd0b0 Primary LSS support, thanks to Jorge Berzosa.
etisserant
parents: 320
diff changeset
   252
#endif
517
003679edc437 FastScan review
groke6
parents: 447
diff changeset
   253
  if(!(nodeId>0 && nodeId<=127)){
003679edc437 FastScan review
groke6
parents: 447
diff changeset
   254
	  MSG_WAR(0x2D01, "Invalid NodeID",nodeId);
003679edc437 FastScan review
groke6
parents: 447
diff changeset
   255
	  return;
003679edc437 FastScan review
groke6
parents: 447
diff changeset
   256
  }
343
118c1cabd0b0 Primary LSS support, thanks to Jorge Berzosa.
etisserant
parents: 320
diff changeset
   257
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   258
  if(offset){
349
1e6dd4ef46b9 fixed the DCF-LSS conflict
groke6
parents: 345
diff changeset
   259
    /* Adjust COB-ID Client->Server (rx) only id already set to default value or id not valid (id==0xFF)*/
1e6dd4ef46b9 fixed the DCF-LSS conflict
groke6
parents: 345
diff changeset
   260
    if((*(UNS32*)d->objdict[offset].pSubindex[1].pObject == 0x600 + *d->bDeviceNodeId)||(*d->bDeviceNodeId==0xFF)){
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   261
      /* cob_id_client = 0x600 + nodeId; */
447
c9d01296d6d9 Endianess patch from Edward Karpicz, Lithuania :-)
etisserant
parents: 446
diff changeset
   262
      *(UNS32*)d->objdict[offset].pSubindex[1].pObject = 0x600 + nodeId;
303
340348f0193f Now, SetNodeId will change 1200h SDO server params to new defaul values only if already set to appropriate default values.
etisserant
parents: 291
diff changeset
   263
    }
349
1e6dd4ef46b9 fixed the DCF-LSS conflict
groke6
parents: 345
diff changeset
   264
    /* Adjust COB-ID Server -> Client (tx) only id already set to default value or id not valid (id==0xFF)*/
1e6dd4ef46b9 fixed the DCF-LSS conflict
groke6
parents: 345
diff changeset
   265
    if((*(UNS32*)d->objdict[offset].pSubindex[2].pObject == 0x580 + *d->bDeviceNodeId)||(*d->bDeviceNodeId==0xFF)){
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   266
      /* cob_id_server = 0x580 + nodeId; */
447
c9d01296d6d9 Endianess patch from Edward Karpicz, Lithuania :-)
etisserant
parents: 446
diff changeset
   267
      *(UNS32*)d->objdict[offset].pSubindex[2].pObject = 0x580 + nodeId;
303
340348f0193f Now, SetNodeId will change 1200h SDO server params to new defaul values only if already set to appropriate default values.
etisserant
parents: 291
diff changeset
   268
    }
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   269
  }
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   270
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   271
  /* 
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   272
   	Initialize the server(s) SDO parameters
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   273
  	Remember that only one SDO server is allowed, defined at index 0x1200	
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   274
 		
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   275
  	Initialize the client(s) SDO parameters 	
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   276
  	Nothing to initialize (no default values required by the DS 401)	
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   277
  	Initialize the receive PDO communication parameters. Only for 0x1400 to 0x1403 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   278
  */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   279
  {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   280
    UNS8 i = 0;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   281
    UNS16 offset = d->firstIndex->PDO_RCV;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   282
    UNS16 lastIndex = d->lastIndex->PDO_RCV;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   283
    UNS32 cobID[] = {0x200, 0x300, 0x400, 0x500};
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   284
    if( offset ) while( (offset <= lastIndex) && (i < 4)) {
349
1e6dd4ef46b9 fixed the DCF-LSS conflict
groke6
parents: 345
diff changeset
   285
      if((*(UNS32*)d->objdict[offset].pSubindex[1].pObject == cobID[i] + *d->bDeviceNodeId)||(*d->bDeviceNodeId==0xFF))
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   286
	      *(UNS32*)d->objdict[offset].pSubindex[1].pObject = cobID[i] + nodeId;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   287
      i ++;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   288
      offset ++;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   289
    }
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   290
  }
71
95cd3376cc9f compilator compatitibility
frdupin
parents: 53
diff changeset
   291
  /* ** Initialize the transmit PDO communication parameters. Only for 0x1800 to 0x1803 */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   292
  {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   293
    UNS8 i = 0;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   294
    UNS16 offset = d->firstIndex->PDO_TRS;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   295
    UNS16 lastIndex = d->lastIndex->PDO_TRS;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   296
    UNS32 cobID[] = {0x180, 0x280, 0x380, 0x480};
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   297
    i = 0;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   298
    if( offset ) while ((offset <= lastIndex) && (i < 4)) {
349
1e6dd4ef46b9 fixed the DCF-LSS conflict
groke6
parents: 345
diff changeset
   299
      if((*(UNS32*)d->objdict[offset].pSubindex[1].pObject == cobID[i] + *d->bDeviceNodeId)||(*d->bDeviceNodeId==0xFF))
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   300
	      *(UNS32*)d->objdict[offset].pSubindex[1].pObject = cobID[i] + nodeId;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   301
      i ++;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   302
      offset ++;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   303
    }
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   304
  }
314
68e83c3ffbb5 Better EMCY support. Now EMCY COB-ID depend on OD 1014h entry, as told in DS-301.
etisserant
parents: 303
diff changeset
   305
68e83c3ffbb5 Better EMCY support. Now EMCY COB-ID depend on OD 1014h entry, as told in DS-301.
etisserant
parents: 303
diff changeset
   306
  /* Update EMCY COB-ID if already set to default*/
349
1e6dd4ef46b9 fixed the DCF-LSS conflict
groke6
parents: 345
diff changeset
   307
  if((*d->error_cobid == *d->bDeviceNodeId + 0x80)||(*d->bDeviceNodeId==0xFF))
314
68e83c3ffbb5 Better EMCY support. Now EMCY COB-ID depend on OD 1014h entry, as told in DS-301.
etisserant
parents: 303
diff changeset
   308
    *d->error_cobid = nodeId + 0x80;
68e83c3ffbb5 Better EMCY support. Now EMCY COB-ID depend on OD 1014h entry, as told in DS-301.
etisserant
parents: 303
diff changeset
   309
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   310
  /* bDeviceNodeId is defined in the object dictionary. */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   311
  *d->bDeviceNodeId = nodeId;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   312
}
149
fe50ada8020b Changes in the API:
etisserant
parents: 94
diff changeset
   313
378
d2abf6c8c27b As requested long ago, added CoData* parameter to all this applications callback, let application designer use identical callback for multiple nodes, and reduce source code length.
etisserant
parents: 370
diff changeset
   314
void _initialisation(CO_Data* d){}
d2abf6c8c27b As requested long ago, added CoData* parameter to all this applications callback, let application designer use identical callback for multiple nodes, and reduce source code length.
etisserant
parents: 370
diff changeset
   315
void _preOperational(CO_Data* d){}
d2abf6c8c27b As requested long ago, added CoData* parameter to all this applications callback, let application designer use identical callback for multiple nodes, and reduce source code length.
etisserant
parents: 370
diff changeset
   316
void _operational(CO_Data* d){}
d2abf6c8c27b As requested long ago, added CoData* parameter to all this applications callback, let application designer use identical callback for multiple nodes, and reduce source code length.
etisserant
parents: 370
diff changeset
   317
void _stopped(CO_Data* d){}