[PD-cvs] externals/hardware/arduino/Pd_firmware Pd_firmware.pde, 1.10, 1.11

Hans-Christoph Steiner eighthave at users.sourceforge.net
Thu Aug 24 07:54:27 CEST 2006


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

Modified Files:
	Pd_firmware.pde 
Log Message:
Jamie Allen's and my cleanups compile and install, but I don't know if they work yet

Index: Pd_firmware.pde
===================================================================
RCS file: /cvsroot/pure-data/externals/hardware/arduino/Pd_firmware/Pd_firmware.pde,v
retrieving revision 1.10
retrieving revision 1.11
diff -C2 -d -r1.10 -r1.11
*** Pd_firmware.pde	24 Jun 2006 00:41:17 -0000	1.10
--- Pd_firmware.pde	24 Aug 2006 05:54:25 -0000	1.11
***************
*** 1,329 ****
! /* Pd_firmware aka Pduino
!  * ------------------
!  * 
!  * It was designed to work with the Pd object [arduino]
!  * which is included in Pd-extended.  This firmware could 
!  * easily be used with other programs like Max/MSP, Processing,
!  * or whatever can do serial communications.
!  *
!  * (copyleft) 2006 Hans-Christoph Steiner <hans at at.or.at>
!  * @author: Hans-Christoph Steiner
!  * @date: 2006-05-19
!  * @location: STEIM, Amsterdam, Netherlands
!  */
! 
! /* TODO
!  *
!  * - get digitalInput working
!  * - add pulseIn functionality
!  * - add software PWM for servos, etc
!  * - redesign protocol to accomodate boards with more I/Os
!  * - add cycle markers to mark start of analog, digital, pulseIn, and PWM
!  */
! 
! /*
!  * Pduino protocol
!  * =============== 
!  * data: 0-127   
!  * control: 128-255
!  * 
!  * Pd->Arduino commands
!  * --------------------
!  * 200-213 - set digital pin 0-13 to INPUT
!  * 214-227 - set digital pin 0-13 to OUTPUT
!  * 228 - UNUSED
!  * 229 - UNUSED
!  * 230 - next byte sets PWM0 value
!  * 231 - next byte sets PWM1 value
!  * 232 - next byte sets PWM2 value
!  * 233 - UNUSED
!  * 234 - UNUSED
!  * 235 - UNUSED
!  * 236 - UNUSED
!  * 237 - UNUSED
!  * 238 - disable all digital inputs
!  * 239 - enable all digital inputs
!  * 240 - disable all analog inputs
!  * 241 - enable 1 analog input (0)
!  * 242 - enable 2 analog inputs (0,1)
!  * 243 - enable 3 analog inputs (0-2)
!  * 244 - enable 4 analog inputs (0-3)
!  * 245 - enable 5 analog inputs (0-4)
!  * 246 - enable 6 analog inputs (0-5)
!  * 255 - cycle marker
!  *
!  * Pd->Arduino byte cycle
!  * ----------------------
!  * 0  start of cycle marker (255/11111111)
!  * 1  digitalOut 0-6 bitmask
!  * 2  digitalOut 7-13 bitmask
!  * 
!  * Arduino->Pd byte cycle
!  * ----------------------
!  * 0 start of cycle marker (255/11111111)
!  * 1  digitalIn 0-6 bitmask
!  * 2  digitalIn 7-13 bitmask
!  * 3  analogIn0 byte0
!  * 4  analogIn0 byte1
!  * 5  analogIn1 byte0
!  * 6  analogIn1 byte1
!  * 7  analogIn2 byte0
!  * 8  analogIn2 byte1
!  * 9  analogIn3 byte0
!  * 10 analogIn3 byte1
!  * 11 analogIn4 byte0
!  * 12 analogIn4 byte1
!  * 13 analogIn5 byte0
!  * 14 analogIn5 byte1
!  */
! 
! /*
!  * CAUTION!! Be careful with the Serial Monitor, it could freeze 
!  * your computer with this firmware running!  It outputs data 
!  * without a delay() so its very fast.
!  */
! 
! #define TOTAL_DIGITAL_PINS 14
! 
! // for comparing along with INPUT and OUTPUT
! #define PWM 2
! 
! // this flag says the next serial input will be PWM data
! byte waitForPWMData = 0;
! 
! // this flag says the first data byte for the digital outs is next
! boolean firstInputByte = false;
! 
! /* this int serves as an array of bits 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;
! byte analogInputsEnabled = 6;
! 
! byte analogPin;
! int analogData;
! 
! // -------------------------------------------------------------------------
! void transmitDigitalInput(byte startPin) {
!   byte i;
!   byte digitalPin;
!   byte digitalPinBit;
!   byte transmitByte;
!   byte digitalData;
! 
!   for(i=0;i<7;++i) {
!     digitalPin = i+startPin;
!     digitalPinBit = OUTPUT << digitalPin;
!     // only read the pin if its set to input
!     if(digitalPinStatus & digitalPinBit) {
!       digitalData = 0; // pin set to OUTPUT, don't read
!     }
!     else if( (digitalPin >= 9) && (pwmStatus & (1 << digitalPin)) ) {
!       digitalData = 0; // pin set to PWM, don't read
!     }
!     else {
!       digitalData = digitalRead(digitalPin);
!     }
! /* the next line probably needs to be re-thought (i.e. it might not work...) since my 
!    first attempt was miserably wrong.  <hans at at.or.at> */
!     transmitByte = transmitByte + ((2^i)*digitalData);
!   }
!   printByte(transmitByte);
! }
! 
! // -------------------------------------------------------------------------
! /* 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(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);
!   }
! }
! 
! // -------------------------------------------------------------------------
! /* this function checks to see if there is data waiting on the serial port 
!  * then processes all of the stored data
!  */
! void checkForInput() {
!   if(serialAvailable()) {  
!     while(serialAvailable()) {
!       processInput( (byte)serialRead() );
!     }
!   }
! }
! 
! // -------------------------------------------------------------------------
! void processInput(byte inputData) {
!   int i;
!   int mask;
! 
!   // the PWM commands (230-232) have a byte of data following the command
!   if (waitForPWMData > 0) {  
!     //    printByte(150);
!     //    printByte(inputData);
!     analogWrite(waitForPWMData,inputData);
!     waitForPWMData = 0;
!   }
!   else if(inputData < 128) {
!     //    printByte(151);
!     if(firstInputByte) {
!       //      printByte(160);
!       for(i=0; i<7; ++i) {
!         mask = 1 << i;
!         //printByte(254);
!         //printByte(i);
!         //printByte(mask);
!         if(digitalPinStatus & mask) {
!           digitalWrite(i, inputData & mask);
!           //printByte(inputData & mask);
!         } 
!       }
!       firstInputByte = false;
!     }
!     else {
!       //      printByte(161);
!       // output data for pins 7-13
!       for(i=7; i<TOTAL_DIGITAL_PINS; ++i) {
!         mask = 1 << i;
!         //printByte(254);
!         //printByte(i);
!         //printByte(mask);
!         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));
!           //printByte(inputData & (mask >> 7));
!         }        
!       }
!     }
!   }
!   else {
!     //    printByte(152);      
!     //    printByte(inputData);
!     switch (inputData) {
!     case 200:
!     case 201:
!     case 202:
!     case 203:
!     case 204:
!     case 205:
!     case 206:
!     case 207:
!     case 208:
!     case 209:
!     case 210:
!     case 211:
!     case 212:
!     case 213:
!       setPinMode(inputData-200,INPUT);
!       break;
!     case 214:
!     case 215:
!     case 216:
!     case 217:
!     case 218:
!     case 219:
!     case 220:
!     case 221:
!     case 222:
!     case 223:
!     case 224:
!     case 225:
!     case 226:
!     case 227:
!       setPinMode(inputData-214,OUTPUT);
!       break;
!     case 230:
!     case 231:
!     case 232:
!       waitForPWMData = inputData - 221; // set waitForPWMData to the PWM pin number
!       setPinMode(waitForPWMData, PWM);
!       break;
!     case 238: // all digital inputs off
!       digitalInputsEnabled = false;
!       break;
!     case 239: // all digital inputs on
!       digitalInputsEnabled = true;
!       break;
!     case 240: // analog input off
!     case 241: // analog 0 on  
!     case 242: // analog 0,1 on  
!     case 243: // analog 0-2 on  
!     case 244: // analog 0-3 on  
!     case 245: // analog 0-4 on  
!     case 246: // analog 0-5 on  
!       analogInputsEnabled = inputData - 240;
!       break;      
!     case 255: // incoming digital output bytes
!       firstInputByte = true;
!       break;
!     }
!   }
! }
! 
! // =========================================================================
! 
! // -------------------------------------------------------------------------
! void setup() {
!   byte i;
! 
!   beginSerial(9600);
!   for(i=0; i<TOTAL_DIGITAL_PINS; ++i) {
!     setPinMode(i,INPUT);
!   }
! }
! 
! // -------------------------------------------------------------------------
! void loop() {
!   checkForInput();  
! 
!   // read all digital pins, in enabled
!   if(digitalInputsEnabled) {
!     transmitDigitalInput(0);
!     checkForInput();
!     transmitDigitalInput(7);
!     checkForInput();
!   }
!   else if(analogInputsEnabled) {
!     // filler bytes, since the first thing sent is always the digitalInputs
!     printByte(0);
!     printByte(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(analogData >> 7);  // bitshift the big stuff into the output byte
!     printByte(analogData % 128);  // mod by 32 for the small byte
!     checkForInput();
!   }
! 
!   /* end with the cycle marker, if any of the inputs are enabled */
!   if( digitalInputsEnabled || analogInputsEnabled) {
!     printByte(255); 
!   }
! }
--- 1,436 ----
! /* Arduino firmware aka Firmata
!  * ------------------
!  * 
!  * It was designed to work with the Pd object [arduino]
!  * which is included in Pd-extended.  This firmware could 
!  * easily be used with other programs like Max/MSP, Processing,
!  * or whatever can do serial communications.
!  *
!  * (copyleft) 2006 Hans-Christoph Steiner <hans at at.or.at>
!  * @author: Hans-Christoph Steiner
!  * @date: 2006-05-19
!  * @location: STEIM, Amsterdam, Netherlands
!  */
! 
! /* TODO
!  *
!  * - get digitalInput working
!  * - add pulseIn functionality
!  * - add software PWM for servos, etc
!  * - redesign protocol to accomodate boards with more I/Os
!  * - add cycle markers to mark start of analog, digital, pulseIn, and PWM
!  */
! 
! /* firmata protocol
!  * =============== 
!  * data: 0-127   
!  * control: 128-255
!  */
!   
! /* 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
! #define SET_PIN_TWO_TO_IN       132 // set digital pin 2 to INPUT
! #define SET_PIN_THREE_TO_IN     133 // set digital pin 3 to INPUT
! #define SET_PIN_FOUR_TO_IN      134 // set digital pin 4 to INPUT
! #define SET_PIN_FIVE_TO_IN      135 // set digital pin 5 to INPUT
! #define SET_PIN_SIX_TO_IN       136 // set digital pin 6 to INPUT
! #define SET_PIN_SEVEN_TO_IN     137 // set digital pin 7 to INPUT
! #define SET_PIN_EIGHT_TO_IN     138 // set digital pin 8 to INPUT
! #define SET_PIN_NINE_TO_IN      139 // set digital pin 9 to INPUT
! #define SET_PIN_TEN_TO_IN       140 // set digital pin 10 to INPUT
! #define SET_PIN_ELEVEN_TO_IN    141 // set digital pin 11 to INPUT
! #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 DISABLE_ALL_ANALOG_INS  160 // disable reporting on all analog ins
! #define ENABLE_ONE_ANALOG_IN    161 // enable reporting for 1 analog in (0)
! #define ENABLE_TWO_ANALOG_INS   162 // enable reporting for 2 analog ins (0,1)
! #define ENABLE_THREE_ANALOG_INS 163 // enable reporting for 3 analog ins (0-2)
! #define ENABLE_FOUR_ANALOG_INS  164 // enable reporting for 4 analog ins (0-3)
! #define ENABLE_FIVE_ANALOG_INS  165 // enable reporting for 5 analog ins (0-4)
! #define ENABLE_SIX_ANALOG_INS   166 // enable reporting for 6 analog ins (0-5)
! /* 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
! #define SET_PIN_TWO_TO_OUT      202 // set digital pin 2 to OUTPUT
! #define SET_PIN_THREE_TO_OUT    203 // set digital pin 3 to OUTPUT
! #define SET_PIN_FOUR_TO_OUT     204 // set digital pin 4 to OUTPUT
! #define SET_PIN_FIVE_TO_OUT     205 // set digital pin 5 to OUTPUT
! #define SET_PIN_SIX_TO_OUT      206 // set digital pin 6 to OUTPUT
! #define SET_PIN_SEVEN_TO_OUT    207 // set digital pin 7 to OUTPUT
! #define SET_PIN_EIGHT_TO_OUT    208 // set digital pin 8 to OUTPUT
! #define SET_PIN_NINE_TO_OUT     209 // set digital pin 9 to OUTPUT
! #define SET_PIN_TEN_TO_OUT      210 // set digital pin 10 to OUTPUT
! #define SET_PIN_ELEVEN_TO_OUT   211 // set digital pin 11 to OUTPUT
! #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-249 // UNUSED */
! #define DISABLE_PWM             250 // next byte sets pin # to disable
! #define ENABLE_PWM              251 // next two bytes set pin # and duty cycle
! #define DISABLE_SOFTWARE_PWM    252 // next byte sets pin # to disable
! #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
! /* 252-254 // UNUSED */
! #define INPUT_CYCLE_MARKER      255 // input cycle marker
! 
!  
! /* two byte digital output data format
!  * ----------------------
!  * 0  get ready for digital input bytes (229)
!  * 1  digitalOut 0-6 bitmask
!  * 2  digitalOut 7-13 bitmask 
!  */
! 
!  /* two byte software PWM data format
!  * ----------------------
!  * 0  get ready for digital input bytes (250/251)
!  * 1  pin #
!  * 2  pulse width
!  */
! 
!  
! /* Arduino->Computer byte cycle
!  * ----------------------
!  * 0  start of cycle marker (255/11111111)
!  * 1  digital read from Arduino // 0-6 bitmask
!  * 2  digital read from Arduino // 7-13 bitmask
!  * 3  analog input pin 0 from Arduino // byte 0 
!  * 4  analog input pin 1 from Arduino // byte 1 
!  * 5  analog input pin 2 from Arduino // byte 2 
!  * 6  analog input pin 3 from Arduino // byte 3 
!  * 7  analog input pin 4 from Arduino // byte 4 
!  * 8  analog input pin 5 from Arduino // byte 5 
!  * 9  analog input pin 6 from Arduino // byte 6 
!  * 10  analog input pin 7 from Arduino // byte 10 
!  * 11  analog input pin 8 from Arduino // byte 11 
!  * 12  analog input pin 9 from Arduino // byte 12 
!  * 13  analog input pin 10 from Arduino // byte 13 
!  * 14  analog input pin 11 from Arduino // byte 14 
!  */
! 
! /*
!  * CAUTION!! Be careful with the Serial Monitor, it could freeze 
!  * your computer with this firmware running!  It outputs data 
!  * without a delay() so its very fast.
!  */
! 
! #define TOTAL_DIGITAL_PINS 14
! 
! // for comparing along with INPUT and OUTPUT
! #define PWM 2
! #define SOFTPWM 3
! 
! // maximum number of post-command data bytes
! #define MAX_DATA_BYTES 2
! // this flag says the next serial input will be data
! byte waitForData = 0;
! byte executeMultiByteCommand = 0; // command to execute after getting multi-byte data
! byte storedInputData[MAX_DATA_BYTES] = {0,0}; // multi-byte data
! 
! // this flag says the first data byte for the digital outs is next
! 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;
! 
! /* 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;
! 
! byte analogPin;
! int analogData;
! 
! // -------------------------------------------------------------------------
! void transmitDigitalInput(byte startPin) {
!   byte i;
!   byte digitalPin;
!   byte digitalPinBit;
!   byte transmitByte;
!   byte digitalData;
! 
!   for(i=0;i<7;++i) {
!     digitalPin = i+startPin;
!     digitalPinBit = OUTPUT << digitalPin;
!     // only read the pin if its set to input
!     if(digitalPinStatus & digitalPinBit) {
!       digitalData = 0; // pin set to OUTPUT, don't read
!     }
!     else if( (digitalPin >= 9) && (pwmStatus & (1 << digitalPin)) ) {
!       digitalData = 0; // pin set to PWM, don't read
!     }
!     else {
!       digitalData = digitalRead(digitalPin);
!     }
! /* the next line probably needs to be re-thought (i.e. it might not work...) since my 
!    first attempt was miserably wrong.  <hans at at.or.at> */
!     transmitByte = transmitByte + ((2^i)*digitalData);
!   }
!   printByte(transmitByte);
! }
! 
! 
! 
! // -------------------------------------------------------------------------
! /* 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(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);
!     softPwmStatus = softPwmStatus &~ (1 << pin);
!     pinMode(pin,OUTPUT);
!   }
!   else if(mode == SOFTPWM) {
!     digitalPinStatus = digitalPinStatus | (1 << pin);
!     pwmStatus = pwmStatus &~ (1 << pin);
!     softPwmStatus = softPwmStatus | (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
!     
! }
! 
! 
! // -------------------------------------------------------------------------
! /* this function checks to see if there is data waiting on the serial port 
!  * then processes all of the stored data
!  */
! void checkForInput() {
!   if(serialAvailable()) {  
!     while(serialAvailable()) {
!       processInput( (byte)serialRead() );
!     }
!   }
! }
! 
! // -------------------------------------------------------------------------
! void processInput(byte inputData) {
!   int i;
!   int mask;
!   
!   // a few commands have byte(s) of data following the command
!   if( waitForData > 0 ) {  
!     storedInputData[waitForData - 1] = inputData;
!     //analogWrite(waitForPWMData,inputData);
!     waitForData--;
!   }
!   else if(executeMultiByteCommand) {
!     //we got everything
!     switch(executeMultiByteCommand) {
!     case ENABLE_PWM:
!     case DISABLE_PWM:
!         //PWM 0 on the board is PIN 9
!         analogWrite(storedInputData[0] + 9, storedInputData[1]);
!         break;
!     case ENABLE_SOFTWARE_PWM:
!         setPinMode(storedInputData[0],SOFTPWM);
!         setSoftPwm(storedInputData[0], storedInputData[1]);     
!         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) {  //
!       for(i=0; i<7; ++i) {
!         mask = 1 << i;
!         if(digitalPinStatus & mask) {
!           digitalWrite(i, inputData & mask);
!         } 
!       }
!       firstInputByte = false;
!     }
!     else { //
!       // output data for pins 7-13
!       for(i=7; i<TOTAL_DIGITAL_PINS; ++i) {
!         mask = 1 << i;
!         if( (digitalPinStatus & mask) && !(pwmStatus & mask) && !(softPwmStatus & mask) ) {
!           // inputData is a byte and mask is an int, so align the high part of mask
!           digitalWrite(i, inputData & (mask >> 7));
!         }        
!       }
!     }
!   }
!   else {
!     switch (inputData) {
!     case SET_PIN_ZERO_TO_IN:
!     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:
!     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 DISABLE_ALL_ANALOG_INS:  // analog input off
!     case ENABLE_ONE_ANALOG_IN:    // analog 0 on  
!     case ENABLE_TWO_ANALOG_INS:   // analog 0,1 on  
!     case ENABLE_THREE_ANALOG_INS: // analog 0-2 on  
!     case ENABLE_FOUR_ANALOG_INS:  // analog 0-3 on  
!     case ENABLE_FIVE_ANALOG_INS:  // analog 0-4 on  
!     case ENABLE_SIX_ANALOG_INS:   // analog 0-5 on  
!         analogInputsEnabled = inputData - DISABLE_ALL_ANALOG_INS;
!         break;
!     case ENABLE_PWM:
!         waitForData = 2;  // (pin#, dutyCycle) 
!         executeMultiByteCommand = inputData;
!         break;
!     case DISABLE_PWM:
!         waitForData = 1;  // pin#
!         executeMultiByteCommand = inputData;
!         break;      
!     case SET_SOFTWARE_PWM_FREQ:
!         waitForData = 1;  // pin#
!         executeMultiByteCommand = inputData;
!         break;
!     case ENABLE_SOFTWARE_PWM:
!         waitForData = 2;  // (pin#, dutyCycle) 
!         executeMultiByteCommand = inputData;
!         break;
!     case DISABLE_SOFTWARE_PWM:
!         waitForData = 1;  // pin#
!         executeMultiByteCommand = inputData;
!         break;
!     case OUTPUT_TO_DIGITAL_PINS: // bytes to send to digital outputs
!         firstInputByte = true;
!       break;
!     }
!   }
! }
! 
! 
! // =========================================================================
! 
! // -------------------------------------------------------------------------
! void setup() {
!   byte i;
! 
!   beginSerial(9600);
!   for(i=0; i<TOTAL_DIGITAL_PINS; ++i) {
!     setPinMode(i,INPUT);
!   }
! }
! 
! // -------------------------------------------------------------------------
! void loop() {
!   checkForInput();  
!   
!   // read all digital pins, in enabled
!   if(digitalInputsEnabled) {
!     transmitDigitalInput(0);
!     checkForInput();
!     transmitDigitalInput(7);
!     checkForInput();
!   }
!   else if(analogInputsEnabled) {
!     // filler bytes, since the first thing sent is always the digitalInputs
!     printByte(0);
!     printByte(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(analogData >> 7);  // bitshift the big stuff into the output byte
!     printByte(analogData % 128);  // mod by 32 for the small byte
!     checkForInput();
!   }
! 
!   /* end with the cycle marker, if any of the inputs are enabled */
!   if( digitalInputsEnabled || analogInputsEnabled) {
!     printByte(255); 
!   }
! }





More information about the Pd-cvs mailing list