src/sdo.c
author etisserant
Fri, 25 Jul 2008 10:57:20 +0200
changeset 504 ad574af3628d
parent 503 8435a9ee54f8
child 506 c17e2e17aca8
permissions -rw-r--r--
Added removal of dynamically loaded CAN driver interface library in clean make target
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: 174
diff changeset
    22
/*!
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
    23
** @file   sdo.c
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
    24
** @author Edouard TISSERANT and Francis DUPIN
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
    25
** @date   Tue Jun  5 09:32:32 2007
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
    26
**
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
    27
** @brief
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
    28
**
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
    29
**
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
    30
*/
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    31
84
19def60bd29c forgot some comments ...
frdupin
parents: 82
diff changeset
    32
/* #define DEBUG_WAR_CONSOLE_ON */
19def60bd29c forgot some comments ...
frdupin
parents: 82
diff changeset
    33
/* #define DEBUG_ERR_CONSOLE_ON */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    34
383
7d8afedb8769 Fixed missing includes causing warnings
etisserant
parents: 378
diff changeset
    35
#include "canfestival.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
    36
#include "sysdep.h"
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    37
71
95cd3376cc9f compilator compatitibility
frdupin
parents: 53
diff changeset
    38
/* Uncomment if your compiler does not support inline functions */
86
683702a46416 big endian bogue : nodeIdServer in now in 32 bits
frdupin
parents: 84
diff changeset
    39
#define NO_INLINE 
71
95cd3376cc9f compilator compatitibility
frdupin
parents: 53
diff changeset
    40
95cd3376cc9f compilator compatitibility
frdupin
parents: 53
diff changeset
    41
#ifdef NO_INLINE
95cd3376cc9f compilator compatitibility
frdupin
parents: 53
diff changeset
    42
  #define INLINE 
95cd3376cc9f compilator compatitibility
frdupin
parents: 53
diff changeset
    43
#else
86
683702a46416 big endian bogue : nodeIdServer in now in 32 bits
frdupin
parents: 84
diff changeset
    44
  #define INLINE inline
71
95cd3376cc9f compilator compatitibility
frdupin
parents: 53
diff changeset
    45
#endif
95cd3376cc9f compilator compatitibility
frdupin
parents: 53
diff changeset
    46
53
73bc47a0db55 Add prototypes
frdupin
parents: 32
diff changeset
    47
/*Internals prototypes*/
73bc47a0db55 Add prototypes
frdupin
parents: 32
diff changeset
    48
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
    49
/*!
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
    50
** Called by writeNetworkDict
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
    51
**
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
    52
** @param d
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
    53
** @param nodeId
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
    54
** @param index
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
    55
** @param subIndex
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
    56
** @param count
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
    57
** @param dataType
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
    58
** @param data
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
    59
** @param Callback
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
    60
** @param endianize
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
    61
**
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
    62
** @return
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
    63
**/
71
95cd3376cc9f compilator compatitibility
frdupin
parents: 53
diff changeset
    64
INLINE UNS8 _writeNetworkDict (CO_Data* d, UNS8 nodeId, UNS16 index, 
174
cd1638bc0cb0 Added _writenetworkdictionary option to avoir endianiation
etisserant
parents: 172
diff changeset
    65
		       UNS8 subIndex, UNS8 count, UNS8 dataType, void *data, SDOCallback_t Callback, UNS8 endianize);
53
73bc47a0db55 Add prototypes
frdupin
parents: 32
diff changeset
    66
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
    67
/*!
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
    68
** Called by readNetworkDict
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
    69
**
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
    70
** @param d
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
    71
** @param nodeId
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
    72
** @param index
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
    73
** @param subIndex
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
    74
** @param dataType
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
    75
** @param Callback
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
    76
**
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
    77
** @return
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
    78
**/
71
95cd3376cc9f compilator compatitibility
frdupin
parents: 53
diff changeset
    79
INLINE UNS8 _readNetworkDict (CO_Data* d, UNS8 nodeId, UNS16 index, UNS8 subIndex, 
53
73bc47a0db55 Add prototypes
frdupin
parents: 32
diff changeset
    80
	UNS8 dataType, SDOCallback_t Callback);
73bc47a0db55 Add prototypes
frdupin
parents: 32
diff changeset
    81
	
73bc47a0db55 Add prototypes
frdupin
parents: 32
diff changeset
    82
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    83
/***************************************************************************/
71
95cd3376cc9f compilator compatitibility
frdupin
parents: 53
diff changeset
    84
/* SDO (un)packing macros */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    85
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    86
/** Returns the command specifier (cs, ccs, scs) from the first byte of the SDO   
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    87
 */
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    88
#define getSDOcs(byte) (byte >> 5)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    89
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    90
/** Returns the number of bytes without data from the first byte of the SDO. Coded in 2 bits   
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    91
 */
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    92
#define getSDOn2(byte) ((byte >> 2) & 3)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    93
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    94
/** Returns the number of bytes without data from the first byte of the SDO. Coded in 3 bits   
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    95
 */
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    96
#define getSDOn3(byte) ((byte >> 1) & 7)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    97
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    98
/** Returns the transfer type from the first byte of the SDO   
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    99
 */
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   100
#define getSDOe(byte) ((byte >> 1) & 1)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   101
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   102
/** Returns the size indicator from the first byte of the SDO   
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   103
 */
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   104
#define getSDOs(byte) (byte & 1)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   105
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   106
/** Returns the indicator of end transmission from the first byte of the SDO   
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   107
 */
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   108
#define getSDOc(byte) (byte & 1)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   109
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   110
/** Returns the toggle from the first byte of the SDO   
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   111
 */
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   112
#define getSDOt(byte) ((byte >> 4) & 1)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   113
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   114
/** Returns the index from the bytes 1 and 2 of the SDO   
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   115
 */
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   116
#define getSDOindex(byte1, byte2) ((byte2 << 8) | (byte1))
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   117
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   118
/** Returns the subIndex from the byte 3 of the SDO   
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   119
 */
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   120
#define getSDOsubIndex(byte3) (byte3)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   121
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   122
/*!                                                                                                                        
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   123
**                                                                                                                         
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   124
**                                                                                                                         
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   125
** @param d                                                                                                                
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   126
** @param id                                                                                                               
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   127
**/  
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   128
void SDOTimeoutAlarm(CO_Data* d, UNS32 id)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   129
{
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   130
    MSG_ERR(0x1A01, "SDO timeout. SDO response not received.", 0);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   131
    MSG_WAR(0x2A02, "server node : ", d->transfers[id].nodeId);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   132
    MSG_WAR(0x2A02, "      index : ", d->transfers[id].index);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   133
    MSG_WAR(0x2A02, "   subIndex : ", d->transfers[id].subIndex); 
71
95cd3376cc9f compilator compatitibility
frdupin
parents: 53
diff changeset
   134
    /* Reset timer handler */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   135
    d->transfers[id].timer = TIMER_NONE;
172
0248c2b148bb Removed SDOTimeout application callback.Please use SDO callbacks instead.
etisserant
parents: 166
diff changeset
   136
    /*Set aborted state*/
0248c2b148bb Removed SDOTimeout application callback.Please use SDO callbacks instead.
etisserant
parents: 166
diff changeset
   137
    d->transfers[id].state = SDO_ABORTED_INTERNAL;
71
95cd3376cc9f compilator compatitibility
frdupin
parents: 53
diff changeset
   138
    /* Sending a SDO abort */
499
061f12bd838b getReadResultNetworkDict now returns abortcode. Now, abort message should be sent correctly from client.
etisserant
parents: 495
diff changeset
   139
    sendSDOabort(d, d->transfers[id].whoami, d->transfers[id].nodeId,
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   140
		 d->transfers[id].index, d->transfers[id].subIndex, SDOABT_TIMED_OUT);
172
0248c2b148bb Removed SDOTimeout application callback.Please use SDO callbacks instead.
etisserant
parents: 166
diff changeset
   141
    d->transfers[id].abortCode = SDOABT_TIMED_OUT;
0248c2b148bb Removed SDOTimeout application callback.Please use SDO callbacks instead.
etisserant
parents: 166
diff changeset
   142
    /* Call the user function to inform of the problem.*/
0248c2b148bb Removed SDOTimeout application callback.Please use SDO callbacks instead.
etisserant
parents: 166
diff changeset
   143
    if(d->transfers[id].Callback)
0248c2b148bb Removed SDOTimeout application callback.Please use SDO callbacks instead.
etisserant
parents: 166
diff changeset
   144
    	/*If ther is a callback, it is responsible to close SDO transfer (client)*/
0248c2b148bb Removed SDOTimeout application callback.Please use SDO callbacks instead.
etisserant
parents: 166
diff changeset
   145
    	(*d->transfers[id].Callback)(d,d->transfers[id].nodeId);
0248c2b148bb Removed SDOTimeout application callback.Please use SDO callbacks instead.
etisserant
parents: 166
diff changeset
   146
    else if(d->transfers[id].whoami == SDO_SERVER)
0248c2b148bb Removed SDOTimeout application callback.Please use SDO callbacks instead.
etisserant
parents: 166
diff changeset
   147
    	/*Else, if server, reset the line*/
0248c2b148bb Removed SDOTimeout application callback.Please use SDO callbacks instead.
etisserant
parents: 166
diff changeset
   148
    	resetSDOline(d, (UNS8)id);
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   149
}
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   150
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   151
#define StopSDO_TIMER(id) \
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   152
MSG_WAR(0x3A05, "StopSDO_TIMER for line : ", line);\
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   153
d->transfers[id].timer = DelAlarm(d->transfers[id].timer);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   154
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   155
#define StartSDO_TIMER(id) \
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   156
MSG_WAR(0x3A06, "StartSDO_TIMER for line : ", line);\
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   157
d->transfers[id].timer = SetAlarm(d,id,&SDOTimeoutAlarm,MS_TO_TIMEVAL(SDO_TIMEOUT_MS),0);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   158
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   159
#define RestartSDO_TIMER(id) \
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   160
MSG_WAR(0x3A07, "restartSDO_TIMER for line : ", line);\
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   161
if(d->transfers[id].timer != TIMER_NONE) { StopSDO_TIMER(id) StartSDO_TIMER(id) }
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   162
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   163
/*!                                                                                                
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   164
** Reset all sdo buffers                                                                                             
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   165
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   166
** @param d                                                                                        
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   167
**/  
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   168
void resetSDO (CO_Data* d)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   169
{
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   170
  UNS8 j;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   171
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   172
  /* transfer structure initialization */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   173
    for (j = 0 ; j < SDO_MAX_SIMULTANEOUS_TRANSFERTS ; j++) 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   174
      resetSDOline(d, j);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   175
}
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   176
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   177
/*!                                                                                           
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   178
**                                                                                            
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   179
**                                                                                            
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   180
** @param d                                                                                   
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   181
** @param line                                                                                
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   182
**                                                                                            
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   183
** @return                                                                                    
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   184
**/ 
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   185
UNS32 SDOlineToObjdict (CO_Data* d, UNS8 line)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   186
{
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   187
  UNS8      size;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   188
  UNS32 errorCode;
1
b3dc740b4b04 Commit some Fix from Francis on sdo.c and abjacces.c. Fix endianisation problems while accessing OD. Also fix SDO abord handling bug.
etisserant
parents: 0
diff changeset
   189
  MSG_WAR(0x3A08, "Enter in SDOlineToObjdict ", line);
145
e747d2e26af0 Win32 Native support and dynamicaly loaded CAN drivers for Linux, Cygwin and Win32.
etisserant
parents: 87
diff changeset
   190
  size = (UNS8)d->transfers[line].count;
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   191
  errorCode = setODentry(d, d->transfers[line].index, d->transfers[line].subIndex, 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   192
			 (void *) d->transfers[line].data, &size, 1);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   193
  if (errorCode != OD_SUCCESSFUL)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   194
    return errorCode;
1
b3dc740b4b04 Commit some Fix from Francis on sdo.c and abjacces.c. Fix endianisation problems while accessing OD. Also fix SDO abord handling bug.
etisserant
parents: 0
diff changeset
   195
  MSG_WAR(0x3A08, "exit of SDOlineToObjdict ", line);
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   196
  return 0;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   197
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   198
}
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   199
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   200
/*!                                                                                                
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   201
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   202
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   203
** @param d                                                                                        
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   204
** @param line                                                                                     
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   205
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   206
** @return                                                                                         
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   207
**/  
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   208
UNS32 objdictToSDOline (CO_Data* d, UNS8 line)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   209
{
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   210
  UNS8  size = 0;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   211
  UNS8  dataType;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   212
  UNS32 errorCode;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   213
12
1d3b9ad366c8 CANOPEN_BIG_ENDIAN :
dejoigny
parents: 6
diff changeset
   214
  MSG_WAR(0x3A05, "objdict->line index : ", d->transfers[line].index);
1d3b9ad366c8 CANOPEN_BIG_ENDIAN :
dejoigny
parents: 6
diff changeset
   215
  MSG_WAR(0x3A06, "  subIndex : ", d->transfers[line].subIndex);
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   216
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   217
  errorCode = getODentry(d, 	d->transfers[line].index,
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   218
  				d->transfers[line].subIndex,
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   219
  				(void *)d->transfers[line].data,
402
77f875d45250 Fixed faulty read access checking on OD access. Added read acces s checking in SDO (was disabled)
etisserant
parents: 383
diff changeset
   220
  				&size, &dataType, 1);
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   221
  
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   222
  if (errorCode != OD_SUCCESSFUL)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   223
    return errorCode;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   224
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   225
  d->transfers[line].count = size;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   226
  d->transfers[line].offset = 0;
402
77f875d45250 Fixed faulty read access checking on OD access. Added read acces s checking in SDO (was disabled)
etisserant
parents: 383
diff changeset
   227
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   228
  return 0;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   229
}
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   230
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   231
/*!                                                                                                
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   232
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   233
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   234
** @param d                                                                                        
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   235
** @param line                                                                                     
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   236
** @param nbBytes                                                                                  
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   237
** @param data                                                                                     
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   238
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   239
** @return                                                                                         
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   240
**/  
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   241
UNS8 lineToSDO (CO_Data* d, UNS8 line, UNS8 nbBytes, UNS8* data) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   242
  UNS8 i;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   243
  UNS8 offset;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   244
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   245
  if ((d->transfers[line].offset + nbBytes) > SDO_MAX_LENGTH_TRANSFERT) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   246
    MSG_ERR(0x1A10,"SDO Size of data too large. Exceed SDO_MAX_LENGTH_TRANSFERT", nbBytes);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   247
    return 0xFF;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   248
  }
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   249
    if ((d->transfers[line].offset + nbBytes) > d->transfers[line].count) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   250
    MSG_ERR(0x1A11,"SDO Size of data too large. Exceed count", nbBytes);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   251
    return 0xFF;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   252
  }
