master/fsm_change.h
author Patrick Bruenn <p.bruenn@beckhoff.com>
Tue, 12 Apr 2016 11:17:36 +0200
branchstable-1.5
changeset 2654 b3f6b3e5ef29
parent 1363 11c0b2caa253
permissions -rw-r--r--
devices/ccat: revert "limit rx processing to one frame per poll"

revert "limit rx processing to one frame per poll", which caused etherlab
frame timeouts in setups with more than one frame per cycle.
434
0180d8277311 Layed out state change state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     1
/******************************************************************************
0180d8277311 Layed out state change state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     2
 *
0180d8277311 Layed out state change state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     3
 *  $Id$
0180d8277311 Layed out state change 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
434
0180d8277311 Layed out state change state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     6
 *
0180d8277311 Layed out state change state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     7
 *  This file is part of the IgH EtherCAT Master.
0180d8277311 Layed out state change 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.
434
0180d8277311 Layed out state change 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.
434
0180d8277311 Layed out state change 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
434
0180d8277311 Layed out state change state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    20
 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
0180d8277311 Layed out state change 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.
434
0180d8277311 Layed out state change state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    27
 *
0180d8277311 Layed out state change state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    28
 *****************************************************************************/
0180d8277311 Layed out state change state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    29
0180d8277311 Layed out state change state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    30
/**
0180d8277311 Layed out state change state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    31
   \file
0180d8277311 Layed out state change state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    32
   EtherCAT state change FSM.
0180d8277311 Layed out state change state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    33
*/
0180d8277311 Layed out state change state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    34
0180d8277311 Layed out state change state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    35
/*****************************************************************************/
0180d8277311 Layed out state change 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: 738
diff changeset
    37
#ifndef __EC_FSM_CHANGE_H__
4963e22a267a Equalized defines against duplicated header inclusion.
Florian Pose <fp@igh-essen.com>
parents: 738
diff changeset
    38
#define __EC_FSM_CHANGE_H__
434
0180d8277311 Layed out state change state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    39
0180d8277311 Layed out state change state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    40
#include "globals.h"
0180d8277311 Layed out state change state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    41
#include "datagram.h"
0180d8277311 Layed out state change state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    42
#include "slave.h"
0180d8277311 Layed out state change state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    43
0180d8277311 Layed out state change state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    44
/*****************************************************************************/
0180d8277311 Layed out state change state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    45
454
25cc4a3b9e0a State acknowledgement in master state machine.
Florian Pose <fp@igh-essen.com>
parents: 435
diff changeset
    46
/**
25cc4a3b9e0a State acknowledgement in master state machine.
Florian Pose <fp@igh-essen.com>
parents: 435
diff changeset
    47
   Mode of the change state machine.
25cc4a3b9e0a State acknowledgement in master state machine.
Florian Pose <fp@igh-essen.com>
parents: 435
diff changeset
    48
*/
25cc4a3b9e0a State acknowledgement in master state machine.
Florian Pose <fp@igh-essen.com>
parents: 435
diff changeset
    49
25cc4a3b9e0a State acknowledgement in master state machine.
Florian Pose <fp@igh-essen.com>
parents: 435
diff changeset
    50
typedef enum {
25cc4a3b9e0a State acknowledgement in master state machine.
Florian Pose <fp@igh-essen.com>
parents: 435
diff changeset
    51
    EC_FSM_CHANGE_MODE_FULL, /**< full state change */
25cc4a3b9e0a State acknowledgement in master state machine.
Florian Pose <fp@igh-essen.com>
parents: 435
diff changeset
    52
    EC_FSM_CHANGE_MODE_ACK_ONLY /**< only state acknowledgement */
25cc4a3b9e0a State acknowledgement in master state machine.
Florian Pose <fp@igh-essen.com>
parents: 435
diff changeset
    53
}
25cc4a3b9e0a State acknowledgement in master state machine.
Florian Pose <fp@igh-essen.com>
parents: 435
diff changeset
    54
