src/pdo.c
author Mongo
Tue, 27 Mar 2012 15:29:57 +0200
changeset 718 0b33d9cdbdeb
parent 711 4b64e17396af
child 712 d1ccff139c17
permissions -rw-r--r--
Fixed : wrong parameter size
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 : ",
711
4b64e17396af minor modification on two MSG_ERR
Mongo
parents: 670
diff changeset
    92
                       (UNS32) (*pMappingParameter));
425
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;
670
e37511baf56b New feature : event timers allowed for RxPDOs (subidx 5 in RxPDO com paramaters)
Mongo
parents: 661
diff changeset
   189
  TIMEVAL EventTimerDuration = 0;
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   190
235
f812bf6b7237 Preliminary implementation of Event Timer and Inhibit Timer driven TPDO
etisserant
parents: 217
diff changeset
   191
  status = state2;
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   192
447
c9d01296d6d9 Endianess patch from Edward Karpicz, Lithuania :-)
etisserant
parents: 428
diff changeset
   193
  MSG_WAR (0x3935, "proceedPDO, cobID : ", (UNS16_LE(m->cob_id) & 0x7ff));
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   194
  offset = 0x00;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   195
  numPdo = 0;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   196
  numMap = 0;
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   197
  if ((*m).rtr == NOT_A_REQUEST)
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   198
    {                           /* The PDO received is not a
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   199
                                   request. */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   200
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   201
      offsetObjdict = d->firstIndex->PDO_RCV;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   202
      lastIndex = d->lastIndex->PDO_RCV;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   203
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   204
      /* study of all the PDO stored in the dictionary */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   205
      if (offsetObjdict)
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   206
        while (offsetObjdict <= lastIndex)
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   207
          {
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   208
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   209
            switch (status)
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   210
              {
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   211
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   212
              case state2:
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   213
                /* get CobId of the dictionary correspondant to the received
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   214
                   PDO */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   215
                pwCobId =
447
c9d01296d6d9 Endianess patch from Edward Karpicz, Lithuania :-)
etisserant
parents: 428
diff changeset
   216
                  d->objdict[offsetObjdict].pSubindex[1].pObject;
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   217
                /* check the CobId coherance */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   218
                /*pwCobId is the cobId read in the dictionary at the state 3
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   219
                 */
447
c9d01296d6d9 Endianess patch from Edward Karpicz, Lithuania :-)
etisserant
parents: 428
diff changeset
   220
                if (*pwCobId == UNS16_LE(m->cob_id))
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   221
                  {
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   222
                    /* The cobId is recognized */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   223
                    status = state4;
670
e37511baf56b New feature : event timers allowed for RxPDOs (subidx 5 in RxPDO com paramaters)
Mongo
parents: 661
diff changeset
   224
                    EventTimerDuration = *(UNS16 *)d->objdict[offsetObjdict].pSubindex[5].pObject;
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   225
                    MSG_WAR (0x3936, "cobId found at index ",
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   226
                             0x1400 + numPdo);
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   227
                    break;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   228
                  }
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   229
                else
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   230
                  {
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   231
                    /* cobId received does not match with those write in the
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   232
                       dictionnary */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   233
                    numPdo++;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   234
                    offsetObjdict++;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   235
                    status = state2;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   236
                    break;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   237
                  }
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   238
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   239
              case state4:     /* Get Mapped Objects Number */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   240
                /* The cobId of the message received has been found in the
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   241
                   dictionnary. */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   242
                offsetObjdict = d->firstIndex->PDO_RCV_MAP;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   243
                lastIndex = d->lastIndex->PDO_RCV_MAP;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   244
                pMappingCount =
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   245
                  (UNS8 *) (d->objdict + offsetObjdict +
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   246
                            numPdo)->pSubindex[0].pObject;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   247
                numMap = 0;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   248
                while (numMap < *pMappingCount)
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   249
                  {
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   250
                    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
   251
                    UNS32 ByteSize;
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   252
                    pMappingParameter =
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   253
                      (UNS32 *) (d->objdict + offsetObjdict +
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   254
                                 numPdo)->pSubindex[numMap + 1].pObject;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   255
                    if (pMappingParameter == NULL)
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   256
                      {
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   257
                        MSG_ERR (0x1937, "Couldn't get mapping parameter : ",
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   258
                                 numMap + 1);
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   259
                        return 0xFF;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   260
                      }
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   261
                    /* Get the addresse of the mapped variable. */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   262
                    /* detail of *pMappingParameter : */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   263
                    /* The 16 hight bits contains the index, the medium 8 bits
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   264
                       contains the subindex, */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   265
                    /* and the lower 8 bits contains the size of the mapped
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   266
                       variable. */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   267
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   268
                    Size = (UNS8) (*pMappingParameter & (UNS32) 0x000000FF);
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   269
497
a040156aa72f cosmetic changes to pdo.c
etisserant
parents: 474
diff changeset
   270
                    /* set variable only if Size != 0 and 
a040156aa72f cosmetic changes to pdo.c
etisserant
parents: 474
diff changeset
   271
                     * Size is lower than remaining bits in the PDO */
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   272
                    if (Size && ((offset + Size) <= (m->len << 3)))
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   273
                      {
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   274
                        /* copy bit per bit in little endian */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   275
                        CopyBits (Size, (UNS8 *) & m->data[offset >> 3],
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   276
                                  offset % 8, 0, ((UNS8 *) tmp), 0, 0);
497
a040156aa72f cosmetic changes to pdo.c
etisserant
parents: 474
diff changeset
   277
                        /*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
   278
                        ByteSize = (UNS32)(1 + ((Size - 1) >> 3));
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   279
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   280
                        objDict =
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   281
                          setODentry (d, (UNS16) ((*pMappingParameter) >> 16),
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   282
                                      (UNS8) (((*pMappingParameter) >> 8) &
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   283
                                              0xFF), tmp, &ByteSize, 0);
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   284
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   285
                        if (objDict != OD_SUCCESSFUL)
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   286
                          {
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   287
                            MSG_ERR (0x1938,
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   288
                                     "error accessing to the mapped var : ",
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   289
                                     numMap + 1);
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   290
                            MSG_WAR (0x2939, "         Mapped at index : ",
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   291
                                     (*pMappingParameter) >> 16);
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   292
                            MSG_WAR (0x2940, "                subindex : ",
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   293
                                     ((*pMappingParameter) >> 8) & 0xFF);
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   294
                            return 0xFF;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   295
                          }
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   296
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   297
                        MSG_WAR (0x3942,
497
a040156aa72f cosmetic changes to pdo.c
etisserant
parents: 474
diff changeset
   298
                                 "Variable updated by PDO cobid : ",
447
c9d01296d6d9 Endianess patch from Edward Karpicz, Lithuania :-)
etisserant
parents: 428
diff changeset
   299
                                 UNS16_LE(m->cob_id));
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   300
                        MSG_WAR (0x3943, "         Mapped at index : ",
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   301
                                 (*pMappingParameter) >> 16);
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   302
                        MSG_WAR (0x3944, "                subindex : ",
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   303
                                 ((*pMappingParameter) >> 8) & 0xFF);
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   304
                        offset += Size;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   305
                      }
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   306
                    numMap++;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   307
                  }             /* end loop while on mapped variables */
670
e37511baf56b New feature : event timers allowed for RxPDOs (subidx 5 in RxPDO com paramaters)
Mongo
parents: 661
diff changeset
   308
                if (EventTimerDuration && d->RxPDO_EventTimers)
e37511baf56b New feature : event timers allowed for RxPDOs (subidx 5 in RxPDO com paramaters)
Mongo
parents: 661
diff changeset
   309
                {
e37511baf56b New feature : event timers allowed for RxPDOs (subidx 5 in RxPDO com paramaters)
Mongo
parents: 661
diff changeset
   310
                    DelAlarm (d->RxPDO_EventTimers[numPdo]);
e37511baf56b New feature : event timers allowed for RxPDOs (subidx 5 in RxPDO com paramaters)
Mongo
parents: 661
diff changeset
   311
                    d->RxPDO_EventTimers[numPdo] = SetAlarm (d, numPdo, d->RxPDO_EventTimers_Handler,
e37511baf56b New feature : event timers allowed for RxPDOs (subidx 5 in RxPDO com paramaters)
Mongo
parents: 661
diff changeset
   312
                    MS_TO_TIMEVAL (EventTimerDuration), 0);
e37511baf56b New feature : event timers allowed for RxPDOs (subidx 5 in RxPDO com paramaters)
Mongo
parents: 661
diff changeset
   313
                }
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   314
                return 0;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   315
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   316
              }                 /* end switch status */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   317
          }                     /* end while */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   318
    }                           /* end if Donnees */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   319
  else if ((*m).rtr == REQUEST)
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   320
    {
447
c9d01296d6d9 Endianess patch from Edward Karpicz, Lithuania :-)
etisserant
parents: 428
diff changeset
   321
      MSG_WAR (0x3946, "Receive a PDO request cobId : ", UNS16_LE(m->cob_id));
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   322
      status = state1;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   323
      offsetObjdict = d->firstIndex->PDO_TRS;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   324
      lastIndex = d->lastIndex->PDO_TRS;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   325
      if (offsetObjdict)
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   326
        while (offsetObjdict <= lastIndex)
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   327
          {
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   328
            /* study of all PDO stored in the objects dictionary */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   329
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   330
            switch (status)
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   331
              {
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   332
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   333
              case state1:     /* check the CobId */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   334
                /* get CobId of the dictionary which match to the received PDO
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   335
                 */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   336
                pwCobId =
447
c9d01296d6d9 Endianess patch from Edward Karpicz, Lithuania :-)
etisserant
parents: 428
diff changeset
   337
                   (d->objdict +
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   338
                             offsetObjdict)->pSubindex[1].pObject;
447
c9d01296d6d9 Endianess patch from Edward Karpicz, Lithuania :-)
etisserant
parents: 428
diff changeset
   339
                if (*pwCobId == UNS16_LE(m->cob_id))
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   340
                  {
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   341
                    status = state4;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   342
                    break;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   343
                  }
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   344
                else
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   345
                  {
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   346
                    numPdo++;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   347
                    offsetObjdict++;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   348
                  }
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   349
                status = state1;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   350
                break;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   351
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   352
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   353
              case state4:     /* check transmission type */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   354
                pTransmissionType =
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   355
                  (UNS8 *) d->objdict[offsetObjdict].pSubindex[2].pObject;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   356
                /* If PDO is to be sampled and send on RTR, do it */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   357
                if ((*pTransmissionType == TRANS_RTR))
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   358
                  {
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   359
                    status = state5;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   360
                    break;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   361
                  }
