src/states.c
author etisserant
Fri, 01 Feb 2008 18:01:36 +0100
changeset 377 bea5a1576cbd
parent 370 6fecf36df407
child 378 d2abf6c8c27b
permissions -rw-r--r--
Enhanced cleanup of TCP CAN client/server
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
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    32
#include "states.h"
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    33
#include "def.h"
204
44ce74232ccb Some fixes for visual studio C compiler compatiblity.
etisserant
parents: 195
diff changeset
    34
#include "dcf.h"
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    35
#include "nmtSlave.h"
284
24bf3d692993 Implemented EMCY objects.
luis
parents: 263
diff changeset
    36
#include "emcy.h"
343
118c1cabd0b0 Primary LSS support, thanks to Jorge Berzosa.
etisserant
parents: 320
diff changeset
    37
#ifdef CO_ENABLE_LSS
118c1cabd0b0 Primary LSS support, thanks to Jorge Berzosa.
etisserant
parents: 320
diff changeset
    38
#include "lss.h"
118c1cabd0b0 Primary LSS support, thanks to Jorge Berzosa.
etisserant
parents: 320
diff changeset
    39
#endif
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
    40
#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
    41
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    42
/** Prototypes for internals functions */
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    43
/*!                                                                                                
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    44
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    45
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    46
** @param d                                                                                        
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    47
** @param newCommunicationState                                                                    
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    48
**/     
53
73bc47a0db55 Add prototypes
frdupin
parents: 14
diff changeset
    49
void switchCommunicationState(CO_Data* d, 
73bc47a0db55 Add prototypes
frdupin
parents: 14
diff changeset
    50
	s_state_communication *newCommunicationState);
