From 037020e938f7dde469f828764976635a69b74a3e Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Thu, 18 Oct 2012 18:47:50 +0200 Subject: [PATCH] Merged latest changes in AVR arduino core --- cores/arduino/CDC.cpp | 10 ++++++++-- cores/arduino/Print.cpp | 2 ++ cores/arduino/Tone.cpp | 31 +++++++++++++++++++++++-------- cores/arduino/WString.h | 2 +- 4 files changed, 34 insertions(+), 11 deletions(-) diff --git a/cores/arduino/CDC.cpp b/cores/arduino/CDC.cpp index 1ee3a48..701e483 100644 --- a/cores/arduino/CDC.cpp +++ b/cores/arduino/CDC.cpp @@ -141,16 +141,22 @@ void Serial_::end(void) void Serial_::accept(void) { ring_buffer *buffer = &cdc_rx_buffer; - int c = USB_Recv(CDC_RX); int i = (unsigned int)(buffer->head+1) % SERIAL_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 != buffer->tail) { + + // while we have room to store a byte + while (i != buffer->tail) { + int c = USB_Recv(CDC_RX); + if (c == -1) + break; // no more data buffer->buffer[buffer->head] = c; buffer->head = i; + + i = (unsigned int)(buffer->head+1) % SERIAL_BUFFER_SIZE; } } diff --git a/cores/arduino/Print.cpp b/cores/arduino/Print.cpp index 711251c..53961ec 100755 --- a/cores/arduino/Print.cpp +++ b/cores/arduino/Print.cpp @@ -228,6 +228,8 @@ size_t Print::printFloat(double number, uint8_t digits) 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) diff --git a/cores/arduino/Tone.cpp b/cores/arduino/Tone.cpp index 20eed3f..9bb6fe7 100755 --- a/cores/arduino/Tone.cpp +++ b/cores/arduino/Tone.cpp @@ -29,6 +29,7 @@ Version Modified By Date Comments 09/11/25 Fixed timer0 from being excluded 0006 D Mellis 09/12/29 Replaced objects with functions 0007 M Sproul 10/08/29 Changed #ifdefs from cpu to register +0008 S Kanemoto 12/06/22 Fixed for Leonardo by @maris_HY *************************************************/ #include @@ -85,10 +86,10 @@ volatile uint8_t timer5_pin_mask; #endif -// MLS: This does not make sense, the 3 options are the same #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) #define AVAILABLE_TONE_PINS 1 +#define USE_TIMER2 const uint8_t PROGMEM tone_pin_to_timer_PGM[] = { 2 /*, 3, 4, 5, 1, 0 */ }; static uint8_t tone_pins[AVAILABLE_TONE_PINS] = { 255 /*, 255, 255, 255, 255, 255 */ }; @@ -96,13 +97,23 @@ static uint8_t tone_pins[AVAILABLE_TONE_PINS] = { 255 /*, 255, 255, 255, 255, 25 #elif defined(__AVR_ATmega8__) #define AVAILABLE_TONE_PINS 1 +#define USE_TIMER2 const uint8_t PROGMEM tone_pin_to_timer_PGM[] = { 2 /*, 1 */ }; static uint8_t tone_pins[AVAILABLE_TONE_PINS] = { 255 /*, 255 */ }; +#elif defined(__AVR_ATmega32U4__) + +#define AVAILABLE_TONE_PINS 1 +#define USE_TIMER3 + +const uint8_t PROGMEM tone_pin_to_timer_PGM[] = { 3 /*, 1 */ }; +static uint8_t tone_pins[AVAILABLE_TONE_PINS] = { 255 /*, 255 */ }; + #else #define AVAILABLE_TONE_PINS 1 +#define USE_TIMER2 // Leave timer 0 to last. const uint8_t PROGMEM tone_pin_to_timer_PGM[] = { 2 /*, 1, 0 */ }; @@ -480,8 +491,7 @@ void noTone(uint8_t _pin) digitalWrite(_pin, 0); } -#if 0 -#if !defined(__AVR_ATmega8__) +#ifdef USE_TIMER0 ISR(TIMER0_COMPA_vect) { if (timer0_toggle_count != 0) @@ -501,6 +511,7 @@ ISR(TIMER0_COMPA_vect) #endif +#ifdef USE_TIMER1 ISR(TIMER1_COMPA_vect) { if (timer1_toggle_count != 0) @@ -520,6 +531,7 @@ ISR(TIMER1_COMPA_vect) #endif +#ifdef USE_TIMER2 ISR(TIMER2_COMPA_vect) { @@ -541,12 +553,10 @@ ISR(TIMER2_COMPA_vect) // *timer2_pin_port &= ~(timer2_pin_mask); // keep pin low after stop } } +#endif - -//#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) -#if 0 - +#ifdef USE_TIMER3 ISR(TIMER3_COMPA_vect) { if (timer3_toggle_count != 0) @@ -563,7 +573,10 @@ ISR(TIMER3_COMPA_vect) *timer3_pin_port &= ~(timer3_pin_mask); // keep pin low after stop } } +#endif + +#ifdef USE_TIMER4 ISR(TIMER4_COMPA_vect) { if (timer4_toggle_count != 0) @@ -580,7 +593,10 @@ ISR(TIMER4_COMPA_vect) *timer4_pin_port &= ~(timer4_pin_mask); // keep pin low after stop } } +#endif + +#ifdef USE_TIMER5 ISR(TIMER5_COMPA_vect) { if (timer5_toggle_count != 0) @@ -597,5 +613,4 @@ ISR(TIMER5_COMPA_vect) *timer5_pin_port &= ~(timer5_pin_mask); // keep pin low after stop } } - #endif diff --git a/cores/arduino/WString.h b/cores/arduino/WString.h index d76d2a3..947325e 100644 --- a/cores/arduino/WString.h +++ b/cores/arduino/WString.h @@ -35,7 +35,7 @@ // -std=c++0x class __FlashStringHelper; -#define F(string_literal) (reinterpret_cast<__FlashStringHelper *>(PSTR(string_literal))) +#define F(string_literal) (reinterpret_cast(PSTR(string_literal))) // An inherited class for holding the result of a concatenation. These // result objects are assumed to be writable by subsequent concatenations.