Update of /cvsroot/pure-data/externals/hardware/arduino/Pd_firmware
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv15679/Pd_firmware
Modified Files:
Pd_firmware.pde
Log Message:
- got analog input working
- version reporting works, but checkInput() isn't run enough, so it misses the
data if there is a lot of traffic on the serial port
Index: Pd_firmware.pde
===================================================================
RCS file: /cvsroot/pure-data/externals/hardware/arduino/Pd_firmware/Pd_firmware.pde,v
retrieving revision 1.23
retrieving revision 1.24
diff -C2 -d -r1.23 -r1.24
*** Pd_firmware.pde 20 Feb 2007 06:25:56 -0000 1.23
--- Pd_firmware.pde 22 Feb 2007 06:16:43 -0000 1.24
***************
*** 169,173 ****
#define MINOR_VERSION 0 // for backwards compatible changes
! /* total number of digital pins supported */
#define TOTAL_DIGITAL_PINS 14
--- 169,174 ----
#define MINOR_VERSION 0 // for backwards compatible changes
! /* total number of pins currently supported */
! #define TOTAL_ANALOG_PINS 16
#define TOTAL_DIGITAL_PINS 14
***************
*** 207,210 ****
--- 208,214 ----
int pwmStatus = 0;
+ /* bit-wise array to store pin reporting */
+ unsigned int analogPinsToReport = 65536;
+
/*==========================================================================
***************
*** 216,230 ****
*/
void outputDigitalBytes(byte pin0_6, byte pin7_13) {
! int i;
! int mask;
! int twoBytesForPorts;
!
! twoBytesForPorts = pin0_6 + (pin7_13 << 7);
! for(i=0; i<14; ++i) {
! mask = 1 << i;
! if( (digitalPinStatus & mask) && !(pwmStatus & mask) ) {
! digitalWrite(i, twoBytesForPorts & mask);
! }
! }
}
--- 220,234 ----
*/
void outputDigitalBytes(byte pin0_6, byte pin7_13) {
! int i;
! int mask;
! int twoBytesForPorts;
!
! twoBytesForPorts = pin0_6 + (pin7_13 << 7);
! for(i=0; i<14; ++i) {
! mask = 1 << i;
! if( (digitalPinStatus & mask) && !(pwmStatus & mask) ) {
! digitalWrite(i, twoBytesForPorts & mask);
! }
! }
}
***************
*** 234,291 ****
*/
void processInput(int inputData) {
! int command, channel;
! // a few commands have byte(s) of data following the command
! if( (waitForData > 0) && (inputData < 128) ) {
! waitForData--;
! storedInputData[waitForData] = inputData;
! if( (waitForData==0) && executeMultiByteCommand ) {
! //we got everything
! switch(executeMultiByteCommand) {
! case ANALOG_MESSAGE:
! channel = inputData & 0x0F; // get channel from command byte
! break;
! case DIGITAL_MESSAGE:
! outputDigitalBytes(storedInputData[1], storedInputData[0]);
! break;
! case SET_DIGITAL_PIN_MODE:
! setPinMode(storedInputData[1], storedInputData[0]);
! break;
! case REPORT_ANALOG_PIN:
! break;
! case REPORT_DIGITAL_PORTS:
! break;
! }
! executeMultiByteCommand = 0;
! }
! } else {
! // remove channel info from command byte if less than 0xF0
! 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:
! // this doesn't do anything yet
! break;
! case REPORT_VERSION:
! Serial.print(REPORT_VERSION, BYTE);
! Serial.print(MAJOR_VERSION, BYTE);
! Serial.print(MINOR_VERSION, BYTE);
! break;
! }
! }
}
--- 238,295 ----
*/
void processInput(int inputData) {
! int command, channel;
! // a few commands have byte(s) of data following the command
! if( (waitForData > 0) && (inputData < 128) ) {
! waitForData--;
! storedInputData[waitForData] = inputData;
! if( (waitForData==0) && executeMultiByteCommand ) {
! //we got everything
! switch(executeMultiByteCommand) {
! case ANALOG_MESSAGE:
! channel = inputData & 0x0F; // get channel from command byte
! break;
! case DIGITAL_MESSAGE:
! outputDigitalBytes(storedInputData[1], storedInputData[0]);
! break;
! case SET_DIGITAL_PIN_MODE:
! setPinMode(storedInputData[1], storedInputData[0]);
! break;
! case REPORT_ANALOG_PIN:
! break;
! case REPORT_DIGITAL_PORTS:
! break;
! }
! executeMultiByteCommand = 0;
! }
! } else {
! // remove channel info from command byte if less than 0xF0
! 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:
! // this doesn't do anything yet
! break;
! case REPORT_VERSION:
! Serial.print(REPORT_VERSION, BYTE);
! Serial.print(MINOR_VERSION, BYTE);
! Serial.print(MAJOR_VERSION, BYTE);
! break;
! }
! }
}
***************
*** 301,306 ****
*/
void checkForInput() {
! if(Serial.available())
! processInput( Serial.read() );
}
--- 305,310 ----
*/
void checkForInput() {
! if(Serial.available())
! processInput( Serial.read() );
}
***************
*** 310,329 ****
*/
void setPinMode(byte pin, byte 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 ) {
! digitalPinStatus = digitalPinStatus | (1 << pin);
! pwmStatus = pwmStatus | (1 << pin);
! pinMode(pin,OUTPUT);
! }
! // TODO: save status to EEPROM here, if changed
}
--- 314,333 ----
*/
void setPinMode(byte pin, byte 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 ) {
! digitalPinStatus = digitalPinStatus | (1 << pin);
! pwmStatus = pwmStatus | (1 << pin);
! pinMode(pin,OUTPUT);
! }
! // TODO: save status to EEPROM here, if changed
}
***************
*** 332,342 ****
// used for flashing the pin for the version number
void pin13strobe(int count, int onInterval, int offInterval) {
! byte i;
! for(i=0; i<count; i++) {
! digitalWrite(13,1);
! delay(onInterval);
! digitalWrite(13,0);
! delay(offInterval);
! }
}
--- 336,346 ----
// used for flashing the pin for the version number
void pin13strobe(int count, int onInterval, int offInterval) {
! byte i;
! for(i=0; i<count; i++) {
! digitalWrite(13,1);
! delay(onInterval);
! digitalWrite(13,0);
! delay(offInterval);
! }
}
***************
*** 345,372 ****
*==========================================================================*/
void setup() {
! byte i;
! // TODO: load state from EEPROM here
! Serial.begin(115200); // 9600, 14400, 38400, 57600, 115200
! /* 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);
! 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);
! for(i=0; i<TOTAL_DIGITAL_PINS; ++i) {
! setPinMode(i,OUTPUT);
! }
}
--- 349,376 ----
*==========================================================================*/
void setup() {
! byte i;
! // TODO: load state from EEPROM here
! Serial.begin(115200); // 9600, 14400, 38400, 57600, 115200
! /* 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);
! 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);
! for(i=0; i<TOTAL_DIGITAL_PINS; ++i) {
! setPinMode(i,OUTPUT);
! }
}
***************
*** 375,379 ****
*==========================================================================*/
void loop() {
!
! checkForInput();
}
--- 379,399 ----
*==========================================================================*/
void loop() {
! int i; // counter for analog pins
! int analogData;
!
! checkForInput();
! /* get analog in, for the number enabled */
! for(i=0; i<TOTAL_ANALOG_PINS; ++i) {
! checkForInput();
! //if( analogPinsToReport & (1 << i) ) {
! analogData = analogRead(i);
! /* 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 */
! checkForInput();
! Serial.print(ANALOG_MESSAGE + i, BYTE);
! Serial.print(analogData % 128, BYTE); // mod by 32 for the small byte
! Serial.print(analogData >> 7, BYTE); // shift high bits into output byte
! //}
! checkForInput();
! }
}