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

Hans-Christoph Steiner eighthave at users.sourceforge.net
Mon Oct 30 06:44:03 CET 2006


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

Modified Files:
	Pd_firmware.pde 
Log Message:
removed unimplemented software PWM stuff for cleanliness; made arduino blink pin 13 on startup to represent the protocol version

Index: Pd_firmware.pde
===================================================================
RCS file: /cvsroot/pure-data/externals/hardware/arduino/Pd_firmware/Pd_firmware.pde,v
retrieving revision 1.19
retrieving revision 1.20
diff -C2 -d -r1.19 -r1.20
*** Pd_firmware.pde	28 Oct 2006 19:33:24 -0000	1.19
--- Pd_firmware.pde	30 Oct 2006 05:44:00 -0000	1.20
***************
*** 40,44 ****
  
  /* 
!  * TODO: add pulseOut functionality
   * TODO: add software PWM for servos, etc (servo.h or pulse.h)
   * TODO: redesign protocol to accomodate boards with more I/Os
--- 40,44 ----
  
  /* 
!  * TODO: add pulseOut functionality for servos
   * TODO: add software PWM for servos, etc (servo.h or pulse.h)
   * TODO: redesign protocol to accomodate boards with more I/Os
***************
*** 50,55 ****
  /* firmware version numbers.  The protocol is still changing, so these version
   * numbers are important */
  #define MAJOR_VERSION 0
! #define MINOR_VERSION 1
  
  /* firmata protocol
--- 50,56 ----
  /* 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
  
  /* firmata protocol
***************
*** 141,157 ****
  /* analog input message format
   * ----------------------
!  * 0   analog input marker (160 + number of pins to report)
!  * 1   high byte from analog input pin 0 
!  * 2   low byte from analog input pin 0
!  * 3   high byte from analog input pin 1 
!  * 4   low byte from analog input pin 1
!  * 5   high byte from analog input pin 2 
!  * 6   low byte from analog input pin 2
!  * 7   high byte from analog input pin 3 
!  * 8   low byte from analog input pin 3
!  * 9   high byte from analog input pin 4 
!  * 10  low byte from analog input pin 4
!  * 11  high byte from analog input pin 5 
!  * 12  low byte from analog input pin 5
   */
  
--- 142,148 ----
  /* analog input message format
   * ----------------------
!  * 0   analog input marker (160 + pin number reported)
!  * 1   high byte from analog input
!  * 2   low byte from analog input
   */
  
***************
*** 182,189 ****
  int pwmStatus;
  
- /* this byte stores the status of whether software PWM is on or not */
- /* 00000010 00000000 means bit 10 is softWarePWM enabled */
- int softPwmStatus;
- 
  boolean digitalInputsEnabled = true;
  byte analogInputsEnabled = 6;
--- 173,176 ----
***************
*** 194,205 ****
  // -------------------------------------------------------------------------
  void transmitDigitalInput(byte startPin) {
!   byte i;
!   byte digitalPin;
  //  byte digitalPinBit;
!   byte transmitByte = 0;
!   byte digitalData;
  
!   for(i=0;i<7;++i) {
!     digitalPin = i+startPin;
  /*    digitalPinBit = OUTPUT << digitalPin;
  // only read the pin if its set to input
--- 181,192 ----
  // -------------------------------------------------------------------------
  void transmitDigitalInput(byte startPin) {
! 	byte i;
! 	byte digitalPin;
  //  byte digitalPinBit;
! 	byte transmitByte = 0;
! 	byte digitalData;
  
! 	for(i=0;i<7;++i) {
! 		digitalPin = i+startPin;
  /*    digitalPinBit = OUTPUT << digitalPin;
  // only read the pin if its set to input
***************
*** 210,219 ****
  digitalData = 0; // pin set to PWM, don't read
  }*/
!     if( !(digitalPinStatus & (1 << digitalPin)) ) {
!       digitalData = (byte) digitalRead(digitalPin);
!       transmitByte = transmitByte + ((1 << i) * digitalData);
!     }
!   }
!   printByte(transmitByte);
  }
  
--- 197,206 ----
  digitalData = 0; // pin set to PWM, don't read
  }*/
! 		if( !(digitalPinStatus & (1 << digitalPin)) ) {
! 			digitalData = (byte) digitalRead(digitalPin);
! 			transmitByte = transmitByte + ((1 << i) * digitalData);
! 		}
! 	}
! 	printByte(transmitByte);
  }
  
