src/objacces.c
author greg
Wed, 16 Sep 2009 15:19:58 +0200
changeset 592 b98df76c6fd5
parent 588 ee181b4f177b
child 594 17a171fe7c56
permissions -rw-r--r--
fix warnings with msvc compiler
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
     1
/*
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
     2
  This file is part of CanFestival, a library implementing CanOpen
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
     3
  Stack.
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
     4
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
     5
  Copyright (C): Edouard TISSERANT and Francis DUPIN
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
     6
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
     7
  See COPYING file for copyrights details.
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
     8
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
     9
  This library is free software; you can redistribute it and/or
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
    10
  modify it under the terms of the GNU Lesser General Public
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
    11
  License as published by the Free Software Foundation; either
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
    12
  version 2.1 of the License, or (at your option) any later version.
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
    13
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
    14
  This library is distributed in the hope that it will be useful,
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
    15
  but WITHOUT ANY WARRANTY; without even the implied warranty of
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
    16
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
    17
  Lesser General Public License for more details.
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
    18
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
    19
  You should have received a copy of the GNU Lesser General Public
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
    20
  License along with this library; if not, write to the Free Software
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
    21
  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
    22
  USA
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    23
*/
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
    24
/*!
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
    25
** @file   objacces.c
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
    26
** @author Edouard TISSERANT and Francis DUPIN
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
    27
** @date   Tue Jun  5 08:55:23 2007
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
    28
**
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
    29
** @brief
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
    30
**
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
    31
**
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
    32
*/
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
    33
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
    34
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
    35
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    36
71
95cd3376cc9f compilator compatitibility
frdupin
parents: 55
diff changeset
    37
/* #define DEBUG_WAR_CONSOLE_ON */
95cd3376cc9f compilator compatitibility
frdupin
parents: 55
diff changeset
    38
/* #define DEBUG_ERR_CONSOLE_ON */
11
64ed038bdc74 Bogue:big endian
dejoigny
parents: 10
diff changeset
    39
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
    40
378
d2abf6c8c27b As requested long ago, added CoData* parameter to all this applications callback, let application designer use identical callback for multiple nodes, and reduce source code length.
etisserant
parents: 215
diff changeset
    41
#include "data.h"
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    42
469
f2b07ea215b5 Applied edward's patch for OD acces macros (optimization) and boudaries check (safety).
etisserant
parents: 450
diff changeset
    43
#ifdef DEBUG_WAR_CONSOLE_ON
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
    44
UNS8 accessDictionaryError(UNS16 index, UNS8 subIndex,
539
187058b4a4b8 Changed OD size from UNS8 to UNS32, and repercuted change to PDO and SDO. Thanks to Jari Kuusisto for patch.
etisserant
parents: 469
diff changeset
    45
                           UNS32 sizeDataDict, UNS32 sizeDataGiven, UNS32 code)
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    46
{
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    47
  MSG_WAR(0x2B09,"Dictionary index : ", index);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    48
  MSG_WAR(0X2B10,"           subindex : ", subIndex);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    49
  switch (code) {
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
    50
  case  OD_NO_SUCH_OBJECT:
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
    51
    MSG_WAR(0x2B11,"Index not found ", index);
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
    52
    break;
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
    53
  case OD_NO_SUCH_SUBINDEX :
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
    54
    MSG_WAR(0x2B12,"SubIndex not found ", subIndex);
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
    55
    break;
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
    56
  case OD_WRITE_NOT_ALLOWED :
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
    57
    MSG_WAR(0x2B13,"Write not allowed, data is read only ", index);
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
    58
    break;
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
    59
  case OD_LENGTH_DATA_INVALID :
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
    60
    MSG_WAR(0x2B14,"Conflict size data. Should be (bytes)  : ", sizeDataDict);
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
    61
    MSG_WAR(0x2B15,"But you have given the size  : ", sizeDataGiven);
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
    62
    break;
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
    63
  case OD_NOT_MAPPABLE :
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
    64
    MSG_WAR(0x2B16,"Not mappable data in a PDO at index    : ", index);
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
    65
    break;
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
    66
  case OD_VALUE_TOO_LOW :
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
    67
    MSG_WAR(0x2B17,"Value range error : value too low. SDOabort : ", code);
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
    68
    break;
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
    69
  case OD_VALUE_TOO_HIGH :
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
    70
    MSG_WAR(0x2B18,"Value range error : value too high. SDOabort : ", code);
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
    71
    break;
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    72
  default :
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    73
    MSG_WAR(0x2B20, "Unknown error code : ", code);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    74
  }
469
f2b07ea215b5 Applied edward's patch for OD acces macros (optimization) and boudaries check (safety).
etisserant
parents: 450
diff changeset
    75
  return 0;
f2b07ea215b5 Applied edward's patch for OD acces macros (optimization) and boudaries check (safety).
etisserant
parents: 450
diff changeset
    76
}
f2b07ea215b5 Applied edward's patch for OD acces macros (optimization) and boudaries check (safety).
etisserant
parents: 450
diff changeset
    77