497
a040156aa72f cosmetic changes to pdo.c
etisserant
parents: 474
diff changeset
   362
                /* RTR_SYNC means data prepared at SYNC, transmitted on RTR */
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   363
                else if ((*pTransmissionType == TRANS_RTR_SYNC))
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   364
                  {
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   365
                    if (d->PDO_status[numPdo].
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   366
                        transmit_type_parameter & PDO_RTR_SYNC_READY)
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   367
                      {
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   368
                        /*Data ready, just send */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   369
                        canSend (d->canHandle,
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   370
                                 &d->PDO_status[numPdo].last_message);
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   371
                        return 0;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   372
                      }
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   373
                    else
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   374
                      {
497
a040156aa72f cosmetic changes to pdo.c
etisserant
parents: 474
diff changeset
   375
                        /* if SYNC did never occur, transmit current data */
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   376
                        /* DS301 do not tell what to do in such a case... */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   377
                        MSG_ERR (0x1947,
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   378
                                 "Not ready RTR_SYNC TPDO send current data : ",
447
c9d01296d6d9 Endianess patch from Edward Karpicz, Lithuania :-)
etisserant
parents: 428
diff changeset
   379
                                 UNS16_LE(m->cob_id));
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   380
                        status = state5;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   381
                      }
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   382
                    break;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   383
                  }
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   384
                else if ((*pTransmissionType == TRANS_EVENT_PROFILE) ||
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   385
                         (*pTransmissionType == TRANS_EVENT_SPECIFIC))
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   386
                  {
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   387
                    /* Zap all timers and inhibit flag */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   388
                    d->PDO_status[numPdo].event_timer =
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   389
                      DelAlarm (d->PDO_status[numPdo].event_timer);
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   390
                    d->PDO_status[numPdo].inhibit_timer =
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   391
                      DelAlarm (d->PDO_status[numPdo].inhibit_timer);
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   392
                    d->PDO_status[numPdo].transmit_type_parameter &=
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   393
                      ~PDO_INHIBITED;
497
a040156aa72f cosmetic changes to pdo.c
etisserant
parents: 474
diff changeset
   394
                    /* Call  PDOEventTimerAlarm for this TPDO, 
a040156aa72f cosmetic changes to pdo.c
etisserant
parents: 474
diff changeset
   395
                     * this will trigger emission et reset timers */
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   396
                    PDOEventTimerAlarm (d, numPdo);
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   397
                    return 0;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   398
                  }
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   399
                else
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   400
                  {
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   401
                    /* The requested PDO is not to send on request. So, does
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   402
                       nothing. */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   403
                    MSG_WAR (0x2947, "PDO is not to send on request : ",
447
c9d01296d6d9 Endianess patch from Edward Karpicz, Lithuania :-)
etisserant
parents: 428
diff changeset
   404
                             UNS16_LE(m->cob_id));
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   405
                    return 0xFF;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   406
                  }
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   407
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   408
              case state5:     /* build and send requested PDO */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   409
                {
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   410
                  Message pdo;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   411
                  if (buildPDO (d, numPdo, &pdo))
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   412
                    {
447
c9d01296d6d9 Endianess patch from Edward Karpicz, Lithuania :-)
etisserant
parents: 428
diff changeset
   413
                      MSG_ERR (0x1948, " Couldn't build TPDO n�", numPdo);
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   414
                      return 0xFF;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   415
                    }
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   416
                  canSend (d->canHandle, &pdo);
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   417
                  return 0;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   418
                }
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   419
              }                 /* end switch status */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   420
          }                     /* end while */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   421
    }                           /* end if Requete */
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   422
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   423
  return 0;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   424
}
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   425
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   426
/*!
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   427
**
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   428
**
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   429
** @param NbBits
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   430
** @param SrcByteIndex
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   431
** @param SrcBitIndex
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   432
** @param SrcBigEndian
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   433
** @param DestByteIndex
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   434
** @param DestBitIndex
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   435
** @param DestBigEndian
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   436
**/
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   437
void
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   438
CopyBits (UNS8 NbBits, UNS8 * SrcByteIndex, UNS8 SrcBitIndex,
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   439
          UNS8 SrcBigEndian, UNS8 * DestByteIndex, UNS8 DestBitIndex,
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   440
          UNS8 DestBigEndian)
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   441
{
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   442
  /* This loop copy as many bits that it can each time, crossing */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   443
  /* successively bytes */
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   444
  // boundaries from LSB to MSB.
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   445
  while (NbBits > 0)
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   446
    {
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   447
      /* Bit missalignement between src and dest */
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   448
      INTEGER8 Vect = DestBitIndex - SrcBitIndex;
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   449
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   450
      /* We can now get src and align it to dest */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   451
      UNS8 Aligned =
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   452
        Vect > 0 ? *SrcByteIndex << Vect : *SrcByteIndex >> -Vect;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   453
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   454
      /* Compute the nb of bit we will be able to copy */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   455
      UNS8 BoudaryLimit = (Vect > 0 ? 8 - DestBitIndex : 8 - SrcBitIndex);
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   456
      UNS8 BitsToCopy = BoudaryLimit > NbBits ? NbBits : BoudaryLimit;
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   457
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   458
      /* Create a mask that will serve in: */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   459
      UNS8 Mask =
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   460
        ((0xff << (DestBitIndex + BitsToCopy)) |
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   461
         (0xff >> (8 - DestBitIndex)));
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   462
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   463
      /* - Filtering src */
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   464
      UNS8 Filtered = Aligned & ~Mask;
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   465
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   466
      /* - and erase bits where we write, preserve where we don't */
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   467
      *DestByteIndex &= Mask;
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   468
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   469
      /* Then write. */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   470
      *DestByteIndex |= Filtered;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   471
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   472
      /*Compute next time cursors for src */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   473
      if ((SrcBitIndex += BitsToCopy) > 7)      /* cross boundary ? */
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   474
        {
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   475
          SrcBitIndex = 0;      /* First bit */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   476
          SrcByteIndex += (SrcBigEndian ? -1 : 1);      /* Next byte */
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   477
        }
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
      /*Compute next time cursors for dest */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   481
      if ((DestBitIndex += BitsToCopy) > 7)
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   482
        {
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   483
          DestBitIndex = 0;     /* First bit */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   484
          DestByteIndex += (DestBigEndian ? -1 : 1);    /* Next byte */
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   485
        }
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   486
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   487
      /*And decrement counter. */
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   488
      NbBits -= BitsToCopy;
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   489
    }
201
2966cd34162a Boolean variable mapped in PDO
greg
parents: 149
diff changeset
   490
2966cd34162a Boolean variable mapped in PDO
greg
parents: 149
diff changeset
   491
}
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   492
611
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   493
static void sendPdo(CO_Data * d, UNS32 pdoNum, Message * 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
  /*store_as_last_message */
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   496
  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
   497
  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
   498
  MSG_WAR (0x396E, "     Nb octets  : ", pdo->len);
611
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   499
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   500
  canSend (d->canHandle, pdo);
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   501
}
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   502
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   503
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   504
/*!
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   505
**
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   506
**
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   507
** @param d
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   508
**
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   509
** @return
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 204
diff changeset
   510
**/
235
f812bf6b7237 Preliminary implementation of Event Timer and Inhibit Timer driven TPDO
etisserant
parents: 217
diff changeset
   511
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   512
UNS8
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   513
sendPDOevent (CO_Data * d)
235
f812bf6b7237 Preliminary implementation of Event Timer and Inhibit Timer driven TPDO
etisserant
parents: 217
diff changeset
   514
{
f812bf6b7237 Preliminary implementation of Event Timer and Inhibit Timer driven TPDO
etisserant
parents: 217
diff changeset
   515
  /* Calls _sendPDOevent specifying it is not a sync event */
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   516
  return _sendPDOevent (d, 0);
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   517
}
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   518
611
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   519
UNS8
649
3beb784bacee CHANGED: - function sendOnePDOevent (CO_Data* d, UNS32 pdoNum) into sendOnePDOevent (CO_Data* d, UNS8 pdoNum)
Christian Taedcke
parents: 630
diff changeset
   520
