[PD-cvs] externals/hardware/arduino/Pd_firmware Pd_firmware.pde, 1.20, 1.21

Hans-Christoph Steiner eighthave at users.sourceforge.net
Tue Oct 31 01:39:09 CET 2006


Update of /cvsroot/pure-data/externals/hardware/arduino/Pd_firmware
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv1657/Pd_firmware

Modified Files:
	Pd_firmware.pde 
Log Message:

- digital inputs are now only sent upon change
- finished conversion to new Serial class API
- upped baud rate to full speed: 115200



Index: Pd_firmware.pde
===================================================================
RCS file: /cvsroot/pure-data/externals/hardware/arduino/Pd_firmware/Pd_firmware.pde,v
retrieving revision 1.20
retrieving revision 1.21
diff -C2 -d -r1.20 -r1.21
*** Pd_firmware.pde	30 Oct 2006 05:44:00 -0000	1.20
--- Pd_firmware.pde	31 Oct 2006 00:39:07 -0000	1.21
***************
*** 48,54 ****
   */
  
! /* firmware version numbers.  The protocol is still changing, so these version
!  * numbers are important */
! // cvs version: $Id $
  #define MAJOR_VERSION 0
  #define MINOR_VERSION 2
--- 48,57 ----
   */
  
! /* cvs version: $Id$ */
! 
! /* 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 MAJOR_VERSION 0
  #define MINOR_VERSION 2
***************
*** 62,66 ****
  /* computer<->Arduino commands
   * -------------------- */
! /* 128-129 // UNUSED */
  #define SET_PIN_ZERO_TO_IN      130 // set digital pin 0 to INPUT
  #define SET_PIN_ONE_TO_IN       131 // set digital pin 1 to INPUT
--- 65,69 ----
  /* computer<->Arduino commands
   * -------------------- */
! /* 128-129 // UNASSIGNED */
  #define SET_PIN_ZERO_TO_IN      130 // set digital pin 0 to INPUT
  #define SET_PIN_ONE_TO_IN       131 // set digital pin 1 to INPUT
***************
*** 77,84 ****
  #define SET_PIN_TWELVE_TO_IN    142 // set digital pin 12 to INPUT
  #define SET_PIN_THIRTEEN_TO_IN  143 // set digital pin 13 to INPUT
! /* 144-149 // UNUSED */
  #define DISABLE_DIGITAL_INPUTS  150 // disable reporting of digital inputs
  #define ENABLE_DIGITAL_INPUTS   151 // enable reporting of digital inputs
! /* 152-159 // UNUSED */
  #define ZERO_ANALOG_INS         160 // disable reporting on all analog ins
  #define ONE_ANALOG_IN           161 // enable reporting for 1 analog in (0)
--- 80,87 ----
  #define SET_PIN_TWELVE_TO_IN    142 // set digital pin 12 to INPUT
  #define SET_PIN_THIRTEEN_TO_IN  143 // set digital pin 13 to INPUT
! /* 144-149 // UNASSIGNED */
  #define DISABLE_DIGITAL_INPUTS  150 // disable reporting of digital inputs
  #define ENABLE_DIGITAL_INPUTS   151 // enable reporting of digital inputs
! /* 152-159 // UNASSIGNED */
  #define ZERO_ANALOG_INS         160 // disable reporting on all analog ins
  #define ONE_ANALOG_IN           161 // enable reporting for 1 analog in (0)
***************
*** 91,95 ****
  #define EIGHT_ANALOG_INS        168 // enable reporting for 6 analog ins (0-7)
  #define NINE_ANALOG_INS         169 // enable reporting for 6 analog ins (0-8)
! /* 167-199 // UNUSED */
  #define SET_PIN_ZERO_TO_OUT     200 // set digital pin 0 to OUTPUT
  #define SET_PIN_ONE_TO_OUT      201 // set digital pin 1 to OUTPUT
--- 94,98 ----
  #define EIGHT_ANALOG_INS        168 // enable reporting for 6 analog ins (0-7)
  #define NINE_ANALOG_INS         169 // enable reporting for 6 analog ins (0-8)
! /* 170-199 // UNASSIGNED */
  #define SET_PIN_ZERO_TO_OUT     200 // set digital pin 0 to OUTPUT
  #define SET_PIN_ONE_TO_OUT      201 // set digital pin 1 to OUTPUT
