This commit is contained in:
pvvx 2024-01-31 16:37:06 +03:00
parent c25bc65280
commit 3c2c089e35
32 changed files with 9621 additions and 9352 deletions

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

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.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -1,5 +1,5 @@
@set PATH=D:\MCU\GNU_Tools_ARM_Embedded\13.2.rel1\bin;%PATH% @set PATH=D:\MCU\GNU_Tools_ARM_Embedded\13.2.rel1\bin;%PATH%
@set SWVER=_v08 @set SWVER=_v09
@del /Q "build\THB2%SWVER%.hex" @del /Q "build\THB2%SWVER%.hex"
@del /Q "build\THB2%SWVER%.bin" @del /Q "build\THB2%SWVER%.bin"
@mkdir .\bin @mkdir .\bin
@ -13,6 +13,12 @@
@make -s -j PROJECT_NAME=BTH01%SWVER% POJECT_DEF="-DDEVICE=DEVICE_BTH01" @make -s -j PROJECT_NAME=BTH01%SWVER% POJECT_DEF="-DDEVICE=DEVICE_BTH01"
@if not exist "build\BTH01%SWVER%.hex" goto :error @if not exist "build\BTH01%SWVER%.hex" goto :error
@copy "build\BTH01%SWVER%.bin" .\bin @copy "build\BTH01%SWVER%.bin" .\bin
@del /Q "build\TH05%SWVER%.hex"
@del /Q "build\TH05%SWVER%.bin"
@make -s clean
@make -s -j PROJECT_NAME=TH05%SWVER% POJECT_DEF="-DDEVICE=DEVICE_TH05"
@if not exist "build\TH05%SWVER%.hex" goto :error
@copy "build\TH05%SWVER%.bin" .\bin
@del /Q "build\BOOT_THB2%SWVER%.hex" @del /Q "build\BOOT_THB2%SWVER%.hex"
@make -s clean @make -s clean
@make -s -j PROJECT_NAME=BOOT_THB2%SWVER% BOOT_OTA=1 POJECT_DEF="-DDEVICE=DEVICE_THB2" @make -s -j PROJECT_NAME=BOOT_THB2%SWVER% BOOT_OTA=1 POJECT_DEF="-DDEVICE=DEVICE_THB2"
@ -23,13 +29,6 @@
@make -s -j PROJECT_NAME=BOOT_BTH01%SWVER% BOOT_OTA=1 POJECT_DEF="-DDEVICE=DEVICE_BTH01" @make -s -j PROJECT_NAME=BOOT_BTH01%SWVER% BOOT_OTA=1 POJECT_DEF="-DDEVICE=DEVICE_BTH01"
@if not exist "build\BOOT_BTH01%SWVER%.hex" goto :error @if not exist "build\BOOT_BTH01%SWVER%.hex" goto :error
@copy "build\BOOT_BTH01%SWVER%.hex" .\bin @copy "build\BOOT_BTH01%SWVER%.hex" .\bin
@del /Q "build\TH05%SWVER%.hex"
@del /Q "build\TH05%SWVER%.bin"
@mkdir .\bin
@make -s clean
@make -s -j PROJECT_NAME=TH05%SWVER% POJECT_DEF="-DDEVICE=DEVICE_TH05"
@if not exist "build\TH05%SWVER%.hex" goto :error
@copy "build\TH05%SWVER%.bin" .\bin
@del /Q "build\BOOT_TH05%SWVER%.hex" @del /Q "build\BOOT_TH05%SWVER%.hex"
@make -s clean @make -s clean
@make -s -j PROJECT_NAME=BOOT_TH05%SWVER% BOOT_OTA=1 POJECT_DEF="-DDEVICE=DEVICE_TH05" @make -s -j PROJECT_NAME=BOOT_TH05%SWVER% BOOT_OTA=1 POJECT_DEF="-DDEVICE=DEVICE_TH05"

View file

@ -6,7 +6,7 @@
#include "config.h" #include "config.h"
#include "adc.h" #include "adc.h"
#include "battery.h" #include "battery.h"
#include "bleperipheral.h" #include "thb2_main.h"
#include "pwrmgr.h" #include "pwrmgr.h"
#include "jump_function.h" #include "jump_function.h"
#include "sensor.h" #include "sensor.h"

View file

@ -96,8 +96,8 @@ static uint32_t ota_test_crc(void) {
unsigned char * faddr = (unsigned char *)(ota.program_offset + 4); unsigned char * faddr = (unsigned char *)(ota.program_offset + 4);
int len = ota.pkt_total-2; int len = ota.pkt_total-2;
uint8_t buf[16]; uint8_t buf[16];
osal_memcpy(&buf[0], &ota.fw_value, 4); memcpy(&buf[0], &ota.fw_value, 4);
osal_memcpy(&buf[4], faddr, 12); memcpy(&buf[4], faddr, 12);
faddr += 12; faddr += 12;
crc = get_crc32_16bytes(crc, buf); crc = get_crc32_16bytes(crc, buf);
while(len > 0) { while(len > 0) {
@ -252,7 +252,7 @@ int ota_parser(unsigned char *pout, unsigned char *pmsg, unsigned int msg_size)
if (err_flg != OTA_SUCCESS) { if (err_flg != OTA_SUCCESS) {
ota.err_flag = err_flg; ota.err_flag = err_flg;
// send/Notify? // send/Notify?
osal_memcpy(pout, &ota, 20); memcpy(pout, &ota, 20);
return 20; return 20;
} }
return 0; return 0;
@ -289,7 +289,7 @@ static uint32_t start_app(void) {
//&& info_seg.waddr < 0x11000000 //&& info_seg.waddr < 0x11000000
//&& info_seg.waddr > 0x11020000 //&& info_seg.waddr > 0x11020000
&& info_seg.size < (128*1024)) { // < 128k && info_seg.size < (128*1024)) { // < 128k
osal_memcpy((void *)info_seg.waddr, (void *)info_seg.faddr, info_seg.size); memcpy((void *)info_seg.waddr, (void *)info_seg.faddr, info_seg.size);
} }
info_app.seg_count--; info_app.seg_count--;
} }

View file

@ -56,8 +56,6 @@ typedef struct _ota_par_t {
uint32_t erase_addr; uint32_t erase_addr;
} ota_par_t; } ota_par_t;
#define OTA_MODE_SELECT_REG (AP_AON->RTCCC2) // [0x4000f034] == 0x55 -> OTA
extern ota_par_t ota; extern ota_par_t ota;
int ota_parser(unsigned char *pout, unsigned char *pmsg, unsigned int msg_size); int ota_parser(unsigned char *pout, unsigned char *pmsg, unsigned int msg_size);

View file

