Skip to content

Add support to Print::printf for printing from flash #2266

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

Merged
merged 25 commits into from
Jul 15, 2016
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
305d060
Merge remote-tracking branch 'esp8266/master'
Apr 20, 2016
e9a5c48
Merge remote-tracking branch 'esp8266/master'
Apr 27, 2016
246edd3
Merge remote-tracking branch 'esp8266/master'
May 8, 2016
c130c17
Merge remote-tracking branch 'esp8266/master'
May 12, 2016
617206d
Merge remote-tracking branch 'esp8266/master'
May 20, 2016
039f4db
Merge remote-tracking branch 'esp8266/master'
Jun 4, 2016
e6578b4
Merge remote-tracking branch 'esp8266/master'
Jun 6, 2016
db26ef4
Merge remote-tracking branch 'esp8266/master'
Jun 12, 2016
3dba795
Merge remote-tracking branch 'esp8266/master'
Jun 16, 2016
f799ede
Merge remote-tracking branch 'esp8266/master'
Jun 23, 2016
e2ff86b
Merge remote-tracking branch 'esp8266/master'
Jun 25, 2016
7158fea
Merge remote-tracking branch 'esp8266/master'
Jun 27, 2016
0264347
Merge remote-tracking branch 'esp8266/master'
Jun 28, 2016
3cf75ca
Merge remote-tracking branch 'esp8266/master'
Jun 30, 2016
6b9edd4
Merge remote-tracking branch 'esp8266/master'
Jul 4, 2016
2aa3d3e
Merge remote-tracking branch 'esp8266/master'
Jul 4, 2016
cc132ec
Merge remote-tracking branch 'esp8266/master'
Jul 5, 2016
bdbf8ed
Merge remote-tracking branch 'esp8266/master'
Jul 5, 2016
5f7daf4
Merge remote-tracking branch 'esp8266/master'
Jul 6, 2016
4e27e14
Merge remote-tracking branch 'esp8266/master'
Jul 6, 2016
d8be9b1
Merge remote-tracking branch 'esp8266/master'
Jul 10, 2016
96632c1
Merge remote-tracking branch 'esp8266/master'
Jul 11, 2016
4cde698
Add support to Print::printf for printing from flash
Jul 11, 2016
19b67a0
Remove flash string helper printf
Jul 12, 2016
39ac1fe
Merge branch 'master' into printf-flash-helper
me-no-dev Jul 15, 2016
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
47 changes: 47 additions & 0 deletions cores/esp8266/Print.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,53 @@ size_t Print::printf(const char *format, ...) {
return len;
}

size_t Print::printf(const __FlashStringHelper * format, ...) {
Copy link
Contributor

Choose a reason for hiding this comment

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

How about introducing Print:vprintf(PGM_P format, va_list argp) and make the other 2 use it?

size_t Print::printf(const __FlashStringHelper * format, ...) {
    va_list arg;
    va_start(arg, format);
    PGM_P fmt = reinterpret_cast<PGM_P>(format);
    size_t len = vprintf(fmt, arg);
    va_end(arg);
    return len;

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

removed that printf all together. Check the latest commit

Copy link
Contributor

Choose a reason for hiding this comment

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

Good enough.

va_list arg;
va_start(arg, format);
PGM_P p = reinterpret_cast<PGM_P>(format);
char temp[64];
char* buffer = temp;
size_t len = vsnprintf_P(temp, sizeof(temp), p, arg);
va_end(arg);
if (len > sizeof(temp) - 1) {
buffer = new char[len + 1];
if (!buffer) {
return 0;
}
va_start(arg, format);
vsnprintf_P(buffer, len + 1, p, arg);
va_end(arg);
}
len = write((const uint8_t*) buffer, len);
if (buffer != temp) {
delete[] buffer;
}
return len;
}

size_t Print::printf_P(PGM_P format, ...) {
va_list arg;
va_start(arg, format);
char temp[64];
char* buffer = temp;
size_t len = vsnprintf_P(temp, sizeof(temp), format, arg);
va_end(arg);
if (len > sizeof(temp) - 1) {
buffer = new char[len + 1];
if (!buffer) {
return 0;
}
va_start(arg, format);
vsnprintf_P(buffer, len + 1, format, arg);
va_end(arg);
}
len = write((const uint8_t*) buffer, len);
if (buffer != temp) {
delete[] buffer;
}
return len;
}

size_t Print::print(const __FlashStringHelper *ifsh) {
PGM_P p = reinterpret_cast<PGM_P>(ifsh);

Expand Down
2 changes: 2 additions & 0 deletions cores/esp8266/Print.h
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,8 @@ class Print {
}

size_t printf(const char * format, ...) __attribute__ ((format (printf, 2, 3)));
size_t printf(const __FlashStringHelper * format, ...);
size_t printf_P(PGM_P format, ...) __attribute__((format(printf, 2, 3)));
size_t print(const __FlashStringHelper *);
size_t print(const String &);
size_t print(const char[]);
Expand Down