145
e747d2e26af0 Win32 Native support and dynamicaly loaded CAN drivers for Linux, Cygwin and Win32.
etisserant
parents: 87
diff changeset
   253
  offset = (UNS8)d->transfers[line].offset;
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   254
  for (i = 0 ; i < nbBytes ; i++) 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   255
    * (data + i) = d->transfers[line].data[offset + i];
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   256
  d->transfers[line].offset = d->transfers[line].offset + nbBytes;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   257
  return 0;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   258
}
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   259
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   260
/*!                                                                                                
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   261
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   262
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   263
** @param d                                                                                        
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   264
** @param line                                                                                     
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   265
** @param nbBytes                                                                                  
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   266
** @param data                                                                                     
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   267
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   268
** @return                                                                                         
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   269
**/   
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   270
UNS8 SDOtoLine (CO_Data* d, UNS8 line, UNS8 nbBytes, UNS8* data)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   271
{
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   272
  UNS8 i;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   273
  UNS8 offset;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   274
  
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   275
  if ((d->transfers[line].offset + nbBytes) > SDO_MAX_LENGTH_TRANSFERT) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   276
    MSG_ERR(0x1A15,"SDO Size of data too large. Exceed SDO_MAX_LENGTH_TRANSFERT", nbBytes);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   277
    return 0xFF;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   278
  }
145
e747d2e26af0 Win32 Native support and dynamicaly loaded CAN drivers for Linux, Cygwin and Win32.
etisserant
parents: 87
diff changeset
   279
  offset = (UNS8)d->transfers[line].offset;
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   280
  for (i = 0 ; i < nbBytes ; i++) 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   281
    d->transfers[line].data[offset + i] = * (data + i);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   282
  d->transfers[line].offset = d->transfers[line].offset + nbBytes;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   283
  return 0;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   284
}
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   285
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   286
/*!                                                                                                
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   287
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   288
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   289
** @param d                                                                                        
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   290
** @param nodeId                                                                                   
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   291
** @param whoami                                                                                   
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   292
** @param index                                                                                    
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   293
** @param subIndex                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   294
** @param abortCode                                                                                
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   295
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   296
** @return                                                                                         
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   297
**/ 
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   298
UNS8 failedSDO (CO_Data* d, UNS8 nodeId, UNS8 whoami, UNS16 index, 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   299
		UNS8 subIndex, UNS32 abortCode)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   300
{
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   301
  UNS8 err;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   302
  UNS8 line;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   303
  err = getSDOlineOnUse( d, nodeId, whoami, &line );
71
95cd3376cc9f compilator compatitibility
frdupin
parents: 53
diff changeset
   304
  if (!err) /* If a line on use have been found.*/
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   305
    MSG_WAR(0x3A20, "FailedSDO : line found : ", line);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   306
  if ((! err) && (whoami == SDO_SERVER)) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   307
    resetSDOline( d, line );
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   308
    MSG_WAR(0x3A21, "FailedSDO : line released : ", line);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   309
  }
1
b3dc740b4b04 Commit some Fix from Francis on sdo.c and abjacces.c. Fix endianisation problems while accessing OD. Also fix SDO abord handling bug.
etisserant
parents: 0
diff changeset
   310
  if ((! err) && (whoami == SDO_CLIENT)) {
b3dc740b4b04 Commit some Fix from Francis on sdo.c and abjacces.c. Fix endianisation problems while accessing OD. Also fix SDO abord handling bug.
etisserant
parents: 0
diff changeset
   311
    StopSDO_TIMER(line);
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   312
    d->transfers[line].state = SDO_ABORTED_INTERNAL;
1
b3dc740b4b04 Commit some Fix from Francis on sdo.c and abjacces.c. Fix endianisation problems while accessing OD. Also fix SDO abord handling bug.
etisserant
parents: 0
diff changeset
   313
  }
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   314
  MSG_WAR(0x3A22, "Sending SDO abort ", 0);
499
061f12bd838b getReadResultNetworkDict now returns abortcode. Now, abort message should be sent correctly from client.
etisserant
parents: 495
diff changeset
   315
  err = sendSDOabort(d, whoami, nodeId, index, subIndex, abortCode);
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   316
  if (err) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   317
    MSG_WAR(0x3A23, "Unable to send the SDO abort", 0);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   318
    return 0xFF;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   319
  }
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   320
  return 0;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   321
}
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   322
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   323
/*!                                                                                                
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   324
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   325
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   326
** @param d                                                                                        
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   327
** @param line                                                                                     
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   328
**/  
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   329
void resetSDOline ( CO_Data* d, UNS8 line )
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   330
{
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   331
  UNS8 i; 
1
b3dc740b4b04 Commit some Fix from Francis on sdo.c and abjacces.c. Fix endianisation problems while accessing OD. Also fix SDO abord handling bug.
etisserant
parents: 0
diff changeset
   332
  MSG_WAR(0x3A25, "reset SDO line nb : ", line); 
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   333
  initSDOline(d, line, 0, 0, 0, SDO_RESET);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   334
  for (i = 0 ; i < SDO_MAX_LENGTH_TRANSFERT ; i++)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   335
    d->transfers[line].data[i] = 0;
501
9bec3864a891 Fixed incomplete resetSDOline
etisserant
parents: 499
diff changeset
   336
  d->transfers[line].whoami = 0;
9bec3864a891 Fixed incomplete resetSDOline
etisserant
parents: 499
diff changeset
   337
  d->transfers[line].abortCode = 0;
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   338
}
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   339
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   340
/*!                                                                                                
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   341
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   342
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   343
** @param d                                                                                        
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   344
** @param line                                                                                     
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   345
** @param nodeId                                                                                   
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   346
** @param index                                                                                    
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   347
** @param subIndex                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   348
** @param state                                                                                    
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   349
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   350
** @return                                                                                         
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   351
**/   
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   352
UNS8 initSDOline (CO_Data* d, UNS8 line, UNS8 nodeId, UNS16 index, UNS8 subIndex, UNS8 state)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   353
{
1
b3dc740b4b04 Commit some Fix from Francis on sdo.c and abjacces.c. Fix endianisation problems while accessing OD. Also fix SDO abord handling bug.
etisserant
parents: 0
diff changeset
   354
  MSG_WAR(0x3A25, "init SDO line nb : ", line); 
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   355
  if (state == SDO_DOWNLOAD_IN_PROGRESS || state == SDO_UPLOAD_IN_PROGRESS){
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   356
  	StartSDO_TIMER(line)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   357
  }else{
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   358
  	StopSDO_TIMER(line)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   359
  }
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   360
  d->transfers[line].nodeId = nodeId; 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   361
  d->transfers[line].index = index;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   362
  d->transfers[line].subIndex = subIndex;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   363
  d->transfers[line].state = state;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   364
  d->transfers[line].toggle = 0;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   365
  d->transfers[line].count = 0;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   366
  d->transfers[line].offset = 0;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   367
  d->transfers[line].dataType = 0;
32
8afa33692372 SDO callbacks.
etisserant
parents: 31
diff changeset
   368
  d->transfers[line].Callback = NULL;  
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   369
  return 0;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   370
}
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   371
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   372
/*!                                                                                                
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   373
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   374
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   375
** @param d                                                                                        
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   376
** @param whoami                                                                                   
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   377
** @param line                                                                                     
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   378
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   379
** @return                                                                                         
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   380
**/    
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   381
UNS8 getSDOfreeLine ( CO_Data* d, UNS8 whoami, UNS8 *line )
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   382
{
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   383
	
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   384
  UNS8 i;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   385
    
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   386
  for (i = 0 ; i < SDO_MAX_SIMULTANEOUS_TRANSFERTS ; i++){
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   387
    if ( d->transfers[i].state == SDO_RESET ) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   388
      *line = i;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   389
      d->transfers[i].whoami = whoami;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   390
      return 0;
71
95cd3376cc9f compilator compatitibility
frdupin
parents: 53
diff changeset
   391
    } /* end if */
95cd3376cc9f compilator compatitibility
frdupin
parents: 53
diff changeset
   392
  } /* end for */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   393
  MSG_ERR(0x1A25, "Too many SDO in progress. Aborted.", i);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   394
  return 0xFF;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   395
}
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   396
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   397
/*!                                                                                                
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   398
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   399
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   400
** @param d                                                                                        
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   401
** @param nodeId                                                                                   
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   402
** @param whoami                                                                                   
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   403
** @param line                                                                                     
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   404
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   405
** @return                                                                                         
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   406
**/      
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   407
UNS8 getSDOlineOnUse (CO_Data* d, UNS8 nodeId, UNS8 whoami, UNS8 *line)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   408
{
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   409
	
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   410
  UNS8 i;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   411
    
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   412
  for (i = 0 ; i < SDO_MAX_SIMULTANEOUS_TRANSFERTS ; i++){
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   413
    if ( (d->transfers[i].state != SDO_RESET) &&
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   414
	 (d->transfers[i].nodeId == nodeId) && 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   415
	 (d->transfers[i].whoami == whoami) ) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   416
      *line = i;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   417
      return 0;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   418
    }
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   419
  } 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   420
  return 0xFF;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   421
}
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   422
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   423
/*!                                                                                                
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   424
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   425
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   426
** @param d                                                                                        
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   427
** @param nodeId                                                                                   
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   428
** @param whoami                                                                                   
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   429
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   430
** @return                                                                                         
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   431
**/  
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   432
UNS8 closeSDOtransfer (CO_Data* d, UNS8 nodeId, UNS8 whoami)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   433
{
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   434
  UNS8 err;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   435
  UNS8 line;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   436
  err = getSDOlineOnUse(d, nodeId, whoami, &line);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   437
  if (err) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   438
    MSG_WAR(0x2A30, "No SDO communication to close for node : ", nodeId); 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   439
    return 0xFF;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   440
  }
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   441
  resetSDOline(d, line);  
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   442
  return 0;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   443
}
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   444
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   445
/*!                                                                                                
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   446
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   447
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   448
** @param d                                                                                        
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   449
** @param line                                                                                     
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   450
** @param nbBytes                                                                                  
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   451
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   452
** @return                                                                                         
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   453
**/   
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   454
UNS8 getSDOlineRestBytes (CO_Data* d, UNS8 line, UNS8 * nbBytes)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   455
{
71
95cd3376cc9f compilator compatitibility
frdupin
parents: 53
diff changeset
   456
  if (d->transfers[line].count == 0) /* if received initiate SDO protocol with e=0 and s=0 */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   457
    * nbBytes = 0;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   458
  else
145
e747d2e26af0 Win32 Native support and dynamicaly loaded CAN drivers for Linux, Cygwin and Win32.
etisserant
parents: 87
diff changeset
   459
    * nbBytes = (UNS8)d->transfers[line].count - (UNS8)d->transfers[line].offset;
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   460
  return 0;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   461
}
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   462
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   463
/*!                                                                                                
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   464
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   465
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   466
** @param d                                                                                        
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   467
** @param line                                                                                     
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   468
** @param nbBytes                                                                                  
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   469
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   470
** @return                                                                                         
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   471
**/   
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   472
UNS8 setSDOlineRestBytes (CO_Data* d, UNS8 line, UNS8 nbBytes)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   473
{
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   474
  if (nbBytes > SDO_MAX_LENGTH_TRANSFERT) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   475
    MSG_ERR(0x1A35,"SDO Size of data too large. Exceed SDO_MAX_LENGTH_TRANSFERT", nbBytes);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   476
    return 0xFF;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   477
  }
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   478
  d->transfers[line].count = nbBytes;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   479
  return 0;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   480
}
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   481
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   482
/*!                                                                                                
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   483
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   484
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   485
** @param d                                                                                        
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   486
** @param whoami                                                                                     
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   487
** @param sdo                                                                                  
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   488
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   489
** @return                                                                                         
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   490
**/   
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   491
UNS8 sendSDO (CO_Data* d, UNS8 whoami, s_SDO sdo)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   492
{	
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   493
  UNS16 offset;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   494
  UNS16 lastIndex;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   495
  UNS8 found = 0;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   496
  Message m;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   497
  UNS8 i;
447
c9d01296d6d9 Endianess patch from Edward Karpicz, Lithuania :-)
etisserant
parents: 435
diff changeset
   498
  UNS32 * pwCobId = NULL;
