[PD-cvs] externals/hardware/arduino/Pd_firmware Makefile, 1.4, 1.5 Pd_firmware.pde, 1.25, 1.26

Hans-Christoph Steiner eighthave at users.sourceforge.net
Mon Mar 5 05:34:34 CET 2007


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

Modified Files:
	Makefile Pd_firmware.pde 
Log Message:
got 'report analog ports' working, but the analog data reporting isn't working properly yet

Index: Makefile
===================================================================
RCS file: /cvsroot/pure-data/externals/hardware/arduino/Pd_firmware/Makefile,v
retrieving revision 1.4
retrieving revision 1.5
diff -C2 -d -r1.4 -r1.5
*** Makefile	1 Mar 2007 05:39:49 -0000	1.4
--- Makefile	5 Mar 2007 04:34:32 -0000	1.5
***************
*** 124,127 ****
--- 124,128 ----
  # 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

Index: Pd_firmware.pde
===================================================================
RCS file: /cvsroot/pure-data/externals/hardware/arduino/Pd_firmware/Pd_firmware.pde,v
retrieving revision 1.25
retrieving revision 1.26
diff -C2 -d -r1.25 -r1.26
*** Pd_firmware.pde	1 Mar 2007 05:39:49 -0000	1.25
--- Pd_firmware.pde	5 Mar 2007 04:34:32 -0000	1.26
***************
*** 42,50 ****
  
  /* 
-  * TODO: debug hardware PWM
   * 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
-  * TODO: add protocol version reporting
   * TODO: add device type reporting (i.e. some firmwares will use the Firmata
   *       protocol, but will only support specific devices, like ultrasound 
--- 42,47 ----
***************
*** 52,56 ****
   * TODO: add "pinMode all 0/1" command
   * TODO: try using PIND to get all digitalIns at once
-  * TODO: add cycle markers to mark start of analog, digital, pulseIn, and PWM
   * TODO: use Program Control to load stored profiles from EEPROM
   */
--- 49,52 ----
***************
*** 96,100 ****
  
  /* -----------------------------------------------------------------------------
!  * DATA MESSAGES */
  
  /* two byte digital data format
--- 92,96 ----
  
  /* -----------------------------------------------------------------------------
!  * DATA MESSAGE FORMAT */
  
  /* two byte digital data format
***************
*** 214,217 ****
--- 210,214 ----
  byte waitForData = 0;
  byte executeMultiByteCommand = 0; // command to execute after getting multi-byte data
+ byte multiByteChannel = 0; // channel data for multiByteCommands
  byte storedInputData[MAX_DATA_BYTES] = {0,0}; // multi-byte data
  
***************
*** 221,226 ****
  byte digitalInputLowByte = 0;
  unsigned int digitalPinStatus = 65535;// bit-wise array to store pin status 0=INPUT, 1=OUTPUT
- 
- 
  /* this byte stores the status off whether PWM is on or not
   * bit 9 = PWM0, bit 10 = PWM1, bit 11 = PWM2
--- 218,221 ----
***************
*** 228,237 ****
  int pwmStatus = 0;
  
! /* bit-wise array to store pin reporting */
! unsigned int analogPinsToReport = 65535;
! 
! /* for reading analogIns */
! byte analogPin = 0;
! int analogData;
  /* interrupt variables */
  volatile int int_counter = 0; // ms counter for scheduling
--- 223,230 ----
  int pwmStatus = 0;
  
! /* analog inputs */
! unsigned int analogPinsToReport = 0; // bit-wise array to store pin reporting
! int analogPin = 0; // counter for reading analog pins
! int analogData; // storage variable for data from analogRead()
  /* interrupt variables */
  volatile int int_counter = 0; // ms counter for scheduling