@ -19,7 +19,7 @@
#include "gapbondmgr.h" #include "gapbondmgr.h"
#include "flash.h" #include "flash.h"
#include "flash_eep.h" #include "flash_eep.h"
#include "bleperipheral.h" #include "thb2_main.h"
#include "sbp_profile.h" #include "sbp_profile.h"
#include "sensor.h" #include "sensor.h"
#include "cmd_parser.h" #include "cmd_parser.h"
@ -50,41 +50,41 @@ int cmd_parser(uint8_t * obuf, uint8_t * ibuf, uint32_t len) {
obuf[0] = cmd; obuf[0] = cmd;
obuf[1] = 0; // no err obuf[1] = 0; // no err
if (cmd == CMD_ID_DEVID) { // Get DEV_ID if (cmd == CMD_ID_DEVID) { // Get DEV_ID
osal_memcpy(obuf, &dev_id, sizeof(dev_id)); memcpy(obuf, &dev_id, sizeof(dev_id));
olen = sizeof(dev_id); olen = sizeof(dev_id);
} else if (cmd == CMD_ID_CFG) { // Get/Set device config } else if (cmd == CMD_ID_CFG) { // Get/Set device config
if (--len > sizeof(cfg)) if (--len > sizeof(cfg))
len = sizeof(cfg); len = sizeof(cfg);
if (len) { if (len) {
osal_memcpy(&cfg, &ibuf[1], len); memcpy(&cfg, &ibuf[1], len);
test_config(); test_config();
flash_write_cfg(&cfg, EEP_ID_CFG, sizeof(cfg)); flash_write_cfg(&cfg, EEP_ID_CFG, sizeof(cfg));
} }
osal_memcpy(&obuf[1], &cfg, sizeof(cfg)); memcpy(&obuf[1], &cfg, sizeof(cfg));
olen = sizeof(cfg) + 1; olen = sizeof(cfg) + 1;
} else if (cmd == CMD_ID_CFG_DEF) { // Set default device config } else if (cmd == CMD_ID_CFG_DEF) { // Set default device config
osal_memcpy(&cfg, &def_cfg, sizeof(cfg)); memcpy(&cfg, &def_cfg, sizeof(cfg));
test_config(); test_config();
flash_write_cfg(&cfg, EEP_ID_CFG, sizeof(cfg)); flash_write_cfg(&cfg, EEP_ID_CFG, sizeof(cfg));
osal_memcpy(&obuf[1], &cfg, sizeof(cfg)); memcpy(&obuf[1], &cfg, sizeof(cfg));
olen = sizeof(cfg) + 1; olen = sizeof(cfg) + 1;
#if (DEV_SERVICES & SERVICE_THS) #if (DEV_SERVICES & SERVICE_THS)
} else if (cmd == CMD_ID_CFS) { // Get/Set sensor config } else if (cmd == CMD_ID_CFS) { // Get/Set sensor config
if (--len > sizeof(thsensor_cfg.coef)) if (--len > sizeof(thsensor_cfg.coef))
len = sizeof(thsensor_cfg.coef); len = sizeof(thsensor_cfg.coef);
if (len) { if (len) {
osal_memcpy(&thsensor_cfg.coef, &ibuf[1], len); memcpy(&thsensor_cfg.coef, &ibuf[1], len);
flash_write_cfg(&thsensor_cfg.coef, EEP_ID_CFS, sizeof(thsensor_cfg.coef)); flash_write_cfg(&thsensor_cfg.coef, EEP_ID_CFS, sizeof(thsensor_cfg.coef));
} }
osal_memcpy(&obuf[1], &thsensor_cfg, thsensor_cfg_send_size); memcpy(&obuf[1], &thsensor_cfg, thsensor_cfg_send_size);
olen = thsensor_cfg_send_size + 1; olen = thsensor_cfg_send_size + 1;
} else if (cmd == CMD_ID_CFS_DEF) { // Get/Set default sensor config } else if (cmd == CMD_ID_CFS_DEF) { // Get/Set default sensor config
osal_memset(&thsensor_cfg, 0, thsensor_cfg_send_size); memset(&thsensor_cfg, 0, thsensor_cfg_send_size);
init_sensor(); init_sensor();
osal_memcpy(&obuf[1], &thsensor_cfg, thsensor_cfg_send_size); memcpy(&obuf[1], &thsensor_cfg, thsensor_cfg_send_size);
olen = thsensor_cfg_send_size + 1; olen = thsensor_cfg_send_size + 1;
} else if (cmd == CMD_ID_SEN_ID) { } else if (cmd == CMD_ID_SEN_ID) {
osal_memcpy(&obuf[1], (uint8_t *)&thsensor_cfg.mid, 5); memcpy(&obuf[1], (uint8_t *)&thsensor_cfg.mid, 5);
olen = 1 + 5; olen = 1 + 5;
#endif #endif
#if (DEV_SERVICES & SERVICE_HISTORY) #if (DEV_SERVICES & SERVICE_HISTORY)
@ -106,13 +106,11 @@ int cmd_parser(uint8_t * obuf, uint8_t * ibuf, uint32_t len) {
} }
#endif #endif
} else if (cmd == CMD_ID_SERIAL) { } else if (cmd == CMD_ID_SERIAL) {
osal_memcpy(&obuf[1], devInfoSerialNumber, sizeof(devInfoSerialNumber)-1); memcpy(&obuf[1], devInfoSerialNumber, sizeof(devInfoSerialNumber)-1);
olen = 1 + sizeof(devInfoSerialNumber)-1; olen = 1 + sizeof(devInfoSerialNumber)-1;
} else if (cmd == CMD_ID_FLASH_ID) { } else if (cmd == CMD_ID_FLASH_ID) {
osal_memcpy(&obuf[1], (uint8_t *)&phy_flash.IdentificationID, 8); memcpy(&obuf[1], (uint8_t *)&phy_flash.IdentificationID, 8);
olen = 1 + 8; olen = 1 + 8;
// } else if (cmd == CMD_ID_DNAME) {
// } else if (cmd == CMD_ID_DEV_MAC) {
} else if (cmd == CMD_ID_MTU) { } else if (cmd == CMD_ID_MTU) {
if (ibuf[1] <= MTU_SIZE) if (ibuf[1] <= MTU_SIZE)
ATT_UpdateMtuSize(gapRole_ConnectionHandle, ibuf[1]); ATT_UpdateMtuSize(gapRole_ConnectionHandle, ibuf[1]);
@ -120,20 +118,24 @@ int cmd_parser(uint8_t * obuf, uint8_t * ibuf, uint32_t len) {
obuf[1] = 0xff; obuf[1] = 0xff;
olen = 2; olen = 2;
} else if (cmd == CMD_ID_REBOOT) { } else if (cmd == CMD_ID_REBOOT) {
GAPRole_TerminateConnection();
if(len >= 2) { if(len >= 2) {
write_reg(OTA_MODE_SELECT_REG, ibuf[1]); wrk.reboot = ibuf[1];
} obuf[1] = ibuf[1];
hal_system_soft_reset(); } else
obuf[1] = wrk.reboot;
olen = 2;
} else if (cmd == CMD_ID_MEASURE) {
memcpy(&obuf[1], &measured_data, send_len_measured_data);
olen = 1 + send_len_measured_data;
#if (DEV_SERVICES & SERVICE_SCREEN) #if (DEV_SERVICES & SERVICE_SCREEN)
} else if (cmd == CMD_ID_LCD_DUMP) { // Get/set lcd buf } else if (cmd == CMD_ID_LCD_DUMP) { // Get/set lcd buf
if (--len > sizeof(display_buff)) if (--len > sizeof(display_buff))
len = sizeof(display_buff); len = sizeof(display_buff);
if (len) { if (len) {
osal_memcpy(display_buff, &ibuf[1], len); memcpy(display_buff, &ibuf[1], len);
update_lcd(); update_lcd();
} }
osal_memcpy(&obuf[1], display_buff, sizeof(display_buff)); memcpy(&obuf[1], display_buff, sizeof(display_buff));
olen = 1 + sizeof(display_buff); olen = 1 + sizeof(display_buff);
#endif #endif
} else if (cmd == CMD_ID_UTC_TIME) { // Get/set utc time } else if (cmd == CMD_ID_UTC_TIME) { // Get/set utc time
@ -146,7 +148,7 @@ int cmd_parser(uint8_t * obuf, uint8_t * ibuf, uint32_t len) {
//clkt.utc_time_add = 0; //clkt.utc_time_add = 0;
} }
tmp = get_utc_time_sec(); tmp = get_utc_time_sec();
osal_memcpy(&obuf[1], &tmp, 4); memcpy(&obuf[1], &tmp, 4);
#if (DEV_SERVICES & SERVICE_TIME_ADJUST) #if (DEV_SERVICES & SERVICE_TIME_ADJUST)
memcpy(&obuf[4 + 1], &clkt.utc_set_time_sec, sizeof(clkt.utc_set_time_sec)); memcpy(&obuf[4 + 1], &clkt.utc_set_time_sec, sizeof(clkt.utc_set_time_sec));
olen = 4 + sizeof(clkt.utc_set_time_sec) + 1; olen = 4 + sizeof(clkt.utc_set_time_sec) + 1;
@ -162,8 +164,27 @@ int cmd_parser(uint8_t * obuf, uint8_t * ibuf, uint32_t len) {
memcpy(&send_buf[1], &clkt.delta_time, sizeof(clkt.delta_time)); memcpy(&send_buf[1], &clkt.delta_time, sizeof(clkt.delta_time));
olen = sizeof(clkt.delta_time) + 1; olen = sizeof(clkt.delta_time) + 1;
#endif #endif
} else if (cmd == CMD_ID_DEV_MAC) {
if (len > MAC_LEN) {
if(memcmp(ownPublicAddr, &ibuf[1], MAC_LEN)) {
memcpy(ownPublicAddr, &ibuf[1], MAC_LEN);
flash_write_cfg(ownPublicAddr, EEP_ID_MAC, MAC_LEN);
wrk.reboot |= 1;
}
}
memcpy(&obuf[1], ownPublicAddr, MAC_LEN);
olen = MAC_LEN + 1;
} else if (cmd == CMD_ID_DNAME) {
if (len > 1 && len < B_MAX_ADV_LEN - 2) {
len--;
memcpy(&gapRole_ScanRspData[2], &ibuf[1], len);
flash_write_cfg(&gapRole_ScanRspData[2], EEP_ID_DVN, len);
set_dev_name();
}
olen = gapRole_ScanRspData[0];
memcpy(&obuf[1], &gapRole_ScanRspData[2], olen - 1);
//---------- Debug commands (unsupported in different versions!): //---------- Debug commands (unsupported in different versions!):
} else if (cmd == CMD_ID_EEP_RW && len > 2) { } else if (cmd == CMD_ID_EEP_RW && len > 2) {
obuf[1] = ibuf[1]; obuf[1] = ibuf[1];
@ -182,11 +203,11 @@ int cmd_parser(uint8_t * obuf, uint8_t * ibuf, uint32_t len) {
uint8_t *p = (uint8_t *)tmp; uint8_t *p = (uint8_t *)tmp;
if(len > 5) { if(len > 5) {
len -= 5; len -= 5;
osal_memcpy(p, &ibuf[5], len); memcpy(p, &ibuf[5], len);
} else } else
len = SEND_DATA_SIZE; len = SEND_DATA_SIZE;
osal_memcpy(obuf, ibuf, 5); memcpy(obuf, ibuf, 5);
osal_memcpy(&obuf[5], p, len); memcpy(&obuf[5], p, len);
olen = len + 1 + 4; olen = len + 1 + 4;
} else if (cmd == CMD_ID_REG_RW && len > 4) { // Read/Write 32 bits register (aligned) } else if (cmd == CMD_ID_REG_RW && len > 4) { // Read/Write 32 bits register (aligned)
volatile uint32_t *p = (volatile uint32_t *)tmp; volatile uint32_t *p = (volatile uint32_t *)tmp;
@ -198,8 +219,8 @@ int cmd_parser(uint8_t * obuf, uint8_t * ibuf, uint32_t len) {
olen = 2; olen = 2;
} }
tmp = *p; tmp = *p;
osal_memcpy(obuf, ibuf, 5); memcpy(obuf, ibuf, 5);
osal_memcpy(&obuf[5], &tmp, 4); memcpy(&obuf[5], &tmp, 4);
olen = 1 + 4 + 4; olen = 1 + 4 + 4;
} else { } else {
obuf[1] = 0xff; // Error cmd obuf[1] = 0xff; // Error cmd

View file

@ -22,7 +22,7 @@
#include "gapbondmgr.h" #include "gapbondmgr.h"
#include "pwrmgr.h" #include "pwrmgr.h"
#include "gpio.h" #include "gpio.h"
#include "bleperipheral.h" #include "thb2_main.h"
#include "ll.h" #include "ll.h"
#include "ll_hw_drv.h" #include "ll_hw_drv.h"
#include "ll_def.h" #include "ll_def.h"
@ -42,17 +42,18 @@
extern gapPeriConnectParams_t periConnParameters; extern gapPeriConnectParams_t periConnParameters;
clock_time_t clkt; clock_time_t clkt;
cfg_t cfg; cfg_t cfg;
work_parm_t wrk;
adv_work_t adv_wrk;
const cfg_t def_cfg = { const cfg_t def_cfg = {
.flg = 0, .flg = 1,
.rf_tx_power = RF_PHY_TX_POWER_0DBM, .rf_tx_power = RF_PHY_TX_POWER_0DBM,
.advertising_interval = 80, // 80 * 62.5 = 5000 ms .advertising_interval = 80, // 80 * 62.5 = 5000 ms
.measure_interval = 2, // 5 * 2 = 10 sec .measure_interval = 2, // 5 * 2 = 10 sec
.batt_interval = 60, // 60 sec .batt_interval = 60, // 60 sec
.connect_latency = 29, // 30*30 = 900 ms .connect_latency = 29, // 30*30 = 900 ms
.averaging_measurements = 2 // 180*10 = 1800 sec, 30 min .averaging_measurements = 180 // 180*10 = 1800 sec, 30 min
}; };
/* /*
@ -85,8 +86,8 @@ uint32_t get_utc_time_sec(void) {
clkt.utc_time_tik = new_time_tik; clkt.utc_time_tik = new_time_tik;
clkt.utc_time_sec += clkt.utc_time_add >> 15; // div 32768 clkt.utc_time_sec += clkt.utc_time_add >> 15; // div 32768
clkt.utc_time_add &= (1<<15) - 1; clkt.utc_time_add &= (1<<15) - 1;
AP_AON->SLEEP_R[2] = clkt.utc_time_add; // сохранить AP_AON->SLEEP_R[2] = clkt.utc_time_add; // сохранить для восстановления часов после перезагрузки
AP_AON->SLEEP_R[3] = clkt.utc_time_sec; // сохранить AP_AON->SLEEP_R[3] = clkt.utc_time_sec; // сохранить для восстановления часов после перезагрузки
// HAL_EXIT_CRITICAL_SECTION(); // HAL_EXIT_CRITICAL_SECTION();
#if (DEV_SERVICES & SERVICE_TIME_ADJUST) #if (DEV_SERVICES & SERVICE_TIME_ADJUST)
// TODO // TODO
@ -117,13 +118,14 @@ void test_config(void) {
void load_eep_config(void) { void load_eep_config(void) {
if(!flash_supported_eep_ver(0, APP_VERSION)) { if(!flash_supported_eep_ver(0, APP_VERSION)) {
osal_memcpy(&cfg, &def_cfg, sizeof(cfg)); memcpy(&cfg, &def_cfg, sizeof(cfg));
memset(&thsensor_cfg.coef, 0, sizeof(thsensor_cfg.coef));
} else { } else {
if (flash_read_cfg(&cfg, EEP_ID_CFG, sizeof(cfg)) != sizeof(cfg)) if (flash_read_cfg(&cfg, EEP_ID_CFG, sizeof(cfg)) != sizeof(cfg))
osal_memcpy(&cfg, &def_cfg, sizeof(cfg)); memcpy(&cfg, &def_cfg, sizeof(cfg));
#if (DEV_SERVICES & SERVICE_THS) #if (DEV_SERVICES & SERVICE_THS)
if(flash_read_cfg(&thsensor_cfg.coef, EEP_ID_CFS, sizeof(thsensor_cfg.coef)) != sizeof(thsensor_cfg.coef)) { if(flash_read_cfg(&thsensor_cfg.coef, EEP_ID_CFS, sizeof(thsensor_cfg.coef)) != sizeof(thsensor_cfg.coef)) {
osal_memset(&thsensor_cfg.coef, 0, sizeof(thsensor_cfg.coef)); memset(&thsensor_cfg.coef, 0, sizeof(thsensor_cfg.coef));
} }
#endif #endif
} }

View file

@ -13,7 +13,7 @@
// #include "bus_dev.h" // #include "bus_dev.h"
#ifndef APP_VERSION #ifndef APP_VERSION
#define APP_VERSION 0x08 // BCD #define APP_VERSION 0x09 // BCD
#endif #endif
/* /*
@ -40,7 +40,7 @@
#define DEVICE_TH05 21 #define DEVICE_TH05 21
#ifndef DEVICE #ifndef DEVICE
#define DEVICE DEVICE_THB2 #define DEVICE DEVICE_TH05
#endif #endif
// supported services by the device (bits) // supported services by the device (bits)
@ -59,12 +59,12 @@
#define SERVICE_TIME_ADJUST 0x00001000 // пока нет #define SERVICE_TIME_ADJUST 0x00001000 // пока нет
#define SERVICE_HARD_CLOCK 0x00002000 // пока нет #define SERVICE_HARD_CLOCK 0x00002000 // пока нет
#define OTA_TYPE_NONE 0 // нет OTA #define OTA_TYPE_NONE 0 // нет OTA, только переключение из APP на boot прошивку
#define OTA_TYPE_BOOT (SERVICE_OTA | SERVICE_OTA_EXT) // вариант для прошивки boot + OTA #define OTA_TYPE_BOOT SERVICE_OTA // вариант для прошивки boot + OTA
#define OTA_TYPE_APP SERVICE_OTA_EXT // переключение из APP на OTA + boot прошивку, пока не реализовано #define OTA_TYPE_APP SERVICE_OTA_EXT // не реализовано
#ifndef OTA_TYPE #ifndef OTA_TYPE
#define OTA_TYPE OTA_TYPE_BOOT #define OTA_TYPE OTA_TYPE_NONE
#endif #endif
#define DEF_SOFTWARE_REVISION {'V', '0'+ (APP_VERSION >> 4), '.' , '0'+ (APP_VERSION & 0x0F), 0} #define DEF_SOFTWARE_REVISION {'V', '0'+ (APP_VERSION >> 4), '.' , '0'+ (APP_VERSION & 0x0F), 0}
@ -137,6 +137,7 @@
| SERVICE_SCREEN \ | SERVICE_SCREEN \
| SERVICE_THS \ | SERVICE_THS \
| SERVICE_KEY \ | SERVICE_KEY \
| SERVICE_HISTORY \
) )
#else #else
#define DEV_SERVICES (OTA_TYPE \ #define DEV_SERVICES (OTA_TYPE \
@ -196,10 +197,13 @@ typedef struct _cfg_t {
uint8_t reserved2; uint8_t reserved2;
}cfg_t; }cfg_t;
extern cfg_t cfg; extern cfg_t cfg;
extern const cfg_t def_cfg; extern const cfg_t def_cfg;
#define FLG_MEAS_NOTIFY 1 // включить Notify измерений
#define FLG_SHOW_TIME 2 // включить показ часов на LCD
typedef struct _adv_work_t { typedef struct _adv_work_t {
uint32_t measure_interval_ms; uint32_t measure_interval_ms;
uint32_t measure_batt_tik; uint32_t measure_batt_tik;
@ -207,9 +211,21 @@ typedef struct _adv_work_t {
uint8_t adv_con_count; uint8_t adv_con_count;
uint8_t adv_batt; uint8_t adv_batt;
} adv_work_t; } adv_work_t;
extern adv_work_t adv_wrk; extern adv_work_t adv_wrk;
#define OTA_MODE_SELECT_REG 0x4000f034
//#define OTA_MODE_SELECT_REG (AP_AON->RTCCC2) // [0x4000f034] == 0x55 -> OTA
#define BOOT_FLG_OTA 0x55
typedef struct _work_parm_t {
#if (DEV_SERVICES & SERVICE_SCREEN)
uint8_t lcd_count;
#endif
uint8_t reboot; // reboot on disconnect
uint8_t boot_flg;
} work_parm_t;
extern work_parm_t wrk;
// uint32_t rtc_get_counter(void); // tik 32768 // uint32_t rtc_get_counter(void); // tik 32768
#if 1 #if 1
#define clock_time_rtc() rtc_get_counter() #define clock_time_rtc() rtc_get_counter()

View file

@ -347,7 +347,7 @@ bStatus_t DevInfo_SetParameter( uint8 param, uint8 len, void* value )
{ {
#if SYSTEM_ID_ENABLE #if SYSTEM_ID_ENABLE
case DEVINFO_SYSTEM_ID: case DEVINFO_SYSTEM_ID:
osal_memcpy(devInfoSystemId, value, len); memcpy(devInfoSystemId, value, len);
break; break;
#endif #endif
@ -380,55 +380,55 @@ bStatus_t DevInfo_GetParameter( uint8 param, void* value )
{ {
#if SYSTEM_ID_ENABLE #if SYSTEM_ID_ENABLE
case DEVINFO_SYSTEM_ID: case DEVINFO_SYSTEM_ID:
osal_memcpy(value, devInfoSystemId, sizeof(devInfoSystemId)); memcpy(value, devInfoSystemId, sizeof(devInfoSystemId));
break; break;
#endif #endif
#if MODEL_NUMBER_STR_ENABLE #if MODEL_NUMBER_STR_ENABLE
case DEVINFO_MODEL_NUMBER: case DEVINFO_MODEL_NUMBER:
osal_memcpy(value, devInfoModelNumber, sizeof(devInfoModelNumber)); memcpy(value, devInfoModelNumber, sizeof(devInfoModelNumber));
break; break;
#endif #endif
#if SERIAL_NUMBER_STR_ENABLE #if SERIAL_NUMBER_STR_ENABLE
case DEVINFO_SERIAL_NUMBER: case DEVINFO_SERIAL_NUMBER:
osal_memcpy(value, devInfoSerialNumber, sizeof(devInfoSerialNumber)); memcpy(value, devInfoSerialNumber, sizeof(devInfoSerialNumber));
break; break;
#endif #endif
#if FIRMWARE_REVISION_ENABLE #if FIRMWARE_REVISION_ENABLE
case DEVINFO_FIRMWARE_REV: case DEVINFO_FIRMWARE_REV:
osal_memcpy(value, devInfoFirmwareRev, sizeof(devInfoFirmwareRev)); memcpy(value, devInfoFirmwareRev, sizeof(devInfoFirmwareRev));
break; break;
#endif #endif
#if HARDWARE_REVISION_ENABLE #if HARDWARE_REVISION_ENABLE
case DEVINFO_HARDWARE_REV: case DEVINFO_HARDWARE_REV:
osal_memcpy(value, devInfoHardwareRev, sizeof(devInfoHardwareRev)); memcpy(value, devInfoHardwareRev, sizeof(devInfoHardwareRev));
break; break;
#endif #endif
#if SOFTWARE_REVISION_ENABLE #if SOFTWARE_REVISION_ENABLE
case DEVINFO_SOFTWARE_REV: case DEVINFO_SOFTWARE_REV:
osal_memcpy(value, devInfoSoftwareRev, sizeof(devInfoSoftwareRev)); memcpy(value, devInfoSoftwareRev, sizeof(devInfoSoftwareRev));
break; break;
#endif #endif
#if MANUFACTURE_NAME_STR_ENABLE #if MANUFACTURE_NAME_STR_ENABLE
case DEVINFO_MANUFACTURER_NAME: case DEVINFO_MANUFACTURER_NAME:
osal_memcpy(value, devInfoMfrName, sizeof(devInfoMfrName)); memcpy(value, devInfoMfrName, sizeof(devInfoMfrName));
break; break;
#endif #endif
#if IEEE_DATA_ENABLE #if IEEE_DATA_ENABLE
case DEVINFO_11073_CERT_DATA: case DEVINFO_11073_CERT_DATA:
osal_memcpy(value, devInfo11073Cert, sizeof(devInfo11073Cert)); memcpy(value, devInfo11073Cert, sizeof(devInfo11073Cert));
break; break;
#endif #endif
#if PNP_ID_ENABLE #if PNP_ID_ENABLE
case DEVINFO_PNP_ID: case DEVINFO_PNP_ID:
osal_memcpy(value, devInfoPnpId, sizeof(devInfoPnpId)); memcpy(value, devInfoPnpId, sizeof(devInfoPnpId));
break; break;
#endif #endif
@ -472,7 +472,7 @@ static uint8 devInfo_ReadAttrCB( uint16 connHandle, gattAttribute_t* pAttr,
// determine read length // determine read length
*pLen = MIN(maxLen, (sizeof(devInfoSystemId) - offset)); *pLen = MIN(maxLen, (sizeof(devInfoSystemId) - offset));
// copy data // copy data
osal_memcpy(pValue, &devInfoSystemId[offset], *pLen); memcpy(pValue, &devInfoSystemId[offset], *pLen);
} }
break; break;
#endif #endif
@ -486,7 +486,7 @@ static uint8 devInfo_ReadAttrCB( uint16 connHandle, gattAttribute_t* pAttr,
// determine read length (exclude null terminating character) // determine read length (exclude null terminating character)
*pLen = MIN(maxLen, ((sizeof(devInfoModelNumber) - 1) - offset)); *pLen = MIN(maxLen, ((sizeof(devInfoModelNumber) - 1) - offset));
// copy data // copy data
osal_memcpy(pValue, &devInfoModelNumber[offset], *pLen); memcpy(pValue, &devInfoModelNumber[offset], *pLen);
} }
break; break;
#endif #endif
@ -500,7 +500,7 @@ static uint8 devInfo_ReadAttrCB( uint16 connHandle, gattAttribute_t* pAttr,
// determine read length (exclude null terminating character) // determine read length (exclude null terminating character)
*pLen = MIN(maxLen, ((sizeof(devInfoSerialNumber) - 1) - offset)); *pLen = MIN(maxLen, ((sizeof(devInfoSerialNumber) - 1) - offset));
// copy data // copy data
osal_memcpy(pValue, &devInfoSerialNumber[offset], *pLen); memcpy(pValue, &devInfoSerialNumber[offset], *pLen);
} }
break; break;
#endif #endif
@ -514,7 +514,7 @@ static uint8 devInfo_ReadAttrCB( uint16 connHandle, gattAttribute_t* pAttr,
// determine read length (exclude null terminating character) // determine read length (exclude null terminating character)
*pLen = MIN(maxLen, ((sizeof(devInfoFirmwareRev) - 1) - offset)); *pLen = MIN(maxLen, ((sizeof(devInfoFirmwareRev) - 1) - offset));
// copy data // copy data
osal_memcpy(pValue, &devInfoFirmwareRev[offset], *pLen); memcpy(pValue, &devInfoFirmwareRev[offset], *pLen);
} }
break; break;
#endif #endif
@ -528,7 +528,7 @@ static uint8 devInfo_ReadAttrCB( uint16 connHandle, gattAttribute_t* pAttr,
// determine read length (exclude null terminating character) // determine read length (exclude null terminating character)
*pLen = MIN(maxLen, ((sizeof(devInfoHardwareRev) - 1) - offset)); *pLen = MIN(maxLen, ((sizeof(devInfoHardwareRev) - 1) - offset));
// copy data // copy data
osal_memcpy(pValue, &devInfoHardwareRev[offset], *pLen); memcpy(pValue, &devInfoHardwareRev[offset], *pLen);
} }
break; break;
#endif #endif
@ -542,7 +542,7 @@ static uint8 devInfo_ReadAttrCB( uint16 connHandle, gattAttribute_t* pAttr,
// determine read length (exclude null terminating character) // determine read length (exclude null terminating character)
*pLen = MIN(maxLen, ((sizeof(devInfoSoftwareRev) - 1) - offset)); *pLen = MIN(maxLen, ((sizeof(devInfoSoftwareRev) - 1) - offset));
// copy data // copy data
osal_memcpy(pValue, &devInfoSoftwareRev[offset], *pLen); memcpy(pValue, &devInfoSoftwareRev[offset], *pLen);
} }
break; break;
#endif #endif
@ -556,7 +556,7 @@ static uint8 devInfo_ReadAttrCB( uint16 connHandle, gattAttribute_t* pAttr,
// determine read length (exclude null terminating character) // determine read length (exclude null terminating character)
*pLen = MIN(maxLen, ((sizeof(devInfoMfrName) - 1) - offset)); *pLen = MIN(maxLen, ((sizeof(devInfoMfrName) - 1) - offset));
// copy data // copy data
osal_memcpy(pValue, &devInfoMfrName[offset], *pLen); memcpy(pValue, &devInfoMfrName[offset], *pLen);
} }
break; break;
#endif #endif
@ -570,7 +570,7 @@ static uint8 devInfo_ReadAttrCB( uint16 connHandle, gattAttribute_t* pAttr,
// determine read length // determine read length
*pLen = MIN(maxLen, (sizeof(devInfo11073Cert) - offset)); *pLen = MIN(maxLen, (sizeof(devInfo11073Cert) - offset));
// copy data // copy data
osal_memcpy(pValue, &devInfo11073Cert[offset], *pLen); memcpy(pValue, &devInfo11073Cert[offset], *pLen);
} }
break; break;
#endif #endif
@ -584,7 +584,7 @@ static uint8 devInfo_ReadAttrCB( uint16 connHandle, gattAttribute_t* pAttr,
// determine read length // determine read length
*pLen = MIN(maxLen, (sizeof(devInfoPnpId) - offset)); *pLen = MIN(maxLen, (sizeof(devInfoPnpId) - offset));
// copy data // copy data
osal_memcpy(pValue, &devInfoPnpId[offset], *pLen); memcpy(pValue, &devInfoPnpId[offset], *pLen);
} }
break; break;
#endif #endif

View file

@ -19,7 +19,7 @@ extern "C" {
//#define EEP_ID_RPC (0x0DF5) // EEP ID reed switch pulse counter //#define EEP_ID_RPC (0x0DF5) // EEP ID reed switch pulse counter
//#define EEP_ID_PCD (0xC0DE) // EEP ID pincode //#define EEP_ID_PCD (0xC0DE) // EEP ID pincode
//#define EEP_ID_CMF (0x0FCC) // EEP ID comfort data //#define EEP_ID_CMF (0x0FCC) // EEP ID comfort data
//#define EEP_ID_DVN (0xDEAE) // EEP ID device name #define EEP_ID_DVN (0xDEAE) // EEP ID device name
#define EEP_ID_TIM (0x0ADA) // EEP ID time adjust #define EEP_ID_TIM (0x0ADA) // EEP ID time adjust
//#define EEP_ID_KEY (0xBC0D) // EEP ID bkey //#define EEP_ID_KEY (0xBC0D) // EEP ID bkey
#define EEP_ID_VER (0x5555) // EEP ID blk: unsigned int = minimum supported version #define EEP_ID_VER (0x5555) // EEP ID blk: unsigned int = minimum supported version

View file

@ -231,14 +231,10 @@ void chow_measure(void) {
update_lcd(); update_lcd();
} }
struct { /* flg != 0 -> chow_measure */
// uint32_t chow_tik;
uint8_t count;
} lcd;
void chow_lcd(int flg) { void chow_lcd(int flg) {
if(cfg.flg & 1) { if(cfg.flg & FLG_SHOW_TIME) {
if(lcd.count++ & 1) if(wrk.lcd_count++ & 1)
chow_clock(); chow_clock();
else else
chow_measure(); chow_measure();

View file

@ -316,19 +316,20 @@ int main(void) {
#if 0 // defined ( __GNUC__ ) // -> *.ld #if 0 // defined ( __GNUC__ ) // -> *.ld
extern const uint32_t *const jump_table_base[]; extern const uint32_t *const jump_table_base[];
osal_memcpy((void*) 0x1fff0000, (void*) jump_table_base, 1024); memcpy((void*) 0x1fff0000, (void*) jump_table_base, 1024);
#endif #endif
wrk.boot_flg = (uint8_t)read_reg(OTA_MODE_SELECT_REG);
write_reg(OTA_MODE_SELECT_REG, 0);
#if defined(OTA_TYPE) && OTA_TYPE == OTA_TYPE_BOOT #if defined(OTA_TYPE) && OTA_TYPE == OTA_TYPE_BOOT
if (read_reg(OTA_MODE_SELECT_REG) != 0x55 if (wrk.boot_flg != BOOT_FLG_OTA
#if (DEV_SERVICES & SERVICE_KEY) #if (DEV_SERVICES & SERVICE_KEY)
&& hal_gpio_read(GPIO_KEY) && hal_gpio_read(GPIO_KEY)
#endif #endif
) { ) {
spif_config(SYS_CLK_DLL_64M, 1, XFRD_FCMD_READ_DUAL, 0, 0); spif_config(SYS_CLK_DLL_64M, 1, XFRD_FCMD_READ_DUAL, 0, 0);
AP_PCR->CACHE_BYPASS = 1; // just bypass cache AP_PCR->CACHE_BYPASS = 1; // just bypass cache
startup_app(); startup_app();
}// else write_reg(OTA_MODE_SELECT_REG, 0); }
#endif #endif
watchdog_config(WDG_2S); watchdog_config(WDG_2S);

View file

@ -8,6 +8,7 @@
/************************************************************************************************** /**************************************************************************************************
INCLUDES INCLUDES
**************************************************************************************************/ **************************************************************************************************/
#include "config.h"
#if (APP_CFG == 0) #if (APP_CFG == 0)
#include "OSAL.h" #include "OSAL.h"
#include "OSAL_Tasks.h" #include "OSAL_Tasks.h"
@ -39,7 +40,7 @@
#include "thb2_peripheral.h" #include "thb2_peripheral.h"
/* Application */ /* Application */
#include "bleperipheral.h" #include "thb2_main.h"
#include "halperipheral.h" #include "halperipheral.h"
/********************************************************************* /*********************************************************************
@ -104,7 +105,7 @@ void osalInitTasks( void )
{ {
uint8 taskID = 0; uint8 taskID = 0;
tasksEvents = (uint16*)osal_mem_alloc( sizeof( uint16 ) * tasksCnt); tasksEvents = (uint16*)osal_mem_alloc( sizeof( uint16 ) * tasksCnt);
osal_memset( tasksEvents, 0, (sizeof( uint16 ) * tasksCnt)); memset( tasksEvents, 0, (sizeof( uint16 ) * tasksCnt));
/* LL Task */ /* LL Task */
LL_Init( taskID++ ); LL_Init( taskID++ );
/* HCI Task */ /* HCI Task */

View file

@ -20,13 +20,14 @@
#include "gapbondmgr.h" #include "gapbondmgr.h"
//#include "log.h" //#include "log.h"
#include "thb2_peripheral.h" #include "thb2_peripheral.h"
#include "bleperipheral.h" #include "thb2_main.h"
#include "sbp_profile.h" #include "sbp_profile.h"
#include "cmd_parser.h" #include "cmd_parser.h"
#include "ble_ota.h" #include "ble_ota.h"
#include "logger.h" #include "logger.h"
#include "hci.h" #include "hci.h"
#include "lcd_th05.h" #include "lcd_th05.h"
#include "sensor.h"
/********************************************************************* /*********************************************************************
* MACROS * MACROS
@ -311,13 +312,13 @@ static bStatus_t simpleProfile_ReadAttrCB( uint16_t connHandle, gattAttribute_t
#if OTA_TYPE #if OTA_TYPE
case SIMPLEPROFILE_CHAR1_UUID: case SIMPLEPROFILE_CHAR1_UUID:
*pLen = 20; *pLen = 20;
osal_memcpy( pValue, &ota, *pLen ); memcpy( pValue, &ota, *pLen );
LOG("Read_UUID1:\n"); LOG("Read_UUID1:\n");
break; break;
#endif #endif
case SIMPLEPROFILE_CHAR2_UUID: case SIMPLEPROFILE_CHAR2_UUID:
*pLen = sizeof(dev_id); *pLen = sizeof(dev_id);
osal_memcpy( pValue, &dev_id, *pLen); memcpy( pValue, &dev_id, *pLen);
LOG("Read_UUID2:\n"); LOG("Read_UUID2:\n");
break; break;
default: default:
@ -377,7 +378,7 @@ static bStatus_t simpleProfile_ReadAttrCB( uint16_t connHandle, gattAttribute_t
//Write the value //Write the value
if ( status == SUCCESS) { if ( status == SUCCESS) {
osal_memcpy( pAttr->pValue, pValue, len ); memcpy( pAttr->pValue, pValue, len );
ota_in_len = len; ota_in_len = len;
LOG("OTA receive data = 0x "); LOG("OTA receive data = 0x ");
LOG_DUMP_BYTE(pAttr->pValue, len); LOG_DUMP_BYTE(pAttr->pValue, len);
@ -397,7 +398,7 @@ static bStatus_t simpleProfile_ReadAttrCB( uint16_t connHandle, gattAttribute_t
status = ATT_ERR_ATTR_NOT_LONG; status = ATT_ERR_ATTR_NOT_LONG;
// Write the value // Write the value
if ( status == SUCCESS ) { if ( status == SUCCESS ) {
osal_memcpy(pAttr->pValue, pValue, len ); memcpy(pAttr->pValue, pValue, len );
cmd_in_len = len; cmd_in_len = len;
LOG("CMD receive data = 0x "); LOG("CMD receive data = 0x ");
LOG_DUMP_BYTE(pAttr->pValue, len); LOG_DUMP_BYTE(pAttr->pValue, len);
@ -465,6 +466,30 @@ void new_ota_data(void) {
} }
#endif #endif
static void measureNotifyCB( linkDBItem_t* pLinkItem )
{
if ( pLinkItem->stateFlags & LINK_CONNECTED )
{
uint16 value = GATTServApp_ReadCharCfg( pLinkItem->connectionHandle,
simpleProfileChar2Config );
if ( value & GATT_CLIENT_CFG_NOTIFY )
{
attHandleValueNoti_t noti;
noti.handle = simpleProfileAttrTbl[CDM_DATA_ATTR_IDX].handle;;
noti.len = send_len_measured_data + 1;
noti.value[0] = CMD_ID_MEASURE;
memcpy(&noti.value[1], &measured_data, send_len_measured_data);
GATT_Notification( pLinkItem->connectionHandle, &noti, FALSE );
}
}
}
void measure_notify(void) {
// Execute linkDB callback to send notification
linkDB_PerformFunc( measureNotifyCB );
}
#if (DEV_SERVICES & SERVICE_HISTORY) #if (DEV_SERVICES & SERVICE_HISTORY)
void wrk_notify(void) { void wrk_notify(void) {
gattServerInfo_t* pServer; gattServerInfo_t* pServer;

View file

@ -79,6 +79,7 @@ extern bStatus_t SimpleProfile_AddService( uint32_t services );
void new_cmd_data(void); void new_cmd_data(void);
void new_ota_data(void); void new_ota_data(void);
void wrk_notify(void); void wrk_notify(void);
void measure_notify(void);
#ifdef __cplusplus #ifdef __cplusplus
} }

View file

@ -140,6 +140,7 @@ typedef struct _measured_data_t {
uint16_t battery_mv; // mV uint16_t battery_mv; // mV
uint8_t battery; // 0..100 % uint8_t battery; // 0..100 %
} measured_data_t; } measured_data_t;
#define send_len_measured_data 9
extern measured_data_t measured_data; extern measured_data_t measured_data;

View file

@ -83,6 +83,7 @@ int read_sensor_ahtxx(void) {
measured_data.humi = 0; measured_data.humi = 0;
else if (measured_data.humi > 9999) else if (measured_data.humi > 9999)
measured_data.humi = 9999; measured_data.humi = 9999;
measured_data.count++;
return 0; return 0;
} }
deinit_i2c(); deinit_i2c();
@ -154,7 +155,7 @@ __ATTR_SECTION_XIP__ void init_sensor(void) {
thsensor_cfg.i2c_addr = 0; thsensor_cfg.i2c_addr = 0;
} }
if(thsensor_cfg.coef.temp_k == 0 && ptabinit) { if(thsensor_cfg.coef.temp_k == 0 && ptabinit) {
osal_memcpy(&thsensor_cfg.coef, ptabinit, sizeof(thsensor_cfg.coef)); memcpy(&thsensor_cfg.coef, ptabinit, sizeof(thsensor_cfg.coef));
} }
deinit_i2c(); deinit_i2c();
} }

View file

@ -26,7 +26,7 @@
#include "gapbondmgr.h" #include "gapbondmgr.h"
#include "pwrmgr.h" #include "pwrmgr.h"
#include "gpio.h" #include "gpio.h"
#include "bleperipheral.h" #include "thb2_main.h"
#include "ll.h" #include "ll.h"
#include "ll_hw_drv.h" #include "ll_hw_drv.h"
#include "ll_def.h" #include "ll_def.h"
@ -89,9 +89,7 @@ perStatsByChan_t g_perStatsByChanTest;
* LOCAL VARIABLES * LOCAL VARIABLES
*/ */
adv_work_t adv_wrk; uint8_t simpleBLEPeripheral_TaskID; // Task ID for internal task/event processing
uint8 simpleBLEPeripheral_TaskID; // Task ID for internal task/event processing
static gaprole_States_t gapProfileState = GAPROLE_INIT; static gaprole_States_t gapProfileState = GAPROLE_INIT;
@ -100,8 +98,8 @@ static gaprole_States_t gapProfileState = GAPROLE_INIT;
*/ */
static void simpleBLEPeripheral_ProcessOSALMsg( osal_event_hdr_t *pMsg ); static void simpleBLEPeripheral_ProcessOSALMsg( osal_event_hdr_t *pMsg );
static void peripheralStateNotificationCB( gaprole_States_t newState ); static void peripheralStateNotificationCB( gaprole_States_t newState );
//static void simpleProfileChangeCB( uint8 paramID ); //static void simpleProfileChangeCB( uint8_t paramID );
static void peripheralStateReadRssiCB( int8 rssi ); static void peripheralStateReadRssiCB( int8_t rssi );
const char* hex_ascii = { "0123456789ABCDEF" }; const char* hex_ascii = { "0123456789ABCDEF" };
uint8_t * str_bin2hex(uint8_t *d, uint8_t *s, int len) { uint8_t * str_bin2hex(uint8_t *d, uint8_t *s, int len) {
@ -113,35 +111,49 @@ uint8_t * str_bin2hex(uint8_t *d, uint8_t *s, int len) {
} }
// GAP - SCAN RSP data (max size = 31 bytes) // GAP - SCAN RSP data (max size = 31 bytes)
static void set_def_name(uint8_t * mac) void set_def_name(void)
{ {
uint8 * p = gapRole_ScanRspData; uint8_t * pmac = ownPublicAddr;
uint8_t * p = gapRole_ScanRspData;
gapRole_ScanRspDataLen = sizeof(DEF_MODEL_NUMBER_STR) + 8; gapRole_ScanRspDataLen = sizeof(DEF_MODEL_NUMBER_STR) + 8;
*p++ = sizeof(DEF_MODEL_NUMBER_STR) + 7; *p++ = sizeof(DEF_MODEL_NUMBER_STR) + 7;
*p++ = GAP_ADTYPE_LOCAL_NAME_COMPLETE; *p++ = GAP_ADTYPE_LOCAL_NAME_COMPLETE;
osal_memcpy(p, devInfoModelNumber, sizeof(DEF_MODEL_NUMBER_STR)-1); memcpy(p, devInfoModelNumber, sizeof(DEF_MODEL_NUMBER_STR)-1);
p += sizeof(DEF_MODEL_NUMBER_STR) - 1; p += sizeof(DEF_MODEL_NUMBER_STR) - 1;
*p++ = '-'; *p++ = '-';
p = str_bin2hex(p, mac+2, 1); p = str_bin2hex(p, pmac+2, 1);
p = str_bin2hex(p, mac+1, 1); p = str_bin2hex(p, pmac+1, 1);
str_bin2hex(p, mac, 1); str_bin2hex(p, pmac, 1);
flash_write_cfg(NULL, EEP_ID_DVN, 0);
}
void set_dev_name(void)
{
uint8_t * p = gapRole_ScanRspData;
int len = flash_read_cfg(&p[2], EEP_ID_DVN, B_MAX_ADV_LEN - 2);
if(len > 0) {
*p++ = (uint8_t)len + 1;
*p++ = GAP_ADTYPE_LOCAL_NAME_COMPLETE;
} else
set_def_name();
} }
static void set_mac(void) static void set_mac(void)
{ {
extern uint8 ownPublicAddr[LL_DEVICE_ADDR_LEN]; //extern uint8_t ownPublicAddr[LL_DEVICE_ADDR_LEN];
if (read_chip_mAddr(ownPublicAddr) != CHIP_ID_VALID) { if(flash_read_cfg(ownPublicAddr, EEP_ID_MAC, MAC_LEN) != MAC_LEN) {
if(flash_read_cfg(ownPublicAddr, EEP_ID_MAC, LL_DEVICE_ADDR_LEN) != LL_DEVICE_ADDR_LEN) { if (read_chip_mAddr(ownPublicAddr) != CHIP_ID_VALID) {
LL_Rand(ownPublicAddr,3); LL_Rand(ownPublicAddr,3);
// Tuya mac[0:3] // Tuya mac[0:3]
ownPublicAddr[3] = 0x8d; ownPublicAddr[3] = 0x8d;
ownPublicAddr[4] = 0x1f; ownPublicAddr[4] = 0x1f;
ownPublicAddr[5] = 0x38; ownPublicAddr[5] = 0x38;
flash_write_cfg(ownPublicAddr, EEP_ID_MAC, LL_DEVICE_ADDR_LEN);
} }
flash_write_cfg(ownPublicAddr, EEP_ID_MAC, MAC_LEN);
} }
set_def_name(ownPublicAddr); pGlobal_config[MAC_ADDRESS_LOC] = (uint32_t)ownPublicAddr;
// TODO: pGlobal_config[MAC_ADDRESS_LOC] // device name
set_dev_name();
} }
static void set_serial_number(void) static void set_serial_number(void)
@ -164,11 +176,11 @@ static void set_serial_number(void)
} }
extern gapPeriConnectParams_t periConnParameters; extern gapPeriConnectParams_t periConnParameters;
extern uint16 gapParameters[]; extern uint16_t gapParameters[];
static void set_adv_interval(uint16 advInt); static void set_adv_interval(uint16_t advInt);
// Set new advertising interval // Set new advertising interval
static void set_new_adv_interval(uint16 advInt) static void set_new_adv_interval(uint16_t advInt)
{ {
set_adv_interval(advInt); set_adv_interval(advInt);
GAP_EndDiscoverable( gapRole_TaskID ); GAP_EndDiscoverable( gapRole_TaskID );
@ -177,7 +189,7 @@ static void set_new_adv_interval(uint16 advInt)
osal_set_event( gapRole_TaskID, START_ADVERTISING_EVT ); osal_set_event( gapRole_TaskID, START_ADVERTISING_EVT );
} }
// Set advertising interval // Set advertising interval
static void set_adv_interval(uint16 advInt) static void set_adv_interval(uint16_t advInt)
{ {
#ifdef __GCC #ifdef __GCC
gapParameters[TGAP_LIM_DISC_ADV_INT_MIN] = advInt; gapParameters[TGAP_LIM_DISC_ADV_INT_MIN] = advInt;
@ -196,9 +208,9 @@ static void set_adv_interval(uint16 advInt)
static void adv_measure(void) { static void adv_measure(void) {
if(gapRole_AdvEnabled) { if(gapRole_AdvEnabled) {
uint32_t tmp = get_utc_time_sec(); get_utc_time_sec(); // счет UTC timestamp
if(tmp - adv_wrk.measure_batt_tik >= cfg.batt_interval) { if(clkt.utc_time_tik - adv_wrk.measure_batt_tik >= ((uint32_t)cfg.batt_interval << 15)) {
adv_wrk.measure_batt_tik = tmp; adv_wrk.measure_batt_tik = clkt.utc_time_tik;
batt_start_measure(); batt_start_measure();
#if ((DEV_SERVICES & SERVICE_THS) == 0) #if ((DEV_SERVICES & SERVICE_THS) == 0)
adv_wrk.adv_batt = 1; adv_wrk.adv_batt = 1;
@ -249,6 +261,11 @@ static void adv_measure(void) {
#endif // (DEV_SERVICES & SERVICE_THS) #endif // (DEV_SERVICES & SERVICE_THS)
if(adv_wrk.adv_con_count) { if(adv_wrk.adv_con_count) {
if(--adv_wrk.adv_con_count == 0) { if(--adv_wrk.adv_con_count == 0) {
#if defined(OTA_TYPE) && OTA_TYPE == OTA_TYPE_BOOT
if (wrk.boot_flg == BOOT_FLG_OTA) {
hal_system_soft_reset();
}
#endif
set_new_adv_interval(cfg.advertising_interval * 100); set_new_adv_interval(cfg.advertising_interval * 100);
} }
} }
@ -320,7 +337,7 @@ static void init_app_gpio(void)
* GAPROLE ADVERTISING * GAPROLE ADVERTISING
*/ */
void gatrole_advert_enable(bool enable) { void gatrole_advert_enable(bool enable) {
uint8 oldAdvEnabled = gapRole_AdvEnabled; uint8_t oldAdvEnabled = gapRole_AdvEnabled;
gapRole_AdvEnabled = enable; gapRole_AdvEnabled = enable;
if ( (oldAdvEnabled) && (gapRole_AdvEnabled == FALSE) ) if ( (oldAdvEnabled) && (gapRole_AdvEnabled == FALSE) )
@ -380,7 +397,7 @@ static gapBondCBs_t simpleBLEPeripheral_BondMgrCBs =
* *
* @return none * @return none
*/ */
void SimpleBLEPeripheral_Init( uint8 task_id ) void SimpleBLEPeripheral_Init( uint8_t task_id )
{ {
simpleBLEPeripheral_TaskID = task_id; simpleBLEPeripheral_TaskID = task_id;
@ -429,10 +446,9 @@ void SimpleBLEPeripheral_Init( uint8 task_id )
// Set advertising interval // Set advertising interval
#if defined(OTA_TYPE) && OTA_TYPE == OTA_TYPE_BOOT #if defined(OTA_TYPE) && OTA_TYPE == OTA_TYPE_BOOT
if (read_reg(OTA_MODE_SELECT_REG) == 0x55) { if (wrk.boot_flg == BOOT_FLG_OTA) {
write_reg(OTA_MODE_SELECT_REG, 0);
adv_wrk.adv_con_count = 60000/DEF_OTA_ADV_INERVAL_MS; // 60 sec adv_wrk.adv_con_count = 60000/DEF_OTA_ADV_INERVAL_MS; // 60 sec
set_new_adv_interval(DEF_CON_ADV_INERVAL); // actual time = advInt * 625us set_adv_interval(DEF_CON_ADV_INERVAL); // actual time = advInt * 625us
} else } else
#endif #endif
set_adv_interval(DEF_ADV_INERVAL); // actual time = advInt * 625us set_adv_interval(DEF_ADV_INERVAL); // actual time = advInt * 625us
@ -441,16 +457,16 @@ void SimpleBLEPeripheral_Init( uint8 task_id )
#if (DEF_GAPBOND_MGR_ENABLE==1) #if (DEF_GAPBOND_MGR_ENABLE==1)
// Setup the GAP Bond Manager, add 2017-11-15 // Setup the GAP Bond Manager, add 2017-11-15
{ {
uint32 passkey = DEFAULT_PASSCODE; uint32_t passkey = DEFAULT_PASSCODE;
uint8 pairMode = GAPBOND_PAIRING_MODE_WAIT_FOR_REQ; uint8_t pairMode = GAPBOND_PAIRING_MODE_WAIT_FOR_REQ;
uint8 mitm = TRUE; uint8_t mitm = TRUE;
uint8 ioCap = GAPBOND_IO_CAP_NO_INPUT_NO_OUTPUT; uint8_t ioCap = GAPBOND_IO_CAP_NO_INPUT_NO_OUTPUT;
uint8 bonding = TRUE; uint8_t bonding = TRUE;
GAPBondMgr_SetParameter( GAPBOND_DEFAULT_PASSCODE, sizeof ( uint32 ), &passkey ); GAPBondMgr_SetParameter( GAPBOND_DEFAULT_PASSCODE, sizeof ( uint32_t ), &passkey );
GAPBondMgr_SetParameter( GAPBOND_PAIRING_MODE, sizeof ( uint8 ), &pairMode ); GAPBondMgr_SetParameter( GAPBOND_PAIRING_MODE, sizeof ( uint8_t ), &pairMode );
GAPBondMgr_SetParameter( GAPBOND_MITM_PROTECTION, sizeof ( uint8 ), &mitm ); GAPBondMgr_SetParameter( GAPBOND_MITM_PROTECTION, sizeof ( uint8_t ), &mitm );
GAPBondMgr_SetParameter( GAPBOND_IO_CAPABILITIES, sizeof ( uint8 ), &ioCap ); GAPBondMgr_SetParameter( GAPBOND_IO_CAPABILITIES, sizeof ( uint8_t ), &ioCap );
GAPBondMgr_SetParameter( GAPBOND_BONDING_ENABLED, sizeof ( uint8 ), &bonding ); GAPBondMgr_SetParameter( GAPBOND_BONDING_ENABLED, sizeof ( uint8_t ), &bonding );
} }
#endif #endif
// Initialize GATT attributes // Initialize GATT attributes
@ -465,7 +481,7 @@ void SimpleBLEPeripheral_Init( uint8 task_id )
#if (1) #if (1)
#if 0 // CODED PHY not work? #if 0 // CODED PHY not work?
deviceFeatureSet.featureSet[1] |= (uint8)( deviceFeatureSet.featureSet[1] |= (uint8_t)(
LL_FEATURE_2M_PHY LL_FEATURE_2M_PHY
| LL_FEATURE_CODED_PHY | LL_FEATURE_CODED_PHY
| LL_FEATURE_CSA2); | LL_FEATURE_CSA2);
@ -514,7 +530,7 @@ void SimpleBLEPeripheral_Init( uint8 task_id )
* *
* @return events not processed * @return events not processed
*/ */
uint16 BLEPeripheral_ProcessEvent( uint8 task_id, uint16 events ) uint16_t BLEPeripheral_ProcessEvent( uint8_t task_id, uint16_t events )
{ {
VOID task_id; // OSAL required parameter that isn't used in this function VOID task_id; // OSAL required parameter that isn't used in this function
if ( events & ADV_BROADCAST_EVT) { if ( events & ADV_BROADCAST_EVT) {
@ -525,7 +541,7 @@ uint16 BLEPeripheral_ProcessEvent( uint8 task_id, uint16 events )
} }
if ( events & SYS_EVENT_MSG ) { if ( events & SYS_EVENT_MSG ) {
uint8 *pMsg; uint8_t *pMsg;
if ( (pMsg = osal_msg_receive( simpleBLEPeripheral_TaskID )) != NULL ) if ( (pMsg = osal_msg_receive( simpleBLEPeripheral_TaskID )) != NULL )
{ {
@ -548,10 +564,10 @@ uint16 BLEPeripheral_ProcessEvent( uint8 task_id, uint16 events )
} }
if( events & TIMER_BATT_EVT) { if( events & TIMER_BATT_EVT) {
LOG("TIMER_EVT\n"); LOG("TIMER_EVT\n");
get_utc_time_sec(); // счет UTC timestamp
#if (DEV_SERVICES & SERVICE_THS) #if (DEV_SERVICES & SERVICE_THS)
uint32_t tmp = get_utc_time_sec(); if(clkt.utc_time_tik - adv_wrk.measure_batt_tik >= ((uint32_t)cfg.batt_interval << 15)) {
if(tmp - adv_wrk.measure_batt_tik >= cfg.batt_interval) { adv_wrk.measure_batt_tik = clkt.utc_time_tik;
adv_wrk.measure_batt_tik = tmp;
batt_start_measure(); batt_start_measure();
} }
read_sensor(); read_sensor();
@ -565,8 +581,9 @@ uint16 BLEPeripheral_ProcessEvent( uint8 task_id, uint16 events )
#endif #endif
// TH Notify // TH Notify
TH_NotifyLevel(); TH_NotifyLevel();
#else if(cfg.flg & FLG_MEAS_NOTIFY)
get_utc_time_sec(); measure_notify();
#else // no SERVICE_THS
batt_start_measure(); batt_start_measure();
#endif // (DEV_SERVICES & SERVICE_THS) #endif // (DEV_SERVICES & SERVICE_THS)
// return unprocessed events // return unprocessed events
@ -578,6 +595,8 @@ uint16 BLEPeripheral_ProcessEvent( uint8 task_id, uint16 events )
if(!gapRole_AdvEnabled) { if(!gapRole_AdvEnabled) {
BattNotifyLevel(); BattNotifyLevel();
#if ((DEV_SERVICES & SERVICE_THS)==0) #if ((DEV_SERVICES & SERVICE_THS)==0)
if(cfg.flg & FLG_MEAS_NOTIFY)
measure_notify();
#if (DEV_SERVICES & SERVICE_SCREEN) #if (DEV_SERVICES & SERVICE_SCREEN)
chow_measure(); chow_measure();
#endif #endif
@ -662,7 +681,7 @@ static void simpleBLEPeripheral_ProcessOSALMsg( osal_event_hdr_t *pMsg )
* *
* @return none * @return none
*/ */
static void peripheralStateReadRssiCB( int8 rssi ) static void peripheralStateReadRssiCB( int8_t rssi )
{ {
(void)rssi; (void)rssi;
} }
@ -726,6 +745,10 @@ static void peripheralStateReadRssiCB( int8 rssi )
show_ble_symbol(0); show_ble_symbol(0);
update_lcd(); update_lcd();
#endif #endif
if(wrk.reboot) {
write_reg(OTA_MODE_SELECT_REG, wrk.reboot);
hal_system_soft_reset();
}
break; break;
case GAPROLE_WAITING_AFTER_TIMEOUT: case GAPROLE_WAITING_AFTER_TIMEOUT:

View file

@ -1,16 +1,15 @@
/************************************************************************************************** /**************************************************************************************************
Filename: bleperipheral.h Filename: thb2_main.h
Revised: Revised:
Revision: Revision:
Description: This file contains the Simple BLE Peripheral sample application Description: This file contains the Simple BLE Peripheral sample application
definitions and prototypes. definitions and prototypes.
**************************************************************************************************/ **************************************************************************************************/
#ifndef SIMPLEBLEPERIPHERAL_H #ifndef _THB2_MAIN_H_
#define SIMPLEBLEPERIPHERAL_H #define _THB2_MAIN_H_
#ifdef __cplusplus #ifdef __cplusplus
extern "C" extern "C"
@ -37,7 +36,7 @@ extern "C"
#define DEVINFO_SYSTEM_ID_LEN 8 #define DEVINFO_SYSTEM_ID_LEN 8
#define DEVINFO_SYSTEM_ID 0 #define DEVINFO_SYSTEM_ID 0
#define DEFAULT_DISCOVERABLE_MODE GAP_ADTYPE_FLAGS_GENERAL #define DEFAULT_DISCOVERABLE_MODE GAP_ADTYPE_FLAGS_GENERAL
// Whether to enable automatic parameter update request when a connection is formed // Whether to enable automatic parameter update request when a connection is formed
@ -57,28 +56,30 @@ extern "C"
/********************************************************************* /*********************************************************************
* MACROS * MACROS
*/ */
#define MAC_DATA_LEN 6 // #define MAC_DATA_LEN 6
extern uint8 simpleBLEPeripheral_TaskID;
/********************************************************************* /*********************************************************************
* FUNCTIONS * FUNCTIONS
*/ */
/*
* Task Initialization for the BLE Application
*/
extern void SimpleBLEPeripheral_Init( uint8 task_id );
/*
* Task Event Processor for the BLE Application
*/
extern uint16 BLEPeripheral_ProcessEvent( uint8 task_id, uint16 events );
/********************************************************************* /*********************************************************************
*********************************************************************/ *********************************************************************/
#define MAC_LEN 6
extern uint8 ownPublicAddr[MAC_LEN];
extern uint8_t simpleBLEPeripheral_TaskID; // Task ID for internal task/event processing
void SimpleBLEPeripheral_Init( uint8_t task_id );
uint16_t BLEPeripheral_ProcessEvent( uint8_t task_id, uint16_t events );
void set_def_name(void);
void set_dev_name(void);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
#endif /* SIMPLEBLEPERIPHERAL_H */ #endif /* _THB2_MAIN_H_ */

View file

@ -197,7 +197,7 @@ bStatus_t GAPRole_SetParameter( uint16 param, uint8 len, void* pValue )
case GAPROLE_IRK: case GAPROLE_IRK:
if ( len == KEYLEN ) if ( len == KEYLEN )
{ {
VOID osal_memcpy( gapRole_IRK, pValue, KEYLEN ) ; VOID memcpy( gapRole_IRK, pValue, KEYLEN ) ;
} }
else else
{ {
@ -209,7 +209,7 @@ bStatus_t GAPRole_SetParameter( uint16 param, uint8 len, void* pValue )
case GAPROLE_SRK: case GAPROLE_SRK:
if ( len == KEYLEN ) if ( len == KEYLEN )
{ {
VOID osal_memcpy( gapRole_SRK, pValue, KEYLEN ) ; VOID memcpy( gapRole_SRK, pValue, KEYLEN ) ;
} }
else else
{ {
@ -280,7 +280,7 @@ bStatus_t GAPRole_SetParameter( uint16 param, uint8 len, void* pValue )
if ( len <= B_MAX_ADV_LEN ) if ( len <= B_MAX_ADV_LEN )
{ {
VOID osal_memset( gapRole_AdvertData, 0, B_MAX_ADV_LEN ); VOID osal_memset( gapRole_AdvertData, 0, B_MAX_ADV_LEN );
VOID osal_memcpy( gapRole_AdvertData, pValue, len ); VOID memcpy( gapRole_AdvertData, pValue, len );
gapRole_AdvertDataLen = len; gapRole_AdvertDataLen = len;
// Update the advertising data // Update the advertising data
ret = GAP_UpdateAdvertisingData( gapRole_TaskID, ret = GAP_UpdateAdvertisingData( gapRole_TaskID,
@ -297,7 +297,7 @@ bStatus_t GAPRole_SetParameter( uint16 param, uint8 len, void* pValue )
if ( len <= B_MAX_ADV_LEN ) if ( len <= B_MAX_ADV_LEN )
{ {
VOID osal_memset( gapRole_ScanRspData, 0, B_MAX_ADV_LEN ); VOID osal_memset( gapRole_ScanRspData, 0, B_MAX_ADV_LEN );
VOID osal_memcpy( gapRole_ScanRspData, pValue, len ); VOID memcpy( gapRole_ScanRspData, pValue, len );
gapRole_ScanRspDataLen = len; gapRole_ScanRspDataLen = len;
// Update the Response Data // Update the Response Data
ret = GAP_UpdateAdvertisingData( gapRole_TaskID, ret = GAP_UpdateAdvertisingData( gapRole_TaskID,
@ -337,7 +337,7 @@ bStatus_t GAPRole_SetParameter( uint16 param, uint8 len, void* pValue )
case GAPROLE_ADV_DIRECT_ADDR: case GAPROLE_ADV_DIRECT_ADDR:
if ( len == B_ADDR_LEN ) if ( len == B_ADDR_LEN )
{ {
VOID osal_memcpy( gapRole_AdvDirectAddr, pValue, B_ADDR_LEN ) ; VOID memcpy( gapRole_AdvDirectAddr, pValue, B_ADDR_LEN ) ;
} }
else else
{ {
@ -527,11 +527,11 @@ bStatus_t GAPRole_GetParameter( uint16 param, void* pValue )
break; break;
case GAPROLE_IRK: case GAPROLE_IRK:
VOID osal_memcpy( pValue, gapRole_IRK, KEYLEN ) ; VOID memcpy( pValue, gapRole_IRK, KEYLEN ) ;
break; break;
case GAPROLE_SRK: case GAPROLE_SRK:
VOID osal_memcpy( pValue, gapRole_SRK, KEYLEN ) ; VOID memcpy( pValue, gapRole_SRK, KEYLEN ) ;
break; break;
case GAPROLE_SIGNCOUNTER: case GAPROLE_SIGNCOUNTER:
@ -539,7 +539,7 @@ bStatus_t GAPRole_GetParameter( uint16 param, void* pValue )
break; break;
case GAPROLE_BD_ADDR: case GAPROLE_BD_ADDR:
VOID osal_memcpy( pValue, gapRole_bdAddr, B_ADDR_LEN ) ; VOID memcpy( pValue, gapRole_bdAddr, B_ADDR_LEN ) ;
break; break;
case GAPROLE_ADVERT_ENABLED: case GAPROLE_ADVERT_ENABLED:
@ -551,11 +551,11 @@ bStatus_t GAPRole_GetParameter( uint16 param, void* pValue )
break; break;
case GAPROLE_ADVERT_DATA: case GAPROLE_ADVERT_DATA:
VOID osal_memcpy( pValue, gapRole_AdvertData, gapRole_AdvertDataLen ); VOID memcpy( pValue, gapRole_AdvertData, gapRole_AdvertDataLen );
break; break;
case GAPROLE_SCAN_RSP_DATA: case GAPROLE_SCAN_RSP_DATA:
VOID osal_memcpy( pValue, gapRole_ScanRspData, gapRole_ScanRspDataLen ) ; VOID memcpy( pValue, gapRole_ScanRspData, gapRole_ScanRspDataLen ) ;
break; break;
case GAPROLE_ADV_EVENT_TYPE: case GAPROLE_ADV_EVENT_TYPE:
@ -567,7 +567,7 @@ bStatus_t GAPRole_GetParameter( uint16 param, void* pValue )
break; break;
case GAPROLE_ADV_DIRECT_ADDR: case GAPROLE_ADV_DIRECT_ADDR:
VOID osal_memcpy( pValue, gapRole_AdvDirectAddr, B_ADDR_LEN ) ; VOID memcpy( pValue, gapRole_AdvDirectAddr, B_ADDR_LEN ) ;
break; break;
case GAPROLE_ADV_CHANNEL_MAP: case GAPROLE_ADV_CHANNEL_MAP:
@ -607,7 +607,7 @@ bStatus_t GAPRole_GetParameter( uint16 param, void* pValue )
break; break;
case GAPROLE_CONN_BD_ADDR: case GAPROLE_CONN_BD_ADDR:
VOID osal_memcpy( pValue, gapRole_ConnectedDevAddr, B_ADDR_LEN ) ; VOID memcpy( pValue, gapRole_ConnectedDevAddr, B_ADDR_LEN ) ;
break; break;
case GAPROLE_CONN_INTERVAL: case GAPROLE_CONN_INTERVAL:
@ -803,7 +803,7 @@ uint16 GAPRole_ProcessEvent( uint8 task_id, uint16 events )
{ {
params.eventType = gapRole_AdvEventType; params.eventType = gapRole_AdvEventType;
params.initiatorAddrType = gapRole_AdvDirectType; params.initiatorAddrType = gapRole_AdvDirectType;
VOID osal_memcpy( params.initiatorAddr, gapRole_AdvDirectAddr, B_ADDR_LEN ); VOID memcpy( params.initiatorAddr, gapRole_AdvDirectAddr, B_ADDR_LEN );
} }
params.channelMap = gapRole_AdvChanMap; params.channelMap = gapRole_AdvChanMap;
@ -1039,7 +1039,7 @@ static void gapRole_ProcessGAPMsg( gapEventHdr_t* pMsg )
// VOID osal_snv_write( BLE_NVID_IRK, KEYLEN, gapRole_IRK ); // VOID osal_snv_write( BLE_NVID_IRK, KEYLEN, gapRole_IRK );
// VOID osal_snv_write( BLE_NVID_CSRK, KEYLEN, gapRole_SRK ); // VOID osal_snv_write( BLE_NVID_CSRK, KEYLEN, gapRole_SRK );
// Save off the information // Save off the information
VOID osal_memcpy( gapRole_bdAddr, pPkt->devAddr, B_ADDR_LEN ); VOID memcpy( gapRole_bdAddr, pPkt->devAddr, B_ADDR_LEN );
gapRole_state = GAPROLE_STARTED; gapRole_state = GAPROLE_STARTED;
// Update the advertising data // Update the advertising data
@ -1159,7 +1159,7 @@ static void gapRole_ProcessGAPMsg( gapEventHdr_t* pMsg )
if ( pPkt->hdr.status == SUCCESS ) if ( pPkt->hdr.status == SUCCESS )
{ {
VOID osal_memcpy( gapRole_ConnectedDevAddr, pPkt->devAddr, B_ADDR_LEN ); VOID memcpy( gapRole_ConnectedDevAddr, pPkt->devAddr, B_ADDR_LEN );
gapRole_ConnectionHandle = pPkt->connectionHandle; gapRole_ConnectionHandle = pPkt->connectionHandle;
gapRole_ConnectionInterval = pPkt->connInterval; gapRole_ConnectionInterval = pPkt->connInterval;
gapRole_ConnectionLatency = pPkt->connLatency; gapRole_ConnectionLatency = pPkt->connLatency;
@ -1707,7 +1707,7 @@ bStatus_t GAPRole_extAdv_SetParameter(uint8 adv_handler, uint16 param, uint16 le
if (len <= GAP_MAX_EXT_ADV_DATA_LENGTH) if (len <= GAP_MAX_EXT_ADV_DATA_LENGTH)
{ {
VOID osal_memset(para->advData, 0, GAP_MAX_EXT_ADV_DATA_LENGTH); VOID osal_memset(para->advData, 0, GAP_MAX_EXT_ADV_DATA_LENGTH);
VOID osal_memcpy(para->advData, pValue, len); VOID memcpy(para->advData, pValue, len);
para->advDataLen = len; para->advDataLen = len;
} }
else else
@ -1721,7 +1721,7 @@ bStatus_t GAPRole_extAdv_SetParameter(uint8 adv_handler, uint16 param, uint16 le
if (len <= GAP_MAX_EXT_ADV_DATA_LENGTH) if (len <= GAP_MAX_EXT_ADV_DATA_LENGTH)
{ {
VOID osal_memset(para->scanRspData, 0, GAP_MAX_EXT_ADV_DATA_LENGTH); VOID osal_memset(para->scanRspData, 0, GAP_MAX_EXT_ADV_DATA_LENGTH);
VOID osal_memcpy(para->scanRspData, pValue, len); VOID memcpy(para->scanRspData, pValue, len);
para->scanRspLen = len; para->scanRspLen = len;
} }
else else
@ -1759,7 +1759,7 @@ bStatus_t GAPRole_extAdv_SetParameter(uint8 adv_handler, uint16 param, uint16 le
case GAP_PEER_ADDR: case GAP_PEER_ADDR:
if (len == 6) if (len == 6)
osal_memcpy(para->peerAddress,pValue,6); memcpy(para->peerAddress,pValue,6);
else else
ret = bleInvalidRange; ret = bleInvalidRange;
@ -1775,7 +1775,7 @@ bStatus_t GAPRole_extAdv_SetParameter(uint8 adv_handler, uint16 param, uint16 le
case GAP_OWN_RANDOM_ADDR: case GAP_OWN_RANDOM_ADDR:
if (len == 6) if (len == 6)
osal_memcpy(&(gapRole_ExtAdv_RandomAddr[adv_handler][0]),pValue,6); memcpy(&(gapRole_ExtAdv_RandomAddr[adv_handler][0]),pValue,6);
else else
ret = bleInvalidRange; ret = bleInvalidRange;

View file

@ -1,6 +1,6 @@
<html class="phy6222Class"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <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"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>PHY62x2 BTHome v0.4</title> <title>PHY62x2 BTHome v0.5</title>
<style type="text/css"> <style type="text/css">
/* basic sytles */ /* basic sytles */
@ -321,7 +321,9 @@ var devnm = {};
var startTime = 0, var startTime = 0,
isConnected = false; isConnected = false,
flg_memo_act = false
flg_memo_cnt = 0;
var ota = { var ota = {
fwArray: null, fwArray: null,
@ -580,8 +582,18 @@ function onDisconnected() {
} }
function startDFU() { function startDFU() {
addLog("Старт программирования..."); if(otaCharacteristic != null && ota.ind.version == 1 && (devsrs.services & 1) == 1) {
updateBegin(); addLog("Старт программирования...");
updateBegin();
} else {
addLog("Переключение на BootLoader...");
if(cmdCharacteristic != null) {
cmdCharacteristic.writeValue(new Uint8Array([0x72,0x55])).then(_ => {
console.log('Send reboot to bootloader - ok');
reconnect();
}).catch(error => { addLog(error); });
}
}
} }
function addLog(logTXT) { function addLog(logTXT) {
@ -1017,6 +1029,7 @@ function customBlkParse(value) {
devsrs.services = value.getUint32(8, true); devsrs.services = value.getUint32(8, true);
addLog("Dev info # hw: "+hex(devsrs.hw_version,4)+", sw: "+hex(devsrs.sw_version,4)+", services: "+hex(devsrs.services,8)+", sd: "+hex(devsrs.dev_spec_data, 4)); addLog("Dev info # hw: "+hex(devsrs.hw_version,4)+", sw: "+hex(devsrs.sw_version,4)+", services: "+hex(devsrs.services,8)+", sd: "+hex(devsrs.dev_spec_data, 4));
} else if(blkId == 0x35){ } else if(blkId == 0x35){
if(flg_memo_act) {
if(len >= 12) { if(len >= 12) {
let cnt = value.getUint16(1, true); let cnt = value.getUint16(1, true);
let tc = value.getUint32(3, true); let tc = value.getUint32(3, true);
@ -1024,29 +1037,37 @@ function customBlkParse(value) {
let hm = value.getUint16(9, true) / 100.0; let hm = value.getUint16(9, true) / 100.0;
let vb = value.getUint16(11, true); let vb = value.getUint16(11, true);
let dt = new Date(tc*1000); let dt = new Date(tc*1000);
console.log(((dt.toISOString().slice(0, -1)).replace('T',' ')).replace('.000','')+' # Батарея: '+vb+' мВ , Температура: '+tm+'°C, Влажность: '+hm+'%, Счетчик: '+cnt); addLog(((dt.toISOString().slice(0, -1)).replace('T',' ')).replace('.000','')+' # Батарея: '+vb+' мВ , Температура: '+tm+'°C, Влажность: '+hm+'%, Счетчик: '+cnt);
flg_memo_cnt = cnt;
} else if(len == 3) { } else if(len == 3) {
let flg = value.getUint16(1, true); let flg = value.getUint16(1, true);
console.log('Последний блок: '+flg); console.log('Memo End: '+flg);
if(flg_memo_cnt == 0)
addLog('Пока нет истории!');
flg_memo_act = false; flg_memo_act = false;
} else if(len == 2) { } else if(len == 2) {
addLog('Нет сервиса записи истории!'); addLog('Нет сервиса записи истории!');
} else flg_memo_act = false;
} else {
console.log('blk: ' + dump8(value, value.byteLength)); console.log('blk: ' + dump8(value, value.byteLength));
} else if(blkId == 0x33 && len >= 8) { flg_memo_act = false;
let vbat = value.getUint16(1, true); }
}
} else if(blkId == 0x33 && len > 9) {
let count = value.getUint16(1, true);
let temp = value.getInt16(3, true) / 100.0; let temp = value.getInt16(3, true) / 100.0;
let humi = value.getInt16(5, true) / 100.0; let humi = value.getInt16(5, true) / 100.0;
let count = value.getUint16(7, true); let vbat = value.getUint16(7, true);
let pbat = value.getUint8(9);
let flg = 0; let flg = 0;
let rds_count = 0; let rds_count = 0;
if(len > 8) { let s = 'Vbat: '+vbat+' мВ '+pbat+'%, Температура: '+temp.toFixed(2)+'°C, Влажность: '+humi.toFixed(2)+'%, ID: '+count;
if(len > 12) {
flg = value.getUint8(9); flg = value.getUint8(9);
if(len > 12) rds_count = value.getUint32(10, true);
rds_count = value.getUint32(10, true); s += ', счетчик срабатываний: '+ rds_count+', флаги: 0x'+hex(flg,2)+':r'+(flg&1)+'/t'+((flg>>1)&1);
} }
let s = 'Vbat: '+vbat+' мВ, Температура: '+temp.toFixed(2)+'°C, Влажность: '+humi.toFixed(2)+'%, ID: '+count+', счетчик срабатываний: '+ rds_count+', флаги: 0x'+hex(flg,2)+':r'+(flg&1)+'/t'+((flg>>1)&1); //TODO: $("tempHumiData").innerHTML = s;
//$("tempHumiData").innerHTML = s;
addLog(s); addLog(s);
} else if((blkId == 0x25 || blkId == 0x26) && (len > 12)) { } else if((blkId == 0x25 || blkId == 0x26) && (len > 12)) {
// CMD_ID_CFS Get/Set sensor config // CMD_ID_CFS Get/Set sensor config
@ -1077,6 +1098,8 @@ function customBlkParse(value) {
} else if((blkId == 0x55 || blkId == 0x56) && (len > 12)) { } else if((blkId == 0x55 || blkId == 0x56) && (len > 12)) {
// CMD_ID_CFG Get/Set device config // CMD_ID_CFG Get/Set device config
devcfg.flg = value.getUint32(1, true); devcfg.flg = value.getUint32(1, true);
// bit0 - measure notify enable
// bit1 - lcd chow time enable
devcfg.rf_tx_power = value.getUint8(5); devcfg.rf_tx_power = value.getUint8(5);
devcfg.advertising_interval = value.getUint8(6); devcfg.advertising_interval = value.getUint8(6);
devcfg.connect_latency = value.getUint8(7); devcfg.connect_latency = value.getUint8(7);
@ -1182,12 +1205,29 @@ function customBlkParse(value) {
devnm.name = new TextDecoder("utf-8").decode(value.buffer.slice(1)); devnm.name = new TextDecoder("utf-8").decode(value.buffer.slice(1));
//if($("dev_name")) //if($("dev_name"))
// $("dev_name").value = dnm.name; // $("dev_name").value = dnm.name;
addLog("Имя устройства: ["+devnm.name+"]"); addLog("Имя устройства: '"+devnm.name+"'");
} else if(blkId == 0x10 && len >= 7) {
let mac = new Uint8Array(6);
mac[0] = value.getUint8(6);
mac[1] = value.getUint8(5);
mac[2] = value.getUint8(4);
mac[3] = value.getUint8(3);
mac[4] = value.getUint8(2);
mac[5] = value.getUint8(1);
addLog("MAC устройства: "+ bytesToHex(mac));
} else { } else {
console.log('blk: ' + dump8(value, value.byteLength)); console.log('blk: ' + dump8(value, value.byteLength));
addLog('Ответ на команду (' + hex(blkId,2) + '): ' + bytesToHex(value.buffer.slice(1))); addLog('Ответ на команду (' + hex(blkId,2) + '): ' + bytesToHex(value.buffer.slice(1)));
} }
} }
function getMemo(num) {
if(cmdCharacteristic != null) {
//addLog("getSensCfg...");
flg_memo_act = true;
flg_memo_cnt = 0;
cmdCharacteristic.writeValue(new Uint8Array([0x35, num&0xff, (num>>8)&0xff])).catch(error => { console.log(error); addLog("getMemo() error!"); });
}
}
function SetDevTime() { function SetDevTime() {
let time = Date.now()/1000; let time = Date.now()/1000;
@ -1205,8 +1245,10 @@ function SetDevTime() {
} }
function GetDevTime() { function GetDevTime() {
// addLog("Получить ремя от утройства..."); if(cmdCharacteristic != null) {
cmdCharacteristic.writeValue(new Uint8Array([0x23])).then(_ => { console.log('Send GetDevTime ok'); }); // addLog("Получить ремя от утройства...");
cmdCharacteristic.writeValue(new Uint8Array([0x23])).then(_ => { console.log('Send GetDevTime ok'); });
}
} }
function getDevCfg() { function getDevCfg() {
@ -1423,7 +1465,7 @@ window.onload = function() {
</script> </script>
<h2>PHY62x2-BTHome <a href="https://github.com/pvvx/THB2"><small>&#9432;</small></a></h2> <h2>PHY62x2-BTHome <a href="https://github.com/pvvx/THB2"><small>&#9432;</small></a></h2>
<label for="inpNamePrefix">Префикс названия устройств(а)</label><br> <label for="inpNamePrefix">Префикс названия устройств(а)</label><br>
<input type="text" id="inpNamePrefix" value="" placeholder="THB, BT, TH"> <input type="text" id="inpNamePrefix" value="" placeholder="THB, BT">
<hr> <hr>
<label id="lblStatus">Состояние: не подключено</label> <label id="lblStatus">Состояние: не подключено</label>
<br><br><hr> <br><br><hr>
@ -1555,6 +1597,7 @@ window.onload = function() {
<button type="button" id="btnSendData" onclick="sendData()" disabled="true">Записать</button><hr> <button type="button" id="btnSendData" onclick="sendData()" disabled="true">Записать</button><hr>
<button type="button" id="btnSendCommand" onclick="sendCommand()" disabled="true">Команда</button> <button type="button" id="btnSendCommand" onclick="sendCommand()" disabled="true">Команда</button>
<input type="text" id="inpCmdData" value="55" size="40" maxlength="40"><hr> <input type="text" id="inpCmdData" value="55" size="40" maxlength="40"><hr>
<button type="button" id="btnGetMemo" onclick="getMemo(50)" title="Последние 50 замеров">Тест чтения истории</button>
</div> </div>
<hr> <hr>
<button type="button" onclick="clearLog()">Очистить лог</button><br> <button type="button" onclick="clearLog()">Очистить лог</button><br>