***************
*** 225,269 ****
   */
  void setPinMode(int pin, int mode) {
!   if(mode == INPUT) {
!     digitalPinStatus = digitalPinStatus &~ (1 << pin);
!     pwmStatus = pwmStatus &~ (1 << pin);
!     pinMode(pin,INPUT);
!   }
!   else if(mode == OUTPUT) {
!     digitalPinStatus = digitalPinStatus | (1 << pin);
!     pwmStatus = pwmStatus &~ (1 << pin);
!     pinMode(pin,OUTPUT);
!   }
!   else if( (mode == PWM) && (pin >= 9) && (pin <= 11) ) {
!     digitalPinStatus = digitalPinStatus | (1 << pin);
!     pwmStatus = pwmStatus | (1 << pin);
!     pinMode(pin,OUTPUT);
!   }
! }
! 
! void setSoftPwm (int pin, byte pulsePeriod) {
!   byte i;
!   /*    for(i=0; i<7; ++i) {
!       mask = 1 << i;
!       if(digitalPinStatus & mask) {
!       digitalWrite(i, inputData & mask);
!       } 
!       }
!   */    
!   //read timer type thing
! 
!   //loop through each pin, turn them on if selected
!   //softwarePWMStatus
!   //check timer type thing against pulsePeriods for each pin 
!   //throw pin low if expired
! }
! 
! void setSoftPwmFreq(byte freq) {
! }
! 
! 
! void disSoftPwm(int pin) {
!   //throw pin low
!     
  }
  
--- 212,230 ----
   */
  void setPinMode(int pin, int mode) {
! 	if(mode == INPUT) {
! 		digitalPinStatus = digitalPinStatus &~ (1 << pin);
! 		pwmStatus = pwmStatus &~ (1 << pin);
! 		pinMode(pin,INPUT);
! 	}
! 	else if(mode == OUTPUT) {
! 		digitalPinStatus = digitalPinStatus | (1 << pin);
! 		pwmStatus = pwmStatus &~ (1 << pin);
! 		pinMode(pin,OUTPUT);
! 	}
! 	else if( (mode == PWM) && (pin >= 9) && (pin <= 11) ) {
! 		digitalPinStatus = digitalPinStatus | (1 << pin);
! 		pwmStatus = pwmStatus | (1 << pin);
! 		pinMode(pin,OUTPUT);
! 	}
  }
  