306
3586cfa84705 Fixed incoherency with idx 0x1280+n sidx 3 in sdo.c against newly generated objectditcs (UNS32*->UNS8*).
etisserant
parents: 217
diff changeset
   499
  UNS8 * pwNodeId = NULL;
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   500
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   501
  MSG_WAR(0x3A38, "sendSDO",0);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   502
  if( !((d->nodeState == Operational) ||  (d->nodeState == Pre_operational ))) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   503
    MSG_WAR(0x2A39, "unable to send the SDO (not in op or pre-op mode", d->nodeState);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   504
    return 0xFF;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   505
  }  				
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   506
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   507
  /*get the server->client cobid*/
481
9dd36e4453ae Fixed some comments in sdo.c
etisserant
parents: 447
diff changeset
   508
  if ( whoami == SDO_SERVER )	{/*case server. only one SDO server*/
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   509
    offset = d->firstIndex->SDO_SVR;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   510
    if (offset == 0) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   511
      MSG_ERR(0x1A42, "SendSDO : No SDO server found", 0); 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   512
      return 0xFF;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   513
    }
447
c9d01296d6d9 Endianess patch from Edward Karpicz, Lithuania :-)
etisserant
parents: 435
diff changeset
   514
    pwCobId = (UNS32*) d->objdict[offset].pSubindex[2].pObject;
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   515
    MSG_WAR(0x3A41, "I am server. cobId : ", *pwCobId); 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   516
  }
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   517
  else {			/*case client*/
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   518
    /* Get the client->server cobid.*/
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   519
    UNS16 sdoNum = 0;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   520
    offset = d->firstIndex->SDO_CLT;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   521
    lastIndex = d->lastIndex->SDO_CLT;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   522
    if (offset == 0) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   523
      MSG_ERR(0x1A42, "SendSDO : No SDO client index found", 0); 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   524
      return 0xFF;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   525
    }
481
9dd36e4453ae Fixed some comments in sdo.c
etisserant
parents: 447
diff changeset
   526
    /* find index for communication server node */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   527
    while (offset <= lastIndex){
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   528
      MSG_WAR(0x3A43,"Reading index : ", 0x1280 + sdoNum);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   529
      if (d->objdict[offset].bSubCount <= 3) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   530
	MSG_ERR(0x1A28, "Subindex 3  not found at index ", 0x1280 + sdoNum);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   531
	return 0xFF;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   532
      }
306
3586cfa84705 Fixed incoherency with idx 0x1280+n sidx 3 in sdo.c against newly generated objectditcs (UNS32*->UNS8*).
etisserant
parents: 217
diff changeset
   533
      pwNodeId = (UNS8*) d->objdict[offset].pSubindex[3].pObject;
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   534
      MSG_WAR(0x3A44, "Found nodeId server = ", *pwNodeId);	
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   535
      if(*pwNodeId == sdo.nodeId) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   536
	found = 1;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   537
	break;          
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   538
      }      
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   539
      offset ++;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   540
      sdoNum ++;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   541
    }
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   542
    if (! found){
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   543
      MSG_WAR (0x2A45, "No SDO client corresponds to the mesage to send to node ", sdo.nodeId);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   544
      return 0xFF;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   545
    }
481
9dd36e4453ae Fixed some comments in sdo.c
etisserant
parents: 447
diff changeset
   546
    /* read the client->server cobid */
447
c9d01296d6d9 Endianess patch from Edward Karpicz, Lithuania :-)
etisserant
parents: 435
diff changeset
   547
    pwCobId = (UNS32*) d->objdict[offset].pSubindex[1].pObject;
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   548
  }
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   549
  /* message copy for sending */
447
c9d01296d6d9 Endianess patch from Edward Karpicz, Lithuania :-)
etisserant
parents: 435
diff changeset
   550
  m.cob_id = UNS16_LE(*pwCobId);
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   551
  m.rtr = NOT_A_REQUEST; 
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   552
  /* the length of SDO must be 8 */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   553
  m.len = 8;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   554
  for (i = 0 ; i < 8 ; i++) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   555
    m.data[i] =  sdo.body.data[i];
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   556
  }
149
fe50ada8020b Changes in the API:
etisserant
parents: 145
diff changeset
   557
  return canSend(d->canHandle,&m);
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   558
}
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   559
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   560
/*!                                                                                                
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   561
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   562
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   563
** @param d                                                                                        
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   564
** @param whoami                                                                                   
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   565
** @param index                                                                                    
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   566
** @param subIndex                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   567
** @param abortCode                                                                                
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   568
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   569
** @return                                                                                         
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   570
**/   
499
061f12bd838b getReadResultNetworkDict now returns abortcode. Now, abort message should be sent correctly from client.
etisserant
parents: 495
diff changeset
   571
UNS8 sendSDOabort (CO_Data* d, UNS8 whoami, UNS8 nodeID, UNS16 index, UNS8 subIndex, UNS32 abortCode)
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   572
{
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   573
  s_SDO sdo;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   574
  UNS8 ret;
499
061f12bd838b getReadResultNetworkDict now returns abortcode. Now, abort message should be sent correctly from client.
etisserant
parents: 495
diff changeset
   575
  UNS8* pNodeIdServer;
061f12bd838b getReadResultNetworkDict now returns abortcode. Now, abort message should be sent correctly from client.
etisserant
parents: 495
diff changeset
   576
  UNS8 nodeIdServer;
061f12bd838b getReadResultNetworkDict now returns abortcode. Now, abort message should be sent correctly from client.
etisserant
parents: 495
diff changeset
   577
  UNS16 offset;
061f12bd838b getReadResultNetworkDict now returns abortcode. Now, abort message should be sent correctly from client.
etisserant
parents: 495
diff changeset
   578
  
1
b3dc740b4b04 Commit some Fix from Francis on sdo.c and abjacces.c. Fix endianisation problems while accessing OD. Also fix SDO abord handling bug.
etisserant
parents: 0
diff changeset
   579
  MSG_WAR(0x2A50,"Sending SDO abort ", abortCode);
499
061f12bd838b getReadResultNetworkDict now returns abortcode. Now, abort message should be sent correctly from client.
etisserant
parents: 495
diff changeset
   580
  if(whoami == SDO_SERVER)
061f12bd838b getReadResultNetworkDict now returns abortcode. Now, abort message should be sent correctly from client.
etisserant
parents: 495
diff changeset
   581
  {
061f12bd838b getReadResultNetworkDict now returns abortcode. Now, abort message should be sent correctly from client.
etisserant
parents: 495
diff changeset
   582
	sdo.nodeId = *d->bDeviceNodeId;
061f12bd838b getReadResultNetworkDict now returns abortcode. Now, abort message should be sent correctly from client.
etisserant
parents: 495
diff changeset
   583
  }
061f12bd838b getReadResultNetworkDict now returns abortcode. Now, abort message should be sent correctly from client.
etisserant
parents: 495
diff changeset
   584
  else
061f12bd838b getReadResultNetworkDict now returns abortcode. Now, abort message should be sent correctly from client.
etisserant
parents: 495
diff changeset
   585
  {
061f12bd838b getReadResultNetworkDict now returns abortcode. Now, abort message should be sent correctly from client.
etisserant
parents: 495
diff changeset
   586
    sdo.nodeId = nodeID;
061f12bd838b getReadResultNetworkDict now returns abortcode. Now, abort message should be sent correctly from client.
etisserant
parents: 495
diff changeset
   587
  }
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   588
  sdo.body.data[0] = 0x80;
71
95cd3376cc9f compilator compatitibility
frdupin
parents: 53
diff changeset
   589
  /* Index */
95cd3376cc9f compilator compatitibility
frdupin
parents: 53
diff changeset
   590
  sdo.body.data[1] = index & 0xFF; /* LSB */
95cd3376cc9f compilator compatitibility
frdupin
parents: 53
diff changeset
   591
  sdo.body.data[2] = (index >> 8) & 0xFF; /* MSB */
95cd3376cc9f compilator compatitibility
frdupin
parents: 53
diff changeset
   592
  /* Subindex */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   593
  sdo.body.data[3] = subIndex;
71
95cd3376cc9f compilator compatitibility
frdupin
parents: 53
diff changeset
   594
  /* Data */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   595
  sdo.body.data[4] = (UNS8)(abortCode & 0xFF);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   596
  sdo.body.data[5] = (UNS8)((abortCode >> 8) & 0xFF);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   597
  sdo.body.data[6] = (UNS8)((abortCode >> 16) & 0xFF);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   598
  sdo.body.data[7] = (UNS8)((abortCode >> 24) & 0xFF);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   599
  ret = sendSDO(d, whoami, sdo);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   600
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   601
  return ret;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   602
}
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   603
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   604
/*!                                                                                                
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   605
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   606
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   607
** @param d                                                                                        
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   608
** @param m                                                                                        
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   609
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   610
** @return                                                                                         
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
   611
**/   
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   612
UNS8 proceedSDO (CO_Data* d, Message *m)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   613
{
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   614
  UNS8 err;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   615
  UNS8 line;
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   616
  UNS8 nbBytes; /* received or to be transmited. */
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   617
  UNS8 nodeId = 0;  /* The node from which the SDO is received */
311
adf4a929cf8b Bug on type inconsistency in SDO Client fixed
lbessard
parents: 306
diff changeset
   618
  UNS8 *pNodeId = NULL;
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   619
  UNS8 whoami = SDO_UNKNOWN;  /* SDO_SERVER or SDO_CLIENT.*/
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   620
  UNS32 errorCode; /* while reading or writing in the local object dictionary.*/
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   621
  s_SDO sdo;    /* SDO to transmit */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   622
  UNS16 index;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   623
  UNS8 subIndex;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   624
  UNS32 abortCode;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   625
  UNS8 i,j;
447
c9d01296d6d9 Endianess patch from Edward Karpicz, Lithuania :-)
etisserant
parents: 435
diff changeset
   626
  UNS32 *pCobId = NULL;
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   627
  UNS16 offset;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   628
  UNS16 lastIndex;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   629
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   630
  MSG_WAR(0x3A60, "proceedSDO ", 0);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   631
  whoami = SDO_UNKNOWN;
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   632
  /* Looking for the cobId in the object dictionary. */
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   633
  /* Am-I a server ? */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   634
  offset = d->firstIndex->SDO_SVR;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   635
  lastIndex = d->lastIndex->SDO_SVR;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   636
  j = 0;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   637
  if(offset) while (offset <= lastIndex) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   638
     if (d->objdict[offset].bSubCount <= 1) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   639
	  MSG_ERR(0x1A61, "Subindex 1  not found at index ", 0x1200 + j);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   640
	  return 0xFF;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   641
	}
