Browse Source

get rid of indirect ringbuffer calls, made some inlines, removed virtual and streaming class requirements.

Bernhard 13 years ago
parent
commit
dd5ca68c87
6 changed files with 385 additions and 187 deletions
  1. 202
    38
      Marlin/MarlinSerial.cpp
  2. 83
    12
      Marlin/MarlinSerial.h
  3. 42
    74
      Marlin/SdBaseFile.cpp
  4. 4
    9
      Marlin/SdBaseFile.h
  5. 7
    7
      Marlin/SdFatUtil.cpp
  6. 47
    47
      Marlin/SdFatUtil.h

+ 202
- 38
Marlin/MarlinSerial.cpp View File

33
 
33
 
34
 #include "MarlinSerial.h"
34
 #include "MarlinSerial.h"
35
 
35
 
36
-// Define constants and variables for buffering incoming serial data.  We're
37
-// using a ring buffer (I think), in which rx_buffer_head is the index of the
38
-// location to which to write the next incoming character and rx_buffer_tail
39
-// is the index of the location from which to read.
40
-#define RX_BUFFER_SIZE 128
41
 
36
 
42
-struct ring_buffer
43
-{
44
-  unsigned char buffer[RX_BUFFER_SIZE];
45
-  int head;
46
-  int tail;
47
-};
37
+
48
 
38
 
49
 #if defined(UBRRH) || defined(UBRR0H)
39
 #if defined(UBRRH) || defined(UBRR0H)
50
   ring_buffer rx_buffer  =  { { 0 }, 0, 0 };
40
   ring_buffer rx_buffer  =  { { 0 }, 0, 0 };
51
 #endif
41
 #endif
52
 
42
 
53
 
43
 
54
-inline void store_char(unsigned char c, ring_buffer *rx_buffer)
44
+inline void store_char(unsigned char c)
55
 {
45
 {
56
-  int i = (unsigned int)(rx_buffer->head + 1) % RX_BUFFER_SIZE;
46
+  int i = (unsigned int)(rx_buffer.head + 1) % RX_BUFFER_SIZE;
57
 
47
 
58
   // if we should be storing the received character into the location
48
   // if we should be storing the received character into the location
59
   // just before the tail (meaning that the head would advance to the
49
   // just before the tail (meaning that the head would advance to the
60
   // current location of the tail), we're about to overflow the buffer
50
   // current location of the tail), we're about to overflow the buffer
61
   // and so we don't write the character or advance the head.
51
   // and so we don't write the character or advance the head.
62
-  if (i != rx_buffer->tail) {
63
-    rx_buffer->buffer[rx_buffer->head] = c;
64
-    rx_buffer->head = i;
52
+  if (i != rx_buffer.tail) {
53
+    rx_buffer.buffer[rx_buffer.head] = c;
54
+    rx_buffer.head = i;
65
   }
55
   }
66
 }
56
 }
67
 
57
 
79
   #else
69
   #else
80
     #error UDR not defined
70
     #error UDR not defined
81
   #endif
71
   #endif
82
-    store_char(c, &rx_buffer);
72
+    store_char(c);
83
   }
73
   }
84
 #endif
74
 #endif
85
 
75
 
86
 // Constructors ////////////////////////////////////////////////////////////////
76
 // Constructors ////////////////////////////////////////////////////////////////
87
 
77
 
88
-MarlinSerial::MarlinSerial(ring_buffer *rx_buffer,
78
+MarlinSerial::MarlinSerial(
89
   volatile uint8_t *ubrrh, volatile uint8_t *ubrrl,
79
   volatile uint8_t *ubrrh, volatile uint8_t *ubrrl,
90
   volatile uint8_t *ucsra, volatile uint8_t *ucsrb,
80
   volatile uint8_t *ucsra, volatile uint8_t *ucsrb,
91
   volatile uint8_t *udr,
81
   volatile uint8_t *udr,
92
   uint8_t rxen, uint8_t txen, uint8_t rxcie, uint8_t udre, uint8_t u2x)
82
   uint8_t rxen, uint8_t txen, uint8_t rxcie, uint8_t udre, uint8_t u2x)
93
 {
83
 {
94
-  _rx_buffer = rx_buffer;
95
   _ubrrh = ubrrh;
84
   _ubrrh = ubrrh;
96
   _ubrrl = ubrrl;
85
   _ubrrl = ubrrl;
97
   _ucsra = ucsra;
86
   _ucsra = ucsra;
144
   cbi(*_ucsrb, _rxcie);  
133
   cbi(*_ucsrb, _rxcie);  
145
 }
134
 }
146
 
135
 
147
-int MarlinSerial::available(void)
148
-{
149
-  return (unsigned int)(RX_BUFFER_SIZE + _rx_buffer->head - _rx_buffer->tail) % RX_BUFFER_SIZE;
150
-}
136
+
151
 
137
 
152
 int MarlinSerial::peek(void)
138
 int MarlinSerial::peek(void)
153
 {
139
 {
154
-  if (_rx_buffer->head == _rx_buffer->tail) {
140
+  if (rx_buffer.head == rx_buffer.tail) {
155
     return -1;
141
     return -1;
156
   } else {
142
   } else {
157
-    return _rx_buffer->buffer[_rx_buffer->tail];
143
+    return rx_buffer.buffer[rx_buffer.tail];
158
   }
144
   }
159
 }
145
 }
