From db5b710341a0780aadc432f590b78964c021942c Mon Sep 17 00:00:00 2001 From: Nicolas Schodet Date: Fri, 3 May 2013 22:38:33 +0200 Subject: digital/io-hub/src/common-cc: drop messages to absent slaves --- digital/io-hub/src/common-cc/i2c_queue.cc | 8 ++++++-- digital/io-hub/src/common-cc/i2c_queue.hh | 2 ++ 2 files changed, 8 insertions(+), 2 deletions(-) (limited to 'digital/io-hub/src/common-cc') diff --git a/digital/io-hub/src/common-cc/i2c_queue.cc b/digital/io-hub/src/common-cc/i2c_queue.cc index 1dcb9e04..0e418241 100644 --- a/digital/io-hub/src/common-cc/i2c_queue.cc +++ b/digital/io-hub/src/common-cc/i2c_queue.cc @@ -43,8 +43,8 @@ I2cQueue::Slave::Slave (I2cQueue &queue, uint8_t address, int status_size) : next_ (0), queue_ (queue), raw_status_size_ (status_size ? header_size + status_size : 0), - address_ (address), seq_ (0), last_status_valid_ (false), - transient_commands_index_ (0) + address_ (address), seq_ (0), present_ (status_size ? false : true), + last_status_valid_ (false), transient_commands_index_ (0) { queue.register_slave (*this); ucoo::assert (status_size <= status_size_max); @@ -82,6 +82,7 @@ I2cQueue::sync () { if (s->last_status_valid_) { + s->present_ = true; s->recv_status (s->last_raw_status_ + header_size); // On initialisation, copy sequence number. if (!s->seq_) @@ -116,6 +117,9 @@ I2cQueue::send (Slave &slave, const uint8_t *command, int size, Command *c; ucoo::assert (size <= command_size_max); unsigned int transient_commands_index = 0; + // If slave is not there, drop. + if (!slave.present_) + return; // Find command buffer. if (type == TRANSIENT) { diff --git a/digital/io-hub/src/common-cc/i2c_queue.hh b/digital/io-hub/src/common-cc/i2c_queue.hh index d2a0e584..993e7a2c 100644 --- a/digital/io-hub/src/common-cc/i2c_queue.hh +++ b/digital/io-hub/src/common-cc/i2c_queue.hh @@ -111,6 +111,8 @@ class I2cQueue : public ucoo::I2cMaster::FinishedHandler uint8_t address_; /// Last command sequence number. uint8_t seq_; + /// Is this slave present? + bool present_; /// Whether last received status was valid. bool last_status_valid_; /// Last received status. -- cgit v1.2.3