ec_fsm_change_mode_t;
25cc4a3b9e0a State acknowledgement in master state machine.
Florian Pose <fp@igh-essen.com>
parents: 435
diff changeset
    55
25cc4a3b9e0a State acknowledgement in master state machine.
Florian Pose <fp@igh-essen.com>
parents: 435
diff changeset
    56
/*****************************************************************************/
25cc4a3b9e0a State acknowledgement in master state machine.
Florian Pose <fp@igh-essen.com>
parents: 435
diff changeset
    57
434
0180d8277311 Layed out state change state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    58
typedef struct ec_fsm_change ec_fsm_change_t; /**< \see ec_fsm_change */
0180d8277311 Layed out state change state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    59
0180d8277311 Layed out state change state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    60
/**
0180d8277311 Layed out state change state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    61
   EtherCAT state change FSM.
0180d8277311 Layed out state change state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    62
*/
0180d8277311 Layed out state change state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    63
0180d8277311 Layed out state change state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    64
struct ec_fsm_change
0180d8277311 Layed out state change state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    65
{
0180d8277311 Layed out state change state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    66
    ec_slave_t *slave; /**< slave the FSM runs on */
0180d8277311 Layed out state change state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    67
    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: 454
diff changeset
    68
    unsigned int retries; /**< retries upon datagram timeout */
434
0180d8277311 Layed out state change state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    69
0180d8277311 Layed out state change state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    70
    void (*state)(ec_fsm_change_t *); /**< slave state change state function */
454
25cc4a3b9e0a State acknowledgement in master state machine.
Florian Pose <fp@igh-essen.com>
parents: 435
diff changeset
    71
    ec_fsm_change_mode_t mode; /**< full state change, or ack only. */
434
0180d8277311 Layed out state change state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    72
    ec_slave_state_t requested_state; /**< input: state */
454
25cc4a3b9e0a State acknowledgement in master state machine.
Florian Pose <fp@igh-essen.com>
parents: 435
diff changeset
    73
    ec_slave_state_t old_state; /**< prior slave state */
434
0180d8277311 Layed out state change state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    74
    unsigned long jiffies_start; /**< change timer */
0180d8277311 Layed out state change state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    75
    uint8_t take_time; /**< take sending timestamp */
738
880c6153101f Improved handling for spontaneous AL state changes.
Florian Pose <fp@igh-essen.com>
parents: 505
diff changeset
    76
    uint8_t spontaneous_change; /**< spontaneous state change detected */
434
0180d8277311 Layed out state change state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    77
};
0180d8277311 Layed out state change state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    78
0180d8277311 Layed out state change state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    79
/*****************************************************************************/
0180d8277311 Layed out state change state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    80
0180d8277311 Layed out state change state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    81
void ec_fsm_change_init(ec_fsm_change_t *, ec_datagram_t *);
0180d8277311 Layed out state change state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    82
void ec_fsm_change_clear(ec_fsm_change_t *);
0180d8277311 Layed out state change state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    83
454
25cc4a3b9e0a State acknowledgement in master state machine.
Florian Pose <fp@igh-essen.com>
parents: 435
diff changeset
    84
void ec_fsm_change_start(ec_fsm_change_t *, ec_slave_t *, ec_slave_state_t);
25cc4a3b9e0a State acknowledgement in master state machine.
Florian Pose <fp@igh-essen.com>
parents: 435
diff changeset
    85
void ec_fsm_change_ack(ec_fsm_change_t *, ec_slave_t *);
434
0180d8277311 Layed out state change state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    86
435
779a18d12e6c Removed state machine running() methods.
Florian Pose <fp@igh-essen.com>
parents: 434
diff changeset
    87
int ec_fsm_change_exec(ec_fsm_change_t *);
434
0180d8277311 Layed out state change state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    88
int ec_fsm_change_success(ec_fsm_change_t *);
0180d8277311 Layed out state change state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    89
0180d8277311 Layed out state change state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    90
/*****************************************************************************/
0180d8277311 Layed out state change state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    91
0180d8277311 Layed out state change state machine.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    92
#endif