From 1d58e89826371d1d51a15f05dcf9683b700a4ad8 Mon Sep 17 00:00:00 2001 From: Jeff Hoefs Date: Sat, 7 Feb 2015 11:56:51 -0800 Subject: [PATCH] prevent analog reporting during system reset --- examples/StandardFirmata/StandardFirmata.ino | 16 ++++++++++++---- .../StandardFirmataYun/StandardFirmataYun.ino | 19 +++++++++++++------ extras/revisions.txt | 3 +++ 3 files changed, 28 insertions(+), 10 deletions(-) diff --git a/examples/StandardFirmata/StandardFirmata.ino b/examples/StandardFirmata/StandardFirmata.ino index 7ddc8101..49da4abb 100644 --- a/examples/StandardFirmata/StandardFirmata.ino +++ b/examples/StandardFirmata/StandardFirmata.ino @@ -77,6 +77,8 @@ struct i2c_device_info { /* for i2c read continuous more */ i2c_device_info query[MAX_QUERIES]; +boolean isResetting = false; + byte i2cRxData[32]; boolean isI2CEnabled = false; signed char queryIndex = -1; @@ -349,10 +351,14 @@ void reportAnalogCallback(byte analogPin, int value) analogInputsToReport = analogInputsToReport & ~ (1 << analogPin); } else { analogInputsToReport = analogInputsToReport | (1 << analogPin); - // Send pin value immediately. This is helpful when connected via - // ethernet, wi-fi or bluetooth so pin states can be known upon - // reconnecting. - Firmata.sendAnalog(analogPin, analogRead(analogPin)); + // prevent during system reset or all analog pin values will be reported + // which may report noise for unconnected analog pins + if (!isResetting) { + // Send pin value immediately. This is helpful when connected via + // ethernet, wi-fi or bluetooth so pin states can be known upon + // reconnecting. + Firmata.sendAnalog(analogPin, analogRead(analogPin)); + } } } // TODO: save status to EEPROM here, if changed @@ -610,6 +616,7 @@ void disableI2CPins() { void systemResetCallback() { + isResetting = true; // initialize a defalt state // TODO: option to load config from EEPROM instead of default if (isI2CEnabled) { @@ -650,6 +657,7 @@ void systemResetCallback() outputPort(i, readPort(i, portConfigInputs[i]), true); } */ + isResetting = false; } void setup() diff --git a/examples/StandardFirmataYun/StandardFirmataYun.ino b/examples/StandardFirmataYun/StandardFirmataYun.ino index c3dd581a..b2e671f0 100644 --- a/examples/StandardFirmataYun/StandardFirmataYun.ino +++ b/examples/StandardFirmataYun/StandardFirmataYun.ino @@ -78,6 +78,8 @@ struct i2c_device_info { /* for i2c read continuous more */ i2c_device_info query[MAX_QUERIES]; +boolean isResetting = false; + byte i2cRxData[32]; boolean isI2CEnabled = false; signed char queryIndex = -1; @@ -355,13 +357,16 @@ void reportAnalogCallback(byte analogPin, int value) if (analogPin < TOTAL_ANALOG_PINS) { if (value == 0) { analogInputsToReport = analogInputsToReport & ~ (1 << analogPin); - } - else { + } else { analogInputsToReport = analogInputsToReport | (1 << analogPin); - // Send pin value immediately. This is helpful when connected via - // ethernet, wi-fi or bluetooth so pin states can be known upon - // reconnecting. - Firmata.sendAnalog(analogPin, analogRead(analogPin)); + // prevent during system reset or all analog pin values will be reported + // which may report noise for unconnected analog pins + if (!isResetting) { + // Send pin value immediately. This is helpful when connected via + // ethernet, wi-fi or bluetooth so pin states can be known upon + // reconnecting. + Firmata.sendAnalog(analogPin, analogRead(analogPin)); + } } } // TODO: save status to EEPROM here, if changed @@ -621,6 +626,7 @@ void disableI2CPins() { void systemResetCallback() { + isResetting = true; // initialize a defalt state // TODO: option to load config from EEPROM instead of default if (isI2CEnabled) { @@ -662,6 +668,7 @@ void systemResetCallback() outputPort(i, readPort(i, portConfigInputs[i]), true); } */ + isResetting = false; } void setup() diff --git a/extras/revisions.txt b/extras/revisions.txt index 5444420a..d85a0025 100644 --- a/extras/revisions.txt +++ b/extras/revisions.txt @@ -3,6 +3,9 @@ FIRMATA 2.4.1 - Feb 7, 2015 [core library] * Fixed off-by-one bug in setFirmwareNameAndVersion (Brian Schmalz) +[StandardFirmata] +* Prevent analog values from being reported during system reset + FIRMATA 2.4.0 - Dec 21, 2014 Changes from 2.3.6 to 2.4 that may impact existing Firmata client implementations: