aboutsummaryrefslogtreecommitdiff
path: root/Pd_firmware
diff options
context:
space:
mode:
Diffstat (limited to 'Pd_firmware')
-rw-r--r--Pd_firmware/Pd_firmware.pde153
1 files changed, 89 insertions, 64 deletions
diff --git a/Pd_firmware/Pd_firmware.pde b/Pd_firmware/Pd_firmware.pde
index d7e10bc..566abac 100644
--- a/Pd_firmware/Pd_firmware.pde
+++ b/Pd_firmware/Pd_firmware.pde
@@ -45,16 +45,17 @@
* TODO:
* TODO: add "pinMode all 0/1" command
* TODO: add cycle markers to mark start of analog, digital, pulseIn, and PWM
+ * TODO: convert to MIDI protocol using SysEx for longer messages
*/
-/* cvs version: $Id: Pd_firmware.pde,v 1.21 2006-10-31 00:39:07 eighthave Exp $ */
+/* cvs version: $Id: Pd_firmware.pde,v 1.22 2006-12-06 03:29:06 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
+#define MAJOR_VERSION 0 // for non-compatible changes
+#define MINOR_VERSION 3 // for backwards compatible changes
/* firmata protocol
* ===============
@@ -112,26 +113,25 @@
#define OUTPUT_TO_DIGITAL_PINS 229 // next two bytes set digital output data
/* 230-239 // UNASSIGNED */
#define REPORT_VERSION 240 // return the firmware version
-/* 240-249 // UNASSIGNED */
+/* 240-248 // UNASSIGNED */
+#define SET_PIN_STATE 249 // set a digital pit to INPUT or OUTPUT
#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
+#define RESET 254 // reset if receive 8 of these bytes
/* 255 // UNASSIGNED */
/* two byte digital output data format
* ----------------------
- * 0 get ready for digital input bytes (229)
+ * 0 set digital output bytes (229/OUTPUT_TO_DIGITAL_PINS)
* 1 digitalOut 7-13 bitmask
* 2 digitalOut 0-6 bitmask
*/
-/* two byte PWM data format
+/* control PWM
* ----------------------
- * 0 get ready for digital input bytes (ENABLE_SOFTWARE_PWM/ENABLE_PWM)
- * 1 pin #
+ * 0 send digital input bytes (ENABLE_PWM)
+ * 1 pin # (0-127)
* 2 duty cycle expressed as 1 byte (255 = 100%)
*/
@@ -149,6 +149,47 @@
* 2 low byte from analog input
*/
+/* version report format
+ * Send a single byte 240, Arduino will reply with:
+ * ----------------------
+ * 0 version report header (240)
+ * 1 major version (0-127)
+ * 2 minor version (0-127)
+ */
+
+/* PROPOSED PROTOCOL ADDITIONS */
+
+/* set digital pin state (249/SET_PIN_STATE)
+ * ----------------------
+ * 0 set digital pin state
+ * 1 pin number (0-127)
+ * 2 state (OUTPUT/INPUT, 0/1) */
+
+/* toggle analogIn reporting (249/SET_PIN_STATE)
+ * ----------------------
+ * 0 analogIn reporting mode
+ * 1 pin number (0-127)
+ * 2 state (0/1)
+ */
+
+/* control PWM 14-bit
+ * ----------------------
+ * 0 send digital input bytes (ENABLE_PWM)
+ * 1 pin # (0-127)
+ * 2 duty cycle, high bits (8-13)
+ * 3 duty cycle, low bits (0-7)
+ */
+
+
+/* pulseIn (uses 32-bit value)
+ * ----------------------
+ * 0 pulseIn
+ * 1 bits 24-31 (most significant byte)
+ * 2 bits 16-23
+ * 3 bits 8-15
+ * 4 bits 0-7 (least significant byte)
+ */
+
#define TOTAL_DIGITAL_PINS 14
// for comparing along with INPUT and OUTPUT
@@ -181,6 +222,7 @@ int digitalPinStatus = 0;
int pwmStatus = 0;
boolean digitalInputsEnabled = true;
+// TODO: convert this to a bit array int, 1=report, 0=no report
byte analogInputsEnabled = 6;
byte analogPin;
@@ -273,12 +315,6 @@ void processInput(byte inputData) {
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;
}
@@ -306,6 +342,40 @@ void processInput(byte inputData) {
}
else {
switch (inputData) {
+ case REPORT_VERSION:
+ Serial.print(REPORT_VERSION, BYTE);
+ Serial.print(MAJOR_VERSION, BYTE);
+ Serial.print(MINOR_VERSION, BYTE);
+ 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 OUTPUT_TO_DIGITAL_PINS: // bytes to send to digital outputs
+ firstInputByte = true;
+ 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 SET_PIN_ZERO_TO_IN: // set digital pins to INPUT
case SET_PIN_ONE_TO_IN:
case SET_PIN_TWO_TO_IN:
@@ -338,52 +408,6 @@ void processInput(byte inputData) {
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:
- Serial.print(REPORT_VERSION, BYTE);
- Serial.print(MAJOR_VERSION, BYTE);
- Serial.print(MINOR_VERSION, BYTE);
- break;
}
}
}
@@ -397,6 +421,8 @@ void setup() {
// TODO: load state from EEPROM here
+ Serial.begin(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. */
@@ -412,7 +438,6 @@ void setup() {
for(i=0; i<TOTAL_DIGITAL_PINS; ++i) {
setPinMode(i,INPUT);
}
- Serial.begin(115200);
}
// -------------------------------------------------------------------------