diff options
-rw-r--r-- | Pd_firmware/Pd_firmware.pde | 98 |
1 files changed, 61 insertions, 37 deletions
diff --git a/Pd_firmware/Pd_firmware.pde b/Pd_firmware/Pd_firmware.pde index a314150..d7e10bc 100644 --- a/Pd_firmware/Pd_firmware.pde +++ b/Pd_firmware/Pd_firmware.pde @@ -47,9 +47,12 @@ * TODO: add cycle markers to mark start of analog, digital, pulseIn, and PWM */ -/* firmware version numbers. The protocol is still changing, so these version - * numbers are important */ -// cvs version: $Id $ +/* cvs version: $Id: Pd_firmware.pde,v 1.21 2006-10-31 00:39:07 eighthave Exp $ */ + +/* 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 @@ -61,7 +64,7 @@ /* computer<->Arduino commands * -------------------- */ -/* 128-129 // UNUSED */ +/* 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 #define SET_PIN_TWO_TO_IN 132 // set digital pin 2 to INPUT @@ -76,10 +79,10 @@ #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 */ +/* 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 // UNUSED */ +/* 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) #define TWO_ANALOG_INS 162 // enable reporting for 2 analog ins (0,1) @@ -90,7 +93,7 @@ #define SEVEN_ANALOG_INS 167 // enable reporting for 6 analog ins (0-6) #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 */ +/* 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 #define SET_PIN_TWO_TO_OUT 202 // set digital pin 2 to OUTPUT @@ -105,17 +108,17 @@ #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 */ +/* 214-228 // UNASSIGNED */ #define OUTPUT_TO_DIGITAL_PINS 229 // next two bytes set digital output data -/* 230-239 // UNUSED */ +/* 230-239 // UNASSIGNED */ #define REPORT_VERSION 240 // return the firmware version -/* 240-249 // UNUSED */ +/* 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 #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 -/* 255 // UNUSED */ +/* 255 // UNASSIGNED */ /* two byte digital output data format @@ -161,16 +164,21 @@ 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; +/* 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 = 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; + * the rest of the bits are unused and should remain 0 */ +int pwmStatus = 0; boolean digitalInputsEnabled = true; byte analogInputsEnabled = 6; @@ -179,11 +187,11 @@ byte analogPin; int analogData; // ------------------------------------------------------------------------- -void transmitDigitalInput(byte startPin) { +byte transmitDigitalInput(byte startPin) { byte i; byte digitalPin; // byte digitalPinBit; - byte transmitByte = 0; + byte returnByte = 0; byte digitalData; for(i=0;i<7;++i) { @@ -198,10 +206,10 @@ digitalData = 0; // pin set to PWM, don't read }*/ if( !(digitalPinStatus & (1 << digitalPin)) ) { digitalData = (byte) digitalRead(digitalPin); - transmitByte = transmitByte + ((1 << i) * digitalData); + returnByte = returnByte + ((1 << i) * digitalData); } } - printByte(transmitByte); + return(returnByte); } @@ -226,6 +234,7 @@ void setPinMode(int pin, int mode) { pwmStatus = pwmStatus | (1 << pin); pinMode(pin,OUTPUT); } +// TODO: save status to EEPROM here, if changed } @@ -371,9 +380,9 @@ void processInput(byte inputData) { firstInputByte = true; break; case REPORT_VERSION: - printByte(REPORT_VERSION); - printByte(MAJOR_VERSION); - printByte(MINOR_VERSION); + Serial.print(REPORT_VERSION, BYTE); + Serial.print(MAJOR_VERSION, BYTE); + Serial.print(MINOR_VERSION, BYTE); break; } } @@ -385,19 +394,25 @@ void processInput(byte inputData) { // ------------------------------------------------------------------------- void setup() { byte i; - -// flash the pin 13 with the protocol minor version + +// 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++) { digitalWrite(13,1); delay(100); digitalWrite(13,0); - delay(100); + delay(200); } - Serial.begin(19200); for(i=0; i<TOTAL_DIGITAL_PINS; ++i) { setPinMode(i,INPUT); } + Serial.begin(115200); } // ------------------------------------------------------------------------- @@ -406,21 +421,30 @@ void loop() { // read all digital pins, in enabled if(digitalInputsEnabled) { - printByte(ENABLE_DIGITAL_INPUTS); - transmitDigitalInput(7); - checkForInput(); - transmitDigitalInput(0); + 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(); } /* 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 + /* 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(); } } |