Skip to content

Commit a1f6bb0

Browse files
committed
Merge pull request #8 from esp8266/esp8266
pull master
2 parents 9a84192 + d51327c commit a1f6bb0

File tree

16 files changed

+404
-27
lines changed

16 files changed

+404
-27
lines changed

hardware/esp8266com/esp8266/boards.txt

+25
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ generic.build.spiffs_pagesize=256
2727

2828
generic.menu.UploadTool.esptool=Serial
2929
generic.menu.UploadTool.esptool.upload.tool=esptool
30+
generic.menu.UploadTool.esptool.upload.verbose=-vv
3031
generic.menu.UploadTool.espota=OTA
3132
generic.menu.UploadTool.espota.upload.tool=espota
3233

@@ -169,6 +170,10 @@ huzzah.menu.CpuFrequency.80.build.f_cpu=80000000L
169170
huzzah.menu.CpuFrequency.160=160 MHz
170171
huzzah.menu.CpuFrequency.160.build.f_cpu=160000000L
171172

173+
huzzah.menu.UploadTool.esptool=Serial
174+
huzzah.menu.UploadTool.esptool.upload.tool=esptool
175+
huzzah.menu.UploadTool.esptool.upload.verbose=-vv
176+
172177
huzzah.menu.UploadSpeed.115200=115200
173178
huzzah.menu.UploadSpeed.115200.upload.speed=115200
174179
huzzah.menu.UploadSpeed.9600=9600
@@ -222,6 +227,10 @@ nodemcu.menu.CpuFrequency.80.build.f_cpu=80000000L
222227
nodemcu.menu.CpuFrequency.160=160 MHz
223228
nodemcu.menu.CpuFrequency.160.build.f_cpu=160000000L
224229

230+
nodemcu.menu.UploadTool.esptool=Serial
231+
nodemcu.menu.UploadTool.esptool.upload.tool=esptool
232+
nodemcu.menu.UploadTool.esptool.upload.verbose=-vv
233+
225234
nodemcu.menu.UploadSpeed.115200=115200
226235
nodemcu.menu.UploadSpeed.115200.upload.speed=115200
227236
nodemcu.menu.UploadSpeed.9600=9600
@@ -284,6 +293,10 @@ nodemcuv2.menu.CpuFrequency.80.build.f_cpu=80000000L
284293
nodemcuv2.menu.CpuFrequency.160=160 MHz
285294
nodemcuv2.menu.CpuFrequency.160.build.f_cpu=160000000L
286295

296+
nodemcuv2.menu.UploadTool.esptool=Serial
297+
nodemcuv2.menu.UploadTool.esptool.upload.tool=esptool
298+
nodemcuv2.menu.UploadTool.esptool.upload.verbose=-vv
299+
287300
nodemcuv2.menu.UploadSpeed.115200=115200
288301
nodemcuv2.menu.UploadSpeed.115200.upload.speed=115200
289302
nodemcuv2.menu.UploadSpeed.9600=9600
@@ -353,6 +366,10 @@ modwifi.menu.CpuFrequency.80.build.f_cpu=80000000L
353366
modwifi.menu.CpuFrequency.160=160 MHz
354367
modwifi.menu.CpuFrequency.160.build.f_cpu=160000000L
355368

369+
modwifi.menu.UploadTool.esptool=Serial
370+
modwifi.menu.UploadTool.esptool.upload.tool=esptool
371+
modwifi.menu.UploadTool.esptool.upload.verbose=-vv
372+
356373
modwifi.menu.UploadSpeed.115200=115200
357374
modwifi.menu.UploadSpeed.115200.upload.speed=115200
358375
modwifi.menu.UploadSpeed.9600=9600
@@ -405,6 +422,10 @@ thing.menu.CpuFrequency.80.build.f_cpu=80000000L
405422
thing.menu.CpuFrequency.160=160 MHz
406423
thing.menu.CpuFrequency.160.build.f_cpu=160000000L
407424

425+
thing.menu.UploadTool.esptool=Serial
426+
thing.menu.UploadTool.esptool.upload.tool=esptool
427+
thing.menu.UploadTool.esptool.upload.verbose=-vv
428+
408429
thing.menu.UploadSpeed.115200=115200
409430
thing.menu.UploadSpeed.115200.upload.speed=115200
410431
thing.menu.UploadSpeed.9600=9600
@@ -450,6 +471,10 @@ esp210.menu.CpuFrequency.80.build.f_cpu=80000000L
450471
esp210.menu.CpuFrequency.160=160 MHz
451472
esp210.menu.CpuFrequency.160.build.f_cpu=160000000L
452473

474+
esp210.menu.UploadTool.esptool=Serial
475+
esp210.menu.UploadTool.esptool.upload.tool=esptool
476+
esp210.menu.UploadTool.esptool.upload.verbose=-vv
477+
453478
esp210.menu.UploadSpeed.57600=57600
454479
esp210.menu.UploadSpeed.57600.upload.speed=57600
455480
esp210.menu.UploadSpeed.115200=115200

