35 /*****************************************************************************/ |
35 /*****************************************************************************/ |
36 |
36 |
37 #ifndef __EC_MAILBOX_H__ |
37 #ifndef __EC_MAILBOX_H__ |
38 #define __EC_MAILBOX_H__ |
38 #define __EC_MAILBOX_H__ |
39 |
39 |
40 #include "globals.h" |
40 #include "slave.h" |
41 #include "datagram.h" |
|
42 |
41 |
43 /*****************************************************************************/ |
42 /*****************************************************************************/ |
44 |
43 |
45 /** Size of the mailbox header. |
44 /** Size of the mailbox header. |
46 */ |
45 */ |
47 #define EC_MBOX_HEADER_SIZE 6 |
46 #define EC_MBOX_HEADER_SIZE 6 |
48 |
47 |
49 /*****************************************************************************/ |
48 /*****************************************************************************/ |
50 |
49 |
51 /** EtherCAT slave mailbox. |
50 uint8_t *ec_slave_mbox_prepare_send(const ec_slave_t *, ec_datagram_t *, |
52 */ |
|
53 struct ec_mailbox |
|
54 { |
|
55 ec_datagram_t *datagram; /**< Datagram used for the mailbox content. */ |
|
56 #ifdef EC_REDUCE_MBOXFRAMESIZE |
|
57 ec_datagram_t end_datagram; /**< Datagram used for writing the end byte to |
|
58 the mailbox. */ |
|
59 #endif |
|
60 }; |
|
61 typedef struct ec_mailbox ec_mailbox_t; /**< \see ec_mailbox. */ |
|
62 |
|
63 /*****************************************************************************/ |
|
64 |
|
65 void ec_mbox_init(ec_mailbox_t *, ec_datagram_t *); |
|
66 void ec_mbox_clear(ec_mailbox_t *); |
|
67 |
|
68 /** |
|
69 Checks the datagrams states. |
|
70 */ |
|
71 static inline int ec_mbox_is_datagram_state( |
|
72 ec_mailbox_t *mbox, |
|
73 ec_datagram_state_t state |
|
74 ) |
|
75 { |
|
76 return (mbox->datagram->state == state) |
|
77 #ifdef EC_REDUCE_MBOXFRAMESIZE |
|
78 && (mbox->end_datagram.type == EC_DATAGRAM_NONE |
|
79 || mbox->end_datagram.state == state) |
|
80 #endif |
|
81 ; |
|
82 } |
|
83 |
|
84 /** |
|
85 Checks the datagrams working counter. |
|
86 */ |
|
87 static inline int ec_mbox_is_datagram_wc( |
|
88 ec_mailbox_t *mbox, |
|
89 size_t wc |
|
90 ) |
|
91 { |
|
92 return (mbox->datagram->working_counter == wc) |
|
93 #ifdef EC_REDUCE_MBOXFRAMESIZE |
|
94 && (mbox->end_datagram.type == EC_DATAGRAM_NONE |
|
95 || mbox->end_datagram.working_counter == wc) |
|
96 #endif |
|
97 ; |
|
98 } |
|
99 |
|
100 void ec_slave_mbox_queue_datagrams(const ec_slave_t *, ec_mailbox_t *); |
|
101 void ec_master_mbox_queue_datagrams(ec_master_t *, ec_mailbox_t *); |
|
102 uint8_t *ec_slave_mbox_prepare_send(const ec_slave_t *, ec_mailbox_t *, |
|
103 uint8_t, size_t); |
51 uint8_t, size_t); |
104 int ec_slave_mbox_prepare_check(const ec_slave_t *, ec_mailbox_t *); |
52 int ec_slave_mbox_prepare_check(const ec_slave_t *, ec_datagram_t *); |
105 int ec_slave_mbox_check(ec_mailbox_t *); |
53 int ec_slave_mbox_check(const ec_datagram_t *); |
106 int ec_slave_mbox_prepare_fetch(const ec_slave_t *, ec_mailbox_t *); |
54 int ec_slave_mbox_prepare_fetch(const ec_slave_t *, ec_datagram_t *); |
107 uint8_t *ec_slave_mbox_fetch(const ec_slave_t *, ec_mailbox_t *, |
55 uint8_t *ec_slave_mbox_fetch(const ec_slave_t *, const ec_datagram_t *, |
108 uint8_t *, size_t *); |
56 uint8_t *, size_t *); |
109 |
57 |
110 /*****************************************************************************/ |
58 /*****************************************************************************/ |
111 |
59 |
112 #endif |
60 #endif |