#else
f2b07ea215b5 Applied edward's patch for OD acces macros (optimization) and boudaries check (safety).
etisserant
parents: 450
diff changeset
    78
#define accessDictionaryError(index, subIndex, sizeDataDict, sizeDataGiven, code)
75
debc68b124b7 compiler compatibility : accessDictionaryError contains nothing out of debogue mode
frdupin
parents: 71
diff changeset
    79
#endif
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
    80
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
    81
UNS32 _getODentry( CO_Data* d,
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
    82
                   UNS16 wIndex,
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
    83
                   UNS8 bSubindex,
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
    84
                   void * pDestData,
539
187058b4a4b8 Changed OD size from UNS8 to UNS32, and repercuted change to PDO and SDO. Thanks to Jari Kuusisto for patch.
etisserant
parents: 469
diff changeset
    85
                   UNS32 * pExpectedSize,
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
    86
                   UNS8 * pDataType,
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
    87
                   UNS8 checkAccess,
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
    88
                   UNS8 endianize)
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
    89
{ /* DO NOT USE MSG_ERR because the macro may send a PDO -> infinite
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
    90
    loop if it fails. */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    91
  UNS32 errorCode;
539
187058b4a4b8 Changed OD size from UNS8 to UNS32, and repercuted change to PDO and SDO. Thanks to Jari Kuusisto for patch.
etisserant
parents: 469
diff changeset
    92
  UNS32 szData;
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    93
  const indextable *ptrTable;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    94
  ODCallback_t *Callback;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    95
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    96
  ptrTable = (*d->scanIndexOD)(wIndex, &errorCode, &Callback);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    97
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    98
  if (errorCode != OD_SUCCESSFUL)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    99
    return errorCode;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   100
  if( ptrTable->bSubCount <= bSubindex ) {
71
95cd3376cc9f compilator compatitibility
frdupin
parents: 55
diff changeset
   101
    /* Subindex not found */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   102
    accessDictionaryError(wIndex, bSubindex, 0, 0, OD_NO_SUCH_SUBINDEX);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   103
    return OD_NO_SUCH_SUBINDEX;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   104
  }
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
   105
402
77f875d45250 Fixed faulty read access checking on OD access. Added read acces s checking in SDO (was disabled)
etisserant
parents: 378
diff changeset
   106
  if (checkAccess && (ptrTable->pSubindex[bSubindex].bAccessType & WO)) {
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
   107
    MSG_WAR(0x2B30, "Access Type : ", ptrTable->pSubindex[bSubindex].bAccessType);
450
dff8cc600cba Fixed typo in objaccess.c. Thanks to James
etisserant
parents: 437
diff changeset
   108
    accessDictionaryError(wIndex, bSubindex, 0, 0, OD_READ_NOT_ALLOWED);
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   109
    return OD_READ_NOT_ALLOWED;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   110
  }
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   111
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   112
  *pDataType = ptrTable->pSubindex[bSubindex].bDataType;
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
   113
  szData = ptrTable->pSubindex[bSubindex].size;
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
   114
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
   115
  if(*pExpectedSize == 0 ||
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
   116
     *pExpectedSize == szData ||
421
6221b4db8c42 Added support for null terminated strings as VISIBLE_STRING.
etisserant
parents: 419
diff changeset
   117
     /* allow to fetch a shorter string than expected */
6221b4db8c42 Added support for null terminated strings as VISIBLE_STRING.
etisserant
parents: 419
diff changeset
   118
     (*pDataType >= visible_string && *pExpectedSize < szData)) { 
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
   119
12
1d3b9ad366c8 CANOPEN_BIG_ENDIAN :
dejoigny
parents: 11
diff changeset
   120
#  ifdef CANOPEN_BIG_ENDIAN
430
61a24423589c Fixed typo in objacces.c bigendian side.
etisserant
parents: 429
diff changeset
   121
     if(endianize && *pDataType > boolean && !(
61a24423589c Fixed typo in objacces.c bigendian side.
etisserant
parents: 429
diff changeset
   122
            *pDataType >= visible_string && 
431
166037b8f2ed Fixed typo in objacces.c bigendian side.
etisserant
parents: 430
diff changeset
   123
            *pDataType <= domain)) {
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   124
      /* data must be transmited with low byte first */
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
   125
      UNS8 i, j = 0;
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
   126
      MSG_WAR(boolean, "data type ", *pDataType);
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
   127
      MSG_WAR(visible_string, "data type ", *pDataType);
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
   128
      for ( i = szData ; i > 0 ; i--) {
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
   129
        MSG_WAR(i," ", j);
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
   130
        ((UNS8*)pDestData)[j++] =
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
   131
          ((UNS8*)ptrTable->pSubindex[bSubindex].pObject)[i-1];
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
   132
      }
431
166037b8f2ed Fixed typo in objacces.c bigendian side.
etisserant
parents: 430
diff changeset
   133
      *pExpectedSize = szData;
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
   134
    }
419
f63ce68a8239 Added support for null terminated strings as VISIBLE_STRING.
etisserant
parents: 402
diff changeset
   135
    else /* no endianisation change */
12
1d3b9ad366c8 CANOPEN_BIG_ENDIAN :
dejoigny
parents: 11
diff changeset
   136
#  endif
421
6221b4db8c42 Added support for null terminated strings as VISIBLE_STRING.
etisserant
parents: 419
diff changeset
   137
    if(*pDataType != visible_string) {
419
f63ce68a8239 Added support for null terminated strings as VISIBLE_STRING.
etisserant
parents: 402
diff changeset
   138
        memcpy(pDestData, ptrTable->pSubindex[bSubindex].pObject,szData);
f63ce68a8239 Added support for null terminated strings as VISIBLE_STRING.
etisserant
parents: 402
diff changeset
   139
        *pExpectedSize = szData;
f63ce68a8239 Added support for null terminated strings as VISIBLE_STRING.
etisserant
parents: 402
diff changeset
   140
    }else{
f63ce68a8239 Added support for null terminated strings as VISIBLE_STRING.
etisserant
parents: 402
diff changeset
   141
        /* TODO : CONFORM TO DS-301 : 
f63ce68a8239 Added support for null terminated strings as VISIBLE_STRING.
etisserant
parents: 402
diff changeset
   142
         *  - stop using NULL terminated strings
f63ce68a8239 Added support for null terminated strings as VISIBLE_STRING.
etisserant
parents: 402
diff changeset
   143
         *  - store string size in td_subindex 
f63ce68a8239 Added support for null terminated strings as VISIBLE_STRING.
etisserant
parents: 402
diff changeset
   144
         * */
f63ce68a8239 Added support for null terminated strings as VISIBLE_STRING.
etisserant
parents: 402
diff changeset
   145
        /* Copy null terminated string to user, and return discovered size */
f63ce68a8239 Added support for null terminated strings as VISIBLE_STRING.
etisserant
parents: 402
diff changeset
   146
        UNS8 *ptr = (UNS8*)ptrTable->pSubindex[bSubindex].pObject;
f63ce68a8239 Added support for null terminated strings as VISIBLE_STRING.
etisserant
parents: 402
diff changeset
   147
        UNS8 *ptr_start = ptr;
431
166037b8f2ed Fixed typo in objacces.c bigendian side.
etisserant
parents: 430
diff changeset
   148
        /* *pExpectedSize IS < szData . if null, use szData */
166037b8f2ed Fixed typo in objacces.c bigendian side.
etisserant
parents: 430
diff changeset
   149
        UNS8 *ptr_end = ptr + (*pExpectedSize ? *pExpectedSize : szData) ; 
429
7cba38279f98 Fixed not so ANSI code in objaccess.c
etisserant
parents: 421
diff changeset
   150
        UNS8 *ptr_dest = (UNS8*)pDestData;
419
f63ce68a8239 Added support for null terminated strings as VISIBLE_STRING.
etisserant
parents: 402
diff changeset
   151
        while( *ptr && ptr < ptr_end){
429
7cba38279f98 Fixed not so ANSI code in objaccess.c
etisserant
parents: 421
diff changeset
   152
            *(ptr_dest++) = *(ptr++);
419
f63ce68a8239 Added support for null terminated strings as VISIBLE_STRING.
etisserant
parents: 402
diff changeset
   153
        } 
421
6221b4db8c42 Added support for null terminated strings as VISIBLE_STRING.
etisserant
parents: 419
diff changeset
   154
         
6221b4db8c42 Added support for null terminated strings as VISIBLE_STRING.
etisserant
parents: 419
diff changeset
   155
        *pExpectedSize = ptr - ptr_start;
6221b4db8c42 Added support for null terminated strings as VISIBLE_STRING.
etisserant
parents: 419
diff changeset
   156
        /* terminate string if not maximum length */
6221b4db8c42 Added support for null terminated strings as VISIBLE_STRING.
etisserant
parents: 419
diff changeset
   157
        if (*pExpectedSize < szData) 
6221b4db8c42 Added support for null terminated strings as VISIBLE_STRING.
etisserant
parents: 419
diff changeset
   158
            *(ptr) = 0; 
419
f63ce68a8239 Added support for null terminated strings as VISIBLE_STRING.
etisserant
parents: 402
diff changeset
   159
    }
402
77f875d45250 Fixed faulty read access checking on OD access. Added read acces s checking in SDO (was disabled)
etisserant
parents: 378
diff changeset
   160
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
   161
    return OD_SUCCESSFUL;
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
   162
  }
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   163
  else { /* Error ! */
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
   164
    *pExpectedSize = szData;
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
   165
    accessDictionaryError(wIndex, bSubindex, szData,
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
   166
                          *pExpectedSize, OD_LENGTH_DATA_INVALID);
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
   167
    return OD_LENGTH_DATA_INVALID;
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
   168
  }
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
   169
}
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
   170
