summaryrefslogtreecommitdiffstatshomepage
path: root/extmod
diff options
context:
space:
mode:
authorJim Mussared <jim.mussared@gmail.com>2021-09-27 16:27:42 +1000
committerDamien George <damien@micropython.org>2021-10-26 00:16:53 +1100
commit43467b9c719928ffaf2bc1cb314338bc402914e1 (patch)
treecc6d49282500833a703f30bdaebbb53e6732c9d1 /extmod
parent64e4bae129263278f72a6c3494f1e67c7895fcdd (diff)
downloadmicropython-43467b9c719928ffaf2bc1cb314338bc402914e1.tar.gz
micropython-43467b9c719928ffaf2bc1cb314338bc402914e1.zip
extmod/modbluetooth: Add connection interval to gap_connect.
This forwards through directly to the NimBLE and BTStack connect functions. Signed-off-by: Jim Mussared <jim.mussared@gmail.com>
Diffstat (limited to 'extmod')
-rw-r--r--extmod/btstack/modbluetooth_btstack.c6
-rw-r--r--extmod/modbluetooth.c14
-rw-r--r--extmod/modbluetooth.h2
-rw-r--r--extmod/nimble/modbluetooth_nimble.c12
4 files changed, 22 insertions, 12 deletions
diff --git a/extmod/btstack/modbluetooth_btstack.c b/extmod/btstack/modbluetooth_btstack.c
index 4e81e21fe2..cd2ba83d53 100644
--- a/extmod/btstack/modbluetooth_btstack.c
+++ b/extmod/btstack/modbluetooth_btstack.c
@@ -1265,13 +1265,13 @@ int mp_bluetooth_gap_scan_stop(void) {
return 0;
}
-int mp_bluetooth_gap_peripheral_connect(uint8_t addr_type, const uint8_t *addr, int32_t duration_ms) {
+int mp_bluetooth_gap_peripheral_connect(uint8_t addr_type, const uint8_t *addr, int32_t duration_ms, int32_t min_conn_interval_us, int32_t max_conn_interval_us) {
DEBUG_printf("mp_bluetooth_gap_peripheral_connect\n");
uint16_t conn_scan_interval = 60000 / 625;
uint16_t conn_scan_window = 30000 / 625;
- uint16_t conn_interval_min = 10000 / 1250;
- uint16_t conn_interval_max = 30000 / 1250;
+ uint16_t conn_interval_min = (min_conn_interval_us ? min_conn_interval_us : 10000) / 1250;
+ uint16_t conn_interval_max = (max_conn_interval_us ? max_conn_interval_us : 30000) / 1250;
uint16_t conn_latency = 4;
uint16_t supervision_timeout = duration_ms / 10; // default = 720
uint16_t min_ce_length = 10000 / 625;
diff --git a/extmod/modbluetooth.c b/extmod/modbluetooth.c
index cb153f70e9..e3d64b81f1 100644
--- a/extmod/modbluetooth.c
+++ b/extmod/modbluetooth.c
@@ -637,14 +637,22 @@ STATIC mp_obj_t bluetooth_ble_gap_connect(size_t n_args, const mp_obj_t *args) {
mp_raise_ValueError(MP_ERROR_TEXT("invalid addr"));
}
mp_int_t scan_duration_ms = MP_BLUETOOTH_CONNECT_DEFAULT_SCAN_DURATION_MS;
- if (n_args == 4) {
+ mp_int_t min_conn_interval_us = 0;
+ mp_int_t max_conn_interval_us = 0;
+ if (n_args >= 4 && args[3] != mp_const_none) {
scan_duration_ms = mp_obj_get_int(args[3]);
}
+ if (n_args >= 5 && args[4] != mp_const_none) {
+ min_conn_interval_us = mp_obj_get_int(args[4]);
+ }
+ if (n_args >= 6 && args[5] != mp_const_none) {
+ max_conn_interval_us = mp_obj_get_int(args[5]);
+ }
- int err = mp_bluetooth_gap_peripheral_connect(addr_type, bufinfo.buf, scan_duration_ms);
+ int err = mp_bluetooth_gap_peripheral_connect(addr_type, bufinfo.buf, scan_duration_ms, min_conn_interval_us, max_conn_interval_us);
return bluetooth_handle_errno(err);
}
-STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(bluetooth_ble_gap_connect_obj, 3, 4, bluetooth_ble_gap_connect);
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(bluetooth_ble_gap_connect_obj, 3, 6, bluetooth_ble_gap_connect);
STATIC mp_obj_t bluetooth_ble_gap_scan(size_t n_args, const mp_obj_t *args) {
// Default is indefinite scan, with the NimBLE "background scan" interval and window.
diff --git a/extmod/modbluetooth.h b/extmod/modbluetooth.h
index 43519e5941..fe41fd5143 100644
--- a/extmod/modbluetooth.h
+++ b/extmod/modbluetooth.h
@@ -370,7 +370,7 @@ int mp_bluetooth_gap_scan_start(int32_t duration_ms, int32_t interval_us, int32_
int mp_bluetooth_gap_scan_stop(void);
// Connect to a found peripheral.
-int mp_bluetooth_gap_peripheral_connect(uint8_t addr_type, const uint8_t *addr, int32_t duration_ms);
+int mp_bluetooth_gap_peripheral_connect(uint8_t addr_type, const uint8_t *addr, int32_t duration_ms, int32_t min_conn_interval_us, int32_t max_conn_interval_us);
#endif
#if MICROPY_PY_BLUETOOTH_ENABLE_GATT_CLIENT
diff --git a/extmod/nimble/modbluetooth_nimble.c b/extmod/nimble/modbluetooth_nimble.c
index e4b4cb68af..6ac31fd4bd 100644
--- a/extmod/nimble/modbluetooth_nimble.c
+++ b/extmod/nimble/modbluetooth_nimble.c
@@ -1202,7 +1202,7 @@ STATIC int peripheral_gap_event_cb(struct ble_gap_event *event, void *arg) {
return commmon_gap_event_cb(event, arg);
}
-int mp_bluetooth_gap_peripheral_connect(uint8_t addr_type, const uint8_t *addr, int32_t duration_ms) {
+int mp_bluetooth_gap_peripheral_connect(uint8_t addr_type, const uint8_t *addr, int32_t duration_ms, int32_t min_conn_interval_us, int32_t max_conn_interval_us) {
DEBUG_printf("mp_bluetooth_gap_peripheral_connect\n");
if (!mp_bluetooth_is_active()) {
return ERRNO_BLUETOOTH_NOT_ACTIVE;
@@ -1211,12 +1211,14 @@ int mp_bluetooth_gap_peripheral_connect(uint8_t addr_type, const uint8_t *addr,
mp_bluetooth_gap_scan_stop();
}
- // TODO: This is the same as ble_gap_conn_params_dflt (i.e. passing NULL).
- STATIC const struct ble_gap_conn_params params = {
+ uint16_t conn_interval_min = min_conn_interval_us ? min_conn_interval_us / BLE_HCI_CONN_ITVL : BLE_GAP_INITIAL_CONN_ITVL_MIN;
+ uint16_t conn_interval_max = max_conn_interval_us ? max_conn_interval_us / BLE_HCI_CONN_ITVL : BLE_GAP_INITIAL_CONN_ITVL_MAX;
+
+ const struct ble_gap_conn_params params = {
.scan_itvl = 0x0010,
.scan_window = 0x0010,
- .itvl_min = BLE_GAP_INITIAL_CONN_ITVL_MIN,
- .itvl_max = BLE_GAP_INITIAL_CONN_ITVL_MAX,
+ .itvl_min = conn_interval_min,
+ .itvl_max = conn_interval_max,
.latency = BLE_GAP_INITIAL_CONN_LATENCY,
.supervision_timeout = BLE_GAP_INITIAL_SUPERVISION_TIMEOUT,
.min_ce_len = BLE_GAP_INITIAL_CONN_MIN_CE_LEN,