From 9a1ff7f70dab5b948e4cd48f90ddc0fba5a17be8 Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Tue, 16 Jun 2015 18:26:34 +0200 Subject: [PATCH 01/32] add WiFi scan Async mode --- libraries/ESP8266WiFi/src/ESP8266WiFi.cpp | 76 ++++++-- libraries/ESP8266WiFi/src/ESP8266WiFi.h | 27 ++- .../ESP8266WiFi/src/ESP8266WiFiMulti.cpp | 168 ++++++++++-------- 3 files changed, 176 insertions(+), 95 deletions(-) diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFi.cpp b/libraries/ESP8266WiFi/src/ESP8266WiFi.cpp index 958dade69..b67f6dd91 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFi.cpp +++ b/libraries/ESP8266WiFi/src/ESP8266WiFi.cpp @@ -40,7 +40,9 @@ extern "C" void esp_schedule(); extern "C" void esp_yield(); ESP8266WiFiClass::ESP8266WiFiClass() -: _useApMode(false) +: _smartConfigStarted(false) +, _smartConfigDone(false) +, _useApMode(false) , _useClientMode(false) , _useStaticIp(false) { @@ -121,7 +123,7 @@ uint8_t ESP8266WiFiClass::waitForConnectResult(){ } -// You will have to set the DNS-Server manually later since this will not enable DHCP +// You will have to set the DNS-Server manually later since this will not enable DHCP2 void ESP8266WiFiClass::config(IPAddress local_ip, IPAddress gateway, IPAddress subnet) { struct ip_info info; @@ -357,12 +359,47 @@ void ESP8266WiFiClass::_scanDone(void* result, int status) } } - esp_schedule(); + + ESP8266WiFiClass::_scanStarted = false; + ESP8266WiFiClass::_scanComplete = true; + + if(!ESP8266WiFiClass::_scanAsync) { + esp_schedule(); + } } +int8_t ESP8266WiFiClass::scanComplete() { -int8_t ESP8266WiFiClass::scanNetworks() + if(_scanStarted) { + return WIFI_SCAN_RUNNING; + } + + if(_scanComplete) { + return ESP8266WiFiClass::_scanCount; + } + + return WIFI_SCAN_FAILD; +} + +void ESP8266WiFiClass::scanDelete() { + if (ESP8266WiFiClass::_scanResult) + { + delete[] reinterpret_cast(ESP8266WiFiClass::_scanResult); + ESP8266WiFiClass::_scanResult = 0; + ESP8266WiFiClass::_scanCount = 0; + } + _scanComplete = false; +} + +int8_t ESP8266WiFiClass::scanNetworks(bool async) +{ + if(ESP8266WiFiClass::_scanStarted) { + return WIFI_SCAN_RUNNING; + } + + ESP8266WiFiClass::_scanAsync = async; + if(_useApMode) { // turn on AP+STA mode mode(WIFI_AP_STA); @@ -376,22 +413,29 @@ int8_t ESP8266WiFiClass::scanNetworks() { disconnect(); } - - if (ESP8266WiFiClass::_scanResult) - { - delete[] reinterpret_cast(ESP8266WiFiClass::_scanResult); - ESP8266WiFiClass::_scanResult = 0; - ESP8266WiFiClass::_scanCount = 0; - } + scanDelete(); + struct scan_config config; config.ssid = 0; config.bssid = 0; config.channel = 0; config.show_hidden = 0; - wifi_station_scan(&config, reinterpret_cast(&ESP8266WiFiClass::_scanDone)); - esp_yield(); - return ESP8266WiFiClass::_scanCount; + if(wifi_station_scan(&config, reinterpret_cast(&ESP8266WiFiClass::_scanDone))) { + ESP8266WiFiClass::_scanComplete = false; + ESP8266WiFiClass::_scanStarted = true; + + if(ESP8266WiFiClass::_scanAsync) { + delay(0); // time for the OS to trigger the scan + return WIFI_SCAN_RUNNING; + } + + esp_yield(); + return ESP8266WiFiClass::_scanCount; + } else { + return WIFI_SCAN_FAILD; + } + } void * ESP8266WiFiClass::_getScanInfoByIndex(int i) @@ -644,6 +688,10 @@ void ESP8266WiFiClass::printDiag(Print& p) } +bool ESP8266WiFiClass::_scanAsync = false; +bool ESP8266WiFiClass::_scanStarted = false; +bool ESP8266WiFiClass::_scanComplete = false; + size_t ESP8266WiFiClass::_scanCount = 0; void* ESP8266WiFiClass::_scanResult = 0; diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFi.h b/libraries/ESP8266WiFi/src/ESP8266WiFi.h index a97ed934d..e3ba3e143 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFi.h +++ b/libraries/ESP8266WiFi/src/ESP8266WiFi.h @@ -32,6 +32,9 @@ extern "C" { #include "WiFiClient.h" #include "WiFiServer.h" +#define WIFI_SCAN_RUNNING (-1) +#define WIFI_SCAN_FAILD (-2) + enum WiFiMode { WIFI_OFF = 0, WIFI_STA = 1, WIFI_AP = 2, WIFI_AP_STA = 3 }; class ESP8266WiFiClass @@ -189,12 +192,26 @@ public: int32_t RSSI(); + + /* + * called to get the scan state in Async mode + * + * return -1 if scan not fin + * return -2 if scan not triggered + */ + int8_t scanComplete(); + + /* + * delete last scan result from RAM + */ + void scanDelete(); + /* * Start scan WiFi networks available * * return: Number of discovered networks */ - int8_t scanNetworks(); + int8_t scanNetworks(bool async = false); /* * Return the SSID discovered during the network scan. @@ -314,13 +331,17 @@ protected: void * _getScanInfoByIndex(int i); static void _smartConfigCallback(uint32_t status, void* result); static void _eventCallback(void *event); - bool _smartConfigStarted = false; - bool _smartConfigDone = false; + bool _smartConfigStarted; + bool _smartConfigDone; bool _useApMode; bool _useClientMode; bool _useStaticIp; + static bool _scanAsync; + static bool _scanStarted; + static bool _scanComplete; + static size_t _scanCount; static void* _scanResult; diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFiMulti.cpp b/libraries/ESP8266WiFi/src/ESP8266WiFiMulti.cpp index 34f249637..789c1d77e 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFiMulti.cpp +++ b/libraries/ESP8266WiFi/src/ESP8266WiFiMulti.cpp @@ -40,107 +40,119 @@ bool ESP8266WiFiMulti::addAP(const char* ssid, const char *passphrase) { wl_status_t ESP8266WiFiMulti::run(void) { + int8_t scanResult; wl_status_t status = WiFi.status(); if(status == WL_DISCONNECTED || status == WL_NO_SSID_AVAIL || status == WL_IDLE_STATUS || status == WL_CONNECT_FAILED) { - WifiAPlist_t bestNetwork { NULL, NULL }; - int bestNetworkDb = INT_MIN; - uint8 bestBSSID[6]; - int32_t bestChannel; + scanResult = WiFi.scanComplete(); + if(scanResult == WIFI_SCAN_RUNNING) { + // scan is running + return WL_NO_SSID_AVAIL; + } else if(scanResult > 0) { + // scan done analyze + WifiAPlist_t bestNetwork { NULL, NULL }; + int bestNetworkDb = INT_MIN; + uint8 bestBSSID[6]; + int32_t bestChannel; - DEBUG_WIFI_MULTI("[WIFI] delete old wifi config...\n"); - WiFi.disconnect(); + DEBUG_WIFI_MULTI("[WIFI] scan done\n"); + delay(0); - DEBUG_WIFI_MULTI("[WIFI] start scan\n"); - // WiFi.scanNetworks will return the number of networks found - int8_t n = WiFi.scanNetworks(); + if(scanResult <= 0) { + DEBUG_WIFI_MULTI("[WIFI] no networks found\n"); + } else { + DEBUG_WIFI_MULTI("[WIFI] %d networks found\n", scanResult); + for(int8_t i = 0; i < scanResult; ++i) { - DEBUG_WIFI_MULTI("[WIFI] scan done\n"); - delay(0); + String ssid_scan; + int32_t rssi_scan; + uint8_t sec_scan; + uint8_t* BSSID_scan; + int32_t chan_scan; + bool hidden_scan; - if(n <= 0) { - DEBUG_WIFI_MULTI("[WIFI] no networks found\n"); - } else { - DEBUG_WIFI_MULTI("[WIFI] %d networks found\n", n); - for(int8_t i = 0; i < n; ++i) { + WiFi.getNetworkInfo(i, ssid_scan, sec_scan, rssi_scan, BSSID_scan, chan_scan, hidden_scan); - String ssid_scan; - int32_t rssi_scan; - uint8_t sec_scan; - uint8_t* BSSID_scan; - int32_t chan_scan; - bool hidden_scan; + bool known = false; + for(uint32_t x = 0; x < APlist.size(); x++) { + WifiAPlist_t entry = APlist[x]; - WiFi.getNetworkInfo(i, ssid_scan, sec_scan, rssi_scan, BSSID_scan, chan_scan, hidden_scan); - - bool known = false; - for(uint32_t x = 0; x < APlist.size(); x++) { - WifiAPlist_t entry = APlist[x]; - - if(ssid_scan == entry.ssid) { // SSID match - known = true; - if(rssi_scan > bestNetworkDb) { // best network - if(sec_scan == ENC_TYPE_NONE || entry.passphrase) { // check for passphrase if not open wlan - bestNetworkDb = rssi_scan; - bestChannel = chan_scan; - memcpy((void*) &bestNetwork, (void*) &entry, sizeof(bestNetwork)); - memcpy((void*) &bestBSSID, (void*) BSSID_scan, sizeof(bestBSSID)); + if(ssid_scan == entry.ssid) { // SSID match + known = true; + if(rssi_scan > bestNetworkDb) { // best network + if(sec_scan == ENC_TYPE_NONE || entry.passphrase) { // check for passphrase if not open wlan + bestNetworkDb = rssi_scan; + bestChannel = chan_scan; + memcpy((void*) &bestNetwork, (void*) &entry, sizeof(bestNetwork)); + memcpy((void*) &bestBSSID, (void*) BSSID_scan, sizeof(bestBSSID)); + } } + break; } - break; } - } - if(known) { - DEBUG_WIFI_MULTI(" ---> "); - } else { - DEBUG_WIFI_MULTI(" "); - } + if(known) { + DEBUG_WIFI_MULTI(" ---> "); + } else { + DEBUG_WIFI_MULTI(" "); + } - DEBUG_WIFI_MULTI(" %d: [%d][%02X:%02X:%02X:%02X:%02X:%02X] %s (%d) %c\n", i, chan_scan, BSSID_scan[0], BSSID_scan[1], BSSID_scan[2], BSSID_scan[3], BSSID_scan[4], BSSID_scan[5], ssid_scan.c_str(), rssi_scan, (sec_scan == ENC_TYPE_NONE) ? ' ' : '*'); - delay(0); + DEBUG_WIFI_MULTI(" %d: [%d][%02X:%02X:%02X:%02X:%02X:%02X] %s (%d) %c\n", i, chan_scan, BSSID_scan[0], BSSID_scan[1], BSSID_scan[2], BSSID_scan[3], BSSID_scan[4], BSSID_scan[5], ssid_scan.c_str(), rssi_scan, (sec_scan == ENC_TYPE_NONE) ? ' ' : '*'); + delay(0); + } } - } - DEBUG_WIFI_MULTI("\n\n"); - delay(0); + // clean up ram + WiFi.scanDelete(); - if(bestNetwork.ssid) { - DEBUG_WIFI_MULTI("[WIFI] Connecting BSSID: %02X:%02X:%02X:%02X:%02X:%02X SSID: %s Channal: %d (%d)\n", bestBSSID[0], bestBSSID[1], bestBSSID[2], bestBSSID[3], bestBSSID[4], bestBSSID[5], bestNetwork.ssid, bestChannel, bestNetworkDb); + DEBUG_WIFI_MULTI("\n\n"); + delay(0); - WiFi.begin(bestNetwork.ssid, bestNetwork.passphrase, bestChannel, bestBSSID); - status = WiFi.status(); + if(bestNetwork.ssid) { + DEBUG_WIFI_MULTI("[WIFI] Connecting BSSID: %02X:%02X:%02X:%02X:%02X:%02X SSID: %s Channal: %d (%d)\n", bestBSSID[0], bestBSSID[1], bestBSSID[2], bestBSSID[3], bestBSSID[4], bestBSSID[5], bestNetwork.ssid, bestChannel, bestNetworkDb); - // wait for connection or fail - while(status != WL_CONNECTED && status != WL_NO_SSID_AVAIL && status != WL_CONNECT_FAILED) { - delay(10); + WiFi.begin(bestNetwork.ssid, bestNetwork.passphrase, bestChannel, bestBSSID); status = WiFi.status(); - } - IPAddress ip; - uint8_t * mac; - switch(status) { - case WL_CONNECTED: - ip = WiFi.localIP(); - mac = WiFi.BSSID(); - DEBUG_WIFI_MULTI("[WIFI] Connecting done.\n"); - DEBUG_WIFI_MULTI("[WIFI] SSID: %s\n", WiFi.SSID()); - DEBUG_WIFI_MULTI("[WIFI] IP: %d.%d.%d.%d\n", ip[0], ip[1], ip[2], ip[3]); - DEBUG_WIFI_MULTI("[WIFI] MAC: %02X:%02X:%02X:%02X:%02X:%02X\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); - DEBUG_WIFI_MULTI("[WIFI] Channel: %d\n", WiFi.channel()); - break; - case WL_NO_SSID_AVAIL: - DEBUG_WIFI_MULTI("[WIFI] Connecting Faild AP not found.\n"); - break; - case WL_CONNECT_FAILED: - DEBUG_WIFI_MULTI("[WIFI] Connecting Faild.\n"); - break; - default: - DEBUG_WIFI_MULTI("[WIFI] Connecting Faild (%d).\n", status); - break; + // wait for connection or fail + while(status != WL_CONNECTED && status != WL_NO_SSID_AVAIL && status != WL_CONNECT_FAILED) { + delay(10); + status = WiFi.status(); + } + + IPAddress ip; + uint8_t * mac; + switch(status) { + case WL_CONNECTED: + ip = WiFi.localIP(); + mac = WiFi.BSSID(); + DEBUG_WIFI_MULTI("[WIFI] Connecting done.\n"); + DEBUG_WIFI_MULTI("[WIFI] SSID: %s\n", WiFi.SSID()); + DEBUG_WIFI_MULTI("[WIFI] IP: %d.%d.%d.%d\n", ip[0], ip[1], ip[2], ip[3]); + DEBUG_WIFI_MULTI("[WIFI] MAC: %02X:%02X:%02X:%02X:%02X:%02X\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); + DEBUG_WIFI_MULTI("[WIFI] Channel: %d\n", WiFi.channel()); + break; + case WL_NO_SSID_AVAIL: + DEBUG_WIFI_MULTI("[WIFI] Connecting Faild AP not found.\n"); + break; + case WL_CONNECT_FAILED: + DEBUG_WIFI_MULTI("[WIFI] Connecting Faild.\n"); + break; + default: + DEBUG_WIFI_MULTI("[WIFI] Connecting Faild (%d).\n", status); + break; + } + } else { + DEBUG_WIFI_MULTI("[WIFI] no matching wifi found!\n"); } } else { - DEBUG_WIFI_MULTI("[WIFI] no matching wifi found!\n"); + // start scan + DEBUG_WIFI_MULTI("[WIFI] delete old wifi config...\n"); + WiFi.disconnect(); + + DEBUG_WIFI_MULTI("[WIFI] start scan\n"); + // scan wifi async mode + WiFi.scanNetworks(true); } } return status; From 8f6d1e33d2629b28fa7e3803ddd5e0f5c77e3a47 Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Wed, 17 Jun 2015 11:54:46 +0200 Subject: [PATCH 02/32] update SDK to esp_iot_sdk_v1.1.2_15_06_16_p1 --- cores/esp8266/core_esp8266_main.cpp | 16 +++++++++----- tools/sdk/changelog.txt | 32 ++++++++++++++++++++++++++++ tools/sdk/include/espconn.h | 25 ++++++++++++++++++++++ tools/sdk/include/spi_flash.h | 8 +++++++ tools/sdk/lib/libjson.a | Bin 12818 -> 12818 bytes tools/sdk/lib/liblwip.a | Bin 301928 -> 304810 bytes tools/sdk/lib/libmain.a | Bin 137848 -> 141130 bytes tools/sdk/lib/libnet80211.a | Bin 191966 -> 191838 bytes tools/sdk/lib/libpp.a | Bin 185354 -> 185354 bytes tools/sdk/lib/libsmartconfig.a | Bin 98570 -> 98570 bytes tools/sdk/lib/libssl.a | Bin 165086 -> 171696 bytes tools/sdk/lib/libupgrade.a | Bin 17350 -> 17350 bytes tools/sdk/lib/libwpa.a | Bin 124548 -> 124548 bytes tools/sdk/version | 2 +- 14 files changed, 77 insertions(+), 6 deletions(-) diff --git a/cores/esp8266/core_esp8266_main.cpp b/cores/esp8266/core_esp8266_main.cpp index b67543f8b..3423d70a1 100644 --- a/cores/esp8266/core_esp8266_main.cpp +++ b/cores/esp8266/core_esp8266_main.cpp @@ -128,12 +128,18 @@ extern "C" { void user_init(void) { uart_div_modify(0, UART_CLK_FREQ / (74480)); - system_rtc_mem_read(0, &resetInfo, sizeof(struct rst_info)); - if(resetInfo.reason == REASON_WDT_RST || resetInfo.reason == REASON_EXCEPTION_RST) { - os_printf("Last Reset:\n - flag=%d\n - Fatal exception (%d):\n - epc1=0x%08x,epc2=0x%08x,epc3=0x%08x,excvaddr=0x%08x,depc=0x%08x\n", resetInfo.reason, resetInfo.exccause, resetInfo.epc1, resetInfo.epc2, resetInfo.epc3, resetInfo.excvaddr, resetInfo.depc); + struct rst_info *rtc_info = system_get_rst_info(); + os_printf("Last reset reason: 0x%02X\n", rtc_info->reason); + + if (rtc_info->reason == REASON_WDT_RST || + rtc_info->reason == REASON_EXCEPTION_RST || + rtc_info->reason == REASON_SOFT_WDT_RST) { + if (rtc_info->reason == REASON_EXCEPTION_RST) { + os_printf("Fatal exception (%d):\n", rtc_info->exccause); + } + os_printf("epc1=0x%08x, epc2=0x%08x, epc3=0x%08x, excvaddr=0x%08x, depc=0x%08x\n", + rtc_info->epc1, rtc_info->epc2, rtc_info->epc3, rtc_info->excvaddr, rtc_info->depc); } - struct rst_info info = { 0 }; - system_rtc_mem_write(0, &info, sizeof(struct rst_info)); uart_div_modify(0, UART_CLK_FREQ / (115200)); diff --git a/tools/sdk/changelog.txt b/tools/sdk/changelog.txt index 185750669..9f2ad6bf8 100644 --- a/tools/sdk/changelog.txt +++ b/tools/sdk/changelog.txt @@ -1,3 +1,35 @@ +esp_iot_sdk_v1.1.2_15_06_16_p1 Release Note +------------------------------------------- +Here is a patch based on SDK_v1.1.2 resolved issue that "wifi_station_scan" cause loss of wireless connectivity. + +Please replace them in esp_iot_sdk/lib folder. + +Sorry for the inconvenience. + + + + +esp_iot_sdk_v1.1.2_15_06_12 Release Note +------------------------------------------- + +Optimization: +1. support certificate issuer verification for SSL +2. Update SPI driver, support overlap mode + +Add APIs: +1. wifi_station_set_hostname : set ESP8266 station DHCP hostname +2. wifi_station_get_hostname : get ESP8266 station DHCP hostname +3. spi_flash_set_read_func :set user specified reading SPI function on overlap mode +4. espconn_secure_ca_disable : disable SSL CA verify +5. espconn_secure_ca_enable : enable SSL CA verify + +Add Documentation: +1. SPI overlap introduction: \esp_iot_sdk\document, sorry that it has only Chinese version now,we will add English version of this documentation ASAP. +2. SSL introduction: \esp_iot_sdk\document + + + + esp_iot_sdk_v1.1.1_15_06_05 Release Note ------------------------------------------- diff --git a/tools/sdk/include/espconn.h b/tools/sdk/include/espconn.h index a85c82392..82212103b 100644 --- a/tools/sdk/include/espconn.h +++ b/tools/sdk/include/espconn.h @@ -23,6 +23,9 @@ typedef void (* espconn_reconnect_callback)(void *arg, sint8 err); #define ESPCONN_ARG -12 /* Illegal argument. */ #define ESPCONN_ISCONN -15 /* Already connected. */ +#define ESPCONN_HANDSHAKE -28 /* ssl handshake failed */ +#define ESPCONN_PROTO_MSG -61 /* ssl application invalid */ + /** Protocol family and type of the espconn */ enum espconn_type { ESPCONN_INVALID = 0, @@ -455,6 +458,28 @@ bool espconn_secure_set_size(uint8 level, uint16 size); sint16 espconn_secure_get_size(uint8 level); +/****************************************************************************** + * FunctionName : espconn_secure_ca_enable + * Description : enable the certificate authenticate and set the flash sector + * as client or server + * Parameters : level -- set for client or server + * 1: client,2:server,3:client and server + * flash_sector -- flash sector for save certificate + * Returns : result true or false +*******************************************************************************/ + +bool espconn_secure_ca_enable(uint8 level, uint8 flash_sector ); + +/****************************************************************************** + * FunctionName : espconn_secure_ca_disable + * Description : disable the certificate authenticate as client or server + * Parameters : level -- set for client or server + * 1: client,2:server,3:client and server + * Returns : result true or false +*******************************************************************************/ + +bool espconn_secure_ca_disable(uint8 level); + /****************************************************************************** * FunctionName : espconn_secure_accept * Description : The function given as the listen diff --git a/tools/sdk/include/spi_flash.h b/tools/sdk/include/spi_flash.h index 347e1b920..bb920fef5 100644 --- a/tools/sdk/include/spi_flash.h +++ b/tools/sdk/include/spi_flash.h @@ -30,4 +30,12 @@ SpiFlashOpResult spi_flash_erase_sector(uint16 sec); SpiFlashOpResult spi_flash_write(uint32 des_addr, uint32 *src_addr, uint32 size); SpiFlashOpResult spi_flash_read(uint32 src_addr, uint32 *des_addr, uint32 size); +typedef SpiFlashOpResult (* user_spi_flash_read)( + SpiFlashChip *spi, + uint32 src_addr, + uint32 *des_addr, + uint32 size); + +void spi_flash_set_read_func(user_spi_flash_read read); + #endif diff --git a/tools/sdk/lib/libjson.a b/tools/sdk/lib/libjson.a index e8fa9d8da2a4bcb01accded30add6eef961a42e3..5b35fba2c6ffaff3863b135b194a35dd748c61da 100644 GIT binary patch delta 44 mcmbP~GAU((G`oqRp^>4v!A2!+CK!9O3Da9iI7dU~l_&rQ_zRK% delta 44 mcmbP~GAU((G`q2hrI~@H`9>vfCK!9O3Da9iI7dU~l_&rWXA9H- diff --git a/tools/sdk/lib/liblwip.a b/tools/sdk/lib/liblwip.a index a6c42f9e99cac957b7d94e1b0eec852c2519d9e4..c956810ea4fcb82ff804463276790556626974d4 100644 GIT binary patch delta 15546 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 delta 14486 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
  • Nw0r(8Rn-JFbsiYatXO&tQ=9-@t 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 B;9vj% delta 50012 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 Tt$n9`x=+(@OFhfdotpfA&AKTP diff --git a/tools/sdk/lib/libnet80211.a b/tools/sdk/lib/libnet80211.a index 648852e52a0e981b676f00d36c14128366ead651..14a1d09d381373938bc26e31deaad7c37a2a5837 100644 GIT binary patch delta 15431 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 diff --git a/tools/sdk/lib/libpp.a b/tools/sdk/lib/libpp.a index e42233ab314a21f2ff5354356d07161ab33e53bc..9238f6c536d7915243edbcb297940aeffbfa6a71 100644 GIT binary patch delta 143 zcmeBL!QHijdxA8(iJ_s9p}Fx!rPF*c_U12qD<$BZCF+VQaLyTT#R@p*%i*=maL$V3 pS7*XF+glPD*Up3SwpuW83c)zrJ%pHMdcb&-&v;90i)P}g1OVF@DS7|^ delta 143 zcmeBL!QHijdxA8(v5BRbfu;FIrPF*c_U12qD<$BZCF+VQaLyTT#R@p*%i*=maL$V3 pS7*XF+glPD*Up3SwpuW83c)zrJ%pHMdcb&-&v;90i)P}g1OO2&DmVZD diff --git a/tools/sdk/lib/libsmartconfig.a b/tools/sdk/lib/libsmartconfig.a index 03f296fd90ee6a9b98eb29bf64f60926e8292882..7fb8490a7741e9c3687d63e09567891e5f7db951 100644 GIT binary patch delta 64 zcmeBbV(V&Rn;^|@VrXb&Xl}ewDV-U{-aLW%=0P~8;ONF07-#YXX0h#dPK;;l09d9I AC;$Ke delta 64 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 T@a2nD7tRUhWF~t&)9e2O&zB9s delta 33577 zcmb`w34B$>9rl0bB!Pr`0||sp0%U;@kYExKf`UQ{h!qgriWMukVv7rEU0T|U6fCy1 zBFB1dMMY{|sntdst60GmDyS${Txh{smDU9)T5PHJeZJ@ZMvuJ9=l%Tu?|c~MnP;9^ z&TMDS%sDsrKi28b*K}IeCv)iVQ6m~hwNzC#R$-F=S5-A1cIb$huA0>;2!bC4L8qVo z?`^+(g5ZB;FTEoOl6Lv3An-Qh!T+uMs0#7_&}RNuiMbAM1^?IfpvwY>tv~$BcB=f| zp8Aczd7J4PIPBGrU^5>4&+cuj0_W}h-w&L(&;2QI|Ih3x|NjyT#~dES_Uprf@XIzD z*X!WuH{qqx83h$>Hx~S^pzYL->kB$se~Ui6tw-TujV&$Nszz6zopq2aYnz`M5@z>I za5d4iktM%8qI1}GY}x!UdhVlJv)ilPS<%vpX|6olR#98BD;)$w3xl9@cJmow�<< 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 TCm3evPBOftebdjww!;4b=0nef diff --git a/tools/sdk/lib/libupgrade.a b/tools/sdk/lib/libupgrade.a index d0d2d5bdac5ae9c9dbabde6a340a8b86e9cc789b..e0dda74eb209dc6312b05af4e4e5782b0aa11a23 100644 GIT binary patch delta 45 ncmX@s&Umbyae_3viJ_s9p}FxyrQa~-W);Rj6F8^F)Qb-QF-8nc delta 45 ncmX@s&Umbyae_3vv8jQDk)h#4rQa~-W);Rj6F8^F)Qb-QF~tl} diff --git a/tools/sdk/lib/libwpa.a b/tools/sdk/lib/libwpa.a index c6f1bb620bf8462daf32141ca7872155869574df..b5a5135095def833fb9e8b8b95ed45177127aa1d 100644 GIT binary patch delta 295 zcmZoU%ieO9eS$Q*iJ_s9p}Fx!rIYM1_GG_U@y(nZReW%Pd4A%X7m7XOgb8f!Q`jj2 z=lGeL3c@&(!Ajk}!42Cy&+jJ}Om_3U$d$}+j$dpwAEW-}Q`t8wU}BT|6vQ?kcoHv* zEU?{%i7{RRE&{Y+`%Wpwz8ILucE55)RxKEBI*=#6y>KC;7#mDzd*5=#iE#IV?AUIz lhp~r=QGff%eT-Wf8BMp>A7K0=1yc|7gv9n)w;5k?0RS*JR{j70 delta 295 zcmZoU%ieO9eS$Q*v5BRbfu+SprIYM1_GG_U@y(nZReW%Pd4A%X7m7XOgb8f!Q`jj2 z=lGeL3c@&(!Ajk}!42Cy&+jJ}Om_3U$d$}+j$dpwAEWl>Q`t8wU}BT|6vQ?kcoHv* zEU?{%i7{RRE&{Y+`%Wpwz8ILucE55)RxKEBI*=#6y>KC;7#mDzd*5=#iE#IV?AUIz lhp~r=QG5HzeT-Wf84b7BA7K0=1yc|7gv9n)w;5k?0RRAtSVjN< diff --git a/tools/sdk/version b/tools/sdk/version index 1aeff03a8..d3b2eb935 100644 --- a/tools/sdk/version +++ b/tools/sdk/version @@ -1 +1 @@ -1.1.1_15_06_05 \ No newline at end of file +1.1.2_15_06_16_p1 \ No newline at end of file From e85605325405d1e80044c7c1dab7afece3ca46ae Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Wed, 17 Jun 2015 12:08:52 +0200 Subject: [PATCH 03/32] update getResetInfo --- cores/esp8266/Esp.cpp | 4 ++-- cores/esp8266/core_esp8266_main.cpp | 19 +++++++++---------- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/cores/esp8266/Esp.cpp b/cores/esp8266/Esp.cpp index 73367683a..32b4aecd3 100644 --- a/cores/esp8266/Esp.cpp +++ b/cores/esp8266/Esp.cpp @@ -290,8 +290,8 @@ uint32_t EspClass::getFlashChipSizeByChipId(void) { String EspClass::getResetInfo(void) { if(resetInfo.reason != 0) { - char buff[150]; - sprintf(&buff[0], "Fatal exception:%d flag:%d epc1:0x%08x epc2:0x%08x epc3:0x%08x excvaddr:0x%08x depc:0x%08x", resetInfo.exccause, resetInfo.reason, resetInfo.epc1, resetInfo.epc2, resetInfo.epc3, resetInfo.excvaddr, resetInfo.depc); + char buff[200]; + sprintf(&buff[0], "Fatal exception:%d flag:%d (%s) epc1:0x%08x epc2:0x%08x epc3:0x%08x excvaddr:0x%08x depc:0x%08x", resetInfo.exccause, resetInfo.reason, (resetInfo.reason == 0 ? "DEFAULT" : resetInfo.reason == 1 ? "WDT" : resetInfo.reason == 2 ? "EXCEPTION" : resetInfo.reason == 3 ? "SOFT_WDT" : resetInfo.reason == 4 ? "SOFT_RESTART" : resetInfo.reason == 5 ? "DEEP_SLEEP_AWAKE" : "???"), resetInfo.epc1, resetInfo.epc2, resetInfo.epc3, resetInfo.excvaddr, resetInfo.depc); return String(buff); } return String("flag: 0"); diff --git a/cores/esp8266/core_esp8266_main.cpp b/cores/esp8266/core_esp8266_main.cpp index 3423d70a1..350567906 100644 --- a/cores/esp8266/core_esp8266_main.cpp +++ b/cores/esp8266/core_esp8266_main.cpp @@ -126,19 +126,18 @@ void user_rf_pre_init() { extern "C" { void user_init(void) { - uart_div_modify(0, UART_CLK_FREQ / (74480)); + struct rst_info *rtc_info_ptr = system_get_rst_info(); - struct rst_info *rtc_info = system_get_rst_info(); - os_printf("Last reset reason: 0x%02X\n", rtc_info->reason); + memcpy((void *) &resetInfo, (void *) rtc_info_ptr, sizeof(resetInfo)); - if (rtc_info->reason == REASON_WDT_RST || - rtc_info->reason == REASON_EXCEPTION_RST || - rtc_info->reason == REASON_SOFT_WDT_RST) { - if (rtc_info->reason == REASON_EXCEPTION_RST) { - os_printf("Fatal exception (%d):\n", rtc_info->exccause); + os_printf("Last reset reason: 0x%02X\n", resetInfo.reason); + + + if(resetInfo.reason == REASON_WDT_RST || resetInfo.reason == REASON_EXCEPTION_RST || resetInfo.reason == REASON_SOFT_WDT_RST) { + if(resetInfo.reason == REASON_EXCEPTION_RST) { + os_printf("Fatal exception (%d):\n", resetInfo.exccause); } - os_printf("epc1=0x%08x, epc2=0x%08x, epc3=0x%08x, excvaddr=0x%08x, depc=0x%08x\n", - rtc_info->epc1, rtc_info->epc2, rtc_info->epc3, rtc_info->excvaddr, rtc_info->depc); + os_printf("epc1=0x%08x, epc2=0x%08x, epc3=0x%08x, excvaddr=0x%08x, depc=0x%08x\n", resetInfo.epc1, resetInfo.epc2, resetInfo.epc3, resetInfo.excvaddr, resetInfo.depc); } uart_div_modify(0, UART_CLK_FREQ / (115200)); From fe1b39fa0e4dc8e85626f1a1e5a5adda052c398f Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Wed, 17 Jun 2015 14:22:59 +0200 Subject: [PATCH 04/32] update AVR src * java code not tested * Merge remote-tracking branch 'remotes/arduino/master' into esp8266 Conflicts: README.md app/src/processing/app/AbstractMonitor.java arduino-core/src/processing/app/Serial.java libraries/WiFi/examples/WiFiWebClientRepeating/WiFiWebClientRepeating.ino libraries/WiFi/library.properties --- .gitignore | 2 +- cores/esp8266/Esp.cpp | 2 +- libraries/ESP8266WiFi/src/ESP8266WiFiMulti.h | 2 +- libraries/SD/README.adoc | 2 +- libraries/SD/library.properties | 4 ++-- libraries/SD/src/SD.h | 5 +++++ 6 files changed, 11 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index d88f1f2da..6245c1dd7 100644 --- a/.gitignore +++ b/.gitignore @@ -13,7 +13,7 @@ hardware/arduino/bootloaders/caterina_LUFA/Caterina.lss hardware/arduino/bootloaders/caterina_LUFA/Caterina.elf hardware/arduino/bootloaders/caterina_LUFA/Caterina.eep hardware/arduino/bootloaders/caterina_LUFA/.dep/ -build/libastylej-*.zip +build/*.zip build/windows/work/ build/windows/*.zip build/windows/*.tgz diff --git a/cores/esp8266/Esp.cpp b/cores/esp8266/Esp.cpp index 32b4aecd3..cdf38dde3 100644 --- a/cores/esp8266/Esp.cpp +++ b/cores/esp8266/Esp.cpp @@ -291,7 +291,7 @@ uint32_t EspClass::getFlashChipSizeByChipId(void) { String EspClass::getResetInfo(void) { if(resetInfo.reason != 0) { char buff[200]; - sprintf(&buff[0], "Fatal exception:%d flag:%d (%s) epc1:0x%08x epc2:0x%08x epc3:0x%08x excvaddr:0x%08x depc:0x%08x", resetInfo.exccause, resetInfo.reason, (resetInfo.reason == 0 ? "DEFAULT" : resetInfo.reason == 1 ? "WDT" : resetInfo.reason == 2 ? "EXCEPTION" : resetInfo.reason == 3 ? "SOFT_WDT" : resetInfo.reason == 4 ? "SOFT_RESTART" : resetInfo.reason == 5 ? "DEEP_SLEEP_AWAKE" : "???"), resetInfo.epc1, resetInfo.epc2, resetInfo.epc3, resetInfo.excvaddr, resetInfo.depc); + sprintf(&buff[0], "Fatal exception:%d flag:%d (%s) epc1:0x%08x epc2:0x%08x epc3:0x%08x excvaddr:0x%08x depc:0x%08x", resetInfo.exccause, resetInfo.reason, (resetInfo.reason == 0 ? "DEFAULT" : resetInfo.reason == 1 ? "WDT" : resetInfo.reason == 2 ? "EXCEPTION" : resetInfo.reason == 3 ? "SOFT_WDT" : resetInfo.reason == 4 ? "SOFT_RESTART" : resetInfo.reason == 5 ? "DEEP_SLEEP_AWAKE" : "???"), resetInfo.epc1, resetInfo.epc2, resetInfo.epc3, resetInfo.excvaddr, resetInfo.depc); return String(buff); } return String("flag: 0"); diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFiMulti.h b/libraries/ESP8266WiFi/src/ESP8266WiFiMulti.h index 63c180c31..3f2692a50 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFiMulti.h +++ b/libraries/ESP8266WiFi/src/ESP8266WiFiMulti.h @@ -32,7 +32,7 @@ #undef max #include -//#define DEBUG_WIFI_MULTI(...) Serial1.printf( __VA_ARGS__ ) +#define DEBUG_WIFI_MULTI(...) Serial1.printf( __VA_ARGS__ ) #ifndef DEBUG_WIFI_MULTI #define DEBUG_WIFI_MULTI(...) diff --git a/libraries/SD/README.adoc b/libraries/SD/README.adoc index 4c6521ed3..fabff563c 100644 --- a/libraries/SD/README.adoc +++ b/libraries/SD/README.adoc @@ -3,7 +3,7 @@ The SD library allows for reading from and writing to SD cards. For more information about this library please visit us at -http://arduino.cc/en/Reference/SD +http://www.arduino.cc/en/Reference/SD == License == diff --git a/libraries/SD/library.properties b/libraries/SD/library.properties index 4658054f8..bc8c4e498 100644 --- a/libraries/SD/library.properties +++ b/libraries/SD/library.properties @@ -1,9 +1,9 @@ name=SD -version=1.0.4 +version=1.0.5 author=Arduino, SparkFun maintainer=Arduino sentence=Enables reading and writing on SD cards. For all Arduino boards. paragraph=Once an SD memory card is connected to the SPI interfare of the Arduino board you are enabled to create files and read/write on them. You can also move through directories on the SD card. category=Data Storage -url=http://arduino.cc/en/Reference/SD +url=http://www.arduino.cc/en/Reference/SD architectures=* diff --git a/libraries/SD/src/SD.h b/libraries/SD/src/SD.h index 62276b4ee..653adabee 100644 --- a/libraries/SD/src/SD.h +++ b/libraries/SD/src/SD.h @@ -93,18 +93,23 @@ public: // write, etc). Returns a File object for interacting with the file. // Note that currently only one file can be open at a time. File open(const char *filename, uint8_t mode = FILE_READ); + File open(const String &filename, uint8_t mode = FILE_READ) { return open( filename.c_str(), mode ); } // Methods to determine if the requested file path exists. boolean exists(char *filepath); + boolean exists(const String &filepath) { return exists(filepath.c_str()); } // Create the requested directory heirarchy--if intermediate directories // do not exist they will be created. boolean mkdir(char *filepath); + boolean mkdir(const String &filepath) { return mkdir(filepath.c_str()); } // Delete the file. boolean remove(char *filepath); + boolean remove(const String &filepath) { return remove(filepath.c_str()); } boolean rmdir(char *filepath); + boolean rmdir(const String &filepath) { return rmdir(filepath.c_str()); } uint8_t type(){ return card.type(); } uint8_t fatType(){ return volume.fatType(); } From d6f62943d4b511e7d5fe6147096c8979890416f5 Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Fri, 19 Jun 2015 10:41:20 +0200 Subject: [PATCH 05/32] fix problems with serial and cbuf (some times freeze on high load) --- cores/esp8266/HardwareSerial.cpp | 1 + cores/esp8266/cbuf.h | 8 ++++++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/cores/esp8266/HardwareSerial.cpp b/cores/esp8266/HardwareSerial.cpp index 970b16c50..fcca84687 100644 --- a/cores/esp8266/HardwareSerial.cpp +++ b/cores/esp8266/HardwareSerial.cpp @@ -608,6 +608,7 @@ size_t HardwareSerial::write(uint8_t c) { while(_tx_buffer->room() == 0) { yield(); + uart_arm_tx_interrupt(_uart); } _tx_buffer->write(c); diff --git a/cores/esp8266/cbuf.h b/cores/esp8266/cbuf.h index 87642510b..ceb6a7b6d 100644 --- a/cores/esp8266/cbuf.h +++ b/cores/esp8266/cbuf.h @@ -39,8 +39,12 @@ class cbuf { } size_t room() const { - if(_end >= _begin) return _size - (_end - _begin) - 1; - + if(_end >= _begin) { + return _size - (_end - _begin) - 1; + } + if(_begin == _end) { + return _size; + } return _begin - _end - 1; } From af4f2d5e28814608da2070b9b5655ef6ea7b6307 Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Fri, 19 Jun 2015 10:53:35 +0200 Subject: [PATCH 06/32] sync with arduino avr src --- cores/esp8266/Arduino.h | 4 +++- cores/esp8266/Print.cpp | 3 +-- cores/esp8266/Stream.h | 2 ++ cores/esp8266/WMath.cpp | 2 +- cores/esp8266/core_esp8266_wiring_pulse.c | 4 ++++ 5 files changed, 11 insertions(+), 4 deletions(-) diff --git a/cores/esp8266/Arduino.h b/cores/esp8266/Arduino.h index 89bf32685..49420d0e4 100644 --- a/cores/esp8266/Arduino.h +++ b/cores/esp8266/Arduino.h @@ -195,6 +195,7 @@ unsigned long micros(void); void delay(unsigned long); void delayMicroseconds(unsigned int us); unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout); +unsigned long pulseInLong(uint8_t pin, uint8_t state, unsigned long timeout); void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val); uint8_t shiftIn(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder); @@ -243,6 +244,7 @@ uint16_t makeWord(byte h, byte l); #define word(...) makeWord(__VA_ARGS__) unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout = 1000000L); +unsigned long pulseInLong(uint8_t pin, uint8_t state, unsigned long timeout = 1000000L); void tone(uint8_t _pin, unsigned int frequency, unsigned long duration = 0); void noTone(uint8_t _pin); @@ -250,7 +252,7 @@ void noTone(uint8_t _pin); // WMath prototypes long random(long); long random(long, long); -void randomSeed(unsigned int); +void randomSeed(unsigned long); long map(long, long, long, long, long); diff --git a/cores/esp8266/Print.cpp b/cores/esp8266/Print.cpp index 1f924248a..efd6b9f17 100644 --- a/cores/esp8266/Print.cpp +++ b/cores/esp8266/Print.cpp @@ -127,8 +127,7 @@ size_t ICACHE_FLASH_ATTR Print::print(const Printable& x) { } size_t ICACHE_FLASH_ATTR Print::println(void) { - size_t n = print("\r\n"); - return n; + return print("\r\n"); } size_t ICACHE_FLASH_ATTR Print::println(const String &s) { diff --git a/cores/esp8266/Stream.h b/cores/esp8266/Stream.h index 6d08ef1dc..14eacbf6c 100644 --- a/cores/esp8266/Stream.h +++ b/cores/esp8266/Stream.h @@ -69,6 +69,8 @@ class Stream: public Print { } // returns true if target string is found, false if timed out + bool find(char target) { return find (&target, 1); } + bool findUntil(const char *target, const char *terminator); // as find but search ends if the terminator string is found bool findUntil(const uint8_t *target, const char *terminator) { return findUntil((char *) target, terminator); diff --git a/cores/esp8266/WMath.cpp b/cores/esp8266/WMath.cpp index dcd51f1f2..da46a3ddb 100644 --- a/cores/esp8266/WMath.cpp +++ b/cores/esp8266/WMath.cpp @@ -27,7 +27,7 @@ extern "C" { #include } -void randomSeed(unsigned int seed) { +void randomSeed(unsigned long seed) { if(seed != 0) { srand(seed); } diff --git a/cores/esp8266/core_esp8266_wiring_pulse.c b/cores/esp8266/core_esp8266_wiring_pulse.c index 16b2ccc06..bb13e31c1 100644 --- a/cores/esp8266/core_esp8266_wiring_pulse.c +++ b/cores/esp8266/core_esp8266_wiring_pulse.c @@ -30,3 +30,7 @@ unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout) { while(digitalRead(pin) == state && (micros() - start) < timeout); return micros() - start; } + +unsigned long pulseInLong(uint8_t pin, uint8_t state, unsigned long timeout) { + return pulseIn(pin, state, timeout); +} From 874cf0ef98bbcafd9abbdac2fec776f1ec5b1231 Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Sat, 20 Jun 2015 18:36:19 +0200 Subject: [PATCH 07/32] fix exception 28 in AP + STA mode and STA disconnect UDP triggers exception 28 --- libraries/ESP8266WiFi/src/include/ClientContext.h | 15 +++++++++------ libraries/ESP8266WiFi/src/include/UdpContext.h | 9 +++++---- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/libraries/ESP8266WiFi/src/include/ClientContext.h b/libraries/ESP8266WiFi/src/include/ClientContext.h index d1f728eef..619356862 100644 --- a/libraries/ESP8266WiFi/src/include/ClientContext.h +++ b/libraries/ESP8266WiFi/src/include/ClientContext.h @@ -90,12 +90,15 @@ class ClientContext { } void unref() { - DEBUGV(":ur %d\r\n", _refcnt); - if(--_refcnt == 0) { - flush(); - close(); - if(_discard_cb) _discard_cb(_discard_cb_arg, this); - delete this; + if(this != 0) { + DEBUGV(":ur %d\r\n", _refcnt); + if(--_refcnt == 0) { + flush(); + close(); + if(_discard_cb) + _discard_cb(_discard_cb_arg, this); + delete this; + } } } diff --git a/libraries/ESP8266WiFi/src/include/UdpContext.h b/libraries/ESP8266WiFi/src/include/UdpContext.h index c86e050ed..f7cebc86c 100644 --- a/libraries/ESP8266WiFi/src/include/UdpContext.h +++ b/libraries/ESP8266WiFi/src/include/UdpContext.h @@ -77,10 +77,11 @@ public: void unref() { - DEBUGV(":ur %d\r\n", _refcnt); - if (--_refcnt == 0) - { - delete this; + if(this != 0) { + DEBUGV(":ur %d\r\n", _refcnt); + if(--_refcnt == 0) { + delete this; + } } } From 1f1497264b54f28f3e469f8be5b213af014a7dde Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Sat, 20 Jun 2015 20:55:08 +0200 Subject: [PATCH 08/32] disable WiFi DEBUG_WIFI_MULTI add _min and _max define as workaround --- cores/esp8266/Arduino.h | 2 ++ libraries/ESP8266WiFi/src/ESP8266WiFiMulti.h | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/cores/esp8266/Arduino.h b/cores/esp8266/Arduino.h index 49420d0e4..bd94033e7 100644 --- a/cores/esp8266/Arduino.h +++ b/cores/esp8266/Arduino.h @@ -237,6 +237,8 @@ void loop(void); #define min(a,b) ((a)<(b)?(a):(b)) #define max(a,b) ((a)>(b)?(a):(b)) +#define _min(a,b) ((a)<(b)?(a):(b)) +#define _max(a,b) ((a)>(b)?(a):(b)) uint16_t makeWord(uint16_t w); uint16_t makeWord(byte h, byte l); diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFiMulti.h b/libraries/ESP8266WiFi/src/ESP8266WiFiMulti.h index 3f2692a50..63c180c31 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFiMulti.h +++ b/libraries/ESP8266WiFi/src/ESP8266WiFiMulti.h @@ -32,7 +32,7 @@ #undef max #include -#define DEBUG_WIFI_MULTI(...) Serial1.printf( __VA_ARGS__ ) +//#define DEBUG_WIFI_MULTI(...) Serial1.printf( __VA_ARGS__ ) #ifndef DEBUG_WIFI_MULTI #define DEBUG_WIFI_MULTI(...) From 279ee266acb92b1b60819565fa6d741ac15b50de Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Sun, 21 Jun 2015 21:35:56 +0200 Subject: [PATCH 09/32] fix build problems boards.txt have definitions doubled. --- boards.txt | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/boards.txt b/boards.txt index bfc910a2b..d1f213ca0 100644 --- a/boards.txt +++ b/boards.txt @@ -21,13 +21,7 @@ generic.build.board=ESP8266_ESP01 generic.build.core=esp8266 generic.build.variant=generic generic.build.flash_mode=qio -generic.build.flash_size=512K -generic.build.flash_freq=40 -generic.build.flash_ld=eagle.flash.512k.ld -generic.build.spiffs_start=0x6B000 -generic.build.spiffs_end=0x7B000 generic.build.spiffs_pagesize=256 -generic.build.spiffs_blocksize=4096 generic.menu.CpuFrequency.80=80 MHz generic.menu.CpuFrequency.80.build.f_cpu=80000000L @@ -123,10 +117,10 @@ generic.menu.FlashSize.4M.upload.maximum_size=1044464 # generic.menu.FlashSize.16M.build.spiffs_end=0x1000000 # generic.menu.FlashSize.16M.build.spiffs_blocksize=8192 -# generic.menu.FlashFreq.40=40MHz -# generic.menu.FlashFreq.40.build.flash_freq=40 -# generic.menu.FlashFreq.80=80MHz -# generic.menu.FlashFreq.80.build.flash_freq=80 +generic.menu.FlashFreq.40=40MHz +generic.menu.FlashFreq.40.build.flash_freq=40 +generic.menu.FlashFreq.80=80MHz +generic.menu.FlashFreq.80.build.flash_freq=80 ############################################################## modwifi.name=Olimex MOD-WIFI-ESP8266(-DEV) From 93f215cb2e123294cdfc1e12a3a20dafdd128a3f Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Sun, 21 Jun 2015 21:38:19 +0200 Subject: [PATCH 10/32] add wait time after reset --- cores/esp8266/Esp.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/cores/esp8266/Esp.cpp b/cores/esp8266/Esp.cpp index cdf38dde3..4d9d8b033 100644 --- a/cores/esp8266/Esp.cpp +++ b/cores/esp8266/Esp.cpp @@ -125,6 +125,10 @@ void EspClass::reset(void) void EspClass::restart(void) { system_restart(); + delay(5000); + system_restart(); + delay(20000); + reset(); // if we still have not reset force it! } uint16_t EspClass::getVcc(void) @@ -436,7 +440,7 @@ bool EspClass::updateSketch(Stream& in, uint32_t size) { ebcmd.args[1] = 0x00000; ebcmd.args[2] = size; eboot_command_write(&ebcmd); - + ESP.restart(); return true; // never happens } From 0f513e4814de491ac1de33b593ffd426cc0d3f0f Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Sun, 21 Jun 2015 21:38:36 +0200 Subject: [PATCH 11/32] add first code for HTTP Update --- .../ESP8266httpUpdate/library.properties | 8 + .../src/ESP8266httpUpdate.cpp | 162 ++++++++++++++++++ .../ESP8266httpUpdate/src/ESP8266httpUpdate.h | 55 ++++++ 3 files changed, 225 insertions(+) create mode 100644 libraries/ESP8266httpUpdate/library.properties create mode 100644 libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.cpp create mode 100644 libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.h diff --git a/libraries/ESP8266httpUpdate/library.properties b/libraries/ESP8266httpUpdate/library.properties new file mode 100644 index 000000000..9be2f7d6d --- /dev/null +++ b/libraries/ESP8266httpUpdate/library.properties @@ -0,0 +1,8 @@ +name=ESP8266httpUpdate +version=1.0 +author=Markus Sattler +maintainer=Markus Sattler +sentence=Http Update for ESP8266 +paragraph= +url=https://github.com/Links2004/Arduino/tree/esp8266/hardware/esp8266com/esp8266/libraries/ESP8266httpUpdate +architectures=ESP8266 diff --git a/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.cpp b/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.cpp new file mode 100644 index 000000000..846233c4b --- /dev/null +++ b/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.cpp @@ -0,0 +1,162 @@ +/** + * + * @file ESP8266httpUpdate.cpp + * @date 21.06.2015 + * @author Markus Sattler + * + * Copyright (c) 2015 Markus Sattler. All rights reserved. + * This file is part of the ESP8266 Http Updater. + * + * 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 "ESP8266httpUpdate.h" + +ESP8266httpUpdate::ESP8266httpUpdate(void) { + +} + +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_FAILD; + WiFiClient tcp; + DEBUG_HTTP_UPDATE("[httpUpdate] connected to %s:%u %s .... ", host, port, url); + + if(!tcp.connect(host, port)) { + DEBUG_HTTP_UPDATE("faild.\n"); + return ret; + } + DEBUG_HTTP_UPDATE("ok.\n"); + + // set Timeout for readBytesUntil and readStringUntil + tcp.setTimeout(2000); + tcp.setNoDelay(true); + + String req = "GET "; + + req += url; + req += " HTTP/1.1\r\n" + "Host: "; + req += host; + req += "\r\n" + "Connection: close\r\n" + "User-Agent: ESP8266-http-Update\r\n" + "x-ESP8266-STA-MAC: "; + req += WiFi.macAddress(); + req += "\r\n" + "x-ESP8266-AP-MAC: "; + req += WiFi.softAPmacAddress(); + req += "\r\n" + "x-ESP8266-free-space: "; + req += ESP.getFreeSketchSpace(); + req += "\r\n" + "x-ESP8266-sketch-size: "; + req += ESP.getSketchSize(); + req += "\r\n" + "x-ESP8266-chip-size: "; + req += ESP.getFlashChipRealSize(); + + if(current_version[0] != 0x00) { + req += "\r\n" + "x-ESP8266-version: "; + req += current_version; + } + + req += "\r\n" + "\r\n"; + + tcp.write(req.c_str(), req.length()); + + uint32_t code = 0; + size_t len = 0; + + while(true) { + String headerLine = tcp.readStringUntil('\n'); + headerLine.trim(); // remove \r + + if(headerLine.length() > 0) { + DEBUG_HTTP_UPDATE("[httpUpdate][Header] RX: %s\n", headerLine.c_str()); + if(headerLine.startsWith("HTTP/1.")) { + // 9 = lenght of "HTTP/1.x " + code = headerLine.substring(9, headerLine.indexOf(' ', 9)).toInt(); + } else if(headerLine.startsWith("Content-Length: ")) { + // 16 = lenght of "Content-Length: " + len = headerLine.substring(16).toInt(); + } + } else { + break; + } + } + + DEBUG_HTTP_UPDATE("[httpUpdate] Header read fin.\n"); + DEBUG_HTTP_UPDATE("[httpUpdate] Server header:\n"); + DEBUG_HTTP_UPDATE("[httpUpdate] - code: %d\n", code); + DEBUG_HTTP_UPDATE("[httpUpdate] - len: %d\n", len); + + DEBUG_HTTP_UPDATE("[httpUpdate] ESP8266 info:\n"); + DEBUG_HTTP_UPDATE("[httpUpdate] - free Space: %d\n", ESP.getFreeSketchSpace()); + DEBUG_HTTP_UPDATE("[httpUpdate] - current Sketch Size: %d\n", ESP.getSketchSize()); + + if(current_version[0] != 0x00) { + DEBUG_HTTP_UPDATE("[httpUpdate] - current version: %s\n", current_version); + } + + switch(code) { + case 200: ///< OK (Start Update) + if(len > 0) { + if(len > ESP.getFreeSketchSpace()) { + ret = HTTP_UPDATE_FAILD; + DEBUG_HTTP_UPDATE("[httpUpdate] FreeSketchSpace to low (%d) needed: %d\n", ESP.getFreeSketchSpace(), len); + } else { + if(ESP.updateSketch(tcp, len)) { + // may never reached! + ret = HTTP_UPDATE_OK; + DEBUG_HTTP_UPDATE("[httpUpdate] Update ok\n"); + } else { + ret = HTTP_UPDATE_FAILD; + DEBUG_HTTP_UPDATE("[httpUpdate] Update failed\n"); + } + } + } else { + ret = HTTP_UPDATE_FAILD; + DEBUG_HTTP_UPDATE("[httpUpdate]Content-Length is 0?!\n"); + } + break; + case 304: + ///< Not Modified (No updates) + ret = HTTP_UPDATE_NO_UPDATES; + break; + case 403: + ///< Forbidden + // todo handle login + default: + ret = HTTP_UPDATE_FAILD; + DEBUG_HTTP_UPDATE("[httpUpdate] Code is (%d)\n", code); + break; + } + + return ret; +} + +t_httpUpdate_return ESP8266httpUpdate::update(String host, uint16_t port, String url, String current_version) { + return update(host.c_str(), port, url.c_str(), current_version.c_str()); +} + +ESP8266httpUpdate ESPhttpUpdate; diff --git a/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.h b/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.h new file mode 100644 index 000000000..7a878e4f3 --- /dev/null +++ b/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.h @@ -0,0 +1,55 @@ +/** + * + * @file ESP8266httpUpdate.h + * @date 21.06.2015 + * @author Markus Sattler + * + * Copyright (c) 2015 Markus Sattler. All rights reserved. + * This file is part of the ESP8266 Http Updater. + * + * 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 + * + */ + +#ifndef ESP8266HTTPUPDATE_H_ +#define ESP8266HTTPUPDATE_H_ + +#include +#include + +#define DEBUG_HTTP_UPDATE(...) Serial1.printf( __VA_ARGS__ ) + +#ifndef DEBUG_HTTP_UPDATE +#define DEBUG_HTTP_UPDATE(...) +#endif + +typedef enum { + HTTP_UPDATE_FAILD, + HTTP_UPDATE_NO_UPDATES, + HTTP_UPDATE_OK +} t_httpUpdate_return; + +class ESP8266httpUpdate { + public: + ESP8266httpUpdate(void); + ~ESP8266httpUpdate(void); + + 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 = ""); +}; + +extern ESP8266httpUpdate ESPhttpUpdate; + +#endif /* ESP8266HTTPUPDATE_H_ */ From 3d71bec59a096e588809c21347339183aadf049b Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Sun, 21 Jun 2015 21:53:31 +0200 Subject: [PATCH 12/32] rename to ESP8266HTTPUpdate --- .../ESP8266httpUpdate/src/ESP8266httpUpdate.cpp | 14 +++++++------- .../ESP8266httpUpdate/src/ESP8266httpUpdate.h | 10 +++++----- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.cpp b/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.cpp index 846233c4b..118ec894f 100644 --- a/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.cpp +++ b/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.cpp @@ -1,6 +1,6 @@ /** * - * @file ESP8266httpUpdate.cpp + * @file ESP8266HTTPUpdate.cpp * @date 21.06.2015 * @author Markus Sattler * @@ -23,17 +23,17 @@ * */ -#include "ESP8266httpUpdate.h" +#include "ESP8266HTTPUpdate.h" -ESP8266httpUpdate::ESP8266httpUpdate(void) { +ESP8266HTTPUpdate::ESP8266HTTPUpdate(void) { } -ESP8266httpUpdate::~ESP8266httpUpdate(void) { +ESP8266HTTPUpdate::~ESP8266HTTPUpdate(void) { } -t_httpUpdate_return ESP8266httpUpdate::update(const char *host, uint16_t port, const char * url, const char *current_version) { +t_httpUpdate_return ESP8266HTTPUpdate::update(const char *host, uint16_t port, const char * url, const char *current_version) { t_httpUpdate_return ret = HTTP_UPDATE_FAILD; WiFiClient tcp; @@ -155,8 +155,8 @@ t_httpUpdate_return ESP8266httpUpdate::update(const char *host, uint16_t port, c return ret; } -t_httpUpdate_return ESP8266httpUpdate::update(String host, uint16_t port, String url, String current_version) { +t_httpUpdate_return ESP8266HTTPUpdate::update(String host, uint16_t port, String url, String current_version) { return update(host.c_str(), port, url.c_str(), current_version.c_str()); } -ESP8266httpUpdate ESPhttpUpdate; +ESP8266HTTPUpdate ESPhttpUpdate; diff --git a/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.h b/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.h index 7a878e4f3..cbd11c879 100644 --- a/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.h +++ b/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.h @@ -1,6 +1,6 @@ /** * - * @file ESP8266httpUpdate.h + * @file ESP8266HTTPUpdate.h * @date 21.06.2015 * @author Markus Sattler * @@ -41,15 +41,15 @@ typedef enum { HTTP_UPDATE_OK } t_httpUpdate_return; -class ESP8266httpUpdate { +class ESP8266HTTPUpdate { public: - ESP8266httpUpdate(void); - ~ESP8266httpUpdate(void); + ESP8266HTTPUpdate(void); + ~ESP8266HTTPUpdate(void); 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 = ""); }; -extern ESP8266httpUpdate ESPhttpUpdate; +extern ESP8266HTTPUpdate ESPhttpUpdate; #endif /* ESP8266HTTPUPDATE_H_ */ From 8559c8bbb1c58992be75ca8643233421c1d6326b Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Sun, 21 Jun 2015 22:19:23 +0200 Subject: [PATCH 13/32] add pull up option to OneWire see #447 --- libraries/OneWire/OneWire.cpp | 8 ++++++-- libraries/OneWire/OneWire.h | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/libraries/OneWire/OneWire.cpp b/libraries/OneWire/OneWire.cpp index 593053794..7fbedd408 100644 --- a/libraries/OneWire/OneWire.cpp +++ b/libraries/OneWire/OneWire.cpp @@ -117,9 +117,13 @@ sample code bearing this copyright. #include "OneWire.h" -OneWire::OneWire(uint8_t pin) +OneWire::OneWire(uint8_t pin, bool pullup) { - pinMode(pin, INPUT_PULLUP); + if(pullup) { + pinMode(pin, INPUT_PULLUP); + } else { + pinMode(pin, INPUT); + } bitmask = PIN_TO_BITMASK(pin); baseReg = PIN_TO_BASEREG(pin); #if ONEWIRE_SEARCH diff --git a/libraries/OneWire/OneWire.h b/libraries/OneWire/OneWire.h index 6ff16745a..68cc25f58 100644 --- a/libraries/OneWire/OneWire.h +++ b/libraries/OneWire/OneWire.h @@ -135,7 +135,7 @@ class OneWire #endif public: - OneWire( uint8_t pin); + OneWire(uint8_t pin, bool pullup = true); // Perform a 1-Wire reset cycle. Returns 1 if a device responds // with a presence pulse. Returns 0 if there is no device or the From f11c65e9a77eb721eff4388a96c1bc936d561149 Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Mon, 22 Jun 2015 10:23:33 +0200 Subject: [PATCH 14/32] add basic check for valid data for in updateSketch (first byte of bin is always 0xE9) send SDK version by HTTP Update --- cores/esp8266/Esp.cpp | 7 +++++++ libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.cpp | 3 +++ 2 files changed, 10 insertions(+) diff --git a/cores/esp8266/Esp.cpp b/cores/esp8266/Esp.cpp index 4d9d8b033..504cf028d 100644 --- a/cores/esp8266/Esp.cpp +++ b/cores/esp8266/Esp.cpp @@ -414,6 +414,13 @@ bool EspClass::updateSketch(Stream& in, uint32_t size) { return false; } + if(addr == freeSpaceStart) { + // check for valid first magic byte + if(*((uint8 *) buffer.get()) != 0xE9) { + return false; + } + } + noInterrupts(); rc = SPIWrite(addr, buffer.get(), willRead); interrupts(); diff --git a/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.cpp b/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.cpp index 118ec894f..ef48087e1 100644 --- a/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.cpp +++ b/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.cpp @@ -72,6 +72,9 @@ t_httpUpdate_return ESP8266HTTPUpdate::update(const char *host, uint16_t port, c req += "\r\n" "x-ESP8266-chip-size: "; req += ESP.getFlashChipRealSize(); + req += "\r\n" + "x-ESP8266-sdk-version: "; + req += ESP.getSdkVersion(); if(current_version[0] != 0x00) { req += "\r\n" From 750c5dcc5ddbe8efd8b32500a6d73d08c4cfef41 Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Mon, 22 Jun 2015 11:51:13 +0200 Subject: [PATCH 15/32] code style --- libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.cpp | 2 +- libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.cpp b/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.cpp index ef48087e1..a21e44f89 100644 --- a/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.cpp +++ b/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.cpp @@ -33,7 +33,7 @@ ESP8266HTTPUpdate::~ESP8266HTTPUpdate(void) { } -t_httpUpdate_return ESP8266HTTPUpdate::update(const char *host, uint16_t port, const char * url, const char *current_version) { +t_httpUpdate_return ESP8266HTTPUpdate::update(const char * host, uint16_t port, const char * url, const char * current_version) { t_httpUpdate_return ret = HTTP_UPDATE_FAILD; WiFiClient tcp; diff --git a/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.h b/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.h index cbd11c879..0456997b0 100644 --- a/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.h +++ b/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.h @@ -46,7 +46,7 @@ class ESP8266HTTPUpdate { ESP8266HTTPUpdate(void); ~ESP8266HTTPUpdate(void); - t_httpUpdate_return update(const char *host, uint16_t port, const char * url = "/", const char *current_version = ""); + 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 = ""); }; From 432385604cd0616084429be771d77d56b0ac236c Mon Sep 17 00:00:00 2001 From: Testato Date: Wed, 24 Jun 2015 22:32:59 +0200 Subject: [PATCH 16/32] Update core_esp8266_phy.c added vdd33_const explanation from official Espressif documentation --- cores/esp8266/core_esp8266_phy.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/cores/esp8266/core_esp8266_phy.c b/cores/esp8266/core_esp8266_phy.c index 2ac33a8a6..8a3c0ccf8 100644 --- a/cores/esp8266/core_esp8266_phy.c +++ b/cores/esp8266/core_esp8266_phy.c @@ -195,12 +195,18 @@ static uint8_t phy_init_data[128] = // 5.5m, 11m power index [0~5] [98] = 0, + // vdd33_const - // the voltage of PA_VDD - // x=0xff: it can measure VDD33, - // 18<=x<=36: use input voltage, - // the value is voltage*10, 33 is 3.3V, 30 is 3.0V, - // x<18 or x>36: default voltage is 3.3V + // the value of this byte depend from the TOUT pin usage (1 or 2): + // 1) + // analogRead function (system_adc_read()): + // is only available when wire TOUT pin17 to external circuitry, Input Voltage Range restricted to 0 ~ 1.0V. + // For this function the vdd33_const must be set as real power voltage of VDD3P3 pin 3 and 4 + // The range of operating voltage of ESP8266 is 1.8V~3.6V,the unit of vdd33_const is 0.1V,so effective value range of vdd33_const is [18,36] + // 2) + // getVcc function (system_get_vdd33): + // is only available when TOUT pin17 is suspended (floating), this function measure the power voltage of VDD3P3 pin 3 and 4 + // For this function the vdd33_const must be set as 255. [107] = 33, // disable RF calibration for certain number of times From 61f800ec1452cd115be1d94ddf1c59e73143208a Mon Sep 17 00:00:00 2001 From: Testato Date: Thu, 25 Jun 2015 11:33:34 +0200 Subject: [PATCH 17/32] Update core_esp8266_phy.c --- cores/esp8266/core_esp8266_phy.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/cores/esp8266/core_esp8266_phy.c b/cores/esp8266/core_esp8266_phy.c index 8a3c0ccf8..130c5e36d 100644 --- a/cores/esp8266/core_esp8266_phy.c +++ b/cores/esp8266/core_esp8266_phy.c @@ -197,6 +197,12 @@ static uint8_t phy_init_data[128] = // vdd33_const + // the voltage of PA_VDD + // x=0xff: it can measure VDD33, + // 18<=x<=36: use input voltage, + // the value is voltage*10, 33 is 3.3V, 30 is 3.0V, + // x<18 or x>36: default voltage is 3.3V + // // the value of this byte depend from the TOUT pin usage (1 or 2): // 1) // analogRead function (system_adc_read()): From cd5228f7c2b89a0648bdeafee60b9c4678a84013 Mon Sep 17 00:00:00 2001 From: Testato Date: Thu, 25 Jun 2015 11:34:53 +0200 Subject: [PATCH 18/32] Update core_esp8266_phy.c --- cores/esp8266/core_esp8266_phy.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cores/esp8266/core_esp8266_phy.c b/cores/esp8266/core_esp8266_phy.c index 130c5e36d..53c781113 100644 --- a/cores/esp8266/core_esp8266_phy.c +++ b/cores/esp8266/core_esp8266_phy.c @@ -198,7 +198,7 @@ static uint8_t phy_init_data[128] = // vdd33_const // the voltage of PA_VDD - // x=0xff: it can measure VDD33, + // x=0xff: it can measure VDD33, // 18<=x<=36: use input voltage, // the value is voltage*10, 33 is 3.3V, 30 is 3.0V, // x<18 or x>36: default voltage is 3.3V From 4d740bd8e1637fe11c6e92addfc63fed479d8a89 Mon Sep 17 00:00:00 2001 From: Testato Date: Thu, 25 Jun 2015 11:35:24 +0200 Subject: [PATCH 19/32] Update core_esp8266_phy.c --- cores/esp8266/core_esp8266_phy.c | 1 - 1 file changed, 1 deletion(-) diff --git a/cores/esp8266/core_esp8266_phy.c b/cores/esp8266/core_esp8266_phy.c index 53c781113..fed475888 100644 --- a/cores/esp8266/core_esp8266_phy.c +++ b/cores/esp8266/core_esp8266_phy.c @@ -195,7 +195,6 @@ static uint8_t phy_init_data[128] = // 5.5m, 11m power index [0~5] [98] = 0, - // vdd33_const // the voltage of PA_VDD // x=0xff: it can measure VDD33, From 411773dffa07f881254e184761f4dcd23c0ebf34 Mon Sep 17 00:00:00 2001 From: Testato Date: Thu, 25 Jun 2015 11:38:43 +0200 Subject: [PATCH 20/32] Update core_esp8266_phy.c --- cores/esp8266/core_esp8266_phy.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cores/esp8266/core_esp8266_phy.c b/cores/esp8266/core_esp8266_phy.c index fed475888..25693daf9 100644 --- a/cores/esp8266/core_esp8266_phy.c +++ b/cores/esp8266/core_esp8266_phy.c @@ -211,7 +211,7 @@ static uint8_t phy_init_data[128] = // 2) // getVcc function (system_get_vdd33): // is only available when TOUT pin17 is suspended (floating), this function measure the power voltage of VDD3P3 pin 3 and 4 - // For this function the vdd33_const must be set as 255. + // For this function the vdd33_const must be set to 255 (0xFF). [107] = 33, // disable RF calibration for certain number of times From abdb14b97734dd129614988fc343869158e09b03 Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Fri, 26 Jun 2015 18:47:59 +0200 Subject: [PATCH 21/32] add eclipse howto --- doc/eclipse/1_Install_New_Software.png | Bin 0 -> 12698 bytes doc/eclipse/2_Install_software.png | Bin 0 -> 63938 bytes doc/eclipse/eclipse.md | 34 +++++++++++++++++++++++++ 3 files changed, 34 insertions(+) create mode 100644 doc/eclipse/1_Install_New_Software.png create mode 100644 doc/eclipse/2_Install_software.png create mode 100644 doc/eclipse/eclipse.md diff --git a/doc/eclipse/1_Install_New_Software.png b/doc/eclipse/1_Install_New_Software.png new file mode 100644 index 0000000000000000000000000000000000000000..a3e9d3619e0b7b307509fe511e5bc4efb09122f3 GIT binary patch literal 12698 zcma)i1yodD`|hA1F)D(Dw1R*%0+JF+x0G}#HROQgkdjI_0z=2p-RV#x(v5U?Gt^Lb z@cY*Nee1jH-us`m&di#9_CEWZv)}i5pZ9t9_YX?akMPLx006)vSs4jc004s@eHh_9 zK(}yYnjWBkFutftzXz1`Q*NUFV4A;Ed$=<)~(7=ICPVU2wl@@yMLarsZ*Wg3nBu!&~ zKs&bD^a4Q@XIyC_k7X+qGRl!=c01htbs!2ZZt-iO;&Ni;OD%zg+h$n<^_0cI!Nd~3 zNLnx04YJNJ1}411IxBdXR4!_pg1y{ksh(V1#=(oa$KjnpbJen*xsn3CZHf>N#I`R- z8e}czbnXocAu?96V7V9&%go1|G|%|hClfbn6`mRH+ntp?I_x;9irHgC1Q{+xzJPBq z_4hDJNAp4PBn(eiviDG4LR@>eCV>H7+LxwEDo{uh;?FDxdxC#4!8;ICM61;Y%3~}V zguhN;I2nP8VEL@K5dP3Hx#hDE{}agqZ*5PG3Yxk7l8*{sH*NO(Zdzt{kFKjC{8G&J z{Dk#+r-Og5Ks6r`%!F=(#Aa%bH>T86EiP+b&il->g>OX@NP*kFjtXrB`T^5#o(j|( zHDha8BX(gI^g&L)O?_*S0d1sZ^btB`mzK&Zvt9vH5|t+ zIYynf9(aufPX~p1mbYnxs+SG4wmyXo@WCGKm2$TA>>I*866f`)EXtqx4qe*pdw=&r zg^Q1iJX?)5a*NMu+v6ZfY>)vUI0@<=cmbMz;JcXtRI3?ytFV?J~9Sd4v>; z^u%2iT(sQ4Z~F_!xI?Ebtr~~DCDr$;eA2fmA7w&L$1luwvLZWH`GcLmA$?&96eozI zjjftQJ0^3WOPimJpI0(H^7uBMWmLJ6or-bwOM7*sM$l-gy^0niG?A}2Vb6Q$x_~&p zRgkiV>P$Z@yYB||d+ghVKH`UG;0pQ?bbToRdjdR z2v&cY?v;TRJ+e+36!ehEnWDfJo^P|6sv|{RO7!#-JOEqZr`yYcK+QvlW%^?|BJ-{Z z3D=*U4IR$N?k7ekBiC(Cda5E!OjdpsR7eMc(F06b+k%tabZo&JXUejT&1KEFaHGu#ARE6)`Zt=l8w8xCh)566MeN zvA}+_dO@o?_x27RD~;iv%h`73z;Jr!d11bxLJm=-(xytu&Q0a;<*JHIKQwIi1!B2e zY2J)+@RN|rht^h)P6hUb4jn>ap)3Es1l1S4Mpk}dhh-ZzTTyRQzG}ru5-;*-7VhX6 z%!#ofDJp$4JyNHtYBlp(f{C$rHdOjj)T9{?0qKTqz7(##dMpPkIy_Oo zvc!^}l^5X)dTvfGs_wcJ)h^Bm``MJ;kNl6&&xd0Sr*cBR2EjLnl9@PeddcC!S3ACK zS^O$s)~Zvbt?)M1%JBZ@?C}PCPBrV@K=ga`H^J+VOJ))X3pcOd97w`4$5pVaEECL= z&q zKK;eBCrXwV*p`YNrDtsMA2FJ4azB%w*Y2KxBuT_AKGvK$K zjPxpjl*aoe`j2Wl+QxP?js}3A@Ru%_i1%s^S=w7M?Ubb*UAJr>Z);y_CM;-?!#DCn z_FEI_io%sHZ<3V_n%VjD@zHjazD58g)O%h#1oxJ6cvts=uI@ZFk%c&%+mx`Ydqi2k zrk6-#!X|zI7<6K!gC}OSL`<2LmRT{%qw}eSKu_PBfiS~%gF;!2jM_LS*IQ2ET~k*| zW`ReBzazD-rC>|mpnusUb_yu~%-Kyu8PS2PQbVanhYTJ{O4%vIqpc^MzyvS6I|h28 zt#11ey?hqD^}e6A^dJq)-NhR;XGwPkYNjRwCXfH&AIpc2^B6E_Er(kY^|$>$12!cf zz2YBh?s-Q{2>|fi-z5u0PZEc9=Pe}Y!5_5mY|<2MBVX=j%X|LppO_zjRqK4sfST@D z--s=w$>q4YQWD%VcNwg`5@uhIAG6b{MmfkwEHn*5j>|Xm=7y^L( z{v%#bLU;C3Zz{Bc{8{;3z9ux?(F2dk!udwv8~}h~Nc3F>F)2$MLah7<|5TjpKgg;x z-?*ZH4ZC5qH>Sd>bzSm#ZmzZl-8ZXEtyE8BszMhsHOiO9YBKATxb>1CCWRmgDge?> z3oQK@iL=)gl$K$I5Pljl+K{R(XV{1oX+WO-LCzLZ=VFN4X2|cmaw&N)E^<= zqAVW41L*kVZ69Iy-cKjS!Qzu4nZYlC$jq9L+?%fWf=_k+{72RUQI6J&aKahf)_Ojr z^-BkjQl)~P9Co<2Rg@f%S9)4sR>a=kOhdW5#I8@B`ev$+Vf0>>RAFvxRf>3!&+aH$Oup0al2wdy=1N!B*T}Uk z7geYFb1ZYcNs{oUs+|VGhfF`*e7R5tNzoxHQtgL{XVYzvozBb@-m0IzUcV}c+difN z$KfC?b#foo6+ER7d7$k;%YEc($i9k0GIB?i{_QdRzG$RY#V7p&_Jky9aQ`>C40ex7 z>jr8AGSN3%Do&=M3;xJ#>e{f-Q{YLx7S)mr5#V_yrpu_9Hkk3o*81wnJD}}Es;8WF z^bGI*q_`hDWlDi`rU+bC^>?J-nSpM`8}@tS(yZRIKc9}! z{+skT001PJS(JuIfqU6v4AW_@?P-g>&pb~!7ya;eRVa=PIF*|>I3kAj_kYljzj%QT zV0B9X08;uroNASn^2^A%`R2LdjATrjHw$$iXsxA2>Y61`-Y)r_t~;dTi0}#8h5x*Q zQ$^A7o82tMIWDHb@`7-#vXP@!h(hmGaQ}fUkNb^kxdO@Go*yH^;ddl|?EXJc5WCOHU+=wcIGJN|oVY&%`V(B+>0x>|xK9e#RxEIV8hZ6o(e+ATs(c-=D&O|74u~nmRyz&Tr6b z^4%V*HCsq?#Q0#!g~bQiQK#o#+jUB|*gSgUc$4FuTP$=oIMp}3xtJU@+>h0o!?zxh zNo*$~b;+xk4Wk9(%4+jOx>ROtl@>2t+OD~Qfe8~^ zEDnvTsPD>a5ewrb^Y0`2A*rX{&jS1iX8cQ3kf=;h`OIliQ-X8T0XD>ZOA`G!D@@El zMCG2(N!u@zSkhLa=pl}T&<^631J(7ok2%4Z3AHE^K)P}?6aO*wOb>8AQ$A>x47guY zz6_eJU~)7x$tvA!erdlvP1`GKJ z^08~tCN@%^0(7VjOv@A@44rY_dz6-Wx-%tTJ1-h1H4AX{GBNi zbS*0nReo6;@^5{VqY2Yj)3H@3S-3Zfr^?EemR{sao%0SI(){({iWE-NiVd4@lOSgr zJa(t7kc)r|FRNihc#pOn|HLC~*G=*J3If2Q1v5AS7r>FRo! zn9;9Xqnk)?AlTeu*8eGJqQT0dyRtpcY6XkuGAbx`hB}!)j3Jy#+2!VptZK8*Ex*Fe zMA$?|QJjpPlaH<5aAJJ!9aRef^h51QlR4|V}qzaI#390eI&nb<3%+)YSRtDJfEH;Om;#;lw!w$xgziv|wY^;d43V69R! z*ZmFbF&B{;iT|Gv|L;Wof5-jdPrhH~7ziW1I)~o0C+8=joYOi1-Oq_vyIx z=&6Kke=L=aXp^O~Z4D*0ky>@sb?{PdIw4eMv*%WBh+undik%)Y7=%e`T{#%K$sEGs z#%=c;kg}#v)e|TEp-V@l=gBvXAZ_*?YSmQ40zz^|-OX)CB-O@*%+R_I|9sPh})OhA!S3Q#TXqxUsNU z+mfbaCOOF-HnEMxM8P8U(3nI*1QoD}c}XD5Q+DIn5$j9wI3RngM-SbbHD^;qj*gkH zmC*o~B_F{jxw|1l?O}v`AZD+l0PfrnJJRaSx`#|6yrg(UALpP`CeXMBm6B zg>_c#xel;*R2l+LBGf8$z!+o=4T%2HR=UA)@xa2W*{E4ZSBh%yqO@nC%3o~1skk8r z3&HilR1v?V=3&|?ee2ZHQzE3rv59{8Am1gwy=2a4eYusX5i)(-T(qTtH*Ahnno_7 zoFmwdY63>M&`;<@OHa_mk9mUjcdFV>>(jX!#@>~m=` zDB6_EC(w6QBU`mWmB(nk;5}|&&oe`xbxeC$&NvZ&!8FQ-p)=7?&HzG*E%t6yU^Rwd zIn|KNcoTwqaB~zfQZaR416-UrojvNyaH8STY8AN0)pB*^Zl!03GSWT4ezl2pxF&0a z$Z3sjas&iF4bSU69_SKoJ!(@J$6hOulH= zAhAE95^rj0!kDHolRGU%$mq><KF}}olwV~E+NNq70q+~tP?c66jF)Q-DC&@(nVDt!Sk64 zuD}?8LGR6FU*JAf6)|=EeE{ldTw>-ufX{yz_CGnv|D%zOzV6%xb6EGmC+aL2!M|WTiwD^%^Z>< z=P=nB*sKzJi2D+!knc3f?nqH0a}E=_mG)h`l+0Xir1vQvi)X3QI_}8lsJJO<0E)xY z9n(A;VTTNp(pd`g3_EGCH%yWGv0Y`5$8<6vAvcge@48#Bn>!n480CoxP?rSv<1jv_ zG{qg^lV{ND*Mt#>&6IO-9cdUm#o<&FS)GD4-Cw+I+lYrBe)bNc8HIGr^s%)<_yqYx%*2 znFE)l0uuH{*PcA==aeodFFt9Lwl0K*C^wVHKvq?_e>EJW@azMb-IH}pG@RfXp0{FT zctG3nQGzP-eXpoSuQTN;?~Cd!HD(qS8E`YC!mQef^D<77?b;%)g)gLFpXQY~2u@{> zQY@eB-5pBsP+yJuEk{HRPb|gLq+=AO`eJ~5RZ_MZ{~8817C6pHe4Rhx2fPkGt|N_o z$~!gSp<Y{QZh#q$epW{ECk=s4qvkmNYUWNtiSsn$YWKOPU z%7R^J57h$4FkS^XH@Bv>I33cFunGi@@JFbBq;5Hk4J3hp&5GaxjLp_^O)}u z(%b=yZ@;s?yhF=EnSDn^@5`A7@m$Ln!(MUxS=#XzDki~}Y~;(0k*bW2{FxR73%$G* zTZ^Zc(F;Xh2O{xopBF*~3VI$*s0SrKKye44m7huq8i-=IjpBgF2`GG_rl~QZE3{dh zl||*|#eKWW-1kyVPAdMOj91w_hPv!ZNd?kDihr>32qI_AQ$E@TZ*9ZAbM%GrwUdEn zT=v!HH4Vp!s(+5Y;ntIJlqJwI!l}A4VJd2Z1vin`!VDaL9iY9 zilI&hZ(Nd5S+j$#P@(D+r){qg5F;{~sk9`otYTHvenZ{IGtZmHj23ggqoupz6sP29$}DL+JG-f; z#}m_toZpv`Seii34G9g>LY~!o03N?KwNVONH!WF3?(2(n&}yKtoWoT&m^!~m!kY+6 zuB~;pf=-@XXUF$+}8t{}V?2Y1CPe;uL#G|L*p>o@YPig}d40Kjv#%7v|e z@z4J;orotPh8`LDSNXK~Ug%ri1@lhM_dldRfl zYygix$y4a@(J!Lrm(PwnBkrwqg#2jo5G+H=HR} z&`&EP99mZ}0FoeKxM>Rq8=+r+)?N%KO5$jUF7r9trN)HP4bgWn;h)iAufy{y z3k<-?AfGh2JT|oKja=|x+Xvd=!-gi^grK~+4-Rjt_IDH1G-El~OaWrW$U}EC*X!hNY?snajjOhs$n<@3z;&ynvt5+qmH>v|PE4hn@mwZO(1B0&ljs zZ0B@YB;&LsS(Hk1JiVL7THb_>(}`4i&EE~M!g~w=kOTe!-2YK1#MVHs-{8Y4bIyMf z^}m|ke-l4B+`aGHH?l8s{!&C9G}>Ms_}M&)qC`(BRo+jie&TxKyW z{3L%)`AT!H_m!#_>c}*`6j;^#t>I+APR=<=^Q{aceaPz{b@0Rdv&q*F((TYU#>V$J z;_}a}y2G+EpPjY@Jbx&;3a^Qw0o)kvBvp(RS9~Jf2iak=d-Xx>UK3Te_I8$(J%PPY zKRN7sXgf+!(A5;;f-Xj7*I6|F^g`?5I!>Kdg(7e zZEA*V<=s=>02J>V+&w4-O)goXVLIY|f6Jn=pwQ#iyf#&`gsvGs?lzIAizSUe3rn{6 zQWA42p)Z4VFcFul+1gI^reVuJFFbrJw>YPN?bpikGxrMa0g#Gvz&%~fh^%b}1=wLo zs-o68)OT4xpLv}Y$o`x>N{dt%{Pnl83fdp!v!XtbY@TPc%F9uA%IuPP_Qb}9HE5cB zlMDD;OnTL(m%@sKUP_#K%E;ICJ!^F$ELn+5=L;4sl{q8#U zoplKHBz37a7Je!HqAo{f5oP?b!=SBUM;S^Alo#H7=xPmpkP#f$X<5OUZR}0*9sGA zCBS8v(T|gE^(2a^&PzI#5(7~E;aEKI*1ms!ldo10S428w(@hM_fCj0)bTjyC8`xZC zPy6qXoGPT4|g(;k1O z(`Rw#=A7(PSotiE$IiWKVHcBR-;p1TCBps8X_74qnIWgYO;EfCzcn*GN(Tpx9CMbH z$=cmw%2IX01-YrrdwwzozD(VgnQ}TR97?dI+u>V33oqht<==fX%~`fJaT0jpH1m@s zNZWXBAk*`gpa=}w%`qR^0yGwFZvs?Nqe~bbYpW7MBrIAMz4MH0nL{xKYSY-fimDbv zY-vvQ8X_T|e7V`*It?(%E!(INMHkKR%-6_9T`B!ZSC&&Xo9Ew~G%BFzw)!2{U86{A zt*aoVCEGPpGnnAu2|i;H--3u19|5W!2VlW+y54ebE0Wva$|Dzw_(pjVyYmOnsc^LT z7u~Du#vUP8zSTr-PZvR6;zcZEhwziDOp+!gi~4Xl#%H%R`Q+F8{oW#7K@ zO&dAtTTKGfJ9+3?=3f435ec-o9hU}88H&hXCKwiSZb#+GgH^n!!w#?*4UqBAdx6uv z2_@WUyOP#gROb&S#f)89efw@si}{_1xS+EaMYXa{Y&Bkq3=JL?4Ihn#qFn2Udxk~>A{|rZh@r*kD9s1U}Db%!`flc&BQ6Jtio(6lCTo)qWRQJ5>eiI z&sUBfj#^X7+-Y_c$OjM;wwx1bJYfHdyr`#t3n8a-mn!+?xoUN@_v$yFMV`$H-T?J} zX?@?y+>hNGv@M{L+z%P7>io}|p|s&2JV>)B2cl&#NuS6MSZg90FS4DV*~;hnm2dI& zz%I@A8`+b`f@l$pZCgRM?Y-;M51KK&8L!&YR3YA34Di>8>$(srMLmfu23GayWe$*< zjN5S}7B=8j2npq_n1d6Z?WE@{5_Uz&;=XKzW_V}B++O*k z-k$9VFe@@AqpNyipN+oO6Z$Q@cR%q z?~9Y%m8+dTXfn4%fhl%J|Loe5W;e!6^~87kUmDG0+V1a=9F2V&nwP0^DT0vXeY}$D*+_;;Vs&f^{-tbH)CP9}$t=4wSS~=H| zN*~IHyFH|=DJ|IF@@p3;l44je!T$93tL~8@;!g9^`Hp;Lf;~gMgs}%SH2H?6XA{DK zD!S>a2QG!)uDZX~Own%)pYYsZdYr29bGOY5p^~hq*RYeE1GEb)($6urtf~O+3YhB5 z{5I?=)Z+7It#f;+@t3D*#Zeuo-(nLLCozJIS@TGxGVuDairkawUQO3EWfjCye<}(t8t(c;aKJ;)+@8HElaJSg9K}sb#5S z`?f%rro#?rm_ih-6fYpLW@pJt3h41Vqa$8CWJxR6f93r#F)|RRzev+UoK@4=I}5V& z8Aq)87cu3$+OoTqRqbA`6Nc5J?(!Me)wTdj%~h127R~O|Jf3(aY{O ztUNcPbhTU#pYK>eB@-)uAS{iQ%PZ2yI|L74;q*VKyZ=k$s`s64bg^q{_PlgvDW?8= zv2Nm-RAKkn73aMf+5Ohr7WyX0--;T8Cb-dgSJm$RY^@zlu|ai;!S0+yrFl^<0#=f{ ziNQ^yt9ZOtlo3#Bn|`ug8|)-=mqeH?6H_WnYg@jxoE|?G5q{%NB`j!9FU(~efP!*? zh=or#m?0iI&l^FD>!D)K@(I?Nsnm_^xZ2>o^>#Gu}To6X&-QX|3N5Nyi+d#>qQd(8v<_^D+c5{Ex6JYT%sk0$|xNhV4v z^V+q2(bL>tCWfaAYX@s=Hk%mSHWdts^`xbr*BkfuyttUPq@sF*%t^eQPDVWN8Sh}J zW7Dn4XR>%zOI&4iBlHo{980Rl_lROgNx$!^&6!kLxBcpSY&PWHD3K;Yp2KJKH3ojStYFDP5S;s!&ms z)&>LDN@1y~Ht0Es8nIyY7Bs#%TQ4{%d1 z&fr$2QWEbclQmD}g7ypA@Lx{^WU0^8o6m`<(RijRi5yxAURDt}PMryD4u|ZgKcXP_ zz*o|*8-CT+yFdN-dk#^ULJ^QRSiXZik{+&QnY#n!)y}r}Y(a1HgO`{zT}SmWE=FG; zQcb)^-1iwru<)m*RxErhoyyGS1zn9)IqyCY+_Xvli--q45F)4jYN9f>uV{PAn>A<{#%k`6 z2Hmg6+Kd;&+bt#HJ*yP+_Shv7qy|)p7{Culk@<|{dHGDh@YT*k*1A93h99Rz-(Cnd zculrjn$$v0gx<|jvj~ScoGr8g`P`XTZ7D8kQiC!OZoMxtd@L9_*5>`%K2DTC)xC}PK(dcOQiFj`n&?$X(Z zzX`r^fWKn}m@E>{JmuCz+|n*?*59JtmM?#o(VQb)gJmLrxBiPk#^#8D`q=`5qHAF4 zkLu^_Y1o((IB1ZlIKbN*v%ML4BBb=`M!s}Jz+A6%4=%eY^1Mz8U8j!>&;(x%l-1bu z+)mf_CD#mEg~X4H7Yl!Ch*-N*8n`egtp7sIe+vb7ji!GaSJUr0CVf49D1}CmfA4$y z|L7C3gfm@ldMtL&(}p>`+;FL!I&hKo?Kd1LS1B|@KVF}W6lfH7aQ$nK4--ROF$G9| zLI64b>+{C6ANGika*Beq7i#oJ`(uHxUI)!IBfW{0t4H_TeAPk>t0DS!3y@m^m#E#FOYokyrEr(VgMmjOhZxbPTo+PUN_Y{zIoJq4j~uWS##8X>;*q0PmOvx zDx*|NIUsRwk$5$WDT`jroK4v+>;rdin(U2(+NaOOLv?K2tz~Sdx&@3sr$~#q@Wt3n z@N6#|CO{L#X<45ic>3KeZ?|SwDmOy|p>EX)G`Abff@esU4N_5>q=KGK7Jhllz#Vmd z!f2N}|-5v9fksaq8~aBmMF$EGe;-j@)w`H5vB4(k-Kdu(|wYF*Hh&ZPjWkl%Z4d4z(NKW zKhB3OlQVx`E6GTeDtQ6K6itBaMu?^Es%yKnTyKhV#glBL;p1B-Pq#sOWLy@9hR4MQ zdMny}j@++l0x{wIJ3%}fzwCzPIa-*hg~rX0%Y)0~#;m=k*zKUFlD^CDoKYvBhZBDe_ zIQ2O?I}c~1oo6rQWknDSZ9>m(p@J0$jE22^{%67w5uQ7rKmGCRlomy)pl&U#K~DF# SARPeoM^;ivqU61i@Baefrddt^ literal 0 HcmV?d00001 diff --git a/doc/eclipse/2_Install_software.png b/doc/eclipse/2_Install_software.png new file mode 100644 index 0000000000000000000000000000000000000000..b7baadaa9ad3174fd6f1a6b7497bcaff68194828 GIT binary patch literal 63938 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 RwgkX+M@{E;;Z4h+{{T$yHrN0F literal 0 HcmV?d00001 diff --git a/doc/eclipse/eclipse.md b/doc/eclipse/eclipse.md new file mode 100644 index 000000000..a2b237887 --- /dev/null +++ b/doc/eclipse/eclipse.md @@ -0,0 +1,34 @@ +using Eclipse with Arduino ESP8266 +=========================================== + +### What to Download ### +- [arduino IDE](https://www.arduino.cc/en/Main/Software) +- [Eclipse IDE for C/C++ Developers](http://www.eclipse.org/downloads/packages/eclipse-ide-cc-developers/marsr) +- [Java](http://www.java.com/) + +### Setup Arduino ### + see the [Readme](https://github.com/esp8266/Arduino#installing-with-boards-manager) + +### Setup Eclipse ### +- [step 1](http://www.baeyens.it/eclipse/how_to.shtml#/c) +- [step 2](http://www.baeyens.it/eclipse/how_to.shtml#/e) +- go to Window --> preferences --> Arduino +- add as private hardware path the Part to the ESP8266 (example: C:\Users\username\AppData\Roaming\Arduino15\packages\esp8266\hardware\esp8266) + +### Eclipse wont build ### +if eclipse dont find the path to the Compiler add to the platform.txt +after: +``` +version=1.6.4 +``` +this: +``` +runtime.tools.xtensa-lx106-elf-gcc.path={runtime.platform.path}/../../../tools/xtensa-lx106-elf-gcc/1.20.0-26-gb404fb9 +runtime.tools.esptool.path={runtime.platform.path}/../../../tools/esptool/0.4.4 +``` +Note: + - the path may changed, check the current version. + - each update over the Arduino IDE will remove the fix + - may not needed in future if Eclipse Plugin get an Update + + \ No newline at end of file From bcd0c9c91bc1e36bbe0e28859700cc9e39346026 Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Fri, 26 Jun 2015 18:57:43 +0200 Subject: [PATCH 22/32] add linux example path --- doc/eclipse/eclipse.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/doc/eclipse/eclipse.md b/doc/eclipse/eclipse.md index a2b237887..9da8ffaa6 100644 --- a/doc/eclipse/eclipse.md +++ b/doc/eclipse/eclipse.md @@ -13,7 +13,10 @@ using Eclipse with Arduino ESP8266 - [step 1](http://www.baeyens.it/eclipse/how_to.shtml#/c) - [step 2](http://www.baeyens.it/eclipse/how_to.shtml#/e) - go to Window --> preferences --> Arduino -- add as private hardware path the Part to the ESP8266 (example: C:\Users\username\AppData\Roaming\Arduino15\packages\esp8266\hardware\esp8266) +- add as private hardware path the Part to the ESP8266 + example: + Windows: C:\Users\username\AppData\Roaming\Arduino15\packages\esp8266\hardware\esp8266 + Linux: /home/[user name]/.arduino15/packages/esp8266/hardware ### Eclipse wont build ### if eclipse dont find the path to the Compiler add to the platform.txt From 98815fe69ab440052b16c47bace0b62759744c79 Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Fri, 26 Jun 2015 18:59:02 +0200 Subject: [PATCH 23/32] style --- doc/eclipse/eclipse.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/doc/eclipse/eclipse.md b/doc/eclipse/eclipse.md index 9da8ffaa6..348d1cf19 100644 --- a/doc/eclipse/eclipse.md +++ b/doc/eclipse/eclipse.md @@ -14,9 +14,10 @@ using Eclipse with Arduino ESP8266 - [step 2](http://www.baeyens.it/eclipse/how_to.shtml#/e) - go to Window --> preferences --> Arduino - add as private hardware path the Part to the ESP8266 - example: - Windows: C:\Users\username\AppData\Roaming\Arduino15\packages\esp8266\hardware\esp8266 - Linux: /home/[user name]/.arduino15/packages/esp8266/hardware + +###### example private hardware path + Windows: C:\Users\[username]\AppData\Roaming\Arduino15\packages\esp8266\hardware + Linux: /home/[username]/.arduino15/packages/esp8266/hardware ### Eclipse wont build ### if eclipse dont find the path to the Compiler add to the platform.txt From 28a5a4c97e528b95583abd3b619f17f8c93a35c8 Mon Sep 17 00:00:00 2001 From: Makuna Date: Thu, 11 Jun 2015 13:37:13 -0700 Subject: [PATCH 24/32] correct sync use rsil doesn't require a sync, isync needed for processor state register esync needed to get special register --- cores/esp8266/Arduino.h | 6 +++--- cores/esp8266/Esp.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cores/esp8266/Arduino.h b/cores/esp8266/Arduino.h index 89bf32685..7d34df5a5 100644 --- a/cores/esp8266/Arduino.h +++ b/cores/esp8266/Arduino.h @@ -143,13 +143,13 @@ void ets_intr_unlock(); // level 15 will disable ALL interrupts, // level 0 will disable most software interrupts // -#define xt_disable_interrupts(state, level) __asm__ __volatile__("rsil %0," __STRINGIFY(level) "; esync; isync; dsync" : "=a" (state)) -#define xt_enable_interrupts(state) __asm__ __volatile__("wsr %0,ps; esync" :: "a" (state) : "memory") +#define xt_disable_interrupts(state, level) __asm__ __volatile__("rsil %0," __STRINGIFY(level) : "=a" (state)) +#define xt_enable_interrupts(state) __asm__ __volatile__("wsr %0,ps; isync" :: "a" (state) : "memory") extern uint32_t interruptsState; #define interrupts() xt_enable_interrupts(interruptsState) -#define noInterrupts() __asm__ __volatile__("rsil %0,15; esync; isync; dsync" : "=a" (interruptsState)) +#define noInterrupts() __asm__ __volatile__("rsil %0,15" : "=a" (interruptsState)) #define clockCyclesPerMicrosecond() ( F_CPU / 1000000L ) #define clockCyclesToMicroseconds(a) ( (a) / clockCyclesPerMicrosecond() ) diff --git a/cores/esp8266/Esp.h b/cores/esp8266/Esp.h index df41be399..80555d591 100644 --- a/cores/esp8266/Esp.h +++ b/cores/esp8266/Esp.h @@ -129,7 +129,7 @@ class EspClass { uint32_t EspClass::getCycleCount() { uint32_t ccount; - __asm__ __volatile__("rsr %0,ccount":"=a" (ccount)); + __asm__ __volatile__("esync; rsr %0,ccount":"=a" (ccount)); return ccount; } From bcdb580d7aa8e11a039a55c61d7df5ef36d19dd2 Mon Sep 17 00:00:00 2001 From: Kristijan Novoselic Date: Fri, 19 Jun 2015 19:59:54 +0200 Subject: [PATCH 25/32] Added simple HTTP server to DNSServer example --- .../DNSServer/examples/DNSServer/DNSServer.ino | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/libraries/DNSServer/examples/DNSServer/DNSServer.ino b/libraries/DNSServer/examples/DNSServer/DNSServer.ino index 15951d629..a7fdbb1f9 100644 --- a/libraries/DNSServer/examples/DNSServer/DNSServer.ino +++ b/libraries/DNSServer/examples/DNSServer/DNSServer.ino @@ -1,9 +1,11 @@ #include #include +#include const byte DNS_PORT = 53; IPAddress apIP(192, 168, 1, 1); DNSServer dnsServer; +ESP8266WebServer webServer(80); void setup() { WiFi.mode(WIFI_AP); @@ -21,8 +23,19 @@ void setup() { //start DNS server for a specific domain name dnsServer.start(DNS_PORT, "www.example.com", apIP); + + //simple HTTP server to see that DNS server is working + webServer.onNotFound([]() { + String message = "Hello World!\n\n"; + message += "URI: "; + message += webServer.uri(); + + webServer.send(200, "text/plain", message); + }); + webServer.begin(); } void loop() { dnsServer.processNextRequest(); + webServer.handleClient(); } From 3bbe9b56c64abffdd8098cf805eebceab095894f Mon Sep 17 00:00:00 2001 From: Kristijan Novoselic Date: Fri, 19 Jun 2015 20:21:19 +0200 Subject: [PATCH 26/32] Added captive portal functionality --- .../examples/CaptivePortal/CaptivePortal.ino | 34 +++++++++++++++++++ .../examples/DNSServer/DNSServer.ino | 4 +-- libraries/DNSServer/library.properties | 2 +- libraries/DNSServer/src/DNSServer.cpp | 3 +- libraries/DNSServer/src/DNSServer.h | 3 +- 5 files changed, 40 insertions(+), 6 deletions(-) create mode 100644 libraries/DNSServer/examples/CaptivePortal/CaptivePortal.ino diff --git a/libraries/DNSServer/examples/CaptivePortal/CaptivePortal.ino b/libraries/DNSServer/examples/CaptivePortal/CaptivePortal.ino new file mode 100644 index 000000000..eb2278220 --- /dev/null +++ b/libraries/DNSServer/examples/CaptivePortal/CaptivePortal.ino @@ -0,0 +1,34 @@ +#include +#include +#include + +const byte DNS_PORT = 53; +IPAddress apIP(192, 168, 1, 1); +DNSServer dnsServer; +ESP8266WebServer webServer(80); + +String responseHTML = "" + "CaptivePortal" + "

    Hello World!

    This is a captive portal example. All requests will " + "be redirected here.

    "; + +void setup() { + WiFi.mode(WIFI_AP); + WiFi.softAPConfig(apIP, apIP, IPAddress(255, 255, 255, 0)); + WiFi.softAP("DNSServer CaptivePortal example"); + + // if DNSServer is started with "*" for domain name, it will reply with + // provided IP to all DNS request + dnsServer.start(DNS_PORT, "*", apIP); + + // replay to all requests with same HTML + webServer.onNotFound([]() { + webServer.send(200, "text/html", responseHTML); + }); + webServer.begin(); +} + +void loop() { + dnsServer.processNextRequest(); + webServer.handleClient(); +} diff --git a/libraries/DNSServer/examples/DNSServer/DNSServer.ino b/libraries/DNSServer/examples/DNSServer/DNSServer.ino index a7fdbb1f9..2916d5ab3 100644 --- a/libraries/DNSServer/examples/DNSServer/DNSServer.ino +++ b/libraries/DNSServer/examples/DNSServer/DNSServer.ino @@ -21,10 +21,10 @@ void setup() { // default is DNSReplyCode::NonExistentDomain dnsServer.setErrorReplyCode(DNSReplyCode::ServerFailure); - //start DNS server for a specific domain name + // start DNS server for a specific domain name dnsServer.start(DNS_PORT, "www.example.com", apIP); - //simple HTTP server to see that DNS server is working + // simple HTTP server to see that DNS server is working webServer.onNotFound([]() { String message = "Hello World!\n\n"; message += "URI: "; diff --git a/libraries/DNSServer/library.properties b/libraries/DNSServer/library.properties index b9fc670dd..71f0ae544 100644 --- a/libraries/DNSServer/library.properties +++ b/libraries/DNSServer/library.properties @@ -1,5 +1,5 @@ name=DNSServer -version=1.0.0 +version=1.1.0 author=Kristijan Novoselić maintainer=Kristijan Novoselić, sentence=A simple DNS server for ESP8266. diff --git a/libraries/DNSServer/src/DNSServer.cpp b/libraries/DNSServer/src/DNSServer.cpp index 5af48a3ce..10fc81d4a 100644 --- a/libraries/DNSServer/src/DNSServer.cpp +++ b/libraries/DNSServer/src/DNSServer.cpp @@ -54,7 +54,8 @@ void DNSServer::processNextRequest() if (_dnsHeader->QR == DNS_QR_QUERY && _dnsHeader->OPCode == DNS_OPCODE_QUERY && requestIncludesOnlyOneQuestion() && - getDomainNameWithoutWwwPrefix() == _domainName) + (_domainName == "*" || getDomainNameWithoutWwwPrefix() == _domainName) + ) { replyWithIP(); } diff --git a/libraries/DNSServer/src/DNSServer.h b/libraries/DNSServer/src/DNSServer.h index df489402a..d58efbbdd 100644 --- a/libraries/DNSServer/src/DNSServer.h +++ b/libraries/DNSServer/src/DNSServer.h @@ -27,7 +27,7 @@ struct DNSHeader unsigned char AA : 1; // authoritive answer unsigned char OPCode : 4; // message_type unsigned char QR : 1; // query/response flag - unsigned char RCode : 4; // response code + unsigned char RCode : 4; // response code unsigned char Z : 3; // its z! reserved unsigned char RA : 1; // recursion available uint16_t QDCount; // number of question entries @@ -62,7 +62,6 @@ class DNSServer uint32_t _ttl; DNSReplyCode _errorReplyCode; - void downcaseAndRemoveWwwPrefix(String &domainName); String getDomainNameWithoutWwwPrefix(); bool requestIncludesOnlyOneQuestion(); From bdb5e0c0d9ee53b4b352419eb2e692ba01515cf8 Mon Sep 17 00:00:00 2001 From: reaper7 Date: Fri, 19 Jun 2015 23:35:31 +0200 Subject: [PATCH 27/32] missing part of class name WiFiMesh -> ESP8266WiFiMesh --- libraries/ESP8266WiFiMesh/src/ESP8266WiFiMesh.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/ESP8266WiFiMesh/src/ESP8266WiFiMesh.cpp b/libraries/ESP8266WiFiMesh/src/ESP8266WiFiMesh.cpp index 97ec0954b..6d3e544d7 100644 --- a/libraries/ESP8266WiFiMesh/src/ESP8266WiFiMesh.cpp +++ b/libraries/ESP8266WiFiMesh/src/ESP8266WiFiMesh.cpp @@ -98,7 +98,7 @@ bool ESP8266WiFiMesh::exchangeInfo(String message, WiFiClient curr_client) * @message The string to send to the node. * */ -void WiFiMesh::connectToNode(String target_ssid, String message) +void ESP8266WiFiMesh::connectToNode(String target_ssid, String message) { WiFiClient curr_client; WiFi.begin( target_ssid.c_str() ); @@ -165,4 +165,4 @@ void ESP8266WiFiMesh::acceptRequest() if (_client.connected()) _client.println(response); } -} \ No newline at end of file +} From 0e29e7e048020d73589f8beb0046f092f96faa09 Mon Sep 17 00:00:00 2001 From: probonopd Date: Sun, 21 Jun 2015 17:15:12 +0200 Subject: [PATCH 28/32] ESP8266 Blink example for the blue LED on the ESP-01 module --- libraries/esp8266/examples/Blink/Blink.ino | 25 ++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 libraries/esp8266/examples/Blink/Blink.ino diff --git a/libraries/esp8266/examples/Blink/Blink.ino b/libraries/esp8266/examples/Blink/Blink.ino new file mode 100644 index 000000000..ffba83249 --- /dev/null +++ b/libraries/esp8266/examples/Blink/Blink.ino @@ -0,0 +1,25 @@ +/* + ESP8266 Blink by Simon Peter + Blink the blue LED on the ESP-01 module + This example code is in the public domain +*/ + +const int ledPin = 1; // The blue LED on the ESP-01 module is connected to GPIO1 + // (which is also the TXD pin; so we cannot use + // Serial.print() at the same time + +void setup() { + pinMode(ledPin, OUTPUT); // Initialize the ledPin as an output + ESP.wdtDisable(); // Disable the watchdog timer built into the ESP8266 + // otherwise the ESP8266 reboots during the "delay(1000);" +} + +// the loop function runs over and over again forever +void loop() { + digitalWrite(ledPin, LOW); // turn the LED on (Note that LOW is the voltage level + // but actually the LED is on; this is because + // it is acive low on the ESP-01) + delay(1000); // Wait for a second + digitalWrite(ledPin, HIGH); // Turn the LED off by making the voltage HIGH + delay(2000); // Wait for two seconds (to demonstrate the active low LED) +} From 7553b67dd750b0c9019f0f50e4cff6746e6b644f Mon Sep 17 00:00:00 2001 From: probonopd Date: Sun, 21 Jun 2015 17:17:16 +0200 Subject: [PATCH 29/32] ESP8266 BlinkWithoutDelay --- .../BlinkWithoutDelay/BlinkWithoutDelay.ino | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 libraries/esp8266/examples/BlinkWithoutDelay/BlinkWithoutDelay.ino diff --git a/libraries/esp8266/examples/BlinkWithoutDelay/BlinkWithoutDelay.ino b/libraries/esp8266/examples/BlinkWithoutDelay/BlinkWithoutDelay.ino new file mode 100644 index 000000000..138e70714 --- /dev/null +++ b/libraries/esp8266/examples/BlinkWithoutDelay/BlinkWithoutDelay.ino @@ -0,0 +1,33 @@ +/* + ESP8266 BlinkWithoutDelay by Simon Peter + Blink the blue LED on the ESP-01 module + Based on the Arduino Blink without Delay example + This example code is in the public domain +*/ + +const int ledPin = 1; // The blue LED on the ESP-01 module is connected to GPIO1 + // (which is also the TXD pin; so we cannot use + // Serial.print() at the same time + +int ledState = LOW; + +unsigned long previousMillis = 0; +const long interval = 1000; + +void setup() { + pinMode(ledPin, OUTPUT); +} + +void loop() +{ + unsigned long currentMillis = millis(); + if(currentMillis - previousMillis >= interval) { + previousMillis = currentMillis; + if (ledState == LOW) + ledState = HIGH; // Note that this switches the LED *off* + else + ledState = LOW; // Note that this switches the LED *on* + digitalWrite(ledPin, ledState); + } +} + From 3e87bb3ce21634f15d5e918eea31a30dd53b9803 Mon Sep 17 00:00:00 2001 From: probonopd Date: Sun, 21 Jun 2015 17:51:03 +0200 Subject: [PATCH 30/32] No need to disable the watchdog --- libraries/esp8266/examples/Blink/Blink.ino | 2 -- 1 file changed, 2 deletions(-) diff --git a/libraries/esp8266/examples/Blink/Blink.ino b/libraries/esp8266/examples/Blink/Blink.ino index ffba83249..f80bb6ccd 100644 --- a/libraries/esp8266/examples/Blink/Blink.ino +++ b/libraries/esp8266/examples/Blink/Blink.ino @@ -10,8 +10,6 @@ const int ledPin = 1; // The blue LED on the ESP-01 module is connected void setup() { pinMode(ledPin, OUTPUT); // Initialize the ledPin as an output - ESP.wdtDisable(); // Disable the watchdog timer built into the ESP8266 - // otherwise the ESP8266 reboots during the "delay(1000);" } // the loop function runs over and over again forever From 2969b0b7a3c2ca2f27b736e6b1a62e0a333f56f8 Mon Sep 17 00:00:00 2001 From: probonopd Date: Sun, 21 Jun 2015 21:25:53 +0200 Subject: [PATCH 31/32] Use BUILTIN_LED --- libraries/esp8266/examples/Blink/Blink.ino | 23 +++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/libraries/esp8266/examples/Blink/Blink.ino b/libraries/esp8266/examples/Blink/Blink.ino index f80bb6ccd..578f36886 100644 --- a/libraries/esp8266/examples/Blink/Blink.ino +++ b/libraries/esp8266/examples/Blink/Blink.ino @@ -2,22 +2,23 @@ ESP8266 Blink by Simon Peter Blink the blue LED on the ESP-01 module This example code is in the public domain + + The blue LED on the ESP-01 module is connected to GPIO1 + (which is also the TXD pin; so we cannot use Serial.print() at the same time) + + Note that this sketch uses BUILTIN_LED to find the pin with the internal LED */ -const int ledPin = 1; // The blue LED on the ESP-01 module is connected to GPIO1 - // (which is also the TXD pin; so we cannot use - // Serial.print() at the same time - void setup() { - pinMode(ledPin, OUTPUT); // Initialize the ledPin as an output + pinMode(BUILTIN_LED, OUTPUT); // Initialize the BUILTIN_LED pin as an output } // the loop function runs over and over again forever void loop() { - digitalWrite(ledPin, LOW); // turn the LED on (Note that LOW is the voltage level - // but actually the LED is on; this is because - // it is acive low on the ESP-01) - delay(1000); // Wait for a second - digitalWrite(ledPin, HIGH); // Turn the LED off by making the voltage HIGH - delay(2000); // Wait for two seconds (to demonstrate the active low LED) + digitalWrite(BUILTIN_LED, LOW); // Turn the LED on (Note that LOW is the voltage level + // but actually the LED is on; this is because + // it is acive low on the ESP-01) + delay(1000); // Wait for a second + digitalWrite(BUILTIN_LED, HIGH); // Turn the LED off by making the voltage HIGH + delay(2000); // Wait for two seconds (to demonstrate the active low LED) } From 496fee1a15e083041347cfa8bc936da2f68d755e Mon Sep 17 00:00:00 2001 From: probonopd Date: Sun, 21 Jun 2015 21:27:27 +0200 Subject: [PATCH 32/32] Use BUILTIN_LED --- .../BlinkWithoutDelay/BlinkWithoutDelay.ino | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/libraries/esp8266/examples/BlinkWithoutDelay/BlinkWithoutDelay.ino b/libraries/esp8266/examples/BlinkWithoutDelay/BlinkWithoutDelay.ino index 138e70714..740211d6d 100644 --- a/libraries/esp8266/examples/BlinkWithoutDelay/BlinkWithoutDelay.ino +++ b/libraries/esp8266/examples/BlinkWithoutDelay/BlinkWithoutDelay.ino @@ -3,19 +3,20 @@ Blink the blue LED on the ESP-01 module Based on the Arduino Blink without Delay example This example code is in the public domain + + The blue LED on the ESP-01 module is connected to GPIO1 + (which is also the TXD pin; so we cannot use Serial.print() at the same time) + + Note that this sketch uses BUILTIN_LED to find the pin with the internal LED */ -const int ledPin = 1; // The blue LED on the ESP-01 module is connected to GPIO1 - // (which is also the TXD pin; so we cannot use - // Serial.print() at the same time - int ledState = LOW; unsigned long previousMillis = 0; const long interval = 1000; void setup() { - pinMode(ledPin, OUTPUT); + pinMode(BUILTIN_LED, OUTPUT); } void loop() @@ -27,7 +28,6 @@ void loop() ledState = HIGH; // Note that this switches the LED *off* else ledState = LOW; // Note that this switches the LED *on* - digitalWrite(ledPin, ledState); + digitalWrite(BUILTIN_LED, ledState); } } -