160
 
146
 
161
 int MarlinSerial::read(void)
147
 int MarlinSerial::read(void)
162
 {
148
 {
163
   // if the head isn't ahead of the tail, we don't have any characters
149
   // if the head isn't ahead of the tail, we don't have any characters
164
-  if (_rx_buffer->head == _rx_buffer->tail) {
150
+  if (rx_buffer.head == rx_buffer.tail) {
165
     return -1;
151
     return -1;
166
   } else {
152
   } else {
167
-    unsigned char c = _rx_buffer->buffer[_rx_buffer->tail];
168
-    _rx_buffer->tail = (unsigned int)(_rx_buffer->tail + 1) % RX_BUFFER_SIZE;
153
+    unsigned char c = rx_buffer.buffer[rx_buffer.tail];
154
+    rx_buffer.tail = (unsigned int)(rx_buffer.tail + 1) % RX_BUFFER_SIZE;
169
     return c;
155
     return c;
170
   }
156
   }
171
 }
157
 }
181
   // the value to rx_buffer_tail; the previous value of rx_buffer_head
167
   // the value to rx_buffer_tail; the previous value of rx_buffer_head
182
   // may be written to rx_buffer_tail, making it appear as if the buffer
168
   // may be written to rx_buffer_tail, making it appear as if the buffer
183
   // were full, not empty.
169
   // were full, not empty.
184
-  _rx_buffer->head = _rx_buffer->tail;
170
+  rx_buffer.head = rx_buffer.tail;
185
 }
171
 }
186
 
172
 
187
-void MarlinSerial::write(uint8_t c)
173
+
174
+
175
+
176
+/// imports from print.h
177
+/* default implementation: may be overridden */
178
+void MarlinSerial::write(const char *str)
188
 {
179
 {
189
-  while (!((*_ucsra) & (1 << _udre)))
190
-    ;
180
+  while (*str)
181
+    write(*str++);
182
+}
191
 
183
 
192
-  *_udr = c;
184
+/* default implementation: may be overridden */
185
+void MarlinSerial::write(const uint8_t *buffer, size_t size)
186
+{
187
+  while (size--)
188
+    write(*buffer++);
193
 }
189
 }
194
 
190
 
195
-void MarlinSerial::checkRx()
191
+void MarlinSerial::print(const String &s)
196
 {
192
 {
197
-  if((UCSR0A & (1<<RXC0)) != 0) {
198
-    unsigned char c  =  UDR0;
199
-    store_char(c, &rx_buffer);
193
+  for (int i = 0; i < s.length(); i++) {
194
+    write(s[i]);
200
   }
195
   }
201
 }
196
 }
202
 
197
 
198
+void MarlinSerial::print(const char str[])
199
+{
200
+  write(str);
201
+}
202
+
203
+void MarlinSerial::print(char c, int base)
204
+{
205
+  print((long) c, base);
206
+}
207
+
208
+void MarlinSerial::print(unsigned char b, int base)
209
+{
210
+  print((unsigned long) b, base);
211
+}
212
+
213
+void MarlinSerial::print(int n, int base)
214
+{
215
+  print((long) n, base);
216
+}
217
+
218
+void MarlinSerial::print(unsigned int n, int base)
219
+{
220
+  print((unsigned long) n, base);
221
+}
222
+
223
+void MarlinSerial::print(long n, int base)
224
+{
225
+  if (base == 0) {
226
+    write(n);
227
+  } else if (base == 10) {
228
+    if (n < 0) {
229
+      print('-');
230
+      n = -n;
231
+    }
232
+    printNumber(n, 10);
233
+  } else {
234
+    printNumber(n, base);
235
+  }
236
+}
237
+
238
+void MarlinSerial::print(unsigned long n, int base)
239
+{
240
+  if (base == 0) write(n);
241
+  else printNumber(n, base);
242
+}
243
+
244
+void MarlinSerial::print(double n, int digits)
245
+{
246
+  printFloat(n, digits);
247
+}
248
+
249
+void MarlinSerial::println(void)
250
+{
251
+  print('\r');
252
+  print('\n');  
253
+}
254
+
255
+void MarlinSerial::println(const String &s)
256
+{
257
+  print(s);
258
+  println();
259
+}
260
+
261
+void MarlinSerial::println(const char c[])
262
+{
263
+  print(c);
264
+  println();
265
+}
266
+
267
+void MarlinSerial::println(char c, int base)
268
+{
269
+  print(c, base);
270
+  println();
271
+}
272
+
273
+void MarlinSerial::println(unsigned char b, int base)
274
+{
275
+  print(b, base);
276
+  println();
277
+}
278
+
279
+void MarlinSerial::println(int n, int base)
280
+{
281
+  print(n, base);
282
+  println();
283
+}
284
+
285
+void MarlinSerial::println(unsigned int n, int base)
286
+{
287
+  print(n, base);
288
+  println();
289
+}
290
+
291
+void MarlinSerial::println(long n, int base)
292
+{
293
+  print(n, base);
294
+  println();
295
+}
296
+
297
+void MarlinSerial::println(unsigned long n, int base)
298
+{
299
+  print(n, base);
300
+  println();
301
+}
302
+
303
+void MarlinSerial::println(double n, int digits)
304
+{
305
+  print(n, digits);
306
+  println();
307
+}
308
+
309
+// Private Methods /////////////////////////////////////////////////////////////
310
+
311
+void MarlinSerial::printNumber(unsigned long n, uint8_t base)
312
+{
313
+  unsigned char buf[8 * sizeof(long)]; // Assumes 8-bit chars. 
314
+  unsigned long i = 0;
315
+
316
+  if (n == 0) {
317
+    print('0');
318
+    return;
319
+  } 
320
+
321
+  while (n > 0) {
322
+    buf[i++] = n % base;
323
+    n /= base;
324
+  }
325
+
326
+  for (; i > 0; i--)
327
+    print((char) (buf[i - 1] < 10 ?
328
+      '0' + buf[i - 1] :
329
+      'A' + buf[i - 1] - 10));
330
+}
331
+
332
+void MarlinSerial::printFloat(double number, uint8_t digits) 
333
+{ 
334
+  // Handle negative numbers
335
+  if (number < 0.0)
336
+  {
337
+     print('-');
338
+     number = -number;
339
+  }
340
+
341
+  // Round correctly so that print(1.999, 2) prints as "2.00"
342
+  double rounding = 0.5;
343
+  for (uint8_t i=0; i<digits; ++i)
344
+    rounding /= 10.0;
345
+  
346
+  number += rounding;
347
+
348
+  // Extract the integer part of the number and print it
349
+  unsigned long int_part = (unsigned long)number;
350
+  double remainder = number - (double)int_part;
351
+  print(int_part);
352
+
353
+  // Print the decimal point, but only if there are digits beyond
354
+  if (digits > 0)
355
+    print("."); 
356
+
357
+  // Extract digits from the remainder one at a time
358
+  while (digits-- > 0)
359
+  {
360
+    remainder *= 10.0;
361
+    int toPrint = int(remainder);
362
+    print(toPrint);
363
+    remainder -= toPrint; 
364
+  } 
365
+}
366
+
203
 // Preinstantiate Objects //////////////////////////////////////////////////////