73bc47a0db55 Add prototypes
frdupin
parents: 14
diff changeset
    51
	
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    52
/*!                                                                                                
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    53
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    54
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    55
** @param d                                                                                        
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    56
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    57
** @return                                                                                         
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    58
**/    
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    59
e_nodeState getState(CO_Data* d)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    60
{
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    61
  return d->nodeState;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    62
}
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    63
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    64
/*!                                                                                                
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    65
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    66
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    67
** @param d                                                                                        
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    68
** @param m                                                                                        
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    69
**/  
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    70
void canDispatch(CO_Data* d, Message *m)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    71
{
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
    72
	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
    73
	 switch(cob_id >> 7)
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    74
	{
284
24bf3d692993 Implemented EMCY objects.
luis
parents: 263
diff changeset
    75
		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
    76
			if(cob_id == 0x080)	/* SYNC */
284
24bf3d692993 Implemented EMCY objects.
luis
parents: 263
diff changeset
    77
			{
24bf3d692993 Implemented EMCY objects.
luis
parents: 263
diff changeset
    78
				if(d->CurrentCommunicationState.csSYNC)
24bf3d692993 Implemented EMCY objects.
luis
parents: 263
diff changeset
    79
					proceedSYNC(d);
24bf3d692993 Implemented EMCY objects.
luis
parents: 263
diff changeset
    80
			} else 		/* EMCY */
24bf3d692993 Implemented EMCY objects.
luis
parents: 263
diff changeset
    81
				if(d->CurrentCommunicationState.csEmergency)
24bf3d692993 Implemented EMCY objects.
luis
parents: 263
diff changeset
    82
					proceedEMCY(d,m);
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    83
			break;
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
    84
		/* case TIME_STAMP: */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    85
		case PDO1tx:
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    86
		case PDO1rx:
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    87
		case PDO2tx:
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    88
		case PDO2rx:
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    89
		case PDO3tx:
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    90
		case PDO3rx:
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    91
		case PDO4tx:
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    92
		case PDO4rx:
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    93
			if (d->CurrentCommunicationState.csPDO)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    94
				proceedPDO(d,m);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    95
			break;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    96
		case SDOtx:
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    97
		case SDOrx:
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    98
			if (d->CurrentCommunicationState.csSDO)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    99
				proceedSDO(d,m);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   100
			break;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   101
		case NODE_GUARD:
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   102
			if (d->CurrentCommunicationState.csHeartbeat)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   103
				proceedNODE_GUARD(d,m);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   104
			break;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   105
		case NMT:
88
b6e0b91d073a pointer bogue for *(d->iam_a_slave)
frdupin
parents: 71
diff changeset
   106
			if (*(d->iam_a_slave))
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   107
			{
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   108
				proceedNMTstateChange(d,m);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   109
			}
343
118c1cabd0b0 Primary LSS support, thanks to Jorge Berzosa.
etisserant
parents: 320
diff changeset
   110
#ifdef CO_ENABLE_LSS
118c1cabd0b0 Primary LSS support, thanks to Jorge Berzosa.
etisserant
parents: 320
diff changeset
   111
		case LSS:
118c1cabd0b0 Primary LSS support, thanks to Jorge Berzosa.
etisserant
parents: 320
diff changeset
   112
			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
   113
			if ((*(d->iam_a_slave)) && cob_id==MLSS_ADRESS)
343
118c1cabd0b0 Primary LSS support, thanks to Jorge Berzosa.
etisserant
parents: 320
diff changeset
   114
			{
118c1cabd0b0 Primary LSS support, thanks to Jorge Berzosa.
etisserant
parents: 320
diff changeset
   115
				proceedLSS_Slave(d,m);
118c1cabd0b0 Primary LSS support, thanks to Jorge Berzosa.
etisserant
parents: 320
diff changeset
   116
			}
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
   117
			else if(!(*(d->iam_a_slave)) && cob_id==SLSS_ADRESS)
343
118c1cabd0b0 Primary LSS support, thanks to Jorge Berzosa.
etisserant
parents: 320
diff changeset
   118
			{
118c1cabd0b0 Primary LSS support, thanks to Jorge Berzosa.
etisserant
parents: 320
diff changeset
   119
				proceedLSS_Master(d,m);
118c1cabd0b0 Primary LSS support, thanks to Jorge Berzosa.
etisserant
parents: 320
diff changeset
   120
			}
118c1cabd0b0 Primary LSS support, thanks to Jorge Berzosa.
etisserant
parents: 320
diff changeset
   121
			break;
118c1cabd0b0 Primary LSS support, thanks to Jorge Berzosa.
etisserant
parents: 320
diff changeset
   122
#endif
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   123
	}
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   124
}
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   125
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   126
#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
   127
	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
   128
		MSG_WAR(0x9999,#FuncStart, 9999);\
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   129
		d->CurrentCommunicationState.CommType = 1;\
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   130
		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
   131
	}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
   132
		MSG_WAR(0x9999,#FuncStop, 9999);\
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   133
		d->CurrentCommunicationState.CommType = 0;\
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   134
		FuncStop;\
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   135
	}
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   136
#define None
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   137
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   138
/*!                                                                                                
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   139
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   140
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   141
** @param d                                                                                        
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   142
** @param newCommunicationState                                                                    
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   143
**/  	
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   144
void switchCommunicationState(CO_Data* d, s_state_communication *newCommunicationState)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   145
{
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   146
	StartOrStop(csSDO,	None,		resetSDO(d))
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   147
	StartOrStop(csSYNC,	startSYNC(d),		stopSYNC(d))
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   148
	StartOrStop(csHeartbeat,	heartbeatInit(d),	heartbeatStop(d))
284
24bf3d692993 Implemented EMCY objects.
luis
parents: 263
diff changeset
   149
	StartOrStop(csEmergency,	emergencyInit(d),	emergencyStop(d)) 
235
f812bf6b7237 Preliminary implementation of Event Timer and Inhibit Timer driven TPDO
etisserant
parents: 215
diff changeset
   150
	StartOrStop(csPDO,	PDOInit(d),	PDOStop(d))
14
1fbdf88163b3 d?placement de l'envoi du bootup
dejoigny
parents: 0
diff changeset
   151
	StartOrStop(csBoot_Up,	None,	slaveSendBootUp(d))
343
118c1cabd0b0 Primary LSS support, thanks to Jorge Berzosa.
etisserant
parents: 320
diff changeset
   152
#ifdef CO_ENABLE_LSS
118c1cabd0b0 Primary LSS support, thanks to Jorge Berzosa.
etisserant
parents: 320
diff changeset
   153
	StartOrStop(csLSS,	startLSS(d),	stopLSS(d))
118c1cabd0b0 Primary LSS support, thanks to Jorge Berzosa.
etisserant
parents: 320
diff changeset
   154
#endif
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   155
}
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   156
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   157
/*!                                                                                                
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   158
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   159
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   160
** @param d                                                                                        
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   161
** @param newState                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   162
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   163
** @return                                                                                         
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   164
**/  
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   165
UNS8 setState(CO_Data* d, e_nodeState newState)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   166
{
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   167
	while(newState != d->nodeState){
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   168
		switch( newState ){
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   169
			case Initialisation:
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   170
			{
343
118c1cabd0b0 Primary LSS support, thanks to Jorge Berzosa.
etisserant
parents: 320
diff changeset
   171
				s_state_communication newCommunicationState = {1, 0, 0, 0, 0, 0, 0};
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   172
				/* This will force a second loop for the state switch */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   173
				d->nodeState = Initialisation;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   174
				newState = Pre_operational;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   175
				switchCommunicationState(d, &newCommunicationState);
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   176
				/* call user app related state func. */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   177
				(*d->initialisation)();
178
01d81faa3350 Add concise DCF support
greg
parents: 152
diff changeset
   178
				
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   179
			}
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   180
			break;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   181
								
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   182
			case Pre_operational:
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   183
			{
178
01d81faa3350 Add concise DCF support
greg
parents: 152
diff changeset
   184
				
343
118c1cabd0b0 Primary LSS support, thanks to Jorge Berzosa.
etisserant
parents: 320
diff changeset
   185
				s_state_communication newCommunicationState = {0, 1, 1, 1, 1, 0, 1};
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   186
				d->nodeState = Pre_operational;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   187
				newState = Pre_operational;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   188
				switchCommunicationState(d, &newCommunicationState);
178
01d81faa3350 Add concise DCF support
greg
parents: 152
diff changeset
   189
				if (!(*(d->iam_a_slave)))
01d81faa3350 Add concise DCF support
greg
parents: 152
diff changeset
   190
				{
349
1e6dd4ef46b9 fixed the DCF-LSS conflict
groke6
parents: 345
diff changeset
   191
					//send_consise_dcf(d,0x01);
1e6dd4ef46b9 fixed the DCF-LSS conflict
groke6
parents: 345
diff changeset
   192
					masterSendNMTstateChange (d, 0, NMT_Reset_Node);
1e6dd4ef46b9 fixed the DCF-LSS conflict
groke6
parents: 345
diff changeset
   193
                    (*d->preOperational)(); 
178
01d81faa3350 Add concise DCF support
greg
parents: 152
diff changeset
   194
				}
01d81faa3350 Add concise DCF support
greg
parents: 152
diff changeset
   195
				else 
01d81faa3350 Add concise DCF support
greg
parents: 152
diff changeset
   196
				{
01d81faa3350 Add concise DCF support
greg
parents: 152
diff changeset
   197
					(*d->preOperational)();
01d81faa3350 Add concise DCF support
greg
parents: 152
diff changeset
   198
				}
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 Operational:
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, 1, 1, 1, 1, 1, 0};
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   206
				d->nodeState = Operational;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   207
				newState = Operational;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   208
				switchCommunicationState(d, &newCommunicationState);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   209
				(*d->operational)();
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   210
			}
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   211
			break;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   212
						
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   213
			case Stopped:
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   214
			if(d->nodeState == Initialisation) return 0xFF;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   215
			{
343
118c1cabd0b0 Primary LSS support, thanks to Jorge Berzosa.
etisserant
parents: 320
diff changeset
   216
				s_state_communication newCommunicationState = {0, 0, 0, 0, 1, 0, 1};
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   217
				d->nodeState = Stopped;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   218
				newState = Stopped;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   219
				switchCommunicationState(d, &newCommunicationState);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   220
				(*d->stopped)();
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   221
			}
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   222
			break;
343
118c1cabd0b0 Primary LSS support, thanks to Jorge Berzosa.
etisserant
parents: 320
diff changeset
   223
#ifdef CO_ENABLE_LSS
118c1cabd0b0 Primary LSS support, thanks to Jorge Berzosa.
etisserant
parents: 320
diff changeset
   224
			case LssTimingDelay:
118c1cabd0b0 Primary LSS support, thanks to Jorge Berzosa.
etisserant
parents: 320
diff changeset
   225
			{
118c1cabd0b0 Primary LSS support, thanks to Jorge Berzosa.
etisserant
parents: 320
diff changeset
   226
				s_state_communication newCommunicationState = {0, 0, 0, 0, 0, 0, 0};
118c1cabd0b0 Primary LSS support, thanks to Jorge Berzosa.
etisserant
parents: 320
diff changeset
   227
				d->nodeState = LssTimingDelay;
118c1cabd0b0 Primary LSS support, thanks to Jorge Berzosa.
etisserant
parents: 320
diff changeset
   228
				newState = LssTimingDelay;
118c1cabd0b0 Primary LSS support, thanks to Jorge Berzosa.
etisserant
parents: 320
diff changeset
   229
				switchCommunicationState(d, &newCommunicationState);
118c1cabd0b0 Primary LSS support, thanks to Jorge Berzosa.
etisserant
parents: 320
diff changeset
   230
			}
118c1cabd0b0 Primary LSS support, thanks to Jorge Berzosa.
etisserant
parents: 320
diff changeset
   231
			break;
118c1cabd0b0 Primary LSS support, thanks to Jorge Berzosa.
etisserant
parents: 320
diff changeset
   232
#endif
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   233
			
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   234
			default:
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   235
				return 0xFF;
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   236
		}/* 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
   237
	
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   238
	}
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   239
	return 0;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   240
}
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   241
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   242
/*!                                                                                                
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   243
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   244
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   245
** @param d                                                                                        
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   246
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   247
** @return                                                                                         
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   248
**/ 
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   249
UNS8 getNodeId(CO_Data* d)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   250
{
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   251
  return *d->bDeviceNodeId;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   252
}
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   253
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   254
/*!                                                                                                
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   255
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   256
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   257
** @param d                                                                                        
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   258
** @param nodeId                                                                                   
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   259
**/   
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   260
void setNodeId(CO_Data* d, UNS8 nodeId)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   261
{
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   262
  UNS16 offset = d->firstIndex->SDO_SVR;
343
118c1cabd0b0 Primary LSS support, thanks to Jorge Berzosa.
etisserant
parents: 320
diff changeset
   263
  
118c1cabd0b0 Primary LSS support, thanks to Jorge Berzosa.
etisserant
parents: 320
diff changeset
   264
#ifdef CO_ENABLE_LSS
118c1cabd0b0 Primary LSS support, thanks to Jorge Berzosa.
etisserant
parents: 320
diff changeset
   265
  if(nodeId==0xFF)
118c1cabd0b0 Primary LSS support, thanks to Jorge Berzosa.
etisserant
parents: 320
diff changeset
   266
  {
118c1cabd0b0 Primary LSS support, thanks to Jorge Berzosa.
etisserant
parents: 320
diff changeset
   267
  	*d->bDeviceNodeId = nodeId;
118c1cabd0b0 Primary LSS support, thanks to Jorge Berzosa.
etisserant
parents: 320
diff changeset
   268
  	return;
118c1cabd0b0 Primary LSS support, thanks to Jorge Berzosa.
etisserant
parents: 320
diff changeset
   269
  }
118c1cabd0b0 Primary LSS support, thanks to Jorge Berzosa.
etisserant
parents: 320
diff changeset
   270
#endif
118c1cabd0b0 Primary LSS support, thanks to Jorge Berzosa.
etisserant
parents: 320
diff changeset
   271
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   272
  if(offset){
349
1e6dd4ef46b9 fixed the DCF-LSS conflict
groke6
parents: 345
diff changeset
   273
    /* 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
   274
    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
   275
      /* cob_id_client = 0x600 + nodeId; */
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
   276
      UNS32 tmp = 0x600 + nodeId;
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
   277
      *(UNS32*)d->objdict[offset].pSubindex[1].pObject = UNS32_LE(tmp);
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
   278
    }
349
1e6dd4ef46b9 fixed the DCF-LSS conflict
groke6
parents: 345
diff changeset
   279
    /* 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
   280
    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
   281
      /* cob_id_server = 0x580 + nodeId; */
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
   282
        UNS32 tmp = 0x580 + nodeId;
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
   283
      *(UNS32*)d->objdict[offset].pSubindex[2].pObject = UNS32_LE(tmp);
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
   284
    }
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   285
  }
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   286
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   287
  /* 
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   288
   	Initialize the server(s) SDO parameters
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   289
  	Remember that only one SDO server is allowed, defined at index 0x1200	
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   290
 		
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   291
  	Initialize the client(s) SDO parameters 	
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   292
  	Nothing to initialize (no default values required by the DS 401)	
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   293
  	Initialize the receive PDO communication parameters. Only for 0x1400 to 0x1403 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   294
  */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   295
  {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   296
    UNS8 i = 0;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   297
    UNS16 offset = d->firstIndex->PDO_RCV;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   298
    UNS16 lastIndex = d->lastIndex->PDO_RCV;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   299
    UNS32 cobID[] = {0x200, 0x300, 0x400, 0x500};
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   300
    if( offset ) while( (offset <= lastIndex) && (i < 4)) {
349
1e6dd4ef46b9 fixed the DCF-LSS conflict
groke6
parents: 345
diff changeset
   301
      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
   302
	      *(UNS32*)d->objdict[offset].pSubindex[1].pObject = cobID[i] + nodeId;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   303
      i ++;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   304
      offset ++;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   305
    }
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   306
  }
