/home/epimerde/documents/tc11/CanFestival-3/src/sdo.c File Reference

#include "objacces.h"
#include "sdo.h"
#include "canfestival.h"

Include dependency graph for sdo.c:

Go to the source code of this file.

Defines

#define NO_INLINE
#define INLINE
#define getSDOcs(byte)   (byte >> 5)
#define getSDOn2(byte)   ((byte >> 2) & 3)
#define getSDOn3(byte)   ((byte >> 1) & 7)
#define getSDOe(byte)   ((byte >> 1) & 1)
#define getSDOs(byte)   (byte & 1)
#define getSDOc(byte)   (byte & 1)
#define getSDOt(byte)   ((byte >> 4) & 1)
#define getSDOindex(byte1, byte2)   ((byte2 << 8) | (byte1))
#define getSDOsubIndex(byte3)   (byte3)
#define StopSDO_TIMER(id)
#define StartSDO_TIMER(id)
#define RestartSDO_TIMER(id)

Functions

INLINE UNS8 _writeNetworkDict (CO_Data *d, UNS8 nodeId, UNS16 index, UNS8 subIndex, UNS8 count, UNS8 dataType, void *data, SDOCallback_t Callback, UNS8 endianize)
INLINE UNS8 _readNetworkDict (CO_Data *d, UNS8 nodeId, UNS16 index, UNS8 subIndex, UNS8 dataType, SDOCallback_t Callback)
void SDOTimeoutAlarm (CO_Data *d, UNS32 id)
void resetSDO (CO_Data *d)
UNS32 SDOlineToObjdict (CO_Data *d, UNS8 line)
UNS32 objdictToSDOline (CO_Data *d, UNS8 line)
UNS8 lineToSDO (CO_Data *d, UNS8 line, UNS8 nbBytes, UNS8 *data)
UNS8 SDOtoLine (CO_Data *d, UNS8 line, UNS8 nbBytes, UNS8 *data)
UNS8 failedSDO (CO_Data *d, UNS8 nodeId, UNS8 whoami, UNS16 index, UNS8 subIndex, UNS32 abortCode)
void resetSDOline (CO_Data *d, UNS8 line)
UNS8 initSDOline (CO_Data *d, UNS8 line, UNS8 nodeId, UNS16 index, UNS8 subIndex, UNS8 state)
UNS8 getSDOfreeLine (CO_Data *d, UNS8 whoami, UNS8 *line)
UNS8 getSDOlineOnUse (CO_Data *d, UNS8 nodeId, UNS8 whoami, UNS8 *line)
UNS8 closeSDOtransfer (CO_Data *d, UNS8 nodeId, UNS8 whoami)
UNS8 getSDOlineRestBytes (CO_Data *d, UNS8 line, UNS8 *nbBytes)
UNS8 setSDOlineRestBytes (CO_Data *d, UNS8 line, UNS8 nbBytes)
UNS8 sendSDO (CO_Data *d, UNS8 whoami, s_SDO sdo)
UNS8 sendSDOabort (CO_Data *d, UNS8 whoami, UNS16 index, UNS8 subIndex, UNS32 abortCode)
UNS8 proceedSDO (CO_Data *d, Message *m)
UNS8 writeNetworkDict (CO_Data *d, UNS8 nodeId, UNS16 index, UNS8 subIndex, UNS8 count, UNS8 dataType, void *data)
UNS8 writeNetworkDictCallBack (CO_Data *d, UNS8 nodeId, UNS16 index, UNS8 subIndex, UNS8 count, UNS8 dataType, void *data, SDOCallback_t Callback)
UNS8 readNetworkDict (CO_Data *d, UNS8 nodeId, UNS16 index, UNS8 subIndex, UNS8 dataType)
UNS8 readNetworkDictCallback (CO_Data *d, UNS8 nodeId, UNS16 index, UNS8 subIndex, UNS8 dataType, SDOCallback_t Callback)
UNS8 getReadResultNetworkDict (CO_Data *d, UNS8 nodeId, void *data, UNS8 *size, UNS32 *abortCode)
UNS8 getWriteResultNetworkDict (CO_Data *d, UNS8 nodeId, UNS32 *abortCode)


Detailed Description

Author:
Edouard TISSERANT and Francis DUPIN
Date:
Tue Jun 5 09:32:32 2007

Definition in file sdo.c.


Define Documentation

