master/fsm_sii.h
author Gavin Lambert <gavinl@compacsort.com>
Tue, 14 Apr 2015 09:33:24 -0400
changeset 2618 3affe9cd0b66
parent 1363 11c0b2caa253
permissions -rw-r--r--
Ignore NXIO error otherwise this causes spam if network is empty or refclk not
selected yet, and syncing refclk time to master.
433
100f51f28cf2 Layed out SII state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     1
/******************************************************************************
100f51f28cf2 Layed out SII state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     2
 *
100f51f28cf2 Layed out SII state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     3
 *  $Id$
100f51f28cf2 Layed out SII state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     4
 *
1326
ef907b0b5125 merge -c1603 branches/stable-1.4: Changed licence headers to avoid conflicts with the GPL; restricted licence to GPLv2 only.
Florian Pose <fp@igh-essen.com>
parents: 1209
diff changeset
     5
 *  Copyright (C) 2006-2008  Florian Pose, Ingenieurgemeinschaft IgH
433
100f51f28cf2 Layed out SII state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     6
 *
100f51f28cf2 Layed out SII state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     7
 *  This file is part of the IgH EtherCAT Master.
100f51f28cf2 Layed out SII state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     8
 *
1326
ef907b0b5125 merge -c1603 branches/stable-1.4: Changed licence headers to avoid conflicts with the GPL; restricted licence to GPLv2 only.
Florian Pose <fp@igh-essen.com>
parents: 1209
diff changeset
     9
 *  The IgH EtherCAT Master is free software; you can redistribute it and/or
ef907b0b5125 merge -c1603 branches/stable-1.4: Changed licence headers to avoid conflicts with the GPL; restricted licence to GPLv2 only.
Florian Pose <fp@igh-essen.com>
parents: 1209
diff changeset
    10
 *  modify it under the terms of the GNU General Public License version 2, as
ef907b0b5125 merge -c1603 branches/stable-1.4: Changed licence headers to avoid conflicts with the GPL; restricted licence to GPLv2 only.
Florian Pose <fp@igh-essen.com>
parents: 1209
diff changeset
    11
 *  published by the Free Software Foundation.
433
100f51f28cf2 Layed out SII state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    12
 *
1326
ef907b0b5125 merge -c1603 branches/stable-1.4: Changed licence headers to avoid conflicts with the GPL; restricted licence to GPLv2 only.
Florian Pose <fp@igh-essen.com>
parents: 1209
diff changeset
    13
 *  The IgH EtherCAT Master is distributed in the hope that it will be useful,
ef907b0b5125 merge -c1603 branches/stable-1.4: Changed licence headers to avoid conflicts with the GPL; restricted licence to GPLv2 only.
Florian Pose <fp@igh-essen.com>
parents: 1209
diff changeset
    14
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
ef907b0b5125 merge -c1603 branches/stable-1.4: Changed licence headers to avoid conflicts with the GPL; restricted licence to GPLv2 only.
Florian Pose <fp@igh-essen.com>
parents: 1209
diff changeset
    15
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General
ef907b0b5125 merge -c1603 branches/stable-1.4: Changed licence headers to avoid conflicts with the GPL; restricted licence to GPLv2 only.
Florian Pose <fp@igh-essen.com>
parents: 1209
diff changeset
    16
 *  Public License for more details.
433
100f51f28cf2 Layed out SII state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    17
 *
1326
ef907b0b5125 merge -c1603 branches/stable-1.4: Changed licence headers to avoid conflicts with the GPL; restricted licence to GPLv2 only.
Florian Pose <fp@igh-essen.com>
parents: 1209
diff changeset
    18
 *  You should have received a copy of the GNU General Public License along
ef907b0b5125 merge -c1603 branches/stable-1.4: Changed licence headers to avoid conflicts with the GPL; restricted licence to GPLv2 only.
Florian Pose <fp@igh-essen.com>
parents: 1209
diff changeset
    19
 *  with the IgH EtherCAT Master; if not, write to the Free Software
433
100f51f28cf2 Layed out SII state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    20
 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
100f51f28cf2 Layed out SII state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    21
 *
1363
11c0b2caa253 Improved and added license headers.
Florian Pose <fp@igh-essen.com>
parents: 1326
diff changeset
    22
 *  ---
11c0b2caa253 Improved and added license headers.
Florian Pose <fp@igh-essen.com>
parents: 1326
diff changeset
    23
 *
11c0b2caa253 Improved and added license headers.
Florian Pose <fp@igh-essen.com>
parents: 1326
diff changeset
    24
 *  The license mentioned above concerns the source code only. Using the
11c0b2caa253 Improved and added license headers.
Florian Pose <fp@igh-essen.com>
parents: 1326
diff changeset
    25
 *  EtherCAT technology and brand is only permitted in compliance with the
11c0b2caa253 Improved and added license headers.
Florian Pose <fp@igh-essen.com>
parents: 1326
diff changeset
    26
 *  industrial property and similar rights of Beckhoff Automation GmbH.
433
100f51f28cf2 Layed out SII state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    27
 *
100f51f28cf2 Layed out SII state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    28
 *****************************************************************************/
