Skip to content

Commit d6095c6

Browse files
implement protocol to set digital pin value
1 parent 093f983 commit d6095c6

File tree

6 files changed

+69
-0
lines changed

6 files changed

+69
-0
lines changed

Firmata.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,10 @@ void FirmataClass::processInput(void)
238238
if (currentPinModeCallback)
239239
(*currentPinModeCallback)(storedInputData[1], storedInputData[0]);
240240
break;
241+
case SET_DIGITAL_PIN_VALUE:
242+
if (currentPinValueCallback)
243+
(*currentPinValueCallback)(storedInputData[1], storedInputData[0]);
244+
break;
241245
case REPORT_ANALOG:
242246
if (currentReportAnalogCallback)
243247
(*currentReportAnalogCallback)(multiByteChannel, storedInputData[0]);
@@ -262,6 +266,7 @@ void FirmataClass::processInput(void)
262266
case ANALOG_MESSAGE:
263267
case DIGITAL_MESSAGE:
264268
case SET_PIN_MODE:
269+
case SET_DIGITAL_PIN_VALUE:
265270
waitForData = 2; // two data bytes needed
266271
executeMultiByteCommand = command;
267272
break;
@@ -367,6 +372,7 @@ void FirmataClass::attach(byte command, callbackFunction newFunction)
367372
case REPORT_ANALOG: currentReportAnalogCallback = newFunction; break;
368373
case REPORT_DIGITAL: currentReportDigitalCallback = newFunction; break;
369374
case SET_PIN_MODE: currentPinModeCallback = newFunction; break;
375+
case SET_DIGITAL_PIN_VALUE: currentPinValueCallback = newFunction; break;
370376
}
371377
}
372378

Firmata.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@
3333
//
3434
#define SET_PIN_MODE 0xF4 // set a pin to INPUT/OUTPUT/PWM/etc
3535
//
36+
#define SET_DIGITAL_PIN_VALUE 0xF5 // set value of an individual digital pin
37+
//
3638
#define REPORT_VERSION 0xF9 // report protocol version
3739
#define SYSTEM_RESET 0xFF // reset from MIDI
3840
//
@@ -150,6 +152,7 @@ class FirmataClass
150152
callbackFunction currentReportAnalogCallback;
151153
callbackFunction currentReportDigitalCallback;
152154
callbackFunction currentPinModeCallback;
155+
callbackFunction currentPinValueCallback;
153156
systemResetCallbackFunction currentSystemResetCallback;
154157
stringCallbackFunction currentStringCallback;
155158
sysexCallbackFunction currentSysexCallback;

examples/StandardFirmata/StandardFirmata.ino

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

