src/pdo.c
author fbeaulier
Tue, 16 Aug 2011 14:15:52 +0200
changeset 663 70fc3603e36f
parent 661 06494ae5b2b6
child 670 e37511baf56b
permissions -rw-r--r--
timers_unix.c : remove sigint and sigterm catch
sdo : Allow multiple servers
The sdo transfer struct is not anymore referenced by server's node id but by
client or server number in the OD. Node id is not relevant in SDO transfert.
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
     1
/*
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
     2
  This file is part of CanFestival, a library implementing CanOpen
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
     3
  Stack.
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
     4
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
     5
  Copyright (C): Edouard TISSERANT and Francis DUPIN
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
     6
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
     7
  See COPYING file for copyrights details.
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
     8
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
     9
  This library is free software; you can redistribute it and/or
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    10
  modify it under the terms of the GNU Lesser General Public
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    11
  License as published by the Free Software Foundation; either
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    12
  version 2.1 of the License, or (at your option) any later version.
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    13
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    14
  This library is distributed in the hope that it will be useful,
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    15
  but WITHOUT ANY WARRANTY; without even the implied warranty of
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    16
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    17
  Lesser General Public License for more details.
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    18
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    19
  You should have received a copy of the GNU Lesser General Public
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    20
  License along with this library; if not, write to the Free Software
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    21
  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    22
  USA
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    23
*/
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    24
#include "pdo.h"
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    25
#include "objacces.h"
149
fe50ada8020b Changes in the API:
etisserant
parents: 90
diff changeset
    26
#include "canfestival.h"
370
6fecf36df407 Fixed some endianization problems caused by switch to UNS16 for cob_id member in CAN messages. To be continued.
etisserant
parents: 365
diff changeset
    27
#include "sysdep.h"
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    28
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    29
/*!
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    30
** @file   pdo.c
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    31
** @author Edouard TISSERANT and Francis DUPIN
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    32
** @date   Tue Jun  5 09:32:32 2007
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    33
**
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    34
** @brief
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    35
**
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    36
**
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    37
*/
235
f812bf6b7237 Preliminary implementation of Event Timer and Inhibit Timer driven TPDO
etisserant
parents: 217
diff changeset
    38
f812bf6b7237 Preliminary implementation of Event Timer and Inhibit Timer driven TPDO
etisserant
parents: 217
diff changeset
    39
/*!
f812bf6b7237 Preliminary implementation of Event Timer and Inhibit Timer driven TPDO
etisserant
parents: 217
diff changeset
    40
**
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    41
**
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    42
** @param d
235
f812bf6b7237 Preliminary implementation of Event Timer and Inhibit Timer driven TPDO
etisserant
parents: 217
diff changeset
    43
** @param TPDO_com TPDO communication parameters OD entry
f812bf6b7237 Preliminary implementation of Event Timer and Inhibit Timer driven TPDO
etisserant
parents: 217
diff changeset
    44
** @param TPDO_map TPDO mapping parameters OD entry
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    45
**
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    46
** @return
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
    47
**/
235
f812bf6b7237 Preliminary implementation of Event Timer and Inhibit Timer driven TPDO
etisserant
parents: 217
diff changeset
    48
524
b94067330319 1.29 Datatypes for timers
peter
parents: 497
diff changeset
    49
UNS8 buildPDO (CO_Data * d, UNS8 numPdo, Message * pdo)
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
    50
{
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
    51
  const indextable *TPDO_com = d->objdict + d->firstIndex->PDO_TRS + numPdo;
524
b94067330319 1.29 Datatypes for timers
peter
parents: 497
diff changeset
    52
  const indextable *TPDO_map = d->objdict + d->firstIndex->PDO_TRS_MAP + numPdo;
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
    53
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
    54
  UNS8 prp_j = 0x00;
587
c175351a6994 fix warnings with msvc compiler
greg
parents: 539
diff changeset
    55
  UNS32 offset = 0x00000000;
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
    56
  const UNS8 *pMappingCount = (UNS8 *) TPDO_map->pSubindex[0].pObject;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
    57
649
3beb784bacee CHANGED: - function sendOnePDOevent (CO_Data* d, UNS32 pdoNum) into sendOnePDOevent (CO_Data* d, UNS8 pdoNum)
Christian Taedcke
parents: 630
diff changeset
    58
  pdo->cob_id = (UNS16) UNS16_LE(*(UNS32*)TPDO_com->pSubindex[1].pObject & 0x7FF);
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
    59
  pdo->rtr = NOT_A_REQUEST;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
    60
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
    61
  MSG_WAR (0x3009, "  PDO CobId is : ",
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
    62
           *(UNS32 *) TPDO_com->pSubindex[1].pObject);
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
    63
  MSG_WAR (0x300D, "  Number of objects mapped : ", *pMappingCount);
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
    64
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
    65
  do
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
    66
    {
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
    67
      UNS8 dataType;            /* Unused */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
    68
      UNS8 tmp[] = { 0, 0, 0, 0, 0, 0, 0, 0 };  /* temporary space to hold bits */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
    69
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
    70
      /* pointer fo the var which holds the mapping parameter of an mapping entry  */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
    71
      UNS32 *pMappingParameter =
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
    72
        (UNS32 *) TPDO_map->pSubindex[prp_j + 1].pObject;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
    73
      UNS16 index = (UNS16) ((*pMappingParameter) >> 16);
539
187058b4a4b8 Changed OD size from UNS8 to UNS32, and repercuted change to PDO and SDO. Thanks to Jari Kuusisto for patch.
etisserant
parents: 524
diff changeset
    74
      UNS32 Size = (UNS32) (*pMappingParameter & (UNS32) 0x000000FF);     /* Size in bits */
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
    75
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
    76
      /* get variable only if Size != 0 and Size is lower than remaining bits in the PDO */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
    77
      if (Size && ((offset + Size) <= 64))
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
    78
        {
539
187058b4a4b8 Changed OD size from UNS8 to UNS32, and repercuted change to PDO and SDO. Thanks to Jari Kuusisto for patch.
etisserant
parents: 524
diff changeset
    79
          UNS32 ByteSize = 1 + ((Size - 1) >> 3);        /*1->8 => 1 ; 9->16 => 2, ... */
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
    80
          UNS8 subIndex =
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
    81
            (UNS8) (((*pMappingParameter) >> (UNS8) 8) & (UNS32) 0x000000FF);
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
    82
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
    83
          MSG_WAR (0x300F, "  got mapping parameter : ", *pMappingParameter);
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
    84
          MSG_WAR (0x3050, "    at index : ", TPDO_map->index);
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
    85
          MSG_WAR (0x3051, "    sub-index : ", prp_j + 1);
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
    86
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
    87
          if (getODentry (d, index, subIndex, tmp, &ByteSize, &dataType, 0) !=
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
    88
              OD_SUCCESSFUL)
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
    89
            {
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
    90
              MSG_ERR (0x1013,
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
    91
                       " Couldn't find mapped variable at index-subindex-size : ",
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
    92
                       (UNS16) (*pMappingParameter));
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
    93
              return 0xFF;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
    94
            }
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
    95
          /* copy bit per bit in little endian */
587
c175351a6994 fix warnings with msvc compiler
greg
parents: 539
diff changeset
    96
          CopyBits ((UNS8) Size, ((UNS8 *) tmp), 0, 0,
c175351a6994 fix warnings with msvc compiler
greg
parents: 539
diff changeset
    97
                    (UNS8 *) & pdo->data[offset >> 3], (UNS8)(offset % 8), 0);
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
    98
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
    99
          offset += Size;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   100
        }
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   101
      prp_j++;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   102
    }
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   103
  while (prp_j < *pMappingCount);
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   104
587
c175351a6994 fix warnings with msvc compiler
greg
parents: 539
diff changeset
   105
  pdo->len = (UNS8)(1 + ((offset - 1) >> 3));
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   106
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   107
  MSG_WAR (0x3015, "  End scan mapped variable", 0);
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   108
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   109
  return 0;
235
f812bf6b7237 Preliminary implementation of Event Timer and Inhibit Timer driven TPDO
etisserant
parents: 217
diff changeset
   110
}
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   111
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   112
/*!
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   113
**
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   114
**
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   115
** @param d
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   116
** @param cobId
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   117
**
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   118
** @return
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   119
**/
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   120
UNS8
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   121
sendPDOrequest (CO_Data * d, UNS16 RPDOIndex)
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   122
{
447
c9d01296d6d9 Endianess patch from Edward Karpicz, Lithuania :-)
etisserant
parents: 428
diff changeset
   123
  UNS32 *pwCobId;
