inwudriver-weibo/app/mrs/common/mrs_common_power_failure.c

204 lines
6.2 KiB
C
Raw Permalink Normal View History

/*
* Copyright (c) CompanyNameMagicTag 2019-2020. All rights reserved.
* Description: MRS COMMON POWER FAILURE handle.
*/
#include "mrs_common_power_failure.h"
#include "mrs_common_tools.h"
#include "mrs_sta_io.h"
#include "soc_mdm_mac.h"
#include "mrs_sta_power_failure.h"
#include "mrs_cco_power_failure.h"
/************************************************************
gloal variables
************************************************************/
mrs_power_failure_ctrl_st g_power_failure_info = { 0 };
#if defined(PRODUCT_CFG_PRODUCT_TYPE_STA)
EXT_EXTERN power_failure_ctrl_st g_pwf_ctrl;
#endif
td_void mrs_common_power_failure_init(td_void)
{
mrs_power_failure_ctrl_st *power_failure_info = mrs_get_power_failure_ctrl();
td_u16 len = POWER_FAILURE_BITMAP_LEN;
#if defined(PRODUCT_CFG_PRODUCT_TYPE_STA)
power_failure_ctrl_st *pwf_ctrl = TD_NULL;
#endif
power_failure_info->random_max_value = RANDOM_MAX_VALUE;
power_failure_info->random_min_value = RANDOM_MIN_VALUE;
power_failure_info->send_interval = SEND_INTERVAL;
power_failure_info->converge_time = CONVERGE_TIME;
power_failure_info->send_times = SEND_TIMES;
power_failure_info->power_failure_report_enable = POWER_FAILURE_REPORT_ENABLE;
#if defined(PRODUCT_CFG_PRODUCT_TYPE_STA)
uapi_set_power_failure_module_gpio_init(EXT_GPIO_IDX_0, 0, EXT_GPIO_DIRECTION_IN);
pwf_ctrl = &g_pwf_ctrl;
pwf_ctrl->pwf_switch = TD_TRUE;
pwf_ctrl->power_failure_recover_thd = PWF_FAILURE_RECOVER_THD;
#endif
power_failure_info->power_failure_bitmap = (td_u8 *)mrs_malloc(len);
if (power_failure_info->power_failure_bitmap != TD_NULL) {
memset_s(power_failure_info->power_failure_bitmap, len, 0, len);
} else {
return;
}
#if defined(PRODUCT_CFG_PRODUCT_TYPE_CCO)
power_failure_info->cco_diff_bitmap = (td_u8 *)mrs_malloc(len);
if (power_failure_info->cco_diff_bitmap != TD_NULL) {
memset_s(power_failure_info->cco_diff_bitmap, len, 0, len);
} else {
mrs_free(power_failure_info->power_failure_bitmap);
return;
}
power_failure_info->cco_last_send_bitmap = (td_u8 *)mrs_malloc(len);
if (power_failure_info->cco_last_send_bitmap != TD_NULL) {
memset_s(power_failure_info->cco_last_send_bitmap, len, 0, len);
} else {
mrs_free(power_failure_info->power_failure_bitmap);
mrs_free(power_failure_info->cco_diff_bitmap);
return;
}
#endif
}
mrs_power_failure_ctrl_st *mrs_get_power_failure_ctrl(td_void)
{
return &g_power_failure_info;
}
/* Obtain power outage data of other sites (update the bitmap). */
td_void mrs_power_failure_get_others_frame_data(const mrs_meter_event_info *evt_frm)
{
td_u16 *data_tei = TD_NULL;
td_u16 i;
td_u16 temp_tei;
mrs_power_failure_ctrl_st *power_failure_info = mrs_get_power_failure_ctrl();
td_u8 *refresh_bitmap = TD_NULL;
td_u8 rcv_tei[DATA_END_TEI_POSITION] = { 0 };
if (power_failure_info->power_failure_bitmap == TD_NULL) {
return;
}
refresh_bitmap = power_failure_info->power_failure_bitmap;
for (i = 0; i < DATA_END_TEI_POSITION; i++) {
rcv_tei[i] = evt_frm->data[i + 1];
}
data_tei = (td_u16 *)rcv_tei;
mrs_printf("[start_tei = %d]", *data_tei);
/* update the bitmap */
for (i = 0; i < (evt_frm->data_len - DATA_FIX_SIZE) * BIT_SIZE; i++) {
if (mrs_power_failure_bit_check(&evt_frm->data[DATA_FIX_SIZE], i) == TD_TRUE) {
temp_tei = (*data_tei) + i;
mrs_power_failure_bit_set(refresh_bitmap, temp_tei);
}
}
}
td_void mrs_power_failure_bit_set(td_u8 *map, td_u16 pos)
{
td_u16 byte_offset = pos / BIT_SIZE;
td_u16 bit_offset = pos % BIT_SIZE;
bit_set(map[byte_offset], bit_offset);
}
td_bool mrs_power_failure_bit_check(const td_u8 *map, td_u16 pos)
{
td_u16 byte_offset = pos / BIT_SIZE;
td_u16 bit_offset = pos % BIT_SIZE;
return (td_bool)(bit_get(map[byte_offset], bit_offset));
}
/* Calculate the minimum tei. */
td_u16 mrs_calc_min_tei(const td_u8 *bitmap)
{
td_u16 i;
td_u16 bitmap_min_tei = 0;
for (i = MIN_START_TEI; i < POWER_FAILURE_BITMAP_LEN * BIT_SIZE; i++) {
if (mrs_power_failure_bit_check(bitmap, i) == TD_TRUE) {
bitmap_min_tei = i;
break;
}
}
return bitmap_min_tei;
}
td_u16 mrs_calc_max_tei(const td_u8 *bitmap)
{
td_u16 i;
td_u16 bitmap_max_tei = 0;
for (i = (td_u16)(POWER_FAILURE_BITMAP_LEN * BIT_SIZE - 1); i >= 1; i--) {
if (mrs_power_failure_bit_check(bitmap, i) == TD_TRUE) {
bitmap_max_tei = i;
break;
}
}
return bitmap_max_tei;
}
/* Check whether the value of the bitmap data field is all 0. */
td_bool mrs_data_is_all_zero(const td_u8 *map, td_u32 len, td_u8 ch)
{
td_u32 i;
if (map == TD_NULL) {
return TD_FALSE;
}
for (i = 0; i < len; i++) {
if ((td_u8)map[i] != ch) {
return TD_FALSE;
}
}
return TD_TRUE;
}
#if defined(PRODUCT_CFG_PRODUCT_TYPE_STA) || defined(PRODUCT_CFG_PRODUCT_TYPE_CCO)
td_u32 mrs_handle_power_failure_rejoin_event(td_u8 rejoin_reason)
{
mrs_power_failure_ctrl_st *power_failure_info = mrs_get_power_failure_ctrl();
ext_unref_param(rejoin_reason);
mrs_printf("[PF_REJOIN_EVENT]: reason= %d\n", rejoin_reason);
#if defined(PRODUCT_CFG_PRODUCT_TYPE_STA)
mrs_power_failure_rcv_report *power_failure_rcv_info = mrs_get_power_failure_report_info();
if (power_failure_rcv_info->device_power_failure == TD_TRUE) {
return EXT_ERR_FAILURE;
}
mrs_sta_power_failure_info_erase(power_failure_info);
#endif
#if defined(PRODUCT_CFG_PRODUCT_TYPE_CCO)
if (power_failure_info->cco_diff_bitmap != TD_NULL) {
if (memset_s(power_failure_info->cco_diff_bitmap, POWER_FAILURE_BITMAP_LEN, 0,
POWER_FAILURE_BITMAP_LEN) != EXT_ERR_SUCCESS) {
return EXT_ERR_FAILURE;
}
}
mrs_cco_erase_common_bitmap(power_failure_info);
#endif
return EXT_ERR_SUCCESS;
}
#endif