alfa-beta v1.3

This commit is contained in:
pvvx 2024-02-15 22:34:39 +03:00
parent 6da2a73474
commit 98afcbad6d
39 changed files with 21546 additions and 8822 deletions

View file

@ -1,7 +1,7 @@
# BTHome THB2, BTH01, TH-05
Custom firmware for Tuya [THB2](https://pvvx.github.io/THB2), [BTH01](https://pvvx.github.io/BTH01/), [TH05_V1.4](https://pvvx.github.io/TH-05).
Custom firmware for Tuya [THB2](https://pvvx.github.io/THB2), [THB1](https://pvvx.github.io/THB1), [BTH01](https://pvvx.github.io/BTH01/), [TH05_V1.4](https://pvvx.github.io/TH-05).
* Тестовый [PHY62x2BTHome.html](https://pvvx.github.io/THB2/web/PHY62x2BTHome.html)
* Программа для настройки и BLE OTA [PHY62x2BTHome.html](https://pvvx.github.io/THB2/web/PHY62x2BTHome.html)
Прошивка Boot-OTA для THB2 (файл bin\BOOT_THB2_v12.hex).
@ -9,6 +9,11 @@ Custom firmware for Tuya [THB2](https://pvvx.github.io/THB2), [BTH01](https://pv
Прошивка Boot-OTA для TH05 (файл bin\BOOT_TH05_v12.hex) для версий указанных на печатной плате: TH05_V1.4, TH05_V1.5, TH05_V1.6 с чипом BL55028
Boot-OTA для THB1 (файл bin\BOOT_BTH1_v13.hex)
Тестовые версии 1.3 пока не рекомендуются к установке (!)
## Основные характеристики:
! ри настройках по умолчанию_ !
@ -31,6 +36,8 @@ Custom firmware for Tuya [THB2](https://pvvx.github.io/THB2), [BTH01](https://pv
| 1.0 | Первая релизная версия |
| 1.1 | Добавлен триггер - вывод TX2 срабатывающий по установленным значениям температуры и/или влажности с гистерезисами. Передача состояния вывода RX2 при connect. Для термометров с экраном добавлен показ смайлика с "комфортом". Дополнены: изменение имени и MAC устройства. |
| 1.2 | Обработка и передача событий open/close со счетчиком с вывода маркированного "RX2" (для THB2 - "RX1"). |
| 1.3Beta | Добавление теста THB1. Следующий этап уменьшения потребления для версий с LCD дисплеем и опция отключения дисплея. |
## Прошивка:

File diff suppressed because it is too large Load diff

3054
bin/BOOT_BTH01_v13.hex Normal file

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

3119
bin/BOOT_TH05_v13.hex Normal file

File diff suppressed because it is too large Load diff

3116
bin/BOOT_THB1_v13.hex Normal file

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

3051
bin/BOOT_THB2_v13.hex Normal file

File diff suppressed because it is too large Load diff

Binary file not shown.

BIN
bin/BTH01_v13.bin Normal file

Binary file not shown.

Binary file not shown.

BIN
bin/TH05_v13.bin Normal file

Binary file not shown.

Binary file not shown.

BIN
bin/THB2_v13.bin Normal file

Binary file not shown.

View file

@ -24,6 +24,7 @@ SRC_PRJ += thb2_peripheral.c
SRC_PRJ += thservice.c
SRC_PRJ += flash_eep.c
SRC_PRJ += lcd_th05.c
SRC_PRJ += lcd_thb1.c
SRC_PRJ += ble_ota.c
SRC_PRJ += logger.c

View file

@ -105,8 +105,8 @@ extern void WaitRTCCount(uint32_t rtcDelyCnt);
extern int clk_spif_ref_clk(sysclk_t spif_ref_sel);
extern uint32_t getMcuPrecisionCount(void);
#define CHIP_RFEQ_OFF_FLASH_ADDRESS 0x11001e08
#define CHIP_XTAK_CAP_FLASH_ADDRESS 0x11001e0c
#define CHIP_RFEQ_OFF_FLASH_ADDRESS 0x11001e08 // было 0x11004008
#define CHIP_XTAK_CAP_FLASH_ADDRESS 0x11001e0c // было 0x1100400c
void hal_rfPhyFreqOff_Set(void);
void hal_xtal16m_cap_Set(void);

View file

@ -662,8 +662,8 @@ int hal_gpioretention_register(gpio_pin_e pin)
return PPlus_ERR_NOT_SUPPORTED;
#endif
hal_gpio_pin_init(pin, GPIO_OUTPUT);
m_gpioCtx.pin_assignments[pin] = GPIO_PIN_ASSI_OUT;
hal_gpio_pin_init(pin, GPIO_OUTPUT);
m_gpioCtx.pin_assignments[pin] = GPIO_PIN_ASSI_OUT;
m_gpioCtx.pin_retention_status |= BIT(pin);
return PPlus_SUCCESS;

View file

@ -2,7 +2,7 @@
patch.c
SDK_LICENSE
MIN_SLEEP_TIME
************************************************************/
#include <stdlib.h>
@ -7893,24 +7893,24 @@ void init_config(void)
//--------------------------------------------------------------------
JUMP_FUNCTION(LL_HW_GO) = (uint32_t)&ll_hw_go1;
JUMP_FUNCTION(V4_IRQ_HANDLER) = (uint32_t)&LL_IRQHandler1;
//JUMP_FUNCTION(V11_IRQ_HANDLER) = (uint32_t)&hal_UART0_IRQHandler;
//JUMP_FUNCTION(V11_IRQ_HANDLER) = (uint32_t)&hal_UART0_IRQHandler;
extern void rf_calibrate1(void);
JUMP_FUNCTION(RF_CALIBRATTE) = (uint32_t)&rf_calibrate1;
JUMP_FUNCTION(RF_PHY_CHANGE) = (uint32_t)&rf_phy_change_cfg0;
//JUMP_FUNCTION(LL_GEN_TRUE_RANDOM) = (uint32_t)&LL_ENC_GenerateTrueRandNum1;
//JUMP_FUNCTION(LL_GEN_TRUE_RANDOM) = (uint32_t)&LL_ENC_GenerateTrueRandNum1;
JUMP_FUNCTION(LL_AES128_ENCRYPT) = (uint32_t)&LL_ENC_AES128_Encrypt1;
JUMP_FUNCTION(LL_ENC_ENCRYPT) = (uint32_t)&LL_ENC_Encrypt1;
JUMP_FUNCTION(LL_ENC_DECRYPT) = (uint32_t)&LL_ENC_Decrypt1;
//JUMP_FUNCTION(LL_PROCESS_SLAVE_CTRL_PROC) = (uint32_t)&llProcessSlaveControlProcedures1;
//JUMP_FUNCTION(LL_PROCESS_TX_DATA) = (uint32_t)&llProcessTxData1;
//JUMP_FUNCTION(OSAL_POWER_CONSERVE) = (uint32_t)&osal_pwrmgr_powerconserve1;
//JUMP_FUNCTION(ENTER_SLEEP_OFF_MODE) = (uint32_t)&enter_sleep_off_mode1;
//JUMP_FUNCTION(ENTER_SLEEP_PROCESS) = (uint32_t)&enterSleepProcess1;
//JUMP_FUNCTION(OSAL_POWER_CONSERVE) = (uint32_t)&osal_pwrmgr_powerconserve1;
//JUMP_FUNCTION(ENTER_SLEEP_OFF_MODE) = (uint32_t)&enter_sleep_off_mode1;
//JUMP_FUNCTION(ENTER_SLEEP_PROCESS) = (uint32_t)&enterSleepProcess1;
JUMP_FUNCTION(CONFIG_RTC) = (uint32_t)&config_RTC1;
//JUMP_FUNCTION(V20_IRQ_HANDLER) = (uint32_t)&TIM1_IRQHandler1;
// JUMP_FUNCTION(LL_SCHEDULER) = (uint32_t)&ll_scheduler1;
//JUMP_FUNCTION(HAL_DRV_IRQ_ENABLE) = (uint32_t)&drv_enable_irq1;
//JUMP_FUNCTION(HAL_DRV_IRQ_DISABLE) = (uint32_t)&drv_disable_irq1;
//JUMP_FUNCTION(V20_IRQ_HANDLER) = (uint32_t)&TIM1_IRQHandler1;
// JUMP_FUNCTION(LL_SCHEDULER) = (uint32_t)&ll_scheduler1;
//JUMP_FUNCTION(HAL_DRV_IRQ_ENABLE) = (uint32_t)&drv_enable_irq1;
//JUMP_FUNCTION(HAL_DRV_IRQ_DISABLE) = (uint32_t)&drv_disable_irq1;
JUMP_FUNCTION(WAKEUP_INIT) = (uint32_t)&wakeup_init1;
JUMP_FUNCTION(WAKEUP_PROCESS) = (uint32_t)&wakeupProcess1;
extern void l2capPocessFragmentTxData(uint16 connHandle);
@ -7925,7 +7925,7 @@ void init_config(void)
#endif
JUMP_FUNCTION(LL_PROCESS_TX_DATA) = (uint32_t)&llProcessTxData1;
JUMP_FUNCTION(LL_GENERATE_TX_BUFFER) = (uint32_t)&ll_generateTxBuffer1;
JUMP_FUNCTION(LL_ADP_ADJ_NEXT_TIME) = (uint32_t)&ll_adptive_adj_next_time1;
JUMP_FUNCTION(LL_ADP_ADJ_NEXT_TIME) = (uint32_t)&ll_adptive_adj_next_time1;
JUMP_FUNCTION(LL_CONN_TERMINATE) = (uint32_t)&llConnTerminate1;
JUMP_FUNCTION(LL_SET_DEFAULT_CONN_PARAM) = (uint32_t)&LL_set_default_conn_params1;
// ====================
@ -7938,8 +7938,8 @@ void init_config(void)
void ll_patch_slave(void)
{
JUMP_FUNCTION(LL_SET_ADV_PARAM) = (uint32_t)&LL_SetAdvParam1;
JUMP_FUNCTION(LL_CALC_MAX_SCAN_TIME) = (uint32_t)&llCalcMaxScanTime1;
JUMP_FUNCTION(LL_SEC_ADV_ALLOW) = (uint32_t)&llSecAdvAllow1;
JUMP_FUNCTION(LL_CALC_MAX_SCAN_TIME) = (uint32_t)&llCalcMaxScanTime1;
JUMP_FUNCTION(LL_SEC_ADV_ALLOW) = (uint32_t)&llSecAdvAllow1;
JUMP_FUNCTION(LL_SET_ADV_CONTROL) = (uint32_t)&LL_SetAdvControl1;
JUMP_FUNCTION(LL_SETUP_SEC_ADV_ENTRY) = (uint32_t)&llSetupSecAdvEvt1;
JUMP_FUNCTION(LL_SCHEDULER) = (uint32_t)&ll_scheduler2;
@ -7950,11 +7950,11 @@ void ll_patch_master(void)
{
JUMP_FUNCTION(LL_SET_ADV_PARAM) = (uint32_t)&LL_SetAdvParam1;
JUMP_FUNCTION(LL_SET_ADV_CONTROL) = (uint32_t)&LL_SetAdvControl1;
JUMP_FUNCTION(LL_MASTER_EVT_ENDOK) = (uint32_t)&llMasterEvt_TaskEndOk1;
JUMP_FUNCTION(LL_SET_SCAN_PARAM) = (uint32_t)&LL_SetScanParam1;
JUMP_FUNCTION(LL_SET_SCAN_CTRL) = (uint32_t)&LL_SetScanControl1;
JUMP_FUNCTION(LL_MASTER_EVT_ENDOK) = (uint32_t)&llMasterEvt_TaskEndOk1;
JUMP_FUNCTION(LL_SET_SCAN_PARAM) = (uint32_t)&LL_SetScanParam1;
JUMP_FUNCTION(LL_SET_SCAN_CTRL) = (uint32_t)&LL_SetScanControl1;
#if USE_CODED_PHY
JUMP_FUNCTION(LL_PROCESS_MASTER_CTRL_PKT) = (uint32_t)&llProcessMasterControlPacket1;
JUMP_FUNCTION(LL_PROCESS_MASTER_CTRL_PKT) = (uint32_t)&llProcessMasterControlPacket1;
#endif
JUMP_FUNCTION(LL_CREATE_CONN) = (uint32_t)&LL_CreateConn1;
JUMP_FUNCTION(LL_START_ENCRYPT) = (uint32_t)&LL_StartEncrypt1;

View file

@ -1,5 +1,5 @@
@set PATH=D:\MCU\GNU_Tools_ARM_Embedded\13.2.rel1\bin;%PATH%
@set SWVER=_v12
@set SWVER=_v13
@del /Q "build\THB2%SWVER%.hex"
@del /Q "build\THB2%SWVER%.bin"
@mkdir .\bin
@ -34,6 +34,10 @@
@make -s -j PROJECT_NAME=BOOT_TH05%SWVER% BOOT_OTA=1 POJECT_DEF="-DDEVICE=DEVICE_TH05"
@if not exist "build\BOOT_TH05%SWVER%.hex" goto :error
@copy "build\BOOT_TH05%SWVER%.hex" .\bin
@make -s clean
@make -s -j PROJECT_NAME=BOOT_THB1%SWVER% BOOT_OTA=1 POJECT_DEF="-DDEVICE=DEVICE_THB1"
@if not exist "build\BOOT_THB1%SWVER%.hex" goto :error
@copy "build\BOOT_THB1%SWVER%.hex" .\bin
@exit
:error
@echo "Error!"

View file

@ -10,13 +10,14 @@
#include "pwrmgr.h"
#include "jump_function.h"
#include "sensors.h"
/*
#ifndef ADC_PIN
#define ADC_PIN GPIO_P11
#endif
#ifndef ADC_CHL
#define ADC_CHL ADC_CH1N_P11
#ifndef ADC_VBAT_CHL
#define ADC_VBAT_CHL ADC_CH1N_P11
#endif
*/
#define MIN_ADC_CH 2
static void init_adc_batt(void);
@ -26,10 +27,14 @@ void __attribute__((used)) hal_ADC_IRQHandler(void) {
//int status = AP_ADCC->intr_status;
AP_ADCC->intr_mask = 0; // MASK coresponding channel
for (i = 0; i < (MAX_ADC_SAMPLE_SIZE - 2); i++) {
adc_sum +=
(uint16_t) (read_reg(
ADC_CH_BASE + ((ADC_CH1N_P11+1) * 0x80) + ((i+2) * 4))
& 0xfff);
adc_sum += (uint16_t) (read_reg(ADC_CH_BASE
+ (
#if (ADC_VBAT_CHL & 1)
(ADC_VBAT_CHL-1)
#else
(ADC_VBAT_CHL+1)
#endif
* 0x80) + ((i+2) * 4)) & 0xfff);
}
AP_ADCC->intr_clear = 0x1FF;
// stop_adc_batt
@ -82,14 +87,46 @@ void batt_start_measure(void) {
// start_adc_bat
hal_pwrmgr_lock(MOD_ADCC);
JUMP_FUNCTION(ADCC_IRQ_HANDLER) = (uint32_t) &hal_ADC_IRQHandler;
#if ADC_VBAT_CHL == VBAT_ADC_P11
AP_PCRM->ADC_CTL1 |= BIT(20);
#elif ADC_VBAT_CHL == VBAT_ADC_P23
AP_PCRM->ADC_CTL1 |= BIT(4);
#elif ADC_VBAT_CHL == VBAT_ADC_P24
AP_PCRM->ADC_CTL2 |= BIT(20);
#elif ADC_VBAT_CHL == VBAT_ADC_P14
AP_PCRM->ADC_CTL2 |= BIT(4);
#elif ADC_VBAT_CHL == VBAT_ADC_P15
AP_PCRM->ADC_CTL3 |= BIT(20);
#elif ADC_VBAT_CHL == VBAT_ADC_P20
AP_PCRM->ADC_CTL3 |= BIT(4);
#endif
AP_PCRM->ANA_CTL |= BIT(3); //ENABLE_ADC;
AP_PCRM->ANA_CTL |= BIT(0); //new
NVIC_SetPriority((IRQn_Type) ADCC_IRQn, IRQ_PRIO_HAL);
NVIC_EnableIRQ((IRQn_Type) ADCC_IRQn); //ADC_IRQ_ENABLE;
AP_ADCC->intr_mask = BIT(ADC_CHL + 1); //ENABLE_ADC_INT;
#if (ADC_VBAT_CHL & 1)
AP_ADCC->intr_mask = BIT(ADC_VBAT_CHL - 1); // ENABLE_ADC_INT;
#else
AP_ADCC->intr_mask = BIT(ADC_VBAT_CHL + 1); // ENABLE_ADC_INT;
#endif
#if 0
#if ADC_VBAT_CHL == VBAT_ADC_P11
AP_ADCC->intr_mask = BIT(ADC_VBAT_CHL + 1); // ENABLE_ADC_INT;
#elif ADC_VBAT_CHL == VBAT_ADC_P23
AP_ADCC->intr_mask = BIT(ADC_VBAT_CHL - 1); // ENABLE_ADC_INT;
#elif ADC_VBAT_CHL == VBAT_ADC_P24
AP_ADCC->intr_mask = BIT(ADC_VBAT_CHL + 1); // ENABLE_ADC_INT;
#elif ADC_VBAT_CHL == VBAT_ADC_P14
AP_ADCC->intr_mask = BIT(ADC_VBAT_CHL - 1); // ENABLE_ADC_INT;
#elif ADC_VBAT_CHL == VBAT_ADC_P15
AP_ADCC->intr_mask = BIT(ADC_VBAT_CHL + 1); // ENABLE_ADC_INT;
#elif ADC_VBAT_CHL == VBAT_ADC_P20
AP_ADCC->intr_mask = BIT(ADC_VBAT_CHL - 1); // ENABLE_ADC_INT;
#endif
#endif
}
static void init_adc_batt(void) {
@ -114,7 +151,7 @@ static void init_adc_batt(void) {
// AP_PCRM->ADC_CTL4 |= BIT(4); // mannual mode
AP_PCRM->ADC_CTL4 &= ~BIT(4); //enable auto mode
AP_PCRM->ADC_CTL4 |= BIT(0);
AP_AON->PMCTL2_1 = BIT((ADC_CHL - MIN_ADC_CH) + 8);
AP_AON->PMCTL2_1 = BIT((ADC_VBAT_CHL - MIN_ADC_CH) + 8);
AP_PCRM->ADC_CTL0 &= ~(BIT(20) | BIT(4));
AP_PCRM->ADC_CTL1 &= ~(BIT(20) | BIT(4));
AP_PCRM->ADC_CTL2 &= ~(BIT(20) | BIT(4));

View file

@ -8,6 +8,13 @@
#define BATT_TIMER_MEASURE_INTERVAL 3*60*1000 // 3 minute interval
#define VBAT_ADC_P11 2
#define VBAT_ADC_P23 3
#define VBAT_ADC_P24 4
#define VBAT_ADC_P14 5
#define VBAT_ADC_P15 6
#define VBAT_ADC_P20 7
void batt_start_measure(void);
#endif

View file

@ -1,162 +0,0 @@
/*
* cmd_parcer.c
*
* Created on: 16 янв. 2024 г.
* Author: pvvx
*/
/*********************************************************************
INCLUDES
*/
#include "bcomdef.h"
#include "config.h"
#include "OSAL.h"
#include "linkdb.h"
#include "att.h"
#include "gatt.h"
#include "gatt_uuid.h"
#include "gattservapp.h"
#include "gapbondmgr.h"
#include "flash.h"
#include "flash_eep.h"
#include "bleperipheral.h"
#include "sbp_profile.h"
#include "sensor.h"
#include "cmd_parcer.h"
#include "devinfoservice.h"
#include "ble_ota.h"
#include "thb2_peripheral.h"
#include "lcd_th05.h"
/*********************************************************************/
#define SEND_DATA_SIZE 16
const dev_id_t dev_id = {
.pid = CMD_ID_DEVID,
.revision = 1,
.hw_version = DEVICE,
.sw_version = APP_VERSION,
.dev_spec_data = 0,
.services = DEV_SERVICES
};
int cmd_parser(uint8_t * obuf, uint8_t * ibuf, uint32_t len) {
int olen = 0;
if (len) {
uint8_t cmd = ibuf[0];
obuf[0] = cmd;
obuf[1] = 0; // no err
if (cmd == CMD_ID_DEVID) { // Get DEV_ID
osal_memcpy(obuf, &dev_id, sizeof(dev_id));
olen = sizeof(dev_id);
} else if (cmd == CMD_ID_CFG) { // Get/Set device config
if (--len > sizeof(cfg))
len = sizeof(cfg);
if (len) {
osal_memcpy(&cfg, &ibuf[1], len);
test_config();
flash_write_cfg(&cfg, EEP_ID_CFG, sizeof(cfg));
}
osal_memcpy(&obuf[1], &cfg, sizeof(cfg));
olen = sizeof(cfg) + 1;
} else if (cmd == CMD_ID_CFG_DEF) { // Set default device config
osal_memcpy(&cfg, &def_cfg, sizeof(cfg));
test_config();
flash_write_cfg(&cfg, EEP_ID_CFG, sizeof(cfg));
osal_memcpy(&obuf[1], &cfg, sizeof(cfg));
olen = sizeof(cfg) + 1;
} else if (cmd == CMD_ID_CFS) { // Get/Set sensor config
if (--len > sizeof(thsensor_cfg.coef))
len = sizeof(thsensor_cfg.coef);
if (len) {
osal_memcpy(&thsensor_cfg.coef, &ibuf[1], len);
flash_write_cfg(&thsensor_cfg.coef, EEP_ID_CFS, sizeof(thsensor_cfg.coef));
}
osal_memcpy(&obuf[1], &thsensor_cfg, thsensor_cfg_send_size);
olen = thsensor_cfg_send_size + 1;
} else if (cmd == CMD_ID_CFS_DEF) { // Get/Set default sensor config
osal_memset(&thsensor_cfg, 0, thsensor_cfg_send_size);
init_sensor();
osal_memcpy(&obuf[1], &thsensor_cfg, thsensor_cfg_send_size);
olen = thsensor_cfg_send_size + 1;
} else if (cmd == CMD_ID_SERIAL) {
osal_memcpy(&obuf[1], devInfoSerialNumber, sizeof(devInfoSerialNumber)-1);
olen = 1 + sizeof(devInfoSerialNumber)-1;
} else if (cmd == CMD_ID_FLASH_ID) {
osal_memcpy(&obuf[1], (uint8_t *)&phy_flash.IdentificationID, 8);
olen = 1 + 8;
} else if (cmd == CMD_ID_SEN_ID) {
osal_memcpy(&obuf[1], (uint8_t *)&thsensor_cfg.mid, 5);
olen = 1 + 5;
// } else if (cmd == CMD_ID_DNAME) {
// } else if (cmd == CMD_ID_DEV_MAC) {
} else if (cmd == CMD_ID_MTU) {
if (ibuf[1] <= MTU_SIZE)
ATT_UpdateMtuSize(gapRole_ConnectionHandle, ibuf[1]);
else
obuf[1] = 0xff;
olen = 2;
} else if (cmd == CMD_ID_REBOOT) {
GAPRole_TerminateConnection();
if(len >= 2) {
write_reg(OTA_MODE_SELECT_REG, ibuf[1]);
}
hal_system_soft_reset();
#if (DEV_SERVICES & SERVICE_SCREEN)
} else if (cmd == CMD_ID_LCD_DUMP) { // Get/set lcd buf
if (--len > sizeof(display_buff))
len = sizeof(display_buff);
if (len) {
osal_memcpy(display_buff, &ibuf[1], len);
update_lcd();
}
osal_memcpy(&obuf[1], display_buff, sizeof(display_buff));
olen = 1 + sizeof(display_buff);
#endif
//---------- Debug commands (unsupported in different versions!):
} else if (cmd == CMD_ID_EEP_RW && len > 2) {
obuf[1] = ibuf[1];
obuf[2] = ibuf[2];
uint16_t id = ibuf[1] | (ibuf[2] << 8);
if(len > 3) {
flash_write_cfg(&ibuf[3], id, len - 3);
}
int16_t i = flash_read_cfg(&obuf[3], id, SEND_DATA_SIZE);
if(i < 0) {
obuf[1] = (uint8_t)(i & 0xff); // Error
olen = 2;
} else
olen = i + 3;
} else if (cmd == CMD_ID_MEM_RW && len > 4) { // Read/Write memory
uint8_t *p = (uint8_t *)
((uint32_t)(ibuf[1] | (ibuf[2]<<8) | (ibuf[3]<<16) | (ibuf[4]<<24)));
if(len > 5) {
len -= 5;
osal_memcpy(p, &ibuf[5], len);
} else
len = SEND_DATA_SIZE;
osal_memcpy(obuf, ibuf, 5);
osal_memcpy(&obuf[5], p, len);
olen = len + 1 + 4;
} else if (cmd == CMD_ID_REG_RW && len > 4) { // Read/Write register
volatile uint32_t *p = (volatile uint32_t *)
((uint32_t)(ibuf[1] | (ibuf[2]<<8) | (ibuf[3]<<16) | (ibuf[4]<<24)));
uint32_t tmp;
if(len > 8) {
tmp = ibuf[5] | (ibuf[6]<<8) | (ibuf[7]<<16) | (ibuf[8]<<24);
*p = tmp;
} else {
obuf[1] = 0xfe; // Error size
olen = 2;
}
tmp = *p;
osal_memcpy(obuf, ibuf, 5);
osal_memcpy(&obuf[5], &tmp, 4);
olen = 1 + 4 + 4;
} else {
obuf[1] = 0xff; // Error cmd
olen = 2;
}
}
return olen;
}

View file

@ -1,106 +0,0 @@
/*
* cmd_parcer.h
*
* Created on: 16 янв. 2024 г.
* Author: pvvx
*/
#ifndef _CMD_PARCER_H_
#define _CMD_PARCER_H_
#ifdef __cplusplus
extern "C"
{
#endif
//#include "types.h"
/*********************************************************************
* CONSTANTS
*/
// A complete list of interface commands for different devices.
// Not all commands are supported by a specific device (!)
enum CMD_ID_KEYS {
CMD_ID_DEVID = 0x00, // Get dev id, version, services
CMD_ID_DNAME = 0x01, // Get/Set device name, "\0" - default: THB2_xxxx
CMD_ID_GDEVS = 0x02, // Get address devices
CMD_ID_I2C_SCAN = 0x03, // I2C scan
CMD_ID_I2C_UTR = 0x04, // Universal I2C/SMBUS read-write
CMD_ID_SEN_ID = 0x05, // Get sensor ID
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_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
CMD_ID_UTC_TIME = 0x23, // Get/Set utc time (if USE_CLOCK = 1)
CMD_ID_TADJUST = 0x24, // Get/Set adjust time clock delta (in 1/16 us for 1 sec)
CMD_ID_CFS = 0x25, // Get/Set sensor config
CMD_ID_CFS_DEF = 0x26, // Get/Set default sensor config
CMD_ID_MEASURE = 0x33, // Start/stop notify measures in connection mode
CMD_ID_LOGGER = 0x35, // Read memory measures
CMD_ID_CLRLOG = 0x36, // Clear memory measures
CMD_ID_RDS = 0x40, // Get/Set Reed switch config (DIY devices)
CMD_ID_TRG = 0x44, // Get/Set trg and Reed switch data config
CMD_ID_TRG_OUT = 0x45, // Get/Set trg out, Send Reed switch and trg data
CMD_ID_HXC = 0x49, // Get/Set HX71X config
CMD_ID_CFG = 0x55, // Get/Set device config
CMD_ID_CFG_DEF = 0x56, // Set default device config
CMD_ID_LCD_DUMP = 0x60, // Get/Set lcd buf
CMD_ID_LCD_FLG = 0x61, // Start/Stop notify lcd dump and ...
CMD_ID_PINCODE = 0x70, // Set new PinCode 0..999999
CMD_ID_MTU = 0x71, // Request Mtu Size Exchange (23..255)
CMD_ID_REBOOT = 0x72, // Set Reboot on disconnect
CMD_ID_SET_OTA = 0x73, // Extension BigOTA: Get/set address and size OTA, erase sectors
// Debug commands (unsupported in different versions!):
CMD_ID_OTAC = 0xD1, // OTA clear
CMD_ID_WRFB = 0xD3, // Write Flash
CMD_ID_RDFB = 0xD4, // Read Flash Block
CMD_ID_ERFB = 0xD5, // Erase Flash Sector
CMD_ID_CHGB = 0xD7, // Change boot
CMD_ID_REG_RW = 0xDA, // Read/Write Registers
CMD_ID_MEM_RW = 0xDB, // Read/Write memory
CMD_ID_EEP_RW = 0xDC, // Get/set EEP
CMD_ID_LR_RESET = 0xDD, // Reset Long Range
CMD_ID_DEBUG = 0xDE // Test/Debug
};
// supported services by the device
typedef struct _dev_services_t{
uint32_t ota: 1; //0 OTA
uint32_t ota_ext: 1; //1 OTA extension
uint32_t pincode: 1; //2 pin-code
uint32_t bindkey: 1; //3 bindkey
uint32_t history: 1; //4 history
uint32_t screen: 1; //5 screen
uint32_t long_range: 1; //6 LE Long Range
uint32_t ths: 1; //7 T & H sensor
uint32_t rds: 1; //8 Reed switch sensor
uint32_t key: 1; //9 key
uint32_t out_pins: 1; //10 Output pins
uint32_t inp_pins: 1; //11 Input pins
uint32_t reserved: 20;
} dev_services_t;
// CMD_ID_DEV_ID
typedef struct _dev_id_t{
uint8_t pid; // packet identifier = CMD_ID_DEVID
uint8_t revision; // protocol version/revision
uint16_t hw_version; // hardware version
uint16_t sw_version; // software version (BCD)
uint16_t dev_spec_data; // device-specific data
uint32_t services; // supported services by the device
} dev_id_t, * pdev_id_t;
extern const dev_id_t dev_id;
int cmd_parser(uint8_t * obuf, uint8_t * ibuf, uint32_t len);
#ifdef __cplusplus
}
#endif
#endif /* _CMD_PARCER_H_ */

View file

@ -26,7 +26,7 @@
#include "devinfoservice.h"
#include "ble_ota.h"
#include "thb2_peripheral.h"
#include "lcd_th05.h"
#include "lcd.h"
#include "logger.h"
#include "trigger.h"
/*********************************************************************/
@ -57,14 +57,28 @@ int cmd_parser(uint8_t * obuf, uint8_t * ibuf, uint32_t len) {
if (--len > sizeof(cfg))
len = sizeof(cfg);
if (len) {
#if (DEV_SERVICES & SERVICE_SCREEN) && (OTA_TYPE == OTA_TYPE_APP)
tmp ^= cfg.flg;
#endif
memcpy(&cfg, &ibuf[1], len);
#if (DEV_SERVICES & SERVICE_SCREEN) && (OTA_TYPE == OTA_TYPE_APP)
if(tmp & FLG_DISPLAY_OFF)
init_lcd();
#endif
test_config();
flash_write_cfg(&cfg, EEP_ID_CFG, sizeof(cfg));
}
memcpy(&obuf[1], &cfg, sizeof(cfg));
olen = sizeof(cfg) + 1;
} else if (cmd == CMD_ID_CFG_DEF) { // Set default device config
#if (DEV_SERVICES & SERVICE_SCREEN) && (OTA_TYPE == OTA_TYPE_APP)
tmp = cfg.flg ^ def_cfg.flg;
#endif
memcpy(&cfg, &def_cfg, sizeof(cfg));
#if (DEV_SERVICES & SERVICE_SCREEN) && (OTA_TYPE == OTA_TYPE_APP)
if(tmp & FLG_DISPLAY_OFF)
init_lcd();
#endif
test_config();
flash_write_cfg(&cfg, EEP_ID_CFG, sizeof(cfg));
memcpy(&obuf[1], &cfg, sizeof(cfg));
@ -238,6 +252,12 @@ int cmd_parser(uint8_t * obuf, uint8_t * ibuf, uint32_t len) {
memcpy(obuf, ibuf, 5);
memcpy(&obuf[5], &tmp, 4);
olen = 1 + 4 + 4;
#if (DEV_SERVICES & SERVICE_SCREEN)
} else if (cmd == CMD_ID_DEBUG) { // debug - send to lcd
if (--len) {
send_to_lcd(&ibuf[1], len);
}
#endif
} else {
obuf[1] = 0xff; // Error cmd
olen = 2;

View file

@ -48,7 +48,7 @@ work_parm_t wrk;
adv_work_t adv_wrk;
const cfg_t def_cfg = {
.flg = 1,
.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

View file

@ -13,7 +13,7 @@
// #include "bus_dev.h"
#ifndef APP_VERSION
#define APP_VERSION 0x12 // BCD
#define APP_VERSION 0x13 // BCD
#endif
/*
@ -33,14 +33,16 @@
#define BOARD_MHO_C122 11
#define BOARD_TNK 16 // Water tank controller (not yet published at the moment)
#define BOARD_TS0201_TZ3000 17
#define BOARD_TS0202_TZ3000 18 // ?
#define BOARD_TS0202_TZ3000 18
#define BOARD__TH03Z 22 // ZigBee TH03Z
*/
#define DEVICE_THB2 19
#define DEVICE_BTH01 20
#define DEVICE_TH05 21
#define DEVICE_THB1 23
#ifndef DEVICE
#define DEVICE DEVICE_THB2
#define DEVICE DEVICE_THB1
#endif
// supported services by the device (bits)
@ -91,9 +93,9 @@
)
#endif
#define ADC_PIN_USE_OUT 0
#define ADC_PIN GPIO_P11
#define ADC_CHL ADC_CH1N_P11
#define ADC_PIN_USE_OUT 0 // есть резистор 0 к +Vbat
#define ADC_PIN GPIO_P11
#define ADC_VBAT_CHL VBAT_ADC_P11
#define I2C_SDA GPIO_P18
#define I2C_SCL GPIO_P20
@ -127,12 +129,12 @@
#endif
#define ADC_PIN_USE_OUT 1 // hal_gpio_write(ADC_PIN, 1);
#define ADC_PIN GPIO_P11
#define ADC_CHL ADC_CH1N_P11
#define ADC_PIN GPIO_P11
#define ADC_VBAT_CHL VBAT_ADC_P11
#define I2C_SDA GPIO_P33 // CHT8305_SDA
#define I2C_SCL GPIO_P34 // CHT8305_SCL
#define GPIO_SPWR GPIO_P00 // питание сенсора CHT8305_VDD
#define I2C_SDA GPIO_P33 // SDA
#define I2C_SCL GPIO_P34 // SCL
#define GPIO_SPWR GPIO_P00 // питание сенсора
#define GPIO_KEY GPIO_P14
#define GPIO_LED GPIO_P15
#define LED_ON 1
@ -169,16 +171,19 @@
#endif
#define ADC_PIN_USE_OUT 1 // hal_gpio_write(ADC_PIN, 1);
#define ADC_PIN GPIO_P11
#define ADC_CHL ADC_CH1N_P11
#define ADC_PIN GPIO_P11
#define ADC_VBAT_CHL VBAT_ADC_P11
#define USE_TH_SENSOR 1
#define USE_RS_SENSOR 0
#define USE_SECREEN 1
#define I2C_SDA GPIO_P33 // AHT20_SDA
#define I2C_SCL GPIO_P34 // AHT20_SCL
#define GPIO_SPWR GPIO_P00 // питание сенсора CHT8305_VDD
#define I2C_SDA GPIO_P33 // SDA
#define I2C_SCL GPIO_P34 // SCL
#define I2C_LCD_SDA GPIO_P33 // SDA
#define I2C_LCD_SCL GPIO_P34 // SCL
#define GPIO_SPWR GPIO_P00 // питание сенсора
#define GPIO_KEY GPIO_P14
#define GPIO_LPWR GPIO_P02 // питание LCD драйвера
@ -193,6 +198,51 @@
#define DEF_HARDWARE_REVISION "0014"
#define DEF_MANUFACTURE_NAME_STR "Tuya"
#elif DEVICE == DEVICE_THB1
/* Model: THB1/BT1 */
#if OTA_TYPE == OTA_TYPE_BOOT
#define DEV_SERVICES (OTA_TYPE \
| SERVICE_SCREEN \
| SERVICE_THS \
| SERVICE_KEY \
)
#else
#define DEV_SERVICES (OTA_TYPE \
| SERVICE_SCREEN \
| SERVICE_THS \
| SERVICE_KEY \
| SERVICE_HISTORY \
| SERVICE_TH_TRG \
| SERVICE_RDS \
)
#endif
#if ((DEV_SERVICES & SERVICE_THS) == 0) && (DEV_SERVICES & SERVICE_TH_TRG)
#error "Not SERVICE_TH_TRG!"
#endif
#define ADC_PIN_USE_OUT 1 // нет подключения к +Vbat
#define ADC_PIN GPIO_P14
#define ADC_VBAT_CHL VBAT_ADC_P14
#define USE_TH_SENSOR 1
#define USE_SECREEN 1
#define I2C_SDA GPIO_P18 // SDA
#define I2C_SCL GPIO_P20 // SCL
#define I2C_LCD_SDA GPIO_P34 // SDA
#define I2C_LCD_SCL GPIO_P33 // SCL
#define GPIO_KEY GPIO_P01
#define GPIO_TRG GPIO_P09 // mark TX
#define GPIO_INP GPIO_P10 // mark RX
#define DEF_MODEL_NUMBER_STR "THB1"
#define DEF_HARDWARE_REVISION "0017"
#define DEF_MANUFACTURE_NAME_STR "Tuya"
#else
#error "DEVICE Not released!"
#endif
@ -226,7 +276,8 @@ extern const cfg_t def_cfg;
#define FLG_SHOW_TIME 0x00000002 // включить показ часов на LCD
#define FLG_SHOW_SMILEY 0x00000004 // включить показ смайлика
#define FLG_SHOW_TRG 0x00000008 // смайлик поаказывает TRG
//#define FLG_ADV_CRYPT 0x00000010 // Зашифрованная BLE реклама (bindkey)
#define FLG_DISPLAY_OFF 0x00000010 // отключить дисплей
//#define FLG_ADV_CRYPT 0x00000100 // Зашифрованная BLE реклама (bindkey)
typedef struct _adv_work_t {
uint32_t measure_interval_ms;

View file

@ -13,21 +13,23 @@
#define I2C_WAIT_ms 3
void init_i2c(i2c_speed_e speed400khz) {
hal_gpio_fmux_set(I2C_SCL, FMUX_IIC0_SCL);
hal_gpio_fmux_set(I2C_SDA, FMUX_IIC0_SDA);
//hal_i2c_init(I2C_0, I2C_CLOCK_400K):
int pclk = clk_get_pclk();
void init_i2c(pdev_i2c_t pi2c_dev) {
AP_I2C_TypeDef* pi2cdev = AP_I2C0;
hal_clk_gate_enable(MOD_I2C0);
if(pi2c_dev->i2c_num)
pi2cdev = AP_I2C1;
pi2c_dev->pi2cdev = pi2cdev;
hal_gpio_fmux_set(pi2c_dev->scl, FMUX_IIC0_SCL + (pi2c_dev->i2c_num<<1)); // FMUX_IIC1_SCL
hal_gpio_fmux_set(pi2c_dev->sda, FMUX_IIC0_SDA + (pi2c_dev->i2c_num<<1)); // FMUX_IIC1_SDA
// int pclk = clk_get_pclk();
hal_clk_gate_enable(MOD_I2C0 + pi2c_dev->i2c_num); // MOD_I2C1
pi2cdev->IC_ENABLE = 0;
pi2cdev->IC_CON = 0x61;
if(speed400khz) {
if(pi2c_dev->speed) {
// SET_I2C_SPEED 400 kHz
pi2cdev->IC_CON = ((pi2cdev->IC_CON) & 0xfffffff9) | (0x02 << 1); // SPEED_FAST
#if 0
if (pclk == 16000000) {
pi2cdev->IC_FS_SCL_HCNT = 10;
pi2cdev->IC_FS_SCL_LCNT = 17;
@ -44,9 +46,14 @@ void init_i2c(i2c_speed_e speed400khz) {
pi2cdev->IC_FS_SCL_HCNT = 105;
pi2cdev->IC_FS_SCL_LCNT = 113;
}
#else
pi2cdev->IC_FS_SCL_HCNT = 10;
pi2cdev->IC_FS_SCL_LCNT = 17;
#endif
} else {
// SET_I2C_SPEED 100 kHz
pi2cdev->IC_CON = ((pi2cdev->IC_CON) & 0xfffffff9) | (0x01 << 1); // SPEED_STANDARD
#if 0
if (pclk == 16000000) {
pi2cdev->IC_SS_SCL_HCNT = 70; //16
pi2cdev->IC_SS_SCL_LCNT = 76; //32)
@ -63,6 +70,10 @@ void init_i2c(i2c_speed_e speed400khz) {
pi2cdev->IC_SS_SCL_HCNT = 460; //16
pi2cdev->IC_SS_SCL_LCNT = 470; //32)
}
#else
pi2cdev->IC_SS_SCL_HCNT = 70; //16
pi2cdev->IC_SS_SCL_LCNT = 76; //32)
#endif
}
// pi2cdev->IC_TAR = I2C_MASTER_ADDR_DEF;
pi2cdev->IC_INTR_MASK = 0;
@ -71,20 +82,20 @@ void init_i2c(i2c_speed_e speed400khz) {
// pi2cdev->IC_ENABLE = 1;
}
void deinit_i2c(void) {
AP_I2C_TypeDef * pi2cdev = AP_I2C0;
void deinit_i2c(pdev_i2c_t pi2c_dev) {
AP_I2C_TypeDef* pi2cdev = pi2c_dev->pi2cdev;
pi2cdev->IC_ENABLE = 0;
hal_clk_gate_disable(MOD_I2C0);
hal_gpio_pin_init(I2C_SCL, IE);
hal_gpio_pin_init(I2C_SDA, IE);
hal_clk_gate_disable(MOD_I2C0 + pi2c_dev->i2c_num); // MOD_I2C1
hal_gpio_pin_init(pi2c_dev->scl, IE);
hal_gpio_pin_init(pi2c_dev->sda, IE);
}
extern volatile uint32 osal_sys_tick;
/* size max = 7 ! */
int read_i2c_bytes(uint8 addr, uint8 reg, uint8 * data, uint8 size) {
int read_i2c_bytes(pdev_i2c_t pi2c_dev, uint8 addr, uint8 reg, uint8 * data, uint8 size) {
AP_I2C_TypeDef* pi2cdev = pi2c_dev->pi2cdev;
int i = size;
AP_I2C_TypeDef * pi2cdev = AP_I2C0;
pi2cdev->IC_ENABLE = 0;
pi2cdev->IC_TAR = addr;
@ -112,9 +123,9 @@ int read_i2c_bytes(uint8 addr, uint8 reg, uint8 * data, uint8 size) {
return 0;
}
int read_i2c_nabuf(uint8 addr, uint8 * data, uint8 size) {
int read_i2c_nabuf(pdev_i2c_t pi2c_dev, uint8 addr, uint8 * data, uint8 size) {
AP_I2C_TypeDef* pi2cdev = pi2c_dev->pi2cdev;
int i = size;
AP_I2C_TypeDef * pi2cdev = AP_I2C0;
pi2cdev->IC_ENABLE = 0;
pi2cdev->IC_TAR = addr;
@ -139,8 +150,8 @@ int read_i2c_nabuf(uint8 addr, uint8 * data, uint8 size) {
return 0;
}
int send_i2c_byte(uint8 addr, uint8 data) {
AP_I2C_TypeDef * pi2cdev = AP_I2C0;
int send_i2c_byte(pdev_i2c_t pi2c_dev, uint8 addr, uint8 data) {
AP_I2C_TypeDef* pi2cdev = pi2c_dev->pi2cdev;
pi2cdev->IC_ENABLE = 0;
pi2cdev->IC_TAR = addr;
HAL_ENTER_CRITICAL_SECTION();
@ -158,8 +169,8 @@ int send_i2c_byte(uint8 addr, uint8 data) {
return 0;
}
int send_i2c_wreg(uint8 addr, uint8 reg, uint16 data) {
AP_I2C_TypeDef * pi2cdev = AP_I2C0;
int send_i2c_wreg(pdev_i2c_t pi2c_dev, uint8 addr, uint8 reg, uint16 data) {
AP_I2C_TypeDef* pi2cdev = pi2c_dev->pi2cdev;
pi2cdev->IC_ENABLE = 0;
pi2cdev->IC_TAR = addr;
HAL_ENTER_CRITICAL_SECTION();
@ -180,8 +191,8 @@ int send_i2c_wreg(uint8 addr, uint8 reg, uint16 data) {
return 0;
}
int send_i2c_buf(uint8 addr, uint8 * pdata, int len) {
AP_I2C_TypeDef * pi2cdev = AP_I2C0;
int send_i2c_buf(pdev_i2c_t pi2c_dev, uint8 addr, uint8 * pdata, int len) {
AP_I2C_TypeDef* pi2cdev = pi2c_dev->pi2cdev;
pi2cdev->IC_ENABLE = 0;
pi2cdev->IC_TAR = addr;
HAL_ENTER_CRITICAL_SECTION();

View file

@ -13,13 +13,21 @@ typedef enum {
I2C_400KHZ
}i2c_speed_e;
void init_i2c(i2c_speed_e speed400khz);
void deinit_i2c(void);
int send_i2c_byte(uint8_t addr, uint8_t data);
int send_i2c_wreg(uint8 addr, uint8 reg, uint16 data);
int send_i2c_buf(uint8 addr, uint8 * pdata, int len);
int read_i2c_bytes(uint8 addr, uint8 reg, uint8 * data, uint8 size);
int read_i2c_nabuf(uint8 addr, uint8 * data, uint8 size);
typedef struct _dev_i2c_t {
AP_I2C_TypeDef * pi2cdev;
uint8_t scl; // gpio_pin_e
uint8_t sda; // gpio_pin_e
uint8_t speed; // i2c_speed_e
uint8_t i2c_num;
} dev_i2c_t, * pdev_i2c_t;
void init_i2c(pdev_i2c_t pi2c_dev);
void deinit_i2c(pdev_i2c_t pi2c_dev);
int send_i2c_byte(pdev_i2c_t pi2c_dev, uint8_t addr, uint8_t data);
int send_i2c_wreg(pdev_i2c_t pi2c_dev, uint8 addr, uint8 reg, uint16 data);
int send_i2c_buf(pdev_i2c_t pi2c_dev, uint8 addr, uint8 * pdata, int len);
int read_i2c_bytes(pdev_i2c_t pi2c_dev, uint8 addr, uint8 reg, uint8 * data, uint8 size);
int read_i2c_nabuf(pdev_i2c_t pi2c_dev, uint8 addr, uint8 * data, uint8 size);
#endif /* _DEV_I2C_H_ */

123
bthome_phy6222/source/lcd.h Normal file
View file

@ -0,0 +1,123 @@
/*
* lcd_th05.h
*
* Created on: 23 янв. 2024 г.
* Author: pvvx
*/
#ifndef _LCD_TH05_H_
#define _LCD_TH05_H_
/*
* TH-05 LCD buffer: byte.bit
--0.4-- --1.4-- --2.4-- BAT
| | | | | | | 3.6
| 0.6 0.0 1.6 1.0 2.6 2.0
| | | | | | | o 3.5
0.3 --0.2-- --1.2-- --2.2-- +--- 3.5
| | | | | | | 3.5|
| 0.5 0.1 1.5 1.1 2.5 2.1 ---- 3.7
| | | | | | | 3.5|
--0.7-- --1.7-- * --2.7-- ---- 2.3
1.3
--4.4-- --5.4--
| | | |
3.0 3.0 4.6 4.0 5.6 5.0
/ \ / \ | | | |
3.4( \_/ 3.2 \_/ )3.4 --4.2-- --5.2--
3.2 / \ 3.2 | | | |
\_/ 4.5 4.1 5.5 5.1 %
3.0 | | | | 5.3
--4.7-- --5.7--
OO 4.3
None: 3.1, 3.3
*/
/*
* THB1 LCD buffer: byte.bit
--0.0-- --1.0-- --2.0-- BAT
| | | | | | | 3.0 | 3.4 | 3.5 | 3.6 | 3.7
| 0.4 0.1 1.4 1.1 2.4 2.1
| | | | | | | o 3.2
0.7 --0.5-- --1.5-- --2.5-- +--- 3.2
| | | | | | | 3.2|
| 0.6 0.2 1.6 1.2 2.6 2.2 ---- 3.1
| | | | | | | 3.2|
--0.3-- --1.3-- * --2.3-- ---- 3.3
2.7
--4.0-- --5.0--
| | | |
6.6 6.6 4.4 4.1 5.4 5.1
/ \ / \ | | | |
4.7( \_/ 6.7 \_/ )4.7 --4.5-- --5.5--
6.7 / \ 6.7 | | | |
\_/ 4.6 4.2 5.6 5.2 %
6.6 | | | | 5.7
--4.3-- --5.3--
OO 1.7
None:
*/
#if (DEVICE == DEVICE_THB1)
#define LCD_BUF_SIZE 7
#else
#define LCD_BUF_SIZE 6
#endif
extern uint8_t lcd_i2c_addr; // LCD controller I2C address
extern uint8_t display_buff[LCD_BUF_SIZE];
/* 0x0 = " "
* 0x1 = "°Г"
* 0x2 = " _"
* 0x3 = "°C"
* 0x4 = " -"
* 0x5 = "°F"
* 0x6 = " ="
* 0x7 = "°E" */
typedef enum {
LCD_TSYMBOL_NONE, // " "
LCD_TSYMBOL_C = 3, // "°C"
LCD_TSYMBOL_F = 5, // "°F"
LCD_TSYMBOL_EQ = 6, // " ="
LCD_TSYMBOL_E = 7 // "°E"
} LCD_TEMP_SYMBOLS;
/* 0 = " " off,
* 1 = " ^_^ " happy
* 2 = " -^- " sad
* 3 = " ooo "
* 4 = "( )"
* 5 = "(^_^)" happy
* 6 = "(-^-)" sad
* 7 = "(ooo)" */
typedef enum {
LD_SSYMBOL_OFF, // 0 = " " off,
LD_SSYMBOL__HAPPY, // 1 = " ^_^ " happy
LD_SSYMBOL__SAD, // 2 = " -^- " sad
LD_SSYMBOL_OOO, // 3 = " ooo "
LD_SSYMBOL_CC, // 4 = "( )"
LD_SSYMBOL_HAPPY, // 5 = "(^_^)" happy
LD_SSYMBOL_SAD, // 6 = "(-^-)" sad
LD_SSYMBOL_ALL, // 7 = "(ooo)"
} LCD_SMILEY_SYMBOLS;
void init_lcd(void);
void update_lcd(void);
void show_small_number(int16_t number, bool percent);
void show_big_number_x10(int16_t number);
void show_battery_symbol(bool state);
void show_ble_symbol(bool state);
void show_smiley(LCD_SMILEY_SYMBOLS symbol);
void show_temp_symbol(LCD_TEMP_SYMBOLS symbol);
//void chow_clock(void);
//void chow_measure(void);
void chow_lcd(int flg);
void lcd_show_version(void);
extern void send_to_lcd(uint8_t *pbuf, int len);
#endif /* _LCD_TH05_H_ */

View file

@ -7,19 +7,26 @@
#include <string.h>
#include "types.h"
#include "config.h"
#if (DEV_SERVICES & SERVICE_SCREEN)
#if (DEV_SERVICES & SERVICE_SCREEN) && (DEVICE == DEVICE_TH05)
#include "OSAL.h"
#include "gpio.h"
#include "rom_sym_def.h"
#include "dev_i2c.h"
#include "sensors.h"
#include "lcd_th05.h"
#include "lcd.h"
#include "thb2_peripheral.h"
#define LCD_I2C_SPEED 100 // 100 or 400 kHz
#define LCD_I2C_ADDR 0x3E
#define I2C_WAIT_ms 1
dev_i2c_t i2c_dev1 = {
//.pi2cdev = AP_I2C1,
.scl = I2C_LCD_SCL,
.sda = I2C_LCD_SDA,
.speed = I2C_100KHZ,
.i2c_num = 0
};
/* 0,1,2,3,4,5,6,7,8,9,A,b,C,d,E,F*/
const uint8_t display_numbers[] = {
// 76543210
@ -58,47 +65,19 @@ uint8_t display_buff[LCD_BUF_SIZE] = {
LCD_SYM_o, LCD_SYM_o, LCD_SYM_o,
};
uint8_t display_out_buff[LCD_BUF_SIZE+1];
/* blink off: display_out_buff[0] = 0xf0, on: display_out_buff[0] = 0xf2 */
const uint8_t lcd_init_cmd[] = {
// LCD controller initialize:
0xea, // Set IC Operation(ICSET): Software Reset, Internal oscillator circuit
0xC8, // Mode Set (MODE SET): Display enable, 1/3 Bias, power saving
0xd8, // Mode Set (MODE SET): Display enable, 1/3 Bias, power saving
0xbc, // Display control (DISCTL): Power save mode 3, FRAME flip, Power save mode 1
0x80, // load data pointer
0xf0, // blink control 0xf2
0xf0, // blink control off, 0xf2 - blink
0xfc, // All pixel control (APCTL): Normal
0x60,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
0x00,0x00,000,0x00,0x00,0x00,0x00,0x00,0x00
};
/*
* TH-05 LCD buffer: byte.bit
--0.4-- --1.4-- --2.4-- BAT
| | | | | | | 3.6
| 0.6 0.0 1.6 1.0 2.6 2.0
| | | | | | | o 3.5
0.3 --0.2-- --1.2-- --2.2-- +--- 3.5
| | | | | | | 3.5|
| 0.5 0.1 1.5 1.1 2.5 2.1 ---- 3.7
| | | | | | | 3.5|
--0.7-- --1.7-- * --2.7-- ---- 2.3
1.3
--4.4-- --5.4--
| | | |
3.0 3.0 4.6 4.0 5.6 5.0
/ \ / \ | | | |
3.4( \_/ 3.2 \_/ )3.4 --4.2-- --5.2--
3.2 / \ 3.2 | | | |
\_/ 4.5 4.1 5.5 5.1 %
3.0 | | | | 5.3
--4.7-- --5.7--
OO 4.3
None: 3.1, 3.3
*/
/* 0x0 = " "
* 0x1 = "°Г"
* 0x2 = " _"
@ -143,7 +122,7 @@ void show_battery_symbol(bool state) {
}
void show_big_number_x10(int16_t number) {
display_buff[2] &= BIT(3); // F/C
display_buff[2] &= BIT(3); // F/C "_"
if (number > 19995) {
display_buff[0] = LCD_SYM_H; // "H"
display_buff[1] = LCD_SYM_i; // "i"
@ -229,7 +208,7 @@ void chow_clock(void) {
update_lcd();
}
void chow_measure(void) {
static void chow_measure(void) {
#if (DEV_SERVICES & SERVICE_THS)
show_big_number_x10(measured_data.temp/10);
show_small_number(measured_data.humi/100, true);
@ -295,26 +274,39 @@ void chow_lcd(int flg) {
#endif
}
static void send_to_lcd(uint8_t *pbuf, int len){
init_i2c(I2C_400KHZ);
send_i2c_buf(LCD_I2C_ADDR, pbuf, len);
deinit_i2c();
void send_to_lcd(uint8_t *pbuf, int len) {
if (lcd_i2c_addr) {
init_i2c(&i2c_dev1);
send_i2c_buf(&i2c_dev1, lcd_i2c_addr, pbuf, len);
deinit_i2c(&i2c_dev1);
}
}
void update_lcd(void) {
if (lcd_i2c_addr && memcmp(&display_out_buff[1], display_buff, sizeof(display_buff))) {
#if (OTA_TYPE == OTA_TYPE_APP)
if(lcd_i2c_addr == 0 || (cfg.flg & FLG_DISPLAY_OFF) != 0)
return;
#endif
if(memcmp(&display_out_buff[1], display_buff, sizeof(display_buff))) {
memcpy(&display_out_buff[1], display_buff, sizeof(display_buff));
send_to_lcd(display_out_buff, sizeof(display_out_buff));
}
}
void init_lcd(void) {
init_i2c(I2C_100KHZ);
if(!send_i2c_buf(LCD_I2C_ADDR, (uint8_t *) lcd_init_cmd, sizeof(lcd_init_cmd))) // sleep: 15.5 uA
i2c_dev1.speed = I2C_100KHZ;
init_i2c(&i2c_dev1);
if(!send_i2c_buf(&i2c_dev1, LCD_I2C_ADDR, (uint8_t *) lcd_init_cmd, sizeof(lcd_init_cmd))) {
#if (OTA_TYPE == OTA_TYPE_APP)
if(cfg.flg & FLG_DISPLAY_OFF)
send_i2c_byte(&i2c_dev1, LCD_I2C_ADDR, 0xd0); // Mode Set (MODE SET): Display disable, 1/3 Bias, power saving
#endif
lcd_i2c_addr = LCD_I2C_ADDR;
else
} else
lcd_i2c_addr = 0;
deinit_i2c();
deinit_i2c(&i2c_dev1);
i2c_dev1.speed = I2C_400KHZ;
}
/****************************************************/

View file

@ -0,0 +1,334 @@
/*
* lcd_th05.c
*
* Created on: 23 янв. 2024 г.
* Author: pvvx
*/
#include <string.h>
#include "types.h"
#include "config.h"
#if (DEV_SERVICES & SERVICE_SCREEN) && (DEVICE == DEVICE_THB1)
#include "OSAL.h"
#include "gpio.h"
#include "rom_sym_def.h"
#include "dev_i2c.h"
#include "sensors.h"
#include "lcd.h"
#include "thb2_peripheral.h"
#define LCD_I2C_ADDR 0x3E
#define I2C_WAIT_ms 1
dev_i2c_t i2c_dev1 = {
.pi2cdev = AP_I2C1,
.scl = I2C_LCD_SCL,
.sda = I2C_LCD_SDA,
.speed = I2C_100KHZ,
.i2c_num = 0
};
/* 0,1,2,3,4,5,6,7,8,9,A,b,C,d,E,F*/
const uint8_t display_numbers[] = {
// 76543210
0b001011111, // 0
0b000000110, // 1
0b001101011, // 2
0b000101111, // 3
0b000110110, // 4
0b000111101, // 5
0b001111101, // 6
0b000000111, // 7
0b001111111, // 8
0b000111111, // 9
0b001110111, // A
0b001111100, // b
0b001011001, // C
0b001101110, // d
0b001111001, // E
0b001110001 // F
};
#define LCD_SYM_b 0b001111100 // "b"
#define LCD_SYM_H 0b001110110 // "H"
#define LCD_SYM_h 0b001110100 // "h"
#define LCD_SYM_i 0b001000000 // "i"
#define LCD_SYM_L 0b001011000 // "L"
#define LCD_SYM_o 0b001101100 // "o"
#define LCD_SYM_t 0b001111000 // "t"
#define LCD_SYM_0 0b001011111 // "0"
#define LCD_SYM_A 0b001110111 // "A"
#define LCD_SYM_a 0b001101110 // "a"
#define LCD_SYM_P 0b001110011 // "P"
uint8_t lcd_i2c_addr; // = 0x3E
uint8_t display_buff[LCD_BUF_SIZE] = {
LCD_SYM_o, LCD_SYM_o, LCD_SYM_o,
};
uint8_t display_out_buff[LCD_BUF_SIZE+1];
/* blink off: display_out_buff[0] = 0xf0, on: display_out_buff[0] = 0xf2 */
const uint8_t lcd_init_cmd[] = {
// LCD controller initialize:
0xea, // Set IC Operation(ICSET): Software Reset, Internal oscillator circuit
0xd8, // Mode Set (MODE SET): Display enable, 1/3 Bias, power saving
0xbc, // Display control (DISCTL): Power save mode 3, FRAME flip, Power save mode 1
0x80, // load data pointer
0xf0, // blink control off, 0xf2 - blink
0xfc, // All pixel control (APCTL): Normal
0x60,
0x00,0x00,000,0x00,0x00,0x00,0x00,0x00,0x00
};
/* 0x0 = " "
* 0x1 = "°Г"
* 0x2 = " _"
* 0x3 = "°C"
* 0x4 = " -"
* 0x5 = "°F"
* 0x6 = " ="
* 0x7 = "°E" */
void show_temp_symbol(LCD_TEMP_SYMBOLS symbol) {
display_buff[3] &= ~(BIT(1)|BIT(2)|BIT(3)) ;
display_buff[3] |= (symbol << 2) & BIT(2);
display_buff[3] |= (symbol << 2) & BIT(3);
display_buff[3] |= (symbol >> 1) & BIT(1);
}
/* 0 = " " off,
* 1 = " ^_^ " happy
* 2 = " -^- " sad
* 3 = " ooo "
* 4 = "( )"
* 5 = "(^_^)" happy
* 6 = "(-^-)" sad
* 7 = "(ooo)" */
void show_smiley(LCD_SMILEY_SYMBOLS symbol) {
if(symbol & 4)
display_buff[4] |= BIT(7);
else
display_buff[4] &= ~BIT(7);
display_buff[6] = symbol << 6;
}
void show_ble_symbol(bool state) {
if (state)
display_buff[1] |= BIT(7);
else
display_buff[1] &= ~BIT(7);
}
void show_battery(uint8_t level) {
display_buff[3] &= ~(BIT(4) | BIT(5) | BIT(6) | BIT(7));
if(level > 80)
display_buff[3] |= BIT(4);
if(level > 60)
display_buff[3] |= BIT(5);
if(level > 40)
display_buff[3] |= BIT(6);
if(level > 20)
display_buff[3] |= BIT(7);
display_buff[3] |= BIT(0);
}
void show_battery_symbol(bool state) {
if (state)
display_buff[3] |= BIT(0);
else
display_buff[3] &= ~(BIT(0) | BIT(4) | BIT(5) | BIT(6) | BIT(7));
}
void show_big_number_x10(int16_t number) {
display_buff[1] &= BIT(7); // connect
if (number > 19995) {
display_buff[0] = LCD_SYM_H; // "H"
display_buff[1] |= LCD_SYM_i; // "i"
} else if (number < -995) {
display_buff[0] = LCD_SYM_L; // "L"
display_buff[1] |= LCD_SYM_o; // "o"
} else {
display_buff[0] = 0;
/* number: -995..19995 */
if (number > 1995 || number < -95) {
display_buff[2] = 0; // no point, show: -99..1999
if (number < 0){
number = -number;
display_buff[0] = BIT(5); // "-"
}
number = (number + 5) / 10; // round(div 10)
} else { // show: -9.9..199.9
display_buff[2] = BIT(7); // point,
if (number < 0){
number = -number;
display_buff[0] = BIT(5); // "-"
}
}
/* number: -99..1999 */
if (number > 999) display_buff[0] |= BIT(7); // "1" 1000..1999
if (number > 99) display_buff[0] |= display_numbers[number / 100 % 10];
if (number > 9) display_buff[1] |= display_numbers[number / 10 % 10];
else display_buff[1] |= LCD_SYM_0; // "0"
display_buff[2] |= display_numbers[number %10];
}
}
/* -9 .. 99 */
void show_small_number(int16_t number, bool percent) {
display_buff[4] &= BIT(7); // smiley
display_buff[5] = percent? BIT(7) : 0;
if (number > 99) {
display_buff[4] |= LCD_SYM_H; // "H"
display_buff[5] |= LCD_SYM_i; // "i"
} else if (number < -9) {
display_buff[4] |= LCD_SYM_L; // "L"
display_buff[5] |= LCD_SYM_o; // "o"
} else {
if (number < 0) {
number = -number;
display_buff[4] = BIT(2); // "-"
}
if (number > 9) display_buff[4] |= display_numbers[number / 10 % 10];
display_buff[5] |= display_numbers[number %10];
}
}
void lcd_show_version(void) {
display_buff[1] &= BIT(7); // connect
#if OTA_TYPE
display_buff[0] = LCD_SYM_b;
display_buff[1] |= LCD_SYM_o;
display_buff[2] = LCD_SYM_t;
#else
display_buff[0] = LCD_SYM_A;
display_buff[1] |= LCD_SYM_P;
display_buff[2] = LCD_SYM_P;
#endif
display_buff[3] &= BIT(0) | BIT(4) | BIT(5) | BIT(6) | BIT(7); // bat
display_buff[4] = display_numbers[(APP_VERSION>>4) & 0x0f];
display_buff[5] = display_numbers[APP_VERSION & 0x0f];
update_lcd();
}
void chow_clock(void) {
uint32_t tmp = clkt.utc_time_sec / 60;
uint32_t min = tmp % 60;
uint32_t hrs = (tmp / 60) % 24;
display_buff[0] = 0;
display_buff[1] &= BIT(7); // connect
display_buff[1] |= display_numbers[(hrs / 10) % 10];
display_buff[2] = display_numbers[hrs % 10];
display_buff[3] &= BIT(0) | BIT(4) | BIT(5) | BIT(6) | BIT(7); // bat
display_buff[4] = display_numbers[(min / 10) % 10];
display_buff[5] = display_numbers[min % 10];
display_buff[6] = 0;
update_lcd();
}
static void chow_measure(void) {
#if (DEV_SERVICES & SERVICE_THS)
show_big_number_x10(measured_data.temp/10);
show_small_number(measured_data.humi/100, true);
show_battery(measured_data.battery);
show_temp_symbol(LCD_TSYMBOL_C);
#if (OTA_TYPE == OTA_TYPE_APP)
if(cfg.flg & FLG_SHOW_SMILEY) {
#if (DEV_SERVICES & SERVICE_TH_TRG)
if(cfg.flg & FLG_SHOW_TRG) {
if(measured_data.flg.comfort) {
if(measured_data.flg.trg_on)
show_smiley(LD_SSYMBOL_HAPPY);
else
show_smiley(LD_SSYMBOL__HAPPY);
} else {
if(measured_data.flg.trg_on)
show_smiley(LD_SSYMBOL_SAD);
else
show_smiley(LD_SSYMBOL__SAD);
}
} else
#endif // SERVICE_TH_TRG
{
if(measured_data.flg.comfort)
show_smiley(LD_SSYMBOL_HAPPY);
else
show_smiley(LD_SSYMBOL_SAD);
}
#if (DEV_SERVICES & SERVICE_TH_TRG)
} else if(cfg.flg & FLG_SHOW_TRG) {
if(measured_data.flg.trg_on)
show_smiley(LD_SSYMBOL_ALL);
else
show_smiley(LD_SSYMBOL_OFF);
} else
#endif // SERVICE_TH_TRG
#endif // OTA_TYPE
show_smiley(LD_SSYMBOL_OFF);
#else
show_big_number_x10(measured_data.battery_mv/100);
show_small_number((measured_data.battery > 99)? 99 : measured_data.battery, true);
show_battery_symbol(1);
show_smiley(LD_SSYMBOL_OFF);
#endif // SERVICE_THS
show_ble_symbol(gapRole_state == GAPROLE_CONNECTED);
update_lcd();
}
/* flg != 0 -> chow_measure */
void chow_lcd(int flg) {
#if OTA_TYPE == OTA_TYPE_BOOT
if(flg)
chow_measure();
#else
if(cfg.flg & FLG_DISPLAY_OFF) return;
if(cfg.flg & FLG_SHOW_TIME) {
if(wrk.lcd_count++ & 1)
chow_clock();
else
chow_measure();
} else if(flg) {
chow_measure();
}
#endif
}
void send_to_lcd(uint8_t *pbuf, int len) {
if (lcd_i2c_addr) {
init_i2c(&i2c_dev1);
send_i2c_buf(&i2c_dev1, lcd_i2c_addr, pbuf, len);
deinit_i2c(&i2c_dev1);
}
}
void update_lcd(void) {
#if (OTA_TYPE == OTA_TYPE_APP)
if(lcd_i2c_addr == 0 || (cfg.flg & FLG_DISPLAY_OFF) != 0)
return;
#endif
if(memcmp(&display_out_buff[1], display_buff, sizeof(display_buff))) {
memcpy(&display_out_buff[1], display_buff, sizeof(display_buff));
send_to_lcd(display_out_buff, sizeof(display_out_buff));
}
}
void init_lcd(void) {
i2c_dev1.speed = I2C_100KHZ;
init_i2c(&i2c_dev1);
if(!send_i2c_buf(&i2c_dev1, LCD_I2C_ADDR, (uint8_t *) lcd_init_cmd, sizeof(lcd_init_cmd))) {
#if (OTA_TYPE == OTA_TYPE_APP)
if(cfg.flg & FLG_DISPLAY_OFF)
send_i2c_byte(&i2c_dev1, LCD_I2C_ADDR, 0xd0); // Mode Set (MODE SET): Display disable, 1/3 Bias, power saving
// else
// send_i2c_byte(&i2c_dev1, LCD_I2C_ADDR, 0xd8); // Mode Set (MODE SET): Display disable, 1/3 Bias, power saving
#endif
lcd_i2c_addr = LCD_I2C_ADDR;
} else
lcd_i2c_addr = 0;
deinit_i2c(&i2c_dev1);
// i2c_dev1.speed = I2C_400KHZ;
}
/****************************************************/
#endif // (DEV_SERVICES & SERVICE_SCREEN)

View file

@ -115,7 +115,7 @@ const ioinit_cfg_t ioInit[] = {
#ifdef GPIO_TRG
{ GPIO_P02, GPIO_FLOATING }, // TX2 - GPIO_TRG
#else
{ GPIO_P09, GPIO_PULL_UP }, // TX
{ GPIO_P02, GPIO_PULL_UP }, // TX2
#endif
{ GPIO_P03, GPIO_PULL_DOWN },
{ GPIO_P07, GPIO_PULL_UP }, // KEY
@ -201,7 +201,36 @@ const ioinit_cfg_t ioInit[] = {
{ GPIO_P31, GPIO_PULL_DOWN },
{ GPIO_P32, GPIO_PULL_DOWN },
{ GPIO_P33, GPIO_FLOATING }, // I2C_SDA
{ GPIO_P34, GPIO_FLOATING } // // I2C_SCL
{ GPIO_P34, GPIO_FLOATING } // I2C_SCL
#elif (DEVICE == DEVICE_THB1)
{ GPIO_P00, GPIO_PULL_DOWN },
{ GPIO_P01, GPIO_PULL_UP }, // KEY - GPIO_KEY
{ GPIO_P02, GPIO_PULL_DOWN },
{ GPIO_P03, GPIO_PULL_DOWN },
{ GPIO_P07, GPIO_PULL_DOWN },
#ifdef GPIO_TRG
{ GPIO_P09, GPIO_FLOATING }, // TX - GPIO_TRG
#else
{ GPIO_P09, GPIO_PULL_UP }, // TX
#endif
{ GPIO_P10, GPIO_PULL_UP }, // RX - GPIO_INP
{ GPIO_P11, GPIO_FLOATING }, // ADC Vbat с делителем! Не используется - Выкусить резистор R3!
{ GPIO_P14, GPIO_PULL_UP }, // назначен как ADC_PIN, т.к. вывод P11 подключен к делителю
{ GPIO_P15, GPIO_PULL_DOWN },
{ GPIO_P16, GPIO_PULL_DOWN },
{ GPIO_P17, GPIO_PULL_DOWN },
{ GPIO_P18, GPIO_FLOATING }, // I2C_SDA CHT8310
{ GPIO_P20, GPIO_FLOATING }, // I2C_SCL CHT8310
{ GPIO_P23, GPIO_PULL_DOWN },
{ GPIO_P24, GPIO_PULL_DOWN },
{ GPIO_P25, GPIO_PULL_DOWN },
{ GPIO_P26, GPIO_PULL_DOWN },
{ GPIO_P27, GPIO_PULL_DOWN },
{ GPIO_P31, GPIO_PULL_DOWN },
{ GPIO_P32, GPIO_PULL_DOWN },
{ GPIO_P33, GPIO_PULL_UP }, // I2C_SDA CNV1972
{ GPIO_P34, GPIO_PULL_UP } // I2C_SCL CNV1972
#else
#error "DEVICE Not released!"
#endif
@ -266,10 +295,10 @@ static void ble_mem_init_config(void) {
#endif
osal_mem_set_heap((osalMemHdr_t*) g_largeHeap, LARGE_HEAP_SIZE);
LL_InitConnectContext(pConnContext, g_pConnectionBuffer,
BLE_MAX_ALLOW_CONNECTION,
BLE_MAX_ALLOW_PKT_PER_EVENT_TX,
BLE_MAX_ALLOW_PKT_PER_EVENT_RX,
BLE_PKT_VERSION);
BLE_MAX_ALLOW_CONNECTION,
BLE_MAX_ALLOW_PKT_PER_EVENT_TX,
BLE_MAX_ALLOW_PKT_PER_EVENT_RX,
BLE_PKT_VERSION);
#if ( MAX_CONNECTION_SLAVE_NUM > 0 )
static ALIGN4_U8 g_llDevList[BLE_CONN_LL_DEV_LIST_SIZE];
ll_multi_conn_llDevList_Init(g_llDevList);
@ -297,9 +326,9 @@ static void hal_rfphy_init(void) {
//============config BLE_PHY TYPE
g_rfPhyPktFmt = PKT_FMT_BLE1M;
//============config RF Frequency Offset
g_rfPhyFreqOffSet = RF_PHY_FREQ_FOFF_00KHZ;
g_rfPhyFreqOffSet = RF_PHY_FREQ_FOFF_00KHZ; // hal_rfPhyFreqOff_Set();
//============config xtal 16M cap
XTAL16M_CAP_SETTING(0x09);
XTAL16M_CAP_SETTING(0x09); // hal_xtal16m_cap_Set();
XTAL16M_CURRENT_SETTING(0x01);
hal_rc32k_clk_tracking_init();
@ -327,7 +356,7 @@ static void hal_init(void) {
/////////////////////////////////////////////////////////////////////////////////////////////////////////
int main(void) {
g_system_clk = SYS_CLK_XTAL_16M; // SYS_CLK_DBL_32M, SYS_CLK_XTAL_16M, SYS_CLK_DLL_64M
g_system_clk = SYS_CLK_XTAL_16M; // SYS_CLK_XTAL_16M, SYS_CLK_DBL_32M, SYS_CLK_DLL_64M
g_clk32K_config = CLK_32K_RCOSC; // CLK_32K_XTAL, CLK_32K_RCOSC
#if 0 // defined ( __GNUC__ ) // -> *.ld
@ -372,6 +401,7 @@ int main(void) {
extern void ll_patch_slave(void);
ll_patch_slave();
#endif
hal_rfphy_init();
hal_init();

View file

@ -26,7 +26,7 @@
#include "ble_ota.h"
#include "logger.h"
#include "hci.h"
#include "lcd_th05.h"
#include "lcd.h"
#include "sensors.h"
/*********************************************************************

View file

@ -16,7 +16,14 @@ measured_data_t measured_data;
#include "dev_i2c.h"
#include "trigger.h"
#define I2C_SPEED 1
dev_i2c_t i2c_dev0 = {
//.pi2cdev = AP_I2C0,
.scl = I2C_SCL,
.sda = I2C_SDA,
.speed = I2C_100KHZ,
.i2c_num = 0
};
thsensor_cfg_t thsensor_cfg;
@ -46,14 +53,16 @@ int read_sensor_cht8xxx(void) {
uint8_t reg_data[4];
int32_t _r32;
int16_t _r16;
init_i2c(I2C_100KHZ);
i2c_dev0.speed = I2C_100KHZ;
init_i2c(&i2c_dev0);
if(thsensor_cfg.vid == CHT8305_VID) {
_r32 = read_i2c_nabuf(thsensor_cfg.i2c_addr, reg_data, 4);
_r32 = read_i2c_nabuf(&i2c_dev0, thsensor_cfg.i2c_addr, reg_data, 4);
} else {
_r32 = read_i2c_bytes(thsensor_cfg.i2c_addr, CHT83xx_REG_TMP, reg_data, 2);
_r32 |= read_i2c_bytes(thsensor_cfg.i2c_addr, CHT83xx_REG_HMD, &reg_data[2], 2);
_r32 = read_i2c_bytes(&i2c_dev0, thsensor_cfg.i2c_addr, CHT83xx_REG_TMP, reg_data, 2);
_r32 |= read_i2c_bytes(&i2c_dev0, thsensor_cfg.i2c_addr, CHT83xx_REG_HMD, &reg_data[2], 2);
}
deinit_i2c();
deinit_i2c(&i2c_dev0);
i2c_dev0.speed = I2C_400KHZ;
if (!_r32) {
_r16 = (reg_data[0] << 8) | reg_data[1];
measured_data.temp = ((int32)(_r16 * thsensor_cfg.coef.temp_k) >> 16) + thsensor_cfg.coef.temp_z;; // x 0.01 C
@ -72,10 +81,11 @@ int read_sensor_cht8xxx(void) {
int read_sensor_ahtxx(void) {
uint32_t _temp;
uint8_t reg_data[8];
init_i2c(I2C_400KHZ);
if(!read_i2c_nabuf(thsensor_cfg.i2c_addr, reg_data, 7)
init_i2c(&i2c_dev0);
if(!read_i2c_nabuf(&i2c_dev0, thsensor_cfg.i2c_addr, reg_data, 7)
&& (reg_data[0] & 0x80) == 0) { // busy
deinit_i2c();
//send_i2c_wreg(&i2c_dev0, thsensor_cfg.i2c_addr, AHT2x_CMD_INI, AHT2x_DATA_LPWR);
deinit_i2c(&i2c_dev0);
_temp = ((reg_data[3] & 0x0F) << 16) | (reg_data[4] << 8) | reg_data[5];
measured_data.temp = ((uint32_t)(_temp * thsensor_cfg.coef.temp_k) >> 16) + thsensor_cfg.coef.temp_z; // x 0.01 C
_temp = (reg_data[1] << 12) | (reg_data[2] << 4) | (reg_data[3] >> 4);
@ -87,7 +97,8 @@ int read_sensor_ahtxx(void) {
measured_data.count++;
return 0;
}
deinit_i2c();
//send_i2c_wreg(&i2c_dev0, thsensor_cfg.i2c_addr, AHT2x_CMD_INI, AHT2x_DATA_LPWR);
deinit_i2c(&i2c_dev0);
return 1;
}
@ -108,26 +119,27 @@ int read_sensor(void) {
void start_measure(void) {
if(thsensor_cfg.i2c_addr) {
if(thsensor_cfg.i2c_addr == AHT2x_I2C_ADDR) {
init_i2c(I2C_SPEED);
send_i2c_wreg(thsensor_cfg.i2c_addr, AHT2x_CMD_TMS, AHT2x_DATA_TMS);
deinit_i2c();
init_i2c(&i2c_dev0);
send_i2c_wreg(&i2c_dev0, thsensor_cfg.i2c_addr, AHT2x_CMD_TMS, AHT2x_DATA_TMS);
deinit_i2c(&i2c_dev0);
}
else if(thsensor_cfg.vid == CHT8305_VID) {
init_i2c(I2C_SPEED);
send_i2c_byte(thsensor_cfg.i2c_addr, CHT83xx_REG_TMP); // start measure T/H
deinit_i2c();
init_i2c(&i2c_dev0);
send_i2c_byte(&i2c_dev0, thsensor_cfg.i2c_addr, CHT83xx_REG_TMP); // start measure T/H
deinit_i2c(&i2c_dev0);
}
}
}
__ATTR_SECTION_XIP__ void init_sensor(void) {
__ATTR_SECTION_XIP__
void init_sensor(void) {
uint8_t *ptabinit = NULL;
thsensor_cfg.read_sensor = NULL;
init_i2c(I2C_400KHZ);
init_i2c(&i2c_dev0);
//send_i2c_byte(0,6);
thsensor_cfg.i2c_addr = CHT83xx_I2C_ADDR;
if(!read_i2c_bytes(thsensor_cfg.i2c_addr, CHT83xx_REG_MID, (uint8 *)&thsensor_cfg.mid, 2) // 0x5959
&& !read_i2c_bytes(thsensor_cfg.i2c_addr, CHT83xx_REG_VID, (uint8 *)&thsensor_cfg.vid, 2)) { // 0x8215
if(!read_i2c_bytes(&i2c_dev0, thsensor_cfg.i2c_addr, CHT83xx_REG_MID, (uint8 *)&thsensor_cfg.mid, 2) // 0x5959
&& !read_i2c_bytes(&i2c_dev0, thsensor_cfg.i2c_addr, CHT83xx_REG_VID, (uint8 *)&thsensor_cfg.vid, 2)) { // 0x8215
if(thsensor_cfg.mid == CHT83xx_MID) {
if(thsensor_cfg.vid == CHT8305_VID) {
#if 0 // USE_DEFAULT_SETS_SENSOR
@ -136,13 +148,13 @@ __ATTR_SECTION_XIP__ void init_sensor(void) {
CHT8305_CFG_SOFT_RESET | CHT8305_CFG_MODE);
WaitMs(SENSOR_RESET_TIMEOUT_ms);
// Configure
send_i2c_wreg(thsensor_cfg.i2c_addr, CHT8305_REG_CFG, CHT8305_CFG_MODE );
send_i2c_wreg(&i2c_dev0, thsensor_cfg.i2c_addr, CHT8305_REG_CFG, CHT8305_CFG_MODE );
#endif
ptabinit = (uint8_t *)&def_thcoef_cht8305;
thsensor_cfg.read_sensor = read_sensor_cht8xxx;
} else if(thsensor_cfg.vid == CHT8215_VID) { // 0x8210/0x8215 ?
if(adv_wrk.measure_interval_ms >= 5000) // > 5 sec
send_i2c_wreg(thsensor_cfg.i2c_addr, CHT8215_REG_CRT, 0x0300); // Set conversion ratio 5 sec
send_i2c_wreg(&i2c_dev0, thsensor_cfg.i2c_addr, CHT8215_REG_CRT, 0x0300); // Set conversion ratio 5 sec
// else 1 sec
ptabinit = (uint8_t *)&def_thcoef_cht8215;
thsensor_cfg.read_sensor = read_sensor_cht8xxx;
@ -151,7 +163,7 @@ __ATTR_SECTION_XIP__ void init_sensor(void) {
thsensor_cfg.i2c_addr = 0;
} else {
thsensor_cfg.i2c_addr = AHT2x_I2C_ADDR;
if(!send_i2c_wreg(thsensor_cfg.i2c_addr, AHT2x_CMD_TMS, AHT2x_DATA_TMS)) {
if(!send_i2c_wreg(&i2c_dev0, thsensor_cfg.i2c_addr, AHT2x_CMD_TMS, AHT2x_DATA_TMS)) {
ptabinit = (uint8_t *)&def_thcoef_aht30;
thsensor_cfg.read_sensor = read_sensor_ahtxx;
thsensor_cfg.vid = 0xAAAA;
@ -161,7 +173,7 @@ __ATTR_SECTION_XIP__ void init_sensor(void) {
if(thsensor_cfg.coef.temp_k == 0 && ptabinit) {
memcpy(&thsensor_cfg.coef, ptabinit, sizeof(thsensor_cfg.coef));
}
deinit_i2c();
deinit_i2c(&i2c_dev0);
}
#endif // (DEV_SERVICES & SERVICE_THS)

View file

@ -132,6 +132,7 @@ struct __attribute__((packed)) _cht8305_config_t{
#define AHT2x_CMD_TMS 0x0AC // Trigger Measurement Command
#define AHT2x_DATA_TMS 0x3300 // Trigger Measurement data
#define AHT2x_CMD_RST 0x0BA // Soft Reset Command
#define AHT2x_DATA_LPWR 0x0800 // go into low power mode
typedef struct __attribute__((packed)) _measured_flg_t {

View file

@ -42,7 +42,7 @@
#include "battery.h"
#include "sbp_profile.h"
#include "ble_ota.h"
#include "lcd_th05.h"
#include "lcd.h"
#include "logger.h"
#include "trigger.h"
/*********************************************************************
@ -310,7 +310,7 @@ static void posedge_int_wakeup_cb(GPIO_Pin_e pin, IO_Wakeup_Pol_e type)
#endif
#if (DEV_SERVICES & SERVICE_RDS)
if(pin == GPIO_INP) {
osal_set_event(simpleBLEPeripheral_TaskID, PIN_INPYT_EVT);
osal_set_event(simpleBLEPeripheral_TaskID, PIN_INPUT_EVT);
}
#endif
}
@ -335,7 +335,7 @@ static void negedge_int_wakeup_cb(GPIO_Pin_e pin, IO_Wakeup_Pol_e type)
#endif
#if (DEV_SERVICES & SERVICE_RDS)
if(pin == GPIO_INP) {
osal_set_event(simpleBLEPeripheral_TaskID, PIN_INPYT_EVT);
osal_set_event(simpleBLEPeripheral_TaskID, PIN_INPUT_EVT);
}
#endif
}
@ -639,7 +639,7 @@ uint16_t BLEPeripheral_ProcessEvent( uint8_t task_id, uint16_t events )
if(cfg.flg & FLG_MEAS_NOTIFY)
measure_notify();
#if (DEV_SERVICES & SERVICE_SCREEN)
chow_measure();
chow_lcd(1);
#endif
#endif
}
@ -665,7 +665,7 @@ uint16_t BLEPeripheral_ProcessEvent( uint8_t task_id, uint16_t events )
return ( events ^ SBP_START_DEVICE_EVT );
}
#if (DEV_SERVICES & SERVICE_RDS)
if(events & PIN_INPYT_EVT) {
if(events & PIN_INPUT_EVT) {
int ev = 0;
if(hal_gpio_read(GPIO_INP)) {
if(!measured_data.flg.pin_input) {
@ -690,7 +690,7 @@ uint16_t BLEPeripheral_ProcessEvent( uint8_t task_id, uint16_t events )
measure_notify();
}
}
return(events ^ PIN_INPYT_EVT);
return(events ^ PIN_INPUT_EVT);
}
#endif
#if (DEV_SERVICES & SERVICE_HISTORY)

View file

@ -54,7 +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
#define PIN_INPUT_EVT 0x0080 // pin input event
/*********************************************************************
* MACROS

View file

@ -1,6 +1,6 @@
<html class="phy6222Class"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>PHY62x2 BTHome v1.1</title>
<title>PHY62x2 BTHome v1.2</title>
<!--<link rel="stylesheet" type="text/css" href="styles.css" />
<link rel="stylesheet" type="text/css" href="chart.css" />
<script type="text/javascript" src="dygraph.min.js" /></script> /-->
@ -742,6 +742,8 @@ function auxControls(state)
if ( devSrv.services & SERVICE_SCREEN ) {
$('tblChkCfg').style.display = "block";
$('tblComfort').style.display = "block";
} else {
$('tblChkCfg').style.display = "none";
$('tblComfort').style.display = "none";
@ -1245,6 +1247,7 @@ function showConfig() {
$('chkCfgClock').checked = (devCfg.flg & 2) != 0;
$('chkCfgSmiley').checked = (devCfg.flg & 4) != 0;
$('chkCfgTrg').checked = (devCfg.flg & 8) != 0;
$('chkCfgLcdOff').checked = (devCfg.flg & 16) != 0;
let txPwr = 31;
el = $('selTxPwr');
for(let n = 0; n < el.options.length; n++) if(el.options[n].value >= devCfg.tx_power) txPwr = el.options[n].value;
@ -1608,10 +1611,12 @@ function getDevName() {
function chkDevCfg() {
if(devCfg.flg == null) return;
devCfg.flg = ($('chkCfgNotify').checked) ? 1 : 0;
devCfg.flg &= 0xffffffe0;
devCfg.flg |= ($('chkCfgNotify').checked) ? 1 : 0;
devCfg.flg |= ($('chkCfgClock').checked) ? 2 : 0;
devCfg.flg |= ($('chkCfgSmiley').checked) ? 4 : 0;
devCfg.flg |= ($('chkCfgTrg').checked) ? 8 : 0;
devCfg.flg |= ($('chkCfgLcdOff').checked) ? 16 : 0;
devCfg.tx_power = $('selTxPwr').value & 0x3f; // 0..0x1f -> -20..+5 dBm ? нелинейное 0x1f = +0 дБм
let connect_latency = parseInt($('inpLat').value); // = (connect_latency + 1)*30 ms
if (connect_latency < 0) {
@ -2143,6 +2148,7 @@ window.onload = function() {
<td><label><input type="checkbox" id="chkCfgClock"/>Показывать время</label></td>
<td><label><input type="checkbox" id="chkCfgSmiley"/>Отображать смайлик</label></td>
<td><label><input type="checkbox" id="chkCfgTrg"/>Отображать триггер</label></td>
<td><label><input type="checkbox" id="chkCfgLcdOff"/>Отключить дисплей</label></td>
</tr>
</table>
<table>
@ -2283,7 +2289,7 @@ window.onload = function() {
<tr>
<td style="width:100px;">Команда:</td>
<td><button type="button" id="btnSendCommand" onclick="sendCommand()" style="width:120px;">Выполнить</button></td>
<td><input type="text" id="inpCmdData" value="55" maxlength="16"></td>
<td><input type="text" id="inpCmdData" value="55" maxlength="40"></td>
</tr>
</table>
<hr>

1
wr_thb1.cmd Normal file
View file

@ -0,0 +1 @@
python3 rdwr_phy62x2.py -p COM11 -e -r wh ./bin/BOOT_THB1_v13.hex