236
905677ed00f3 Full preliminary implementation of TPDO transmit type:
etisserant
parents: 235
diff changeset
   124
  UNS16 offset = d->firstIndex->PDO_RCV;
905677ed00f3 Full preliminary implementation of TPDO transmit type:
etisserant
parents: 235
diff changeset
   125
  UNS16 lastIndex = d->lastIndex->PDO_RCV;
905677ed00f3 Full preliminary implementation of TPDO transmit type:
etisserant
parents: 235
diff changeset
   126
611
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   127
  if (!d->CurrentCommunicationState.csPDO)
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   128
    {
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   129
      return 0;
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   130
    }
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   131
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   132
  /* Sending the request only if the cobid have been found on the PDO
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   133
     receive */
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   134
  /* part dictionary */
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   135
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   136
  MSG_WAR (0x3930, "sendPDOrequest RPDO Index : ", RPDOIndex);
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   137
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   138
  if (offset && RPDOIndex >= 0x1400)
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   139
    {
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   140
      offset += RPDOIndex - 0x1400;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   141
      if (offset <= lastIndex)
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   142
        {
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   143
          /* get the CobId */
447
c9d01296d6d9 Endianess patch from Edward Karpicz, Lithuania :-)
etisserant
parents: 428
diff changeset
   144
          pwCobId = d->objdict[offset].pSubindex[1].pObject;
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   145
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   146
          MSG_WAR (0x3930, "sendPDOrequest cobId is : ", *pwCobId);
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   147
          {
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   148
            Message pdo;
587
c175351a6994 fix warnings with msvc compiler
greg
parents: 539
diff changeset
   149
            pdo.cob_id = (UNS16)UNS16_LE(*pwCobId);
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   150
            pdo.rtr = REQUEST;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   151
            pdo.len = 0;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   152
            return canSend (d->canHandle, &pdo);
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   153
          }
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   154
        }
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   155
    }
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   156
  MSG_ERR (0x1931, "sendPDOrequest : RPDO Index not found : ", RPDOIndex);
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   157
  return 0xFF;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   158
}
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   159
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   160
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   161
/*!
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   162
**
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   163
**
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   164
** @param d
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   165
** @param m
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   166
**
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   167
** @return
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   168
**/
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   169
UNS8
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   170
proceedPDO (CO_Data * d, Message * m)
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   171
{
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   172
  UNS8 numPdo;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   173
  UNS8 numMap;                  /* Number of the mapped varable */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   174
  UNS8 *pMappingCount = NULL;   /* count of mapped objects... */
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   175
  /* pointer to the var which is mapped to a pdo... */
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   176
  /*  void *     pMappedAppObject = NULL;   */
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   177
  /* pointer fo the var which holds the mapping parameter of an
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   178
     mapping entry */
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   179
  UNS32 *pMappingParameter = NULL;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   180
  UNS8 *pTransmissionType = NULL;       /* pointer to the transmission
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   181
                                           type */
447
c9d01296d6d9 Endianess patch from Edward Karpicz, Lithuania :-)
etisserant
parents: 428
diff changeset
   182
  UNS32 *pwCobId = NULL;
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   183
  UNS8 Size;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   184
  UNS8 offset;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   185
  UNS8 status;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   186
  UNS32 objDict;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   187
  UNS16 offsetObjdict;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   188
  UNS16 lastIndex;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   189