***************
*** 272,276 ****
   */
  void processInput(int inputData) {
!   int command, channel;
    
    // a few commands have byte(s) of data following the command
--- 265,269 ----
   */
  void processInput(int inputData) {
!   int command;
    
    // a few commands have byte(s) of data following the command
***************
*** 282,289 ****
        switch(executeMultiByteCommand) {
        case ANALOG_MESSAGE:
-         channel = inputData & 0x0F; // get channel from command byte
          break;
        case DIGITAL_MESSAGE:
! 		outputDigitalBytes(storedInputData[1], storedInputData[0]); // (LSB, MSB)
  		break;
        case SET_DIGITAL_PIN_MODE:
--- 275,281 ----
        switch(executeMultiByteCommand) {
        case ANALOG_MESSAGE:
          break;
        case DIGITAL_MESSAGE:
! 		outputDigitalBytes(storedInputData[1], storedInputData[0]); //(LSB, MSB)
  		break;
        case SET_DIGITAL_PIN_MODE:
***************
*** 293,296 ****
--- 285,293 ----
          break;
        case REPORT_ANALOG_PIN:
+ 		setAnalogPinReporting(multiByteChannel,storedInputData[0]);
+ 		//Serial.print(multiByteChannel,BYTE);
+ 		//Serial.print(storedInputData[0],BYTE);
+ 		//Serial.print(analogPinsToReport,BYTE);
+ 		//Serial.print(analogPinsToReport & (1 << multiByteChannel),BYTE);
          break;
        case REPORT_DIGITAL_PORTS:
***************
*** 303,320 ****
      if(inputData < 0xF0) {
        command = inputData & 0xF0;
      } else {
        command = inputData;
      }
!     switch (inputData) {
      case ANALOG_MESSAGE:
      case DIGITAL_MESSAGE:
      case SET_DIGITAL_PIN_MODE:
        waitForData = 2; // two data bytes needed
!       executeMultiByteCommand = inputData;
        break;
      case REPORT_ANALOG_PIN:
      case REPORT_DIGITAL_PORTS:
        waitForData = 1; // two data bytes needed
!       executeMultiByteCommand = inputData;
        break;
      case SYSTEM_RESET:
--- 300,319 ----
      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:
***************
*** 344,349 ****
  
  // -----------------------------------------------------------------------------
! /* this function 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) {
--- 343,348 ----
  
  // -----------------------------------------------------------------------------
! /* 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) {
***************
*** 367,370 ****
--- 366,381 ----
  }
  
+ // -----------------------------------------------------------------------------
+ /* sets bits in a bit array (int) to toggle the reporting of the analogIns
+  */
+ void setAnalogPinReporting(byte pin, byte state) {
+   if(state == 0) {
+     analogPinsToReport = analogPinsToReport &~ (1 << pin);
+   }
+   else { // everything but 0 enables reporting of that pin
+     analogPinsToReport = analogPinsToReport | (1 << pin);
+   }
+ }
+ 
  // =============================================================================
  
***************
*** 417,430 ****
    // flash the pin 13 with the protocol minor version (add major once > 0)
    pinMode(13,OUTPUT);
!   pin13strobe(10,5,20); // separator, a quick burst
    delay(500);
    pin13strobe(MAJOR_VERSION, 200, 400);
    delay(500);
!   pin13strobe(10,5,20); // separator, a quick burst
    delay(500);
    pin13strobe(MINOR_VERSION, 200, 400);
    delay(500);
!   pin13strobe(10,5,20); // separator, a quick burst
!   delay(1000);
    printVersion();
  
--- 428,440 ----
    // flash the pin 13 with the protocol minor version (add major once > 0)
    pinMode(13,OUTPUT);
!   pin13strobe(2,1,4); // separator, a quick burst
    delay(500);
    pin13strobe(MAJOR_VERSION, 200, 400);
    delay(500);
!   pin13strobe(2,1,4); // separator, a quick burst
    delay(500);
    pin13strobe(MINOR_VERSION, 200, 400);
    delay(500);
!   pin13strobe(2,1,4); // separator, a quick burst
    printVersion();
  
***************
*** 441,448 ****
  /* DIGITALREAD - as fast as possible, check for changes and output them to the
   * FTDI buffer using serialWrite)  */
- 
  // this should use _SFR_IO8()
  
!   if(int_counter > 3) {
  
  
--- 451,457 ----
  /* DIGITALREAD - as fast as possible, check for changes and output them to the
   * FTDI buffer using serialWrite)  */
  // this should use _SFR_IO8()
  
!   if(int_counter > 3) {  // run this every 4ms
  
  
***************
*** 457,470 ****
  /* 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++) {
! 	for(analogPin=0;analogPin<2;analogPin++) {
! 	  //if( analogPinsToReport & (1 << analogPin) ) {
! 	  analogData = analogRead(analogPin);
! 	  Serial.print(ANALOG_MESSAGE + analogPin, BYTE);
! 	  // These two bytes converted back into the 10-bit value on host
! 	  Serial.print(analogData & 127, BYTE); // same as analogData % 128
! 	  Serial.print(analogData >> 7, BYTE); 
! 	  analogPin = (analogPin++) % TOTAL_ANALOG_PINS;
! 	  //}
  	}
  	int_counter = 0; // reset ms counter
--- 466,477 ----
  /* 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( analogPinsToReport & (1 << analogPin) ) {
! 		analogData = analogRead(analogPin);
! 		Serial.print(ANALOG_MESSAGE + analogPin, BYTE);
! 		// These two bytes converted back into the 10-bit value on host
! 		Serial.print(analogData % 128, BYTE);
! 		Serial.print(analogData >> 7, BYTE); 
! 	  }
  	}
  	int_counter = 0; // reset ms counter





More information about the Pd-cvs mailing list