367
 // Preinstantiate Objects //////////////////////////////////////////////////////
204
 
368
 
205
 #if defined(UBRR0H) && defined(UBRR0L)
369
 #if defined(UBRR0H) && defined(UBRR0L)
206
-  MarlinSerial MSerial(&rx_buffer, &UBRR0H, &UBRR0L, &UCSR0A, &UCSR0B, &UDR0, RXEN0, TXEN0, RXCIE0, UDRE0, U2X0);
370
+  MarlinSerial MSerial( &UBRR0H, &UBRR0L, &UCSR0A, &UCSR0B, &UDR0, RXEN0, TXEN0, RXCIE0, UDRE0, U2X0);
207
 #else
371
 #else
208
   #error no serial port defined  (port 0)
372
   #error no serial port defined  (port 0)
209
 #endif
373
 #endif

+ 83
- 12
Marlin/MarlinSerial.h View File

23
 #define MarlinSerial_h
23
 #define MarlinSerial_h
24
 
24
 
25
 #include <inttypes.h>
25
 #include <inttypes.h>
26
+#include <Stream.h>
26
 
27
 
27
-#include "Stream.h"
28
 
28
 
29
-struct ring_buffer;
29
+// Define constants and variables for buffering incoming serial data.  We're
30
+// using a ring buffer (I think), in which rx_buffer_head is the index of the
31
+// location to which to write the next incoming character and rx_buffer_tail
32
+// is the index of the location from which to read.
33
+#define RX_BUFFER_SIZE 128
30
 
34
 
