bxparks / acetime Goto Github PK
View Code? Open in Web Editor NEWDate and time classes for Arduino supporting the IANA TZ Database time zones to convert epoch seconds to date and time components in different time zones.
License: MIT License
Date and time classes for Arduino supporting the IANA TZ Database time zones to convert epoch seconds to date and time components in different time zones.
License: MIT License
With the current AceTime release the .createForZoneName is no longer working for my default timezone, which is the Netherlands?
It had been a while since I updated your library to the latest and the greatest. And I use it to lookup user input to match with a TimeZone name. Now the default always works, which is "Europe/Amsterdam".
I have taken your Hello Timezone Manager example, and extended it with some entries:
TimeZone londonTz = manager.createForZoneName("Europe/London");
ZonedDateTime londonTime = losAngelesTime.convertToTimeZone(londonTz);
londonTime.printTo(SERIAL_PORT_MONITOR);
SERIAL_PORT_MONITOR.println();
// Create Europe/Amsterdam timezone by ZoneName.
TimeZone amsterdamTz = manager.createForZoneName("Europe/Amsterdam");
ZonedDateTime amsterdamTime = losAngelesTime.convertToTimeZone(amsterdamTz);
amsterdamTime.printTo(SERIAL_PORT_MONITOR);
SERIAL_PORT_MONITOR.println();
// Create Europe/Brussels timezone by ZoneName.
TimeZone brusselsTZ = manager.createForZoneName("Europe/Brussels");
ZonedDateTime brusselsTime= losAngelesTime.convertToTimeZone(brusselsTZ);
brusselsTime.printTo(SERIAL_PORT_MONITOR);
SERIAL_PORT_MONITOR.println();
Output:
2019-03-10T03:00:00-07:00[America/Los_Angeles]
2019-03-10T10:00:00+00:00[Europe/London]
<Invalid ZonedDateTime>
2019-03-10T11:00:00+01:00[Europe/Brussels]
2019-03-10T21:00:00+11:00[Australia/Sydney]
So I want to use your library to lookup Timezone by name.
auto myTz = manager.createForZoneName(CSTR(settingNTPtimezone));
auto myTime = ZonedDateTime::forUnixSeconds(NtpLastSync, myTz);
It works great, but when you give a random string, you want to catch the error in lookup and have a default replace that TZname. For example: "Amsterdam" --> Error
But it works for "Europe/Amsterdam".
This way I can have a string field, but when it fails to set it correctly, it falls back to the default.
Now I have looked at the documentation, but it's not clear how to catch an error in lookup.
Your help is greatly appreciated.
Originally posted by rvdbreemen October 16, 2021
Well, interestingly enough I struggled with the order of the includes.
So I am using TimeLib.h next to AceTime.h. I do this to minimize code change... Historically I used ezTime and before that TimeLib. Anyway, there is lots of compile errors if I include AceTime later dan TimeLib.
So the order that worked for me is:
#include <AceTime.h>
#include <TimeLib.h>
There must be a namespace conflict or something, because if I do it the otherway around I won't even compile.
What could be the reason for that?
The reason why I included TimeLib.h again,is that AceTime does not support the normal now(), hour(), minute(), etc. API.
Would it be thinkable to support a "default Timezone" that you setup on the object, so that the "TimeLib" API would also work?
I'm trying to get a list of all timezone names, but struggling to understand the ZoneInfo name format:
for (uint16_t n = 0; n < ace_time::zonedb::kZoneRegistrySize; n++) {
auto a = ace_time::zonedb::kZoneRegistry[n];
Serial.println(a->name);
}
This prints part of the name, but without the prefix/fragment.
22:3:56.584 -> �Detroit
22:3:56.585 -> �Bogota
22:3:56.586 -> �Glace_Bay
How would I get to a list that contains full names like Europe/London
?
Following the issue I raised last week in AceTimeClock (which is now resolved) I have updated AceTime to 2.2.3 AceTimeClock to 1.3.0 and AceCommon to 1.6.2. All is working. However if I move AceTime to 2.3.0 I get the compile errors below.
I am using the BasicZoneProcessor - which may be the issue and seems to be not recommended, but it does work in previous versions.
ld.exe: Sensor_MQTT_FrontDeck.cpp.o:(.literal._ZNK8ace_time5clock12EspSntpClock6getNowEv[_ZNK8ace_time5clock12EspSntpClock6getNowEv]+0x0): undefined reference to ace_time::Epoch::sDaysToCurrentEpochFromInternalEpoch
Error linking for board MH ET LIVE ESP32MiniKit (esp32_mhetesp32minikit)
Build failed for project 'Sensor_MQTT_FrontDeck'
ld.exe: Sensor_MQTT_FrontDeck.cpp.o:(.literal._ZNK8ace_time26BasicZoneProcessorTemplateINS_11zoneinfolow13ZoneInfoStoreINS1_11ZoneContextINS_5basic5BasicEEENS1_8ZoneInfoIS5_S6_EENS1_7ZoneEraIS5_EENS1_10ZonePolicyIS5_EENS1_8ZoneRuleIS5_EEEENS1_14ZoneInfoBrokerIS6_S8_SA_SC_SE_EENS1_13ZoneEraBrokerIS6_SA_SC_SE_EENS1_16ZonePolicyBrokerIS6_SC_SE_EENS1_14ZoneRuleBrokerIS6_SE_EEE16printShortNameToER5Print[_ZNK8ace_time26BasicZoneProcessorTemplateINS_11zoneinfolow13ZoneInfoStoreINS1_11ZoneContextINS_5basic5BasicEEENS1_8ZoneInfoIS5_S6_EENS1_7ZoneEraIS5_EENS1_10ZonePolicyIS5_EENS1_8ZoneRuleIS5_EEEENS1_14ZoneInfoBrokerIS6_S8_SA_SC_SE_EENS1_13ZoneEraBrokerIS6_SA_SC_SE_EENS1_16ZonePolicyBrokerIS6_SC_SE_EENS1_14ZoneRuleBrokerIS6_SE_EEE16printShortNameToER5Print]+0x0): undefined reference to ace_time::zoneinfo::findShortName(__FlashStringHelper const*)
ld.exe: Sensor_MQTT_FrontDeck.cpp.o:(.literal._ZNK8ace_time26BasicZoneProcessorTemplateINS_11zoneinfolow13ZoneInfoStoreINS1_11ZoneContextINS_5basic5BasicEEENS1_8ZoneInfoIS5_S6_EENS1_7ZoneEraIS5_EENS1_10ZonePolicyIS5_EENS1_8ZoneRuleIS5_EEEENS1_14ZoneInfoBrokerIS6_S8_SA_SC_SE_EENS1_13ZoneEraBrokerIS6_SA_SC_SE_EENS1_16ZonePolicyBrokerIS6_SC_SE_EENS1_14ZoneRuleBrokerIS6_SE_EEE16initForLocalDateERKNS_9LocalDateE[_ZNK8ace_time26BasicZoneProcessorTemplateINS_11zoneinfolow13ZoneInfoStoreINS1_11ZoneContextINS_5basic5BasicEEENS1_8ZoneInfoIS5_S6_EENS1_7ZoneEraIS5_EENS1_10ZonePolicyIS5_EENS1_8ZoneRuleIS5_EEEENS1_14ZoneInfoBrokerIS6_S8_SA_SC_SE_EENS1_13ZoneEraBrokerIS6_SA_SC_SE_EENS1_16ZonePolicyBrokerIS6_SC_SE_EENS1_14ZoneRuleBrokerIS6_SE_EEE16initForLocalDateERKNS_9LocalDateE]+0x8): undefined reference to ace_time::internal::createAbbreviation(char*, unsigned char, char const*, unsigned int, char const*)
ld.exe: Sensor_MQTT_FrontDeck.cpp.o: in function ace_time::zoneinfolow::ZoneInfoBroker<ace_time::zoneinfolow::ZoneContext<ace_time::basic::Basic>, ace_time::zoneinfolow::ZoneInfo<ace_time::basic::Basic, ace_time::zoneinfolow::ZoneContext<ace_time::basic::Basic> >, ace_time::zoneinfolow::ZoneEra<ace_time::basic::Basic>, ace_time::zoneinfolow::ZonePolicy<ace_time::basic::Basic>, ace_time::zoneinfolow::ZoneRule<ace_time::basic::Basic> >::printShortNameTo(Print&) const
BrokersLow.h:464: undefined reference to ace_time zoneinfo findShortName(__FlashStringHelper const*)
ld.exe: Sensor_MQTT_FrontDeck.cpp.o: in function ace_time::BasicZoneProcessorTemplate<ace_time::zoneinfolow::ZoneInfoStore<ace_time::zoneinfolow::ZoneContext<ace_time::basic::Basic>, ace_time::zoneinfolow::ZoneInfo<ace_time::basic::Basic, ace_time::zoneinfolow::ZoneContext<ace_time::basic::Basic> >, ace_time::zoneinfolow::ZoneEra<ace_time::basic::Basic>, ace_time::zoneinfolow::ZonePolicy<ace_time::basic::Basic>, ace_time::zoneinfolow::ZoneRule<ace_time::basic::Basic> >, ace_time::zoneinfolow::ZoneInfoBroker<ace_time::zoneinfolow::ZoneContext<ace_time::basic::Basic>, ace_time::zoneinfolow::ZoneInfo<ace_time::basic::Basic, ace_time::zoneinfolow::ZoneContext<ace_time::basic::Basic> >, ace_time::zoneinfolow::ZoneEra<ace_time::basic::Basic>, ace_time::zoneinfolow::ZonePolicy<ace_time::basic::Basic>, ace_time::zoneinfolow::ZoneRule<ace_time::basic::Basic> >, ace_time::zoneinfolow::ZoneEraBroker<ace_time::zoneinfolow::ZoneContext<ace_time::basic::Basic>, ace_time::zoneinfolow::ZoneEra<ace_time::basic::Basic>, ace_time::zoneinfolow::ZonePolicy<ace_time::basic::Basic>, ace_time::zoneinfolow::ZoneRule<ace_time::basic::Basic> >, ace_time::zoneinfolow::ZonePolicyBroker<ace_time::zoneinfolow::ZoneContext<ace_time::basic::Basic>, ace_time::zoneinfolow::ZonePolicy<ace_time::basic::Basic>, ace_time::zoneinfolow::ZoneRule<ace_time::basic::Basic> >, ace_time::zoneinfolow::ZoneRuleBroker<ace_time::zoneinfolow::ZoneContext<ace_time::basic::Basic>, ace_time::zoneinfolow::ZoneRule<ace_time::basic::Basic> > >::calcAbbreviations() const
BasicZoneProcessor.h:888: undefined reference to ace_time internal createAbbreviation(char*, unsigned char, char const*, unsigned int, char const*)
collect2.exe*: error: ld returned 1 exit status
I fixed this in controller.h by adding a manual config in setup. The code is below. I'm not an expert on git and don't have the time right now to do a pull request. Once some time is set, the manual clock change buttons, etc will work. But without this, it stays stuck at "Error". The new code is below setupClockInfo();
void setup() {
// Restore from EEPROM to retrieve time zone.
StoredInfo storedInfo;
bool isValid = mPersistentStore.readStoredInfo(storedInfo);
#if FORCE_INITIALIZE
setupClockInfo();
#else
if (isValid) {
restoreClockInfo(mClockInfo, storedInfo);
} else {
setupClockInfo();
auto pacificTz = mZoneManager.createForZoneIndex(mZoneIndex);
// Set the SystemClock using these components.
auto pacificTime = ZonedDateTime::forComponents(
2020, 2, 5, 4, 30, 0, pacificTz);
mClock.setNow(pacificTime.toEpochSeconds());
}
#endif
// Retrieve current time from Clock and set the current clockInfo.
updateDateTime();
}
In my situation, I want to give a flexible way to just enter common TZ references as a text field.
So instead of looking up just by the long name: Europe/Amsterdam
Would it also be possible to lookup by, just the short name: Amsterdam
Or the common TZ name: CET / CEDT
Or the country code: NL
A user can be pointed to the long name, but in most cases, the short name, Country Code or short name is enough too.
AceTime does not work on megaAVR boards because:
F()
macro returns the wrong type.I don't have the time to work on this, and I don't have any megaAVR boards that I can test on. I am explicitly blacklisting the megaAVR in AceTime.h
for now, so that the user gets a useful error message, instead of pages of compiler errors.
(This issue is identical to bxparks/AUnit#56).
I recently upgraded the toolchain I am using to build from gcc 5.4.1 to 11.3.1.
The compiler now emits this warning that looks valid although probably innocuous seeing that the code explicitly null terminates the string immediately after the strncpy call
In static member function 'static void ace_time::ExtendedZoneProcessorTemplate<BF, ZIB, ZEB, ZPB, ZRB>::createAbbreviation(char*, uint8_t, const char*, uint16_t, const char*) [with BF = ace_time::extended::BrokerFactory; ZIB = ace_time::extended::ZoneInfoBroker; ZEB = ace_time::extended::ZoneEraBroker; ZPB = ace_time::extended::ZonePolicyBroker; ZRB = ace_time::extended::ZoneRuleBroker]', inlined from 'static void ace_time::ExtendedZoneProcessorTemplate<BF, ZIB, ZEB, ZPB, ZRB>::createAbbreviation(char*, uint8_t, const char*, uint16_t, const char*) [with BF = ace_time::extended::BrokerFactory; ZIB = ace_time::extended::ZoneInfoBroker; ZEB = ace_time::extended::ZoneEraBroker; ZPB = ace_time::extended::ZonePolicyBroker; ZRB = ace_time::extended::ZoneRuleBroker]' at .pio/libdeps/teensy41/AceTime/src/ace_time/ExtendedZoneProcessor.h:2115:17, inlined from 'static void ace_time::ExtendedZoneProcessorTemplate<BF, ZIB, ZEB, ZPB, ZRB>::calcAbbreviations(ace_time::ExtendedZoneProcessorTemplate<BF, ZIB, ZEB, ZPB, ZRB>::Transition**, ace_time::ExtendedZoneProcessorTemplate<BF, ZIB, ZEB, ZPB, ZRB>::Transition**) [with BF = ace_time::extended::BrokerFactory; ZIB = ace_time::extended::ZoneInfoBroker; ZEB = ace_time::extended::ZoneEraBroker; ZPB = ace_time::extended::ZonePolicyBroker; ZRB = ace_time::extended::ZoneRuleBroker]' at .pio/libdeps/teensy41/AceTime/src/ace_time/ExtendedZoneProcessor.h:2098:27: .pio/libdeps/teensy41/AceTime/src/ace_time/ExtendedZoneProcessor.h:2149:18: warning: 'char* strncpy(char*, const char*, size_t)' specified bound 7 equals destination size [-Wstringop-truncation] 2149 | strncpy(dest, format, destSize); | ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
Perhaps the final argument should be changed to destSize-1 like line #2126?
I have difficulty understanding the choice to constuct NtpClock with Wi-Fi parameters. In a project which already uses Wi-Fi for other reason (e.g., running a web server), is there a way to create an NTP clock without running a Wi-Fi setup?
Thanks.
Hello,
I found that if I create ZoneManager like this:
ace_time::CompleteZoneManager zoneManager(
ace_time::zonedbc::kZoneRegistrySize, // note incorrect size passed, should be kZoneAndLinkRegistrySize
ace_time::zonedbc::kZoneAndLinkRegistry,
zoneProcessorCache);
the code hangs up while trying to enumerate them later:
// here we pass the correct size
zoneSorter.fillIndexes(indexes, ace_time::zonedbc::kZoneAndLinkRegistrySize);
zoneSorter.sortIndexes(indexes, ace_time::zonedbc::kZoneAndLinkRegistrySize);
// later...
auto zone = zoneManager.getZoneForIndex(indexes[0]); // hangs up here
I understand it's technically not a bug within the library, but maybe there's a way to prevent incorrect size passing? The size of array ace_time::zonedbc::kZoneAndLinkRegistry
is known at compile-time, so maybe it's possible to avoid passing its size directly?
Currently (v0.7.2), the AT and UNTIL times are handled with one-minute resolution. But the STDOFF and DST offsets (in RULES column with 'hh:mm' and SAVE column) are handled using a 15-minute resolution. The 15-minute resolution is sufficient for all timezones after the year 2000, but if we want to support historical DST shifts before year 2000, then we need to support one-minute resolution.
An example is Pacific/Kiritimati which used a UTC offset of -10:40 from 1901 to 1979:
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Pacific/Kiritimati -10:29:20 - LMT 1901
-10:40 - -1040 1979 Oct
-10:00 - -10
If we go very far back, there are a number of timezones which have UTC offsets in one-second resolution. Because I want to keep the zoneinfo files as small as possible, I don't think these will be supported. For curiosity, here is the output from tzcompiler.py
if we ask it to truncate the offsets to 1-minute resolution, for the years 1935 - 2050:
// Africa/El_Aaiun (STDOFF '-0:52:48' truncated to '-00:52')
// Africa/Johannesburg (RULES not fixed but FORMAT is missing '%' or '/')
// Africa/Monrovia (STDOFF '-0:44:30' truncated to '-00:44')
// America/Goose_Bay (STDOFF '-3:30:52' truncated to '-03:30')
// America/Managua (STDOFF '-5:45:12' truncated to '-05:45')
// America/Paramaribo (STDOFF '-3:40:36' truncated to '-03:40', STDOFF '-3:40:52' truncated to '-03:40')
// America/St_Johns (STDOFF '-3:30:52' truncated to '-03:30')
// Asia/Dhaka (STDOFF '5:53:20' truncated to '05:53')
// Asia/Riyadh (STDOFF '3:06:52' truncated to '03:06')
// Asia/Tehran (STDOFF '3:25:44' truncated to '03:25')
// Asia/Thimphu (STDOFF '5:58:36' truncated to '05:58')
// Atlantic/Azores (RULES not fixed but FORMAT is missing '%' or '/')
// Atlantic/Madeira (RULES not fixed but FORMAT is missing '%' or '/')
// Europe/Amsterdam (STDOFF '0:19:32' truncated to '00:19')
TZ Database version 2019b is the first version (in my short experience with the database) that contains the '<=' operator in 'dayOfWeek<=dayOfMonth' expression:
Rule Zion 2005 2012 - Apr Fri<=1 2:00 1:00 D
I added support for this in BasicZoneProcessor::calcStartDayOfMonth()
(and used by ExtendedZoneProcessor
as well). But it looks like I still have some bugs in the various Python scripts such as transformer.py
. The script needs to:
calcStartDayOfMonth()
_get_anchor_rule()
, triggered when generating zonedbx/
files between 1940 to 2050, since it then causes Rule Zion
to need an anchor rule, and the _get_anchor_rule()
barfs on the Fri<=1
In v. 0.8.1 there is no constructor for ace_time::clock::NtpClock::setup(void). As mentioned in the documentation, this should be the constructor to use when there is already an existing WLAN connection.
There is only a constructor for NtpClock::setup(const char* ssid, const char* password).
Otherwise, this library is a wonderful thing! Thanks!
The code to add to NtpClock.h would be:
void setup(void) {
mUdp.begin(mLocalPort);
#if ACE_TIME_NTP_CLOCK_DEBUG == 1
#if defined(ESP8266)
SERIAL_PORT_MONITOR.print(F("Local port: "));
SERIAL_PORT_MONITOR.println(mUdp.localPort());
#endif
#endif
mIsSetUp = true;
}
Hello,
I've seen your project has DS3231 support.
I want to suggest to add DS3232 support. It uses same control registers so you can use same files or simply add a note about supporting this RTC.
Also you can add DS1307 support; works the same as DS3232 but you may need to change addresses a little.
I've developed a minimal RTC library where you can see how they work, and there I have the three RTCs datasheets: https://github.com/Naguissa/uRTCLib/tree/master/extras
Cheers!
Your day of the week calculation is off by one. Today, Saturday, it returns 1. Oh and this is a leap year....not sure if this matters
Version 2019b was released on July 1.
https://mm.icann.org/pipermail/tz-announce/2019-July/000056.html
I have updated the code to handle the <=
in the expression {dayOfWeek}<={dayOfMonth}
. But I have nothing to test this code against. Will probably wait until pytz updates to this version.
The arduino::samd
core converted to using a new Arduino API for versions >= 1.8.10. (The SparkFun::samd core is fine). I don't have time to work on this right now, so I will explicitly blacklist these boards in AceTime.h
so that the user gets a useful error message, instead of pages of compiler errors.
(This issue is identical to bxparks/AUnit#66).
The question assumes no internet access by the design, with everything needed to determine the Timezone based on the GPS provided coordinates. The design would need to incorporate a database for position comparison. Not sure how AceTime works and if it provides this database, how it does the position comparison to the database, etc.
Thanks,
Hi,
i used your great library with an ESP8266 which works perfect.
But when compiling for ESP32 i get a lot of error messages ;-(
Is there a way to get AceTime running with an ESP32?
This is the error code pasted from Arduino IDE (sorry for that much text ;-(
There are also some other error messages in between but the most are related to acetime.
Would be great if you could help me running that library again
Arduino: 1.8.16 (Linux), Board: "ESP32 Dev Module, Disabled, Default 4MB with spiffs (1.2MB APP/1.5MB SPIFFS), 240MHz (WiFi/BT), QIO, 80MHz, 4MB (32Mb), 921600, None"
Arduino: 1.8.16 (Linux), Board: "ESP32 Dev Module, Disabled, Default 4MB with spiffs (1.2MB APP/1.5MB SPIFFS), 240MHz (WiFi/BT), QIO, 80MHz, 4MB (32Mb), 921600, None"
In file included from /home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/WString.h:29:0,
from /home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/Arduino.h:146,
from /media/daten/Arduino/mytestsketch/Code/mytestsketch/mytestsketch.ino:7:
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/common/DateStrings.h: In static member function 'static const char* ace_time::DateStrings::getStringAt(const char* const*, uint8_t)':
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:52:14: error: 'typeof_' was not declared in this scope
typeof(addr) _addr = (addr); \
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/common/DateStrings.h:73:28: note: in expansion of macro 'pgm_read_ptr'
return (const char*) pgm_read_ptr(&strings[i]);
^
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:53:21: error: '_addr' was not declared in this scope
*(void * const *)(_addr); \
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/common/DateStrings.h:73:28: note: in expansion of macro 'pgm_read_ptr'
return (const char*) pgm_read_ptr(&strings[i]);
^
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:53:27: error: void value not ignored as it ought to be
*(void * const *)(_addr); \
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/common/DateStrings.h:73:28: note: in expansion of macro 'pgm_read_ptr'
return (const char*) pgm_read_ptr(&strings[i]);
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/BasicBrokers.h: In member function 'const ace_time::basic::ZoneRuleBroker ace_time::basic::ZonePolicyBroker::rule(uint8_t) const':
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:52:14: error: 'typeof_' was not declared in this scope
typeof(addr) _addr = (addr); \
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/BasicBrokers.h:157:29: note: in expansion of macro 'pgm_read_ptr'
(const ZoneRule*) pgm_read_ptr(&mZonePolicy->rules);
^
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:53:21: error: '_addr' was not declared in this scope
*(void * const *)(_addr); \
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/BasicBrokers.h:157:29: note: in expansion of macro 'pgm_read_ptr'
(const ZoneRule*) pgm_read_ptr(&mZonePolicy->rules);
^
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:53:27: error: void value not ignored as it ought to be
*(void * const *)(_addr); \
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/BasicBrokers.h:157:29: note: in expansion of macro 'pgm_read_ptr'
(const ZoneRule*) pgm_read_ptr(&mZonePolicy->rules);
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/BasicBrokers.h: In member function 'const char* ace_time::basic::ZonePolicyBroker::letter(uint8_t) const':
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:52:14: error: 'typeof_' was not declared in this scope
typeof(addr) _addr = (addr); \
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/BasicBrokers.h:167:11: note: in expansion of macro 'pgm_read_ptr'
pgm_read_ptr(&mZonePolicy->letters);
^
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:53:21: error: '_addr' was not declared in this scope
*(void * const *)(_addr); \
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/BasicBrokers.h:167:11: note: in expansion of macro 'pgm_read_ptr'
pgm_read_ptr(&mZonePolicy->letters);
^
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:53:27: error: void value not ignored as it ought to be
*(void * const *)(_addr); \
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/BasicBrokers.h:167:11: note: in expansion of macro 'pgm_read_ptr'
pgm_read_ptr(&mZonePolicy->letters);
^
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:52:14: error: 'typeof_' was not declared in this scope
typeof(addr) _addr = (addr); \
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/BasicBrokers.h:168:28: note: in expansion of macro 'pgm_read_ptr'
return (const char*) pgm_read_ptr(&letters[i]);
^
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:53:21: error: '_addr' was not declared in this scope
*(void * const *)(_addr); \
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/BasicBrokers.h:168:28: note: in expansion of macro 'pgm_read_ptr'
return (const char*) pgm_read_ptr(&letters[i]);
^
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:53:27: error: void value not ignored as it ought to be
*(void * const *)(_addr); \
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/BasicBrokers.h:168:28: note: in expansion of macro 'pgm_read_ptr'
return (const char*) pgm_read_ptr(&letters[i]);
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/BasicBrokers.h: In member function 'const ace_time::basic::ZonePolicyBroker ace_time::basic::ZoneEraBroker::zonePolicy() const':
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:52:14: error: 'typeof_' was not declared in this scope
typeof(addr) _addr = (addr); \
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/BasicBrokers.h:215:31: note: in expansion of macro 'pgm_read_ptr'
(const ZonePolicy*) pgm_read_ptr(&mZoneEra->zonePolicy));
^
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:53:21: error: '_addr' was not declared in this scope
*(void * const *)(_addr); \
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/BasicBrokers.h:215:31: note: in expansion of macro 'pgm_read_ptr'
(const ZonePolicy*) pgm_read_ptr(&mZoneEra->zonePolicy));
^
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:53:27: error: void value not ignored as it ought to be
*(void * const *)(_addr); \
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/BasicBrokers.h:215:31: note: in expansion of macro 'pgm_read_ptr'
(const ZonePolicy*) pgm_read_ptr(&mZoneEra->zonePolicy));
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/BasicBrokers.h: In member function 'const char* ace_time::basic::ZoneEraBroker::format() const':
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:52:14: error: 'typeof_' was not declared in this scope
typeof(addr) _addr = (addr); \
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/BasicBrokers.h:227:28: note: in expansion of macro 'pgm_read_ptr'
return (const char*) pgm_read_ptr(&mZoneEra->format);
^
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:53:21: error: '_addr' was not declared in this scope
*(void * const *)(_addr); \
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/BasicBrokers.h:227:28: note: in expansion of macro 'pgm_read_ptr'
return (const char*) pgm_read_ptr(&mZoneEra->format);
^
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:53:27: error: void value not ignored as it ought to be
*(void * const *)(_addr); \
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/BasicBrokers.h:227:28: note: in expansion of macro 'pgm_read_ptr'
return (const char*) pgm_read_ptr(&mZoneEra->format);
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/BasicBrokers.h: In member function 'const ace_time::internal::ZoneContext* ace_time::basic::ZoneInfoBroker::zoneContext() const':
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:52:14: error: 'typeof_' was not declared in this scope
typeof(addr) _addr = (addr); \
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/BasicBrokers.h:309:11: note: in expansion of macro 'pgm_read_ptr'
pgm_read_ptr(&mZoneInfo->zoneContext);
^
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:53:21: error: '_addr' was not declared in this scope
*(void * const *)(_addr); \
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/BasicBrokers.h:309:11: note: in expansion of macro 'pgm_read_ptr'
pgm_read_ptr(&mZoneInfo->zoneContext);
^
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:53:27: error: void value not ignored as it ought to be
*(void * const *)(_addr); \
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/BasicBrokers.h:309:11: note: in expansion of macro 'pgm_read_ptr'
pgm_read_ptr(&mZoneInfo->zoneContext);
^
In file included from /home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/Arduino.h:146:0,
from /media/daten/Arduino/mytestsketch/Code/mytestsketch/mytestsketch.ino:7:
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/BasicBrokers.h: In member function 'const __FlashStringHelper* ace_time::basic::ZoneInfoBroker::name() const':
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:52:14: error: 'typeof_' was not declared in this scope
typeof(addr) _addr = (addr); \
^
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/WString.h:39:76: note: in definition of macro 'FPSTR'
#define FPSTR(pstr_pointer) (reinterpret_cast<const __FlashStringHelper *>(pstr_pointer))
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/BasicBrokers.h:313:20: note: in expansion of macro 'pgm_read_ptr'
return FPSTR(pgm_read_ptr(&mZoneInfo->name));
^
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:53:21: error: '_addr' was not declared in this scope
*(void * const *)(_addr); \
^
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/WString.h:39:76: note: in definition of macro 'FPSTR'
#define FPSTR(pstr_pointer) (reinterpret_cast<const __FlashStringHelper *>(pstr_pointer))
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/BasicBrokers.h:313:20: note: in expansion of macro 'pgm_read_ptr'
return FPSTR(pgm_read_ptr(&mZoneInfo->name));
^
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:53:27: error: void value not ignored as it ought to be
*(void * const *)(_addr); \
^
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/WString.h:39:76: note: in definition of macro 'FPSTR'
#define FPSTR(pstr_pointer) (reinterpret_cast<const __FlashStringHelper *>(pstr_pointer))
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/BasicBrokers.h:313:20: note: in expansion of macro 'pgm_read_ptr'
return FPSTR(pgm_read_ptr(&mZoneInfo->name));
^
In file included from /home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/WString.h:29:0,
from /home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/Arduino.h:146,
from /media/daten/Arduino/mytestsketch/Code/mytestsketch/mytestsketch.ino:7:
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/BasicBrokers.h: In member function 'uint32_t ace_time::basic::ZoneInfoBroker::zoneId() const':
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:44:14: error: 'typeof_' was not declared in this scope
typeof(addr) _addr = (addr); \
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/BasicBrokers.h:317:14: note: in expansion of macro 'pgm_read_dword'
return pgm_read_dword(&mZoneInfo->zoneId);
^
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:45:28: error: '_addr' was not declared in this scope
*(const unsigned long *)(_addr); \
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/BasicBrokers.h:317:14: note: in expansion of macro 'pgm_read_dword'
return pgm_read_dword(&mZoneInfo->zoneId);
^
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:46:2: error: void value not ignored as it ought to be
})
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/BasicBrokers.h:317:14: note: in expansion of macro 'pgm_read_dword'
return pgm_read_dword(&mZoneInfo->zoneId);
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/BasicBrokers.h: In member function 'const ace_time::basic::ZoneEraBroker ace_time::basic::ZoneInfoBroker::era(uint8_t) const':
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:52:14: error: 'typeof_' was not declared in this scope
typeof(addr) _addr = (addr); \
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/BasicBrokers.h:325:46: note: in expansion of macro 'pgm_read_ptr'
const ZoneEra* eras = (const ZoneEra*) pgm_read_ptr(&mZoneInfo->eras);
^
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:53:21: error: '_addr' was not declared in this scope
*(void * const *)(_addr); \
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/BasicBrokers.h:325:46: note: in expansion of macro 'pgm_read_ptr'
const ZoneEra* eras = (const ZoneEra*) pgm_read_ptr(&mZoneInfo->eras);
^
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:53:27: error: void value not ignored as it ought to be
*(void * const *)(_addr); \
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/BasicBrokers.h:325:46: note: in expansion of macro 'pgm_read_ptr'
const ZoneEra* eras = (const ZoneEra*) pgm_read_ptr(&mZoneInfo->eras);
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/BasicBrokers.h: In member function 'const ace_time::basic::ZoneInfo* ace_time::basic::ZoneRegistryBroker::zoneInfo(uint16_t) const':
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:52:14: error: 'typeof_' was not declared in this scope
typeof(addr) _addr = (addr); \
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/BasicBrokers.h:375:32: note: in expansion of macro 'pgm_read_ptr'
return (const ZoneInfo*) pgm_read_ptr(&mZoneRegistry[i]);
^
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:53:21: error: '_addr' was not declared in this scope
*(void * const *)(_addr); \
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/BasicBrokers.h:375:32: note: in expansion of macro 'pgm_read_ptr'
return (const ZoneInfo*) pgm_read_ptr(&mZoneRegistry[i]);
^
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:53:27: error: void value not ignored as it ought to be
*(void * const *)(_addr); \
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/BasicBrokers.h:375:32: note: in expansion of macro 'pgm_read_ptr'
return (const ZoneInfo*) pgm_read_ptr(&mZoneRegistry[i]);
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/BasicBrokers.h: In member function 'uint32_t ace_time::basic::LinkEntryBroker::zoneId() const':
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:44:14: error: 'typeof_' was not declared in this scope
typeof(addr) _addr = (addr); \
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/BasicBrokers.h:405:38: note: in expansion of macro 'pgm_read_dword'
uint32_t zoneId() const { return pgm_read_dword(&mLinkEntry->zoneId); }
^
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:45:28: error: '_addr' was not declared in this scope
*(const unsigned long *)(_addr); \
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/BasicBrokers.h:405:38: note: in expansion of macro 'pgm_read_dword'
uint32_t zoneId() const { return pgm_read_dword(&mLinkEntry->zoneId); }
^
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:46:2: error: void value not ignored as it ought to be
})
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/BasicBrokers.h:405:38: note: in expansion of macro 'pgm_read_dword'
uint32_t zoneId() const { return pgm_read_dword(&mLinkEntry->zoneId); }
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/BasicBrokers.h: In member function 'uint32_t ace_time::basic::LinkEntryBroker::linkId() const':
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:44:14: error: 'typeof_' was not declared in this scope
typeof(addr) _addr = (addr); \
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/BasicBrokers.h:406:38: note: in expansion of macro 'pgm_read_dword'
uint32_t linkId() const { return pgm_read_dword(&mLinkEntry->linkId); }
^
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:45:28: error: '_addr' was not declared in this scope
*(const unsigned long *)(_addr); \
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/BasicBrokers.h:406:38: note: in expansion of macro 'pgm_read_dword'
uint32_t linkId() const { return pgm_read_dword(&mLinkEntry->linkId); }
^
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:46:2: error: void value not ignored as it ought to be
})
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/BasicBrokers.h:406:38: note: in expansion of macro 'pgm_read_dword'
uint32_t linkId() const { return pgm_read_dword(&mLinkEntry->linkId); }
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/ExtendedBrokers.h: In member function 'const ace_time::extended::ZoneRuleBroker ace_time::extended::ZonePolicyBroker::rule(uint8_t) const':
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:52:14: error: 'typeof_' was not declared in this scope
typeof(addr) _addr = (addr); \
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/ExtendedBrokers.h:181:29: note: in expansion of macro 'pgm_read_ptr'
(const ZoneRule*) pgm_read_ptr(&mZonePolicy->rules);
^
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:53:21: error: '_addr' was not declared in this scope
*(void * const *)(_addr); \
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/ExtendedBrokers.h:181:29: note: in expansion of macro 'pgm_read_ptr'
(const ZoneRule*) pgm_read_ptr(&mZonePolicy->rules);
^
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:53:27: error: void value not ignored as it ought to be
*(void * const *)(_addr); \
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/ExtendedBrokers.h:181:29: note: in expansion of macro 'pgm_read_ptr'
(const ZoneRule*) pgm_read_ptr(&mZonePolicy->rules);
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/ExtendedBrokers.h: In member function 'const char* ace_time::extended::ZonePolicyBroker::letter(uint8_t) const':
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:52:14: error: 'typeof_' was not declared in this scope
typeof(addr) _addr = (addr); \
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/ExtendedBrokers.h:191:11: note: in expansion of macro 'pgm_read_ptr'
pgm_read_ptr(&mZonePolicy->letters);
^
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:53:21: error: '_addr' was not declared in this scope
*(void * const *)(_addr); \
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/ExtendedBrokers.h:191:11: note: in expansion of macro 'pgm_read_ptr'
pgm_read_ptr(&mZonePolicy->letters);
^
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:53:27: error: void value not ignored as it ought to be
*(void * const *)(_addr); \
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/ExtendedBrokers.h:191:11: note: in expansion of macro 'pgm_read_ptr'
pgm_read_ptr(&mZonePolicy->letters);
^
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:52:14: error: 'typeof_' was not declared in this scope
typeof(addr) _addr = (addr); \
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/ExtendedBrokers.h:192:28: note: in expansion of macro 'pgm_read_ptr'
return (const char*) pgm_read_ptr(&letters[i]);
^
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:53:21: error: '_addr' was not declared in this scope
*(void * const *)(_addr); \
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/ExtendedBrokers.h:192:28: note: in expansion of macro 'pgm_read_ptr'
return (const char*) pgm_read_ptr(&letters[i]);
^
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:53:27: error: void value not ignored as it ought to be
*(void * const *)(_addr); \
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/ExtendedBrokers.h:192:28: note: in expansion of macro 'pgm_read_ptr'
return (const char*) pgm_read_ptr(&letters[i]);
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/ExtendedBrokers.h: In member function 'const ace_time::extended::ZonePolicyBroker ace_time::extended::ZoneEraBroker::zonePolicy() const':
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:52:14: error: 'typeof_' was not declared in this scope
typeof(addr) _addr = (addr); \
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/ExtendedBrokers.h:241:31: note: in expansion of macro 'pgm_read_ptr'
(const ZonePolicy*) pgm_read_ptr(&mZoneEra->zonePolicy));
^
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:53:21: error: '_addr' was not declared in this scope
*(void * const *)(_addr); \
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/ExtendedBrokers.h:241:31: note: in expansion of macro 'pgm_read_ptr'
(const ZonePolicy*) pgm_read_ptr(&mZoneEra->zonePolicy));
^
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:53:27: error: void value not ignored as it ought to be
*(void * const *)(_addr); \
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/ExtendedBrokers.h:241:31: note: in expansion of macro 'pgm_read_ptr'
(const ZonePolicy*) pgm_read_ptr(&mZoneEra->zonePolicy));
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/ExtendedBrokers.h: In member function 'const char* ace_time::extended::ZoneEraBroker::format() const':
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:52:14: error: 'typeof_' was not declared in this scope
typeof(addr) _addr = (addr); \
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/ExtendedBrokers.h:255:28: note: in expansion of macro 'pgm_read_ptr'
return (const char*) pgm_read_ptr(&mZoneEra->format);
^
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:53:21: error: '_addr' was not declared in this scope
*(void * const *)(_addr); \
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/ExtendedBrokers.h:255:28: note: in expansion of macro 'pgm_read_ptr'
return (const char*) pgm_read_ptr(&mZoneEra->format);
^
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:53:27: error: void value not ignored as it ought to be
*(void * const *)(_addr); \
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/ExtendedBrokers.h:255:28: note: in expansion of macro 'pgm_read_ptr'
return (const char*) pgm_read_ptr(&mZoneEra->format);
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/ExtendedBrokers.h: In member function 'const ace_time::internal::ZoneContext* ace_time::extended::ZoneInfoBroker::zoneContext() const':
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:52:14: error: 'typeof_' was not declared in this scope
typeof(addr) _addr = (addr); \
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/ExtendedBrokers.h:341:11: note: in expansion of macro 'pgm_read_ptr'
pgm_read_ptr(&mZoneInfo->zoneContext);
^
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:53:21: error: '_addr' was not declared in this scope
*(void * const *)(_addr); \
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/ExtendedBrokers.h:341:11: note: in expansion of macro 'pgm_read_ptr'
pgm_read_ptr(&mZoneInfo->zoneContext);
^
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:53:27: error: void value not ignored as it ought to be
*(void * const *)(_addr); \
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/ExtendedBrokers.h:341:11: note: in expansion of macro 'pgm_read_ptr'
pgm_read_ptr(&mZoneInfo->zoneContext);
^
In file included from /home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/Arduino.h:146:0,
from /media/daten/Arduino/mytestsketch/Code/mytestsketch/mytestsketch.ino:7:
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/ExtendedBrokers.h: In member function 'const __FlashStringHelper* ace_time::extended::ZoneInfoBroker::name() const':
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:52:14: error: 'typeof_' was not declared in this scope
typeof(addr) _addr = (addr); \
^
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/WString.h:39:76: note: in definition of macro 'FPSTR'
#define FPSTR(pstr_pointer) (reinterpret_cast<const __FlashStringHelper *>(pstr_pointer))
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/ExtendedBrokers.h:345:20: note: in expansion of macro 'pgm_read_ptr'
return FPSTR(pgm_read_ptr(&mZoneInfo->name));
^
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:53:21: error: '_addr' was not declared in this scope
*(void * const *)(_addr); \
^
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/WString.h:39:76: note: in definition of macro 'FPSTR'
#define FPSTR(pstr_pointer) (reinterpret_cast<const __FlashStringHelper *>(pstr_pointer))
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/ExtendedBrokers.h:345:20: note: in expansion of macro 'pgm_read_ptr'
return FPSTR(pgm_read_ptr(&mZoneInfo->name));
^
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:53:27: error: void value not ignored as it ought to be
*(void * const *)(_addr); \
^
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/WString.h:39:76: note: in definition of macro 'FPSTR'
#define FPSTR(pstr_pointer) (reinterpret_cast<const __FlashStringHelper *>(pstr_pointer))
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/ExtendedBrokers.h:345:20: note: in expansion of macro 'pgm_read_ptr'
return FPSTR(pgm_read_ptr(&mZoneInfo->name));
^
In file included from /home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/WString.h:29:0,
from /home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/Arduino.h:146,
from /media/daten/Arduino/mytestsketch/Code/mytestsketch/mytestsketch.ino:7:
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/ExtendedBrokers.h: In member function 'uint32_t ace_time::extended::ZoneInfoBroker::zoneId() const':
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:44:14: error: 'typeof_' was not declared in this scope
typeof(addr) _addr = (addr); \
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/ExtendedBrokers.h:349:14: note: in expansion of macro 'pgm_read_dword'
return pgm_read_dword(&mZoneInfo->zoneId);
^
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:45:28: error: '_addr' was not declared in this scope
*(const unsigned long *)(_addr); \
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/ExtendedBrokers.h:349:14: note: in expansion of macro 'pgm_read_dword'
return pgm_read_dword(&mZoneInfo->zoneId);
^
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:46:2: error: void value not ignored as it ought to be
})
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/ExtendedBrokers.h:349:14: note: in expansion of macro 'pgm_read_dword'
return pgm_read_dword(&mZoneInfo->zoneId);
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/ExtendedBrokers.h: In member function 'const ace_time::extended::ZoneEraBroker ace_time::extended::ZoneInfoBroker::era(uint8_t) const':
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:52:14: error: 'typeof_' was not declared in this scope
typeof(addr) _addr = (addr); \
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/ExtendedBrokers.h:357:46: note: in expansion of macro 'pgm_read_ptr'
const ZoneEra* eras = (const ZoneEra*) pgm_read_ptr(&mZoneInfo->eras);
^
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:53:21: error: '_addr' was not declared in this scope
*(void * const *)(_addr); \
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/ExtendedBrokers.h:357:46: note: in expansion of macro 'pgm_read_ptr'
const ZoneEra* eras = (const ZoneEra*) pgm_read_ptr(&mZoneInfo->eras);
^
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:53:27: error: void value not ignored as it ought to be
*(void * const *)(_addr); \
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/ExtendedBrokers.h:357:46: note: in expansion of macro 'pgm_read_ptr'
const ZoneEra* eras = (const ZoneEra*) pgm_read_ptr(&mZoneInfo->eras);
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/ExtendedBrokers.h: In member function 'const ace_time::extended::ZoneInfo* ace_time::extended::ZoneRegistryBroker::zoneInfo(uint16_t) const':
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:52:14: error: 'typeof_' was not declared in this scope
typeof(addr) _addr = (addr); \
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/ExtendedBrokers.h:407:32: note: in expansion of macro 'pgm_read_ptr'
return (const ZoneInfo*) pgm_read_ptr(&mZoneRegistry[i]);
^
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:53:21: error: '_addr' was not declared in this scope
*(void * const *)(_addr); \
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/ExtendedBrokers.h:407:32: note: in expansion of macro 'pgm_read_ptr'
return (const ZoneInfo*) pgm_read_ptr(&mZoneRegistry[i]);
^
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:53:27: error: void value not ignored as it ought to be
*(void * const *)(_addr); \
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/ExtendedBrokers.h:407:32: note: in expansion of macro 'pgm_read_ptr'
return (const ZoneInfo*) pgm_read_ptr(&mZoneRegistry[i]);
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/ExtendedBrokers.h: In member function 'uint32_t ace_time::extended::LinkEntryBroker::zoneId() const':
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:44:14: error: 'typeof_' was not declared in this scope
typeof(addr) _addr = (addr); \
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/ExtendedBrokers.h:437:38: note: in expansion of macro 'pgm_read_dword'
uint32_t zoneId() const { return pgm_read_dword(&mLinkEntry->zoneId); }
^
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:45:28: error: '_addr' was not declared in this scope
*(const unsigned long *)(_addr); \
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/ExtendedBrokers.h:437:38: note: in expansion of macro 'pgm_read_dword'
uint32_t zoneId() const { return pgm_read_dword(&mLinkEntry->zoneId); }
^
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:46:2: error: void value not ignored as it ought to be
})
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/ExtendedBrokers.h:437:38: note: in expansion of macro 'pgm_read_dword'
uint32_t zoneId() const { return pgm_read_dword(&mLinkEntry->zoneId); }
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/ExtendedBrokers.h: In member function 'uint32_t ace_time::extended::LinkEntryBroker::linkId() const':
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:44:14: error: 'typeof_' was not declared in this scope
typeof(addr) _addr = (addr); \
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/ExtendedBrokers.h:438:38: note: in expansion of macro 'pgm_read_dword'
uint32_t linkId() const { return pgm_read_dword(&mLinkEntry->linkId); }
^
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:45:28: error: '_addr' was not declared in this scope
*(const unsigned long *)(_addr); \
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/ExtendedBrokers.h:438:38: note: in expansion of macro 'pgm_read_dword'
uint32_t linkId() const { return pgm_read_dword(&mLinkEntry->linkId); }
^
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:46:2: error: void value not ignored as it ought to be
})
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/internal/ExtendedBrokers.h:438:38: note: in expansion of macro 'pgm_read_dword'
uint32_t linkId() const { return pgm_read_dword(&mLinkEntry->linkId); }
^
/media/daten/Arduino/mytestsketch/Code/mytestsketch/mytestsketch.ino: In function 'void setup()':
mytestsketch:372:34: error: invalid conversion from 'const char*' to 'long int' [-fpermissive]
configTime(MY_TZ, MY_NTP_SERVER); // Wird für die Abfrage der Uhrzeit online benötigt (nur falls eine WLAN-Verbindung besteht und nur für das erste Mal einschalten...
^
mytestsketch:372:34: error: invalid conversion from 'const char*' to 'int' [-fpermissive]
mytestsketch:372:34: error: too few arguments to function 'void configTime(long int, int, const char*, const char*, const char*)'
In file included from /media/daten/Arduino/mytestsketch/Code/mytestsketch/mytestsketch.ino:7:0:
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/Arduino.h:173:17: note: declared here
extern "C" void configTime(long gmtOffset_sec, int daylightOffset_sec,
^
/media/daten/Arduino/mytestsketch/Code/mytestsketch/mytestsketch.ino: In lambda function:
mytestsketch:605:37: error: 'firmwareUpdate' was not declared in this scope
server.send(200, "text/html", firmwareUpdate);
^
/media/daten/Arduino/mytestsketch/Code/mytestsketch/mytestsketch.ino: In function 'void setup()':
mytestsketch:645:61: error: no matching function for call to 'WiFiUDP::beginMulticast(IPAddress, IPAddress&, const uint16_t&)'
if (!Udp.beginMulticast(WiFi.softAPIP(), multicastIP, PORT)) {
^
In file included from /home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/libraries/WiFi/src/WiFi.h:39:0,
from /home/basementmedia/Arduino/libraries/AceTime/src/ace_time/clock/NtpClock.h:15,
from /home/basementmedia/Arduino/libraries/AceTime/src/AceTime.h:68,
from /media/daten/Arduino/mytestsketch/Code/mytestsketch/mytestsketch.ino:69:
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/libraries/WiFi/src/WiFiUdp.h:57:11: note: candidate: virtual uint8_t WiFiUDP::beginMulticast(IPAddress, uint16_t)
uint8_t beginMulticast(IPAddress a, uint16_t p);
^
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/libraries/WiFi/src/WiFiUdp.h:57:11: note: candidate expects 2 arguments, 3 provided
/media/daten/Arduino/mytestsketch/Code/mytestsketch/mytestsketch.ino: In function 'void AP_conn()':
mytestsketch:656:25: error: 'class EspClass' has no member named 'getChipId'
uint32_t chipid = ESP.getChipId();
^
^
exit status 1
invalid conversion from 'const char*' to 'long int' [-fpermissive]
Asia/Dushanbe in 1991 has an entry where the FORMAT column contains a '/' but the RULES column contains a 1:00.
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Dushanbe 4:35:12 - LMT 1924 May 2
5:00 - +05 1930 Jun 21
6:00 RussiaAsia +06/+07 1991 Mar 31 2:00s
5:00 1:00 +05/+06 1991 Sep 9 2:00s
5:00 - +05
This probably indicates that the abbreviation should be "+06". Currently, BasicZoneProcessor
does not handle this case, and will be excluded by transformer.py
, and the entry is moot because the zonedb files are generated only for year 2000 and later. It should be relatively easy to fix BasicZoneProcessor
to handle this.
Hi Brian,
just wanted to use your great library with an ESP32 Board and got a bunch of error messages after sketch upload.
If i just include the library by
#include <AceTime.h>
i get a huge fault message starting like this (just a few lines, complete message is very long):
In file included from /home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/WString.h:29:0,
from /home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/Arduino.h:146,
from sketch/waterbot_v44_esp32_v2.ino.cpp:1:
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/common/DateStrings.h: In static member function 'static const char* ace_time::DateStrings::getStringAt(const char* const*, uint8_t)':
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:52:14: error: 'typeof_' was not declared in this scope
typeof(addr) _addr = (addr); \
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/common/DateStrings.h:73:28: note: in expansion of macro 'pgm_read_ptr'
return (const char*) pgm_read_ptr(&strings[i]);
^
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:53:21: error: '_addr' was not declared in this scope
*(void * const *)(_addr); \
^
/home/basementmedia/Arduino/libraries/AceTime/src/ace_time/common/DateStrings.h:73:28: note: in expansion of macro 'pgm_read_ptr'
return (const char*) pgm_read_ptr(&strings[i]);
^
/home/basementmedia/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/pgmspace.h:53:27: error: void value not ignored as it ought to be
*(void * const *)(_addr); \
^
Is this library not compatible to the ESP32?
Best wishes
Daniel
Compiling sketch: /home/runner/Arduino/libraries/AceTime/examples/HelloDateTime
In file included from /home/runner/.arduino15/packages/arduino/hardware/samd/1.8.11/cores/arduino/api/ArduinoAPI.h:31:0,
from /home/runner/.arduino15/packages/arduino/hardware/samd/1.8.11/cores/arduino/Arduino.h:23,
from /home/runner/Arduino/libraries/AceTime/src/ace_time/LocalDateTime.h:12,
from /home/runner/Arduino/libraries/AceTime/src/ace_time/OffsetDateTime.h:11,
from /home/runner/Arduino/libraries/AceTime/src/ace_time/ZonedDateTime.h:11,
from /home/runner/Arduino/libraries/AceTime/src/ace_time/ZonedDateTime.cpp:7:
/home/runner/.arduino15/packages/arduino/hardware/samd/1.8.11/cores/arduino/api/Print.h:96:16: error: 'Print' is already declared in this scope
using arduino::Print;
^~~~~
Error during build: exit status 1
Error: Compilation failed
Hi,
Not an issue, but rather a question:
Is it possible to run AceTime with an external tz db?
For instance, on esp32 chips? There is a flash filesystem that could be updated OTA without recompiling the code.
For other MCUs - the DB could be on SD card.
Is it possible? Is it doable given current architecture even if it needs to be changed?
I am trying to use this library on a Nano 33 IOT device which has built-in Wifi support and I have successfully run the example programs. It would be cleanest to use your NtpClock but it appears I have to develop my own because the current implementation requires an ESP8266, and I don't want to mess with the standard libraries to fix it. In general I am building a sophisticated system that has many users of the wifi, and it's best to just make yours assume that wifi is somehow provided and not only by an 8266.
Library Version: 2.2.3 in Platform.io for ESP32
In file included from .pio\libdeps\esp32doit-devkit-v1\AceCommon\src/AceCommon.h:54:0,
from .pio\libdeps\esp32doit-devkit-v1\AceTime\src/zoneinfo/ZoneRegistrar.h:10,
from .pio\libdeps\esp32doit-devkit-v1\AceTime\src/AceTime.h:31,
from include/hardware_drivers.h:13,
from src\hardware_drivers.cpp:1:
.pio\libdeps\esp32doit-devkit-v1\AceCommon\src/print_str/PrintStr.h:127:10: error: 'void ace_common::PrintStrBase::flush()' marked 'override', but does not override
void flush() override {
^
Compiling .pio\build\esp32doit-devkit-v1\lib313\TinyGPSPlus\TinyGPS++.cpp.o
Compiling .pio\build\esp32doit-devkit-v1\lib97d\AceCommon\backslash_x_encoding\backslash_x_encoding.cpp.o
In file included from .pio\libdeps\esp32doit-devkit-v1\AceCommon\src/AceCommon.h:54:0,
from .pio\libdeps\esp32doit-devkit-v1\AceTime\src/zoneinfo/ZoneRegistrar.h:10,
from .pio\libdeps\esp32doit-devkit-v1\AceTime\src/AceTime.h:31,
from include/hardware_drivers.h:13,
from src\main.cpp:2:
.pio\libdeps\esp32doit-devkit-v1\AceCommon\src/print_str/PrintStr.h:127:10: error: 'void ace_common::PrintStrBase::flush()' marked 'override', but does not override
void flush() override {
^
Compiling .pio\build\esp32doit-devkit-v1\lib97d\AceCommon\cstrings\copyReplace.cpp.o
*** [.pio\build\esp32doit-devkit-v1\src\hardware_drivers.cpp.o] Error 1
*** [.pio\build\esp32doit-devkit-v1\src\main.cpp.o] Error 1
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.