【Silicon Labs BG22-EK4108A 蓝牙开发评测】四 程序加按键开发步骤
[复制链接]
本帖最后由 damiaa 于 2022-1-7 15:48 编辑
【Silicon Labs BG22-EK4108A 蓝牙开发评测】四 程序加按键开发步骤
1,【Silicon Labs BG22-EK4108A 蓝牙开发评测】三 点灯程序开发步骤之后继续(利用已经生成的程序)
2,加入按键组件
并生成一个实例按键
同步的这里也可以看到信息
保存一下,代码里面可以看到生成的两个和按键相关的文件 记得配置的按键和板子的一致,这个板子的那个唯一按键是pc7
3,配置蓝牙的这个按键的 Characteristic
切换到蓝牙配置里面:改一下名字(不改也没关系)
左边最上面是新建service Characteristic 和描述
在LED and BUTTON 上面选择new Characteristic
再配置好Characteristic(BTN)的参数
4,保存一下
5,app.c加代码
#include <stdbool.h>
#include "em_common.h" //加入
#include "app_assert.h"
#include "sl_bluetooth.h"
#include "gatt_db.h"
#include "app.h"
#include "sl_simple_led_instances.h" //加入
#include "sl_simple_button_instances.h"//加入
// The advertising set handle allocated from Bluetooth stack.
static uint8_t advertising_set_handle = 0xff;//加入
// These variables need to be added and are used for the connection handle
// and the notification parameters to send Button data to the mobile app
uint8_t g_lab4Connection;//加入
uint8_t notification_data[1] = {0};//加入
uint16_t notification_len = 0;//加入
uint8_t notifyEnabled = false;//加入
extern sl_simple_button_context_t simple_btn0_context;//加入
/*
* Override function for button press that needs to be added. This function is
* called in interrupt context and uses the Bluetooth stack external signaling.
*/
void sl_button_on_change(const sl_button_t *handle)//加入 记得加在SL_WEAK void app_init(void)前
{
sl_simple_button_context_t *ctxt = ((sl_simple_button_context_t *)handle[0].context);
if (ctxt->state) {
ctxt->history += 1;
sl_bt_external_signal(1);
}
}
/**************************************************************************//**
* Application Init.
*****************************************************************************/
SL_WEAK void app_init(void)
{
/////////////////////////////////////////////////////////////////////////////
// Put your additional application init code here! //
// This is called once during start-up. //
/////////////////////////////////////////////////////////////////////////////
}
/**************************************************************************//**
* Application Process Action.
*****************************************************************************/
SL_WEAK void app_process_action(void)
{
/////////////////////////////////////////////////////////////////////////////
// Put your additional application code here! //
// This is called infinitely. //
// Do not call blocking functions from here! //
/////////////////////////////////////////////////////////////////////////////
}
/**************************************************************************//**
* Bluetooth stack event handler.
* This overrides the dummy weak implementation.
*
* @param[in] evt Event coming from the Bluetooth stack.
*****************************************************************************/
void sl_bt_on_event(sl_bt_msg_t *evt)
{
sl_status_t sc;
bd_addr address;
uint8_t address_type;
uint8_t system_id[8];
switch (SL_BT_MSG_ID(evt->header)) {
// -------------------------------
// This event indicates the device has started and the radio is ready.
// Do not call any stack command before receiving this boot event!
case sl_bt_evt_system_boot_id:
// Extract unique ID from BT Address.
sc = sl_bt_system_get_identity_address(&address, &address_type);
app_assert_status(sc);
// Pad and reverse unique ID to get System ID.
system_id[0] = address.addr[5];
system_id[1] = address.addr[4];
system_id[2] = address.addr[3];
system_id[3] = 0xFF;
system_id[4] = 0xFE;
system_id[5] = address.addr[2];
system_id[6] = address.addr[1];
system_id[7] = address.addr[0];
sc = sl_bt_gatt_server_write_attribute_value(gattdb_system_id,
0,
sizeof(system_id),
system_id);
app_assert_status(sc);
// Create an advertising set.
sc = sl_bt_advertiser_create_set(&advertising_set_handle);
app_assert_status(sc);
// Set advertising interval to 100ms.
sc = sl_bt_advertiser_set_timing(
advertising_set_handle,
160, // min. adv. interval (milliseconds * 1.6)
160, // max. adv. interval (milliseconds * 1.6)
0, // adv. duration
0); // max. num. adv. events
app_assert_status(sc);
// Start general advertising and enable connections.
sc = sl_bt_advertiser_start(
advertising_set_handle,
sl_bt_advertiser_general_discoverable,
sl_bt_advertiser_connectable_scannable);
app_assert_status(sc);
break;
// -------------------------------
// This event indicates that a new connection was opened.
case sl_bt_evt_connection_opened_id:
//When sending notifications we need the connection handle. Capture it here
g_lab4Connection = evt->data.evt_connection_opened.connection;
break;
// -------------------------------
// This event indicates that a connection was closed.
case sl_bt_evt_connection_closed_id:
// Restart advertising after client has disconnected.
sc = sl_bt_advertiser_start(
advertising_set_handle,
sl_bt_advertiser_general_discoverable,
sl_bt_advertiser_connectable_scannable);
app_assert_status(sc);
break;
///////////////////////////////////////////////////////////////////////////
// Add additional event handlers here as your application requires! //
///////////////////////////////////////////////////////////////////////////
case sl_bt_evt_gatt_server_user_write_request_id://加入
if (evt->data.evt_gatt_server_user_write_request.characteristic == gattdb_LED) {
// Write user supplied value to LEDs.
if (evt->data.evt_gatt_server_attribute_value.value.data[0]) {
//This is the use of the Simple LED component
sl_led_turn_on(&sl_led_led0);
}
else {
//This is the use of the Simple LED component
sl_led_turn_off(&sl_led_led0);
}
sl_bt_gatt_server_send_user_write_response(
evt->data.evt_gatt_server_user_write_request.connection,
gattdb_LED, SL_STATUS_OK);
}
break;
case sl_bt_evt_system_external_signal_id://加入
/* Process external signals */
if (notifyEnabled) {
if (evt->data.evt_system_external_signal.extsignals == 1) // 1 = BTN0
{
notification_data[0] = (uint8_t)simple_btn0_context.history;
simple_btn0_context.history = 0;
// send number of button presses
sc = sl_bt_gatt_server_send_characteristic_notification(
g_lab4Connection, gattdb_BTN, sizeof(notification_data),
notification_data, ¬ification_len);
}
}
break;
case sl_bt_evt_gatt_server_characteristic_status_id://加入
if ((evt->data.evt_gatt_server_characteristic_status.characteristic == gattdb_BTN)
&& (evt->data.evt_gatt_server_characteristic_status.status_flags == 0x01)) {
if (evt->data.evt_gatt_server_characteristic_status.client_config_flags == 0x00) {
notifyEnabled = false;
}
else {
notifyEnabled = true;
}
}
break;
// -------------------------------
// Default event handler.
default:
break;
}
}
6,编译,下载,运行。
7,打开EFRConnect - v2.4.0,broswer里找到你改的名称的设备连接
8,进入log里面查看,按一下按键可以看到有按键信息。
进入Unknown service 里面查看notify(点击一下),然后去看一下按键,可以看到一个1的数据出来。
9,如果觉得数据老是个1不过瘾 case sl_bt_evt_system_external_signal_id:改一下再编译下载运行,按键后log和notify的数据就从1按下一次数据加1
case sl_bt_evt_system_external_signal_id:
/* Process external signals */
if (notifyEnabled) {
if (evt->data.evt_system_external_signal.extsignals == 1) // 1 = BTN0
{
static uint8_t val=0;
val=val+1;
notification_data[0] =val; //(uint8_t)simple_btn0_context.history;
simple_btn0_context.history = 0;
// send number of button presses
sc = sl_bt_gatt_server_send_characteristic_notification(
g_lab4Connection, gattdb_BTN, sizeof(notification_data),
notification_data, ¬ification_len);
}
}
break;
10,实验完毕,谢谢。
|