добавлен счетчик импульсов и передача событий open/close

This commit is contained in:
pvvx 2024-02-08 07:14:56 +03:00
parent 3b4546d9d2
commit d23529f37e
33 changed files with 6662 additions and 6732 deletions

View file

@ -28,7 +28,7 @@ Custom firmware for Tuya [THB2](https://pvvx.github.io/THB2), [BTH01](https://pv
|---|--- |
| 1.0 | Первая релизная версия |
| 1.1 | Добавлен триггер - вывод TX2 срабатывающий по установленным значениям температуры и/или влажности с гистерезисами. Передача состояния вывода RX2 при connect. Для термометров с экраном добавлен показ смайлика с "комфортом". Дополнены: изменение имени и MAC устройства. |
| 1.2 | Будущая версия (ещё в работе, доступна в bthome_phy6222/bin): Отключение внутренних подтяжек у выводов INP и TRG (RX2/TX2).
| 1.2 | Будущая версия (ещё в работе, доступна в bthome_phy6222/bin): Обработка и передача событий open/close со счетчиком с вывода маркированного "RX2" (для THB2 - "RX1"). |
## Прошивка:

View file

@ -14,7 +14,7 @@
</extensions>
</storageModule>
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
<configuration artifactName="${ProjName}" buildProperties="" description="" id="ilg.gnuarmeclipse.managedbuild.cross.toolchain.base.28719871" name="Default" optionalBuildProperties="org.eclipse.cdt.docker.launcher.containerbuild.property.dockerdpath=,org.eclipse.cdt.docker.launcher.containerbuild.property.volumes=,org.eclipse.cdt.docker.launcher.containerbuild.property.selectedvolumes=" parent="org.eclipse.cdt.build.core.emptycfg">
<configuration artifactName="${ProjName}" buildProperties="" description="" id="ilg.gnuarmeclipse.managedbuild.cross.toolchain.base.28719871" name="Default" optionalBuildProperties="org.eclipse.cdt.docker.launcher.containerbuild.property.dockerdpath=,org.eclipse.cdt.docker.launcher.containerbuild.property.selectedvolumes=,org.eclipse.cdt.docker.launcher.containerbuild.property.volumes=" parent="org.eclipse.cdt.build.core.emptycfg">
<folderInfo id="ilg.gnuarmeclipse.managedbuild.cross.toolchain.base.28719871.266191087" name="/" resourcePath="">
<toolChain id="ilg.gnuarmeclipse.managedbuild.cross.toolchain.base.321694806" name="Arm Cross GCC" superClass="ilg.gnuarmeclipse.managedbuild.cross.toolchain.base">
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.architecture.2086137351" name="Architecture" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.architecture" value="ilg.gnuarmeclipse.managedbuild.cross.option.architecture.arm" valueType="enumerated"/>
@ -138,7 +138,7 @@
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/SDK/components/libraries/fs}&quot;"/>
</option>
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="ilg.gnuarmeclipse.managedbuild.cross.option.c.compiler.defs.387683329" name="Defined symbols (-D)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.c.compiler.defs" useByScannerDiscovery="true" valueType="definedSymbols">
<listOptionValue builtIn="false" value="DEBUG_INFO=0"/>
<listOptionValue builtIn="false" value="DEBUG_INFO=2"/>
<listOptionValue builtIn="false" value="MTU_SIZE=247"/>
<listOptionValue builtIn="false" value="CFG_CP"/>
<listOptionValue builtIn="false" value="OSAL_CBTIMER_NUM_TASKS=1"/>

View file

@ -1,3 +1,4 @@
bin
Listings
Objects
TestTHB2.asm

View file

@ -5,7 +5,7 @@
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
<provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuildCommandParser" id="org.eclipse.cdt.managedbuilder.core.GCCBuildCommandParser" keep-relative-paths="false" name="CDT GCC Build Output Parser" parameter="([^/\\\\]*)((g?cc)|([gc]\+\+)|(clang))" prefer-non-shared="true"/>
<provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="177609020486394017" id="org.eclipse.embedcdt.managedbuild.cross.arm.core.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT Arm Cross GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} ${cross_toolchain_flags} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="212728091224071331" id="org.eclipse.embedcdt.managedbuild.cross.arm.core.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT Arm Cross GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} ${cross_toolchain_flags} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<language-scope id="org.eclipse.cdt.core.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/>
</provider>

View file