***************
*** 274,424 ****
   */
  void checkForInput() {
!   if(Serial.available()) {  
!     while(Serial.available()) {
!       processInput( (byte)Serial.read() );
!     }
!   }
  }
  
  /* -------------------------------------------------------------------------
   * processInput() is called whenever a byte is available on the
!  * Arduino's serial port.  This is where the commands are handled.
   */
  void processInput(byte inputData) {
!   int i;
!   int mask;
    
!   // a few commands have byte(s) of data following the command
!   if( waitForData > 0) {  
!     waitForData--;
!     storedInputData[waitForData] = inputData;
  
!     if(executeMultiByteCommand && (waitForData==0)) {
!       //we got everything
!       switch(executeMultiByteCommand) {
!       case ENABLE_PWM:
!         setPinMode(storedInputData[1],PWM);
!         analogWrite(storedInputData[1], storedInputData[0]);
!         break;
!       case DISABLE_PWM:
!         setPinMode(storedInputData[0],INPUT);
!         break;
!       case ENABLE_SOFTWARE_PWM:
!         setPinMode(storedInputData[1],PWM);
!         setSoftPwm(storedInputData[1], storedInputData[0]);     
!         break; 
!       case DISABLE_SOFTWARE_PWM:
!         disSoftPwm(storedInputData[0]);
!         break;
!       case SET_SOFTWARE_PWM_FREQ:
!         setSoftPwmFreq(storedInputData[0]);
!         break;
!       }
!       executeMultiByteCommand = 0;
!     }
!   }
!   else if(inputData < 128) {
!     if(firstInputByte) {
!       // output data for pins 7-13
!       for(i=7; i<TOTAL_DIGITAL_PINS; ++i) {
!         mask = 1 << i;
!         if( (digitalPinStatus & mask) && !(pwmStatus & mask) ) {
!           // inputData is a byte and mask is an int, so align the high part of mask
!           digitalWrite(i, inputData & (mask >> 7));
!         }        
!       }
!       firstInputByte = false;
!     }
!     else { //
!       for(i=0; i<7; ++i) {
!         mask = 1 << i;
!         if( (digitalPinStatus & mask) && !(pwmStatus & mask) ) {
!           digitalWrite(i, inputData & mask);
!         } 
!       }
!     }
!   }
!   else {
!     switch (inputData) {
!     case SET_PIN_ZERO_TO_IN:       // set digital pins to INPUT
!     case SET_PIN_ONE_TO_IN:
!     case SET_PIN_TWO_TO_IN:
!     case SET_PIN_THREE_TO_IN:
!     case SET_PIN_FOUR_TO_IN:
!     case SET_PIN_FIVE_TO_IN:
!     case SET_PIN_SIX_TO_IN:
!     case SET_PIN_SEVEN_TO_IN:
!     case SET_PIN_EIGHT_TO_IN:
!     case SET_PIN_NINE_TO_IN:
!     case SET_PIN_TEN_TO_IN:
!     case SET_PIN_ELEVEN_TO_IN:
!     case SET_PIN_TWELVE_TO_IN:
!     case SET_PIN_THIRTEEN_TO_IN:
!       setPinMode(inputData - SET_PIN_ZERO_TO_IN, INPUT);
!       break;
!     case SET_PIN_ZERO_TO_OUT:      // set digital pins to OUTPUT
!     case SET_PIN_ONE_TO_OUT:
!     case SET_PIN_TWO_TO_OUT:
!     case SET_PIN_THREE_TO_OUT:
!     case SET_PIN_FOUR_TO_OUT:
!     case SET_PIN_FIVE_TO_OUT:
!     case SET_PIN_SIX_TO_OUT:
!     case SET_PIN_SEVEN_TO_OUT:
!     case SET_PIN_EIGHT_TO_OUT:
!     case SET_PIN_NINE_TO_OUT:
!     case SET_PIN_TEN_TO_OUT:
!     case SET_PIN_ELEVEN_TO_OUT:
!     case SET_PIN_TWELVE_TO_OUT:
!     case SET_PIN_THIRTEEN_TO_OUT:
!       setPinMode(inputData - SET_PIN_ZERO_TO_OUT, OUTPUT);
!       break;
!     case DISABLE_DIGITAL_INPUTS:   // all digital inputs off
!       digitalInputsEnabled = false;
!       break;
!     case ENABLE_DIGITAL_INPUTS:    // all digital inputs on
!       digitalInputsEnabled = true;
!       break;
!     case ZERO_ANALOG_INS:   // analog input off
!     case ONE_ANALOG_IN:     // analog 0 on  
!     case TWO_ANALOG_INS:    // analog 0,1 on  
!     case THREE_ANALOG_INS:  // analog 0-2 on  
!     case FOUR_ANALOG_INS:   // analog 0-3 on  
!     case FIVE_ANALOG_INS:   // analog 0-4 on  
!     case SIX_ANALOG_INS:    // analog 0-5 on  
!     case SEVEN_ANALOG_INS:  // analog 0-6 on  
!     case EIGHT_ANALOG_INS:  // analog 0-7 on  
!     case NINE_ANALOG_INS:   // analog 0-8 on  
! 	  analogInputsEnabled = inputData - ZERO_ANALOG_INS;
! 	  break;
!     case ENABLE_PWM:
!       waitForData = 2;  // 2 bytes needed (pin#, dutyCycle) 
!       executeMultiByteCommand = inputData;
!       break;
!     case DISABLE_PWM:
!       waitForData = 1;  // 1 byte needed (pin#)
!       executeMultiByteCommand = inputData;
!       break;      
!     case SET_SOFTWARE_PWM_FREQ:
!       waitForData = 1;  // 1 byte needed (pin#)
!       executeMultiByteCommand = inputData;
!       break;
!     case ENABLE_SOFTWARE_PWM:
!       waitForData = 2;  // 2 bytes needed (pin#, dutyCycle) 
!       executeMultiByteCommand = inputData;
!       break;
!     case DISABLE_SOFTWARE_PWM:
!       waitForData = 1;  // 1 byte needed (pin#)
!       executeMultiByteCommand = inputData;
!       break;
!     case OUTPUT_TO_DIGITAL_PINS:   // bytes to send to digital outputs
!       firstInputByte = true;
!       break;
!     case REPORT_VERSION:
!       printByte(REPORT_VERSION);
!       printByte(MAJOR_VERSION);
!       printByte(MINOR_VERSION);
!       break;
!     }
!   }
  }
  
