summaryrefslogtreecommitdiffhomepage
path: root/digital/io-hub/src/common-cc
diff options
context:
space:
mode:
authorNicolas Schodet2013-05-03 22:38:33 +0200
committerNicolas Schodet2013-05-03 22:46:11 +0200
commitdb5b710341a0780aadc432f590b78964c021942c (patch)
treed6a8c0a8f13cd4e237b43a6c97d89dbea205e271 /digital/io-hub/src/common-cc
parent90568fb312d5dce6437edaeb21b9a87681ea82cb (diff)
digital/io-hub/src/common-cc: drop messages to absent slaves
Diffstat (limited to 'digital/io-hub/src/common-cc')
-rw-r--r--digital/io-hub/src/common-cc/i2c_queue.cc8
-rw-r--r--digital/io-hub/src/common-cc/i2c_queue.hh2
2 files changed, 8 insertions, 2 deletions
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.