100f51f28cf2 Layed out SII state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    29
100f51f28cf2 Layed out SII state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    30
/**
100f51f28cf2 Layed out SII state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    31
   \file
100f51f28cf2 Layed out SII state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    32
   EtherCAT slave information interface FSM structure.
100f51f28cf2 Layed out SII state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    33
*/
100f51f28cf2 Layed out SII state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    34
100f51f28cf2 Layed out SII state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    35
/*****************************************************************************/
100f51f28cf2 Layed out SII state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    36
883
4963e22a267a Equalized defines against duplicated header inclusion.
Florian Pose <fp@igh-essen.com>
parents: 815
diff changeset
    37
#ifndef __EC_FSM_SII_H__
4963e22a267a Equalized defines against duplicated header inclusion.
Florian Pose <fp@igh-essen.com>
parents: 815
diff changeset
    38
#define __EC_FSM_SII_H__
433
100f51f28cf2 Layed out SII state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    39
100f51f28cf2 Layed out SII state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    40
#include "globals.h"
100f51f28cf2 Layed out SII state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    41
#include "datagram.h"
100f51f28cf2 Layed out SII state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    42
#include "slave.h"
100f51f28cf2 Layed out SII state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    43
100f51f28cf2 Layed out SII state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    44
/*****************************************************************************/
100f51f28cf2 Layed out SII state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    45
815
002fe9ec778f Implemented missing datagram types.
Florian Pose <fp@igh-essen.com>
parents: 758
diff changeset
    46
/** SII access addressing mode.
758
8fa6f825eb7d Updated Doxygen documentation.
Florian Pose <fp@igh-essen.com>
parents: 755
diff changeset
    47
 */
815
002fe9ec778f Implemented missing datagram types.
Florian Pose <fp@igh-essen.com>
parents: 758
diff changeset
    48