588
ee181b4f177b Replace macro functions for setODentry and getODentry
greg
parents: 539
diff changeset
   171
UNS32 getODentry( CO_Data* OD,
ee181b4f177b Replace macro functions for setODentry and getODentry
greg
parents: 539
diff changeset
   172
                  UNS16 wIndex,
ee181b4f177b Replace macro functions for setODentry and getODentry
greg
parents: 539
diff changeset
   173
                  UNS8 bSubindex,
ee181b4f177b Replace macro functions for setODentry and getODentry
greg
parents: 539
diff changeset
   174
                  void * pDestData,
ee181b4f177b Replace macro functions for setODentry and getODentry
greg
parents: 539
diff changeset
   175
                  UNS32 * pExpectedSize,
ee181b4f177b Replace macro functions for setODentry and getODentry
greg
parents: 539
diff changeset
   176
                  UNS8 * pDataType,
ee181b4f177b Replace macro functions for setODentry and getODentry
greg
parents: 539
diff changeset
   177
                  UNS8 checkAccess)
ee181b4f177b Replace macro functions for setODentry and getODentry
greg
parents: 539
diff changeset
   178
{
ee181b4f177b Replace macro functions for setODentry and getODentry
greg
parents: 539
diff changeset
   179
	return _getODentry( OD, wIndex, bSubindex, pDestData, pExpectedSize,
ee181b4f177b Replace macro functions for setODentry and getODentry
greg
parents: 539
diff changeset
   180
                        pDataType,  checkAccess, 1);
ee181b4f177b Replace macro functions for setODentry and getODentry
greg
parents: 539
diff changeset
   181
}
ee181b4f177b Replace macro functions for setODentry and getODentry
greg
parents: 539
diff changeset
   182
