summaryrefslogtreecommitdiff
path: root/extmod
diff options
context:
space:
mode:
Diffstat (limited to 'extmod')
-rw-r--r--extmod/modbluetooth.c8
-rw-r--r--extmod/modbluetooth.h6
-rw-r--r--extmod/modbluetooth_nimble.c11
3 files changed, 20 insertions, 5 deletions
diff --git a/extmod/modbluetooth.c b/extmod/modbluetooth.c
index 2293e0367..74f73c1f2 100644
--- a/extmod/modbluetooth.c
+++ b/extmod/modbluetooth.c
@@ -641,9 +641,13 @@ STATIC mp_obj_t bluetooth_ble_gattc_write(size_t n_args, const mp_obj_t *args) {
mp_buffer_info_t bufinfo = {0};
mp_get_buffer_raise(data, &bufinfo, MP_BUFFER_READ);
size_t len = bufinfo.len;
- return bluetooth_handle_errno(mp_bluetooth_gattc_write(conn_handle, value_handle, bufinfo.buf, &len));
+ unsigned int mode = MP_BLUETOOTH_WRITE_MODE_NO_RESPONSE;
+ if (n_args == 5) {
+ mode = mp_obj_get_int(args[4]);
+ }
+ return bluetooth_handle_errno(mp_bluetooth_gattc_write(conn_handle, value_handle, bufinfo.buf, &len, mode));
}
-STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(bluetooth_ble_gattc_write_obj, 4, 4, bluetooth_ble_gattc_write);
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(bluetooth_ble_gattc_write_obj, 4, 5, bluetooth_ble_gattc_write);
#endif // MICROPY_PY_BLUETOOTH_ENABLE_CENTRAL_MODE
diff --git a/extmod/modbluetooth.h b/extmod/modbluetooth.h
index 8a3ab414f..fbae67bc4 100644
--- a/extmod/modbluetooth.h
+++ b/extmod/modbluetooth.h
@@ -65,6 +65,10 @@
#define MP_BLUETOOTH_CHARACTERISTIC_FLAG_WRITE (1 << 3)
#define MP_BLUETOOTH_CHARACTERISTIC_FLAG_NOTIFY (1 << 4)
+// For mp_bluetooth_gattc_write, the mode parameter
+#define MP_BLUETOOTH_WRITE_MODE_NO_RESPONSE (0)
+#define MP_BLUETOOTH_WRITE_MODE_WITH_RESPONSE (1)
+
// Type value also doubles as length.
#define MP_BLUETOOTH_UUID_TYPE_16 (2)
#define MP_BLUETOOTH_UUID_TYPE_32 (4)
@@ -219,7 +223,7 @@ int mp_bluetooth_gattc_discover_descriptors(uint16_t conn_handle, uint16_t start
int mp_bluetooth_gattc_read(uint16_t conn_handle, uint16_t value_handle);
// Write the value to the remote peripheral.
-int mp_bluetooth_gattc_write(uint16_t conn_handle, uint16_t value_handle, const uint8_t *value, size_t *value_len);
+int mp_bluetooth_gattc_write(uint16_t conn_handle, uint16_t value_handle, const uint8_t *value, size_t *value_len, unsigned int mode);
#endif
/////////////////////////////////////////////////////////////////////////////
diff --git a/extmod/modbluetooth_nimble.c b/extmod/modbluetooth_nimble.c
index 83eb4b88a..930dd06d1 100644
--- a/extmod/modbluetooth_nimble.c
+++ b/extmod/modbluetooth_nimble.c
@@ -816,8 +816,15 @@ STATIC int ble_gatt_attr_write_cb(uint16_t conn_handle, const struct ble_gatt_er
}
// Write the value to the remote peripheral.
-int mp_bluetooth_gattc_write(uint16_t conn_handle, uint16_t value_handle, const uint8_t *value, size_t *value_len) {
- int err = ble_gattc_write_flat(conn_handle, value_handle, value, *value_len, &ble_gatt_attr_write_cb, NULL);
+int mp_bluetooth_gattc_write(uint16_t conn_handle, uint16_t value_handle, const uint8_t *value, size_t *value_len, unsigned int mode) {
+ int err;
+ if (mode == MP_BLUETOOTH_WRITE_MODE_NO_RESPONSE) {
+ err = ble_gattc_write_no_rsp_flat(conn_handle, value_handle, value, *value_len);
+ } else if (mode == MP_BLUETOOTH_WRITE_MODE_WITH_RESPONSE) {
+ err = ble_gattc_write_flat(conn_handle, value_handle, value, *value_len, &ble_gatt_attr_write_cb, NULL);
+ } else {
+ err = BLE_HS_EINVAL;
+ }
return ble_hs_err_to_errno(err);
}