Merge branch 'develop' of https://github.com/bluekitchen/btstack into develop

This commit is contained in:
Matthias Ringwald 2016-11-10 16:41:05 +01:00
commit 9d23ffec57
5 changed files with 400 additions and 18 deletions

View File

@ -27,8 +27,8 @@ It has been qualified with the the Bluetooth SIG for GAP, IOP, HFP, HSP, SPP, PA
GATT, SM of the Bluetooth 4.2 LE Central and Peripheral roles (QD ID 25340). GATT, SM of the Bluetooth 4.2 LE Central and Peripheral roles (QD ID 25340).
## Documentation ## Documentation
- [HTML](http://bluekitchen-gmbh.com/btstack) - [HTML](http://bluekitchen-gmbh.com/btstack/develop/)
- [PDF](http://bluekitchen-gmbh.com/btstack.pdf) - [PDF](http://bluekitchen-gmbh.com/btstack_develop.pdf)
## Supported Protocols ## Supported Protocols
* L2CAP * L2CAP
@ -55,24 +55,24 @@ Coming next: HID, HOGP, A2DP, and more.
#### Embedded Platforms: #### Embedded Platforms:
Status | Platform Status | Platform
-------------- | ------ -------------- | ------
![buildstatus](http://buildbot.bluekitchen-gmbh.com/btstack/badge.png?builder=port-ez430-rf2560-develop) | [EZ430-RF256x Bluetooth Evaluation Tool for MSP430](http://www.ti.com/tool/ez430-rf256x) [<img src="http://buildbot.bluekitchen-gmbh.com/btstack/badge.png?builder=port-ez430-rf2560-develop">](https://buildbot.bluekitchen-gmbh.com/btstack/builders/port-ez430-rf2560-develop) | [EZ430-RF256x Bluetooth Evaluation Tool for MSP430](http://www.ti.com/tool/ez430-rf256x)
![buildstatus](http://buildbot.bluekitchen-gmbh.com/btstack/badge.png?builder=port-msp-exp430f5438-cc2564b-develop) | [MSP430F5438 Experimenter Board for MSP430](http://www.ti.com/tool/msp-exp430f5438) with [Bluetooth CC2564 Module Evaluation Board](http://www.ti.com/tool/cc2564modnem) [<img src="http://buildbot.bluekitchen-gmbh.com/btstack/badge.png?builder=port-msp-exp430f5438-cc2564b-develop">](https://buildbot.bluekitchen-gmbh.com/btstack/builders/port-msp-exp430f5438-cc2564b-develop) | [MSP430F5438 Experimenter Board for MSP430](http://www.ti.com/tool/msp-exp430f5438) with [Bluetooth CC2564 Module Evaluation Board](http://www.ti.com/tool/cc2564modnem)
![buildstatus](http://buildbot.bluekitchen-gmbh.com/btstack/badge.png?builder=port-msp430f5229lp-cc2564b-develop) | [MSP-EXP430F5529LP LaunchPad](http://www.ti.com/ww/en/launchpad/launchpads-msp430-msp-exp430f5529lp.html#tabs) with [Bluetooth CC2564 Module Evaluation Board](http://www.ti.com/tool/cc2564modnem) and [EM Adapter BoosterPack](http://www.ti.com/tool/boost-ccemadapter) with additional 32768Hz quartz oscillator [<img src="http://buildbot.bluekitchen-gmbh.com/btstack/badge.png?builder=port-msp430f5229lp-cc2564b-develop">](https://buildbot.bluekitchen-gmbh.com/btstack/builders/port-msp430f5229lp-cc2564b-develop) | [MSP-EXP430F5529LP LaunchPad](http://www.ti.com/ww/en/launchpad/launchpads-msp430-msp-exp430f5529lp.html#tabs) with [Bluetooth CC2564 Module Evaluation Board](http://www.ti.com/tool/cc2564modnem) and [EM Adapter BoosterPack](http://www.ti.com/tool/boost-ccemadapter) with additional 32768Hz quartz oscillator
![buildstatus](http://buildbot.bluekitchen-gmbh.com/btstack/badge.png?builder=port-stm32-f103rb-nucleo-develop) | [STM32 Nucleo development board NUCLEO-F103RB](http://www.st.com/web/catalog/tools/FM116/SC959/SS1532/LN1847/PF259875) with [Bluetooth CC2564 Module Evaluation Board](http://www.ti.com/tool/cc2564modnem) and [EM Adapter BoosterPack](http://www.ti.com/tool/boost-ccemadapter) with additional 32768Hz quartz oscillator [<img src="http://buildbot.bluekitchen-gmbh.com/btstack/badge.png?builder=port-stm32-f103rb-nucleo-develop">](https://buildbot.bluekitchen-gmbh.com/btstack/builders/port-stm32-f103rb-nucleo-develop) | [STM32 Nucleo development board NUCLEO-F103RB](http://www.st.com/web/catalog/tools/FM116/SC959/SS1532/LN1847/PF259875) with [Bluetooth CC2564 Module Evaluation Board](http://www.ti.com/tool/cc2564modnem) and [EM Adapter BoosterPack](http://www.ti.com/tool/boost-ccemadapter) with additional 32768Hz quartz oscillator
![buildstatus](http://buildbot.bluekitchen-gmbh.com/btstack/badge.png?builder=port-pic32-harmony-develop) | [Microchip's PIC32 Bluetooth Audio Development Kit](http://www.microchip.com/Developmenttools/ProductDetails.aspx?PartNO=DV320032) [<img src="http://buildbot.bluekitchen-gmbh.com/btstack/badge.png?builder=port-pic32-harmony-develop">](https://buildbot.bluekitchen-gmbh.com/btstack/builders/port-pic32-harmony-develop) | [Microchip's PIC32 Bluetooth Audio Development Kit](http://www.microchip.com/Developmenttools/ProductDetails.aspx?PartNO=DV320032)
![buildstatus](http://buildbot.bluekitchen-gmbh.com/btstack/badge.png?builder=port-wiced-develop) | [RedBear Duo](https://github.com/redbear/WICED-SDK) with Broadcom BCM43438 A1 [<img src="http://buildbot.bluekitchen-gmbh.com/btstack/badge.png?builder=port-wiced-develop">](https://buildbot.bluekitchen-gmbh.com/btstack/builders/port-wiced-develop) | [RedBear Duo](https://github.com/redbear/WICED-SDK) with Broadcom BCM43438 A1
#### Other Platforms: #### Other Platforms:
Status | Platform Status | Platform
-------------- | ------ -------------- | ------
![buildstatus](http://buildbot.bluekitchen-gmbh.com/btstack/badge.png?builder=port-posix-h4-develop)| posix: Unix-based system talking to Bluetooth module via serial port [<img src="http://buildbot.bluekitchen-gmbh.com/btstack/badge.png?builder=port-posix-h4-develop">](https://buildbot.bluekitchen-gmbh.com/btstack/builders/port-posix-h4-develop) | posix: Unix-based system talking to Bluetooth module via serial port
![buildstatus](http://buildbot.bluekitchen-gmbh.com/btstack/badge.png?builder=port-libusb-develop)| libusb: Unix-based system talking via USB Bluetooth dongle [<img src="http://buildbot.bluekitchen-gmbh.com/btstack/badge.png?builder=port-libusb-develop">](https://buildbot.bluekitchen-gmbh.com/btstack/builders/port-libusb-develop) | libusb: Unix-based system talking via USB Bluetooth dongle
![buildstatus](http://buildbot.bluekitchen-gmbh.com/btstack/badge.png?builder=port-daemon-develop)| daemon: TCP and Unix domain named socket client-server architecture supporting multiple clients [<img src="http://buildbot.bluekitchen-gmbh.com/btstack/badge.png?builder=port-daemon-develop">](https://buildbot.bluekitchen-gmbh.com/btstack/builders/port-daemon-develop) | daemon: TCP and Unix domain named socket client-server architecture supporting multiple clients
![buildstatus](http://buildbot.bluekitchen-gmbh.com/btstack/badge.png?builder=java-develop)| java: Java wrapper for daemon [<img src="http://buildbot.bluekitchen-gmbh.com/btstack/badge.png?builder=java-develop">](https://buildbot.bluekitchen-gmbh.com/btstack/builders/java-develop) | java: Java wrapper for daemon
![buildstatus](http://buildbot.bluekitchen-gmbh.com/btstack/badge.png?builder=port-ios-develop)| iOS: daemon for iOS jailbreak devices, C client-server API [<img src="http://buildbot.bluekitchen-gmbh.com/btstack/badge.png?builder=port-ios-develop">](https://buildbot.bluekitchen-gmbh.com/btstack/builders/port-ios-develop) | iOS: daemon for iOS jailbreak devices, C client-server API
![buildstatus](http://buildbot.bluekitchen-gmbh.com/btstack/badge.png?builder=port-mtk-develop)| mtk: daemon for rooted Android devices, based on Mediatek MT65xx processor, Java and C client-server API [<img src="http://buildbot.bluekitchen-gmbh.com/btstack/badge.png?builder=port-mtk-develop">](https://buildbot.bluekitchen-gmbh.com/btstack/builders/port-mtk-develop) | mtk: daemon for rooted Android devices, based on Mediatek MT65xx processor, Java and C client-server API
![buildstatus](http://buildbot.bluekitchen-gmbh.com/btstack/badge.png?builder=port-wiced-develop) | wiced: Broadcom platforms that support the WICED SDK [<img src="http://buildbot.bluekitchen-gmbh.com/btstack/badge.png?builder=port-wiced-develop">](https://buildbot.bluekitchen-gmbh.com/btstack/builders/port-wiced-develop) | wiced: Broadcom platforms that support the WICED SDK
## Supported Chipsets ## Supported Chipsets
Chipsets | Status Chipsets | Status

View File

@ -0,0 +1,14 @@
// Specification Type org.bluetooth.service.device_information
// https://www.bluetooth.com/api/gatt/xmlfile?xmlFileName=org.bluetooth.service.device_information.xml
// Device Information 180A
PRIMARY_SERVICE, ORG_BLUETOOTH_SERVICE_DEVICE_INFORMATION
CHARACTERISTIC, ORG_BLUETOOTH_CHARACTERISTIC_MANUFACTURER_NAME_STRING, DYNAMIC | READ,
CHARACTERISTIC, ORG_BLUETOOTH_CHARACTERISTIC_MODEL_NUMBER_STRING, DYNAMIC | READ,
CHARACTERISTIC, ORG_BLUETOOTH_CHARACTERISTIC_SERIAL_NUMBER_STRING, DYNAMIC | READ,
CHARACTERISTIC, ORG_BLUETOOTH_CHARACTERISTIC_HARDWARE_REVISION_STRING, DYNAMIC | READ,
CHARACTERISTIC, ORG_BLUETOOTH_CHARACTERISTIC_FIRMWARE_REVISION_STRING, DYNAMIC | READ,
CHARACTERISTIC, ORG_BLUETOOTH_CHARACTERISTIC_SOFTWARE_REVISION_STRING, DYNAMIC | READ,
CHARACTERISTIC, ORG_BLUETOOTH_CHARACTERISTIC_SYSTEM_ID, DYNAMIC | READ,
CHARACTERISTIC, ORG_BLUETOOTH_CHARACTERISTIC_IEEE_11073_20601_REGULATORY_CERTIFICATION_DATA_LIST, DYNAMIC | READ,
CHARACTERISTIC, ORG_BLUETOOTH_CHARACTERISTIC_PNP_ID, DYNAMIC | READ,

View File

@ -0,0 +1,227 @@
/*
* Copyright (C) 2014 BlueKitchen GmbH
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
* 4. Any redistribution, use, or modification is done solely for
* personal benefit and not for any commercial purpose or for
* monetary gain.
*
* THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MATTHIAS
* RINGWALD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
* THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* Please inquire about commercial licensing options at
* contact@bluekitchen-gmbh.com
*
*/
/**
* Implementation of the Device Information Service Server
*
* To use with your application, add '#import <device_information_sevice.gatt' to your .gatt file
* and call all functions below. All strings and blobs need to stay valid after calling the functions.
*
* @note: instead of calling all setters, you can create a local copy of the .gatt file and remove
* all Characteristics that are not relevant for your application.
*/
#include "btstack_defines.h"
#include "ble/att_db.h"
#include "ble/att_server.h"
#include "btstack_util.h"
#include "bluetooth_gatt.h"
#include "ble/gatt-service/device_information_service_server.h"
typedef enum {
MANUFACTURER_NAME = 0,
MODEL_NUMBER,
SERIAL_NUMBER,
HARDWARE_REVISION,
FIRMWARE_REVISION,
SOFTWARE_REVISION,
SYSTEM_ID,
IEEE_REGULATORY_CERTIFICATION,
PNP_ID,
NUM_INFORMATION_FIELDS
} device_information_field_id_t;
typedef struct {
uint8_t * data;
uint16_t len;
uint16_t value_handle;
} device_information_field_t;
const uint16_t device_information_characteristic_uuids[] = {
ORG_BLUETOOTH_CHARACTERISTIC_MANUFACTURER_NAME_STRING,
ORG_BLUETOOTH_CHARACTERISTIC_MODEL_NUMBER_STRING,
ORG_BLUETOOTH_CHARACTERISTIC_SERIAL_NUMBER_STRING,
ORG_BLUETOOTH_CHARACTERISTIC_HARDWARE_REVISION_STRING,
ORG_BLUETOOTH_CHARACTERISTIC_FIRMWARE_REVISION_STRING,
ORG_BLUETOOTH_CHARACTERISTIC_SOFTWARE_REVISION_STRING,
ORG_BLUETOOTH_CHARACTERISTIC_SYSTEM_ID,
ORG_BLUETOOTH_CHARACTERISTIC_IEEE_11073_20601_REGULATORY_CERTIFICATION_DATA_LIST,
ORG_BLUETOOTH_CHARACTERISTIC_PNP_ID
};
static device_information_field_t device_information_fields[NUM_INFORMATION_FIELDS];
static uint8_t device_information_system_id[8];
static uint8_t device_information_ieee_regulatory_certification[4];
static uint8_t device_information_pnp_id[7];
static att_service_handler_t device_information_service;
static void set_string(device_information_field_id_t field_id, const char * text){
device_information_fields[field_id].data = (uint8_t*) text;
device_information_fields[field_id].len = strlen(text);
}
static uint16_t device_information_service_read_callback(hci_con_handle_t con_handle, uint16_t attribute_handle, uint16_t offset, uint8_t * buffer, uint16_t buffer_size){
int i;
for (i=0;i<NUM_INFORMATION_FIELDS;i++){
if (device_information_fields[i].value_handle != attribute_handle) continue;
if (buffer == 0){
return device_information_fields[i].len;
}
int bytes_to_copy = btstack_min(device_information_fields[i].len - offset, buffer_size);
memcpy(buffer, &device_information_fields[i].data[offset], bytes_to_copy);
return bytes_to_copy;
}
return 0;
}
void device_information_service_server_init(void){
// get service handle range
uint16_t start_handle;
uint16_t end_handle;
int service_found = gatt_server_get_get_handle_range_for_service_with_uuid16(ORG_BLUETOOTH_SERVICE_DEVICE_INFORMATION, &start_handle, &end_handle);
if (!service_found) return;
// get characteristic value handles
int i;
for (i=0;i<NUM_INFORMATION_FIELDS;i++){
device_information_fields[i].value_handle = gatt_server_get_value_handle_for_characteristic_with_uuid16(start_handle, end_handle, device_information_characteristic_uuids[i]);
}
// register service with ATT DB
device_information_service.start_handle = start_handle;
device_information_service.end_handle = end_handle;
device_information_service.read_callback = &device_information_service_read_callback;
device_information_service.write_callback = NULL;
att_register_service_handler(&device_information_service);
}
/**
* @brief Set Manufacturer Name
* @param manufacturer_name
*/
void device_information_service_server_set_manufacturer_name(const char * manufacturer_name){
set_string(MANUFACTURER_NAME, manufacturer_name);
}
/**
* @brief Set Model Number
* @param model_number
*/
void device_information_service_server_set_model_number(const char * model_number){
set_string(MODEL_NUMBER, model_number);
}
/**
* @brief Set Serial Number
* @param serial_number
*/
void device_information_service_server_set_serial_number(const char * serial_number){
set_string(SERIAL_NUMBER, serial_number);
}
/**
* @brief Set Hardware Revision
* @param hardware_revision
*/
void device_information_service_server_set_hardware_revision(const char * hardware_revision){
set_string(HARDWARE_REVISION, hardware_revision);
}
/**
* @brief Set Firmware Revision
* @param firmware_revision
*/
void device_information_service_server_set_firmware_revision(const char * firmware_revision){
set_string(FIRMWARE_REVISION, firmware_revision);
}
/**
* @brief Set Software Revision
* @param software_revision
*/
void device_information_service_server_set_software_revision(const char * software_revision){
set_string(SOFTWARE_REVISION, software_revision);
}
/**
* @brief Set System ID
* @param manufacturer_identifier uint40
* @param organizationally_unique_identifier uint24
*/
void device_information_service_server_set_system_id(uint64_t manufacturer_identifier, uint32_t organizationally_unique_identifier){
device_information_fields[SYSTEM_ID].data = device_information_system_id;
device_information_fields[SYSTEM_ID].len = 8;
little_endian_store_32(device_information_system_id, 0, manufacturer_identifier);
device_information_system_id[4] = manufacturer_identifier >> 32;
little_endian_store_16(device_information_system_id, 5, organizationally_unique_identifier);
device_information_system_id[7] = organizationally_unique_identifier >> 16;
}
/**
* @brief Set IEEE 11073-20601 regulatory certification data list
* @note: format duint16. duint16 is two uint16 values concatenated together.
* @param ieee_regulatory_certification
*/
void device_information_service_server_set_ieee_regulatory_certification(uint16_t value_a, uint16_t value_b){
device_information_fields[IEEE_REGULATORY_CERTIFICATION].data = device_information_ieee_regulatory_certification;
device_information_fields[IEEE_REGULATORY_CERTIFICATION].len = 4;
little_endian_store_16(device_information_ieee_regulatory_certification, 0, value_a);
little_endian_store_16(device_information_ieee_regulatory_certification, 2, value_b);
}
/**
* @brief Set PNP ID
* @param vendor_source_id
* @param vendor_id
* @param product_id
*/
void device_information_service_server_set_pnp_id(uint8_t vendor_source_id, uint16_t vendor_id, uint16_t product_id, uint16_t product_version){
device_information_fields[PNP_ID].data = device_information_pnp_id;
device_information_fields[PNP_ID].len = 7;
device_information_pnp_id[0] = vendor_source_id;
little_endian_store_16(device_information_pnp_id, 1, vendor_source_id);
little_endian_store_16(device_information_pnp_id, 3, vendor_id);
little_endian_store_16(device_information_pnp_id, 5, product_id);
}

View File

@ -0,0 +1,130 @@
/*
* Copyright (C) 2014 BlueKitchen GmbH
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
* 4. Any redistribution, use, or modification is done solely for
* personal benefit and not for any commercial purpose or for
* monetary gain.
*
* THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MATTHIAS
* RINGWALD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
* THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* Please inquire about commercial licensing options at
* contact@bluekitchen-gmbh.com
*
*/
#ifndef __DEVICE_INFORMATION_SERVICE_SERVER_H
#define __DEVICE_INFORMATION_SERVICE_SERVER_H
#include <stdint.h>
#if defined __cplusplus
extern "C" {
#endif
/* API_START */
/**
* Implementation of the Device Information Service Server
*
* To use with your application, add '#import <device_information_sevice.gatt' to your .gatt file
* and call all functions below. All strings and blobs need to stay valid after calling the functions.
*
* @note: instead of calling all setters, you can create a local copy of the .gatt file and remove
* all Characteristics that are not relevant for your application and define all fixed values in the .gatt file
*/
/**
* @brief Init Device Information Service Server with ATT DB
* @param battery_value in range 0-100
*/
void device_information_service_server_init(void);
/**
* @brief Set Manufacturer Name
* @param manufacturer_name
*/
void device_information_service_server_set_manufacturer_name(const char * manufacturer_name);
/**
* @brief Set Model Number
* @param model_number
*/
void device_information_service_server_set_model_number(const char * model_number);
/**
* @brief Set Serial Number
* @param serial_number
*/
void device_information_service_server_set_serial_number(const char * serial_number);
/**
* @brief Set Hardware Revision
* @param hardware_revision
*/
void device_information_service_server_set_hardware_revision(const char * hardware_revision);
/**
* @brief Set Firmware Revision
* @param firmware_revision
*/
void device_information_service_server_set_firmware_revision(const char * firmware_revision);
/**
* @brief Set Software Revision
* @param software_revision
*/
void device_information_service_server_set_software_revision(const char * software_revision);
/**
* @brief Set System ID
* @param manufacturer_identifier uint40
* @param organizationally_unique_identifier uint24
*/
void device_information_service_server_set_system_id(uint64_t manufacturer_identifier, uint32_t organizationally_unique_identifier);
/**
* @brief Set IEEE 11073-20601 regulatory certification data list
* @note: format duint16. duint16 is two uint16 values concatenated together.
* @param value_a
* @param value_b
*/
void device_information_service_server_set_ieee_regulatory_certification(uint16_t value_a, uint16_t value_b);
/**
* @brief Set Software Revision
* @param vendor_source_id
* @param vendor_id
* @param product_id
*/
void device_information_service_server_set_pnp_id(uint8_t vendor_source_id, uint16_t vendor_id, uint16_t product_id, uint16_t product_version);
/* API_END */
#if defined __cplusplus
}
#endif
#endif

View File

@ -111,6 +111,12 @@ java_event_getter_data = \
System.arraycopy(data, {1}, result, 0, len); System.arraycopy(data, {1}, result, 0, len);
return result;''' return result;'''
java_event_getter_data_fixed = \
'''int len = {0};
byte[] result = new byte[len];
System.arraycopy(data, {1}, result, 0, len);
return result;'''
java_event_getter_remaining_data = \ java_event_getter_remaining_data = \
'''int len = getPayloadLen() - {0}; '''int len = getPayloadLen() - {0};
byte[] result = new byte[len]; byte[] result = new byte[len];
@ -140,7 +146,7 @@ defines_used = set()
def java_type_for_btstack_type(type): def java_type_for_btstack_type(type):
param_types = { '1' : 'int', '2' : 'int', '3' : 'int', '4' : 'long', 'H' : 'int', 'B' : 'BD_ADDR', param_types = { '1' : 'int', '2' : 'int', '3' : 'int', '4' : 'long', 'H' : 'int', 'B' : 'BD_ADDR',
'D' : 'byte []', 'E' : 'byte [] ', 'N' : 'String' , 'P' : 'byte []', 'A' : 'byte []', 'D' : 'byte []', 'E' : 'byte [] ', 'N' : 'String' , 'P' : 'byte []', 'A' : 'byte []',
'R' : 'byte []', 'S' : 'byte []', 'R' : 'byte []', 'S' : 'byte []', 'Q' : 'byte []',
'J' : 'int', 'L' : 'int', 'V' : 'byte []', 'U' : 'BT_UUID', 'J' : 'int', 'L' : 'int', 'V' : 'byte []', 'U' : 'BT_UUID',
'X' : 'GATTService', 'Y' : 'GATTCharacteristic', 'Z' : 'GATTCharacteristicDescriptor', 'X' : 'GATTService', 'Y' : 'GATTCharacteristic', 'Z' : 'GATTCharacteristicDescriptor',
'T' : 'String'} 'T' : 'String'}
@ -148,7 +154,7 @@ def java_type_for_btstack_type(type):
def size_for_type(type): def size_for_type(type):
param_sizes = { '1' : 1, '2' : 2, '3' : 3, '4' : 4, 'H' : 2, 'B' : 6, 'D' : 8, 'E' : 240, 'N' : 248, 'P' : 16, param_sizes = { '1' : 1, '2' : 2, '3' : 3, '4' : 4, 'H' : 2, 'B' : 6, 'D' : 8, 'E' : 240, 'N' : 248, 'P' : 16,
'A' : 31, 'S' : -1, 'V': -1, 'J' : 1, 'L' : 2, 'U' : 16, 'X' : 20, 'Y' : 24, 'Z' : 18, 'T':-1} 'A' : 31, 'S' : -1, 'V': -1, 'J' : 1, 'L' : 2, 'Q' : 32, 'U' : 16, 'X' : 20, 'Y' : 24, 'Z' : 18, 'T':-1}
return param_sizes[type] return param_sizes[type]
def create_command_java(fout, name, ogf, ocf, format, params): def create_command_java(fout, name, ogf, ocf, format, params):
@ -166,6 +172,7 @@ def create_command_java(fout, name, ogf, ocf, format, params):
'D' : 'Util.storeBytes(command, offset, %s, 8);', 'D' : 'Util.storeBytes(command, offset, %s, 8);',
'E' : 'Util.storeBytes(command, offset, %s, 240);', 'E' : 'Util.storeBytes(command, offset, %s, 240);',
'P' : 'Util.storeBytes(command, offset, %s, 16);', 'P' : 'Util.storeBytes(command, offset, %s, 16);',
'Q' : 'Util.storeBytes(command, offset, %s, 32);',
'A' : 'Util.storeBytes(command, offset, %s, 31);', 'A' : 'Util.storeBytes(command, offset, %s, 31);',
'S' : 'Util.storeBytes(command, offset, %s);', 'S' : 'Util.storeBytes(command, offset, %s);',
'B' : 'Util.storeBytes(command, offset, %s.getBytes());', 'B' : 'Util.storeBytes(command, offset, %s.getBytes());',
@ -278,7 +285,8 @@ def create_event(event_name, format, args):
'Z' : 'return Util.readGattCharacteristicDescriptor(data, %u);', 'Z' : 'return Util.readGattCharacteristicDescriptor(data, %u);',
'T' : 'int offset = %u; \n return Util.getText(data, offset, getPayloadLen()-offset);', 'T' : 'int offset = %u; \n return Util.getText(data, offset, getPayloadLen()-offset);',
'N' : 'return Util.getText(data, %u, 248);', 'N' : 'return Util.getText(data, %u, 248);',
# 'D' : 'Util.storeBytes(data, %u, 8);', 'D' : 'Util.storeBytes(data, %u, 8);',
'Q' : 'Util.storeBytes(data, %u, 32);',
# 'E' : 'Util.storeBytes(data, %u, 240);', # 'E' : 'Util.storeBytes(data, %u, 240);',
# 'P' : 'Util.storeBytes(data, %u, 16);', # 'P' : 'Util.storeBytes(data, %u, 16);',
# 'A' : 'Util.storeBytes(data, %u, 31);', # 'A' : 'Util.storeBytes(data, %u, 31);',
@ -302,6 +310,9 @@ def create_event(event_name, format, args):
elif f == 'V': elif f == 'V':
access = java_event_getter_data.format(length_name, offset) access = java_event_getter_data.format(length_name, offset)
size = 0 size = 0
elif f in ['D', 'Q']:
size = size_for_type(f)
access = java_event_getter_data_fixed.format(size, offset)
else: else:
access = param_read[f] % offset access = param_read[f] % offset
size = size_for_type(f) size = size_for_type(f)