aboutsummaryrefslogtreecommitdiffstats
path: root/examples
diff options
context:
space:
mode:
Diffstat (limited to 'examples')
-rw-r--r--examples/test-session.cpp1047
1 files changed, 524 insertions, 523 deletions
diff --git a/examples/test-session.cpp b/examples/test-session.cpp
index 78b1d31..49aabef 100644
--- a/examples/test-session.cpp
+++ b/examples/test-session.cpp
@@ -1,523 +1,524 @@
-/* *****************************************************************************
- * The MIT License
- *
- * Copyright (c) 2010 LeafLabs LLC.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- * ****************************************************************************/
-
-#include "wirish.h"
-
-#define LED_PIN 13
-#define PWM_PIN 2
-
-uint8 input = 0;
-uint8 tiddle = 0;
-int toggle = 0;
-int rate = 0;
-int sample = 0;
-
-// read these off maple board rev3
-const uint8 pwm_pins[] = {0,1,2,3,5,6,7,8,9,11,12,14,24,25,27,28};
-// note that 38 is just a button and 39+ aren't functional as of 04/22/2010
-const uint8 adc_pins[] = {0,1,2,10,11,12,13,15,16,17,18,19,20,27,28};
-#define NUM_GPIO 44 // 43 is the MAX
-uint8 gpio_state[NUM_GPIO];
-
-#define DUMMY_DAT "qwertyuiopasdfghjklzxcvbnmmmmmm,./1234567890-=qwertyuiopasdfghjklzxcvbnm,./1234567890"
-
-void print_help(void);
-void do_noise(uint8 pin);
-void do_everything(void);
-void do_fast_gpio(void);
-
-void setup() {
- /* Set up the LED to blink */
- pinMode(LED_PIN, OUTPUT);
-
- /* Send a message out over USART2 */
- //Serial2.begin(115200); // 9600 is more compatible
- Serial2.begin(9600);
- Serial2.println("");
- Serial2.println(" __ __ _ _");
- Serial2.println(" | \\/ | __ _ _ __ | | ___| |");
- Serial2.println(" | |\\/| |/ _` | '_ \\| |/ _ \\ |");
- Serial2.println(" | | | | (_| | |_) | | __/_|");
- Serial2.println(" |_| |_|\\__,_| .__/|_|\\___(_)");
- Serial2.println(" |_|");
- Serial2.println(" by leaflabs");
- Serial2.println("");
- Serial2.println("");
- Serial2.println("Maple interactive test program (type '?' for help)");
- Serial2.println("------------------------------------------------------------");
- Serial2.print("> ");
-
- /* Send a message out the USB virtual com port */
- // TODO: this should all be over usb as well
- //Usb.println("Maple test program starting; use serial port for interactivity");
-}
-
-void loop() {
- toggle ^= 1;
- digitalWrite(LED_PIN, toggle);
- delay(100);
-
- while(Serial2.available()) {
- input = Serial2.read();
- Serial2.println(input);
- switch(input) {
- case 13: // Carriage Return
- break;
- case 32: // ' '
- Serial2.println("spacebar, nice!");
- break;
- case 63: // '?'
- case 104: // 'h'
- print_help();
- break;
- case 117: // 'u'
- Usb.println("Hello World!");
- break;
- case 119: // 'w'
- Serial1.println("Hello World!");
- Serial2.println("Hello World!");
- Serial3.println("Hello World!");
- break;
- case 109: // 'm'
- Serial2.println("Testing 57600 baud on USART1 and USART3. Press enter.");
- Serial1.begin(57600);
- Serial3.begin(57600);
- while(!Serial2.available()) {
- Serial1.println(DUMMY_DAT);
- Serial3.println(DUMMY_DAT);
- if(Serial1.available()) {
- Serial1.println(Serial1.read());
- delay(1000);
- }
- if(Serial3.available()) {
- Serial3.println(Serial3.read());
- delay(1000);
- }
- }
- Serial2.read();
- Serial2.println("Testing 115200 baud on USART1 and USART3. Press enter.");
- Serial1.begin(115200);
- Serial3.begin(115200);
- while(!Serial2.available()) {
- Serial1.println(DUMMY_DAT);
- Serial3.println(DUMMY_DAT);
- if(Serial1.available()) {
- Serial1.println(Serial1.read());
- delay(1000);
- }
- if(Serial3.available()) {
- Serial3.println(Serial3.read());
- delay(1000);
- }
- }
- Serial2.read();
- Serial2.println("Testing 9600 baud on USART1 and USART3. Press enter.");
- Serial1.begin(9600);
- Serial3.begin(9600);
- while(!Serial2.available()) {
- Serial1.println(DUMMY_DAT);
- Serial3.println(DUMMY_DAT);
- if(Serial1.available()) {
- Serial1.println(Serial1.read());
- delay(1000);
- }
- if(Serial3.available()) {
- Serial3.println(Serial3.read());
- delay(1000);
- }
- }
- Serial2.read();
- Serial2.println("Resetting USART1 and USART3...");
- Serial1.begin(9600);
- Serial3.begin(9600);
- break;
- case 46: // '.'
- while(!Serial2.available()) {
- Serial2.print(".");
- Usb.print(".");
- }
- //Serial2.flush();
- break;
- case 110: // 'n'
- Serial2.println("Taking ADC noise stats...");
- // turn off LED
- digitalWrite(LED_PIN, 0);
- // make sure to skip the TX/RX headers
- for(uint32 i = 2; i<sizeof(adc_pins); i++) {
- delay(5);
- do_noise(adc_pins[i]);
- }
- break;
- case 78: // 'N'
- Serial2.println("Taking ADC noise stats under duress...");
- // turn off LED
- digitalWrite(LED_PIN, 0);
- // make sure to skip the TX/RX headers
- for(uint32 i = 2; i<sizeof(adc_pins); i++) {
- // spool up PWM
- for(uint32 j = 2; j<(uint32)sizeof(pwm_pins); j++) {
- if(adc_pins[i] != pwm_pins[j]) {
- pinMode(pwm_pins[j],PWM);
- pwmWrite(pwm_pins[j], 1000 + i);
- }
- }
- Usb.print(DUMMY_DAT);
- Usb.print(DUMMY_DAT);
- do_noise(adc_pins[i]);
- for(uint32 j = 2; j<(uint32)sizeof(pwm_pins); j++) {
- if(adc_pins[i] != pwm_pins[j]) {
- pinMode(pwm_pins[j],OUTPUT);
- digitalWrite(pwm_pins[j],0);
- }
- }
- }
- break;
- case 101: // 'e'
- do_everything();
- break;
- case 87: // 'W'
- while(!Serial2.available()) {
- Serial1.print(DUMMY_DAT);
- Serial2.print(DUMMY_DAT);
- Serial3.print(DUMMY_DAT);
- }
- break;
- case 85: // 'U'
- Serial2.println("Dumping data to USB. Press enter.");
- while(!Serial2.available()) {
- Usb.print(DUMMY_DAT);
- }
- break;
- case 103: // 'g'
- Serial2.print("Sequentially testing GPIO write on all possible headers except D0 and D1.");
- Serial2.println("Anything for next, ESC to stop.");
- // turn off LED
- digitalWrite(LED_PIN, 0);
- // make sure to skip the TX/RX headers
- for(uint32 i = 2; i<NUM_GPIO; i++) {
- Serial2.print("GPIO write out on header D");
- Serial2.print(i, DEC);
- Serial2.println("...");
- pinMode(i, OUTPUT);
- digitalWrite(i, tiddle);
- while(!Serial2.available()) {
- tiddle ^= 1;
- digitalWrite(i, tiddle);
- }
- digitalWrite(i, 0);
- if((uint8)Serial2.read() == (uint8)27) break; // ESC
- }
- break;
- case 71: // 'G'
- Serial2.println("Flipping all GPIOs at the same time. Press enter.");
- // turn off LED
- digitalWrite(LED_PIN, 0);
- // make sure to skip the TX/RX headers
- for(uint32 i = 2; i<NUM_GPIO; i++) {
- pinMode(i, OUTPUT);
- }
- while(!Serial2.available()) {
- tiddle ^= 1;
- for(uint32 i = 2; i<NUM_GPIO; i++) {
- digitalWrite(i, tiddle);
- }
- }
- for(uint32 i = 2; i<NUM_GPIO; i++) {
- digitalWrite(i, 0);
- }
- if((uint8)Serial2.read() == (uint8)27) break; // ESC
- break;
- case 102: // 'f'
- Serial2.println("Wiggling GPIO header D4 as fast as possible in bursts. Press enter.");
- pinMode(4,OUTPUT);
- while(!Serial2.available()) {
- do_fast_gpio();
- delay(1);
- }
- break;
- case 112: // 'p'
- Serial2.println("Sequentially testing PWM on all possible headers except D0 and D1. ");
- Serial2.println("Anything for next, ESC to stop.");
- // turn off LED
- digitalWrite(LED_PIN, 0);
- // make sure to skip the TX/RX headers
- for(uint32 i = 2; i<sizeof(pwm_pins); i++) {
- Serial2.print("PWM out on header D");
- Serial2.print(pwm_pins[i], DEC);
- Serial2.println("...");
- pinMode(pwm_pins[i], PWM);
- pwmWrite(pwm_pins[i], 16000);
- while(!Serial2.available()) { delay(10); }
- pinMode(pwm_pins[i], OUTPUT);
- digitalWrite(pwm_pins[i], 0);
- if((uint8)Serial2.read() == (uint8)27) break; // ESC
- }
- break;
- case 80: // 'P'
- Serial2.println("Testing all PWM ports with a sweep. Press enter.");
- // turn off LED
- digitalWrite(LED_PIN, 0);
- // make sure to skip the TX/RX pins
- for(uint32 i = 2; i<sizeof(pwm_pins); i++) {
- pinMode(pwm_pins[i], PWM);
- pwmWrite(pwm_pins[i], 4000);
- }
- while(!Serial2.available()) {
- rate += 20;
- if(rate > 65500) rate = 0;
- for(uint32 i = 2; i<sizeof(pwm_pins); i++) {
- pwmWrite(pwm_pins[i], rate);
- }
- delay(1);
- }
- for(uint32 i = 2; i<sizeof(pwm_pins); i++) {
- pinMode(pwm_pins[i], OUTPUT);
- }
- break;
- case 95: // '_'
- Serial2.println("Delaying for 5 seconds...");
- delay(5000);
- break;
- case 116: // 't'
- break;
- case 84: // 'T'
- break;
- case 115: // 's'
- Serial2.println("Testing all PWM headers with a servo sweep. Press enter.");
- Serial2.println("");
- // turn off LED
- digitalWrite(LED_PIN, 0);
- timer_init(1, 21);
- timer_init(2, 21);
- timer_init(3, 21);
- timer_init(4, 21);
- // make sure to skip the TX/RX headers
- for(uint32 i = 2; i<sizeof(pwm_pins); i++) {
- pinMode(pwm_pins[i], PWM);
- pwmWrite(pwm_pins[i], 4000);
- }
- // 1.25ms = 4096counts = 0deg
- // 1.50ms = 4915counts = 90deg
- // 1.75ms = 5734counts = 180deg
- rate = 4096;
- while(!Serial2.available()) {
- rate += 20;
- if(rate > 5734) rate = 4096;
- for(uint32 i = 2; i<sizeof(pwm_pins); i++) {
- pwmWrite(pwm_pins[i], rate);
- }
- delay(20);
- }
- for(uint32 i = 2; i<sizeof(pwm_pins); i++) {
- pinMode(pwm_pins[i], OUTPUT);
- }
- timer_init(1, 1);
- timer_init(2, 1);
- timer_init(3, 1);
- timer_init(4, 1);
- Serial2.begin(9600);
- Serial2.println("(reset serial port)");
- break;
- case 100: // 'd'
- Serial2.println("Pulling down D4, D22");
- pinMode(22,INPUT_PULLDOWN);
- pinMode(4,INPUT_PULLDOWN);
- while(!Serial2.available()) {
- delay(1);
- }
- Serial2.read();
- Serial2.println("Pulling up D4, D22");
- pinMode(22,INPUT_PULLUP);
- pinMode(4,INPUT_PULLUP);
- while(!Serial2.available()) {
- delay(1);
- }
- Serial2.read();
- pinMode(4,OUTPUT);
- break;
- case 105: // 'i'
- break;
- case 73: // 'I'
- break;
- case 114: // 'r'
- Serial2.println("Monitoring GPIO read state changes. Press enter.");
- // turn off LED
- digitalWrite(LED_PIN, 0);
- // make sure to skip the TX/RX headers
- for(int i = 2; i<NUM_GPIO; i++) {
- pinMode(i, INPUT);
- gpio_state[i] = (uint8)digitalRead(i);
- }
- while(!Serial2.available()) {
- for(int i = 2; i<NUM_GPIO; i++) {
- tiddle = (uint8)digitalRead(i);
- if(tiddle != gpio_state[i]) {
- Serial2.print("State change on header D");
- Serial2.print(i,DEC);
- if(tiddle) Serial2.println(":\tHIGH");
- else Serial2.println(":\tLOW");
- gpio_state[i] = tiddle;
- }
- }
- }
- for(int i = 2; i<NUM_GPIO; i++) {
- pinMode(i, OUTPUT);
- }
- break;
- case 97: // 'a'
- Serial2.print("Sequentially reading each ADC port.");
- Serial2.println("Anything for next, ESC to stop.");
- // turn off LED
- digitalWrite(LED_PIN, 0);
- // make sure to skip the TX/RX headers
- for(uint32 i = 2; i<sizeof(adc_pins); i++) {
- Serial2.print("Reading on header D");
- Serial2.print(adc_pins[i], DEC);
- Serial2.println("...");
- pinMode(adc_pins[i], INPUT_ANALOG);
- while(!Serial2.available()) {
- sample = analogRead(adc_pins[i]);
- Serial2.print(adc_pins[i],DEC);
- Serial2.print("\t");
- Serial2.print(sample,DEC);
- Serial2.print("\t");
- Serial2.print("|");
- for(int j = 0; j<4096; j+= 100) {
- if(sample >= j) Serial2.print("#");
- else Serial2.print(" ");
- }
- Serial2.print("| ");
- for(int j = 0; j<12; j++) {
- if(sample & (1 << (11-j))) Serial2.print("1");
- else Serial2.print("0");
- }
- Serial2.println("");
- }
- pinMode(adc_pins[i], OUTPUT);
- digitalWrite(adc_pins[i], 0);
- if((uint8)Serial2.read() == (uint8)27) break; // ESC
- }
- break;
- default:
- Serial2.print("Unexpected: ");
- Serial2.println(input);
- }
- Serial2.print("> ");
- }
-}
-
-void print_help(void) {
- Serial2.println("");
- //Serial2.println("Command Listing\t(# means any digit)");
- Serial2.println("Command Listing");
- Serial2.println("\t?: print this menu");
- Serial2.println("\th: print this menu");
- Serial2.println("\tw: print Hello World on all 3 USARTS");
- Serial2.println("\tn: measure noise and do statistics");
- Serial2.println("\tN: measure noise and do statistics with background stuff");
- Serial2.println("\ta: show realtime ADC info");
- Serial2.println("\t.: echo '.' until new input");
- Serial2.println("\tu: print Hello World on USB");
- Serial2.println("\t_: try to do as little as possible for a couple seconds (delay)");
- Serial2.println("\tp: test all PWM channels sequentially");
- Serial2.println("\tW: dump data as fast as possible on all 3 USARTS");
- Serial2.println("\tU: dump data as fast as possible on USB");
- Serial2.println("\tg: toggle all GPIOs sequentialy");
- Serial2.println("\tG: toggle all GPIOs at the same time");
- Serial2.println("\tf: toggle GPIO D4 as fast as possible in bursts");
- Serial2.println("\tP: test all PWM channels at the same time with different speeds/sweeps");
- Serial2.println("\tr: read in GPIO status changes and print them in realtime");
- Serial2.println("\ts: output a sweeping SERVO PWM on all PWM channels");
- Serial2.println("\tm: output serial data dumps on USART1 and USART3 with various rates");
-
- Serial2.println("Unimplemented:");
- Serial2.println("\te: do everything all at once until new input");
- Serial2.println("\tt: output a 1khz squarewave on all GPIOs as well as possible");
- Serial2.println("\tT: output a 1hz squarewave on all GPIOs as well as possible");
- Serial2.println("\ti: print out a bunch of info about system state");
- Serial2.println("\tI: print out status of all headers");
-}
-
-void do_noise(uint8 pin) { // TODO
- uint16 data[100];
- float mean = 0;
- //float stddev = 0;
- float delta = 0;
- float M2 = 0;
- pinMode(pin, INPUT_ANALOG);
-
- // variance algorithm from knuth; see wikipedia
- // checked against python
- for(int i = 0; i<100; i++) {
- data[i] = analogRead(pin);
- delta = data[i] - mean;
- mean = mean + delta/(i+1);
- M2 = M2 + delta*(data[i] - mean);
- }
-
- //sqrt is broken?
- //stddev = sqrt(variance);
- Serial2.print("header: D"); Serial2.print(pin,DEC);
- Serial2.print("\tn: "); Serial2.print(100,DEC);
- Serial2.print("\tmean: "); Serial2.print(mean);
- Serial2.print("\tvar: "); Serial2.println(M2/99.0);
- pinMode(pin, OUTPUT);
-}
-
-void do_everything(void) { // TODO
- // TODO
- // print to usart
- // print to usb
- // toggle gpios
- // enable pwm
- Serial2.println("(unimplemented)");
-}
-
-void do_fast_gpio(void) {
- // header D4 is on port B and is pin 5 on the uC
- gpio_write_bit(GPIOB_BASE, 5, 1); gpio_write_bit(GPIOB_BASE, 5, 0);
- gpio_write_bit(GPIOB_BASE, 5, 1); gpio_write_bit(GPIOB_BASE, 5, 0);
- gpio_write_bit(GPIOB_BASE, 5, 1); gpio_write_bit(GPIOB_BASE, 5, 0);
- gpio_write_bit(GPIOB_BASE, 5, 1); gpio_write_bit(GPIOB_BASE, 5, 0);
- gpio_write_bit(GPIOB_BASE, 5, 1); gpio_write_bit(GPIOB_BASE, 5, 0);
- gpio_write_bit(GPIOB_BASE, 5, 1); gpio_write_bit(GPIOB_BASE, 5, 0);
- gpio_write_bit(GPIOB_BASE, 5, 1); gpio_write_bit(GPIOB_BASE, 5, 0);
- gpio_write_bit(GPIOB_BASE, 5, 1); gpio_write_bit(GPIOB_BASE, 5, 0);
- gpio_write_bit(GPIOB_BASE, 5, 1); gpio_write_bit(GPIOB_BASE, 5, 0);
- gpio_write_bit(GPIOB_BASE, 5, 1); gpio_write_bit(GPIOB_BASE, 5, 0);
- gpio_write_bit(GPIOB_BASE, 5, 1); gpio_write_bit(GPIOB_BASE, 5, 0);
- gpio_write_bit(GPIOB_BASE, 5, 1); gpio_write_bit(GPIOB_BASE, 5, 0);
- gpio_write_bit(GPIOB_BASE, 5, 1); gpio_write_bit(GPIOB_BASE, 5, 0);
-}
-
-int main(void) {
- init();
- setup();
-
- while (1) {
- loop();
- }
- return 0;
-}
-
+/* *****************************************************************************
+ * The MIT License
+ *
+ * Copyright (c) 2010 LeafLabs LLC.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ * ****************************************************************************/
+
+#include "wirish.h"
+
+#define LED_PIN 13
+#define PWM_PIN 2
+
+// choose your weapon
+#define COMM SerialUSB
+//#define COMM Serial2
+
+uint8 input = 0;
+uint8 tiddle = 0;
+int toggle = 0;
+int rate = 0;
+int sample = 0;
+
+// read these off maple board rev3
+// note that 38 is just a button and 39+ aren't functional as of 04/22/2010
+const uint8 pwm_pins[] = {0,1,2,3,5,6,7,8,9,11,12,14,24,25,27,28};
+const uint8 adc_pins[] = {0,1,2,10,11,12,13,15,16,17,18,19,20,27,28};
+#define NUM_GPIO 44 // 44 is the MAX
+uint8 gpio_state[NUM_GPIO];
+
+#define DUMMY_DAT "qwertyuiopasdfghjklzxcvbnmmmmmm,./1234567890-=qwertyuiopasdfghjklzxcvbnm,./1234567890"
+
+void print_help(void);
+void do_noise(uint8 pin);
+void do_everything(void);
+void do_fast_gpio(void);
+
+void setup() {
+ /* Set up the LED to blink */
+ pinMode(LED_PIN, OUTPUT);
+
+ /* Send a message out over COMM interface */
+ //COMM.begin(115200); // if USART; 9600 is more compatible
+ COMM.println("");
+ COMM.println(" __ __ _ _");
+ COMM.println(" | \\/ | __ _ _ __ | | ___| |");
+ COMM.println(" | |\\/| |/ _` | '_ \\| |/ _ \\ |");
+ COMM.println(" | | | | (_| | |_) | | __/_|");
+ COMM.println(" |_| |_|\\__,_| .__/|_|\\___(_)");
+ COMM.println(" |_|");
+ COMM.println(" by leaflabs");
+ COMM.println("");
+ COMM.println("");
+ COMM.println("Maple interactive test program (type '?' for help)");
+ COMM.println("------------------------------------------------------------");
+ COMM.print("> ");
+
+}
+
+void loop() {
+ toggle ^= 1;
+ digitalWrite(LED_PIN, toggle);
+ delay(100);
+
+ while(COMM.available()) {
+ input = COMM.read();
+ COMM.println(input);
+ switch(input) {
+ case 13: // Carriage Return
+ break;
+ case 32: // ' '
+ COMM.println("spacebar, nice!");
+ break;
+ case 63: // '?'
+ case 104: // 'h'
+ print_help();
+ break;
+ case 117: // 'u'
+ Usb.println("Hello World!");
+ break;
+ case 119: // 'w'
+ Serial1.println("Hello World!");
+ Serial2.println("Hello World!");
+ Serial3.println("Hello World!");
+ break;
+ case 109: // 'm'
+ COMM.println("Testing 57600 baud on USART1 and USART3. Press enter.");
+ Serial1.begin(57600);
+ Serial3.begin(57600);
+ while(!COMM.available()) {
+ Serial1.println(DUMMY_DAT);
+ Serial3.println(DUMMY_DAT);
+ if(Serial1.available()) {
+ Serial1.println(Serial1.read());
+ delay(1000);
+ }
+ if(Serial3.available()) {
+ Serial3.println(Serial3.read());
+ delay(1000);
+ }
+ }
+ COMM.read();
+ COMM.println("Testing 115200 baud on USART1 and USART3. Press enter.");
+ Serial1.begin(115200);
+ Serial3.begin(115200);
+ while(!COMM.available()) {
+ Serial1.println(DUMMY_DAT);
+ Serial3.println(DUMMY_DAT);
+ if(Serial1.available()) {
+ Serial1.println(Serial1.read());
+ delay(1000);
+ }
+ if(Serial3.available()) {
+ Serial3.println(Serial3.read());
+ delay(1000);
+ }
+ }
+ COMM.read();
+ COMM.println("Testing 9600 baud on USART1 and USART3. Press enter.");
+ Serial1.begin(9600);
+ Serial3.begin(9600);
+ while(!COMM.available()) {
+ Serial1.println(DUMMY_DAT);
+ Serial3.println(DUMMY_DAT);
+ if(Serial1.available()) {
+ Serial1.println(Serial1.read());
+ delay(1000);
+ }
+ if(Serial3.available()) {
+ Serial3.println(Serial3.read());
+ delay(1000);
+ }
+ }
+ COMM.read();
+ COMM.println("Resetting USART1 and USART3...");
+ Serial1.begin(9600);
+ Serial3.begin(9600);
+ break;
+ case 46: // '.'
+ while(!COMM.available()) {
+ Serial1.print(".");
+ Serial2.print(".");
+ Serial3.print(".");
+ Usb.print(".");
+ }
+ break;
+ case 110: // 'n'
+ COMM.println("Taking ADC noise stats...");
+ // turn off LED
+ digitalWrite(LED_PIN, 0);
+ // make sure to skip the TX/RX headers
+ for(uint32 i = 2; i<sizeof(adc_pins); i++) {
+ delay(5);
+ do_noise(adc_pins[i]);
+ }
+ break;
+ case 78: // 'N'
+ COMM.println("Taking ADC noise stats under duress...");
+ // turn off LED
+ digitalWrite(LED_PIN, 0);
+ // make sure to skip the TX/RX headers
+ for(uint32 i = 2; i<sizeof(adc_pins); i++) {
+ // spool up PWM
+ for(uint32 j = 2; j<(uint32)sizeof(pwm_pins); j++) {
+ if(adc_pins[i] != pwm_pins[j]) {
+ pinMode(pwm_pins[j],PWM);
+ pwmWrite(pwm_pins[j], 1000 + i);
+ }
+ }
+ Usb.print(DUMMY_DAT);
+ Usb.print(DUMMY_DAT);
+ do_noise(adc_pins[i]);
+ for(uint32 j = 2; j<(uint32)sizeof(pwm_pins); j++) {
+ if(adc_pins[i] != pwm_pins[j]) {
+ pinMode(pwm_pins[j],OUTPUT);
+ digitalWrite(pwm_pins[j],0);
+ }
+ }
+ }
+ break;
+ case 101: // 'e'
+ do_everything();
+ break;
+ case 87: // 'W'
+ while(!COMM.available()) {
+ Serial1.print(DUMMY_DAT);
+ Serial2.print(DUMMY_DAT);
+ Serial3.print(DUMMY_DAT);
+ }
+ break;
+ case 85: // 'U'
+ COMM.println("Dumping data to USB. Press enter.");
+ while(!COMM.available()) {
+ Usb.print(DUMMY_DAT);
+ }
+ break;
+ case 103: // 'g'
+ COMM.print("Sequentially testing GPIO write on all possible headers except D0 and D1.");
+ COMM.println("Anything for next, ESC to stop.");
+ // turn off LED
+ digitalWrite(LED_PIN, 0);
+ // make sure to skip the TX/RX headers
+ for(uint32 i = 2; i<NUM_GPIO; i++) {
+ COMM.print("GPIO write out on header D");
+ COMM.print(i, DEC);
+ COMM.println("...");
+ pinMode(i, OUTPUT);
+ digitalWrite(i, tiddle);
+ while(!COMM.available()) {
+ tiddle ^= 1;
+ digitalWrite(i, tiddle);
+ }
+ digitalWrite(i, 0);
+ if((uint8)COMM.read() == (uint8)27) break; // ESC
+ }
+ break;
+ case 71: // 'G'
+ COMM.println("Flipping all GPIOs at the same time. Press enter.");
+ // turn off LED
+ digitalWrite(LED_PIN, 0);
+ // make sure to skip the TX/RX headers
+ for(uint32 i = 2; i<NUM_GPIO; i++) {
+ pinMode(i, OUTPUT);
+ }
+ while(!COMM.available()) {
+ tiddle ^= 1;
+ for(uint32 i = 2; i<NUM_GPIO; i++) {
+ digitalWrite(i, tiddle);
+ }
+ }
+ for(uint32 i = 2; i<NUM_GPIO; i++) {
+ digitalWrite(i, 0);
+ }
+ if((uint8)COMM.read() == (uint8)27) break; // ESC
+ break;
+ case 102: // 'f'
+ COMM.println("Wiggling GPIO header D4 as fast as possible in bursts. Press enter.");
+ pinMode(4,OUTPUT);
+ while(!COMM.available()) {
+ do_fast_gpio();
+ delay(1);
+ }
+ break;
+ case 112: // 'p'
+ COMM.println("Sequentially testing PWM on all possible headers except D0 and D1. ");
+ COMM.println("Anything for next, ESC to stop.");
+ // turn off LED
+ digitalWrite(LED_PIN, 0);
+ // make sure to skip the TX/RX headers
+ for(uint32 i = 2; i<sizeof(pwm_pins); i++) {
+ COMM.print("PWM out on header D");
+ COMM.print(pwm_pins[i], DEC);
+ COMM.println("...");
+ pinMode(pwm_pins[i], PWM);
+ pwmWrite(pwm_pins[i], 16000);
+ while(!COMM.available()) { delay(10); }
+ pinMode(pwm_pins[i], OUTPUT);
+ digitalWrite(pwm_pins[i], 0);
+ if((uint8)COMM.read() == (uint8)27) break; // ESC
+ }
+ break;
+ case 80: // 'P'
+ COMM.println("Testing all PWM ports with a sweep. Press enter.");
+ // turn off LED
+ digitalWrite(LED_PIN, 0);
+ // make sure to skip the TX/RX pins
+ for(uint32 i = 2; i<sizeof(pwm_pins); i++) {
+ pinMode(pwm_pins[i], PWM);
+ pwmWrite(pwm_pins[i], 4000);
+ }
+ while(!COMM.available()) {
+ rate += 20;
+ if(rate > 65500) rate = 0;
+ for(uint32 i = 2; i<sizeof(pwm_pins); i++) {
+ pwmWrite(pwm_pins[i], rate);
+ }
+ delay(1);
+ }
+ for(uint32 i = 2; i<sizeof(pwm_pins); i++) {
+ pinMode(pwm_pins[i], OUTPUT);
+ }
+ break;
+ case 95: // '_'
+ COMM.println("Delaying for 5 seconds...");
+ delay(5000);
+ break;
+ case 116: // 't'
+ break;
+ case 84: // 'T'
+ break;
+ case 115: // 's'
+ COMM.println("Testing all PWM headers with a servo sweep. Press enter.");
+ COMM.println("");
+ // turn off LED
+ digitalWrite(LED_PIN, 0);
+ timer_init(1, 21);
+ timer_init(2, 21);
+ timer_init(3, 21);
+ timer_init(4, 21);
+ // make sure to skip the TX/RX headers
+ for(uint32 i = 2; i<sizeof(pwm_pins); i++) {
+ pinMode(pwm_pins[i], PWM);
+ pwmWrite(pwm_pins[i], 4000);
+ }
+ // 1.25ms = 4096counts = 0deg
+ // 1.50ms = 4915counts = 90deg
+ // 1.75ms = 5734counts = 180deg
+ rate = 4096;
+ while(!COMM.available()) {
+ rate += 20;
+ if(rate > 5734) rate = 4096;
+ for(uint32 i = 2; i<sizeof(pwm_pins); i++) {
+ pwmWrite(pwm_pins[i], rate);
+ }
+ delay(20);
+ }
+ for(uint32 i = 2; i<sizeof(pwm_pins); i++) {
+ pinMode(pwm_pins[i], OUTPUT);
+ }
+ timer_init(1, 1);
+ timer_init(2, 1);
+ timer_init(3, 1);
+ timer_init(4, 1);
+ Serial2.begin(9600);
+ COMM.println("(reset serial port)");
+ break;
+ case 100: // 'd'
+ COMM.println("Pulling down D4, D22");
+ pinMode(22,INPUT_PULLDOWN);
+ pinMode(4,INPUT_PULLDOWN);
+ while(!COMM.available()) {
+ delay(1);
+ }
+ COMM.read();
+ COMM.println("Pulling up D4, D22");
+ pinMode(22,INPUT_PULLUP);
+ pinMode(4,INPUT_PULLUP);
+ while(!COMM.available()) {
+ delay(1);
+ }
+ COMM.read();
+ pinMode(4,OUTPUT);
+ break;
+ case 105: // 'i'
+ break;
+ case 73: // 'I'
+ break;
+ case 114: // 'r'
+ COMM.println("Monitoring GPIO read state changes. Press enter.");
+ // turn off LED
+ digitalWrite(LED_PIN, 0);
+ // make sure to skip the TX/RX headers
+ for(int i = 2; i<NUM_GPIO; i++) {
+ pinMode(i, INPUT);
+ gpio_state[i] = (uint8)digitalRead(i);
+ }
+ while(!COMM.available()) {
+ for(int i = 2; i<NUM_GPIO; i++) {
+ tiddle = (uint8)digitalRead(i);
+ if(tiddle != gpio_state[i]) {
+ COMM.print("State change on header D");
+ COMM.print(i,DEC);
+ if(tiddle) COMM.println(":\tHIGH");
+ else COMM.println(":\tLOW");
+ gpio_state[i] = tiddle;
+ }
+ }
+ }
+ for(int i = 2; i<NUM_GPIO; i++) {
+ pinMode(i, OUTPUT);
+ }
+ break;
+ case 97: // 'a'
+ COMM.print("Sequentially reading each ADC port.");
+ COMM.println("Anything for next, ESC to stop.");
+ // turn off LED
+ digitalWrite(LED_PIN, 0);
+ // make sure to skip the TX/RX headers
+ for(uint32 i = 2; i<sizeof(adc_pins); i++) {
+ COMM.print("Reading on header D");
+ COMM.print(adc_pins[i], DEC);
+ COMM.println("...");
+ pinMode(adc_pins[i], INPUT_ANALOG);
+ while(!COMM.available()) {
+ sample = analogRead(adc_pins[i]);
+ COMM.print(adc_pins[i],DEC);
+ COMM.print("\t");
+ COMM.print(sample,DEC);
+ COMM.print("\t");
+ COMM.print("|");
+ for(int j = 0; j<4096; j+= 100) {
+ if(sample >= j) COMM.print("#");
+ else COMM.print(" ");
+ }
+ COMM.print("| ");
+ for(int j = 0; j<12; j++) {
+ if(sample & (1 << (11-j))) COMM.print("1");
+ else COMM.print("0");
+ }
+ COMM.println("");
+ }
+ pinMode(adc_pins[i], OUTPUT);
+ digitalWrite(adc_pins[i], 0);
+ if((uint8)COMM.read() == (uint8)27) break; // ESC
+ }
+ break;
+ default:
+ COMM.print("Unexpected: ");
+ COMM.println(input);
+ }
+ COMM.print("> ");
+ }
+}
+
+void print_help(void) {
+ COMM.println("");
+ //COMM.println("Command Listing\t(# means any digit)");
+ COMM.println("Command Listing");
+ COMM.println("\t?: print this menu");
+ COMM.println("\th: print this menu");
+ COMM.println("\tw: print Hello World on all 3 USARTS");
+ COMM.println("\tn: measure noise and do statistics");
+ COMM.println("\tN: measure noise and do statistics with background stuff");
+ COMM.println("\ta: show realtime ADC info");
+ COMM.println("\t.: echo '.' until new input");
+ COMM.println("\tu: print Hello World on USB");
+ COMM.println("\t_: try to do as little as possible for a couple seconds (delay)");
+ COMM.println("\tp: test all PWM channels sequentially");
+ COMM.println("\tW: dump data as fast as possible on all 3 USARTS");
+ COMM.println("\tU: dump data as fast as possible on USB");
+ COMM.println("\tg: toggle all GPIOs sequentialy");
+ COMM.println("\tG: toggle all GPIOs at the same time");
+ COMM.println("\tf: toggle GPIO D4 as fast as possible in bursts");
+ COMM.println("\tP: test all PWM channels at the same time with different speeds/sweeps");
+ COMM.println("\tr: read in GPIO status changes and print them in realtime");
+ COMM.println("\ts: output a sweeping SERVO PWM on all PWM channels");
+ COMM.println("\tm: output serial data dumps on USART1 and USART3 with various rates");
+
+ COMM.println("Unimplemented:");
+ COMM.println("\te: do everything all at once until new input");
+ COMM.println("\tt: output a 1khz squarewave on all GPIOs as well as possible");
+ COMM.println("\tT: output a 1hz squarewave on all GPIOs as well as possible");
+ COMM.println("\ti: print out a bunch of info about system state");
+ COMM.println("\tI: print out status of all headers");
+}
+
+void do_noise(uint8 pin) { // TODO
+ uint16 data[100];
+ float mean = 0;
+ //float stddev = 0;
+ float delta = 0;
+ float M2 = 0;
+ pinMode(pin, INPUT_ANALOG);
+
+ // variance algorithm from knuth; see wikipedia
+ // checked against python
+ for(int i = 0; i<100; i++) {
+ data[i] = analogRead(pin);
+ delta = data[i] - mean;
+ mean = mean + delta/(i+1);
+ M2 = M2 + delta*(data[i] - mean);
+ }
+
+ //sqrt is broken?
+ //stddev = sqrt(variance);
+ COMM.print("header: D"); COMM.print(pin,DEC);
+ COMM.print("\tn: "); COMM.print(100,DEC);
+ COMM.print("\tmean: "); COMM.print(mean);
+ COMM.print("\tvar: "); COMM.println(M2/99.0);
+ pinMode(pin, OUTPUT);
+}
+
+void do_everything(void) { // TODO
+ // TODO
+ // print to usart
+ // print to usb
+ // toggle gpios
+ // enable pwm
+ COMM.println("(unimplemented)");
+}
+
+void do_fast_gpio(void) {
+ // header D4 is on port B and is pin 5 on the uC
+ gpio_write_bit(GPIOB_BASE, 5, 1); gpio_write_bit(GPIOB_BASE, 5, 0);
+ gpio_write_bit(GPIOB_BASE, 5, 1); gpio_write_bit(GPIOB_BASE, 5, 0);
+ gpio_write_bit(GPIOB_BASE, 5, 1); gpio_write_bit(GPIOB_BASE, 5, 0);
+ gpio_write_bit(GPIOB_BASE, 5, 1); gpio_write_bit(GPIOB_BASE, 5, 0);
+ gpio_write_bit(GPIOB_BASE, 5, 1); gpio_write_bit(GPIOB_BASE, 5, 0);
+ gpio_write_bit(GPIOB_BASE, 5, 1); gpio_write_bit(GPIOB_BASE, 5, 0);
+ gpio_write_bit(GPIOB_BASE, 5, 1); gpio_write_bit(GPIOB_BASE, 5, 0);
+ gpio_write_bit(GPIOB_BASE, 5, 1); gpio_write_bit(GPIOB_BASE, 5, 0);
+ gpio_write_bit(GPIOB_BASE, 5, 1); gpio_write_bit(GPIOB_BASE, 5, 0);
+ gpio_write_bit(GPIOB_BASE, 5, 1); gpio_write_bit(GPIOB_BASE, 5, 0);
+ gpio_write_bit(GPIOB_BASE, 5, 1); gpio_write_bit(GPIOB_BASE, 5, 0);
+ gpio_write_bit(GPIOB_BASE, 5, 1); gpio_write_bit(GPIOB_BASE, 5, 0);
+ gpio_write_bit(GPIOB_BASE, 5, 1); gpio_write_bit(GPIOB_BASE, 5, 0);
+}
+
+int main(void) {
+ init();
+ setup();
+
+ while (1) {
+ loop();
+ }
+ return 0;
+}
+