447
c9d01296d6d9 Endianess patch from Edward Karpicz, Lithuania :-)
etisserant
parents: 435
diff changeset
   642
      pCobId = (UNS32*) d->objdict[offset].pSubindex[1].pObject;
c9d01296d6d9 Endianess patch from Edward Karpicz, Lithuania :-)
etisserant
parents: 435
diff changeset
   643
      if ( *pCobId == UNS16_LE(m->cob_id) ) {
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   644
	whoami = SDO_SERVER;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   645
	MSG_WAR(0x3A62, "proceedSDO. I am server. index : ", 0x1200 + j);
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   646
	/* In case of server, the node id of the client may be unknown. So we put the index minus offset */
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   647
	/* 0x1200 where the cobid received is defined. */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   648
	nodeId = j;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   649
	break;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   650
      }
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   651
      j++;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   652
      offset++;
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   653
  } /* end while */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   654
  if (whoami == SDO_UNKNOWN) {
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   655
    /* Am-I client ? */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   656
    offset = d->firstIndex->SDO_CLT;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   657
    lastIndex = d->lastIndex->SDO_CLT;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   658
    j = 0;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   659
    if(offset) while (offset <= lastIndex) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   660
       if (d->objdict[offset].bSubCount <= 3) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   661
	 MSG_ERR(0x1A63, "Subindex 3  not found at index ", 0x1280 + j);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   662
	 return 0xFF;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   663
       }
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   664
       /* a) Looking for the cobid received. */
447
c9d01296d6d9 Endianess patch from Edward Karpicz, Lithuania :-)
etisserant
parents: 435
diff changeset
   665
       pCobId = (UNS32*) d->objdict[offset].pSubindex[2].pObject;
c9d01296d6d9 Endianess patch from Edward Karpicz, Lithuania :-)
etisserant
parents: 435
diff changeset
   666
       if (*pCobId == UNS16_LE(m->cob_id) ) {
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   667
	 /* b) cobid found, so reading the node id of the server. */
311
adf4a929cf8b Bug on type inconsistency in SDO Client fixed
lbessard
parents: 306
diff changeset
   668
	 pNodeId = (UNS8*) d->objdict[offset].pSubindex[3].pObject;
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   669
	 whoami = SDO_CLIENT;
311
adf4a929cf8b Bug on type inconsistency in SDO Client fixed
lbessard
parents: 306
diff changeset
   670
	 nodeId = *pNodeId;
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   671
	 MSG_WAR(0x3A64, "proceedSDO. I am server. index : ", 0x1280 + j);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   672
	 MSG_WAR(0x3A65, "                 Server nodeId : ", nodeId);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   673
	 break;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   674
	}
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   675
       j++;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   676
       offset++;
71
95cd3376cc9f compilator compatitibility
frdupin
parents: 53
diff changeset
   677
    } /* end while */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   678
  }
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   679
  if (whoami == SDO_UNKNOWN) {
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   680
    return 0xFF;/* This SDO was not for us ! */
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   681
  }
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   682
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   683
  /* Test if the size of the SDO is ok */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   684
  if ( (*m).len != 8) {
447
c9d01296d6d9 Endianess patch from Edward Karpicz, Lithuania :-)
etisserant
parents: 435
diff changeset
   685
    MSG_ERR(0x1A67, "Error size SDO. CobId  : ", UNS16_LE(m->cob_id));
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   686
    failedSDO(d, nodeId, whoami, 0, 0, SDOABT_GENERAL_ERROR);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   687
    return 0xFF;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   688
  }
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   689
  
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   690
  if (whoami == SDO_CLIENT) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   691
    MSG_WAR(0x3A68, "I am CLIENT. Received SDO from nodeId : ", nodeId);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   692
  }
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   693
  else {
447
c9d01296d6d9 Endianess patch from Edward Karpicz, Lithuania :-)
etisserant
parents: 435
diff changeset
   694
    MSG_WAR(0x3A69, "I am SERVER. Received SDO cobId : ", UNS16_LE(m->cob_id));
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   695
  }
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   696
    
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   697
  /* Testing the command specifier */
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   698
  /* Allowed : cs = 0, 1, 2, 3, 4. (=  all except those for block tranfert). */
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   699
  /* cs = other : Not allowed -> abort. */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   700
  switch (getSDOcs(m->data[0])) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   701
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   702
  case 0:
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   703
    /* I am SERVER */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   704
    if (whoami == SDO_SERVER) {
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   705
      /* Receiving a download segment data. */
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   706
      /* A SDO transfert should have been yet initiated. */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   707
      err = getSDOlineOnUse( d, nodeId, whoami, &line ); 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   708
      if (!err)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   709
	err = d->transfers[line].state != SDO_DOWNLOAD_IN_PROGRESS;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   710
      if (err) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   711
	MSG_ERR(0x1A70, "SDO error : Received download segment for unstarted trans. index 0x1200 + ", 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   712
		nodeId); 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   713
	failedSDO(d, nodeId, whoami, 0, 0, SDOABT_LOCAL_CTRL_ERROR);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   714
	return 0xFF;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   715
      }
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   716
      /* Reset the wathdog */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   717
      RestartSDO_TIMER(line)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   718
      MSG_WAR(0x3A71, "Received SDO download segment defined at index 0x1200 + ", nodeId); 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   719
      index = d->transfers[line].index;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   720
      subIndex = d->transfers[line].subIndex;
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   721
      /* Toggle test. */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   722
      if (d->transfers[line].toggle != getSDOt(m->data[0])) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   723
	MSG_ERR(0x1A72, "SDO error : Toggle error : ", getSDOt(m->data[0])); 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   724
	failedSDO(d, nodeId, whoami, index, subIndex, SDOABT_TOGGLE_NOT_ALTERNED);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   725
	return 0xFF;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   726
      }
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   727
      /* Nb of data to be downloaded */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   728
      nbBytes = 7 - getSDOn3(m->data[0]);
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   729
      /* Store the data in the transfert structure. */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   730
      err = SDOtoLine(d, line, nbBytes, (*m).data + 1);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   731
      if (err) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   732
	failedSDO(d, nodeId, whoami, index, subIndex, SDOABT_GENERAL_ERROR);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   733
	return 0xFF;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   734
      }
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   735
      /* Sending the SDO response, CS = 1 */
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   736
      sdo.nodeId = *d->bDeviceNodeId; /* The node id of the server, (here it is the sender). */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   737
      sdo.body.data[0] = (1 << 5) | (d->transfers[line].toggle << 4);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   738
      for (i = 1 ; i < 8 ; i++)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   739
	sdo.body.data[i] = 0;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   740
      MSG_WAR(0x3A73, "SDO. Send response to download request defined at index 0x1200 + ", nodeId); 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   741
      sendSDO(d, whoami, sdo);
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   742
      /* Inverting the toggle for the next segment. */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   743
      d->transfers[line].toggle = ! d->transfers[line].toggle & 1;
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   744
      /* If it was the last segment, */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   745
      if (getSDOc(m->data[0])) {
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   746
	/* Transfering line data to object dictionary. */
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   747
	/* The code does not use the "d" of initiate frame. So it is safe if e=s=0 */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   748
	errorCode = SDOlineToObjdict(d, line);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   749
	if (errorCode) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   750
	  MSG_ERR(0x1A54, "SDO error : Unable to copy the data in the object dictionary", 0); 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   751
	  failedSDO(d, nodeId, whoami, index, subIndex, errorCode);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   752
	  return 0xFF;	  
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   753
	}
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   754
	/* Release of the line */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   755
	resetSDOline(d, line);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   756
	MSG_WAR(0x3A74, "SDO. End of download defined at index 0x1200 + ", nodeId); 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   757
      }
71
95cd3376cc9f compilator compatitibility
frdupin
parents: 53
diff changeset
   758
    } /* end if SERVER */
95cd3376cc9f compilator compatitibility
frdupin
parents: 53
diff changeset
   759
    else { /* if CLIENT */
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   760
      /* I am CLIENT */
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   761
      /* It is a request for a previous upload segment. We should find a line opened for this.*/
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   762
      err = getSDOlineOnUse( d, nodeId, whoami, &line);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   763
      if (!err)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   764
	err = d->transfers[line].state != SDO_UPLOAD_IN_PROGRESS;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   765
      if (err) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   766
	MSG_ERR(0x1A75, "SDO error : Received segment response for unknown trans. from nodeId", nodeId); 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   767
	failedSDO(d, nodeId, whoami, 0, 0, SDOABT_LOCAL_CTRL_ERROR);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   768
	return 0xFF;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   769
      }
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   770
      /* Reset the wathdog */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   771
      RestartSDO_TIMER(line)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   772
      index = d->transfers[line].index;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   773
      subIndex = d->transfers[line].subIndex;
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   774
      /* test of the toggle; */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   775
      if (d->transfers[line].toggle != getSDOt(m->data[0])) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   776
	MSG_ERR(0x1A76, "SDO error : Received segment response Toggle error. from nodeId", nodeId); 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   777
	failedSDO(d, nodeId, whoami, index, subIndex, SDOABT_TOGGLE_NOT_ALTERNED);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   778
	return 0xFF;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   779
      }
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   780
      /* nb of data to be uploaded */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   781
      nbBytes = 7 - getSDOn3(m->data[0]);
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   782
      /* Storing the data in the line structure. */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   783
      err = SDOtoLine(d, line, nbBytes, (*m).data + 1);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   784
      if (err) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   785
	failedSDO(d, nodeId, whoami, index, subIndex, SDOABT_GENERAL_ERROR);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   786
	return 0xFF;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   787
      }
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   788
      /* Inverting the toggle for the next segment. */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   789
      d->transfers[line].toggle = ! d->transfers[line].toggle & 1;
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   790
      /* If it was the last segment,*/
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   791
      if ( getSDOc(m->data[0])) {
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   792
	/* Put in state finished */
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   793
	/* The code is safe for the case e=s=0 in initiate frame. */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   794
	StopSDO_TIMER(line)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   795
	d->transfers[line].state = SDO_FINISHED;
32
8afa33692372 SDO callbacks.
etisserant
parents: 31
diff changeset
   796
	if(d->transfers[line].Callback) (*d->transfers[line].Callback)(d,nodeId);
8afa33692372 SDO callbacks.
etisserant
parents: 31
diff changeset
   797
	
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   798
	MSG_WAR(0x3A77, "SDO. End of upload from node : ", nodeId);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   799
      }
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   800
      else { /* more segments to receive */
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   801
	     /* Sending the request for the next segment. */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   802
	sdo.nodeId = nodeId;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   803
	sdo.body.data[0] = (3 << 5) | (d->transfers[line].toggle << 4);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   804
	for (i = 1 ; i < 8 ; i++)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   805
	  sdo.body.data[i] = 0;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   806
	sendSDO(d, whoami, sdo);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   807
	MSG_WAR(0x3A78, "SDO send upload segment request to nodeId", nodeId);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   808
      }            
