diff -r 6b3b8acb71b5 -r 7506e67dd122 master/slave.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/master/slave.c Tue Jan 17 18:28:15 2006 +0000 @@ -0,0 +1,200 @@ +/****************************************************************************** + * + * s l a v e . c + * + * Methoden für einen EtherCAT-Slave. + * + * $Id$ + * + *****************************************************************************/ + +#include + +#include "globals.h" +#include "slave.h" + +/*****************************************************************************/ + +/** + EtherCAT-Slave-Konstruktor. + + Initialisiert einen EtherCAT-Slave. + + ACHTUNG! Dieser Konstruktor wird quasi nie aufgerufen. Bitte immer das + Makro ECAT_INIT_SLAVE() in ec_slave.h anpassen! + + @param slave Zeiger auf den zu initialisierenden Slave +*/ + +void ec_slave_init(ec_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->serial_number = 0; + slave->desc = NULL; + slave->logical_address = 0; + slave->current_state = EC_SLAVE_STATE_UNKNOWN; + slave->requested_state = EC_SLAVE_STATE_UNKNOWN; + slave->process_data = NULL; + slave->domain = 0; + slave->error_reported = 0; +} + +/*****************************************************************************/ + +#if 0 +/** + 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 (unlikely(!slave->desc)) { + if (likely(slave->error_reported)) { + printk(KERN_WARNING "EtherCAT: Reading failed on slave %04X (addr %0X)" + " - Slave has no description.\n", + slave->station_address, (unsigned int) slave); + slave->error_reported = 1; + } + return 0; + } + + if (unlikely(!slave->desc->read)) { + if (likely(slave->error_reported)) { + printk(KERN_WARNING "EtherCAT: Reading failed on slave %04X (addr %0X)" + " - Slave type (%s %s) has no read method.\n", + slave->station_address, (unsigned int) slave, + slave->desc->vendor_name, slave->desc->product_name); + slave->error_reported = 1; + } + return 0; + } + + if (unlikely(channel >= slave->desc->channel_count)) { + if (likely(slave->error_reported)) { + printk(KERN_WARNING "EtherCAT: Reading failed on slave %4X (addr %0X)" + " - Type (%s %s) has no channel %i.\n", + slave->station_address, (unsigned int) slave, + slave->desc->vendor_name, slave->desc->product_name, + channel); + slave->error_reported = 1; + } + return 0; + } + + if (unlikely(!slave->process_data)) { + if (likely(slave->error_reported)) { + printk(KERN_WARNING "EtherCAT: Reading failed on slave %4X (addr %0X)" + " - Slave does not belong to any process data object!\n", + slave->station_address, (unsigned int) slave); + slave->error_reported = 1; + } + return 0; + } + + if (unlikely(slave->error_reported)) + slave->error_reported = 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 (unlikely(!slave->desc)) { + if (likely(slave->error_reported)) { + printk(KERN_WARNING "EtherCAT: Writing failed on slave %04X (addr %0X)" + " - Slave has no description.\n", + slave->station_address, (unsigned int) slave); + slave->error_reported = 1; + } + return; + } + + if (unlikely(!slave->desc->write)) { + if (likely(slave->error_reported)) { + printk(KERN_WARNING "EtherCAT: Writing failed on slave %04X (addr %0X)" + " - Type (%s %s) has no write method.\n", + slave->station_address, (unsigned int) slave, + slave->desc->vendor_name, slave->desc->product_name); + slave->error_reported = 1; + } + return; + } + + if (unlikely(channel >= slave->desc->channel_count)) { + if (likely(slave->error_reported)) { + printk(KERN_WARNING "EtherCAT: Writing failed on slave %4X (addr %0X)" + " - Type (%s %s) has no channel %i.\n", + slave->station_address, (unsigned int) slave, + slave->desc->vendor_name, slave->desc->product_name, + channel); + slave->error_reported = 1; + } + return; + } + + if (unlikely(!slave->process_data)) { + if (likely(slave->error_reported)) { + printk(KERN_WARNING "EtherCAT: Writing failed on slave %4X (addr %0X)" + " - Slave does not belong to any process data object!\n", + slave->station_address, (unsigned int) slave); + slave->error_reported = 1; + } + return; + } + + if (unlikely(slave->error_reported)) + slave->error_reported = 0; + + slave->desc->write(slave->process_data, channel, value); +} + +/*****************************************************************************/ + +EXPORT_SYMBOL(EtherCAT_write_value); +EXPORT_SYMBOL(EtherCAT_read_value); +#endif + +/*****************************************************************************/ + +/* Emacs-Konfiguration +;;; Local Variables: *** +;;; c-basic-offset:2 *** +;;; End: *** +*/