Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Stream::send() #6979

Merged
merged 328 commits into from
Mar 15, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
328 commits
Select commit Hold shift + click to select a range
c28e50f
wip
d-a-v Dec 15, 2019
b2dfcfa
back to 2.7.0-dev
d-a-v Dec 16, 2019
5235e73
Merge branch 'master' into bstream2
d-a-v Dec 16, 2019
f5cdd10
wip
d-a-v Dec 17, 2019
c3148c4
fix
d-a-v Dec 18, 2019
40b782c
wip
d-a-v Dec 18, 2019
08fe86e
Merge branch 'master' into bstream2
d-a-v Dec 18, 2019
643dd6d
fixes
d-a-v Dec 18, 2019
07b52b5
missing file
d-a-v Dec 18, 2019
429ba2f
wip
d-a-v Dec 18, 2019
64c2656
wip
d-a-v Dec 19, 2019
6b14a13
peekbuffer for ssl
d-a-v Dec 19, 2019
32f8871
small fix in device test
d-a-v Dec 20, 2019
90daea7
Merge branch 'master' of https://github.com/esp8266/Arduino
d-a-v Dec 20, 2019
cf892fd
Merge branch 'master' into bstream2
d-a-v Dec 20, 2019
c0f4a16
Merge branch 'master' into bstream2
d-a-v Dec 21, 2019
dfa48c6
clean httpclient
d-a-v Dec 22, 2019
e521195
remove debug print
d-a-v Dec 22, 2019
8d3e51f
comments
d-a-v Dec 22, 2019
3345ef1
further cleaning
d-a-v Dec 22, 2019
7cd36a9
fix api change
d-a-v Dec 22, 2019
a5658fe
fix api
d-a-v Dec 22, 2019
92c99f2
Merge branch 'master' into bstream2
d-a-v Dec 29, 2019
474d5a1
comments
d-a-v Jan 1, 2020
314da51
Merge branch 'master' into bstream2
d-a-v Jan 1, 2020
5d4a507
fix HTTPClient merge
d-a-v Jan 1, 2020
d20e867
reduce diff
d-a-v Jan 1, 2020
630b6b6
various fixes
d-a-v Jan 1, 2020
3edf028
fix httpclient error handling
d-a-v Jan 1, 2020
ac86464
Merge branch 'bstream2' of github.com:d-a-v/Arduino into bstream2
d-a-v Jan 1, 2020
03519da
fix
d-a-v Jan 1, 2020
bc2b59a
Stream::to(): changed argument order
d-a-v Jan 2, 2020
72c3237
update echo example
d-a-v Jan 2, 2020
7db503a
fix example
d-a-v Jan 2, 2020
048aecf
fix so device on host test works again
d-a-v Jan 3, 2020
58a6257
fix comments and readUntilChar behaviour
d-a-v Jan 3, 2020
fd32e65
overload with ::to(ref), missing license, minor details
d-a-v Jan 3, 2020
e8ffe6d
Merge branch 'master' into bstream2
d-a-v Jan 3, 2020
e480ea5
fix debug print
d-a-v Jan 3, 2020
15ab6cf
fix host test
d-a-v Jan 3, 2020
9dcc444
Merge branch 'streamto' of github.com:d-a-v/Arduino into streamto
d-a-v Jan 8, 2020
3b7effe
Merge branch 'master' into bstream2
d-a-v Jan 10, 2020
e84d9f5
Merge branch 'master' into bstream2
d-a-v Jan 13, 2020
beee304
Merge branch 'bstream2' of github.com:d-a-v/Arduino into bstream2
d-a-v Jan 13, 2020
0d6a4af
Merge branch 'master' into bstream2
d-a-v Jan 20, 2020
2036749
+ Stream serializer
d-a-v Jan 22, 2020
5e7c448
wip
d-a-v Jan 24, 2020
afc2494
Fix/enable UDP packet reassembly
szekelyisz Jan 26, 2020
dd45763
Merge branch 'master' into bugfix-ip-reassembly
szekelyisz Jan 26, 2020
4196458
Provide pbuf_get_contiguous for backwards compatibility with LwIP 1.4
szekelyisz Jan 26, 2020
f7af80b
Merge changes from remote (commits from Github web interface)
szekelyisz Jan 26, 2020
d69028c
Merge branch 'pr-7036-udpfix' into bstream2
d-a-v Jan 26, 2020
34a6d00
httpserver: sendContent(Stream) (sub-streams as http-chunks)
d-a-v Jan 27, 2020
b3c1e27
Merge branch 'master' into bstream2
d-a-v Jan 28, 2020
4071398
sdfat incompatible with `ssize_t size()`, rename to streamSize
d-a-v Jan 30, 2020
0c3a372
Merge branch 'master' into bstream2
d-a-v Jan 30, 2020
820acf0
fix stream api use
d-a-v Jan 31, 2020
8e44e02
Merge branch 'master' into bstream2
d-a-v Feb 3, 2020
d44a839
Merge branch 'bstream2' of github.com:d-a-v/Arduino into bstream2
d-a-v Feb 3, 2020
0e29771
Merge branch 'master' into bstream2
d-a-v Feb 3, 2020
df38f89
Merge branch 'master' into bstream2
d-a-v Feb 5, 2020
1c1bd76
Merge branch 'master' into bstream2
d-a-v Feb 18, 2020
2b637ae
Merge branch 'master' into bstream2
d-a-v Feb 21, 2020
4ccc136
Merge branch 'master' into bstream2
d-a-v Feb 24, 2020
5577b32
Merge branch 'master' into bstream2
d-a-v Feb 24, 2020
db62df4
Merge branch 'master' into bstream2
d-a-v Feb 25, 2020
ec3ffe0
Merge branch 'master' into bstream2
d-a-v Feb 27, 2020
fb2c546
Merge branch 'master' into bstream2
d-a-v Mar 4, 2020
99740f8
expose hidden WebServer's chunked API
d-a-v Mar 4, 2020
fee1307
expose hidden WebServer's chunked API
d-a-v Mar 4, 2020
cc3e01c
expose hidden WebServer's chunked API
d-a-v Mar 4, 2020
caa8f2c
Merge branch 'master' into bstream2
d-a-v Mar 5, 2020
cee7631
Merge branch 'chunckedApi' into bstream2
d-a-v Mar 5, 2020
968e74f
Merge branch 'master' into bstream2
d-a-v Mar 29, 2020
18a842c
Merge branch 'master' into bstream2
d-a-v Apr 11, 2020
0bfc6e9
Merge branch 'master' into bstream2
d-a-v Apr 17, 2020
9387a25
move ESP.getCpuFreqMHz to features
d-a-v Apr 17, 2020
a6f9518
Merge branch 'master' into bstream2
d-a-v Apr 18, 2020
dca0561
Merge branch 'master' into bstream2
d-a-v Apr 27, 2020
fef29c9
Merge branch 'master' into bstream2
d-a-v Apr 30, 2020
fe9c0a1
Merge branch 'master' into bstream2
d-a-v May 2, 2020
66ab5bd
Merge branch 'master' into bstream2
d-a-v May 6, 2020
957bb36
Merge branch 'master' into bstream2
d-a-v May 7, 2020
ef587f5
Merge branch 'master' into bstream2
d-a-v May 11, 2020
09fd253
Merge branch 'master' into bstream2
d-a-v May 19, 2020
7027de6
Merge branch 'master' into bstream2
d-a-v May 26, 2020
0ee1c96
fix last merge
d-a-v May 26, 2020
88264aa
Merge branch 'master' into bstream2
d-a-v May 29, 2020
f788e52
Merge branch 'master' into bstream2
d-a-v Jun 5, 2020
d005bbf
Merge branch 'master' into bstream2
d-a-v Jun 16, 2020
225b7c6
Merge branch 'master' into bstream2
d-a-v Jun 25, 2020
fac8992
Merge branch 'master' into bstream2
d-a-v Jul 8, 2020
0a540a6
Merge branch 'master' into bstream2
d-a-v Jul 9, 2020
6898f5e
Merge branch 'master' into bstream2
d-a-v Jul 17, 2020
679134c
wip api
d-a-v Jul 18, 2020
dc30f67
api wip
d-a-v Jul 19, 2020
13e8512
wip
d-a-v Jul 19, 2020
b5ced49
size_t read() -> int read() / to() -> toNow/toUntil/toSize
d-a-v Jul 24, 2020
51b6961
Merge branch 'master' into bstream3
d-a-v Jul 24, 2020
3f9d4cc
streamstring helper
d-a-v Jul 24, 2020
b80bfff
fixes
d-a-v Jul 24, 2020
d62c719
make string_is_Stream optional
d-a-v Jul 27, 2020
192faab
enable string is stream
d-a-v Jul 27, 2020
951737c
stream::to(): templates allowing passing reference, fixes
d-a-v Jul 28, 2020
ca27dd7
wwwserver: parsing: use stream::to
d-a-v Jul 28, 2020
59da9a4
Merge branch 'master' into bstream2
d-a-v Jul 28, 2020
1ce2351
replace datasource by stream (less fragmentation)
d-a-v Jul 28, 2020
84a3137
fix comments, fix mock
d-a-v Jul 29, 2020
dfb39ca
simplify webserver
d-a-v Jul 29, 2020
ceaaf18
fix debug message
d-a-v Jul 29, 2020
0e443d0
Merge branch 'master' into bstream2
d-a-v Jul 29, 2020
42ffd6f
fix debug msg
d-a-v Jul 29, 2020
feaccaa
fix webserver bug
d-a-v Jul 29, 2020
580d553
Merge branch 'master' into bstream2
d-a-v Jul 29, 2020
4d2ce85
Merge branch 'master' into bstream2
d-a-v Jul 30, 2020
bf9ad75
remove comment
d-a-v Jul 30, 2020
cdd72f9
define indicating a breaking change
d-a-v Aug 2, 2020
b69bf75
Merge branch 'master' into streamto
d-a-v Aug 5, 2020
3350923
temporarily use an updated softwareserial
d-a-v Aug 7, 2020
f0483e1
CI: on host: force 64 bit mode like `make -j2 CI` implicitly does
d-a-v Aug 7, 2020
9b21424
Merge branch 'master' into streamto
d-a-v Aug 7, 2020
443f5b4
Merge branch 'ci64' into streamto
d-a-v Aug 7, 2020
f290fd5
fix CI
d-a-v Aug 8, 2020
4ba0805
Merge branch 'master' into streamto
d-a-v Aug 8, 2020
55bb160
stick to arduino, per review
d-a-v Aug 8, 2020
ce3c922
python echo client
d-a-v Aug 8, 2020
bc29fe6
improve echo server
d-a-v Aug 8, 2020
dd947c8
mock: hide debug message
d-a-v Aug 8, 2020
81f2d6f
style
d-a-v Aug 8, 2020
f85ddbb
improve python echo client
d-a-v Aug 9, 2020
1fd80d1
httpclient: fix when string is not stream
d-a-v Aug 9, 2020
e96f80d
restore streamstring.cpp when string is not stream
d-a-v Aug 9, 2020
36a0ddc
Merge branch 'master' into streamto
d-a-v Aug 9, 2020
10e86ad
missing overrides
d-a-v Aug 9, 2020
915647a
::readBytesUntil() swallows but not transfers the delimiter: fix ::to…
d-a-v Aug 10, 2020
dc7021e
Merge branch 'master' into streamto
d-a-v Aug 13, 2020
a2cb9b1
rework StreamString
d-a-v Aug 14, 2020
9021ed8
rewrite StreamString (wip)
d-a-v Aug 15, 2020
b52e61b
ditto
d-a-v Aug 15, 2020
46808cc
ditto
d-a-v Aug 15, 2020
5f80dce
properly reset peekpointer in StreamString
d-a-v Aug 15, 2020
143f2d6
Merge branch 'master' into bstream2
d-a-v Aug 15, 2020
f692c09
fixes, device test, (=) example
d-a-v Aug 16, 2020
ff1ea5b
stream: test: show 0 heap occupation with streaming progmem strings
d-a-v Aug 16, 2020
0437782
Merge branch 'master' into bstream2
d-a-v Aug 16, 2020
3745126
Merge branch 'master' into bstream2
d-a-v Aug 17, 2020
ddb7242
doc
d-a-v Aug 17, 2020
dcb1085
doc
d-a-v Aug 17, 2020
45f7f6c
doc
d-a-v Aug 17, 2020
e47c162
doc
d-a-v Aug 17, 2020
d4f32af
doc
d-a-v Aug 17, 2020
ef998c0
doc
d-a-v Aug 17, 2020
39f6f56
doc
d-a-v Aug 17, 2020
815b82c
Merge branch 'master' into streamto
d-a-v Aug 17, 2020
d85f50f
Merge branch 'bstream2' into streamto
d-a-v Aug 17, 2020
112313d
fix transition from String as Stream to S2Stream
d-a-v Aug 17, 2020
a378aff
doc
d-a-v Aug 17, 2020
f9a5f18
fix webserver::sendContent API
d-a-v Aug 17, 2020
6d84820
update doc
d-a-v Aug 19, 2020
9bc8146
StreamString's read by default swallows the string (like legacy)
d-a-v Aug 19, 2020
a99c418
doc update
d-a-v Aug 19, 2020
3699ad3
Merge branch 'master' into streamto
d-a-v Aug 19, 2020
8e58e97
Merge branch 'master' into streamto
d-a-v Aug 21, 2020
b24b7ef
fix api
d-a-v Aug 25, 2020
ac223a9
Merge branch 'streamto' of github.com:d-a-v/Arduino into streamto
d-a-v Aug 25, 2020
0eb0b55
fix <<
d-a-v Aug 25, 2020
d6c7203
Merge branch 'master' into streamto
d-a-v Aug 25, 2020
9d90286
Merge branch 'master' into streamto
d-a-v Aug 26, 2020
270ce0a
Merge branch 'master' into streamto
d-a-v Sep 5, 2020
f98e167
Merge branch 'master' into streamto
d-a-v Sep 21, 2020
211c914
fix int/size_t changes in Netdump
d-a-v Sep 21, 2020
c56e533
Merge branch 'master' into streamto
d-a-v Oct 24, 2020
8268807
fix emulation on host
d-a-v Oct 24, 2020
d5d2ee5
Merge branch 'master' into streamto
d-a-v Nov 9, 2020
9eca03c
sync with master
d-a-v Nov 9, 2020
0901039
Merge branch 'master' into streamto
d-a-v Nov 14, 2020
68aa236
Merge branch 'master' into streamto
d-a-v Nov 19, 2020
2e9d1a0
Merge branch 'master' into streamto
d-a-v Nov 24, 2020
8e350e0
Merge branch 'master' into streamto
d-a-v Dec 4, 2020
c7fae60
Merge branch 'master' into streamto
d-a-v Dec 6, 2020
e24e26c
update softserial
d-a-v Dec 22, 2020
f314946
Merge branch 'master' into streamto
d-a-v Dec 22, 2020
cde30e4
uodate SoftwareSerial
d-a-v Dec 22, 2020
d95ddf2
Merge branch 'master' into streamto
d-a-v Dec 22, 2020
44e585f
Merge branch 'master' into streamto
d-a-v Dec 22, 2020
6b7c344
Merge branch 'master' into streamto
d-a-v Dec 23, 2020
b31ec10
Merge branch 'master' into streamto
d-a-v Jan 1, 2021
e326b0a
Merge branch 'master' into streamto
d-a-v Jan 6, 2021
0f5d283
sserial update
d-a-v Jan 19, 2021
06f93a0
Merge branch 'master' into streamto
d-a-v Jan 24, 2021
ca821a9
replace "periodicFastMs yieldNow(5)" by optimistic_yield(1000)
d-a-v Jan 24, 2021
3a308c2
style
d-a-v Jan 24, 2021
afd5954
availableForPeek => peekAvailable
d-a-v Jan 25, 2021
e786a13
remove user-obfuscating "in_flash" parameter
d-a-v Jan 25, 2021
5e4342d
fix byte-addressible address
d-a-v Jan 25, 2021
ad580e0
uses system constants instead of numerical constants
d-a-v Jan 25, 2021
8e064be
good practice: add '__' in front of internal function name
d-a-v Jan 25, 2021
93c8cc7
doc update, removed "propose"
d-a-v Jan 25, 2021
30be04c
rename: ::to => ::send
d-a-v Jan 25, 2021
c94ba0b
properly invalidate ssl buffer after consuming some data
d-a-v Jan 25, 2021
31e3c39
more rename: ::to => ::send
d-a-v Jan 25, 2021
da1f96d
fix api in example&test
d-a-v Jan 25, 2021
531d794
remove useless constant
d-a-v Jan 25, 2021
cd3caad
sync w/ upstream SoftwareSerial
d-a-v Jan 26, 2021
746fcd2
Merge branch 'master' into streamto
d-a-v Jan 26, 2021
7b35d70
update comment
d-a-v Jan 29, 2021
21a50ed
remove useless comment
d-a-v Jan 29, 2021
92a6302
addressible => addressable
d-a-v Jan 29, 2021
41d1868
rename private variable (_x => _zero)
d-a-v Jan 29, 2021
abca00b
fix licences
d-a-v Jan 29, 2021
3c1e104
typo in tests
d-a-v Jan 29, 2021
4779433
Merge branch 'master' into streamto
d-a-v Jan 29, 2021
84d8bc6
define STREAMSEND_API globally (for checking on its presence)
d-a-v Jan 29, 2021
592b440
::streamSize => ::streamRemaining
d-a-v Jan 31, 2021
2783c19
::peekBufferAPI() => ::hasPeekBufferAPI()
d-a-v Jan 31, 2021
da1240a
{input,output}TimeoutPossible => {input,output}CanTimeout
d-a-v Jan 31, 2021
5ab7415
::sendNow() => ::sendAvailable() + fix doc
d-a-v Jan 31, 2021
b70a002
removed StreamPr::StreamPtr(String)
d-a-v Jan 31, 2021
395dae3
reenable StreamPtr(const String &)
d-a-v Feb 1, 2021
9035f51
add comments to StreamString example
d-a-v Feb 1, 2021
94e8d60
rename ::reset() to ::resetPointer() in StringPtr and S2Stream
d-a-v Feb 1, 2021
36a6bce
rename StreamPtr:: to StreamConstPtr::
d-a-v Feb 1, 2021
711bfe8
rename getLastSendReport => getLastSendResult
d-a-v Feb 1, 2021
dae26cb
remove useless cast
d-a-v Feb 1, 2021
e1e6fdb
remove another useless cast
d-a-v Feb 1, 2021
784771c
32767->maxInt16
d-a-v Feb 1, 2021
908f980
remove comment
d-a-v Feb 2, 2021
b73a9ca
typo in doc
d-a-v Feb 2, 2021
e0084f3
typo in doc
d-a-v Feb 2, 2021
44fb378
doc: insist on reference implementation
d-a-v Feb 2, 2021
3be63d5
english
d-a-v Feb 2, 2021
e299474
english
d-a-v Feb 2, 2021
085dbd2
SSEND2HTTPC() => StreamReportToHttpClientReport()
d-a-v Feb 2, 2021
354288b
changed the report enum to a class enum
d-a-v Feb 7, 2021
c223265
rename StreamDev.cpp -> StreamSend.cpp
d-a-v Feb 7, 2021
756ca72
split Stream::StreamSend()
d-a-v Feb 7, 2021
747a1a9
rename StreamDev.cpp -> StreamSend.cpp
d-a-v Feb 7, 2021
bfe7ee7
style
d-a-v Feb 7, 2021
c0a1c38
Merge branch 'master' into streamto
d-a-v Feb 15, 2021
1188958
replace sendcontent()/template by proper sendcontent(ref)
d-a-v Feb 15, 2021
bfad4fc
check for outputCanTimeout() on right stream
d-a-v Feb 15, 2021
70eb9e8
webserver: check/print in debug mode
d-a-v Feb 15, 2021
d32361c
Merge branch 'master' into streamto
d-a-v Feb 16, 2021
e88d21e
fix variable type
d-a-v Feb 16, 2021
594d77b
bugfix: avoid using peekBuffer API when not available
d-a-v Mar 10, 2021
b4ca0dd
use a constexpr for stack buffer size
d-a-v Mar 10, 2021
81290b6
update messages and python code in wifiecho example
d-a-v Mar 10, 2021
32eb9bf
constexpr are static in classes
d-a-v Mar 10, 2021
f0498b5
fix by @devyte's internal review:
d-a-v Mar 13, 2021
fd5f282
Merge branch 'master' into streamto
earlephilhower Mar 15, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 9 additions & 9 deletions cores/esp8266/Client.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,15 +26,15 @@
class Client: public Stream {

public:
virtual int connect(IPAddress ip, uint16_t port) =0;
virtual int connect(const char *host, uint16_t port) =0;
virtual size_t write(uint8_t) =0;
virtual size_t write(const uint8_t *buf, size_t size) =0;
virtual int available() = 0;
virtual int read() = 0;
virtual int read(uint8_t *buf, size_t size) = 0;
virtual int peek() = 0;
virtual void flush() = 0;
virtual int connect(IPAddress ip, uint16_t port) = 0;
virtual int connect(const char *host, uint16_t port) = 0;
virtual size_t write(uint8_t) override = 0;
virtual size_t write(const uint8_t *buf, size_t size) override = 0;
virtual int available() override = 0;
virtual int read() override = 0;
virtual int read(uint8_t *buf, size_t size) override = 0;
virtual int peek() override = 0;
virtual void flush() override = 0;
virtual void stop() = 0;
virtual uint8_t connected() = 0;
virtual operator bool() = 0;
Expand Down
2 changes: 1 addition & 1 deletion cores/esp8266/FS.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ int File::read() {
return result;
}

size_t File::read(uint8_t* buf, size_t size) {
int File::read(uint8_t* buf, size_t size) {
if (!_p)
return 0;

Expand Down
4 changes: 3 additions & 1 deletion cores/esp8266/FS.h
Original file line number Diff line number Diff line change
Expand Up @@ -67,13 +67,14 @@ class File : public Stream
size_t readBytes(char *buffer, size_t length) override {
return read((uint8_t*)buffer, length);
}
size_t read(uint8_t* buf, size_t size);
int read(uint8_t* buf, size_t size) override;
bool seek(uint32_t pos, SeekMode mode);
bool seek(uint32_t pos) {
return seek(pos, SeekSet);
}
size_t position() const;
size_t size() const;
virtual ssize_t streamRemaining() override { return (ssize_t)size() - (ssize_t)position(); }
void close();
operator bool() const;
const char* name() const;
Expand All @@ -84,6 +85,7 @@ class File : public Stream
bool isDirectory() const;

// Arduino "class SD" methods for compatibility
//TODO use stream::send / check read(buf,size) result
template<typename T> size_t write(T &src){
uint8_t obuf[256];
size_t doneLen = 0;
Expand Down
2 changes: 1 addition & 1 deletion cores/esp8266/FSImpl.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ class FileImpl {
public:
virtual ~FileImpl() { }
virtual size_t write(const uint8_t *buf, size_t size) = 0;
virtual size_t read(uint8_t* buf, size_t size) = 0;
virtual int read(uint8_t* buf, size_t size) = 0;
virtual void flush() = 0;
virtual bool seek(uint32_t pos, SeekMode mode) = 0;
virtual size_t position() const = 0;
Expand Down
31 changes: 30 additions & 1 deletion cores/esp8266/HardwareSerial.h
Original file line number Diff line number Diff line change
Expand Up @@ -135,16 +135,45 @@ class HardwareSerial: public Stream
// return -1 when data is unvailable (arduino api)
return uart_peek_char(_uart);
}

virtual bool hasPeekBufferAPI () const override
{
return true;
}

// return a pointer to available data buffer (size = available())
// semantic forbids any kind of read() before calling peekConsume()
const char* peekBuffer () override
{
return uart_peek_buffer(_uart);
}

// return number of byte accessible by peekBuffer()
size_t peekAvailable () override
{
return uart_peek_available(_uart);
}

// consume bytes after use (see peekBuffer)
void peekConsume (size_t consume) override
{
return uart_peek_consume(_uart, consume);
}

int read(void) override
{
// return -1 when data is unvailable (arduino api)
return uart_read_char(_uart);
}
// ::read(buffer, size): same as readBytes without timeout
size_t read(char* buffer, size_t size)
int read(char* buffer, size_t size)
{
return uart_read(_uart, buffer, size);
}
int read(uint8_t* buffer, size_t size) override
{
return uart_read(_uart, (char*)buffer, size);
}
size_t readBytes(char* buffer, size_t size) override;
size_t readBytes(uint8_t* buffer, size_t size) override
{
Expand Down
10 changes: 1 addition & 9 deletions cores/esp8266/Print.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,15 +33,7 @@

/* default implementation: may be overridden */
size_t Print::write(const uint8_t *buffer, size_t size) {

#ifdef DEBUG_ESP_CORE
static char not_the_best_way [] PROGMEM STORE_ATTR = "Print::write(data,len) should be overridden for better efficiency\r\n";
static bool once = false;
if (!once) {
once = true;
os_printf_plus(not_the_best_way);
}
#endif
IAMSLOW();

size_t n = 0;
while (size--) {
Expand Down
4 changes: 4 additions & 0 deletions cores/esp8266/Print.h
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,10 @@ class Print {
size_t println(void);

virtual void flush() { /* Empty implementation for backward compatibility */ }

// by default write timeout is possible (outgoing data from network,serial..)
// (children can override to false (like String))
virtual bool outputCanTimeout () { return true; }
};

template<> size_t Print::printNumber(double number, uint8_t digits);
Expand Down
20 changes: 20 additions & 0 deletions cores/esp8266/Stream.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@

#include <Arduino.h>
#include <Stream.h>

#define PARSE_TIMEOUT 1000 // default number of milli-seconds to wait
#define NO_SKIP_CHAR 1 // a magic char not found in a valid ASCII numeric field

Expand Down Expand Up @@ -210,6 +211,8 @@ float Stream::parseFloat(char skipChar) {
// the buffer is NOT null terminated.
//
size_t Stream::readBytes(char *buffer, size_t length) {
IAMSLOW();

size_t count = 0;
while(count < length) {
int c = timedRead();
Expand Down Expand Up @@ -258,3 +261,20 @@ String Stream::readStringUntil(char terminator) {
}
return ret;
}

// read what can be read, immediate exit on unavailable data
// prototype similar to Arduino's `int Client::read(buf, len)`
int Stream::read (uint8_t* buffer, size_t maxLen)
{
IAMSLOW();

size_t nbread = 0;
while (nbread < maxLen && available())
{
int c = read();
if (c == -1)
break;
buffer[nbread++] = read();
}
return nbread;
}
125 changes: 120 additions & 5 deletions cores/esp8266/Stream.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,13 @@
#ifndef Stream_h
#define Stream_h

#include <debug.h>
#include <inttypes.h>
#include "Print.h"
#include <Print.h>
#include <PolledTimeout.h>
#include <sys/types.h> // ssize_t

// compatability macros for testing
// compatibility macros for testing
/*
#define getInt() parseInt()
#define getInt(skipChar) parseInt(skipchar)
Expand All @@ -35,6 +38,15 @@
readBytesBetween( pre_string, terminator, buffer, length)
*/

// Arduino `Client: public Stream` class defines `virtual int read(uint8_t *buf, size_t size) = 0;`
// This function is now imported into `Stream::` for `Stream::send*()`.
// Other classes inheriting from `Stream::` and implementing `read(uint8_t *buf, size_t size)`
// must consequently use `int` as return type, namely Hardware/SoftwareSerial, FileSystems...
#define STREAM_READ_RETURNS_INT 1

// Stream::send API is present
#define STREAMSEND_API 1

class Stream: public Print {
protected:
unsigned long _timeout = 1000; // number of milliseconds to wait for the next char before aborting timed read
Expand All @@ -53,6 +65,7 @@ class Stream: public Print {
// parsing methods

void setTimeout(unsigned long timeout); // sets maximum milliseconds to wait for stream data, default is 1 second
unsigned long getTimeout () const { return _timeout; }

bool find(const char *target); // reads data from the stream until the target string is found
bool find(uint8_t *target) {
Expand Down Expand Up @@ -102,12 +115,114 @@ class Stream: public Print {
virtual String readString();
String readStringUntil(char terminator);

virtual int read (uint8_t* buffer, size_t len);
int read (char* buffer, size_t len) { return read((uint8_t*)buffer, len); }
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is this not virtual?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is this not virtual?

::read(char*,size_t) is not in the reference implementation.
Making it virtual would add more overhead to the instances.
Having it inline and casting for user is lighter and more efficient.


//////////////////// extension: direct access to input buffer
// to provide when possible a pointer to available data for read

// informs user and ::to*() on effective buffered peek API implementation
// by default: not available
virtual bool hasPeekBufferAPI () const { return false; }

// returns number of byte accessible by peekBuffer()
virtual size_t peekAvailable () { return 0; }

// returns a pointer to available data buffer (size = peekAvailable())
// semantic forbids any kind of ::read()
// - after calling peekBuffer()
// - and before calling peekConsume()
virtual const char* peekBuffer () { return nullptr; }

// consumes bytes after peekBuffer() use
// (then ::read() is allowed)
virtual void peekConsume (size_t consume) { (void)consume; }

// by default read timeout is possible (incoming data from network,serial..)
// children can override to false (like String::)
virtual bool inputCanTimeout () { return true; }

// (outputCanTimeout() is defined in Print::)

////////////////////////
//////////////////// extensions: Streaming streams to streams
// Stream::send*()
//
// Stream::send*() uses 1-copy transfers when peekBuffer API is
// available, or makes a regular transfer through a temporary buffer.
//
// - for efficiency, Stream classes should implement peekAPI when
// possible
// - for an efficient timeout management, Print/Stream classes
// should implement {output,input}CanTimeout()

using oneShotMs = esp8266::polledTimeout::oneShotFastMs;
static constexpr int temporaryStackBufferSize = 64;

// ::send*() methods:
// - always stop before timeout when "no-more-input-possible-data"
// or "no-more-output-possible-data" condition is met
// - always return number of transfered bytes
// When result is 0 or less than requested maxLen, Print::getLastSend()
// contains an error reason.

// transfers already buffered / immediately available data (no timeout)
// returns number of transfered bytes
size_t sendAvailable (Print* to) { return sendGeneric(to, -1, -1, oneShotMs::alwaysExpired); }
size_t sendAvailable (Print& to) { return sendAvailable(&to); }

// transfers data until timeout
// returns number of transfered bytes
size_t sendAll (Print* to, const oneShotMs::timeType timeoutMs = oneShotMs::neverExpires) { return sendGeneric(to, -1, -1, timeoutMs); }
size_t sendAll (Print& to, const oneShotMs::timeType timeoutMs = oneShotMs::neverExpires) { return sendAll(&to, timeoutMs); }

// transfers data until a char is encountered (the char is swallowed but not transfered) with timeout
// returns number of transfered bytes
size_t sendUntil (Print* to, const int readUntilChar, const oneShotMs::timeType timeoutMs = oneShotMs::neverExpires) { return sendGeneric(to, -1, readUntilChar, timeoutMs); }
size_t sendUntil (Print& to, const int readUntilChar, const oneShotMs::timeType timeoutMs = oneShotMs::neverExpires) { return sendUntil(&to, readUntilChar, timeoutMs); }

// transfers data until requested size or timeout
// returns number of transfered bytes
size_t sendSize (Print* to, const ssize_t maxLen, const oneShotMs::timeType timeoutMs = oneShotMs::neverExpires) { return sendGeneric(to, maxLen, -1, timeoutMs); }
size_t sendSize (Print& to, const ssize_t maxLen, const oneShotMs::timeType timeoutMs = oneShotMs::neverExpires) { return sendSize(&to, maxLen, timeoutMs); }

// remaining size (-1 by default = unknown)
virtual ssize_t streamRemaining () { return -1; }

enum class Report
{
Success = 0,
TimedOut,
ReadError,
WriteError,
ShortOperation,
};

Report getLastSendReport () const { return _sendReport; }

protected:
size_t sendGeneric (Print* to,
const ssize_t len = -1,
const int readUntilChar = -1,
oneShotMs::timeType timeoutMs = oneShotMs::neverExpires /* neverExpires=>getTimeout() */);

size_t SendGenericPeekBuffer(Print* to, const ssize_t len, const int readUntilChar, const oneShotMs::timeType timeoutMs);
size_t SendGenericRegularUntil(Print* to, const ssize_t len, const int readUntilChar, const oneShotMs::timeType timeoutMs);
size_t SendGenericRegular(Print* to, const ssize_t len, const oneShotMs::timeType timeoutMs);

void setReport (Report report) { _sendReport = report; }

private:

Report _sendReport = Report::Success;

//////////////////// end of extensions

protected:
long parseInt(char skipChar); // as above but the given skipChar is ignored
// as above but the given skipChar is ignored
long parseInt(char skipChar); // as parseInt() but the given skipChar is ignored
// this allows format characters (typically commas) in values to be ignored

float parseFloat(char skipChar); // as above but the given skipChar is ignored
float parseFloat(char skipChar); // as parseFloat() but the given skipChar is ignored
};

#endif
Loading