71
95cd3376cc9f compilator compatitibility
frdupin
parents: 53
diff changeset
   809
    } /* End if CLIENT */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   810
    break;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   811
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   812
  case 1:
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   813
    /* I am SERVER */
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   814
    /* Receive of an initiate download */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   815
    if (whoami == SDO_SERVER) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   816
      index = getSDOindex(m->data[1],m->data[2]);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   817
      subIndex = getSDOsubIndex(m->data[3]);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   818
      MSG_WAR(0x3A79, "Received SDO Initiate Download (to store data) defined at index 0x1200 + ", 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   819
	      nodeId); 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   820
      MSG_WAR(0x3A80, "Writing at index : ", index);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   821
      MSG_WAR(0x3A80, "Writing at subIndex : ", subIndex);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   822
      
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   823
      /* Search if a SDO transfert have been yet initiated */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   824
      err = getSDOlineOnUse( d, nodeId, whoami, &line );
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   825
      if (! err) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   826
	MSG_ERR(0x1A81, "SDO error : Transmission yet started.", 0); 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   827
	failedSDO(d, nodeId, whoami, index, subIndex, SDOABT_LOCAL_CTRL_ERROR);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   828
	return 0xFF;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   829
      }
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   830
      /* No line on use. Great ! */
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   831
      /* Try to open a new line. */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   832
      err = getSDOfreeLine( d, whoami, &line );
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   833
      if (err) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   834
	MSG_ERR(0x1A82, "SDO error : No line free, too many SDO in progress. Aborted.", 0);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   835
	failedSDO(d, nodeId, whoami, index, subIndex, SDOABT_LOCAL_CTRL_ERROR);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   836
	return 0xFF;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   837
      }
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   838
      initSDOline(d, line, nodeId, index, subIndex, SDO_DOWNLOAD_IN_PROGRESS);      
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   839
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   840
      if (getSDOe(m->data[0])) { /* If SDO expedited */
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   841
	/* nb of data to be downloaded */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   842
	nbBytes = 4 - getSDOn2(m->data[0]);
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   843
	/* Storing the data in the line structure. */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   844
	d->transfers[line].count = nbBytes;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   845
	err = SDOtoLine(d, line, nbBytes, (*m).data + 4);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   846
	
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   847
	if (err) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   848
	  failedSDO(d, nodeId, whoami, index, subIndex, SDOABT_GENERAL_ERROR);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   849
	  return 0xFF;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   850
	}	  
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   851
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   852
	/* SDO expedited -> transfert finished. Data can be stored in the dictionary. */
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   853
	/*The line will be reseted when it is downloading in the dictionary. */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   854
	MSG_WAR(0x3A83, "SDO Initiate Download is an expedited transfert. Finished.: ", nodeId);
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   855
	/* Transfering line data to object dictionary. */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   856
	errorCode = SDOlineToObjdict(d, line);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   857
	if (errorCode) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   858
	  MSG_ERR(0x1A84, "SDO error : Unable to copy the data in the object dictionary", 0); 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   859
	  failedSDO(d, nodeId, whoami, index, subIndex, errorCode);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   860
	  return 0xFF;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   861
	}
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   862
	/* Release of the line. */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   863
	resetSDOline(d, line);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   864
      }
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   865
      else {/* So, if it is not an expedited transfert */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   866
	if (getSDOs(m->data[0])) {
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   867
	  /* TODO : if e and s = 0, not reading m->data[4] but put nbBytes = 0 */
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   868
	  nbBytes = m->data[4]; /* Transfert limited to 255 bytes. */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   869
	  err = setSDOlineRestBytes(d, nodeId, nbBytes);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   870
	  if (err) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   871
	    failedSDO(d, nodeId, whoami, index, subIndex, SDOABT_GENERAL_ERROR);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   872
	    return 0xFF;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   873
	  }	
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   874
	}
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   875
      }
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   876
      /*Sending a SDO, cs=3*/
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   877
      sdo.nodeId = *d->bDeviceNodeId; /* The node id of the server, (here it is the sender).*/
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   878
      sdo.body.data[0] = 3 << 5;
71
95cd3376cc9f compilator compatitibility
frdupin
parents: 53
diff changeset
   879
      sdo.body.data[1] = index & 0xFF;        /* LSB */
95cd3376cc9f compilator compatitibility
frdupin
parents: 53
diff changeset
   880
      sdo.body.data[2] = (index >> 8) & 0xFF; /* MSB */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   881
      sdo.body.data[3] = subIndex;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   882
      for (i = 4 ; i < 8 ; i++)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   883
		sdo.body.data[i] = 0;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   884
      sendSDO(d, whoami, sdo);
71
95cd3376cc9f compilator compatitibility
frdupin
parents: 53
diff changeset
   885
    } /* end if I am SERVER */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   886
    else {
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   887
      /* I am CLIENT */
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   888
      /* It is a response for a previous download segment. We should find a line opened for this. */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   889
      err = getSDOlineOnUse( d, nodeId, whoami, &line);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   890
      if (!err)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   891
	err = d->transfers[line].state != SDO_DOWNLOAD_IN_PROGRESS;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   892
      if (err) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   893
	MSG_ERR(0x1A85, "SDO error : Received segment response for unknown trans. from nodeId", nodeId); 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   894
	failedSDO(d, nodeId, whoami, 0, 0, SDOABT_LOCAL_CTRL_ERROR);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   895
	return 0xFF;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   896
      }
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   897
      /* Reset the wathdog */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   898
      RestartSDO_TIMER(line)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   899
      index = d->transfers[line].index;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   900
      subIndex = d->transfers[line].subIndex;
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   901
      /* test of the toggle; */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   902
      if (d->transfers[line].toggle != getSDOt(m->data[0])) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   903
	MSG_ERR(0x1A86, "SDO error : Received segment response Toggle error. from nodeId", nodeId); 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   904
	failedSDO(d, nodeId, whoami, index, subIndex, SDOABT_TOGGLE_NOT_ALTERNED);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   905
	return 0xFF;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   906
      }
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   907
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   908
      /* End transmission or downloading next segment. We need to know if it will be the last one. */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   909
      getSDOlineRestBytes(d, line, &nbBytes);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   910
      if (nbBytes == 0) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   911
	MSG_WAR(0x3A87, "SDO End download. segment response received. OK. from nodeId", nodeId); 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   912
	StopSDO_TIMER(line)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   913
	d->transfers[line].state = SDO_FINISHED;
32
8afa33692372 SDO callbacks.
etisserant
parents: 31
diff changeset
   914
	if(d->transfers[line].Callback) (*d->transfers[line].Callback)(d,nodeId);
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   915
	return 0x00;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   916
      }
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   917
      /* At least one transfer to send.	*/
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   918
      if (nbBytes > 7) {
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   919
	/* several segments to download.*/
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   920
	/* code to send the next segment. (cs = 0; c = 0) */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   921
	d->transfers[line].toggle = ! d->transfers[line].toggle & 1;
71
95cd3376cc9f compilator compatitibility
frdupin
parents: 53
diff changeset
   922
	sdo.nodeId = nodeId; /* The server node Id; */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   923
	sdo.body.data[0] = (d->transfers[line].toggle << 4);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   924
	err = lineToSDO(d, line, 7, sdo.body.data + 1);	 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   925
	if (err) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   926
	  failedSDO(d, nodeId, whoami, index, subIndex, SDOABT_GENERAL_ERROR);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   927
	  return 0xFF;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   928
	}
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   929
      } 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   930
      else {
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   931
	/* Last segment. */
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   932
	/* code to send the last segment. (cs = 0; c = 1)*/
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   933
	d->transfers[line].toggle = ! d->transfers[line].toggle & 1;
71
95cd3376cc9f compilator compatitibility
frdupin
parents: 53
diff changeset
   934
	sdo.nodeId = nodeId; /* The server node Id; */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   935
	sdo.body.data[0] = (d->transfers[line].toggle << 4) | ((7 - nbBytes) << 1) | 1;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   936
	err = lineToSDO(d, line, nbBytes, sdo.body.data + 1);	 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   937
	if (err) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   938
	  failedSDO(d, nodeId, whoami, index, subIndex, SDOABT_GENERAL_ERROR);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   939
	  return 0xFF;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   940
	}
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   941
	for (i = nbBytes + 1 ; i < 8 ; i++)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   942
	  sdo.body.data[i] = 0;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   943
      }
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   944
      MSG_WAR(0x3A88, "SDO sending download segment to nodeId", nodeId); 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   945
      sendSDO(d, whoami, sdo); 
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   946
    } /* end if I am a CLIENT */			  
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   947
    break;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   948
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   949
  case 2:
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   950
    /* I am SERVER */
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   951
    /* Receive of an initiate upload.*/
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   952
    if (whoami == SDO_SERVER) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   953
      index = getSDOindex(m->data[1],m->data[2]);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   954
      subIndex = getSDOsubIndex(m->data[3]);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   955
      MSG_WAR(0x3A89, "Received SDO Initiate upload (to send data) defined at index 0x1200 + ", 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   956
	      nodeId); 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   957
      MSG_WAR(0x3A90, "Reading at index : ", index);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   958
      MSG_WAR(0x3A91, "Reading at subIndex : ", subIndex);
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   959
      /* Search if a SDO transfert have been yet initiated*/
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   960
      err = getSDOlineOnUse( d, nodeId, whoami, &line );
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   961
      if (! err) {
12
1d3b9ad366c8 CANOPEN_BIG_ENDIAN :
dejoigny
parents: 6
diff changeset
   962
	    MSG_ERR(0x1A92, "SDO error : Transmission yet started at line : ", line); 
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   963
        MSG_WAR(0x3A93, "nodeId = ", nodeId); 
12
1d3b9ad366c8 CANOPEN_BIG_ENDIAN :
dejoigny
parents: 6
diff changeset
   964
	    failedSDO(d, nodeId, whoami, index, subIndex, SDOABT_LOCAL_CTRL_ERROR);
1d3b9ad366c8 CANOPEN_BIG_ENDIAN :
dejoigny
parents: 6
diff changeset
   965
	    return 0xFF;
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   966
      }
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   967
      /* No line on use. Great !*/
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   968
      /* Try to open a new line.*/
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   969
      err = getSDOfreeLine( d, whoami, &line );
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   970
      if (err) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   971
	MSG_ERR(0x1A71, "SDO error : No line free, too many SDO in progress. Aborted.", 0);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   972
	failedSDO(d, nodeId, whoami, index, subIndex, SDOABT_LOCAL_CTRL_ERROR);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   973
	return 0xFF;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   974
      }
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   975
      initSDOline(d, line, nodeId, index, subIndex, SDO_UPLOAD_IN_PROGRESS);
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   976
      /* Transfer data from dictionary to the line structure. */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   977
      errorCode = objdictToSDOline(d, line);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   978
     
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   979
      if (errorCode) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   980
	MSG_ERR(0x1A94, "SDO error : Unable to copy the data from object dictionary. Err code : ", 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   981
		errorCode); 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   982
	failedSDO(d, nodeId, whoami, index, subIndex, errorCode);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   983
	return 0xFF;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   984
	}
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   985
      /* Preparing the response.*/
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   986
      getSDOlineRestBytes(d, line, &nbBytes);	/* Nb bytes to transfer ? */
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   987
      sdo.nodeId = nodeId; /* The server node Id; */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   988
      if (nbBytes > 4) {
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   989
	/* normal transfert. (segmented). */
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   990
	/* code to send the initiate upload response. (cs = 2) */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   991
	sdo.body.data[0] = (2 << 5) | 1;
71
95cd3376cc9f compilator compatitibility
frdupin
parents: 53
diff changeset
   992
	sdo.body.data[1] = index & 0xFF;        /* LSB */
95cd3376cc9f compilator compatitibility
frdupin
parents: 53
diff changeset
   993
	sdo.body.data[2] = (index >> 8) & 0xFF; /* MSB */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   994
	sdo.body.data[3] = subIndex;
71
95cd3376cc9f compilator compatitibility
frdupin
parents: 53
diff changeset
   995
        sdo.body.data[4] = nbBytes; /* Limitation of canfestival2 : Max tranfert is 256 bytes.*/
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   996
	/* It takes too much memory to upgrate to 2^32 because the size of data is also coded */
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   997
	/* in the object dictionary, at every index and subindex. */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   998
	for (i = 5 ; i < 8 ; i++)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   999
	  sdo.body.data[i] = 0;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1000
	MSG_WAR(0x3A95, "SDO. Sending normal upload initiate response defined at index 0x1200 + ", nodeId); 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1001
	sendSDO(d, whoami, sdo); 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1002
      }
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1003
      else {
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
  1004
	/* Expedited upload. (cs = 2 ; e = 1) */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1005
	sdo.body.data[0] = (2 << 5) | ((4 - nbBytes) << 2) | 3;  
71
95cd3376cc9f compilator compatitibility
frdupin
parents: 53
diff changeset
  1006
	sdo.body.data[1] = index & 0xFF;        /* LSB */
95cd3376cc9f compilator compatitibility
frdupin
parents: 53
diff changeset
  1007
	sdo.body.data[2] = (index >> 8) & 0xFF; /* MSB */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1008
	sdo.body.data[3] = subIndex;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1009
	err = lineToSDO(d, line, nbBytes, sdo.body.data + 4);	 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1010
	if (err) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1011
	  failedSDO(d, nodeId, whoami, index, subIndex, SDOABT_GENERAL_ERROR);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1012
	  return 0xFF;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1013
	}
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1014
	for (i = 4 + nbBytes ; i < 8 ; i++)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1015
	  sdo.body.data[i] = 0;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1016
	MSG_WAR(0x3A96, "SDO. Sending expedited upload initiate response defined at index 0x1200 + ", 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1017
		nodeId); 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1018
	sendSDO(d, whoami, sdo); 
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
  1019
	/* Release the line.*/
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1020
	resetSDOline(d, line);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1021
      }
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
  1022
    } /* end if I am SERVER*/
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1023
    else {
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
  1024
      /* I am CLIENT */
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
  1025
      /* It is the response for the previous initiate upload request.*/
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
  1026
      /* We should find a line opened for this. */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1027
      err = getSDOlineOnUse( d, nodeId, whoami, &line);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1028
      if (!err)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1029
	err = d->transfers[line].state != SDO_UPLOAD_IN_PROGRESS;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1030
      if (err) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1031
	MSG_ERR(0x1A97, "SDO error : Received response for unknown upload request from nodeId", nodeId); 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1032
	failedSDO(d, nodeId, whoami, 0, 0, SDOABT_LOCAL_CTRL_ERROR);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1033
	return 0xFF;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1034
      }
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
  1035
      /* Reset the wathdog */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1036
      RestartSDO_TIMER(line)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1037
      index = d->transfers[line].index;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1038
      subIndex = d->transfers[line].subIndex;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1039
      
