53 void ec_fsm_coe_map_state_pdo_entry(ec_fsm_coe_map_t *); |
53 void ec_fsm_coe_map_state_pdo_entry(ec_fsm_coe_map_t *); |
54 |
54 |
55 void ec_fsm_coe_map_state_end(ec_fsm_coe_map_t *); |
55 void ec_fsm_coe_map_state_end(ec_fsm_coe_map_t *); |
56 void ec_fsm_coe_map_state_error(ec_fsm_coe_map_t *); |
56 void ec_fsm_coe_map_state_error(ec_fsm_coe_map_t *); |
57 |
57 |
58 void ec_fsm_coe_map_action_next_dir(ec_fsm_coe_map_t *); |
58 void ec_fsm_coe_map_action_next_sync(ec_fsm_coe_map_t *); |
59 void ec_fsm_coe_map_action_next_pdo(ec_fsm_coe_map_t *); |
59 void ec_fsm_coe_map_action_next_pdo(ec_fsm_coe_map_t *); |
60 void ec_fsm_coe_map_action_next_pdo_entry(ec_fsm_coe_map_t *); |
60 void ec_fsm_coe_map_action_next_pdo_entry(ec_fsm_coe_map_t *); |
61 |
61 |
62 /*****************************************************************************/ |
62 /*****************************************************************************/ |
63 |
63 |
132 |
132 |
133 /****************************************************************************** |
133 /****************************************************************************** |
134 * state functions |
134 * state functions |
135 *****************************************************************************/ |
135 *****************************************************************************/ |
136 |
136 |
137 /** |
137 /** Start reading Pdo assignment. |
138 * Start reading Pdo assignment. |
138 */ |
139 */ |
|
140 |
|
141 void ec_fsm_coe_map_state_start( |
139 void ec_fsm_coe_map_state_start( |
142 ec_fsm_coe_map_t *fsm /**< finite state machine */ |
140 ec_fsm_coe_map_t *fsm /**< finite state machine */ |
143 ) |
141 ) |
144 { |
142 { |
145 // read Pdo assignment for first direction |
143 // read Pdo assignment for first sync manager |
146 fsm->dir = (ec_direction_t) -1; // next is EC_DIR_OUTPUT |
144 fsm->sync_index = 0xff; // next is 0 |
147 ec_fsm_coe_map_action_next_dir(fsm); |
145 ec_fsm_coe_map_action_next_sync(fsm); |
148 } |
146 } |
149 |
147 |
150 /*****************************************************************************/ |
148 /*****************************************************************************/ |
151 |
149 |
152 /** |
150 /** Read Pdo assignment of next sync manager. |
153 * Read Pdo assignment of next direction manager. |
151 */ |
154 */ |
152 void ec_fsm_coe_map_action_next_sync( |
155 |
153 ec_fsm_coe_map_t *fsm /**< Finite state machine */ |
156 void ec_fsm_coe_map_action_next_dir( |
|
157 ec_fsm_coe_map_t *fsm /**< finite state machine */ |
|
158 ) |
154 ) |
159 { |
155 { |
160 ec_slave_t *slave = fsm->slave; |
156 ec_slave_t *slave = fsm->slave; |
161 |
157 |
162 fsm->dir++; |
158 fsm->sync_index++; |
163 |
159 |
164 if (slave->master->debug_level) |
160 if (slave->master->debug_level) |
165 EC_DBG("Processing dir %u of slave %u.\n", |
161 EC_DBG("Processing SM%u of slave %u.\n", |
166 fsm->dir, slave->ring_position); |
162 fsm->sync_index, slave->ring_position); |
167 |
163 |
168 for (; fsm->dir <= EC_DIR_INPUT; fsm->dir++) { |
164 for (; fsm->sync_index < EC_MAX_SYNCS; fsm->sync_index++) { |
169 |
165 if (!(fsm->sync = ec_slave_get_sync(slave, fsm->sync_index))) { |
170 if (!(fsm->sync = ec_slave_get_pdo_sync(slave, fsm->dir))) { |
|
171 if (slave->master->debug_level) |
166 if (slave->master->debug_level) |
172 EC_DBG("No sync manager for direction %u!\n", fsm->dir); |
167 EC_DBG("Slave %u does not provide a configuration for " |
|
168 "SM%u!\n", fsm->slave->ring_position, fsm->sync_index); |
173 continue; |
169 continue; |
174 } |
170 } |
175 |
171 |
176 fsm->sync_sdo_index = 0x1C10 + fsm->sync->index; |
172 fsm->sync_sdo_index = 0x1C10 + fsm->sync_index; |
177 |
173 |
178 if (slave->master->debug_level) |
174 if (slave->master->debug_level) |
179 EC_DBG("Reading Pdo assignment of sync manager %u of slave %u.\n", |
175 EC_DBG("Reading Pdo assignment of SM%u of slave %u.\n", |
180 fsm->sync->index, slave->ring_position); |
176 fsm->sync_index, slave->ring_position); |
181 |
177 |
182 ec_pdo_list_clear_pdos(&fsm->pdos); |
178 ec_pdo_list_clear_pdos(&fsm->pdos); |
183 |
179 |
184 ec_sdo_request_address(&fsm->request, fsm->sync_sdo_index, 0); |
180 ec_sdo_request_address(&fsm->request, fsm->sync_sdo_index, 0); |
185 ecrt_sdo_request_read(&fsm->request); |
181 ecrt_sdo_request_read(&fsm->request); |
302 return; |
298 return; |
303 } |
299 } |
304 |
300 |
305 ec_pdo_init(fsm->pdo); |
301 ec_pdo_init(fsm->pdo); |
306 fsm->pdo->index = EC_READ_U16(fsm->request.data); |
302 fsm->pdo->index = EC_READ_U16(fsm->request.data); |
307 fsm->pdo->dir = ec_sync_direction(fsm->sync); |
303 fsm->pdo->sync_index = fsm->sync_index; |
308 |
304 |
309 if (fsm->slave->master->debug_level) |
305 if (fsm->slave->master->debug_level) |
310 EC_DBG(" Pdo 0x%04X.\n", fsm->pdo->index); |
306 EC_DBG("Pdo 0x%04X.\n", fsm->pdo->index); |
311 |
307 |
312 list_add_tail(&fsm->pdo->list, &fsm->pdos.list); |
308 list_add_tail(&fsm->pdo->list, &fsm->pdos.list); |
313 |
309 |
314 ec_sdo_request_address(&fsm->request, fsm->pdo->index, 0); |
310 ec_sdo_request_address(&fsm->request, fsm->pdo->index, 0); |
315 ecrt_sdo_request_read(&fsm->request); |
311 ecrt_sdo_request_read(&fsm->request); |
430 return; |
426 return; |
431 } |
427 } |
432 } |
428 } |
433 |
429 |
434 if (fsm->slave->master->debug_level) { |
430 if (fsm->slave->master->debug_level) { |
435 EC_DBG(" Pdo entry 0x%04X:%02X, %u bit, \"%s\".\n", |
431 EC_DBG("Pdo entry 0x%04X:%02X, %u bit, \"%s\".\n", |
436 pdo_entry->index, pdo_entry->subindex, |
432 pdo_entry->index, pdo_entry->subindex, |
437 pdo_entry->bit_length, |
433 pdo_entry->bit_length, |
438 pdo_entry->name ? pdo_entry->name : "???"); |
434 pdo_entry->name ? pdo_entry->name : "???"); |
439 } |
435 } |
440 |
436 |