307+
/*
308+
* Sets the value of an individual pin.
309+
* Useful if you want to set a pin value but are not tracking the digital port state.
310+
*/
311+
void setPinValueCallback(byte pin, int value)
312+
{
313+
if (pin < TOTAL_PINS && IS_PIN_DIGITAL(pin)) {
314+
if (pinConfig[pin] == OUTPUT || pinConfig[pin] == INPUT) {
315+
pinState[pin] = value;
316+
digitalWrite(PIN_TO_DIGITAL(pin), value);
317+
}
318+
}
319+
}
320+
307321
void analogWriteCallback(byte pin, int value)
308322
{
309323
if (pin < TOTAL_PINS) {
@@ -674,6 +688,7 @@ void setup()
674688
Firmata.attach(REPORT_ANALOG, reportAnalogCallback);
675689
Firmata.attach(REPORT_DIGITAL, reportDigitalCallback);
676690
Firmata.attach(SET_PIN_MODE, setPinModeCallback);
691+
Firmata.attach(SET_DIGITAL_PIN_VALUE, setPinValueCallback);
677692
Firmata.attach(START_SYSEX, sysexCallback);
678693
Firmata.attach(SYSTEM_RESET, systemResetCallback);
679694

examples/StandardFirmataChipKIT/StandardFirmataChipKIT.ino

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

318+
/*
319+
* Sets the value of an individual pin.
320+
* Useful if you want to set a pin value but are not tracking the digital port state.
321+
*/
322+
void setPinValueCallback(byte pin, int value)
323+
{
324+
if (pin < TOTAL_PINS && IS_PIN_DIGITAL(pin)) {
325+
if (pinConfig[pin] == OUTPUT || pinConfig[pin] == INPUT) {
326+
pinState[pin] = value;
327+
digitalWrite(PIN_TO_DIGITAL(pin), value);
328+
}
329+
}
330+
}
331+
318332
void analogWriteCallback(byte pin, int value)
319333
{
320334
if (pin < TOTAL_PINS) {
@@ -683,6 +697,7 @@ void setup()
683697
Firmata.attach(REPORT_ANALOG, reportAnalogCallback);
684698
Firmata.attach(REPORT_DIGITAL, reportDigitalCallback);
685699
Firmata.attach(SET_PIN_MODE, setPinModeCallback);
700+
Firmata.attach(SET_DIGITAL_PIN_VALUE, setPinValueCallback);
686701
Firmata.attach(START_SYSEX, sysexCallback);
687702
Firmata.attach(SYSTEM_RESET, systemResetCallback);
688703

examples/StandardFirmataEthernet/StandardFirmataEthernet.ino

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

423+
/*
424+
* Sets the value of an individual pin.
425+
* Useful if you want to set a pin value but are not tracking the digital port state.
426+
*/
427+
void setPinValueCallback(byte pin, int value)
428+
{
429+
if (pin < TOTAL_PINS && IS_PIN_DIGITAL(pin)) {
430+
if (pinConfig[pin] == OUTPUT || pinConfig[pin] == INPUT) {
431+
pinState[pin] = value;
432+
digitalWrite(PIN_TO_DIGITAL(pin), value);
433+
}
434+
}
435+
}
436+
423437
void analogWriteCallback(byte pin, int value)
424438
{
425439
if (pin < TOTAL_PINS) {
@@ -804,6 +818,7 @@ void setup()
804818
Firmata.attach(REPORT_ANALOG, reportAnalogCallback);
805819
Firmata.attach(REPORT_DIGITAL, reportDigitalCallback);
806820
Firmata.attach(SET_PIN_MODE, setPinModeCallback);
821+
Firmata.attach(SET_DIGITAL_PIN_VALUE, setPinValueCallback);
807822
Firmata.attach(START_SYSEX, sysexCallback);
808823
Firmata.attach(SYSTEM_RESET, systemResetCallback);
809824

examples/StandardFirmataYun/StandardFirmataYun.ino

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

319+
/*
320+
* Sets the value of an individual pin.
321+
* Useful if you want to set a pin value but are not tracking the digital port state.
322+
*/
323+
void setPinValueCallback(byte pin, int value)
324+
{
325+
if (pin < TOTAL_PINS && IS_PIN_DIGITAL(pin)) {
326+
if (pinConfig[pin] == OUTPUT || pinConfig[pin] == INPUT) {
327+
pinState[pin] = value;
328+
digitalWrite(PIN_TO_DIGITAL(pin), value);
329+
}
330+
}
331+
}
332+
319333
void analogWriteCallback(byte pin, int value)
320334
{
321335
if (pin < TOTAL_PINS) {
@@ -698,6 +712,7 @@ void setup()
698712
Firmata.attach(REPORT_ANALOG, reportAnalogCallback);
699713
Firmata.attach(REPORT_DIGITAL, reportDigitalCallback);
700714
Firmata.attach(SET_PIN_MODE, setPinModeCallback);
715+
Firmata.attach(SET_DIGITAL_PIN_VALUE, setPinValueCallback);
701716
Firmata.attach(START_SYSEX, sysexCallback);
702717
Firmata.attach(SYSTEM_RESET, systemResetCallback);
703718

0 commit comments

Comments
 (0)