31
-class MarlinSerial : public Stream
35
+
36
+struct ring_buffer
37
+{
38
+  unsigned char buffer[RX_BUFFER_SIZE];
39
+  int head;
40
+  int tail;
41
+};
42
+
43
+#if defined(UBRRH) || defined(UBRR0H)
44
+  extern ring_buffer rx_buffer;
45
+#endif
46
+
47
+class MarlinSerial //: public Stream
32
 {
48
 {
33
   private:
49
   private:
34
-    ring_buffer *_rx_buffer;
35
     volatile uint8_t *_ubrrh;
50
     volatile uint8_t *_ubrrh;
36
     volatile uint8_t *_ubrrl;
51
     volatile uint8_t *_ubrrl;
37
     volatile uint8_t *_ucsra;
52
     volatile uint8_t *_ucsra;
43
     uint8_t _udre;
58
     uint8_t _udre;
44
     uint8_t _u2x;
59
     uint8_t _u2x;
45
   public:
60
   public:
46
-    MarlinSerial(ring_buffer *rx_buffer,
61
+    MarlinSerial(
47
       volatile uint8_t *ubrrh, volatile uint8_t *ubrrl,
62
       volatile uint8_t *ubrrh, volatile uint8_t *ubrrl,
48
       volatile uint8_t *ucsra, volatile uint8_t *ucsrb,
63
       volatile uint8_t *ucsra, volatile uint8_t *ucsrb,
49
       volatile uint8_t *udr,
64
       volatile uint8_t *udr,
50
       uint8_t rxen, uint8_t txen, uint8_t rxcie, uint8_t udre, uint8_t u2x);
65
       uint8_t rxen, uint8_t txen, uint8_t rxcie, uint8_t udre, uint8_t u2x);
51
     void begin(long);
66
     void begin(long);
52
     void end();
67
     void end();
53
-    virtual int available(void);
54
-    virtual int peek(void);
55
-    virtual int read(void);
56
-    virtual void flush(void);
57
-    virtual void write(uint8_t);
58
-    virtual void checkRx(void);
59
-    using Print::write; // pull in write(str) and write(buf, size) from Print
68
+    inline int available(void)
69
+    {
70
+      return (unsigned int)(RX_BUFFER_SIZE + rx_buffer.head - rx_buffer.tail) % RX_BUFFER_SIZE;
71
+    }
72
+    int peek(void);
73
+    int read(void);
74
+    void flush(void);
75
+    inline void write(uint8_t c)
76
+    {
77
+      while (!((*_ucsra) & (1 << _udre)))
78
+        ;
79
+
80
+      *_udr = c;
81
+    }
82
+    
83
+    
84
+    inline void checkRx(void)
85
+    {
86
+      if((UCSR0A & (1<<RXC0)) != 0) {
87
+        unsigned char c  =  UDR0;
88
+        int i = (unsigned int)(rx_buffer.head + 1) % RX_BUFFER_SIZE;
89
+
90
+        // if we should be storing the received character into the location
91
+        // just before the tail (meaning that the head would advance to the
92
+        // current location of the tail), we're about to overflow the buffer
93
+        // and so we don't write the character or advance the head.
94
+        if (i != rx_buffer.tail) {
95
+          rx_buffer.buffer[rx_buffer.head] = c;
96
+          rx_buffer.head = i;
97
+        }
98
+      }
99
+    }
100
+    
101
+    
102
+    private:
103
+    void printNumber(unsigned long, uint8_t);
104
+    void printFloat(double, uint8_t);
105
+    
106
+    
107
+  public:
108
+    void write(const char *str);
109
+    void write( const uint8_t *buffer, size_t size);
110
+    
111
+    void print(const String &);
112
+    void print(const char[]);
113
+    void print(char, int = BYTE);
114
+    void print(unsigned char, int = BYTE);
115
+    void print(int, int = DEC);
116
+    void print(unsigned int, int = DEC);
117
+    void print(long, int = DEC);
118
+    void print(unsigned long, int = DEC);
119
+    void print(double, int = 2);
120
+
121
+    void println(const String &s);
122
+    void println(const char[]);
123
+    void println(char, int = BYTE);
124
+    void println(unsigned char, int = BYTE);
125
+    void println(int, int = DEC);
126
+    void println(unsigned int, int = DEC);
127
+    void println(long, int = DEC);
128
+    void println(unsigned long, int = DEC);
129
+    void println(double, int = 2);
130
+    void println(void);
60
 };
131
 };
61
 
132
 
62
 #if defined(UBRRH) || defined(UBRR0H)
133
 #if defined(UBRRH) || defined(UBRR0H)

+ 42
- 74
Marlin/SdBaseFile.cpp View File

17
  * along with the Arduino SdFat Library.  If not, see
17
  * along with the Arduino SdFat Library.  If not, see
18
  * <http://www.gnu.org/licenses/>.
18
  * <http://www.gnu.org/licenses/>.
19
  */
19
  */
20
+
21
+#define SERIAL MSerial
20
 #include "SdBaseFile.h"
22
 #include "SdBaseFile.h"
21
 //------------------------------------------------------------------------------
23
 //------------------------------------------------------------------------------
22
 // pointer to cwd directory
24
 // pointer to cwd directory
294
   pos->position = curPosition_;
296
   pos->position = curPosition_;
295
   pos->cluster = curCluster_;
297
   pos->cluster = curCluster_;
296
 }
298
 }
297
-//------------------------------------------------------------------------------
298
-/** List directory contents to Serial.
299
- *
300
- * \param[in] flags The inclusive OR of
301
- *
302
- * LS_DATE - %Print file modification date
303
- *
304
- * LS_SIZE - %Print file size.
305
- *
306
- * LS_R - Recursive list of subdirectories.
307
- */
308
-void SdBaseFile::ls(uint8_t flags) {
309
-  ls(&MSerial, flags, 0);
310
-}
299
+
311
 //------------------------------------------------------------------------------
300
 //------------------------------------------------------------------------------
312
 /** List directory contents.
301
 /** List directory contents.
313
  *
302
  *
324
  * \param[in] indent Amount of space before file name. Used for recursive
313
  * \param[in] indent Amount of space before file name. Used for recursive
325
  * list to indicate subdirectory level.
314
  * list to indicate subdirectory level.
326
  */
315
  */