***************
*** 106,114 ****
  #define SET_PIN_TWELVE_TO_OUT   212 // set digital pin 12 to OUTPUT
  #define SET_PIN_THIRTEEN_TO_OUT 213 // set digital pin 13 to OUTPUT
! /* 214-228 // UNUSED */
  #define OUTPUT_TO_DIGITAL_PINS  229 // next two bytes set digital output data 
! /* 230-239 // UNUSED */
  #define REPORT_VERSION          240 // return the firmware version
! /* 240-249 // UNUSED */
  #define DISABLE_PWM             250 // next byte sets pin # to disable
  #define ENABLE_PWM              251 // next two bytes set pin # and duty cycle
--- 109,117 ----
  #define SET_PIN_TWELVE_TO_OUT   212 // set digital pin 12 to OUTPUT
  #define SET_PIN_THIRTEEN_TO_OUT 213 // set digital pin 13 to OUTPUT
! /* 214-228 // UNASSIGNED */
  #define OUTPUT_TO_DIGITAL_PINS  229 // next two bytes set digital output data 
! /* 230-239 // UNASSIGNED */
  #define REPORT_VERSION          240 // return the firmware version
! /* 240-249 // UNASSIGNED */
  #define DISABLE_PWM             250 // next byte sets pin # to disable
  #define ENABLE_PWM              251 // next two bytes set pin # and duty cycle
***************
*** 116,120 ****
  #define ENABLE_SOFTWARE_PWM     253 // next two bytes set pin # and duty cycle
  #define SET_SOFTWARE_PWM_FREQ   254 // set master frequency for software PWMs
! /* 255 // UNUSED */
  
   
--- 119,123 ----
  #define ENABLE_SOFTWARE_PWM     253 // next two bytes set pin # and duty cycle
  #define SET_SOFTWARE_PWM_FREQ   254 // set master frequency for software PWMs
! /* 255 // UNASSIGNED */
  
   
***************
*** 162,175 ****
  boolean firstInputByte = false;
  
  /* this int serves as a bit-wise array to store pin status
!  * 0 = INPUT, 1 = OUTPUT
!  */
! int digitalPinStatus;
  
  /* this byte stores the status off whether PWM is on or not
   * bit 9 = PWM0, bit 10 = PWM1, bit 11 = PWM2
!  * the rest of the bits are unused and should remain 0
!  */
! int pwmStatus;
  
  boolean digitalInputsEnabled = true;
--- 165,183 ----
  boolean firstInputByte = false;
  
+ /* store the previously sent digital inputs to compare against the current
+  * digital inputs.  If there is no change, do not transmit. */ 
+ byte previousDigitalInputHighByte = 0;
+ byte previousDigitalInputLowByte = 0;
+ byte digitalInputHighByte = 0;
+ byte digitalInputLowByte = 0;
+ 
  /* this int serves as a bit-wise array to store pin status
!  * 0 = INPUT, 1 = OUTPUT  */
! int digitalPinStatus = 0;
  
  /* this byte stores the status off whether PWM is on or not
   * bit 9 = PWM0, bit 10 = PWM1, bit 11 = PWM2
!  * the rest of the bits are unused and should remain 0  */
! int pwmStatus = 0;
  
  boolean digitalInputsEnabled = true;
***************
*** 180,188 ****
  
  // -------------------------------------------------------------------------
! void transmitDigitalInput(byte startPin) {
  	byte i;
  	byte digitalPin;
  //  byte digitalPinBit;
! 	byte transmitByte = 0;
  	byte digitalData;
  
--- 188,196 ----
  
  // -------------------------------------------------------------------------
! byte transmitDigitalInput(byte startPin) {
  	byte i;
  	byte digitalPin;
  //  byte digitalPinBit;
! 	byte returnByte = 0;
  	byte digitalData;
  
***************
*** 199,206 ****
  		if( !(digitalPinStatus & (1 << digitalPin)) ) {
  			digitalData = (byte) digitalRead(digitalPin);
! 			transmitByte = transmitByte + ((1 << i) * digitalData);
  		}
  	}
! 	printByte(transmitByte);
  }
  
--- 207,214 ----
  		if( !(digitalPinStatus & (1 << digitalPin)) ) {
  			digitalData = (byte) digitalRead(digitalPin);
! 			returnByte = returnByte + ((1 << i) * digitalData);
  		}
  	}
