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 SWVER=_v08
@set SWVER=_v09
@del /Q "build\THB2%SWVER%.hex"
@del /Q "build\THB2%SWVER%.bin"
@mkdir .\bin
@ -13,6 +13,12 @@
@make -s -j PROJECT_NAME=BTH01%SWVER% POJECT_DEF="-DDEVICE=DEVICE_BTH01"
@if not exist "build\BTH01%SWVER%.hex" goto :error
@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"
@make -s clean
@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"
@if not exist "build\BOOT_BTH01%SWVER%.hex" goto :error
@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"
@make -s clean
@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 "adc.h"
#include "battery.h"
#include "bleperipheral.h"
#include "thb2_main.h"
#include "pwrmgr.h"
#include "jump_function.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);
int len = ota.pkt_total-2;
uint8_t buf[16];
osal_memcpy(&buf[0], &ota.fw_value, 4);
osal_memcpy(&buf[4], faddr, 12);
memcpy(&buf[0], &ota.fw_value, 4);
memcpy(&buf[4], faddr, 12);
faddr += 12;
crc = get_crc32_16bytes(crc, buf);
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) {
ota.err_flag = err_flg;
// send/Notify?
osal_memcpy(pout, &ota, 20);
memcpy(pout, &ota, 20);
return 20;
}
return 0;
@ -289,7 +289,7 @@ static uint32_t start_app(void) {
//&& info_seg.waddr < 0x11000000
//&& info_seg.waddr > 0x11020000
&& 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--;
}

View file

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

View file

