summaryrefslogtreecommitdiff
path: root/src/libs/mynewt-nimble/porting/examples/linux/ble.c
diff options
context:
space:
mode:
authorJF <jf@codingfield.com>2020-04-26 10:25:59 +0200
committerJF <jf@codingfield.com>2020-04-26 10:25:59 +0200
commitbdc10744fb338ae197692713a0b48a7ccc36f566 (patch)
treeaf7a8f2f16ddd2e5483758effec15c7683f6c453 /src/libs/mynewt-nimble/porting/examples/linux/ble.c
parent032fad094c6411ad3ff4321ad61ceed95d7dc4ff (diff)
Add Nimble in libs directory
Diffstat (limited to 'src/libs/mynewt-nimble/porting/examples/linux/ble.c')
-rw-r--r--src/libs/mynewt-nimble/porting/examples/linux/ble.c116
1 files changed, 116 insertions, 0 deletions
diff --git a/src/libs/mynewt-nimble/porting/examples/linux/ble.c b/src/libs/mynewt-nimble/porting/examples/linux/ble.c
new file mode 100644
index 00000000..ea6655f2
--- /dev/null
+++ b/src/libs/mynewt-nimble/porting/examples/linux/ble.c
@@ -0,0 +1,116 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.
+ */
+
+#include <assert.h>
+#include <stdbool.h>
+#include <stdint.h>
+
+#include "nimble/nimble_port.h"
+#include "host/ble_hs.h"
+#include "host/util/util.h"
+#include "services/gap/ble_svc_gap.h"
+
+static const char gap_name[] = "nimble";
+
+static uint8_t own_addr_type;
+
+static void start_advertise(void);
+
+static void
+put_ad(uint8_t ad_type, uint8_t ad_len, const void *ad, uint8_t *buf,
+ uint8_t *len)
+{
+ buf[(*len)++] = ad_len + 1;
+ buf[(*len)++] = ad_type;
+
+ memcpy(&buf[*len], ad, ad_len);
+
+ *len += ad_len;
+}
+
+static void
+update_ad(void)
+{
+ uint8_t ad[BLE_HS_ADV_MAX_SZ];
+ uint8_t ad_len = 0;
+ uint8_t ad_flags = BLE_HS_ADV_F_DISC_GEN | BLE_HS_ADV_F_BREDR_UNSUP;
+
+ put_ad(BLE_HS_ADV_TYPE_FLAGS, 1, &ad_flags, ad, &ad_len);
+ put_ad(BLE_HS_ADV_TYPE_COMP_NAME, sizeof(gap_name), gap_name, ad, &ad_len);
+
+ ble_gap_adv_set_data(ad, ad_len);
+}
+
+static int
+gap_event_cb(struct ble_gap_event *event, void *arg)
+{
+ switch (event->type) {
+ case BLE_GAP_EVENT_CONNECT:
+ if (event->connect.status) {
+ start_advertise();
+ }
+ break;
+
+ case BLE_GAP_EVENT_DISCONNECT:
+ start_advertise();
+ break;
+ }
+
+ return 0;
+}
+
+static void
+start_advertise(void)
+{
+ struct ble_gap_adv_params advp;
+ int rc;
+
+ update_ad();
+
+ memset(&advp, 0, sizeof advp);
+ advp.conn_mode = BLE_GAP_CONN_MODE_UND;
+ advp.disc_mode = BLE_GAP_DISC_MODE_GEN;
+ rc = ble_gap_adv_start(own_addr_type, NULL, BLE_HS_FOREVER,
+ &advp, gap_event_cb, NULL);
+ assert(rc == 0);
+}
+
+static void
+app_ble_sync_cb(void)
+{
+ int rc;
+
+ rc = ble_hs_util_ensure_addr(0);
+ assert(rc == 0);
+
+ rc = ble_hs_id_infer_auto(0, &own_addr_type);
+ assert(rc == 0);
+
+ start_advertise();
+}
+
+void
+nimble_host_task(void *param)
+{
+ ble_hs_cfg.sync_cb = app_ble_sync_cb;
+
+ ble_svc_gap_device_name_set(gap_name);
+
+ nimble_port_run();
+}