mbed-os/source/NWK_INTERFACE/protocol_core_sleep.c

122 lines
3.4 KiB
C

/*
* Copyright (c) 2015-2017, Arm Limited and affiliates.
* SPDX-License-Identifier: Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
* \file protocol_core_sleep.c
* \brief Add short description about this file!!!
*
*/
#include "nsconfig.h"
#include "string.h"
#include "ns_types.h"
#include "ns_trace.h"
#include "eventOS_callback_timer.h"
#include "NWK_INTERFACE/Include/protocol.h"
#include "NWK_INTERFACE/Include/protocol_timer.h"
#include "common_functions.h"
#include "platform/arm_hal_interrupt.h"
#include "6LoWPAN/ND/nd_router_object.h"
#include "6LoWPAN/Thread/thread_common.h"
#include "6LoWPAN/MAC/mac_data_poll.h"
#include "sw_mac.h"
#define TRACE_GROUP "pCor"
static void protocol_timer_balance(uint32_t time_in_ms)
{
protocol_timer_sleep_balance(time_in_ms);
}
static int protocol_stack_interface_disable_poll(protocol_interface_info_entry_t *cur)
{
int ret_val = -1;
platform_enter_critical();
if (cur->if_stack_buffer_handler && cur->rfd_poll_info) {
if (!cur->rfd_poll_info->pollActive) {
ret_val = 0;
}
}
platform_exit_critical();
return ret_val;
}
uint32_t arm_net_check_enter_deep_sleep_possibility(void)
{
protocol_interface_info_entry_t *cur = protocol_stack_interface_sleep_possibility();
if (!cur) {
return 0;
}
//Calculate sleeping time
uint32_t current_sleep_time = mac_data_poll_get_max_sleep_period(cur);
if (current_sleep_time) {
uint32_t alternative_sleep = 0;
//core_poll_timer_disable();
current_sleep_time *= 10;
//Check ND time
alternative_sleep = nd_object_time_to_next_nd_reg();
if (alternative_sleep) {
if (alternative_sleep < current_sleep_time) {
current_sleep_time = alternative_sleep;
}
}
return current_sleep_time;
}
return 0;
}
int arm_net_enter_sleep(void)
{
int ret_val = -1;
protocol_interface_info_entry_t *cur = 0;
cur = protocol_stack_interface_sleep_possibility();
if (cur) {
if (protocol_stack_interface_disable_poll(cur) == 0) {
platform_enter_critical();
clear_power_state(SLEEP_MODE_REQ);
platform_exit_critical();
ret_val = 0;
}
}
return ret_val;
}
int arm_net_wakeup_and_timer_synch(uint32_t sleeped_time_in_ms)
{
int ret_val = -1;
protocol_interface_info_entry_t *cur = 0;
cur = protocol_stack_interface_sleep_possibility();
if (cur) {
if (cur->lowpan_info & INTERFACE_NWK_ACTIVE) {
//Update MS to 10ms ticks
//uint32_t sleep_time_in_10ms = (sleeped_time_in_ms + 9) / 10 ;
//Enable Data Polling after sleep
//protocol_stack_interface_info_wake_for_polling_interfaces(sleep_time_in_10ms, cur);
protocol_timer_balance(sleeped_time_in_ms);
}
}
return ret_val;
}