@ -19,7 +19,7 @@
#include "gapbondmgr.h"
#include "flash.h"
#include "flash_eep.h"
#include "bleperipheral.h"
#include "thb2_main.h"
#include "sbp_profile.h"
#include "sensor.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[1] = 0; // no err
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);
} 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);
memcpy(&cfg, &ibuf[1], len);
test_config();
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;
} 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();
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;
#if (DEV_SERVICES & SERVICE_THS)
} 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);
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);
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);
memset(&thsensor_cfg, 0, thsensor_cfg_send_size);
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;
} 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;
#endif
#if (DEV_SERVICES & SERVICE_HISTORY)
@ -106,13 +106,11 @@ int cmd_parser(uint8_t * obuf, uint8_t * ibuf, uint32_t len) {
}
#endif
} 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;
} 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;
// } 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]);
@ -120,20 +118,24 @@ int cmd_parser(uint8_t * obuf, uint8_t * ibuf, uint32_t len) {
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();
wrk.reboot = ibuf[1];
obuf[1] = ibuf[1];
} 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)
} 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);
memcpy(display_buff, &ibuf[1], len);
update_lcd();
}
osal_memcpy(&obuf[1], display_buff, sizeof(display_buff));
memcpy(&obuf[1], display_buff, sizeof(display_buff));
olen = 1 + sizeof(display_buff);
#endif
} 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;
}
tmp = get_utc_time_sec();
osal_memcpy(&obuf[1], &tmp, 4);
memcpy(&obuf[1], &tmp, 4);
#if (DEV_SERVICES & SERVICE_TIME_ADJUST)
memcpy(&obuf[4 + 1], &clkt.utc_set_time_sec, sizeof(clkt.utc_set_time_sec));
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));
olen = sizeof(clkt.delta_time) + 1;
#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) {
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;
if(len > 5) {
len -= 5;
osal_memcpy(p, &ibuf[5], len);
memcpy(p, &ibuf[5], len);
} else
len = SEND_DATA_SIZE;
osal_memcpy(obuf, ibuf, 5);
osal_memcpy(&obuf[5], p, len);
memcpy(obuf, ibuf, 5);
memcpy(&obuf[5], p, len);
olen = len + 1 + 4;
} else if (cmd == CMD_ID_REG_RW && len > 4) { // Read/Write 32 bits register (aligned)
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;
}
tmp = *p;
osal_memcpy(obuf, ibuf, 5);
osal_memcpy(&obuf[5], &tmp, 4);
memcpy(obuf, ibuf, 5);
memcpy(&obuf[5], &tmp, 4);
olen = 1 + 4 + 4;
} else {
obuf[1] = 0xff; // Error cmd

View file

@ -22,7 +22,7 @@
#include "gapbondmgr.h"
#include "pwrmgr.h"
#include "gpio.h"
#include "bleperipheral.h"
#include "thb2_main.h"
#include "ll.h"
#include "ll_hw_drv.h"
#include "ll_def.h"
@ -42,17 +42,18 @@
extern gapPeriConnectParams_t periConnParameters;
clock_time_t clkt;
cfg_t cfg;
work_parm_t wrk;
adv_work_t adv_wrk;
const cfg_t def_cfg = {
.flg = 0,
.flg = 1,
.rf_tx_power = RF_PHY_TX_POWER_0DBM,
.advertising_interval = 80, // 80 * 62.5 = 5000 ms
.measure_interval = 2, // 5 * 2 = 10 sec
.batt_interval = 60, // 60 sec
.connect_latency = 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_sec += clkt.utc_time_add >> 15; // div 32768
clkt.utc_time_add &= (1<<15) - 1;
AP_AON->SLEEP_R[2] = clkt.utc_time_add; // сохранить
AP_AON->SLEEP_R[3] = clkt.utc_time_sec; // сохранить
AP_AON->SLEEP_R[2] = clkt.utc_time_add; // сохранить для восстановления часов после перезагрузки
AP_AON->SLEEP_R[3] = clkt.utc_time_sec; // сохранить для восстановления часов после перезагрузки
// HAL_EXIT_CRITICAL_SECTION();
#if (DEV_SERVICES & SERVICE_TIME_ADJUST)
// TODO
@ -117,13 +118,14 @@ void test_config(void) {
void load_eep_config(void) {
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 {
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(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
}

View file

@ -13,7 +13,7 @@
// #include "bus_dev.h"
#ifndef APP_VERSION
#define APP_VERSION 0x08 // BCD
#define APP_VERSION 0x09 // BCD
#endif
/*
@ -40,7 +40,7 @@
#define DEVICE_TH05 21
#ifndef DEVICE
#define DEVICE DEVICE_THB2
#define DEVICE DEVICE_TH05
#endif
// supported services by the device (bits)
@ -59,12 +59,12 @@
#define SERVICE_TIME_ADJUST 0x00001000 // пока нет
#define SERVICE_HARD_CLOCK 0x00002000 // пока нет
#define OTA_TYPE_NONE 0 // нет OTA
#define OTA_TYPE_BOOT (SERVICE_OTA | SERVICE_OTA_EXT) // вариант для прошивки boot + OTA
#define OTA_TYPE_APP SERVICE_OTA_EXT // переключение из APP на OTA + boot прошивку, пока не реализовано
#define OTA_TYPE_NONE 0 // нет OTA, только переключение из APP на boot прошивку
#define OTA_TYPE_BOOT SERVICE_OTA // вариант для прошивки boot + OTA
#define OTA_TYPE_APP SERVICE_OTA_EXT // не реализовано
#ifndef OTA_TYPE
#define OTA_TYPE OTA_TYPE_BOOT
#define OTA_TYPE OTA_TYPE_NONE
#endif
#define DEF_SOFTWARE_REVISION {'V', '0'+ (APP_VERSION >> 4), '.' , '0'+ (APP_VERSION & 0x0F), 0}
@ -137,6 +137,7 @@
| SERVICE_SCREEN \
| SERVICE_THS \
| SERVICE_KEY \
| SERVICE_HISTORY \
)
#else
#define DEV_SERVICES (OTA_TYPE \
@ -196,10 +197,13 @@ typedef struct _cfg_t {
uint8_t reserved2;
}cfg_t;
extern cfg_t cfg;
extern const cfg_t def_cfg;
#define FLG_MEAS_NOTIFY 1 // включить Notify измерений
#define FLG_SHOW_TIME 2 // включить показ часов на LCD
typedef struct _adv_work_t {
uint32_t measure_interval_ms;
uint32_t measure_batt_tik;
@ -207,9 +211,21 @@ typedef struct _adv_work_t {
uint8_t adv_con_count;
uint8_t adv_batt;
} adv_work_t;
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
#if 1
#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
case DEVINFO_SYSTEM_ID:
osal_memcpy(devInfoSystemId, value, len);
memcpy(devInfoSystemId, value, len);
break;
#endif
@ -380,55 +380,55 @@ bStatus_t DevInfo_GetParameter( uint8 param, void* value )
{
#if SYSTEM_ID_ENABLE
case DEVINFO_SYSTEM_ID:
osal_memcpy(value, devInfoSystemId, sizeof(devInfoSystemId));
memcpy(value, devInfoSystemId, sizeof(devInfoSystemId));
break;
#endif
#if MODEL_NUMBER_STR_ENABLE
case DEVINFO_MODEL_NUMBER:
osal_memcpy(value, devInfoModelNumber, sizeof(devInfoModelNumber));
memcpy(value, devInfoModelNumber, sizeof(devInfoModelNumber));
break;
#endif
#if SERIAL_NUMBER_STR_ENABLE
case DEVINFO_SERIAL_NUMBER:
osal_memcpy(value, devInfoSerialNumber, sizeof(devInfoSerialNumber));
memcpy(value, devInfoSerialNumber, sizeof(devInfoSerialNumber));
break;
#endif
#if FIRMWARE_REVISION_ENABLE
case DEVINFO_FIRMWARE_REV:
osal_memcpy(value, devInfoFirmwareRev, sizeof(devInfoFirmwareRev));
memcpy(value, devInfoFirmwareRev, sizeof(devInfoFirmwareRev));
break;
#endif
#if HARDWARE_REVISION_ENABLE
case DEVINFO_HARDWARE_REV:
osal_memcpy(value, devInfoHardwareRev, sizeof(devInfoHardwareRev));
memcpy(value, devInfoHardwareRev, sizeof(devInfoHardwareRev));
break;
#endif
#if SOFTWARE_REVISION_ENABLE
case DEVINFO_SOFTWARE_REV:
osal_memcpy(value, devInfoSoftwareRev, sizeof(devInfoSoftwareRev));
memcpy(value, devInfoSoftwareRev, sizeof(devInfoSoftwareRev));
break;
#endif
#if MANUFACTURE_NAME_STR_ENABLE
case DEVINFO_MANUFACTURER_NAME:
osal_memcpy(value, devInfoMfrName, sizeof(devInfoMfrName));
memcpy(value, devInfoMfrName, sizeof(devInfoMfrName));
break;
#endif
#if IEEE_DATA_ENABLE
case DEVINFO_11073_CERT_DATA:
osal_memcpy(value, devInfo11073Cert, sizeof(devInfo11073Cert));
memcpy(value, devInfo11073Cert, sizeof(devInfo11073Cert));
break;
#endif
#if PNP_ID_ENABLE
case DEVINFO_PNP_ID:
osal_memcpy(value, devInfoPnpId, sizeof(devInfoPnpId));
memcpy(value, devInfoPnpId, sizeof(devInfoPnpId));
break;
#endif
@ -472,7 +472,7 @@ static uint8 devInfo_ReadAttrCB( uint16 connHandle, gattAttribute_t* pAttr,
// determine read length
*pLen = MIN(maxLen, (sizeof(devInfoSystemId) - offset));
// copy data
osal_memcpy(pValue, &devInfoSystemId[offset], *pLen);
memcpy(pValue, &devInfoSystemId[offset], *pLen);
}
break;
#endif
@ -486,7 +486,7 @@ static uint8 devInfo_ReadAttrCB( uint16 connHandle, gattAttribute_t* pAttr,
// determine read length (exclude null terminating character)
*pLen = MIN(maxLen, ((sizeof(devInfoModelNumber) - 1) - offset));
// copy data
osal_memcpy(pValue, &devInfoModelNumber[offset], *pLen);
memcpy(pValue, &devInfoModelNumber[offset], *pLen);
}
break;
#endif
@ -500,7 +500,7 @@ static uint8 devInfo_ReadAttrCB( uint16 connHandle, gattAttribute_t* pAttr,
// determine read length (exclude null terminating character)
*pLen = MIN(maxLen, ((sizeof(devInfoSerialNumber) - 1) - offset));
// copy data
osal_memcpy(pValue, &devInfoSerialNumber[offset], *pLen);
memcpy(pValue, &devInfoSerialNumber[offset], *pLen);
}
break;
#endif
@ -514,7 +514,7 @@ static uint8 devInfo_ReadAttrCB( uint16 connHandle, gattAttribute_t* pAttr,
// determine read length (exclude null terminating character)
*pLen = MIN(maxLen, ((sizeof(devInfoFirmwareRev) - 1) - offset));
// copy data
osal_memcpy(pValue, &devInfoFirmwareRev[offset], *pLen);
memcpy(pValue, &devInfoFirmwareRev[offset], *pLen);
}
break;
#endif
@ -528,7 +528,7 @@ static uint8 devInfo_ReadAttrCB( uint16 connHandle, gattAttribute_t* pAttr,
// determine read length (exclude null terminating character)
*pLen = MIN(maxLen, ((sizeof(devInfoHardwareRev) - 1) - offset));
// copy data
osal_memcpy(pValue, &devInfoHardwareRev[offset], *pLen);
memcpy(pValue, &devInfoHardwareRev[offset], *pLen);
}
break;
#endif
@ -542,7 +542,7 @@ static uint8 devInfo_ReadAttrCB( uint16 connHandle, gattAttribute_t* pAttr,
// determine read length (exclude null terminating character)
*pLen = MIN(maxLen, ((sizeof(devInfoSoftwareRev) - 1) - offset));
// copy data
osal_memcpy(pValue, &devInfoSoftwareRev[offset], *pLen);
memcpy(pValue, &devInfoSoftwareRev[offset], *pLen);
}
break;
#endif
@ -556,7 +556,7 @@ static uint8 devInfo_ReadAttrCB( uint16 connHandle, gattAttribute_t* pAttr,
// determine read length (exclude null terminating character)
*pLen = MIN(maxLen, ((sizeof(devInfoMfrName) - 1) - offset));
// copy data
osal_memcpy(pValue, &devInfoMfrName[offset], *pLen);
memcpy(pValue, &devInfoMfrName[offset], *pLen);
}
break;
#endif
@ -570,7 +570,7 @@ static uint8 devInfo_ReadAttrCB( uint16 connHandle, gattAttribute_t* pAttr,
// determine read length
*pLen = MIN(maxLen, (sizeof(devInfo11073Cert) - offset));
// copy data
osal_memcpy(pValue, &devInfo11073Cert[offset], *pLen);
memcpy(pValue, &devInfo11073Cert[offset], *pLen);
}
break;
#endif
@ -584,7 +584,7 @@ static uint8 devInfo_ReadAttrCB( uint16 connHandle, gattAttribute_t* pAttr,
// determine read length
*pLen = MIN(maxLen, (sizeof(devInfoPnpId) - offset));
// copy data
osal_memcpy(pValue, &devInfoPnpId[offset], *pLen);
memcpy(pValue, &devInfoPnpId[offset], *pLen);
}
break;
#endif

View file

@ -19,7 +19,7 @@ extern "C" {
//#define EEP_ID_RPC (0x0DF5) // EEP ID reed switch pulse counter
//#define EEP_ID_PCD (0xC0DE) // EEP ID pincode
//#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_KEY (0xBC0D) // EEP ID bkey
#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();
}
struct {
// uint32_t chow_tik;
uint8_t count;
} lcd;
/* flg != 0 -> chow_measure */
void chow_lcd(int flg) {
if(cfg.flg & 1) {
if(lcd.count++ & 1)
if(cfg.flg & FLG_SHOW_TIME) {
if(wrk.lcd_count++ & 1)
chow_clock();
else
chow_measure();

View file

@ -316,19 +316,20 @@ int main(void) {
#if 0 // defined ( __GNUC__ ) // -> *.ld
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
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 (read_reg(OTA_MODE_SELECT_REG) != 0x55
if (wrk.boot_flg != BOOT_FLG_OTA
#if (DEV_SERVICES & SERVICE_KEY)
&& hal_gpio_read(GPIO_KEY)
&& hal_gpio_read(GPIO_KEY)
#endif
) {
spif_config(SYS_CLK_DLL_64M, 1, XFRD_FCMD_READ_DUAL, 0, 0);
AP_PCR->CACHE_BYPASS = 1; // just bypass cache
startup_app();
}// else write_reg(OTA_MODE_SELECT_REG, 0);
}
#endif
watchdog_config(WDG_2S);

View file

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

View file

@ -20,13 +20,14 @@
#include "gapbondmgr.h"
//#include "log.h"
#include "thb2_peripheral.h"
#include "bleperipheral.h"
#include "thb2_main.h"
#include "sbp_profile.h"
#include "cmd_parser.h"
#include "ble_ota.h"
#include "logger.h"
#include "hci.h"
#include "lcd_th05.h"
#include "sensor.h"
/*********************************************************************
* MACROS
@ -311,13 +312,13 @@ static bStatus_t simpleProfile_ReadAttrCB( uint16_t connHandle, gattAttribute_t
#if OTA_TYPE
case SIMPLEPROFILE_CHAR1_UUID:
*pLen = 20;
osal_memcpy( pValue, &ota, *pLen );
memcpy( pValue, &ota, *pLen );
LOG("Read_UUID1:\n");
break;
#endif
case SIMPLEPROFILE_CHAR2_UUID:
*pLen = sizeof(dev_id);
osal_memcpy( pValue, &dev_id, *pLen);
memcpy( pValue, &dev_id, *pLen);
LOG("Read_UUID2:\n");
break;
default:
@ -377,7 +378,7 @@ static bStatus_t simpleProfile_ReadAttrCB( uint16_t connHandle, gattAttribute_t
//Write the value
if ( status == SUCCESS) {
osal_memcpy( pAttr->pValue, pValue, len );
memcpy( pAttr->pValue, pValue, len );
ota_in_len = len;
LOG("OTA receive data = 0x ");
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;
// Write the value
if ( status == SUCCESS ) {
osal_memcpy(pAttr->pValue, pValue, len );
memcpy(pAttr->pValue, pValue, len );
cmd_in_len = len;
LOG("CMD receive data = 0x ");
LOG_DUMP_BYTE(pAttr->pValue, len);
@ -465,6 +466,30 @@ void new_ota_data(void) {
}
#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)
void wrk_notify(void) {
gattServerInfo_t* pServer;

View file

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

View file

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

View file

@ -83,6 +83,7 @@ int read_sensor_ahtxx(void) {
measured_data.humi = 0;
else if (measured_data.humi > 9999)
measured_data.humi = 9999;
measured_data.count++;
return 0;
}
deinit_i2c();
@ -154,7 +155,7 @@ __ATTR_SECTION_XIP__ void init_sensor(void) {
thsensor_cfg.i2c_addr = 0;
}
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();
}

View file

@ -26,7 +26,7 @@
#include "gapbondmgr.h"
#include "pwrmgr.h"
#include "gpio.h"
#include "bleperipheral.h"
#include "thb2_main.h"
#include "ll.h"
#include "ll_hw_drv.h"
#include "ll_def.h"
@ -89,9 +89,7 @@ perStatsByChan_t g_perStatsByChanTest;
* LOCAL VARIABLES
*/
adv_work_t adv_wrk;
uint8 simpleBLEPeripheral_TaskID; // Task ID for internal task/event processing
uint8_t simpleBLEPeripheral_TaskID; // Task ID for internal task/event processing
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 peripheralStateNotificationCB( gaprole_States_t newState );
//static void simpleProfileChangeCB( uint8 paramID );
static void peripheralStateReadRssiCB( int8 rssi );
//static void simpleProfileChangeCB( uint8_t paramID );
static void peripheralStateReadRssiCB( int8_t rssi );
const char* hex_ascii = { "0123456789ABCDEF" };
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)
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;
*p++ = sizeof(DEF_MODEL_NUMBER_STR) + 7;
*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++ = '-';
p = str_bin2hex(p, mac+2, 1);
p = str_bin2hex(p, mac+1, 1);
str_bin2hex(p, mac, 1);
p = str_bin2hex(p, pmac+2, 1);
p = str_bin2hex(p, pmac+1, 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)
{
extern uint8 ownPublicAddr[LL_DEVICE_ADDR_LEN];
if (read_chip_mAddr(ownPublicAddr) != CHIP_ID_VALID) {
if(flash_read_cfg(ownPublicAddr, EEP_ID_MAC, LL_DEVICE_ADDR_LEN) != LL_DEVICE_ADDR_LEN) {
//extern uint8_t ownPublicAddr[LL_DEVICE_ADDR_LEN];
if(flash_read_cfg(ownPublicAddr, EEP_ID_MAC, MAC_LEN) != MAC_LEN) {
if (read_chip_mAddr(ownPublicAddr) != CHIP_ID_VALID) {
LL_Rand(ownPublicAddr,3);
// Tuya mac[0:3]
ownPublicAddr[3] = 0x8d;
ownPublicAddr[4] = 0x1f;
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);
// TODO: pGlobal_config[MAC_ADDRESS_LOC]
pGlobal_config[MAC_ADDRESS_LOC] = (uint32_t)ownPublicAddr;
// device name
set_dev_name();
}
static void set_serial_number(void)
@ -164,11 +176,11 @@ static void set_serial_number(void)
}
extern gapPeriConnectParams_t periConnParameters;
extern uint16 gapParameters[];
static void set_adv_interval(uint16 advInt);
extern uint16_t gapParameters[];
static void set_adv_interval(uint16_t advInt);
// 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);
GAP_EndDiscoverable( gapRole_TaskID );
@ -177,7 +189,7 @@ static void set_new_adv_interval(uint16 advInt)
osal_set_event( gapRole_TaskID, START_ADVERTISING_EVT );
}
// Set advertising interval
static void set_adv_interval(uint16 advInt)
static void set_adv_interval(uint16_t advInt)
{
#ifdef __GCC
gapParameters[TGAP_LIM_DISC_ADV_INT_MIN] = advInt;
@ -196,9 +208,9 @@ static void set_adv_interval(uint16 advInt)
static void adv_measure(void) {
if(gapRole_AdvEnabled) {
uint32_t tmp = get_utc_time_sec();
if(tmp - adv_wrk.measure_batt_tik >= cfg.batt_interval) {
adv_wrk.measure_batt_tik = tmp;
get_utc_time_sec(); // счет UTC timestamp
if(clkt.utc_time_tik - adv_wrk.measure_batt_tik >= ((uint32_t)cfg.batt_interval << 15)) {
adv_wrk.measure_batt_tik = clkt.utc_time_tik;
batt_start_measure();
#if ((DEV_SERVICES & SERVICE_THS) == 0)
adv_wrk.adv_batt = 1;
@ -249,6 +261,11 @@ static void adv_measure(void) {
#endif // (DEV_SERVICES & SERVICE_THS)
if(adv_wrk.adv_con_count) {
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);
}
}
@ -320,7 +337,7 @@ static void init_app_gpio(void)
* GAPROLE ADVERTISING
*/
void gatrole_advert_enable(bool enable) {
uint8 oldAdvEnabled = gapRole_AdvEnabled;
uint8_t oldAdvEnabled = gapRole_AdvEnabled;
gapRole_AdvEnabled = enable;
if ( (oldAdvEnabled) && (gapRole_AdvEnabled == FALSE) )
@ -380,7 +397,7 @@ static gapBondCBs_t simpleBLEPeripheral_BondMgrCBs =
*
* @return none
*/
void SimpleBLEPeripheral_Init( uint8 task_id )
void SimpleBLEPeripheral_Init( uint8_t task_id )
{
simpleBLEPeripheral_TaskID = task_id;
@ -429,10 +446,9 @@ void SimpleBLEPeripheral_Init( uint8 task_id )
// Set advertising interval
#if defined(OTA_TYPE) && OTA_TYPE == OTA_TYPE_BOOT
if (read_reg(OTA_MODE_SELECT_REG) == 0x55) {
write_reg(OTA_MODE_SELECT_REG, 0);
if (wrk.boot_flg == BOOT_FLG_OTA) {
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
#endif
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)
// Setup the GAP Bond Manager, add 2017-11-15
{
uint32 passkey = DEFAULT_PASSCODE;
uint8 pairMode = GAPBOND_PAIRING_MODE_WAIT_FOR_REQ;
uint8 mitm = TRUE;
uint8 ioCap = GAPBOND_IO_CAP_NO_INPUT_NO_OUTPUT;
uint8 bonding = TRUE;
GAPBondMgr_SetParameter( GAPBOND_DEFAULT_PASSCODE, sizeof ( uint32 ), &passkey );
GAPBondMgr_SetParameter( GAPBOND_PAIRING_MODE, sizeof ( uint8 ), &pairMode );
GAPBondMgr_SetParameter( GAPBOND_MITM_PROTECTION, sizeof ( uint8 ), &mitm );
GAPBondMgr_SetParameter( GAPBOND_IO_CAPABILITIES, sizeof ( uint8 ), &ioCap );
GAPBondMgr_SetParameter( GAPBOND_BONDING_ENABLED, sizeof ( uint8 ), &bonding );
uint32_t passkey = DEFAULT_PASSCODE;
uint8_t pairMode = GAPBOND_PAIRING_MODE_WAIT_FOR_REQ;
uint8_t mitm = TRUE;
uint8_t ioCap = GAPBOND_IO_CAP_NO_INPUT_NO_OUTPUT;
uint8_t bonding = TRUE;
GAPBondMgr_SetParameter( GAPBOND_DEFAULT_PASSCODE, sizeof ( uint32_t ), &passkey );
GAPBondMgr_SetParameter( GAPBOND_PAIRING_MODE, sizeof ( uint8_t ), &pairMode );
GAPBondMgr_SetParameter( GAPBOND_MITM_PROTECTION, sizeof ( uint8_t ), &mitm );
GAPBondMgr_SetParameter( GAPBOND_IO_CAPABILITIES, sizeof ( uint8_t ), &ioCap );
GAPBondMgr_SetParameter( GAPBOND_BONDING_ENABLED, sizeof ( uint8_t ), &bonding );
}
#endif
// Initialize GATT attributes
@ -465,7 +481,7 @@ void SimpleBLEPeripheral_Init( uint8 task_id )
#if (1)
#if 0 // CODED PHY not work?
deviceFeatureSet.featureSet[1] |= (uint8)(
deviceFeatureSet.featureSet[1] |= (uint8_t)(
LL_FEATURE_2M_PHY
| LL_FEATURE_CODED_PHY
| LL_FEATURE_CSA2);
@ -514,7 +530,7 @@ void SimpleBLEPeripheral_Init( uint8 task_id )
*
* @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
if ( events & ADV_BROADCAST_EVT) {
@ -525,7 +541,7 @@ uint16 BLEPeripheral_ProcessEvent( uint8 task_id, uint16 events )
}
if ( events & SYS_EVENT_MSG ) {
uint8 *pMsg;
uint8_t *pMsg;
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) {
LOG("TIMER_EVT\n");
get_utc_time_sec(); // счет UTC timestamp
#if (DEV_SERVICES & SERVICE_THS)
uint32_t tmp = get_utc_time_sec();
if(tmp - adv_wrk.measure_batt_tik >= cfg.batt_interval) {
adv_wrk.measure_batt_tik = tmp;
if(clkt.utc_time_tik - adv_wrk.measure_batt_tik >= ((uint32_t)cfg.batt_interval << 15)) {
adv_wrk.measure_batt_tik = clkt.utc_time_tik;
batt_start_measure();
}
read_sensor();
@ -565,8 +581,9 @@ uint16 BLEPeripheral_ProcessEvent( uint8 task_id, uint16 events )
#endif
// TH Notify
TH_NotifyLevel();
#else
get_utc_time_sec();
if(cfg.flg & FLG_MEAS_NOTIFY)
measure_notify();
#else // no SERVICE_THS
batt_start_measure();
#endif // (DEV_SERVICES & SERVICE_THS)
// return unprocessed events
@ -578,6 +595,8 @@ uint16 BLEPeripheral_ProcessEvent( uint8 task_id, uint16 events )
if(!gapRole_AdvEnabled) {
BattNotifyLevel();
#if ((DEV_SERVICES & SERVICE_THS)==0)
if(cfg.flg & FLG_MEAS_NOTIFY)
measure_notify();
#if (DEV_SERVICES & SERVICE_SCREEN)
chow_measure();
#endif
@ -662,7 +681,7 @@ static void simpleBLEPeripheral_ProcessOSALMsg( osal_event_hdr_t *pMsg )
*
* @return none
*/
static void peripheralStateReadRssiCB( int8 rssi )
static void peripheralStateReadRssiCB( int8_t rssi )
{
(void)rssi;
}
@ -726,6 +745,10 @@ static void peripheralStateReadRssiCB( int8 rssi )
show_ble_symbol(0);
update_lcd();
#endif
if(wrk.reboot) {
write_reg(OTA_MODE_SELECT_REG, wrk.reboot);
hal_system_soft_reset();
}
break;
case GAPROLE_WAITING_AFTER_TIMEOUT:

View file

@ -1,16 +1,15 @@
/**************************************************************************************************
Filename: bleperipheral.h
Revised:
Revision:
Filename: thb2_main.h
Revised:
Revision:
Description: This file contains the Simple BLE Peripheral sample application
definitions and prototypes.
**************************************************************************************************/
#ifndef SIMPLEBLEPERIPHERAL_H
#define SIMPLEBLEPERIPHERAL_H
#ifndef _THB2_MAIN_H_
#define _THB2_MAIN_H_
#ifdef __cplusplus
extern "C"
@ -37,7 +36,7 @@ extern "C"
#define DEVINFO_SYSTEM_ID_LEN 8
#define DEVINFO_SYSTEM_ID 0
#define DEFAULT_DISCOVERABLE_MODE GAP_ADTYPE_FLAGS_GENERAL
// Whether to enable automatic parameter update request when a connection is formed
@ -57,28 +56,30 @@ extern "C"
/*********************************************************************
* MACROS
*/
#define MAC_DATA_LEN 6
// #define MAC_DATA_LEN 6
extern uint8 simpleBLEPeripheral_TaskID;
/*********************************************************************
* 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
}
#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:
if ( len == KEYLEN )
{
VOID osal_memcpy( gapRole_IRK, pValue, KEYLEN ) ;
VOID memcpy( gapRole_IRK, pValue, KEYLEN ) ;
}
else
{
@ -209,7 +209,7 @@ bStatus_t GAPRole_SetParameter( uint16 param, uint8 len, void* pValue )
case GAPROLE_SRK:
if ( len == KEYLEN )
{
VOID osal_memcpy( gapRole_SRK, pValue, KEYLEN ) ;
VOID memcpy( gapRole_SRK, pValue, KEYLEN ) ;
}
else
{
@ -280,7 +280,7 @@ bStatus_t GAPRole_SetParameter( uint16 param, uint8 len, void* pValue )
if ( len <= 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;
// Update the advertising data
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 )
{
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;
// Update the Response Data
ret = GAP_UpdateAdvertisingData( gapRole_TaskID,
@ -337,7 +337,7 @@ bStatus_t GAPRole_SetParameter( uint16 param, uint8 len, void* pValue )
case GAPROLE_ADV_DIRECT_ADDR:
if ( len == B_ADDR_LEN )
{
VOID osal_memcpy( gapRole_AdvDirectAddr, pValue, B_ADDR_LEN ) ;
VOID memcpy( gapRole_AdvDirectAddr, pValue, B_ADDR_LEN ) ;
}
else
{
@ -527,11 +527,11 @@ bStatus_t GAPRole_GetParameter( uint16 param, void* pValue )
break;
case GAPROLE_IRK:
VOID osal_memcpy( pValue, gapRole_IRK, KEYLEN ) ;
VOID memcpy( pValue, gapRole_IRK, KEYLEN ) ;
break;
case GAPROLE_SRK:
VOID osal_memcpy( pValue, gapRole_SRK, KEYLEN ) ;
VOID memcpy( pValue, gapRole_SRK, KEYLEN ) ;
break;
case GAPROLE_SIGNCOUNTER:
@ -539,7 +539,7 @@ bStatus_t GAPRole_GetParameter( uint16 param, void* pValue )
break;
case GAPROLE_BD_ADDR:
VOID osal_memcpy( pValue, gapRole_bdAddr, B_ADDR_LEN ) ;
VOID memcpy( pValue, gapRole_bdAddr, B_ADDR_LEN ) ;
break;
case GAPROLE_ADVERT_ENABLED:
@ -551,11 +551,11 @@ bStatus_t GAPRole_GetParameter( uint16 param, void* pValue )
break;
case GAPROLE_ADVERT_DATA:
VOID osal_memcpy( pValue, gapRole_AdvertData, gapRole_AdvertDataLen );
VOID memcpy( pValue, gapRole_AdvertData, gapRole_AdvertDataLen );
break;
case GAPROLE_SCAN_RSP_DATA:
VOID osal_memcpy( pValue, gapRole_ScanRspData, gapRole_ScanRspDataLen ) ;
VOID memcpy( pValue, gapRole_ScanRspData, gapRole_ScanRspDataLen ) ;
break;
case GAPROLE_ADV_EVENT_TYPE:
@ -567,7 +567,7 @@ bStatus_t GAPRole_GetParameter( uint16 param, void* pValue )
break;
case GAPROLE_ADV_DIRECT_ADDR:
VOID osal_memcpy( pValue, gapRole_AdvDirectAddr, B_ADDR_LEN ) ;
VOID memcpy( pValue, gapRole_AdvDirectAddr, B_ADDR_LEN ) ;
break;
case GAPROLE_ADV_CHANNEL_MAP:
@ -607,7 +607,7 @@ bStatus_t GAPRole_GetParameter( uint16 param, void* pValue )
break;
case GAPROLE_CONN_BD_ADDR:
VOID osal_memcpy( pValue, gapRole_ConnectedDevAddr, B_ADDR_LEN ) ;
VOID memcpy( pValue, gapRole_ConnectedDevAddr, B_ADDR_LEN ) ;
break;
case GAPROLE_CONN_INTERVAL:
@ -803,7 +803,7 @@ uint16 GAPRole_ProcessEvent( uint8 task_id, uint16 events )
{
params.eventType = gapRole_AdvEventType;
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;
@ -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_CSRK, KEYLEN, gapRole_SRK );
// 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;
// Update the advertising data
@ -1159,7 +1159,7 @@ static void gapRole_ProcessGAPMsg( gapEventHdr_t* pMsg )
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_ConnectionInterval = pPkt->connInterval;
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)
{
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;
}
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)
{
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;
}
else
@ -1759,7 +1759,7 @@ bStatus_t GAPRole_extAdv_SetParameter(uint8 adv_handler, uint16 param, uint16 le
case GAP_PEER_ADDR:
if (len == 6)
osal_memcpy(para->peerAddress,pValue,6);
memcpy(para->peerAddress,pValue,6);
else
ret = bleInvalidRange;
@ -1775,7 +1775,7 @@ bStatus_t GAPRole_extAdv_SetParameter(uint8 adv_handler, uint16 param, uint16 le
case GAP_OWN_RANDOM_ADDR:
if (len == 6)
osal_memcpy(&(gapRole_ExtAdv_RandomAddr[adv_handler][0]),pValue,6);
memcpy(&(gapRole_ExtAdv_RandomAddr[adv_handler][0]),pValue,6);
else
ret = bleInvalidRange;

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 v0.4</title>
<title>PHY62x2 BTHome v0.5</title>
<style type="text/css">
/* basic sytles */
@ -321,7 +321,9 @@ var devnm = {};
var startTime = 0,
isConnected = false;
isConnected = false,
flg_memo_act = false
flg_memo_cnt = 0;
var ota = {
fwArray: null,
@ -580,8 +582,18 @@ function onDisconnected() {
}
function startDFU() {
addLog("Старт программирования...");
updateBegin();
if(otaCharacteristic != null && ota.ind.version == 1 && (devsrs.services & 1) == 1) {
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) {
@ -1017,6 +1029,7 @@ function customBlkParse(value) {
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));
} else if(blkId == 0x35){
if(flg_memo_act) {
if(len >= 12) {
let cnt = value.getUint16(1, true);
let tc = value.getUint32(3, true);
@ -1024,29 +1037,37 @@ function customBlkParse(value) {
let hm = value.getUint16(9, true) / 100.0;
let vb = value.getUint16(11, true);
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) {
let flg = value.getUint16(1, true);
console.log('Последний блок: '+flg);
console.log('Memo End: '+flg);
if(flg_memo_cnt == 0)
addLog('Пока нет истории!');
flg_memo_act = false;
} else if(len == 2) {
addLog('Нет сервиса записи истории!');
} else
flg_memo_act = false;
} else {
console.log('blk: ' + dump8(value, value.byteLength));
} else if(blkId == 0x33 && len >= 8) {
let vbat = value.getUint16(1, true);
flg_memo_act = false;
}
}
} else if(blkId == 0x33 && len > 9) {
let count = value.getUint16(1, true);
let temp = value.getInt16(3, 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 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);
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);
//$("tempHumiData").innerHTML = s;
//TODO: $("tempHumiData").innerHTML = s;
addLog(s);
} else if((blkId == 0x25 || blkId == 0x26) && (len > 12)) {
// CMD_ID_CFS Get/Set sensor config
@ -1077,6 +1098,8 @@ function customBlkParse(value) {
} else if((blkId == 0x55 || blkId == 0x56) && (len > 12)) {
// CMD_ID_CFG Get/Set device config
devcfg.flg = value.getUint32(1, true);
// bit0 - measure notify enable
// bit1 - lcd chow time enable
devcfg.rf_tx_power = value.getUint8(5);
devcfg.advertising_interval = value.getUint8(6);
devcfg.connect_latency = value.getUint8(7);
@ -1182,12 +1205,29 @@ function customBlkParse(value) {
devnm.name = new TextDecoder("utf-8").decode(value.buffer.slice(1));
//if($("dev_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 {
console.log('blk: ' + dump8(value, value.byteLength));
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() {
let time = Date.now()/1000;
@ -1205,8 +1245,10 @@ function SetDevTime() {
}
function GetDevTime() {
// addLog("Получить ремя от утройства...");
cmdCharacteristic.writeValue(new Uint8Array([0x23])).then(_ => { console.log('Send GetDevTime ok'); });
if(cmdCharacteristic != null) {
// addLog("Получить ремя от утройства...");
cmdCharacteristic.writeValue(new Uint8Array([0x23])).then(_ => { console.log('Send GetDevTime ok'); });
}
}
function getDevCfg() {
@ -1423,7 +1465,7 @@ window.onload = function() {
</script>
<h2>PHY62x2-BTHome <a href="https://github.com/pvvx/THB2"><small>&#9432;</small></a></h2>
<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>
<label id="lblStatus">Состояние: не подключено</label>
<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="btnSendCommand" onclick="sendCommand()" disabled="true">Команда</button>
<input type="text" id="inpCmdData" value="55" size="40" maxlength="40"><hr>
<button type="button" id="btnGetMemo" onclick="getMemo(50)" title="Последние 50 замеров">Тест чтения истории</button>
</div>
<hr>
<button type="button" onclick="clearLog()">Очистить лог</button><br>