From adb0dac0770c81921e956d9dd138f4f8aef7f843 Mon Sep 17 00:00:00 2001 From: Ivan Grokhotkov Date: Sat, 7 Nov 2015 23:52:59 +0300 Subject: [PATCH 1/6] Don't close UDP pcbs when WiFi connection drops (#969) --- libraries/ESP8266WiFi/src/ESP8266WiFi.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFi.cpp b/libraries/ESP8266WiFi/src/ESP8266WiFi.cpp index 149a5c6539..665ef46ead 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFi.cpp +++ b/libraries/ESP8266WiFi/src/ESP8266WiFi.cpp @@ -831,7 +831,6 @@ void ESP8266WiFiClass::_eventCallback(void* arg) if (event->event == EVENT_STAMODE_DISCONNECTED) { WiFiClient::stopAll(); - WiFiUDP::stopAll(); } } From 11340a5d7643bef60d9cf61ef27a72186ed4f44c Mon Sep 17 00:00:00 2001 From: Ivan Grokhotkov Date: Sun, 8 Nov 2015 15:01:17 +0300 Subject: [PATCH 2/6] Fix some typos --- doc/ota_updates.md | 64 ++++++++++++++++++++-------------------------- 1 file changed, 28 insertions(+), 36 deletions(-) diff --git a/doc/ota_updates.md b/doc/ota_updates.md index d607c4e11b..a78ab02eb1 100644 --- a/doc/ota_updates.md +++ b/doc/ota_updates.md @@ -7,47 +7,45 @@ title: OTA Update * [Arduino IDE](#arduino-ide) * [HTTP Server](#http-server) * [Stream Interface](#stream-interface) - + ## Basic Requirements -- Flash chip size is 2x the size of the sketch - +- Flash chip size is 2x the size of the sketch. + ## Arduino IDE TODO describe Arduino IDE OTA process #### Requirements - - The ESP and the Computer must be connected to the Same network. - + - The ESP and the computer must be connected to the same network. ## HTTP Server -the ```ESPhttpUpdate``` class can check for updates and download a binary file form a HTTP web server. -It is possible to download updates from every IP or domain address on the Network or Internet. - +```ESPhttpUpdate``` class can check for updates and download a binary file from HTTP web server. +It is possible to download updates from every IP or domain address on the network or Internet. #### Requirements - web server - #### Arduino code -##### simple updater +##### Simple updater -the Simple Updater downloads the File every time the function is called. +Simple updater downloads the file every time the function is called. ```cpp ESPhttpUpdate.update("192.168.0.2", 80, "/arduino.bin"); ``` -##### advanced updater +##### Advanced updater -Its possible to point to a script at the server. -If a version String is delivered to the Function this String will be send to the server. -A Server side Update check is now possible. +Its possible to point update function to a script at the server. +If version string argument is given, it will be sent to the server. +Server side script can use this to check if update should be performed. -the Server can return a binary file for update (Header 200) -or it return header 304 to notify the ESP that no Update is needed. +Server side script can respond as follows: +- response code 200, and send the firmware image, +- or response code 304 to notify ESP that no update is required. ```cpp t_httpUpdate_return ret = ESPhttpUpdate.update("192.168.0.2", 80, "/esp/update/arduino.php", "optional current version string here"); @@ -59,23 +57,23 @@ switch(ret) { Serial.println("[update] Update no Update."); break; case HTTP_UPDATE_OK: - Serial.println("[update] Update ok."); // may not called we reboot the ESP + Serial.println("[update] Update ok."); // may not called we reboot the ESP break; } ``` #### Server request handling -##### simple updater +##### Simple updater -for the simple Updater the Server only needs to deliver the binary file for update. +For the simple updater the server only needs to deliver the binary file for update. -##### advanced updater +##### Advanced updater -for advanced update management a Script needs to run at the Server side, for example a PHP script. -at every Update request the the ESP sends some informations in the Header to the Server +For advanced update management a script needs to run at the server side, for example a PHP script. +At every update request the the ESP sends some information in HTTP headers to the server. -example Header data: +Example header data: ``` [HTTP_USER_AGENT] => ESP8266-http-Update [HTTP_X_ESP8266_STA_MAC] => 18:FE:AA:AA:AA:AA @@ -87,10 +85,9 @@ example Header data: [HTTP_X_ESP8266_VERSION] => DOOR-7-g14f53a19 ``` -with this information the script now can check if a update is needed. -It is also possible to deliver different binary´s based on the MAC address for example. +With this information the script now can check if a update is needed. It is also possible to deliver different binaries based on the MAC address for example. -script example: +Script example: ```php Date: Sun, 8 Nov 2015 23:44:25 +0300 Subject: [PATCH 3/6] Add libc time functions Merging https://github.com/igrr/axtls-8266/pull/1 by @Juppit into the core --- cores/esp8266/Arduino.h | 4 +- cores/esp8266/libc_replacements.c | 18 ----- cores/esp8266/time.c | 128 ++++++++++++++++++++++++++++++ tests/Time/Time.ino | 35 ++++++++ 4 files changed, 166 insertions(+), 19 deletions(-) create mode 100644 cores/esp8266/time.c create mode 100644 tests/Time/Time.ino diff --git a/cores/esp8266/Arduino.h b/cores/esp8266/Arduino.h index 8f440f27bb..6a77366344 100644 --- a/cores/esp8266/Arduino.h +++ b/cores/esp8266/Arduino.h @@ -153,7 +153,7 @@ void ets_intr_unlock(); // level (0-15), interrupts of the given level and above will be active // level 15 will disable ALL interrupts, // level 0 will enable ALL interrupts, -// +// #define xt_rsil(level) (__extension__({uint32_t state; __asm__ __volatile__("rsil %0," __STRINGIFY(level) : "=a" (state)); state;})) #define xt_wsr_ps(state) __asm__ __volatile__("wsr %0,ps; isync" :: "a" (state) : "memory") @@ -271,6 +271,8 @@ long random(long, long); void randomSeed(unsigned long); long map(long, long, long, long, long); +extern "C" void configTime(int timezone, int daylightOffset_sec, + const char* server1, const char* server2 = nullptr, const char* server3 = nullptr); #endif diff --git a/cores/esp8266/libc_replacements.c b/cores/esp8266/libc_replacements.c index d77d5c3979..f7d1420e3c 100644 --- a/cores/esp8266/libc_replacements.c +++ b/cores/esp8266/libc_replacements.c @@ -393,24 +393,6 @@ int* __errno(void) { return &errno_var; } - -char * ctime(const time_t *clock) { - return 0; -} - -time_t time(time_t * t) { - return 0; -} - -int gettimeofday(void *tp, void *tzp) { - return 0; -} - -time_t mktime(struct tm *timp) { - return 0; -} - - /* * begin newlib/string/strlcpy.c * diff --git a/cores/esp8266/time.c b/cores/esp8266/time.c new file mode 100644 index 0000000000..ff407cef40 --- /dev/null +++ b/cores/esp8266/time.c @@ -0,0 +1,128 @@ +/* + * time.c - ESP8266-specific functions for SNTP + * Copyright (c) 2015 Peter Dobler. All rights reserved. + * This file is part of the esp8266 core for Arduino environment. + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU Lesser General Public License for more details. + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include +#include "sntp.h" + + +#ifndef _TIMEVAL_DEFINED +#define _TIMEVAL_DEFINED +struct timeval { + time_t tv_sec; + suseconds_t tv_usec; +}; +#endif + +extern char* sntp_asctime(const struct tm *t); +extern struct tm* sntp_localtime(const time_t *clock); + +// time gap in seconds from 01.01.1900 (NTP time) to 01.01.1970 (UNIX time) +#define DIFF1900TO1970 2208988800UL + +static int s_daylightOffset_sec = 0; +static int s_timezone_sec = 0; +static time_t s_bootTime = 0; + +// calculate offset used in gettimeofday +static void ensureBootTimeIsSet() +{ + if (!s_bootTime) + { + time_t now = sntp_get_current_timestamp(); + if (now) + { + s_bootTime = - millis() / 1000; + } + } +} + +static void setServer(int id, const char* name_or_ip) +{ + if (name_or_ip) + { + //TODO: check whether server is given by name or IP + sntp_setservername(0, (char*) name_or_ip); + } +} + +void configTime(int timezone, int daylightOffset_sec, const char* server1, const char* server2, const char* server3) +{ + sntp_stop(); + + setServer(0, server1); + setServer(1, server2); + setServer(2, server3); + + s_timezone_sec = timezone; + s_daylightOffset_sec = daylightOffset_sec; + sntp_set_timezone(timezone/3600); + sntp_init(); +} + +int clock_gettime(clockid_t unused, struct timespec *tp) +{ + tp->tv_sec = millis() / 1000; + tp->tv_nsec = micros() * 1000; + return 0; +} + +// seconds since 1970 +time_t mktime(struct tm *t) +{ + // system_mktime expects month in range 1..12 + #define START_MONTH 1 + return DIFF1900TO1970 + system_mktime(t->tm_year, t->tm_mon + START_MONTH, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec); +} + +time_t time(time_t * t) +{ + time_t seconds = sntp_get_current_timestamp(); + ensureBootTimeIsSet(); + if (t) + { + *t = seconds; + } + return seconds; +} + +char* asctime(const struct tm *t) +{ + return sntp_asctime(t); +} + +struct tm* localtime(const time_t *clock) +{ + return sntp_localtime(clock); +} + +char* ctime(const time_t *t) +{ + struct tm* p_tm = localtime(t); + char* result = asctime(p_tm); + return result; +} + +int gettimeofday(struct timeval *tp, void *tzp) +{ + if (tp) + { + ensureBootTimeIsSet(); + tp->tv_sec = (s_bootTime + millis()) / 1000; + tp->tv_usec = micros() * 1000; + } +} diff --git a/tests/Time/Time.ino b/tests/Time/Time.ino new file mode 100644 index 0000000000..e4078534ae --- /dev/null +++ b/tests/Time/Time.ino @@ -0,0 +1,35 @@ +#include +#include + +const char* ssid = ".........."; +const char* password = ".........."; + +int timezone = 3; +int dst = 0; + +void setup() { + Serial.begin(115200); + Serial.setDebugOutput(true); + + WiFi.mode(WIFI_STA); + WiFi.begin(ssid, password); + Serial.println("\nConnecting to WiFi"); + while (WiFi.status() != WL_CONNECTED) { + Serial.print("."); + delay(1000); + } + + configTime(3 * 3600, 0, "pool.ntp.org", "time.nist.gov"); + Serial.println("\nWaiting for time"); + while (!time(nullptr)) { + Serial.print("."); + delay(1000); + } + Serial.println(""); +} + +void loop() { + time_t now = time(nullptr); + Serial.println(ctime(&now)); + delay(1000); +} From 46468d4af7ace336c31029372368154ce3000b59 Mon Sep 17 00:00:00 2001 From: Ivan Grokhotkov Date: Mon, 9 Nov 2015 00:18:08 +0300 Subject: [PATCH 4/6] I2C: generate STOP in case of NACK (fix #698, #254) thanks @petrd and @Yazzcat --- cores/esp8266/core_esp8266_si2c.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/cores/esp8266/core_esp8266_si2c.c b/cores/esp8266/core_esp8266_si2c.c index 1db11bb874..4008c5c8f0 100644 --- a/cores/esp8266/core_esp8266_si2c.c +++ b/cores/esp8266/core_esp8266_si2c.c @@ -150,9 +150,15 @@ static unsigned char twi_read_byte(bool nack) { unsigned char twi_writeTo(unsigned char address, unsigned char * buf, unsigned int len, unsigned char sendStop){ unsigned int i; if(!twi_write_start()) return 4;//line busy - if(!twi_write_byte(((address << 1) | 0) & 0xFF)) return 2;//received NACK on transmit of address - for(i=0; i Date: Sun, 8 Nov 2015 22:48:48 +0100 Subject: [PATCH 5/6] add missing exit in php sample --- doc/ota_updates.md | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/ota_updates.md b/doc/ota_updates.md index a78ab02eb1..f6821391f3 100644 --- a/doc/ota_updates.md +++ b/doc/ota_updates.md @@ -142,6 +142,7 @@ if(isset($db[$_SERVER['HTTP_X_ESP8266_STA_MAC']])) { } else { header($_SERVER["SERVER_PROTOCOL"].' 304 Not Modified', true, 304); } + exit(); } header($_SERVER["SERVER_PROTOCOL"].' 500 no version for ESP MAC', true, 500); From 810ab68ae5ad89d24a57ed8d18c8ff6acbb54349 Mon Sep 17 00:00:00 2001 From: Ivan Grokhotkov Date: Mon, 9 Nov 2015 01:37:22 +0300 Subject: [PATCH 6/6] Fix WiFiClientSecure::connected (#43) thanks @whyameye --- libraries/ESP8266WiFi/src/WiFiClientSecure.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/libraries/ESP8266WiFi/src/WiFiClientSecure.cpp b/libraries/ESP8266WiFi/src/WiFiClientSecure.cpp index 7953e06230..749439b881 100644 --- a/libraries/ESP8266WiFi/src/WiFiClientSecure.cpp +++ b/libraries/ESP8266WiFi/src/WiFiClientSecure.cpp @@ -267,6 +267,9 @@ int WiFiClientSecure::available() { } uint8_t WiFiClientSecure::connected() { + if (!_client) + return 0; + if (_client->state() == ESTABLISHED) return 1;