@ -372,7 +372,7 @@ int hal_flash_erase_block64(unsigned int addr) {
uint8_t retval;
#if(FLASH_PROTECT_FEATURE == 1)
hal_flash_unlock();
#endif
#endif
uint32_t cs = spif_lock();
uint32_t cb = AP_PCR->CACHE_BYPASS;
HAL_CACHE_ENTER_BYPASS_SECTION();
@ -390,7 +390,7 @@ int hal_flash_erase_block64(unsigned int addr) {
spif_unlock(cs);
#if(FLASH_PROTECT_FEATURE == 1)
hal_flash_lock();
#endif
#endif
return retval;
}
@ -398,7 +398,7 @@ int hal_flash_erase_all(void) {
uint8_t retval;
#if(FLASH_PROTECT_FEATURE == 1)
hal_flash_unlock();
#endif
#endif
uint32_t cs = spif_lock();
uint32_t cb = AP_PCR->CACHE_BYPASS;
HAL_CACHE_ENTER_BYPASS_SECTION();

View file

@ -6267,9 +6267,9 @@ llStatus_t LL_SetAdvControl1( uint8 advMode )
|| llState == LL_STATE_CONN_MASTER)
&& (pGlobal_config[LL_SWITCH] & SIMUL_CONN_ADV_ALLOW))
{
#ifdef DEBUG_LL
#ifdef DEBUG_LL
LOG("LL_SetAdvControl: start sec adv\r\n");
#endif
#endif
if (llSecondaryState != LL_SEC_STATE_IDLE)
return( LL_STATUS_ERROR_UNEXPECTED_STATE_ROLE );
@ -8077,9 +8077,9 @@ void rflib_vesion(uint8_t* major, uint8_t* minor, uint8_t* revision, char* test_
*minor = SDK_VER_MINOR;
*revision = SDK_VER_REVISION;
*test_build = '\0';
#ifdef SDK_VER_TEST_BUILD
#ifdef SDK_VER_TEST_BUILD
*test_build = SDK_VER_TEST_BUILD;
#endif
#endif
}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -1,2 +0,0 @@
python3 C:\Python310\Scripts\hexinfo.py .\bin\BTH01_v09.hex
python3 C:\Python310\Scripts\hexinfo.py .\bin\BOOT_BTH01_v09.hex

View file

@ -1,2 +0,0 @@
python3 C:\Python310\Scripts\hexinfo.py .\bin\THB2_v09.hex
python3 C:\Python310\Scripts\hexinfo.py .\bin\BOOT_THB2_v09.hex

View file

@ -1,5 +1,5 @@
@set PATH=D:\MCU\GNU_Tools_ARM_Embedded\13.2.rel1\bin;%PATH%
@set SWVER=_v11
@set SWVER=_v12
@del /Q "build\THB2%SWVER%.hex"
@del /Q "build\THB2%SWVER%.bin"
@mkdir .\bin

View file

@ -9,7 +9,7 @@
#include "thb2_main.h"
#include "pwrmgr.h"
#include "jump_function.h"
#include "sensor.h"
#include "sensors.h"
#ifndef ADC_PIN
#define ADC_PIN GPIO_P11

View file

@ -17,7 +17,7 @@
#include "peripheral.h"
#include "battservice.h"
#include "sensor.h"
#include "sensors.h"
/*********************************************************************
MACROS
*/

View file

@ -9,15 +9,11 @@
#include "config.h"
#include "bcomdef.h"
#include "gapbondmgr.h"
#include "sensor.h"
#include "sensors.h"
#include "bthome_beacon.h"
uint8_t bthome_data_beacon(void * padbuf) {
#if (DEV_SERVICES & SERVICE_THS)
padv_bthome_ns1_t p = (padv_bthome_ns1_t)padbuf;
#else
padv_bthome_ns2_t p = (padv_bthome_ns2_t)padbuf;
#endif
p->flag[0] = 0x02; // size
p->flag[1] = GAP_ADTYPE_FLAGS; // type
/* Flags:
@ -34,25 +30,42 @@ uint8_t bthome_data_beacon(void * padbuf) {
p->info = BtHomeID_Info;
p->p_id = BtHomeID_PacketId;
p->pid = (uint8)measured_data.count;
p->data.b_id = BtHomeID_battery;
p->data.battery_level = measured_data.battery;
#if (DEV_SERVICES & SERVICE_THS)
p->data.t_id = BtHomeID_temperature;
p->data.temperature = measured_data.temp; // x0.01 C
p->data.h_id = BtHomeID_humidity;
p->data.humidity = measured_data.humi; // x0.01 %
#if (DEV_SERVICES & SERVICE_RDS)
if(adv_wrk.adv_event) {
padv_bthome_evns1_t pe = (padv_bthome_evns1_t)p;
pe->data.o_id = BtHomeID_opened;
pe->data.opened = measured_data.flg.pin_input;
pe->data.c_id = BtHomeID_count32;
pe->data.counter = adv_wrk.rds_count;
pe->head.size = sizeof(adv_bthome_evns1_t) - sizeof(pe->head.size) - sizeof(pe->flag);
return sizeof(adv_bthome_ns1_t);
} else
#endif
p->data.v_id = BtHomeID_voltage;
p->data.battery_mv = measured_data.battery_mv; // x mV
#if (DEV_SERVICES & SERVICE_THS)
p->head.size = sizeof(adv_bthome_ns1_t) - sizeof(p->head.size) - sizeof(p->flag);
return sizeof(adv_bthome_ns1_t);
{
p->data.b_id = BtHomeID_battery;
p->data.battery_level = measured_data.battery;
p->data.t_id = BtHomeID_temperature;
p->data.temperature = measured_data.temp; // x0.01 C
p->data.h_id = BtHomeID_humidity;
p->data.humidity = measured_data.humi; // x0.01 %
p->data.v_id = BtHomeID_voltage;
p->data.battery_mv = measured_data.battery_mv; // x mV
p->head.size = sizeof(adv_bthome_ns1_t) - sizeof(p->head.size) - sizeof(p->flag);
return sizeof(adv_bthome_ns1_t);
}
#else
p->head.size = sizeof(adv_bthome_ns2_t) - sizeof(p->head.size) - sizeof(p->flag);
return sizeof(adv_bthome_ns2_t);
{
padv_bthome_ns2_t pe = (padv_bthome_ns2_t)p;
pe->data.b_id = BtHomeID_battery;
pe->data.battery_level = measured_data.battery;
pe->data.v_id = BtHomeID_voltage;
pe->data.battery_mv = measured_data.battery_mv; // x mV
pe->head.size = sizeof(adv_bthome_ns2_t) - sizeof(pe->head.size) - sizeof(pe->flag);
return sizeof(adv_bthome_ns2_t);
}
#endif
}

View file

@ -129,6 +129,13 @@ typedef struct __attribute__((packed)) _adv_bthome_data2_t {
uint16 battery_mv; // x 0.001 V
} adv_bthome_data2_t, * padv_bthome_data2_t;
typedef struct __attribute__((packed)) _adv_bthome_event1_t {
uint8_t o_id; // = BtHomeID_opened ?
uint8_t opened;
uint8_t c_id; // = BtHomeID_count32
uint32_t counter;
} adv_bthome_event1_t, * padv_bthome_event1_t;
#define ADV_BUFFER_SIZE (31-3)
@ -152,6 +159,17 @@ typedef struct __attribute__((packed)) _adv_bthome_ns2_t {
adv_bthome_data2_t data;
} adv_bthome_ns2_t, * padv_bthome_ns2_t;
// BTHOME event1, no security
typedef struct __attribute__((packed)) _adv_bthome_evns1_t {
uint8 flag[3]; // Advertise type flags
adv_head_bth_t head;
uint8 info; // = 0x40 BtHomeID_Info
uint8 p_id; // = BtHomeID_PacketId
uint8 pid; // PacketId (measurement count)
adv_bthome_event1_t data;
} adv_bthome_evns1_t, * padv_bthome_evns1_t;
uint8_t bthome_data_beacon(void * padbuf);
#endif /* BTHOME_BEACON_H_ */

View file

@ -21,7 +21,7 @@
#include "flash_eep.h"
#include "thb2_main.h"
#include "sbp_profile.h"
#include "sensor.h"
#include "sensors.h"
#include "cmd_parser.h"
#include "devinfoservice.h"
#include "ble_ota.h"

View file

@ -34,7 +34,7 @@
#include "thservice.h"
#include "thb2_peripheral.h"
#include "bthome_beacon.h"
#include "sensor.h"
#include "sensors.h"
#include "battery.h"
#include "sbp_profile.h"
#include "logger.h"
@ -105,9 +105,11 @@ void test_config(void) {
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;
adv_wrk.measure_interval_ms = (cfg.advertising_interval * cfg.measure_interval * 625) / 10;
}
void load_eep_config(void) {

View file

@ -13,7 +13,7 @@
// #include "bus_dev.h"
#ifndef APP_VERSION
#define APP_VERSION 0x11 // BCD
#define APP_VERSION 0x12 // BCD
#endif
/*
@ -40,24 +40,24 @@
#define DEVICE_TH05 21
#ifndef DEVICE
#define DEVICE DEVICE_TH05
#define DEVICE DEVICE_THB2
#endif
// supported services by the device (bits)
#define SERVICE_OTA 0x00000001 // есть функция OTA
#define SERVICE_OTA_EXT 0x00000002 // пока нет: есть расширенная функция OTA
#define SERVICE_PINCODE 0x00000004 // пока нет: есть установка pin-code
#define SERVICE_BINDKEY 0x00000008 // пока нет: есть шифрование
#define SERVICE_OTA_EXT 0x00000002 // пока нет // есть расширенная функция OTA
#define SERVICE_PINCODE 0x00000004 // пока нет // есть установка pin-code
#define SERVICE_BINDKEY 0x00000008 // пока нет // есть шифрование
#define SERVICE_HISTORY 0x00000010 // есть запись истории
#define SERVICE_SCREEN 0x00000020 // есть экран
#define SERVICE_LE_LR 0x00000040 // пока нет: Есть поддержка рекламы в LE Long Range
#define SERVICE_LE_LR 0x00000040 // пока нет // Есть поддержка рекламы в LE Long Range
#define SERVICE_THS 0x00000080 // есть датчик температуры и влажности
#define SERVICE_RDS 0x00000100 // пока нет: есть обслуживние геркона/счета импульсов
#define SERVICE_RDS 0x00000100 // есть обслуживние геркона/счета импульсов
#define SERVICE_KEY 0x00000200 // есть кнопка
#define SERVICE_OUTS 0x00000400 // пока нет: есть обслуживние выходных пинов
#define SERVICE_INS 0x00000800 // пока нет: есть обслуживние входных пинов
#define SERVICE_TIME_ADJUST 0x00001000 // пока нет: есть функция коррекции счета времени
#define SERVICE_HARD_CLOCK 0x00002000 // пока нет: есть реальные часы RTC
#define SERVICE_OUTS 0x00000400 // пока нет // есть обслуживние выходных пинов
#define SERVICE_INS 0x00000800 // пока нет // есть обслуживние входных пинов
#define SERVICE_TIME_ADJUST 0x00001000 // пока нет // есть функция коррекции счета времени
#define SERVICE_HARD_CLOCK 0x00002000 // пока нет // есть реальные часы RTC
#define SERVICE_TH_TRG 0x00004000 // триггер по температуре и влажности
#define OTA_TYPE_NONE 0 // нет OTA, только переключение из APP на boot прошивку
@ -87,6 +87,7 @@
| SERVICE_KEY \
| SERVICE_HISTORY \
| SERVICE_TH_TRG \
| SERVICE_RDS \
)
#endif
@ -121,6 +122,7 @@
| SERVICE_KEY \
| SERVICE_HISTORY \
| SERVICE_TH_TRG \
| SERVICE_RDS \
)
#endif
@ -158,6 +160,7 @@
| SERVICE_KEY \
| SERVICE_HISTORY \
| SERVICE_TH_TRG \
| SERVICE_RDS \
)
#endif
@ -215,7 +218,6 @@ typedef struct _cfg_t {
uint8_t batt_interval; // measure battery * seconds
uint8_t averaging_measurements; // * measure_interval, 0 - off, 1..255 * measure_interval
uint8_t reserved2;
}cfg_t;
extern cfg_t cfg;
extern const cfg_t def_cfg;
@ -229,9 +231,13 @@ 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_count;
#endif
uint8_t adv_count;
uint8_t adv_con_count;
uint8_t adv_batt;
uint8_t adv_reload_count;
uint8_t adv_batt_count;
uint8_t adv_event;
} adv_work_t;
extern adv_work_t adv_wrk;

View file

@ -12,7 +12,7 @@
#include "gpio.h"
#include "rom_sym_def.h"
#include "dev_i2c.h"
#include "sensor.h"
#include "sensors.h"
#include "lcd_th05.h"
#include "thb2_peripheral.h"

View file

@ -9,7 +9,7 @@
#include "flash.h"
#include "flash_eep.h"
#include "logger.h"
#include "sensor.h"
#include "sensors.h"
#include "cmd_parser.h"
#define RAM

View file

@ -112,19 +112,15 @@ const ioinit_cfg_t ioInit[] = {
#if DEVICE == DEVICE_THB2
{ GPIO_P00, GPIO_PULL_DOWN },
{ GPIO_P01, GPIO_PULL_DOWN },
{ GPIO_P02, GPIO_PULL_DOWN },
{ GPIO_P03, GPIO_PULL_DOWN },
{ GPIO_P07, GPIO_PULL_UP }, // KEY
#ifdef GPIO_TRG
{ GPIO_P09, GPIO_FLOATING }, // TX - GPIO_TRG
{ GPIO_P02, GPIO_FLOATING }, // TX2 - GPIO_TRG
#else
{ GPIO_P09, GPIO_PULL_UP }, // TX
#endif
#ifdef GPIO_INP
{ GPIO_P10, GPIO_FLOATING }, // RX - GPIO_INP
#else
{ GPIO_P10, GPIO_PULL_UP }, // RX
#endif
{ GPIO_P03, GPIO_PULL_DOWN },
{ GPIO_P07, GPIO_PULL_UP }, // KEY
{ GPIO_P09, GPIO_PULL_UP }, // TX
{ GPIO_P10, GPIO_PULL_UP }, // RX - GPIO_INP
{ GPIO_P11, GPIO_FLOATING }, // ADC_VBAT
{ GPIO_P14, GPIO_PULL_DOWN },
{ GPIO_P15, GPIO_PULL_DOWN },
@ -162,11 +158,7 @@ const ioinit_cfg_t ioInit[] = {
#endif
{ GPIO_P16, GPIO_PULL_DOWN },
{ GPIO_P17, GPIO_PULL_DOWN },
#ifdef GPIO_INP
{ GPIO_P18, GPIO_FLOATING }, // RX2 - GPIO_INP
#else
{ GPIO_P18, GPIO_PULL_UP }, // RX2
#endif
{ GPIO_P18, GPIO_PULL_UP }, // RX2 - GPIO_INP
#ifdef GPIO_TRG
{ GPIO_P20, GPIO_FLOATING }, // TX2 - GPIO_TRG
#else
@ -194,11 +186,7 @@ const ioinit_cfg_t ioInit[] = {
{ GPIO_P15, GPIO_PULL_DOWN },
{ GPIO_P16, GPIO_PULL_DOWN },
{ GPIO_P17, GPIO_PULL_DOWN },
#ifdef GPIO_INP
{ GPIO_P18, GPIO_FLOATING }, // RX2 - GPIO_INP
#else
{ GPIO_P18, GPIO_PULL_UP }, // RX2
#endif
{ GPIO_P18, GPIO_PULL_UP }, // RX2 - GPIO_INP
#ifdef GPIO_TRG
{ GPIO_P20, GPIO_FLOATING }, // TX2 - GPIO_TRG
#else

View file

@ -27,7 +27,7 @@
#include "logger.h"
#include "hci.h"
#include "lcd_th05.h"
#include "sensor.h"
#include "sensors.h"
/*********************************************************************
* MACROS
@ -477,9 +477,23 @@ static void measureNotifyCB( linkDBItem_t* pLinkItem )
{
attHandleValueNoti_t noti;
noti.handle = simpleProfileAttrTbl[CDM_DATA_ATTR_IDX].handle;;
noti.len = send_len_measured_data + 1;
#if (DEV_SERVICES & SERVICE_RDS)
noti.len = send_len_measured_data + 1 + 4 + 4;
#else
noti.len = send_len_measured_data + 1 + 4;
#endif
noti.value[0] = CMD_ID_MEASURE;
memcpy(&noti.value[1], &measured_data, send_len_measured_data);
noti.value[send_len_measured_data + 1] = clkt.utc_time_sec & 0xff;
noti.value[send_len_measured_data + 2] = (clkt.utc_time_sec >> 8) & 0xff;
noti.value[send_len_measured_data + 3] = (clkt.utc_time_sec >> 16) & 0xff;
noti.value[send_len_measured_data + 4] = (clkt.utc_time_sec >> 24) & 0xff;
#if (DEV_SERVICES & SERVICE_RDS)
noti.value[send_len_measured_data + 5] = adv_wrk.rds_count & 0xff;
noti.value[send_len_measured_data + 6] = (adv_wrk.rds_count >> 8) & 0xff;
noti.value[send_len_measured_data + 7] = (adv_wrk.rds_count >> 16) & 0xff;
noti.value[send_len_measured_data + 8] = (adv_wrk.rds_count >> 24) & 0xff;
#endif
GATT_Notification( pLinkItem->connectionHandle, &noti, FALSE );
}
}

View file

@ -1,197 +0,0 @@
/*
sensor.h
Author: pvvx
*/
#ifndef _SENSORS_H_
#define _SENSORS_H_
#include "config.h"
#if (DEV_SERVICES & SERVICE_THS)
// Timing
#define SENSOR_POWER_TIMEOUT_ms 3
#define SENSOR_RESET_TIMEOUT_ms 3
#define SENSOR_MEASURING_TIMEOUT_ms 7
#define CHT83xx_I2C_ADDR 0x40
#define CHT83xx_REG_TMP 0x00
#define CHT83xx_REG_HMD 0x01
#define CHT83xx_REG_MID 0xfe
#define CHT83xx_REG_VID 0xff
#define CHT83xx_MID 0x5959
/* CHT8310 https://github.com/pvvx/pvvx.github.io/blob/master/THB2/CHT8310.Advanced.Datasheet_Ver1.0.20230407.pdf */
// I2C addres
#define CHT8215_I2C_ADDR0 0x40
#define CHT8215_I2C_ADDR1 0x44
#define CHT8215_I2C_ADDR2 0x48
#define CHT8215_I2C_ADDR3 0x4C
// Registers
#define CHT8215_REG_TMP 0x00
#define CHT8215_REG_HMD 0x01
#define CHT8215_REG_STA 0x02
#define CHT8215_REG_CFG 0x03
#define CHT8215_REG_CRT 0x04
#define CHT8215_REG_TLL 0x05
#define CHT8215_REG_TLM 0x06
#define CHT8215_REG_HLL 0x07
#define CHT8215_REG_HLM 0x08
#define CHT8215_REG_OST 0x0f
#define CHT8215_REG_RST 0xfc
#define CHT8215_REG_MID 0xfe
#define CHT8215_REG_VID 0xff
// Status register mask
#define CHT8215_STA_BUSY 0x8000
#define CHT8215_STA_THI 0x4000
#define CHT8215_STA_TLO 0x2000
#define CHT8215_STA_HHI 0x1000
#define CHT8215_STA_HLO 0x0800
// Config register mask
#define CHT8215_CFG_MASK 0x8000
#define CHT8215_CFG_SD 0x4000
#define CHT8215_CFG_ALTH 0x2000
#define CHT8215_CFG_EM 0x1000
#define CHT8215_CFG_EHT 0x0100
#define CHT8215_CFG_TME 0x0080
#define CHT8215_CFG_POL 0x0020
#define CHT8215_CFG_ALT 0x0018
#define CHT8215_CFG_CONSEC_FQ 0x0006
#define CHT8215_CFG_ATM 0x0001
#define CHT8315_MID 0x5959
#define CHT8215_VID 0x1582
/* CHT8305 https://github.com/pvvx/pvvx.github.io/blob/master/BTH01/CHT8305.pdf */
// I2C addres
#define CHT8305_I2C_ADDR0 0x40
#define CHT8305_I2C_ADDR1 0x41
#define CHT8305_I2C_ADDR2 0x42
#define CHT8305_I2C_ADDR3 0x43
#define CHT8305_I2C_ADDR_MAX 0x43
// Registers
#define CHT8305_REG_TMP 0x00
#define CHT8305_REG_HMD 0x01
#define CHT8305_REG_CFG 0x02
#define CHT8305_REG_ALR 0x03
#define CHT8305_REG_VLT 0x04
#define CHT8305_REG_MID 0xfe
#define CHT8305_REG_VID 0xff
// Config register mask
#define CHT8305_CFG_SOFT_RESET 0x8000
#define CHT8305_CFG_CLOCK_STRETCH 0x4000
#define CHT8305_CFG_HEATER 0x2000
#define CHT8305_CFG_MODE 0x1000
#define CHT8305_CFG_VCCS 0x0800
#define CHT8305_CFG_TEMP_RES 0x0400
#define CHT8305_CFG_HUMI_RES 0x0300
#define CHT8305_CFG_ALERT_MODE 0x00C0
#define CHT8305_CFG_ALERT_PENDING 0x0020
#define CHT8305_CFG_ALERT_HUMI 0x0010
#define CHT8305_CFG_ALERT_TEMP 0x0008
#define CHT8305_CFG_VCC_ENABLE 0x0004
#define CHT8305_CFG_RESERVED 0x0003
/*
struct __attribute__((packed)) _cht8305_config_t{
uint16_t reserved : 2;
uint16_t vccen : 1;
uint16_t talt : 1;
uint16_t halt : 1;
uint16_t aps : 1;
uint16_t altm : 2;
uint16_t h_res : 2;
uint16_t t_res : 1;
uint16_t vccs : 1;
uint16_t mode : 1;
uint16_t heater : 1;
uint16_t clkstr : 1;
uint16_t srst : 1;
} cht8305_config_t;
*/
#define CHT8305_MID 0x5959
#define CHT8305_VID 0x0583
/*---------------------------------------
Датчик влажности AHT25
---------------------------------------*/
#define AHT2x_I2C_ADDR 0x38
#define AHT2x_CMD_INI 0x0E1 // Initialization Command
#define AHT2x_CMD_TMS 0x0AC // Trigger Measurement Command
#define AHT2x_DATA_TMS 0x3300 // Trigger Measurement data
#define AHT2x_CMD_RST 0x0BA // Soft Reset Command
typedef struct __attribute__((packed)) _measured_flg_t {
uint8_t pin_input : 1; // GPIO_INP input pin
uint8_t trg_output : 1; // GPIO_TRG pin output value
uint8_t comfort : 1; // Temperature or Humidity comfort
uint8_t trg_on : 1; // Temperature or Humidity trigger on
uint8_t temp_trg_on : 1; // Temperature trigger on
uint8_t humi_trg_on : 1; // Humidity trigger on
} measured_flg_t;
typedef struct _measured_data_t {
uint16_t count;
int16_t temp; // x 0.01 C
int16_t humi; // x 0.01 %
uint16_t battery_mv; // mV
uint8_t battery; // 0..100 %
measured_flg_t flg;
} measured_data_t;
#define send_len_measured_data 10
extern measured_data_t measured_data;
typedef struct _thsensor_coef_t {
uint32_t temp_k;
uint32_t humi_k;
int16_t temp_z;
int16_t humi_z;
} thsensor_coef_t;
typedef int (*psernsor_rd_t)(void);
//typedef void (*psernsor_sm_t)(void);
typedef struct _thsensor_cfg_t {
thsensor_coef_t coef;
uint16_t mid;
uint16_t vid;
uint8_t i2c_addr;
psernsor_rd_t read_sensor;
// psernsor_sm_t start_measure;
} thsensor_cfg_t;
extern thsensor_cfg_t thsensor_cfg;
#define thsensor_cfg_send_size 19
void init_sensor(void);
void start_measure(void);
int read_sensor(void);
#else // (DEV_SERVICES & SERVICE_THS)
typedef struct _measured_data_t {
uint16_t count;
// int16_t temp; // x 0.01 C
// int16_t humi; // x 0.01 %
uint16_t battery_mv; // mV
uint8_t battery; // 0..100 %
} measured_data_t;
extern measured_data_t measured_data;
#endif // (DEV_SERVICES & SERVICE_THS)
#endif // _SENSORS_H_

View file

@ -4,7 +4,7 @@
*/
#include "config.h"
#include "sensor.h"
#include "sensors.h"
measured_data_t measured_data;

View file

@ -1,5 +1,5 @@
/*
sensors.h
sensor.h
Author: pvvx
*/
@ -66,7 +66,7 @@
#define CHT8215_CFG_CONSEC_FQ 0x0006
#define CHT8215_CFG_ATM 0x0001
#define CHT8215_MID 0x5959
#define CHT8315_MID 0x5959
#define CHT8215_VID 0x1582
/* CHT8305 https://github.com/pvvx/pvvx.github.io/blob/master/BTH01/CHT8305.pdf */
@ -133,15 +133,25 @@ struct __attribute__((packed)) _cht8305_config_t{
#define AHT2x_DATA_TMS 0x3300 // Trigger Measurement data
#define AHT2x_CMD_RST 0x0BA // Soft Reset Command
typedef struct __attribute__((packed)) _measured_flg_t {
uint8_t pin_input : 1; // GPIO_INP input pin
uint8_t trg_output : 1; // GPIO_TRG pin output value
uint8_t comfort : 1; // Temperature or Humidity comfort
uint8_t trg_on : 1; // Temperature or Humidity trigger on
uint8_t temp_trg_on : 1; // Temperature trigger on
uint8_t humi_trg_on : 1; // Humidity trigger on
} measured_flg_t;
typedef struct _measured_data_t {
uint16_t count;
int16_t temp; // x 0.01 C
int16_t humi; // x 0.01 %
uint16_t battery_mv; // mV
uint8_t battery; // 0..100 %
uint8_t battery; // 0..100 %
measured_flg_t flg;
} measured_data_t;
#define send_len_measured_data 9
#define send_len_measured_data 10
extern measured_data_t measured_data;
typedef struct _thsensor_coef_t {

View file

@ -38,7 +38,7 @@
#include "thservice.h"
#include "thb2_peripheral.h"
#include "bthome_beacon.h"
#include "sensor.h"
#include "sensors.h"
#include "battery.h"
#include "sbp_profile.h"
#include "ble_ota.h"
@ -213,14 +213,17 @@ static void set_adv_interval(uint16_t advInt)
static void adv_measure(void) {
if(gapRole_AdvEnabled) {
get_utc_time_sec(); // счет UTC timestamp
#if (DEV_SERVICES & SERVICE_RDS)
if(!adv_wrk.adv_event) {
#endif
if(clkt.utc_time_tik - adv_wrk.measure_batt_tik >= ((uint32_t)cfg.batt_interval << 15)) {
adv_wrk.measure_batt_tik = clkt.utc_time_tik;
batt_start_measure();
#if ((DEV_SERVICES & SERVICE_THS) == 0)
adv_wrk.adv_batt = 1;
adv_wrk.adv_batt_count = 1;
} else {
if(adv_wrk.adv_batt) {
adv_wrk.adv_batt = 0;
if(adv_wrk.adv_batt_count) {
adv_wrk.adv_batt_count = 0;
#if (DEV_SERVICES & SERVICE_SCREEN)
chow_lcd(1);
#endif
@ -261,15 +264,22 @@ static void adv_measure(void) {
#endif
}
}
#endif // (DEV_SERVICES & SERVICE_THS)
if(adv_wrk.adv_con_count) {
if(--adv_wrk.adv_con_count == 0) {
#if (DEV_SERVICES & SERVICE_RDS)
}
#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) {
adv_wrk.adv_event = 0;
measured_data.count++;
LL_SetAdvData(bthome_data_beacon((void *) gapRole_AdvertData), gapRole_AdvertData);
}
set_new_adv_interval(cfg.advertising_interval * 100);
}
}
@ -277,7 +287,7 @@ static void adv_measure(void) {
}
}
#if (DEV_SERVICES & SERVICE_KEY)
#if (DEV_SERVICES & SERVICE_KEY) || (DEV_SERVICES & SERVICE_RDS)
/*********************************************************************
* LED and Key
*/
@ -287,13 +297,22 @@ 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(pin == GPIO_KEY) {
#ifdef GPIO_LED
hal_gpio_write(GPIO_LED, LED_OFF);
hal_gpio_write(GPIO_LED, LED_OFF);
#endif
if(gapRole_AdvEnabled) {
adv_wrk.adv_con_count = 60000/DEF_CON_ADV_INERVAL_MS; // 60 sec
set_new_adv_interval(DEF_CON_ADV_INERVAL); // actual time = advInt * 625us
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_RDS)
if(pin == GPIO_INP) {
osal_set_event(simpleBLEPeripheral_TaskID, PIN_INPYT_EVT);
}
#endif
}
else
{
@ -307,8 +326,17 @@ 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(pin == GPIO_KEY) {
#ifdef GPIO_LED
hal_gpio_write(GPIO_LED, LED_ON);
hal_gpio_write(GPIO_LED, LED_ON);
#endif
}
#endif
#if (DEV_SERVICES & SERVICE_RDS)
if(pin == GPIO_INP) {
osal_set_event(simpleBLEPeripheral_TaskID, PIN_INPYT_EVT);
}
#endif
}
else
@ -327,6 +355,9 @@ static void init_app_gpio(void)
hal_gpio_write(GPIO_LED, LED_ON);
hal_gpioretention_register(GPIO_LED);//enable this pin retention
#endif
#if (DEV_SERVICES & SERVICE_RDS)
hal_gpioin_register(GPIO_INP, posedge_int_wakeup_cb, negedge_int_wakeup_cb);
#endif
#ifdef GPIO_LPWR // питание LCD драйвера
hal_gpio_write(GPIO_LPWR, 1);
hal_gpioretention_register(GPIO_LPWR);//enable this pin retention
@ -457,11 +488,11 @@ void SimpleBLEPeripheral_Init( uint8_t task_id )
// Set advertising interval
#if defined(OTA_TYPE) && OTA_TYPE == OTA_TYPE_BOOT
if (wrk.boot_flg == BOOT_FLG_OTA) {
adv_wrk.adv_con_count = 60000/DEF_OTA_ADV_INERVAL_MS; // 60 sec
adv_wrk.adv_reload_count = 60000/DEF_OTA_ADV_INERVAL_MS; // 60 sec
set_adv_interval(DEF_CON_ADV_INERVAL); // actual time = advInt * 625us
} else
#endif
set_adv_interval(DEF_ADV_INERVAL); // actual time = advInt * 625us
set_adv_interval(cfg.advertising_interval * 100); // actual time = advInt * 625us
HCI_PPLUS_AdvEventDoneNoticeCmd(simpleBLEPeripheral_TaskID, ADV_BROADCAST_EVT);
#if (DEF_GAPBOND_MGR_ENABLE==1)
@ -633,6 +664,35 @@ 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(events & PIN_INPYT_EVT) {
int ev = 0;
if(hal_gpio_read(GPIO_INP)) {
if(!measured_data.flg.pin_input) {
adv_wrk.rds_count++;
ev = 1;
}
measured_data.flg.pin_input = 1;
} else {
if(measured_data.flg.pin_input)
ev = 1;
measured_data.flg.pin_input = 0;
}
if(ev) {
if(gapRole_AdvEnabled) {
measured_data.count++;
adv_wrk.adv_event = 1;
adv_wrk.adv_reload_count = 5;
LL_SetAdvData(bthome_data_beacon((void *) gapRole_AdvertData), gapRole_AdvertData);
set_new_adv_interval(DEF_EVENT_ADV_INERVAL); // actual time * 625us
} else if(cfg.flg & FLG_MEAS_NOTIFY) {
get_utc_time_sec(); // счет UTC timestamp
measure_notify();
}
}
return(events ^ PIN_INPYT_EVT);
}
#endif
#if (DEV_SERVICES & SERVICE_HISTORY)
if(events & WRK_NOTIFY_EVT) {
LOG("Wrk notify events\n");
@ -726,7 +786,7 @@ static void peripheralStateReadRssiCB( int8_t rssi )
case GAPROLE_CONNECTED:
adv_wrk.adv_count = 0;
adv_wrk.adv_con_count = 0;
adv_wrk.adv_reload_count = 0;
#if (DEV_SERVICES & SERVICE_THS)
osal_start_reload_timer(simpleBLEPeripheral_TaskID, TIMER_BATT_EVT, adv_wrk.measure_interval_ms); // 10000 ms
#else
@ -750,7 +810,7 @@ static void peripheralStateReadRssiCB( int8_t rssi )
bthome_data_beacon((void *) gapRole_AdvertData);
gapRole_SlaveLatency = periConnParameters.latency = cfg.connect_latency;
adv_wrk.adv_count = 0;
adv_wrk.adv_con_count = 1;
adv_wrk.adv_reload_count = 1;
#if (DEV_SERVICES & SERVICE_SCREEN)
show_ble_symbol(0);
update_lcd();

View file

@ -28,6 +28,8 @@ 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
#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
@ -52,6 +54,7 @@ extern "C"
#define BATT_VALUE_EVT 0x0010 // Event for battery voltage value update
#define ADV_BROADCAST_EVT 0x0020 // Advent. Event Done Notice
#define WRK_NOTIFY_EVT 0x0040 // work notify
#define PIN_INPYT_EVT 0x0080 // pin input event
/*********************************************************************
* MACROS

View file

@ -20,7 +20,7 @@
//#include "hiddev.h"
#include "thservice.h"
#include "sensor.h"
#include "sensors.h"
/*********************************************************************
MACROS
*/

View file

@ -9,7 +9,7 @@
#include "flash.h"
#include "flash_eep.h"
#include "logger.h"
#include "sensor.h"
#include "sensors.h"
#include "cmd_parser.h"
#include "trigger.h"