aboutsummaryrefslogtreecommitdiffstats
path: root/examples/test-session.cpp
diff options
context:
space:
mode:
authorbryan newbold <bnewbold@robocracy.org>2014-10-16 20:20:20 -0700
committerbryan newbold <bnewbold@robocracy.org>2014-10-16 20:20:20 -0700
commitdba5a9fe68ebb996eeee69fa9b573fe5a1561ce2 (patch)
tree6d9c249686b81b2b70da9b9a3dd1e246c221b4b3 /examples/test-session.cpp
parent160d861ba3fe50c30891d1abcb2c520be84aaa85 (diff)
downloadlibrambutan-dba5a9fe68ebb996eeee69fa9b573fe5a1561ce2.tar.gz
librambutan-dba5a9fe68ebb996eeee69fa9b573fe5a1561ce2.zip
refactor: move test-style examples to ./tests
Diffstat (limited to 'examples/test-session.cpp')
-rw-r--r--examples/test-session.cpp938
1 files changed, 0 insertions, 938 deletions
diff --git a/examples/test-session.cpp b/examples/test-session.cpp
deleted file mode 100644
index 284b4b0..0000000
--- a/examples/test-session.cpp
+++ /dev/null
@@ -1,938 +0,0 @@
-// Interactive Test Session for LeafLabs Maple
-// Copyright (c) 2010 LeafLabs LLC.
-//
-// Useful for testing Maple features and troubleshooting.
-// Communicates over SerialUSB.
-
-#include <string.h>
-
-#include <wirish/wirish.h>
-
-// ASCII escape character
-#define ESC ((uint8)27)
-
-// Default USART baud rate
-#define BAUD 9600
-
-// Number of times to sample a pin per ADC noise measurement
-#define N_ADC_NOISE_MEASUREMENTS 40
-
-uint8 gpio_state[BOARD_NR_GPIO_PINS];
-
-const char* dummy_data = ("123456789012345678901234567890\r\n"
- "123456789012345678901234567890\r\n");
-
-// Commands
-void cmd_print_help(void);
-void cmd_adc_stats(void);
-void cmd_stressful_adc_stats(void);
-void cmd_everything(void);
-void cmd_serial1_serial3(void);
-void cmd_serial1_echo(void);
-void cmd_gpio_monitoring(void);
-void cmd_sequential_adc_reads(void);
-void cmd_gpio_qa(void);
-void cmd_sequential_gpio_toggling(void);
-void cmd_gpio_toggling(void);
-void cmd_sequential_debug_gpio_toggling(void);
-void cmd_debug_gpio_toggling(void);
-void cmd_but_test(void);
-void cmd_sequential_pwm_test(void);
-void cmd_servo_sweep(void);
-void cmd_board_info(void);
-
-// Helper functions
-void measure_adc_noise(uint8 pin);
-void fast_gpio(int pin);
-void serial_baud_test(HardwareSerial **serials, int n, unsigned baud);
-void serial_echo_test(HardwareSerial *serial, unsigned baud);
-void init_all_timers(uint16 prescale);
-void enable_usarts(void);
-void disable_usarts(void);
-void print_board_array(const char* msg, const uint8 arr[], int len);
-
-// -- setup() and loop() ------------------------------------------------------
-
-void setup() {
- // Set up the LED to blink
- pinMode(BOARD_LED_PIN, OUTPUT);
-
- // Start up the serial ports
- Serial1.begin(BAUD);
- Serial2.begin(BAUD);
- Serial3.begin(BAUD);
-
- // Send a message out over SerialUSB interface
- SerialUSB.println(" ");
- SerialUSB.println(" __ __ _ _");
- SerialUSB.println(" | \\/ | __ _ _ __ | | ___| |");
- SerialUSB.println(" | |\\/| |/ _` | '_ \\| |/ _ \\ |");
- SerialUSB.println(" | | | | (_| | |_) | | __/_|");
- SerialUSB.println(" |_| |_|\\__,_| .__/|_|\\___(_)");
- SerialUSB.println(" |_|");
- SerialUSB.println(" by leaflabs");
- SerialUSB.println("");
- SerialUSB.println("");
- SerialUSB.println("Maple interactive test program (type '?' for help)");
- SerialUSB.println("-------------------------------------------------------"
- "---");
- SerialUSB.print("> ");
-
-}
-
-void loop () {
- toggleLED();
- delay(250);
-
- while (SerialUSB.available()) {
- uint8 input = SerialUSB.read();
- SerialUSB.println((char)input);
-
- switch(input) {
- case '\r':
- break;
-
- case ' ':
- SerialUSB.println("spacebar, nice!");
- break;
-
- case '?':
- case 'h':
- cmd_print_help();
- break;
-
- case 'u':
- SerialUSB.println("Hello World!");
- break;
-
- case 'w':
- Serial1.println("Hello World!");
- Serial2.println("Hello World!");
- Serial3.println("Hello World!");
- break;
-
- case 'm':
- cmd_serial1_serial3();
- break;
-
- case 'E':
- cmd_serial1_echo();
- break;
-
- case '.':
- while (!SerialUSB.available()) {
- Serial1.print(".");
- Serial2.print(".");
- Serial3.print(".");
- SerialUSB.print(".");
- }
- break;
-
- case 'd':
- SerialUSB.println("Disabling USB. Press BUT to re-enable.");
- SerialUSB.end();
- pinMode(BOARD_BUTTON_PIN, INPUT);
- while (!isButtonPressed())
- ;
- SerialUSB.begin();
- break;
-
- case 'n':
- cmd_adc_stats();
- break;
-
- case 'N':
- cmd_stressful_adc_stats();
- break;
-
- case 'e':
- cmd_everything();
- break;
-
- case 'W':
- while (!SerialUSB.available()) {
- Serial1.print(dummy_data);
- Serial2.print(dummy_data);
- Serial3.print(dummy_data);
- }
- break;
-
- case 'U': {
- SerialUSB.println("Dumping data to USB. Press any key.");
- int nprints = 0;
- int start = millis();
- while (!SerialUSB.available()) {
- SerialUSB.print(dummy_data);
- nprints++;
- }
- int elapsed = millis() - start;
- SerialUSB.read(); // consume available character
- size_t nbytes = nprints * strlen(dummy_data);
- SerialUSB.println();
- SerialUSB.print("Sent ");
- SerialUSB.print(nbytes);
- SerialUSB.print(" bytes (");
- SerialUSB.print((nbytes / (double)elapsed) * (1000.0 / 1024.0));
- SerialUSB.println(" kB/sec)");
- }
- break;
-
- case 'g':
- cmd_sequential_gpio_toggling();
- break;
-
- case 'G':
- cmd_gpio_toggling();
- break;
-
- case 'j':
- cmd_sequential_debug_gpio_toggling();
- break;
-
- case 'J':
- cmd_debug_gpio_toggling();
- break;
-
- case 'B':
- cmd_but_test();
- break;
-
- case 'f':
- SerialUSB.println("Wiggling D4 as fast as possible in bursts. "
- "Press any key.");
- pinMode(4, OUTPUT);
- while (!SerialUSB.available()) {
- fast_gpio(4);
- delay(1);
- }
- break;
-
- case 'p':
- cmd_sequential_pwm_test();
- break;
-
- case '_':
- SerialUSB.println("Delaying for 5 seconds...");
- delay(5000);
- break;
-
- // Be sure to update cmd_print_help() if you implement these:
-
- case 't': // TODO
- SerialUSB.println("Unimplemented.");
- break;
-
- case 'T': // TODO
- SerialUSB.println("Unimplemented.");
- break;
-
- case 's':
- cmd_servo_sweep();
- break;
-
- // Be sure to update cmd_print_help() if you implement these:
-
- case 'i': // TODO
- SerialUSB.println("Unimplemented.");
- break;
-
- case 'I': // TODO
- SerialUSB.println("Unimplemented.");
- break;
-
- case 'r':
- cmd_gpio_monitoring();
- break;
-
- case 'a':
- cmd_sequential_adc_reads();
- break;
-
- case 'b':
- cmd_board_info();
- break;
-
- case '+':
- cmd_gpio_qa();
- break;
-
- default: // -------------------------------
- SerialUSB.print("Unexpected byte: 0x");
- SerialUSB.print((int)input, HEX);
- SerialUSB.println(", press h for help.");
- }
-
- SerialUSB.print("> ");
- }
-}
-
-// -- Commands ----------------------------------------------------------------
-
-void cmd_print_help(void) {
- SerialUSB.println("");
- SerialUSB.println("Command Listing");
- SerialUSB.println("\t?: print this menu");
- SerialUSB.println("\td: Disable SerialUSB (press button to re-enable)");
- SerialUSB.println("\th: print this menu");
- SerialUSB.println("\tw: print Hello World on all 3 USARTS");
- SerialUSB.println("\tn: measure noise and do statistics");
- SerialUSB.println("\tN: measure noise and do statistics with background "
- "stuff");
- SerialUSB.println("\ta: show realtime ADC info");
- SerialUSB.println("\t.: echo '.' until new input");
- SerialUSB.println("\tu: print Hello World on USB");
- SerialUSB.println("\t_: do as little as possible for a couple seconds "
- "(delay)");
- SerialUSB.println("\tp: test all PWM channels sequentially");
- SerialUSB.println("\tW: dump data as fast as possible on all 3 USARTS");
- SerialUSB.println("\tU: dump data as fast as possible over USB"
- " and measure data rate");
- SerialUSB.println("\tg: toggle GPIOs sequentially");
- SerialUSB.println("\tG: toggle GPIOs at the same time");
- SerialUSB.println("\tj: toggle debug port GPIOs sequentially");
- SerialUSB.println("\tJ: toggle debug port GPIOs simultaneously");
- SerialUSB.println("\tB: test the built-in button");
- SerialUSB.println("\tf: toggle pin 4 as fast as possible in bursts");
- SerialUSB.println("\tr: monitor and print GPIO status changes");
- SerialUSB.println("\ts: output a sweeping servo PWM on all PWM channels");
- SerialUSB.println("\tm: output data on USART1 and USART3 at various "
- "baud rates");
- SerialUSB.println("\tE: echo data on USART1 at various baud rates");
- SerialUSB.println("\tb: print information about the board.");
- SerialUSB.println("\t+: test shield mode (for quality assurance testing)");
-
- SerialUSB.println("Unimplemented:");
- SerialUSB.println("\te: do everything all at once until new input");
- SerialUSB.println("\tt: output a 1khz squarewave on all GPIOs");
- SerialUSB.println("\tT: output a 1hz squarewave on all GPIOs");
- SerialUSB.println("\ti: print out a bunch of info about system state");
- SerialUSB.println("\tI: print out status of all headers");
-}
-
-void cmd_adc_stats(void) {
- SerialUSB.println("Taking ADC noise stats. Press ESC to stop, "
- "'R' to repeat same pin, anything else for next pin.");
-
- uint32 i = 0;
- while (i < BOARD_NR_ADC_PINS) {
- measure_adc_noise(boardADCPins[i]);
-
- SerialUSB.println("----------");
- uint8 c = SerialUSB.read();
- if (c == ESC) {
- break;
- } else if (c != 'r' && c != 'R') {
- i++;
- }
- }
-}
-
-void cmd_stressful_adc_stats(void) {
- SerialUSB.println("Taking ADC noise stats under duress. Press ESC to "
- "stop, 'R' to repeat same pin, anything else for next "
- "pin.");
-
- uint32 i = 0;
- while (i < BOARD_NR_ADC_PINS) {
- // use PWM to create digital noise
- for (uint32 j = 0; j < BOARD_NR_PWM_PINS; j++) {
- if (boardADCPins[i] != boardPWMPins[j]) {
- pinMode(boardPWMPins[j], PWM);
- pwmWrite(boardPWMPins[j], 1000 + i);
- }
- }
-
- measure_adc_noise(boardADCPins[i]);
-
- // turn off the noise
- for (uint32 j = 0; j < BOARD_NR_PWM_PINS; j++) {
- if (boardADCPins[i] != boardPWMPins[j]) {
- pinMode(boardPWMPins[j], OUTPUT);
- digitalWrite(boardPWMPins[j], LOW);
- }
- }
-
- SerialUSB.println("----------");
- uint8 c = SerialUSB.read();
- if (c == ESC) {
- break;
- } else if (c != 'r' && c != 'R') {
- i++;
- }
- }
-}
-
-void cmd_everything(void) { // TODO
- // Be sure to update cmd_print_help() if you implement this.
-
- // print to usart
- // print to usb
- // toggle gpios
- // enable pwm
- SerialUSB.println("Unimplemented.");
-}
-
-void cmd_serial1_serial3(void) {
- HardwareSerial *serial_1_and_3[] = {&Serial1, &Serial3};
-
- SerialUSB.println("Testing 57600 baud on USART1 and USART3. "
- "Press any key to stop.");
- serial_baud_test(serial_1_and_3, 2, 57600);
- SerialUSB.read();
-
- SerialUSB.println("Testing 115200 baud on USART1 and USART3. "
- "Press any key to stop.");
- serial_baud_test(serial_1_and_3, 2, 115200);
- SerialUSB.read();
-
- SerialUSB.println("Testing 9600 baud on USART1 and USART3. "
- "Press any key to stop.");
- serial_baud_test(serial_1_and_3, 2, 9600);
- SerialUSB.read();
-
- SerialUSB.println("Resetting USART1 and USART3...");
- Serial1.begin(BAUD);
- Serial3.begin(BAUD);
-}
-
-void cmd_serial1_echo(void) {
- SerialUSB.println("Testing serial echo at various baud rates. "
- "Press any key for next baud rate, or ESC to quit "
- "early.");
- while (!SerialUSB.available())
- ;
-
- if (SerialUSB.read() == ESC) return;
- SerialUSB.println("Testing 115200 baud on USART1.");
- serial_echo_test(&Serial1, 115200);
-
- if (SerialUSB.read() == ESC) return;
- SerialUSB.println("Testing 57600 baud on USART1.");
- serial_echo_test(&Serial1, 57600);
-
- if (SerialUSB.read() == ESC) return;
- SerialUSB.println("Testing 9600 baud on USART1.");
- serial_echo_test(&Serial1, 9600);
-}
-
-void cmd_gpio_monitoring(void) {
- SerialUSB.println("Monitoring pin state changes. Press any key to stop.");
-
- for (int i = 0; i < BOARD_NR_GPIO_PINS; i++) {
- if (boardUsesPin(i))
- continue;
- pinMode(i, INPUT_PULLDOWN);
- gpio_state[i] = (uint8)digitalRead(i);
- }
-
- while (!SerialUSB.available()) {
- for (int i = 0; i < BOARD_NR_GPIO_PINS; i++) {
- if (boardUsesPin(i))
- continue;
-
- uint8 current_state = (uint8)digitalRead(i);
- if (current_state != gpio_state[i]) {
- SerialUSB.print("State change on pin ");
- SerialUSB.print(i, DEC);
- if (current_state) {
- SerialUSB.println(":\tHIGH");
- } else {
- SerialUSB.println(":\tLOW");
- }
- gpio_state[i] = current_state;
- }
- }
- }
-
- for (int i = 0; i < BOARD_NR_GPIO_PINS; i++) {
- if (boardUsesPin(i))
- continue;
- pinMode(i, OUTPUT);
- }
-}
-
-void cmd_sequential_adc_reads(void) {
- SerialUSB.print("Sequentially reading most ADC ports.");
- SerialUSB.println("Press any key for next port, or ESC to stop.");
-
- for (uint32 i = 0; i < BOARD_NR_ADC_PINS; i++) {
- if (boardUsesPin(boardADCPins[i]))
- continue;
-
- SerialUSB.print("Reading pin ");
- SerialUSB.print(boardADCPins[i], DEC);
- SerialUSB.println("...");
- pinMode(boardADCPins[i], INPUT_ANALOG);
- while (!SerialUSB.available()) {
- int sample = analogRead(boardADCPins[i]);
- SerialUSB.print(boardADCPins[i], DEC);
- SerialUSB.print("\t");
- SerialUSB.print(sample, DEC);
- SerialUSB.print("\t");
- SerialUSB.print("|");
- for (int j = 0; j < 4096; j += 100) {
- if (sample >= j) {
- SerialUSB.print("#");
- } else {
- SerialUSB.print(" ");
- }
- }
- SerialUSB.print("| ");
- for (int j = 0; j < 12; j++) {
- if (sample & (1 << (11 - j))) {
- SerialUSB.print("1");
- } else {
- SerialUSB.print("0");
- }
- }
- SerialUSB.println();
- }
- pinMode(boardADCPins[i], OUTPUT);
- digitalWrite(boardADCPins[i], 0);
- if (SerialUSB.read() == ESC)
- break;
- }
-}
-
-bool test_single_pin_is_high(int high_pin, const char* err_msg) {
- bool ok = true;
- for (int i = 0; i < BOARD_NR_GPIO_PINS; i++) {
- if (boardUsesPin(i)) continue;
-
- if (digitalRead(i) == HIGH && i != high_pin) {
- SerialUSB.println();
- SerialUSB.print("\t*** FAILURE! pin ");
- SerialUSB.print(i, DEC);
- SerialUSB.print(' ');
- SerialUSB.println(err_msg);
- ok = false;
- }
- }
- return ok;
-}
-
-bool wait_for_low_transition(uint8 pin) {
- uint32 start = millis();
- while (millis() - start < 2000) {
- if (digitalRead(pin) == LOW) {
- return true;
- }
- }
- return false;
-}
-
-void cmd_gpio_qa(void) {
- bool all_pins_ok = true;
- const int not_a_pin = -1;
- SerialUSB.println("Doing QA testing for unused GPIO pins.");
-
- for (int i = 0; i < BOARD_NR_GPIO_PINS; i++) {
- if (boardUsesPin(i)) continue;
-
- pinMode(i, INPUT);
- }
-
- SerialUSB.println("Waiting to start.");
- ASSERT(!boardUsesPin(0));
- while (digitalRead(0) == LOW) continue;
-
- for (int i = 0; i < BOARD_NR_GPIO_PINS; i++) {
- if (boardUsesPin(i)) {
- SerialUSB.print("Skipping pin ");
- SerialUSB.println(i, DEC);
- continue;
- }
- bool pin_ok = true;
- SerialUSB.print("Checking pin ");
- SerialUSB.print(i, DEC);
- while (digitalRead(i) == LOW) continue;
-
- pin_ok = pin_ok && test_single_pin_is_high(i, "is also HIGH");
-
- if (!wait_for_low_transition(i)) {
- SerialUSB.println("Transition to low timed out; something is "
- "very wrong. Aborting test.");
- return;
- }
-
- pin_ok = pin_ok && test_single_pin_is_high(not_a_pin, "is still HIGH");
-
- if (pin_ok) {
- SerialUSB.println(": ok");
- }
-
- all_pins_ok = all_pins_ok && pin_ok;
- }
-
- if (all_pins_ok) {
- SerialUSB.println("Finished; test passes.");
- } else {
- SerialUSB.println("**** TEST FAILS *****");
- }
-
- for (int i = 0; i < BOARD_NR_GPIO_PINS; i++) {
- if (boardUsesPin(i)) continue;
-
- pinMode(i, OUTPUT);
- digitalWrite(i, LOW);
- gpio_state[i] = 0;
- }
-}
-
-void cmd_sequential_gpio_toggling(void) {
- SerialUSB.println("Sequentially toggling all unused pins. "
- "Press any key for next pin, ESC to stop.");
-
- for (uint32 i = 0; i < BOARD_NR_GPIO_PINS; i++) {
- if (boardUsesPin(i))
- continue;
-
- SerialUSB.print("Toggling pin ");
- SerialUSB.print((int)i, DEC);
- SerialUSB.println("...");
-
- pinMode(i, OUTPUT);
- do {
- togglePin(i);
- } while (!SerialUSB.available());
-
- digitalWrite(i, LOW);
- if (SerialUSB.read() == ESC)
- break;
- }
-}
-
-void cmd_gpio_toggling(void) {
- SerialUSB.println("Toggling all unused pins simultaneously. "
- "Press any key to stop.");
-
- for (uint32 i = 0; i < BOARD_NR_GPIO_PINS; i++) {
- if (boardUsesPin(i))
- continue;
- pinMode(i, OUTPUT);
- }
-
- while (!SerialUSB.available()) {
- for (uint32 i = 0; i < BOARD_NR_GPIO_PINS; i++) {
- if (boardUsesPin(i))
- continue;
- togglePin(i);
- }
- }
-
- for (uint32 i = 0; i < BOARD_NR_GPIO_PINS; i++) {
- if (boardUsesPin(i))
- continue;
- digitalWrite(i, LOW);
- }
-}
-
-uint8 debugGPIOPins[] = {BOARD_JTMS_SWDIO_PIN,
- BOARD_JTCK_SWCLK_PIN,
- BOARD_JTDI_PIN,
- BOARD_JTDO_PIN,
- BOARD_NJTRST_PIN};
-
-#define N_DEBUG_PINS 5
-
-void cmd_sequential_debug_gpio_toggling(void) {
- SerialUSB.println("Toggling all debug (JTAG/SWD) pins sequentially. "
- "This will permanently disable debug port "
- "functionality.");
- disableDebugPorts();
-
- for (int i = 0; i < N_DEBUG_PINS; i++) {
- pinMode(debugGPIOPins[i], OUTPUT);
- }
-
- for (int i = 0; i < N_DEBUG_PINS; i++) {
- int pin = debugGPIOPins[i];
- SerialUSB.print("Toggling pin ");
- SerialUSB.print(pin, DEC);
- SerialUSB.println("...");
-
- pinMode(pin, OUTPUT);
- do {
- togglePin(pin);
- } while (!SerialUSB.available());
-
- digitalWrite(pin, LOW);
- if (SerialUSB.read() == ESC)
- break;
- }
-
- for (int i = 0; i < N_DEBUG_PINS; i++) {
- digitalWrite(debugGPIOPins[i], 0);
- }
-}
-
-void cmd_debug_gpio_toggling(void) {
- SerialUSB.println("Toggling debug GPIO simultaneously. "
- "This will permanently disable JTAG and Serial Wire "
- "debug port functionality. "
- "Press any key to stop.");
- disableDebugPorts();
-
- for (uint32 i = 0; i < N_DEBUG_PINS; i++) {
- pinMode(debugGPIOPins[i], OUTPUT);
- }
-
- while (!SerialUSB.available()) {
- for (uint32 i = 0; i < N_DEBUG_PINS; i++) {
- togglePin(debugGPIOPins[i]);
- }
- }
-
- for (uint32 i = 0; i < N_DEBUG_PINS; i++) {
- digitalWrite(debugGPIOPins[i], LOW);
- }
-}
-
-void cmd_but_test(void) {
- SerialUSB.println("Press the button to test. Press any key to stop.");
- pinMode(BOARD_BUTTON_PIN, INPUT);
-
- while (!SerialUSB.available()) {
- if (isButtonPressed()) {
- uint32 tstamp = millis();
- SerialUSB.print("Button press detected, timestamp: ");
- SerialUSB.println(tstamp);
- }
- }
- SerialUSB.read();
-}
-
-void cmd_sequential_pwm_test(void) {
- SerialUSB.println("Sequentially testing PWM on all unused pins. "
- "Press any key for next pin, ESC to stop.");
-
- for (uint32 i = 0; i < BOARD_NR_PWM_PINS; i++) {
- if (boardUsesPin(i))
- continue;
-
- SerialUSB.print("PWM out on header D");
- SerialUSB.print(boardPWMPins[i], DEC);
- SerialUSB.println("...");
- pinMode(boardPWMPins[i], PWM);
- pwmWrite(boardPWMPins[i], 16000);
-
- while (!SerialUSB.available()) {
- delay(10);
- }
-
- pinMode(boardPWMPins[i], OUTPUT);
- digitalWrite(boardPWMPins[i], 0);
- if (SerialUSB.read() == ESC)
- break;
- }
-}
-
-void cmd_servo_sweep(void) {
- SerialUSB.println("Testing all PWM headers with a servo sweep. "
- "Press any key to stop.");
- SerialUSB.println();
-
- disable_usarts();
- init_all_timers(21);
-
- for (uint32 i = 0; i < BOARD_NR_PWM_PINS; i++) {
- if (boardUsesPin(i))
- continue;
- pinMode(boardPWMPins[i], PWM);
- pwmWrite(boardPWMPins[i], 4000);
- }
-
- // 1.25ms = 4096counts = 0deg
- // 1.50ms = 4915counts = 90deg
- // 1.75ms = 5734counts = 180deg
- int rate = 4096;
- while (!SerialUSB.available()) {
- rate += 20;
- if (rate > 5734)
- rate = 4096;
- for (uint32 i = 0; i < BOARD_NR_PWM_PINS; i++) {
- if (boardUsesPin(i))
- continue;
- pwmWrite(boardPWMPins[i], rate);
- }
- delay(20);
- }
-
- for (uint32 i = 0; i < BOARD_NR_PWM_PINS; i++) {
- if (boardUsesPin(i))
- continue;
- pinMode(boardPWMPins[i], OUTPUT);
- }
- init_all_timers(1);
- enable_usarts();
-}
-
-void cmd_board_info(void) { // TODO print more information
- SerialUSB.println("Board information");
- SerialUSB.println("=================");
-
- SerialUSB.print("* Clock speed (MHz): ");
- SerialUSB.println(CYCLES_PER_MICROSECOND);
-
- SerialUSB.print("* BOARD_LED_PIN: ");
- SerialUSB.println(BOARD_LED_PIN);
-
- SerialUSB.print("* BOARD_BUTTON_PIN: ");
- SerialUSB.println(BOARD_BUTTON_PIN);
-
- SerialUSB.print("* GPIO information (BOARD_NR_GPIO_PINS = ");
- SerialUSB.print(BOARD_NR_GPIO_PINS);
- SerialUSB.println("):");
- print_board_array("ADC pins", boardADCPins, BOARD_NR_ADC_PINS);
- print_board_array("PWM pins", boardPWMPins, BOARD_NR_PWM_PINS);
- print_board_array("Used pins", boardUsedPins, BOARD_NR_USED_PINS);
-}
-
-// -- Helper functions --------------------------------------------------------
-
-void measure_adc_noise(uint8 pin) {
- const int N = 1000;
- uint16 x;
- float mean = 0;
- float delta = 0;
- float M2 = 0;
- pinMode(pin, INPUT_ANALOG);
-
- // Variance algorithm from Welford, via Knuth, by way of Wikipedia:
- // http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance#On-line_algorithm
- for (int sample = 0; sample < N_ADC_NOISE_MEASUREMENTS; sample++) {
- for (int i = 1; i <= N; i++) {
- x = analogRead(pin);
- delta = x - mean;
- mean += delta / i;
- M2 = M2 + delta * (x - mean);
- }
- SerialUSB.print("header: D");
- SerialUSB.print(pin, DEC);
- SerialUSB.print("\tn: ");
- SerialUSB.print(N, DEC);
- SerialUSB.print("\tmean: ");
- SerialUSB.print(mean);
- SerialUSB.print("\tvariance: ");
- SerialUSB.println(M2 / (float)(N-1));
- }
-
- pinMode(pin, OUTPUT);
-}
-
-void fast_gpio(int maple_pin) {
- gpio_dev *dev = PIN_MAP[maple_pin].gpio_device;
- uint32 bit = PIN_MAP[maple_pin].gpio_bit;
-
- gpio_write_bit(dev, bit, 1);
- gpio_toggle_bit(dev, bit);
- gpio_toggle_bit(dev, bit);
- gpio_toggle_bit(dev, bit);
- gpio_toggle_bit(dev, bit);
- gpio_toggle_bit(dev, bit);
- gpio_toggle_bit(dev, bit);
- gpio_toggle_bit(dev, bit);
- gpio_toggle_bit(dev, bit);
- gpio_toggle_bit(dev, bit);
- gpio_toggle_bit(dev, bit);
- gpio_toggle_bit(dev, bit);
- gpio_toggle_bit(dev, bit);
- gpio_toggle_bit(dev, bit);
- gpio_toggle_bit(dev, bit);
- gpio_toggle_bit(dev, bit);
- gpio_toggle_bit(dev, bit);
- gpio_toggle_bit(dev, bit);
- gpio_toggle_bit(dev, bit);
- gpio_toggle_bit(dev, bit);
- gpio_toggle_bit(dev, bit);
- gpio_toggle_bit(dev, bit);
- gpio_toggle_bit(dev, bit);
- gpio_toggle_bit(dev, bit);
- gpio_toggle_bit(dev, bit);
- gpio_toggle_bit(dev, bit);
-}
-
-void serial_baud_test(HardwareSerial **serials, int n, unsigned baud) {
- for (int i = 0; i < n; i++) {
- serials[i]->begin(baud);
- }
- while (!SerialUSB.available()) {
- for (int i = 0; i < n; i++) {
- serials[i]->println(dummy_data);
- if (serials[i]->available()) {
- serials[i]->println(serials[i]->read());
- delay(1000);
- }
- }
- }
-}
-
-void serial_echo_test(HardwareSerial *serial, unsigned baud) {
- serial->begin(baud);
- while (!SerialUSB.available()) {
- if (!serial->available())
- continue;
- serial->print(serial->read());
- }
-}
-
-static uint16 init_all_timers_prescale = 0;
-
-static void set_prescale(timer_dev *dev) {
- timer_set_prescaler(dev, init_all_timers_prescale);
-}
-
-void init_all_timers(uint16 prescale) {
- init_all_timers_prescale = prescale;
- timer_foreach(set_prescale);
-}
-
-void enable_usarts(void) {
- Serial1.begin(BAUD);
- Serial2.begin(BAUD);
- Serial3.begin(BAUD);
-#if defined(STM32_HIGH_DENSITY) && !defined(BOARD_maple_RET6)
- Serial4.begin(BAUD);
- Serial5.begin(BAUD);
-#endif
-}
-
-void disable_usarts(void) {
- Serial1.end();
- Serial2.end();
- Serial3.end();
-#if defined(STM32_HIGH_DENSITY) && !defined(BOARD_maple_RET6)
- Serial4.end();
- Serial5.end();
-#endif
-}
-
-void print_board_array(const char* msg, const uint8 arr[], int len) {
- SerialUSB.print("\t");
- SerialUSB.print(msg);
- SerialUSB.print(" (");
- SerialUSB.print(len);
- SerialUSB.print("): ");
- for (int i = 0; i < len; i++) {
- SerialUSB.print(arr[i], DEC);
- if (i < len - 1) SerialUSB.print(", ");
- }
- SerialUSB.println();
-}
-
-// -- premain() and main() ----------------------------------------------------
-
-// Force init to be called *first*, i.e. before static object allocation.
-// Otherwise, statically allocated objects that need libmaple may fail.
-__attribute__((constructor)) void premain() {
- init();
-}
-
-int main(void) {
- setup();
-
- while (1) {
- loop();
- }
- return 0;
-}