Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

merge upstream changes #1

Merged
merged 167 commits into from
Mar 9, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
167 commits
Select commit Hold shift + click to select a range
92eed41
initial pass at BLE firmata for Arduino 101
soundanalogous Dec 31, 2015
6ce3fbe
fix previousMillis val. minor BLEStream improvements
soundanalogous Jan 4, 2016
e7a2c30
add support for BLEPeripheral library
soundanalogous Feb 21, 2016
1b61d8f
use pin state and mode getters and setters
soundanalogous Feb 27, 2016
c37292f
temp fix for config query issue
soundanalogous Feb 27, 2016
009eff9
proper check for available packets
soundanalogous Feb 28, 2016
733746f
updated comments in bleConfig
soundanalogous Mar 5, 2016
9788f7f
add ble connection interval and ble TX flush interval
soundanalogous Mar 6, 2016
25e6615
increase i2c RX data buffer to 64 bytes
soundanalogous Mar 14, 2016
ae85c84
skip setConnectionInterval for Arduino 101 by default
soundanalogous Mar 14, 2016
c27ab47
Merge pull request #279 from firmata/ble
soundanalogous Mar 14, 2016
872e3cc
add missing SerialFirmata.h optional include
soundanalogous Mar 14, 2016
a3b3f65
fix issue where BLEPeripheral lib needed to be included even if not n…
soundanalogous Apr 5, 2016
68db055
Merge pull request #283 from firmata/bleperipheral-dep-fix
soundanalogous Apr 5, 2016
9f476ad
do not ignore MKR1000 pins
soundanalogous Apr 10, 2016
e5582d0
default config to MKR1000 / Arduino WiFi Shield 101
soundanalogous Apr 10, 2016
51e3c7d
Adds ESP8266 support c/o jacobrosental and jnsbyr
jacobrosenthal Feb 18, 2016
86a8273
Merge pull request #286 from firmata/esp
soundanalogous Apr 11, 2016
9402128
WiFiClientStream added
jnsbyr Apr 15, 2016
3d2085c
WiFiServer activation moved from constructor to maintain
jnsbyr Apr 16, 2016
b6573c8
WiFiServerStream fix & host connection callback
jnsbyr Apr 17, 2016
57967d3
WiFiServerStream connected state
jnsbyr Apr 17, 2016
21fd184
Merge pull request #289 from jnsbyr/wifi-client
soundanalogous Apr 17, 2016
ccaa903
update some wifi config instructions
soundanalogous Apr 17, 2016
077aa19
refactor setup function
soundanalogous Apr 18, 2016
55ed0f6
connection state management modified
jnsbyr Apr 23, 2016
c553c3b
Merge pull request #291 from jnsbyr/wifi-client
soundanalogous Apr 24, 2016
7573a58
simplify pin ignore configuration
soundanalogous Apr 24, 2016
562e060
Merge pull request #290 from soundanalogous/wifi-client
soundanalogous Apr 24, 2016
fbd7667
Merge pull request #292 from firmata/wifi-client
soundanalogous Apr 26, 2016
8449265
enable CurieBLE.setConnectionInterval
soundanalogous Jun 16, 2016
5d93938
Merge pull request #294 from firmata/curie-update
soundanalogous Jun 16, 2016
08436bd
move EthernetClientStream.cpp to .h file
soundanalogous Jun 19, 2016
bcabc47
consolidate StandardFirmataEthernet variants
soundanalogous Jun 19, 2016
d12da78
Merge pull request #295 from firmata/ethernet-updates
soundanalogous Jun 19, 2016
8cdf1b1
cleanup whitespace
soundanalogous Jun 19, 2016
aac822a
bump version to 2.5.3
soundanalogous Jun 19, 2016
4759f26
Removed some spelling mistakes in the comments
shantanu404 Jul 30, 2016
048bc8f
More spelling corrections
shantanu404 Jul 30, 2016
bc956be
Merge pull request #297 from shantanu69/patch-1
soundanalogous Jul 30, 2016
982056b
Update url of ThomasWeinert/carica-firmata
igrybkov Sep 1, 2016
aac7667
Merge pull request #301 from igrybkov/patch-1
soundanalogous Sep 1, 2016
af6ad68
add links to vvvv and openFrameworks client libraries
soundanalogous Sep 5, 2016
492faae
Add Rust firmata client library
kelcecil Oct 13, 2016
1de9c19
Merge pull request #307 from kelcecil/rust-firmata-lib
soundanalogous Oct 13, 2016
6ac21c6
fix compiler error for Arduino 1.0.6 and older
soundanalogous Oct 16, 2016
b75fff7
Fix compiler issues due to SofwareSerial
soundanalogous Oct 16, 2016
5da81d6
forward declare some functions to avoid complier errors in old IDE ve…
soundanalogous Oct 16, 2016
3d9d50a
explain why some functions are forward declared
soundanalogous Oct 16, 2016
609341b
Merge pull request #310 from firmata/older-ide-fixes
soundanalogous Oct 16, 2016
281b99f
Respect default pin state when setting OUTPUT mode
soundanalogous Oct 16, 2016
f332d77
add Teensy 3.5 and 3.6 to Boards.h
soundanalogous Oct 17, 2016
c744d22
Merge pull request #312 from firmata/new-teensy-boards
PaulStoffregen Oct 21, 2016
5d9b298
Merge pull request #311 from firmata/issue-302
soundanalogous Oct 22, 2016
39c8e70
bump bugfix version
soundanalogous Oct 24, 2016
bdd3916
Split parsing functionality into new lib
zfields Oct 28, 2016
8359209
Update FirmataClass to use FirmataParser
zfields Oct 31, 2016
854b877
Merge pull request #313 from zfields/parser
soundanalogous Oct 31, 2016
b976cf5
ensure release.sh bundles all .cpp and .h files
soundanalogous Oct 31, 2016
b4690be
Update Readme.md
wbadry Nov 3, 2016
4ab1e25
Merge pull request #317 from wbadry/patch-1
soundanalogous Nov 3, 2016
3c7aa05
Update FirmataParser to support older compilers
zfields Nov 7, 2016
d38adba
Split marshalling functionality into new lib
zfields Nov 7, 2016
5668cfc
Update FirmataClass to use FirmataMarshaller
zfields Nov 7, 2016
2c24de7
Merge pull request #319 from zfields/marshal
soundanalogous Nov 7, 2016
c78d0e2
Merge pull request #323 from zfields/parserFix
soundanalogous Nov 7, 2016
94d007a
Compiler optimizations for new classes
zfields Nov 9, 2016
62e39c4
Merge pull request #327 from zfields/opt
soundanalogous Nov 12, 2016
6463281
Abstract FirmataParser memory allocation scheme
zfields Nov 16, 2016
0eb25f2
Merge pull request #332 from zfields/memory
soundanalogous Nov 21, 2016
bebfe5d
Add cast for compatibility with the next version of CurieBLE
sandeepmistry Dec 2, 2016
999f95f
Add support for Arduino MKRZero
sandeepmistry Dec 14, 2016
ae028fb
Merge pull request #337 from sandeepmistry/mkrzero
soundanalogous Dec 14, 2016
74df903
Add FirmataMarshaller::sendCapabilityQuery
zfields Nov 12, 2016
34ecce3
Support Firmata's core functionality
zfields Feb 2, 2017
29b4399
Address code review comments/concerns
zfields Feb 7, 2017
2bd457a
Merge pull request #345 from zfields/core
soundanalogous Feb 22, 2017
1819548
namespace firmata
zfields Feb 24, 2017
6004516
Remove redundant naming
zfields Feb 25, 2017
3cd149c
Unify sysex payload naming to DATA
zfields Feb 26, 2017
bf3f08f
Merge pull request #348 from zfields/namespace
soundanalogous Feb 26, 2017
7165b6a
sendPinStateQuery
zfields Feb 24, 2017
2e09889
setSamplingInterval
zfields Feb 26, 2017
d0bef9e
sendExtendedAnalog
zfields Feb 26, 2017
fa5b3d6
Address bug caught code review
zfields Feb 26, 2017
9433b27
Add system calls to Marshaller
zfields Feb 27, 2017
44e9026
Merge pull request #350 from zfields/mp_complete
soundanalogous Feb 28, 2017
947784f
Merge pull request #335 from sandeepmistry/curie-ble-v2
soundanalogous Mar 2, 2017
168a0c0
prepare release and bump bugfix version
soundanalogous Mar 7, 2017
fd76083
firmware callbacks
zfields Mar 13, 2017
0d9e533
Merge pull request #359 from zfields/firmware
soundanalogous Mar 14, 2017
d96a110
Add support for Arduino Primo board
Mar 16, 2017
260f127
Merge pull request #360 from chiararuggeri/ArduinoPrimo
soundanalogous Mar 16, 2017
eb5e7cd
Improve decoding algorithm
zfields Mar 16, 2017
8f83459
Fix bug #363 - string encoding
zfields Mar 18, 2017
f18eb75
Merge pull request #364 from zfields/bug
soundanalogous Mar 18, 2017
f1bd40f
add tests for sending and receiving strings
soundanalogous Mar 18, 2017
f1b521e
Merge pull request #365 from firmata/string-parser-test
soundanalogous Mar 18, 2017
f13a61b
bugfix release
soundanalogous Mar 18, 2017
182673a
Adapt markdown
frederic34 Apr 9, 2017
4a13241
Adapt markdown Content table
frederic34 Apr 9, 2017
4cfb2bc
Adapt markdown Content table
frederic34 Apr 9, 2017
b112c41
Merge pull request #368 from frederic34/markdown
soundanalogous Apr 10, 2017
c63a34e
Fix broken Markdown headings
bryant1410 Apr 18, 2017
de495a8
Merge pull request #369 from bryant1410/master
soundanalogous Apr 18, 2017
7507bb9
Add support for Arduino MKRFox1200
sandeepmistry Apr 19, 2017
d4a9ba9
MKRZero, MKR1000, MKRFox1200: remove !IS_PIN_SERIAL check in IS_PIN_D…
sandeepmistry Apr 19, 2017
ecfea68
Merge pull request #370 from sandeepmistry/mkrfox1200
soundanalogous Apr 19, 2017
138a39f
Add support for STM32 MCU based boards
fpistm Aug 1, 2017
fd6d2f6
Merge pull request #378 from fpistm/arduino_core_stm32
soundanalogous Aug 6, 2017
d1848c1
added server mode
MJPees Jul 9, 2017
b7af0a4
Merge pull request #375 from MJPees/master
soundanalogous Aug 8, 2017
0651617
Improve StandardFirmataEthernet logging
soundanalogous Aug 14, 2017
972bcce
Merge pull request #380 from firmata/ethernet-logging
soundanalogous Aug 14, 2017
ac32d18
add Adafruit nrf52 boards
hathach Aug 15, 2017
78d340f
Merge pull request #381 from hathach/adafruit-nrf52-boards
soundanalogous Aug 15, 2017
4fce1f3
Fix I2C config parameter interpretation
zfields Aug 18, 2017
e862c12
Merge pull request #383 from firmata/i2c_config
soundanalogous Aug 19, 2017
a939ca1
bugfix release
soundanalogous Aug 19, 2017
defa0ea
Add support for Arduino MKR WAN 1300 and MKR GSM 1400
sandeepmistry Dec 1, 2017
e0594d4
[STM32] Avoid using non standard constant
fpistm Jan 29, 2018
e86d0fb
Merge pull request #390 from fpistm/generic_constant
soundanalogous Jan 29, 2018
73a7363
update link to list of host software packages
soundanalogous Mar 3, 2018
a1a3067
update firmata.js url
soundanalogous Mar 3, 2018
e3a2932
Moved configuration of BLE connection and flush intervals to bleConfig.h
cstawarz Mar 19, 2018
c2e8da3
Added support for the Adafruit Feather M0 Bluefruit LE (and potential…
cstawarz Mar 19, 2018
5b8b9f0
Restored use of setter methods for BLE configuration
cstawarz Apr 4, 2018
00587f8
extend number of supported hardware serial ports to 6
petrosagg Apr 13, 2018
47fa25d
boards: fix pin mapping for Teensy 3.5 and 3.6
petrosagg Apr 13, 2018
240e564
Merge pull request #393 from cstawarz/bluefruit_le_spi
soundanalogous Apr 15, 2018
c669cc3
boards: update IS_PIN_SERIAL for Teensy 3.5 & 3.6
petrosagg Apr 15, 2018
3028ba8
Merge pull request #385 from sandeepmistry/mkrwan1300-mkrgsm1400
soundanalogous Apr 15, 2018
f863f17
Merge pull request #395 from resin-os/teensy-3.6-uart
soundanalogous Apr 15, 2018
d78cd6c
change last updated date
soundanalogous Apr 15, 2018
8cbe99b
bump bugfix version
soundanalogous Apr 15, 2018
f9d9ec4
Add Pharo support
SergeStinckwich May 11, 2018
74980b9
Merge pull request #397 from SergeStinckwich/patch-1
soundanalogous May 12, 2018
b1428e2
Use a single tab field separator in keywords.txt
per1234 Jul 15, 2018
cb78078
Merge pull request #401 from per1234/keywords_txt-multiple-tabs
soundanalogous Jul 15, 2018
3d78638
Remove invalid reference link from keywords.txt
per1234 Sep 9, 2018
ecfcd86
Merge pull request #405 from per1234/invalid-reference_link
soundanalogous Sep 12, 2018
f3fef2b
Support for Sanguino/Melzi, e.g. Creality Ender-3
Oct 30, 2018
521bdc9
Add support for UNO WiFi Rev2 (ATMega4809)
facchinm Oct 30, 2018
aabe980
Merge pull request #408 from facchinm/atmega4809
soundanalogous Nov 1, 2018
533c89c
Merge pull request #409 from brandstaetter/Sanguino_ATmega1284P
soundanalogous Nov 1, 2018
f9c978d
update TOTAL_PINS for nrf52840 (64 pins max)
hathach Nov 8, 2018
2ad7d26
Merge pull request #410 from hathach/master
soundanalogous Nov 9, 2018
b28dd5d
Add support for Arduino MKR WiFi 1010
gdsports Apr 4, 2019
90bc51a
Merge pull request #418 from gdsports/mkr1010
soundanalogous Apr 5, 2019
f22fe54
Adjusted Bluefruit LE connection intervals for better compatibility w…
cstawarz Apr 24, 2019
f30c3d1
Merge pull request #419 from cstawarz/bluefruit_le_update
soundanalogous Apr 25, 2019
ad2fd4f
Added a condition that adds the SoftwareSerial library for the ESP8266.
daftfox Apr 27, 2019
95782e0
Merge pull request #420 from daftfox/feature/add-support-for-esp8266
soundanalogous Apr 27, 2019
5f21157
Set Bluefruit LE advertising interval
cstawarz May 3, 2019
9868fbf
Merge pull request #422 from cstawarz/ble_advertising_interval
soundanalogous May 18, 2019
3f417c1
Set up API docs using Doxygen
mexchip Oct 10, 2019
ce166eb
Merge pull request #428 from mexchip/doxygen-docs
soundanalogous Oct 12, 2019
bdc2892
Update readme.md
soundanalogous Oct 12, 2019
663454a
Add support for SPRESENSE board
baggio63446333 Oct 20, 2019
1ccb2c0
Merge pull request #431 from baggio63446333/master
soundanalogous Oct 20, 2019
a142327
Fix build issue with arm none eabi gcc v9.2.1
fpistm Dec 9, 2019
4650504
Merge pull request #438 from fpistm/friend_declaration
soundanalogous Dec 15, 2019
4d0742f
[STM32] Define VERSION_BLINK_PIN only if LED_BUILTIN is defined
fpistm Dec 3, 2019
5d37416
[STM32] Update analog macro
fpistm Dec 3, 2019
0b52369
Merge pull request #440 from fpistm/STM32_Update
soundanalogous Dec 20, 2019
b102e74
[STM32] Fix version checking
fpistm Jan 20, 2020
9caa095
Merge pull request #443 from fpistm/stm32fix
soundanalogous Jan 20, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
263 changes: 258 additions & 5 deletions Boards.h

Large diffs are not rendered by default.

302 changes: 94 additions & 208 deletions Firmata.cpp

Large diffs are not rendered by default.

174 changes: 65 additions & 109 deletions Firmata.h
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/*
Firmata.h - Firmata library v2.5.2 - 2016-2-15
Firmata.h - Firmata library v2.5.8 - 2018-04-15
Copyright (c) 2006-2008 Hans-Christoph Steiner. All rights reserved.
Copyright (C) 2009-2015 Jeff Hoefs. All rights reserved.
Copyright (C) 2009-2017 Jeff Hoefs. All rights reserved.

This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
Expand All @@ -15,22 +15,9 @@
#define Firmata_h

#include "Boards.h" /* Hardware Abstraction Layer + Wiring/Arduino */

/* Version numbers for the protocol. The protocol is still changing, so these
* version numbers are important.
* Query using the REPORT_VERSION message.
*/
#define FIRMATA_PROTOCOL_MAJOR_VERSION 2 // for non-compatible changes
#define FIRMATA_PROTOCOL_MINOR_VERSION 5 // for backwards compatible changes
#define FIRMATA_PROTOCOL_BUGFIX_VERSION 1 // for bugfix releases

/* Version numbers for the Firmata library.
* The firmware version will not always equal the protocol version going forward.
* Query using the REPORT_FIRMWARE message.
*/
#define FIRMATA_FIRMWARE_MAJOR_VERSION 2
#define FIRMATA_FIRMWARE_MINOR_VERSION 5
#define FIRMATA_FIRMWARE_BUGFIX_VERSION 2
#include "FirmataDefines.h"
#include "FirmataMarshaller.h"
#include "FirmataParser.h"

/* DEPRECATED as of Firmata v2.5.1. As of 2.5.1 there are separate version numbers for
* the protocol version and the firmware version.
Expand All @@ -39,52 +26,8 @@
#define FIRMATA_MINOR_VERSION 5 // same as FIRMATA_PROTOCOL_MINOR_VERSION
#define FIRMATA_BUGFIX_VERSION 1 // same as FIRMATA_PROTOCOL_BUGFIX_VERSION

#define MAX_DATA_BYTES 64 // max number of data bytes in incoming messages

// Arduino 101 also defines SET_PIN_MODE as a macro in scss_registers.h
#ifdef SET_PIN_MODE
#undef SET_PIN_MODE
#endif

// message command bytes (128-255/0x80-0xFF)
#define DIGITAL_MESSAGE 0x90 // send data for a digital port (collection of 8 pins)
#define ANALOG_MESSAGE 0xE0 // send data for an analog pin (or PWM)
#define REPORT_ANALOG 0xC0 // enable analog input by pin #
#define REPORT_DIGITAL 0xD0 // enable digital input by port pair
//
#define SET_PIN_MODE 0xF4 // set a pin to INPUT/OUTPUT/PWM/etc
#define SET_DIGITAL_PIN_VALUE 0xF5 // set value of an individual digital pin
//
#define REPORT_VERSION 0xF9 // report protocol version
#define SYSTEM_RESET 0xFF // reset from MIDI
//
#define START_SYSEX 0xF0 // start a MIDI Sysex message
#define END_SYSEX 0xF7 // end a MIDI Sysex message

// extended command set using sysex (0-127/0x00-0x7F)
/* 0x00-0x0F reserved for user-defined commands */
#define SERIAL_MESSAGE 0x60 // communicate with serial devices, including other boards
#define ENCODER_DATA 0x61 // reply with encoders current positions
#define SERVO_CONFIG 0x70 // set max angle, minPulse, maxPulse, freq
#define STRING_DATA 0x71 // a string message with 14-bits per char
#define STEPPER_DATA 0x72 // control a stepper motor
#define ONEWIRE_DATA 0x73 // send an OneWire read/write/reset/select/skip/search request
#define SHIFT_DATA 0x75 // a bitstream to/from a shift register
#define I2C_REQUEST 0x76 // send an I2C read/write request
#define I2C_REPLY 0x77 // a reply to an I2C read request
#define I2C_CONFIG 0x78 // config I2C settings such as delay times and power pins
#define EXTENDED_ANALOG 0x6F // analog write (PWM, Servo, etc) to any pin
#define PIN_STATE_QUERY 0x6D // ask for a pin's current mode and value
#define PIN_STATE_RESPONSE 0x6E // reply with pin's current mode and value
#define CAPABILITY_QUERY 0x6B // ask for supported modes and resolution of all pins
#define CAPABILITY_RESPONSE 0x6C // reply with supported modes and resolution
#define ANALOG_MAPPING_QUERY 0x69 // ask for mapping of analog to pin numbers
#define ANALOG_MAPPING_RESPONSE 0x6A // reply with mapping info
#define REPORT_FIRMWARE 0x79 // report name and version of the firmware
#define SAMPLING_INTERVAL 0x7A // set the poll rate of the main loop
#define SCHEDULER_DATA 0x7B // send a createtask/deletetask/addtotask/schedule/querytasks/querytask request to the scheduler
#define SYSEX_NON_REALTIME 0x7E // MIDI Reserved for non-realtime messages
#define SYSEX_REALTIME 0x7F // MIDI Reserved for realtime messages
// these are DEPRECATED to make the naming more consistent
#define FIRMATA_STRING 0x71 // same as STRING_DATA
#define SYSEX_I2C_REQUEST 0x76 // same as I2C_REQUEST
Expand All @@ -94,18 +37,6 @@
// pin modes
//#define INPUT 0x00 // defined in Arduino.h
//#define OUTPUT 0x01 // defined in Arduino.h
#define PIN_MODE_ANALOG 0x02 // analog pin in analogInput mode
#define PIN_MODE_PWM 0x03 // digital pin in PWM output mode
#define PIN_MODE_SERVO 0x04 // digital pin in Servo output mode
#define PIN_MODE_SHIFT 0x05 // shiftIn/shiftOut mode
#define PIN_MODE_I2C 0x06 // pin included in I2C setup
#define PIN_MODE_ONEWIRE 0x07 // pin configured for 1-wire
#define PIN_MODE_STEPPER 0x08 // pin configured for stepper motor
#define PIN_MODE_ENCODER 0x09 // pin configured for rotary encoders
#define PIN_MODE_SERIAL 0x0A // pin configured for serial communication
#define PIN_MODE_PULLUP 0x0B // enable internal pull-up resistor for pin
#define PIN_MODE_IGNORE 0x7F // pin configured to be ignored by digitalWrite and capabilityResponse
#define TOTAL_PIN_MODES 13
// DEPRECATED as of Firmata v2.5
#define ANALOG 0x02 // same as PIN_MODE_ANALOG
#define PWM 0x03 // same as PIN_MODE_PWM
Expand All @@ -117,35 +48,39 @@
#define ENCODER 0x09 // same as PIN_MODE_ENCODER
#define IGNORE 0x7F // same as PIN_MODE_IGNORE

extern "C" {
// callback function types
typedef void (*callbackFunction)(byte, int);
typedef void (*systemResetCallbackFunction)(void);
typedef void (*stringCallbackFunction)(char *);
typedef void (*sysexCallbackFunction)(byte command, byte argc, byte *argv);
}
namespace firmata {

// TODO make it a subclass of a generic Serial/Stream base class
class FirmataClass
{
public:
typedef void (*callbackFunction)(uint8_t, int);
typedef void (*systemCallbackFunction)(void);
typedef void (*stringCallbackFunction)(char *);
typedef void (*sysexCallbackFunction)(uint8_t command, uint8_t argc, uint8_t *argv);

FirmataClass();

/* Arduino constructors */
void begin();
void begin(long);
void begin(Stream &s);

/* querying functions */
void printVersion(void);
void blinkVersion(void);
void printFirmwareVersion(void);

//void setFirmwareVersion(byte major, byte minor); // see macro below
void setFirmwareNameAndVersion(const char *name, byte major, byte minor);
void disableBlinkVersion();

/* serial receive handling */
int available(void);
void processInput(void);
void parse(unsigned char value);
boolean isParsingMessage(void);

/* serial send handling */
void sendAnalog(byte pin, int value);
void sendDigital(byte pin, int value); // TODO implement this
Expand All @@ -154,16 +89,18 @@ class FirmataClass
void sendString(byte command, const char *string);
void sendSysex(byte command, byte bytec, byte *bytev);
void write(byte c);

/* attach & detach callback functions to messages */
void attach(byte command, callbackFunction newFunction);
void attach(byte command, systemResetCallbackFunction newFunction);
void attach(byte command, stringCallbackFunction newFunction);
void attach(byte command, sysexCallbackFunction newFunction);
void detach(byte command);
void attach(uint8_t command, callbackFunction newFunction);
void attach(uint8_t command, systemCallbackFunction newFunction);
void attach(uint8_t command, stringCallbackFunction newFunction);
void attach(uint8_t command, sysexCallbackFunction newFunction);
void detach(uint8_t command);

/* access pin state and config */
byte getPinMode(byte pin);
void setPinMode(byte pin, byte config);

/* access pin state */
int getPinState(byte pin);
void setPinState(byte pin, int state);
Expand All @@ -174,42 +111,61 @@ class FirmataClass
void endSysex(void);

private:
uint8_t parserBuffer[MAX_DATA_BYTES];
FirmataMarshaller marshaller;
FirmataParser parser;
Stream *FirmataStream;

/* firmware name and version */
byte firmwareVersionCount;
byte *firmwareVersionVector;
/* input message handling */
byte waitForData; // this flag says the next serial input will be data
byte executeMultiByteCommand; // execute this after getting multi-byte data
byte multiByteChannel; // channel data for multiByteCommands
byte storedInputData[MAX_DATA_BYTES]; // multi-byte data
/* sysex */
boolean parsingSysex;
int sysexBytesRead;

/* pin configuration */
byte pinConfig[TOTAL_PINS];
int pinState[TOTAL_PINS];

/* callback functions */
callbackFunction currentAnalogCallback;
callbackFunction currentDigitalCallback;
callbackFunction currentReportAnalogCallback;
callbackFunction currentReportDigitalCallback;
callbackFunction currentPinModeCallback;
callbackFunction currentPinValueCallback;
systemResetCallbackFunction currentSystemResetCallback;
stringCallbackFunction currentStringCallback;
sysexCallbackFunction currentSysexCallback;

boolean blinkVersionDisabled = false;
boolean blinkVersionDisabled;

/* private methods ------------------------------ */
void processSysexMessage(void);
void systemReset(void);
void strobeBlinkPin(byte pin, int count, int onInterval, int offInterval);
friend void FirmataMarshaller::encodeByteStream (size_t bytec, uint8_t * bytev, size_t max_bytes) const;

/* callback functions */
static callbackFunction currentAnalogCallback;
static callbackFunction currentDigitalCallback;
static callbackFunction currentPinModeCallback;
static callbackFunction currentPinValueCallback;
static callbackFunction currentReportAnalogCallback;
static callbackFunction currentReportDigitalCallback;
static stringCallbackFunction currentStringCallback;
static sysexCallbackFunction currentSysexCallback;
static systemCallbackFunction currentSystemResetCallback;

/* static callbacks */
inline static void staticAnalogCallback (void *, uint8_t command, uint16_t value) { if ( currentAnalogCallback ) { currentAnalogCallback(command,(int)value); } }
inline static void staticDigitalCallback (void *, uint8_t command, uint16_t value) { if ( currentDigitalCallback ) { currentDigitalCallback(command, (int)value); } }
inline static void staticPinModeCallback (void *, uint8_t command, uint16_t value) { if ( currentPinModeCallback ) { currentPinModeCallback(command, (int)value); } }
inline static void staticPinValueCallback (void *, uint8_t command, uint16_t value) { if ( currentPinValueCallback ) { currentPinValueCallback(command, (int)value); } }
inline static void staticReportAnalogCallback (void *, uint8_t command, uint16_t value) { if ( currentReportAnalogCallback ) { currentReportAnalogCallback(command, (int)value); } }
inline static void staticReportDigitalCallback (void *, uint8_t command, uint16_t value) { if ( currentReportDigitalCallback ) { currentReportDigitalCallback(command, (int)value); } }
inline static void staticStringCallback (void *, const char * c_str) { if ( currentStringCallback ) { currentStringCallback((char *)c_str); } }
inline static void staticSysexCallback (void *, uint8_t command, size_t argc, uint8_t *argv) { if ( currentSysexCallback ) { currentSysexCallback(command, (uint8_t)argc, argv); } }
inline static void staticReportFirmwareCallback (void * context, size_t, size_t, const char *) { if ( context ) { ((FirmataClass *)context)->printFirmwareVersion(); } }
inline static void staticReportVersionCallback (void * context) { if ( context ) { ((FirmataClass *)context)->printVersion(); } }
inline static void staticSystemResetCallback (void *) { if ( currentSystemResetCallback ) { currentSystemResetCallback(); } }
};

extern FirmataClass Firmata;
} // namespace firmata

extern "C" {
// callback function types
typedef firmata::FirmataClass::callbackFunction callbackFunction;
typedef firmata::FirmataClass::systemCallbackFunction systemCallbackFunction;
typedef firmata::FirmataClass::stringCallbackFunction stringCallbackFunction;
typedef firmata::FirmataClass::sysexCallbackFunction sysexCallbackFunction;
}

extern firmata::FirmataClass Firmata;

/*==============================================================================
* MACROS
Expand Down
97 changes: 97 additions & 0 deletions FirmataConstants.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
/*
FirmataConstants.h
Copyright (c) 2006-2008 Hans-Christoph Steiner. All rights reserved.
Copyright (C) 2009-2017 Jeff Hoefs. All rights reserved.

This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

See file LICENSE.txt for further informations on licensing terms.
*/

#ifndef FirmataConstants_h
#define FirmataConstants_h

namespace firmata {
/* Version numbers for the Firmata library.
* The firmware version will not always equal the protocol version going forward.
* Query using the REPORT_FIRMWARE message.
*/
static const int FIRMWARE_MAJOR_VERSION = 2;
static const int FIRMWARE_MINOR_VERSION = 5;
static const int FIRMWARE_BUGFIX_VERSION = 7;

/* Version numbers for the protocol. The protocol is still changing, so these
* version numbers are important.
* Query using the REPORT_VERSION message.
*/
static const int PROTOCOL_MAJOR_VERSION = 2; // for non-compatible changes
static const int PROTOCOL_MINOR_VERSION = 5; // for backwards compatible changes
static const int PROTOCOL_BUGFIX_VERSION = 1; // for bugfix releases

static const int MAX_DATA_BYTES = 64; // max number of data bytes in incoming messages

// message command bytes (128-255/0x80-0xFF)

static const int DIGITAL_MESSAGE = 0x90; // send data for a digital port (collection of 8 pins)
static const int ANALOG_MESSAGE = 0xE0; // send data for an analog pin (or PWM)
static const int REPORT_ANALOG = 0xC0; // enable analog input by pin #
static const int REPORT_DIGITAL = 0xD0; // enable digital input by port pair
//
static const int SET_PIN_MODE = 0xF4; // set a pin to INPUT/OUTPUT/PWM/etc
static const int SET_DIGITAL_PIN_VALUE = 0xF5; // set value of an individual digital pin
//
static const int REPORT_VERSION = 0xF9; // report protocol version
static const int SYSTEM_RESET = 0xFF; // reset from MIDI
//
static const int START_SYSEX = 0xF0; // start a MIDI Sysex message
static const int END_SYSEX = 0xF7; // end a MIDI Sysex message

// extended command set using sysex (0-127/0x00-0x7F)
/* 0x00-0x0F reserved for user-defined commands */

static const int SERIAL_DATA = 0x60; // communicate with serial devices, including other boards
static const int ENCODER_DATA = 0x61; // reply with encoders current positions
static const int SERVO_CONFIG = 0x70; // set max angle, minPulse, maxPulse, freq
static const int STRING_DATA = 0x71; // a string message with 14-bits per char
static const int STEPPER_DATA = 0x72; // control a stepper motor
static const int ONEWIRE_DATA = 0x73; // send an OneWire read/write/reset/select/skip/search request
static const int SHIFT_DATA = 0x75; // a bitstream to/from a shift register
static const int I2C_REQUEST = 0x76; // send an I2C read/write request
static const int I2C_REPLY = 0x77; // a reply to an I2C read request
static const int I2C_CONFIG = 0x78; // config I2C settings such as delay times and power pins
static const int REPORT_FIRMWARE = 0x79; // report name and version of the firmware
static const int EXTENDED_ANALOG = 0x6F; // analog write (PWM, Servo, etc) to any pin
static const int PIN_STATE_QUERY = 0x6D; // ask for a pin's current mode and value
static const int PIN_STATE_RESPONSE = 0x6E; // reply with pin's current mode and value
static const int CAPABILITY_QUERY = 0x6B; // ask for supported modes and resolution of all pins
static const int CAPABILITY_RESPONSE = 0x6C; // reply with supported modes and resolution
static const int ANALOG_MAPPING_QUERY = 0x69; // ask for mapping of analog to pin numbers
static const int ANALOG_MAPPING_RESPONSE = 0x6A; // reply with mapping info
static const int SAMPLING_INTERVAL = 0x7A; // set the poll rate of the main loop
static const int SCHEDULER_DATA = 0x7B; // send a createtask/deletetask/addtotask/schedule/querytasks/querytask request to the scheduler
static const int SYSEX_NON_REALTIME = 0x7E; // MIDI Reserved for non-realtime messages
static const int SYSEX_REALTIME = 0x7F; // MIDI Reserved for realtime messages

// pin modes
static const int PIN_MODE_INPUT = 0x00; // same as INPUT defined in Arduino.h
static const int PIN_MODE_OUTPUT = 0x01; // same as OUTPUT defined in Arduino.h
static const int PIN_MODE_ANALOG = 0x02; // analog pin in analogInput mode
static const int PIN_MODE_PWM = 0x03; // digital pin in PWM output mode
static const int PIN_MODE_SERVO = 0x04; // digital pin in Servo output mode
static const int PIN_MODE_SHIFT = 0x05; // shiftIn/shiftOut mode
static const int PIN_MODE_I2C = 0x06; // pin included in I2C setup
static const int PIN_MODE_ONEWIRE = 0x07; // pin configured for 1-wire
static const int PIN_MODE_STEPPER = 0x08; // pin configured for stepper motor
static const int PIN_MODE_ENCODER = 0x09; // pin configured for rotary encoders
static const int PIN_MODE_SERIAL = 0x0A; // pin configured for serial communication
static const int PIN_MODE_PULLUP = 0x0B; // enable internal pull-up resistor for pin
static const int PIN_MODE_IGNORE = 0x7F; // pin configured to be ignored by digitalWrite and capabilityResponse

static const int TOTAL_PIN_MODES = 13;

} // namespace firmata

#endif // FirmataConstants_h
Loading