THB2/bthome_phy6222/source/config.c
2024-02-19 21:21:24 +03:00

156 lines
5 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* config.c
*
* Created on: 16 янв. 2024 г.
* Author: pvvx
*/
/*********************************************************************
* INCLUDES
*/
#include "bcomdef.h"
#include "config.h"
#include "rf_phy_driver.h"
#include "global_config.h"
#include "OSAL.h"
#include "OSAL_PwrMgr.h"
#include "gatt.h"
#include "hci.h"
#include "gapgattserver.h"
#include "gattservapp.h"
#include "devinfoservice.h"
#include "thb2_peripheral.h"
#include "gapbondmgr.h"
#include "pwrmgr.h"
#include "gpio.h"
#include "thb2_main.h"
#include "ll.h"
#include "ll_hw_drv.h"
#include "ll_def.h"
#include "hci_tl.h"
#include "flash.h"
//#include "fs.h"
#include "flash_eep.h"
#include "battservice.h"
#include "thservice.h"
#include "thb2_peripheral.h"
#include "bthome_beacon.h"
#include "sensors.h"
#include "battery.h"
#include "sbp_profile.h"
#include "logger.h"
#include "trigger.h"
extern gapPeriConnectParams_t periConnParameters;
clock_time_t clkt;
cfg_t cfg;
work_parm_t wrk;
adv_work_t adv_wrk;
const cfg_t def_cfg = {
.flg = FLG_MEAS_NOTIFY | FLG_SHOW_SMILEY,
.rf_tx_power = RF_PHY_TX_POWER_0DBM,
.advertising_interval = 80, // 80 * 62.5 = 5000 ms
.measure_interval = 2, // 5 * 2 = 10 sec
.batt_interval = 60, // 60 sec
.connect_latency = DEFAULT_DESIRED_SLAVE_LATENCY, // 30*(29+1) = 900 ms
.averaging_measurements = 180 // 180*10 = 1800 sec, 30 min
};
void restore_utc_time_sec(void) {
if(clkt.utc_set_time_sec == 0) {
clkt.utc_time_add = (AP_AON->SLEEP_R[2] &((1<<15) - 1)) + 10;
clkt.utc_time_sec = AP_AON->SLEEP_R[3];
//if(clkt.utc_time_sec < 1704067200ul) clkt.utc_time_sec = 1704067200ul;
}
clkt.utc_time_tik = clock_time_rtc();
}
uint32_t get_utc_time_sec(void) {
uint32_t new_time_tik;
HAL_ENTER_CRITICAL_SECTION();
do {
new_time_tik = AP_AON->RTCCNT;
} while(new_time_tik != AP_AON->RTCCNT);
if(new_time_tik <= clkt.utc_time_tik)
clkt.utc_time_add += new_time_tik - clkt.utc_time_tik;
else
clkt.utc_time_add += 0xffffffff - clkt.utc_time_tik + new_time_tik;
clkt.utc_time_tik = new_time_tik;
clkt.utc_time_sec += clkt.utc_time_add >> 15; // div 32768
clkt.utc_time_add &= (1<<15) - 1;
AP_AON->SLEEP_R[2] = clkt.utc_time_add; // сохранить для восстановления часов после перезагрузки
AP_AON->SLEEP_R[3] = clkt.utc_time_sec; // сохранить для восстановления часов после перезагрузки
HAL_EXIT_CRITICAL_SECTION();
#if (DEV_SERVICES & SERVICE_TIME_ADJUST)
// TODO
#endif
return clkt.utc_time_sec;
}
void test_config(void) {
if (cfg.rf_tx_power > RF_PHY_TX_POWER_EXTRA_MAX)
cfg.rf_tx_power = RF_PHY_TX_POWER_EXTRA_MAX;
g_rfPhyTxPower = cfg.rf_tx_power;
rf_phy_set_txPower(g_rfPhyTxPower);
#if FIX_CONN_INTERVAL
gapRole_MinConnInterval = periConnParameters.intervalMin = DEFAULT_DESIRED_MIN_CONN_INTERVAL;
gapRole_MaxConnInterval = periConnParameters.intervalMax = DEFAULT_DESIRED_MAX_CONN_INTERVAL;
gapRole_SlaveLatency = periConnParameters.latency = cfg.connect_latency;
gapRole_TimeoutMultiplier = (cfg.connect_latency + 1) * 3 * 4;
if(gapRole_TimeoutMultiplier > 2048)
gapRole_TimeoutMultiplier = 2048; // 20.48 sec мax
periConnParameters.timeout = gapRole_TimeoutMultiplier;
#else
gapRole_MinConnInterval = DEFAULT_DESIRED_MIN_CONN_INTERVAL;
gapRole_MaxConnInterval = DEFAULT_DESIRED_MAX_CONN_INTERVAL;
gapRole_SlaveLatency = cfg.connect_latency;
gapRole_TimeoutMultiplier = (cfg.connect_latency + 1) * 3 * 4;
if(gapRole_TimeoutMultiplier > 2048)
gapRole_TimeoutMultiplier = 2048; // 20.48 sec мax
#endif
if(cfg.advertising_interval == 0)
cfg.advertising_interval = 1;
else if(cfg.advertising_interval > 160)
cfg.advertising_interval = 160;
if(cfg.measure_interval < 2)
cfg.measure_interval = 2;
adv_wrk.measure_interval_ms = (cfg.advertising_interval * cfg.measure_interval * 625) / 10;
}
void load_eep_config(void) {
if(!flash_supported_eep_ver(0, APP_VERSION)) {
memcpy(&cfg, &def_cfg, sizeof(cfg));
#if (DEV_SERVICES & SERVICE_THS)
memset(&thsensor_cfg.coef, 0, sizeof(thsensor_cfg.coef));
#endif
#if (OTA_TYPE == OTA_TYPE_APP) && ((DEV_SERVICES & SERVICE_TH_TRG) || (DEV_SERVICES & SERVICE_SCREEN))
memcpy(&trg, &def_trg, sizeof(trg));
#endif
} else {
if (flash_read_cfg(&cfg, EEP_ID_CFG, sizeof(cfg)) != sizeof(cfg))
memcpy(&cfg, &def_cfg, sizeof(cfg));
#if (DEV_SERVICES & SERVICE_THS)
if(flash_read_cfg(&thsensor_cfg.coef, EEP_ID_CFS, sizeof(thsensor_cfg.coef)) != sizeof(thsensor_cfg.coef)) {
memset(&thsensor_cfg.coef, 0, sizeof(thsensor_cfg.coef));
}
#endif
#if (OTA_TYPE == OTA_TYPE_APP) && ((DEV_SERVICES & SERVICE_TH_TRG) || (DEV_SERVICES & SERVICE_SCREEN))
if (flash_read_cfg(&trg, EEP_ID_TRG, trigger_send_size) != trigger_send_size) {
memcpy(&trg, &def_trg, sizeof(trg));
}
#endif
#if (DEV_SERVICES & SERVICE_TIME_ADJUST)
if (flash_read_cfg(&clkt.delta_time, EEP_ID_TIM, sizeof(&clkt.delta_time)) != sizeof(&clkt.delta_time)) {
clkt.delta_time = 0;
}
#endif
}
#if (DEV_SERVICES & SERVICE_HISTORY)
memo_init();
#endif
test_config();
}