Skip to content

Commit 9644fb1

Browse files
add setPinValueCallback to new StandardFirmata variants
1 parent d6095c6 commit 9644fb1

File tree

3 files changed

+30
-1
lines changed

3 files changed

+30
-1
lines changed

Firmata.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232
#define REPORT_DIGITAL 0xD0 // enable digital input by port pair
3333
//
3434
#define SET_PIN_MODE 0xF4 // set a pin to INPUT/OUTPUT/PWM/etc
35-
//
3635
#define SET_DIGITAL_PIN_VALUE 0xF5 // set value of an individual digital pin
3736
//
3837
#define REPORT_VERSION 0xF9 // report protocol version

examples/StandardFirmataEthernetPlus/StandardFirmataEthernetPlus.ino

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -510,6 +510,20 @@ void setPinModeCallback(byte pin, int mode)
510510
// TODO: save status to EEPROM here, if changed
511511
}
512512

513+
/*
514+
* Sets the value of an individual pin.
515+
* Useful if you want to set a pin value but are not tracking the digital port state.
516+
*/
517+
void setPinValueCallback(byte pin, int value)
518+
{
519+
if (pin < TOTAL_PINS && IS_PIN_DIGITAL(pin)) {
520+
if (pinConfig[pin] == OUTPUT || pinConfig[pin] == INPUT) {
521+
pinState[pin] = value;
522+
digitalWrite(PIN_TO_DIGITAL(pin), value);
523+
}
524+
}
525+
}
526+
513527
void analogWriteCallback(byte pin, int value)
514528
{
515529
if (pin < TOTAL_PINS) {
@@ -1056,6 +1070,7 @@ void setup()
10561070
Firmata.attach(REPORT_ANALOG, reportAnalogCallback);
10571071
Firmata.attach(REPORT_DIGITAL, reportDigitalCallback);
10581072
Firmata.attach(SET_PIN_MODE, setPinModeCallback);
1073+
Firmata.attach(SET_DIGITAL_PIN_VALUE, setPinValueCallback);
10591074
Firmata.attach(START_SYSEX, sysexCallback);
10601075
Firmata.attach(SYSTEM_RESET, systemResetCallback);
10611076

examples/StandardFirmataPlus/StandardFirmataPlus.ino

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -442,6 +442,20 @@ void setPinModeCallback(byte pin, int mode)
442442
// TODO: save status to EEPROM here, if changed
443443
}
444444

445+
/*
446+
* Sets the value of an individual pin.
447+
* Useful if you want to set a pin value but are not tracking the digital port state.
448+
*/
449+
void setPinValueCallback(byte pin, int value)
450+
{
451+
if (pin < TOTAL_PINS && IS_PIN_DIGITAL(pin)) {
452+
if (pinConfig[pin] == OUTPUT || pinConfig[pin] == INPUT) {
453+
pinState[pin] = value;
454+
digitalWrite(PIN_TO_DIGITAL(pin), value);
455+
}
456+
}
457+
}
458+
445459
void analogWriteCallback(byte pin, int value)
446460
{
447461
if (pin < TOTAL_PINS) {
@@ -982,6 +996,7 @@ void setup()
982996
Firmata.attach(REPORT_ANALOG, reportAnalogCallback);
983997
Firmata.attach(REPORT_DIGITAL, reportDigitalCallback);
984998
Firmata.attach(SET_PIN_MODE, setPinModeCallback);
999+
Firmata.attach(SET_DIGITAL_PIN_VALUE, setPinValueCallback);
9851000
Firmata.attach(START_SYSEX, sysexCallback);
9861001
Firmata.attach(SYSTEM_RESET, systemResetCallback);
9871002

0 commit comments

Comments
 (0)