235
f812bf6b7237 Preliminary implementation of Event Timer and Inhibit Timer driven TPDO
etisserant
parents: 217
diff changeset
   190
  status = state2;
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   191
447
c9d01296d6d9 Endianess patch from Edward Karpicz, Lithuania :-)
etisserant
parents: 428
diff changeset
   192
  MSG_WAR (0x3935, "proceedPDO, cobID : ", (UNS16_LE(m->cob_id) & 0x7ff));
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   193
  offset = 0x00;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   194
  numPdo = 0;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   195
  numMap = 0;
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   196
  if ((*m).rtr == NOT_A_REQUEST)
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   197
    {                           /* The PDO received is not a
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   198
                                   request. */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   199
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   200
      offsetObjdict = d->firstIndex->PDO_RCV;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   201
      lastIndex = d->lastIndex->PDO_RCV;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   202
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   203
      /* study of all the PDO stored in the dictionary */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   204
      if (offsetObjdict)
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   205
        while (offsetObjdict <= lastIndex)
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   206
          {
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   207
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   208
            switch (status)
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   209
              {
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   210
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   211
              case state2:
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   212
                /* get CobId of the dictionary correspondant to the received
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   213
                   PDO */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   214
                pwCobId =
447
c9d01296d6d9 Endianess patch from Edward Karpicz, Lithuania :-)
etisserant
parents: 428
diff changeset
   215
                  d->objdict[offsetObjdict].pSubindex[1].pObject;
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   216
                /* check the CobId coherance */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   217
                /*pwCobId is the cobId read in the dictionary at the state 3
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   218
                 */
447
c9d01296d6d9 Endianess patch from Edward Karpicz, Lithuania :-)
etisserant
parents: 428
diff changeset
   219
                if (*pwCobId == UNS16_LE(m->cob_id))
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   220
                  {
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   221
                    /* The cobId is recognized */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   222
                    status = state4;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   223
                    MSG_WAR (0x3936, "cobId found at index ",
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   224
                             0x1400 + numPdo);
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   225
                    break;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   226
                  }
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   227
                else
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   228
                  {
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   229
                    /* cobId received does not match with those write in the
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   230
                       dictionnary */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   231
                    numPdo++;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   232
                    offsetObjdict++;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   233
                    status = state2;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   234
                    break;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   235
                  }
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   236
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   237
              case state4:     /* Get Mapped Objects Number */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   238
                /* The cobId of the message received has been found in the
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   239
                   dictionnary. */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   240
                offsetObjdict = d->firstIndex->PDO_RCV_MAP;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   241
                lastIndex = d->lastIndex->PDO_RCV_MAP;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   242
                pMappingCount =
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   243
                  (UNS8 *) (d->objdict + offsetObjdict +
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   244
                            numPdo)->pSubindex[0].pObject;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   245
                numMap = 0;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   246
                while (numMap < *pMappingCount)
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   247
                  {
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   248
                    UNS8 tmp[] = { 0, 0, 0, 0, 0, 0, 0, 0 };
539
187058b4a4b8 Changed OD size from UNS8 to UNS32, and repercuted change to PDO and SDO. Thanks to Jari Kuusisto for patch.
etisserant
parents: 524
diff changeset
   249
                    UNS32 ByteSize;
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   250
                    pMappingParameter =
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   251
                      (UNS32 *) (d->objdict + offsetObjdict +
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   252
                                 numPdo)->pSubindex[numMap + 1].pObject;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   253
                    if (pMappingParameter == NULL)
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   254
                      {
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   255
                        MSG_ERR (0x1937, "Couldn't get mapping parameter : ",
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   256
                                 numMap + 1);
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   257
                        return 0xFF;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   258
                      }
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   259
                    /* Get the addresse of the mapped variable. */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   260
                    /* detail of *pMappingParameter : */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   261
                    /* The 16 hight bits contains the index, the medium 8 bits
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   262
                       contains the subindex, */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   263
                    /* and the lower 8 bits contains the size of the mapped
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   264
                       variable. */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   265
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   266
                    Size = (UNS8) (*pMappingParameter & (UNS32) 0x000000FF);
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   267
497
a040156aa72f cosmetic changes to pdo.c
etisserant
parents: 474
diff changeset
   268
                    /* set variable only if Size != 0 and 
a040156aa72f cosmetic changes to pdo.c
etisserant
parents: 474
diff changeset
   269
                     * Size is lower than remaining bits in the PDO */
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   270
                    if (Size && ((offset + Size) <= (m->len << 3)))
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   271
                      {
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   272
                        /* copy bit per bit in little endian */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   273
                        CopyBits (Size, (UNS8 *) & m->data[offset >> 3],
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   274
                                  offset % 8, 0, ((UNS8 *) tmp), 0, 0);
497
a040156aa72f cosmetic changes to pdo.c
etisserant
parents: 474
diff changeset
   275
                        /*1->8 => 1 ; 9->16 =>2, ... */
539
187058b4a4b8 Changed OD size from UNS8 to UNS32, and repercuted change to PDO and SDO. Thanks to Jari Kuusisto for patch.
etisserant
parents: 524
diff changeset
   276
                        ByteSize = (UNS32)(1 + ((Size - 1) >> 3));
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   277
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   278
                        objDict =
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   279
                          setODentry (d, (UNS16) ((*pMappingParameter) >> 16),
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   280
                                      (UNS8) (((*pMappingParameter) >> 8) &
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   281
                                              0xFF), tmp, &ByteSize, 0);
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   282
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   283
                        if (objDict != OD_SUCCESSFUL)
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   284
                          {
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   285
                            MSG_ERR (0x1938,
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   286
                                     "error accessing to the mapped var : ",
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   287
                                     numMap + 1);
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   288
                            MSG_WAR (0x2939, "         Mapped at index : ",
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   289
                                     (*pMappingParameter) >> 16);
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   290
                            MSG_WAR (0x2940, "                subindex : ",
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   291
                                     ((*pMappingParameter) >> 8) & 0xFF);
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   292
                            return 0xFF;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   293
                          }
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   294
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   295
                        MSG_WAR (0x3942,
497
a040156aa72f cosmetic changes to pdo.c
etisserant
parents: 474
diff changeset
   296
                                 "Variable updated by PDO cobid : ",
447
c9d01296d6d9 Endianess patch from Edward Karpicz, Lithuania :-)
etisserant
parents: 428
diff changeset
   297
                                 UNS16_LE(m->cob_id));
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   298
                        MSG_WAR (0x3943, "         Mapped at index : ",
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   299
                                 (*pMappingParameter) >> 16);
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   300
                        MSG_WAR (0x3944, "                subindex : ",
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   301
                                 ((*pMappingParameter) >> 8) & 0xFF);
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   302
                        offset += Size;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   303
                      }
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   304
                    numMap++;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   305
                  }             /* end loop while on mapped variables */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   306
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   307
                return 0;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   308
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   309
              }                 /* end switch status */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   310
          }                     /* end while */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   311
    }                           /* end if Donnees */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   312
  else if ((*m).rtr == REQUEST)
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   313
    {
447
c9d01296d6d9 Endianess patch from Edward Karpicz, Lithuania :-)
etisserant
parents: 428
diff changeset
   314
      MSG_WAR (0x3946, "Receive a PDO request cobId : ", UNS16_LE(m->cob_id));
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   315
      status = state1;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   316
      offsetObjdict = d->firstIndex->PDO_TRS;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   317
      lastIndex = d->lastIndex->PDO_TRS;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   318
      if (offsetObjdict)
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   319
        while (offsetObjdict <= lastIndex)
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   320
          {
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   321
            /* study of all PDO stored in the objects dictionary */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   322
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   323
            switch (status)
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   324
              {
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   325
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   326
              case state1:     /* check the CobId */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   327
                /* get CobId of the dictionary which match to the received PDO
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   328
                 */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   329
                pwCobId =
447
c9d01296d6d9 Endianess patch from Edward Karpicz, Lithuania :-)
etisserant
parents: 428
diff changeset
   330
                   (d->objdict +
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   331
                             offsetObjdict)->pSubindex[1].pObject;
447
c9d01296d6d9 Endianess patch from Edward Karpicz, Lithuania :-)
etisserant
parents: 428
diff changeset
   332
                if (*pwCobId == UNS16_LE(m->cob_id))
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   333
                  {
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   334
                    status = state4;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   335
                    break;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   336
                  }
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   337
                else
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   338
                  {
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   339
                    numPdo++;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   340
                    offsetObjdict++;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   341
                  }
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   342
                status = state1;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   343
                break;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   344
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   345
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   346
              case state4:     /* check transmission type */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   347
                pTransmissionType =
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   348
                  (UNS8 *) d->objdict[offsetObjdict].pSubindex[2].pObject;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   349
                /* If PDO is to be sampled and send on RTR, do it */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   350
                if ((*pTransmissionType == TRANS_RTR))
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   351
                  {
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   352
                    status = state5;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   353
                    break;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   354
                  }