#define getSDOc ( byte   )     (byte & 1)

Returns the indicator of end transmission from the first byte of the SDO

Definition at line 109 of file sdo.c.

Referenced by proceedSDO().

#define getSDOcs ( byte   )     (byte >> 5)

Returns the command specifier (cs, ccs, scs) from the first byte of the SDO

Definition at line 89 of file sdo.c.

Referenced by proceedSDO().

#define getSDOe ( byte   )     ((byte >> 1) & 1)

Returns the transfer type from the first byte of the SDO

Definition at line 101 of file sdo.c.

Referenced by proceedSDO().

#define getSDOindex ( byte1,
byte2   )     ((byte2 << 8) | (byte1))

Returns the index from the bytes 1 and 2 of the SDO

Definition at line 117 of file sdo.c.

Referenced by proceedSDO().

#define getSDOn2 ( byte   )     ((byte >> 2) & 3)

Returns the number of bytes without data from the first byte of the SDO. Coded in 2 bits

Definition at line 93 of file sdo.c.

Referenced by proceedSDO().

#define getSDOn3 ( byte   )     ((byte >> 1) & 7)

Returns the number of bytes without data from the first byte of the SDO. Coded in 3 bits

Definition at line 97 of file sdo.c.

Referenced by proceedSDO().

#define getSDOs ( byte   )     (byte & 1)

Returns the size indicator from the first byte of the SDO

Definition at line 105 of file sdo.c.

Referenced by proceedSDO().

#define getSDOsubIndex ( byte3   )     (byte3)

Returns the subIndex from the byte 3 of the SDO

Definition at line 121 of file sdo.c.

Referenced by proceedSDO().

#define getSDOt ( byte   )     ((byte >> 4) & 1)

Returns the toggle from the first byte of the SDO

Definition at line 113 of file sdo.c.

Referenced by proceedSDO().

#define INLINE

Definition at line 43 of file sdo.c.

#define NO_INLINE

Definition at line 40 of file sdo.c.

#define RestartSDO_TIMER ( id   ) 

Value:

MSG_WAR(0x3A07, "restartSDO_TIMER for line : ", line);\
if(d->transfers[id].timer != TIMER_NONE) { StopSDO_TIMER(id) StartSDO_TIMER(id) }

Definition at line 160 of file sdo.c.

Referenced by proceedSDO().

#define StartSDO_TIMER ( id   ) 

Value:

MSG_WAR(0x3A06, "StartSDO_TIMER for line : ", line);\
d->transfers[id].timer = SetAlarm(d,id,&SDOTimeoutAlarm,MS_TO_TIMEVAL(SDO_TIMEOUT_MS),0);

Definition at line 156 of file sdo.c.

Referenced by initSDOline().

#define StopSDO_TIMER ( id   ) 

Value:

MSG_WAR(0x3A05, "StopSDO_TIMER for line : ", line);\
d->transfers[id].timer = DelAlarm(d->transfers[id].timer);

Definition at line 152 of file sdo.c.

Referenced by failedSDO(), initSDOline(), and proceedSDO().


Function Documentation

INLINE UNS8 _readNetworkDict ( CO_Data *  d,
UNS8  nodeId,
UNS16  index,
UNS8  subIndex,
UNS8  dataType,
SDOCallback_t  Callback 
)

Parameters:
d 
nodeId 
index 
subIndex 
dataType 
Callback 
Returns:

Verify that there is no SDO communication yet.

Taking the line ...

Check which SDO to use to communicate with the node

looking for the nodeId server

Send the SDO to the server. Initiate upload, cs=2.

Definition at line 1406 of file sdo.c.

References getSDOfreeLine(), getSDOlineOnUse(), initSDOline(), resetSDOline(), and sendSDO().

Referenced by readNetworkDict(), and readNetworkDictCallback().

Here is the call graph for this function:

INLINE UNS8 _writeNetworkDict ( CO_Data *  d,
UNS8  nodeId,
UNS16  index,
UNS8  subIndex,
UNS8  count,
UNS8  dataType,
void *  data,
SDOCallback_t  Callback,
UNS8  endianize 
)

Called by writeNetworkDict

Parameters:
d 
nodeId 
index 
subIndex 
count 
dataType 
data 
Callback 
endianize 
Returns:

UNS8 closeSDOtransfer ( CO_Data *  d,
UNS8  nodeId,
UNS8  whoami 
)