ee181b4f177b Replace macro functions for setODentry and getODentry
greg
parents: 539
diff changeset
   183
UNS32 readLocalDict( CO_Data* OD,
ee181b4f177b Replace macro functions for setODentry and getODentry
greg
parents: 539
diff changeset
   184
                     UNS16 wIndex,
ee181b4f177b Replace macro functions for setODentry and getODentry
greg
parents: 539
diff changeset
   185
                     UNS8 bSubindex,
ee181b4f177b Replace macro functions for setODentry and getODentry
greg
parents: 539
diff changeset
   186
                     void * pDestData,
ee181b4f177b Replace macro functions for setODentry and getODentry
greg
parents: 539
diff changeset
   187
                     UNS32 * pExpectedSize,
ee181b4f177b Replace macro functions for setODentry and getODentry
greg
parents: 539
diff changeset
   188
                     UNS8 * pDataType,
ee181b4f177b Replace macro functions for setODentry and getODentry
greg
parents: 539
diff changeset
   189
                     UNS8 checkAccess)
ee181b4f177b Replace macro functions for setODentry and getODentry
greg
parents: 539
diff changeset
   190
{
ee181b4f177b Replace macro functions for setODentry and getODentry
greg
parents: 539
diff changeset
   191
  return _getODentry( OD, wIndex, bSubindex, pDestData, pExpectedSize,
ee181b4f177b Replace macro functions for setODentry and getODentry
greg
parents: 539
diff changeset
   192
                      pDataType,  checkAccess, 0);
ee181b4f177b Replace macro functions for setODentry and getODentry
greg
parents: 539
diff changeset
   193
}
ee181b4f177b Replace macro functions for setODentry and getODentry
greg
parents: 539
diff changeset
   194
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
   195
