Alex Borisevich
/
OpenBCI
Diff: PlatformUart.cpp
- Revision:
- 0:2cb59ea20ace
- Child:
- 1:4683702d7ad8
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/PlatformUart.cpp Sun Dec 04 03:38:44 2016 +0000 @@ -0,0 +1,242 @@ +// interface for SPI implemented with mbed framework + +#include "PlatformUart.h" +#include "mbed.h" + +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); + + +int platformUart::write(int data) +{ + return uart.putc(data); +} +/* +int platformUart::write(char* str) +{ + return uart.puts(str); +} +*/ + +size_t platformUart::println(void) +{ + return uart.puts("\r\n"); +} + +size_t platformUart::print(const char str[]) +{ + return uart.puts(str); +} + +size_t platformUart::print(char c) +{ + return uart.putc(c); +} + +size_t platformUart::print(unsigned char b, int base) +{ + return print((unsigned long) b, base); +} + +size_t platformUart::print(int n, int base) +{ + return print((long) n, base); +} + +size_t platformUart::print(unsigned int n, int base) +{ + return print((unsigned long) n, base); +} + +size_t platformUart::print(long n, int base) +{ + if (base == 0) { + return write(n); + } else if (base == 10) { + if (n < 0) { + int t = print('-'); + n = -n; + return printNumber(n, 10) + t; + } + return printNumber(n, 10); + } else { + return printNumber(n, base); + } +} + +size_t platformUart::print(unsigned long n, int base) +{ + if (base == 0) return write(n); + else return printNumber(n, base); +} + +size_t platformUart::print(double n, int digits) +{ + return printFloat(n, digits); +} + + +size_t platformUart::println(const char c[]) +{ + size_t n = print(c); + n += println(); + return n; +} + +size_t platformUart::println(char c) +{ + size_t n = print(c); + n += println(); + return n; +} + +size_t platformUart::println(unsigned char b, int base) +{ + size_t n = print(b, base); + n += println(); + return n; +} + +size_t platformUart::println(int num, int base) +{ + size_t n = print(num, base); + n += println(); + return n; +} + +size_t platformUart::println(unsigned int num, int base) +{ + size_t n = print(num, base); + n += println(); + return n; +} + +size_t platformUart::println(long num, int base) +{ + size_t n = print(num, base); + n += println(); + return n; +} + +size_t platformUart::println(unsigned long num, int base) +{ + size_t n = print(num, base); + n += println(); + return n; +} + +size_t platformUart::println(double num, int digits) +{ + size_t n = print(num, digits); + n += println(); + return n; +} + + +// Private Methods ///////////////////////////////////////////////////////////// + +size_t platformUart::printNumber(unsigned long n, uint8_t base) { + char buf[8 * sizeof(long) + 1]; // Assumes 8-bit chars plus zero byte. + char *str = &buf[sizeof(buf) - 1]; + + *str = '\0'; + + // prevent crash if called with base == 1 + if (base < 2) base = 10; + + do { + unsigned long m = n; + n /= base; + char c = m - base * n; + *--str = c < 10 ? c + '0' : c + 'A' - 10; + } while(n); + + return uart.puts(str); +} + +size_t platformUart::printFloat(double number, uint8_t digits) +{ + size_t n = 0; + + if (isnan(number)) return print("nan"); + if (isinf(number)) return print("inf"); + if (number > 4294967040.0) return print ("ovf"); // constant determined empirically + if (number <-4294967040.0) return print ("ovf"); // constant determined empirically + + // Handle negative numbers + if (number < 0.0) + { + n += print('-'); + number = -number; + } + + // Round correctly so that print(1.999, 2) prints as "2.00" + double rounding = 0.5; + for (uint8_t i=0; i<digits; ++i) + rounding /= 10.0; + + number += rounding; + + // Extract the integer part of the number and print it + unsigned long int_part = (unsigned long)number; + double remainder = number - (double)int_part; + n += print(int_part); + + // platformUart the decimal point, but only if there are digits beyond + if (digits > 0) { + n += print("."); + } + + // Extract digits from the remainder one at a time + while (digits-- > 0) + { + remainder *= 10.0; + int toPrint = int(remainder); + n += print(toPrint); + remainder -= toPrint; + } + + return n; +} + + +extern void eventSerial(); +unsigned char rx_data; +unsigned char rx_avalible; + +// Interupt Routine to read in data from serial port +void Rx_interrupt() +{ + while (uart.readable()) + { + rx_data = uart.getc(); + rx_avalible = 1; + + eventSerial(); + } +} + + + +platformUart::platformUart() +{ + rx_data = 0; + rx_avalible = 0; + + uart.attach(&Rx_interrupt, Serial::RxIrq); +} + +unsigned char platformUart::available() +{ + return rx_avalible; +} + +unsigned char platformUart::read() +{ + rx_avalible = 0; + return rx_data; +} + + + + +platformUart Serial0; \ No newline at end of file