157 |
157 |
158 void ecrt_voe_handler_read(ec_voe_handler_t *voe) |
158 void ecrt_voe_handler_read(ec_voe_handler_t *voe) |
159 { |
159 { |
160 voe->dir = EC_DIR_INPUT; |
160 voe->dir = EC_DIR_INPUT; |
161 voe->state = ec_voe_handler_state_read_start; |
161 voe->state = ec_voe_handler_state_read_start; |
162 voe->request_state = EC_INT_REQUEST_QUEUED; |
162 voe->request_state = EC_INT_REQUEST_BUSY; |
163 } |
163 } |
164 |
164 |
165 /*****************************************************************************/ |
165 /*****************************************************************************/ |
166 |
166 |
167 void ecrt_voe_handler_read_nosync(ec_voe_handler_t *voe) |
167 void ecrt_voe_handler_read_nosync(ec_voe_handler_t *voe) |
168 { |
168 { |
169 voe->dir = EC_DIR_INPUT; |
169 voe->dir = EC_DIR_INPUT; |
170 voe->state = ec_voe_handler_state_read_nosync_start; |
170 voe->state = ec_voe_handler_state_read_nosync_start; |
171 voe->request_state = EC_INT_REQUEST_QUEUED; |
171 voe->request_state = EC_INT_REQUEST_BUSY; |
172 } |
172 } |
173 |
173 |
174 /*****************************************************************************/ |
174 /*****************************************************************************/ |
175 |
175 |
176 void ecrt_voe_handler_write(ec_voe_handler_t *voe, size_t size) |
176 void ecrt_voe_handler_write(ec_voe_handler_t *voe, size_t size) |
177 { |
177 { |
178 voe->dir = EC_DIR_OUTPUT; |
178 voe->dir = EC_DIR_OUTPUT; |
179 voe->data_size = size; |
179 voe->data_size = size; |
180 voe->state = ec_voe_handler_state_write_start; |
180 voe->state = ec_voe_handler_state_write_start; |
181 voe->request_state = EC_INT_REQUEST_QUEUED; |
181 voe->request_state = EC_INT_REQUEST_BUSY; |
182 } |
182 } |
183 |
183 |
184 /*****************************************************************************/ |
184 /*****************************************************************************/ |
185 |
185 |
186 ec_request_state_t ecrt_voe_handler_execute(ec_voe_handler_t *voe) |
186 ec_request_state_t ecrt_voe_handler_execute(ec_voe_handler_t *voe) |
187 { |
187 { |
188 if (voe->config->slave) { |
188 if (voe->config->slave) { // FIXME locking? |
189 voe->state(voe); |
189 voe->state(voe); |
190 if (voe->request_state == EC_REQUEST_BUSY) |
190 if (voe->request_state == EC_INT_REQUEST_BUSY) |
191 ec_master_queue_datagram(voe->config->master, &voe->datagram); |
191 ec_master_queue_datagram(voe->config->master, &voe->datagram); |
192 } else { |
192 } else { |
193 voe->state = ec_voe_handler_state_error; |
193 voe->state = ec_voe_handler_state_error; |
194 voe->request_state = EC_INT_REQUEST_FAILURE; |
194 voe->request_state = EC_INT_REQUEST_FAILURE; |
195 } |
195 } |