! 	return(returnByte);
  }
  
***************
*** 227,230 ****
--- 235,239 ----
  		pinMode(pin,OUTPUT);
  	}
+ // TODO: save status to EEPROM here, if changed
  }
  
***************
*** 372,378 ****
  			break;
  		case REPORT_VERSION:
! 			printByte(REPORT_VERSION);
! 			printByte(MAJOR_VERSION);
! 			printByte(MINOR_VERSION);
  			break;
  		}
--- 381,387 ----
  			break;
  		case REPORT_VERSION:
! 			Serial.print(REPORT_VERSION, BYTE);
! 			Serial.print(MAJOR_VERSION, BYTE);
! 			Serial.print(MINOR_VERSION, BYTE);
  			break;
  		}
***************
*** 386,391 ****
  void setup() {
  	byte i;
! 	
! // flash the pin 13 with the protocol minor version
  	pinMode(13,OUTPUT);
  	for(i-0; i<MINOR_VERSION; i++) {
--- 395,406 ----
  void setup() {
  	byte i;
! 
! // 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. */
! 
! // flash the pin 13 with the protocol minor version (add major once > 0)
  	pinMode(13,OUTPUT);
  	for(i-0; i<MINOR_VERSION; i++) {
***************
*** 393,402 ****
  		delay(100);
  		digitalWrite(13,0);
! 		delay(100);
  	}
- 	Serial.begin(19200);
  	for(i=0; i<TOTAL_DIGITAL_PINS; ++i) {
  		setPinMode(i,INPUT);
  	}
  }
  
--- 408,417 ----
  		delay(100);
  		digitalWrite(13,0);
! 		delay(200);
  	}
  	for(i=0; i<TOTAL_DIGITAL_PINS; ++i) {
  		setPinMode(i,INPUT);
  	}
+ 	Serial.begin(115200);	
  }
  
***************
*** 407,414 ****
  	// read all digital pins, in enabled
  	if(digitalInputsEnabled) {
! 		printByte(ENABLE_DIGITAL_INPUTS);
! 		transmitDigitalInput(7);
! 		checkForInput();
! 		transmitDigitalInput(0);
  		checkForInput();
  	}
--- 422,438 ----
  	// read all digital pins, in enabled
  	if(digitalInputsEnabled) {
! 		digitalInputHighByte = transmitDigitalInput(7);
! 		checkForInput();  
! 		digitalInputLowByte = transmitDigitalInput(0);
! 		checkForInput();  
! 		// only send data if it has changed
! 		if( (digitalInputHighByte != previousDigitalInputHighByte) && 
! 			(digitalInputLowByte != previousDigitalInputLowByte) ) {
! 			Serial.print(ENABLE_DIGITAL_INPUTS, BYTE);
! 			Serial.print(digitalInputHighByte, BYTE);
! 			Serial.print(digitalInputLowByte, BYTE);
! 			previousDigitalInputHighByte = digitalInputHighByte;
! 			previousDigitalInputLowByte = digitalInputLowByte;
! 		}
  		checkForInput();
  	}
***************
*** 417,425 ****
  	for(analogPin=0; analogPin<analogInputsEnabled; ++analogPin) {
  		analogData = analogRead(analogPin);
! 		// these two bytes get converted back into the whole number in Pd
! 		// the higher bits should be zeroed so that the 8th bit doesn't get set
! 		printByte(ONE_ANALOG_IN + analogPin); 
! 		printByte(analogData >> 7);  // bitshift the big stuff into the output byte
! 		printByte(analogData % 128); // mod by 32 for the small byte
  		checkForInput();
  	}
--- 441,449 ----
  	for(analogPin=0; analogPin<analogInputsEnabled; ++analogPin) {
  		analogData = analogRead(analogPin);
! 		/* These two bytes get converted back into the whole number on host.
! 		  Highest bits should be zeroed so the 8th bit doesn't get set */
! 		Serial.print(ONE_ANALOG_IN + analogPin, BYTE);
! 		Serial.print(analogData >> 7, BYTE); // shift high bits into output byte
! 		Serial.print(analogData % 128, BYTE); // mod by 32 for the small byte
  		checkForInput();
  	}





More information about the Pd-cvs mailing list