UNS32 _setODentry( CO_Data* d,
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
   196
                   UNS16 wIndex,
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
   197
                   UNS8 bSubindex,
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
   198
                   void * pSourceData,
539
187058b4a4b8 Changed OD size from UNS8 to UNS32, and repercuted change to PDO and SDO. Thanks to Jari Kuusisto for patch.
etisserant
parents: 469
diff changeset
   199
                   UNS32 * pExpectedSize,
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
   200
                   UNS8 checkAccess,
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
   201
                   UNS8 endianize)
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   202
{
539
187058b4a4b8 Changed OD size from UNS8 to UNS32, and repercuted change to PDO and SDO. Thanks to Jari Kuusisto for patch.
etisserant
parents: 469
diff changeset
   203
  UNS32 szData;
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   204
  UNS8 dataType;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   205
  UNS32 errorCode;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   206
  const indextable *ptrTable;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   207
  ODCallback_t *Callback;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   208
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   209
  ptrTable =(*d->scanIndexOD)(wIndex, &errorCode, &Callback);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   210
  if (errorCode != OD_SUCCESSFUL)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   211
    return errorCode;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   212
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   213
  if( ptrTable->bSubCount <= bSubindex ) {
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   214
    /* Subindex not found */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   215
    accessDictionaryError(wIndex, bSubindex, 0, *pExpectedSize, OD_NO_SUCH_SUBINDEX);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   216
    return OD_NO_SUCH_SUBINDEX;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   217
  }
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
   218
  if (checkAccess && (ptrTable->pSubindex[bSubindex].bAccessType == RO)) {
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
   219
    MSG_WAR(0x2B25, "Access Type : ", ptrTable->pSubindex[bSubindex].bAccessType);
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   220
    accessDictionaryError(wIndex, bSubindex, 0, *pExpectedSize, OD_WRITE_NOT_ALLOWED);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   221
    return OD_WRITE_NOT_ALLOWED;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   222
  }
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   223
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   224
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
   225
  dataType = ptrTable->pSubindex[bSubindex].bDataType;
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
   226
  szData = ptrTable->pSubindex[bSubindex].size;
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   227
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   228
  if( *pExpectedSize == 0 ||
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
   229
      *pExpectedSize == szData ||
421
6221b4db8c42 Added support for null terminated strings as VISIBLE_STRING.
etisserant
parents: 419
diff changeset
   230
      /* allow to store a shorter string than entry size */
6221b4db8c42 Added support for null terminated strings as VISIBLE_STRING.
etisserant
parents: 419
diff changeset
   231
      (dataType == visible_string && *pExpectedSize < szData))
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
   232
    {
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
   233
#ifdef CANOPEN_BIG_ENDIAN
421
6221b4db8c42 Added support for null terminated strings as VISIBLE_STRING.
etisserant
parents: 419
diff changeset
   234
      /* re-endianize do not occur for bool, strings time and domains */
6221b4db8c42 Added support for null terminated strings as VISIBLE_STRING.
etisserant
parents: 419
diff changeset
   235
      if(endianize && dataType > boolean && !(
6221b4db8c42 Added support for null terminated strings as VISIBLE_STRING.
etisserant
parents: 419
diff changeset
   236
            dataType >= visible_string && 
431
166037b8f2ed Fixed typo in objacces.c bigendian side.
etisserant
parents: 430
diff changeset
   237
            dataType <= domain))
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
   238
        {
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   239
          /* we invert the data source directly. This let us do range
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
   240
            testing without */
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   241
          /* additional temp variable */
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
   242
          UNS8 i;
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
   243
          for ( i = 0 ; i < ( ptrTable->pSubindex[bSubindex].size >> 1)  ; i++)
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
   244
            {
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
   245
              UNS8 tmp =((UNS8 *)pSourceData) [(ptrTable->pSubindex[bSubindex].size - 1) - i];
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
   246
              ((UNS8 *)pSourceData) [(ptrTable->pSubindex[bSubindex].size - 1) - i] = ((UNS8 *)pSourceData)[i];
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
   247
              ((UNS8 *)pSourceData)[i] = tmp;
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
   248
            }
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
   249
        }
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
   250
#endif
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   251
      errorCode = (*d->valueRangeTest)(dataType, pSourceData);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   252
      if (errorCode) {
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
   253
        accessDictionaryError(wIndex, bSubindex, szData, *pExpectedSize, errorCode);
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
   254
        return errorCode;
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   255
      }
2
8d4a822f95e4 Fixed Endianisation/ValueRange order in SetODentry
etisserant
parents: 1
diff changeset
   256
      memcpy(ptrTable->pSubindex[bSubindex].pObject,pSourceData, *pExpectedSize);
421
6221b4db8c42 Added support for null terminated strings as VISIBLE_STRING.
etisserant
parents: 419
diff changeset
   257
     /* TODO : CONFORM TO DS-301 : 
6221b4db8c42 Added support for null terminated strings as VISIBLE_STRING.
etisserant
parents: 419
diff changeset
   258
      *  - stop using NULL terminated strings
6221b4db8c42 Added support for null terminated strings as VISIBLE_STRING.
etisserant
parents: 419
diff changeset
   259
      *  - store string size in td_subindex 
6221b4db8c42 Added support for null terminated strings as VISIBLE_STRING.
etisserant
parents: 419
diff changeset
   260
      * */
6221b4db8c42 Added support for null terminated strings as VISIBLE_STRING.
etisserant
parents: 419
diff changeset
   261
      /* terminate visible_string with '\0' */
6221b4db8c42 Added support for null terminated strings as VISIBLE_STRING.
etisserant
parents: 419
diff changeset
   262
      if(dataType == visible_string && *pExpectedSize < szData)
6221b4db8c42 Added support for null terminated strings as VISIBLE_STRING.
etisserant
parents: 419
diff changeset
   263
        ((UNS8*)ptrTable->pSubindex[bSubindex].pObject)[*pExpectedSize] = 0;
6221b4db8c42 Added support for null terminated strings as VISIBLE_STRING.
etisserant
parents: 419
diff changeset
   264
      
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   265
      *pExpectedSize = szData;
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
   266
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   267
      /* Callbacks */
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   268
      if(Callback && Callback[bSubindex]){
437
129bbe0504e4 Now OD callback return val ahev influance on SDO transmission (if callback fall, SDO abord may be signaled)
etisserant
parents: 431
diff changeset
   269
        errorCode = (Callback[bSubindex])(d, ptrTable, bSubindex);
129bbe0504e4 Now OD callback return val ahev influance on SDO transmission (if callback fall, SDO abord may be signaled)
etisserant
parents: 431
diff changeset
   270
        if(errorCode != OD_SUCCESSFUL)
129bbe0504e4 Now OD callback return val ahev influance on SDO transmission (if callback fall, SDO abord may be signaled)
etisserant
parents: 431
diff changeset
   271
        {
129bbe0504e4 Now OD callback return val ahev influance on SDO transmission (if callback fall, SDO abord may be signaled)
etisserant
parents: 431
diff changeset
   272
            return errorCode;
129bbe0504e4 Now OD callback return val ahev influance on SDO transmission (if callback fall, SDO abord may be signaled)
etisserant
parents: 431
diff changeset
   273
        }
129bbe0504e4 Now OD callback return val ahev influance on SDO transmission (if callback fall, SDO abord may be signaled)
etisserant
parents: 431
diff changeset
   274
       }
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
   275
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   276
      /* TODO : Store dans NVRAM */
161
c4908cc776a9 SetODEntry now call CO_data->storeODSubEntry(Index,SubIndex) for variables to be Stored (when column Save==True in GUI)
etisserant
parents: 75
diff changeset
   277
      if (ptrTable->pSubindex[bSubindex].bAccessType & TO_BE_SAVE){
378
d2abf6c8c27b As requested long ago, added CoData* parameter to all this applications callback, let application designer use identical callback for multiple nodes, and reduce source code length.
etisserant
parents: 215
diff changeset
   278
        (*d->storeODSubIndex)(d, wIndex, bSubindex);
161
c4908cc776a9 SetODEntry now call CO_data->storeODSubEntry(Index,SubIndex) for variables to be Stored (when column Save==True in GUI)
etisserant
parents: 75
diff changeset
   279
      }
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   280
      return OD_SUCCESSFUL;
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
   281
    }else{
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   282
      *pExpectedSize = szData;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   283
      accessDictionaryError(wIndex, bSubindex, szData, *pExpectedSize, OD_LENGTH_DATA_INVALID);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   284
      return OD_LENGTH_DATA_INVALID;
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
   285
    }
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
   286
}
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
   287
