Alex Borisevich
/
OpenBCI
OpenBCI 32bit board variation with STM32L476 mircocontroller and mbed support
PlatformUart.cpp@1:4683702d7ad8, 2017-01-22 (annotated)
- Committer:
- akpc806a
- Date:
- Sun Jan 22 04:10:11 2017 +0000
- Revision:
- 1:4683702d7ad8
- Parent:
- 0:2cb59ea20ace
OpenBCI 32bit board variation with STM32L476 mircocontroller and mbed support. Version V2 of firmware, forked from the same official version for the PIC32 board.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
akpc806a | 0:2cb59ea20ace | 1 | // interface for SPI implemented with mbed framework |
akpc806a | 0:2cb59ea20ace | 2 | |
akpc806a | 0:2cb59ea20ace | 3 | #include "PlatformUart.h" |
akpc806a | 0:2cb59ea20ace | 4 | #include "mbed.h" |
akpc806a | 1:4683702d7ad8 | 5 | #include "SerialBuffered.h" |
akpc806a | 0:2cb59ea20ace | 6 | |
akpc806a | 1:4683702d7ad8 | 7 | |
akpc806a | 1:4683702d7ad8 | 8 | //Serial uart(PA_9, PA_10, 115200); // Serial(PinName tx, PinName rx, const char *name=NULL, int baud = MBED_CONF_PLATFORM_DEFAULT_SERIAL_BAUD_RATE); |
akpc806a | 1:4683702d7ad8 | 9 | SerialBuffered uart( 256, PA_9, PA_10, 115200 ); |
akpc806a | 0:2cb59ea20ace | 10 | |
akpc806a | 0:2cb59ea20ace | 11 | |
akpc806a | 0:2cb59ea20ace | 12 | int platformUart::write(int data) |
akpc806a | 0:2cb59ea20ace | 13 | { |
akpc806a | 0:2cb59ea20ace | 14 | return uart.putc(data); |
akpc806a | 0:2cb59ea20ace | 15 | } |
akpc806a | 0:2cb59ea20ace | 16 | /* |
akpc806a | 0:2cb59ea20ace | 17 | int platformUart::write(char* str) |
akpc806a | 0:2cb59ea20ace | 18 | { |
akpc806a | 0:2cb59ea20ace | 19 | return uart.puts(str); |
akpc806a | 0:2cb59ea20ace | 20 | } |
akpc806a | 0:2cb59ea20ace | 21 | */ |
akpc806a | 0:2cb59ea20ace | 22 | |
akpc806a | 0:2cb59ea20ace | 23 | size_t platformUart::println(void) |
akpc806a | 0:2cb59ea20ace | 24 | { |
akpc806a | 0:2cb59ea20ace | 25 | return uart.puts("\r\n"); |
akpc806a | 0:2cb59ea20ace | 26 | } |
akpc806a | 0:2cb59ea20ace | 27 | |
akpc806a | 0:2cb59ea20ace | 28 | size_t platformUart::print(const char str[]) |
akpc806a | 0:2cb59ea20ace | 29 | { |
akpc806a | 0:2cb59ea20ace | 30 | return uart.puts(str); |
akpc806a | 0:2cb59ea20ace | 31 | } |
akpc806a | 0:2cb59ea20ace | 32 | |
akpc806a | 0:2cb59ea20ace | 33 | size_t platformUart::print(char c) |
akpc806a | 0:2cb59ea20ace | 34 | { |
akpc806a | 0:2cb59ea20ace | 35 | return uart.putc(c); |
akpc806a | 0:2cb59ea20ace | 36 | } |
akpc806a | 0:2cb59ea20ace | 37 | |
akpc806a | 0:2cb59ea20ace | 38 | size_t platformUart::print(unsigned char b, int base) |
akpc806a | 0:2cb59ea20ace | 39 | { |
akpc806a | 0:2cb59ea20ace | 40 | return print((unsigned long) b, base); |
akpc806a | 0:2cb59ea20ace | 41 | } |
akpc806a | 0:2cb59ea20ace | 42 | |
akpc806a | 0:2cb59ea20ace | 43 | size_t platformUart::print(int n, int base) |
akpc806a | 0:2cb59ea20ace | 44 | { |
akpc806a | 0:2cb59ea20ace | 45 | return print((long) n, base); |
akpc806a | 0:2cb59ea20ace | 46 | } |
akpc806a | 0:2cb59ea20ace | 47 | |
akpc806a | 0:2cb59ea20ace | 48 | size_t platformUart::print(unsigned int n, int base) |
akpc806a | 0:2cb59ea20ace | 49 | { |
akpc806a | 0:2cb59ea20ace | 50 | return print((unsigned long) n, base); |
akpc806a | 0:2cb59ea20ace | 51 | } |
akpc806a | 0:2cb59ea20ace | 52 | |
akpc806a | 0:2cb59ea20ace | 53 | size_t platformUart::print(long n, int base) |
akpc806a | 0:2cb59ea20ace | 54 | { |
akpc806a | 0:2cb59ea20ace | 55 | if (base == 0) { |
akpc806a | 0:2cb59ea20ace | 56 | return write(n); |
akpc806a | 0:2cb59ea20ace | 57 | } else if (base == 10) { |
akpc806a | 0:2cb59ea20ace | 58 | if (n < 0) { |
akpc806a | 0:2cb59ea20ace | 59 | int t = print('-'); |
akpc806a | 0:2cb59ea20ace | 60 | n = -n; |
akpc806a | 0:2cb59ea20ace | 61 | return printNumber(n, 10) + t; |
akpc806a | 0:2cb59ea20ace | 62 | } |
akpc806a | 0:2cb59ea20ace | 63 | return printNumber(n, 10); |
akpc806a | 0:2cb59ea20ace | 64 | } else { |
akpc806a | 0:2cb59ea20ace | 65 | return printNumber(n, base); |
akpc806a | 0:2cb59ea20ace | 66 | } |
akpc806a | 0:2cb59ea20ace | 67 | } |
akpc806a | 0:2cb59ea20ace | 68 | |
akpc806a | 0:2cb59ea20ace | 69 | size_t platformUart::print(unsigned long n, int base) |
akpc806a | 0:2cb59ea20ace | 70 | { |
akpc806a | 0:2cb59ea20ace | 71 | if (base == 0) return write(n); |
akpc806a | 0:2cb59ea20ace | 72 | else return printNumber(n, base); |
akpc806a | 0:2cb59ea20ace | 73 | } |
akpc806a | 0:2cb59ea20ace | 74 | |
akpc806a | 0:2cb59ea20ace | 75 | size_t platformUart::print(double n, int digits) |
akpc806a | 0:2cb59ea20ace | 76 | { |
akpc806a | 0:2cb59ea20ace | 77 | return printFloat(n, digits); |
akpc806a | 0:2cb59ea20ace | 78 | } |
akpc806a | 0:2cb59ea20ace | 79 | |
akpc806a | 0:2cb59ea20ace | 80 | |
akpc806a | 0:2cb59ea20ace | 81 | size_t platformUart::println(const char c[]) |
akpc806a | 0:2cb59ea20ace | 82 | { |
akpc806a | 0:2cb59ea20ace | 83 | size_t n = print(c); |
akpc806a | 0:2cb59ea20ace | 84 | n += println(); |
akpc806a | 0:2cb59ea20ace | 85 | return n; |
akpc806a | 0:2cb59ea20ace | 86 | } |
akpc806a | 0:2cb59ea20ace | 87 | |
akpc806a | 0:2cb59ea20ace | 88 | size_t platformUart::println(char c) |
akpc806a | 0:2cb59ea20ace | 89 | { |
akpc806a | 0:2cb59ea20ace | 90 | size_t n = print(c); |
akpc806a | 0:2cb59ea20ace | 91 | n += println(); |
akpc806a | 0:2cb59ea20ace | 92 | return n; |
akpc806a | 0:2cb59ea20ace | 93 | } |
akpc806a | 0:2cb59ea20ace | 94 | |
akpc806a | 0:2cb59ea20ace | 95 | size_t platformUart::println(unsigned char b, int base) |
akpc806a | 0:2cb59ea20ace | 96 | { |
akpc806a | 0:2cb59ea20ace | 97 | size_t n = print(b, base); |
akpc806a | 0:2cb59ea20ace | 98 | n += println(); |
akpc806a | 0:2cb59ea20ace | 99 | return n; |
akpc806a | 0:2cb59ea20ace | 100 | } |
akpc806a | 0:2cb59ea20ace | 101 | |
akpc806a | 0:2cb59ea20ace | 102 | size_t platformUart::println(int num, int base) |
akpc806a | 0:2cb59ea20ace | 103 | { |
akpc806a | 0:2cb59ea20ace | 104 | size_t n = print(num, base); |
akpc806a | 0:2cb59ea20ace | 105 | n += println(); |
akpc806a | 0:2cb59ea20ace | 106 | return n; |
akpc806a | 0:2cb59ea20ace | 107 | } |
akpc806a | 0:2cb59ea20ace | 108 | |
akpc806a | 0:2cb59ea20ace | 109 | size_t platformUart::println(unsigned int num, int base) |
akpc806a | 0:2cb59ea20ace | 110 | { |
akpc806a | 0:2cb59ea20ace | 111 | size_t n = print(num, base); |
akpc806a | 0:2cb59ea20ace | 112 | n += println(); |
akpc806a | 0:2cb59ea20ace | 113 | return n; |
akpc806a | 0:2cb59ea20ace | 114 | } |
akpc806a | 0:2cb59ea20ace | 115 | |
akpc806a | 0:2cb59ea20ace | 116 | size_t platformUart::println(long num, int base) |
akpc806a | 0:2cb59ea20ace | 117 | { |
akpc806a | 0:2cb59ea20ace | 118 | size_t n = print(num, base); |
akpc806a | 0:2cb59ea20ace | 119 | n += println(); |
akpc806a | 0:2cb59ea20ace | 120 | return n; |
akpc806a | 0:2cb59ea20ace | 121 | } |
akpc806a | 0:2cb59ea20ace | 122 | |
akpc806a | 0:2cb59ea20ace | 123 | size_t platformUart::println(unsigned long num, int base) |
akpc806a | 0:2cb59ea20ace | 124 | { |
akpc806a | 0:2cb59ea20ace | 125 | size_t n = print(num, base); |
akpc806a | 0:2cb59ea20ace | 126 | n += println(); |
akpc806a | 0:2cb59ea20ace | 127 | return n; |
akpc806a | 0:2cb59ea20ace | 128 | } |
akpc806a | 0:2cb59ea20ace | 129 | |
akpc806a | 0:2cb59ea20ace | 130 | size_t platformUart::println(double num, int digits) |
akpc806a | 0:2cb59ea20ace | 131 | { |
akpc806a | 0:2cb59ea20ace | 132 | size_t n = print(num, digits); |
akpc806a | 0:2cb59ea20ace | 133 | n += println(); |
akpc806a | 0:2cb59ea20ace | 134 | return n; |
akpc806a | 0:2cb59ea20ace | 135 | } |
akpc806a | 0:2cb59ea20ace | 136 | |
akpc806a | 0:2cb59ea20ace | 137 | |
akpc806a | 0:2cb59ea20ace | 138 | // Private Methods ///////////////////////////////////////////////////////////// |
akpc806a | 0:2cb59ea20ace | 139 | |
akpc806a | 0:2cb59ea20ace | 140 | size_t platformUart::printNumber(unsigned long n, uint8_t base) { |
akpc806a | 0:2cb59ea20ace | 141 | char buf[8 * sizeof(long) + 1]; // Assumes 8-bit chars plus zero byte. |
akpc806a | 0:2cb59ea20ace | 142 | char *str = &buf[sizeof(buf) - 1]; |
akpc806a | 0:2cb59ea20ace | 143 | |
akpc806a | 0:2cb59ea20ace | 144 | *str = '\0'; |
akpc806a | 0:2cb59ea20ace | 145 | |
akpc806a | 0:2cb59ea20ace | 146 | // prevent crash if called with base == 1 |
akpc806a | 0:2cb59ea20ace | 147 | if (base < 2) base = 10; |
akpc806a | 0:2cb59ea20ace | 148 | |
akpc806a | 0:2cb59ea20ace | 149 | do { |
akpc806a | 0:2cb59ea20ace | 150 | unsigned long m = n; |
akpc806a | 0:2cb59ea20ace | 151 | n /= base; |
akpc806a | 0:2cb59ea20ace | 152 | char c = m - base * n; |
akpc806a | 0:2cb59ea20ace | 153 | *--str = c < 10 ? c + '0' : c + 'A' - 10; |
akpc806a | 0:2cb59ea20ace | 154 | } while(n); |
akpc806a | 0:2cb59ea20ace | 155 | |
akpc806a | 0:2cb59ea20ace | 156 | return uart.puts(str); |
akpc806a | 0:2cb59ea20ace | 157 | } |
akpc806a | 0:2cb59ea20ace | 158 | |
akpc806a | 0:2cb59ea20ace | 159 | size_t platformUart::printFloat(double number, uint8_t digits) |
akpc806a | 0:2cb59ea20ace | 160 | { |
akpc806a | 0:2cb59ea20ace | 161 | size_t n = 0; |
akpc806a | 0:2cb59ea20ace | 162 | |
akpc806a | 0:2cb59ea20ace | 163 | if (isnan(number)) return print("nan"); |
akpc806a | 0:2cb59ea20ace | 164 | if (isinf(number)) return print("inf"); |
akpc806a | 0:2cb59ea20ace | 165 | if (number > 4294967040.0) return print ("ovf"); // constant determined empirically |
akpc806a | 0:2cb59ea20ace | 166 | if (number <-4294967040.0) return print ("ovf"); // constant determined empirically |
akpc806a | 0:2cb59ea20ace | 167 | |
akpc806a | 0:2cb59ea20ace | 168 | // Handle negative numbers |
akpc806a | 0:2cb59ea20ace | 169 | if (number < 0.0) |
akpc806a | 0:2cb59ea20ace | 170 | { |
akpc806a | 0:2cb59ea20ace | 171 | n += print('-'); |
akpc806a | 0:2cb59ea20ace | 172 | number = -number; |
akpc806a | 0:2cb59ea20ace | 173 | } |
akpc806a | 0:2cb59ea20ace | 174 | |
akpc806a | 0:2cb59ea20ace | 175 | // Round correctly so that print(1.999, 2) prints as "2.00" |
akpc806a | 0:2cb59ea20ace | 176 | double rounding = 0.5; |
akpc806a | 0:2cb59ea20ace | 177 | for (uint8_t i=0; i<digits; ++i) |
akpc806a | 0:2cb59ea20ace | 178 | rounding /= 10.0; |
akpc806a | 0:2cb59ea20ace | 179 | |
akpc806a | 0:2cb59ea20ace | 180 | number += rounding; |
akpc806a | 0:2cb59ea20ace | 181 | |
akpc806a | 0:2cb59ea20ace | 182 | // Extract the integer part of the number and print it |
akpc806a | 0:2cb59ea20ace | 183 | unsigned long int_part = (unsigned long)number; |
akpc806a | 0:2cb59ea20ace | 184 | double remainder = number - (double)int_part; |
akpc806a | 0:2cb59ea20ace | 185 | n += print(int_part); |
akpc806a | 0:2cb59ea20ace | 186 | |
akpc806a | 0:2cb59ea20ace | 187 | // platformUart the decimal point, but only if there are digits beyond |
akpc806a | 0:2cb59ea20ace | 188 | if (digits > 0) { |
akpc806a | 0:2cb59ea20ace | 189 | n += print("."); |
akpc806a | 0:2cb59ea20ace | 190 | } |
akpc806a | 0:2cb59ea20ace | 191 | |
akpc806a | 0:2cb59ea20ace | 192 | // Extract digits from the remainder one at a time |
akpc806a | 0:2cb59ea20ace | 193 | while (digits-- > 0) |
akpc806a | 0:2cb59ea20ace | 194 | { |
akpc806a | 0:2cb59ea20ace | 195 | remainder *= 10.0; |
akpc806a | 0:2cb59ea20ace | 196 | int toPrint = int(remainder); |
akpc806a | 0:2cb59ea20ace | 197 | n += print(toPrint); |
akpc806a | 0:2cb59ea20ace | 198 | remainder -= toPrint; |
akpc806a | 0:2cb59ea20ace | 199 | } |
akpc806a | 0:2cb59ea20ace | 200 | |
akpc806a | 0:2cb59ea20ace | 201 | return n; |
akpc806a | 0:2cb59ea20ace | 202 | } |
akpc806a | 0:2cb59ea20ace | 203 | |
akpc806a | 0:2cb59ea20ace | 204 | |
akpc806a | 1:4683702d7ad8 | 205 | |
akpc806a | 1:4683702d7ad8 | 206 | |
akpc806a | 0:2cb59ea20ace | 207 | unsigned char rx_data; |
akpc806a | 0:2cb59ea20ace | 208 | |
akpc806a | 0:2cb59ea20ace | 209 | // Interupt Routine to read in data from serial port |
akpc806a | 0:2cb59ea20ace | 210 | void Rx_interrupt() |
akpc806a | 0:2cb59ea20ace | 211 | { |
akpc806a | 1:4683702d7ad8 | 212 | //while (uart.readable()) |
akpc806a | 0:2cb59ea20ace | 213 | { |
akpc806a | 0:2cb59ea20ace | 214 | rx_data = uart.getc(); |
akpc806a | 1:4683702d7ad8 | 215 | //byteQueue_Put(&rxQueue, rx_data); |
akpc806a | 0:2cb59ea20ace | 216 | } |
akpc806a | 0:2cb59ea20ace | 217 | } |
akpc806a | 0:2cb59ea20ace | 218 | |
akpc806a | 0:2cb59ea20ace | 219 | |
akpc806a | 0:2cb59ea20ace | 220 | |
akpc806a | 0:2cb59ea20ace | 221 | platformUart::platformUart() |
akpc806a | 0:2cb59ea20ace | 222 | { |
akpc806a | 1:4683702d7ad8 | 223 | //byteQueue_Init(&rxQueue); |
akpc806a | 0:2cb59ea20ace | 224 | |
akpc806a | 1:4683702d7ad8 | 225 | //uart.attach(&Rx_interrupt, Serial::RxIrq); |
akpc806a | 0:2cb59ea20ace | 226 | } |
akpc806a | 0:2cb59ea20ace | 227 | |
akpc806a | 0:2cb59ea20ace | 228 | unsigned char platformUart::available() |
akpc806a | 0:2cb59ea20ace | 229 | { |
akpc806a | 1:4683702d7ad8 | 230 | return uart.readable(); //!(byteQueue_IsEmpty(&rxQueue)); |
akpc806a | 0:2cb59ea20ace | 231 | } |
akpc806a | 0:2cb59ea20ace | 232 | |
akpc806a | 0:2cb59ea20ace | 233 | unsigned char platformUart::read() |
akpc806a | 0:2cb59ea20ace | 234 | { |
akpc806a | 1:4683702d7ad8 | 235 | return uart.getc(); //byteQueue_Get(&rxQueue); |
akpc806a | 0:2cb59ea20ace | 236 | } |
akpc806a | 0:2cb59ea20ace | 237 | |
akpc806a | 0:2cb59ea20ace | 238 | |
akpc806a | 0:2cb59ea20ace | 239 | |
akpc806a | 0:2cb59ea20ace | 240 | |
akpc806a | 1:4683702d7ad8 | 241 | platformUart Serial0; |
akpc806a | 1:4683702d7ad8 | 242 | platformUart_Dummy Serial1; |