src/dcf.c
author etisserant
Mon, 02 Jul 2007 18:22:58 +0200
changeset 236 905677ed00f3
parent 215 f49e5a6b7804
child 251 cab66ef3e68e
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.
178
01d81faa3350 Add concise DCF support
greg
parents:
diff changeset
     1
/*
207
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
     2
  This file is part of CanFestival, a library implementing CanOpen
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
     3
  Stack.
178
01d81faa3350 Add concise DCF support
greg
parents:
diff changeset
     4
207
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
     5
  Copyright (C): Edouard TISSERANT and Francis DUPIN
178
01d81faa3350 Add concise DCF support
greg
parents:
diff changeset
     6
207
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
     7
  See COPYING file for copyrights details.
178
01d81faa3350 Add concise DCF support
greg
parents:
diff changeset
     8
207
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
     9
  This library is free software; you can redistribute it and/or
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
    10
  modify it under the terms of the GNU Lesser General Public
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
    11
  License as published by the Free Software Foundation; either
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
    12
  version 2.1 of the License, or (at your option) any later version.
178
01d81faa3350 Add concise DCF support
greg
parents:
diff changeset
    13
207
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
    14
  This library is distributed in the hope that it will be useful,
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
    15
  but WITHOUT ANY WARRANTY; without even the implied warranty of
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
    16
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
    17
  Lesser General Public License for more details.
178
01d81faa3350 Add concise DCF support
greg
parents:
diff changeset
    18
207
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
    19
  You should have received a copy of the GNU Lesser General Public
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
    20
  License along with this library; if not, write to the Free Software
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
    21
  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
    22
  USA
178
01d81faa3350 Add concise DCF support
greg
parents:
diff changeset
    23
*/
01d81faa3350 Add concise DCF support
greg
parents:
diff changeset
    24
210
6b5a4c21e061 Manual and Documentation finish
nico
parents: 208
diff changeset
    25
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 207
diff changeset
    26
/**
207
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
    27
** @file   dcf.c
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
    28
** @author Edouard TISSERANT and Francis DUPIN
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
    29
** @date   Mon Jun  4 17:06:12 2007
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
    30
**
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 207
diff changeset
    31
** @brief EXEMPLE OF SOMMARY
207
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
    32
**
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
    33
**
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
    34
*/
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 212
diff changeset
    35
f49e5a6b7804 Manual and Documentation finish
nico
parents: 212
diff changeset
    36
178
01d81faa3350 Add concise DCF support
greg
parents:
diff changeset
    37
#include "objacces.h"
01d81faa3350 Add concise DCF support
greg
parents:
diff changeset
    38
#include "sdo.h"
01d81faa3350 Add concise DCF support
greg
parents:
diff changeset
    39
#include "dcf.h"
200
930be51ddc24 Big Endian fixes.
etisserant
parents: 191
diff changeset
    40
#include "sysdep.h"
178
01d81faa3350 Add concise DCF support
greg
parents:
diff changeset
    41
207
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
    42
extern UNS8 _writeNetworkDict (CO_Data* d, UNS8 nodeId, UNS16 index,
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
    43
                               UNS8 subIndex, UNS8 count, UNS8 dataType, void *data, SDOCallback_t Callback, UNS8 endianize);
204
44ce74232ccb Some fixes for visual studio C compiler compatiblity.
etisserant
parents: 202
diff changeset
    44
178
01d81faa3350 Add concise DCF support
greg
parents:
diff changeset
    45
const indextable *ptrTable;
01d81faa3350 Add concise DCF support
greg
parents:
diff changeset
    46
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 207
diff changeset
    47
/**
207
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
    48
**
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
    49
**
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
    50
** @param d
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
    51
** @param nodeId
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 207
diff changeset
    52
*/
178
01d81faa3350 Add concise DCF support
greg
parents:
diff changeset
    53
static void CheckSDOAndContinue(CO_Data* d, UNS8 nodeId)
01d81faa3350 Add concise DCF support
greg
parents:
diff changeset
    54
{
207
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
    55
  UNS32 abortCode;
191
1e6e3d261b8f CleanUp and minor fixes
etisserant
parents: 178
diff changeset
    56
207
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
    57
  if(getWriteResultNetworkDict (d, nodeId, &abortCode) != SDO_FINISHED)
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
    58
    {
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
    59
      MSG_ERR(0x1A01, "SDO error in consise DCF", abortCode);
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
    60
      MSG_WAR(0x2A02, "server node : ", nodeId);
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
    61
    }
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
    62
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
    63
  closeSDOtransfer(d, nodeId, SDO_CLIENT);
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
    64
  decompo_dcf(d,nodeId);
178
01d81faa3350 Add concise DCF support
greg
parents:
diff changeset
    65
}
01d81faa3350 Add concise DCF support
greg
parents:
diff changeset
    66
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 207
diff changeset
    67
