src/pdo.c
author Robert Lehmann <robert.lehmann@sitec-systems.de>
Tue, 28 Jul 2015 16:36:55 +0200
changeset 793 72e9e1064432
parent 743 17715d2ecf10
permissions -rw-r--r--
timers_unix: Fix termination problem of WaitReceiveTaskEnd

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