Parameters:
d 
nodeId 
whoami 
Returns:

Definition at line 439 of file sdo.c.

References getSDOlineOnUse(), and resetSDOline().

Here is the call graph for this function:

UNS8 failedSDO ( CO_Data *  d,
UNS8  nodeId,
UNS8  whoami,
UNS16  index,
UNS8  subIndex,
UNS32  abortCode 
)

Parameters:
d 
nodeId 
whoami 
index 
subIndex 
abortCode 
Returns:

Definition at line 307 of file sdo.c.

References getSDOlineOnUse(), resetSDOline(), sendSDOabort(), and StopSDO_TIMER.

Referenced by proceedSDO().

Here is the call graph for this function:

UNS8 getReadResultNetworkDict ( CO_Data *  d,
UNS8  nodeId,
void *  data,
UNS8 *  size,
UNS32 *  abortCode 
)

Parameters:
d 
nodeId 
data 
size 
abortCode 
Returns:

Looking for the line tranfert.

Transfert is finished. Put the value in the data.

Definition at line 1532 of file sdo.c.

References getSDOlineOnUse().

Here is the call graph for this function:

UNS8 getSDOfreeLine ( CO_Data *  d,
UNS8  whoami,
UNS8 *  line 
)

Parameters:
d 
whoami 
line 
Returns:

Definition at line 388 of file sdo.c.

Referenced by _readNetworkDict(), _writeNetworkDict(), and proceedSDO().

UNS8 getSDOlineOnUse ( CO_Data *  d,
UNS8  nodeId,
UNS8  whoami,
UNS8 *  line 
)

Parameters:
d 
nodeId 
whoami 
line 
Returns:

Definition at line 414 of file sdo.c.

Referenced by _readNetworkDict(), _writeNetworkDict(), closeSDOtransfer(), failedSDO(), getReadResultNetworkDict(), getWriteResultNetworkDict(), and proceedSDO().

UNS8 getSDOlineRestBytes ( CO_Data *  d,
UNS8  line,
UNS8 *  nbBytes 
)

Parameters:
d 
line 
nbBytes 
Returns:

Definition at line 461 of file sdo.c.

Referenced by proceedSDO().

UNS8 getWriteResultNetworkDict ( CO_Data *  d,
UNS8  nodeId,
UNS32 *  abortCode 
)

Parameters:
d 
nodeId 
abortCode 
Returns:

Looking for the line tranfert.

Definition at line 1573 of file sdo.c.

References getSDOlineOnUse().

Here is the call graph for this function:

UNS8 initSDOline ( CO_Data *  d,
UNS8  line,
UNS8  nodeId,
UNS16  index,
UNS8  subIndex,
UNS8  state 
)

Parameters:
d 
line 
nodeId 
index 
subIndex 
state 
Returns:

Definition at line 359 of file sdo.c.

References StartSDO_TIMER, and StopSDO_TIMER.

Referenced by _readNetworkDict(), _writeNetworkDict(), proceedSDO(), and resetSDOline().

UNS8 lineToSDO ( CO_Data *  d,
UNS8  line,
UNS8  nbBytes,
UNS8 *  data 
)

Parameters:
d 
line 
nbBytes 
data 
Returns:

Definition at line 250 of file sdo.c.

Referenced by proceedSDO().

UNS32 objdictToSDOline ( CO_Data *  d,
UNS8  line 
)

Parameters:
d 
line 
Returns:

Definition at line 209 of file sdo.c.

References getODentry().

Referenced by proceedSDO().

Here is the call graph for this function:

UNS8 proceedSDO ( CO_Data *  d,
Message *  m 
)

Parameters:
d 
m 
Returns:

received or to be transmited.

The node from which the SDO is received

node id in 32 bits, for temporary use

SDO_SERVER or SDO_CLIENT.

while reading or writing in the local object dictionary.

SDO to transmit

Looking for the cobId in the object dictionary.

Am-I a server ?

In case of server, the node id of the client may be unknown. So we put the index minus offset

0x1200 where the cobid received is defined.

end while

Am-I client ?

a) Looking for the cobid received.

b) cobid found, so reading the node id of the server.

This SDO was not for us !

Test if the size of the SDO is ok

Testing the command specifier

Allowed : cs = 0, 1, 2, 3, 4. (= all except those for block tranfert).

cs = other : Not allowed -> abort.

