src/sdo.c
author etisserant
Mon, 02 Jul 2007 18:22:58 +0200
changeset 236 905677ed00f3
parent 217 94c3f89bc3cc
child 306 3586cfa84705
permissions -rw-r--r--
Full preliminary implementation of TPDO transmit type:
- SYNC (N) (1-240)
- RTR only + SYNC (252)
- RTR only (253)
- EVENT, with timer and inhibit time (254 and 255)

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