Skip to content

Commit 28afed9

Browse files
authored
Merge pull request #7465 from tannewt/ble_workflow_ctrl_c
Watch for ctrl-c over BLE workflow serial
2 parents 1ab1cd3 + 8f9d1e2 commit 28afed9

File tree

6 files changed

+44
-8
lines changed

6 files changed

+44
-8
lines changed

ports/espressif/common-hal/_bleio/CharacteristicBuffer.c

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,19 @@ STATIC int characteristic_buffer_on_ble_evt(struct ble_gap_event *event, void *p
4949
event->notify_rx.attr_handle == self->characteristic->handle) {
5050
const struct os_mbuf *m = event->notify_rx.om;
5151
while (m != NULL) {
52-
ringbuf_put_n(&self->ringbuf, m->om_data, m->om_len);
52+
const uint8_t *data = m->om_data;
53+
uint16_t len = m->om_len;
54+
if (self->watch_for_interrupt_char) {
55+
for (uint16_t i = 0; i < len; i++) {
56+
if (data[i] == mp_interrupt_char) {
57+
mp_sched_keyboard_interrupt();
58+
} else {
59+
ringbuf_put(&self->ringbuf, data[i]);
60+
}
61+
}
62+
} else {
63+
ringbuf_put_n(&self->ringbuf, data, len);
64+
}
5365
m = SLIST_NEXT(m, om_next);
5466
}
5567
}
@@ -69,9 +81,11 @@ void _common_hal_bleio_characteristic_buffer_construct(bleio_characteristic_buff
6981
bleio_characteristic_obj_t *characteristic,
7082
mp_float_t timeout,
7183
uint8_t *buffer, size_t buffer_size,
72-
void *static_handler_entry) {
84+
void *static_handler_entry,
85+
bool watch_for_interrupt_char) {
7386
self->characteristic = characteristic;
7487
self->timeout_ms = timeout * 1000;
88+
self->watch_for_interrupt_char = watch_for_interrupt_char;
7589
ringbuf_init(&self->ringbuf, buffer, buffer_size);
7690

7791
if (static_handler_entry != NULL) {
@@ -87,7 +101,7 @@ void common_hal_bleio_characteristic_buffer_construct(bleio_characteristic_buffe
87101
mp_float_t timeout,
88102
size_t buffer_size) {
89103
uint8_t *buffer = m_malloc(buffer_size, true);
90-
_common_hal_bleio_characteristic_buffer_construct(self, characteristic, timeout, buffer, buffer_size, NULL);
104+
_common_hal_bleio_characteristic_buffer_construct(self, characteristic, timeout, buffer, buffer_size, NULL, false);
91105
}
92106

93107
uint32_t common_hal_bleio_characteristic_buffer_read(bleio_characteristic_buffer_obj_t *self, uint8_t *data, size_t len, int *errcode) {

ports/espressif/common-hal/_bleio/CharacteristicBuffer.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
#ifndef MICROPY_INCLUDED_ESPRESSIF_COMMON_HAL_BLEIO_CHARACTERISTICBUFFER_H
2828
#define MICROPY_INCLUDED_ESPRESSIF_COMMON_HAL_BLEIO_CHARACTERISTICBUFFER_H
2929

30+
#include <stdbool.h>
31+
3032
#include "py/ringbuf.h"
3133
#include "shared-bindings/_bleio/Characteristic.h"
3234

@@ -36,6 +38,7 @@ typedef struct {
3638
uint32_t timeout_ms;
3739
// Ring buffer storing consecutive incoming values.
3840
ringbuf_t ringbuf;
41+
bool watch_for_interrupt_char;
3942
} bleio_characteristic_buffer_obj_t;
4043

4144
#endif // MICROPY_INCLUDED_ESPRESSIF_COMMON_HAL_BLEIO_CHARACTERISTICBUFFER_H

ports/nrf/common-hal/_bleio/CharacteristicBuffer.c

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,17 @@
4545
STATIC void write_to_ringbuf(bleio_characteristic_buffer_obj_t *self, uint8_t *data, uint16_t len) {
4646
uint8_t is_nested_critical_region;
4747
sd_nvic_critical_region_enter(&is_nested_critical_region);
48-
ringbuf_put_n(&self->ringbuf, data, len);
48+
if (self->watch_for_interrupt_char) {
49+
for (uint16_t i = 0; i < len; i++) {
50+
if (data[i] == mp_interrupt_char) {
51+
mp_sched_keyboard_interrupt();
52+
} else {
53+
ringbuf_put(&self->ringbuf, data[i]);
54+
}
55+
}
56+
} else {
57+
ringbuf_put_n(&self->ringbuf, data, len);
58+
}
4959
sd_nvic_critical_region_exit(is_nested_critical_region);
5060
}
5161

@@ -85,10 +95,12 @@ void _common_hal_bleio_characteristic_buffer_construct(bleio_characteristic_buff
8595
bleio_characteristic_obj_t *characteristic,
8696
mp_float_t timeout,
8797
uint8_t *buffer, size_t buffer_size,
88-
void *static_handler_entry) {
98+
void *static_handler_entry,
99+
bool watch_for_interrupt_char) {
89100

90101
self->characteristic = characteristic;
91102
self->timeout_ms = timeout * 1000;
103+
self->watch_for_interrupt_char = watch_for_interrupt_char;
92104

93105
ringbuf_init(&self->ringbuf, buffer, buffer_size);
94106

@@ -105,7 +117,7 @@ void common_hal_bleio_characteristic_buffer_construct(bleio_characteristic_buffe
105117
mp_float_t timeout,
106118
size_t buffer_size) {
107119
uint8_t *buffer = m_malloc(buffer_size, true);
108-
_common_hal_bleio_characteristic_buffer_construct(self, characteristic, timeout, buffer, buffer_size, NULL);
120+
_common_hal_bleio_characteristic_buffer_construct(self, characteristic, timeout, buffer, buffer_size, NULL, false);
109121
}
110122

111123
uint32_t common_hal_bleio_characteristic_buffer_read(bleio_characteristic_buffer_obj_t *self, uint8_t *data, size_t len, int *errcode) {

ports/nrf/common-hal/_bleio/CharacteristicBuffer.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
#ifndef MICROPY_INCLUDED_NRF_COMMON_HAL_BLEIO_CHARACTERISTICBUFFER_H
2828
#define MICROPY_INCLUDED_NRF_COMMON_HAL_BLEIO_CHARACTERISTICBUFFER_H
2929

30+
#include <stdbool.h>
31+
3032
#include "nrf_soc.h"
3133

3234
#include "py/ringbuf.h"
@@ -38,6 +40,7 @@ typedef struct {
3840
uint32_t timeout_ms;
3941
// Ring buffer storing consecutive incoming values.
4042
ringbuf_t ringbuf;
43+
bool watch_for_interrupt_char;
4144
} bleio_characteristic_buffer_obj_t;
4245

4346
#endif // MICROPY_INCLUDED_NRF_COMMON_HAL_BLEIO_CHARACTERISTICBUFFER_H

shared-bindings/_bleio/CharacteristicBuffer.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
#ifndef MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_CHARACTERISTICBUFFER_H
2828
#define MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_CHARACTERISTICBUFFER_H
2929

30+
#include <stdbool.h>
31+
3032
#include "common-hal/_bleio/CharacteristicBuffer.h"
3133

3234
extern const mp_obj_type_t bleio_characteristic_buffer_type;
@@ -35,7 +37,8 @@ void _common_hal_bleio_characteristic_buffer_construct(bleio_characteristic_buff
3537
bleio_characteristic_obj_t *characteristic,
3638
mp_float_t timeout,
3739
uint8_t *buffer, size_t buffer_size,
38-
void *static_handler_entry);
40+
void *static_handler_entry,
41+
bool watch_for_interrupt_char);
3942
void common_hal_bleio_characteristic_buffer_construct(bleio_characteristic_buffer_obj_t *self,
4043
bleio_characteristic_obj_t *characteristic,
4144
mp_float_t timeout,

supervisor/shared/bluetooth/serial.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,8 @@ void supervisor_start_bluetooth_serial(void) {
146146
&supervisor_ble_circuitpython_rx_characteristic,
147147
0.1f,
148148
(uint8_t *)_incoming, sizeof(_incoming) * sizeof(uint32_t),
149-
&rx_static_handler_entry);
149+
&rx_static_handler_entry,
150+
true /* watch for interrupt character */);
150151

151152
_enabled = true;
152153
}

0 commit comments

Comments
 (0)