get rid of indirect ringbuffer calls, made some inlines, removed virtual and streaming class requirements.
This commit is contained in:
parent
dd5296ad4d
commit
dd5ca68c87
6 changed files with 386 additions and 188 deletions
|
@ -33,35 +33,25 @@
|
||||||
|
|
||||||
#include "MarlinSerial.h"
|
#include "MarlinSerial.h"
|
||||||
|
|
||||||
// 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)
|
#if defined(UBRRH) || defined(UBRR0H)
|
||||||
ring_buffer rx_buffer = { { 0 }, 0, 0 };
|
ring_buffer rx_buffer = { { 0 }, 0, 0 };
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
inline void store_char(unsigned char c, ring_buffer *rx_buffer)
|
inline void store_char(unsigned char c)
|
||||||
{
|
{
|
||||||
int i = (unsigned int)(rx_buffer->head + 1) % RX_BUFFER_SIZE;
|
int i = (unsigned int)(rx_buffer.head + 1) % RX_BUFFER_SIZE;
|
||||||
|
|
||||||
// if we should be storing the received character into the location
|
// if we should be storing the received character into the location
|
||||||
// just before the tail (meaning that the head would advance to the
|
// just before the tail (meaning that the head would advance to the
|
||||||
// current location of the tail), we're about to overflow the buffer
|
// current location of the tail), we're about to overflow the buffer
|
||||||
// and so we don't write the character or advance the head.
|
// and so we don't write the character or advance the head.
|
||||||
if (i != rx_buffer->tail) {
|
if (i != rx_buffer.tail) {
|
||||||
rx_buffer->buffer[rx_buffer->head] = c;
|
rx_buffer.buffer[rx_buffer.head] = c;
|
||||||
rx_buffer->head = i;
|
rx_buffer.head = i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -79,19 +69,18 @@ inline void store_char(unsigned char c, ring_buffer *rx_buffer)
|
||||||
#else
|
#else
|
||||||
#error UDR not defined
|
#error UDR not defined
|
||||||
#endif
|
#endif
|
||||||
store_char(c, &rx_buffer);
|
store_char(c);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Constructors ////////////////////////////////////////////////////////////////
|
// Constructors ////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
MarlinSerial::MarlinSerial(ring_buffer *rx_buffer,
|
MarlinSerial::MarlinSerial(
|
||||||
volatile uint8_t *ubrrh, volatile uint8_t *ubrrl,
|
volatile uint8_t *ubrrh, volatile uint8_t *ubrrl,
|
||||||
volatile uint8_t *ucsra, volatile uint8_t *ucsrb,
|
volatile uint8_t *ucsra, volatile uint8_t *ucsrb,
|
||||||
volatile uint8_t *udr,
|
volatile uint8_t *udr,
|
||||||
uint8_t rxen, uint8_t txen, uint8_t rxcie, uint8_t udre, uint8_t u2x)
|
uint8_t rxen, uint8_t txen, uint8_t rxcie, uint8_t udre, uint8_t u2x)
|
||||||
{
|
{
|
||||||
_rx_buffer = rx_buffer;
|
|
||||||
_ubrrh = ubrrh;
|
_ubrrh = ubrrh;
|
||||||
_ubrrl = ubrrl;
|
_ubrrl = ubrrl;
|
||||||
_ucsra = ucsra;
|
_ucsra = ucsra;
|
||||||
|
@ -144,28 +133,25 @@ void MarlinSerial::end()
|
||||||
cbi(*_ucsrb, _rxcie);
|
cbi(*_ucsrb, _rxcie);
|
||||||
}
|
}
|
||||||
|
|
||||||
int MarlinSerial::available(void)
|
|
||||||
{
|
|
||||||
return (unsigned int)(RX_BUFFER_SIZE + _rx_buffer->head - _rx_buffer->tail) % RX_BUFFER_SIZE;
|
|
||||||
}
|
|
||||||
|
|
||||||
int MarlinSerial::peek(void)
|
int MarlinSerial::peek(void)
|
||||||
{
|
{
|
||||||
if (_rx_buffer->head == _rx_buffer->tail) {
|
if (rx_buffer.head == rx_buffer.tail) {
|
||||||
return -1;
|
return -1;
|
||||||
} else {
|
} else {
|
||||||
return _rx_buffer->buffer[_rx_buffer->tail];
|
return rx_buffer.buffer[rx_buffer.tail];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int MarlinSerial::read(void)
|
int MarlinSerial::read(void)
|
||||||
{
|
{
|
||||||
// if the head isn't ahead of the tail, we don't have any characters
|
// if the head isn't ahead of the tail, we don't have any characters
|
||||||
if (_rx_buffer->head == _rx_buffer->tail) {
|
if (rx_buffer.head == rx_buffer.tail) {
|
||||||
return -1;
|
return -1;
|
||||||
} else {
|
} else {
|
||||||
unsigned char c = _rx_buffer->buffer[_rx_buffer->tail];
|
unsigned char c = rx_buffer.buffer[rx_buffer.tail];
|
||||||
_rx_buffer->tail = (unsigned int)(_rx_buffer->tail + 1) % RX_BUFFER_SIZE;
|
rx_buffer.tail = (unsigned int)(rx_buffer.tail + 1) % RX_BUFFER_SIZE;
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -181,29 +167,207 @@ void MarlinSerial::flush()
|
||||||
// the value to rx_buffer_tail; the previous value of rx_buffer_head
|
// the value to rx_buffer_tail; the previous value of rx_buffer_head
|
||||||
// may be written to rx_buffer_tail, making it appear as if the buffer
|
// may be written to rx_buffer_tail, making it appear as if the buffer
|
||||||
// were full, not empty.
|
// were full, not empty.
|
||||||
_rx_buffer->head = _rx_buffer->tail;
|
rx_buffer.head = rx_buffer.tail;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MarlinSerial::write(uint8_t c)
|
|
||||||
{
|
|
||||||
while (!((*_ucsra) & (1 << _udre)))
|
|
||||||
;
|
|
||||||
|
|
||||||
*_udr = c;
|
|
||||||
|
|
||||||
|
/// imports from print.h
|
||||||
|
/* default implementation: may be overridden */
|
||||||
|
void MarlinSerial::write(const char *str)
|
||||||
|
{
|
||||||
|
while (*str)
|
||||||
|
write(*str++);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MarlinSerial::checkRx()
|
/* default implementation: may be overridden */
|
||||||
|
void MarlinSerial::write(const uint8_t *buffer, size_t size)
|
||||||
{
|
{
|
||||||
if((UCSR0A & (1<<RXC0)) != 0) {
|
while (size--)
|
||||||
unsigned char c = UDR0;
|
write(*buffer++);
|
||||||
store_char(c, &rx_buffer);
|
}
|
||||||
|
|
||||||
|
void MarlinSerial::print(const String &s)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < s.length(); i++) {
|
||||||
|
write(s[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MarlinSerial::print(const char str[])
|
||||||
|
{
|
||||||
|
write(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MarlinSerial::print(char c, int base)
|
||||||
|
{
|
||||||
|
print((long) c, base);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MarlinSerial::print(unsigned char b, int base)
|
||||||
|
{
|
||||||
|
print((unsigned long) b, base);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MarlinSerial::print(int n, int base)
|
||||||
|
{
|
||||||
|
print((long) n, base);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MarlinSerial::print(unsigned int n, int base)
|
||||||
|
{
|
||||||
|
print((unsigned long) n, base);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MarlinSerial::print(long n, int base)
|
||||||
|
{
|
||||||
|
if (base == 0) {
|
||||||
|
write(n);
|
||||||
|
} else if (base == 10) {
|
||||||
|
if (n < 0) {
|
||||||
|
print('-');
|
||||||
|
n = -n;
|
||||||
|
}
|
||||||
|
printNumber(n, 10);
|
||||||
|
} else {
|
||||||
|
printNumber(n, base);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void MarlinSerial::print(unsigned long n, int base)
|
||||||
|
{
|
||||||
|
if (base == 0) write(n);
|
||||||
|
else printNumber(n, base);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MarlinSerial::print(double n, int digits)
|
||||||
|
{
|
||||||
|
printFloat(n, digits);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MarlinSerial::println(void)
|
||||||
|
{
|
||||||
|
print('\r');
|
||||||
|
print('\n');
|
||||||
|
}
|
||||||
|
|
||||||
|
void MarlinSerial::println(const String &s)
|
||||||
|
{
|
||||||
|
print(s);
|
||||||
|
println();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MarlinSerial::println(const char c[])
|
||||||
|
{
|
||||||
|
print(c);
|
||||||
|
println();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MarlinSerial::println(char c, int base)
|
||||||
|
{
|
||||||
|
print(c, base);
|
||||||
|
println();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MarlinSerial::println(unsigned char b, int base)
|
||||||
|
{
|
||||||
|
print(b, base);
|
||||||
|
println();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MarlinSerial::println(int n, int base)
|
||||||
|
{
|
||||||
|
print(n, base);
|
||||||
|
println();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MarlinSerial::println(unsigned int n, int base)
|
||||||
|
{
|
||||||
|
print(n, base);
|
||||||
|
println();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MarlinSerial::println(long n, int base)
|
||||||
|
{
|
||||||
|
print(n, base);
|
||||||
|
println();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MarlinSerial::println(unsigned long n, int base)
|
||||||
|
{
|
||||||
|
print(n, base);
|
||||||
|
println();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MarlinSerial::println(double n, int digits)
|
||||||
|
{
|
||||||
|
print(n, digits);
|
||||||
|
println();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Private Methods /////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
void MarlinSerial::printNumber(unsigned long n, uint8_t base)
|
||||||
|
{
|
||||||
|
unsigned char buf[8 * sizeof(long)]; // Assumes 8-bit chars.
|
||||||
|
unsigned long i = 0;
|
||||||
|
|
||||||
|
if (n == 0) {
|
||||||
|
print('0');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (n > 0) {
|
||||||
|
buf[i++] = n % base;
|
||||||
|
n /= base;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (; i > 0; i--)
|
||||||
|
print((char) (buf[i - 1] < 10 ?
|
||||||
|
'0' + buf[i - 1] :
|
||||||
|
'A' + buf[i - 1] - 10));
|
||||||
|
}
|
||||||
|
|
||||||
|
void MarlinSerial::printFloat(double number, uint8_t digits)
|
||||||
|
{
|
||||||
|
// Handle negative numbers
|
||||||
|
if (number < 0.0)
|
||||||
|
{
|
||||||
|
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;
|
||||||
|
print(int_part);
|
||||||
|
|
||||||
|
// Print the decimal point, but only if there are digits beyond
|
||||||
|
if (digits > 0)
|
||||||
|
print(".");
|
||||||
|
|
||||||
|
// Extract digits from the remainder one at a time
|
||||||
|
while (digits-- > 0)
|
||||||
|
{
|
||||||
|
remainder *= 10.0;
|
||||||
|
int toPrint = int(remainder);
|
||||||
|
print(toPrint);
|
||||||
|
remainder -= toPrint;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Preinstantiate Objects //////////////////////////////////////////////////////
|
// Preinstantiate Objects //////////////////////////////////////////////////////
|
||||||
|
|
||||||
#if defined(UBRR0H) && defined(UBRR0L)
|
#if defined(UBRR0H) && defined(UBRR0L)
|
||||||
MarlinSerial MSerial(&rx_buffer, &UBRR0H, &UBRR0L, &UCSR0A, &UCSR0B, &UDR0, RXEN0, TXEN0, RXCIE0, UDRE0, U2X0);
|
MarlinSerial MSerial( &UBRR0H, &UBRR0L, &UCSR0A, &UCSR0B, &UDR0, RXEN0, TXEN0, RXCIE0, UDRE0, U2X0);
|
||||||
#else
|
#else
|
||||||
#error no serial port defined (port 0)
|
#error no serial port defined (port 0)
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -23,15 +23,30 @@
|
||||||
#define MarlinSerial_h
|
#define MarlinSerial_h
|
||||||
|
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
|
#include <Stream.h>
|
||||||
|
|
||||||
#include "Stream.h"
|
|
||||||
|
|
||||||
struct ring_buffer;
|
// 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
|
||||||
|
|
||||||
class MarlinSerial : public Stream
|
|
||||||
|
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
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
ring_buffer *_rx_buffer;
|
|
||||||
volatile uint8_t *_ubrrh;
|
volatile uint8_t *_ubrrh;
|
||||||
volatile uint8_t *_ubrrl;
|
volatile uint8_t *_ubrrl;
|
||||||
volatile uint8_t *_ucsra;
|
volatile uint8_t *_ucsra;
|
||||||
|
@ -43,20 +58,76 @@ class MarlinSerial : public Stream
|
||||||
uint8_t _udre;
|
uint8_t _udre;
|
||||||
uint8_t _u2x;
|
uint8_t _u2x;
|
||||||
public:
|
public:
|
||||||
MarlinSerial(ring_buffer *rx_buffer,
|
MarlinSerial(
|
||||||
volatile uint8_t *ubrrh, volatile uint8_t *ubrrl,
|
volatile uint8_t *ubrrh, volatile uint8_t *ubrrl,
|
||||||
volatile uint8_t *ucsra, volatile uint8_t *ucsrb,
|
volatile uint8_t *ucsra, volatile uint8_t *ucsrb,
|
||||||
volatile uint8_t *udr,
|
volatile uint8_t *udr,
|
||||||
uint8_t rxen, uint8_t txen, uint8_t rxcie, uint8_t udre, uint8_t u2x);
|
uint8_t rxen, uint8_t txen, uint8_t rxcie, uint8_t udre, uint8_t u2x);
|
||||||
void begin(long);
|
void begin(long);
|
||||||
void end();
|
void end();
|
||||||
virtual int available(void);
|
inline int available(void)
|
||||||
virtual int peek(void);
|
{
|
||||||
virtual int read(void);
|
return (unsigned int)(RX_BUFFER_SIZE + rx_buffer.head - rx_buffer.tail) % RX_BUFFER_SIZE;
|
||||||
virtual void flush(void);
|
}
|
||||||
virtual void write(uint8_t);
|
int peek(void);
|
||||||
virtual void checkRx(void);
|
int read(void);
|
||||||
using Print::write; // pull in write(str) and write(buf, size) from Print
|
void flush(void);
|
||||||
|
inline void write(uint8_t c)
|
||||||
|
{
|
||||||
|
while (!((*_ucsra) & (1 << _udre)))
|
||||||
|
;
|
||||||
|
|
||||||
|
*_udr = c;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
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:
|
||||||
|
void write(const char *str);
|
||||||
|
void write( const uint8_t *buffer, size_t size);
|
||||||
|
|
||||||
|
void print(const String &);
|
||||||
|
void print(const char[]);
|
||||||
|
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 = 2);
|
||||||
|
|
||||||
|
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);
|
||||||
};
|
};
|
||||||
|
|
||||||
#if defined(UBRRH) || defined(UBRR0H)
|
#if defined(UBRRH) || defined(UBRR0H)
|
||||||
|
|
|
@ -17,6 +17,8 @@
|
||||||
* along with the Arduino SdFat Library. If not, see
|
* along with the Arduino SdFat Library. If not, see
|
||||||
* <http://www.gnu.org/licenses/>.
|
* <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#define SERIAL MSerial
|
||||||
#include "SdBaseFile.h"
|
#include "SdBaseFile.h"
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
// pointer to cwd directory
|
// pointer to cwd directory
|
||||||
|
@ -294,20 +296,7 @@ void SdBaseFile::getpos(fpos_t* pos) {
|
||||||
pos->position = curPosition_;
|
pos->position = curPosition_;
|
||||||
pos->cluster = curCluster_;
|
pos->cluster = curCluster_;
|
||||||
}
|
}
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
/** List directory contents to Serial.
|
|
||||||
*
|
|
||||||
* \param[in] flags The inclusive OR of
|
|
||||||
*
|
|
||||||
* LS_DATE - %Print file modification date
|
|
||||||
*
|
|
||||||
* LS_SIZE - %Print file size.
|
|
||||||
*
|
|
||||||
* LS_R - Recursive list of subdirectories.
|
|
||||||
*/
|
|
||||||
void SdBaseFile::ls(uint8_t flags) {
|
|
||||||
ls(&MSerial, flags, 0);
|
|
||||||
}
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
/** List directory contents.
|
/** List directory contents.
|
||||||
*
|
*
|
||||||
|
@ -324,14 +313,14 @@ void SdBaseFile::ls(uint8_t flags) {
|
||||||
* \param[in] indent Amount of space before file name. Used for recursive
|
* \param[in] indent Amount of space before file name. Used for recursive
|
||||||
* list to indicate subdirectory level.
|
* list to indicate subdirectory level.
|
||||||
*/
|
*/
|
||||||
void SdBaseFile::ls(Print* pr, uint8_t flags, uint8_t indent) {
|
void SdBaseFile::ls(uint8_t flags, uint8_t indent) {
|
||||||
rewind();
|
rewind();
|
||||||
int8_t status;
|
int8_t status;
|
||||||
while ((status = lsPrintNext(pr, flags, indent))) {
|
while ((status = lsPrintNext( flags, indent))) {
|
||||||
if (status > 1 && (flags & LS_R)) {
|
if (status > 1 && (flags & LS_R)) {
|
||||||
uint16_t index = curPosition()/32 - 1;
|
uint16_t index = curPosition()/32 - 1;
|
||||||
SdBaseFile s;
|
SdBaseFile s;
|
||||||
if (s.open(this, index, O_READ)) s.ls(pr, flags, indent + 2);
|
if (s.open(this, index, O_READ)) s.ls( flags, indent + 2);
|
||||||
seekSet(32 * (index + 1));
|
seekSet(32 * (index + 1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -339,7 +328,7 @@ void SdBaseFile::ls(Print* pr, uint8_t flags, uint8_t indent) {
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
// saves 32 bytes on stack for ls recursion
|
// saves 32 bytes on stack for ls recursion
|
||||||
// return 0 - EOF, 1 - normal file, or 2 - directory
|
// return 0 - EOF, 1 - normal file, or 2 - directory
|
||||||
int8_t SdBaseFile::lsPrintNext(Print *pr, uint8_t flags, uint8_t indent) {
|
int8_t SdBaseFile::lsPrintNext( uint8_t flags, uint8_t indent) {
|
||||||
dir_t dir;
|
dir_t dir;
|
||||||
uint8_t w = 0;
|
uint8_t w = 0;
|
||||||
|
|
||||||
|
@ -352,38 +341,38 @@ int8_t SdBaseFile::lsPrintNext(Print *pr, uint8_t flags, uint8_t indent) {
|
||||||
&& DIR_IS_FILE_OR_SUBDIR(&dir)) break;
|
&& DIR_IS_FILE_OR_SUBDIR(&dir)) break;
|
||||||
}
|
}
|
||||||
// indent for dir level
|
// indent for dir level
|
||||||
for (uint8_t i = 0; i < indent; i++) pr->write(' ');
|
for (uint8_t i = 0; i < indent; i++) MSerial.write(' ');
|
||||||
|
|
||||||
// print name
|
// print name
|
||||||
for (uint8_t i = 0; i < 11; i++) {
|
for (uint8_t i = 0; i < 11; i++) {
|
||||||
if (dir.name[i] == ' ')continue;
|
if (dir.name[i] == ' ')continue;
|
||||||
if (i == 8) {
|
if (i == 8) {
|
||||||
pr->write('.');
|
MSerial.write('.');
|
||||||
w++;
|
w++;
|
||||||
}
|
}
|
||||||
pr->write(dir.name[i]);
|
MSerial.write(dir.name[i]);
|
||||||
w++;
|
w++;
|
||||||
}
|
}
|
||||||
if (DIR_IS_SUBDIR(&dir)) {
|
if (DIR_IS_SUBDIR(&dir)) {
|
||||||
pr->write('/');
|
MSerial.write('/');
|
||||||
w++;
|
w++;
|
||||||
}
|
}
|
||||||
if (flags & (LS_DATE | LS_SIZE)) {
|
if (flags & (LS_DATE | LS_SIZE)) {
|
||||||
while (w++ < 14) pr->write(' ');
|
while (w++ < 14) MSerial.write(' ');
|
||||||
}
|
}
|
||||||
// print modify date/time if requested
|
// print modify date/time if requested
|
||||||
if (flags & LS_DATE) {
|
if (flags & LS_DATE) {
|
||||||
pr->write(' ');
|
MSerial.write(' ');
|
||||||
printFatDate(pr, dir.lastWriteDate);
|
printFatDate( dir.lastWriteDate);
|
||||||
pr->write(' ');
|
MSerial.write(' ');
|
||||||
printFatTime(pr, dir.lastWriteTime);
|
printFatTime( dir.lastWriteTime);
|
||||||
}
|
}
|
||||||
// print size if requested
|
// print size if requested
|
||||||
if (!DIR_IS_SUBDIR(&dir) && (flags & LS_SIZE)) {
|
if (!DIR_IS_SUBDIR(&dir) && (flags & LS_SIZE)) {
|
||||||
pr->write(' ');
|
MSerial.write(' ');
|
||||||
pr->print(dir.fileSize);
|
MSerial.print(dir.fileSize);
|
||||||
}
|
}
|
||||||
pr->println();
|
MSerial.println();
|
||||||
return DIR_IS_FILE(&dir) ? 1 : 2;
|
return DIR_IS_FILE(&dir) ? 1 : 2;
|
||||||
}
|
}
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
|
@ -940,17 +929,7 @@ int SdBaseFile::peek() {
|
||||||
if (c >= 0) setpos(&pos);
|
if (c >= 0) setpos(&pos);
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
/** %Print the name field of a directory entry in 8.3 format to Serial.
|
|
||||||
*
|
|
||||||
* \param[in] dir The directory structure containing the name.
|
|
||||||
* \param[in] width Blank fill name if length is less than \a width.
|
|
||||||
* \param[in] printSlash Print '/' after directory names if true.
|
|
||||||
*/
|
|
||||||
void SdBaseFile::printDirName(const dir_t& dir,
|
|
||||||
uint8_t width, bool printSlash) {
|
|
||||||
printDirName(&MSerial, dir, width, printSlash);
|
|
||||||
}
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
/** %Print the name field of a directory entry in 8.3 format.
|
/** %Print the name field of a directory entry in 8.3 format.
|
||||||
* \param[in] pr Print stream for output.
|
* \param[in] pr Print stream for output.
|
||||||
|
@ -958,32 +937,32 @@ void SdBaseFile::printDirName(const dir_t& dir,
|
||||||
* \param[in] width Blank fill name if length is less than \a width.
|
* \param[in] width Blank fill name if length is less than \a width.
|
||||||
* \param[in] printSlash Print '/' after directory names if true.
|
* \param[in] printSlash Print '/' after directory names if true.
|
||||||
*/
|
*/
|
||||||
void SdBaseFile::printDirName(Print* pr, const dir_t& dir,
|
void SdBaseFile::printDirName(const dir_t& dir,
|
||||||
uint8_t width, bool printSlash) {
|
uint8_t width, bool printSlash) {
|
||||||
uint8_t w = 0;
|
uint8_t w = 0;
|
||||||
for (uint8_t i = 0; i < 11; i++) {
|
for (uint8_t i = 0; i < 11; i++) {
|
||||||
if (dir.name[i] == ' ')continue;
|
if (dir.name[i] == ' ')continue;
|
||||||
if (i == 8) {
|
if (i == 8) {
|
||||||
pr->write('.');
|
MSerial.write('.');
|
||||||
w++;
|
w++;
|
||||||
}
|
}
|
||||||
pr->write(dir.name[i]);
|
MSerial.write(dir.name[i]);
|
||||||
w++;
|
w++;
|
||||||
}
|
}
|
||||||
if (DIR_IS_SUBDIR(&dir) && printSlash) {
|
if (DIR_IS_SUBDIR(&dir) && printSlash) {
|
||||||
pr->write('/');
|
MSerial.write('/');
|
||||||
w++;
|
w++;
|
||||||
}
|
}
|
||||||
while (w < width) {
|
while (w < width) {
|
||||||
pr->write(' ');
|
MSerial.write(' ');
|
||||||
w++;
|
w++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
// print uint8_t with width 2
|
// print uint8_t with width 2
|
||||||
static void print2u(Print* pr, uint8_t v) {
|
static void print2u( uint8_t v) {
|
||||||
if (v < 10) pr->write('0');
|
if (v < 10) MSerial.write('0');
|
||||||
pr->print(v, DEC);
|
MSerial.print(v, DEC);
|
||||||
}
|
}
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
/** %Print a directory date field to Serial.
|
/** %Print a directory date field to Serial.
|
||||||
|
@ -992,9 +971,7 @@ static void print2u(Print* pr, uint8_t v) {
|
||||||
*
|
*
|
||||||
* \param[in] fatDate The date field from a directory entry.
|
* \param[in] fatDate The date field from a directory entry.
|
||||||
*/
|
*/
|
||||||
void SdBaseFile::printFatDate(uint16_t fatDate) {
|
|
||||||
printFatDate(&MSerial, fatDate);
|
|
||||||
}
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
/** %Print a directory date field.
|
/** %Print a directory date field.
|
||||||
*
|
*
|
||||||
|
@ -1003,23 +980,14 @@ void SdBaseFile::printFatDate(uint16_t fatDate) {
|
||||||
* \param[in] pr Print stream for output.
|
* \param[in] pr Print stream for output.
|
||||||
* \param[in] fatDate The date field from a directory entry.
|
* \param[in] fatDate The date field from a directory entry.
|
||||||
*/
|
*/
|
||||||
void SdBaseFile::printFatDate(Print* pr, uint16_t fatDate) {
|
void SdBaseFile::printFatDate(uint16_t fatDate) {
|
||||||
pr->print(FAT_YEAR(fatDate));
|
MSerial.print(FAT_YEAR(fatDate));
|
||||||
pr->write('-');
|
MSerial.write('-');
|
||||||
print2u(pr, FAT_MONTH(fatDate));
|
print2u( FAT_MONTH(fatDate));
|
||||||
pr->write('-');
|
MSerial.write('-');
|
||||||
print2u(pr, FAT_DAY(fatDate));
|
print2u( FAT_DAY(fatDate));
|
||||||
}
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
/** %Print a directory time field to Serial.
|
|
||||||
*
|
|
||||||
* Format is hh:mm:ss.
|
|
||||||
*
|
|
||||||
* \param[in] fatTime The time field from a directory entry.
|
|
||||||
*/
|
|
||||||
void SdBaseFile::printFatTime(uint16_t fatTime) {
|
|
||||||
printFatTime(&MSerial, fatTime);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
/** %Print a directory time field.
|
/** %Print a directory time field.
|
||||||
*
|
*
|
||||||
|
@ -1028,12 +996,12 @@ void SdBaseFile::printFatTime(uint16_t fatTime) {
|
||||||
* \param[in] pr Print stream for output.
|
* \param[in] pr Print stream for output.
|
||||||
* \param[in] fatTime The time field from a directory entry.
|
* \param[in] fatTime The time field from a directory entry.
|
||||||
*/
|
*/
|
||||||
void SdBaseFile::printFatTime(Print* pr, uint16_t fatTime) {
|
void SdBaseFile::printFatTime( uint16_t fatTime) {
|
||||||
print2u(pr, FAT_HOUR(fatTime));
|
print2u( FAT_HOUR(fatTime));
|
||||||
pr->write(':');
|
MSerial.write(':');
|
||||||
print2u(pr, FAT_MINUTE(fatTime));
|
print2u( FAT_MINUTE(fatTime));
|
||||||
pr->write(':');
|
MSerial.write(':');
|
||||||
print2u(pr, FAT_SECOND(fatTime));
|
print2u( FAT_SECOND(fatTime));
|
||||||
}
|
}
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
/** Print a file's name to Serial
|
/** Print a file's name to Serial
|
||||||
|
|
|
@ -270,8 +270,7 @@ class SdBaseFile {
|
||||||
bool isRoot() const {
|
bool isRoot() const {
|
||||||
return type_ == FAT_FILE_TYPE_ROOT_FIXED || type_ == FAT_FILE_TYPE_ROOT32;
|
return type_ == FAT_FILE_TYPE_ROOT_FIXED || type_ == FAT_FILE_TYPE_ROOT32;
|
||||||
}
|
}
|
||||||
void ls(Print* pr, uint8_t flags = 0, uint8_t indent = 0);
|
void ls( uint8_t flags = 0, uint8_t indent = 0);
|
||||||
void ls(uint8_t flags = 0);
|
|
||||||
bool mkdir(SdBaseFile* dir, const char* path, bool pFlag = true);
|
bool mkdir(SdBaseFile* dir, const char* path, bool pFlag = true);
|
||||||
// alias for backward compactability
|
// alias for backward compactability
|
||||||
bool makeDir(SdBaseFile* dir, const char* path) {
|
bool makeDir(SdBaseFile* dir, const char* path) {
|
||||||
|
@ -284,9 +283,7 @@ class SdBaseFile {
|
||||||
bool openRoot(SdVolume* vol);
|
bool openRoot(SdVolume* vol);
|
||||||
int peek();
|
int peek();
|
||||||
static void printFatDate(uint16_t fatDate);
|
static void printFatDate(uint16_t fatDate);
|
||||||
static void printFatDate(Print* pr, uint16_t fatDate);
|
static void printFatTime( uint16_t fatTime);
|
||||||
static void printFatTime(uint16_t fatTime);
|
|
||||||
static void printFatTime(Print* pr, uint16_t fatTime);
|
|
||||||
bool printName();
|
bool printName();
|
||||||
int16_t read();
|
int16_t read();
|
||||||
int16_t read(void* buf, uint16_t nbyte);
|
int16_t read(void* buf, uint16_t nbyte);
|
||||||
|
@ -359,7 +356,7 @@ class SdBaseFile {
|
||||||
bool addCluster();
|
bool addCluster();
|
||||||
bool addDirCluster();
|
bool addDirCluster();
|
||||||
dir_t* cacheDirEntry(uint8_t action);
|
dir_t* cacheDirEntry(uint8_t action);
|
||||||
int8_t lsPrintNext(Print *pr, uint8_t flags, uint8_t indent);
|
int8_t lsPrintNext( uint8_t flags, uint8_t indent);
|
||||||
static bool make83Name(const char* str, uint8_t* name, const char** ptr);
|
static bool make83Name(const char* str, uint8_t* name, const char** ptr);
|
||||||
bool mkdir(SdBaseFile* parent, const uint8_t dname[11]);
|
bool mkdir(SdBaseFile* parent, const uint8_t dname[11]);
|
||||||
bool open(SdBaseFile* dirFile, const uint8_t dname[11], uint8_t oflag);
|
bool open(SdBaseFile* dirFile, const uint8_t dname[11], uint8_t oflag);
|
||||||
|
@ -367,9 +364,7 @@ class SdBaseFile {
|
||||||
dir_t* readDirCache();
|
dir_t* readDirCache();
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
// to be deleted
|
// to be deleted
|
||||||
static void printDirName(const dir_t& dir,
|
static void printDirName( const dir_t& dir,
|
||||||
uint8_t width, bool printSlash);
|
|
||||||
static void printDirName(Print* pr, const dir_t& dir,
|
|
||||||
uint8_t width, bool printSlash);
|
uint8_t width, bool printSlash);
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
// Deprecated functions - suppress cpplint warnings with NOLINT comment
|
// Deprecated functions - suppress cpplint warnings with NOLINT comment
|
||||||
|
|
|
@ -43,8 +43,8 @@ int SdFatUtil::FreeRam() {
|
||||||
* \param[in] pr Print object for output.
|
* \param[in] pr Print object for output.
|
||||||
* \param[in] str Pointer to string stored in flash memory.
|
* \param[in] str Pointer to string stored in flash memory.
|
||||||
*/
|
*/
|
||||||
void SdFatUtil::print_P(Print* pr, PGM_P str) {
|
void SdFatUtil::print_P( PGM_P str) {
|
||||||
for (uint8_t c; (c = pgm_read_byte(str)); str++) pr->write(c);
|
for (uint8_t c; (c = pgm_read_byte(str)); str++) MSerial.write(c);
|
||||||
}
|
}
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
/** %Print a string in flash memory followed by a CR/LF.
|
/** %Print a string in flash memory followed by a CR/LF.
|
||||||
|
@ -52,9 +52,9 @@ void SdFatUtil::print_P(Print* pr, PGM_P str) {
|
||||||
* \param[in] pr Print object for output.
|
* \param[in] pr Print object for output.
|
||||||
* \param[in] str Pointer to string stored in flash memory.
|
* \param[in] str Pointer to string stored in flash memory.
|
||||||
*/
|
*/
|
||||||
void SdFatUtil::println_P(Print* pr, PGM_P str) {
|
void SdFatUtil::println_P( PGM_P str) {
|
||||||
print_P(pr, str);
|
print_P( str);
|
||||||
pr->println();
|
MSerial.println();
|
||||||
}
|
}
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
/** %Print a string in flash memory to Serial.
|
/** %Print a string in flash memory to Serial.
|
||||||
|
@ -62,7 +62,7 @@ void SdFatUtil::println_P(Print* pr, PGM_P str) {
|
||||||
* \param[in] str Pointer to string stored in flash memory.
|
* \param[in] str Pointer to string stored in flash memory.
|
||||||
*/
|
*/
|
||||||
void SdFatUtil::SerialPrint_P(PGM_P str) {
|
void SdFatUtil::SerialPrint_P(PGM_P str) {
|
||||||
print_P(&MSerial, str);
|
print_P(str);
|
||||||
}
|
}
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
/** %Print a string in flash memory to Serial followed by a CR/LF.
|
/** %Print a string in flash memory to Serial followed by a CR/LF.
|
||||||
|
@ -70,5 +70,5 @@ void SdFatUtil::SerialPrint_P(PGM_P str) {
|
||||||
* \param[in] str Pointer to string stored in flash memory.
|
* \param[in] str Pointer to string stored in flash memory.
|
||||||
*/
|
*/
|
||||||
void SdFatUtil::SerialPrintln_P(PGM_P str) {
|
void SdFatUtil::SerialPrintln_P(PGM_P str) {
|
||||||
println_P(&MSerial, str);
|
println_P( str);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,48 +1,48 @@
|
||||||
/* Arduino SdFat Library
|
/* Arduino SdFat Library
|
||||||
* Copyright (C) 2008 by William Greiman
|
* Copyright (C) 2008 by William Greiman
|
||||||
*
|
*
|
||||||
* This file is part of the Arduino SdFat Library
|
* This file is part of the Arduino SdFat Library
|
||||||
*
|
*
|
||||||
* This Library is free software: you can redistribute it and/or modify
|
* This Library is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
* (at your option) any later version.
|
* (at your option) any later version.
|
||||||
*
|
*
|
||||||
* This Library is distributed in the hope that it will be useful,
|
* This Library is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
|
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with the Arduino SdFat Library. If not, see
|
* along with the Arduino SdFat Library. If not, see
|
||||||
* <http://www.gnu.org/licenses/>.
|
* <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
#ifndef SdFatUtil_h
|
#ifndef SdFatUtil_h
|
||||||
#define SdFatUtil_h
|
#define SdFatUtil_h
|
||||||
/**
|
/**
|
||||||
* \file
|
* \file
|
||||||
* \brief Useful utility functions.
|
* \brief Useful utility functions.
|
||||||
*/
|
*/
|
||||||
#include <avr/pgmspace.h>
|
#include <avr/pgmspace.h>
|
||||||
#if ARDUINO < 100
|
#if ARDUINO < 100
|
||||||
#define HardwareSerial_h // trick to disable the standard HWserial
|
#define HardwareSerial_h // trick to disable the standard HWserial
|
||||||
#include <WProgram.h>
|
#include <WProgram.h>
|
||||||
#include "MarlinSerial.h"
|
#include "MarlinSerial.h"
|
||||||
#else // ARDUINO
|
#else // ARDUINO
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#endif // ARDUINO
|
#endif // ARDUINO
|
||||||
/** Store and print a string in flash memory.*/
|
/** Store and print a string in flash memory.*/
|
||||||
#define PgmPrint(x) SerialPrint_P(PSTR(x))
|
#define PgmPrint(x) SerialPrint_P(PSTR(x))
|
||||||
/** Store and print a string in flash memory followed by a CR/LF.*/
|
/** Store and print a string in flash memory followed by a CR/LF.*/
|
||||||
#define PgmPrintln(x) SerialPrintln_P(PSTR(x))
|
#define PgmPrintln(x) SerialPrintln_P(PSTR(x))
|
||||||
|
|
||||||
namespace SdFatUtil {
|
namespace SdFatUtil {
|
||||||
int FreeRam();
|
int FreeRam();
|
||||||
void print_P(Print* pr, PGM_P str);
|
void print_P( PGM_P str);
|
||||||
void println_P(Print* pr, PGM_P str);
|
void println_P( PGM_P str);
|
||||||
void SerialPrint_P(PGM_P str);
|
void SerialPrint_P(PGM_P str);
|
||||||
void SerialPrintln_P(PGM_P str);
|
void SerialPrintln_P(PGM_P str);
|
||||||
}
|
}
|
||||||
|
|
||||||
using namespace SdFatUtil; // NOLINT
|
using namespace SdFatUtil; // NOLINT
|
||||||
#endif // #define SdFatUtil_h
|
#endif // #define SdFatUtil_h
|
||||||
|
|
Reference in a new issue