497
a040156aa72f cosmetic changes to pdo.c
etisserant
parents: 474
diff changeset
   355
                /* RTR_SYNC means data prepared at SYNC, transmitted on RTR */
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   356
                else if ((*pTransmissionType == TRANS_RTR_SYNC))
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   357
                  {
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   358
                    if (d->PDO_status[numPdo].
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   359
                        transmit_type_parameter & PDO_RTR_SYNC_READY)
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   360
                      {
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   361
                        /*Data ready, just send */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   362
                        canSend (d->canHandle,
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   363
                                 &d->PDO_status[numPdo].last_message);
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   364
                        return 0;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   365
                      }
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   366
                    else
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   367
                      {
497
a040156aa72f cosmetic changes to pdo.c
etisserant
parents: 474
diff changeset
   368
                        /* if SYNC did never occur, transmit current data */
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   369
                        /* DS301 do not tell what to do in such a case... */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   370
                        MSG_ERR (0x1947,
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   371
                                 "Not ready RTR_SYNC TPDO send current data : ",
447
c9d01296d6d9 Endianess patch from Edward Karpicz, Lithuania :-)
etisserant
parents: 428
diff changeset
   372
                                 UNS16_LE(m->cob_id));
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   373
                        status = state5;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   374
                      }
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   375
                    break;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   376
                  }
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   377
                else if ((*pTransmissionType == TRANS_EVENT_PROFILE) ||
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   378
                         (*pTransmissionType == TRANS_EVENT_SPECIFIC))
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   379
                  {
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   380
                    /* Zap all timers and inhibit flag */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   381
                    d->PDO_status[numPdo].event_timer =
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   382
                      DelAlarm (d->PDO_status[numPdo].event_timer);
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   383
                    d->PDO_status[numPdo].inhibit_timer =
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   384
                      DelAlarm (d->PDO_status[numPdo].inhibit_timer);
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   385
                    d->PDO_status[numPdo].transmit_type_parameter &=
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   386
                      ~PDO_INHIBITED;
497
a040156aa72f cosmetic changes to pdo.c
etisserant
parents: 474
diff changeset
   387
                    /* Call  PDOEventTimerAlarm for this TPDO, 
a040156aa72f cosmetic changes to pdo.c
etisserant
parents: 474
diff changeset
   388
                     * this will trigger emission et reset timers */
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   389
                    PDOEventTimerAlarm (d, numPdo);
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   390
                    return 0;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   391
                  }
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   392
                else
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   393
                  {
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   394
                    /* The requested PDO is not to send on request. So, does
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   395
                       nothing. */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   396
                    MSG_WAR (0x2947, "PDO is not to send on request : ",
447
c9d01296d6d9 Endianess patch from Edward Karpicz, Lithuania :-)
etisserant
parents: 428
diff changeset
   397
                             UNS16_LE(m->cob_id));
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   398
                    return 0xFF;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   399
                  }
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   400
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   401
              case state5:     /* build and send requested PDO */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   402
                {
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   403
                  Message pdo;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   404
                  if (buildPDO (d, numPdo, &pdo))
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   405
                    {
447
c9d01296d6d9 Endianess patch from Edward Karpicz, Lithuania :-)
etisserant
parents: 428
diff changeset
   406
                      MSG_ERR (0x1948, " Couldn't build TPDO n�", numPdo);
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   407
                      return 0xFF;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   408
                    }
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   409
                  canSend (d->canHandle, &pdo);
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   410
                  return 0;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   411
                }
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   412
              }                 /* end switch status */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   413
          }                     /* end while */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   414
    }                           /* end if Requete */
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   415
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   416
  return 0;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   417
}
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   418
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   419
/*!
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   420
**
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   421
**
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   422
** @param NbBits
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   423
** @param SrcByteIndex
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   424
** @param SrcBitIndex
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   425
** @param SrcBigEndian
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   426
** @param DestByteIndex
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   427
** @param DestBitIndex
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   428
** @param DestBigEndian
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   429
**/
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   430
void
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   431
CopyBits (UNS8 NbBits, UNS8 * SrcByteIndex, UNS8 SrcBitIndex,
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   432
          UNS8 SrcBigEndian, UNS8 * DestByteIndex, UNS8 DestBitIndex,
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   433
          UNS8 DestBigEndian)
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   434
{
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   435
  /* This loop copy as many bits that it can each time, crossing */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   436
  /* successively bytes */
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   437
  // boundaries from LSB to MSB.
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   438
  while (NbBits > 0)
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   439
    {
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   440
      /* Bit missalignement between src and dest */
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   441
      INTEGER8 Vect = DestBitIndex - SrcBitIndex;
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   442
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   443
      /* We can now get src and align it to dest */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   444
      UNS8 Aligned =
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   445
        Vect > 0 ? *SrcByteIndex << Vect : *SrcByteIndex >> -Vect;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   446
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   447
      /* Compute the nb of bit we will be able to copy */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   448
      UNS8 BoudaryLimit = (Vect > 0 ? 8 - DestBitIndex : 8 - SrcBitIndex);
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   449
      UNS8 BitsToCopy = BoudaryLimit > NbBits ? NbBits : BoudaryLimit;
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   450
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   451
      /* Create a mask that will serve in: */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   452
      UNS8 Mask =
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   453
        ((0xff << (DestBitIndex + BitsToCopy)) |
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   454
         (0xff >> (8 - DestBitIndex)));
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   455
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   456
      /* - Filtering src */
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   457
      UNS8 Filtered = Aligned & ~Mask;
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   458
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   459
      /* - and erase bits where we write, preserve where we don't */
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   460
      *DestByteIndex &= Mask;
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   461
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   462
      /* Then write. */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   463
      *DestByteIndex |= Filtered;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   464
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   465
      /*Compute next time cursors for src */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   466
      if ((SrcBitIndex += BitsToCopy) > 7)      /* cross boundary ? */
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   467
        {
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   468
          SrcBitIndex = 0;      /* First bit */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   469
          SrcByteIndex += (SrcBigEndian ? -1 : 1);      /* Next byte */
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   470
        }
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   471
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   472
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   473
      /*Compute next time cursors for dest */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   474
      if ((DestBitIndex += BitsToCopy) > 7)
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   475
        {
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   476
          DestBitIndex = 0;     /* First bit */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   477
          DestByteIndex += (DestBigEndian ? -1 : 1);    /* Next byte */
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   478
        }
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   479
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   480
      /*And decrement counter. */
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   481
      NbBits -= BitsToCopy;
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   482
    }
201
2966cd34162a Boolean variable mapped in PDO
greg
parents: 149
diff changeset
   483
2966cd34162a Boolean variable mapped in PDO
greg
parents: 149
diff changeset
   484
}
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   485
611
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   486
static void sendPdo(CO_Data * d, UNS32 pdoNum, Message * pdo)
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   487
{
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   488
  /*store_as_last_message */
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   489
  d->PDO_status[pdoNum].last_message = *pdo;
660
cff8e50333e8 Fixed incorrect struct access in sendPDO() and inserted a missing variable in sendOnePDOEvent(). These errors occured at compile-time when configuring the project with './configure --debug=PDO' or './configure --debug=WAR'.
skratochwil
parents: 649
diff changeset
   490
  MSG_WAR (0x396D, "sendPDO cobId :", UNS16_LE(pdo->cob_id));
cff8e50333e8 Fixed incorrect struct access in sendPDO() and inserted a missing variable in sendOnePDOEvent(). These errors occured at compile-time when configuring the project with './configure --debug=PDO' or './configure --debug=WAR'.
skratochwil
parents: 649
diff changeset
   491
  MSG_WAR (0x396E, "     Nb octets  : ", pdo->len);
611
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   492
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   493
  canSend (d->canHandle, pdo);
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   494
}
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   495
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   496
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   497
/*!
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   498
**
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   499
**
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   500
** @param d
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   501
**
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   502
** @return
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   503
**/
235
f812bf6b7237 Preliminary implementation of Event Timer and Inhibit Timer driven TPDO
etisserant
parents: 217
diff changeset
   504
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   505
UNS8
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   506
sendPDOevent (CO_Data * d)
235
f812bf6b7237 Preliminary implementation of Event Timer and Inhibit Timer driven TPDO
etisserant
parents: 217
diff changeset
   507
{
f812bf6b7237 Preliminary implementation of Event Timer and Inhibit Timer driven TPDO
etisserant
parents: 217
diff changeset
   508
  /* Calls _sendPDOevent specifying it is not a sync event */
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   509
  return _sendPDOevent (d, 0);
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   510
}
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   511
611
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   512
UNS8
649
3beb784bacee CHANGED: - function sendOnePDOevent (CO_Data* d, UNS32 pdoNum) into sendOnePDOevent (CO_Data* d, UNS8 pdoNum)
Christian Taedcke
parents: 630
diff changeset
   513
