Skip to content

Commit 129a60a

Browse files
committed
update for Stream/Print support under F4
1 parent 4cd1b55 commit 129a60a

15 files changed

Lines changed: 1762 additions & 115 deletions

STM32F4/cores/maple/Arduino.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,5 @@
22
#define Arduino_h
33
#include "WProgram.h"
44
#endif
5+
6+
#include "variant.h"

STM32F4/cores/maple/Print.cpp

Lines changed: 129 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
/*
22
* Print.cpp - Base class that provides print() and println()
33
* Copyright (c) 2008 David A. Mellis. All right reserved.
4+
* Copyright (c) 2011 LeafLabs, LLC.
45
*
56
* This library is free software; you can redistribute it and/or
67
* modify it under the terms of the GNU Lesser General Public License
@@ -23,7 +24,8 @@
2324

2425
#include "Print.h"
2526

26-
#include <limits.h>
27+
#include "wirish_math.h"
28+
#include "limits.h"
2729

2830
#ifndef LLONG_MAX
2931
/*
@@ -40,143 +42,192 @@
4042
#define LLONG_MAX 9223372036854775807LL
4143
#endif
4244

43-
#include "wirish_math.h"
44-
4545
/*
4646
* Public methods
4747
*/
4848

49-
void Print::write(const char *str) {
49+
size_t Print::write(const char *str) {
50+
size_t n = 0;
5051
while (*str) {
5152
write(*str++);
53+
n++;
5254
}
55+
return n;
5356
}
5457

55-
void Print::write(const void *buffer, uint32 size) {
58+
size_t Print::write(const void *buffer, uint32 size) {
59+
size_t n = 0;
5660
uint8 *ch = (uint8*)buffer;
5761
while (size--) {
5862
write(*ch++);
63+
n++;
5964
}
65+
return n;
6066
}
6167

62-
void Print::print(uint8 b, int base) {
68+
size_t Print::print(uint8 b, int base) {
6369
print((uint64)b, base);
6470
}
6571

66-
void Print::print(char c) {
67-
write(c);
72+
size_t Print::print(const String &s)
73+
{
74+
return write(s.c_str(), s.length());
6875
}
6976

70-
void Print::print(const char str[]) {
71-
write(str);
77+
size_t Print::print(char c) {
78+
return write(c);
7279
}
7380

74-
void Print::print(int n, int base) {
75-
print((long long)n, base);
81+
size_t Print::print(const char str[]) {
82+
return write(str);
7683
}
7784

78-
void Print::print(unsigned int n, int base) {
79-
print((unsigned long long)n, base);
85+
size_t Print::print(int n, int base) {
86+
return print((long long)n, base);
8087
}
8188

82-
void Print::print(long n, int base) {
83-
print((long long)n, base);
89+
size_t Print::print(unsigned int n, int base) {
90+
return print((unsigned long long)n, base);
8491
}
8592

86-
void Print::print(unsigned long n, int base) {
87-
print((unsigned long long)n, base);
93+
size_t Print::print(long n, int base) {
94+
return print((long long)n, base);
8895
}
8996

90-
void Print::print(long long n, int base) {
91-
if (base == BYTE) {
92-
write((uint8)n);
93-
return;
97+
size_t Print::print(unsigned long n, int base) {
98+
return print((unsigned long long)n, base);
99+
}
100+
101+
size_t Print::print(long long n, int base) {
102+
if (base == BYTE)
103+
{
104+
return write((uint8)n);
94105
}
95106
if (n < 0) {
96107
print('-');
97108
n = -n;
98109
}
99-
printNumber(n, base);
110+
return printNumber(n, base);
100111
}
101112

102-
void Print::print(unsigned long long n, int base) {
113+
size_t Print::print(unsigned long long n, int base) {
114+
size_t c=0;
103115
if (base == BYTE) {
104-
write((uint8)n);
116+
c= write((uint8)n);
105117
} else {
106-
printNumber(n, base);
118+
c= printNumber(n, base);
107119
}
120+
return c;
108121
}
109122

110-
void Print::print(double n, int digits) {
111-
printFloat(n, digits);
123+
size_t Print::print(double n, int digits) {
124+
return printFloat(n, digits);
112125
}
113126

114-
void Print::println(void) {
115-
print('\r');
116-
print('\n');
127+
size_t Print::println(void)
128+
{
129+
size_t n = print('\r');
130+
n += print('\n');
131+
return n;
117132
}
118133

119-
void Print::println(char c) {
120-
print(c);
121-
println();
134+
size_t Print::println(const String &s)
135+
{
136+
size_t n = print(s);
137+
n += println();
138+
return n;
122139
}
123140

124-
void Print::println(const char c[]) {
125-
print(c);
126-
println();
141+
size_t Print::println(char c) {
142+
size_t n = print(c);
143+
n += println();
144+
return n;
127145
}
128146

129-
void Print::println(uint8 b, int base) {
130-
print(b, base);
131-
println();
147+
size_t Print::println(const char c[]) {
148+
size_t n = print(c);
149+
n += println();
150+
return n;
132151
}
133152

134-
void Print::println(int n, int base) {
135-
print(n, base);
136-
println();
153+
size_t Print::println(uint8 b, int base) {
154+
size_t n = print(b, base);
155+
n += println();
156+
return n;
137157
}
138158

139-
void Print::println(unsigned int n, int base) {
140-
print(n, base);
141-
println();
159+
size_t Print::println(int n, int base) {
160+
size_t s = print(n, base);
161+
s += println();
162+
return s;
142163
}
143164

144-
void Print::println(long n, int base) {
145-
print((long long)n, base);
146-
println();
165+
size_t Print::println(unsigned int n, int base) {
166+
size_t s = print(n, base);
167+
s += println();
168+
return s;
147169
}
148170

149-
void Print::println(unsigned long n, int base) {
150-
print((unsigned long long)n, base);
151-
println();
171+
size_t Print::println(long n, int base) {
172+
size_t s = print((long long)n, base);
173+
s += println();
174+
return s;
152175
}
153176

154-
void Print::println(long long n, int base) {
155-
print(n, base);
156-
println();
177+
size_t Print::println(unsigned long n, int base) {
178+
size_t s = print((unsigned long long)n, base);
179+
s += println();
180+
return s;
157181
}
158182

159-
void Print::println(unsigned long long n, int base) {
160-
print(n, base);
161-
println();
183+
size_t Print::println(long long n, int base) {
184+
size_t s = print(n, base);
185+
s += println();
186+
return s;
162187
}
163188

164-
void Print::println(double n, int digits) {
165-
print(n, digits);
166-
println();
189+
size_t Print::println(unsigned long long n, int base) {
190+
size_t s = print(n, base);
191+
s += println();
192+
return s;
167193
}
168194

195+
size_t Print::println(double n, int digits) {
196+
size_t s = print(n, digits);
197+
s += println();
198+
return s;
199+
}
200+
201+
#ifdef SUPPORTS_PRINTF
202+
#include <stdio.h>
203+
#include <stdarg.h>
204+
// Work in progress to support printf.
205+
// Need to implement stream FILE to write individual chars to chosen serial port
206+
int Print::printf (__const char *__restrict __format, ...)
207+
{
208+
FILE *__restrict __stream;
209+
int ret_status = 0;
210+
211+
212+
va_list args;
213+
va_start(args,__format);
214+
ret_status = vfprintf(__stream, __format, args);
215+
va_end(args);
216+
return ret_status;
217+
}
218+
#endif
219+
169220
/*
170221
* Private methods
171222
*/
172223

173-
void Print::printNumber(unsigned long long n, uint8 base) {
224+
size_t Print::printNumber(unsigned long long n, uint8 base) {
174225
unsigned char buf[CHAR_BIT * sizeof(long long)];
175226
unsigned long i = 0;
176-
227+
size_t s=0;
177228
if (n == 0) {
178229
print('0');
179-
return;
230+
return 1;
180231
}
181232

182233
while (n > 0) {
@@ -185,12 +236,14 @@ void Print::printNumber(unsigned long long n, uint8 base) {
185236
}
186237

187238
for (; i > 0; i--) {
188-
print((char)(buf[i - 1] < 10 ?
239+
s += print((char)(buf[i - 1] < 10 ?
189240
'0' + buf[i - 1] :
190241
'A' + buf[i - 1] - 10));
191242
}
243+
return s;
192244
}
193245

246+
194247
/* According to snprintf(),
195248
*
196249
* nextafter((double)numeric_limits<long long>::max(), 0.0) ~= 9.22337e+18
@@ -208,19 +261,20 @@ void Print::printNumber(unsigned long long n, uint8 base) {
208261
*
209262
* http://kurtstephens.com/files/p372-steele.pdf
210263
*/
211-
void Print::printFloat(double number, uint8 digits) {
264+
size_t Print::printFloat(double number, uint8 digits) {
265+
size_t s=0;
212266
// Hackish fail-fast behavior for large-magnitude doubles
213267
if (abs(number) >= LARGE_DOUBLE_TRESHOLD) {
214268
if (number < 0.0) {
215-
print('-');
269+
s=print('-');
216270
}
217-
print("<large double>");
218-
return;
271+
s+=print("<large double>");
272+
return s;
219273
}
220274

221275
// Handle negative numbers
222276
if (number < 0.0) {
223-
print('-');
277+
s+=print('-');
224278
number = -number;
225279
}
226280

@@ -235,18 +289,20 @@ void Print::printFloat(double number, uint8 digits) {
235289
// Extract the integer part of the number and print it
236290
long long int_part = (long long)number;
237291
double remainder = number - int_part;
238-
print(int_part);
292+
s+=print(int_part);
239293

240294
// Print the decimal point, but only if there are digits beyond
241295
if (digits > 0) {
242-
print(".");
296+
s+=print(".");
243297
}
244298

245299
// Extract digits from the remainder one at a time
246300
while (digits-- > 0) {
247301
remainder *= 10.0;
248302
int to_print = (int)remainder;
249-
print(to_print);
303+
s+=print(to_print);
250304
remainder -= to_print;
251305
}
306+
return s;
252307
}
308+

0 commit comments

Comments
 (0)