static void network_suspend() { // save the current state so it can be restored on wakeup wakeupState.wifi = !SPARK_WLAN_SLEEP; wakeupState.wifiConnected = wakeupState.cloud | network_ready(0, 0, NULL) | network_connecting(0, 0, NULL); #ifndef SPARK_NO_CLOUD wakeupState.cloud = spark_cloud_flag_auto_connect(); // disconnect the cloud now, and clear the auto connect status spark_cloud_socket_disconnect(); spark_cloud_flag_disconnect(); #endif network_off(0, 0, 0, NULL); }
static void network_suspend() { // save the current state so it can be restored on wakeup #ifndef SPARK_NO_CLOUD wakeupState.cloud = spark_cloud_flag_auto_connect(); #endif wakeupState.wifi = !SPARK_WLAN_SLEEP; wakeupState.wifiConnected = wakeupState.cloud || network_ready(0, 0, NULL) || network_connecting(0, 0, NULL); // Disconnect the cloud and the network network_disconnect(0, NETWORK_DISCONNECT_REASON_SLEEP, NULL); #ifndef SPARK_NO_CLOUD // Clear the auto connect status spark_cloud_flag_disconnect(); #endif network_off(0, 0, 0, NULL); }
int system_sleep_pin_impl(const uint16_t* pins, size_t pins_count, const InterruptMode* modes, size_t modes_count, long seconds, uint32_t param, void* reserved) { SYSTEM_THREAD_CONTEXT_SYNC(system_sleep_pin_impl(pins, pins_count, modes, modes_count, seconds, param, reserved)); // If we're connected to the cloud, make sure all // confirmable UDP messages are sent before sleeping if (spark_cloud_flag_connected()) { Spark_Sleep(); } bool network_sleep = network_sleep_flag(param); if (network_sleep) { network_suspend(); } #if HAL_PLATFORM_CELLULAR if (!network_sleep_flag(param)) { // Pause the modem Serial cellular_pause(nullptr); } #endif // HAL_PLATFORM_CELLULAR #if HAL_PLATFORM_MESH // FIXME: We are still going to turn off OpenThread with SLEEP_NETWORK_STANDBY, otherwise // there are various issues with sleep if (!network_sleep_flag(param)) { network_off(NETWORK_INTERFACE_MESH, 0, 0, nullptr); } #endif // HAL_PLATFORM_MESH led_set_update_enabled(0, nullptr); // Disable background LED updates LED_Off(LED_RGB); system_power_management_sleep(); int ret = HAL_Core_Enter_Stop_Mode_Ext(pins, pins_count, modes, modes_count, seconds, nullptr); led_set_update_enabled(1, nullptr); // Enable background LED updates #if HAL_PLATFORM_CELLULAR if (!network_sleep_flag(param)) { // Pause the modem Serial cellular_resume(nullptr); } #endif // HAL_PLATFORM_CELLULAR #if HAL_PLATFORM_MESH // FIXME: we need to bring Mesh interface back up because we've turned it off // despite SLEEP_NETWORK_STANDBY if (!network_sleep_flag(param)) { network_on(NETWORK_INTERFACE_MESH, 0, 0, nullptr); } #endif // HAL_PLATFORM_MESH if (network_sleep) { network_resume(); // asynchronously bring up the network/cloud } // if single-threaded, managed mode then reconnect to the cloud (for up to 60 seconds) auto mode = system_mode(); if (system_thread_get_state(nullptr)==spark::feature::DISABLED && (mode==AUTOMATIC || mode==SEMI_AUTOMATIC) && spark_cloud_flag_auto_connect()) { waitFor(spark_cloud_flag_connected, 60000); } if (spark_cloud_flag_connected()) { Spark_Wake(); } return ret; }
int system_sleep_pin_impl(uint16_t wakeUpPin, uint16_t edgeTriggerMode, long seconds, uint32_t param, void* reserved) { SYSTEM_THREAD_CONTEXT_SYNC(system_sleep_pin_impl(wakeUpPin, edgeTriggerMode, seconds, param, reserved)); // If we're connected to the cloud, make sure all // confirmable UDP messages are sent before sleeping if (spark_cloud_flag_connected()) { Spark_Sleep(); } bool network_sleep = network_sleep_flag(param); if (network_sleep) { network_suspend(); } LED_Off(LED_RGB); HAL_Core_Enter_Stop_Mode(wakeUpPin, edgeTriggerMode, seconds); if (network_sleep) { network_resume(); // asynchronously bring up the network/cloud } // if single-threaded, managed mode then reconnect to the cloud (for up to 60 seconds) auto mode = system_mode(); if (system_thread_get_state(nullptr)==spark::feature::DISABLED && (mode==AUTOMATIC || mode==SEMI_AUTOMATIC) && spark_cloud_flag_auto_connect()) { waitFor(spark_cloud_flag_connected, 60000); } if (spark_cloud_flag_connected()) { Spark_Wake(); } return 0; }