588
ee181b4f177b Replace macro functions for setODentry and getODentry
greg
parents: 539
diff changeset
   288
UNS32 setODentry( CO_Data* d,
ee181b4f177b Replace macro functions for setODentry and getODentry
greg
parents: 539
diff changeset
   289
                  UNS16 wIndex,
ee181b4f177b Replace macro functions for setODentry and getODentry
greg
parents: 539
diff changeset
   290
                  UNS8 bSubindex,
ee181b4f177b Replace macro functions for setODentry and getODentry
greg
parents: 539
diff changeset
   291
                  void * pSourceData,
ee181b4f177b Replace macro functions for setODentry and getODentry
greg
parents: 539
diff changeset
   292
                  UNS32 * pExpectedSize,
ee181b4f177b Replace macro functions for setODentry and getODentry
greg
parents: 539
diff changeset
   293
                  UNS8 checkAccess)
ee181b4f177b Replace macro functions for setODentry and getODentry
greg
parents: 539
diff changeset
   294
{
ee181b4f177b Replace macro functions for setODentry and getODentry
greg
parents: 539
diff changeset
   295
  return _setODentry( d, wIndex, bSubindex, pSourceData, pExpectedSize,
ee181b4f177b Replace macro functions for setODentry and getODentry
greg
parents: 539
diff changeset
   296
                      checkAccess, 1);
ee181b4f177b Replace macro functions for setODentry and getODentry
greg
parents: 539
diff changeset
   297
}
ee181b4f177b Replace macro functions for setODentry and getODentry
greg
parents: 539
diff changeset
   298
