diff options
Diffstat (limited to 'firmwares/Standard_Firmata')
| -rw-r--r-- | firmwares/Standard_Firmata/Makefile | 260 | ||||
| -rw-r--r-- | firmwares/Standard_Firmata/Standard_Firmata.pde | 323 | 
2 files changed, 0 insertions, 583 deletions
| diff --git a/firmwares/Standard_Firmata/Makefile b/firmwares/Standard_Firmata/Makefile deleted file mode 100644 index 6f73a72..0000000 --- a/firmwares/Standard_Firmata/Makefile +++ /dev/null @@ -1,260 +0,0 @@ -# Arduino makefile -# -# This makefile allows you to build sketches from the command line -# without the Arduino environment (or Java). -# -# The Arduino environment does preliminary processing on a sketch before -# compiling it.  If you're using this makefile instead, you'll need to do -# a few things differently: -# -#   - Give your program's file a .cpp extension (e.g. foo.cpp). -# -#   - Put this line at top of your code: #include <WProgram.h> -# -#   - Write prototypes for all your functions (or define them before you -#     call them).  A prototype declares the types of parameters a -#     function will take and what type of value it will return.  This -#     means that you can have a call to a function before the definition -#     of the function.  A function prototype looks like the first line of -#     the function, with a semi-colon at the end.  For example: -#     int digitalRead(int pin); -# -# Instructions for using the makefile: -# -#  1. Copy this file into the folder with your sketch. -# -#  2. Below, modify the line containing "TARGET" to refer to the name of -#     of your program's file without an extension (e.g. TARGET = foo). -# -#  3. Modify the line containg "ARDUINO" to point the directory that -#     contains the Arduino core (for normal Arduino installations, this -#     is the hardware/cores/arduino sub-directory). -# -#  4. Modify the line containing "PORT" to refer to the filename -#     representing the USB or serial connection to your Arduino board -#     (e.g. PORT = /dev/tty.USB0).  If the exact name of this file -#     changes, you can use * as a wildcard (e.g. PORT = /dev/tty.USB*). -# -#  5. At the command line, change to the directory containing your -#     program's file and the makefile. -# -#  6. Type "make" and press enter to compile/verify your program. -# -#  7. Type "make upload", reset your Arduino board, and press enter  to -#     upload your program to the Arduino board. -# -# $Id: Makefile,v 1.7 2007/04/13 05:28:23 eighthave Exp $ - -PORT = /dev/tty.usbserial-* -TARGET = Pd_firmware -ARDUINO = /Applications/arduino-0007 -ARDUINO_SRC = $(ARDUINO)/hardware/cores/arduino -ARDUINO_LIB_SRC = $(ARDUINO)/hardware/libraries -INCLUDE = -I$(ARDUINO_SRC) -I$(ARDUINO)/hardware/tools/avr/avr/include \ -	-I$(ARDUINO_LIB_SRC)/EEPROM \ -	-I$(ARDUINO_LIB_SRC)/Firmata \ -	-I$(ARDUINO_LIB_SRC) -SRC = $(ARDUINO_SRC)/pins_arduino.c $(ARDUINO_SRC)/wiring.c \ -	$(ARDUINO_SRC)/WInterrupts.c -CXXSRC = applet/$(TARGET).cpp $(ARDUINO_SRC)/HardwareSerial.cpp \ -	$(ARDUINO_LIB_SRC)/EEPROM/EEPROM.cpp \ -	$(ARDUINO_LIB_SRC)/Firmata/Firmata.cpp \ -	$(ARDUINO_SRC)/WRandom.cpp -MCU = atmega8 -F_CPU = 16000000 -FORMAT = ihex -UPLOAD_RATE = 19200 - -# Name of this Makefile (used for "make depend"). -MAKEFILE = Makefile - -# Debugging format. -# Native formats for AVR-GCC's -g are stabs [default], or dwarf-2. -# AVR (extended) COFF requires stabs, plus an avr-objcopy run. -DEBUG = stabs - -OPT = s - -# Place -D or -U options here -CDEFS = -DF_CPU=$(F_CPU) -CXXDEFS = -DF_CPU=$(F_CPU) - -# Compiler flag to set the C Standard level. -# c89   - "ANSI" C -# gnu89 - c89 plus GCC extensions -# c99   - ISO C99 standard (not yet fully implemented) -# gnu99 - c99 plus GCC extensions -CSTANDARD = -std=gnu99 -CDEBUG = -g$(DEBUG) -CWARN = -Wall -Wstrict-prototypes -CTUNING = -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -#CEXTRA = -Wa,-adhlns=$(<:.c=.lst) - -CFLAGS = $(CDEBUG) $(CDEFS) $(INCLUDE) -O$(OPT) $(CWARN) $(CSTANDARD) $(CEXTRA) -CXXFLAGS = $(CDEFS) $(INCLUDE) -O$(OPT) -#ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs  -LDFLAGS =  - - -# Programming support using avrdude. Settings and variables. -AVRDUDE_PROGRAMMER = stk500 -AVRDUDE_PORT = $(PORT) -AVRDUDE_WRITE_FLASH = -U flash:w:applet/$(TARGET).hex -AVRDUDE_FLAGS = -F -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) \ -  -b $(UPLOAD_RATE) -q -V - -# Program settings -CC = avr-gcc -CXX = avr-g++ -OBJCOPY = avr-objcopy -OBJDUMP = avr-objdump -SIZE = avr-size -NM = avr-nm -AVRDUDE = avrdude -REMOVE = rm -f -MV = mv -f - -# Define all object files. -OBJ = $(SRC:.c=.o) $(CXXSRC:.cpp=.o) $(ASRC:.S=.o) - -# Define all listing files. -LST = $(ASRC:.S=.lst) $(CXXSRC:.cpp=.lst) $(SRC:.c=.lst) - -# Combine all necessary flags and optional flags. -# Add target processor to flags. -ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) -ALL_CXXFLAGS = -mmcu=$(MCU) -I. $(CXXFLAGS) -ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) - - -# Default target. -all: build -	echo 'close;' | /Applications/Pd-0.39.2-extended-RC1.app/Contents/Resources/bin/pdsend 34567 || true -	say "press the button" -	make upload - -build: applet_files elf hex - -applet_files: -	test -d applet || mkdir applet -	echo '#include "WProgram.h"' > applet/$(TARGET).cpp -	echo '#include "avr/interrupt.h"' >> applet/$(TARGET).cpp -	sed -n 's|^\(void .*)\).*|\1;|p' Pd_firmware.pde | grep -v 'setup()' | \ -		grep -v 'loop()' >> applet/$(TARGET).cpp -	cat $(TARGET).pde >> applet/$(TARGET).cpp - -elf: applet/$(TARGET).elf -hex: applet/$(TARGET).hex -eep: applet/$(TARGET).eep -lss: applet/$(TARGET).lss  -sym: applet/$(TARGET).sym - -# Program the device.   -upload: applet/$(TARGET).hex -	$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) - - - - -# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB. -COFFCONVERT=$(OBJCOPY) --debugging \ ---change-section-address .data-0x800000 \ ---change-section-address .bss-0x800000 \ ---change-section-address .noinit-0x800000 \ ---change-section-address .eeprom-0x810000  - - -coff: applet/$(TARGET).elf -	$(COFFCONVERT) -O coff-avr applet/$(TARGET).elf applet/$(TARGET).cof - - -extcoff: applet/$(TARGET).elf -	$(COFFCONVERT) -O coff-ext-avr applet/$(TARGET).elf applet/$(TARGET).cof - - -.SUFFIXES: .elf .hex .eep .lss .sym - -.elf.hex: -	$(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@ - -.elf.eep: -	-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ -	--change-section-lma .eeprom=0 -O $(FORMAT) $< $@ - -# Create extended listing file from ELF output file. -.elf.lss: -	$(OBJDUMP) -h -S $< > $@ - -# Create a symbol table from ELF output file. -.elf.sym: -	$(NM) -n $< > $@ - - - -# Link: create ELF output file from object files. -applet/$(TARGET).elf: $(OBJ) -	$(CC) $(ALL_CFLAGS) $(OBJ) --output $@ $(LDFLAGS) - - -# Compile: create object files from C++ source files. -.cpp.o: -	$(CXX) -c $(ALL_CXXFLAGS) $< -o $@  - -# Compile: create object files from C source files. -.c.o: -	$(CC) -c $(ALL_CFLAGS) $< -o $@  - - -# Compile: create assembler files from C source files. -.c.s: -	$(CC) -S $(ALL_CFLAGS) $< -o $@ - - -# Assemble: create object files from assembler source files. -.S.o: -	$(CC) -c $(ALL_ASFLAGS) $< -o $@ - - - -# Target: clean project. -clean: -	$(REMOVE) applet/$(TARGET).hex applet/$(TARGET).eep applet/$(TARGET).cof applet/$(TARGET).elf \ -	$(TARGET).map applet/$(TARGET).sym applet/$(TARGET).lss \ -	$(OBJ) $(LST) $(SRC:.c=.s) $(SRC:.c=.d) $(CXXSRC:.cpp=.s) $(CXXSRC:.cpp=.d) -	find $(ARDUINO)/lib/ -name '*.o' -delete - -depend: -	if grep '^# DO NOT DELETE' $(MAKEFILE) >/dev/null; \ -	then \ -		sed -e '/^# DO NOT DELETE/,$$d' $(MAKEFILE) > \ -			$(MAKEFILE).$$$$ && \ -		$(MV) $(MAKEFILE).$$$$ $(MAKEFILE); \ -	fi -	echo '# DO NOT DELETE THIS LINE -- make depend depends on it.' \ -		>> $(MAKEFILE); \ -	$(CC) -M -mmcu=$(MCU) $(CDEFS) $(INCLUDE) $(SRC) $(ASRC) >> $(MAKEFILE) - -.PHONY:	all build elf hex eep lss sym program coff extcoff clean depend - -# for emacs -etags: -	make etags_`uname -s` -	etags *.pde \ -		$(ARDUINO_SRC)/*.[ch] \ -		$(ARDUINO_SRC)/*.cpp \ -		$(ARDUINO_LIB_SRC)/*/*.[ch] \ -		$(ARDUINO_LIB_SRC)/*/*.cpp \ -		$(ARDUINO)/hardware/tools/avr/avr/include/avr/*.[ch] \ -		$(ARDUINO)/hardware/tools/avr/avr/include/*.[ch] - -etags_Darwin: -#	etags -a  - -etags_Linux: -#	etags -a /usr/include/*.h linux/input.h /usr/include/sys/*.h - -etags_MINGW: -#	etags -a /usr/include/*.h /usr/include/sys/*.h  - - - diff --git a/firmwares/Standard_Firmata/Standard_Firmata.pde b/firmwares/Standard_Firmata/Standard_Firmata.pde deleted file mode 100644 index 2aa9da9..0000000 --- a/firmwares/Standard_Firmata/Standard_Firmata.pde +++ /dev/null @@ -1,323 +0,0 @@ -/* - * Copyright (C) 2006 Free Software Foundation - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * See file LICENSE for further informations on licensing terms. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. - * - * ----------------------------------------------------------- - * Firmata, the general purpose sensorbox firmware for Arduino - * ----------------------------------------------------------- - *  - * Firmata turns the Arduino into a Plug-n-Play sensorbox, servo - * controller, and/or PWM motor/lamp controller. - * - * It was originally designed to work with the Pd object [arduino] - * which is included in Pd-extended.  This firmware is intended to - * work with any host computer software package.  It can easily be - * used with other programs like Max/MSP, Processing, or whatever can - * do serial communications. - * - * @author: Hans-Christoph Steiner <hans@at.or.at> - *   help with initial protocol redesign: Jamie Allen <jamie@heavyside.net> - *   much protocol discussion: the Arduino developers mailing list - *   key bugfixes: Georg Holzmann <grh@mur.at> - *                 Gerda Strobl <gerda.strobl@student.tugraz.at> - * @date: 2006-05-19 - * @locations: STEIM, Amsterdam, Netherlands - *             IDMI/Polytechnic University, Brookyn, NY, USA - *             Electrolobby Ars Electronica, Linz, Austria - * - * See http://www.arduino.cc/playground/Interfacing/Firmata for docs - */ - -/*  - * TODO: add pulseOut functionality for servos - * TODO: add software PWM for servos, etc (servo.h or pulse.h) - * TODO: add device type reporting (i.e. some firmwares will use the Firmata - *       protocol, but will only support specific devices, like ultrasound  - *       rangefinders or servos) - * TODO: use Program Control to load stored profiles from EEPROM - */ - -/* cvs version: $Id: Pd_firmware.pde,v 1.32 2007/06/27 20:59:24 eighthave Exp $ */ - -#include <EEPROM.h> -#include <Firmata.h> - -/*============================================================================== - * GLOBAL VARIABLES - *============================================================================*/ - -/* input message handling */ -byte waitForData = 0; // this flag says the next serial input will be data -byte executeMultiByteCommand = 0; // execute this after getting multi-byte data -byte multiByteChannel = 0; // channel data for multiByteCommands -byte storedInputData[MAX_DATA_BYTES] = {0,0}; // multi-byte data -/* digital pins */ -boolean reportDigitalInputs = false; // output digital inputs or not -int digitalInputs; -int previousDigitalInputs; // previous output to test for change -unsigned int digitalPinStatus = 65535; // store pin status, default OUTPUT -/* PWM/analog outputs */ -int pwmStatus = 0; // bitwise array to store PWM status -/* analog inputs */ -int analogInputsToReport = 0; // bitwise array to store pin reporting -int analogPin = 0; // counter for reading analog pins -/* timer variables */ -extern volatile unsigned long timer0_overflow_count; // timer0 from wiring.c -unsigned long nextExecuteTime; // for comparison with timer0_overflow_count - -/*============================================================================== - * FUNCTIONS                                                                 - *============================================================================*/ - -/* ----------------------------------------------------------------------------- - * output digital bytes received from the serial port  */ -void outputDigitalBytes(byte pin0_6, byte pin7_13) { -  int i; -  int mask; -  int twoBytesForPorts; -     -// this should be converted to use PORTs -  twoBytesForPorts = pin0_6 + (pin7_13 << 7); -  for(i=2; i<TOTAL_DIGITAL_PINS; ++i) { // ignore Rx,Tx pins (0 and 1) -    mask = 1 << i; -    if( (digitalPinStatus & mask) && !(pwmStatus & mask) ) { -      digitalWrite(i, twoBytesForPorts & mask ? HIGH : LOW); -    }  -  } -} - -/* ----------------------------------------------------------------------------- - * 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) { -  if(reportDigitalInputs) { -	 previousDigitalInputs = digitalInputs; -	 digitalInputs = PINB << 8;  // get pins 8-13 -	 digitalInputs += PIND;      // get pins 0-7 -	 digitalInputs = digitalInputs &~ digitalPinStatus; // ignore pins set OUTPUT -	 if(digitalInputs != previousDigitalInputs) { -		// TODO: implement more ports as channels for more than 16 digital pins -		Firmata.sendDigitalPortPair(0, digitalInputs); // port 0 till more are implemented -		/*		Serial.print(DIGITAL_MESSAGE,BYTE); -		Serial.print(digitalInputs % 128, BYTE); // Tx pins 0-6 -		Serial.print(digitalInputs >> 7, BYTE);  // Tx pins 7-13*/ -	 } -  } -} - -// ----------------------------------------------------------------------------- -/* sets the pin mode to the correct state and sets the relevant bits in the - * two bit-arrays that track Digital I/O and PWM status - */ -void setPinMode(byte pin, byte mode) { -  if(pin > 1) { // ignore RxTx pins (0,1) -	if(mode == INPUT) { -	  digitalPinStatus = digitalPinStatus &~ (1 << pin); -	  pwmStatus = pwmStatus &~ (1 << pin); -	  digitalWrite(pin,LOW); // turn off pin before switching to INPUT -	  pinMode(pin,INPUT); -	} -	else if(mode == OUTPUT) { -	  digitalPinStatus = digitalPinStatus | (1 << pin); -	  pwmStatus = pwmStatus &~ (1 << pin); -	  pinMode(pin,OUTPUT); -	} -	else if( mode == PWM ) { -	  digitalPinStatus = digitalPinStatus | (1 << pin); -	  pwmStatus = pwmStatus | (1 << pin); -	  pinMode(pin,OUTPUT); -	} -  // TODO: save status to EEPROM here, if changed -  } -} - -// ----------------------------------------------------------------------------- -/* sets bits in a bit array (int) to toggle the reporting of the analogIns - */ -void setAnalogPinReporting(byte pin, byte state) { -  if(state == 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 -} - -/* ----------------------------------------------------------------------------- - * processInput() is called whenever a byte is available on the - * Arduino's serial port.  This is where the commands are handled. */ -void processInput(int inputData) { -  int command; -   -  // a few commands have byte(s) of data following the command -  if( (waitForData > 0) && (inputData < 128) ) {   -    waitForData--; -    storedInputData[waitForData] = inputData; -    if( (waitForData==0) && executeMultiByteCommand ) { // got the whole message -      switch(executeMultiByteCommand) { -      case ANALOG_MESSAGE: -		setPinMode(multiByteChannel,PWM); -		analogWrite(multiByteChannel,  -		(storedInputData[0] << 7) + storedInputData[1] ); -        break; -      case DIGITAL_MESSAGE: -		outputDigitalBytes(storedInputData[1], storedInputData[0]); //(LSB, MSB) -		break; -      case SET_DIGITAL_PIN_MODE: -		setPinMode(storedInputData[1], storedInputData[0]); // (pin#, mode) -		if(storedInputData[0] == INPUT)  -		  reportDigitalInputs = true; // enable reporting of digital inputs -        break; -      case REPORT_ANALOG_PIN: -		setAnalogPinReporting(multiByteChannel,storedInputData[0]); -        break; -      case REPORT_DIGITAL_PORTS: -		// TODO: implement MIDI channel as port base for more than 16 digital inputs -		if(storedInputData[0] == 0) -		  reportDigitalInputs = false; -		else -		  reportDigitalInputs = true; -        break; -      } -      executeMultiByteCommand = 0; -    }	 -  } else { -    // remove channel info from command byte if less than 0xF0 -    if(inputData < 0xF0) { -      command = inputData & 0xF0; -	  multiByteChannel = inputData & 0x0F; -    } else { -      command = inputData; -	  // commands in the 0xF* range don't use channel data -    } -    switch (command) { // TODO: these needs to be switched to command -    case ANALOG_MESSAGE: -    case DIGITAL_MESSAGE: -    case SET_DIGITAL_PIN_MODE: -      waitForData = 2; // two data bytes needed -      executeMultiByteCommand = command; -      break; -    case REPORT_ANALOG_PIN: -    case REPORT_DIGITAL_PORTS: -      waitForData = 1; // two data bytes needed -      executeMultiByteCommand = command; -      break; -    case SYSTEM_RESET: -      // this doesn't do anything yet -      break; -    case REPORT_VERSION: -	  Firmata.printVersion(); -      break; -    } -  } -} - -/* ----------------------------------------------------------------------------- - * this function checks to see if there is data waiting on the serial port  - * then processes all of the stored data - */ -void checkForSerialReceive() { -  while(Serial.available()) -	processInput(Serial.read()); -} - -/* ----------------------------------------------------------------------------- - * these functions are for loading and saving the state of the digital pins and - * pin reporting so that the Arduino will start up again in the same state. The - * EEPROM is supposed to have a life of at least 100,000 writes. - */ -void loadSettings() { -	//EEPROM.read(); -} - -void saveSettings() { -	EEPROM.write(ANALOGINPUTSTOREPORT_LOW_BYTE, analogInputsToReport & 0xFF); -	EEPROM.write(ANALOGINPUTSTOREPORT_HIGH_BYTE, analogInputsToReport >> 8); -	EEPROM.write(REPORTDIGITALINPUTS_BYTE, reportDigitalInputs & 0xFF); -	EEPROM.write(DIGITALPINSTATUS_LOW_BYTE, digitalPinStatus & 0xFF); -	EEPROM.write(DIGITALPINSTATUS_HIGH_BYTE, digitalPinStatus >> 8); -	EEPROM.write(PWMSTATUS_LOW_BYTE, pwmStatus & 0xFF); -	EEPROM.write(PWMSTATUS_HIGH_BYTE, pwmStatus >> 8); -} - -// ============================================================================= -// used for flashing the pin for the version number -void pin13strobe(int count, int onInterval, int offInterval) { -  byte i; -  pinMode(13, OUTPUT); -  for(i=0; i<count; i++) { -    delay(offInterval); -    digitalWrite(13,1); -    delay(onInterval); -    digitalWrite(13,0); -  } -} - -/*============================================================================== - * SETUP() - *============================================================================*/ -void setup() { -  byte i; - -  // flash the pin 13 with the protocol version -  pinMode(13,OUTPUT); -  pin13strobe(2,1,4); // separator, a quick burst -  delay(500); -  pin13strobe(FIRMATA_MAJOR_VERSION, 200, 400); -  delay(500); -  pin13strobe(2,1,4); // separator, a quick burst -  delay(500); -  pin13strobe(FIRMATA_MINOR_VERSION, 200, 400); -  delay(500); -  pin13strobe(2,1,4); // separator, a quick burst - -  for(i=0; i<TOTAL_DIGITAL_PINS; ++i) { -    setPinMode(i,OUTPUT); -  } -  // TODO: load state from EEPROM here - -  /* TODO: send digital inputs here, if enabled, to set the initial state on the -   * host computer, since once in the loop(), the Arduino will only send data on -   * change. */ -} - -/*============================================================================== - * LOOP() - *============================================================================*/ -void loop() { -/* DIGITALREAD - as fast as possible, check for changes and output them to the - * FTDI buffer using Serial.print()  */ -  checkDigitalInputs();   -  if(timer0_overflow_count > nextExecuteTime) {   -	nextExecuteTime = timer0_overflow_count + 19; // run this every 20ms -	/* SERIALREAD - Serial.read() uses a 128 byte circular buffer, so handle -	 * all serialReads at once, i.e. empty the buffer */ -	checkForSerialReceive(); -	/* 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)); -	} -  } -} | 
