From 3efee0d70335f42332c5f4947aaf1745907eb2fb Mon Sep 17 00:00:00 2001 From: iabdalkader Date: Tue, 27 Apr 2021 22:44:44 +0200 Subject: [PATCH 1/2] Portenta: Enable bluetooth. --- src/micropython | 2 +- src/omv/boards/PORTENTA/imlib_config.h | 6 +++--- src/omv/boards/PORTENTA/omv_boardconfig.h | 2 +- src/omv/boards/PORTENTA/omv_boardconfig.mk | 2 ++ src/omv/boards/PORTENTA/ulab_config.h | 2 ++ 5 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/micropython b/src/micropython index d592eaf46..dfed71345 160000 --- a/src/micropython +++ b/src/micropython @@ -1 +1 @@ -Subproject commit d592eaf460244b434d682ce6a8d14a9098f4b16f +Subproject commit dfed71345fc2191fb48191dead9ee6f827d6a9e0 diff --git a/src/omv/boards/PORTENTA/imlib_config.h b/src/omv/boards/PORTENTA/imlib_config.h index ab799f9d0..304de382c 100644 --- a/src/omv/boards/PORTENTA/imlib_config.h +++ b/src/omv/boards/PORTENTA/imlib_config.h @@ -126,7 +126,7 @@ #endif // Enable FAST (20+ KBs). -#define IMLIB_ENABLE_FAST +//#define IMLIB_ENABLE_FAST // Enable find_template() #define IMLIB_FIND_TEMPLATE @@ -141,10 +141,10 @@ #define IMLIB_ENABLE_DESCRIPTOR // Enable find_hog() -#define IMLIB_ENABLE_HOG +//#define IMLIB_ENABLE_HOG // Enable selective_search() -#define IMLIB_ENABLE_SELECTIVE_SEARCH +//#define IMLIB_ENABLE_SELECTIVE_SEARCH // Enable STM32 DMA2D #define IMLIB_ENABLE_DMA2D diff --git a/src/omv/boards/PORTENTA/omv_boardconfig.h b/src/omv/boards/PORTENTA/omv_boardconfig.h index cc9f39ceb..e98a36cdc 100644 --- a/src/omv/boards/PORTENTA/omv_boardconfig.h +++ b/src/omv/boards/PORTENTA/omv_boardconfig.h @@ -152,7 +152,7 @@ #define OMV_FB_SIZE (4M) // FB memory: header + VGA/GS image #define OMV_FB_ALLOC_SIZE (3M) // minimum fb alloc size #define OMV_STACK_SIZE (64K) -#define OMV_HEAP_SIZE (170K) +#define OMV_HEAP_SIZE (160K) #define OMV_SDRAM_SIZE (8 * 1024 * 1024) // This needs to be here for UVC firmware. #define OMV_LINE_BUF_SIZE (11 * 1024) // Image line buffer round(2592 * 2BPP * 2 buffers). diff --git a/src/omv/boards/PORTENTA/omv_boardconfig.mk b/src/omv/boards/PORTENTA/omv_boardconfig.mk index bda2657cc..356d70054 100755 --- a/src/omv/boards/PORTENTA/omv_boardconfig.mk +++ b/src/omv/boards/PORTENTA/omv_boardconfig.mk @@ -21,6 +21,8 @@ MICROPY_PY_ULAB = 1 MICROPY_PY_WINC1500 = 0 MICROPY_PY_LWIP = 1 MICROPY_PY_NETWORK_CYW43 = 1 +MICROPY_PY_BLUETOOTH = 1 +MICROPY_BLUETOOTH_NIMBLE = 1 MICROPY_PY_AUDIO = 1 MICROPY_PY_MICRO_SPEECH = 1 MICROPY_PY_LCD = 1 diff --git a/src/omv/boards/PORTENTA/ulab_config.h b/src/omv/boards/PORTENTA/ulab_config.h index 21f758a2f..fc6487d31 100644 --- a/src/omv/boards/PORTENTA/ulab_config.h +++ b/src/omv/boards/PORTENTA/ulab_config.h @@ -9,4 +9,6 @@ #ifndef __ULAB_CONFIG_H__ #define __ULAB_CONFIG_H__ // Override ulab defaults here. +#define NDARRAY_BINARY_USES_FUN_POINTER (1) +#define ULAB_SCIPY_HAS_OPTIMIZE_MODULE (1) #endif //__ULAB_CONFIG_H__ From e42552ee8fc8bf7f36f52c942bfb77a5f5c63c28 Mon Sep 17 00:00:00 2001 From: iabdalkader Date: Tue, 27 Apr 2021 22:47:27 +0200 Subject: [PATCH 2/2] Portenta: Add BLE example. --- .../41-Bluetooth/ble_temperature.py | 97 +++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 scripts/examples/Arduino/Portenta-H7/41-Bluetooth/ble_temperature.py diff --git a/scripts/examples/Arduino/Portenta-H7/41-Bluetooth/ble_temperature.py b/scripts/examples/Arduino/Portenta-H7/41-Bluetooth/ble_temperature.py new file mode 100644 index 000000000..7a48d0c91 --- /dev/null +++ b/scripts/examples/Arduino/Portenta-H7/41-Bluetooth/ble_temperature.py @@ -0,0 +1,97 @@ +# This example demonstrates a simple temperature sensor peripheral. +# +# The sensor's local value updates every second, and it will notify +# any connected central every 10 seconds. + +import bluetooth +import random +import struct +import time +from ble_advertising import advertising_payload + +from micropython import const + +_IRQ_CENTRAL_CONNECT = const(1) +_IRQ_CENTRAL_DISCONNECT = const(2) +_IRQ_GATTS_INDICATE_DONE = const(20) + +_FLAG_READ = const(0x0002) +_FLAG_NOTIFY = const(0x0010) +_FLAG_INDICATE = const(0x0020) + +# org.bluetooth.service.environmental_sensing +_ENV_SENSE_UUID = bluetooth.UUID(0x181A) +# org.bluetooth.characteristic.temperature +_TEMP_CHAR = ( + bluetooth.UUID(0x2A6E), + _FLAG_READ | _FLAG_NOTIFY | _FLAG_INDICATE, +) +_ENV_SENSE_SERVICE = ( + _ENV_SENSE_UUID, + (_TEMP_CHAR,), +) + +# org.bluetooth.characteristic.gap.appearance.xml +_ADV_APPEARANCE_GENERIC_THERMOMETER = const(768) + + +class BLETemperature: + def __init__(self, ble, name="PORTENTA_BLE"): + self._ble = ble + self._ble.active(True) + self._ble.irq(self._irq) + ((self._handle,),) = self._ble.gatts_register_services((_ENV_SENSE_SERVICE,)) + self._connections = set() + self._payload = advertising_payload( + name=name, services=[_ENV_SENSE_UUID], appearance=_ADV_APPEARANCE_GENERIC_THERMOMETER + ) + self._advertise() + + def _irq(self, event, data): + # Track connections so we can send notifications. + if event == _IRQ_CENTRAL_CONNECT: + conn_handle, _, _ = data + self._connections.add(conn_handle) + elif event == _IRQ_CENTRAL_DISCONNECT: + conn_handle, _, _ = data + self._connections.remove(conn_handle) + # Start advertising again to allow a new connection. + self._advertise() + elif event == _IRQ_GATTS_INDICATE_DONE: + conn_handle, value_handle, status = data + + def set_temperature(self, temp_deg_c, notify=False, indicate=False): + # Data is sint16 in degrees Celsius with a resolution of 0.01 degrees Celsius. + # Write the local value, ready for a central to read. + self._ble.gatts_write(self._handle, struct.pack("