ver2.0 Beta2

This commit is contained in:
pvvx 2024-12-06 23:05:45 +03:00
parent 742e68b482
commit 7a4e9f6742
22 changed files with 358 additions and 106 deletions

View file

@ -76,7 +76,7 @@ void __attribute__((used)) hal_ADC_IRQHandler(void) {
#endif
adv_wrk.new_battery = 1; // new battery
#if ((DEV_SERVICES & SERVICE_THS) == 0)
measured_data.count++;
// measured_data.count++;
#endif
hal_pwrmgr_unlock(MOD_ADCC);
@ -161,13 +161,38 @@ static void init_adc_batt(void) {
#endif
}
void low_vbat(void) {
#if (DEV_SERVICES & SERVICE_BUTTON)
pwroff_cfg_t pwr_wkp_cfg[]= {
#if (DEV_SERVICES & SERVICE_BUTTON)
{ GPIO_KEY, KEY_PRESSED, 0 },
#endif
//#if (DEV_SERVICES & SERVICE_RDS)
// { GPIO_INP, POL_FALLING, 0 }
//#endif
};
// 0.48 uA at 3.0V
hal_pwrmgr_poweroff( pwr_wkp_cfg, sizeof(pwr_wkp_cfg)/sizeof(pwr_wkp_cfg[0]) );
#else
// 1.67 uA at 3.0V
hal_pwrmgr_enter_sleep_rtc_reset((60*60)<<15); // 60 minutes
#endif
}
void check_battery(void) {
uint32_t i;
uint32_t summ;
if(bat_average.battery_mv == 0)
return;
//if (bat_average.battery_mv < 2000) // It is not recommended to write Flash below 2V
// low_vbat(); // TODO
#if defined(OTA_TYPE) && OTA_TYPE == OTA_TYPE_BOOT
if (bat_average.battery_mv < 2000) // It is not recommended to write Flash below 2V
low_vbat();
#else
if (bat_average.battery_mv < 1900)
low_vbat();
#endif
if(bat_average.buf1[0] == 0) {
for(i = 0; i < BAT_AVERAGE1_COUNT; i++)
bat_average.buf1[i] = bat_average.battery_mv;

View file

@ -86,6 +86,12 @@ uint8_t adv_set_data(void * pd) {
p->battery_level = measured_data.battery;
p->v_id = BtHomeID_voltage;
p->battery_mv = measured_data.battery_mv; // x mV
#if (DEV_SERVICES & SERVICE_BUTTON)
p->u_id = BtHomeID_button;
p->button = measured_data.button;
p->c_id = BtHomeID_count32;
p->counter = adv_wrk.rds_count;
#endif
return sizeof(adv_bthome_data2_t);
}
@ -100,6 +106,15 @@ uint8_t adv_set_event(void * ped) {
p->counter = adv_wrk.rds_count;
return sizeof(adv_bthome_event1_t);
}
#elif (DEV_SERVICES & SERVICE_BUTTON)
uint8_t adv_set_event(void * ped) {
padv_bthome_event1_t p = (padv_bthome_event1_t)ped;
p->b_id = BtHomeID_button;
p->button = measured_data.button;
p->c_id = BtHomeID_count32;
p->counter = adv_wrk.rds_count;
return sizeof(adv_bthome_event1_t);
}
#endif
uint8_t bthome_data_beacon(void * padbuf) {
@ -121,7 +136,7 @@ uint8_t bthome_data_beacon(void * padbuf) {
if (cfg.flg & FLG_ADV_CRYPT) {
padv_bthome_encrypt_t pe = (padv_bthome_encrypt_t)p;
pe->info = BtHomeID_Info_Encrypt;
#if (DEV_SERVICES & SERVICE_RDS)
#if (DEV_SERVICES & (SERVICE_RDS | SERVICE_BUTTON))
if(adv_wrk.adv_event) {
p->head.size = adv_encrypt(pe->data, adv_set_event(pe->data)) + sizeof(pe->head) - sizeof(pe->head.size) + sizeof(pe->info);
} else
@ -135,11 +150,11 @@ uint8_t bthome_data_beacon(void * padbuf) {
p->info = BtHomeID_Info;
p->p_id = BtHomeID_PacketId;
p->pid = (uint8)measured_data.count;
#if (DEV_SERVICES & SERVICE_RDS)
#if (DEV_SERVICES & (SERVICE_RDS | SERVICE_BUTTON))
if(adv_wrk.adv_event) {
p->head.size = adv_set_event(p->data) + sizeof(p->head) - sizeof(p->head.size) + sizeof(p->info) + sizeof(p->p_id) + sizeof(p->pid);
} else
#endif
#endif
{
p->head.size = adv_set_data(p->data) + sizeof(p->head) - sizeof(p->head.size) + sizeof(p->info) + sizeof(p->p_id) + sizeof(p->pid);
}

View file

@ -126,15 +126,27 @@ typedef struct __attribute__((packed)) _adv_bthome_data2_t {
uint8 battery_level; // 0..100 %
uint8 v_id; // = BtHomeID_voltage
uint16 battery_mv; // x 0.001 V
#if (DEV_SERVICES & SERVICE_BUTTON)
uint8_t u_id; // = BtHomeID_button ?
uint8_t button; // =1 press, =2 double_press ... https://bthome.io/format/
uint8_t c_id; // = BtHomeID_count32
uint32_t counter;
#endif
} adv_bthome_data2_t, * padv_bthome_data2_t; // size: 5
typedef struct __attribute__((packed)) _adv_bthome_event1_t {
#if (DEV_SERVICES & SERVICE_RDS)
uint8_t o_id; // = BtHomeID_opened ?
uint8_t opened;
#elif (DEV_SERVICES & SERVICE_BUTTON)
uint8_t b_id; // = BtHomeID_button ?
uint8_t button; // =1 press, =2 double_press ... https://bthome.io/format/
#endif
uint8_t c_id; // = BtHomeID_count32
uint32_t counter;
} adv_bthome_event1_t, * padv_bthome_event1_t; // size: 7
// BTHOME data1, no security
typedef struct __attribute__((packed)) _adv_bthome_ns1_t {
uint8 flag[3]; // Advertise type flags

View file

@ -28,7 +28,7 @@ typedef enum {
CMD_ID_FLASH_ID = 0x06, // Get Flash JEDEC ID
CMD_ID_SERIAL = 0x07, // Get serial string
CMD_ID_DEV_MAC = 0x10, // Get/Set MAC [+RandMAC], [size]<mac[6][randmac[2]]>
CMD_ID_FIX_MAC = 0x11, // Fixed MAC (не безопасная операция, переписывает сектор 0x1000 Flash)
CMD_ID_FIX_MAC = 0x11, // Fixed MAC (не безопасная операция, переписывает сектор 0x0 Flash)
CMD_ID_BKEY = 0x18, // Get/Set beacon bindkey in EEP
CMD_ID_COMFORT = 0x20, // Get/Set comfort parameters
CMD_ID_EXTDATA = 0x22, // Get/Set show ext. data

View file

@ -43,9 +43,10 @@
#define DEVICE_TH05D 24 // TH05_V1.3
#define DEVICE_TH05F 25 // TH05Y_V1.2
#define DEVICE_THB3 26
#define DEVICE_KEY2 30
#ifndef DEVICE
#define DEVICE DEVICE_THB3
#define DEVICE DEVICE_KEY2
#endif
// supported services by the device (bits)
@ -61,10 +62,16 @@
#define SERVICE_KEY 0x00000200 // есть кнопка
#define SERVICE_OUTS 0x00000400 // пока нет // есть обслуживние выходных пинов
#define SERVICE_INS 0x00000800 // пока нет // есть обслуживние входных пинов
#define SERVICE_TIME_ADJUST 0x00001000 // пока нет // есть функция коррекции счета времени
//#define SERVICE_TIME_ADJUST 0x00001000 // пока нет // есть функция коррекции счета времени
#define SERVICE_HARD_CLOCK 0x00002000 // пока нет // есть реальные часы RTC
#define SERVICE_TH_TRG 0x00004000 // триггер по температуре и влажности
#define SERVICE_LED 0x00008000 // use led
//#define SERVICE_MI_KEYS 0x00010000 // use mi keys (не используется)
//#define SERVICE_PRESSURE 0x00020000 // pressure sensor (пока нет реализации)
//#define SERVICE_18B20 0x00040000 // use sensor(s) MY18B20 (пока нет реализации)
//#define SERVICE_IUS 0x00080000 // use I and U sensor (INA226) (пока нет реализации)
//#define SERVICE_PLM 0x00100000 // use PWM-RH and NTC (пока нет реализации)
#define SERVICE_BUTTON 0x00200000 // кнопка, активность только при нажатии
#define OTA_TYPE_NONE 0 // нет OTA, только переключение из APP на boot прошивку
#define OTA_TYPE_BOOT SERVICE_OTA // вариант для прошивки boot + OTA
@ -105,6 +112,7 @@
#define I2C_SDA GPIO_P18
#define I2C_SCL GPIO_P20
#define GPIO_KEY GPIO_P07
#define KEY_PRESSED 0
#define GPIO_LED GPIO_P26
#define LED_ON 0
#define LED_OFF 1
@ -142,6 +150,7 @@
#define I2C_SCL GPIO_P34 // SCL
#define GPIO_SPWR GPIO_P00 // питание сенсора
#define GPIO_KEY GPIO_P14
#define KEY_PRESSED 0
#define GPIO_LED GPIO_P15
#define LED_ON 1
#define LED_OFF 0
@ -188,6 +197,7 @@
#define GPIO_SPWR GPIO_P00 // питание сенсора
#define GPIO_KEY GPIO_P14
#define KEY_PRESSED 0
#define GPIO_LPWR GPIO_P02 // питание LCD драйвера
#define GPIO_TRG GPIO_P20 // mark TX2
@ -235,6 +245,7 @@
#define I2C_LCD_SCL GPIO_P33 // SCL
#define GPIO_KEY GPIO_P01
#define KEY_PRESSED 0
#define GPIO_TRG GPIO_P09 // mark TX
#define GPIO_INP GPIO_P10 // mark RX
@ -286,6 +297,7 @@
#define I2C_LCD_SCL GPIO_P14 // SCL
#define GPIO_KEY GPIO_P02
#define KEY_PRESSED 0
#define GPIO_TRG GPIO_P09 // mark TX
#define GPIO_INP GPIO_P10 // mark RX
@ -333,6 +345,7 @@
#define GPIO_SPWR GPIO_P00 // питание сенсора
#define GPIO_KEY GPIO_P14
#define KEY_PRESSED 0
#define GPIO_LPWR GPIO_P02 // питание LCD драйвера
#define GPIO_TRG GPIO_P20 // mark TX2
@ -342,6 +355,41 @@
#define DEF_HARDWARE_REVISION "0019"
#define DEF_MANUFACTURE_NAME_STR "Tuya"
#elif DEVICE == DEVICE_KEY2
/* Model: iSearch ver2 ST17H66 (TSSOP16) */
#define SDK_VER_CHIP __DEF_CHIP_TSOP16__
#if OTA_TYPE == OTA_TYPE_BOOT
#define DEV_SERVICES (OTA_TYPE \
| SERVICE_BUTTON \
| SERVICE_BINDKEY \
)
#else
#define DEV_SERVICES (OTA_TYPE \
| SERVICE_BUTTON \
| SERVICE_BINDKEY \
)
#endif
#define ADC_PIN_USE_OUT 1 // hal_gpio_write(ADC_PIN, 1);
#define ADC_PIN GPIO_P11
#define ADC_VBAT_CHL VBAT_ADC_P11
#define GPIO_KEY GPIO_P15
#define KEY_PRESSED 1
#define GPIO_LED GPIO_P03
#define LED_ON 1
#define LED_OFF 0
#define GPIO_BUZZER GPIO_P09
//#define GPIO_INP GPIO_P15
#define DEF_MODEL_NUMBER_STR "KEY"
#define DEF_HARDWARE_REVISION "0020"
#define DEF_MANUFACTURE_NAME_STR "DIY"
#else
#error "DEVICE Not released!"
#endif
@ -386,14 +434,14 @@ extern const cfg_t def_cfg;
typedef struct _adv_work_t {
uint32_t measure_interval_ms;
uint32_t measure_batt_tik;
#if (DEV_SERVICES & SERVICE_RDS)
uint32_t rds_timer_tik;
uint32_t rds_count;
#if (DEV_SERVICES & (SERVICE_RDS | SERVICE_BUTTON))
uint32_t rds_timer_tik; // rds & button time tik (in 32768 Hz)
uint32_t rds_count; // rds & button count
#endif
uint8_t meas_count;
uint8_t adv_reload_count;
uint8_t new_battery; // new battery
uint8_t adv_event; // rds event
uint8_t meas_count; // счет до нового измерения в кол-ве вызовов adv_measure()
uint8_t adv_reload_count; // кол-во передач рекламы до перехода к новому типу и установкам рекламы
uint8_t new_battery; // flag: new battery
uint8_t adv_event; // flag: rds event
} adv_work_t;
extern adv_work_t adv_wrk;

View file

@ -35,7 +35,7 @@ extern "C" {
#endif
#define FMEMORY_SCFG_BANK_SIZE FLASH_SECTOR_SIZE // размер сектора, 4096 bytes
#define FMEMORY_SCFG_BANKS 4 // кол-во секторов для работы - min 2
#define FMEMORY_SCFG_BASE_ADDR (FLASH_SIZE - (FMEMORY_SCFG_BANKS*FMEMORY_SCFG_BANK_SIZE)) // 0x7C000
#define FMEMORY_SCFG_BASE_ADDR (FLASH_SIZE - (FMEMORY_SCFG_BANKS*FMEMORY_SCFG_BANK_SIZE)) // 0xFC000, 0x7C000, 0x3C000
//-----------------------------------------------------------------------------
enum eFMEMORY_ERRORS {
FMEM_NOT_FOUND = -1, // -1 - не найден

View file

@ -108,7 +108,6 @@ volatile sysclk_t g_spif_clk_config;
static void hal_low_power_io_init(void) {
//========= disable all gpio pullup/down to preserve juice
const ioinit_cfg_t ioInit[] = {
#if(SDK_VER_CHIP == __DEF_CHIP_QFN32__)
#if DEVICE == DEVICE_THB2
{ GPIO_P00, GPIO_PULL_DOWN },
{ GPIO_P01, GPIO_PULL_DOWN },
@ -295,22 +294,24 @@ const ioinit_cfg_t ioInit[] = {
{ GPIO_P32, GPIO_PULL_DOWN },
{ GPIO_P33, GPIO_FLOATING }, // CHT8305 SDA
{ GPIO_P34, GPIO_FLOATING } // CHT8305 SCL
#elif (DEVICE == DEVICE_KEY2)
{ GPIO_P02, GPIO_FLOATING }, // connect to +Vbat ?
#ifdef GPIO_LED
{ GPIO_P03, GPIO_FLOATING }, // LED - GPIO_LED
#else
{ GPIO_P03, GPIO_PULL_DOWN },
#endif
{ GPIO_P07, GPIO_PULL_DOWN }, // mark "SWS"
{ GPIO_P09, GPIO_PULL_DOWN }, // TX Buzzer
{ GPIO_P10, GPIO_PULL_DOWN}, // GPIO_PULL_UP }, // RX
{ GPIO_P11, GPIO_PULL_UP }, // ADC Vbat
{ GPIO_P14, GPIO_PULL_DOWN }, // PN8 ?
{ GPIO_P15, GPIO_PULL_DOWN }, // KEY
{ GPIO_P18, GPIO_PULL_DOWN }, // PN10 ?
{ GPIO_P20, GPIO_FLOATING }, // connect to GND
{ GPIO_P34, GPIO_FLOATING } // connect to +Vbat
#else
#error "DEVICE Not released!"
#endif
#else
{GPIO_P02, GPIO_FLOATING },
{GPIO_P03, GPIO_FLOATING },
{GPIO_P07, GPIO_FLOATING },
{GPIO_P09, GPIO_FLOATING },
{GPIO_P10, GPIO_FLOATING },
{GPIO_P11, GPIO_FLOATING },
{GPIO_P14, GPIO_FLOATING },
{GPIO_P15, GPIO_FLOATING },
{GPIO_P18, GPIO_FLOATING },
{GPIO_P20, GPIO_FLOATING },
{GPIO_P34, GPIO_FLOATING },
#endif
};
@ -323,7 +324,9 @@ const ioinit_cfg_t ioInit[] = {
#ifdef GPIO_LED
hal_gpio_write(GPIO_LED, LED_ON);
#endif
//#if SDK_VER_CHIP == __DEF_CHIP_TSOP16__
DCDC_CONFIG_SETTING(0x0a);
//#endif
DCDC_REF_CLK_SETTING(1);
DIG_LDO_CURRENT_SETTING(1);
#if defined ( __GNUC__ )
@ -440,9 +443,9 @@ int main(void) {
#endif
wrk.boot_flg = (uint8_t)read_reg(OTA_MODE_SELECT_REG);
#if defined(OTA_TYPE) && OTA_TYPE == OTA_TYPE_BOOT
#if (DEV_SERVICES & SERVICE_KEY)
#if (DEV_SERVICES & (SERVICE_KEY | SERVICE_BUTTON))
hal_gpio_pin_init(GPIO_KEY, GPIO_INPUT);
if (hal_gpio_read(GPIO_KEY) == 0
if (hal_gpio_read(GPIO_KEY) == KEY_PRESSED
|| wrk.boot_flg == BOOT_FLG_OTA
|| wrk.boot_flg == BOOT_FLG_FW0) {
#else

View file

@ -224,6 +224,7 @@ typedef struct _measured_data_t {
uint16_t battery_mv; // mV
uint8_t battery; // 0..100 %
measured_flg_t flg;
uint8_t button;
} measured_data_t;
#define send_len_measured_data 5

View file

@ -222,12 +222,12 @@ static void adv_measure(void) {
get_utc_time_sec(); // счет UTC timestamp
#if (DEV_SERVICES & SERVICE_RDS)
if(!adv_wrk.adv_event) {
if(clkt.utc_time_tik - adv_wrk.rds_timer_tik >= (RDS_STEP_TIMER_SEC << 15)) {
if(clkt.utc_time_tik - adv_wrk.rds_timer_tik >= (RDS_EVENT_STEP_SEC << 15)) { // шаг дублирования передачи 30 минут
adv_wrk.rds_timer_tik = clkt.utc_time_tik;
adv_wrk.adv_event = 1;
adv_wrk.adv_reload_count = RDS_RETRY_ADV_COUNT;
adv_wrk.adv_reload_count = RDS_EVENT_ADV_COUNT; // 16
LL_SetAdvData(bthome_data_beacon((void *) gapRole_AdvertData), gapRole_AdvertData);
set_new_adv_interval(DEF_EVENT_ADV_INERVAL); // actual time * 625us
set_new_adv_interval(DEF_EVENT_ADV_INERVAL); // 50 ms (in 625us)
return;
}
#endif
@ -239,6 +239,9 @@ static void adv_measure(void) {
if(adv_wrk.new_battery) {
adv_wrk.new_battery = 0;
check_battery();
#if (DEV_SERVICES & SERVICE_THS) == 0
measured_data.count++;
#endif
#if (DEV_SERVICES & SERVICE_SCREEN)
chow_lcd(1);
#endif
@ -263,7 +266,7 @@ static void adv_measure(void) {
} else {
if(adv_wrk.meas_count >= cfg.measure_interval) {
adv_wrk.meas_count = 0;
read_sensors();
read_sensors(); // measured_data.count++
if(adv_wrk.new_battery) {
adv_wrk.new_battery = 0;
check_battery();
@ -288,12 +291,38 @@ static void adv_measure(void) {
#endif
if(adv_wrk.adv_reload_count) {
if(--adv_wrk.adv_reload_count == 0) {
// восстановление/переключение типа и интервалов рекламы
#if defined(OTA_TYPE) && OTA_TYPE == OTA_TYPE_BOOT
if (wrk.boot_flg == BOOT_FLG_OTA) {
hal_system_soft_reset();
}
#endif
if(adv_wrk.adv_event) {
#if (DEV_SERVICES & SERVICE_BUTTON)
if(adv_wrk.adv_event) { // передавались event ?
adv_wrk.adv_reload_count = RDS_EVENT_ADV_COUNT;
if(!measured_data.button) {
if(adv_wrk.new_battery) {
adv_wrk.new_battery = 0;
check_battery();
}
measured_data.count++;
LL_SetAdvData(bthome_data_beacon((void *) gapRole_AdvertData), gapRole_AdvertData);
adv_wrk.adv_event = 0;
set_new_adv_interval(DEF_EVENT_ADV_INERVAL);
}
} else {
// восстановление пользовательского (основного) интервала передачи рекламы
if(adv_wrk.new_battery) {
adv_wrk.new_battery = 0;
check_battery();
}
measured_data.count++;
LL_SetAdvData(bthome_data_beacon((void *) gapRole_AdvertData), gapRole_AdvertData);
set_new_adv_interval(cfg.advertising_interval * 100);
}
#else
if(adv_wrk.adv_event) { // передавались event ?
// восстановление пользовательского (основного) интервала передачи рекламы после цикла передач event
adv_wrk.adv_event = 0;
if(adv_wrk.new_battery) {
adv_wrk.new_battery = 0;
@ -302,14 +331,16 @@ static void adv_measure(void) {
measured_data.count++;
LL_SetAdvData(bthome_data_beacon((void *) gapRole_AdvertData), gapRole_AdvertData);
}
// восстановление пользовательского (основного) интервала передачи рекламы
set_new_adv_interval(cfg.advertising_interval * 100);
#endif
}
}
adv_wrk.meas_count++;
}
}
#if (DEV_SERVICES & SERVICE_KEY) || (DEV_SERVICES & SERVICE_RDS)
#if (DEV_SERVICES & (SERVICE_KEY | SERVICE_RDS | SERVICE_BUTTON))
/*********************************************************************
* LED and Key
*/
@ -319,15 +350,24 @@ static void posedge_int_wakeup_cb(GPIO_Pin_e pin, IO_Wakeup_Pol_e type)
if(type == POSEDGE)
{
LOG("int or wakeup(pos):gpio:%d type:%d\n", pin, type);
#if (DEV_SERVICES & SERVICE_KEY)
#if (DEV_SERVICES & (SERVICE_KEY | SERVICE_BUTTON))
if(pin == GPIO_KEY) {
#ifdef GPIO_LED
#ifdef GPIO_LED
#if KEY_PRESSED
hal_gpio_write(GPIO_LED, LED_ON);
#else
hal_gpio_write(GPIO_LED, LED_OFF);
#endif
#endif
#endif
#if (DEV_SERVICES & SERVICE_KEY) && KEY_PRESSED
if(gapRole_AdvEnabled) {
adv_wrk.adv_reload_count = 60000/DEF_CON_ADV_INERVAL_MS; // 60 sec
set_new_adv_interval(DEF_CON_ADV_INERVAL); // actual time * 625us
}
#endif
#if (DEV_SERVICES & SERVICE_BUTTON)
osal_set_event(simpleBLEPeripheral_TaskID, PIN_INPUT_EVT);
#endif
}
#endif
#if (DEV_SERVICES & SERVICE_RDS)
@ -348,13 +388,26 @@ static void negedge_int_wakeup_cb(GPIO_Pin_e pin, IO_Wakeup_Pol_e type)
if(type == NEGEDGE)
{
LOG("int or wakeup(neg):gpio:%d type:%d\n", pin, type);
#if (DEV_SERVICES & SERVICE_KEY)
#if (DEV_SERVICES & (SERVICE_KEY | SERVICE_BUTTON))
if(pin == GPIO_KEY) {
#ifdef GPIO_LED
#ifdef GPIO_LED
#if KEY_PRESSED
hal_gpio_write(GPIO_LED, LED_OFF);
#else
hal_gpio_write(GPIO_LED, LED_ON);
#endif
#endif // KEY_PRESSED
#endif // GPIO_LED
#if (DEV_SERVICES & SERVICE_KEY) && (KEY_PRESSED == 0)
if(gapRole_AdvEnabled) {
adv_wrk.adv_reload_count = 60000/DEF_CON_ADV_INERVAL_MS; // 60 sec
set_new_adv_interval(DEF_CON_ADV_INERVAL); // actual time * 625us
}
#endif // (DEV_SERVICES & SERVICE_KEY)
#if (DEV_SERVICES & SERVICE_BUTTON)
osal_set_event(simpleBLEPeripheral_TaskID, PIN_INPUT_EVT);
#endif
}
#endif
#endif // (DEV_SERVICES & (SERVICE_KEY | SERVICE_BUTTON))
#if (DEV_SERVICES & SERVICE_RDS)
if(pin == GPIO_INP) {
osal_set_event(simpleBLEPeripheral_TaskID, PIN_INPUT_EVT);
@ -366,11 +419,11 @@ static void negedge_int_wakeup_cb(GPIO_Pin_e pin, IO_Wakeup_Pol_e type)
LOG("error\n");
}
}
#endif // (DEV_SERVICES & SERVICE_KEY)
#endif // (DEV_SERVICES & (SERVICE_KEY | SERVICE_RDS | SERVICE_BUTTON))
static void init_app_gpio(void)
{
#if (DEV_SERVICES & SERVICE_KEY)
#if (DEV_SERVICES & (SERVICE_KEY | SERVICE_BUTTON))
hal_gpioin_register(GPIO_KEY, posedge_int_wakeup_cb, negedge_int_wakeup_cb);
#endif
#ifdef GPIO_LED
@ -576,8 +629,8 @@ void SimpleBLEPeripheral_Init( uint8_t task_id )
LL_PLUS_PerStats_Init(&g_perStatsByChanTest);
batt_start_measure();
#if (DEV_SERVICES & SERVICE_RDS)
adv_wrk.rds_timer_tik = clkt.utc_time_tik - (RDS_RETRY_START_SEC << 15);
#if (DEV_SERVICES & (SERVICE_RDS | SERVICE_BUTTON))
adv_wrk.rds_timer_tik = clkt.utc_time_tik - (RDS_EVENT_START_SEC << 15);
#endif
LOG("=====SimpleBLEPeripheral_Init Done=======\n");
@ -636,7 +689,7 @@ uint16_t BLEPeripheral_ProcessEvent( uint8_t task_id, uint16_t events )
adv_wrk.measure_batt_tik = clkt.utc_time_tik;
batt_start_measure();
}
read_sensors();
read_sensors(); // measured_data.count++;
start_measure();
#if (DEV_SERVICES & SERVICE_SCREEN)
chow_lcd(1);
@ -690,9 +743,24 @@ uint16_t BLEPeripheral_ProcessEvent( uint8_t task_id, uint16_t events )
// return unprocessed events
return ( events ^ SBP_START_DEVICE_EVT );
}
#if (DEV_SERVICES & SERVICE_RDS)
#if (DEV_SERVICES & (SERVICE_RDS | SERVICE_BUTTON))
if(events & PIN_INPUT_EVT) {
int ev = 0;
#if (DEV_SERVICES & SERVICE_BUTTON)
if(hal_gpio_read(GPIO_KEY) == KEY_PRESSED) {
if(!measured_data.flg.pin_input) {
adv_wrk.rds_count++;
measured_data.button = 1; // press
ev = 1;
}
measured_data.flg.pin_input = 1;
} else {
// if(measured_data.flg.pin_input)
// ev = 1;
measured_data.flg.pin_input = 0;
measured_data.button = 0; // None
}
#else
if(hal_gpio_read(GPIO_INP)) {
if(!measured_data.flg.pin_input) {
adv_wrk.rds_count++;
@ -704,12 +772,13 @@ uint16_t BLEPeripheral_ProcessEvent( uint8_t task_id, uint16_t events )
ev = 1;
measured_data.flg.pin_input = 0;
}
#endif
if(ev) {
if(gapRole_AdvEnabled) {
measured_data.count++;
adv_wrk.adv_event = 1;
adv_wrk.adv_reload_count = RDS_RETRY_ADV_COUNT;
adv_wrk.rds_timer_tik = clkt.utc_time_tik - (RDS_RETRY_DOUBLE_SEC << 15);
adv_wrk.adv_reload_count = RDS_EVENT_ADV_COUNT;
adv_wrk.rds_timer_tik = clkt.utc_time_tik - (RDS_EVENT_DOUBLE_SEC << 15);
LL_SetAdvData(bthome_data_beacon((void *) gapRole_AdvertData), gapRole_AdvertData);
set_new_adv_interval(DEF_EVENT_ADV_INERVAL); // 50ms, actual time * 625us
} else if(cfg.flg & FLG_MEAS_NOTIFY) {

View file

@ -28,16 +28,21 @@ extern "C"
#define DEF_ADV_INERVAL_MS ((DEF_ADV_INERVAL*625)/1000) // 5000 ms
#define DEF_CON_ADV_INERVAL 2500 // 1.5625 sec
#define DEF_CON_ADV_INERVAL_MS ((DEF_CON_ADV_INERVAL*625)/1000) // 1562 ms
#define DEF_EVENT_ADV_INERVAL 80 // 50 ms
#if (DEV_SERVICES & SERVICE_BUTTON)
#define DEF_EVENT_ADV_INERVAL 120 // 75 ms
#define RDS_EVENT_ADV_COUNT 16 // 16*75 = 1200 ms
#else
#define DEF_EVENT_ADV_INERVAL 80 // 50 ms
#define RDS_EVENT_ADV_COUNT 16 // 16*50 = 800 ms
#endif
#define DEF_EVENT_ADV_INERVAL_MS ((DEF_EVENT_ADV_INERVAL*625)/1000) // 50 ms
#define DEF_OTA_ADV_INERVAL 1600 // 1 sec
#define DEF_OTA_ADV_INERVAL_MS ((DEF_OTA_ADV_INERVAL*625)/1000) // 1000 ms
// adv. event
#define RDS_STEP_TIMER_SEC 1800 // шаг передачи 30 минут
#define RDS_RETRY_DOUBLE_SEC (RDS_STEP_TIMER_SEC-12) // дубль через 12 сек
#define RDS_RETRY_START_SEC (RDS_STEP_TIMER_SEC-120) // старт 2 минуты
#define RDS_RETRY_ADV_COUNT 16
#define RDS_EVENT_STEP_SEC 1800 // шаг передачи (дублирование состояния) RDS 30 минут без событий
#define RDS_EVENT_DOUBLE_SEC (RDS_EVENT_STEP_SEC - 12) // передача (дублирование состояния) RDS через 12 сек после события
#define RDS_EVENT_START_SEC (RDS_EVENT_STEP_SEC - 120) // передача (дублирование состояния) RDS от старта питания - 2 минуты
// How often to perform periodic event
#define SBP_PERIODIC_EVT_PERIOD 5000