#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) |
Definition in file sdo.c.
#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 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().
INLINE UNS8 _readNetworkDict | ( | CO_Data * | d, | |
UNS8 | nodeId, | |||
UNS16 | index, | |||
UNS8 | subIndex, | |||
UNS8 | dataType, | |||
SDOCallback_t | Callback | |||
) |
d | ||
nodeId | ||
index | ||
subIndex | ||
dataType | ||
Callback |
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
d | ||
nodeId | ||
index | ||
subIndex | ||
count | ||
dataType | ||
data | ||
Callback | ||
endianize |
UNS8 closeSDOtransfer | ( | CO_Data * | d, | |
UNS8 | nodeId, | |||
UNS8 | whoami | |||
) |
d | ||
nodeId | ||
whoami |
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 | |||
) |
d | ||
nodeId | ||
whoami | ||
index | ||
subIndex | ||
abortCode |
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 | |||
) |
d | ||
nodeId | ||
data | ||
size | ||
abortCode |
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 | |||
) |
d | ||
whoami | ||
line |
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 | |||
) |
d | ||
nodeId | ||
whoami | ||
line |
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 | |||
) |
d | ||
line | ||
nbBytes |
Definition at line 461 of file sdo.c.
Referenced by proceedSDO().
UNS8 getWriteResultNetworkDict | ( | CO_Data * | d, | |
UNS8 | nodeId, | |||
UNS32 * | abortCode | |||
) |
d | ||
nodeId | ||
abortCode |
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 | |||
) |
d | ||
line | ||
nodeId | ||
index | ||
subIndex | ||
state |
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 | |||
) |
d | ||
line | ||
nbBytes | ||
data |
Definition at line 250 of file sdo.c.
Referenced by proceedSDO().
UNS32 objdictToSDOline | ( | CO_Data * | d, | |
UNS8 | line | |||
) |
d | ||
line |
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 | |||
) |
d | ||
m |
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 | |||
) |
d | ||
nodeId | ||
index | ||
subIndex | ||
dataType |
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 | |||
) |
d | ||
nodeId | ||
index | ||
subIndex | ||
dataType | ||
Callback |
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
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 | |||
) |
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 | |||
) |
d | ||
line |
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 | |||
) |
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 | |||
) |
d | ||
line | ||
nbBytes | ||
data |
Definition at line 279 of file sdo.c.
Referenced by proceedSDO().
UNS8 sendSDO | ( | CO_Data * | d, | |
UNS8 | whoami, | |||
s_SDO | sdo | |||
) |
d | ||
whoami | ||
sdo |
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 | |||
) |
d | ||
whoami | ||
index | ||
subIndex | ||
abortCode |
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 | |||
) |
d | ||
line | ||
nbBytes |
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 | |||
) |
d | ||
nodeId | ||
index | ||
subIndex | ||
count | ||
dataType | ||
data |
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 | |||
) |
d | ||
nodeId | ||
index | ||
subIndex | ||
count | ||
dataType | ||
data | ||
Callback |
Definition at line 1388 of file sdo.c.
References _writeNetworkDict().
Here is the call graph for this function: