Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

weak hook preinit() #2111 #2133 #2136 #5395

Merged
merged 25 commits into from
Dec 4, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
671bbac
weak hook early_setup() #2111 #2133 #2136
d-a-v Nov 30, 2018
53a2d97
Merge branch 'master' into earlysetup
d-a-v Nov 30, 2018
bf76433
rename to early_init (more "c" vs early_setup which is more "c++ardui…
d-a-v Nov 30, 2018
d296d7b
example
d-a-v Nov 30, 2018
dbf6045
improve earlyWiFi example, slightly change AddrList interface, move W…
d-a-v Nov 30, 2018
acdbe07
fix CI
d-a-v Nov 30, 2018
23b7ace
fix local CI runner
d-a-v Nov 30, 2018
b75c40d
Merge branch 'master' into earlysetup
devyte Dec 2, 2018
9c043f6
fix local CI runner
d-a-v Dec 3, 2018
3393ecc
Merge branch 'master' into earlysetup
d-a-v Dec 3, 2018
e8e0b5c
rename early_init() to preinit()
d-a-v Dec 3, 2018
e014a19
Merge branch 'earlysetup' of github.com:d-a-v/Arduino into earlysetup
d-a-v Dec 3, 2018
5aa7ee6
Merge branch 'master' into earlysetup
d-a-v Dec 3, 2018
f887ce8
+ static ESP8266WiFiClass::preinit_wifi_off()
d-a-v Dec 3, 2018
6c09fbd
update early disable wifi example
d-a-v Dec 3, 2018
a636a80
example update
d-a-v Dec 3, 2018
5d770aa
IPv6 example update
d-a-v Dec 3, 2018
6d9072d
Merge branch 'master' into earlysetup
d-a-v Dec 3, 2018
c0043c2
Update ESP8266WiFiGeneric.h
devyte Dec 4, 2018
8b687b0
Update ESP8266WiFiGeneric.cpp
devyte Dec 4, 2018
85d244d
Update EarlyDisableWiFi.ino
devyte Dec 4, 2018
bef67d7
Update core_esp8266_main.cpp
devyte Dec 4, 2018
eb9f9c2
Update core_esp8266_main.cpp
devyte Dec 4, 2018
1925b0c
Update EarlyDisableWiFi.ino
devyte Dec 4, 2018
5f26799
Merge branch 'master' into earlysetup
devyte Dec 4, 2018
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions cores/esp8266/Arduino.h
Original file line number Diff line number Diff line change
Expand Up @@ -219,6 +219,7 @@ uint8_t shiftIn(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder);
void attachInterrupt(uint8_t pin, void (*)(void), int mode);
void detachInterrupt(uint8_t pin);

void preinit(void);
void setup(void);
void loop(void);

Expand Down
12 changes: 10 additions & 2 deletions cores/esp8266/core_esp8266_main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ static uint32_t s_micros_at_task_start;

extern "C" {
extern const uint32_t __attribute__((section(".ver_number"))) core_version = ARDUINO_ESP8266_GIT_VER;
const char* core_release =
const char* core_release =
#ifdef ARDUINO_ESP8266_RELEASE
ARDUINO_ESP8266_RELEASE;
#else
Expand Down Expand Up @@ -243,18 +243,26 @@ extern "C" void ICACHE_RAM_ATTR app_entry (void)
return app_entry_custom();
}

extern "C" void preinit (void) __attribute__((weak));
extern "C" void preinit (void)
{
/* do nothing by default */
}

extern "C" void user_init(void) {
struct rst_info *rtc_info_ptr = system_get_rst_info();
memcpy((void *) &resetInfo, (void *) rtc_info_ptr, sizeof(resetInfo));

uart_div_modify(0, UART_CLK_FREQ / (115200));

init();
init(); // in core_esp8266_wiring.c, inits hw regs and sdk timer

initVariant();

cont_init(g_pcont);

preinit(); // Prior to C++ Dynamic Init (not related to above init() ). Meant to be user redefinable.

ets_task(loop_task,
LOOP_TASK_PRIORITY, s_loop_queue,
LOOP_QUEUE_SIZE);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@

#include <ESP8266WiFi.h>

#ifndef STASSID
#define STASSID "your-ssid"
#define STAPSK "your-password"
#endif

// preinit() is called before system startup
// from nonos-sdk's user entry point user_init()

void preinit() {
// Global WiFi constructors are not called yet
// (global class instances like WiFi, Serial... are not yet initialized)..
// No global object methods or C++ exceptions can be called in here!
//The below is a static class method, which is similar to a function, so it's ok.
ESP8266WiFiClass::preinitWiFiOff();
}

void setup() {
Serial.begin(115200);
Serial.setDebugOutput(true);
Serial.println("sleeping 5s");

// during this period, a simple amp meter shows
// an average of 20mA with a Wemos D1 mini
// a DSO is needed to check #2111
delay(5000);

Serial.println("waking WiFi up, sleeping 5s");
WiFi.forceSleepWake();

// amp meter raises to 75mA
delay(5000);

Serial.println("connecting to AP " STASSID);
WiFi.mode(WIFI_STA);
WiFi.begin(STASSID, STAPSK);

for (bool configured = false; !configured;) {
for (auto addr : addrList)
if ((configured = !addr.isLocal() && addr.ifnumber() == STATION_IF)) {
Serial.printf("STA: IF='%s' hostname='%s' addr= %s\n",
addr.ifname().c_str(),
addr.ifhostname(),
addr.toString().c_str());
break;
}
Serial.print('.');
delay(500);
}

// amp meter cycles within 75-80 mA

}

void loop() {
}
23 changes: 22 additions & 1 deletion libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -579,4 +579,25 @@ void wifi_dns_found_callback(const char *name, CONST ip_addr_t *ipaddr, void *ca
esp_schedule(); // resume the hostByName function
}


//meant to be called from user-defined preinit()
void ESP8266WiFiGenericClass::preinitWiFiOff () {
// https://github.com/esp8266/Arduino/issues/2111#issuecomment-224251391
// WiFi.persistent(false);
// WiFi.mode(WIFI_OFF);
// WiFi.forceSleepBegin();

//WiFi.mode(WIFI_OFF) equivalent:
// datasheet:
// Set Wi-Fi working mode to Station mode, SoftAP
// or Station + SoftAP, and do not update flash
// (not persistent)
wifi_set_opmode_current(WIFI_OFF);

//WiFi.forceSleepBegin(/*default*/0) equivalent:
// sleep forever until wifi_fpm_do_wakeup() is called
wifi_fpm_set_sleep_type(MODEM_SLEEP_T);
wifi_fpm_open();
wifi_fpm_do_sleep(0xFFFFFFF);

// use WiFi.forceSleepWake() to wake WiFi up
}
2 changes: 2 additions & 0 deletions libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.h
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,8 @@ class ESP8266WiFiGenericClass {
bool forceSleepBegin(uint32 sleepUs = 0);
bool forceSleepWake();

static void preinitWiFiOff (); //meant to be called in user-defined preinit()

protected:
static bool _persistent;
static WiFiMode_t _forceSleepLastMode;
Expand Down