From e9eda8f74c4775ef160bbe90325b8be7def91b7d Mon Sep 17 00:00:00 2001 From: bnewbold Date: Wed, 21 Apr 2010 01:36:53 -0400 Subject: mostly complete new interactive hardware testing program --- examples/test-session.cpp | 437 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 437 insertions(+) create mode 100644 examples/test-session.cpp diff --git a/examples/test-session.cpp b/examples/test-session.cpp new file mode 100644 index 0000000..0fa7d52 --- /dev/null +++ b/examples/test-session.cpp @@ -0,0 +1,437 @@ +/* ***************************************************************************** + * 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. + * ****************************************************************************/ + +/** + * @file example_main.cpp + * + * @brief Sample main.cpp file. Blinks an LED, sends a message out USART2 + * and turns on PWM on pin 2 + */ + +#include "wiring.h" +#include "HardwareSerial.h" +#include "HardwareUsb.h" +#include +#include "usb.h" + +#define LED_PIN 13 +#define PWM_PIN 2 + +HardwareUsb Usb; + +uint8 input = 0; +uint8 tiddle = 0; +int toggle = 0; +int rate = 0; +int sample = 0; + +// read off maple board rev3 +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 // 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 USART2 */ + //Serial2.begin(115200); + Serial2.begin(9600); + Serial2.println(""); + Serial2.println("Maple interactive test program (type '?' for help)"); + Serial2.println("------------------------------------------------------------"); + Serial2.print("> "); + /* Turn on PWM on pin PWM_PIN */ + //pinMode(PWM_PIN, PWM); + //pwmWrite(PWM_PIN, 0x8000); + + /* 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); + + //Serial2.flush(); + 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: // '?' + print_help(); + break; + 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 46: // '.' + while(!Serial2.available()) { + Serial2.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 pins + for(int i = 2; i 65500) rate = 0; + for(int i = 2; i= 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("\te: do everything all at once 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("Unimplemented:"); + 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("\ts: output a sweeping SERVO PWM on all PWM channels"); + Serial2.println("\ti: print out a bunch of info about system state"); + Serial2.println("\tI: print out status of all pins"); + // uint32 digitalRead(uint8 pin) +} + +void do_noise(uint8 pin) { // TODO + uint16 data[64]; + 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<64; i++) { + data[i] = analogRead(pin); + delta = data[i] - mean; + mean = mean + delta/(i+1); + M2 = M2 + delta*(data[i] - mean); + } + + Serial2.print("pin: "); Serial2.print(pin,DEC); + Serial2.print("\tn: "); Serial2.print(64,DEC); + Serial2.print("\tmean: "); Serial2.print(mean); + Serial2.print("\tvar: "); Serial2.println(M2/63.0); + //sqrt is broken? + //stddev = M2/(63.0); + //stddev = sqrt(stddev); + pinMode(pin, OUTPUT); +} + +void do_everything(void) { // TODO + // print to usart + // print to usb + // toggle gpios + // enable pwm + do_noise(15); + Serial2.println("(unimplemented)"); +} + +void do_fast_gpio(void) { + // pin 4 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); + + // this way incurs an extra function call + //digitalWrite(4, 1); digitalWrite(4, 0); +} + +int main(void) { + init(); + setup(); + + while (1) { + loop(); + } + return 0; +} + +/* Required for C++ hackery */ +/* TODO: This really shouldn't go here... move it later + * */ +extern "C" void __cxa_pure_virtual(void) { + while(1) + ; +} -- cgit v1.2.3