blob: 0b9735ba60afd485933605793935835715e8c801 [file] [log] [blame]
/*
* Copyright (c) 2022 ASR Microelectronics (Shanghai) Co., Ltd. All rights reserved.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
****************************************************************************************
*
* @file \app_custom_svc.c
*
* @brief custom service db
*
****************************************************************************************
*/
/*
* INCLUDE FILES
****************************************************************************************
*/
#ifdef __cplusplus
extern "C" {
#endif
#include "app.h"
#include "sonata_att.h"
#include "sonata_gap.h"
#include "sonata_gap_api.h"
#include "sonata_gatt_api.h"
#include <stdio.h>
#ifdef __cplusplus
}
#endif
#include "BLEAppSvc.h"
#include <ble/CHIPBleServiceData.h>
#include <platform/ConfigurationManager.h>
#include <platform/internal/BLEManager.h>
using namespace chip::DeviceLayer;
using namespace chip::DeviceLayer::Internal;
static uint8_t current_connect_id = SONATA_ADDR_NONE;
static uint16_t service_handle = 0;
/*
* MACRO DEFINES
****************************************************************************************
*/
#define APPSVC "APP_SVC"
/*
* ENUM DEFINITIONS
****************************************************************************************
*/
/*
* GLOBAL VARIABLE DECLARATIONS
****************************************************************************************
*/
ble_gatt_att_reg_t matter_csvc_atts[CSVC_IDX_NB] = {
[CSVC_IDX_SVC] = { { { 0xF6, 0xFF, 0 }, 0, 0, 0 }, { 0, 0 } },
// ATT_DECL_CHARACTERISTIC (Write)
[CSVC_IDX_RX_CHAR] = { { { 0X03, 0X28, 0 }, PRD_NA, 0, 0 }, { 0, 0 } },
[CSVC_IDX_RX_VAL] = { { { 0x11, 0x9D, 0x9F, 0x42, 0x9C, 0x4F, 0x9F, 0x95, 0x59, 0x45, 0x3D, 0x26, 0xF5, 0x2E, 0xEE, 0x18 },
PWR_NA,
247,
PRI | SONATA_PERM(UUID_LEN, UUID_128) },
{ matter_rx_char_write_cb, 0 } },
// ATT_DECL_CHARACTERISTIC (Read,Notify)
[CSVC_IDX_TX_CHAR] = { { { 0X03, 0X28, 0 }, PRD_NA, 0, 0 }, { 0, 0 } },
[CSVC_IDX_TX_VAL] = { { { 0x12, 0x9D, 0x9F, 0x42, 0x9C, 0x4F, 0x9F, 0x95, 0x59, 0x45, 0x3D, 0x26, 0xF5, 0x2E, 0xEE, 0x18 },
PRD_NA | PNTF_NA | PIND_NA,
247,
SONATA_PERM(UUID_LEN, UUID_128) },
{ 0, 0 } },
[CSVC_IDX_TX_CFG] = { { { 0X02, 0X29, 0 }, PRD_NA | PWR_NA, 2, PRI }, { matter_tx_CCCD_write_cb, matter_tx_CCCD_read_cb } },
#if CHIP_ENABLE_ADDITIONAL_DATA_ADVERTISING
[CSVC_IDX_C3_CHAR] = { { { 0X03, 0X28, 0 }, PRD_NA, 0, 0 }, { 0, 0 } },
[CSVC_IDX_C3_VAL] = { { { 0x04, 0x8F, 0x21, 0x83, 0x8A, 0x74, 0x7D, 0xB8, 0xF2, 0x45, 0x72, 0x87, 0x38, 0x02, 0x63, 0x64 },
PRD_NA,
512,
PRI | SONATA_PERM(UUID_LEN, UUID_128) },
{ 0, matter_c3_char_read_cb } },
#endif
};
/*
* FUNCTION DEFINITIONS
****************************************************************************************
*/
void matter_ble_stack_open(void)
{
ChipLogProgress(DeviceLayer, "matter_ble_stack_open");
app_ble_stack_start(USER_MATTER_MODULE_ID);
}
void matter_ble_start_adv(bool fast)
{
ble_adv_data_t data;
ble_scan_data_t scan_data;
sonata_gap_directed_adv_create_param_t param = { 0 };
memset(&data, 0, sizeof(ble_adv_data_t));
memset(&scan_data, 0, sizeof(ble_scan_data_t));
BLEMgrImpl().SetAdvertisingData((uint8_t *) &data.ble_advdata, (uint8_t *) &data.ble_advdataLen);
BLEMgrImpl().SetScanRspData((uint8_t *) &scan_data.ble_respdata, (uint8_t *) &scan_data.ble_respdataLen);
param.disc_mode = SONATA_GAP_ADV_MODE_GEN_DISC;
param.prop = SONATA_GAP_ADV_PROP_UNDIR_CONN_MASK;
param.max_tx_pwr = 0xE2;
param.filter_pol = SONATA_ADV_ALLOW_SCAN_ANY_CON_ANY;
param.addr_type = SONATA_GAP_STATIC_ADDR;
param.chnl_map = 0x07;
param.phy = SONATA_GAP_PHY_LE_1MBPS;
if (fast)
{
param.adv_intv_min = CHIP_DEVICE_CONFIG_BLE_FAST_ADVERTISING_INTERVAL_MIN;
param.adv_intv_max = CHIP_DEVICE_CONFIG_BLE_FAST_ADVERTISING_INTERVAL_MAX;
ChipLogProgress(DeviceLayer, "fast advertising");
}
else
{
param.adv_intv_min = CHIP_DEVICE_CONFIG_BLE_SLOW_ADVERTISING_INTERVAL_MIN;
param.adv_intv_max = CHIP_DEVICE_CONFIG_BLE_SLOW_ADVERTISING_INTERVAL_MAX;
ChipLogProgress(DeviceLayer, "slow advertising");
}
app_ble_start_advertising_with_param(APP_MATTER_ADV_IDX, SONATA_GAP_STATIC_ADDR, &param, &data, &scan_data);
}
void matter_ble_stop_adv(void)
{
app_ble_advertising_stop(APP_MATTER_ADV_IDX);
}
void matter_ble_add_service()
{
int ret = 0;
ret = app_ble_gatt_add_svc_helper(&service_handle, sizeof(matter_csvc_atts) / sizeof(ble_gatt_att_reg_t), 1, matter_csvc_atts);
if (ret != 0)
{
ChipLogError(DeviceLayer, "matter_ble_add_service add service failed");
}
else
{
ChipLogProgress(DeviceLayer, "matter_ble_add_service add service service_handle=%d", service_handle);
}
}
void matter_set_connection_id(uint8_t conId)
{
ChipLogProgress(DeviceLayer, "matter_set_connection_id conId=%d", conId);
BLEMgrImpl().AllocConnectionState(conId);
current_connect_id = conId;
}
void matter_close_connection(uint8_t conId)
{
if (current_connect_id != SONATA_ADDR_NONE && conId != current_connect_id)
{
ChipLogError(DeviceLayer, "wrong connection id");
}
sonata_ble_gap_disconnect(conId, 0);
}
uint16_t matter_ble_complete_event_handler(int opt_id, uint8_t status, uint16_t param, uint32_t dwparam)
{
uint16_t ret = MATTER_EVENT_DONE_CONTINUE;
switch (opt_id)
{
case SONATA_GAP_CMP_BLE_ON:
matter_ble_add_service();
BLEMgrImpl().SetStackInit();
break;
case SONATA_GAP_CMP_ADVERTISING_START: // 0x0F06
if (is_matter_activity(param))
{
BLEMgrImpl().SetAdvStartFlag();
}
break;
case SONATA_GAP_CMP_ADVERTISING_STOP:
if (is_matter_activity(param))
{
BLEMgrImpl().SetAdvEndFlag();
}
break;
case SONATA_GATT_CMP_INDICATE:
if (current_connect_id != SONATA_ADDR_NONE)
{
BLEMgrImpl().SendIndicationConfirm(current_connect_id);
ret = MATTER_EVENT_DONE_FINISHED;
}
break;
case APP_BLE_STACK_EVENT_CONNECTION_REPORT:
matter_set_connection_id(param);
break;
case APP_BLE_STACK_EVENT_DISCONNECTED:
if (param == current_connect_id)
{
BLEMgrImpl().ReleaseConnectionState(current_connect_id);
current_connect_id = SONATA_ADDR_NONE;
ret = MATTER_EVENT_DONE_FINISHED;
}
PlatformMgr().ScheduleWork(BLEMgrImpl().DriveBLEState, 0);
break;
case APP_BLE_STACK_EVENT_MTU_CHANGED:
if (param == current_connect_id)
{
BLEMgrImpl().SetConnectionMtu(param, dwparam);
ret = MATTER_EVENT_DONE_FINISHED;
}
break;
default:
break;
}
return ret;
}
void matter_tx_CCCD_write_cb(uint8_t * data, uint16_t size)
{
BLEMgrImpl().HandleTXCharCCCDWrite(current_connect_id, size, data);
}
void matter_rx_char_write_cb(uint8_t * data, uint16_t size)
{
BLEMgrImpl().HandleRXCharWrite(current_connect_id, size, data);
}
void matter_tx_CCCD_read_cb(uint8_t * data, uint16_t * size)
{
BLEMgrImpl().HandleTXCharCCCDRead(current_connect_id, size, data);
}
#if CHIP_ENABLE_ADDITIONAL_DATA_ADVERTISING
void matter_c3_char_read_cb(uint8_t * data, uint16_t * size)
{
BLEMgrImpl().HandleC3CharRead(current_connect_id, size, data);
}
#endif
void matter_tx_char_send_indication(uint8_t conId, uint16_t size, uint8_t * data)
{
ChipLogProgress(DeviceLayer, "matter_tx_char_send_indication conId=%d size=%d data=%p service_handle=%d", conId, size, data,
service_handle);
app_ble_gatt_data_send(conId, service_handle, CSVC_IDX_TX_VAL, size, data);
}
void matter_init_callback(void)
{
ble_matter_event_callback_reg(matter_ble_complete_event_handler);
}