From bdc10744fb338ae197692713a0b48a7ccc36f566 Mon Sep 17 00:00:00 2001 From: JF Date: Sun, 26 Apr 2020 10:25:59 +0200 Subject: Add Nimble in libs directory --- src/libs/mynewt-nimble/apps/advertiser/pkg.yml | 33 ++++++ src/libs/mynewt-nimble/apps/advertiser/src/main.c | 136 ++++++++++++++++++++++ 2 files changed, 169 insertions(+) create mode 100644 src/libs/mynewt-nimble/apps/advertiser/pkg.yml create mode 100644 src/libs/mynewt-nimble/apps/advertiser/src/main.c (limited to 'src/libs/mynewt-nimble/apps/advertiser') diff --git a/src/libs/mynewt-nimble/apps/advertiser/pkg.yml b/src/libs/mynewt-nimble/apps/advertiser/pkg.yml new file mode 100644 index 00000000..662e282e --- /dev/null +++ b/src/libs/mynewt-nimble/apps/advertiser/pkg.yml @@ -0,0 +1,33 @@ +# +# 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. +# + +pkg.name: "apps/advertiser" +pkg.type: app +pkg.description: "Basic advertiser application" +pkg.author: "Krzysztof Kopyściński " + +pkg.deps: + - "@apache-mynewt-core/kernel/os" + - "@apache-mynewt-core/sys/console/full" + - "@apache-mynewt-core/sys/log/full" + - "@apache-mynewt-core/sys/stats/full" + - "@apache-mynewt-core/sys/log/modlog" + - "@apache-mynewt-nimble/nimble/host/util" + - "@apache-mynewt-nimble/nimble/host/services/gap" + - "@apache-mynewt-nimble/nimble/transport" diff --git a/src/libs/mynewt-nimble/apps/advertiser/src/main.c b/src/libs/mynewt-nimble/apps/advertiser/src/main.c new file mode 100644 index 00000000..486d5c59 --- /dev/null +++ b/src/libs/mynewt-nimble/apps/advertiser/src/main.c @@ -0,0 +1,136 @@ +/* + * 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 +#include +#include +#include + +#include "os/os.h" +#include "sysinit/sysinit.h" +#include "log/log.h" +#include "host/ble_hs.h" +#include "host/util/util.h" +#include "services/gap/ble_svc_gap.h" + +static const char *device_name = "Apache Mynewt"; + +/* adv_event() calls advertise(), so forward declaration is required */ +static void advertise(void); + +static void +set_ble_addr(void) +{ + int rc; + ble_addr_t addr; + + /* generate new non-resolvable private address */ + rc = ble_hs_id_gen_rnd(1, &addr); + assert(rc == 0); + + /* set generated address */ + rc = ble_hs_id_set_rnd(addr.val); + assert(rc == 0); +} + +static int +adv_event(struct ble_gap_event *event, void *arg) +{ + switch (event->type) { + case BLE_GAP_EVENT_ADV_COMPLETE: + MODLOG_DFLT(INFO, "Advertising completed, termination code: %d\n", + event->adv_complete.reason); + advertise(); + return 0; + default: + MODLOG_DFLT(ERROR, "Advertising event not handled\n"); + return 0; + } +} + +static void +advertise(void) +{ + int rc; + struct ble_gap_adv_params adv_params; + struct ble_hs_adv_fields fields; + + /* set adv parameters */ + memset(&adv_params, 0, sizeof(adv_params)); + adv_params.conn_mode = BLE_GAP_CONN_MODE_NON; + adv_params.disc_mode = BLE_GAP_DISC_MODE_GEN; + + memset(&fields, 0, sizeof(fields)); + + /* Fill the fields with advertising data - flags, tx power level, name */ + fields.flags = BLE_HS_ADV_F_DISC_GEN; + fields.tx_pwr_lvl_is_present = 1; + fields.tx_pwr_lvl = BLE_HS_ADV_TX_PWR_LVL_AUTO; + fields.name = (uint8_t *)device_name; + fields.name_len = strlen(device_name); + fields.name_is_complete = 1; + + rc = ble_gap_adv_set_fields(&fields); + assert(rc == 0); + + MODLOG_DFLT(INFO, "Starting advertising...\n"); + + /* As own address type we use hard-coded value, because we generate + NRPA and by definition it's random */ + rc = ble_gap_adv_start(BLE_OWN_ADDR_RANDOM, NULL, 10000, + &adv_params, adv_event, NULL); + assert(rc == 0); +} + +static void +on_sync(void) +{ + set_ble_addr(); + + /* begin advertising */ + advertise(); +} + +static void +on_reset(int reason) +{ + MODLOG_DFLT(INFO, "Resetting state; reason=%d\n", reason); +} + +int +main(int argc, char **argv) +{ + int rc; + + /* Initialize all packages. */ + sysinit(); + + ble_hs_cfg.sync_cb = on_sync; + ble_hs_cfg.reset_cb = on_reset; + + rc = ble_svc_gap_device_name_set(device_name); + assert(rc == 0); + + /* As the last thing, process events from default event queue. */ + while (1) { + os_eventq_run(os_eventq_dflt_get()); + } + + return 0; +} -- cgit v1.2.3