master/fsm.c
changeset 454 25cc4a3b9e0a
parent 448 e4b76dc7910c
child 456 dea14706efc2
equal deleted inserted replaced
453:2ecaa53c6291 454:25cc4a3b9e0a
    46 /*****************************************************************************/
    46 /*****************************************************************************/
    47 
    47 
    48 void ec_fsm_master_start(ec_fsm_t *);
    48 void ec_fsm_master_start(ec_fsm_t *);
    49 void ec_fsm_master_broadcast(ec_fsm_t *);
    49 void ec_fsm_master_broadcast(ec_fsm_t *);
    50 void ec_fsm_master_read_states(ec_fsm_t *);
    50 void ec_fsm_master_read_states(ec_fsm_t *);
       
    51 void ec_fsm_master_acknowledge(ec_fsm_t *);
    51 void ec_fsm_master_validate_vendor(ec_fsm_t *);
    52 void ec_fsm_master_validate_vendor(ec_fsm_t *);
    52 void ec_fsm_master_validate_product(ec_fsm_t *);
    53 void ec_fsm_master_validate_product(ec_fsm_t *);
    53 void ec_fsm_master_rewrite_addresses(ec_fsm_t *);
    54 void ec_fsm_master_rewrite_addresses(ec_fsm_t *);
    54 void ec_fsm_master_configure_slave(ec_fsm_t *);
    55 void ec_fsm_master_configure_slave(ec_fsm_t *);
    55 void ec_fsm_master_scan_slaves(ec_fsm_t *);
    56 void ec_fsm_master_scan_slaves(ec_fsm_t *);
   319             }
   320             }
   320         }
   321         }
   321 
   322 
   322         fsm->slave = slave;
   323         fsm->slave = slave;
   323         fsm->slave_state = ec_fsm_slaveconf_init;
   324         fsm->slave_state = ec_fsm_slaveconf_init;
   324         ec_fsm_change(&fsm->fsm_change, fsm->slave, EC_SLAVE_STATE_INIT);
   325         ec_fsm_change_start(&fsm->fsm_change, fsm->slave, EC_SLAVE_STATE_INIT);
   325         fsm->master_state = ec_fsm_master_configure_slave;
   326         fsm->master_state = ec_fsm_master_configure_slave;
   326         fsm->master_state(fsm); // execute immediately
   327         fsm->master_state(fsm); // execute immediately
   327         return;
   328         return;
   328     }
   329     }
   329 
   330 
   505         EC_INFO("Slave %i: %s -> %s.\n",
   506         EC_INFO("Slave %i: %s -> %s.\n",
   506                 slave->ring_position, old_state, cur_state);
   507                 slave->ring_position, old_state, cur_state);
   507         slave->current_state = new_state;
   508         slave->current_state = new_state;
   508     }
   509     }
   509 
   510 
       
   511     // check, if new slave state has to be acknowledged
       
   512     if (slave->current_state & EC_SLAVE_STATE_ACK_ERR && !slave->error_flag) {
       
   513         ec_fsm_change_ack(&fsm->fsm_change, slave);
       
   514         ec_fsm_change_exec(&fsm->fsm_change);
       
   515         fsm->master_state = ec_fsm_master_acknowledge;
       
   516         return;
       
   517     }
       
   518 
       
   519     ec_fsm_master_action_next_slave_state(fsm);
       
   520 }
       
   521 
       
   522 /*****************************************************************************/
       
   523 
       
   524 /**
       
   525    Master state: ACKNOWLEDGE
       
   526 */
       
   527 
       
   528 void ec_fsm_master_acknowledge(ec_fsm_t *fsm /**< finite state machine */)
       
   529 {
       
   530     ec_slave_t *slave = fsm->slave;
       
   531 
       
   532     if (ec_fsm_change_exec(&fsm->fsm_change)) return;
       
   533 
       
   534     if (!ec_fsm_change_success(&fsm->fsm_change)) {
       
   535         fsm->slave->error_flag = 1;
       
   536         EC_ERR("Failed to acknowledge state change on slave %i.\n",
       
   537                slave->ring_position);
       
   538         fsm->master_state = ec_fsm_master_error;
       
   539         return;
       
   540     }
       
   541 
   510     ec_fsm_master_action_next_slave_state(fsm);
   542     ec_fsm_master_action_next_slave_state(fsm);
   511 }
   543 }
   512 
   544 
   513 /*****************************************************************************/
   545 /*****************************************************************************/
   514 
   546 
   901         return;
   933         return;
   902     }
   934     }
   903 
   935 
   904     slave->current_state = EC_READ_U8(datagram->data);
   936     slave->current_state = EC_READ_U8(datagram->data);
   905     if (slave->current_state & EC_SLAVE_STATE_ACK_ERR) {
   937     if (slave->current_state & EC_SLAVE_STATE_ACK_ERR) {
   906         EC_WARN("Slave %i has state error bit set (0x%02X)!\n",
   938         char state_str[EC_STATE_STRING_SIZE];
   907                 slave->ring_position, slave->current_state);
   939         ec_state_string(slave->current_state, state_str);
       
   940         EC_WARN("Slave %i has state error bit set (%s)!\n",
       
   941                 slave->ring_position, state_str);
   908     }
   942     }
   909 
   943 
   910     // read base data
   944     // read base data
   911     ec_datagram_nprd(datagram, fsm->slave->station_address, 0x0000, 6);
   945     ec_datagram_nprd(datagram, fsm->slave->station_address, 0x0000, 6);
   912     ec_master_queue_datagram(fsm->master, datagram);
   946     ec_master_queue_datagram(fsm->master, datagram);
  1198     //ec_slave_check_crc(slave);
  1232     //ec_slave_check_crc(slave);
  1199     // TODO: Implement state machine for CRC checking.
  1233     // TODO: Implement state machine for CRC checking.
  1200 
  1234 
  1201     if (!slave->base_sync_count) { // no sync managers
  1235     if (!slave->base_sync_count) { // no sync managers
  1202         fsm->slave_state = ec_fsm_slaveconf_preop;
  1236         fsm->slave_state = ec_fsm_slaveconf_preop;
  1203         ec_fsm_change(&fsm->fsm_change, slave, EC_SLAVE_STATE_PREOP);
  1237         ec_fsm_change_start(&fsm->fsm_change, slave, EC_SLAVE_STATE_PREOP);
  1204         ec_fsm_change_exec(&fsm->fsm_change); // execute immediately
  1238         ec_fsm_change_exec(&fsm->fsm_change); // execute immediately
  1205         return;
  1239         return;
  1206     }
  1240     }
  1207 
  1241 
  1208     if (master->debug_level) {
  1242     if (master->debug_level) {
  1274                slave->ring_position);
  1308                slave->ring_position);
  1275         return;
  1309         return;
  1276     }
  1310     }
  1277 
  1311 
  1278     fsm->slave_state = ec_fsm_slaveconf_preop;
  1312     fsm->slave_state = ec_fsm_slaveconf_preop;
  1279     ec_fsm_change(&fsm->fsm_change, slave, EC_SLAVE_STATE_PREOP);
  1313     ec_fsm_change_start(&fsm->fsm_change, slave, EC_SLAVE_STATE_PREOP);
  1280     ec_fsm_change_exec(&fsm->fsm_change); // execute immediately
  1314     ec_fsm_change_exec(&fsm->fsm_change); // execute immediately
  1281 }
  1315 }
  1282 
  1316 
  1283 /*****************************************************************************/
  1317 /*****************************************************************************/
  1284 
  1318 
  1318     }
  1352     }
  1319 
  1353 
  1320     if (!slave->base_fmmu_count) { // skip FMMU configuration
  1354     if (!slave->base_fmmu_count) { // skip FMMU configuration
  1321         if (list_empty(&slave->sdo_confs)) { // skip SDO configuration
  1355         if (list_empty(&slave->sdo_confs)) { // skip SDO configuration
  1322             fsm->slave_state = ec_fsm_slaveconf_saveop;
  1356             fsm->slave_state = ec_fsm_slaveconf_saveop;
  1323             ec_fsm_change(&fsm->fsm_change, slave, EC_SLAVE_STATE_SAVEOP);
  1357             ec_fsm_change_start(&fsm->fsm_change, slave,
       
  1358                                 EC_SLAVE_STATE_SAVEOP);
  1324             ec_fsm_change_exec(&fsm->fsm_change); // execute immediately
  1359             ec_fsm_change_exec(&fsm->fsm_change); // execute immediately
  1325             return;
  1360             return;
  1326         }
  1361         }
  1327 
  1362 
  1328         // start SDO configuration
  1363         // start SDO configuration
  1368 
  1403 
  1369     // No CoE configuration to be applied? Jump to SAVEOP state.
  1404     // No CoE configuration to be applied? Jump to SAVEOP state.
  1370     if (list_empty(&slave->sdo_confs)) { // skip SDO configuration
  1405     if (list_empty(&slave->sdo_confs)) { // skip SDO configuration
  1371         // set state to SAVEOP
  1406         // set state to SAVEOP
  1372         fsm->slave_state = ec_fsm_slaveconf_saveop;
  1407         fsm->slave_state = ec_fsm_slaveconf_saveop;
  1373         ec_fsm_change(&fsm->fsm_change, slave, EC_SLAVE_STATE_SAVEOP);
  1408         ec_fsm_change_start(&fsm->fsm_change, slave, EC_SLAVE_STATE_SAVEOP);
  1374         ec_fsm_change_exec(&fsm->fsm_change); // execute immediately
  1409         ec_fsm_change_exec(&fsm->fsm_change); // execute immediately
  1375         return;
  1410         return;
  1376     }
  1411     }
  1377 
  1412 
  1378     // start SDO configuration
  1413     // start SDO configuration
  1409 
  1444 
  1410     // All SDOs are now configured.
  1445     // All SDOs are now configured.
  1411 
  1446 
  1412     // set state to SAVEOP
  1447     // set state to SAVEOP
  1413     fsm->slave_state = ec_fsm_slaveconf_saveop;
  1448     fsm->slave_state = ec_fsm_slaveconf_saveop;
  1414     ec_fsm_change(&fsm->fsm_change, fsm->slave, EC_SLAVE_STATE_SAVEOP);
  1449     ec_fsm_change_start(&fsm->fsm_change, fsm->slave, EC_SLAVE_STATE_SAVEOP);
  1415     ec_fsm_change_exec(&fsm->fsm_change); // execute immediately
  1450     ec_fsm_change_exec(&fsm->fsm_change); // execute immediately
  1416 }
  1451 }
  1417 
  1452 
  1418 /*****************************************************************************/
  1453 /*****************************************************************************/
  1419 
  1454 
  1449         return;
  1484         return;
  1450     }
  1485     }
  1451 
  1486 
  1452     // set state to OP
  1487     // set state to OP
  1453     fsm->slave_state = ec_fsm_slaveconf_op;
  1488     fsm->slave_state = ec_fsm_slaveconf_op;
  1454     ec_fsm_change(&fsm->fsm_change, slave, EC_SLAVE_STATE_OP);
  1489     ec_fsm_change_start(&fsm->fsm_change, slave, EC_SLAVE_STATE_OP);
  1455     ec_fsm_change_exec(&fsm->fsm_change); // execute immediately
  1490     ec_fsm_change_exec(&fsm->fsm_change); // execute immediately
  1456 }
  1491 }
  1457 
  1492 
  1458 /*****************************************************************************/
  1493 /*****************************************************************************/
  1459 
  1494