hardware/esp8266com/esp8266/cores/esp8266/WString.cpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,9 @@ ICACHE_FLASH_ATTR String::String(double value, unsigned char decimalPlaces) {
118118
}
119119

120120
ICACHE_FLASH_ATTR String::~String() {
121-
free(buffer);
121+
if(buffer) {
122+
free(buffer);
123+
}
122124
}
123125

124126
// /*********************************************/
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
#include <ESP8266WiFi.h>
2+
#include <ESP8266mDNS.h>
3+
#include <WiFiUdp.h>
4+
#include "ArduinoOTA.h"
5+
6+
ArduinoOTA::ArduinoOTA(const char *mdns_host_prefix, int port, bool serial_debug)
7+
{
8+
_port = port;
9+
_mdns_host = new String(mdns_host_prefix);
10+
*_mdns_host += String(ESP.getChipId(), HEX);
11+
_udp_ota = new WiFiUDP();
12+
_serial_debug = serial_debug;
13+
14+
_start_callback = NULL;
15+
_end_callback = NULL;
16+
_progress_callback = NULL;
17+
_error_callback = NULL;
18+
}
19+
20+
void ArduinoOTA::onStart(OTA_CALLBACK(fn)){
21+
_start_callback = fn;
22+
}
23+
24+
void ArduinoOTA::onEnd(OTA_CALLBACK(fn)){
25+
_end_callback = fn;
26+
}
27+
28+
void ArduinoOTA::onProgress(OTA_CALLBACK_PROGRESS(fn)){
29+
_progress_callback = fn;
30+
}
31+
32+
void ArduinoOTA::onError(OTA_CALLBACK(fn)){
33+
_error_callback = fn;
34+
}
35+
36+
ArduinoOTA::~ArduinoOTA(){
37+
delete _udp_ota;
38+
delete _mdns_host;
39+
}
40+
41+
void ArduinoOTA::setup() {
42+
_udp_ota->begin(_port);
43+
if (_mdns_host) {
44+
if (_serial_debug)
45+
Serial.printf("OTA server at: %s:%u\n",
46+
_mdns_host->c_str(),
47+
_port);
48+
MDNS.begin(_mdns_host->c_str());
49+
MDNS.addService("arduino", "tcp", _port);
50+
}
51+
}
52+
53+
void ArduinoOTA::handle() {
54+
55+
if (!_udp_ota->parsePacket()) return;
56+
57+
IPAddress remote = _udp_ota->remoteIP();
58+
int cmd = _udp_ota->parseInt();
59+
int port = _udp_ota->parseInt();
60+
int size = _udp_ota->parseInt();
61+
62+
if (_serial_debug){
63+
Serial.print("Update Start: ip:");
64+
Serial.print(remote);
65+
Serial.printf(", port:%d, size:%d\n", port, size);
66+
}
67+
68+
WiFiUDP::stopAll();
69+
70+
if(!Update.begin(size)){
71+
if (_serial_debug)
72+
Serial.println("Update Begin Error");
73+
if (_error_callback) _error_callback();
74+
_udp_ota->begin(_port);
75+
return;
76+
}
77+
if (_start_callback) _start_callback();
78+
if (_progress_callback) _progress_callback(0, size);
79+
80+
WiFiClient client;
81+
if (!client.connect(remote, port)) {
82+
if (_serial_debug)
83+
Serial.printf("Connect Failed\n");
84+
_udp_ota->begin(_port);
85+
if (_error_callback) _error_callback();
86+
}
87+
88+
uint32_t written;
89+
while(!Update.isFinished() && client.connected()){
90+
// TODO(mangelajo): enhance the Update.write(client) to
91+
// accept a progress callback
92+
written = Update.write(client);
93+
if(written > 0) client.print(written, DEC);
94+
if(_progress_callback) _progress_callback(written, size);
95+
}
96+
97+
Serial.setDebugOutput(false);
98+
99+
if(Update.end()){
100+
client.println("OK");
101+
if (_serial_debug)
102+
Serial.printf("Update Success\nRebooting...\n");
103+
if(_end_callback) _end_callback();
104+
ESP.restart();
105+
} else {
106+
// Update failed: listen UDP again, callback and print
107+
_udp_ota->begin(_port);
108+
if (_error_callback) _error_callback();
109+
Update.printError(client);
110+
if (_serial_debug)
111+
Update.printError(Serial);
112+
}
113+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
#ifndef __ARDUINO_OTA_H
2+
#define __ARDUINO_OTA_H
3+
4+
class WiFiUDP;
5+
6+
#define OTA_CALLBACK(callback) void (*callback)()
7+
#define OTA_CALLBACK_PROGRESS(callback) void (*callback)(unsigned int, unsigned int)
8+
9+
class ArduinoOTA
10+
{
11+
int _port;
12+
String* _mdns_host;
13+
WiFiUDP* _udp_ota;
14+
bool _serial_debug;
15+
16+
OTA_CALLBACK(_start_callback);
17+
OTA_CALLBACK(_end_callback);
18+
OTA_CALLBACK(_error_callback);
19+
20+
OTA_CALLBACK_PROGRESS(_progress_callback);
21+
22+
public:
23+
ArduinoOTA(const char *mdns_host="ESP8266-OTA-",
24+
int port=8266,
25+
bool serial_debug=true);
26+
~ArduinoOTA();
27+
void setup();
28+
void handle();
29+
void onStart(OTA_CALLBACK(fn));
30+
void onEnd(OTA_CALLBACK(fn));
31+
void onProgress(OTA_CALLBACK_PROGRESS(fn));
32+
void onError(OTA_CALLBACK (fn));
33+
};
34+
35+
#endif /* __ARDUINO_OTA_H */
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
#include <ESP8266WiFi.h>
2+
#include <ESP8266mDNS.h>
3+
#include <WiFiUdp.h>
4+
#include <ArduinoOTA.h>
5+
6+
const char* ssid = "...";
7+
const char* password = "...";
8+
9+
ArduinoOTA ota_server;
10+
11+
void setup() {
12+
Serial.begin(115200);
13+
14+
Serial.println("Booting");
15+
WiFi.mode(WIFI_STA);
16+
17+
/* try the flash stored password first */
18+
WiFi.begin();
19+
20+
while (WiFi.waitForConnectResult() != WL_CONNECTED){
21+
WiFi.begin(ssid, password);
22+
Serial.println("Retrying connection...");
23+
}
24+
ota_server.setup();
25+
Serial.println("Ready");
26+
}
27+
28+
void loop() {
29+
ota_server.handle();
30+
yield();
31+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
#include <ESP8266WiFi.h>
2+
#include <ESP8266mDNS.h>
3+
#include <WiFiUdp.h>
4+
#include <ArduinoOTA.h>
5+
6+
const char* ssid = "...";
7+
const char* password = "...";
8+
const char* host_prefix = "OTA-LEDS-";
9+
10+
ArduinoOTA ota_server(host_prefix, 8266, /* debug_serial= */ true);
11+
12+
int led_pin = 13;
13+
#define N_DIMMERS 3
14+
int dimmer_pin[] = {14, 5, 15};
15+
16+
void setup() {
17+
Serial.begin(115200);
18+
19+
/* switch on led */
20+
pinMode(led_pin, OUTPUT);
21+
digitalWrite(led_pin, LOW);
22+
23+
Serial.println("Booting");
24+
WiFi.mode(WIFI_STA);
25+
26+
/* try the flash stored password first */
27+
WiFi.begin();
28+
29+
while (WiFi.waitForConnectResult() != WL_CONNECTED){
30+
WiFi.begin(ssid, password);
31+
Serial.println("Retrying connection...");
32+
}
33+
/* switch off led */
34+
digitalWrite(led_pin, HIGH);
35+
36+
/* setup the OTA server */
37+
ota_server.setup();
38+
Serial.println("Ready");
39+
40+
/* configure dimmers, and OTA server events */
41+
analogWriteRange(1000);
42+
analogWrite(led_pin,990);
43+
44+
for (int i=0; i<N_DIMMERS; i++)
45+
{
46+
pinMode(dimmer_pin[i], OUTPUT);
47+
analogWrite(dimmer_pin[i],50);
48+
}
49+
50+
ota_server.onStart([]() { // switch off all the PWMs during upgrade
51+
for(int i=0; i<N_DIMMERS;i++)
52+
analogWrite(dimmer_pin[i], 0);
53+
analogWrite(led_pin,0);
54+
});
55+
56+
ota_server.onEnd([]() { // do a fancy thing with our board led at end
57+
for (int i=0;i<30;i++)
58+
{
59+
analogWrite(led_pin,(i*100) % 1001);
60+
delay(50);
61+
}
62+
});
63+
64+
ota_server.onError([]() { ESP.restart(); });
65+
66+
}
67+
68+
void loop() {
69+
ota_server.handle();
70+
yield();
71+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
#######################################
2+
# Syntax Coloring Map For Ultrasound
3+
#######################################
4+
5+
#######################################
6+
# Datatypes (KEYWORD1)
7+
#######################################
8+
9+
ArduinoOTA KEYWORD1
10+
11+
#######################################
12+
# Methods and Functions (KEYWORD2)
13+
#######################################
14+
15+
begin KEYWORD2
16+
setup KEYWORD2
17+
handle KEYWORD2
18+
onStart KEYWORD2
19+
onEnd KEYWORD2
20+
onError KEYWORD2
21+
onProgress KEYWORD2
22+
23+
#######################################
24+
# Constants (LITERAL1)
25+
#######################################
26+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
name=ArduinoOTA
2+
version=1.0
3+
author=Ivan Grokhotkov and Miguel Angel Ajo
4+
maintainer=Ivan Grokhtkov <[email protected]>
5+
sentence=Enables Over The Air upgrades, via wifi and espota.py UDP request/TCP download.
6+
paragraph=With this library you can enable your sketch to be upgraded over network. Includes mdns anounces to get discovered by the arduino IDE.
7+
category=Communication
8+
url=
9+
architectures=esp8266

0 commit comments

Comments
 (0)