/**
207
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
    68
**
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
    69
**
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
    70
** @param d
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
    71
** @param nodeId
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
    72
**
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
    73
** @return
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 207
diff changeset
    74
*/
178
01d81faa3350 Add concise DCF support
greg
parents:
diff changeset
    75
UNS32 decompo_dcf(CO_Data* d,UNS8 nodeId)
01d81faa3350 Add concise DCF support
greg
parents:
diff changeset
    76
{
207
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
    77
  UNS32 errorCode;
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
    78
  UNS16 target_Index;
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
    79
  UNS8 target_Subindex;
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
    80
  UNS32 target_Size;
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
    81
  UNS32 res;
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
    82
  ODCallback_t *Callback;
178
01d81faa3350 Add concise DCF support
greg
parents:
diff changeset
    83
207
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
    84
  ptrTable = (*d->scanIndexOD)(0x1F22, &errorCode, &Callback);
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
    85
  if (errorCode != OD_SUCCESSFUL)
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
    86
    {
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
    87
      return errorCode;
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
    88
    }
178
01d81faa3350 Add concise DCF support
greg
parents:
diff changeset
    89
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 212
diff changeset
    90
  /* Loop on all Nodes supported in DCF subindexes*/
207
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
    91
  while (nodeId < ptrTable->bSubCount){
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
    92
    UNS32 nb_targets;
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
    93
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
    94
    UNS8 szData = ptrTable->pSubindex[nodeId].size;
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
    95
    UNS8* dcfend;
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
    96
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
    97
    {
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
    98
      UNS8* dcf = *((UNS8**)ptrTable->pSubindex[nodeId].pObject);
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
    99
      dcfend = dcf + szData;
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
   100
      if (!d->dcf_cursor){
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
   101
        d->dcf_cursor = (UNS8*)dcf + 4;
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
   102
        d->dcf_count_targets = 0;
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
   103
      }
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
   104
      nb_targets = UNS32_LE(*((UNS32*)dcf));
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
   105
    }
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
   106
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 212
diff changeset
   107
    /* condition on consise DCF string for NodeID, if big enough */
207
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
   108
    if((UNS8*)d->dcf_cursor + 7 < (UNS8*)dcfend && d->dcf_count_targets < nb_targets)
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
   109
      {
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 212
diff changeset
   110
        /* pointer to the DCF string for NodeID */
207
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
   111
        target_Index = UNS16_LE(*((UNS16*)(d->dcf_cursor))); d->dcf_cursor += 2;
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
   112
        target_Subindex = *((UNS8*)(((UNS8*)d->dcf_cursor)++));
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
   113
        target_Size = UNS32_LE(*((UNS32*)(d->dcf_cursor))); d->dcf_cursor += 4;
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
   114
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 207
diff changeset
   115
        /* printf("Master : ConfigureSlaveNode %2.2x (Concise
207
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
   116
          DCF)\n",nodeId);*/
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 212
diff changeset
   117
        res = _writeNetworkDict(d, /* CO_Data* d*/
f49e5a6b7804 Manual and Documentation finish
nico
parents: 212
diff changeset
   118
                                nodeId, /* UNS8 nodeId*/
f49e5a6b7804 Manual and Documentation finish
nico
parents: 212
diff changeset
   119
                                target_Index, /* UNS16 index*/
f49e5a6b7804 Manual and Documentation finish
nico
parents: 212
diff changeset
   120
                                target_Subindex, /* UNS8 subindex*/
f49e5a6b7804 Manual and Documentation finish
nico
parents: 212
diff changeset
   121
                                target_Size, /* UNS8 count*/
f49e5a6b7804 Manual and Documentation finish
nico
parents: 212
diff changeset
   122
                                0, /* UNS8 dataType*/
f49e5a6b7804 Manual and Documentation finish
nico
parents: 212
diff changeset
   123
                                d->dcf_cursor,/* void *data*/
f49e5a6b7804 Manual and Documentation finish
nico
parents: 212
diff changeset
   124
                                CheckSDOAndContinue,/* SDOCallback_t
207
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
   125
                                                      Callback*/
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 212
diff changeset
   126
                                0); /* no endianize*/
f49e5a6b7804 Manual and Documentation finish
nico
parents: 212
diff changeset
   127
        /* Push d->dcf_cursor to the end of data*/
207
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
   128
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
   129
        d->dcf_cursor += target_Size;
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
   130
        d->dcf_count_targets++;
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
   131
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
   132
        return ;
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
   133
      }
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
   134
    nodeId++;
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
   135
    d->dcf_cursor = NULL;
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
   136
  }
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 212
diff changeset
   137
  /*  Switch Master to preOperational state */
207
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
   138
  (*d->preOperational)();
b6572d0336c3 First doxygen implementation
nico
parents: 204
diff changeset
   139
178
01d81faa3350 Add concise DCF support
greg
parents:
diff changeset
   140
}