sendOnePDOevent (CO_Data * d, UNS8 pdoNum)
611
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   514
{
629
b9274b595650 CosateQ contribution.
edouard
parents: 626
diff changeset
   515
  UNS16 offsetObjdict;
b9274b595650 CosateQ contribution.
edouard
parents: 626
diff changeset
   516
  Message pdo;
611
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   517
  if (!d->CurrentCommunicationState.csPDO ||
630
96919642e99c Moced CosateQ's doc at the right place, and fix PDO INHIBIT bit check error again.
edouard
parents: 629
diff changeset
   518
      (d->PDO_status[pdoNum].transmit_type_parameter & PDO_INHIBITED))
611
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   519
    {
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   520
      return 0;
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   521
    }
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   522
649
3beb784bacee CHANGED: - function sendOnePDOevent (CO_Data* d, UNS32 pdoNum) into sendOnePDOevent (CO_Data* d, UNS8 pdoNum)
Christian Taedcke
parents: 630
diff changeset
   523
  offsetObjdict = (UNS16) (d->firstIndex->PDO_TRS + pdoNum);
660
cff8e50333e8 Fixed incorrect struct access in sendPDO() and inserted a missing variable in sendOnePDOEvent(). These errors occured at compile-time when configuring the project with './configure --debug=PDO' or './configure --debug=WAR'.
skratochwil
parents: 649
diff changeset
   524
611
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   525
  MSG_WAR (0x3968, "  PDO is on EVENT. Trans type : ",
661
06494ae5b2b6 Removed unneccessary overhead introduced with the last fix.
Stefan@Sheldon
parents: 660
diff changeset
   526
           *((UNS8 *) d->objdict[offsetObjdict].pSubindex[2].pObject));
629
b9274b595650 CosateQ contribution.
edouard
parents: 626
diff changeset
   527
  
611
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   528
  memset(&pdo, 0, sizeof(pdo));
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   529
  if (buildPDO (d, pdoNum, &pdo))
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   530
    {
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   531
      MSG_ERR (0x3907, " Couldn't build TPDO number : ",
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   532
               pdoNum);
619
96f84395154f Enhancements for 'None' target : produce pre-linked object, remove some windows CRLF problems, fixed pedantic compiler warnings
edouard
parents: 611
diff changeset
   533
      return 0;
611
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   534
    }
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   535
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   536
  /*Compare new and old PDO */
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   537
  if (d->PDO_status[pdoNum].last_message.cob_id == pdo.cob_id
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   538
      && d->PDO_status[pdoNum].last_message.len == pdo.len
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   539
      && memcmp(d->PDO_status[pdoNum].last_message.data,
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   540
					pdo.data, 8) == 0
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   541
    )
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   542
    {
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   543
      /* No changes -> go to next pdo */
619
96f84395154f Enhancements for 'None' target : produce pre-linked object, remove some windows CRLF problems, fixed pedantic compiler warnings
edouard
parents: 611
diff changeset
   544
      return 0;
611
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   545
    }
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   546
  else
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   547
    {
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   548
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   549
      TIMEVAL EventTimerDuration;
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   550
      TIMEVAL InhibitTimerDuration;
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   551
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   552
      MSG_WAR (0x306A, "Changes TPDO number : ", pdoNum);
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   553
      /* Changes detected -> transmit message */
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   554
      EventTimerDuration =
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   555
        *(UNS16 *) d->objdict[offsetObjdict].pSubindex[5].
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   556
        pObject;
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   557
      InhibitTimerDuration =
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   558
        *(UNS16 *) d->objdict[offsetObjdict].pSubindex[3].
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   559
        pObject;
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   560
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   561
      /* Start both event_timer and inhibit_timer */
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   562
      if (EventTimerDuration)
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   563
        {
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   564
          DelAlarm (d->PDO_status[pdoNum].event_timer);
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   565
          d->PDO_status[pdoNum].event_timer =
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   566
            SetAlarm (d, pdoNum, &PDOEventTimerAlarm,
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   567
                      MS_TO_TIMEVAL (EventTimerDuration), 0);
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   568
        }
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   569
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   570
      if (InhibitTimerDuration)
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   571
        {
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   572
          DelAlarm (d->PDO_status[pdoNum].inhibit_timer);
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   573
          d->PDO_status[pdoNum].inhibit_timer =
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   574
            SetAlarm (d, pdoNum, &PDOInhibitTimerAlarm,
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   575
                      US_TO_TIMEVAL (InhibitTimerDuration *
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   576
                                     100), 0);
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   577
          /* and inhibit TPDO */
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   578
          d->PDO_status[pdoNum].transmit_type_parameter |=
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   579
            PDO_INHIBITED;
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   580
        }
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   581
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   582
      sendPdo(d, pdoNum, &pdo);
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   583
    }
619
96f84395154f Enhancements for 'None' target : produce pre-linked object, remove some windows CRLF problems, fixed pedantic compiler warnings
edouard
parents: 611
diff changeset
   584
    return 1;
611
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   585
}
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   586
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   587
void
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   588
PDOEventTimerAlarm (CO_Data * d, UNS32 pdoNum)
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   589
{
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   590
  /* This is needed to avoid deletion of re-attribuated timer */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   591
  d->PDO_status[pdoNum].event_timer = TIMER_NONE;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   592
  /* force emission of PDO by artificially changing last emitted */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   593
  d->PDO_status[pdoNum].last_message.cob_id = 0;
649
3beb784bacee CHANGED: - function sendOnePDOevent (CO_Data* d, UNS32 pdoNum) into sendOnePDOevent (CO_Data* d, UNS8 pdoNum)
Christian Taedcke
parents: 630
diff changeset
   594
  sendOnePDOevent (d, (UNS8) pdoNum);
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   595
}
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   596
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   597
void
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   598
PDOInhibitTimerAlarm (CO_Data * d, UNS32 pdoNum)
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   599
{
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   600
  /* This is needed to avoid deletion of re-attribuated timer */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   601
  d->PDO_status[pdoNum].inhibit_timer = TIMER_NONE;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   602
  /* Remove inhibit flag */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   603
  d->PDO_status[pdoNum].transmit_type_parameter &= ~PDO_INHIBITED;
649
3beb784bacee CHANGED: - function sendOnePDOevent (CO_Data* d, UNS32 pdoNum) into sendOnePDOevent (CO_Data* d, UNS8 pdoNum)
Christian Taedcke
parents: 630
diff changeset
   604
  sendOnePDOevent (d, (UNS8) pdoNum);
235
f812bf6b7237 Preliminary implementation of Event Timer and Inhibit Timer driven TPDO
etisserant
parents: 217
diff changeset
   605
}
f812bf6b7237 Preliminary implementation of Event Timer and Inhibit Timer driven TPDO
etisserant
parents: 217
diff changeset
   606