71
95cd3376cc9f compilator compatitibility
frdupin
parents: 53
diff changeset
  1040
      if (getSDOe(m->data[0])) { /* If SDO expedited */
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
  1041
	/* nb of data to be uploaded */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1042
	  nbBytes = 4 - getSDOn2(m->data[0]);
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
  1043
	/* Storing the data in the line structure. */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1044
	err = SDOtoLine(d, line, nbBytes, (*m).data + 4);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1045
	if (err) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1046
	  failedSDO(d, nodeId, whoami, index, subIndex, SDOABT_GENERAL_ERROR);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1047
	  return 0xFF;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1048
	}
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
  1049
	/* SDO expedited -> transfert finished. data are available via  getReadResultNetworkDict(). */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1050
	MSG_WAR(0x3A98, "SDO expedited upload finished. Response received from node : ", nodeId);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1051
	StopSDO_TIMER(line)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1052
	d->transfers[line].count = nbBytes;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1053
	d->transfers[line].state = SDO_FINISHED;
32
8afa33692372 SDO callbacks.
etisserant
parents: 31
diff changeset
  1054
	if(d->transfers[line].Callback) (*d->transfers[line].Callback)(d,nodeId);
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1055
	return 0;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1056
      }
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
  1057
      else { /* So, if it is not an expedited transfert */
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
  1058
	/* Storing the nb of data to receive. */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1059
	if (getSDOs(m->data[0])) {
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
  1060
	  nbBytes = m->data[4]; /* Remember the limitation to 255 bytes to transfert */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1061
	  err = setSDOlineRestBytes(d, line, nbBytes);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1062
	  if (err) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1063
	    failedSDO(d, nodeId, whoami, index, subIndex, SDOABT_GENERAL_ERROR);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1064
	    return 0xFF;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1065
	  }	
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1066
	}
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
  1067
	/* Requesting next segment. (cs = 3) */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1068
	sdo.nodeId = nodeId;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1069
	sdo.body.data[0] = 3 << 5;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1070
	for (i = 1 ; i < 8 ; i++)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1071
	  sdo.body.data[i] = 0;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1072
	MSG_WAR(0x3A99, "SDO. Sending upload segment request to node : ", nodeId); 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1073
	sendSDO(d, whoami, sdo);  
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1074
      }
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
  1075
    } /* End if CLIENT */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1076
    break;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1077
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1078
  case 3:
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
  1079
    /* I am SERVER */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1080
    if (whoami == SDO_SERVER) {
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
  1081
      /* Receiving a upload segment. */
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
  1082
      /* A SDO transfert should have been yet initiated. */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1083
      err = getSDOlineOnUse( d, nodeId, whoami, &line ); 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1084
      if (!err)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1085
	err = d->transfers[line].state != SDO_UPLOAD_IN_PROGRESS;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1086
      if (err) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1087
	MSG_ERR(0x1AA0, "SDO error : Received upload segment for unstarted trans. index 0x1200 + ", 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1088
		nodeId); 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1089
	failedSDO(d, nodeId, whoami, 0, 0, SDOABT_LOCAL_CTRL_ERROR);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1090
	return 0xFF;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1091
      }
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
  1092
      /* Reset the wathdog */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1093
      RestartSDO_TIMER(line)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1094
      MSG_WAR(0x3AA1, "Received SDO upload segment defined at index 0x1200 + ", nodeId); 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1095
      index = d->transfers[line].index;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1096
      subIndex = d->transfers[line].subIndex;
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
  1097
      /* Toggle test.*/
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1098
      if (d->transfers[line].toggle != getSDOt(m->data[0])) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1099
	MSG_ERR(0x1AA2, "SDO error : Toggle error : ", getSDOt(m->data[0])); 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1100
	failedSDO(d, nodeId, whoami, index, subIndex, SDOABT_TOGGLE_NOT_ALTERNED);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1101
	return 0xFF;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1102
      }
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
  1103
      /* Uploading next segment. We need to know if it will be the last one. */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1104
      getSDOlineRestBytes(d, line, &nbBytes);	  	  
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1105
      if (nbBytes > 7) {
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
  1106
	/* The segment to transfer is not the last one.*/
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
  1107
	/* code to send the next segment. (cs = 0; c = 0) */
71
95cd3376cc9f compilator compatitibility
frdupin
parents: 53
diff changeset
  1108
	sdo.nodeId = nodeId; /* The server node Id; */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1109
	sdo.body.data[0] = (d->transfers[line].toggle << 4);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1110
	err = lineToSDO(d, line, 7, sdo.body.data + 1);	 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1111
	if (err) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1112
	  failedSDO(d, nodeId, whoami, index, subIndex, SDOABT_GENERAL_ERROR);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1113
	  return 0xFF;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1114
	}
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
  1115
	/* Inverting the toggle for the next tranfert. */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1116
	d->transfers[line].toggle = ! d->transfers[line].toggle & 1;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1117
	MSG_WAR(0x3AA3, "SDO. Sending upload segment defined at index 0x1200 + ", nodeId); 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1118
	sendSDO(d, whoami, sdo); 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1119
      } 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1120
      else {
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
  1121
	/* Last segment. */
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
  1122
	/* code to send the last segment. (cs = 0; c = 1) */	    
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1123
	sdo.nodeId = nodeId; /** The server node Id; */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1124
	sdo.body.data[0] = (d->transfers[line].toggle << 4) | ((7 - nbBytes) << 1) | 1;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1125
	err = lineToSDO(d, line, nbBytes, sdo.body.data + 1);	 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1126
	if (err) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1127
	  failedSDO(d, nodeId, whoami, index, subIndex, SDOABT_GENERAL_ERROR);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1128
	  return 0xFF;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1129
	}
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1130
	for (i = nbBytes + 1 ; i < 8 ; i++)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1131
	  sdo.body.data[i] = 0;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1132
	MSG_WAR(0x3AA4, "SDO. Sending last upload segment defined at index 0x1200 + ", nodeId);      
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1133
	sendSDO(d, whoami, sdo);
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
  1134
	/* Release the line */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1135
	resetSDOline(d, line);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1136
      }
71
95cd3376cc9f compilator compatitibility
frdupin
parents: 53
diff changeset
  1137
    } /* end if SERVER*/
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1138
    else {
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
  1139
      /* I am CLIENT */
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
  1140
      /* It is the response for the previous initiate download request. */
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
  1141
      /* We should find a line opened for this. */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1142
      err = getSDOlineOnUse( d, nodeId, whoami, &line);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1143
      if (!err)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1144
	err = d->transfers[line].state != SDO_DOWNLOAD_IN_PROGRESS;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1145
      if (err) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1146
	MSG_ERR(0x1AA5, "SDO error : Received response for unknown download request from nodeId", nodeId); 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1147
	failedSDO(d, nodeId, whoami, 0, 0, SDOABT_LOCAL_CTRL_ERROR);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1148
	return 0xFF;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1149
      }
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
  1150
      /* Reset the watchdog */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1151
      RestartSDO_TIMER(line)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1152
      index = d->transfers[line].index;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1153
      subIndex = d->transfers[line].subIndex;
71
95cd3376cc9f compilator compatitibility
frdupin
parents: 53
diff changeset
  1154
      /* End transmission or requesting  next segment. */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1155
      getSDOlineRestBytes(d, line, &nbBytes);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1156
      if (nbBytes == 0) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1157
	MSG_WAR(0x3AA6, "SDO End download expedited. Response received. from nodeId", nodeId); 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1158
	StopSDO_TIMER(line)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1159
	d->transfers[line].state = SDO_FINISHED;
32
8afa33692372 SDO callbacks.
etisserant
parents: 31
diff changeset
  1160
	if(d->transfers[line].Callback) (*d->transfers[line].Callback)(d,nodeId);
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1161
	return 0x00;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1162
      }	  
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1163
      if (nbBytes > 7) {
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
  1164
	/* more than one request to send */
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
  1165
	/* code to send the next segment. (cs = 0; c = 0)	*/    
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1166
	sdo.nodeId = nodeId; /** The server node Id; */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1167
	sdo.body.data[0] = (d->transfers[line].toggle << 4);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1168
	err = lineToSDO(d, line, 7, sdo.body.data + 1);	 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1169
	if (err) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1170
	  failedSDO(d, nodeId, whoami, index, subIndex, SDOABT_GENERAL_ERROR);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1171
	  return 0xFF;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1172
	}
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1173
      } 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1174
      else {
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
  1175
	/* Last segment.*/
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
  1176
	/* code to send the last segment. (cs = 0; c = 1)	*/   
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
  1177
	sdo.nodeId = nodeId; /* The server node Id; */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1178
	sdo.body.data[0] = (d->transfers[line].toggle << 4) | ((7 - nbBytes) << 1) | 1;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1179
	err = lineToSDO(d, line, nbBytes, sdo.body.data + 1);	 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1180
	if (err) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1181
	  failedSDO(d, nodeId, whoami, index, subIndex, SDOABT_GENERAL_ERROR);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1182
	  return 0xFF;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1183
	}
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1184
	for (i = nbBytes + 1 ; i < 8 ; i++)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1185
	  sdo.body.data[i] = 0;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1186
      }
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1187
      MSG_WAR(0x3AA7, "SDO sending download segment to nodeId", nodeId); 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1188
      sendSDO(d, whoami, sdo); 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1189
71
95cd3376cc9f compilator compatitibility
frdupin
parents: 53
diff changeset
  1190
    } /* end if I am a CLIENT		*/	  
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1191
    break;  
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1192
82
81505425b1e5 16 bits arch compatibility and unused variables
frdupin
parents: 71
diff changeset
  1193
   case 4:
435
509158e51940 Fixed suspicious code in sdo.c
etisserant
parents: 402
diff changeset
  1194
     abortCode = 
509158e51940 Fixed suspicious code in sdo.c
etisserant
parents: 402
diff changeset
  1195
      (UNS32)m->data[4] |
82
81505425b1e5 16 bits arch compatibility and unused variables
frdupin
parents: 71
diff changeset
  1196
      ((UNS32)m->data[5] << 8) |
81505425b1e5 16 bits arch compatibility and unused variables
frdupin
parents: 71
diff changeset
  1197
      ((UNS32)m->data[6] << 16) |
81505425b1e5 16 bits arch compatibility and unused variables
frdupin
parents: 71
diff changeset
  1198
      ((UNS32)m->data[7] << 24);
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
  1199
    /* Received SDO abort. */
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
  1200
    /* Looking for the line concerned. */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1201
    if (whoami == SDO_SERVER) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1202
      err = getSDOlineOnUse( d, nodeId, whoami, &line );
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1203
      if (!err) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1204
	resetSDOline( d, line );
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1205
	MSG_WAR(0x3AA8, "SD0. Received SDO abort. Line released. Code : ", abortCode);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1206
      }
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1207
      else
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1208
	MSG_WAR(0x3AA9, "SD0. Received SDO abort. No line found. Code : ", abortCode);
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
  1209
      /* Tips : The end user has no way to know that the server node has received an abort SDO. */
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
  1210
      /* Its is ok, I think.*/
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1211
    }
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
  1212
    else { /* If I am CLIENT */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1213
      err = getSDOlineOnUse( d, nodeId, whoami, &line );
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1214
      if (!err) {
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
  1215
	/* The line *must* be released by the core program. */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1216
	StopSDO_TIMER(line)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1217
	d->transfers[line].state = SDO_ABORTED_RCV;
166
b6fbc1c59a44 Added a MicroMod Master sample in examples/TestMasterMicroMod. Fixed some SDO abort code and callback problem in sdo.c.
etisserant
parents: 163
diff changeset
  1218
	d->transfers[line].abortCode = abortCode;
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1219
	MSG_WAR(0x3AB0, "SD0. Received SDO abort. Line state ABORTED. Code : ", abortCode);
163
212a9ea3b968 Added SDO network dictionnary access callback when aborded.
etisserant
parents: 154
diff changeset
  1220
	if(d->transfers[line].Callback) (*d->transfers[line].Callback)(d,nodeId);
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1221
      }
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1222
      else
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1223
	MSG_WAR(0x3AB1, "SD0. Received SDO abort. No line found. Code : ", abortCode);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1224
    } 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1225
    break;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1226
  default:
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
  1227
    /* Error : Unknown cs */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1228
    MSG_ERR(0x1AB2, "SDO. Received unknown command specifier : ", getSDOcs(m->data[0]));
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1229
    return 0xFF;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1230