sendOnePDOevent (CO_Data * d, UNS8 pdoNum)
611
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   521
{
629
b9274b595650 CosateQ contribution.
edouard
parents: 626
diff changeset
   522
  UNS16 offsetObjdict;
b9274b595650 CosateQ contribution.
edouard
parents: 626
diff changeset
   523
  Message pdo;
611
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   524
  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
   525
      (d->PDO_status[pdoNum].transmit_type_parameter & PDO_INHIBITED))
611
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   526
    {
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   527
      return 0;
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   528
    }
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   529
649
3beb784bacee CHANGED: - function sendOnePDOevent (CO_Data* d, UNS32 pdoNum) into sendOnePDOevent (CO_Data* d, UNS8 pdoNum)
Christian Taedcke
parents: 630
diff changeset
   530
  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
   531
611
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   532
  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
   533
           *((UNS8 *) d->objdict[offsetObjdict].pSubindex[2].pObject));
629
b9274b595650 CosateQ contribution.
edouard
parents: 626
diff changeset
   534
  
611
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   535
  memset(&pdo, 0, sizeof(pdo));
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   536
  if (buildPDO (d, pdoNum, &pdo))
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   537
    {
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   538
      MSG_ERR (0x3907, " Couldn't build TPDO number : ",
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   539
               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
   540
      return 0;
611
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
  /*Compare new and old PDO */
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   544
  if (d->PDO_status[pdoNum].last_message.cob_id == pdo.cob_id
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   545
      && d->PDO_status[pdoNum].last_message.len == pdo.len
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   546
      && memcmp(d->PDO_status[pdoNum].last_message.data,
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   547
					pdo.data, 8) == 0
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   548
    )
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   549
    {
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   550
      /* 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
   551
      return 0;
611
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   552
    }
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   553
  else
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   554
    {
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   555
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   556
      TIMEVAL EventTimerDuration;
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   557
      TIMEVAL InhibitTimerDuration;
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   558
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   559
      MSG_WAR (0x306A, "Changes TPDO number : ", pdoNum);
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   560
      /* Changes detected -> transmit message */
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   561
      EventTimerDuration =
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   562
        *(UNS16 *) d->objdict[offsetObjdict].pSubindex[5].
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   563
        pObject;
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   564
      InhibitTimerDuration =
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   565
        *(UNS16 *) d->objdict[offsetObjdict].pSubindex[3].
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   566
        pObject;
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   567
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   568
      /* Start both event_timer and inhibit_timer */
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   569
      if (EventTimerDuration)
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   570
        {
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   571
          DelAlarm (d->PDO_status[pdoNum].event_timer);
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   572
          d->PDO_status[pdoNum].event_timer =
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   573
            SetAlarm (d, pdoNum, &PDOEventTimerAlarm,
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   574
                      MS_TO_TIMEVAL (EventTimerDuration), 0);
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   575
        }
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   576
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   577
      if (InhibitTimerDuration)
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   578
        {
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   579
          DelAlarm (d->PDO_status[pdoNum].inhibit_timer);
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   580
          d->PDO_status[pdoNum].inhibit_timer =
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   581
            SetAlarm (d, pdoNum, &PDOInhibitTimerAlarm,
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   582
                      US_TO_TIMEVAL (InhibitTimerDuration *
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   583
                                     100), 0);
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   584
          /* and inhibit TPDO */
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   585
          d->PDO_status[pdoNum].transmit_type_parameter |=
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   586
            PDO_INHIBITED;
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   587
        }
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   588
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   589
      sendPdo(d, pdoNum, &pdo);
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   590
    }
619
96f84395154f Enhancements for 'None' target : produce pre-linked object, remove some windows CRLF problems, fixed pedantic compiler warnings
edouard
parents: 611
diff changeset
   591
    return 1;
611
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   592
}
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   593
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   594
void
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   595
PDOEventTimerAlarm (CO_Data * d, UNS32 pdoNum)
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   596
{
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   597
  /* This is needed to avoid deletion of re-attribuated timer */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   598
  d->PDO_status[pdoNum].event_timer = TIMER_NONE;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   599
  /* force emission of PDO by artificially changing last emitted */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   600
  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
   601
  sendOnePDOevent (d, (UNS8) pdoNum);
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   602
}
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   603
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   604
void
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   605
PDOInhibitTimerAlarm (CO_Data * d, UNS32 pdoNum)
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   606
{
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   607
  /* This is needed to avoid deletion of re-attribuated timer */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   608
  d->PDO_status[pdoNum].inhibit_timer = TIMER_NONE;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   609
  /* Remove inhibit flag */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   610
  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
   611
  sendOnePDOevent (d, (UNS8) pdoNum);
235
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
670
e37511baf56b New feature : event timers allowed for RxPDOs (subidx 5 in RxPDO com paramaters)
Mongo
parents: 661
diff changeset
   614
void
e37511baf56b New feature : event timers allowed for RxPDOs (subidx 5 in RxPDO com paramaters)
Mongo
parents: 661
diff changeset
   615
_RxPDO_EventTimers_Handler(CO_Data *d, UNS32 pdoNum)
e37511baf56b New feature : event timers allowed for RxPDOs (subidx 5 in RxPDO com paramaters)
Mongo
parents: 661
diff changeset
   616
{
e37511baf56b New feature : event timers allowed for RxPDOs (subidx 5 in RxPDO com paramaters)
Mongo
parents: 661
diff changeset
   617
}
e37511baf56b New feature : event timers allowed for RxPDOs (subidx 5 in RxPDO com paramaters)
Mongo
parents: 661
diff changeset
   618
235
f812bf6b7237 Preliminary implementation of Event Timer and Inhibit Timer driven TPDO
etisserant
parents: 217
diff changeset
   619
/*!
f812bf6b7237 Preliminary implementation of Event Timer and Inhibit Timer driven TPDO
etisserant
parents: 217
diff changeset
   620
**
f812bf6b7237 Preliminary implementation of Event Timer and Inhibit Timer driven TPDO
etisserant
parents: 217
diff changeset
   621
**
f812bf6b7237 Preliminary implementation of Event Timer and Inhibit Timer driven TPDO
etisserant
parents: 217
diff changeset
   622
** @param d
f812bf6b7237 Preliminary implementation of Event Timer and Inhibit Timer driven TPDO
etisserant
parents: 217
diff changeset
   623
** @param isSyncEvent
f812bf6b7237 Preliminary implementation of Event Timer and Inhibit Timer driven TPDO
etisserant
parents: 217
diff changeset
   624
**
f812bf6b7237 Preliminary implementation of Event Timer and Inhibit Timer driven TPDO
etisserant
parents: 217
diff changeset
   625
** @return
f812bf6b7237 Preliminary implementation of Event Timer and Inhibit Timer driven TPDO
etisserant
parents: 217
diff changeset
   626
**/
f812bf6b7237 Preliminary implementation of Event Timer and Inhibit Timer driven TPDO
etisserant
parents: 217
diff changeset
   627
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   628
UNS8
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   629
_sendPDOevent (CO_Data * d, UNS8 isSyncEvent)
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   630
{
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   631
  UNS8 pdoNum = 0x00;           /* number of the actual processed pdo-nr. */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   632
  UNS8 *pTransmissionType = NULL;
235
f812bf6b7237 Preliminary implementation of Event Timer and Inhibit Timer driven TPDO
etisserant
parents: 217
diff changeset
   633
  UNS8 status = state3;
f812bf6b7237 Preliminary implementation of Event Timer and Inhibit Timer driven TPDO
etisserant
parents: 217
diff changeset
   634
  UNS16 offsetObjdict = d->firstIndex->PDO_TRS;
f812bf6b7237 Preliminary implementation of Event Timer and Inhibit Timer driven TPDO
etisserant
parents: 217
diff changeset
   635
  UNS16 offsetObjdictMap = d->firstIndex->PDO_TRS_MAP;
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   636
  UNS16 lastIndex = d->lastIndex->PDO_TRS;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   637
611
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   638
  if (!d->CurrentCommunicationState.csPDO)
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   639
    {
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   640
      return 0;
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   641
    }
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   642
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   643
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   644
  /* study all PDO stored in the objects dictionary */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   645
  if (offsetObjdict)
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   646
    {
497
a040156aa72f cosmetic changes to pdo.c
etisserant
parents: 474
diff changeset
   647
      Message pdo;/* = Message_Initializer;*/
a040156aa72f cosmetic changes to pdo.c
etisserant
parents: 474
diff changeset
   648
      memset(&pdo, 0, sizeof(pdo));
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   649
      while (offsetObjdict <= lastIndex)
235
f812bf6b7237 Preliminary implementation of Event Timer and Inhibit Timer driven TPDO
etisserant
parents: 217
diff changeset
   650
        {
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   651
          switch (status)
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   652
            {
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   653
            case state3:
497
a040156aa72f cosmetic changes to pdo.c
etisserant
parents: 474
diff changeset
   654
              if ( /* bSubCount always 5 with objdictedit -> check disabled */
a040156aa72f cosmetic changes to pdo.c
etisserant
parents: 474
diff changeset
   655
                   /*d->objdict[offsetObjdict].bSubCount < 5 ||*/
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   656
                   /* check if TPDO is not valid */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   657
                   *(UNS32 *) d->objdict[offsetObjdict].pSubindex[1].
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   658
                   pObject & 0x80000000)
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   659
                {
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   660
                  MSG_WAR (0x3960, "Not a valid PDO ", 0x1800 + pdoNum);
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   661
                  /*Go next TPDO */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   662
                  status = state11;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   663
                  break;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   664
                }
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   665
              /* get the PDO transmission type */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   666
              pTransmissionType =
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   667
                (UNS8 *) d->objdict[offsetObjdict].pSubindex[2].pObject;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   668
              MSG_WAR (0x3962, "Reading PDO at index : ", 0x1800 + pdoNum);
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   669
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   670
              /* check if transmission type is SYNCRONOUS */
497
a040156aa72f cosmetic changes to pdo.c
etisserant
parents: 474
diff changeset
   671
              /* message transmited every n SYNC with n=TransmissionType */
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   672
              if (isSyncEvent &&
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   673
                  (*pTransmissionType >= TRANS_SYNC_MIN) &&
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   674
                  (*pTransmissionType <= TRANS_SYNC_MAX) &&
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   675
                  (++d->PDO_status[pdoNum].transmit_type_parameter ==
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   676
                   *pTransmissionType))
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   677
                {
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   678
                  /*Reset count of SYNC */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   679
                  d->PDO_status[pdoNum].transmit_type_parameter = 0;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   680
                  MSG_WAR (0x3964, "  PDO is on SYNCHRO. Trans type : ",
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   681
                           *pTransmissionType);
497
a040156aa72f cosmetic changes to pdo.c
etisserant
parents: 474
diff changeset
   682
                  memset(&pdo, 0, sizeof(pdo));
a040156aa72f cosmetic changes to pdo.c
etisserant
parents: 474
diff changeset
   683
                  /*{
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   684
                    Message msg_init = Message_Initializer;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   685
                    pdo = msg_init;
497
a040156aa72f cosmetic changes to pdo.c
etisserant
parents: 474
diff changeset
   686
                  }*/
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   687
                  if (buildPDO (d, pdoNum, &pdo))
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   688
                    {
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   689
                      MSG_ERR (0x1906, " Couldn't build TPDO number : ",
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   690
                               pdoNum);
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   691
                      status = state11;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   692
                      break;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   693
                    }
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   694
                  status = state5;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   695
                  /* If transmission RTR, with data sampled on SYNC */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   696
                }
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   697
              else if (isSyncEvent && (*pTransmissionType == TRANS_RTR_SYNC))
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   698
                {
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   699
                  if (buildPDO
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   700
                      (d, pdoNum, &d->PDO_status[pdoNum].last_message))
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   701
                    {
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   702
                      MSG_ERR (0x1966, " Couldn't build TPDO number : ",
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   703
                               pdoNum);
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   704
                      d->PDO_status[pdoNum].transmit_type_parameter &=
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   705
                        ~PDO_RTR_SYNC_READY;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   706
                    }
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   707
                  else
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   708
                    {
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   709
                      d->PDO_status[pdoNum].transmit_type_parameter |=
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   710
                        PDO_RTR_SYNC_READY;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   711
                    }
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   712
                  status = state11;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   713
                  break;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   714
                  /* If transmission on Event and not inhibited, check for changes */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   715
                }
426
8011552b1319 Preliminary support for TRANS_SYNC_ACYCLIC (0) transmit type.
etisserant
parents: 425
diff changeset
   716
              else
611
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   717
                if ( (isSyncEvent && (*pTransmissionType == TRANS_SYNC_ACYCLIC))
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   718
                     ||
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   719
                     (!isSyncEvent && (*pTransmissionType == TRANS_EVENT_PROFILE || *pTransmissionType == TRANS_EVENT_SPECIFIC)
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   720
                       && !(d->PDO_status[pdoNum].transmit_type_parameter & PDO_INHIBITED)))
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   721
                {
611
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   722
                  sendOnePDOevent(d, pdoNum);
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   723
                  status = state11;
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   724
                }
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   725
              else
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   726
                {
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   727
                  MSG_WAR (0x306C,
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   728
                           "  PDO is not on EVENT or synchro or not at this SYNC. Trans type : ",
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   729
                           *pTransmissionType);
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   730
                  status = state11;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   731
                }
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   732
              break;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   733
            case state5:       /*Send the pdo */
611
3e0c776da33b Extended PDO API with SendOnePDOEvent
edouard
parents: 587
diff changeset
   734
              sendPdo(d, pdoNum, &pdo);
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   735
              status = state11;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   736
              break;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   737
            case state11:      /*Go to next TPDO */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   738
              pdoNum++;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   739
              offsetObjdict++;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   740
              offsetObjdictMap++;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   741
              MSG_WAR (0x3970, "next pdo index : ", pdoNum);
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   742
              status = state3;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   743
              break;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   744
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   745
            default:
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   746
              MSG_ERR (0x1972, "Unknown state has been reached : %d", status);
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   747
              return 0xFF;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   748
            }                   /* end switch case */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   749
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   750
        }                       /* end while */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   751
    }
235
f812bf6b7237 Preliminary implementation of Event Timer and Inhibit Timer driven TPDO
etisserant
parents: 217
diff changeset
   752
  return 0;
f812bf6b7237 Preliminary implementation of Event Timer and Inhibit Timer driven TPDO
etisserant
parents: 217
diff changeset
   753
}
f812bf6b7237 Preliminary implementation of Event Timer and Inhibit Timer driven TPDO
etisserant
parents: 217
diff changeset
   754
236
905677ed00f3 Full preliminary implementation of TPDO transmit type:
etisserant
parents: 235
diff changeset
   755
/*!
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
**
905677ed00f3 Full preliminary implementation of TPDO transmit type:
etisserant
parents: 235
diff changeset
   758
** @param d
905677ed00f3 Full preliminary implementation of TPDO transmit type:
etisserant
parents: 235
diff changeset
   759
** @param OD_entry
524
b94067330319 1.29 Datatypes for timers
peter
parents: 497
diff changeset
   760
** @param bSubindex
236
905677ed00f3 Full preliminary implementation of TPDO transmit type:
etisserant
parents: 235
diff changeset
   761
** @return always 0
905677ed00f3 Full preliminary implementation of TPDO transmit type:
etisserant
parents: 235
diff changeset
   762
**/
905677ed00f3 Full preliminary implementation of TPDO transmit type:
etisserant
parents: 235
diff changeset
   763
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   764
UNS32
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   765
TPDO_Communication_Parameter_Callback (CO_Data * d,
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   766
                                       const indextable * OD_entry,
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   767
                                       UNS8 bSubindex)
236
905677ed00f3 Full preliminary implementation of TPDO transmit type:
etisserant
parents: 235
diff changeset
   768
{
905677ed00f3 Full preliminary implementation of TPDO transmit type:
etisserant
parents: 235
diff changeset
   769
  /* If PDO are actives */
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   770
  if (d->CurrentCommunicationState.csPDO)
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   771
    switch (bSubindex)
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   772
      {
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   773
      case 2:                  /* Changed transmition type */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   774
      case 3:                  /* Changed inhibit time */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   775
      case 5:                  /* Changed event time */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   776
        {
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   777
          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
   778
          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
   779
236
905677ed00f3 Full preliminary implementation of TPDO transmit type:
etisserant
parents: 235
diff changeset
   780
          /* Zap all timers and inhibit flag */
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   781
          d->PDO_status[numPdo].event_timer =
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   782
            DelAlarm (d->PDO_status[numPdo].event_timer);
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   783
          d->PDO_status[numPdo].inhibit_timer =
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   784
            DelAlarm (d->PDO_status[numPdo].inhibit_timer);
236
905677ed00f3 Full preliminary implementation of TPDO transmit type:
etisserant
parents: 235
diff changeset
   785
          d->PDO_status[numPdo].transmit_type_parameter = 0;
905677ed00f3 Full preliminary implementation of TPDO transmit type:
etisserant
parents: 235
diff changeset
   786
          /* Call  PDOEventTimerAlarm for this TPDO, this will trigger emission et reset timers */
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   787
          PDOEventTimerAlarm (d, numPdo);
236
905677ed00f3 Full preliminary implementation of TPDO transmit type:
etisserant
parents: 235
diff changeset
   788
          return 0;
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   789
        }
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   790
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   791
      default:                 /* other subindex are ignored */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   792
        break;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   793
      }
236
905677ed00f3 Full preliminary implementation of TPDO transmit type:
etisserant
parents: 235
diff changeset
   794
  return 0;
905677ed00f3 Full preliminary implementation of TPDO transmit type:
etisserant
parents: 235
diff changeset
   795
}
905677ed00f3 Full preliminary implementation of TPDO transmit type:
etisserant
parents: 235
diff changeset
   796
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   797
void
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   798
PDOInit (CO_Data * d)
235
f812bf6b7237 Preliminary implementation of Event Timer and Inhibit Timer driven TPDO
etisserant
parents: 217
diff changeset
   799
{
236
905677ed00f3 Full preliminary implementation of TPDO transmit type:
etisserant
parents: 235
diff changeset
   800
  /* For each TPDO mapping parameters */
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   801
  UNS16 pdoIndex = 0x1800;      /* OD index of TDPO */
236
905677ed00f3 Full preliminary implementation of TPDO transmit type:
etisserant
parents: 235
diff changeset
   802
905677ed00f3 Full preliminary implementation of TPDO transmit type:
etisserant
parents: 235
diff changeset
   803
  UNS16 offsetObjdict = d->firstIndex->PDO_TRS;
905677ed00f3 Full preliminary implementation of TPDO transmit type:
etisserant
parents: 235
diff changeset
   804
  UNS16 lastIndex = d->lastIndex->PDO_TRS;
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   805
  if (offsetObjdict)
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   806
    while (offsetObjdict <= lastIndex)
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   807
      {
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   808
        /* Assign callbacks to sensible TPDO mapping subindexes */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   809
        UNS32 errorCode;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   810
        ODCallback_t *CallbackList;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   811
        /* Find callback list */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   812
        scanIndexOD (d, pdoIndex, &errorCode, &CallbackList);
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   813
        if (errorCode == OD_SUCCESSFUL && CallbackList)
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   814
          {
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   815
            /*Assign callbacks to corresponding subindex */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   816
            /* Transmission type */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   817
            CallbackList[2] = &TPDO_Communication_Parameter_Callback;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   818
            /* Inhibit time */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   819
            CallbackList[3] = &TPDO_Communication_Parameter_Callback;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   820
            /* Event timer */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   821
            CallbackList[5] = &TPDO_Communication_Parameter_Callback;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   822
          }
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   823
        pdoIndex++;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   824
        offsetObjdict++;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   825
      }
236
905677ed00f3 Full preliminary implementation of TPDO transmit type:
etisserant
parents: 235
diff changeset
   826
905677ed00f3 Full preliminary implementation of TPDO transmit type:
etisserant
parents: 235
diff changeset
   827
  /* Trigger a non-sync event */
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   828
  _sendPDOevent (d, 0);
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   829
}
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   830
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   831
void
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   832
PDOStop (CO_Data * d)
235
f812bf6b7237 Preliminary implementation of Event Timer and Inhibit Timer driven TPDO
etisserant
parents: 217
diff changeset
   833
{
236
905677ed00f3 Full preliminary implementation of TPDO transmit type:
etisserant
parents: 235
diff changeset
   834
  /* For each TPDO mapping parameters */
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   835
  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
   836
  UNS16 offsetObjdict = d->firstIndex->PDO_TRS;
f812bf6b7237 Preliminary implementation of Event Timer and Inhibit Timer driven TPDO
etisserant
parents: 217
diff changeset
   837
  UNS16 lastIndex = d->lastIndex->PDO_TRS;
425
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   838
  if (offsetObjdict)
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   839
    while (offsetObjdict <= lastIndex)
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   840
      {
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   841
        /* Delete TPDO timers */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   842
        d->PDO_status[pdoNum].event_timer =
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   843
          DelAlarm (d->PDO_status[pdoNum].event_timer);
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   844
        d->PDO_status[pdoNum].inhibit_timer =
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   845
          DelAlarm (d->PDO_status[pdoNum].inhibit_timer);
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   846
        /* Reset transmit type parameter */
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   847
        d->PDO_status[pdoNum].transmit_type_parameter = 0;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   848
        d->PDO_status[pdoNum].last_message.cob_id = 0;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   849
        pdoNum++;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   850
        offsetObjdict++;
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   851
      }
4bc4706528ae re-indented pdo.c
etisserant
parents: 380
diff changeset
   852
}