f812bf6b7237 Preliminary implementation of Event Timer and Inhibit Timer driven TPDO
etisserant
parents: 217
diff changeset
   607
/*!
f812bf6b7237 Preliminary implementation of Event Timer and Inhibit Timer driven TPDO
etisserant
parents: 217
diff changeset
   608
**
f812bf6b7237 Preliminary implementation of Event Timer and Inhibit Timer driven TPDO
etisserant
parents: 217
diff changeset
   609
**
f812bf6b7237 Preliminary implementation of Event Timer and Inhibit Timer driven TPDO
etisserant
parents: 217
diff changeset
   610
** @param d
f812bf6b7237 Preliminary implementation of Event Timer and Inhibit Timer driven TPDO
etisserant
parents: 217
diff changeset
   611
** @param isSyncEvent
f812bf6b7237 Preliminary implementation of Event Timer and Inhibit Timer driven TPDO
etisserant
parents: 217
diff changeset
   612
**
f812bf6b7237 Preliminary implementation of Event Timer and Inhibit Timer driven TPDO
etisserant
parents: 217
diff changeset
   613
** @return
f812bf6b7237 Preliminary implementation of Event Timer and Inhibit Timer driven TPDO
etisserant
parents: 217
diff changeset
   614
**/
f812bf6b7237 Preliminary implementation of Event Timer and Inhibit Timer driven TPDO
etisserant
parents: 217
diff changeset
   615
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   616
UNS8
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   617
_sendPDOevent (CO_Data * d, UNS8 isSyncEvent)
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   618
{
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   619
  UNS8 pdoNum = 0x00;           /* number of the actual processed pdo-nr. */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   620
  UNS8 *pTransmissionType = NULL;
235
f812bf6b7237 Preliminary implementation of Event Timer and Inhibit Timer driven TPDO
etisserant
parents: 217
diff changeset
   621
  UNS8 status = state3;
f812bf6b7237 Preliminary implementation of Event Timer and Inhibit Timer driven TPDO
etisserant
parents: 217
diff changeset
   622
  UNS16 offsetObjdict = d->firstIndex->PDO_TRS;
f812bf6b7237 Preliminary implementation of Event Timer and Inhibit Timer driven TPDO
etisserant
parents: 217
diff changeset
   623
  UNS16 offsetObjdictMap = d->firstIndex->PDO_TRS_MAP;
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   624
  UNS16 lastIndex = d->lastIndex->PDO_TRS;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   625
611
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   626
  if (!d->CurrentCommunicationState.csPDO)
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   627
    {
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   628
      return 0;
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   629
    }
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   630
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   631
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   632
  /* study all PDO stored in the objects dictionary */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   633
  if (offsetObjdict)
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   634
    {
497
a040156aa72f cosmetic changes to pdo.c
etisserant
parents: 474
diff changeset
   635
      Message pdo;/* = Message_Initializer;*/
a040156aa72f cosmetic changes to pdo.c
etisserant
parents: 474
diff changeset
   636
      memset(&pdo, 0, sizeof(pdo));
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   637
      while (offsetObjdict <= lastIndex)
235
f812bf6b7237 Preliminary implementation of Event Timer and Inhibit Timer driven TPDO
etisserant
parents: 217
diff changeset
   638
        {
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   639
          switch (status)
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   640
            {
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   641
            case state3:
497
a040156aa72f cosmetic changes to pdo.c
etisserant
parents: 474
diff changeset
   642
              if ( /* bSubCount always 5 with objdictedit -> check disabled */
a040156aa72f cosmetic changes to pdo.c
etisserant
parents: 474
diff changeset
   643
                   /*d->objdict[offsetObjdict].bSubCount < 5 ||*/
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   644
                   /* check if TPDO is not valid */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   645
                   *(UNS32 *) d->objdict[offsetObjdict].pSubindex[1].
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   646
                   pObject & 0x80000000)
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   647
                {
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   648
                  MSG_WAR (0x3960, "Not a valid PDO ", 0x1800 + pdoNum);
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   649
                  /*Go next TPDO */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   650
                  status = state11;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   651
                  break;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   652
                }
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   653
              /* get the PDO transmission type */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   654
              pTransmissionType =
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   655
                (UNS8 *) d->objdict[offsetObjdict].pSubindex[2].pObject;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   656
              MSG_WAR (0x3962, "Reading PDO at index : ", 0x1800 + pdoNum);
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   657
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   658
              /* check if transmission type is SYNCRONOUS */
497
a040156aa72f cosmetic changes to pdo.c
etisserant
parents: 474
diff changeset
   659
              /* message transmited every n SYNC with n=TransmissionType */
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   660
              if (isSyncEvent &&
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   661
                  (*pTransmissionType >= TRANS_SYNC_MIN) &&
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   662
                  (*pTransmissionType <= TRANS_SYNC_MAX) &&
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   663
                  (++d->PDO_status[pdoNum].transmit_type_parameter ==
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   664
                   *pTransmissionType))
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   665
                {
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   666
                  /*Reset count of SYNC */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   667
                  d->PDO_status[pdoNum].transmit_type_parameter = 0;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   668
                  MSG_WAR (0x3964, "  PDO is on SYNCHRO. Trans type : ",
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   669
                           *pTransmissionType);
497
a040156aa72f cosmetic changes to pdo.c
etisserant
parents: 474
diff changeset
   670
                  memset(&pdo, 0, sizeof(pdo));
a040156aa72f cosmetic changes to pdo.c
etisserant
parents: 474
diff changeset
   671
                  /*{
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   672
                    Message msg_init = Message_Initializer;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   673
                    pdo = msg_init;
497
a040156aa72f cosmetic changes to pdo.c
etisserant
parents: 474
diff changeset
   674
                  }*/
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   675
                  if (buildPDO (d, pdoNum, &pdo))
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   676
                    {
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   677
                      MSG_ERR (0x1906, " Couldn't build TPDO number : ",
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   678
                               pdoNum);
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   679
                      status = state11;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   680
                      break;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   681
                    }
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   682
                  status = state5;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   683
                  /* If transmission RTR, with data sampled on SYNC */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   684
                }
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   685
              else if (isSyncEvent && (*pTransmissionType == TRANS_RTR_SYNC))
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   686
                {
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   687
                  if (buildPDO
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   688
                      (d, pdoNum, &d->PDO_status[pdoNum].last_message))
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   689
                    {
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   690
                      MSG_ERR (0x1966, " Couldn't build TPDO number : ",
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   691
                               pdoNum);
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   692
                      d->PDO_status[pdoNum].transmit_type_parameter &=
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   693
                        ~PDO_RTR_SYNC_READY;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   694
                    }
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   695
                  else
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   696
                    {
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   697
                      d->PDO_status[pdoNum].transmit_type_parameter |=
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   698
                        PDO_RTR_SYNC_READY;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   699
                    }
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   700
                  status = state11;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   701
                  break;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   702
                  /* If transmission on Event and not inhibited, check for changes */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   703
                }
426
8011552b1319 Preliminary support for TRANS_SYNC_ACYCLIC (0) transmit type.
etisserant
parents: 425
diff changeset
   704
              else
611
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   705
                if ( (isSyncEvent && (*pTransmissionType == TRANS_SYNC_ACYCLIC))
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   706
                     ||
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   707
                     (!isSyncEvent && (*pTransmissionType == TRANS_EVENT_PROFILE || *pTransmissionType == TRANS_EVENT_SPECIFIC)
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   708
                       && !(d->PDO_status[pdoNum].transmit_type_parameter & PDO_INHIBITED)))
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   709
                {
611
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   710
                  sendOnePDOevent(d, pdoNum);
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   711
                  status = state11;
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   712
                }
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   713
              else
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   714
                {
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   715
                  MSG_WAR (0x306C,
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   716
                           "  PDO is not on EVENT or synchro or not at this SYNC. Trans type : ",
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   717
                           *pTransmissionType);
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   718
                  status = state11;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   719
                }
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   720
              break;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   721
            case state5:       /*Send the pdo */
611
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   722
              sendPdo(d, pdoNum, &pdo);
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   723
              status = state11;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   724
              break;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   725
            case state11:      /*Go to next TPDO */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   726
              pdoNum++;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   727
              offsetObjdict++;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   728
              offsetObjdictMap++;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   729
              MSG_WAR (0x3970, "next pdo index : ", pdoNum);
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   730
              status = state3;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   731
              break;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   732
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   733
            default:
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   734
              MSG_ERR (0x1972, "Unknown state has been reached : %d", status);
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   735
              return 0xFF;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   736
            }                   /* end switch case */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   737
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   738
        }                       /* end while */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   739
    }
235
f812bf6b7237 Preliminary implementation of Event Timer and Inhibit Timer driven TPDO
etisserant
parents: 217
diff changeset
   740
  return 0;
f812bf6b7237 Preliminary implementation of Event Timer and Inhibit Timer driven TPDO
etisserant
parents: 217
diff changeset
   741
}
f812bf6b7237 Preliminary implementation of Event Timer and Inhibit Timer driven TPDO
etisserant
parents: 217
diff changeset
   742