71
95cd3376cc9f compilator compatitibility
frdupin
parents: 53
diff changeset
  1231
  } /* End switch */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1232
  return 0;     
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1233
}
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1234
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1235
/*!                                                                                                
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1236
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1237
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1238
** @param d                                                                                        
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1239
** @param nodeId                                                                                   
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1240
** @param index                                                                                    
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1241
** @param subIndex                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1242
** @param count                                                                                    
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1243
** @param dataType                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1244
** @param data                                                                                     
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1245
** @param Callback                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1246
** @param endianize                                                                                
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1247
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1248
** @return                                                                                         
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1249
**/   
71
95cd3376cc9f compilator compatitibility
frdupin
parents: 53
diff changeset
  1250
INLINE UNS8 _writeNetworkDict (CO_Data* d, UNS8 nodeId, UNS16 index, 
174
cd1638bc0cb0 Added _writenetworkdictionary option to avoir endianiation
etisserant
parents: 172
diff changeset
  1251
		       UNS8 subIndex, UNS8 count, UNS8 dataType, void *data, SDOCallback_t Callback, UNS8 endianize)
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1252
{
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1253
  UNS8 err;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1254
  UNS8 SDOfound = 0;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1255
  UNS8 line;
71
95cd3376cc9f compilator compatitibility
frdupin
parents: 53
diff changeset
  1256
  s_SDO sdo;    /* SDO to transmit */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1257
  UNS8 i, j;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1258
  UNS16     lastIndex;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1259
  UNS16     offset;
311
adf4a929cf8b Bug on type inconsistency in SDO Client fixed
lbessard
parents: 306
diff changeset
  1260
  UNS8      *pNodeIdServer;
adf4a929cf8b Bug on type inconsistency in SDO Client fixed
lbessard
parents: 306
diff changeset
  1261
  UNS8      nodeIdServer;
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1262
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1263
  MSG_WAR(0x3AC0, "Send SDO to write in the dictionary of node : ", nodeId);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1264
  MSG_WAR(0x3AC1, "                                   At index : ", index);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1265
  MSG_WAR(0x3AC2, "                                   subIndex : ", subIndex);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1266
  MSG_WAR(0x3AC3, "                                   nb bytes : ", count);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1267
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
  1268
  /* Verify that there is no SDO communication yet. */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1269
  err = getSDOlineOnUse(d, nodeId, SDO_CLIENT, &line);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1270
  if (!err) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1271
    MSG_ERR(0x1AC4, "SDO error : Communication yet established. with node : ", nodeId); 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1272
    return 0xFF;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1273
  }
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
  1274
  /* Taking the line ... */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1275
  err = getSDOfreeLine( d, SDO_CLIENT, &line );
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1276
  if (err) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1277
    MSG_ERR(0x1AC5, "SDO error : No line free, too many SDO in progress. Aborted for node : ", nodeId); 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1278
    return (0xFF);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1279
  }
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
  1280
  /* Check which SDO to use to communicate with the node */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1281
  offset = d->firstIndex->SDO_CLT;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1282
  lastIndex = d->lastIndex->SDO_CLT;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1283
  if (offset == 0) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1284
    MSG_ERR(0x1AC6, "writeNetworkDict : No SDO client index found", 0); 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1285
    return 0xFF;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1286
  }
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1287
  i = 0;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1288
   while (offset <= lastIndex) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1289
     if (d->objdict[offset].bSubCount <= 3) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1290
	 MSG_ERR(0x1AC8, "Subindex 3  not found at index ", 0x1280 + i);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1291
	 return 0xFF;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1292
     }
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
  1293
     /* looking for the nodeId server */
311
adf4a929cf8b Bug on type inconsistency in SDO Client fixed
lbessard
parents: 306
diff changeset
  1294
     pNodeIdServer = (UNS8*) d->objdict[offset].pSubindex[3].pObject;
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1295
     nodeIdServer = *pNodeIdServer;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1296
     MSG_WAR(0x1AD2, "index : ", 0x1280 + i);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1297
     MSG_WAR(0x1AD3, "nodeIdServer : ", nodeIdServer);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1298
   
311
adf4a929cf8b Bug on type inconsistency in SDO Client fixed
lbessard
parents: 306
diff changeset
  1299
    if(nodeIdServer == nodeId) {
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1300
      SDOfound = 1;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1301
      break;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1302
    }
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1303
    offset++;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1304
    i++;
71
95cd3376cc9f compilator compatitibility
frdupin
parents: 53
diff changeset
  1305
  } /* end while */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1306
  if (!SDOfound) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1307
    MSG_ERR(0x1AC9, "SDO. Error. No client found to communicate with node : ", nodeId);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1308
    return 0xFF;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1309
  }
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1310
  MSG_WAR(0x3AD0,"        SDO client defined at index  : ", 0x1280 + i);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1311
  initSDOline(d, line, nodeId, index, subIndex, SDO_DOWNLOAD_IN_PROGRESS);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1312
  d->transfers[line].count = count;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1313
  d->transfers[line].dataType = dataType;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1314
  
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
  1315
  /* Copy data to transfers structure. */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1316
  for (j = 0 ; j < count ; j++) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1317
# ifdef CANOPEN_BIG_ENDIAN
174
cd1638bc0cb0 Added _writenetworkdictionary option to avoir endianiation
etisserant
parents: 172
diff changeset
  1318
    if (dataType == 0 && endianize)
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1319
      d->transfers[line].data[count - 1 - j] = ((char *)data)[j];
71
95cd3376cc9f compilator compatitibility
frdupin
parents: 53
diff changeset
  1320
    else /* String of bytes. */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1321
      d->transfers[line].data[j] = ((char *)data)[j];
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1322
#  else 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1323
    d->transfers[line].data[j] = ((char *)data)[j];
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1324
#  endif
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1325
  }
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
  1326
  /* Send the SDO to the server. Initiate download, cs=1. */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1327
  sdo.nodeId = nodeId;
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
  1328
  if (count <= 4) { /* Expedited transfert */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1329
    sdo.body.data[0] = (1 << 5) | ((4 - count) << 2) | 3;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1330
    for (i = 4 ; i < 8 ; i++)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1331
      sdo.body.data[i] = d->transfers[line].data[i - 4];
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1332
    d->transfers[line].offset = count;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1333
  }	
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1334
  else { /** Normal transfert */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1335
    sdo.body.data[0] = (1 << 5) | 1;
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
  1336
    sdo.body.data[4] = count; /* nb of byte to transmit. Max = 255. (canfestival2 limitation). */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1337
    for (i = 5 ; i < 8 ; i++)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1338
      sdo.body.data[i] = 0;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1339
  }
71
95cd3376cc9f compilator compatitibility
frdupin
parents: 53
diff changeset
  1340
  sdo.body.data[1] = index & 0xFF;        /* LSB */
95cd3376cc9f compilator compatitibility
frdupin
parents: 53
diff changeset
  1341
  sdo.body.data[2] = (index >> 8) & 0xFF; /* MSB */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1342
  sdo.body.data[3] = subIndex;
154
1b3165f2d17d Implemented writeNetworkDictCallBack test in TestMasterSlave example. Fixed callback assignement race condition in sdo.c.
etisserant
parents: 149
diff changeset
  1343
1b3165f2d17d Implemented writeNetworkDictCallBack test in TestMasterSlave example. Fixed callback assignement race condition in sdo.c.
etisserant
parents: 149
diff changeset
  1344
  d->transfers[line].Callback = Callback;
1b3165f2d17d Implemented writeNetworkDictCallBack test in TestMasterSlave example. Fixed callback assignement race condition in sdo.c.
etisserant
parents: 149
diff changeset
  1345
    
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1346
  err = sendSDO(d, SDO_CLIENT, sdo);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1347
  if (err) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1348
    MSG_ERR(0x1AD1, "SDO. Error while sending SDO to node : ", nodeId);
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
  1349
    /* release the line */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1350
    resetSDOline(d, line);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1351
    return 0xFF;
32
8afa33692372 SDO callbacks.
etisserant
parents: 31
diff changeset
  1352
  }
154
1b3165f2d17d Implemented writeNetworkDictCallBack test in TestMasterSlave example. Fixed callback assignement race condition in sdo.c.
etisserant
parents: 149
diff changeset
  1353
1b3165f2d17d Implemented writeNetworkDictCallBack test in TestMasterSlave example. Fixed callback assignement race condition in sdo.c.
etisserant
parents: 149
diff changeset
  1354
  
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1355
  return 0;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1356
}
53
73bc47a0db55 Add prototypes
frdupin
parents: 32
diff changeset
  1357
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1358
/*!                                                                                                
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1359
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1360
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1361
** @param d                                                                                        
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1362
** @param nodeId                                                                                   
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1363
** @param index                                                                                    
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1364
** @param subIndex                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1365
** @param count                                                                                    
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1366
** @param dataType                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1367
** @param data                                                                                     
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1368
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1369
** @return                                                                                         
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1370
**/   
32
8afa33692372 SDO callbacks.
etisserant
parents: 31
diff changeset
  1371
UNS8 writeNetworkDict (CO_Data* d, UNS8 nodeId, UNS16 index, 
8afa33692372 SDO callbacks.
etisserant
parents: 31
diff changeset
  1372
		       UNS8 subIndex, UNS8 count, UNS8 dataType, void *data)
8afa33692372 SDO callbacks.
etisserant
parents: 31
diff changeset
  1373
{
174
cd1638bc0cb0 Added _writenetworkdictionary option to avoir endianiation
etisserant
parents: 172
diff changeset
  1374
	return _writeNetworkDict (d, nodeId, index, subIndex, count, dataType, data, NULL, 1);
32
8afa33692372 SDO callbacks.
etisserant
parents: 31
diff changeset
  1375
}
8afa33692372 SDO callbacks.
etisserant
parents: 31
diff changeset
  1376
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1377
/*!                                                                                                
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1378
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1379
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1380
** @param d                                                                                        
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1381
** @param nodeId                                                                                   
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1382
** @param index                                                                                    
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1383
** @param subIndex                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1384
** @param count                                                                                    
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1385
** @param dataType                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1386
** @param data                                                                                     
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1387
** @param Callback                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1388
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1389
** @return                                                                                         
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1390
**/  
32
8afa33692372 SDO callbacks.
etisserant
parents: 31
diff changeset
  1391
UNS8 writeNetworkDictCallBack (CO_Data* d, UNS8 nodeId, UNS16 index, 
8afa33692372 SDO callbacks.
etisserant
parents: 31
diff changeset
  1392
		       UNS8 subIndex, UNS8 count, UNS8 dataType, void *data, SDOCallback_t Callback)
8afa33692372 SDO callbacks.
etisserant
parents: 31
diff changeset
  1393
{
174
cd1638bc0cb0 Added _writenetworkdictionary option to avoir endianiation
etisserant
parents: 172
diff changeset
  1394
	return _writeNetworkDict (d, nodeId, index, subIndex, count, dataType, data, Callback, 1);	
32
8afa33692372 SDO callbacks.
etisserant
parents: 31
diff changeset
  1395
}
8afa33692372 SDO callbacks.
etisserant
parents: 31
diff changeset
  1396
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1397
/*!                                                                                                
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1398
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1399
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1400
** @param d                                                                                        
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1401
** @param nodeId                                                                                   
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1402
** @param index                                                                                    
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1403
** @param subIndex                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1404
** @param dataType                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1405
** @param Callback                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1406
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1407
** @return                                                                                         
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1408
**/ 
71
95cd3376cc9f compilator compatitibility
frdupin
parents: 53
diff changeset
  1409
