first submission

This commit is contained in:
qiyongshuang
2023-02-01 14:19:13 +08:00
parent d534aad004
commit b79c6ac80d
3711 changed files with 745432 additions and 2 deletions
+428
View File
@@ -0,0 +1,428 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : app.c
* Author : WCH
* Version : V1.1
* Date : 2022/01/18
* Description :
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
/******************************************************************************/
#include "CONFIG.h"
#include "MESH_LIB.h"
#include "app_generic_onoff_model.h"
#include "app.h"
#include "HAL.h"
/*********************************************************************
* GLOBAL TYPEDEFS
*/
/*********************************************************************
* GLOBAL TYPEDEFS
*/
static uint8_t MESH_MEM[1024 * 2] = {0};
extern const ble_mesh_cfg_t app_mesh_cfg;
extern const struct device app_dev;
static uint8_t App_TaskID = 0; // Task ID for internal task/event processing
static uint16_t App_ProcessEvent(uint8_t task_id, uint16_t events);
#if(!CONFIG_BLE_MESH_PB_GATT)
NET_BUF_SIMPLE_DEFINE_STATIC(rx_buf, 65);
#endif /* !PB_GATT */
/*********************************************************************
* LOCAL FUNCION
*/
static void cfg_srv_rsp_handler( const cfg_srv_status_t *val );
static void link_open(bt_mesh_prov_bearer_t bearer);
static void link_close(bt_mesh_prov_bearer_t bearer, uint8_t reason);
static void prov_complete(uint16_t net_idx, uint16_t addr, uint8_t flags, uint32_t iv_index);
static void prov_reset(void);
static struct bt_mesh_cfg_srv cfg_srv = {
.relay = BLE_MESH_RELAY_ENABLED,
.beacon = BLE_MESH_BEACON_ENABLED,
#if(CONFIG_BLE_MESH_FRIEND)
.frnd = BLE_MESH_FRIEND_ENABLED,
#endif
#if(CONFIG_BLE_MESH_PROXY)
.gatt_proxy = BLE_MESH_GATT_PROXY_ENABLED,
#endif
/* 默认TTL为3 */
.default_ttl = 3,
/* 底层发送数据重试7次,每次间隔10ms(不含内部随机数) */
.net_transmit = BLE_MESH_TRANSMIT(7, 10),
/* 底层转发数据重试7次,每次间隔10ms(不含内部随机数) */
.relay_retransmit = BLE_MESH_TRANSMIT(7, 10),
.handler = cfg_srv_rsp_handler,
};
static struct bt_mesh_health_srv health_srv;
BLE_MESH_HEALTH_PUB_DEFINE(health_pub, 8);
uint16_t cfg_srv_keys[CONFIG_MESH_MOD_KEY_COUNT_DEF] = {BLE_MESH_KEY_UNUSED};
uint16_t cfg_srv_groups[CONFIG_MESH_MOD_GROUP_COUNT_DEF] = {BLE_MESH_ADDR_UNASSIGNED};
uint16_t health_srv_keys[CONFIG_MESH_MOD_KEY_COUNT_DEF] = {BLE_MESH_KEY_UNUSED};
uint16_t health_srv_groups[CONFIG_MESH_MOD_GROUP_COUNT_DEF] = {BLE_MESH_ADDR_UNASSIGNED};
uint16_t gen_onoff_srv_keys[CONFIG_MESH_MOD_KEY_COUNT_DEF] = {BLE_MESH_KEY_UNUSED};
uint16_t gen_onoff_srv_groups[CONFIG_MESH_MOD_GROUP_COUNT_DEF] = {BLE_MESH_ADDR_UNASSIGNED};
static struct bt_mesh_model root_models[] = {
BLE_MESH_MODEL_CFG_SRV(cfg_srv_keys, cfg_srv_groups, &cfg_srv),
BLE_MESH_MODEL_HEALTH_SRV(health_srv_keys, health_srv_groups, &health_srv, &health_pub),
BLE_MESH_MODEL(BLE_MESH_MODEL_ID_GEN_ONOFF_SRV, gen_onoff_op, NULL, gen_onoff_srv_keys, gen_onoff_srv_groups, NULL),
};
static struct bt_mesh_elem elements[] = {
{
/* Location Descriptor (GATT Bluetooth Namespace Descriptors) */
.loc = (0),
.model_count = ARRAY_SIZE(root_models),
.models = (root_models),
}
};
static uint8_t dev_uuid[16];
uint8_t MACAddr[6];
// elements 构成 Node Composition
const struct bt_mesh_comp app_comp = {
.cid = 0x07D7, // WCH 公司id
.elem = elements,
.elem_count = ARRAY_SIZE(elements),
};
// 配网参数和回调
static const struct bt_mesh_prov app_prov = {
.uuid = dev_uuid,
.link_open = link_open,
.link_close = link_close,
.complete = prov_complete,
.reset = prov_reset,
};
/*********************************************************************
* GLOBAL TYPEDEFS
*/
/*********************************************************************
* @fn prov_enable
*
* @brief 使能配网功能
*
* @return none
*/
static void prov_enable(void)
{
if(bt_mesh_is_provisioned())
{
return;
}
// Make sure we're scanning for provisioning inviations
bt_mesh_scan_enable();
// Enable unprovisioned beacon sending
bt_mesh_beacon_enable();
if(CONFIG_BLE_MESH_PB_GATT)
{
bt_mesh_proxy_prov_enable();
}
}
/*********************************************************************
* @fn link_open
*
* @brief 配网时后的link打开回调
*
* @param bearer - 当前link是PB_ADV还是PB_GATT
*
* @return none
*/
static void link_open(bt_mesh_prov_bearer_t bearer)
{
APP_DBG(" ");
}
/*********************************************************************
* @fn link_close
*
* @brief 配网后的link关闭回调
*
* @param bearer - 当前link是PB_ADV还是PB_GATT
* @param reason - link关闭原因
*
* @return none
*/
static void link_close(bt_mesh_prov_bearer_t bearer, uint8_t reason)
{
APP_DBG("reason %x", reason);
if(!bt_mesh_is_provisioned())
{
prov_enable();
}
else
{
}
}
/*********************************************************************
* @fn prov_complete
*
* @brief 配网完成回调,重新开始广播
*
* @param net_idx - 网络key的index
* @param addr - link关闭原因网络地址
* @param flags - 是否处于key refresh状态
* @param iv_index - 当前网络iv的index
*
* @return none
*/
static void prov_complete(uint16_t net_idx, uint16_t addr, uint8_t flags, uint32_t iv_index)
{
APP_DBG(" ");
}
/*********************************************************************
* @fn prov_reset
*
* @brief 复位配网功能回调
*
* @return none
*/
static void prov_reset(void)
{
APP_DBG("");
prov_enable();
}
/*********************************************************************
* @fn cfg_srv_rsp_handler
*
* @brief config 模型服务回调
*
* @param val - 回调参数,包括命令类型、配置命令执行状态
*
* @return none
*/
static void cfg_srv_rsp_handler( const cfg_srv_status_t *val )
{
if(val->cfgHdr.status)
{
// 配置命令执行不成功
APP_DBG("warning opcode 0x%02x", val->cfgHdr.opcode);
return;
}
if(val->cfgHdr.opcode == OP_APP_KEY_ADD)
{
APP_DBG("App Key Added");
}
else if(val->cfgHdr.opcode == OP_MOD_APP_BIND)
{
APP_DBG("Vendor Model Binded");
}
else if(val->cfgHdr.opcode == OP_MOD_SUB_ADD)
{
APP_DBG("Vendor Model Subscription Set");
}
else
{
APP_DBG("Unknow opcode 0x%02x", val->cfgHdr.opcode);
}
}
/*********************************************************************
* @fn keyPress
*
* @brief 按键回调
*
* @param keys - 按键类型
*
* @return none
*/
void keyPress(uint8_t keys)
{
APP_DBG("keys %d ", keys);
switch(keys)
{
default:
break;
}
}
/*********************************************************************
* @fn blemesh_on_sync
*
* @brief 同步mesh参数,启用对应功能,不建议修改
*
* @return none
*/
void blemesh_on_sync(void)
{
int err;
mem_info_t info;
uint8_t i;
if(tmos_memcmp(VER_MESH_LIB, VER_MESH_FILE, strlen(VER_MESH_FILE)) == FALSE)
{
PRINT("head file error...\n");
while(1);
}
info.base_addr = MESH_MEM;
info.mem_len = ARRAY_SIZE(MESH_MEM);
#if(CONFIG_BLE_MESH_FRIEND)
friend_init_register(bt_mesh_friend_init, friend_state);
#endif /* FRIEND */
#if(CONFIG_BLE_MESH_LOW_POWER)
lpn_init_register(bt_mesh_lpn_init, lpn_state);
#endif /* LPN */
#if(defined(BLE_MAC)) && (BLE_MAC == TRUE)
for(i = 0; i < 6; i++)
MACAddr[i] = MacAddr[5 - i];
tmos_memcpy(dev_uuid, MACAddr, 6);
#else
FLASH_GetMACAddress(MACAddr);
tmos_memcpy(dev_uuid, MACAddr, 6);
#endif
err = bt_mesh_cfg_set(&app_mesh_cfg, &app_dev, MACAddr, &info);
if(err)
{
APP_DBG("Unable set configuration (err:%d)", err);
return;
}
hal_rf_init();
err = bt_mesh_comp_register(&app_comp);
#if(CONFIG_BLE_MESH_RELAY)
bt_mesh_relay_init();
#endif /* RELAY */
#if(CONFIG_BLE_MESH_PROXY || CONFIG_BLE_MESH_PB_GATT)
#if(CONFIG_BLE_MESH_PROXY)
bt_mesh_proxy_beacon_init_register((void *)bt_mesh_proxy_beacon_init);
gatts_notify_register(bt_mesh_gatts_notify);
proxy_gatt_enable_register(bt_mesh_proxy_gatt_enable);
#endif /* PROXY */
#if(CONFIG_BLE_MESH_PB_GATT)
proxy_prov_enable_register(bt_mesh_proxy_prov_enable);
#endif /* PB_GATT */
bt_mesh_proxy_init();
#endif /* PROXY || PB-GATT */
#if(CONFIG_BLE_MESH_PROXY_CLI)
bt_mesh_proxy_client_init(cli); //待添加
#endif /* PROXY_CLI */
bt_mesh_prov_retransmit_init();
#if(!CONFIG_BLE_MESH_PB_GATT)
adv_link_rx_buf_register(&rx_buf);
#endif /* !PB_GATT */
err = bt_mesh_prov_init(&app_prov);
bt_mesh_mod_init();
bt_mesh_net_init();
bt_mesh_trans_init();
bt_mesh_beacon_init();
bt_mesh_adv_init();
#if((CONFIG_BLE_MESH_PB_GATT) || (CONFIG_BLE_MESH_PROXY) || (CONFIG_BLE_MESH_OTA))
bt_mesh_conn_adv_init();
#endif /* PROXY || PB-GATT || OTA */
#if(CONFIG_BLE_MESH_SETTINGS)
bt_mesh_settings_init();
#endif /* SETTINGS */
#if(CONFIG_BLE_MESH_PROXY_CLI)
bt_mesh_proxy_cli_adapt_init();
#endif /* PROXY_CLI */
#if((CONFIG_BLE_MESH_PROXY) || (CONFIG_BLE_MESH_PB_GATT) || \
(CONFIG_BLE_MESH_PROXY_CLI) || (CONFIG_BLE_MESH_OTA))
bt_mesh_adapt_init();
#endif /* PROXY || PB-GATT || PROXY_CLI || OTA */
if(err)
{
APP_DBG("Initializing mesh failed (err %d)", err);
return;
}
APP_DBG("Bluetooth initialized");
#if(CONFIG_BLE_MESH_SETTINGS)
settings_load();
#endif /* SETTINGS */
if(bt_mesh_is_provisioned())
{
APP_DBG("Mesh network restored from flash");
}
else
{
prov_enable();
}
APP_DBG("Mesh initialized");
}
/*********************************************************************
* @fn App_Init
*
* @brief 应用层初始化
*
* @return none
*/
void App_Init()
{
App_TaskID = TMOS_ProcessEventRegister(App_ProcessEvent);
blemesh_on_sync();
HAL_KeyInit();
HalKeyConfig(keyPress);
tmos_set_event(App_TaskID, APP_USER_EVT);
}
/*********************************************************************
* @fn App_ProcessEvent
*
* @brief 应用层事件处理函数
*
* @param task_id - The TMOS assigned task ID.
* @param events - events to process. This is a bit map and can
* contain more than one event.
*
* @return events not processed
*/
static uint16_t App_ProcessEvent(uint8_t task_id, uint16_t events)
{
if(events & APP_USER_EVT)
{
return (events ^ APP_USER_EVT);
}
// Discard unknown events
return 0;
}
/******************************** endfile @ main ******************************/