--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/MarlinSerial.h Sat Nov 07 13:23:07 2015 +0100 @@ -0,0 +1,156 @@ +/* + HardwareSerial.h - Hardware serial library for Wiring + Copyright (c) 2006 Nicholas Zambetti. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Modified 28 September 2010 by Mark Sproul +*/ + + + +#ifndef MarlinSerial_h +#define MarlinSerial_h +#include "Marlin.h" + +#ifndef REPRAPPRO_MULTIMATERIALS + +#define DEC 10 +#define HEX 16 +#define OCT 8 +#define BIN 2 +#define BYTE 0 + + +#if MOTHERBOARD != 8 // ! teensylu +// Define constants and variables for buffering incoming serial data. We're +// using a ring buffer (I think), in which rx_buffer_head is the index of the +// location to which to write the next incoming character and rx_buffer_tail +// is the index of the location from which to read. +#define RX_BUFFER_SIZE 128 + + +struct ring_buffer +{ + unsigned char buffer[RX_BUFFER_SIZE]; + int head; + int tail; +}; + +#if defined(UBRRH) || defined(UBRR0H) + extern ring_buffer rx_buffer; +#endif + +class MarlinSerial //: public Stream +{ + + public: + MarlinSerial(); + void begin(long); + void end(); + int peek(void); + int read(void); + void flush(void); + + FORCE_INLINE int available(void) + { + return (unsigned int)(RX_BUFFER_SIZE + rx_buffer.head - rx_buffer.tail) % RX_BUFFER_SIZE; + } + + FORCE_INLINE void write(uint8_t c) + { + while (!((UCSR0A) & (1 << UDRE0))) + ; + + UDR0 = c; + } + + + FORCE_INLINE void checkRx(void) + { + if((UCSR0A & (1<<RXC0)) != 0) { + unsigned char c = UDR0; + int i = (unsigned int)(rx_buffer.head + 1) % RX_BUFFER_SIZE; + + // if we should be storing the received character into the location + // just before the tail (meaning that the head would advance to the + // current location of the tail), we're about to overflow the buffer + // and so we don't write the character or advance the head. + if (i != rx_buffer.tail) { + rx_buffer.buffer[rx_buffer.head] = c; + rx_buffer.head = i; + } + } + } + + + private: + void printNumber(unsigned long, uint8_t); + void printFloat(double, uint8_t); + + + public: + + FORCE_INLINE void write(const char *str) + { + while (*str) + write(*str++); + } + + + FORCE_INLINE void write(const uint8_t *buffer, size_t size) + { + while (size--) + write(*buffer++); + } + + FORCE_INLINE void print(const String &s) + { + for (int i = 0; i < (int)s.length(); i++) { + write(s[i]); + } + } + + FORCE_INLINE void print(const char *str) + { + write(str); + } + void print(char, int = BYTE); + void print(unsigned char, int = BYTE); + void print(int, int = DEC); + void print(unsigned int, int = DEC); + void print(long, int = DEC); + void print(unsigned long, int = DEC); + void print(double, int = 3); + + void println(const String &s); + void println(const char[]); + void println(char, int = BYTE); + void println(unsigned char, int = BYTE); + void println(int, int = DEC); + void println(unsigned int, int = DEC); + void println(long, int = DEC); + void println(unsigned long, int = DEC); + void println(double, int = 2); + void println(void); +}; + +extern MarlinSerial MSerial; +extern MarlinSerial MSerial1; +#endif // ! teensylu + +#endif + +#endif // REPRAPPRO_MULTIMATERIALS