327
-void SdBaseFile::ls(Print* pr, uint8_t flags, uint8_t indent) {
316
+void SdBaseFile::ls(uint8_t flags, uint8_t indent) {
328
   rewind();
317
   rewind();
329
   int8_t status;
318
   int8_t status;
330
-  while ((status = lsPrintNext(pr, flags, indent))) {
319
+  while ((status = lsPrintNext( flags, indent))) {
331
     if (status > 1 && (flags & LS_R)) {
320
     if (status > 1 && (flags & LS_R)) {
332
       uint16_t index = curPosition()/32 - 1;
321
       uint16_t index = curPosition()/32 - 1;
333
       SdBaseFile s;
322
       SdBaseFile s;
334
-      if (s.open(this, index, O_READ)) s.ls(pr, flags, indent + 2);
323
+      if (s.open(this, index, O_READ)) s.ls( flags, indent + 2);
335
       seekSet(32 * (index + 1));
324
       seekSet(32 * (index + 1));
336
     }
325
     }
337
   }
326
   }
339
 //------------------------------------------------------------------------------
328
 //------------------------------------------------------------------------------
340
 // saves 32 bytes on stack for ls recursion
329
 // saves 32 bytes on stack for ls recursion
341
 // return 0 - EOF, 1 - normal file, or 2 - directory
330
 // return 0 - EOF, 1 - normal file, or 2 - directory
342
-int8_t SdBaseFile::lsPrintNext(Print *pr, uint8_t flags, uint8_t indent) {
331
+int8_t SdBaseFile::lsPrintNext( uint8_t flags, uint8_t indent) {
343
   dir_t dir;
332
   dir_t dir;
344
   uint8_t w = 0;
333
   uint8_t w = 0;
345
 
334
 
352
       && DIR_IS_FILE_OR_SUBDIR(&dir)) break;
341
       && DIR_IS_FILE_OR_SUBDIR(&dir)) break;
353
   }
342
   }
354
   // indent for dir level
343
   // indent for dir level
355
-  for (uint8_t i = 0; i < indent; i++) pr->write(' ');
344
+  for (uint8_t i = 0; i < indent; i++) MSerial.write(' ');
356
 
345
 
357
   // print name
346
   // print name
358
   for (uint8_t i = 0; i < 11; i++) {
347
   for (uint8_t i = 0; i < 11; i++) {
359
     if (dir.name[i] == ' ')continue;
348
     if (dir.name[i] == ' ')continue;
360
     if (i == 8) {
349
     if (i == 8) {
361
-      pr->write('.');
350
+      MSerial.write('.');
362
       w++;
351
       w++;
363
     }
352
     }
364
-    pr->write(dir.name[i]);
353
+    MSerial.write(dir.name[i]);
365
     w++;
354
     w++;
366
   }
355
   }
367
   if (DIR_IS_SUBDIR(&dir)) {
356
   if (DIR_IS_SUBDIR(&dir)) {
368
-    pr->write('/');
357
+    MSerial.write('/');
369
     w++;
358
     w++;
370
   }
359
   }
371
   if (flags & (LS_DATE | LS_SIZE)) {
360
   if (flags & (LS_DATE | LS_SIZE)) {
372
-    while (w++ < 14) pr->write(' ');
361
+    while (w++ < 14) MSerial.write(' ');
373
   }
362
   }
374
   // print modify date/time if requested
363
   // print modify date/time if requested
375
   if (flags & LS_DATE) {
364
   if (flags & LS_DATE) {
376
-    pr->write(' ');
377
-    printFatDate(pr, dir.lastWriteDate);
378
-    pr->write(' ');
379
-    printFatTime(pr, dir.lastWriteTime);
365
+    MSerial.write(' ');
366
+    printFatDate( dir.lastWriteDate);
367
+    MSerial.write(' ');
368
+    printFatTime( dir.lastWriteTime);
380
   }
369
   }
381
   // print size if requested
370
   // print size if requested
382
   if (!DIR_IS_SUBDIR(&dir) && (flags & LS_SIZE)) {
371
   if (!DIR_IS_SUBDIR(&dir) && (flags & LS_SIZE)) {
383
-    pr->write(' ');
384
-    pr->print(dir.fileSize);
372
+    MSerial.write(' ');
373
+    MSerial.print(dir.fileSize);
385
   }
374
   }
386
-  pr->println();
375
+  MSerial.println();
387
   return DIR_IS_FILE(&dir) ? 1 : 2;
376
   return DIR_IS_FILE(&dir) ? 1 : 2;
388
 }
377
 }
389
 //------------------------------------------------------------------------------
378
 //------------------------------------------------------------------------------
940
   if (c >= 0) setpos(&pos);
929
   if (c >= 0) setpos(&pos);
941
   return c;
930
   return c;
942
 }
931
 }
943
-//------------------------------------------------------------------------------
944
-/** %Print the name field of a directory entry in 8.3 format to Serial.
945
- *
946
- * \param[in] dir The directory structure containing the name.
947
- * \param[in] width Blank fill name if length is less than \a width.
948
- * \param[in] printSlash Print '/' after directory names if true.
949
- */
950
-void SdBaseFile::printDirName(const dir_t& dir,
951
-  uint8_t width, bool printSlash) {
952
-  printDirName(&MSerial, dir, width, printSlash);
953
-}
932
+
954
 //------------------------------------------------------------------------------
933
 //------------------------------------------------------------------------------