typedef enum {
002fe9ec778f Implemented missing datagram types.
Florian Pose <fp@igh-essen.com>
parents: 758
diff changeset
    49
    EC_FSM_SII_USE_INCREMENT_ADDRESS, /**< Use auto-increment addressing. */
002fe9ec778f Implemented missing datagram types.
Florian Pose <fp@igh-essen.com>
parents: 758
diff changeset
    50
    EC_FSM_SII_USE_CONFIGURED_ADDRESS /**< Use configured addresses. */
002fe9ec778f Implemented missing datagram types.
Florian Pose <fp@igh-essen.com>
parents: 758
diff changeset
    51
} ec_fsm_sii_addressing_t;
433
100f51f28cf2 Layed out SII state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    52
100f51f28cf2 Layed out SII state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    53
/*****************************************************************************/
100f51f28cf2 Layed out SII state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    54
100f51f28cf2 Layed out SII state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    55
typedef struct ec_fsm_sii ec_fsm_sii_t; /**< \see ec_fsm_sii */
100f51f28cf2 Layed out SII state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    56
100f51f28cf2 Layed out SII state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    57
/**
100f51f28cf2 Layed out SII state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    58
   Slave information interface FSM.
100f51f28cf2 Layed out SII state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    59
*/
100f51f28cf2 Layed out SII state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    60
100f51f28cf2 Layed out SII state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    61
struct ec_fsm_sii
100f51f28cf2 Layed out SII state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    62
{
100f51f28cf2 Layed out SII state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    63
    ec_slave_t *slave; /**< slave the FSM runs on */
100f51f28cf2 Layed out SII state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    64
    ec_datagram_t *datagram; /**< datagram used in the state machine */
505
bc443ca0077f State machines re-send datagrams on timeout.
Florian Pose <fp@igh-essen.com>
parents: 435
diff changeset
    65
    unsigned int retries; /**< retries upon datagram timeout */
433
100f51f28cf2 Layed out SII state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    66
100f51f28cf2 Layed out SII state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    67
    void (*state)(ec_fsm_sii_t *); /**< SII state function */
755
178353fc47e5 SII writing workaround for some slaves, that don't respond correctly;
Florian Pose <fp@igh-essen.com>
parents: 754
diff changeset
    68
    uint16_t word_offset; /**< input: word offset in SII */
433
100f51f28cf2 Layed out SII state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    69
    ec_fsm_sii_addressing_t mode; /**< reading via APRD or NPRD */
100f51f28cf2 Layed out SII state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    70
    uint8_t value[4]; /**< raw SII value (32bit) */
1039
2881a83d084f Use jiffies instead of cycles in SII state machine.
Florian Pose <fp@igh-essen.com>
parents: 979
diff changeset
    71
    unsigned long jiffies_start; /**< Start timestamp. */
433
100f51f28cf2 Layed out SII state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    72
    uint8_t check_once_more; /**< one more try after timeout */
100f51f28cf2 Layed out SII state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    73
};
100f51f28cf2 Layed out SII state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    74
100f51f28cf2 Layed out SII state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    75
/*****************************************************************************/
100f51f28cf2 Layed out SII state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    76
100f51f28cf2 Layed out SII state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    77
void ec_fsm_sii_init(ec_fsm_sii_t *, ec_datagram_t *);
100f51f28cf2 Layed out SII state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    78
void ec_fsm_sii_clear(ec_fsm_sii_t *);
100f51f28cf2 Layed out SII state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    79
100f51f28cf2 Layed out SII state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    80
void ec_fsm_sii_read(ec_fsm_sii_t *, ec_slave_t *,
100f51f28cf2 Layed out SII state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    81
                     uint16_t, ec_fsm_sii_addressing_t);
600
b0660152f710 Made data pointer in ec_fsm_sii_write() const.
Florian Pose <fp@igh-essen.com>
parents: 505
diff changeset
    82
void ec_fsm_sii_write(ec_fsm_sii_t *, ec_slave_t *, uint16_t,
979
405cc2d033e0 Renamed some fields in ec_sii_request_t to word addressing.
Florian Pose <fp@igh-essen.com>
parents: 883
diff changeset
    83
        const uint16_t *, ec_fsm_sii_addressing_t);
433
100f51f28cf2 Layed out SII state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    84
435
779a18d12e6c Removed state machine running() methods.
Florian Pose <fp@igh-essen.com>
parents: 433
diff changeset
    85
int ec_fsm_sii_exec(ec_fsm_sii_t *);
433
100f51f28cf2 Layed out SII state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    86
int ec_fsm_sii_success(ec_fsm_sii_t *);
100f51f28cf2 Layed out SII state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    87
100f51f28cf2 Layed out SII state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    88
/*****************************************************************************/
100f51f28cf2 Layed out SII state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    89
100f51f28cf2 Layed out SII state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    90
#endif