236
905677ed00f3 Full preliminary implementation of TPDO transmit type:
etisserant
parents: 235
diff changeset
   743
/*!
905677ed00f3 Full preliminary implementation of TPDO transmit type:
etisserant
parents: 235
diff changeset
   744
**
905677ed00f3 Full preliminary implementation of TPDO transmit type:
etisserant
parents: 235
diff changeset
   745
**
905677ed00f3 Full preliminary implementation of TPDO transmit type:
etisserant
parents: 235
diff changeset
   746
** @param d
905677ed00f3 Full preliminary implementation of TPDO transmit type:
etisserant
parents: 235
diff changeset
   747
** @param OD_entry
524
b94067330319 1.29 Datatypes for timers
peter
parents: 497
diff changeset
   748
** @param bSubindex
236
905677ed00f3 Full preliminary implementation of TPDO transmit type:
etisserant
parents: 235
diff changeset
   749
** @return always 0
905677ed00f3 Full preliminary implementation of TPDO transmit type:
etisserant
parents: 235
diff changeset
   750
**/
905677ed00f3 Full preliminary implementation of TPDO transmit type:
etisserant
parents: 235
diff changeset
   751
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   752
UNS32
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   753
TPDO_Communication_Parameter_Callback (CO_Data * d,
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   754
                                       const indextable * OD_entry,
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   755
                                       UNS8 bSubindex)
