#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
#include <string.h>
#include <inttypes.h>
#define MAX_BLE_PKT_SIZE 37
#define SET_NUM_BTLE_EP 10
#define DATA_EP 1
#define EXECUTION_TIME_US 100
static uint8_t m_btle_forwarded;
#define BLE_SCAN_QUEUE_SIZE 8
typedef struct {
uint8_t btle_data[MAX_BLE_PKT_SIZE];
uint8_t btle_length;
uint8_t btle_type;
uint8_t btle_rssi;
} ble_data_t;
ble_data_t m_ble_data[BLE_SCAN_QUEUE_SIZE];
static uint8_t m_num_ble;
#define NODE_ROLE \
app_lib_settings_create_role(APP_LIB_SETTINGS_ROLE_HEADNODE, APP_LIB_SETTINGS_ROLE_FLAG_LL)
#define BEACON_RX_CHAN APP_LIB_BEACON_RX_CHANNEL_ALL
const uint8_t EDDYSTONE_OFFSET = 0x9;
const uint8_t EDDYSTONE_LEN = 0x3;
const uint8_t EDDYSTONE_TYPE = 0x3;
const uint8_t EDDYSTONE_UUID[] = {0xAA, 0xFE};
static void send_data(ble_data_t * beacon)
{
data_to_send.
bytes = (
const uint8_t *)(beacon->btle_data);
data_to_send.
num_bytes = beacon->btle_length;
lib_data->sendData(&data_to_send);
}
static uint32_t process_ble_beacon(void)
{
ble_data_t * beacon = NULL;
size_t routeToSink = 0;
lib_state->getRouteCount(&routeToSink);
if (routeToSink)
{
do
{
lib_system->enterCriticalSection();
lib_system->exitCriticalSection();
if (beacon != NULL)
{
send_data(beacon);
beacon->btle_length = 0;
m_btle_forwarded++;
}
} while ((beacon != NULL) && (m_btle_forwarded < m_num_ble));
}
if (m_btle_forwarded >= m_num_ble)
{
lib_beacon_rx->stopScanner();
}
}
{
uint16_t offset = EDDYSTONE_OFFSET;
ble_data_t * data = NULL;
if ((packet->
payload[offset++] == EDDYSTONE_LEN ) &&
(packet->
payload[offset++] == EDDYSTONE_TYPE) &&
(packet->
payload[offset++] == EDDYSTONE_UUID[0]) &&
(packet->
payload[offset] == EDDYSTONE_UUID[1]))
{
for (uint8_t idx=0; idx<BLE_SCAN_QUEUE_SIZE; idx++)
{
if (m_ble_data[idx].btle_length == 0)
{
data = &m_ble_data[idx];
break;
}
}
if (data == NULL)
{
}
if (data == NULL)
{
return;
}
data->btle_length = packet->
length;
data->btle_type = packet->
type;
data->btle_rssi = packet->
rssi;
memcpy(data->btle_data,
data->btle_length);
lib_system->setPeriodicCb(process_ble_beacon,
0,
EXECUTION_TIME_US);
}
else
{
}
}
{
bool btle_started = lib_beacon_rx->isScannerStarted();
{
}
m_num_ble = data->
bytes[0];
m_btle_forwarded = 0;
if ((!btle_started)&&(m_num_ble>0))
{
for (uint8_t idx=0; idx<BLE_SCAN_QUEUE_SIZE; idx++)
{
m_ble_data[idx].btle_length = 0;
}
lib_beacon_rx->startScanner(BEACON_RX_CHAN);
}
}
{
{
return;
}
lib_settings->setNodeRole(NODE_ROLE);
lib_beacon_rx->setBeaconReceivedCb(BLEdataReceivedCb);
lib_data->setDataReceivedCb(dataReceivedCb);
lib_state->startStack();
}