--- 235,381 ----
   */
  void checkForInput() {
! 	if(Serial.available()) {  
! 		while(Serial.available()) {
! 			processInput( (byte)Serial.read() );
! 		}
! 	}
  }
  
  /* -------------------------------------------------------------------------
   * processInput() is called whenever a byte is available on the
!  * Arduino's serial port.  This is where the comm1ands are handled.
   */
  void processInput(byte inputData) {
! 	int i;
! 	int mask;
    
! 	// a few commands have byte(s) of data following the command
! 	if( waitForData > 0) {  
! 		waitForData--;
! 		storedInputData[waitForData] = inputData;
  
! 		if(executeMultiByteCommand && (waitForData==0)) {
! 			//we got everything
! 			switch(executeMultiByteCommand) {
! 			case ENABLE_PWM:
! 				setPinMode(storedInputData[1],PWM);
! 				analogWrite(storedInputData[1], storedInputData[0]);
! 				break;
! 			case DISABLE_PWM:
! 				setPinMode(storedInputData[0],INPUT);
! 				break;
! 			case ENABLE_SOFTWARE_PWM:
! 				break; 
! 			case DISABLE_SOFTWARE_PWM:
! 				break;
! 			case SET_SOFTWARE_PWM_FREQ:
! 				break;
! 			}
! 			executeMultiByteCommand = 0;
! 		}
! 	}
! 	else if(inputData < 128) {
! 		if(firstInputByte) {
! 			// output data for pins 7-13
! 			for(i=7; i<TOTAL_DIGITAL_PINS; ++i) {
! 				mask = 1 << i;
! 				if( (digitalPinStatus & mask) && !(pwmStatus & mask) ) {
! 					// inputData is a byte and mask is an int, so align the high part of mask
! 					digitalWrite(i, inputData & (mask >> 7));
! 				}        
! 			}
! 			firstInputByte = false;
! 		}
! 		else { //
! 			for(i=0; i<7; ++i) {
! 				mask = 1 << i;
! 				if( (digitalPinStatus & mask) && !(pwmStatus & mask) ) {
! 					digitalWrite(i, inputData & mask);
! 				} 
! 			}
! 		}
! 	}
! 	else {
! 		switch (inputData) {
! 		case SET_PIN_ZERO_TO_IN:       // set digital pins to INPUT
! 		case SET_PIN_ONE_TO_IN:
! 		case SET_PIN_TWO_TO_IN:
! 		case SET_PIN_THREE_TO_IN:
! 		case SET_PIN_FOUR_TO_IN:
! 		case SET_PIN_FIVE_TO_IN:
! 		case SET_PIN_SIX_TO_IN:
! 		case SET_PIN_SEVEN_TO_IN:
! 		case SET_PIN_EIGHT_TO_IN:
! 		case SET_PIN_NINE_TO_IN:
! 		case SET_PIN_TEN_TO_IN:
! 		case SET_PIN_ELEVEN_TO_IN:
! 		case SET_PIN_TWELVE_TO_IN:
! 		case SET_PIN_THIRTEEN_TO_IN:
! 			setPinMode(inputData - SET_PIN_ZERO_TO_IN, INPUT);
! 			break;
! 		case SET_PIN_ZERO_TO_OUT:      // set digital pins to OUTPUT
! 		case SET_PIN_ONE_TO_OUT:
! 		case SET_PIN_TWO_TO_OUT:
! 		case SET_PIN_THREE_TO_OUT:
! 		case SET_PIN_FOUR_TO_OUT:
! 		case SET_PIN_FIVE_TO_OUT:
! 		case SET_PIN_SIX_TO_OUT:
! 		case SET_PIN_SEVEN_TO_OUT:
! 		case SET_PIN_EIGHT_TO_OUT:
! 		case SET_PIN_NINE_TO_OUT:
! 		case SET_PIN_TEN_TO_OUT:
! 		case SET_PIN_ELEVEN_TO_OUT:
! 		case SET_PIN_TWELVE_TO_OUT:
! 		case SET_PIN_THIRTEEN_TO_OUT:
! 			setPinMode(inputData - SET_PIN_ZERO_TO_OUT, OUTPUT);
! 			break;
! 		case DISABLE_DIGITAL_INPUTS:   // all digital inputs off
! 			digitalInputsEnabled = false;
! 			break;
! 		case ENABLE_DIGITAL_INPUTS:    // all digital inputs on
! 			digitalInputsEnabled = true;
! 			break;
! 		case ZERO_ANALOG_INS:   // analog input off
! 		case ONE_ANALOG_IN:     // analog 0 on  
! 		case TWO_ANALOG_INS:    // analog 0,1 on  
! 		case THREE_ANALOG_INS:  // analog 0-2 on  
! 		case FOUR_ANALOG_INS:   // analog 0-3 on  
! 		case FIVE_ANALOG_INS:   // analog 0-4 on  
! 		case SIX_ANALOG_INS:    // analog 0-5 on  
! 		case SEVEN_ANALOG_INS:  // analog 0-6 on  
! 		case EIGHT_ANALOG_INS:  // analog 0-7 on  
! 		case NINE_ANALOG_INS:   // analog 0-8 on  
! 			analogInputsEnabled = inputData - ZERO_ANALOG_INS;
! 			break;
! 		case ENABLE_PWM:
! 			waitForData = 2;  // 2 bytes needed (pin#, dutyCycle) 
! 			executeMultiByteCommand = inputData;
! 			break;
! 		case DISABLE_PWM:
! 			waitForData = 1;  // 1 byte needed (pin#)
! 			executeMultiByteCommand = inputData;
! 			break;      
! 		case SET_SOFTWARE_PWM_FREQ:
! 			waitForData = 1;  // 1 byte needed (pin#)
! 			executeMultiByteCommand = inputData;
! 			break;
! 		case ENABLE_SOFTWARE_PWM:
! 			waitForData = 2;  // 2 bytes needed (pin#, dutyCycle) 
! 			executeMultiByteCommand = inputData;
! 			break;
! 		case DISABLE_SOFTWARE_PWM:
! 			waitForData = 1;  // 1 byte needed (pin#)
! 			executeMultiByteCommand = inputData;
! 			break;
! 		case OUTPUT_TO_DIGITAL_PINS:   // bytes to send to digital outputs
! 			firstInputByte = true;
! 			break;
! 		case REPORT_VERSION:
! 			printByte(REPORT_VERSION);
! 			printByte(MAJOR_VERSION);
! 			printByte(MINOR_VERSION);
! 			break;
! 		}
! 	}
  }
  