ee181b4f177b Replace macro functions for setODentry and getODentry
greg
parents: 539
diff changeset
   299
UNS32 writeLocalDict( CO_Data* d,
ee181b4f177b Replace macro functions for setODentry and getODentry
greg
parents: 539
diff changeset
   300
                     UNS16 wIndex,
ee181b4f177b Replace macro functions for setODentry and getODentry
greg
parents: 539
diff changeset
   301
                     UNS8 bSubindex,
ee181b4f177b Replace macro functions for setODentry and getODentry
greg
parents: 539
diff changeset
   302
                     void * pSourceData,
ee181b4f177b Replace macro functions for setODentry and getODentry
greg
parents: 539
diff changeset
   303
                     UNS32 * pExpectedSize,
ee181b4f177b Replace macro functions for setODentry and getODentry
greg
parents: 539
diff changeset
   304
                     UNS8 checkAccess)
ee181b4f177b Replace macro functions for setODentry and getODentry
greg
parents: 539
diff changeset
   305
{
ee181b4f177b Replace macro functions for setODentry and getODentry
greg
parents: 539
diff changeset
   306
  return _setODentry( d, wIndex, bSubindex, pSourceData, pExpectedSize, checkAccess, 0);
ee181b4f177b Replace macro functions for setODentry and getODentry
greg
parents: 539
diff changeset
   307
}
ee181b4f177b Replace macro functions for setODentry and getODentry
greg
parents: 539
diff changeset
   308
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   309
const indextable * scanIndexOD (CO_Data* d, UNS16 wIndex, UNS32 *errorCode, ODCallback_t **Callback)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   310
{
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   311
  return (*d->scanIndexOD)(wIndex, errorCode, Callback);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   312
}
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   313
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   314
UNS32 RegisterSetODentryCallBack(CO_Data* d, UNS16 wIndex, UNS8 bSubindex, ODCallback_t Callback)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   315
{
469
f2b07ea215b5 Applied edward's patch for OD acces macros (optimization) and boudaries check (safety).
etisserant
parents: 450
diff changeset
   316
UNS32 errorCode;
f2b07ea215b5 Applied edward's patch for OD acces macros (optimization) and boudaries check (safety).
etisserant
parents: 450
diff changeset
   317
ODCallback_t *CallbackList;
f2b07ea215b5 Applied edward's patch for OD acces macros (optimization) and boudaries check (safety).
etisserant
parents: 450
diff changeset
   318
const indextable *odentry;
f2b07ea215b5 Applied edward's patch for OD acces macros (optimization) and boudaries check (safety).
etisserant
parents: 450
diff changeset
   319
f2b07ea215b5 Applied edward's patch for OD acces macros (optimization) and boudaries check (safety).
etisserant
parents: 450
diff changeset
   320
  odentry = scanIndexOD (d, wIndex, &errorCode, &CallbackList);
f2b07ea215b5 Applied edward's patch for OD acces macros (optimization) and boudaries check (safety).
etisserant
parents: 450
diff changeset
   321
  if(errorCode == OD_SUCCESSFUL  &&  CallbackList  &&  bSubindex < odentry->bSubCount) 
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
   322
    CallbackList[bSubindex] = Callback;
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
   323
  return errorCode;
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
   324
}
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 175
diff changeset
   325
378
d2abf6c8c27b As requested long ago, added CoData* parameter to all this applications callback, let application designer use identical callback for multiple nodes, and reduce source code length.
etisserant
parents: 215
diff changeset
   326
void _storeODSubIndex (CO_Data* d, UNS16 wIndex, UNS8 bSubindex){}