955
 /** %Print the name field of a directory entry in 8.3 format.
934
 /** %Print the name field of a directory entry in 8.3 format.
956
  * \param[in] pr Print stream for output.
935
  * \param[in] pr Print stream for output.
958
  * \param[in] width Blank fill name if length is less than \a width.
937
  * \param[in] width Blank fill name if length is less than \a width.
959
  * \param[in] printSlash Print '/' after directory names if true.
938
  * \param[in] printSlash Print '/' after directory names if true.
960
  */
939
  */
961
-void SdBaseFile::printDirName(Print* pr, const dir_t& dir,
940
+void SdBaseFile::printDirName(const dir_t& dir,
962
   uint8_t width, bool printSlash) {
941
   uint8_t width, bool printSlash) {
963
   uint8_t w = 0;
942
   uint8_t w = 0;
964
   for (uint8_t i = 0; i < 11; i++) {
943
   for (uint8_t i = 0; i < 11; i++) {
965
     if (dir.name[i] == ' ')continue;
944
     if (dir.name[i] == ' ')continue;
966
     if (i == 8) {
945
     if (i == 8) {
967
-      pr->write('.');
946
+      MSerial.write('.');
968
       w++;
947
       w++;
969
     }
948
     }
970
-    pr->write(dir.name[i]);
949
+    MSerial.write(dir.name[i]);
971
     w++;
950
     w++;
972
   }
951
   }
973
   if (DIR_IS_SUBDIR(&dir) && printSlash) {
952
   if (DIR_IS_SUBDIR(&dir) && printSlash) {
974
-    pr->write('/');
953
+    MSerial.write('/');
975
     w++;
954
     w++;
976
   }
955
   }
977
   while (w < width) {
956
   while (w < width) {
978
-    pr->write(' ');
957
+    MSerial.write(' ');
979
     w++;
958
     w++;
980
   }
959
   }
981
 }
960
 }
982
 //------------------------------------------------------------------------------
961
 //------------------------------------------------------------------------------
983
 // print uint8_t with width 2
962
 // print uint8_t with width 2
984
-static void print2u(Print* pr, uint8_t v) {
985
-  if (v < 10) pr->write('0');
986
-  pr->print(v, DEC);
963
+static void print2u( uint8_t v) {
964
+  if (v < 10) MSerial.write('0');
965
+  MSerial.print(v, DEC);
987
 }
966
 }
988
 //------------------------------------------------------------------------------
967
 //------------------------------------------------------------------------------
989
 /** %Print a directory date field to Serial.
968
 /** %Print a directory date field to Serial.
992
  *
971
  *
993
  * \param[in] fatDate The date field from a directory entry.
972
  * \param[in] fatDate The date field from a directory entry.
994
  */
973
  */
995
-void SdBaseFile::printFatDate(uint16_t fatDate) {
996
-  printFatDate(&MSerial, fatDate);
997
-}
974
+
998
 //------------------------------------------------------------------------------
975
 //------------------------------------------------------------------------------
999
 /** %Print a directory date field.
976
 /** %Print a directory date field.
1000
  *
977
  *
1003
  * \param[in] pr Print stream for output.
980
  * \param[in] pr Print stream for output.
1004
  * \param[in] fatDate The date field from a directory entry.
981
  * \param[in] fatDate The date field from a directory entry.
1005
  */
982
  */
1006
-void SdBaseFile::printFatDate(Print* pr, uint16_t fatDate) {
1007
-  pr->print(FAT_YEAR(fatDate));
1008
-  pr->write('-');
1009
-  print2u(pr, FAT_MONTH(fatDate));
1010
-  pr->write('-');
1011
-  print2u(pr, FAT_DAY(fatDate));
1012
-}
1013
-//------------------------------------------------------------------------------
1014
-/** %Print a directory time field to Serial.
1015
- *
1016
- * Format is hh:mm:ss.
1017
- *
1018
- * \param[in] fatTime The time field from a directory entry.
1019
- */
1020
-void SdBaseFile::printFatTime(uint16_t fatTime) {
1021
-  printFatTime(&MSerial, fatTime);
983
+void SdBaseFile::printFatDate(uint16_t fatDate) {
984
+  MSerial.print(FAT_YEAR(fatDate));
985
+  MSerial.write('-');
986
+  print2u( FAT_MONTH(fatDate));
987
+  MSerial.write('-');
988
+  print2u( FAT_DAY(fatDate));
1022
 }
989
 }
990
+
1023
 //------------------------------------------------------------------------------
991
 //------------------------------------------------------------------------------
1024
 /** %Print a directory time field.
992
 /** %Print a directory time field.
1025
  *
993
  *
1028
  * \param[in] pr Print stream for output.
996
  * \param[in] pr Print stream for output.
1029
  * \param[in] fatTime The time field from a directory entry.
997
  * \param[in] fatTime The time field from a directory entry.
1030
  */
998
  */
1031
-void SdBaseFile::printFatTime(Print* pr, uint16_t fatTime) {
1032
-  print2u(pr, FAT_HOUR(fatTime));
1033
-  pr->write(':');
1034
-  print2u(pr, FAT_MINUTE(fatTime));
1035
-  pr->write(':');
1036
-  print2u(pr, FAT_SECOND(fatTime));
999
+void SdBaseFile::printFatTime( uint16_t fatTime) {
1000
+  print2u( FAT_HOUR(fatTime));
1001
+  MSerial.write(':');
1002
+  print2u( FAT_MINUTE(fatTime));
1003
+  MSerial.write(':');
1004
+  print2u( FAT_SECOND(fatTime));
1037
 }
1005
 }