***************
*** 428,461 ****
  // -------------------------------------------------------------------------
  void setup() {
!   byte i;
! 
!   Serial.begin(19200);
!   for(i=0; i<TOTAL_DIGITAL_PINS; ++i) {
!     setPinMode(i,INPUT);
!   }
  }
  
  // -------------------------------------------------------------------------
  void loop() {
!   checkForInput();  
    
!   // read all digital pins, in enabled
!   if(digitalInputsEnabled) {
!     printByte(ENABLE_DIGITAL_INPUTS);
!     transmitDigitalInput(7);
!     checkForInput();
!     transmitDigitalInput(0);
!     checkForInput();
!   }
  
!   /* get analog in, for the number enabled */
!   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();
!   }
  }
--- 385,426 ----
  // -------------------------------------------------------------------------
  void setup() {
! 	byte i;
! 	
! // flash the pin 13 with the protocol minor version
! 	pinMode(13,OUTPUT);
! 	for(i-0; i<MINOR_VERSION; i++) {
! 		digitalWrite(13,1);
! 		delay(100);
! 		digitalWrite(13,0);
! 		delay(100);
! 	}
! 	Serial.begin(19200);
! 	for(i=0; i<TOTAL_DIGITAL_PINS; ++i) {
! 		setPinMode(i,INPUT);
! 	}
  }
  
  // -------------------------------------------------------------------------
  void loop() {
! 	checkForInput();  
    
! 	// read all digital pins, in enabled
! 	if(digitalInputsEnabled) {
! 		printByte(ENABLE_DIGITAL_INPUTS);
! 		transmitDigitalInput(7);
! 		checkForInput();
! 		transmitDigitalInput(0);
! 		checkForInput();
! 	}
  
! 	/* get analog in, for the number enabled */
! 	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();
! 	}
  }





More information about the Pd-cvs mailing list