234 lines
5.7 KiB
C
234 lines
5.7 KiB
C
/*********************************************************************************************
|
||
* Filename : app_mesh.c
|
||
|
||
* Description :
|
||
|
||
* Author : Bingquan
|
||
|
||
* Email : caibingquan@zh-jieli.com
|
||
|
||
* Last modifiled : 2019-07-22 14:01
|
||
|
||
* Copyright:(c)JIELI 2011-2019 @ , All Rights Reserved.
|
||
*********************************************************************************************/
|
||
#include "system/app_core.h"
|
||
#include "system/includes.h"
|
||
#include "server/server_core.h"
|
||
#include "app_config.h"
|
||
#include "app_action.h"
|
||
#include "os/os_api.h"
|
||
#include "btcontroller_config.h"
|
||
#include "btctrler/btctrler_task.h"
|
||
#include "config/config_transport.h"
|
||
#include "btstack/avctp_user.h"
|
||
#include "btstack/btstack_task.h"
|
||
#include "bt_common.h"
|
||
|
||
#define LOG_TAG "[app_mesh]"
|
||
#define LOG_ERROR_ENABLE
|
||
#define LOG_DEBUG_ENABLE
|
||
#define LOG_INFO_ENABLE
|
||
/* #define LOG_DUMP_ENABLE */
|
||
#define LOG_CLI_ENABLE
|
||
#include "debug.h"
|
||
|
||
#define WAIT_DISCONN_TIME_MS (300)
|
||
|
||
extern const u8 *bt_get_mac_addr();
|
||
extern void lib_make_ble_address(u8 *ble_address, u8 *edr_address);
|
||
extern void ble_module_enable(u8 en);
|
||
extern void bt_pll_para(u32 osc, u32 sys, u8 low_power, u8 xosc);
|
||
extern void input_key_handler(u8 key_status, u8 key_number);
|
||
extern void bt_ble_init(void);
|
||
extern void bt_ble_adv_enable(u8 enable);
|
||
|
||
static u8 is_app_active = 0;
|
||
|
||
static void app_set_soft_poweroff(void)
|
||
{
|
||
log_info("set_soft_poweroff\n");
|
||
is_app_active = 1;
|
||
|
||
//必须先主动断开蓝牙链路,否则要等链路超时断开
|
||
ble_module_enable(0);
|
||
|
||
//延时300ms,确保BT退出链路断开
|
||
sys_timeout_add(NULL, power_set_soft_poweroff, WAIT_DISCONN_TIME_MS);
|
||
}
|
||
|
||
static void app_start()
|
||
{
|
||
log_info("=======================================");
|
||
log_info("-------------BLE MESH DEMO-------------");
|
||
log_info("=======================================");
|
||
|
||
is_app_active = 1;
|
||
|
||
clk_set("sys", BT_NORMAL_HZ);
|
||
u32 sys_clk = clk_get("sys");
|
||
bt_pll_para(TCFG_CLOCK_OSC_HZ, sys_clk, 0, 0);
|
||
|
||
btstack_init();
|
||
|
||
/* 按键消息使能 */
|
||
sys_key_event_enable();
|
||
}
|
||
|
||
static int state_machine(struct application *app, enum app_state state, struct intent *it)
|
||
{
|
||
switch (state) {
|
||
case APP_STA_CREATE:
|
||
break;
|
||
case APP_STA_START:
|
||
if (!it) {
|
||
break;
|
||
}
|
||
switch (it->action) {
|
||
case ACTION_AT_MAIN:
|
||
app_start();
|
||
break;
|
||
}
|
||
break;
|
||
case APP_STA_PAUSE:
|
||
break;
|
||
case APP_STA_RESUME:
|
||
break;
|
||
case APP_STA_STOP:
|
||
break;
|
||
case APP_STA_DESTROY:
|
||
log_info("APP_STA_DESTROY\n");
|
||
break;
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
|
||
#define HCI_EVENT_VENDOR_REMOTE_TEST 0xFE
|
||
|
||
static int bt_hci_event_handler(struct bt_event *bt)
|
||
{
|
||
//对应原来的蓝牙连接上断开处理函数 ,bt->value=reason
|
||
log_info("------------------------bt_hci_event_handler reason %x %x", bt->event, bt->value);
|
||
|
||
if (bt->event == HCI_EVENT_VENDOR_REMOTE_TEST) {
|
||
if (0 == bt->value) {
|
||
log_info("clear_test_box_flag");
|
||
return 0;
|
||
} else {
|
||
//1:edr con;2:ble con;
|
||
if (1 == bt->value) {
|
||
bt_ble_adv_enable(0);
|
||
}
|
||
}
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
|
||
|
||
static int bt_connction_status_event_handler(struct bt_event *bt)
|
||
{
|
||
|
||
printf("-----------------------bt_connction_status_event_handler %d", bt->event);
|
||
|
||
switch (bt->event) {
|
||
case BT_STATUS_INIT_OK:
|
||
/*
|
||
* 蓝牙初始化完成
|
||
*/
|
||
log_info("BT_STATUS_INIT_OK\n");
|
||
|
||
if (BT_MODE_IS(BT_BQB)) {
|
||
void ble_bqb_test_thread_init(void);
|
||
ble_bqb_test_thread_init();
|
||
} else {
|
||
#if TCFG_NORMAL_SET_DUT_MODE
|
||
log_info("set dut mode\n");
|
||
extern void ble_standard_dut_test_init(void);
|
||
ble_standard_dut_test_init();
|
||
#else
|
||
extern void bt_ble_init(void);
|
||
bt_ble_init();
|
||
#endif
|
||
}
|
||
/* bt_ble_init(); */
|
||
is_app_active = 0;
|
||
|
||
break;
|
||
|
||
default:
|
||
log_info(" BT STATUS DEFAULT\n");
|
||
break;
|
||
}
|
||
return 0;
|
||
}
|
||
|
||
static void app_key_event_handler(struct sys_event *event)
|
||
{
|
||
u8 event_type = 0;
|
||
u8 key_value = 0;
|
||
|
||
if (event->arg == (void *)DEVICE_EVENT_FROM_KEY) {
|
||
event_type = event->u.key.event;
|
||
key_value = event->u.key.value;
|
||
printf("app_key_evnet: %d,%d\n", event_type, key_value);
|
||
input_key_handler(event_type, key_value);
|
||
|
||
if (event_type == KEY_EVENT_LONG && key_value == TCFG_ADKEY_VALUE6) {
|
||
app_set_soft_poweroff();
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
static int event_handler(struct application *app, struct sys_event *event)
|
||
{
|
||
switch (event->type) {
|
||
case SYS_KEY_EVENT:
|
||
app_key_event_handler(event);
|
||
return 0;
|
||
|
||
case SYS_BT_EVENT:
|
||
if ((u32)event->arg == SYS_BT_EVENT_TYPE_CON_STATUS) {
|
||
bt_connction_status_event_handler(&event->u.bt);
|
||
} else if ((u32)event->arg == SYS_BT_EVENT_TYPE_HCI_STATUS) {
|
||
bt_hci_event_handler(&event->u.bt);
|
||
}
|
||
return 0;
|
||
|
||
case SYS_DEVICE_EVENT:
|
||
return 0;
|
||
|
||
default:
|
||
return FALSE;
|
||
}
|
||
return FALSE;
|
||
}
|
||
|
||
static const struct application_operation app_at_ops = {
|
||
.state_machine = state_machine,
|
||
.event_handler = event_handler,
|
||
};
|
||
|
||
/*
|
||
* 注册AT Module模式
|
||
*/
|
||
REGISTER_APPLICATION(app_mesh) = {
|
||
.name = "mesh",
|
||
.action = ACTION_AT_MAIN,
|
||
.ops = &app_at_ops,
|
||
.state = APP_STA_DESTROY,
|
||
};
|
||
|
||
//-----------------------
|
||
//system check go sleep is ok
|
||
static u8 app_state_idle_query(void)
|
||
{
|
||
return !is_app_active;
|
||
}
|
||
|
||
REGISTER_LP_TARGET(app_state_lp_target) = {
|
||
.name = "app_state_deal",
|
||
.is_idle = app_state_idle_query,
|
||
};
|