71
95cd3376cc9f compilator compatitibility
frdupin
parents: 53
diff changeset
   307
  /* ** Initialize the transmit PDO communication parameters. Only for 0x1800 to 0x1803 */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   308
  {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   309
    UNS8 i = 0;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   310
    UNS16 offset = d->firstIndex->PDO_TRS;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   311
    UNS16 lastIndex = d->lastIndex->PDO_TRS;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   312
    UNS32 cobID[] = {0x180, 0x280, 0x380, 0x480};
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   313
    i = 0;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   314
    if( offset ) while ((offset <= lastIndex) && (i < 4)) {
349
1e6dd4ef46b9 fixed the DCF-LSS conflict
groke6
parents: 345
diff changeset
   315
      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
   316
	      *(UNS32*)d->objdict[offset].pSubindex[1].pObject = cobID[i] + nodeId;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   317
      i ++;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   318
      offset ++;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   319
    }
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   320
  }
314
68e83c3ffbb5 Better EMCY support. Now EMCY COB-ID depend on OD 1014h entry, as told in DS-301.
etisserant
parents: 303
diff changeset
   321
68e83c3ffbb5 Better EMCY support. Now EMCY COB-ID depend on OD 1014h entry, as told in DS-301.
etisserant
parents: 303
diff changeset
   322
  /* Update EMCY COB-ID if already set to default*/
349
1e6dd4ef46b9 fixed the DCF-LSS conflict
groke6
parents: 345
diff changeset
   323
  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
   324
    *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
   325
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   326
  /* bDeviceNodeId is defined in the object dictionary. */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   327
  *d->bDeviceNodeId = nodeId;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   328
}
149
fe50ada8020b Changes in the API:
etisserant
parents: 94
diff changeset
   329
fe50ada8020b Changes in the API:
etisserant
parents: 94
diff changeset
   330
void _initialisation(){}
fe50ada8020b Changes in the API:
etisserant
parents: 94
diff changeset
   331
void _preOperational(){}
fe50ada8020b Changes in the API:
etisserant
parents: 94
diff changeset
   332
void _operational(){}
fe50ada8020b Changes in the API:
etisserant
parents: 94
diff changeset
   333
void _stopped(){}