diff -r 000000000000 -r 05c992bf5847 drivers/ec_slave.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/drivers/ec_slave.c Fri Oct 21 11:21:42 2005 +0000 @@ -0,0 +1,160 @@ +/**************************************************************** + * + * e c _ s l a v e . c + * + * Methoden für einen EtherCAT-Slave. + * + * $Date$ + * $Author$ + * + ***************************************************************/ + +#include + +#include "ec_globals.h" +#include "ec_slave.h" +#include "ec_dbg.h" + +/***************************************************************/ + +/** + EtherCAT-Slave-Konstruktor. + + Initialisiert einen EtherCAT-Slave. + + @param slave Zeiger auf den zu initialisierenden Slave +*/ + +void EtherCAT_slave_init(EtherCAT_slave_t *slave) +{ + slave->type = 0; + slave->revision = 0; + slave->build = 0; + + slave->ring_position = 0; + slave->station_address = 0; + + slave->vendor_id = 0; + slave->product_code = 0; + slave->revision_number = 0; + + slave->desc = 0; + + slave->logical_address0 = 0; + + slave->current_state = ECAT_STATE_UNKNOWN; + slave->requested_state = ECAT_STATE_UNKNOWN; +} + +/***************************************************************/ + +/** + EtherCAT-Slave-Destruktor. + + Im Moment ohne Funktionalität. + + @param slave Zeiger auf den zu zerstörenden Slave +*/ + +void EtherCAT_slave_clear(EtherCAT_slave_t *slave) +{ + // Nothing yet... +} + +/***************************************************************/ + +/** + Liest einen bestimmten Kanal des Slaves als Integer-Wert. + + Prüft zuerst, ob der entsprechende Slave eine + bekannte Beschreibung besitzt, ob dort eine + read()-Funktion hinterlegt ist und ob die angegebene + Kanalnummer gültig ist. Wenn ja, wird der dekodierte + Wert zurückgegeben, sonst ist der Wert 0. + + @param slave EtherCAT-Slave + @param channel Kanalnummer + + @return Gelesener Wert bzw. 0 +*/ + +int EtherCAT_read_value(EtherCAT_slave_t *slave, + unsigned int channel) +{ + if (!slave->desc) + { + EC_DBG(KERN_WARNING "EtherCAT: Reading failed - " + "Slave %04X (at %0X) has no description.\n", + slave->station_address, (unsigned int) slave); + return 0; + } + + if (!slave->desc->read) + { + EC_DBG(KERN_WARNING "EtherCAT: Reading failed - " + "Slave type (%s %s) has no read method.\n", + slave->desc->vendor_name, slave->desc->product_name); + return 0; + } + + if (channel >= slave->desc->channels) + { + EC_DBG(KERN_WARNING "EtherCAT: Reading failed - " + "Slave %4X (%s %s) has no channel %i.\n", + slave->station_address, slave->desc->vendor_name, + slave->desc->product_name, channel); + return 0; + } + + return slave->desc->read(slave->process_data, channel); +} + +/***************************************************************/ + +/** + Schreibt einen bestimmten Kanal des Slaves als Integer-Wert . + + Prüft zuerst, ob der entsprechende Slave eine + bekannte Beschreibung besitzt, ob dort eine + write()-Funktion hinterlegt ist und ob die angegebene + Kanalnummer gültig ist. Wenn ja, wird der Wert entsprechend + kodiert und geschrieben. + + @param slave EtherCAT-Slave + @param channel Kanalnummer + @param value Zu schreibender Wert +*/ + +void EtherCAT_write_value(EtherCAT_slave_t *slave, + unsigned int channel, + int value) +{ + if (!slave->desc) + { + EC_DBG(KERN_WARNING "EtherCAT: Writing failed - " + "Slave %04X (at %0X) has no description.\n", + slave->station_address, (unsigned int) slave); + return; + } + + if (!slave->desc->write) + { + EC_DBG(KERN_WARNING "EtherCAT: Writing failed - " + "Slave type (%s %s) has no write method.\n", + slave->desc->vendor_name, slave->desc->product_name); + return; + } + + if (channel >= slave->desc->channels) + { + EC_DBG(KERN_WARNING "EtherCAT: Writing failed - " + "Slave %4X (%s %s) has no channel %i.\n", + slave->station_address, slave->desc->vendor_name, + slave->desc->product_name, channel); + return; + } + + slave->desc->write(slave->process_data, channel, value); +} + +/***************************************************************/