I am SERVER

Receiving a download segment data.

A SDO transfert should have been yet initiated.

Reset the wathdog

Toggle test.

Nb of data to be downloaded

Store the data in the transfert structure.

Sending the SDO response, CS = 1

The node id of the server, (here it is the sender).

Inverting the toggle for the next segment.

If it was the last segment,

Transfering line data to object dictionary.

The code does not use the "d" of initiate frame. So it is safe if e=s=0

Release of the line

I am CLIENT

It is a request for a previous upload segment. We should find a line opened for this.

Reset the wathdog

test of the toggle;

nb of data to be uploaded

Storing the data in the line structure.

Inverting the toggle for the next segment.

If it was the last segment,

Put in state finished

The code is safe for the case e=s=0 in initiate frame.

more segments to receive

Sending the request for the next segment.

I am SERVER

Receive of an initiate download

Search if a SDO transfert have been yet initiated

No line on use. Great !

Try to open a new line.

If SDO expedited

nb of data to be downloaded

Storing the data in the line structure.

SDO expedited -> transfert finished. Data can be stored in the dictionary.

The line will be reseted when it is downloading in the dictionary.

Transfering line data to object dictionary.

Release of the line.

So, if it is not an expedited transfert

TODO : if e and s = 0, not reading m->data[4] but put nbBytes = 0

Transfert limited to 255 bytes.

Sending a SDO, cs=3

The node id of the server, (here it is the sender).

I am CLIENT

It is a response for a previous download segment. We should find a line opened for this.

Reset the wathdog

test of the toggle;

End transmission or downloading next segment. We need to know if it will be the last one.

At least one transfer to send.

several segments to download.

code to send the next segment. (cs = 0; c = 0)

Last segment.

code to send the last segment. (cs = 0; c = 1)

end if I am a CLIENT

I am SERVER

Receive of an initiate upload.

Search if a SDO transfert have been yet initiated

No line on use. Great !

Try to open a new line.

Transfer data from dictionary to the line structure.

Preparing the response.

Nb bytes to transfer ?

The server node Id;

normal transfert. (segmented).

code to send the initiate upload response. (cs = 2)

It takes too much memory to upgrate to 2^32 because the size of data is also coded

in the object dictionary, at every index and subindex.

Expedited upload. (cs = 2 ; e = 1)

Release the line.

end if I am SERVER

I am CLIENT

It is the response for the previous initiate upload request.

We should find a line opened for this.

Reset the wathdog

nb of data to be uploaded

Storing the data in the line structure.

SDO expedited -> transfert finished. data are available via getReadResultNetworkDict().

So, if it is not an expedited transfert

Storing the nb of data to receive.

Remember the limitation to 255 bytes to transfert

Requesting next segment. (cs = 3)

End if CLIENT

I am SERVER

Receiving a upload segment.

A SDO transfert should have been yet initiated.

Reset the wathdog

Toggle test.

Uploading next segment. We need to know if it will be the last one.

The segment to transfer is not the last one.

code to send the next segment. (cs = 0; c = 0)

Inverting the toggle for the next tranfert.

Last segment.

code to send the last segment. (cs = 0; c = 1)

The server node Id;

Release the line

I am CLIENT

It is the response for the previous initiate download request.

We should find a line opened for this.

Reset the watchdog

more than one request to send

code to send the next segment. (cs = 0; c = 0)

The server node Id;

Last segment.

code to send the last segment. (cs = 0; c = 1)

The server node Id;

Received SDO abort.

Looking for the line concerned.

Tips : The end user has no way to know that the server node has received an abort SDO.

Its is ok, I think.

If I am CLIENT

The line *must* be released by the core program.

Error : Unknown cs

Definition at line 608 of file sdo.c.

References failedSDO(), getSDOc, getSDOcs, getSDOe, getSDOfreeLine(), getSDOindex, getSDOlineOnUse(), getSDOlineRestBytes(), getSDOn2, getSDOn3, getSDOs, getSDOsubIndex, getSDOt, initSDOline(), lineToSDO(), objdictToSDOline(), resetSDOline(), RestartSDO_TIMER, SDOlineToObjdict(), SDOtoLine(), sendSDO(), setSDOlineRestBytes(), and StopSDO_TIMER.

Referenced by canDispatch().

Here is the call graph for this function:

