mirror of
https://github.com/esp8266/Arduino.git
synced 2025-07-30 16:24:09 +03:00
Run new astyle formatter against all the examples
This commit is contained in:
@ -9,7 +9,7 @@
|
||||
* http://firmata.org/wiki/Download
|
||||
*/
|
||||
|
||||
/*
|
||||
/*
|
||||
* This firmware reads all inputs and sends them as fast as it can. It was
|
||||
* inspired by the ease-of-use of the Arduino2Max program.
|
||||
*
|
||||
@ -35,7 +35,7 @@ int samplingInterval = 19; // how often to run the main loop (in ms)
|
||||
void sendPort(byte portNumber, byte portValue)
|
||||
{
|
||||
portValue = portValue & portStatus[portNumber];
|
||||
if(previousPINs[portNumber] != portValue) {
|
||||
if (previousPINs[portNumber] != portValue) {
|
||||
Firmata.sendDigitalPort(portNumber, portValue);
|
||||
previousPINs[portNumber] = portValue;
|
||||
}
|
||||
@ -47,13 +47,13 @@ void setup()
|
||||
|
||||
Firmata.setFirmwareVersion(0, 1);
|
||||
|
||||
for(pin = 0; pin < TOTAL_PINS; pin++) {
|
||||
for (pin = 0; pin < TOTAL_PINS; pin++) {
|
||||
if IS_PIN_DIGITAL(pin) pinMode(PIN_TO_DIGITAL(pin), INPUT);
|
||||
}
|
||||
|
||||
for (port=0; port<TOTAL_PORTS; port++) {
|
||||
for (port = 0; port < TOTAL_PORTS; port++) {
|
||||
status = 0;
|
||||
for (i=0; i<8; i++) {
|
||||
for (i = 0; i < 8; i++) {
|
||||
if (IS_PIN_DIGITAL(port * 8 + i)) status |= (1 << i);
|
||||
}
|
||||
portStatus[port] = status;
|
||||
@ -66,21 +66,21 @@ void loop()
|
||||
{
|
||||
byte i;
|
||||
|
||||
for (i=0; i<TOTAL_PORTS; i++) {
|
||||
sendPort(i, readPort(i, 0xff));
|
||||
for (i = 0; i < TOTAL_PORTS; i++) {
|
||||
sendPort(i, readPort(i, 0xff));
|
||||
}
|
||||
/* make sure that the FTDI buffer doesn't go over 60 bytes, otherwise you
|
||||
get long, random delays. So only read analogs every 20ms or so */
|
||||
currentMillis = millis();
|
||||
if(currentMillis - previousMillis > samplingInterval) {
|
||||
if (currentMillis - previousMillis > samplingInterval) {
|
||||
previousMillis += samplingInterval;
|
||||
while(Firmata.available()) {
|
||||
while (Firmata.available()) {
|
||||
Firmata.processInput();
|
||||
}
|
||||
for(pin = 0; pin < TOTAL_ANALOG_PINS; pin++) {
|
||||
for (pin = 0; pin < TOTAL_ANALOG_PINS; pin++) {
|
||||
analogValue = analogRead(pin);
|
||||
if(analogValue != previousAnalogValues[pin]) {
|
||||
Firmata.sendAnalog(pin, analogValue);
|
||||
if (analogValue != previousAnalogValues[pin]) {
|
||||
Firmata.sendAnalog(pin, analogValue);
|
||||
previousAnalogValues[pin] = analogValue;
|
||||
}
|
||||
}
|
||||
|
@ -32,63 +32,63 @@ unsigned long previousMillis; // for comparison with currentMillis
|
||||
|
||||
|
||||
/*==============================================================================
|
||||
* FUNCTIONS
|
||||
* FUNCTIONS
|
||||
*============================================================================*/
|
||||
|
||||
void analogWriteCallback(byte pin, int value)
|
||||
{
|
||||
switch(pin) {
|
||||
switch (pin) {
|
||||
case 9: servo9.write(value); break;
|
||||
case 10: servo10.write(value); break;
|
||||
case 3:
|
||||
case 5:
|
||||
case 6:
|
||||
case 3:
|
||||
case 5:
|
||||
case 6:
|
||||
case 11: // PWM pins
|
||||
analogWrite(pin, value);
|
||||
break;
|
||||
}
|
||||
analogWrite(pin, value);
|
||||
break;
|
||||
}
|
||||
}
|
||||
// -----------------------------------------------------------------------------
|
||||
// sets bits in a bit array (int) to toggle the reporting of the analogIns
|
||||
void reportAnalogCallback(byte pin, int value)
|
||||
{
|
||||
if(value == 0) {
|
||||
analogInputsToReport = analogInputsToReport &~ (1 << pin);
|
||||
}
|
||||
else { // everything but 0 enables reporting of that pin
|
||||
analogInputsToReport = analogInputsToReport | (1 << pin);
|
||||
}
|
||||
// TODO: save status to EEPROM here, if changed
|
||||
if (value == 0) {
|
||||
analogInputsToReport = analogInputsToReport &~ (1 << pin);
|
||||
}
|
||||
else { // everything but 0 enables reporting of that pin
|
||||
analogInputsToReport = analogInputsToReport | (1 << pin);
|
||||
}
|
||||
// TODO: save status to EEPROM here, if changed
|
||||
}
|
||||
|
||||
/*==============================================================================
|
||||
* SETUP()
|
||||
*============================================================================*/
|
||||
void setup()
|
||||
void setup()
|
||||
{
|
||||
Firmata.setFirmwareVersion(0, 2);
|
||||
Firmata.attach(ANALOG_MESSAGE, analogWriteCallback);
|
||||
Firmata.attach(REPORT_ANALOG, reportAnalogCallback);
|
||||
Firmata.setFirmwareVersion(0, 2);
|
||||
Firmata.attach(ANALOG_MESSAGE, analogWriteCallback);
|
||||
Firmata.attach(REPORT_ANALOG, reportAnalogCallback);
|
||||
|
||||
servo9.attach(9);
|
||||
servo10.attach(10);
|
||||
Firmata.begin(57600);
|
||||
servo9.attach(9);
|
||||
servo10.attach(10);
|
||||
Firmata.begin(57600);
|
||||
}
|
||||
|
||||
/*==============================================================================
|
||||
* LOOP()
|
||||
*============================================================================*/
|
||||
void loop()
|
||||
void loop()
|
||||
{
|
||||
while(Firmata.available())
|
||||
Firmata.processInput();
|
||||
currentMillis = millis();
|
||||
if(currentMillis - previousMillis > 20) {
|
||||
previousMillis += 20; // run this every 20ms
|
||||
for(analogPin=0;analogPin<TOTAL_ANALOG_PINS;analogPin++) {
|
||||
if( analogInputsToReport & (1 << analogPin) )
|
||||
Firmata.sendAnalog(analogPin, analogRead(analogPin));
|
||||
}
|
||||
while (Firmata.available())
|
||||
Firmata.processInput();
|
||||
currentMillis = millis();
|
||||
if (currentMillis - previousMillis > 20) {
|
||||
previousMillis += 20; // run this every 20ms
|
||||
for (analogPin = 0; analogPin < TOTAL_ANALOG_PINS; analogPin++) {
|
||||
if ( analogInputsToReport & (1 << analogPin) )
|
||||
Firmata.sendAnalog(analogPin, analogRead(analogPin));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -17,28 +17,28 @@
|
||||
|
||||
void stringCallback(char *myString)
|
||||
{
|
||||
Firmata.sendString(myString);
|
||||
Firmata.sendString(myString);
|
||||
}
|
||||
|
||||
|
||||
void sysexCallback(byte command, byte argc, byte*argv)
|
||||
{
|
||||
Firmata.sendSysex(command, argc, argv);
|
||||
Firmata.sendSysex(command, argc, argv);
|
||||
}
|
||||
|
||||
void setup()
|
||||
{
|
||||
Firmata.setFirmwareVersion(0, 1);
|
||||
Firmata.attach(STRING_DATA, stringCallback);
|
||||
Firmata.attach(START_SYSEX, sysexCallback);
|
||||
Firmata.begin(57600);
|
||||
Firmata.setFirmwareVersion(0, 1);
|
||||
Firmata.attach(STRING_DATA, stringCallback);
|
||||
Firmata.attach(START_SYSEX, sysexCallback);
|
||||
Firmata.begin(57600);
|
||||
}
|
||||
|
||||
void loop()
|
||||
{
|
||||
while(Firmata.available()) {
|
||||
Firmata.processInput();
|
||||
}
|
||||
while (Firmata.available()) {
|
||||
Firmata.processInput();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -11,16 +11,16 @@
|
||||
|
||||
/*
|
||||
Copyright (C) 2006-2008 Hans-Christoph Steiner. 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.
|
||||
*/
|
||||
|
||||
/*
|
||||
/*
|
||||
* This is an old version of StandardFirmata (v2.0). It is kept here because
|
||||
* its the last version that works on an ATMEGA8 chip. Also, it can be used
|
||||
* for host software that has not been updated to a newer version of the
|
||||
@ -50,34 +50,34 @@ unsigned long previousMillis; // for comparison with currentMillis
|
||||
|
||||
|
||||
/*==============================================================================
|
||||
* FUNCTIONS
|
||||
* FUNCTIONS
|
||||
*============================================================================*/
|
||||
|
||||
void outputPort(byte portNumber, byte portValue)
|
||||
{
|
||||
portValue = portValue &~ portStatus[portNumber];
|
||||
if(previousPINs[portNumber] != portValue) {
|
||||
Firmata.sendDigitalPort(portNumber, portValue);
|
||||
previousPINs[portNumber] = portValue;
|
||||
Firmata.sendDigitalPort(portNumber, portValue);
|
||||
}
|
||||
if (previousPINs[portNumber] != portValue) {
|
||||
Firmata.sendDigitalPort(portNumber, portValue);
|
||||
previousPINs[portNumber] = portValue;
|
||||
Firmata.sendDigitalPort(portNumber, portValue);
|
||||
}
|
||||
}
|
||||
|
||||
/* -----------------------------------------------------------------------------
|
||||
* check all the active digital inputs for change of state, then add any events
|
||||
* to the Serial output queue using Serial.print() */
|
||||
void checkDigitalInputs(void)
|
||||
void checkDigitalInputs(void)
|
||||
{
|
||||
byte i, tmp;
|
||||
for(i=0; i < TOTAL_PORTS; i++) {
|
||||
if(reportPINs[i]) {
|
||||
switch(i) {
|
||||
case 0: outputPort(0, PIND &~ B00000011); break; // ignore Rx/Tx 0/1
|
||||
case 1: outputPort(1, PINB); break;
|
||||
case 2: outputPort(2, PINC); break;
|
||||
}
|
||||
}
|
||||
byte i, tmp;
|
||||
for (i = 0; i < TOTAL_PORTS; i++) {
|
||||
if (reportPINs[i]) {
|
||||
switch (i) {
|
||||
case 0: outputPort(0, PIND &~ B00000011); break; // ignore Rx/Tx 0/1
|
||||
case 1: outputPort(1, PINB); break;
|
||||
case 2: outputPort(2, PINC); break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
@ -85,61 +85,61 @@ void checkDigitalInputs(void)
|
||||
* two bit-arrays that track Digital I/O and PWM status
|
||||
*/
|
||||
void setPinModeCallback(byte pin, int mode) {
|
||||
byte port = 0;
|
||||
byte offset = 0;
|
||||
byte port = 0;
|
||||
byte offset = 0;
|
||||
|
||||
if (pin < 8) {
|
||||
port = 0;
|
||||
offset = 0;
|
||||
} else if (pin < 14) {
|
||||
port = 1;
|
||||
offset = 8;
|
||||
} else if (pin < 22) {
|
||||
port = 2;
|
||||
offset = 14;
|
||||
}
|
||||
if (pin < 8) {
|
||||
port = 0;
|
||||
offset = 0;
|
||||
} else if (pin < 14) {
|
||||
port = 1;
|
||||
offset = 8;
|
||||
} else if (pin < 22) {
|
||||
port = 2;
|
||||
offset = 14;
|
||||
}
|
||||
|
||||
if(pin > 1) { // ignore RxTx (pins 0 and 1)
|
||||
pinStatus[pin] = mode;
|
||||
switch(mode) {
|
||||
case INPUT:
|
||||
pinMode(pin, INPUT);
|
||||
portStatus[port] = portStatus[port] &~ (1 << (pin - offset));
|
||||
break;
|
||||
case OUTPUT:
|
||||
digitalWrite(pin, LOW); // disable PWM
|
||||
case PWM:
|
||||
pinMode(pin, OUTPUT);
|
||||
portStatus[port] = portStatus[port] | (1 << (pin - offset));
|
||||
break;
|
||||
if (pin > 1) { // ignore RxTx (pins 0 and 1)
|
||||
pinStatus[pin] = mode;
|
||||
switch (mode) {
|
||||
case INPUT:
|
||||
pinMode(pin, INPUT);
|
||||
portStatus[port] = portStatus[port] &~ (1 << (pin - offset));
|
||||
break;
|
||||
case OUTPUT:
|
||||
digitalWrite(pin, LOW); // disable PWM
|
||||
case PWM:
|
||||
pinMode(pin, OUTPUT);
|
||||
portStatus[port] = portStatus[port] | (1 << (pin - offset));
|
||||
break;
|
||||
//case ANALOG: // TODO figure this out
|
||||
default:
|
||||
Firmata.sendString("");
|
||||
}
|
||||
// TODO: save status to EEPROM here, if changed
|
||||
default:
|
||||
Firmata.sendString("");
|
||||
}
|
||||
// TODO: save status to EEPROM here, if changed
|
||||
}
|
||||
}
|
||||
|
||||
void analogWriteCallback(byte pin, int value)
|
||||
{
|
||||
setPinModeCallback(pin,PWM);
|
||||
analogWrite(pin, value);
|
||||
setPinModeCallback(pin, PWM);
|
||||
analogWrite(pin, value);
|
||||
}
|
||||
|
||||
void digitalWriteCallback(byte port, int value)
|
||||
{
|
||||
switch(port) {
|
||||
switch (port) {
|
||||
case 0: // pins 2-7 (don't change Rx/Tx, pins 0 and 1)
|
||||
// 0xFF03 == B1111111100000011 0x03 == B00000011
|
||||
PORTD = (value &~ 0xFF03) | (PORTD & 0x03);
|
||||
break;
|
||||
case 1: // pins 8-13 (14,15 are disabled for the crystal)
|
||||
PORTB = (byte)value;
|
||||
break;
|
||||
// 0xFF03 == B1111111100000011 0x03 == B00000011
|
||||
PORTD = (value &~ 0xFF03) | (PORTD & 0x03);
|
||||
break;
|
||||
case 1: // pins 8-13 (14,15 are disabled for the crystal)
|
||||
PORTB = (byte)value;
|
||||
break;
|
||||
case 2: // analog pins used as digital
|
||||
PORTC = (byte)value;
|
||||
break;
|
||||
}
|
||||
PORTC = (byte)value;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
@ -149,91 +149,91 @@ void digitalWriteCallback(byte port, int value)
|
||||
//}
|
||||
void reportAnalogCallback(byte pin, int value)
|
||||
{
|
||||
if(value == 0) {
|
||||
analogInputsToReport = analogInputsToReport &~ (1 << pin);
|
||||
}
|
||||
else { // everything but 0 enables reporting of that pin
|
||||
analogInputsToReport = analogInputsToReport | (1 << pin);
|
||||
}
|
||||
// TODO: save status to EEPROM here, if changed
|
||||
if (value == 0) {
|
||||
analogInputsToReport = analogInputsToReport &~ (1 << pin);
|
||||
}
|
||||
else { // everything but 0 enables reporting of that pin
|
||||
analogInputsToReport = analogInputsToReport | (1 << pin);
|
||||
}
|
||||
// TODO: save status to EEPROM here, if changed
|
||||
}
|
||||
|
||||
void reportDigitalCallback(byte port, int value)
|
||||
{
|
||||
reportPINs[port] = (byte)value;
|
||||
if(port == 2) // turn off analog reporting when used as digital
|
||||
analogInputsToReport = 0;
|
||||
reportPINs[port] = (byte)value;
|
||||
if (port == 2) // turn off analog reporting when used as digital
|
||||
analogInputsToReport = 0;
|
||||
}
|
||||
|
||||
/*==============================================================================
|
||||
* SETUP()
|
||||
*============================================================================*/
|
||||
void setup()
|
||||
void setup()
|
||||
{
|
||||
byte i;
|
||||
byte i;
|
||||
|
||||
Firmata.setFirmwareVersion(2, 0);
|
||||
Firmata.setFirmwareVersion(2, 0);
|
||||
|
||||
Firmata.attach(ANALOG_MESSAGE, analogWriteCallback);
|
||||
Firmata.attach(DIGITAL_MESSAGE, digitalWriteCallback);
|
||||
Firmata.attach(REPORT_ANALOG, reportAnalogCallback);
|
||||
Firmata.attach(REPORT_DIGITAL, reportDigitalCallback);
|
||||
Firmata.attach(SET_PIN_MODE, setPinModeCallback);
|
||||
Firmata.attach(ANALOG_MESSAGE, analogWriteCallback);
|
||||
Firmata.attach(DIGITAL_MESSAGE, digitalWriteCallback);
|
||||
Firmata.attach(REPORT_ANALOG, reportAnalogCallback);
|
||||
Firmata.attach(REPORT_DIGITAL, reportDigitalCallback);
|
||||
Firmata.attach(SET_PIN_MODE, setPinModeCallback);
|
||||
|
||||
portStatus[0] = B00000011; // ignore Tx/RX pins
|
||||
portStatus[1] = B11000000; // ignore 14/15 pins
|
||||
portStatus[2] = B00000000;
|
||||
portStatus[0] = B00000011; // ignore Tx/RX pins
|
||||
portStatus[1] = B11000000; // ignore 14/15 pins
|
||||
portStatus[2] = B00000000;
|
||||
|
||||
// for(i=0; i<TOTAL_PINS; ++i) { // TODO make this work with analogs
|
||||
for(i=0; i<14; ++i) {
|
||||
setPinModeCallback(i,OUTPUT);
|
||||
}
|
||||
// set all outputs to 0 to make sure internal pull-up resistors are off
|
||||
PORTB = 0; // pins 8-15
|
||||
PORTC = 0; // analog port
|
||||
PORTD = 0; // pins 0-7
|
||||
// for(i=0; i<TOTAL_PINS; ++i) { // TODO make this work with analogs
|
||||
for (i = 0; i < 14; ++i) {
|
||||
setPinModeCallback(i, OUTPUT);
|
||||
}
|
||||
// set all outputs to 0 to make sure internal pull-up resistors are off
|
||||
PORTB = 0; // pins 8-15
|
||||
PORTC = 0; // analog port
|
||||
PORTD = 0; // pins 0-7
|
||||
|
||||
// TODO rethink the init, perhaps it should report analog on default
|
||||
for(i=0; i<TOTAL_PORTS; ++i) {
|
||||
reportPINs[i] = false;
|
||||
}
|
||||
// TODO: load state from EEPROM here
|
||||
// TODO rethink the init, perhaps it should report analog on default
|
||||
for (i = 0; i < TOTAL_PORTS; ++i) {
|
||||
reportPINs[i] = false;
|
||||
}
|
||||
// TODO: load state from EEPROM here
|
||||
|
||||
/* send digital inputs here, if enabled, to set the initial state on the
|
||||
* host computer, since once in the loop(), this firmware will only send
|
||||
* digital data on change. */
|
||||
if(reportPINs[0]) outputPort(0, PIND &~ B00000011); // ignore Rx/Tx 0/1
|
||||
if(reportPINs[1]) outputPort(1, PINB);
|
||||
if(reportPINs[2]) outputPort(2, PINC);
|
||||
/* send digital inputs here, if enabled, to set the initial state on the
|
||||
* host computer, since once in the loop(), this firmware will only send
|
||||
* digital data on change. */
|
||||
if (reportPINs[0]) outputPort(0, PIND &~ B00000011); // ignore Rx/Tx 0/1
|
||||
if (reportPINs[1]) outputPort(1, PINB);
|
||||
if (reportPINs[2]) outputPort(2, PINC);
|
||||
|
||||
Firmata.begin(115200);
|
||||
Firmata.begin(115200);
|
||||
}
|
||||
|
||||
/*==============================================================================
|
||||
* LOOP()
|
||||
*============================================================================*/
|
||||
void loop()
|
||||
void loop()
|
||||
{
|
||||
/* DIGITALREAD - as fast as possible, check for changes and output them to the
|
||||
* FTDI buffer using Serial.print() */
|
||||
checkDigitalInputs();
|
||||
currentMillis = millis();
|
||||
if(currentMillis - previousMillis > 20) {
|
||||
previousMillis += 20; // run this every 20ms
|
||||
/* SERIALREAD - Serial.read() uses a 128 byte circular buffer, so handle
|
||||
* all serialReads at once, i.e. empty the buffer */
|
||||
while(Firmata.available())
|
||||
Firmata.processInput();
|
||||
/* SEND FTDI WRITE BUFFER - make sure that the FTDI buffer doesn't go over
|
||||
* 60 bytes. use a timer to sending an event character every 4 ms to
|
||||
* trigger the buffer to dump. */
|
||||
|
||||
/* ANALOGREAD - right after the event character, do all of the
|
||||
* analogReads(). These only need to be done every 4ms. */
|
||||
for(analogPin=0;analogPin<TOTAL_ANALOG_PINS;analogPin++) {
|
||||
if( analogInputsToReport & (1 << analogPin) ) {
|
||||
Firmata.sendAnalog(analogPin, analogRead(analogPin));
|
||||
}
|
||||
}
|
||||
/* DIGITALREAD - as fast as possible, check for changes and output them to the
|
||||
* FTDI buffer using Serial.print() */
|
||||
checkDigitalInputs();
|
||||
currentMillis = millis();
|
||||
if (currentMillis - previousMillis > 20) {
|
||||
previousMillis += 20; // run this every 20ms
|
||||
/* SERIALREAD - Serial.read() uses a 128 byte circular buffer, so handle
|
||||
* all serialReads at once, i.e. empty the buffer */
|
||||
while (Firmata.available())
|
||||
Firmata.processInput();
|
||||
/* SEND FTDI WRITE BUFFER - make sure that the FTDI buffer doesn't go over
|
||||
* 60 bytes. use a timer to sending an event character every 4 ms to
|
||||
* trigger the buffer to dump. */
|
||||
|
||||
/* ANALOGREAD - right after the event character, do all of the
|
||||
* analogReads(). These only need to be done every 4ms. */
|
||||
for (analogPin = 0; analogPin < TOTAL_ANALOG_PINS; analogPin++) {
|
||||
if ( analogInputsToReport & (1 << analogPin) ) {
|
||||
Firmata.sendAnalog(analogPin, analogRead(analogPin));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -9,14 +9,14 @@
|
||||
* http://firmata.org/wiki/Download
|
||||
*/
|
||||
|
||||
/* This firmware supports as many servos as possible using the Servo library
|
||||
/* This firmware supports as many servos as possible using the Servo library
|
||||
* included in Arduino 0017
|
||||
*
|
||||
* TODO add message to configure minPulse/maxPulse/degrees
|
||||
*
|
||||
* This example code is in the public domain.
|
||||
*/
|
||||
|
||||
|
||||
#include <Servo.h>
|
||||
#include <Firmata.h>
|
||||
|
||||
@ -24,30 +24,30 @@ Servo servos[MAX_SERVOS];
|
||||
|
||||
void analogWriteCallback(byte pin, int value)
|
||||
{
|
||||
if (IS_PIN_SERVO(pin)) {
|
||||
servos[PIN_TO_SERVO(pin)].write(value);
|
||||
}
|
||||
}
|
||||
|
||||
void setup()
|
||||
{
|
||||
byte pin;
|
||||
|
||||
Firmata.setFirmwareVersion(0, 2);
|
||||
Firmata.attach(ANALOG_MESSAGE, analogWriteCallback);
|
||||
|
||||
for (pin = 0; pin < TOTAL_PINS; pin++) {
|
||||
if (IS_PIN_SERVO(pin)) {
|
||||
servos[PIN_TO_SERVO(pin)].write(value);
|
||||
servos[PIN_TO_SERVO(pin)].attach(PIN_TO_DIGITAL(pin));
|
||||
}
|
||||
}
|
||||
|
||||
Firmata.begin(57600);
|
||||
}
|
||||
|
||||
void setup()
|
||||
void loop()
|
||||
{
|
||||
byte pin;
|
||||
|
||||
Firmata.setFirmwareVersion(0, 2);
|
||||
Firmata.attach(ANALOG_MESSAGE, analogWriteCallback);
|
||||
|
||||
for (pin=0; pin < TOTAL_PINS; pin++) {
|
||||
if (IS_PIN_SERVO(pin)) {
|
||||
servos[PIN_TO_SERVO(pin)].attach(PIN_TO_DIGITAL(pin));
|
||||
}
|
||||
}
|
||||
|
||||
Firmata.begin(57600);
|
||||
}
|
||||
|
||||
void loop()
|
||||
{
|
||||
while(Firmata.available())
|
||||
Firmata.processInput();
|
||||
while (Firmata.available())
|
||||
Firmata.processInput();
|
||||
}
|
||||
|
||||
|
@ -19,28 +19,28 @@ byte analogPin = 0;
|
||||
|
||||
void analogWriteCallback(byte pin, int value)
|
||||
{
|
||||
if (IS_PIN_PWM(pin)) {
|
||||
pinMode(PIN_TO_DIGITAL(pin), OUTPUT);
|
||||
analogWrite(PIN_TO_PWM(pin), value);
|
||||
}
|
||||
if (IS_PIN_PWM(pin)) {
|
||||
pinMode(PIN_TO_DIGITAL(pin), OUTPUT);
|
||||
analogWrite(PIN_TO_PWM(pin), value);
|
||||
}
|
||||
}
|
||||
|
||||
void setup()
|
||||
{
|
||||
Firmata.setFirmwareVersion(0, 1);
|
||||
Firmata.attach(ANALOG_MESSAGE, analogWriteCallback);
|
||||
Firmata.begin(57600);
|
||||
Firmata.setFirmwareVersion(0, 1);
|
||||
Firmata.attach(ANALOG_MESSAGE, analogWriteCallback);
|
||||
Firmata.begin(57600);
|
||||
}
|
||||
|
||||
void loop()
|
||||
{
|
||||
while(Firmata.available()) {
|
||||
Firmata.processInput();
|
||||
}
|
||||
// do one analogRead per loop, so if PC is sending a lot of
|
||||
// analog write messages, we will only delay 1 analogRead
|
||||
Firmata.sendAnalog(analogPin, analogRead(analogPin));
|
||||
analogPin = analogPin + 1;
|
||||
if (analogPin >= TOTAL_ANALOG_PINS) analogPin = 0;
|
||||
while (Firmata.available()) {
|
||||
Firmata.processInput();
|
||||
}
|
||||
// do one analogRead per loop, so if PC is sending a lot of
|
||||
// analog write messages, we will only delay 1 analogRead
|
||||
Firmata.sendAnalog(analogPin, analogRead(analogPin));
|
||||
analogPin = analogPin + 1;
|
||||
if (analogPin >= TOTAL_ANALOG_PINS) analogPin = 0;
|
||||
}
|
||||
|
||||
|
@ -16,57 +16,57 @@
|
||||
#include <Firmata.h>
|
||||
|
||||
byte previousPIN[TOTAL_PORTS]; // PIN means PORT for input
|
||||
byte previousPORT[TOTAL_PORTS];
|
||||
byte previousPORT[TOTAL_PORTS];
|
||||
|
||||
void outputPort(byte portNumber, byte portValue)
|
||||
{
|
||||
// only send the data when it changes, otherwise you get too many messages!
|
||||
if (previousPIN[portNumber] != portValue) {
|
||||
Firmata.sendDigitalPort(portNumber, portValue);
|
||||
previousPIN[portNumber] = portValue;
|
||||
}
|
||||
// only send the data when it changes, otherwise you get too many messages!
|
||||
if (previousPIN[portNumber] != portValue) {
|
||||
Firmata.sendDigitalPort(portNumber, portValue);
|
||||
previousPIN[portNumber] = portValue;
|
||||
}
|
||||
}
|
||||
|
||||
void setPinModeCallback(byte pin, int mode) {
|
||||
if (IS_PIN_DIGITAL(pin)) {
|
||||
pinMode(PIN_TO_DIGITAL(pin), mode);
|
||||
}
|
||||
if (IS_PIN_DIGITAL(pin)) {
|
||||
pinMode(PIN_TO_DIGITAL(pin), mode);
|
||||
}
|
||||
}
|
||||
|
||||
void digitalWriteCallback(byte port, int value)
|
||||
{
|
||||
byte i;
|
||||
byte currentPinValue, previousPinValue;
|
||||
byte i;
|
||||
byte currentPinValue, previousPinValue;
|
||||
|
||||
if (port < TOTAL_PORTS && value != previousPORT[port]) {
|
||||
for(i=0; i<8; i++) {
|
||||
currentPinValue = (byte) value & (1 << i);
|
||||
previousPinValue = previousPORT[port] & (1 << i);
|
||||
if(currentPinValue != previousPinValue) {
|
||||
digitalWrite(i + (port*8), currentPinValue);
|
||||
}
|
||||
}
|
||||
previousPORT[port] = value;
|
||||
if (port < TOTAL_PORTS && value != previousPORT[port]) {
|
||||
for (i = 0; i < 8; i++) {
|
||||
currentPinValue = (byte) value & (1 << i);
|
||||
previousPinValue = previousPORT[port] & (1 << i);
|
||||
if (currentPinValue != previousPinValue) {
|
||||
digitalWrite(i + (port * 8), currentPinValue);
|
||||
}
|
||||
}
|
||||
previousPORT[port] = value;
|
||||
}
|
||||
}
|
||||
|
||||
void setup()
|
||||
{
|
||||
Firmata.setFirmwareVersion(0, 1);
|
||||
Firmata.attach(DIGITAL_MESSAGE, digitalWriteCallback);
|
||||
Firmata.attach(SET_PIN_MODE, setPinModeCallback);
|
||||
Firmata.begin(57600);
|
||||
Firmata.setFirmwareVersion(0, 1);
|
||||
Firmata.attach(DIGITAL_MESSAGE, digitalWriteCallback);
|
||||
Firmata.attach(SET_PIN_MODE, setPinModeCallback);
|
||||
Firmata.begin(57600);
|
||||
}
|
||||
|
||||
void loop()
|
||||
{
|
||||
byte i;
|
||||
byte i;
|
||||
|
||||
for (i=0; i<TOTAL_PORTS; i++) {
|
||||
outputPort(i, readPort(i, 0xff));
|
||||
}
|
||||
for (i = 0; i < TOTAL_PORTS; i++) {
|
||||
outputPort(i, readPort(i, 0xff));
|
||||
}
|
||||
|
||||
while(Firmata.available()) {
|
||||
Firmata.processInput();
|
||||
}
|
||||
while (Firmata.available()) {
|
||||
Firmata.processInput();
|
||||
}
|
||||
}
|
||||
|
@ -14,18 +14,18 @@
|
||||
Copyright (C) 2010-2011 Paul Stoffregen. All rights reserved.
|
||||
Copyright (C) 2009 Shigeru Kobayashi. All rights reserved.
|
||||
Copyright (C) 2009-2011 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.
|
||||
|
||||
formatted using the GNU C formatting and indenting
|
||||
*/
|
||||
|
||||
/*
|
||||
/*
|
||||
* TODO: use Program Control to load stored profiles from EEPROM
|
||||
*/
|
||||
|
||||
@ -90,14 +90,14 @@ Servo servos[MAX_SERVOS];
|
||||
void readAndReportData(byte address, int theRegister, byte numBytes) {
|
||||
// allow I2C requests that don't require a register read
|
||||
// for example, some devices using an interrupt pin to signify new data available
|
||||
// do not always require the register read so upon interrupt you call Wire.requestFrom()
|
||||
// do not always require the register read so upon interrupt you call Wire.requestFrom()
|
||||
if (theRegister != REGISTER_NOT_SPECIFIED) {
|
||||
Wire.beginTransmission(address);
|
||||
#if ARDUINO >= 100
|
||||
#if ARDUINO >= 100
|
||||
Wire.write((byte)theRegister);
|
||||
#else
|
||||
#else
|
||||
Wire.send((byte)theRegister);
|
||||
#endif
|
||||
#endif
|
||||
Wire.endTransmission();
|
||||
// do not set a value of 0
|
||||
if (i2cReadDelayTime > 0) {
|
||||
@ -111,22 +111,22 @@ void readAndReportData(byte address, int theRegister, byte numBytes) {
|
||||
Wire.requestFrom(address, numBytes); // all bytes are returned in requestFrom
|
||||
|
||||
// check to be sure correct number of bytes were returned by slave
|
||||
if(numBytes == Wire.available()) {
|
||||
if (numBytes == Wire.available()) {
|
||||
i2cRxData[0] = address;
|
||||
i2cRxData[1] = theRegister;
|
||||
for (int i = 0; i < numBytes; i++) {
|
||||
#if ARDUINO >= 100
|
||||
#if ARDUINO >= 100
|
||||
i2cRxData[2 + i] = Wire.read();
|
||||
#else
|
||||
#else
|
||||
i2cRxData[2 + i] = Wire.receive();
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
}
|
||||
else {
|
||||
if(numBytes > Wire.available()) {
|
||||
if (numBytes > Wire.available()) {
|
||||
Firmata.sendString("I2C Read Error: Too many bytes received");
|
||||
} else {
|
||||
Firmata.sendString("I2C Read Error: Too few bytes received");
|
||||
Firmata.sendString("I2C Read Error: Too few bytes received");
|
||||
}
|
||||
}
|
||||
|
||||
@ -139,7 +139,7 @@ void outputPort(byte portNumber, byte portValue, byte forceSend)
|
||||
// pins not configured as INPUT are cleared to zeros
|
||||
portValue = portValue & portConfigInputs[portNumber];
|
||||
// only send if the value is different than previously sent
|
||||
if(forceSend || previousPINs[portNumber] != portValue) {
|
||||
if (forceSend || previousPINs[portNumber] != portValue) {
|
||||
Firmata.sendDigitalPort(portNumber, portValue);
|
||||
previousPINs[portNumber] = portValue;
|
||||
}
|
||||
@ -190,60 +190,60 @@ void setPinModeCallback(byte pin, int mode)
|
||||
}
|
||||
if (IS_PIN_DIGITAL(pin)) {
|
||||
if (mode == INPUT) {
|
||||
portConfigInputs[pin/8] |= (1 << (pin & 7));
|
||||
portConfigInputs[pin / 8] |= (1 << (pin & 7));
|
||||
} else {
|
||||
portConfigInputs[pin/8] &= ~(1 << (pin & 7));
|
||||
portConfigInputs[pin / 8] &= ~(1 << (pin & 7));
|
||||
}
|
||||
}
|
||||
pinState[pin] = 0;
|
||||
switch(mode) {
|
||||
case ANALOG:
|
||||
if (IS_PIN_ANALOG(pin)) {
|
||||
switch (mode) {
|
||||
case ANALOG:
|
||||
if (IS_PIN_ANALOG(pin)) {
|
||||
if (IS_PIN_DIGITAL(pin)) {
|
||||
pinMode(PIN_TO_DIGITAL(pin), INPUT); // disable output driver
|
||||
digitalWrite(PIN_TO_DIGITAL(pin), LOW); // disable internal pull-ups
|
||||
}
|
||||
pinConfig[pin] = ANALOG;
|
||||
}
|
||||
break;
|
||||
case INPUT:
|
||||
if (IS_PIN_DIGITAL(pin)) {
|
||||
pinMode(PIN_TO_DIGITAL(pin), INPUT); // disable output driver
|
||||
digitalWrite(PIN_TO_DIGITAL(pin), LOW); // disable internal pull-ups
|
||||
pinConfig[pin] = INPUT;
|
||||
}
|
||||
pinConfig[pin] = ANALOG;
|
||||
}
|
||||
break;
|
||||
case INPUT:
|
||||
if (IS_PIN_DIGITAL(pin)) {
|
||||
pinMode(PIN_TO_DIGITAL(pin), INPUT); // disable output driver
|
||||
digitalWrite(PIN_TO_DIGITAL(pin), LOW); // disable internal pull-ups
|
||||
pinConfig[pin] = INPUT;
|
||||
}
|
||||
break;
|
||||
case OUTPUT:
|
||||
if (IS_PIN_DIGITAL(pin)) {
|
||||
digitalWrite(PIN_TO_DIGITAL(pin), LOW); // disable PWM
|
||||
pinMode(PIN_TO_DIGITAL(pin), OUTPUT);
|
||||
pinConfig[pin] = OUTPUT;
|
||||
}
|
||||
break;
|
||||
case PWM:
|
||||
if (IS_PIN_PWM(pin)) {
|
||||
pinMode(PIN_TO_PWM(pin), OUTPUT);
|
||||
analogWrite(PIN_TO_PWM(pin), 0);
|
||||
pinConfig[pin] = PWM;
|
||||
}
|
||||
break;
|
||||
case SERVO:
|
||||
if (IS_PIN_SERVO(pin)) {
|
||||
pinConfig[pin] = SERVO;
|
||||
if (!servos[PIN_TO_SERVO(pin)].attached()) {
|
||||
break;
|
||||
case OUTPUT:
|
||||
if (IS_PIN_DIGITAL(pin)) {
|
||||
digitalWrite(PIN_TO_DIGITAL(pin), LOW); // disable PWM
|
||||
pinMode(PIN_TO_DIGITAL(pin), OUTPUT);
|
||||
pinConfig[pin] = OUTPUT;
|
||||
}
|
||||
break;
|
||||
case PWM:
|
||||
if (IS_PIN_PWM(pin)) {
|
||||
pinMode(PIN_TO_PWM(pin), OUTPUT);
|
||||
analogWrite(PIN_TO_PWM(pin), 0);
|
||||
pinConfig[pin] = PWM;
|
||||
}
|
||||
break;
|
||||
case SERVO:
|
||||
if (IS_PIN_SERVO(pin)) {
|
||||
pinConfig[pin] = SERVO;
|
||||
if (!servos[PIN_TO_SERVO(pin)].attached()) {
|
||||
servos[PIN_TO_SERVO(pin)].attach(PIN_TO_DIGITAL(pin));
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case I2C:
|
||||
if (IS_PIN_I2C(pin)) {
|
||||
// mark the pin as i2c
|
||||
// the user must call I2C_CONFIG to enable I2C for a device
|
||||
pinConfig[pin] = I2C;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
Firmata.sendString("Unknown pin mode"); // TODO: put error msgs in EEPROM
|
||||
break;
|
||||
case I2C:
|
||||
if (IS_PIN_I2C(pin)) {
|
||||
// mark the pin as i2c
|
||||
// the user must call I2C_CONFIG to enable I2C for a device
|
||||
pinConfig[pin] = I2C;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
Firmata.sendString("Unknown pin mode"); // TODO: put error msgs in EEPROM
|
||||
}
|
||||
// TODO: save status to EEPROM here, if changed
|
||||
}
|
||||
@ -251,30 +251,30 @@ void setPinModeCallback(byte pin, int mode)
|
||||
void analogWriteCallback(byte pin, int value)
|
||||
{
|
||||
if (pin < TOTAL_PINS) {
|
||||
switch(pinConfig[pin]) {
|
||||
case SERVO:
|
||||
if (IS_PIN_SERVO(pin))
|
||||
servos[PIN_TO_SERVO(pin)].write(value);
|
||||
switch (pinConfig[pin]) {
|
||||
case SERVO:
|
||||
if (IS_PIN_SERVO(pin))
|
||||
servos[PIN_TO_SERVO(pin)].write(value);
|
||||
pinState[pin] = value;
|
||||
break;
|
||||
case PWM:
|
||||
if (IS_PIN_PWM(pin))
|
||||
analogWrite(PIN_TO_PWM(pin), value);
|
||||
break;
|
||||
case PWM:
|
||||
if (IS_PIN_PWM(pin))
|
||||
analogWrite(PIN_TO_PWM(pin), value);
|
||||
pinState[pin] = value;
|
||||
break;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void digitalWriteCallback(byte port, int value)
|
||||
{
|
||||
byte pin, lastPin, mask=1, pinWriteMask=0;
|
||||
byte pin, lastPin, mask = 1, pinWriteMask = 0;
|
||||
|
||||
if (port < TOTAL_PORTS) {
|
||||
// create a mask of the pins on this port that are writable.
|
||||
lastPin = port*8+8;
|
||||
lastPin = port * 8 + 8;
|
||||
if (lastPin > TOTAL_PINS) lastPin = TOTAL_PINS;
|
||||
for (pin=port*8; pin < lastPin; pin++) {
|
||||
for (pin = port * 8; pin < lastPin; pin++) {
|
||||
// do not disturb non-digital pins (eg, Rx & Tx)
|
||||
if (IS_PIN_DIGITAL(pin)) {
|
||||
// only write to OUTPUT and INPUT (enables pullup)
|
||||
@ -299,7 +299,7 @@ void digitalWriteCallback(byte port, int value)
|
||||
void reportAnalogCallback(byte analogPin, int value)
|
||||
{
|
||||
if (analogPin < TOTAL_ANALOG_PINS) {
|
||||
if(value == 0) {
|
||||
if (value == 0) {
|
||||
analogInputsToReport = analogInputsToReport &~ (1 << analogPin);
|
||||
} else {
|
||||
analogInputsToReport = analogInputsToReport | (1 << analogPin);
|
||||
@ -331,214 +331,214 @@ void sysexCallback(byte command, byte argc, byte *argv)
|
||||
byte slaveAddress;
|
||||
byte slaveRegister;
|
||||
byte data;
|
||||
unsigned int delayTime;
|
||||
|
||||
switch(command) {
|
||||
case I2C_REQUEST:
|
||||
mode = argv[1] & I2C_READ_WRITE_MODE_MASK;
|
||||
if (argv[1] & I2C_10BIT_ADDRESS_MODE_MASK) {
|
||||
Firmata.sendString("10-bit addressing mode is not yet supported");
|
||||
return;
|
||||
}
|
||||
else {
|
||||
slaveAddress = argv[0];
|
||||
}
|
||||
unsigned int delayTime;
|
||||
|
||||
switch(mode) {
|
||||
case I2C_WRITE:
|
||||
Wire.beginTransmission(slaveAddress);
|
||||
for (byte i = 2; i < argc; i += 2) {
|
||||
data = argv[i] + (argv[i + 1] << 7);
|
||||
#if ARDUINO >= 100
|
||||
Wire.write(data);
|
||||
#else
|
||||
Wire.send(data);
|
||||
#endif
|
||||
}
|
||||
Wire.endTransmission();
|
||||
delayMicroseconds(70);
|
||||
break;
|
||||
case I2C_READ:
|
||||
if (argc == 6) {
|
||||
// a slave register is specified
|
||||
slaveRegister = argv[2] + (argv[3] << 7);
|
||||
data = argv[4] + (argv[5] << 7); // bytes to read
|
||||
readAndReportData(slaveAddress, (int)slaveRegister, data);
|
||||
switch (command) {
|
||||
case I2C_REQUEST:
|
||||
mode = argv[1] & I2C_READ_WRITE_MODE_MASK;
|
||||
if (argv[1] & I2C_10BIT_ADDRESS_MODE_MASK) {
|
||||
Firmata.sendString("10-bit addressing mode is not yet supported");
|
||||
return;
|
||||
}
|
||||
else {
|
||||
// a slave register is NOT specified
|
||||
data = argv[2] + (argv[3] << 7); // bytes to read
|
||||
readAndReportData(slaveAddress, (int)REGISTER_NOT_SPECIFIED, data);
|
||||
slaveAddress = argv[0];
|
||||
}
|
||||
break;
|
||||
case I2C_READ_CONTINUOUSLY:
|
||||
if ((queryIndex + 1) >= MAX_QUERIES) {
|
||||
// too many queries, just ignore
|
||||
Firmata.sendString("too many queries");
|
||||
break;
|
||||
}
|
||||
queryIndex++;
|
||||
query[queryIndex].addr = slaveAddress;
|
||||
query[queryIndex].reg = argv[2] + (argv[3] << 7);
|
||||
query[queryIndex].bytes = argv[4] + (argv[5] << 7);
|
||||
break;
|
||||
case I2C_STOP_READING:
|
||||
byte queryIndexToSkip;
|
||||
// if read continuous mode is enabled for only 1 i2c device, disable
|
||||
// read continuous reporting for that device
|
||||
if (queryIndex <= 0) {
|
||||
queryIndex = -1;
|
||||
} else {
|
||||
// if read continuous mode is enabled for multiple devices,
|
||||
// determine which device to stop reading and remove it's data from
|
||||
// the array, shifiting other array data to fill the space
|
||||
for (byte i = 0; i < queryIndex + 1; i++) {
|
||||
if (query[i].addr = slaveAddress) {
|
||||
queryIndexToSkip = i;
|
||||
|
||||
switch (mode) {
|
||||
case I2C_WRITE:
|
||||
Wire.beginTransmission(slaveAddress);
|
||||
for (byte i = 2; i < argc; i += 2) {
|
||||
data = argv[i] + (argv[i + 1] << 7);
|
||||
#if ARDUINO >= 100
|
||||
Wire.write(data);
|
||||
#else
|
||||
Wire.send(data);
|
||||
#endif
|
||||
}
|
||||
Wire.endTransmission();
|
||||
delayMicroseconds(70);
|
||||
break;
|
||||
case I2C_READ:
|
||||
if (argc == 6) {
|
||||
// a slave register is specified
|
||||
slaveRegister = argv[2] + (argv[3] << 7);
|
||||
data = argv[4] + (argv[5] << 7); // bytes to read
|
||||
readAndReportData(slaveAddress, (int)slaveRegister, data);
|
||||
}
|
||||
else {
|
||||
// a slave register is NOT specified
|
||||
data = argv[2] + (argv[3] << 7); // bytes to read
|
||||
readAndReportData(slaveAddress, (int)REGISTER_NOT_SPECIFIED, data);
|
||||
}
|
||||
break;
|
||||
case I2C_READ_CONTINUOUSLY:
|
||||
if ((queryIndex + 1) >= MAX_QUERIES) {
|
||||
// too many queries, just ignore
|
||||
Firmata.sendString("too many queries");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
for (byte i = queryIndexToSkip; i<queryIndex + 1; i++) {
|
||||
if (i < MAX_QUERIES) {
|
||||
query[i].addr = query[i+1].addr;
|
||||
query[i].reg = query[i+1].addr;
|
||||
query[i].bytes = query[i+1].bytes;
|
||||
queryIndex++;
|
||||
query[queryIndex].addr = slaveAddress;
|
||||
query[queryIndex].reg = argv[2] + (argv[3] << 7);
|
||||
query[queryIndex].bytes = argv[4] + (argv[5] << 7);
|
||||
break;
|
||||
case I2C_STOP_READING:
|
||||
byte queryIndexToSkip;
|
||||
// if read continuous mode is enabled for only 1 i2c device, disable
|
||||
// read continuous reporting for that device
|
||||
if (queryIndex <= 0) {
|
||||
queryIndex = -1;
|
||||
} else {
|
||||
// if read continuous mode is enabled for multiple devices,
|
||||
// determine which device to stop reading and remove it's data from
|
||||
// the array, shifiting other array data to fill the space
|
||||
for (byte i = 0; i < queryIndex + 1; i++) {
|
||||
if (query[i].addr = slaveAddress) {
|
||||
queryIndexToSkip = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
for (byte i = queryIndexToSkip; i < queryIndex + 1; i++) {
|
||||
if (i < MAX_QUERIES) {
|
||||
query[i].addr = query[i + 1].addr;
|
||||
query[i].reg = query[i + 1].addr;
|
||||
query[i].bytes = query[i + 1].bytes;
|
||||
}
|
||||
}
|
||||
queryIndex--;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case I2C_CONFIG:
|
||||
delayTime = (argv[0] + (argv[1] << 7));
|
||||
|
||||
if (delayTime > 0) {
|
||||
i2cReadDelayTime = delayTime;
|
||||
}
|
||||
|
||||
if (!isI2CEnabled) {
|
||||
enableI2CPins();
|
||||
}
|
||||
|
||||
break;
|
||||
case SERVO_CONFIG:
|
||||
if (argc > 4) {
|
||||
// these vars are here for clarity, they'll optimized away by the compiler
|
||||
byte pin = argv[0];
|
||||
int minPulse = argv[1] + (argv[2] << 7);
|
||||
int maxPulse = argv[3] + (argv[4] << 7);
|
||||
|
||||
if (IS_PIN_SERVO(pin)) {
|
||||
if (servos[PIN_TO_SERVO(pin)].attached())
|
||||
servos[PIN_TO_SERVO(pin)].detach();
|
||||
servos[PIN_TO_SERVO(pin)].attach(PIN_TO_DIGITAL(pin), minPulse, maxPulse);
|
||||
setPinModeCallback(pin, SERVO);
|
||||
}
|
||||
queryIndex--;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
case SAMPLING_INTERVAL:
|
||||
if (argc > 1) {
|
||||
samplingInterval = argv[0] + (argv[1] << 7);
|
||||
if (samplingInterval < MINIMUM_SAMPLING_INTERVAL) {
|
||||
samplingInterval = MINIMUM_SAMPLING_INTERVAL;
|
||||
}
|
||||
} else {
|
||||
//Firmata.sendString("Not enough data");
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case I2C_CONFIG:
|
||||
delayTime = (argv[0] + (argv[1] << 7));
|
||||
|
||||
if(delayTime > 0) {
|
||||
i2cReadDelayTime = delayTime;
|
||||
}
|
||||
|
||||
if (!isI2CEnabled) {
|
||||
enableI2CPins();
|
||||
}
|
||||
|
||||
break;
|
||||
case SERVO_CONFIG:
|
||||
if(argc > 4) {
|
||||
// these vars are here for clarity, they'll optimized away by the compiler
|
||||
byte pin = argv[0];
|
||||
int minPulse = argv[1] + (argv[2] << 7);
|
||||
int maxPulse = argv[3] + (argv[4] << 7);
|
||||
|
||||
if (IS_PIN_SERVO(pin)) {
|
||||
if (servos[PIN_TO_SERVO(pin)].attached())
|
||||
servos[PIN_TO_SERVO(pin)].detach();
|
||||
servos[PIN_TO_SERVO(pin)].attach(PIN_TO_DIGITAL(pin), minPulse, maxPulse);
|
||||
setPinModeCallback(pin, SERVO);
|
||||
case EXTENDED_ANALOG:
|
||||
if (argc > 1) {
|
||||
int val = argv[1];
|
||||
if (argc > 2) val |= (argv[2] << 7);
|
||||
if (argc > 3) val |= (argv[3] << 14);
|
||||
analogWriteCallback(argv[0], val);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case SAMPLING_INTERVAL:
|
||||
if (argc > 1) {
|
||||
samplingInterval = argv[0] + (argv[1] << 7);
|
||||
if (samplingInterval < MINIMUM_SAMPLING_INTERVAL) {
|
||||
samplingInterval = MINIMUM_SAMPLING_INTERVAL;
|
||||
}
|
||||
} else {
|
||||
//Firmata.sendString("Not enough data");
|
||||
}
|
||||
break;
|
||||
case EXTENDED_ANALOG:
|
||||
if (argc > 1) {
|
||||
int val = argv[1];
|
||||
if (argc > 2) val |= (argv[2] << 7);
|
||||
if (argc > 3) val |= (argv[3] << 14);
|
||||
analogWriteCallback(argv[0], val);
|
||||
}
|
||||
break;
|
||||
case CAPABILITY_QUERY:
|
||||
Firmata.write(START_SYSEX);
|
||||
Firmata.write(CAPABILITY_RESPONSE);
|
||||
for (byte pin=0; pin < TOTAL_PINS; pin++) {
|
||||
if (IS_PIN_DIGITAL(pin)) {
|
||||
Firmata.write((byte)INPUT);
|
||||
Firmata.write(1);
|
||||
Firmata.write((byte)OUTPUT);
|
||||
Firmata.write(1);
|
||||
}
|
||||
if (IS_PIN_ANALOG(pin)) {
|
||||
Firmata.write(ANALOG);
|
||||
Firmata.write(10);
|
||||
}
|
||||
if (IS_PIN_PWM(pin)) {
|
||||
Firmata.write(PWM);
|
||||
Firmata.write(8);
|
||||
}
|
||||
if (IS_PIN_SERVO(pin)) {
|
||||
Firmata.write(SERVO);
|
||||
Firmata.write(14);
|
||||
}
|
||||
if (IS_PIN_I2C(pin)) {
|
||||
Firmata.write(I2C);
|
||||
Firmata.write(1); // to do: determine appropriate value
|
||||
}
|
||||
Firmata.write(127);
|
||||
}
|
||||
Firmata.write(END_SYSEX);
|
||||
break;
|
||||
case PIN_STATE_QUERY:
|
||||
if (argc > 0) {
|
||||
byte pin=argv[0];
|
||||
break;
|
||||
case CAPABILITY_QUERY:
|
||||
Firmata.write(START_SYSEX);
|
||||
Firmata.write(PIN_STATE_RESPONSE);
|
||||
Firmata.write(pin);
|
||||
if (pin < TOTAL_PINS) {
|
||||
Firmata.write((byte)pinConfig[pin]);
|
||||
Firmata.write((byte)pinState[pin] & 0x7F);
|
||||
if (pinState[pin] & 0xFF80) Firmata.write((byte)(pinState[pin] >> 7) & 0x7F);
|
||||
if (pinState[pin] & 0xC000) Firmata.write((byte)(pinState[pin] >> 14) & 0x7F);
|
||||
Firmata.write(CAPABILITY_RESPONSE);
|
||||
for (byte pin = 0; pin < TOTAL_PINS; pin++) {
|
||||
if (IS_PIN_DIGITAL(pin)) {
|
||||
Firmata.write((byte)INPUT);
|
||||
Firmata.write(1);
|
||||
Firmata.write((byte)OUTPUT);
|
||||
Firmata.write(1);
|
||||
}
|
||||
if (IS_PIN_ANALOG(pin)) {
|
||||
Firmata.write(ANALOG);
|
||||
Firmata.write(10);
|
||||
}
|
||||
if (IS_PIN_PWM(pin)) {
|
||||
Firmata.write(PWM);
|
||||
Firmata.write(8);
|
||||
}
|
||||
if (IS_PIN_SERVO(pin)) {
|
||||
Firmata.write(SERVO);
|
||||
Firmata.write(14);
|
||||
}
|
||||
if (IS_PIN_I2C(pin)) {
|
||||
Firmata.write(I2C);
|
||||
Firmata.write(1); // to do: determine appropriate value
|
||||
}
|
||||
Firmata.write(127);
|
||||
}
|
||||
Firmata.write(END_SYSEX);
|
||||
}
|
||||
break;
|
||||
case ANALOG_MAPPING_QUERY:
|
||||
Firmata.write(START_SYSEX);
|
||||
Firmata.write(ANALOG_MAPPING_RESPONSE);
|
||||
for (byte pin=0; pin < TOTAL_PINS; pin++) {
|
||||
Firmata.write(IS_PIN_ANALOG(pin) ? PIN_TO_ANALOG(pin) : 127);
|
||||
}
|
||||
Firmata.write(END_SYSEX);
|
||||
break;
|
||||
break;
|
||||
case PIN_STATE_QUERY:
|
||||
if (argc > 0) {
|
||||
byte pin = argv[0];
|
||||
Firmata.write(START_SYSEX);
|
||||
Firmata.write(PIN_STATE_RESPONSE);
|
||||
Firmata.write(pin);
|
||||
if (pin < TOTAL_PINS) {
|
||||
Firmata.write((byte)pinConfig[pin]);
|
||||
Firmata.write((byte)pinState[pin] & 0x7F);
|
||||
if (pinState[pin] & 0xFF80) Firmata.write((byte)(pinState[pin] >> 7) & 0x7F);
|
||||
if (pinState[pin] & 0xC000) Firmata.write((byte)(pinState[pin] >> 14) & 0x7F);
|
||||
}
|
||||
Firmata.write(END_SYSEX);
|
||||
}
|
||||
break;
|
||||
case ANALOG_MAPPING_QUERY:
|
||||
Firmata.write(START_SYSEX);
|
||||
Firmata.write(ANALOG_MAPPING_RESPONSE);
|
||||
for (byte pin = 0; pin < TOTAL_PINS; pin++) {
|
||||
Firmata.write(IS_PIN_ANALOG(pin) ? PIN_TO_ANALOG(pin) : 127);
|
||||
}
|
||||
Firmata.write(END_SYSEX);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void enableI2CPins()
|
||||
{
|
||||
byte i;
|
||||
// is there a faster way to do this? would probaby require importing
|
||||
// is there a faster way to do this? would probaby require importing
|
||||
// Arduino.h to get SCL and SDA pins
|
||||
for (i=0; i < TOTAL_PINS; i++) {
|
||||
if(IS_PIN_I2C(i)) {
|
||||
for (i = 0; i < TOTAL_PINS; i++) {
|
||||
if (IS_PIN_I2C(i)) {
|
||||
// mark pins as i2c so they are ignore in non i2c data requests
|
||||
setPinModeCallback(i, I2C);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
isI2CEnabled = true;
|
||||
|
||||
|
||||
isI2CEnabled = true;
|
||||
|
||||
// is there enough time before the first I2C request to call this here?
|
||||
Wire.begin();
|
||||
}
|
||||
|
||||
/* disable the i2c pins so they can be used for other functions */
|
||||
void disableI2CPins() {
|
||||
isI2CEnabled = false;
|
||||
// disable read continuous mode for all devices
|
||||
queryIndex = -1;
|
||||
// uncomment the following if or when the end() method is added to Wire library
|
||||
// Wire.end();
|
||||
isI2CEnabled = false;
|
||||
// disable read continuous mode for all devices
|
||||
queryIndex = -1;
|
||||
// uncomment the following if or when the end() method is added to Wire library
|
||||
// Wire.end();
|
||||
}
|
||||
|
||||
/*==============================================================================
|
||||
@ -550,16 +550,16 @@ void systemResetCallback()
|
||||
// initialize a defalt state
|
||||
// TODO: option to load config from EEPROM instead of default
|
||||
if (isI2CEnabled) {
|
||||
disableI2CPins();
|
||||
disableI2CPins();
|
||||
}
|
||||
for (byte i=0; i < TOTAL_PORTS; i++) {
|
||||
for (byte i = 0; i < TOTAL_PORTS; i++) {
|
||||
reportPINs[i] = false; // by default, reporting off
|
||||
portConfigInputs[i] = 0; // until activated
|
||||
previousPINs[i] = 0;
|
||||
}
|
||||
// pins with analog capability default to analog input
|
||||
// otherwise, pins default to digital output
|
||||
for (byte i=0; i < TOTAL_PINS; i++) {
|
||||
for (byte i = 0; i < TOTAL_PINS; i++) {
|
||||
if (IS_PIN_ANALOG(i)) {
|
||||
// turns off pullup, configures everything
|
||||
setPinModeCallback(i, ANALOG);
|
||||
@ -582,7 +582,7 @@ void systemResetCallback()
|
||||
*/
|
||||
}
|
||||
|
||||
void setup()
|
||||
void setup()
|
||||
{
|
||||
Firmata.setFirmwareVersion(FIRMATA_MAJOR_VERSION, FIRMATA_MINOR_VERSION);
|
||||
|
||||
@ -601,17 +601,17 @@ void setup()
|
||||
/*==============================================================================
|
||||
* LOOP()
|
||||
*============================================================================*/
|
||||
void loop()
|
||||
void loop()
|
||||
{
|
||||
byte pin, analogPin;
|
||||
|
||||
/* DIGITALREAD - as fast as possible, check for changes and output them to the
|
||||
* FTDI buffer using Serial.print() */
|
||||
checkDigitalInputs();
|
||||
checkDigitalInputs();
|
||||
|
||||
/* SERIALREAD - processing incoming messagse as soon as possible, while still
|
||||
* checking digital inputs. */
|
||||
while(Firmata.available())
|
||||
while (Firmata.available())
|
||||
Firmata.processInput();
|
||||
|
||||
/* SEND FTDI WRITE BUFFER - make sure that the FTDI buffer doesn't go over
|
||||
@ -622,7 +622,7 @@ void loop()
|
||||
if (currentMillis - previousMillis > samplingInterval) {
|
||||
previousMillis += samplingInterval;
|
||||
/* ANALOGREAD - do all analogReads() at the configured sampling interval */
|
||||
for(pin=0; pin<TOTAL_PINS; pin++) {
|
||||
for (pin = 0; pin < TOTAL_PINS; pin++) {
|
||||
if (IS_PIN_ANALOG(pin) && pinConfig[pin] == ANALOG) {
|
||||
analogPin = PIN_TO_ANALOG(pin);
|
||||
if (analogInputsToReport & (1 << analogPin)) {
|
||||
|
Reference in New Issue
Block a user