1038
 //------------------------------------------------------------------------------
1006
 //------------------------------------------------------------------------------
1039
 /** Print a file's name to Serial
1007
 /** Print a file's name to Serial

+ 4
- 9
Marlin/SdBaseFile.h View File

270
   bool isRoot() const {
270
   bool isRoot() const {
271
     return type_ == FAT_FILE_TYPE_ROOT_FIXED || type_ == FAT_FILE_TYPE_ROOT32;
271
     return type_ == FAT_FILE_TYPE_ROOT_FIXED || type_ == FAT_FILE_TYPE_ROOT32;
272
   }
272
   }
273
-  void ls(Print* pr, uint8_t flags = 0, uint8_t indent = 0);
274
-  void ls(uint8_t flags = 0);
273
+  void ls( uint8_t flags = 0, uint8_t indent = 0);
275
   bool mkdir(SdBaseFile* dir, const char* path, bool pFlag = true);
274
   bool mkdir(SdBaseFile* dir, const char* path, bool pFlag = true);
276
   // alias for backward compactability
275
   // alias for backward compactability
277
   bool makeDir(SdBaseFile* dir, const char* path) {
276
   bool makeDir(SdBaseFile* dir, const char* path) {
284
   bool openRoot(SdVolume* vol);
283
   bool openRoot(SdVolume* vol);
285
   int peek();
284
   int peek();
286
   static void printFatDate(uint16_t fatDate);
285
   static void printFatDate(uint16_t fatDate);
287
-  static void printFatDate(Print* pr, uint16_t fatDate);
288
-  static void printFatTime(uint16_t fatTime);
289
-  static void printFatTime(Print* pr, uint16_t fatTime);
286
+  static void printFatTime( uint16_t fatTime);
290
   bool printName();
287
   bool printName();
291
   int16_t read();
288
   int16_t read();
292
   int16_t read(void* buf, uint16_t nbyte);
289
   int16_t read(void* buf, uint16_t nbyte);
359
   bool addCluster();
356
   bool addCluster();
360
   bool addDirCluster();
357
   bool addDirCluster();
361
   dir_t* cacheDirEntry(uint8_t action);
358
   dir_t* cacheDirEntry(uint8_t action);
362
-  int8_t lsPrintNext(Print *pr, uint8_t flags, uint8_t indent);
359
+  int8_t lsPrintNext( uint8_t flags, uint8_t indent);
363
   static bool make83Name(const char* str, uint8_t* name, const char** ptr);
360
   static bool make83Name(const char* str, uint8_t* name, const char** ptr);
364
   bool mkdir(SdBaseFile* parent, const uint8_t dname[11]);
361
   bool mkdir(SdBaseFile* parent, const uint8_t dname[11]);
365
   bool open(SdBaseFile* dirFile, const uint8_t dname[11], uint8_t oflag);
362
   bool open(SdBaseFile* dirFile, const uint8_t dname[11], uint8_t oflag);
367
   dir_t* readDirCache();
364
   dir_t* readDirCache();
368
 //------------------------------------------------------------------------------
365
 //------------------------------------------------------------------------------
369
 // to be deleted
366
 // to be deleted
370
-  static void printDirName(const dir_t& dir,
371
-    uint8_t width, bool printSlash);
372
-  static void printDirName(Print* pr, const dir_t& dir,
367
+  static void printDirName( const dir_t& dir,
373
     uint8_t width, bool printSlash);
368
     uint8_t width, bool printSlash);
374
 //------------------------------------------------------------------------------
369
 //------------------------------------------------------------------------------
375
 // Deprecated functions  - suppress cpplint warnings with NOLINT comment
370
 // Deprecated functions  - suppress cpplint warnings with NOLINT comment

+ 7
- 7
Marlin/SdFatUtil.cpp View File

43
  * \param[in] pr Print object for output.
43
  * \param[in] pr Print object for output.
44
  * \param[in] str Pointer to string stored in flash memory.
44
  * \param[in] str Pointer to string stored in flash memory.
45
  */
45
  */
46
-void SdFatUtil::print_P(Print* pr, PGM_P str) {
47
-  for (uint8_t c; (c = pgm_read_byte(str)); str++) pr->write(c);
46
+void SdFatUtil::print_P( PGM_P str) {
47
+  for (uint8_t c; (c = pgm_read_byte(str)); str++) MSerial.write(c);
48
 }
48
 }
49
 //------------------------------------------------------------------------------
49
 //------------------------------------------------------------------------------
50
 /** %Print a string in flash memory followed by a CR/LF.
50
 /** %Print a string in flash memory followed by a CR/LF.
52
  * \param[in] pr Print object for output.
52
  * \param[in] pr Print object for output.
53
  * \param[in] str Pointer to string stored in flash memory.
53
  * \param[in] str Pointer to string stored in flash memory.
54
  */
54
  */
55
-void SdFatUtil::println_P(Print* pr, PGM_P str) {
56
-  print_P(pr, str);
57
-  pr->println();
55
+void SdFatUtil::println_P( PGM_P str) {
56
+  print_P( str);
57
+  MSerial.println();
58
 }
58
 }