UNS8 readNetworkDict ( CO_Data *  d,
UNS8  nodeId,
UNS16  index,
UNS8  subIndex,
UNS8  dataType 
)

Parameters:
d 
nodeId 
index 
subIndex 
dataType 
Returns:

Definition at line 1499 of file sdo.c.

References _readNetworkDict().

Here is the call graph for this function:

UNS8 readNetworkDictCallback ( CO_Data *  d,
UNS8  nodeId,
UNS16  index,
UNS8  subIndex,
UNS8  dataType,
SDOCallback_t  Callback 
)

Parameters:
d 
nodeId 
index 
subIndex 
dataType 
Callback 
Returns:

Definition at line 1516 of file sdo.c.

References _readNetworkDict().

Here is the call graph for this function:

void resetSDO ( CO_Data *  d  ) 

Reset all sdo buffers

Parameters:
d 

transfer structure initialization

Definition at line 169 of file sdo.c.

References resetSDOline().

Referenced by switchCommunicationState().

Here is the call graph for this function:

void resetSDOline ( CO_Data *  d,
UNS8  line 
)

Parameters:
d 
line 

Definition at line 338 of file sdo.c.

References initSDOline().

Referenced by _readNetworkDict(), _writeNetworkDict(), closeSDOtransfer(), failedSDO(), proceedSDO(), resetSDO(), and SDOTimeoutAlarm().

Here is the call graph for this function:

UNS32 SDOlineToObjdict ( CO_Data *  d,
UNS8  line 
)

Parameters:
d 
line 
Returns:

Definition at line 186 of file sdo.c.

References setODentry().

Referenced by proceedSDO().

Here is the call graph for this function:

void SDOTimeoutAlarm ( CO_Data *  d,
UNS32  id 
)

Parameters:
d 
id 

Definition at line 129 of file sdo.c.

References resetSDOline(), and sendSDOabort().

Here is the call graph for this function:

UNS8 SDOtoLine ( CO_Data *  d,
UNS8  line,
UNS8  nbBytes,
UNS8 *  data 
)

Parameters:
d 
line 
nbBytes 
data 
Returns:

Definition at line 279 of file sdo.c.

Referenced by proceedSDO().

UNS8 sendSDO ( CO_Data *  d,
UNS8  whoami,
s_SDO  sdo 
)

Parameters:
d 
whoami 
sdo 
Returns:

get the server->client cobid

case server. Easy because today only one server SDO is authorized in CanFestival

case client

Get the client->server cobid.

First, have to find at the index where is defined the communication with the server node

Second, read the cobid client->server

message copy for sending

the length of SDO must be 8

Definition at line 498 of file sdo.c.

Referenced by _readNetworkDict(), _writeNetworkDict(), proceedSDO(), and sendSDOabort().

UNS8 sendSDOabort ( CO_Data *  d,
UNS8  whoami,
UNS16  index,
UNS8  subIndex,
UNS32  abortCode 
)

Parameters:
d 
whoami 
index 
subIndex 
abortCode 
Returns:

Definition at line 578 of file sdo.c.

References sendSDO().

Referenced by failedSDO(), and SDOTimeoutAlarm().

Here is the call graph for this function:

UNS8 setSDOlineRestBytes ( CO_Data *  d,
UNS8  line,
UNS8  nbBytes 
)

Parameters:
d 
line 
nbBytes 
Returns:

Definition at line 479 of file sdo.c.

Referenced by proceedSDO().

UNS8 writeNetworkDict ( CO_Data *  d,
UNS8  nodeId,
UNS16  index,
UNS8  subIndex,
UNS8  count,
UNS8  dataType,
void *  data 
)

Parameters:
d 
nodeId 
index 
subIndex 
count 
dataType 
data 
Returns:

Definition at line 1368 of file sdo.c.

References _writeNetworkDict().

Here is the call graph for this function:

UNS8 writeNetworkDictCallBack ( CO_Data *  d,
UNS8  nodeId,
UNS16  index,
UNS8  subIndex,
UNS8  count,
UNS8  dataType,
void *  data,
SDOCallback_t  Callback 
)

Parameters:
d 
nodeId 
index 
subIndex 
count 
dataType 
data 
Callback 
Returns:

Definition at line 1388 of file sdo.c.

References _writeNetworkDict().

Here is the call graph for this function:


Generated on Tue Jun 5 18:32:09 2007 for CanFestival by  doxygen 1.5.1