|
@ -68,8 +68,8 @@ FORCE_INLINE void store_char(unsigned char c) { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
#if TX_BUFFER_SIZE > 0 |
|
|
#if TX_BUFFER_SIZE > 0 |
|
|
FORCE_INLINE void _tx_udr_empty_irq(void) |
|
|
|
|
|
{ |
|
|
FORCE_INLINE void _tx_udr_empty_irq(void) { |
|
|
// If interrupts are enabled, there must be more data in the output
|
|
|
// If interrupts are enabled, there must be more data in the output
|
|
|
// buffer. Send the next byte
|
|
|
// buffer. Send the next byte
|
|
|
uint8_t t = tx_buffer.tail; |
|
|
uint8_t t = tx_buffer.tail; |
|
@ -95,7 +95,7 @@ FORCE_INLINE void store_char(unsigned char c) { |
|
|
} |
|
|
} |
|
|
#endif |
|
|
#endif |
|
|
|
|
|
|
|
|
#endif |
|
|
#endif // TX_BUFFER_SIZE
|
|
|
|
|
|
|
|
|
#if defined(M_USARTx_RX_vect) |
|
|
#if defined(M_USARTx_RX_vect) |
|
|
ISR(M_USARTx_RX_vect) { |
|
|
ISR(M_USARTx_RX_vect) { |
|
@ -160,15 +160,8 @@ void MarlinSerial::checkRx(void) { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
int MarlinSerial::peek(void) { |
|
|
int MarlinSerial::peek(void) { |
|
|
int v; |
|
|
|
|
|
CRITICAL_SECTION_START; |
|
|
CRITICAL_SECTION_START; |
|
|
uint8_t t = rx_buffer.tail; |
|
|
int v = rx_buffer.head == rx_buffer.tail ? -1 : rx_buffer.buffer[rx_buffer.tail]; |
|
|
if (rx_buffer.head == t) { |
|
|
|
|
|
v = -1; |
|
|
|
|
|
} |
|
|
|
|
|
else { |
|
|
|
|
|
v = rx_buffer.buffer[t]; |
|
|
|
|
|
} |
|
|
|
|
|
CRITICAL_SECTION_END; |
|
|
CRITICAL_SECTION_END; |
|
|
return v; |
|
|
return v; |
|
|
} |
|
|
} |
|
@ -176,22 +169,22 @@ int MarlinSerial::peek(void) { |
|
|
int MarlinSerial::read(void) { |
|
|
int MarlinSerial::read(void) { |
|
|
int v; |
|
|
int v; |
|
|
CRITICAL_SECTION_START; |
|
|
CRITICAL_SECTION_START; |
|
|
uint8_t t = rx_buffer.tail; |
|
|
uint8_t t = rx_buffer.tail; |
|
|
if (rx_buffer.head == t) { |
|
|
if (rx_buffer.head == t) { |
|
|
v = -1; |
|
|
v = -1; |
|
|
} |
|
|
} |
|
|
else { |
|
|
else { |
|
|
v = rx_buffer.buffer[t]; |
|
|
v = rx_buffer.buffer[t]; |
|
|
rx_buffer.tail = (uint8_t)(t + 1) & (RX_BUFFER_SIZE - 1); |
|
|
rx_buffer.tail = (uint8_t)(t + 1) & (RX_BUFFER_SIZE - 1); |
|
|
} |
|
|
} |
|
|
CRITICAL_SECTION_END; |
|
|
CRITICAL_SECTION_END; |
|
|
return v; |
|
|
return v; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
uint8_t MarlinSerial::available(void) { |
|
|
uint8_t MarlinSerial::available(void) { |
|
|
CRITICAL_SECTION_START; |
|
|
CRITICAL_SECTION_START; |
|
|
uint8_t h = rx_buffer.head; |
|
|
uint8_t h = rx_buffer.head, |
|
|
uint8_t t = rx_buffer.tail; |
|
|
t = rx_buffer.tail; |
|
|
CRITICAL_SECTION_END; |
|
|
CRITICAL_SECTION_END; |
|
|
return (uint8_t)(RX_BUFFER_SIZE + h - t) & (RX_BUFFER_SIZE - 1); |
|
|
return (uint8_t)(RX_BUFFER_SIZE + h - t) & (RX_BUFFER_SIZE - 1); |
|
|
} |
|
|
} |
|
@ -251,11 +244,10 @@ void MarlinSerial::flush(void) { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
tx_buffer.buffer[tx_buffer.head] = c; |
|
|
tx_buffer.buffer[tx_buffer.head] = c; |
|
|
{ CRITICAL_SECTION_START; |
|
|
CRITICAL_SECTION_START; |
|
|
tx_buffer.head = i; |
|
|
tx_buffer.head = i; |
|
|
SBI(M_UCSRxB, M_UDRIEx); |
|
|
SBI(M_UCSRxB, M_UDRIEx); |
|
|
CRITICAL_SECTION_END; |
|
|
CRITICAL_SECTION_END; |
|
|
} |
|
|
|
|
|
return; |
|
|
return; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@ -386,23 +378,18 @@ void MarlinSerial::println(double n, int digits) { |
|
|
// Private Methods /////////////////////////////////////////////////////////////
|
|
|
// Private Methods /////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
void MarlinSerial::printNumber(unsigned long n, uint8_t base) { |
|
|
void MarlinSerial::printNumber(unsigned long n, uint8_t base) { |
|
|
unsigned char buf[8 * sizeof(long)]; // Assumes 8-bit chars.
|
|
|
if (n) { |
|
|
unsigned long i = 0; |
|
|
unsigned char buf[8 * sizeof(long)]; // Enough space for base 2
|
|
|
|
|
|
int8_t i = 0; |
|
|
if (n == 0) { |
|
|
while (n) { |
|
|
print('0'); |
|
|
buf[i++] = n % base; |
|
|
return; |
|
|
n /= base; |
|
|
} |
|
|
} |
|
|
|
|
|
while (i--) |
|
|
while (n > 0) { |
|
|
print((char)(buf[i] + (buf[i] < 10 ? '0' : 'A' - 10))); |
|
|
buf[i++] = n % base; |
|
|
|
|
|
n /= base; |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
else |
|
|
for (; i > 0; i--) |
|
|
print('0'); |
|
|
print((char)(buf[i - 1] < 10 ? |
|
|
|
|
|
'0' + buf[i - 1] : |
|
|
|
|
|
'A' + buf[i - 1] - 10)); |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void MarlinSerial::printFloat(double number, uint8_t digits) { |
|
|
void MarlinSerial::printFloat(double number, uint8_t digits) { |
|
@ -415,7 +402,7 @@ void MarlinSerial::printFloat(double number, uint8_t digits) { |
|
|
// Round correctly so that print(1.999, 2) prints as "2.00"
|
|
|
// Round correctly so that print(1.999, 2) prints as "2.00"
|
|
|
double rounding = 0.5; |
|
|
double rounding = 0.5; |
|
|
for (uint8_t i = 0; i < digits; ++i) |
|
|
for (uint8_t i = 0; i < digits; ++i) |
|
|
rounding /= 10.0; |
|
|
rounding *= 0.1; |
|
|
|
|
|
|
|
|
number += rounding; |
|
|
number += rounding; |
|
|
|
|
|
|
|
@ -425,14 +412,15 @@ void MarlinSerial::printFloat(double number, uint8_t digits) { |
|
|
print(int_part); |
|
|
print(int_part); |
|
|
|
|
|
|
|
|
// Print the decimal point, but only if there are digits beyond
|
|
|
// Print the decimal point, but only if there are digits beyond
|
|
|
if (digits > 0) print('.'); |
|
|
if (digits) { |
|
|
|
|
|
print('.'); |
|
|
// Extract digits from the remainder one at a time
|
|
|
// Extract digits from the remainder one at a time
|
|
|
while (digits-- > 0) { |
|
|
while (digits--) { |
|
|
remainder *= 10.0; |
|
|
remainder *= 10.0; |
|
|
int toPrint = int(remainder); |
|
|
int toPrint = int(remainder); |
|
|
print(toPrint); |
|
|
print(toPrint); |
|
|
remainder -= toPrint; |
|
|
remainder -= toPrint; |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
// Preinstantiate Objects //////////////////////////////////////////////////////
|
|
|
// Preinstantiate Objects //////////////////////////////////////////////////////
|
|
@ -534,4 +522,5 @@ MarlinSerial customizedSerial; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
#endif |
|
|
#endif |
|
|