59
 //------------------------------------------------------------------------------
59
 //------------------------------------------------------------------------------
60
 /** %Print a string in flash memory to Serial.
60
 /** %Print a string in flash memory to Serial.
62
  * \param[in] str Pointer to string stored in flash memory.
62
  * \param[in] str Pointer to string stored in flash memory.
63
  */
63
  */
64
 void SdFatUtil::SerialPrint_P(PGM_P str) {
64
 void SdFatUtil::SerialPrint_P(PGM_P str) {
65
-  print_P(&MSerial, str);
65
+  print_P(str);
66
 }
66
 }
67
 //------------------------------------------------------------------------------
67
 //------------------------------------------------------------------------------
68
 /** %Print a string in flash memory to Serial followed by a CR/LF.
68
 /** %Print a string in flash memory to Serial followed by a CR/LF.
70
  * \param[in] str Pointer to string stored in flash memory.
70
  * \param[in] str Pointer to string stored in flash memory.
71
  */
71
  */
72
 void SdFatUtil::SerialPrintln_P(PGM_P str) {
72
 void SdFatUtil::SerialPrintln_P(PGM_P str) {
73
-  println_P(&MSerial, str);
73
+  println_P( str);
74
 }
74
 }

+ 47
- 47
Marlin/SdFatUtil.h View File

1
-/* Arduino SdFat Library
2
- * Copyright (C) 2008 by William Greiman
3
- *
4
- * This file is part of the Arduino SdFat Library
5
- *
6
- * This Library is free software: you can redistribute it and/or modify
7
- * it under the terms of the GNU General Public License as published by
8
- * the Free Software Foundation, either version 3 of the License, or
9
- * (at your option) any later version.
10
- *
11
- * This Library is distributed in the hope that it will be useful,
12
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
- * GNU General Public License for more details.
15
-
16
- * You should have received a copy of the GNU General Public License
17
- * along with the Arduino SdFat Library.  If not, see
18
- * <http://www.gnu.org/licenses/>.
19
- */
20
-#ifndef SdFatUtil_h
21
-#define SdFatUtil_h
22
-/**
23
- * \file
24
- * \brief Useful utility functions.
25
- */
26
-#include <avr/pgmspace.h>
27
-#if ARDUINO < 100
28
-#define  HardwareSerial_h // trick to disable the standard HWserial
29
-#include <WProgram.h>
30
-#include "MarlinSerial.h"
31
-#else  // ARDUINO
32
-#include <Arduino.h>
33
-#endif  // ARDUINO
34
-/** Store and print a string in flash memory.*/
35
-#define PgmPrint(x) SerialPrint_P(PSTR(x))
36
-/** Store and print a string in flash memory followed by a CR/LF.*/
37
-#define PgmPrintln(x) SerialPrintln_P(PSTR(x))
38
-
39
-namespace SdFatUtil {
40
-  int FreeRam();
41
-  void print_P(Print* pr, PGM_P str);
42
-  void println_P(Print* pr, PGM_P str);
43
-  void SerialPrint_P(PGM_P str);
44
-  void SerialPrintln_P(PGM_P str);
45
-}
46
-
47
-using namespace SdFatUtil;  // NOLINT
1
+/* Arduino SdFat Library
2
+ * Copyright (C) 2008 by William Greiman
3
+ *
4
+ * This file is part of the Arduino SdFat Library
5
+ *
6
+ * This Library is free software: you can redistribute it and/or modify
7
+ * it under the terms of the GNU General Public License as published by
8
+ * the Free Software Foundation, either version 3 of the License, or
9
+ * (at your option) any later version.
10
+ *
11
+ * This Library is distributed in the hope that it will be useful,
12
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
+ * GNU General Public License for more details.
15
+
16
+ * You should have received a copy of the GNU General Public License
17
+ * along with the Arduino SdFat Library.  If not, see
18
+ * <http://www.gnu.org/licenses/>.
19
+ */
20
+#ifndef SdFatUtil_h
21
+#define SdFatUtil_h
22
+/**
23
+ * \file
24
+ * \brief Useful utility functions.
25
+ */
26
+#include <avr/pgmspace.h>
27
+#if ARDUINO < 100
28
+#define  HardwareSerial_h // trick to disable the standard HWserial
29
+#include <WProgram.h>
30
+#include "MarlinSerial.h"
31
+#else  // ARDUINO
32
+#include <Arduino.h>
33
+#endif  // ARDUINO
34
+/** Store and print a string in flash memory.*/
35
+#define PgmPrint(x) SerialPrint_P(PSTR(x))
36
+/** Store and print a string in flash memory followed by a CR/LF.*/
37
+#define PgmPrintln(x) SerialPrintln_P(PSTR(x))
38
+
39
+namespace SdFatUtil {
40
+  int FreeRam();
41
+  void print_P( PGM_P str);
42
+  void println_P( PGM_P str);
43
+  void SerialPrint_P(PGM_P str);
44
+  void SerialPrintln_P(PGM_P str);
45
+}
46
+
47
+using namespace SdFatUtil;  // NOLINT
48
 #endif  // #define SdFatUtil_h
48
 #endif  // #define SdFatUtil_h

Loading…
Cancel
Save