diff --git a/targets/libraries/Firmata/Firmata.cpp b/targets/libraries/Firmata/Firmata.cpp new file mode 100644 index 000000000..de58a411d --- /dev/null +++ b/targets/libraries/Firmata/Firmata.cpp @@ -0,0 +1,128 @@ +/* + Firmata.cpp - Firmata library + Copyright (c) 2007 Free Software Foundation. All right reserved. + Written by Hans-Christoph Steiner + + 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. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +//****************************************************************************** +//* Includes +//****************************************************************************** + +extern "C" { + // AVR LibC Includes + #include + #include + + // Wiring Core Includes + #include "WConstants.h" +} + +#include "Firmata.h" +#include "EEPROM.h" +#include "HardwareSerial.h" + +//****************************************************************************** +//* Definitions +//****************************************************************************** + +//****************************************************************************** +//* Constructors +//****************************************************************************** + +FirmataClass::FirmataClass() +{ + // TODO: init serial here + // TODO: printVersion +} + +//****************************************************************************** +//* Private Methods +//****************************************************************************** +// resets the system state upon a SYSTEM_RESET message from the host software +void FirmataClass::systemReset(void) +{ + // TODO automatically call this in response to SYSTEM_RESET + // TODO reset EEPROM to 0 here +} + +//****************************************************************************** +//* Public Methods +//****************************************************************************** + +// output type of message that is next on the queue +int FirmataClass::available(void) +{ + // TODO output next available message type, or -1 if nothing +} + + +// output the protocol version message to the serial port +void FirmataClass::printVersion() { + Serial.print(REPORT_VERSION, BYTE); + Serial.print(FIRMATA_MINOR_VERSION, BYTE); + Serial.print(FIRMATA_MAJOR_VERSION, BYTE); +} + +// send an analog message +void FirmataClass::sendAnalog(int pin, int value) +{ + // pin can only be 0-15, so chop higher bits + Serial.print(ANALOG_MESSAGE | (pin & 0xF), BYTE); + Serial.print(value % 128, BYTE); + Serial.print(value >> 7, BYTE); +} + +// send a single digital pin in a digital message +void FirmataClass::sendDigital(int pin, int value) +{ + // TODO add single pin digital messages to the protocol +} + +// send 14-bits in a single digital message +void FirmataClass::sendDigitalPortPair(int port, int value) +{ + // TODO: the digital message should not be sent on the serial port every + // time sendDigital() is called. Instead, it should add it to an int + // which will be sent on a schedule. If a pin changes more than once + // before the digital message is sent on the serial port, it should send a + // digital message for each change. + + // TODO: some math needs to happen for pin > 14 since MIDI channels are used + Serial.print(DIGITAL_MESSAGE | (port & 0xF),BYTE); + Serial.print(value % 128, BYTE); // Tx pins 0-6 + Serial.print(value >> 7, BYTE); // Tx pins 7-13 +} + +// Internal Actions///////////////////////////////////////////////////////////// + +void FirmataClass::loadState(void) +{ + // TODO load state from EEPROM +} + +void FirmataClass::saveState(void) +{ + // TODO save state to EEPROM +} + +void FirmataClass::resetState(void) +{ + // TODO reset state bytes in EEPROM +} + +// make one instance for the user to use +FirmataClass Firmata; diff --git a/targets/libraries/Firmata/Firmata.h b/targets/libraries/Firmata/Firmata.h new file mode 100644 index 000000000..1c6604bdb --- /dev/null +++ b/targets/libraries/Firmata/Firmata.h @@ -0,0 +1,95 @@ +/* + Firmata.h - Firmata library + Copyright (c) 2007 Free Software Foundation. All right reserved. + Written by Hans-Christoph Steiner + + 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. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef Firmata_h +#define Firmata_h + +#include + +class FirmataClass +{ +private: + void systemReset(void); +public: + FirmataClass(); + int available(void); + // serial receive actions + // send serial messages + void printVersion(void); + void sendAnalog(int, int); + void sendDigital(int, int); + void sendDigitalPortPair(int, int); + // internal actions + void loadState(void); + void saveState(void); + void resetState(void); +}; + +extern FirmataClass Firmata; + +/*============================================================================== + * MACROS + *============================================================================*/ + +/* Version numbers for the protocol. The protocol is still changing, so these + * version numbers are important. This number can be queried so that host + * software can test whether it will be compatible with the currently + * installed firmware. */ +#define FIRMATA_MAJOR_VERSION 1 // for non-compatible changes +#define FIRMATA_MINOR_VERSION 0 // for backwards compatible changes + +// total number of pins currently supported +#define TOTAL_ANALOG_PINS 6 +#define TOTAL_DIGITAL_PINS 14 + +// for comparing along with INPUT and OUTPUT +#define PWM 2 + +// for selecting digital inputs +#define PB 2 // digital input, pins 8-13 +#define PC 3 // analog input port +#define PD 4 // digital input, pins 0-7 + +#define MAX_DATA_BYTES 2 // max number of data bytes in non-SysEx messages +// message command bytes +#define DIGITAL_MESSAGE 0x90 // send data for a digital pin +#define ANALOG_MESSAGE 0xE0 // send data for an analog pin (or PWM) +//#define PULSE_MESSAGE 0xA0 // proposed pulseIn/Out message (SysEx) +//#define SHIFTOUT_MESSAGE 0xB0 // proposed shiftOut message (SysEx) +#define REPORT_ANALOG_PIN 0xC0 // enable analog input by pin # +#define REPORT_DIGITAL_PORTS 0xD0 // enable digital input by port pair +#define START_SYSEX 0xF0 // start a MIDI SysEx message +#define SET_DIGITAL_PIN_MODE 0xF4 // set a digital pin to INPUT or OUTPUT +#define END_SYSEX 0xF7 // end a MIDI SysEx message +#define REPORT_VERSION 0xF9 // report firmware version +#define SYSTEM_RESET 0xFF // reset from MIDI + +// these are used for EEPROM reading and writing +#define ANALOGINPUTSTOREPORT_LOW_BYTE 0x1F0 // analogInputsToReport is an int +#define ANALOGINPUTSTOREPORT_HIGH_BYTE 0x1F1 // analogInputsToReport is an int +#define REPORTDIGITALINPUTS_BYTE 0x1F2 // +#define DIGITALPINSTATUS_LOW_BYTE 0x1F3 // digitalPinStatus is an int +#define DIGITALPINSTATUS_HIGH_BYTE 0x1F4 // digitalPinStatus is an int +#define PWMSTATUS_LOW_BYTE 0x1F5 // pwmStatus is an int +#define PWMSTATUS_HIGH_BYTE 0x1F6 // pwmStatus is an int + + +#endif /* Firmata_h */ + diff --git a/targets/libraries/Firmata/keywords.txt b/targets/libraries/Firmata/keywords.txt new file mode 100644 index 000000000..a24159330 --- /dev/null +++ b/targets/libraries/Firmata/keywords.txt @@ -0,0 +1,18 @@ +####################################### +# Syntax Coloring Map For Firmata +####################################### + +####################################### +# Datatypes (KEYWORD1) +####################################### + +Firmata KEYWORD1 + +####################################### +# Methods and Functions (KEYWORD2) +####################################### + +####################################### +# Constants (LITERAL1) +####################################### +