49 |
49 |
50 /** Finite state machines for the CANopen over EtherCAT protocol. |
50 /** Finite state machines for the CANopen over EtherCAT protocol. |
51 */ |
51 */ |
52 struct ec_fsm_coe { |
52 struct ec_fsm_coe { |
53 ec_slave_t *slave; /**< slave the FSM runs on */ |
53 ec_slave_t *slave; /**< slave the FSM runs on */ |
54 ec_datagram_t *datagram; /**< datagram used in the state machine */ |
|
55 unsigned int retries; /**< retries upon datagram timeout */ |
54 unsigned int retries; /**< retries upon datagram timeout */ |
56 |
55 |
57 void (*state)(ec_fsm_coe_t *); /**< CoE state function */ |
56 void (*state)(ec_fsm_coe_t *, ec_datagram_t *); /**< CoE state function */ |
|
57 ec_datagram_t *datagram; /**< Datagram used in last step. */ |
58 unsigned long jiffies_start; /**< CoE timestamp. */ |
58 unsigned long jiffies_start; /**< CoE timestamp. */ |
59 ec_sdo_t *sdo; /**< current SDO */ |
59 ec_sdo_t *sdo; /**< current SDO */ |
60 uint8_t subindex; /**< current subindex */ |
60 uint8_t subindex; /**< current subindex */ |
61 ec_sdo_request_t *request; /**< SDO request */ |
61 ec_sdo_request_t *request; /**< SDO request */ |
62 uint32_t complete_size; /**< Used when segmenting. */ |
62 uint32_t complete_size; /**< Used when segmenting. */ |
63 uint8_t toggle; /**< toggle bit for segment commands */ |
63 uint8_t toggle; /**< toggle bit for segment commands */ |
64 uint32_t offset; /**< Data offset during segmented download. */ |
64 uint32_t offset; /**< Data offset during segmented download. */ |
65 uint32_t remaining; /**< Remaining bytes during segmented download. */ |
65 uint32_t remaining; /**< Remaining bytes during segmented download. */ |
|
66 size_t segment_size; /**< Current segment size. */ |
66 }; |
67 }; |
67 |
68 |
68 /*****************************************************************************/ |
69 /*****************************************************************************/ |
69 |
70 |
70 void ec_fsm_coe_init(ec_fsm_coe_t *, ec_datagram_t *); |
71 void ec_fsm_coe_init(ec_fsm_coe_t *); |
71 void ec_fsm_coe_clear(ec_fsm_coe_t *); |
72 void ec_fsm_coe_clear(ec_fsm_coe_t *); |
72 |
73 |
73 void ec_fsm_coe_dictionary(ec_fsm_coe_t *, ec_slave_t *); |
74 void ec_fsm_coe_dictionary(ec_fsm_coe_t *, ec_slave_t *); |
74 void ec_fsm_coe_transfer(ec_fsm_coe_t *, ec_slave_t *, ec_sdo_request_t *); |
75 void ec_fsm_coe_transfer(ec_fsm_coe_t *, ec_slave_t *, ec_sdo_request_t *); |
75 |
76 |
76 int ec_fsm_coe_exec(ec_fsm_coe_t *); |
77 int ec_fsm_coe_exec(ec_fsm_coe_t *, ec_datagram_t *); |
77 int ec_fsm_coe_success(ec_fsm_coe_t *); |
78 int ec_fsm_coe_success(const ec_fsm_coe_t *); |
78 |
79 |
79 /*****************************************************************************/ |
80 /*****************************************************************************/ |
80 |
81 |
81 #endif |
82 #endif |