Repository: incubator-mynewt-core Updated Branches: refs/heads/develop 0de126ab9 -> 88e3cb60e
updated lls location to host and new api Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/commit/b26285f2 Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/b26285f2 Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/b26285f2 Branch: refs/heads/develop Commit: b26285f212e627d5e72cc95dcc8df0e7c2545d5a Parents: d21530d Author: Brian Giori <[email protected]> Authored: Wed Jul 27 16:22:25 2016 -0700 Committer: Brian Giori <[email protected]> Committed: Wed Jul 27 16:28:18 2016 -0700 ---------------------------------------------------------------------- .../lls/include/profiles/lls/ble_svc_lls.h | 44 +++++ net/nimble/host/profiles/lls/pkg.yml | 31 +++ net/nimble/host/profiles/lls/src/ble_svc_lls.c | 187 +++++++++++++++++++ .../profiles/include/profiles/ble_svc_lls.h | 45 ----- net/nimble/profiles/pkg.yml | 31 --- net/nimble/profiles/src/ble_svc_lls.c | 166 ---------------- 6 files changed, 262 insertions(+), 242 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/b26285f2/net/nimble/host/profiles/lls/include/profiles/lls/ble_svc_lls.h ---------------------------------------------------------------------- diff --git a/net/nimble/host/profiles/lls/include/profiles/lls/ble_svc_lls.h b/net/nimble/host/profiles/lls/include/profiles/lls/ble_svc_lls.h new file mode 100644 index 0000000..964f8b5 --- /dev/null +++ b/net/nimble/host/profiles/lls/include/profiles/lls/ble_svc_lls.h @@ -0,0 +1,44 @@ +/** + * 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. + */ + +#ifndef H_BLE_SVC_LLS_ +#define H_BLE_SVC_LLS_ + +struct ble_hs_cfg; + +#define BLE_SVC_LLS_UUID16 0x1803 +#define BLE_SVC_LLS_CHR_UUID16_ALERT_LEVEL 0x2a06 + +/* Alert level definitions */ +#define BLE_SVC_LLS_ALERT_LEVEL_NO_ALERT 0 +#define BLE_SVC_LLS_ALERT_LEVEL_MILD_ALERT 1 +#define BLE_SVC_LLS_ALERT_LEVEL_HIGH_ALERT 2 + +typedef int ble_svc_lls_event_fn(uint8_t alert_level); + +uint8_t ble_svc_lls_alert_level_get(void); +int ble_svc_lls_alert_level_set(uint8_t alert_level); +void ble_svc_lls_on_gap_event(struct ble_gap_event *event, void *arg); + +int ble_svc_lls_init(struct ble_hs_cfg *cfg, + uint8_t initial_alert_level, + ble_svc_lls_event_fn *cb); + +#endif + http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/b26285f2/net/nimble/host/profiles/lls/pkg.yml ---------------------------------------------------------------------- diff --git a/net/nimble/host/profiles/lls/pkg.yml b/net/nimble/host/profiles/lls/pkg.yml new file mode 100644 index 0000000..5d951b6 --- /dev/null +++ b/net/nimble/host/profiles/lls/pkg.yml @@ -0,0 +1,31 @@ +# +# 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: net/nimble/host/profiles/lls +pkg.description: Link Loss Service adopted specification. +pkg.author: "Apache Mynewt <[email protected]>" +pkg.homepage: "http://mynewt.apache.org/" +pkg.keywords: + - ble + - bluetooth + - lls + - nimble + +pkg.deps: + - net/nimble/host http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/b26285f2/net/nimble/host/profiles/lls/src/ble_svc_lls.c ---------------------------------------------------------------------- diff --git a/net/nimble/host/profiles/lls/src/ble_svc_lls.c b/net/nimble/host/profiles/lls/src/ble_svc_lls.c new file mode 100644 index 0000000..f0fd6f1 --- /dev/null +++ b/net/nimble/host/profiles/lls/src/ble_svc_lls.c @@ -0,0 +1,187 @@ +/** + * 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 <string.h> +#include "host/ble_hs.h" +#include "profiles/lls/ble_svc_lls.h" + +/* Callback function */ +ble_svc_lls_event_fn *cb_fn; +/* Alert level */ +uint8_t ble_svc_lls_alert_level; + +/* Write characteristic function */ +static int +ble_svc_lls_chr_write(struct os_mbuf *om, uint16_t min_len, + uint16_t max_len, void *dst, + uint16_t *len); + +/* Access function */ +static int +ble_svc_lls_access(uint16_t conn_handle, uint16_t attr_handle, + struct ble_gatt_access_ctxt *ctxt, void *arg); + +static const struct ble_gatt_svc_def ble_svc_lls_defs[] = { + { + /*** Service: Link Loss Service (LLS). */ + .type = BLE_GATT_SVC_TYPE_PRIMARY, + .uuid128 = BLE_UUID16(BLE_SVC_LLS_UUID16), + .characteristics = (struct ble_gatt_chr_def[]) { { + /*** Characteristic: Alert Level. */ + .uuid128 = BLE_UUID16(BLE_SVC_LLS_CHR_UUID16_ALERT_LEVEL), + .access_cb = ble_svc_lls_access, + .flags = BLE_GATT_CHR_F_READ | BLE_GATT_CHR_F_WRITE, + }, { + 0, /* No more characteristics in this service. */ + } }, + }, + + { + 0, /* No more services. */ + }, +}; + +static int +ble_svc_lls_chr_write(struct os_mbuf *om, uint16_t min_len, + uint16_t max_len, void *dst, + uint16_t *len) +{ + uint16_t om_len; + int rc; + + om_len = OS_MBUF_PKTLEN(om); + if (om_len < min_len || om_len > max_len) { + return BLE_ATT_ERR_INVALID_ATTR_VALUE_LEN; + } + + rc = ble_hs_mbuf_to_flat(om, dst, max_len, len); + if (rc != 0) { + return BLE_ATT_ERR_UNLIKELY; + } + + return 0; +} + +/** + * Simple read/write access callback for the alert level + * characteristic. + */ +static int +ble_svc_lls_access(uint16_t conn_handle, uint16_t attr_handle, + struct ble_gatt_access_ctxt *ctxt, void *arg) +{ + assert(ctxt->chr == &ble_svc_lls_defs[0].characteristics[0]); + int rc; + switch(ctxt->op) { + case BLE_GATT_ACCESS_OP_READ_CHR: + rc = os_mbuf_append(ctxt->om, &ble_svc_lls_alert_level, + sizeof ble_svc_lls_alert_level); + return rc == 0 ? 0 : BLE_ATT_ERR_INSUFFICIENT_RES; + + case BLE_GATT_ACCESS_OP_WRITE_CHR: + rc = ble_svc_lls_chr_write(ctxt->om, + sizeof ble_svc_lls_alert_level, + sizeof ble_svc_lls_alert_level, + &ble_svc_lls_alert_level, NULL); + return rc; + + default: + assert(0); + return BLE_ATT_ERR_UNLIKELY; + } + + return 0; +} + +/** + * This function is the crux of the link loss service. The application + * developer must call this function inside the gap event callback + * function when a BLE_GAP_EVENT_DISCONNECT event is received. Here, + * we then check if the disconnect reason is due to a timout, and if + * so, we call the ble_svc_lls_event_fn callback with the current + * alert level. The actual alert implementation is left up to the + * developer. + * + * @param event The BLE GAP event from the GAP event + * callback. + * @param arg The BLE GAP event arg from the GAP + * event callback. + */ +void +ble_svc_lls_on_gap_event(struct ble_gap_event *event, void *arg) { + if(event->disconnect.reason == + BLE_HS_HCI_ERR(BLE_ERR_CONN_SPVN_TMO)) { + cb_fn(ble_svc_lls_alert_level); + } +} + +/** + * Get the current alert level. + */ +uint8_t +ble_svc_lls_alert_level_get(void) +{ + return ble_svc_lls_alert_level; +} + +/** + * Set the current alert level. + */ +int +ble_svc_lls_alert_level_set(uint8_t alert_level) +{ + if (alert_level > BLE_SVC_LLS_ALERT_LEVEL_HIGH_ALERT) { + return BLE_HS_EINVAL; + } + + memcpy(&ble_svc_lls_alert_level, &alert_level, + sizeof alert_level); + + return 0; +} + +/** + * Initialize the LLS. The developer must specify the event function + * callback for the LLS to function properly. + */ +int +ble_svc_lls_init(struct ble_hs_cfg *cfg, uint8_t initial_alert_level, + ble_svc_lls_event_fn *cb) +{ + if (!cb) { + return BLE_HS_EINVAL; + } + + ble_svc_lls_alert_level = initial_alert_level; + cb_fn = cb; + + int rc; + rc = ble_gatts_count_cfg(ble_svc_lls_defs, cfg); + if (rc != 0) { + return rc; + } + + rc = ble_gatts_add_svcs(ble_svc_lls_defs); + if (rc != 0) { + return rc; + } + + return 0; +} http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/b26285f2/net/nimble/profiles/include/profiles/ble_svc_lls.h ---------------------------------------------------------------------- diff --git a/net/nimble/profiles/include/profiles/ble_svc_lls.h b/net/nimble/profiles/include/profiles/ble_svc_lls.h deleted file mode 100644 index dfc7878..0000000 --- a/net/nimble/profiles/include/profiles/ble_svc_lls.h +++ /dev/null @@ -1,45 +0,0 @@ -/** - * 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. - */ - -#ifndef H_BLE_SVC_LLS_ -#define H_BLE_SVC_LLS_ - -struct ble_hs_cfg; - -#define BLE_SVC_LLS_UUID16 0x1803 -#define BLE_SVC_LLS_CHR_UUID16_ALERT_LEVEL 0x2a06 - -/* Alert level definitions */ -#define BLE_SVC_LLS_ALERT_LEVEL_NO_ALERT 0 -#define BLE_SVC_LLS_ALERT_LEVEL_MILD_ALERT 1 -#define BLE_SVC_LLS_ALERT_LEVEL_HIGH_ALERT 2 - -typedef int ble_svc_lls_event_fn(uint8_t alert_level); - -uint8_t ble_svc_lls_alert_level_get(void); -uint8_t ble_svc_lls_alert_level_set(uint8_t alert_level); -void ble_svc_lls_on_gap_event(struct ble_gap_event *event, void *arg); - -int ble_svc_lls_register(void); -int ble_svc_lls_init(struct ble_hs_cfg *cfg, - uint8_t initial_alert_level, - ble_svc_lls_event_fn *cb); - -#endif - http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/b26285f2/net/nimble/profiles/pkg.yml ---------------------------------------------------------------------- diff --git a/net/nimble/profiles/pkg.yml b/net/nimble/profiles/pkg.yml deleted file mode 100644 index 89cd9d4..0000000 --- a/net/nimble/profiles/pkg.yml +++ /dev/null @@ -1,31 +0,0 @@ -# -# 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: net/nimble/profiles -pkg.description: Adopted profiles/services of the nimble Bluetooth Smart stack. -pkg.author: "Apache Mynewt <[email protected]>" -pkg.homepage: "http://mynewt.apache.org/" -pkg.keywords: - - ble - - bluetooth - -pkg.deps: - - sys/stats - - libs/os - - net/nimble http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/b26285f2/net/nimble/profiles/src/ble_svc_lls.c ---------------------------------------------------------------------- diff --git a/net/nimble/profiles/src/ble_svc_lls.c b/net/nimble/profiles/src/ble_svc_lls.c deleted file mode 100644 index fdfe377..0000000 --- a/net/nimble/profiles/src/ble_svc_lls.c +++ /dev/null @@ -1,166 +0,0 @@ -/** - * 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 <string.h> -#include "host/ble_hs.h" -#include "profiles/ble_svc_lls.h" - -/* Callback function */ -ble_svc_lls_event_fn *cb_fn; -/* Alert level */ -uint8_t ble_svc_lls_alert_level; - -/* Access function */ -static int -ble_svc_lls_access(uint16_t conn_handle, uint16_t attr_handle, - struct ble_gatt_access_ctxt *ctxt, void *arg); - -static const struct ble_gatt_svc_def ble_svc_lls_defs[] = { - { - /*** Service: Link Loss Service (LLS). */ - .type = BLE_GATT_SVC_TYPE_PRIMARY, - .uuid128 = BLE_UUID16(BLE_SVC_LLS_UUID16), - .characteristics = (struct ble_gatt_chr_def[]) { { - /*** Characteristic: Alert Level. */ - .uuid128 = BLE_UUID16(BLE_SVC_LLS_CHR_UUID16_ALERT_LEVEL), - .access_cb = ble_svc_lls_access, - .flags = BLE_GATT_CHR_F_READ | BLE_GATT_CHR_F_WRITE, - }, { - 0, /* No more characteristics in this service. */ - } }, - }, - - { - 0, /* No more services. */ - }, -}; - -/** - * Simple read/write access callback for the alert level - * characteristic. - */ -static int -ble_svc_lls_access(uint16_t conn_handle, uint16_t attr_handle, - struct ble_gatt_access_ctxt *ctxt, void *arg) -{ - assert(ctxt->chr == &ble_svc_lls_defs[0].characteristics[0]); - switch(ctxt->op) { - case BLE_GATT_ACCESS_OP_READ_CHR: - ctxt->att->read.data = &ble_svc_lls_alert_level; - ctxt->att->read.len = sizeof ble_svc_lls_alert_level; - break; - - case BLE_GATT_ACCESS_OP_WRITE_CHR: - if (ctxt->att->write.len != sizeof ble_svc_lls_alert_level) { - return BLE_ATT_ERR_INVALID_ATTR_VALUE_LEN; - } - memcpy(&ble_svc_lls_alert_level, ctxt->att->write.data, - sizeof ble_svc_lls_alert_level); - break; - - default: - assert(0); - break; - } - - return 0; -} - -/** - * This function is the crux of the link loss service. The application - * developer must call this function inside the gap event callback - * function when a BLE_GAP_EVENT_DISCONNECT event is received. Here, - * we then check if the disconnect reason is due to a timout, and if - * so, we call the ble_svc_lls_event_fn callback with the current - * alert level. The actual alert implementation is left up to the - * developer. - * - * @param event The BLE GAP event from the GAP event - * callback. - * @param arg The BLE GAP event arg from the GAP - * event callback. - */ -void -ble_svc_lls_on_gap_event(struct ble_gap_event *event, void *arg) { - if(event->disconnect.reason == - BLE_HS_HCI_ERR(BLE_ERR_CONN_SPVN_TMO)) { - cb_fn(ble_svc_lls_alert_level); - } -} - -/** - * Get the current alert level. - */ -uint8_t -ble_svc_lls_alert_level_get(void) -{ - return ble_svc_lls_alert_level; -} - -/** - * Set the current alert level. - */ -int -ble_svc_lls_alert_level_set(uint8_t alert_level) -{ - if (alert_level > BLE_SVC_LLS_ALERT_LEVEL_HIGH_ALERT) { - return BLE_HS_EINVAL; - } - - memcpy(&ble_svc_lls_alert_level, &alert_level, - sizeof alert_level); - - return 0; -} - -/** - * Registers the LLS with the GATT server. - */ -int -ble_svc_lls_register(void) -{ - int rc; - - rc = ble_gatts_register_svcs(ble_svc_lls_defs, NULL, NULL); - return rc; -} - -/** - * Initialize the LLS. The developer must specify the event function - * callback for the LLS to function properly. - */ -int -ble_svc_lls_init(struct ble_hs_cfg *cfg, uint8_t initial_alert_level, - ble_svc_lls_event_fn *cb) -{ - if (*cb) { - return BLE_HS_EINVAL; - } - ble_svc_lls_alert_level = initial_alert_level; - cb_fn = cb; - - int rc; - rc = ble_gatts_count_cfg(ble_svc_lls_defs, cfg); - if (rc != 0) { - return rc; - } - - return 0; -}
