From baa13f8c841654fdb83a67fe1d41ecc31921813e Mon Sep 17 00:00:00 2001 From: Carl Pacey Date: Fri, 13 Nov 2015 12:47:57 -0500 Subject: [PATCH 01/20] Add the ability to be called back when the device is about to reset Caveats: - You have to be very careful in your callback. - On Adafruit Huzzah, I only actually get called for Exceptions and Soft WDT resets. --- cores/esp8266/core_esp8266_postmortem.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/cores/esp8266/core_esp8266_postmortem.c b/cores/esp8266/core_esp8266_postmortem.c index bff41f58f..1fd929e85 100644 --- a/cores/esp8266/core_esp8266_postmortem.c +++ b/cores/esp8266/core_esp8266_postmortem.c @@ -37,6 +37,11 @@ static void uart1_write_char_d(char c); static void print_stack(uint32_t start, uint32_t end); //static void print_pcs(uint32_t start, uint32_t end); +extern void __custom_crash_callback( struct rst_info * rst_info, uint32_t stack, uint32_t stack_end ) { +} + +extern void custom_crash_callback( struct rst_info * rst_info, uint32_t stack, uint32_t stack_end ) __attribute__ ((weak, alias("__custom_crash_callback"))); + void __wrap_system_restart_local() { register uint32_t sp asm("a1"); @@ -92,6 +97,9 @@ void __wrap_system_restart_local() { // print_pcs(sp + offset, stack_end); print_stack(sp + offset, stack_end); + + custom_crash_callback( &rst_info, sp + offset, stack_end ); + delayMicroseconds(10000); __real_system_restart_local(); } From 9db650482cc255e4d49fb3e9a8bf6ad0a5fdc900 Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Sat, 14 Nov 2015 12:48:19 +0100 Subject: [PATCH 02/20] add documentation about boot messages and mode meaning --- doc/boards.md | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/doc/boards.md b/doc/boards.md index cf8c9343f..088f591e9 100644 --- a/doc/boards.md +++ b/doc/boards.md @@ -162,3 +162,52 @@ ESPxx Hardware ### Improved Stability ![ESP improved stability](ESP_improved_stability.png) + +### Boot Messages and Modes + +The ESP module checks at every boot the Pins 0, 2 and 15. +based on them its boots in different modes: + +| GPIO15 | GPIO0 | GPIO2 | Mode | +| ------ | ----- | ----- | -------------------------------- | +| 0V | 0V | 3.3V | Uart Bootloader | +| 0V | 3.3V | 3.3V | Boot sketch (SPI flash) | +| 3.3V | x | x | SDIO mode (not used for Arduino) | + + +at startup the ESP prints out the current boot mode example: +``` +rst cause:2, boot mode:(3,6) +``` + +#### rst cause + +| Number | Description | +| ------ | ---------------------- | +| 0 | unknown | +| 1 | normal boot | +| 2 | reset pin | +| 3 | software reset | +| 4 | watchdog reset | + + +#### boot mode + +the first value respects the pin setup of the Pins 0, 2 and 15. + +| Number | GPIO15 | GPIO0 | GPIO2 | Mode | +| ------ | ------ | ----- | ----- | ---------- | +| 0 | 0V | 0V | 0V | Not valid | +| 1 | 0V | 0V | 3.3V | Uart | +| 2 | 0V | 3.3V | 0V | Not valid | +| 3 | 0V | 3.3V | 3.3V | Flash | +| 4 | 3.3V | 0V | 0V | SDIO | +| 5 | 3.3V | 0V | 3.3V | SDIO | +| 6 | 3.3V | 3.3V | 0V | SDIO | +| 7 | 3.3V | 3.3V | 3.3V | SDIO | + +Note: + +number = ((GPIO15 << 2) | (GPIO0 << 1) | GPIO2); + + From 5192ddb8cbbacfa875180487054ee6a7f69957b7 Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Sat, 14 Nov 2015 12:53:27 +0100 Subject: [PATCH 03/20] add node about TX on GPIO2 --- doc/boards.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/doc/boards.md b/doc/boards.md index 088f591e9..746e395d8 100644 --- a/doc/boards.md +++ b/doc/boards.md @@ -180,6 +180,9 @@ at startup the ESP prints out the current boot mode example: rst cause:2, boot mode:(3,6) ``` +note: + - GPIO2 is used as TX output and the internal Pullup is enabled on boot. + #### rst cause | Number | Description | @@ -206,8 +209,7 @@ the first value respects the pin setup of the Pins 0, 2 and 15. | 6 | 3.3V | 3.3V | 0V | SDIO | | 7 | 3.3V | 3.3V | 3.3V | SDIO | -Note: - -number = ((GPIO15 << 2) | (GPIO0 << 1) | GPIO2); +note: + - number = ((GPIO15 << 2) | (GPIO0 << 1) | GPIO2); From 72a7300fd9a416ac8f60f7cd32fc1b95921aaa18 Mon Sep 17 00:00:00 2001 From: wemos <11569115@qq.com> Date: Sun, 15 Nov 2015 09:54:38 +0800 Subject: [PATCH 04/20] add wemos d1 board description to package_esp8266com_index.template.json --- package/package_esp8266com_index.template.json | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/package/package_esp8266com_index.template.json b/package/package_esp8266com_index.template.json index 9535db4a1..ee1042450 100644 --- a/package/package_esp8266com_index.template.json +++ b/package/package_esp8266com_index.template.json @@ -42,6 +42,12 @@ }, { "name": "SweetPea ESP-210" + }, + { + "name": "WeMos D1" + }, + { + "name": "WeMos D1 mini" } ], "toolsDependencies": [ From 2d172274ebc29828319bbf87ba79e64b7fb30e26 Mon Sep 17 00:00:00 2001 From: "wemos.cc" <11569115@qq.com> Date: Sun, 15 Nov 2015 10:03:15 +0800 Subject: [PATCH 05/20] Update boards.md --- doc/boards.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/doc/boards.md b/doc/boards.md index 746e395d8..9aec334de 100644 --- a/doc/boards.md +++ b/doc/boards.md @@ -10,6 +10,8 @@ title: Supported Hardware - [SparkFun ESP8266 Thing](#sparkfun-esp8266-thing) - [SweetPea ESP-210](#sweetpea-esp-210) - [Generic ESP8266 modules](#generic-esp8266-modules) +- [WeMos D1](#wemos-d1) +- [WeMos D1 mini](#wemos-d1-mini) ### Adafruit HUZZAH ESP8266 (ESP-12) @@ -212,4 +214,7 @@ the first value respects the pin setup of the Pins 0, 2 and 15. note: - number = ((GPIO15 << 2) | (GPIO0 << 1) | GPIO2); - +### WeMos D1 +Product page: http://wemos.cc +### WeMos D1 mini +Product page: http://wemos.cc From 5b68aa0c9ca68904cc6446db51eeb9431a83e6dc Mon Sep 17 00:00:00 2001 From: wemos <11569115@qq.com> Date: Sun, 15 Nov 2015 15:36:00 +0800 Subject: [PATCH 06/20] set WeMos D1 & D1 mini default upload rate to 921600 --- boards.txt | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/boards.txt b/boards.txt index ea819444b..8ed16f539 100644 --- a/boards.txt +++ b/boards.txt @@ -584,6 +584,8 @@ d1.menu.UploadTool.esptool.upload.verbose=-vv d1.menu.UploadTool.espota=OTA d1.menu.UploadTool.espota.upload.tool=espota +d1.menu.UploadSpeed.921600=921600 +d1.menu.UploadSpeed.921600.upload.speed=921600 d1.menu.UploadSpeed.115200=115200 d1.menu.UploadSpeed.115200.upload.speed=115200 d1.menu.UploadSpeed.9600=9600 @@ -601,8 +603,7 @@ d1.menu.UploadSpeed.460800.macosx=460800 d1.menu.UploadSpeed.460800.upload.speed=460800 d1.menu.UploadSpeed.512000.windows=512000 d1.menu.UploadSpeed.512000.upload.speed=512000 -d1.menu.UploadSpeed.921600=921600 -d1.menu.UploadSpeed.921600.upload.speed=921600 + d1.menu.FlashSize.4M3M=4M (3M SPIFFS) d1.menu.FlashSize.4M3M.build.flash_size=4M @@ -654,6 +655,8 @@ d1_mini.menu.UploadTool.esptool.upload.verbose=-vv d1_mini.menu.UploadTool.espota=OTA d1_mini.menu.UploadTool.espota.upload.tool=espota +d1_mini.menu.UploadSpeed.921600=921600 +d1_mini.menu.UploadSpeed.921600.upload.speed=921600 d1_mini.menu.UploadSpeed.115200=115200 d1_mini.menu.UploadSpeed.115200.upload.speed=115200 d1_mini.menu.UploadSpeed.9600=9600 @@ -671,8 +674,7 @@ d1_mini.menu.UploadSpeed.460800.macosx=460800 d1_mini.menu.UploadSpeed.460800.upload.speed=460800 d1_mini.menu.UploadSpeed.512000.windows=512000 d1_mini.menu.UploadSpeed.512000.upload.speed=512000 -d1_mini.menu.UploadSpeed.921600=921600 -d1_mini.menu.UploadSpeed.921600.upload.speed=921600 + d1_mini.menu.FlashSize.4M3M=4M (3M SPIFFS) d1_mini.menu.FlashSize.4M3M.build.flash_size=4M From 25eb1bd46e823f9a5adda767be3efb0c95c9ae1f Mon Sep 17 00:00:00 2001 From: "wemos.cc" <11569115@qq.com> Date: Sun, 15 Nov 2015 15:43:11 +0800 Subject: [PATCH 07/20] add wemos d1 to reference.md --- doc/reference.md | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/reference.md b/doc/reference.md index 10df55219..7165eb47f 100644 --- a/doc/reference.md +++ b/doc/reference.md @@ -167,6 +167,7 @@ NodeMCU 1.0 | 4M | 1M, 3M Olimex MOD-WIFI-ESP8266(-DEV)| 2M | 1M SparkFun Thing | 512k | 64k SweetPea ESP-210 | 4M | 1M, 3M +WeMos D1 & D1 mini | 4M | 1M, 3M **Note:** to use any of file system functions in the sketch, add the following include to the sketch: From 08f5e553aa6d05a6aea39be1fd3668761fe41dc9 Mon Sep 17 00:00:00 2001 From: krzychb Date: Sat, 14 Nov 2015 22:15:26 +0100 Subject: [PATCH 08/20] Included desription of ArduinoOTA support and other corrections listed 1. Include ArduinoOTA as the way to go - http://www.esp8266.com/viewtopic.php?p=33231#p33231 2. Need to update boards.txt to have OTA for NodeMCU 1.0 in stable or staging platform package 3. Address possible confusion regarding DNS_SD_Arduino_OTA.ino - https://github.com/esp8266/Arduino/issues/1001 and https://github.com/esp8266/Arduino/pull/984#issuecomment-155805311 Next day cleaning review Update ota_updates.md Update ota_updates.md Update ota_updates.md Update ota_updates.md --- doc/ota_updates/ota_updates.md | 78 +++++++++++++++++++++++++++------- 1 file changed, 63 insertions(+), 15 deletions(-) diff --git a/doc/ota_updates/ota_updates.md b/doc/ota_updates/ota_updates.md index d5f992b23..0a90f9eeb 100644 --- a/doc/ota_updates/ota_updates.md +++ b/doc/ota_updates/ota_updates.md @@ -10,7 +10,7 @@ title: OTA Update ## Introduction -OTA (Over the Air) update is the process of loading the firmware to ESP module using WiFi connection rather that a serial port. Such functionality became extremely useful in case of limited or no physical access to the module. There is no imposed protection on OTA update process. Such protection should be implemented by developer to ensure that updates are allowed only from legitimate / trusted source. +OTA (Over the Air) update is the process of loading the firmware to ESP module using WiFi connection rather that a serial port. Such functionality became extremely useful in case of limited or no physical access to the module. OTA may be done from: - [Arduino IDE](#arduino-ide) @@ -18,13 +18,44 @@ OTA may be done from: In any case first firmware upload have to be done over a serial port. If OTA routines are correctly implemented in sketch, then all subsequent uploads may be done over the air. -The following chapters provide more details and both methods of doing OTA. +There is no imposed security on OTA process from being hacked. It is up to developer to ensure that updates are allowed only from legitimate / trusted source. Once update is complete module restarts and new code is executed. Developer should ensure that application running on module is shut down and restarted in safe manner. Chapters below provide additinal information regarding security and safety of OTA process. + +### Security + +Module has to be exposed wirelessly to get it updated with a new code. That poses chances of module being violently hacked and loaded with some other firmware. To reduce likelihood of being hacked consider protecting your uploads with a password, selecting certain OTA port, etc. + +Check functionality provided with [ArduinoOTA](https://github.com/esp8266/Arduino/tree/master/libraries/ArduinoOTA) library that may improve security: +```cpp +void setPort(uint16_t port); +void setHostname(const char *hostname); +void setPassword(const char *password); +``` +If possible implement other means of protection from being hacked, e.g. exposing module for uploads only according to specific schedule, trigger OTA only be user pressing dedicated “Update” button, etc. + +### Safety + +OTA process takes ESP’s resources and bandwidth during upload. Then module is restarted and a new sketch executed. Analyse and test how it affects functionality of your existing and new sketch. + +If ESP is placed in remote location and controlling some equipment, you should put additional attention what happens if operation of this equipment is suddenly interrupted by update process. Therefore decide how to put this equipment into safe state before starting the update. For instance your module may be controlling a garden watering system in a sequence. If this sequence is not properly shut down and a water valve left open, your garden may be flooded if this valve is not closed after OTA is finished and module restarts. + +The following functions are provided with [ArduinoOTA](https://github.com/esp8266/Arduino/tree/master/libraries/ArduinoOTA) library and intended to handle functionality of your application during specific stages of OTA on or on an OTA error: +```cpp +void onStart(OTA_CALLBACK(fn)); +void onEnd(OTA_CALLBACK(fn)); +void onProgress(OTA_CALLBACK_PROGRESS(fn)); +void onError(OTA_CALLBACK_ERROR (fn)); +``` + +The following chapters provide more details and specific methods of doing OTA. ## Basic Requirements - Flash chip size is 2x the size of the sketch. +Two separate, same size memory locations are used alternately. While existing sketch is executed from one location, the new sketch is saved to the other. After reset the new sketch is executed directly from where saved. Location of old sketch will be used for next OTA upload. + + ## Arduino IDE Uploading modules wirelessly from Arduino IDE is intended for the following typical scenarios: @@ -37,39 +68,43 @@ Uploading modules wirelessly from Arduino IDE is intended for the following typi #### Let's Do It -OTA process will be demonstrated using: -- DNS_SD_Arduino_OTA.ino sketch available from Arduino IDE -- NodeMCU 1.0 board with ESP-12E module +Currently there are two software configurations that support OTA updates +- [Classic OTA](#classic-ota-configuration): Arduino IDE 1.6.5 and [stable](https://github.com/esp8266/Arduino#staging-version-) (July 23, 2015) or [staging](https://github.com/esp8266/Arduino#staging-version-) (Sep 30, 2015) platform package that provides first OTA implementation, yet without support for [ArduinoOTA](https://github.com/esp8266/Arduino/tree/master/libraries/ArduinoOTA) library. This particular configuration is intended for less experienced users. It soon will be depreciated once implementation below is fully released. +- [ArduinoOTA](#arduinoota-configuration): Arduino-PR-4107-BUILD-421 and latest git version of platform package that includes [ArduinoOTA](https://github.com/esp8266/Arduino/tree/master/libraries/ArduinoOTA) library. This configuration features preliminary build of Arduino IDE and is intended for more experienced users. Please mid your step. + +Instructions below demonstrate how to configure both [Classic OTA](#classic-ota-configuration) and [ArduinoOTA](#arduinoota-configuration) using NodeMCU 1.0 board with ESP-12E. + +##### Classic OTA Configuration 1. Before you begin, please make sure that you have the following installed: - Arduino IDE and ESP8266 board support as described under https://github.com/esp8266/Arduino#installing-with-boards-manager - - Python 2.7.10 (do not install Python 3.5.0 that is not supported): - 1. Upload Python from https://www.python.org/ - 2. Start installer - 3. Select “Add python.exe to Path” (see below – that option is not selected by default) - 4. Complete remaining steps of installation - + - [Python](https://www.python.org/) 2.7.10 (do not install Python 3.5.0 that is not supported): + + **Note:** Windows users should select “Add python.exe to Path” (see below – this option is not selected by default) + ![Python installation set up](ota-ide-python-configuration.png) 2. Now prepare the sketch and configuration for the upload over a serial port. - Start Arduino IDE and load sketch DNS_SD_Arduino_OTA.ino available under File > Examples > ESP8266mDNS - ![OTA sketch selection](ota-ide-sketch-selection.png) + ![OTA sketch selection](ota-ide-sketch-selection.png) + + **Note:** This sketch is available only for stable (July 23, 2015) and staging (Sep 30, 2015) releases installed in Arduino IDE using https://github.com/esp8266/Arduino#installing-with-boards-manager. It was removed in [#980](https://github.com/esp8266/Arduino/pull/980) from Github repository. - Update ssid and pass in the sketch so the module can join your WiFi network - ![ssid and pass entry](ota-ide-ssid-pass-entry.png) + ![ssid and pass entry](ota-ide-ssid-pass-entry.png) - Configure upload parameters as below (you may need to adjust configuration if you are using a different module): - ![configuration of serial upload](ota-ide-serial-upload-configuration.png) + ![configuration of serial upload](ota-ide-serial-upload-configuration.png) 3. Upload the sketch (Ctrl+U). Once done open Serial Monitor (Ctrl+Shift+M) and check if the module has joined your WiFi network. ![check if module joined network](ota-ide-module-joined-wifi.png) -4. Only if module is connected, after a dozen (or two dozens) of seconds the esp8266-ota port will show up in Arduino IDE: +4. Only if module is connected to network, after a couple of seconds, the esp8266-ota port will show up in Arduino IDE: ![selection og OTA port](ota-ide-ota-port-selection.png) @@ -77,12 +112,25 @@ OTA process will be demonstrated using: ![configuration of OTA upload](ota-ide-ota-upload-configuration.png) + **Note:** If you do not see “Upload Using: OTA” option available for “NodeMCU 1.0 (ESP-12E Module)” board, please upload the latest [boards.txt](https://github.com/esp8266/Arduino/blob/master/boards.txt) file from Github repository, replace existing file and restart Arduino IDE. + 6. If you have successfully completed all the above steps, you can upload (Ctrl+U) the same (or any other) sketch over OTA: ![OTA upload complete](ota-ide-ota-upload-complete.png) **Note** To be able to upload your sketch over and over again using OTA, you need to embed OTA routines inside. Please use DNS_SD_Arduino_OTA.ino as an example. +##### ArduinoOTA Configuration + +1. Get the following software: + - Arduino-PR-4107-BUILD-421 - https://github.com/esp8266/Arduino/pull/984#issuecomment-155905800 + - Latest git version of pacakge - https://github.com/esp8266/Arduino#using-git-version- + - Python 2.7.10 + +2. Proceed to step 2 under [Classic OTA Configuration](#classic-ota-configuration) using BasicOTA.ino or OTALeds.ino skech instead. + +3. Carry on with remaining steps. + ## HTTP Server From ad2a887abcd0e4b15190ad553d3b15af44cbda4c Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Sun, 15 Nov 2015 13:13:03 +0100 Subject: [PATCH 09/20] removed paragraph see #1023 --- doc/ota_updates/ota_updates.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/doc/ota_updates/ota_updates.md b/doc/ota_updates/ota_updates.md index 0a90f9eeb..09916e27f 100644 --- a/doc/ota_updates/ota_updates.md +++ b/doc/ota_updates/ota_updates.md @@ -53,8 +53,6 @@ The following chapters provide more details and specific methods of doing OTA. - Flash chip size is 2x the size of the sketch. -Two separate, same size memory locations are used alternately. While existing sketch is executed from one location, the new sketch is saved to the other. After reset the new sketch is executed directly from where saved. Location of old sketch will be used for next OTA upload. - ## Arduino IDE From 77428baddcad5b3057314c0baa35f21be2a7eedf Mon Sep 17 00:00:00 2001 From: Ivan Grokhotkov Date: Sun, 15 Nov 2015 22:35:38 +0300 Subject: [PATCH 10/20] WiFiClientSecure rx overflow fixes - Increase plaintext rx buffer size to 4096 - Request more data from axtls only when rx buffer is empty --- libraries/ESP8266WiFi/src/WiFiClientSecure.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/libraries/ESP8266WiFi/src/WiFiClientSecure.cpp b/libraries/ESP8266WiFi/src/WiFiClientSecure.cpp index 749439b88..3e06cf8b3 100644 --- a/libraries/ESP8266WiFi/src/WiFiClientSecure.cpp +++ b/libraries/ESP8266WiFi/src/WiFiClientSecure.cpp @@ -50,7 +50,7 @@ extern "C" #define SSL_DEBUG_OPTS 0 #endif -#define SSL_RX_BUF_SIZE 1536 +#define SSL_RX_BUF_SIZE 4096 class SSLContext { public: @@ -92,10 +92,12 @@ public: } int read(uint8_t* dst, size_t size) { - if (size > _rxbuf->getSize()) { + if (!_rxbuf->getSize()) { _readAll(); } - return _rxbuf->read(reinterpret_cast(dst), size); + size_t available = _rxbuf->getSize(); + size_t will_read = (available < size) ? available : size; + return _rxbuf->read(reinterpret_cast(dst), will_read); } int read() { From 5b28ae23c262ee62132c46c06455d909e9ffee4b Mon Sep 17 00:00:00 2001 From: Ivan Grokhotkov Date: Sun, 15 Nov 2015 20:35:52 +0300 Subject: [PATCH 11/20] Allow WiFiServer to bind to a specific address (#997) In addition to the existing constructors (WiFiServer::WiFiServer(port) and WiFiWebServer::WiFiWebServer(port)), new constructors are added: WiFiServer::WiFiServer(IPAddress, port) and WiFiWebServer::WiFiWebServer(IPAddress, port). --- .../ESP8266WebServer/src/ESP8266WebServer.cpp | 21 +++-- .../ESP8266WebServer/src/ESP8266WebServer.h | 1 + libraries/ESP8266WiFi/src/WiFiServer.cpp | 92 ++++++++++--------- libraries/ESP8266WiFi/src/WiFiServer.h | 5 +- 4 files changed, 67 insertions(+), 52 deletions(-) diff --git a/libraries/ESP8266WebServer/src/ESP8266WebServer.cpp b/libraries/ESP8266WebServer/src/ESP8266WebServer.cpp index cc8410ece..04bda3152 100644 --- a/libraries/ESP8266WebServer/src/ESP8266WebServer.cpp +++ b/libraries/ESP8266WebServer/src/ESP8266WebServer.cpp @@ -31,23 +31,32 @@ #define DEBUG_OUTPUT Serial +ESP8266WebServer::ESP8266WebServer(IPAddress addr, int port) +: _server(addr, port) +, _firstHandler(0) +, _lastHandler(0) +, _currentArgCount(0) +, _currentArgs(0) +, _headerKeysCount(0) +, _currentHeaders(0) +{ +} + ESP8266WebServer::ESP8266WebServer(int port) : _server(port) , _firstHandler(0) , _lastHandler(0) , _currentArgCount(0) , _currentArgs(0) -,_headerKeysCount(0) -,_currentHeaders(0) +, _headerKeysCount(0) +, _currentHeaders(0) { } ESP8266WebServer::~ESP8266WebServer() { - if (_currentHeaders) - delete[]_currentHeaders; + if (_currentHeaders) + delete[]_currentHeaders; _headerKeysCount = 0; - if (!_firstHandler) - return; RequestHandler* handler = _firstHandler; while (handler) { RequestHandler* next = handler->next(); diff --git a/libraries/ESP8266WebServer/src/ESP8266WebServer.h b/libraries/ESP8266WebServer/src/ESP8266WebServer.h index e2a8da46c..65e44378f 100644 --- a/libraries/ESP8266WebServer/src/ESP8266WebServer.h +++ b/libraries/ESP8266WebServer/src/ESP8266WebServer.h @@ -59,6 +59,7 @@ typedef struct { class ESP8266WebServer { public: + ESP8266WebServer(IPAddress addr, int port = 80); ESP8266WebServer(int port = 80); ~ESP8266WebServer(); diff --git a/libraries/ESP8266WiFi/src/WiFiServer.cpp b/libraries/ESP8266WiFi/src/WiFiServer.cpp index 0e4af3f36..5de2d4ac7 100644 --- a/libraries/ESP8266WiFi/src/WiFiServer.cpp +++ b/libraries/ESP8266WiFi/src/WiFiServer.cpp @@ -38,33 +38,41 @@ extern "C" { #include "cbuf.h" #include "include/ClientContext.h" -WiFiServer::WiFiServer(uint16_t port) +WiFiServer::WiFiServer(IPAddress addr, uint16_t port) +: _port(port) +, _addr(addr) +, _pcb(nullptr) +, _unclaimed(nullptr) +, _discarded(nullptr) { - _port = port; - _pcb = 0; - _unclaimed = 0; - _discarded = 0; } -void WiFiServer::begin() +WiFiServer::WiFiServer(uint16_t port) +: _port(port) +, _addr((uint32_t) IPADDR_ANY) +, _pcb(nullptr) +, _unclaimed(nullptr) +, _discarded(nullptr) { - err_t err; +} +void WiFiServer::begin() { + err_t err; tcp_pcb* pcb = tcp_new(); if (!pcb) return; - err = tcp_bind(pcb, INADDR_ANY, _port); + ip_addr_t local_addr; + local_addr.addr = (uint32_t) _addr; + err = tcp_bind(pcb, &local_addr, _port); - if (err != ERR_OK) - { + if (err != ERR_OK) { tcp_close(pcb); return; } tcp_pcb* listen_pcb = tcp_listen(pcb); - if (!listen_pcb) - { + if (!listen_pcb) { tcp_close(pcb); return; } @@ -73,26 +81,30 @@ void WiFiServer::begin() tcp_arg(listen_pcb, (void*) this); } -void WiFiServer::setNoDelay(bool nodelay){ - if(!_pcb) return; - if(nodelay) tcp_nagle_disable(_pcb); - else tcp_nagle_enable(_pcb); +void WiFiServer::setNoDelay(bool nodelay) { + if (!_pcb) + return; + + if (nodelay) + tcp_nagle_disable(_pcb); + else + tcp_nagle_enable(_pcb); } -bool WiFiServer::getNoDelay(){ - if(!_pcb) return false; - return tcp_nagle_disabled(_pcb); +bool WiFiServer::getNoDelay() { + if (!_pcb) + return false; + return tcp_nagle_disabled(_pcb); } -bool WiFiServer::hasClient(){ - if (_unclaimed) return true; - return false; -} - -WiFiClient WiFiServer::available(byte* status) -{ +bool WiFiServer::hasClient() { if (_unclaimed) - { + return true; + return false; +} + +WiFiClient WiFiServer::available(byte* status) { + if (_unclaimed) { WiFiClient result(_unclaimed); _unclaimed = _unclaimed->next(); DEBUGV("WS:av\r\n"); @@ -100,32 +112,28 @@ WiFiClient WiFiServer::available(byte* status) } optimistic_yield(1000); - return WiFiClient(); } -uint8_t WiFiServer::status() { +uint8_t WiFiServer::status() { if (!_pcb) return CLOSED; return _pcb->state; } -size_t WiFiServer::write(uint8_t b) -{ +size_t WiFiServer::write(uint8_t b) { return write(&b, 1); } -size_t WiFiServer::write(const uint8_t *buffer, size_t size) -{ +size_t WiFiServer::write(const uint8_t *buffer, size_t size) { // write to all clients // not implemented return 0; } template -T* slist_append_tail(T* head, T* item) -{ +T* slist_append_tail(T* head, T* item) { if (!head) return item; T* last = head; @@ -135,29 +143,23 @@ T* slist_append_tail(T* head, T* item) return head; } -int8_t WiFiServer::_accept(tcp_pcb* apcb, int8_t err) -{ +int8_t WiFiServer::_accept(tcp_pcb* apcb, int8_t err) { DEBUGV("WS:ac\r\n"); ClientContext* client = new ClientContext(apcb, &WiFiServer::_s_discard, this); _unclaimed = slist_append_tail(_unclaimed, client); tcp_accepted(_pcb); - // printf("WiFiServer::_accept\r\n"); return ERR_OK; } -void WiFiServer::_discard(ClientContext* client) -{ +void WiFiServer::_discard(ClientContext* client) { // _discarded = slist_append_tail(_discarded, client); DEBUGV("WS:dis\r\n"); - // printf("WiFiServer::_discard\r\n"); } -int8_t WiFiServer::_s_accept(void *arg, tcp_pcb* newpcb, int8_t err) -{ +int8_t WiFiServer::_s_accept(void *arg, tcp_pcb* newpcb, int8_t err) { return reinterpret_cast(arg)->_accept(newpcb, err); } -void WiFiServer::_s_discard(void* server, ClientContext* ctx) -{ +void WiFiServer::_s_discard(void* server, ClientContext* ctx) { reinterpret_cast(server)->_discard(ctx); } diff --git a/libraries/ESP8266WiFi/src/WiFiServer.h b/libraries/ESP8266WiFi/src/WiFiServer.h index ef642762d..263bcbcdf 100644 --- a/libraries/ESP8266WiFi/src/WiFiServer.h +++ b/libraries/ESP8266WiFi/src/WiFiServer.h @@ -29,6 +29,7 @@ extern "C" { } #include "Server.h" +#include "IPAddress.h" class ClientContext; class WiFiClient; @@ -36,12 +37,14 @@ class WiFiClient; class WiFiServer : public Server { private: uint16_t _port; + IPAddress _addr; tcp_pcb* _pcb; ClientContext* _unclaimed; ClientContext* _discarded; public: + WiFiServer(IPAddress addr, uint16_t port); WiFiServer(uint16_t port); WiFiClient available(uint8_t* status = NULL); bool hasClient(); @@ -56,7 +59,7 @@ public: protected: int8_t _accept(tcp_pcb* newpcb, int8_t err); - void _discard(ClientContext* client); + void _discard(ClientContext* client); static int8_t _s_accept(void *arg, tcp_pcb* newpcb, int8_t err); static void _s_discard(void* server, ClientContext* ctx); From 74aec438ae172eb1681e2074b584dbe6919d011c Mon Sep 17 00:00:00 2001 From: Ivan Grokhotkov Date: Mon, 16 Nov 2015 00:39:54 +0300 Subject: [PATCH 12/20] Fix "invalid library found" errors with Arduino 1.6.6 (#965) As per suggestion from @marvinroger --- libraries/esp8266/library.properties | 9 +++++++++ libraries/esp8266/src/dummy.h | 2 ++ 2 files changed, 11 insertions(+) create mode 100644 libraries/esp8266/library.properties create mode 100644 libraries/esp8266/src/dummy.h diff --git a/libraries/esp8266/library.properties b/libraries/esp8266/library.properties new file mode 100644 index 000000000..15b1a3148 --- /dev/null +++ b/libraries/esp8266/library.properties @@ -0,0 +1,9 @@ +name=ESP8266 +version=1.0 +author=Simon Peter,Markus Sattler,Ivan Grokhotkov +maintainer=Ivan Grokhtkov +sentence=ESP8266 sketches examples +paragraph= +category=Other +url= +architectures=esp8266 diff --git a/libraries/esp8266/src/dummy.h b/libraries/esp8266/src/dummy.h new file mode 100644 index 000000000..d8a140eda --- /dev/null +++ b/libraries/esp8266/src/dummy.h @@ -0,0 +1,2 @@ +// This file is here only to silence warnings from Arduino IDE +// Currently IDE doesn't support no-code libraries, like this collection of example sketches. From 83b452b824341a7c436c5711f01ed85c424fa7db Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Mon, 16 Nov 2015 19:28:59 +0100 Subject: [PATCH 13/20] add missing WiFiClientSecure include in ESP8266WiFi.h --- libraries/ESP8266WiFi/src/ESP8266WiFi.h | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFi.h b/libraries/ESP8266WiFi/src/ESP8266WiFi.h index 143d61cb5..4c1330b2e 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFi.h +++ b/libraries/ESP8266WiFi/src/ESP8266WiFi.h @@ -31,6 +31,7 @@ extern "C" { #include "IPAddress.h" #include "WiFiClient.h" #include "WiFiServer.h" +#include "WiFiClientSecure.h" #define WIFI_SCAN_RUNNING (-1) #define WIFI_SCAN_FAILED (-2) From e9f0ea2afe8c6e6512814fb6bf1979f0c40506a5 Mon Sep 17 00:00:00 2001 From: Ivan Grokhotkov Date: Tue, 17 Nov 2015 02:47:57 +0300 Subject: [PATCH 14/20] WiFiClientSecure: handle full size TLS fragments (#43) - free up some memory by getting rid of intermediate buffer - libaxtls: update to 6830d98 - allocate plaintext buffer in two stages: 4*MSS initially, grow to 16k after handshake - free certificate data after handshake is complete - preallocate some structures to reduce memory fragmentation --- .../ESP8266WiFi/src/WiFiClientSecure.cpp | 77 +++++++++--------- tools/sdk/lib/libaxtls.a | Bin 556176 -> 557778 bytes 2 files changed, 39 insertions(+), 38 deletions(-) diff --git a/libraries/ESP8266WiFi/src/WiFiClientSecure.cpp b/libraries/ESP8266WiFi/src/WiFiClientSecure.cpp index 3e06cf8b3..3369c3448 100644 --- a/libraries/ESP8266WiFi/src/WiFiClientSecure.cpp +++ b/libraries/ESP8266WiFi/src/WiFiClientSecure.cpp @@ -50,7 +50,6 @@ extern "C" #define SSL_DEBUG_OPTS 0 #endif -#define SSL_RX_BUF_SIZE 4096 class SSLContext { public: @@ -59,8 +58,6 @@ public: _ssl_ctx = ssl_ctx_new(SSL_SERVER_VERIFY_LATER | SSL_DEBUG_OPTS, 0); } ++_ssl_ctx_refcnt; - - _rxbuf = new cbuf(SSL_RX_BUF_SIZE); } ~SSLContext() { @@ -73,8 +70,6 @@ public: if (_ssl_ctx_refcnt == 0) { ssl_ctx_free(_ssl_ctx); } - - delete _rxbuf; } void ref() { @@ -92,38 +87,50 @@ public: } int read(uint8_t* dst, size_t size) { - if (!_rxbuf->getSize()) { - _readAll(); + if (!_available) { + if (!_readAll()) + return 0; } - size_t available = _rxbuf->getSize(); - size_t will_read = (available < size) ? available : size; - return _rxbuf->read(reinterpret_cast(dst), will_read); + size_t will_copy = (_available < size) ? _available : size; + memcpy(dst, _read_ptr, will_copy); + _read_ptr += will_copy; + _available -= will_copy; + if (_available == 0) { + _read_ptr = nullptr; + } + return will_copy; } int read() { - optimistic_yield(100); - if (!_rxbuf->getSize()) { - _readAll(); + if (!_available) { + if (!_readAll()) + return -1; } - return _rxbuf->read(); + int result = _read_ptr[0]; + ++_read_ptr; + --_available; + if (_available == 0) { + _read_ptr = nullptr; + } + return result; } int peek() { - if (!_rxbuf->getSize()) { - _readAll(); + if (!_available) { + if (!_readAll()) + return -1; } - return _rxbuf->peek(); + return _read_ptr[0]; } int available() { - auto rc = _rxbuf->getSize(); - if (rc == 0) { - _readAll(); - rc = _rxbuf->getSize(); + auto cb = _available; + if (cb == 0) { + cb = _readAll(); } else { optimistic_yield(100); } - return rc; + return cb; } operator SSL*() { @@ -135,6 +142,8 @@ protected: if (!_ssl) return 0; + optimistic_yield(100); + uint8_t* data; int rc = ssl_read(_ssl, &data); if (rc <= 0) { @@ -144,25 +153,18 @@ protected: } return 0; } - - - if (rc > _rxbuf->room()) { - DEBUGV("WiFiClientSecure rx overflow"); - rc = _rxbuf->room(); - } - int result = 0; - size_t sizeBefore = _rxbuf->getSize(); - if (rc) - result = _rxbuf->write(reinterpret_cast(data), rc); - DEBUGV("*** rb: %d + %d = %d\r\n", sizeBefore, rc, _rxbuf->getSize()); - return result; + DEBUGV(":wcs ra %d", rc); + _read_ptr = data; + _available = rc; + return _available; } static SSL_CTX* _ssl_ctx; static int _ssl_ctx_refcnt; SSL* _ssl = nullptr; int _refcnt = 0; - cbuf* _rxbuf; + const uint8_t* _read_ptr = nullptr; + size_t _available = 0; }; SSL_CTX* SSLContext::_ssl_ctx = nullptr; @@ -313,14 +315,13 @@ bool WiFiClientSecure::verify(const char* fp, const char* url) { while (pos < len && fp[pos] == ' ') { ++pos; } - DEBUGV("pos:%d ", pos); if (pos > len - 2) { - DEBUGV("fingerprint too short\r\n"); + DEBUGV("pos:%d len:%d fingerprint too short\r\n", pos, len); return false; } uint8_t high, low; if (!parseHexNibble(fp[pos], &high) || !parseHexNibble(fp[pos+1], &low)) { - DEBUGV("invalid hex sequence: %c%c\r\n", fp[pos], fp[pos+1]); + DEBUGV("pos:%d len:%d invalid hex sequence: %c%c\r\n", pos, len, fp[pos], fp[pos+1]); return false; } pos += 2; diff --git a/tools/sdk/lib/libaxtls.a b/tools/sdk/lib/libaxtls.a index fa52cf485834e9df57f46d35da228824216db88b..e8c08dc1ef1362b14282637413af332fba65dd98 100644 GIT binary patch delta 142679 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 z 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 b#O&I*J~;8tYR54bp0|^BHEtCe*Zuzi90>QM delta 143362 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 E0i#$H#sB~S From a2789df2a5294c3205230f5a76361f68debd19a1 Mon Sep 17 00:00:00 2001 From: Ivan Grokhotkov Date: Tue, 17 Nov 2015 03:13:37 +0300 Subject: [PATCH 15/20] ESP8266httpUpdate: add method overload to allow updates using WiFiClientSecure --- libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.cpp | 8 +++++--- libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.h | 1 + 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.cpp b/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.cpp index 85dafa45f..33907465c 100644 --- a/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.cpp +++ b/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.cpp @@ -34,17 +34,19 @@ ESP8266HTTPUpdate::~ESP8266HTTPUpdate(void) { } t_httpUpdate_return ESP8266HTTPUpdate::update(const char * host, uint16_t port, const char * url, const char * current_version) { - - t_httpUpdate_return ret = HTTP_UPDATE_FAILED; WiFiClient tcp; DEBUG_HTTP_UPDATE("[httpUpdate] connected to %s:%u %s .... ", host, port, url); if(!tcp.connect(host, port)) { DEBUG_HTTP_UPDATE("failed.\n"); - return ret; + return HTTP_UPDATE_FAILED; } DEBUG_HTTP_UPDATE("ok.\n"); + return update(tcp, host, url, current_version); +} +t_httpUpdate_return ESP8266HTTPUpdate::update(WiFiClient& tcp, const char* host, const char* url, const char * current_version) { + t_httpUpdate_return ret = HTTP_UPDATE_FAILED; // set Timeout for readBytesUntil and readStringUntil tcp.setTimeout(2000); tcp.setNoDelay(true); diff --git a/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.h b/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.h index 334b0e43c..3f72bc98e 100644 --- a/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.h +++ b/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.h @@ -50,6 +50,7 @@ class ESP8266HTTPUpdate { t_httpUpdate_return update(const char * host, uint16_t port, const char * url = "/", const char * current_version = ""); t_httpUpdate_return update(String host, uint16_t port, String url = "/", String current_version = ""); + t_httpUpdate_return update(WiFiClient& client, const char* host, const char* url = "/", const char * current_version = ""); }; extern ESP8266HTTPUpdate ESPhttpUpdate; From 39cf5d6cd641ddaa5aede65b026904c745c2c053 Mon Sep 17 00:00:00 2001 From: themindfactory Date: Mon, 16 Nov 2015 20:26:07 -0500 Subject: [PATCH 16/20] Update README.md --- README.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 38cfc86b5..b5a7d6851 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,10 @@ Starting with 1.6.4, Arduino allows installation of third-party platform package - Enter ```http://arduino.esp8266.com/stable/package_esp8266com_index.json``` into *Additional Board Manager URLs* field. You can add multiple URLs, separating them with commas. - Open Boards Manager from Tools > Board menu and install *esp8266* platform (and don't forget to select your ESP8266 board from Tools > Board menu after installation). +The best place to ask questions related to this core is ESP8266 community forum: http://www.esp8266.com/arduino. +If you find this ESP8266 board manager useful, please consider supporting it with a donation. ESP8266 Community and IGRR have made this wonderful port available. +[![Donate](https://img.shields.io/badge/paypal-donate-yellow.svg)](https://www.paypal.com/webscr?cmd=_s-xclick&hosted_button_id=4M56YCWV6PX66) + #### Available versions ##### Stable version ![](http://arduino.esp8266.com/stable/badge.svg) @@ -26,7 +30,6 @@ Boards manager link: `http://arduino.esp8266.com/staging/package_esp8266com_inde Documentation: [Reference](http://arduino.esp8266.com/staging/doc/reference.html) - ### Using git version [![Linux build status](https://travis-ci.org/esp8266/Arduino.svg)](https://travis-ci.org/esp8266/Arduino) - Install Arduino 1.6.5 @@ -54,10 +57,6 @@ Documentation for latest development version: ### Issues and support ### -The best place to ask questions related to this core is ESP8266 community forum: http://www.esp8266.com/arduino. -If you find the forum useful, please consider supporting it with a donation. -[![Donate](https://img.shields.io/badge/paypal-donate-yellow.svg)](https://www.paypal.com/webscr?cmd=_s-xclick&hosted_button_id=4M56YCWV6PX66) - If you encounter an issue, you are welcome to submit it here on Github: https://github.com/esp8266/Arduino/issues. Please provide as much context as possible: version which you are using (you can check it in Boards Manager), your sketch code, serial output, board model, IDE settings (board selection, flash size, etc). From 16a2cdcf4161005a5ef8eebf8046355bd8c2ffc5 Mon Sep 17 00:00:00 2001 From: Ivan Grokhotkov Date: Tue, 17 Nov 2015 15:41:41 +0300 Subject: [PATCH 17/20] Add script to merge boards manager packages --- package/merge_packages.py | 60 +++++++++++++++++++++++++++++++++++++++ tools/get.py | 6 ++-- 2 files changed, 63 insertions(+), 3 deletions(-) create mode 100644 package/merge_packages.py diff --git a/package/merge_packages.py b/package/merge_packages.py new file mode 100644 index 000000000..350522bac --- /dev/null +++ b/package/merge_packages.py @@ -0,0 +1,60 @@ +#!/usr/bin/env python +# This script merges two Arduino Board Manager package json files. +# Usage: +# python merge_packages.py package_esp8266com_index.json version/new/package_esp8266com_index.json +# Written by Ivan Grokhotkov, 2015 +# +from __future__ import print_function +import json +import sys + +def load_package(filename): + pkg = json.load(open(filename))['packages'][0] + print("Loaded package {0} from {1}".format(pkg['name'], filename)) + print("{0} platform(s), {1} tools".format(len(pkg['platforms']), len(pkg['tools']))) + return pkg + +def merge_objects(versions, obj): + for o in obj: + name = o['name'].encode('ascii') + ver = o['version'].encode('ascii') + if not name in versions: + print("found new object, {0}".format(name)) + versions[name] = {} + if not ver in versions[name]: + print("found new version {0} for object {1}".format(ver, name)) + versions[name][ver] = o + return versions + + +def main(args): + if len(args) < 3: + print("Usage: {0} ".format(args[0])) + return 1 + + tools = {} + platforms = {} + pkg1 = load_package(args[1]) + tools = merge_objects(tools, pkg1['tools']); + platforms = merge_objects(platforms, pkg1['platforms']); + pkg2 = load_package(args[2]) + tools = merge_objects(tools, pkg2['tools']); + platforms = merge_objects(platforms, pkg2['platforms']); + + pkg1['tools'] = [] + pkg1['platforms'] = [] + + for name in tools: + for version in tools[name]: + print("Adding tool {0}-{1}".format(name, version)) + pkg1['tools'].append(tools[name][version]) + + for name in platforms: + for version in platforms[name]: + print("Adding platform {0}-{1}".format(name, version)) + pkg1['platforms'].append(platforms[name][version]) + + json.dump({'packages':[pkg1]}, sys.stdout, indent=2) + +if __name__ == '__main__': + sys.exit(main(sys.argv)) diff --git a/tools/get.py b/tools/get.py index e47a535be..eb8051ef8 100755 --- a/tools/get.py +++ b/tools/get.py @@ -1,7 +1,7 @@ #!/usr/bin/env python -# This script will download and extract required tools into the current directory -# Tools list is obtained from tools.json file -# Written by Ivan Grokhotkov, 2015 +# This script will download and extract required tools into the current directory. +# Tools list is obtained from package/package_esp8266com_index.template.json file. +# Written by Ivan Grokhotkov, 2015. # from __future__ import print_function import urllib From 254e4d9964e040b7916fe1863b5b2dbfdd462c1e Mon Sep 17 00:00:00 2001 From: themindfactory Date: Tue, 17 Nov 2015 11:19:49 -0500 Subject: [PATCH 18/20] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b5a7d6851..aeb46b3e6 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ Starting with 1.6.4, Arduino allows installation of third-party platform package - Open Boards Manager from Tools > Board menu and install *esp8266* platform (and don't forget to select your ESP8266 board from Tools > Board menu after installation). The best place to ask questions related to this core is ESP8266 community forum: http://www.esp8266.com/arduino. -If you find this ESP8266 board manager useful, please consider supporting it with a donation. ESP8266 Community and IGRR have made this wonderful port available. +If you find this ESP8266 board manager useful, please consider supporting it with a donation. The ESP8266 Community Forum and IGRR have made this wonderful port available. [![Donate](https://img.shields.io/badge/paypal-donate-yellow.svg)](https://www.paypal.com/webscr?cmd=_s-xclick&hosted_button_id=4M56YCWV6PX66) #### Available versions From 7137ec5dacc9300a4e90b44b0ccedd3abaf83636 Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Tue, 17 Nov 2015 18:43:43 +0100 Subject: [PATCH 19/20] fix eclipse problem rename core.a to arduino.ar see #948 --- platform.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/platform.txt b/platform.txt index 0b98234d3..1ab1d5772 100644 --- a/platform.txt +++ b/platform.txt @@ -64,10 +64,10 @@ recipe.cpp.o.pattern="{compiler.path}{compiler.cpp.cmd}" {compiler.cpreprocessor recipe.S.o.pattern="{compiler.path}{compiler.c.cmd}" {compiler.cpreprocessor.flags} {compiler.S.flags} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.c.extra_flags} {build.extra_flags} {includes} "{source_file}" -o "{object_file}" ## Create archives -recipe.ar.pattern="{compiler.path}{compiler.ar.cmd}" {compiler.ar.flags} {compiler.ar.extra_flags} "{build.path}/core.a" "{object_file}" +recipe.ar.pattern="{compiler.path}{compiler.ar.cmd}" {compiler.ar.flags} {compiler.ar.extra_flags} "{build.path}/arduino.ar" "{object_file}" ## Combine gc-sections, archives, and objects -recipe.c.combine.pattern="{compiler.path}{compiler.c.elf.cmd}" {compiler.c.elf.flags} {compiler.c.elf.extra_flags} -o "{build.path}/{build.project_name}.elf" -Wl,--start-group {object_files} "{build.path}/core.a" {compiler.c.elf.libs} -Wl,--end-group "-L{build.path}" +recipe.c.combine.pattern="{compiler.path}{compiler.c.elf.cmd}" {compiler.c.elf.flags} {compiler.c.elf.extra_flags} -o "{build.path}/{build.project_name}.elf" -Wl,--start-group {object_files} "{build.path}/arduino.ar" {compiler.c.elf.libs} -Wl,--end-group "-L{build.path}" ## Create eeprom recipe.objcopy.eep.pattern= From 3c7431b59c5f71829ca7fbae40292127dab0bc0a Mon Sep 17 00:00:00 2001 From: Ivan Grokhotkov Date: Wed, 18 Nov 2015 12:02:49 +0300 Subject: [PATCH 20/20] Allow package and docs to be hosted in different places --- package/build_boards_manager_package.sh | 26 +++++++++++++++++-------- package/merge_packages.py | 14 ++++++------- 2 files changed, 25 insertions(+), 15 deletions(-) mode change 100644 => 100755 package/merge_packages.py diff --git a/package/build_boards_manager_package.sh b/package/build_boards_manager_package.sh index 3e969cdbc..261dd2afd 100755 --- a/package/build_boards_manager_package.sh +++ b/package/build_boards_manager_package.sh @@ -1,6 +1,12 @@ #!/bin/bash # +# Figure out how will the package be called +ver=`git describe --tags --always` +package_name=esp8266-$ver +echo "Version: $ver" +echo "Package name: $package_name" + # Set REMOTE_URL environment variable to the address where the package will be # available for download. This gets written into package json file. if [ -z "$REMOTE_URL" ]; then @@ -8,13 +14,17 @@ if [ -z "$REMOTE_URL" ]; then echo "REMOTE_URL not defined, using default" fi echo "Remote: $REMOTE_URL" -pushd .. -# Figure out how will the package be called -ver=`git describe --tags --always` -package_name=esp8266-$ver -echo "Version: $ver" -echo "Package name: $package_name" +if [ -z "$PKG_URL" ]; then + PKG_URL="$REMOTE_URL/versions/$ver/$package_name.zip" +fi +echo "Package: $PKG_URL" + +if [ -z "$DOC_URL" ]; then + DOC_URL="$REMOTE_URL/versions/$ver/doc/reference.html" +fi +echo "Docs: $DOC_URL" +pushd .. # Create directory for the package outdir=package/versions/$ver/$package_name srcdir=$PWD @@ -72,11 +82,11 @@ echo SHA-256: $sha echo "Making package_esp8266com_index.json" cat $srcdir/package/package_esp8266com_index.template.json | \ jq ".packages[0].platforms[0].version = \"$ver\" | \ - .packages[0].platforms[0].url = \"$REMOTE_URL/versions/$ver/$package_name.zip\" |\ + .packages[0].platforms[0].url = \"$PKG_URL\" |\ .packages[0].platforms[0].archiveFileName = \"$package_name.zip\" |\ .packages[0].platforms[0].checksum = \"SHA-256:$sha\" |\ .packages[0].platforms[0].size = \"$size\" |\ - .packages[0].platforms[0].help.online = \"$REMOTE_URL/versions/$ver/doc/reference.html\"" \ + .packages[0].platforms[0].help.online = \"$DOC_URL\"" \ > package_esp8266com_index.json popd diff --git a/package/merge_packages.py b/package/merge_packages.py old mode 100644 new mode 100755 index 350522bac..dba8bb9d6 --- a/package/merge_packages.py +++ b/package/merge_packages.py @@ -10,8 +10,8 @@ import sys def load_package(filename): pkg = json.load(open(filename))['packages'][0] - print("Loaded package {0} from {1}".format(pkg['name'], filename)) - print("{0} platform(s), {1} tools".format(len(pkg['platforms']), len(pkg['tools']))) + print("Loaded package {0} from {1}".format(pkg['name'], filename), file=sys.stderr) + print("{0} platform(s), {1} tools".format(len(pkg['platforms']), len(pkg['tools'])), file=sys.stderr) return pkg def merge_objects(versions, obj): @@ -19,17 +19,17 @@ def merge_objects(versions, obj): name = o['name'].encode('ascii') ver = o['version'].encode('ascii') if not name in versions: - print("found new object, {0}".format(name)) + print("found new object, {0}".format(name), file=sys.stderr) versions[name] = {} if not ver in versions[name]: - print("found new version {0} for object {1}".format(ver, name)) + print("found new version {0} for object {1}".format(ver, name), file=sys.stderr) versions[name][ver] = o return versions def main(args): if len(args) < 3: - print("Usage: {0} ".format(args[0])) + print("Usage: {0} ".format(args[0]), file=sys.stderr) return 1 tools = {} @@ -46,12 +46,12 @@ def main(args): for name in tools: for version in tools[name]: - print("Adding tool {0}-{1}".format(name, version)) + print("Adding tool {0}-{1}".format(name, version), file=sys.stderr) pkg1['tools'].append(tools[name][version]) for name in platforms: for version in platforms[name]: - print("Adding platform {0}-{1}".format(name, version)) + print("Adding platform {0}-{1}".format(name, version), file=sys.stderr) pkg1['platforms'].append(platforms[name][version]) json.dump({'packages':[pkg1]}, sys.stdout, indent=2)