236
905677ed00f3 Full preliminary implementation of TPDO transmit type:
etisserant
parents: 235
diff changeset
   756
{
905677ed00f3 Full preliminary implementation of TPDO transmit type:
etisserant
parents: 235
diff changeset
   757
  /* If PDO are actives */
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   758
  if (d->CurrentCommunicationState.csPDO)
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   759
    switch (bSubindex)
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   760
      {
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   761
      case 2:                  /* Changed transmition type */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   762
      case 3:                  /* Changed inhibit time */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   763
      case 5:                  /* Changed event time */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   764
        {
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   765
          const indextable *TPDO_com = d->objdict + d->firstIndex->PDO_TRS;
649
3beb784bacee CHANGED: - function sendOnePDOevent (CO_Data* d, UNS32 pdoNum) into sendOnePDOevent (CO_Data* d, UNS8 pdoNum)
Christian Taedcke
parents: 630
diff changeset
   766
          UNS8 numPdo = (UNS8) (OD_entry - TPDO_com);    /* number of the actual processed pdo-nr. */
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   767
236
905677ed00f3 Full preliminary implementation of TPDO transmit type:
etisserant
parents: 235
diff changeset
   768
          /* Zap all timers and inhibit flag */
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   769
          d->PDO_status[numPdo].event_timer =
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   770
            DelAlarm (d->PDO_status[numPdo].event_timer);
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   771
          d->PDO_status[numPdo].inhibit_timer =
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   772
            DelAlarm (d->PDO_status[numPdo].inhibit_timer);
236
905677ed00f3 Full preliminary implementation of TPDO transmit type:
etisserant
parents: 235
diff changeset
   773
          d->PDO_status[numPdo].transmit_type_parameter = 0;
905677ed00f3 Full preliminary implementation of TPDO transmit type:
etisserant
parents: 235
diff changeset
   774
          /* Call  PDOEventTimerAlarm for this TPDO, this will trigger emission et reset timers */
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   775
          PDOEventTimerAlarm (d, numPdo);
236
905677ed00f3 Full preliminary implementation of TPDO transmit type:
etisserant
parents: 235
diff changeset
   776
          return 0;
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   777
        }
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   778
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   779
      default:                 /* other subindex are ignored */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   780
        break;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   781
      }
236
905677ed00f3 Full preliminary implementation of TPDO transmit type:
etisserant
parents: 235
diff changeset
   782
  return 0;
905677ed00f3 Full preliminary implementation of TPDO transmit type:
etisserant
parents: 235
diff changeset
   783
}
905677ed00f3 Full preliminary implementation of TPDO transmit type:
etisserant
parents: 235
diff changeset
   784
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   785
void
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   786
PDOInit (CO_Data * d)
235
f812bf6b7237 Preliminary implementation of Event Timer and Inhibit Timer driven TPDO
etisserant
parents: 217
diff changeset
   787
{
236
905677ed00f3 Full preliminary implementation of TPDO transmit type:
etisserant
parents: 235
diff changeset
   788
  /* For each TPDO mapping parameters */
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   789
  UNS16 pdoIndex = 0x1800;      /* OD index of TDPO */
236
905677ed00f3 Full preliminary implementation of TPDO transmit type:
etisserant
parents: 235
diff changeset
   790
905677ed00f3 Full preliminary implementation of TPDO transmit type:
etisserant
parents: 235
diff changeset
   791
  UNS16 offsetObjdict = d->firstIndex->PDO_TRS;
905677ed00f3 Full preliminary implementation of TPDO transmit type:
etisserant
parents: 235
diff changeset
   792
  UNS16 lastIndex = d->lastIndex->PDO_TRS;
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   793
  if (offsetObjdict)
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   794
    while (offsetObjdict <= lastIndex)
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   795
      {
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   796
        /* Assign callbacks to sensible TPDO mapping subindexes */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   797
        UNS32 errorCode;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   798
        ODCallback_t *CallbackList;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   799
        /* Find callback list */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   800
        scanIndexOD (d, pdoIndex, &errorCode, &CallbackList);
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   801
        if (errorCode == OD_SUCCESSFUL && CallbackList)
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   802
          {
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   803
            /*Assign callbacks to corresponding subindex */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   804
            /* Transmission type */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   805
            CallbackList[2] = &TPDO_Communication_Parameter_Callback;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   806
            /* Inhibit time */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   807
            CallbackList[3] = &TPDO_Communication_Parameter_Callback;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   808
            /* Event timer */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   809
            CallbackList[5] = &TPDO_Communication_Parameter_Callback;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   810
          }
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   811
        pdoIndex++;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   812
        offsetObjdict++;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   813
      }
236
905677ed00f3 Full preliminary implementation of TPDO transmit type:
etisserant
parents: 235
diff changeset
   814
905677ed00f3 Full preliminary implementation of TPDO transmit type:
etisserant
parents: 235
diff changeset
   815
  /* Trigger a non-sync event */
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   816
  _sendPDOevent (d, 0);
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   817
}
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   818
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   819
void
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   820
PDOStop (CO_Data * d)
235
f812bf6b7237 Preliminary implementation of Event Timer and Inhibit Timer driven TPDO
etisserant
parents: 217
diff changeset
   821
{
236
905677ed00f3 Full preliminary implementation of TPDO transmit type:
etisserant
parents: 235
diff changeset
   822
  /* For each TPDO mapping parameters */
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   823
  UNS8 pdoNum = 0x00;           /* number of the actual processed pdo-nr. */
235
f812bf6b7237 Preliminary implementation of Event Timer and Inhibit Timer driven TPDO
etisserant
parents: 217
diff changeset
   824
  UNS16 offsetObjdict = d->firstIndex->PDO_TRS;
f812bf6b7237 Preliminary implementation of Event Timer and Inhibit Timer driven TPDO
etisserant
parents: 217
diff changeset
   825
  UNS16 lastIndex = d->lastIndex->PDO_TRS;
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   826
  if (offsetObjdict)
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   827
    while (offsetObjdict <= lastIndex)
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   828
      {
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   829
        /* Delete TPDO timers */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   830
        d->PDO_status[pdoNum].event_timer =
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   831
          DelAlarm (d->PDO_status[pdoNum].event_timer);
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   832
        d->PDO_status[pdoNum].inhibit_timer =
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   833
          DelAlarm (d->PDO_status[pdoNum].inhibit_timer);
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   834
        /* Reset transmit type parameter */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   835
        d->PDO_status[pdoNum].transmit_type_parameter = 0;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   836
        d->PDO_status[pdoNum].last_message.cob_id = 0;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   837
        pdoNum++;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   838
        offsetObjdict++;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   839
      }
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   840
}