INLINE UNS8 _readNetworkDict (CO_Data* d, UNS8 nodeId, UNS16 index, UNS8 subIndex, UNS8 dataType, SDOCallback_t Callback)
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1410
{
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1411
  UNS8 err;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1412
  UNS8 SDOfound = 0;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1413
  UNS8 i;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1414
  UNS8 line;
71
95cd3376cc9f compilator compatitibility
frdupin
parents: 53
diff changeset
  1415
  s_SDO sdo;    /* SDO to transmit */
311
adf4a929cf8b Bug on type inconsistency in SDO Client fixed
lbessard
parents: 306
diff changeset
  1416
  UNS8      *pNodeIdServer;
adf4a929cf8b Bug on type inconsistency in SDO Client fixed
lbessard
parents: 306
diff changeset
  1417
  UNS8      nodeIdServer;
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1418
  UNS16     offset;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1419
  UNS16     lastIndex;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1420
  MSG_WAR(0x3AD5, "Send SDO to read in the dictionary of node : ", nodeId);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1421
  MSG_WAR(0x3AD6, "                                  At index : ", index);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1422
  MSG_WAR(0x3AD7, "                                  subIndex : ", subIndex);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1423
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1424
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
  1425
  /* Verify that there is no SDO communication yet. */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1426
  err = getSDOlineOnUse(d, nodeId, SDO_CLIENT, &line);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1427
  if (!err) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1428
    MSG_ERR(0x1AD8, "SDO error : Communication yet established. with node : ", nodeId); 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1429
    return 0xFF;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1430
  }
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
  1431
  /* Taking the line ... */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1432
  err = getSDOfreeLine( d, SDO_CLIENT, &line );
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1433
  if (err) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1434
    MSG_ERR(0x1AD9, "SDO error : No line free, too many SDO in progress. Aborted for node : ", nodeId); 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1435
    return (0xFF);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1436
  }
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1437
  else
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1438
    MSG_WAR(0x3AE0, "Transmission on line : ", line);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1439
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
  1440
  /* Check which SDO to use to communicate with the node */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1441
  offset = d->firstIndex->SDO_CLT;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1442
  lastIndex = d->lastIndex->SDO_CLT;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1443
  if (offset == 0) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1444
    MSG_ERR(0x1AE1, "writeNetworkDict : No SDO client index found", 0); 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1445
    return 0xFF;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1446
  }
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1447
  i = 0;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1448
  while (offset <= lastIndex) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1449
     if (d->objdict[offset].bSubCount <= 3) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1450
	 MSG_ERR(0x1AE2, "Subindex 3  not found at index ", 0x1280 + i);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1451
	 return 0xFF;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1452
     }
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
  1453
     /* looking for the nodeId server */
311
adf4a929cf8b Bug on type inconsistency in SDO Client fixed
lbessard
parents: 306
diff changeset
  1454
     pNodeIdServer = (UNS8*) d->objdict[offset].pSubindex[3].pObject;
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1455
     nodeIdServer = *pNodeIdServer;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1456
   
311
adf4a929cf8b Bug on type inconsistency in SDO Client fixed
lbessard
parents: 306
diff changeset
  1457
    if(nodeIdServer == nodeId) {
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1458
      SDOfound = 1;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1459
      break;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1460
    }
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1461
    offset++;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1462
    i++;
71
95cd3376cc9f compilator compatitibility
frdupin
parents: 53
diff changeset
  1463
  } /* end while */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1464
  if (!SDOfound) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1465
    MSG_ERR(0x1AE3, "SDO. Error. No client found to communicate with node : ", nodeId);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1466
    return 0xFF;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1467
  }
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1468
  MSG_WAR(0x3AE4,"        SDO client defined at index  : ", 0x1280 + i);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1469
  initSDOline(d, line, nodeId, index, subIndex, SDO_UPLOAD_IN_PROGRESS);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1470
  getSDOlineOnUse(d, nodeId, SDO_CLIENT, &line);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1471
  sdo.nodeId = nodeId;
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
  1472
  /* Send the SDO to the server. Initiate upload, cs=2. */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1473
  d->transfers[line].dataType = dataType;				
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1474
  sdo.body.data[0] = (2 << 5);	
71
95cd3376cc9f compilator compatitibility
frdupin
parents: 53
diff changeset
  1475
  sdo.body.data[1] = index & 0xFF;        /* LSB */
95cd3376cc9f compilator compatitibility
frdupin
parents: 53
diff changeset
  1476
  sdo.body.data[2] = (index >> 8) & 0xFF; /* MSB */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1477
  sdo.body.data[3] = subIndex;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1478
  for (i = 4 ; i < 8 ; i++)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1479
    sdo.body.data[i] = 0;
154
1b3165f2d17d Implemented writeNetworkDictCallBack test in TestMasterSlave example. Fixed callback assignement race condition in sdo.c.
etisserant
parents: 149
diff changeset
  1480
  d->transfers[line].Callback = Callback;
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1481
  err = sendSDO(d, SDO_CLIENT, sdo);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1482
  if (err) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1483
    MSG_ERR(0x1AE5, "SDO. Error while sending SDO to node : ", nodeId);
71
95cd3376cc9f compilator compatitibility
frdupin
parents: 53
diff changeset
  1484
    /* release the line */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1485
    resetSDOline(d, line);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1486
    return 0xFF;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1487
  }		
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1488
  return 0;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1489
}
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1490
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1491
/*!                                                                                                
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1492
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1493
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1494
** @param d                                                                                        
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1495
** @param nodeId                                                                                   
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1496
** @param index                                                                                    
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1497
** @param subIndex                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1498
** @param dataType                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1499
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1500
** @return                                                                                         
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1501
**/   
32
8afa33692372 SDO callbacks.
etisserant
parents: 31
diff changeset
  1502
UNS8 readNetworkDict (CO_Data* d, UNS8 nodeId, UNS16 index, UNS8 subIndex, UNS8 dataType)
8afa33692372 SDO callbacks.
etisserant
parents: 31
diff changeset
  1503
{
8afa33692372 SDO callbacks.
etisserant
parents: 31
diff changeset
  1504
	return _readNetworkDict (d, nodeId, index, subIndex, dataType, NULL);
8afa33692372 SDO callbacks.
etisserant
parents: 31
diff changeset
  1505
}
8afa33692372 SDO callbacks.
etisserant
parents: 31
diff changeset
  1506
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1507
/*!                                                                                                
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1508
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1509
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1510
** @param d                                                                                        
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1511
** @param nodeId                                                                                   
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1512
** @param index                                                                                    
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1513
** @param subIndex                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1514
** @param dataType                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1515
** @param Callback                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1516
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1517
** @return                                                                                         
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1518
**/ 
32
8afa33692372 SDO callbacks.
etisserant
parents: 31
diff changeset
  1519
UNS8 readNetworkDictCallback (CO_Data* d, UNS8 nodeId, UNS16 index, UNS8 subIndex, UNS8 dataType, SDOCallback_t Callback)
8afa33692372 SDO callbacks.
etisserant
parents: 31
diff changeset
  1520
{
8afa33692372 SDO callbacks.
etisserant
parents: 31
diff changeset
  1521
	return _readNetworkDict (d, nodeId, index, subIndex, dataType, Callback);
8afa33692372 SDO callbacks.
etisserant
parents: 31
diff changeset
  1522
}
53
73bc47a0db55 Add prototypes
frdupin
parents: 32
diff changeset
  1523
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1524
/*!                                                                                                
495
b2d6307a89fa Changed getReadResultNetworkDict behaviour about size. Do not copy more data than pointet by Size arg.
etisserant
parents: 481
diff changeset
  1525
**
b2d6307a89fa Changed getReadResultNetworkDict behaviour about size. Do not copy more data than pointet by Size arg.
etisserant
parents: 481
diff changeset
  1526
**
b2d6307a89fa Changed getReadResultNetworkDict behaviour about size. Do not copy more data than pointet by Size arg.
etisserant
parents: 481
diff changeset
  1527
** @param d
b2d6307a89fa Changed getReadResultNetworkDict behaviour about size. Do not copy more data than pointet by Size arg.
etisserant
parents: 481
diff changeset
  1528
** @param nodeId
b2d6307a89fa Changed getReadResultNetworkDict behaviour about size. Do not copy more data than pointet by Size arg.
etisserant
parents: 481
diff changeset
  1529
** @param data
b2d6307a89fa Changed getReadResultNetworkDict behaviour about size. Do not copy more data than pointet by Size arg.
etisserant
parents: 481
diff changeset
  1530
** @param size pointer to expected size, changed into returned size. Expected size will be truncated to transfered data size 
b2d6307a89fa Changed getReadResultNetworkDict behaviour about size. Do not copy more data than pointet by Size arg.
etisserant
parents: 481
diff changeset
  1531
** @param abortCode
b2d6307a89fa Changed getReadResultNetworkDict behaviour about size. Do not copy more data than pointet by Size arg.
etisserant
parents: 481
diff changeset
  1532
**
b2d6307a89fa Changed getReadResultNetworkDict behaviour about size. Do not copy more data than pointet by Size arg.
etisserant
parents: 481
diff changeset
  1533
** @return
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1534
**/   
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1535
UNS8 getReadResultNetworkDict (CO_Data* d, UNS8 nodeId, void* data, UNS8 *size, 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1536
			       UNS32 * abortCode)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1537
{
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1538
  UNS8 i;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1539
  UNS8 err;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1540
  UNS8 line;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1541
  * size = 0;
499
061f12bd838b getReadResultNetworkDict now returns abortcode. Now, abort message should be sent correctly from client.
etisserant
parents: 495
diff changeset
  1542
  * abortCode = 0;
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1543
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
  1544
  /* Looking for the line tranfert. */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1545
  err = getSDOlineOnUse(d, nodeId, SDO_CLIENT, &line);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1546
  if (err) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1547
    MSG_ERR(0x1AF0, "SDO error : No line found for communication with node : ", nodeId); 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1548
    return SDO_ABORTED_INTERNAL;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1549
  }
503
8435a9ee54f8 Fixed (again) return of abortcode value in SDO's getReadResultNetworkDict
etisserant
parents: 501
diff changeset
  1550
  * abortCode = d->transfers[line].abortCode;
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1551
  if (d->transfers[line].state != SDO_FINISHED)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1552
    return d->transfers[line].state;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1553
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
  1554
  /* Transfert is finished. Put the value in the data. */
495
b2d6307a89fa Changed getReadResultNetworkDict behaviour about size. Do not copy more data than pointet by Size arg.
etisserant
parents: 481
diff changeset
  1555
  /* use transfers[line].count as max size */
b2d6307a89fa Changed getReadResultNetworkDict behaviour about size. Do not copy more data than pointet by Size arg.
etisserant
parents: 481
diff changeset
  1556
  if( (UNS8)d->transfers[line].count < *size )
b2d6307a89fa Changed getReadResultNetworkDict behaviour about size. Do not copy more data than pointet by Size arg.
etisserant
parents: 481
diff changeset
  1557
  	*size = (UNS8)d->transfers[line].count;
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1558
  for  ( i = 0 ; i < *size ; i++) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1559
# ifdef CANOPEN_BIG_ENDIAN
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1560
    if (d->transfers[line].dataType != visible_string)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1561
      ( (char *) data)[*size - 1 - i] = d->transfers[line].data[i];
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
  1562
    else /* String of bytes. */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1563
      ( (char *) data)[i] = d->transfers[line].data[i];
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1564
# else 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1565
    ( (char *) data)[i] = d->transfers[line].data[i];
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1566
# endif
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1567
  } 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1568
  return SDO_FINISHED;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1569
}
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1570
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1571
/*!                                                                                                
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1572
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1573
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1574
** @param d                                                                                        
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1575
** @param nodeId                                                                                   
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1576
** @param abortCode                                                                                
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1577
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1578
** @return                                                                                         
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 174
diff changeset
  1579
**/  
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1580
UNS8 getWriteResultNetworkDict (CO_Data* d, UNS8 nodeId, UNS32 * abortCode)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1581
{
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1582
  UNS8 line = 0;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1583
  UNS8 err;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1584
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1585
  * abortCode = 0;
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
  1586
  /* Looking for the line tranfert. */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1587
  err = getSDOlineOnUse(d, nodeId, SDO_CLIENT, &line);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1588
  if (err) {
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1589
    MSG_ERR(0x1AF1, "SDO error : No line found for communication with node : ", nodeId); 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1590
    return SDO_ABORTED_INTERNAL;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1591
  }
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1592
  * abortCode = d->transfers[line].abortCode;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1593
  return d->transfers[line].state;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
  1594
}