Merge remote-tracking branch 'upstream/master' into stm32-dac-deinit
This commit is contained in:
commit
adfef8b520
|
@ -158,6 +158,7 @@ jobs:
|
||||||
- "trinket_m0_haxpress"
|
- "trinket_m0_haxpress"
|
||||||
- "uchip"
|
- "uchip"
|
||||||
- "ugame10"
|
- "ugame10"
|
||||||
|
- "winterbloom_sol"
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Set up Python 3.5
|
- name: Set up Python 3.5
|
||||||
|
|
|
@ -49,7 +49,7 @@ void mp_keyboard_interrupt(void) {
|
||||||
|
|
||||||
// Check to see if we've been CTRL-C'ed by autoreload or the user.
|
// Check to see if we've been CTRL-C'ed by autoreload or the user.
|
||||||
bool mp_hal_is_interrupted(void) {
|
bool mp_hal_is_interrupted(void) {
|
||||||
return MP_STATE_VM(mp_pending_exception) == MP_OBJ_FROM_PTR(&MP_STATE_VM(mp_kbd_exception));
|
return MP_STATE_VM(mp_pending_exception) != NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
153
locale/ID.po
153
locale/ID.po
|
@ -8,7 +8,7 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2019-09-08 17:30-0500\n"
|
"POT-Creation-Date: 2019-10-21 19:50-0700\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
|
@ -261,6 +261,10 @@ msgstr "Semua timer untuk pin ini sedang digunakan"
|
||||||
msgid "All timers in use"
|
msgid "All timers in use"
|
||||||
msgstr "Semua timer sedang digunakan"
|
msgstr "Semua timer sedang digunakan"
|
||||||
|
|
||||||
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
|
msgid "Already advertising."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/analogio/AnalogOut.c
|
#: ports/nrf/common-hal/analogio/AnalogOut.c
|
||||||
msgid "AnalogOut functionality not supported"
|
msgid "AnalogOut functionality not supported"
|
||||||
msgstr "fungsionalitas AnalogOut tidak didukung"
|
msgstr "fungsionalitas AnalogOut tidak didukung"
|
||||||
|
@ -329,6 +333,11 @@ msgstr ""
|
||||||
msgid "Brightness not adjustable"
|
msgid "Brightness not adjustable"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: shared-bindings/_bleio/UUID.c
|
||||||
|
#, c-format
|
||||||
|
msgid "Buffer + offset too small %d %d %d"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: shared-module/usb_hid/Device.c
|
#: shared-module/usb_hid/Device.c
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Buffer incorrect size. Should be %d bytes."
|
msgid "Buffer incorrect size. Should be %d bytes."
|
||||||
|
@ -465,6 +474,12 @@ msgstr ""
|
||||||
msgid "Command must be an int between 0 and 255"
|
msgid "Command must be an int between 0 and 255"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: shared-bindings/_bleio/Connection.c
|
||||||
|
msgid ""
|
||||||
|
"Connection has been disconnected and can no longer be used. Create a new "
|
||||||
|
"connection."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: py/persistentcode.c
|
#: py/persistentcode.c
|
||||||
msgid "Corrupt .mpy file"
|
msgid "Corrupt .mpy file"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -507,7 +522,7 @@ msgstr ""
|
||||||
msgid "Data chunk must follow fmt chunk"
|
msgid "Data chunk must follow fmt chunk"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgid "Data too large for advertisement packet"
|
msgid "Data too large for advertisement packet"
|
||||||
msgstr "Tidak bisa menyesuaikan data ke dalam paket advertisment"
|
msgstr "Tidak bisa menyesuaikan data ke dalam paket advertisment"
|
||||||
|
@ -554,10 +569,6 @@ msgstr ""
|
||||||
msgid "Expected a Characteristic"
|
msgid "Expected a Characteristic"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Service.c
|
|
||||||
msgid "Expected a Peripheral"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Characteristic.c
|
#: shared-bindings/_bleio/Characteristic.c
|
||||||
msgid "Expected a Service"
|
msgid "Expected a Service"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -567,7 +578,7 @@ msgstr ""
|
||||||
msgid "Expected a UUID"
|
msgid "Expected a UUID"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Central.c
|
#: shared-bindings/_bleio/Adapter.c
|
||||||
msgid "Expected an Address"
|
msgid "Expected an Address"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -576,6 +587,11 @@ msgstr ""
|
||||||
msgid "Expected tuple of length %d, got %d"
|
msgid "Expected tuple of length %d, got %d"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: ports/nrf/common-hal/_bleio/__init__.c
|
||||||
|
#, c-format
|
||||||
|
msgid "Failed initiate attribute read, err 0x%04x"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: shared-bindings/ps2io/Ps2.c
|
#: shared-bindings/ps2io/Ps2.c
|
||||||
msgid "Failed sending command."
|
msgid "Failed sending command."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -586,20 +602,14 @@ msgid "Failed to acquire mutex, err 0x%04x"
|
||||||
msgstr "Gagal untuk mendapatkan mutex, status: 0x%08lX"
|
msgstr "Gagal untuk mendapatkan mutex, status: 0x%08lX"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Service.c
|
#: ports/nrf/common-hal/_bleio/Service.c
|
||||||
#, fuzzy, c-format
|
msgid "Failed to add characteristic, NRF_ERROR_%q"
|
||||||
msgid "Failed to add characteristic, err 0x%04x"
|
msgstr ""
|
||||||
msgstr "Gagal untuk menambahkan karakteristik, status: 0x%08lX"
|
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Characteristic.c
|
#: ports/nrf/common-hal/_bleio/Characteristic.c
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to add descriptor, err 0x%04x"
|
msgid "Failed to add descriptor, err 0x%04x"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
|
||||||
#, fuzzy, c-format
|
|
||||||
msgid "Failed to add service, err 0x%04x"
|
|
||||||
msgstr "Gagal untuk menambahkan layanan, status: 0x%08lX"
|
|
||||||
|
|
||||||
#: ports/atmel-samd/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
|
#: ports/atmel-samd/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
|
||||||
msgid "Failed to allocate RX buffer"
|
msgid "Failed to allocate RX buffer"
|
||||||
msgstr "Gagal untuk mengalokasikan buffer RX"
|
msgstr "Gagal untuk mengalokasikan buffer RX"
|
||||||
|
@ -611,25 +621,22 @@ msgid "Failed to allocate RX buffer of %d bytes"
|
||||||
msgstr "Gagal untuk megalokasikan buffer RX dari %d byte"
|
msgstr "Gagal untuk megalokasikan buffer RX dari %d byte"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Adapter.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
#, fuzzy
|
msgid "Failed to change softdevice state, NRF_ERROR_%q"
|
||||||
msgid "Failed to change softdevice state"
|
|
||||||
msgstr "Gagal untuk merubah status softdevice, error: 0x%08lX"
|
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
|
||||||
#, c-format
|
|
||||||
msgid "Failed to configure advertising, err 0x%04x"
|
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Central.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
|
msgid "Failed to connect: internal error"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
msgid "Failed to connect: timeout"
|
msgid "Failed to connect: timeout"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Scanner.c
|
#: ports/nrf/common-hal/_bleio/Service.c
|
||||||
#, fuzzy, c-format
|
msgid "Failed to create service, NRF_ERROR_%q"
|
||||||
msgid "Failed to continue scanning, err 0x%04x"
|
msgstr ""
|
||||||
msgstr "Gagal untuk melanjutkan scanning, status: 0x%08lX"
|
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/__init__.c
|
#: ports/nrf/common-hal/_bleio/Connection.c
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgid "Failed to discover services"
|
msgid "Failed to discover services"
|
||||||
msgstr "Gagal untuk menemukan layanan, status: 0x%08lX"
|
msgstr "Gagal untuk menemukan layanan, status: 0x%08lX"
|
||||||
|
@ -649,7 +656,7 @@ msgstr "Gagal untuk mendapatkan status softdevice, error: 0x%08lX"
|
||||||
msgid "Failed to notify or indicate attribute value, err 0x%04x"
|
msgid "Failed to notify or indicate attribute value, err 0x%04x"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Connection.c
|
||||||
msgid "Failed to pair"
|
msgid "Failed to pair"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -658,8 +665,7 @@ msgstr ""
|
||||||
msgid "Failed to read CCCD value, err 0x%04x"
|
msgid "Failed to read CCCD value, err 0x%04x"
|
||||||
msgstr "Gagal untuk membaca nilai atribut, status: 0x%08lX"
|
msgstr "Gagal untuk membaca nilai atribut, status: 0x%08lX"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Characteristic.c
|
#: ports/nrf/common-hal/_bleio/__init__.c
|
||||||
#: ports/nrf/common-hal/_bleio/Descriptor.c
|
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to read attribute value, err 0x%04x"
|
msgid "Failed to read attribute value, err 0x%04x"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -679,35 +685,27 @@ msgstr "Gagal untuk menambahkan Vendor Spesific UUID, status: 0x%08lX"
|
||||||
msgid "Failed to release mutex, err 0x%04x"
|
msgid "Failed to release mutex, err 0x%04x"
|
||||||
msgstr "Gagal untuk melepaskan mutex, status: 0x%08lX"
|
msgstr "Gagal untuk melepaskan mutex, status: 0x%08lX"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
#, c-format
|
msgid "Failed to start advertising, NRF_ERROR_%q"
|
||||||
msgid "Failed to set device name, err 0x%04x"
|
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
#, fuzzy, c-format
|
|
||||||
msgid "Failed to start advertising, err 0x%04x"
|
|
||||||
msgstr "Gagal untuk memulai advertisement, status: 0x%08lX"
|
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Central.c
|
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to start connecting, error 0x%04x"
|
msgid "Failed to start connecting, error 0x%04x"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Connection.c
|
||||||
#, c-format
|
msgid "Failed to start pairing, NRF_ERROR_%q"
|
||||||
msgid "Failed to start pairing, error 0x%04x"
|
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Scanner.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
#, fuzzy, c-format
|
#, fuzzy, c-format
|
||||||
msgid "Failed to start scanning, err 0x%04x"
|
msgid "Failed to start scanning, err 0x%04x"
|
||||||
msgstr "Gagal untuk melakukan scanning, status: 0x%08lX"
|
msgstr "Gagal untuk melakukan scanning, status: 0x%08lX"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
#, fuzzy, c-format
|
msgid "Failed to stop advertising, NRF_ERROR_%q"
|
||||||
msgid "Failed to stop advertising, err 0x%04x"
|
msgstr ""
|
||||||
msgstr "Gagal untuk memberhentikan advertisement, status: 0x%08lX"
|
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Characteristic.c
|
#: ports/nrf/common-hal/_bleio/Characteristic.c
|
||||||
#, c-format
|
#, c-format
|
||||||
|
@ -1004,9 +1002,8 @@ msgstr ""
|
||||||
msgid "No such file/directory"
|
msgid "No such file/directory"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/__init__.c shared-bindings/_bleio/Central.c
|
#: ports/nrf/common-hal/_bleio/__init__.c
|
||||||
#: shared-bindings/_bleio/CharacteristicBuffer.c
|
#: shared-bindings/_bleio/CharacteristicBuffer.c
|
||||||
#: shared-bindings/_bleio/Peripheral.c
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgid "Not connected"
|
msgid "Not connected"
|
||||||
msgstr "Tidak dapat menyambungkan ke AP"
|
msgstr "Tidak dapat menyambungkan ke AP"
|
||||||
|
@ -1081,6 +1078,10 @@ msgstr "Tambahkan module apapun pada filesystem\n"
|
||||||
msgid "Pop from an empty Ps2 buffer"
|
msgid "Pop from an empty Ps2 buffer"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: shared-bindings/_bleio/Adapter.c
|
||||||
|
msgid "Prefix buffer must be on the heap"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: main.c
|
#: main.c
|
||||||
msgid "Press any key to enter the REPL. Use CTRL-D to reload."
|
msgid "Press any key to enter the REPL. Use CTRL-D to reload."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -1151,6 +1152,10 @@ msgstr ""
|
||||||
msgid "Sample rate too high. It must be less than %d"
|
msgid "Sample rate too high. It must be less than %d"
|
||||||
msgstr "Nilai sampel terlalu tinggi. Nilai harus kurang dari %d"
|
msgstr "Nilai sampel terlalu tinggi. Nilai harus kurang dari %d"
|
||||||
|
|
||||||
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
|
msgid "Scan already in progess. Stop with stop_scan."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
|
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
|
||||||
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c
|
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c
|
||||||
msgid "Serializer in use"
|
msgid "Serializer in use"
|
||||||
|
@ -1165,11 +1170,6 @@ msgstr ""
|
||||||
msgid "Slices not supported"
|
msgid "Slices not supported"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Adapter.c
|
|
||||||
#, fuzzy, c-format
|
|
||||||
msgid "Soft device assert, id: 0x%08lX, pc: 0x%08lX"
|
|
||||||
msgstr "Dukungan soft device, id: 0x%08lX, pc: 0x%08l"
|
|
||||||
|
|
||||||
#: extmod/modure.c
|
#: extmod/modure.c
|
||||||
msgid "Splitting with sub-captures"
|
msgid "Splitting with sub-captures"
|
||||||
msgstr "Memisahkan dengan menggunakan sub-captures"
|
msgstr "Memisahkan dengan menggunakan sub-captures"
|
||||||
|
@ -1984,7 +1984,7 @@ msgstr ""
|
||||||
msgid "integer required"
|
msgid "integer required"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Peripheral.c shared-bindings/_bleio/Scanner.c
|
#: shared-bindings/_bleio/Adapter.c
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "interval must be in range %s-%s"
|
msgid "interval must be in range %s-%s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -2161,11 +2161,6 @@ msgstr ""
|
||||||
msgid "name '%q' is not defined"
|
msgid "name '%q' is not defined"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Peripheral.c
|
|
||||||
#, fuzzy
|
|
||||||
msgid "name must be a string"
|
|
||||||
msgstr "keyword harus berupa string"
|
|
||||||
|
|
||||||
#: py/runtime.c
|
#: py/runtime.c
|
||||||
msgid "name not defined"
|
msgid "name not defined"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -2216,7 +2211,7 @@ msgstr ""
|
||||||
msgid "no such attribute"
|
msgid "no such attribute"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/__init__.c
|
#: ports/nrf/common-hal/_bleio/Connection.c
|
||||||
msgid "non-UUID found in service_uuids_whitelist"
|
msgid "non-UUID found in service_uuids_whitelist"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -2700,7 +2695,7 @@ msgstr ""
|
||||||
msgid "value_count must be > 0"
|
msgid "value_count must be > 0"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Scanner.c
|
#: shared-bindings/_bleio/Adapter.c
|
||||||
msgid "window must be <= interval"
|
msgid "window must be <= interval"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -2770,10 +2765,22 @@ msgstr ""
|
||||||
#~ msgid "Failed to acquire mutex"
|
#~ msgid "Failed to acquire mutex"
|
||||||
#~ msgstr "Gagal untuk mendapatkan mutex, status: 0x%08lX"
|
#~ msgstr "Gagal untuk mendapatkan mutex, status: 0x%08lX"
|
||||||
|
|
||||||
|
#, fuzzy, c-format
|
||||||
|
#~ msgid "Failed to add characteristic, err 0x%04x"
|
||||||
|
#~ msgstr "Gagal untuk menambahkan karakteristik, status: 0x%08lX"
|
||||||
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#~ msgid "Failed to add service"
|
#~ msgid "Failed to add service"
|
||||||
#~ msgstr "Gagal untuk menambahkan layanan, status: 0x%08lX"
|
#~ msgstr "Gagal untuk menambahkan layanan, status: 0x%08lX"
|
||||||
|
|
||||||
|
#, fuzzy, c-format
|
||||||
|
#~ msgid "Failed to add service, err 0x%04x"
|
||||||
|
#~ msgstr "Gagal untuk menambahkan layanan, status: 0x%08lX"
|
||||||
|
|
||||||
|
#, fuzzy
|
||||||
|
#~ msgid "Failed to change softdevice state"
|
||||||
|
#~ msgstr "Gagal untuk merubah status softdevice, error: 0x%08lX"
|
||||||
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#~ msgid "Failed to connect:"
|
#~ msgid "Failed to connect:"
|
||||||
#~ msgstr "Gagal untuk menyambungkan, status: 0x%08lX"
|
#~ msgstr "Gagal untuk menyambungkan, status: 0x%08lX"
|
||||||
|
@ -2782,6 +2789,10 @@ msgstr ""
|
||||||
#~ msgid "Failed to continue scanning"
|
#~ msgid "Failed to continue scanning"
|
||||||
#~ msgstr "Gagal untuk melanjutkan scanning, status: 0x%08lX"
|
#~ msgstr "Gagal untuk melanjutkan scanning, status: 0x%08lX"
|
||||||
|
|
||||||
|
#, fuzzy, c-format
|
||||||
|
#~ msgid "Failed to continue scanning, err 0x%04x"
|
||||||
|
#~ msgstr "Gagal untuk melanjutkan scanning, status: 0x%08lX"
|
||||||
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#~ msgid "Failed to create mutex"
|
#~ msgid "Failed to create mutex"
|
||||||
#~ msgstr "Gagal untuk membuat mutex, status: 0x%08lX"
|
#~ msgstr "Gagal untuk membuat mutex, status: 0x%08lX"
|
||||||
|
@ -2802,6 +2813,10 @@ msgstr ""
|
||||||
#~ msgid "Failed to start advertising"
|
#~ msgid "Failed to start advertising"
|
||||||
#~ msgstr "Gagal untuk memulai advertisement, status: 0x%08lX"
|
#~ msgstr "Gagal untuk memulai advertisement, status: 0x%08lX"
|
||||||
|
|
||||||
|
#, fuzzy, c-format
|
||||||
|
#~ msgid "Failed to start advertising, err 0x%04x"
|
||||||
|
#~ msgstr "Gagal untuk memulai advertisement, status: 0x%08lX"
|
||||||
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#~ msgid "Failed to start scanning"
|
#~ msgid "Failed to start scanning"
|
||||||
#~ msgstr "Gagal untuk melakukan scanning, status: 0x%08lX"
|
#~ msgstr "Gagal untuk melakukan scanning, status: 0x%08lX"
|
||||||
|
@ -2810,6 +2825,10 @@ msgstr ""
|
||||||
#~ msgid "Failed to stop advertising"
|
#~ msgid "Failed to stop advertising"
|
||||||
#~ msgstr "Gagal untuk memberhentikan advertisement, status: 0x%08lX"
|
#~ msgstr "Gagal untuk memberhentikan advertisement, status: 0x%08lX"
|
||||||
|
|
||||||
|
#, fuzzy, c-format
|
||||||
|
#~ msgid "Failed to stop advertising, err 0x%04x"
|
||||||
|
#~ msgstr "Gagal untuk memberhentikan advertisement, status: 0x%08lX"
|
||||||
|
|
||||||
#~ msgid "GPIO16 does not support pull up."
|
#~ msgid "GPIO16 does not support pull up."
|
||||||
#~ msgstr "GPIO16 tidak mendukung pull up"
|
#~ msgstr "GPIO16 tidak mendukung pull up"
|
||||||
|
|
||||||
|
@ -2859,6 +2878,10 @@ msgstr ""
|
||||||
#~ msgid "STA required"
|
#~ msgid "STA required"
|
||||||
#~ msgstr "STA dibutuhkan"
|
#~ msgstr "STA dibutuhkan"
|
||||||
|
|
||||||
|
#, fuzzy, c-format
|
||||||
|
#~ msgid "Soft device assert, id: 0x%08lX, pc: 0x%08lX"
|
||||||
|
#~ msgstr "Dukungan soft device, id: 0x%08lX, pc: 0x%08l"
|
||||||
|
|
||||||
#~ msgid "UART(%d) does not exist"
|
#~ msgid "UART(%d) does not exist"
|
||||||
#~ msgstr "UART(%d) tidak ada"
|
#~ msgstr "UART(%d) tidak ada"
|
||||||
|
|
||||||
|
@ -2936,6 +2959,10 @@ msgstr ""
|
||||||
#~ msgid "memory allocation failed, allocating %u bytes for native code"
|
#~ msgid "memory allocation failed, allocating %u bytes for native code"
|
||||||
#~ msgstr "alokasi memori gagal, mengalokasikan %u byte untuk kode native"
|
#~ msgstr "alokasi memori gagal, mengalokasikan %u byte untuk kode native"
|
||||||
|
|
||||||
|
#, fuzzy
|
||||||
|
#~ msgid "name must be a string"
|
||||||
|
#~ msgstr "keyword harus berupa string"
|
||||||
|
|
||||||
#~ msgid "not a valid ADC Channel: %d"
|
#~ msgid "not a valid ADC Channel: %d"
|
||||||
#~ msgstr "tidak valid channel ADC: %d"
|
#~ msgstr "tidak valid channel ADC: %d"
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,7 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2019-09-08 17:30-0500\n"
|
"POT-Creation-Date: 2019-10-21 19:50-0700\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
|
@ -259,6 +259,10 @@ msgstr ""
|
||||||
msgid "All timers in use"
|
msgid "All timers in use"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
|
msgid "Already advertising."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/analogio/AnalogOut.c
|
#: ports/nrf/common-hal/analogio/AnalogOut.c
|
||||||
msgid "AnalogOut functionality not supported"
|
msgid "AnalogOut functionality not supported"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -325,6 +329,11 @@ msgstr ""
|
||||||
msgid "Brightness not adjustable"
|
msgid "Brightness not adjustable"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: shared-bindings/_bleio/UUID.c
|
||||||
|
#, c-format
|
||||||
|
msgid "Buffer + offset too small %d %d %d"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: shared-module/usb_hid/Device.c
|
#: shared-module/usb_hid/Device.c
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Buffer incorrect size. Should be %d bytes."
|
msgid "Buffer incorrect size. Should be %d bytes."
|
||||||
|
@ -455,6 +464,12 @@ msgstr ""
|
||||||
msgid "Command must be an int between 0 and 255"
|
msgid "Command must be an int between 0 and 255"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: shared-bindings/_bleio/Connection.c
|
||||||
|
msgid ""
|
||||||
|
"Connection has been disconnected and can no longer be used. Create a new "
|
||||||
|
"connection."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: py/persistentcode.c
|
#: py/persistentcode.c
|
||||||
msgid "Corrupt .mpy file"
|
msgid "Corrupt .mpy file"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -497,7 +512,7 @@ msgstr ""
|
||||||
msgid "Data chunk must follow fmt chunk"
|
msgid "Data chunk must follow fmt chunk"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
msgid "Data too large for advertisement packet"
|
msgid "Data too large for advertisement packet"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -543,10 +558,6 @@ msgstr ""
|
||||||
msgid "Expected a Characteristic"
|
msgid "Expected a Characteristic"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Service.c
|
|
||||||
msgid "Expected a Peripheral"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Characteristic.c
|
#: shared-bindings/_bleio/Characteristic.c
|
||||||
msgid "Expected a Service"
|
msgid "Expected a Service"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -556,7 +567,7 @@ msgstr ""
|
||||||
msgid "Expected a UUID"
|
msgid "Expected a UUID"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Central.c
|
#: shared-bindings/_bleio/Adapter.c
|
||||||
msgid "Expected an Address"
|
msgid "Expected an Address"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -565,6 +576,11 @@ msgstr ""
|
||||||
msgid "Expected tuple of length %d, got %d"
|
msgid "Expected tuple of length %d, got %d"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: ports/nrf/common-hal/_bleio/__init__.c
|
||||||
|
#, c-format
|
||||||
|
msgid "Failed initiate attribute read, err 0x%04x"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: shared-bindings/ps2io/Ps2.c
|
#: shared-bindings/ps2io/Ps2.c
|
||||||
msgid "Failed sending command."
|
msgid "Failed sending command."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -575,8 +591,7 @@ msgid "Failed to acquire mutex, err 0x%04x"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Service.c
|
#: ports/nrf/common-hal/_bleio/Service.c
|
||||||
#, c-format
|
msgid "Failed to add characteristic, NRF_ERROR_%q"
|
||||||
msgid "Failed to add characteristic, err 0x%04x"
|
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Characteristic.c
|
#: ports/nrf/common-hal/_bleio/Characteristic.c
|
||||||
|
@ -584,11 +599,6 @@ msgstr ""
|
||||||
msgid "Failed to add descriptor, err 0x%04x"
|
msgid "Failed to add descriptor, err 0x%04x"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
|
||||||
#, c-format
|
|
||||||
msgid "Failed to add service, err 0x%04x"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: ports/atmel-samd/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
|
#: ports/atmel-samd/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
|
||||||
msgid "Failed to allocate RX buffer"
|
msgid "Failed to allocate RX buffer"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -600,24 +610,22 @@ msgid "Failed to allocate RX buffer of %d bytes"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Adapter.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
msgid "Failed to change softdevice state"
|
msgid "Failed to change softdevice state, NRF_ERROR_%q"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
#, c-format
|
msgid "Failed to connect: internal error"
|
||||||
msgid "Failed to configure advertising, err 0x%04x"
|
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Central.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
msgid "Failed to connect: timeout"
|
msgid "Failed to connect: timeout"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Scanner.c
|
#: ports/nrf/common-hal/_bleio/Service.c
|
||||||
#, c-format
|
msgid "Failed to create service, NRF_ERROR_%q"
|
||||||
msgid "Failed to continue scanning, err 0x%04x"
|
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/__init__.c
|
#: ports/nrf/common-hal/_bleio/Connection.c
|
||||||
msgid "Failed to discover services"
|
msgid "Failed to discover services"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -634,7 +642,7 @@ msgstr ""
|
||||||
msgid "Failed to notify or indicate attribute value, err 0x%04x"
|
msgid "Failed to notify or indicate attribute value, err 0x%04x"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Connection.c
|
||||||
msgid "Failed to pair"
|
msgid "Failed to pair"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -643,8 +651,7 @@ msgstr ""
|
||||||
msgid "Failed to read CCCD value, err 0x%04x"
|
msgid "Failed to read CCCD value, err 0x%04x"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Characteristic.c
|
#: ports/nrf/common-hal/_bleio/__init__.c
|
||||||
#: ports/nrf/common-hal/_bleio/Descriptor.c
|
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to read attribute value, err 0x%04x"
|
msgid "Failed to read attribute value, err 0x%04x"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -664,34 +671,26 @@ msgstr ""
|
||||||
msgid "Failed to release mutex, err 0x%04x"
|
msgid "Failed to release mutex, err 0x%04x"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
#, c-format
|
msgid "Failed to start advertising, NRF_ERROR_%q"
|
||||||
msgid "Failed to set device name, err 0x%04x"
|
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
#, c-format
|
|
||||||
msgid "Failed to start advertising, err 0x%04x"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Central.c
|
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to start connecting, error 0x%04x"
|
msgid "Failed to start connecting, error 0x%04x"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Connection.c
|
||||||
#, c-format
|
msgid "Failed to start pairing, NRF_ERROR_%q"
|
||||||
msgid "Failed to start pairing, error 0x%04x"
|
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Scanner.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to start scanning, err 0x%04x"
|
msgid "Failed to start scanning, err 0x%04x"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
#, c-format
|
msgid "Failed to stop advertising, NRF_ERROR_%q"
|
||||||
msgid "Failed to stop advertising, err 0x%04x"
|
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Characteristic.c
|
#: ports/nrf/common-hal/_bleio/Characteristic.c
|
||||||
|
@ -989,9 +988,8 @@ msgstr ""
|
||||||
msgid "No such file/directory"
|
msgid "No such file/directory"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/__init__.c shared-bindings/_bleio/Central.c
|
#: ports/nrf/common-hal/_bleio/__init__.c
|
||||||
#: shared-bindings/_bleio/CharacteristicBuffer.c
|
#: shared-bindings/_bleio/CharacteristicBuffer.c
|
||||||
#: shared-bindings/_bleio/Peripheral.c
|
|
||||||
msgid "Not connected"
|
msgid "Not connected"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -1065,6 +1063,10 @@ msgstr ""
|
||||||
msgid "Pop from an empty Ps2 buffer"
|
msgid "Pop from an empty Ps2 buffer"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: shared-bindings/_bleio/Adapter.c
|
||||||
|
msgid "Prefix buffer must be on the heap"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: main.c
|
#: main.c
|
||||||
msgid "Press any key to enter the REPL. Use CTRL-D to reload."
|
msgid "Press any key to enter the REPL. Use CTRL-D to reload."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -1131,6 +1133,10 @@ msgstr ""
|
||||||
msgid "Sample rate too high. It must be less than %d"
|
msgid "Sample rate too high. It must be less than %d"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
|
msgid "Scan already in progess. Stop with stop_scan."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
|
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
|
||||||
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c
|
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c
|
||||||
msgid "Serializer in use"
|
msgid "Serializer in use"
|
||||||
|
@ -1145,11 +1151,6 @@ msgstr ""
|
||||||
msgid "Slices not supported"
|
msgid "Slices not supported"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Adapter.c
|
|
||||||
#, c-format
|
|
||||||
msgid "Soft device assert, id: 0x%08lX, pc: 0x%08lX"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: extmod/modure.c
|
#: extmod/modure.c
|
||||||
msgid "Splitting with sub-captures"
|
msgid "Splitting with sub-captures"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -1950,7 +1951,7 @@ msgstr ""
|
||||||
msgid "integer required"
|
msgid "integer required"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Peripheral.c shared-bindings/_bleio/Scanner.c
|
#: shared-bindings/_bleio/Adapter.c
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "interval must be in range %s-%s"
|
msgid "interval must be in range %s-%s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -2127,10 +2128,6 @@ msgstr ""
|
||||||
msgid "name '%q' is not defined"
|
msgid "name '%q' is not defined"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Peripheral.c
|
|
||||||
msgid "name must be a string"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: py/runtime.c
|
#: py/runtime.c
|
||||||
msgid "name not defined"
|
msgid "name not defined"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -2181,7 +2178,7 @@ msgstr ""
|
||||||
msgid "no such attribute"
|
msgid "no such attribute"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/__init__.c
|
#: ports/nrf/common-hal/_bleio/Connection.c
|
||||||
msgid "non-UUID found in service_uuids_whitelist"
|
msgid "non-UUID found in service_uuids_whitelist"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -2663,7 +2660,7 @@ msgstr ""
|
||||||
msgid "value_count must be > 0"
|
msgid "value_count must be > 0"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Scanner.c
|
#: shared-bindings/_bleio/Adapter.c
|
||||||
msgid "window must be <= interval"
|
msgid "window must be <= interval"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
174
locale/de_DE.po
174
locale/de_DE.po
|
@ -7,7 +7,7 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: \n"
|
"Project-Id-Version: \n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2019-09-08 17:30-0500\n"
|
"POT-Creation-Date: 2019-10-21 19:50-0700\n"
|
||||||
"PO-Revision-Date: 2018-07-27 11:55-0700\n"
|
"PO-Revision-Date: 2018-07-27 11:55-0700\n"
|
||||||
"Last-Translator: Pascal Deneaux\n"
|
"Last-Translator: Pascal Deneaux\n"
|
||||||
"Language-Team: Sebastian Plamauer, Pascal Deneaux\n"
|
"Language-Team: Sebastian Plamauer, Pascal Deneaux\n"
|
||||||
|
@ -261,6 +261,10 @@ msgstr "Alle timer für diesen Pin werden bereits benutzt"
|
||||||
msgid "All timers in use"
|
msgid "All timers in use"
|
||||||
msgstr "Alle timer werden benutzt"
|
msgstr "Alle timer werden benutzt"
|
||||||
|
|
||||||
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
|
msgid "Already advertising."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/analogio/AnalogOut.c
|
#: ports/nrf/common-hal/analogio/AnalogOut.c
|
||||||
msgid "AnalogOut functionality not supported"
|
msgid "AnalogOut functionality not supported"
|
||||||
msgstr "AnalogOut-Funktion wird nicht unterstützt"
|
msgstr "AnalogOut-Funktion wird nicht unterstützt"
|
||||||
|
@ -329,6 +333,11 @@ msgstr "Die Helligkeit muss zwischen 0 und 255 liegen"
|
||||||
msgid "Brightness not adjustable"
|
msgid "Brightness not adjustable"
|
||||||
msgstr "Die Helligkeit ist nicht einstellbar"
|
msgstr "Die Helligkeit ist nicht einstellbar"
|
||||||
|
|
||||||
|
#: shared-bindings/_bleio/UUID.c
|
||||||
|
#, c-format
|
||||||
|
msgid "Buffer + offset too small %d %d %d"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: shared-module/usb_hid/Device.c
|
#: shared-module/usb_hid/Device.c
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Buffer incorrect size. Should be %d bytes."
|
msgid "Buffer incorrect size. Should be %d bytes."
|
||||||
|
@ -459,6 +468,12 @@ msgstr "Der Befehl muss zwischen 0 und 255 liegen"
|
||||||
msgid "Command must be an int between 0 and 255"
|
msgid "Command must be an int between 0 and 255"
|
||||||
msgstr "Der Befehl muss ein int zwischen 0 und 255 sein"
|
msgstr "Der Befehl muss ein int zwischen 0 und 255 sein"
|
||||||
|
|
||||||
|
#: shared-bindings/_bleio/Connection.c
|
||||||
|
msgid ""
|
||||||
|
"Connection has been disconnected and can no longer be used. Create a new "
|
||||||
|
"connection."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: py/persistentcode.c
|
#: py/persistentcode.c
|
||||||
msgid "Corrupt .mpy file"
|
msgid "Corrupt .mpy file"
|
||||||
msgstr "Beschädigte .mpy Datei"
|
msgstr "Beschädigte .mpy Datei"
|
||||||
|
@ -501,7 +516,7 @@ msgstr "Data 0 pin muss am Byte ausgerichtet sein"
|
||||||
msgid "Data chunk must follow fmt chunk"
|
msgid "Data chunk must follow fmt chunk"
|
||||||
msgstr "Dem fmt Block muss ein Datenblock folgen"
|
msgstr "Dem fmt Block muss ein Datenblock folgen"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
msgid "Data too large for advertisement packet"
|
msgid "Data too large for advertisement packet"
|
||||||
msgstr "Zu vielen Daten für das advertisement packet"
|
msgstr "Zu vielen Daten für das advertisement packet"
|
||||||
|
|
||||||
|
@ -547,10 +562,6 @@ msgstr "Erwartet ein(e) %q"
|
||||||
msgid "Expected a Characteristic"
|
msgid "Expected a Characteristic"
|
||||||
msgstr "Characteristic wird erwartet"
|
msgstr "Characteristic wird erwartet"
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Service.c
|
|
||||||
msgid "Expected a Peripheral"
|
|
||||||
msgstr "Ein Peripheriegerät wird erwartet"
|
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Characteristic.c
|
#: shared-bindings/_bleio/Characteristic.c
|
||||||
msgid "Expected a Service"
|
msgid "Expected a Service"
|
||||||
msgstr "Ein Service wird erwartet"
|
msgstr "Ein Service wird erwartet"
|
||||||
|
@ -560,7 +571,7 @@ msgstr "Ein Service wird erwartet"
|
||||||
msgid "Expected a UUID"
|
msgid "Expected a UUID"
|
||||||
msgstr "Eine UUID wird erwartet"
|
msgstr "Eine UUID wird erwartet"
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Central.c
|
#: shared-bindings/_bleio/Adapter.c
|
||||||
msgid "Expected an Address"
|
msgid "Expected an Address"
|
||||||
msgstr "Erwartet eine Adresse"
|
msgstr "Erwartet eine Adresse"
|
||||||
|
|
||||||
|
@ -569,6 +580,11 @@ msgstr "Erwartet eine Adresse"
|
||||||
msgid "Expected tuple of length %d, got %d"
|
msgid "Expected tuple of length %d, got %d"
|
||||||
msgstr "Habe ein Tupel der Länge %d erwartet aber %d erhalten"
|
msgstr "Habe ein Tupel der Länge %d erwartet aber %d erhalten"
|
||||||
|
|
||||||
|
#: ports/nrf/common-hal/_bleio/__init__.c
|
||||||
|
#, c-format
|
||||||
|
msgid "Failed initiate attribute read, err 0x%04x"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: shared-bindings/ps2io/Ps2.c
|
#: shared-bindings/ps2io/Ps2.c
|
||||||
msgid "Failed sending command."
|
msgid "Failed sending command."
|
||||||
msgstr "Kommando nicht gesendet."
|
msgstr "Kommando nicht gesendet."
|
||||||
|
@ -579,20 +595,14 @@ msgid "Failed to acquire mutex, err 0x%04x"
|
||||||
msgstr "Mutex konnte nicht akquiriert werden. Status: 0x%04x"
|
msgstr "Mutex konnte nicht akquiriert werden. Status: 0x%04x"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Service.c
|
#: ports/nrf/common-hal/_bleio/Service.c
|
||||||
#, c-format
|
msgid "Failed to add characteristic, NRF_ERROR_%q"
|
||||||
msgid "Failed to add characteristic, err 0x%04x"
|
msgstr ""
|
||||||
msgstr "Hinzufügen des Characteristic ist gescheitert. Status: 0x%04x"
|
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Characteristic.c
|
#: ports/nrf/common-hal/_bleio/Characteristic.c
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to add descriptor, err 0x%04x"
|
msgid "Failed to add descriptor, err 0x%04x"
|
||||||
msgstr "Deskriptor konnte nicht hinzugefügt werden. Status: 0x%04x"
|
msgstr "Deskriptor konnte nicht hinzugefügt werden. Status: 0x%04x"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
|
||||||
#, c-format
|
|
||||||
msgid "Failed to add service, err 0x%04x"
|
|
||||||
msgstr "Dienst konnte nicht hinzugefügt werden. Status: 0x%04x"
|
|
||||||
|
|
||||||
#: ports/atmel-samd/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
|
#: ports/atmel-samd/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
|
||||||
msgid "Failed to allocate RX buffer"
|
msgid "Failed to allocate RX buffer"
|
||||||
msgstr "Konnte keinen RX Buffer allozieren"
|
msgstr "Konnte keinen RX Buffer allozieren"
|
||||||
|
@ -604,24 +614,22 @@ msgid "Failed to allocate RX buffer of %d bytes"
|
||||||
msgstr "Konnte keine RX Buffer mit %d allozieren"
|
msgstr "Konnte keine RX Buffer mit %d allozieren"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Adapter.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
msgid "Failed to change softdevice state"
|
msgid "Failed to change softdevice state, NRF_ERROR_%q"
|
||||||
msgstr "Fehler beim Ändern des Softdevice-Status"
|
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
|
||||||
#, c-format
|
|
||||||
msgid "Failed to configure advertising, err 0x%04x"
|
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Central.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
|
msgid "Failed to connect: internal error"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
msgid "Failed to connect: timeout"
|
msgid "Failed to connect: timeout"
|
||||||
msgstr "Verbindung nicht erfolgreich: timeout"
|
msgstr "Verbindung nicht erfolgreich: timeout"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Scanner.c
|
#: ports/nrf/common-hal/_bleio/Service.c
|
||||||
#, c-format
|
msgid "Failed to create service, NRF_ERROR_%q"
|
||||||
msgid "Failed to continue scanning, err 0x%04x"
|
msgstr ""
|
||||||
msgstr "Der Scanvorgang kann nicht fortgesetzt werden. Status: 0x%04x"
|
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/__init__.c
|
#: ports/nrf/common-hal/_bleio/Connection.c
|
||||||
msgid "Failed to discover services"
|
msgid "Failed to discover services"
|
||||||
msgstr "Es konnten keine Dienste gefunden werden"
|
msgstr "Es konnten keine Dienste gefunden werden"
|
||||||
|
|
||||||
|
@ -638,7 +646,7 @@ msgstr "Fehler beim Abrufen des Softdevice-Status"
|
||||||
msgid "Failed to notify or indicate attribute value, err 0x%04x"
|
msgid "Failed to notify or indicate attribute value, err 0x%04x"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Connection.c
|
||||||
msgid "Failed to pair"
|
msgid "Failed to pair"
|
||||||
msgstr "Koppeln fehlgeschlagen"
|
msgstr "Koppeln fehlgeschlagen"
|
||||||
|
|
||||||
|
@ -647,8 +655,7 @@ msgstr "Koppeln fehlgeschlagen"
|
||||||
msgid "Failed to read CCCD value, err 0x%04x"
|
msgid "Failed to read CCCD value, err 0x%04x"
|
||||||
msgstr "Kann CCCD value nicht lesen. Status: 0x%04x"
|
msgstr "Kann CCCD value nicht lesen. Status: 0x%04x"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Characteristic.c
|
#: ports/nrf/common-hal/_bleio/__init__.c
|
||||||
#: ports/nrf/common-hal/_bleio/Descriptor.c
|
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to read attribute value, err 0x%04x"
|
msgid "Failed to read attribute value, err 0x%04x"
|
||||||
msgstr "Kann Attributwert nicht lesen, Status: 0x%04x"
|
msgstr "Kann Attributwert nicht lesen, Status: 0x%04x"
|
||||||
|
@ -668,35 +675,27 @@ msgstr "Kann keine herstellerspezifische UUID hinzufügen. Status: 0x%04x"
|
||||||
msgid "Failed to release mutex, err 0x%04x"
|
msgid "Failed to release mutex, err 0x%04x"
|
||||||
msgstr "Mutex konnte nicht freigegeben werden. Status: 0x%04x"
|
msgstr "Mutex konnte nicht freigegeben werden. Status: 0x%04x"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
#, c-format
|
msgid "Failed to start advertising, NRF_ERROR_%q"
|
||||||
msgid "Failed to set device name, err 0x%04x"
|
msgstr ""
|
||||||
msgstr "Gerätename konnte nicht gesetzt werden, Status: 0x%04x"
|
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
#, c-format
|
|
||||||
msgid "Failed to start advertising, err 0x%04x"
|
|
||||||
msgstr "Kann advertisement nicht starten. Status: 0x%04x"
|
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Central.c
|
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to start connecting, error 0x%04x"
|
msgid "Failed to start connecting, error 0x%04x"
|
||||||
msgstr "Verbindung konnte nicht hergestellt werden. Status: 0x%04x"
|
msgstr "Verbindung konnte nicht hergestellt werden. Status: 0x%04x"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Connection.c
|
||||||
#, c-format
|
msgid "Failed to start pairing, NRF_ERROR_%q"
|
||||||
msgid "Failed to start pairing, error 0x%04x"
|
msgstr ""
|
||||||
msgstr "Starten des Koppelns fehlgeschlagen, Status: 0x%04x"
|
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Scanner.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to start scanning, err 0x%04x"
|
msgid "Failed to start scanning, err 0x%04x"
|
||||||
msgstr "Der Scanvorgang kann nicht gestartet werden. Status: 0x%04x"
|
msgstr "Der Scanvorgang kann nicht gestartet werden. Status: 0x%04x"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
#, c-format
|
msgid "Failed to stop advertising, NRF_ERROR_%q"
|
||||||
msgid "Failed to stop advertising, err 0x%04x"
|
msgstr ""
|
||||||
msgstr "Kann advertisement nicht stoppen. Status: 0x%04x"
|
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Characteristic.c
|
#: ports/nrf/common-hal/_bleio/Characteristic.c
|
||||||
#, c-format
|
#, c-format
|
||||||
|
@ -1002,9 +1001,8 @@ msgstr "Kein Speicherplatz mehr verfügbar auf dem Gerät"
|
||||||
msgid "No such file/directory"
|
msgid "No such file/directory"
|
||||||
msgstr "Keine solche Datei/Verzeichnis"
|
msgstr "Keine solche Datei/Verzeichnis"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/__init__.c shared-bindings/_bleio/Central.c
|
#: ports/nrf/common-hal/_bleio/__init__.c
|
||||||
#: shared-bindings/_bleio/CharacteristicBuffer.c
|
#: shared-bindings/_bleio/CharacteristicBuffer.c
|
||||||
#: shared-bindings/_bleio/Peripheral.c
|
|
||||||
msgid "Not connected"
|
msgid "Not connected"
|
||||||
msgstr "Nicht verbunden"
|
msgstr "Nicht verbunden"
|
||||||
|
|
||||||
|
@ -1033,7 +1031,8 @@ msgstr "Nur 8 oder 16 bit mono mit "
|
||||||
msgid ""
|
msgid ""
|
||||||
"Only Windows format, uncompressed BMP supported: given header size is %d"
|
"Only Windows format, uncompressed BMP supported: given header size is %d"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Nur Windows-Format, unkomprimiertes BMP unterstützt: die gegebene Header-Größe ist %d"
|
"Nur Windows-Format, unkomprimiertes BMP unterstützt: die gegebene Header-"
|
||||||
|
"Größe ist %d"
|
||||||
|
|
||||||
#: shared-module/displayio/OnDiskBitmap.c
|
#: shared-module/displayio/OnDiskBitmap.c
|
||||||
#, c-format
|
#, c-format
|
||||||
|
@ -1041,8 +1040,8 @@ msgid ""
|
||||||
"Only monochrome, indexed 4bpp or 8bpp, and 16bpp or greater BMPs supported: "
|
"Only monochrome, indexed 4bpp or 8bpp, and 16bpp or greater BMPs supported: "
|
||||||
"%d bpp given"
|
"%d bpp given"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Nur monochrome, indizierte 4bpp oder 8bpp, und 16bpp oder größere BMPs unterstützt: "
|
"Nur monochrome, indizierte 4bpp oder 8bpp, und 16bpp oder größere BMPs "
|
||||||
"%d bpp wurden gegeben"
|
"unterstützt: %d bpp wurden gegeben"
|
||||||
|
|
||||||
#: shared-bindings/_pixelbuf/PixelBuf.c
|
#: shared-bindings/_pixelbuf/PixelBuf.c
|
||||||
msgid "Only slices with step=1 (aka None) are supported"
|
msgid "Only slices with step=1 (aka None) are supported"
|
||||||
|
@ -1083,6 +1082,10 @@ msgstr "und alle Module im Dateisystem \n"
|
||||||
msgid "Pop from an empty Ps2 buffer"
|
msgid "Pop from an empty Ps2 buffer"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: shared-bindings/_bleio/Adapter.c
|
||||||
|
msgid "Prefix buffer must be on the heap"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: main.c
|
#: main.c
|
||||||
msgid "Press any key to enter the REPL. Use CTRL-D to reload."
|
msgid "Press any key to enter the REPL. Use CTRL-D to reload."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -1151,6 +1154,10 @@ msgstr "Abtastrate muss positiv sein"
|
||||||
msgid "Sample rate too high. It must be less than %d"
|
msgid "Sample rate too high. It must be less than %d"
|
||||||
msgstr "Abtastrate zu hoch. Wert muss unter %d liegen"
|
msgstr "Abtastrate zu hoch. Wert muss unter %d liegen"
|
||||||
|
|
||||||
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
|
msgid "Scan already in progess. Stop with stop_scan."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
|
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
|
||||||
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c
|
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c
|
||||||
msgid "Serializer in use"
|
msgid "Serializer in use"
|
||||||
|
@ -1165,11 +1172,6 @@ msgstr "Slice und Wert (value) haben unterschiedliche Längen."
|
||||||
msgid "Slices not supported"
|
msgid "Slices not supported"
|
||||||
msgstr "Slices werden nicht unterstützt"
|
msgstr "Slices werden nicht unterstützt"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Adapter.c
|
|
||||||
#, c-format
|
|
||||||
msgid "Soft device assert, id: 0x%08lX, pc: 0x%08lX"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: extmod/modure.c
|
#: extmod/modure.c
|
||||||
msgid "Splitting with sub-captures"
|
msgid "Splitting with sub-captures"
|
||||||
msgstr "Splitting mit sub-captures"
|
msgstr "Splitting mit sub-captures"
|
||||||
|
@ -1202,8 +1204,8 @@ msgid ""
|
||||||
"The `microcontroller` module was used to boot into safe mode. Press reset to "
|
"The `microcontroller` module was used to boot into safe mode. Press reset to "
|
||||||
"exit safe mode.\n"
|
"exit safe mode.\n"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Das `Mikrocontroller` Modul wurde benutzt, um in den Sicherheitsmodus zu starten. "
|
"Das `Mikrocontroller` Modul wurde benutzt, um in den Sicherheitsmodus zu "
|
||||||
"Drücke Reset um den Sicherheitsmodus zu verlassen.\n"
|
"starten. Drücke Reset um den Sicherheitsmodus zu verlassen.\n"
|
||||||
|
|
||||||
#: supervisor/shared/safe_mode.c
|
#: supervisor/shared/safe_mode.c
|
||||||
msgid ""
|
msgid ""
|
||||||
|
@ -1740,7 +1742,8 @@ msgstr "Farbpuffer muss ein Puffer oder ein int sein"
|
||||||
|
|
||||||
#: shared-bindings/displayio/Palette.c
|
#: shared-bindings/displayio/Palette.c
|
||||||
msgid "color buffer must be a bytearray or array of type 'b' or 'B'"
|
msgid "color buffer must be a bytearray or array of type 'b' or 'B'"
|
||||||
msgstr "Farbpuffer muss ein Byte-Array oder ein Array vom Typ 'b' oder 'B' sein"
|
msgstr ""
|
||||||
|
"Farbpuffer muss ein Byte-Array oder ein Array vom Typ 'b' oder 'B' sein"
|
||||||
|
|
||||||
#: shared-bindings/displayio/Palette.c
|
#: shared-bindings/displayio/Palette.c
|
||||||
msgid "color must be between 0x000000 and 0xffffff"
|
msgid "color must be between 0x000000 and 0xffffff"
|
||||||
|
@ -1996,7 +1999,7 @@ msgstr "int() arg 2 muss >= 2 und <= 36 sein"
|
||||||
msgid "integer required"
|
msgid "integer required"
|
||||||
msgstr "integer erforderlich"
|
msgstr "integer erforderlich"
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Peripheral.c shared-bindings/_bleio/Scanner.c
|
#: shared-bindings/_bleio/Adapter.c
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "interval must be in range %s-%s"
|
msgid "interval must be in range %s-%s"
|
||||||
msgstr "Das Intervall muss im Bereich %s-%s sein"
|
msgstr "Das Intervall muss im Bereich %s-%s sein"
|
||||||
|
@ -2179,10 +2182,6 @@ msgstr "muss Schlüsselwortargument für key function verwenden"
|
||||||
msgid "name '%q' is not defined"
|
msgid "name '%q' is not defined"
|
||||||
msgstr "Name '%q' ist nirgends definiert worden (Schreibweise kontrollieren)"
|
msgstr "Name '%q' ist nirgends definiert worden (Schreibweise kontrollieren)"
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Peripheral.c
|
|
||||||
msgid "name must be a string"
|
|
||||||
msgstr "name muss ein String sein"
|
|
||||||
|
|
||||||
#: py/runtime.c
|
#: py/runtime.c
|
||||||
msgid "name not defined"
|
msgid "name not defined"
|
||||||
msgstr "Dieser Name ist nirgends definiert worden (Schreibweise kontrollieren)"
|
msgstr "Dieser Name ist nirgends definiert worden (Schreibweise kontrollieren)"
|
||||||
|
@ -2233,7 +2232,7 @@ msgstr "kein Reset Pin verfügbar"
|
||||||
msgid "no such attribute"
|
msgid "no such attribute"
|
||||||
msgstr "kein solches Attribut"
|
msgstr "kein solches Attribut"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/__init__.c
|
#: ports/nrf/common-hal/_bleio/Connection.c
|
||||||
msgid "non-UUID found in service_uuids_whitelist"
|
msgid "non-UUID found in service_uuids_whitelist"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -2724,7 +2723,7 @@ msgstr "Wert muss in %d Byte(s) passen"
|
||||||
msgid "value_count must be > 0"
|
msgid "value_count must be > 0"
|
||||||
msgstr "value_count muss größer als 0 sein"
|
msgstr "value_count muss größer als 0 sein"
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Scanner.c
|
#: shared-bindings/_bleio/Adapter.c
|
||||||
msgid "window must be <= interval"
|
msgid "window must be <= interval"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -2811,18 +2810,36 @@ msgstr ""
|
||||||
#~ msgid "Error in ffi_prep_cif"
|
#~ msgid "Error in ffi_prep_cif"
|
||||||
#~ msgstr "Fehler in ffi_prep_cif"
|
#~ msgstr "Fehler in ffi_prep_cif"
|
||||||
|
|
||||||
|
#~ msgid "Expected a Peripheral"
|
||||||
|
#~ msgstr "Ein Peripheriegerät wird erwartet"
|
||||||
|
|
||||||
#~ msgid "Failed to acquire mutex"
|
#~ msgid "Failed to acquire mutex"
|
||||||
#~ msgstr "Akquirieren des Mutex gescheitert"
|
#~ msgstr "Akquirieren des Mutex gescheitert"
|
||||||
|
|
||||||
|
#, c-format
|
||||||
|
#~ msgid "Failed to add characteristic, err 0x%04x"
|
||||||
|
#~ msgstr "Hinzufügen des Characteristic ist gescheitert. Status: 0x%04x"
|
||||||
|
|
||||||
#~ msgid "Failed to add service"
|
#~ msgid "Failed to add service"
|
||||||
#~ msgstr "Dienst konnte nicht hinzugefügt werden"
|
#~ msgstr "Dienst konnte nicht hinzugefügt werden"
|
||||||
|
|
||||||
|
#, c-format
|
||||||
|
#~ msgid "Failed to add service, err 0x%04x"
|
||||||
|
#~ msgstr "Dienst konnte nicht hinzugefügt werden. Status: 0x%04x"
|
||||||
|
|
||||||
|
#~ msgid "Failed to change softdevice state"
|
||||||
|
#~ msgstr "Fehler beim Ändern des Softdevice-Status"
|
||||||
|
|
||||||
#~ msgid "Failed to connect:"
|
#~ msgid "Failed to connect:"
|
||||||
#~ msgstr "Verbindung fehlgeschlagen:"
|
#~ msgstr "Verbindung fehlgeschlagen:"
|
||||||
|
|
||||||
#~ msgid "Failed to continue scanning"
|
#~ msgid "Failed to continue scanning"
|
||||||
#~ msgstr "Der Scanvorgang kann nicht fortgesetzt werden"
|
#~ msgstr "Der Scanvorgang kann nicht fortgesetzt werden"
|
||||||
|
|
||||||
|
#, c-format
|
||||||
|
#~ msgid "Failed to continue scanning, err 0x%04x"
|
||||||
|
#~ msgstr "Der Scanvorgang kann nicht fortgesetzt werden. Status: 0x%04x"
|
||||||
|
|
||||||
#~ msgid "Failed to create mutex"
|
#~ msgid "Failed to create mutex"
|
||||||
#~ msgstr "Erstellen des Mutex ist fehlgeschlagen"
|
#~ msgstr "Erstellen des Mutex ist fehlgeschlagen"
|
||||||
|
|
||||||
|
@ -2835,15 +2852,31 @@ msgstr ""
|
||||||
#~ msgid "Failed to release mutex"
|
#~ msgid "Failed to release mutex"
|
||||||
#~ msgstr "Loslassen des Mutex gescheitert"
|
#~ msgstr "Loslassen des Mutex gescheitert"
|
||||||
|
|
||||||
|
#, c-format
|
||||||
|
#~ msgid "Failed to set device name, err 0x%04x"
|
||||||
|
#~ msgstr "Gerätename konnte nicht gesetzt werden, Status: 0x%04x"
|
||||||
|
|
||||||
#~ msgid "Failed to start advertising"
|
#~ msgid "Failed to start advertising"
|
||||||
#~ msgstr "Kann advertisement nicht starten"
|
#~ msgstr "Kann advertisement nicht starten"
|
||||||
|
|
||||||
|
#, c-format
|
||||||
|
#~ msgid "Failed to start advertising, err 0x%04x"
|
||||||
|
#~ msgstr "Kann advertisement nicht starten. Status: 0x%04x"
|
||||||
|
|
||||||
|
#, c-format
|
||||||
|
#~ msgid "Failed to start pairing, error 0x%04x"
|
||||||
|
#~ msgstr "Starten des Koppelns fehlgeschlagen, Status: 0x%04x"
|
||||||
|
|
||||||
#~ msgid "Failed to start scanning"
|
#~ msgid "Failed to start scanning"
|
||||||
#~ msgstr "Der Scanvorgang kann nicht gestartet werden"
|
#~ msgstr "Der Scanvorgang kann nicht gestartet werden"
|
||||||
|
|
||||||
#~ msgid "Failed to stop advertising"
|
#~ msgid "Failed to stop advertising"
|
||||||
#~ msgstr "Kann advertisement nicht stoppen"
|
#~ msgstr "Kann advertisement nicht stoppen"
|
||||||
|
|
||||||
|
#, c-format
|
||||||
|
#~ msgid "Failed to stop advertising, err 0x%04x"
|
||||||
|
#~ msgstr "Kann advertisement nicht stoppen. Status: 0x%04x"
|
||||||
|
|
||||||
#~ msgid "Function requires lock."
|
#~ msgid "Function requires lock."
|
||||||
#~ msgstr ""
|
#~ msgstr ""
|
||||||
#~ "Die Funktion erwartet, dass der 'lock'-Befehl zuvor ausgeführt wurde"
|
#~ "Die Funktion erwartet, dass der 'lock'-Befehl zuvor ausgeführt wurde"
|
||||||
|
@ -2977,6 +3010,9 @@ msgstr ""
|
||||||
#~ msgstr ""
|
#~ msgstr ""
|
||||||
#~ "Speicherallozierung fehlgeschlagen, alloziere %u Bytes für nativen Code"
|
#~ "Speicherallozierung fehlgeschlagen, alloziere %u Bytes für nativen Code"
|
||||||
|
|
||||||
|
#~ msgid "name must be a string"
|
||||||
|
#~ msgstr "name muss ein String sein"
|
||||||
|
|
||||||
#~ msgid "not a valid ADC Channel: %d"
|
#~ msgid "not a valid ADC Channel: %d"
|
||||||
#~ msgstr "Kein gültiger ADC Kanal: %d"
|
#~ msgstr "Kein gültiger ADC Kanal: %d"
|
||||||
|
|
||||||
|
|
109
locale/en_US.po
109
locale/en_US.po
|
@ -7,7 +7,7 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: \n"
|
"Project-Id-Version: \n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2019-09-08 17:30-0500\n"
|
"POT-Creation-Date: 2019-10-21 19:50-0700\n"
|
||||||
"PO-Revision-Date: 2018-07-27 11:55-0700\n"
|
"PO-Revision-Date: 2018-07-27 11:55-0700\n"
|
||||||
"Last-Translator: \n"
|
"Last-Translator: \n"
|
||||||
"Language-Team: \n"
|
"Language-Team: \n"
|
||||||
|
@ -259,6 +259,10 @@ msgstr ""
|
||||||
msgid "All timers in use"
|
msgid "All timers in use"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
|
msgid "Already advertising."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/analogio/AnalogOut.c
|
#: ports/nrf/common-hal/analogio/AnalogOut.c
|
||||||
msgid "AnalogOut functionality not supported"
|
msgid "AnalogOut functionality not supported"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -325,6 +329,11 @@ msgstr ""
|
||||||
msgid "Brightness not adjustable"
|
msgid "Brightness not adjustable"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: shared-bindings/_bleio/UUID.c
|
||||||
|
#, c-format
|
||||||
|
msgid "Buffer + offset too small %d %d %d"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: shared-module/usb_hid/Device.c
|
#: shared-module/usb_hid/Device.c
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Buffer incorrect size. Should be %d bytes."
|
msgid "Buffer incorrect size. Should be %d bytes."
|
||||||
|
@ -455,6 +464,12 @@ msgstr ""
|
||||||
msgid "Command must be an int between 0 and 255"
|
msgid "Command must be an int between 0 and 255"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: shared-bindings/_bleio/Connection.c
|
||||||
|
msgid ""
|
||||||
|
"Connection has been disconnected and can no longer be used. Create a new "
|
||||||
|
"connection."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: py/persistentcode.c
|
#: py/persistentcode.c
|
||||||
msgid "Corrupt .mpy file"
|
msgid "Corrupt .mpy file"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -497,7 +512,7 @@ msgstr ""
|
||||||
msgid "Data chunk must follow fmt chunk"
|
msgid "Data chunk must follow fmt chunk"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
msgid "Data too large for advertisement packet"
|
msgid "Data too large for advertisement packet"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -543,10 +558,6 @@ msgstr ""
|
||||||
msgid "Expected a Characteristic"
|
msgid "Expected a Characteristic"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Service.c
|
|
||||||
msgid "Expected a Peripheral"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Characteristic.c
|
#: shared-bindings/_bleio/Characteristic.c
|
||||||
msgid "Expected a Service"
|
msgid "Expected a Service"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -556,7 +567,7 @@ msgstr ""
|
||||||
msgid "Expected a UUID"
|
msgid "Expected a UUID"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Central.c
|
#: shared-bindings/_bleio/Adapter.c
|
||||||
msgid "Expected an Address"
|
msgid "Expected an Address"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -565,6 +576,11 @@ msgstr ""
|
||||||
msgid "Expected tuple of length %d, got %d"
|
msgid "Expected tuple of length %d, got %d"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: ports/nrf/common-hal/_bleio/__init__.c
|
||||||
|
#, c-format
|
||||||
|
msgid "Failed initiate attribute read, err 0x%04x"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: shared-bindings/ps2io/Ps2.c
|
#: shared-bindings/ps2io/Ps2.c
|
||||||
msgid "Failed sending command."
|
msgid "Failed sending command."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -575,8 +591,7 @@ msgid "Failed to acquire mutex, err 0x%04x"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Service.c
|
#: ports/nrf/common-hal/_bleio/Service.c
|
||||||
#, c-format
|
msgid "Failed to add characteristic, NRF_ERROR_%q"
|
||||||
msgid "Failed to add characteristic, err 0x%04x"
|
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Characteristic.c
|
#: ports/nrf/common-hal/_bleio/Characteristic.c
|
||||||
|
@ -584,11 +599,6 @@ msgstr ""
|
||||||
msgid "Failed to add descriptor, err 0x%04x"
|
msgid "Failed to add descriptor, err 0x%04x"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
|
||||||
#, c-format
|
|
||||||
msgid "Failed to add service, err 0x%04x"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: ports/atmel-samd/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
|
#: ports/atmel-samd/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
|
||||||
msgid "Failed to allocate RX buffer"
|
msgid "Failed to allocate RX buffer"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -600,24 +610,22 @@ msgid "Failed to allocate RX buffer of %d bytes"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Adapter.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
msgid "Failed to change softdevice state"
|
msgid "Failed to change softdevice state, NRF_ERROR_%q"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
#, c-format
|
msgid "Failed to connect: internal error"
|
||||||
msgid "Failed to configure advertising, err 0x%04x"
|
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Central.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
msgid "Failed to connect: timeout"
|
msgid "Failed to connect: timeout"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Scanner.c
|
#: ports/nrf/common-hal/_bleio/Service.c
|
||||||
#, c-format
|
msgid "Failed to create service, NRF_ERROR_%q"
|
||||||
msgid "Failed to continue scanning, err 0x%04x"
|
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/__init__.c
|
#: ports/nrf/common-hal/_bleio/Connection.c
|
||||||
msgid "Failed to discover services"
|
msgid "Failed to discover services"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -634,7 +642,7 @@ msgstr ""
|
||||||
msgid "Failed to notify or indicate attribute value, err 0x%04x"
|
msgid "Failed to notify or indicate attribute value, err 0x%04x"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Connection.c
|
||||||
msgid "Failed to pair"
|
msgid "Failed to pair"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -643,8 +651,7 @@ msgstr ""
|
||||||
msgid "Failed to read CCCD value, err 0x%04x"
|
msgid "Failed to read CCCD value, err 0x%04x"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Characteristic.c
|
#: ports/nrf/common-hal/_bleio/__init__.c
|
||||||
#: ports/nrf/common-hal/_bleio/Descriptor.c
|
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to read attribute value, err 0x%04x"
|
msgid "Failed to read attribute value, err 0x%04x"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -664,34 +671,26 @@ msgstr ""
|
||||||
msgid "Failed to release mutex, err 0x%04x"
|
msgid "Failed to release mutex, err 0x%04x"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
#, c-format
|
msgid "Failed to start advertising, NRF_ERROR_%q"
|
||||||
msgid "Failed to set device name, err 0x%04x"
|
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
#, c-format
|
|
||||||
msgid "Failed to start advertising, err 0x%04x"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Central.c
|
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to start connecting, error 0x%04x"
|
msgid "Failed to start connecting, error 0x%04x"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Connection.c
|
||||||
#, c-format
|
msgid "Failed to start pairing, NRF_ERROR_%q"
|
||||||
msgid "Failed to start pairing, error 0x%04x"
|
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Scanner.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to start scanning, err 0x%04x"
|
msgid "Failed to start scanning, err 0x%04x"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
#, c-format
|
msgid "Failed to stop advertising, NRF_ERROR_%q"
|
||||||
msgid "Failed to stop advertising, err 0x%04x"
|
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Characteristic.c
|
#: ports/nrf/common-hal/_bleio/Characteristic.c
|
||||||
|
@ -989,9 +988,8 @@ msgstr ""
|
||||||
msgid "No such file/directory"
|
msgid "No such file/directory"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/__init__.c shared-bindings/_bleio/Central.c
|
#: ports/nrf/common-hal/_bleio/__init__.c
|
||||||
#: shared-bindings/_bleio/CharacteristicBuffer.c
|
#: shared-bindings/_bleio/CharacteristicBuffer.c
|
||||||
#: shared-bindings/_bleio/Peripheral.c
|
|
||||||
msgid "Not connected"
|
msgid "Not connected"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -1065,6 +1063,10 @@ msgstr ""
|
||||||
msgid "Pop from an empty Ps2 buffer"
|
msgid "Pop from an empty Ps2 buffer"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: shared-bindings/_bleio/Adapter.c
|
||||||
|
msgid "Prefix buffer must be on the heap"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: main.c
|
#: main.c
|
||||||
msgid "Press any key to enter the REPL. Use CTRL-D to reload."
|
msgid "Press any key to enter the REPL. Use CTRL-D to reload."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -1131,6 +1133,10 @@ msgstr ""
|
||||||
msgid "Sample rate too high. It must be less than %d"
|
msgid "Sample rate too high. It must be less than %d"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
|
msgid "Scan already in progess. Stop with stop_scan."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
|
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
|
||||||
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c
|
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c
|
||||||
msgid "Serializer in use"
|
msgid "Serializer in use"
|
||||||
|
@ -1145,11 +1151,6 @@ msgstr ""
|
||||||
msgid "Slices not supported"
|
msgid "Slices not supported"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Adapter.c
|
|
||||||
#, c-format
|
|
||||||
msgid "Soft device assert, id: 0x%08lX, pc: 0x%08lX"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: extmod/modure.c
|
#: extmod/modure.c
|
||||||
msgid "Splitting with sub-captures"
|
msgid "Splitting with sub-captures"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -1950,7 +1951,7 @@ msgstr ""
|
||||||
msgid "integer required"
|
msgid "integer required"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Peripheral.c shared-bindings/_bleio/Scanner.c
|
#: shared-bindings/_bleio/Adapter.c
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "interval must be in range %s-%s"
|
msgid "interval must be in range %s-%s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -2127,10 +2128,6 @@ msgstr ""
|
||||||
msgid "name '%q' is not defined"
|
msgid "name '%q' is not defined"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Peripheral.c
|
|
||||||
msgid "name must be a string"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: py/runtime.c
|
#: py/runtime.c
|
||||||
msgid "name not defined"
|
msgid "name not defined"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -2181,7 +2178,7 @@ msgstr ""
|
||||||
msgid "no such attribute"
|
msgid "no such attribute"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/__init__.c
|
#: ports/nrf/common-hal/_bleio/Connection.c
|
||||||
msgid "non-UUID found in service_uuids_whitelist"
|
msgid "non-UUID found in service_uuids_whitelist"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -2663,7 +2660,7 @@ msgstr ""
|
||||||
msgid "value_count must be > 0"
|
msgid "value_count must be > 0"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Scanner.c
|
#: shared-bindings/_bleio/Adapter.c
|
||||||
msgid "window must be <= interval"
|
msgid "window must be <= interval"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,7 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: \n"
|
"Project-Id-Version: \n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2019-09-08 17:30-0500\n"
|
"POT-Creation-Date: 2019-10-21 19:50-0700\n"
|
||||||
"PO-Revision-Date: 2018-07-27 11:55-0700\n"
|
"PO-Revision-Date: 2018-07-27 11:55-0700\n"
|
||||||
"Last-Translator: \n"
|
"Last-Translator: \n"
|
||||||
"Language-Team: @sommersoft, @MrCertainly\n"
|
"Language-Team: @sommersoft, @MrCertainly\n"
|
||||||
|
@ -261,6 +261,10 @@ msgstr ""
|
||||||
msgid "All timers in use"
|
msgid "All timers in use"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
|
msgid "Already advertising."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/analogio/AnalogOut.c
|
#: ports/nrf/common-hal/analogio/AnalogOut.c
|
||||||
msgid "AnalogOut functionality not supported"
|
msgid "AnalogOut functionality not supported"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -329,6 +333,11 @@ msgstr ""
|
||||||
msgid "Brightness not adjustable"
|
msgid "Brightness not adjustable"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: shared-bindings/_bleio/UUID.c
|
||||||
|
#, c-format
|
||||||
|
msgid "Buffer + offset too small %d %d %d"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: shared-module/usb_hid/Device.c
|
#: shared-module/usb_hid/Device.c
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Buffer incorrect size. Should be %d bytes."
|
msgid "Buffer incorrect size. Should be %d bytes."
|
||||||
|
@ -459,6 +468,12 @@ msgstr ""
|
||||||
msgid "Command must be an int between 0 and 255"
|
msgid "Command must be an int between 0 and 255"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: shared-bindings/_bleio/Connection.c
|
||||||
|
msgid ""
|
||||||
|
"Connection has been disconnected and can no longer be used. Create a new "
|
||||||
|
"connection."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: py/persistentcode.c
|
#: py/persistentcode.c
|
||||||
msgid "Corrupt .mpy file"
|
msgid "Corrupt .mpy file"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -501,7 +516,7 @@ msgstr ""
|
||||||
msgid "Data chunk must follow fmt chunk"
|
msgid "Data chunk must follow fmt chunk"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
msgid "Data too large for advertisement packet"
|
msgid "Data too large for advertisement packet"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -547,10 +562,6 @@ msgstr ""
|
||||||
msgid "Expected a Characteristic"
|
msgid "Expected a Characteristic"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Service.c
|
|
||||||
msgid "Expected a Peripheral"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Characteristic.c
|
#: shared-bindings/_bleio/Characteristic.c
|
||||||
msgid "Expected a Service"
|
msgid "Expected a Service"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -560,7 +571,7 @@ msgstr ""
|
||||||
msgid "Expected a UUID"
|
msgid "Expected a UUID"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Central.c
|
#: shared-bindings/_bleio/Adapter.c
|
||||||
msgid "Expected an Address"
|
msgid "Expected an Address"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -569,6 +580,11 @@ msgstr ""
|
||||||
msgid "Expected tuple of length %d, got %d"
|
msgid "Expected tuple of length %d, got %d"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: ports/nrf/common-hal/_bleio/__init__.c
|
||||||
|
#, c-format
|
||||||
|
msgid "Failed initiate attribute read, err 0x%04x"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: shared-bindings/ps2io/Ps2.c
|
#: shared-bindings/ps2io/Ps2.c
|
||||||
msgid "Failed sending command."
|
msgid "Failed sending command."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -579,8 +595,7 @@ msgid "Failed to acquire mutex, err 0x%04x"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Service.c
|
#: ports/nrf/common-hal/_bleio/Service.c
|
||||||
#, c-format
|
msgid "Failed to add characteristic, NRF_ERROR_%q"
|
||||||
msgid "Failed to add characteristic, err 0x%04x"
|
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Characteristic.c
|
#: ports/nrf/common-hal/_bleio/Characteristic.c
|
||||||
|
@ -588,11 +603,6 @@ msgstr ""
|
||||||
msgid "Failed to add descriptor, err 0x%04x"
|
msgid "Failed to add descriptor, err 0x%04x"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
|
||||||
#, c-format
|
|
||||||
msgid "Failed to add service, err 0x%04x"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: ports/atmel-samd/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
|
#: ports/atmel-samd/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
|
||||||
msgid "Failed to allocate RX buffer"
|
msgid "Failed to allocate RX buffer"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -604,24 +614,22 @@ msgid "Failed to allocate RX buffer of %d bytes"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Adapter.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
msgid "Failed to change softdevice state"
|
msgid "Failed to change softdevice state, NRF_ERROR_%q"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
#, c-format
|
msgid "Failed to connect: internal error"
|
||||||
msgid "Failed to configure advertising, err 0x%04x"
|
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Central.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
msgid "Failed to connect: timeout"
|
msgid "Failed to connect: timeout"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Scanner.c
|
#: ports/nrf/common-hal/_bleio/Service.c
|
||||||
#, c-format
|
msgid "Failed to create service, NRF_ERROR_%q"
|
||||||
msgid "Failed to continue scanning, err 0x%04x"
|
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/__init__.c
|
#: ports/nrf/common-hal/_bleio/Connection.c
|
||||||
msgid "Failed to discover services"
|
msgid "Failed to discover services"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -638,7 +646,7 @@ msgstr ""
|
||||||
msgid "Failed to notify or indicate attribute value, err 0x%04x"
|
msgid "Failed to notify or indicate attribute value, err 0x%04x"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Connection.c
|
||||||
msgid "Failed to pair"
|
msgid "Failed to pair"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -647,8 +655,7 @@ msgstr ""
|
||||||
msgid "Failed to read CCCD value, err 0x%04x"
|
msgid "Failed to read CCCD value, err 0x%04x"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Characteristic.c
|
#: ports/nrf/common-hal/_bleio/__init__.c
|
||||||
#: ports/nrf/common-hal/_bleio/Descriptor.c
|
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to read attribute value, err 0x%04x"
|
msgid "Failed to read attribute value, err 0x%04x"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -668,34 +675,26 @@ msgstr ""
|
||||||
msgid "Failed to release mutex, err 0x%04x"
|
msgid "Failed to release mutex, err 0x%04x"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
#, c-format
|
msgid "Failed to start advertising, NRF_ERROR_%q"
|
||||||
msgid "Failed to set device name, err 0x%04x"
|
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
#, c-format
|
|
||||||
msgid "Failed to start advertising, err 0x%04x"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Central.c
|
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to start connecting, error 0x%04x"
|
msgid "Failed to start connecting, error 0x%04x"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Connection.c
|
||||||
#, c-format
|
msgid "Failed to start pairing, NRF_ERROR_%q"
|
||||||
msgid "Failed to start pairing, error 0x%04x"
|
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Scanner.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to start scanning, err 0x%04x"
|
msgid "Failed to start scanning, err 0x%04x"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
#, c-format
|
msgid "Failed to stop advertising, NRF_ERROR_%q"
|
||||||
msgid "Failed to stop advertising, err 0x%04x"
|
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Characteristic.c
|
#: ports/nrf/common-hal/_bleio/Characteristic.c
|
||||||
|
@ -993,9 +992,8 @@ msgstr ""
|
||||||
msgid "No such file/directory"
|
msgid "No such file/directory"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/__init__.c shared-bindings/_bleio/Central.c
|
#: ports/nrf/common-hal/_bleio/__init__.c
|
||||||
#: shared-bindings/_bleio/CharacteristicBuffer.c
|
#: shared-bindings/_bleio/CharacteristicBuffer.c
|
||||||
#: shared-bindings/_bleio/Peripheral.c
|
|
||||||
msgid "Not connected"
|
msgid "Not connected"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -1069,6 +1067,10 @@ msgstr ""
|
||||||
msgid "Pop from an empty Ps2 buffer"
|
msgid "Pop from an empty Ps2 buffer"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: shared-bindings/_bleio/Adapter.c
|
||||||
|
msgid "Prefix buffer must be on the heap"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: main.c
|
#: main.c
|
||||||
msgid "Press any key to enter the REPL. Use CTRL-D to reload."
|
msgid "Press any key to enter the REPL. Use CTRL-D to reload."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -1135,6 +1137,10 @@ msgstr ""
|
||||||
msgid "Sample rate too high. It must be less than %d"
|
msgid "Sample rate too high. It must be less than %d"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
|
msgid "Scan already in progess. Stop with stop_scan."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
|
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
|
||||||
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c
|
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c
|
||||||
msgid "Serializer in use"
|
msgid "Serializer in use"
|
||||||
|
@ -1149,11 +1155,6 @@ msgstr ""
|
||||||
msgid "Slices not supported"
|
msgid "Slices not supported"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Adapter.c
|
|
||||||
#, c-format
|
|
||||||
msgid "Soft device assert, id: 0x%08lX, pc: 0x%08lX"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: extmod/modure.c
|
#: extmod/modure.c
|
||||||
msgid "Splitting with sub-captures"
|
msgid "Splitting with sub-captures"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -1954,7 +1955,7 @@ msgstr ""
|
||||||
msgid "integer required"
|
msgid "integer required"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Peripheral.c shared-bindings/_bleio/Scanner.c
|
#: shared-bindings/_bleio/Adapter.c
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "interval must be in range %s-%s"
|
msgid "interval must be in range %s-%s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -2131,10 +2132,6 @@ msgstr ""
|
||||||
msgid "name '%q' is not defined"
|
msgid "name '%q' is not defined"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Peripheral.c
|
|
||||||
msgid "name must be a string"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: py/runtime.c
|
#: py/runtime.c
|
||||||
msgid "name not defined"
|
msgid "name not defined"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -2185,7 +2182,7 @@ msgstr ""
|
||||||
msgid "no such attribute"
|
msgid "no such attribute"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/__init__.c
|
#: ports/nrf/common-hal/_bleio/Connection.c
|
||||||
msgid "non-UUID found in service_uuids_whitelist"
|
msgid "non-UUID found in service_uuids_whitelist"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -2667,7 +2664,7 @@ msgstr ""
|
||||||
msgid "value_count must be > 0"
|
msgid "value_count must be > 0"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Scanner.c
|
#: shared-bindings/_bleio/Adapter.c
|
||||||
msgid "window must be <= interval"
|
msgid "window must be <= interval"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
149
locale/es.po
149
locale/es.po
|
@ -7,7 +7,7 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: \n"
|
"Project-Id-Version: \n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2019-09-08 17:30-0500\n"
|
"POT-Creation-Date: 2019-10-21 19:50-0700\n"
|
||||||
"PO-Revision-Date: 2018-08-24 22:56-0500\n"
|
"PO-Revision-Date: 2018-08-24 22:56-0500\n"
|
||||||
"Last-Translator: \n"
|
"Last-Translator: \n"
|
||||||
"Language-Team: \n"
|
"Language-Team: \n"
|
||||||
|
@ -263,6 +263,10 @@ msgstr "Todos los timers para este pin están siendo utilizados"
|
||||||
msgid "All timers in use"
|
msgid "All timers in use"
|
||||||
msgstr "Todos los timers en uso"
|
msgstr "Todos los timers en uso"
|
||||||
|
|
||||||
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
|
msgid "Already advertising."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/analogio/AnalogOut.c
|
#: ports/nrf/common-hal/analogio/AnalogOut.c
|
||||||
msgid "AnalogOut functionality not supported"
|
msgid "AnalogOut functionality not supported"
|
||||||
msgstr "Funcionalidad AnalogOut no soportada"
|
msgstr "Funcionalidad AnalogOut no soportada"
|
||||||
|
@ -333,6 +337,11 @@ msgstr "El brillo debe estar entro 0 y 255"
|
||||||
msgid "Brightness not adjustable"
|
msgid "Brightness not adjustable"
|
||||||
msgstr "El brillo no se puede ajustar"
|
msgstr "El brillo no se puede ajustar"
|
||||||
|
|
||||||
|
#: shared-bindings/_bleio/UUID.c
|
||||||
|
#, c-format
|
||||||
|
msgid "Buffer + offset too small %d %d %d"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: shared-module/usb_hid/Device.c
|
#: shared-module/usb_hid/Device.c
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Buffer incorrect size. Should be %d bytes."
|
msgid "Buffer incorrect size. Should be %d bytes."
|
||||||
|
@ -463,6 +472,12 @@ msgstr ""
|
||||||
msgid "Command must be an int between 0 and 255"
|
msgid "Command must be an int between 0 and 255"
|
||||||
msgstr "Command debe estar entre 0 y 255."
|
msgstr "Command debe estar entre 0 y 255."
|
||||||
|
|
||||||
|
#: shared-bindings/_bleio/Connection.c
|
||||||
|
msgid ""
|
||||||
|
"Connection has been disconnected and can no longer be used. Create a new "
|
||||||
|
"connection."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: py/persistentcode.c
|
#: py/persistentcode.c
|
||||||
msgid "Corrupt .mpy file"
|
msgid "Corrupt .mpy file"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -505,7 +520,7 @@ msgstr "El pin Data 0 debe estar alineado a bytes"
|
||||||
msgid "Data chunk must follow fmt chunk"
|
msgid "Data chunk must follow fmt chunk"
|
||||||
msgstr "Trozo de datos debe seguir fmt chunk"
|
msgstr "Trozo de datos debe seguir fmt chunk"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
msgid "Data too large for advertisement packet"
|
msgid "Data too large for advertisement packet"
|
||||||
msgstr "Data es muy grande para el paquete de advertisement."
|
msgstr "Data es muy grande para el paquete de advertisement."
|
||||||
|
|
||||||
|
@ -551,10 +566,6 @@ msgstr "Se espera un %q"
|
||||||
msgid "Expected a Characteristic"
|
msgid "Expected a Characteristic"
|
||||||
msgstr "Se esperaba una Característica."
|
msgstr "Se esperaba una Característica."
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Service.c
|
|
||||||
msgid "Expected a Peripheral"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Characteristic.c
|
#: shared-bindings/_bleio/Characteristic.c
|
||||||
msgid "Expected a Service"
|
msgid "Expected a Service"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -564,7 +575,7 @@ msgstr ""
|
||||||
msgid "Expected a UUID"
|
msgid "Expected a UUID"
|
||||||
msgstr "Se esperaba un UUID"
|
msgstr "Se esperaba un UUID"
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Central.c
|
#: shared-bindings/_bleio/Adapter.c
|
||||||
msgid "Expected an Address"
|
msgid "Expected an Address"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -573,6 +584,11 @@ msgstr ""
|
||||||
msgid "Expected tuple of length %d, got %d"
|
msgid "Expected tuple of length %d, got %d"
|
||||||
msgstr "Se esperaba un tuple de %d, se obtuvo %d"
|
msgstr "Se esperaba un tuple de %d, se obtuvo %d"
|
||||||
|
|
||||||
|
#: ports/nrf/common-hal/_bleio/__init__.c
|
||||||
|
#, c-format
|
||||||
|
msgid "Failed initiate attribute read, err 0x%04x"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: shared-bindings/ps2io/Ps2.c
|
#: shared-bindings/ps2io/Ps2.c
|
||||||
msgid "Failed sending command."
|
msgid "Failed sending command."
|
||||||
msgstr "Fallo enviando comando"
|
msgstr "Fallo enviando comando"
|
||||||
|
@ -583,20 +599,14 @@ msgid "Failed to acquire mutex, err 0x%04x"
|
||||||
msgstr "No se puede adquirir el mutex, status: 0x%08lX"
|
msgstr "No se puede adquirir el mutex, status: 0x%08lX"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Service.c
|
#: ports/nrf/common-hal/_bleio/Service.c
|
||||||
#, fuzzy, c-format
|
msgid "Failed to add characteristic, NRF_ERROR_%q"
|
||||||
msgid "Failed to add characteristic, err 0x%04x"
|
msgstr ""
|
||||||
msgstr "Fallo al añadir caracteristica, err: 0x%08lX"
|
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Characteristic.c
|
#: ports/nrf/common-hal/_bleio/Characteristic.c
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to add descriptor, err 0x%04x"
|
msgid "Failed to add descriptor, err 0x%04x"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
|
||||||
#, c-format
|
|
||||||
msgid "Failed to add service, err 0x%04x"
|
|
||||||
msgstr "Fallo al agregar servicio. err: 0x%02x"
|
|
||||||
|
|
||||||
#: ports/atmel-samd/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
|
#: ports/atmel-samd/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
|
||||||
msgid "Failed to allocate RX buffer"
|
msgid "Failed to allocate RX buffer"
|
||||||
msgstr "Ha fallado la asignación del buffer RX"
|
msgstr "Ha fallado la asignación del buffer RX"
|
||||||
|
@ -608,24 +618,22 @@ msgid "Failed to allocate RX buffer of %d bytes"
|
||||||
msgstr "Falló la asignación del buffer RX de %d bytes"
|
msgstr "Falló la asignación del buffer RX de %d bytes"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Adapter.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
msgid "Failed to change softdevice state"
|
msgid "Failed to change softdevice state, NRF_ERROR_%q"
|
||||||
msgstr "No se puede cambiar el estado del softdevice"
|
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
|
||||||
#, c-format
|
|
||||||
msgid "Failed to configure advertising, err 0x%04x"
|
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Central.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
|
msgid "Failed to connect: internal error"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
msgid "Failed to connect: timeout"
|
msgid "Failed to connect: timeout"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Scanner.c
|
#: ports/nrf/common-hal/_bleio/Service.c
|
||||||
#, c-format
|
msgid "Failed to create service, NRF_ERROR_%q"
|
||||||
msgid "Failed to continue scanning, err 0x%04x"
|
msgstr ""
|
||||||
msgstr "No se puede iniciar el escaneo. err: 0x%02x"
|
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/__init__.c
|
#: ports/nrf/common-hal/_bleio/Connection.c
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgid "Failed to discover services"
|
msgid "Failed to discover services"
|
||||||
msgstr "No se puede descubrir servicios"
|
msgstr "No se puede descubrir servicios"
|
||||||
|
@ -643,7 +651,7 @@ msgstr "No se puede obtener el estado del softdevice"
|
||||||
msgid "Failed to notify or indicate attribute value, err 0x%04x"
|
msgid "Failed to notify or indicate attribute value, err 0x%04x"
|
||||||
msgstr "Error al notificar o indicar el valor del atributo, err 0x%04x"
|
msgstr "Error al notificar o indicar el valor del atributo, err 0x%04x"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Connection.c
|
||||||
msgid "Failed to pair"
|
msgid "Failed to pair"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -652,8 +660,7 @@ msgstr ""
|
||||||
msgid "Failed to read CCCD value, err 0x%04x"
|
msgid "Failed to read CCCD value, err 0x%04x"
|
||||||
msgstr "No se puede leer el valor del atributo. err 0x%02x"
|
msgstr "No se puede leer el valor del atributo. err 0x%02x"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Characteristic.c
|
#: ports/nrf/common-hal/_bleio/__init__.c
|
||||||
#: ports/nrf/common-hal/_bleio/Descriptor.c
|
|
||||||
#, fuzzy, c-format
|
#, fuzzy, c-format
|
||||||
msgid "Failed to read attribute value, err 0x%04x"
|
msgid "Failed to read attribute value, err 0x%04x"
|
||||||
msgstr "Error al leer valor del atributo, err 0x%04"
|
msgstr "Error al leer valor del atributo, err 0x%04"
|
||||||
|
@ -673,35 +680,27 @@ msgstr "Fallo al registrar el Vendor-Specific UUID, err 0x%04x"
|
||||||
msgid "Failed to release mutex, err 0x%04x"
|
msgid "Failed to release mutex, err 0x%04x"
|
||||||
msgstr "No se puede liberar el mutex, err 0x%04x"
|
msgstr "No se puede liberar el mutex, err 0x%04x"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
#, c-format
|
msgid "Failed to start advertising, NRF_ERROR_%q"
|
||||||
msgid "Failed to set device name, err 0x%04x"
|
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
#, c-format
|
|
||||||
msgid "Failed to start advertising, err 0x%04x"
|
|
||||||
msgstr "No se puede inicar el anuncio. err: 0x%04x"
|
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Central.c
|
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to start connecting, error 0x%04x"
|
msgid "Failed to start connecting, error 0x%04x"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Connection.c
|
||||||
#, c-format
|
msgid "Failed to start pairing, NRF_ERROR_%q"
|
||||||
msgid "Failed to start pairing, error 0x%04x"
|
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Scanner.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to start scanning, err 0x%04x"
|
msgid "Failed to start scanning, err 0x%04x"
|
||||||
msgstr "No se puede iniciar el escaneo. err 0x%04x"
|
msgstr "No se puede iniciar el escaneo. err 0x%04x"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
#, c-format
|
msgid "Failed to stop advertising, NRF_ERROR_%q"
|
||||||
msgid "Failed to stop advertising, err 0x%04x"
|
msgstr ""
|
||||||
msgstr "No se puede detener el anuncio. err: 0x%04x"
|
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Characteristic.c
|
#: ports/nrf/common-hal/_bleio/Characteristic.c
|
||||||
#, c-format
|
#, c-format
|
||||||
|
@ -1004,9 +1003,8 @@ msgstr "No queda espacio en el dispositivo"
|
||||||
msgid "No such file/directory"
|
msgid "No such file/directory"
|
||||||
msgstr "No existe el archivo/directorio"
|
msgstr "No existe el archivo/directorio"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/__init__.c shared-bindings/_bleio/Central.c
|
#: ports/nrf/common-hal/_bleio/__init__.c
|
||||||
#: shared-bindings/_bleio/CharacteristicBuffer.c
|
#: shared-bindings/_bleio/CharacteristicBuffer.c
|
||||||
#: shared-bindings/_bleio/Peripheral.c
|
|
||||||
msgid "Not connected"
|
msgid "Not connected"
|
||||||
msgstr "No conectado"
|
msgstr "No conectado"
|
||||||
|
|
||||||
|
@ -1088,6 +1086,10 @@ msgstr "Incapaz de montar de nuevo el sistema de archivos"
|
||||||
msgid "Pop from an empty Ps2 buffer"
|
msgid "Pop from an empty Ps2 buffer"
|
||||||
msgstr "Pop de un buffer Ps2 vacio"
|
msgstr "Pop de un buffer Ps2 vacio"
|
||||||
|
|
||||||
|
#: shared-bindings/_bleio/Adapter.c
|
||||||
|
msgid "Prefix buffer must be on the heap"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: main.c
|
#: main.c
|
||||||
msgid "Press any key to enter the REPL. Use CTRL-D to reload."
|
msgid "Press any key to enter the REPL. Use CTRL-D to reload."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -1157,6 +1159,10 @@ msgstr "Sample rate debe ser positivo"
|
||||||
msgid "Sample rate too high. It must be less than %d"
|
msgid "Sample rate too high. It must be less than %d"
|
||||||
msgstr "Frecuencia de muestreo demasiado alta. Debe ser menor a %d"
|
msgstr "Frecuencia de muestreo demasiado alta. Debe ser menor a %d"
|
||||||
|
|
||||||
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
|
msgid "Scan already in progess. Stop with stop_scan."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
|
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
|
||||||
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c
|
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c
|
||||||
msgid "Serializer in use"
|
msgid "Serializer in use"
|
||||||
|
@ -1171,11 +1177,6 @@ msgstr "Slice y value tienen diferentes longitudes"
|
||||||
msgid "Slices not supported"
|
msgid "Slices not supported"
|
||||||
msgstr "Rebanadas no soportadas"
|
msgstr "Rebanadas no soportadas"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Adapter.c
|
|
||||||
#, c-format
|
|
||||||
msgid "Soft device assert, id: 0x%08lX, pc: 0x%08lX"
|
|
||||||
msgstr "Soft device assert, id: 0x%08lX, pc: 0x%08lX"
|
|
||||||
|
|
||||||
#: extmod/modure.c
|
#: extmod/modure.c
|
||||||
msgid "Splitting with sub-captures"
|
msgid "Splitting with sub-captures"
|
||||||
msgstr "Dividiendo con sub-capturas"
|
msgstr "Dividiendo con sub-capturas"
|
||||||
|
@ -2004,7 +2005,7 @@ msgstr "int() arg 2 debe ser >= 2 y <= 36"
|
||||||
msgid "integer required"
|
msgid "integer required"
|
||||||
msgstr "Entero requerido"
|
msgstr "Entero requerido"
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Peripheral.c shared-bindings/_bleio/Scanner.c
|
#: shared-bindings/_bleio/Adapter.c
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "interval must be in range %s-%s"
|
msgid "interval must be in range %s-%s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -2184,10 +2185,6 @@ msgstr "debe utilizar argumento de palabra clave para la función clave"
|
||||||
msgid "name '%q' is not defined"
|
msgid "name '%q' is not defined"
|
||||||
msgstr "name '%q' no esta definido"
|
msgstr "name '%q' no esta definido"
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Peripheral.c
|
|
||||||
msgid "name must be a string"
|
|
||||||
msgstr "name debe de ser un string"
|
|
||||||
|
|
||||||
#: py/runtime.c
|
#: py/runtime.c
|
||||||
msgid "name not defined"
|
msgid "name not defined"
|
||||||
msgstr "name no definido"
|
msgstr "name no definido"
|
||||||
|
@ -2238,7 +2235,7 @@ msgstr ""
|
||||||
msgid "no such attribute"
|
msgid "no such attribute"
|
||||||
msgstr "no hay tal atributo"
|
msgstr "no hay tal atributo"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/__init__.c
|
#: ports/nrf/common-hal/_bleio/Connection.c
|
||||||
msgid "non-UUID found in service_uuids_whitelist"
|
msgid "non-UUID found in service_uuids_whitelist"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -2728,7 +2725,7 @@ msgstr ""
|
||||||
msgid "value_count must be > 0"
|
msgid "value_count must be > 0"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Scanner.c
|
#: shared-bindings/_bleio/Adapter.c
|
||||||
msgid "window must be <= interval"
|
msgid "window must be <= interval"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -2818,10 +2815,21 @@ msgstr "paso cero"
|
||||||
#~ msgid "Failed to acquire mutex"
|
#~ msgid "Failed to acquire mutex"
|
||||||
#~ msgstr "No se puede adquirir el mutex, status: 0x%08lX"
|
#~ msgstr "No se puede adquirir el mutex, status: 0x%08lX"
|
||||||
|
|
||||||
|
#, fuzzy, c-format
|
||||||
|
#~ msgid "Failed to add characteristic, err 0x%04x"
|
||||||
|
#~ msgstr "Fallo al añadir caracteristica, err: 0x%08lX"
|
||||||
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#~ msgid "Failed to add service"
|
#~ msgid "Failed to add service"
|
||||||
#~ msgstr "No se puede detener el anuncio. status: 0x%02x"
|
#~ msgstr "No se puede detener el anuncio. status: 0x%02x"
|
||||||
|
|
||||||
|
#, c-format
|
||||||
|
#~ msgid "Failed to add service, err 0x%04x"
|
||||||
|
#~ msgstr "Fallo al agregar servicio. err: 0x%02x"
|
||||||
|
|
||||||
|
#~ msgid "Failed to change softdevice state"
|
||||||
|
#~ msgstr "No se puede cambiar el estado del softdevice"
|
||||||
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#~ msgid "Failed to connect:"
|
#~ msgid "Failed to connect:"
|
||||||
#~ msgstr "No se puede conectar. status: 0x%02x"
|
#~ msgstr "No se puede conectar. status: 0x%02x"
|
||||||
|
@ -2830,6 +2838,10 @@ msgstr "paso cero"
|
||||||
#~ msgid "Failed to continue scanning"
|
#~ msgid "Failed to continue scanning"
|
||||||
#~ msgstr "No se puede iniciar el escaneo. status: 0x%02x"
|
#~ msgstr "No se puede iniciar el escaneo. status: 0x%02x"
|
||||||
|
|
||||||
|
#, c-format
|
||||||
|
#~ msgid "Failed to continue scanning, err 0x%04x"
|
||||||
|
#~ msgstr "No se puede iniciar el escaneo. err: 0x%02x"
|
||||||
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#~ msgid "Failed to create mutex"
|
#~ msgid "Failed to create mutex"
|
||||||
#~ msgstr "No se puede leer el valor del atributo. status 0x%02x"
|
#~ msgstr "No se puede leer el valor del atributo. status 0x%02x"
|
||||||
|
@ -2850,6 +2862,10 @@ msgstr "paso cero"
|
||||||
#~ msgid "Failed to start advertising"
|
#~ msgid "Failed to start advertising"
|
||||||
#~ msgstr "No se puede inicar el anuncio. status: 0x%02x"
|
#~ msgstr "No se puede inicar el anuncio. status: 0x%02x"
|
||||||
|
|
||||||
|
#, c-format
|
||||||
|
#~ msgid "Failed to start advertising, err 0x%04x"
|
||||||
|
#~ msgstr "No se puede inicar el anuncio. err: 0x%04x"
|
||||||
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#~ msgid "Failed to start scanning"
|
#~ msgid "Failed to start scanning"
|
||||||
#~ msgstr "No se puede iniciar el escaneo. status: 0x%02x"
|
#~ msgstr "No se puede iniciar el escaneo. status: 0x%02x"
|
||||||
|
@ -2858,6 +2874,10 @@ msgstr "paso cero"
|
||||||
#~ msgid "Failed to stop advertising"
|
#~ msgid "Failed to stop advertising"
|
||||||
#~ msgstr "No se puede detener el anuncio. status: 0x%02x"
|
#~ msgstr "No se puede detener el anuncio. status: 0x%02x"
|
||||||
|
|
||||||
|
#, c-format
|
||||||
|
#~ msgid "Failed to stop advertising, err 0x%04x"
|
||||||
|
#~ msgstr "No se puede detener el anuncio. err: 0x%04x"
|
||||||
|
|
||||||
#~ msgid "Function requires lock."
|
#~ msgid "Function requires lock."
|
||||||
#~ msgstr "La función requiere lock"
|
#~ msgstr "La función requiere lock"
|
||||||
|
|
||||||
|
@ -2932,6 +2952,10 @@ msgstr "paso cero"
|
||||||
#~ msgid "STA required"
|
#~ msgid "STA required"
|
||||||
#~ msgstr "STA requerido"
|
#~ msgstr "STA requerido"
|
||||||
|
|
||||||
|
#, c-format
|
||||||
|
#~ msgid "Soft device assert, id: 0x%08lX, pc: 0x%08lX"
|
||||||
|
#~ msgstr "Soft device assert, id: 0x%08lX, pc: 0x%08lX"
|
||||||
|
|
||||||
#~ msgid "Tile indices must be 0 - 255"
|
#~ msgid "Tile indices must be 0 - 255"
|
||||||
#~ msgstr "Los índices de Tile deben ser 0 - 255"
|
#~ msgstr "Los índices de Tile deben ser 0 - 255"
|
||||||
|
|
||||||
|
@ -3027,6 +3051,9 @@ msgstr "paso cero"
|
||||||
#~ msgstr ""
|
#~ msgstr ""
|
||||||
#~ "falló la asignación de memoria, asignando %u bytes para código nativo"
|
#~ "falló la asignación de memoria, asignando %u bytes para código nativo"
|
||||||
|
|
||||||
|
#~ msgid "name must be a string"
|
||||||
|
#~ msgstr "name debe de ser un string"
|
||||||
|
|
||||||
#~ msgid "not a valid ADC Channel: %d"
|
#~ msgid "not a valid ADC Channel: %d"
|
||||||
#~ msgstr "no es un canal ADC válido: %d"
|
#~ msgstr "no es un canal ADC válido: %d"
|
||||||
|
|
||||||
|
|
149
locale/fil.po
149
locale/fil.po
|
@ -7,7 +7,7 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: \n"
|
"Project-Id-Version: \n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2019-09-08 17:30-0500\n"
|
"POT-Creation-Date: 2019-10-21 19:50-0700\n"
|
||||||
"PO-Revision-Date: 2018-12-20 22:15-0800\n"
|
"PO-Revision-Date: 2018-12-20 22:15-0800\n"
|
||||||
"Last-Translator: Timothy <me@timothygarcia.ca>\n"
|
"Last-Translator: Timothy <me@timothygarcia.ca>\n"
|
||||||
"Language-Team: fil\n"
|
"Language-Team: fil\n"
|
||||||
|
@ -263,6 +263,10 @@ msgstr "Lahat ng timers para sa pin na ito ay ginagamit"
|
||||||
msgid "All timers in use"
|
msgid "All timers in use"
|
||||||
msgstr "Lahat ng timer ginagamit"
|
msgstr "Lahat ng timer ginagamit"
|
||||||
|
|
||||||
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
|
msgid "Already advertising."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/analogio/AnalogOut.c
|
#: ports/nrf/common-hal/analogio/AnalogOut.c
|
||||||
msgid "AnalogOut functionality not supported"
|
msgid "AnalogOut functionality not supported"
|
||||||
msgstr "Hindi supportado ang AnalogOut"
|
msgstr "Hindi supportado ang AnalogOut"
|
||||||
|
@ -331,6 +335,11 @@ msgstr "Ang liwanag ay dapat sa gitna ng 0 o 255"
|
||||||
msgid "Brightness not adjustable"
|
msgid "Brightness not adjustable"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: shared-bindings/_bleio/UUID.c
|
||||||
|
#, c-format
|
||||||
|
msgid "Buffer + offset too small %d %d %d"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: shared-module/usb_hid/Device.c
|
#: shared-module/usb_hid/Device.c
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Buffer incorrect size. Should be %d bytes."
|
msgid "Buffer incorrect size. Should be %d bytes."
|
||||||
|
@ -464,6 +473,12 @@ msgstr ""
|
||||||
msgid "Command must be an int between 0 and 255"
|
msgid "Command must be an int between 0 and 255"
|
||||||
msgstr "Sa gitna ng 0 o 255 dapat ang bytes."
|
msgstr "Sa gitna ng 0 o 255 dapat ang bytes."
|
||||||
|
|
||||||
|
#: shared-bindings/_bleio/Connection.c
|
||||||
|
msgid ""
|
||||||
|
"Connection has been disconnected and can no longer be used. Create a new "
|
||||||
|
"connection."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: py/persistentcode.c
|
#: py/persistentcode.c
|
||||||
msgid "Corrupt .mpy file"
|
msgid "Corrupt .mpy file"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -507,7 +522,7 @@ msgstr "graphic ay dapat 2048 bytes ang haba"
|
||||||
msgid "Data chunk must follow fmt chunk"
|
msgid "Data chunk must follow fmt chunk"
|
||||||
msgstr "Dapat sunurin ng Data chunk ang fmt chunk"
|
msgstr "Dapat sunurin ng Data chunk ang fmt chunk"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgid "Data too large for advertisement packet"
|
msgid "Data too large for advertisement packet"
|
||||||
msgstr "Hindi makasya ang data sa loob ng advertisement packet"
|
msgstr "Hindi makasya ang data sa loob ng advertisement packet"
|
||||||
|
@ -556,10 +571,6 @@ msgstr "Umasa ng %q"
|
||||||
msgid "Expected a Characteristic"
|
msgid "Expected a Characteristic"
|
||||||
msgstr "Hindi mabasa and Characteristic."
|
msgstr "Hindi mabasa and Characteristic."
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Service.c
|
|
||||||
msgid "Expected a Peripheral"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Characteristic.c
|
#: shared-bindings/_bleio/Characteristic.c
|
||||||
msgid "Expected a Service"
|
msgid "Expected a Service"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -570,7 +581,7 @@ msgstr ""
|
||||||
msgid "Expected a UUID"
|
msgid "Expected a UUID"
|
||||||
msgstr "Umasa ng %q"
|
msgstr "Umasa ng %q"
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Central.c
|
#: shared-bindings/_bleio/Adapter.c
|
||||||
msgid "Expected an Address"
|
msgid "Expected an Address"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -579,6 +590,11 @@ msgstr ""
|
||||||
msgid "Expected tuple of length %d, got %d"
|
msgid "Expected tuple of length %d, got %d"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: ports/nrf/common-hal/_bleio/__init__.c
|
||||||
|
#, c-format
|
||||||
|
msgid "Failed initiate attribute read, err 0x%04x"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: shared-bindings/ps2io/Ps2.c
|
#: shared-bindings/ps2io/Ps2.c
|
||||||
msgid "Failed sending command."
|
msgid "Failed sending command."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -589,20 +605,14 @@ msgid "Failed to acquire mutex, err 0x%04x"
|
||||||
msgstr "Nabigo sa pag kuha ng mutex, status: 0x%08lX"
|
msgstr "Nabigo sa pag kuha ng mutex, status: 0x%08lX"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Service.c
|
#: ports/nrf/common-hal/_bleio/Service.c
|
||||||
#, fuzzy, c-format
|
msgid "Failed to add characteristic, NRF_ERROR_%q"
|
||||||
msgid "Failed to add characteristic, err 0x%04x"
|
msgstr ""
|
||||||
msgstr "Nabigo sa paglagay ng characteristic, status: 0x%08lX"
|
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Characteristic.c
|
#: ports/nrf/common-hal/_bleio/Characteristic.c
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to add descriptor, err 0x%04x"
|
msgid "Failed to add descriptor, err 0x%04x"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
|
||||||
#, fuzzy, c-format
|
|
||||||
msgid "Failed to add service, err 0x%04x"
|
|
||||||
msgstr "Hindi matagumpay ang paglagay ng service, status: 0x%08lX"
|
|
||||||
|
|
||||||
#: ports/atmel-samd/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
|
#: ports/atmel-samd/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
|
||||||
msgid "Failed to allocate RX buffer"
|
msgid "Failed to allocate RX buffer"
|
||||||
msgstr "Nabigong ilaan ang RX buffer"
|
msgstr "Nabigong ilaan ang RX buffer"
|
||||||
|
@ -614,25 +624,22 @@ msgid "Failed to allocate RX buffer of %d bytes"
|
||||||
msgstr "Nabigong ilaan ang RX buffer ng %d bytes"
|
msgstr "Nabigong ilaan ang RX buffer ng %d bytes"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Adapter.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
#, fuzzy
|
msgid "Failed to change softdevice state, NRF_ERROR_%q"
|
||||||
msgid "Failed to change softdevice state"
|
|
||||||
msgstr "Nabigo sa pagbago ng softdevice state, error: 0x%08lX"
|
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
|
||||||
#, c-format
|
|
||||||
msgid "Failed to configure advertising, err 0x%04x"
|
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Central.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
|
msgid "Failed to connect: internal error"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
msgid "Failed to connect: timeout"
|
msgid "Failed to connect: timeout"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Scanner.c
|
#: ports/nrf/common-hal/_bleio/Service.c
|
||||||
#, fuzzy, c-format
|
msgid "Failed to create service, NRF_ERROR_%q"
|
||||||
msgid "Failed to continue scanning, err 0x%04x"
|
msgstr ""
|
||||||
msgstr "Hindi maituloy ang pag scan, status: 0x%0xlX"
|
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/__init__.c
|
#: ports/nrf/common-hal/_bleio/Connection.c
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgid "Failed to discover services"
|
msgid "Failed to discover services"
|
||||||
msgstr "Nabigo sa pagdiscover ng services, status: 0x%08lX"
|
msgstr "Nabigo sa pagdiscover ng services, status: 0x%08lX"
|
||||||
|
@ -652,7 +659,7 @@ msgstr "Nabigo sa pagkuha ng softdevice state, error: 0x%08lX"
|
||||||
msgid "Failed to notify or indicate attribute value, err 0x%04x"
|
msgid "Failed to notify or indicate attribute value, err 0x%04x"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Connection.c
|
||||||
msgid "Failed to pair"
|
msgid "Failed to pair"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -661,8 +668,7 @@ msgstr ""
|
||||||
msgid "Failed to read CCCD value, err 0x%04x"
|
msgid "Failed to read CCCD value, err 0x%04x"
|
||||||
msgstr "Hindi mabasa ang value ng attribute, status: 0x%08lX"
|
msgstr "Hindi mabasa ang value ng attribute, status: 0x%08lX"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Characteristic.c
|
#: ports/nrf/common-hal/_bleio/__init__.c
|
||||||
#: ports/nrf/common-hal/_bleio/Descriptor.c
|
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to read attribute value, err 0x%04x"
|
msgid "Failed to read attribute value, err 0x%04x"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -682,35 +688,27 @@ msgstr "Hindi matagumpay ang paglagay ng Vender Specific UUID, status: 0x%08lX"
|
||||||
msgid "Failed to release mutex, err 0x%04x"
|
msgid "Failed to release mutex, err 0x%04x"
|
||||||
msgstr "Nabigo sa pagrelease ng mutex, status: 0x%08lX"
|
msgstr "Nabigo sa pagrelease ng mutex, status: 0x%08lX"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
#, c-format
|
msgid "Failed to start advertising, NRF_ERROR_%q"
|
||||||
msgid "Failed to set device name, err 0x%04x"
|
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
#, fuzzy, c-format
|
|
||||||
msgid "Failed to start advertising, err 0x%04x"
|
|
||||||
msgstr "Hindi masimulaan ang advertisement, status: 0x%08lX"
|
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Central.c
|
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to start connecting, error 0x%04x"
|
msgid "Failed to start connecting, error 0x%04x"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Connection.c
|
||||||
#, c-format
|
msgid "Failed to start pairing, NRF_ERROR_%q"
|
||||||
msgid "Failed to start pairing, error 0x%04x"
|
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Scanner.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
#, fuzzy, c-format
|
#, fuzzy, c-format
|
||||||
msgid "Failed to start scanning, err 0x%04x"
|
msgid "Failed to start scanning, err 0x%04x"
|
||||||
msgstr "Hindi masimulaan mag i-scan, status: 0x%0xlX"
|
msgstr "Hindi masimulaan mag i-scan, status: 0x%0xlX"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
#, fuzzy, c-format
|
msgid "Failed to stop advertising, NRF_ERROR_%q"
|
||||||
msgid "Failed to stop advertising, err 0x%04x"
|
msgstr ""
|
||||||
msgstr "Hindi mahinto ang advertisement, status: 0x%08lX"
|
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Characteristic.c
|
#: ports/nrf/common-hal/_bleio/Characteristic.c
|
||||||
#, c-format
|
#, c-format
|
||||||
|
@ -1013,9 +1011,8 @@ msgstr ""
|
||||||
msgid "No such file/directory"
|
msgid "No such file/directory"
|
||||||
msgstr "Walang file/directory"
|
msgstr "Walang file/directory"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/__init__.c shared-bindings/_bleio/Central.c
|
#: ports/nrf/common-hal/_bleio/__init__.c
|
||||||
#: shared-bindings/_bleio/CharacteristicBuffer.c
|
#: shared-bindings/_bleio/CharacteristicBuffer.c
|
||||||
#: shared-bindings/_bleio/Peripheral.c
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgid "Not connected"
|
msgid "Not connected"
|
||||||
msgstr "Hindi maka connect sa AP"
|
msgstr "Hindi maka connect sa AP"
|
||||||
|
@ -1094,6 +1091,10 @@ msgstr "Kasama ang kung ano pang modules na sa filesystem\n"
|
||||||
msgid "Pop from an empty Ps2 buffer"
|
msgid "Pop from an empty Ps2 buffer"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: shared-bindings/_bleio/Adapter.c
|
||||||
|
msgid "Prefix buffer must be on the heap"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: main.c
|
#: main.c
|
||||||
msgid "Press any key to enter the REPL. Use CTRL-D to reload."
|
msgid "Press any key to enter the REPL. Use CTRL-D to reload."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -1164,6 +1165,10 @@ msgstr "Sample rate ay dapat positibo"
|
||||||
msgid "Sample rate too high. It must be less than %d"
|
msgid "Sample rate too high. It must be less than %d"
|
||||||
msgstr "Sample rate ay masyadong mataas. Ito ay dapat hindi hiigit sa %d"
|
msgstr "Sample rate ay masyadong mataas. Ito ay dapat hindi hiigit sa %d"
|
||||||
|
|
||||||
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
|
msgid "Scan already in progess. Stop with stop_scan."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
|
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
|
||||||
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c
|
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c
|
||||||
msgid "Serializer in use"
|
msgid "Serializer in use"
|
||||||
|
@ -1178,11 +1183,6 @@ msgstr "Slice at value iba't ibang haba."
|
||||||
msgid "Slices not supported"
|
msgid "Slices not supported"
|
||||||
msgstr "Hindi suportado ang Slices"
|
msgstr "Hindi suportado ang Slices"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Adapter.c
|
|
||||||
#, c-format
|
|
||||||
msgid "Soft device assert, id: 0x%08lX, pc: 0x%08lX"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: extmod/modure.c
|
#: extmod/modure.c
|
||||||
msgid "Splitting with sub-captures"
|
msgid "Splitting with sub-captures"
|
||||||
msgstr "Binibiyak gamit ang sub-captures"
|
msgstr "Binibiyak gamit ang sub-captures"
|
||||||
|
@ -2016,7 +2016,7 @@ msgstr "int() arg 2 ay dapat >=2 at <= 36"
|
||||||
msgid "integer required"
|
msgid "integer required"
|
||||||
msgstr "kailangan ng int"
|
msgstr "kailangan ng int"
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Peripheral.c shared-bindings/_bleio/Scanner.c
|
#: shared-bindings/_bleio/Adapter.c
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "interval must be in range %s-%s"
|
msgid "interval must be in range %s-%s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -2197,11 +2197,6 @@ msgstr "dapat gumamit ng keyword argument para sa key function"
|
||||||
msgid "name '%q' is not defined"
|
msgid "name '%q' is not defined"
|
||||||
msgstr "name '%q' ay hindi defined"
|
msgstr "name '%q' ay hindi defined"
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Peripheral.c
|
|
||||||
#, fuzzy
|
|
||||||
msgid "name must be a string"
|
|
||||||
msgstr "ang keywords dapat strings"
|
|
||||||
|
|
||||||
#: py/runtime.c
|
#: py/runtime.c
|
||||||
msgid "name not defined"
|
msgid "name not defined"
|
||||||
msgstr "name hindi na define"
|
msgstr "name hindi na define"
|
||||||
|
@ -2252,7 +2247,7 @@ msgstr ""
|
||||||
msgid "no such attribute"
|
msgid "no such attribute"
|
||||||
msgstr "walang ganoon na attribute"
|
msgstr "walang ganoon na attribute"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/__init__.c
|
#: ports/nrf/common-hal/_bleio/Connection.c
|
||||||
msgid "non-UUID found in service_uuids_whitelist"
|
msgid "non-UUID found in service_uuids_whitelist"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -2741,7 +2736,7 @@ msgstr ""
|
||||||
msgid "value_count must be > 0"
|
msgid "value_count must be > 0"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Scanner.c
|
#: shared-bindings/_bleio/Adapter.c
|
||||||
msgid "window must be <= interval"
|
msgid "window must be <= interval"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -2825,10 +2820,22 @@ msgstr "zero step"
|
||||||
#~ msgid "Failed to acquire mutex"
|
#~ msgid "Failed to acquire mutex"
|
||||||
#~ msgstr "Nabigo sa pag kuha ng mutex, status: 0x%08lX"
|
#~ msgstr "Nabigo sa pag kuha ng mutex, status: 0x%08lX"
|
||||||
|
|
||||||
|
#, fuzzy, c-format
|
||||||
|
#~ msgid "Failed to add characteristic, err 0x%04x"
|
||||||
|
#~ msgstr "Nabigo sa paglagay ng characteristic, status: 0x%08lX"
|
||||||
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#~ msgid "Failed to add service"
|
#~ msgid "Failed to add service"
|
||||||
#~ msgstr "Hindi matagumpay ang paglagay ng service, status: 0x%08lX"
|
#~ msgstr "Hindi matagumpay ang paglagay ng service, status: 0x%08lX"
|
||||||
|
|
||||||
|
#, fuzzy, c-format
|
||||||
|
#~ msgid "Failed to add service, err 0x%04x"
|
||||||
|
#~ msgstr "Hindi matagumpay ang paglagay ng service, status: 0x%08lX"
|
||||||
|
|
||||||
|
#, fuzzy
|
||||||
|
#~ msgid "Failed to change softdevice state"
|
||||||
|
#~ msgstr "Nabigo sa pagbago ng softdevice state, error: 0x%08lX"
|
||||||
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#~ msgid "Failed to connect:"
|
#~ msgid "Failed to connect:"
|
||||||
#~ msgstr "Hindi makaconnect, status: 0x%08lX"
|
#~ msgstr "Hindi makaconnect, status: 0x%08lX"
|
||||||
|
@ -2837,6 +2844,10 @@ msgstr "zero step"
|
||||||
#~ msgid "Failed to continue scanning"
|
#~ msgid "Failed to continue scanning"
|
||||||
#~ msgstr "Hindi maituloy ang pag scan, status: 0x%0xlX"
|
#~ msgstr "Hindi maituloy ang pag scan, status: 0x%0xlX"
|
||||||
|
|
||||||
|
#, fuzzy, c-format
|
||||||
|
#~ msgid "Failed to continue scanning, err 0x%04x"
|
||||||
|
#~ msgstr "Hindi maituloy ang pag scan, status: 0x%0xlX"
|
||||||
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#~ msgid "Failed to create mutex"
|
#~ msgid "Failed to create mutex"
|
||||||
#~ msgstr "Hindi matagumpay ang pagbuo ng mutex, status: 0x%0xlX"
|
#~ msgstr "Hindi matagumpay ang pagbuo ng mutex, status: 0x%0xlX"
|
||||||
|
@ -2857,6 +2868,10 @@ msgstr "zero step"
|
||||||
#~ msgid "Failed to start advertising"
|
#~ msgid "Failed to start advertising"
|
||||||
#~ msgstr "Hindi masimulaan ang advertisement, status: 0x%08lX"
|
#~ msgstr "Hindi masimulaan ang advertisement, status: 0x%08lX"
|
||||||
|
|
||||||
|
#, fuzzy, c-format
|
||||||
|
#~ msgid "Failed to start advertising, err 0x%04x"
|
||||||
|
#~ msgstr "Hindi masimulaan ang advertisement, status: 0x%08lX"
|
||||||
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#~ msgid "Failed to start scanning"
|
#~ msgid "Failed to start scanning"
|
||||||
#~ msgstr "Hindi masimulaan mag i-scan, status: 0x%0xlX"
|
#~ msgstr "Hindi masimulaan mag i-scan, status: 0x%0xlX"
|
||||||
|
@ -2865,6 +2880,10 @@ msgstr "zero step"
|
||||||
#~ msgid "Failed to stop advertising"
|
#~ msgid "Failed to stop advertising"
|
||||||
#~ msgstr "Hindi mahinto ang advertisement, status: 0x%08lX"
|
#~ msgstr "Hindi mahinto ang advertisement, status: 0x%08lX"
|
||||||
|
|
||||||
|
#, fuzzy, c-format
|
||||||
|
#~ msgid "Failed to stop advertising, err 0x%04x"
|
||||||
|
#~ msgstr "Hindi mahinto ang advertisement, status: 0x%08lX"
|
||||||
|
|
||||||
#~ msgid "Function requires lock."
|
#~ msgid "Function requires lock."
|
||||||
#~ msgstr "Kailangan ng lock ang function."
|
#~ msgstr "Kailangan ng lock ang function."
|
||||||
|
|
||||||
|
@ -3010,6 +3029,10 @@ msgstr "zero step"
|
||||||
#~ msgstr ""
|
#~ msgstr ""
|
||||||
#~ "nabigo ang paglalaan ng memorya, naglalaan ng %u bytes para sa native code"
|
#~ "nabigo ang paglalaan ng memorya, naglalaan ng %u bytes para sa native code"
|
||||||
|
|
||||||
|
#, fuzzy
|
||||||
|
#~ msgid "name must be a string"
|
||||||
|
#~ msgstr "ang keywords dapat strings"
|
||||||
|
|
||||||
#~ msgid "not a valid ADC Channel: %d"
|
#~ msgid "not a valid ADC Channel: %d"
|
||||||
#~ msgstr "hindi tamang ADC Channel: %d"
|
#~ msgstr "hindi tamang ADC Channel: %d"
|
||||||
|
|
||||||
|
|
153
locale/fr.po
153
locale/fr.po
|
@ -8,7 +8,7 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: 0.1\n"
|
"Project-Id-Version: 0.1\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2019-09-08 17:30-0500\n"
|
"POT-Creation-Date: 2019-10-21 19:50-0700\n"
|
||||||
"PO-Revision-Date: 2019-04-14 20:05+0100\n"
|
"PO-Revision-Date: 2019-04-14 20:05+0100\n"
|
||||||
"Last-Translator: Pierrick Couturier <arofarn@arofarn.info>\n"
|
"Last-Translator: Pierrick Couturier <arofarn@arofarn.info>\n"
|
||||||
"Language-Team: fr\n"
|
"Language-Team: fr\n"
|
||||||
|
@ -266,6 +266,10 @@ msgstr "Tous les timers pour cette broche sont utilisés"
|
||||||
msgid "All timers in use"
|
msgid "All timers in use"
|
||||||
msgstr "Tous les timers sont utilisés"
|
msgstr "Tous les timers sont utilisés"
|
||||||
|
|
||||||
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
|
msgid "Already advertising."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/analogio/AnalogOut.c
|
#: ports/nrf/common-hal/analogio/AnalogOut.c
|
||||||
msgid "AnalogOut functionality not supported"
|
msgid "AnalogOut functionality not supported"
|
||||||
msgstr "Fonctionnalité AnalogOut non supportée"
|
msgstr "Fonctionnalité AnalogOut non supportée"
|
||||||
|
@ -336,6 +340,11 @@ msgstr "La luminosité doit être entre 0 et 255"
|
||||||
msgid "Brightness not adjustable"
|
msgid "Brightness not adjustable"
|
||||||
msgstr "Luminosité non-ajustable"
|
msgstr "Luminosité non-ajustable"
|
||||||
|
|
||||||
|
#: shared-bindings/_bleio/UUID.c
|
||||||
|
#, c-format
|
||||||
|
msgid "Buffer + offset too small %d %d %d"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: shared-module/usb_hid/Device.c
|
#: shared-module/usb_hid/Device.c
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Buffer incorrect size. Should be %d bytes."
|
msgid "Buffer incorrect size. Should be %d bytes."
|
||||||
|
@ -470,6 +479,12 @@ msgstr ""
|
||||||
msgid "Command must be an int between 0 and 255"
|
msgid "Command must be an int between 0 and 255"
|
||||||
msgstr "La commande doit être un entier entre 0 et 255"
|
msgstr "La commande doit être un entier entre 0 et 255"
|
||||||
|
|
||||||
|
#: shared-bindings/_bleio/Connection.c
|
||||||
|
msgid ""
|
||||||
|
"Connection has been disconnected and can no longer be used. Create a new "
|
||||||
|
"connection."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: py/persistentcode.c
|
#: py/persistentcode.c
|
||||||
msgid "Corrupt .mpy file"
|
msgid "Corrupt .mpy file"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -513,7 +528,7 @@ msgstr "La broche 'Data 0' doit être aligné sur l'octet"
|
||||||
msgid "Data chunk must follow fmt chunk"
|
msgid "Data chunk must follow fmt chunk"
|
||||||
msgstr "Un bloc de données doit suivre un bloc de format"
|
msgstr "Un bloc de données doit suivre un bloc de format"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
msgid "Data too large for advertisement packet"
|
msgid "Data too large for advertisement packet"
|
||||||
msgstr "Données trop volumineuses pour un paquet de diffusion"
|
msgstr "Données trop volumineuses pour un paquet de diffusion"
|
||||||
|
|
||||||
|
@ -560,10 +575,6 @@ msgstr "Attendu un %q"
|
||||||
msgid "Expected a Characteristic"
|
msgid "Expected a Characteristic"
|
||||||
msgstr "Une 'Characteristic' est attendue"
|
msgstr "Une 'Characteristic' est attendue"
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Service.c
|
|
||||||
msgid "Expected a Peripheral"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Characteristic.c
|
#: shared-bindings/_bleio/Characteristic.c
|
||||||
msgid "Expected a Service"
|
msgid "Expected a Service"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -574,7 +585,7 @@ msgstr ""
|
||||||
msgid "Expected a UUID"
|
msgid "Expected a UUID"
|
||||||
msgstr "Un UUID est attendu"
|
msgstr "Un UUID est attendu"
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Central.c
|
#: shared-bindings/_bleio/Adapter.c
|
||||||
msgid "Expected an Address"
|
msgid "Expected an Address"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -583,6 +594,11 @@ msgstr ""
|
||||||
msgid "Expected tuple of length %d, got %d"
|
msgid "Expected tuple of length %d, got %d"
|
||||||
msgstr "Tuple de longueur %d attendu, obtenu %d"
|
msgstr "Tuple de longueur %d attendu, obtenu %d"
|
||||||
|
|
||||||
|
#: ports/nrf/common-hal/_bleio/__init__.c
|
||||||
|
#, c-format
|
||||||
|
msgid "Failed initiate attribute read, err 0x%04x"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: shared-bindings/ps2io/Ps2.c
|
#: shared-bindings/ps2io/Ps2.c
|
||||||
msgid "Failed sending command."
|
msgid "Failed sending command."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -593,20 +609,14 @@ msgid "Failed to acquire mutex, err 0x%04x"
|
||||||
msgstr "Echec de l'obtention de mutex, err 0x%04x"
|
msgstr "Echec de l'obtention de mutex, err 0x%04x"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Service.c
|
#: ports/nrf/common-hal/_bleio/Service.c
|
||||||
#, fuzzy, c-format
|
msgid "Failed to add characteristic, NRF_ERROR_%q"
|
||||||
msgid "Failed to add characteristic, err 0x%04x"
|
msgstr ""
|
||||||
msgstr "Echec de l'ajout de caractéristique, err 0x%04x"
|
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Characteristic.c
|
#: ports/nrf/common-hal/_bleio/Characteristic.c
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to add descriptor, err 0x%04x"
|
msgid "Failed to add descriptor, err 0x%04x"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
|
||||||
#, fuzzy, c-format
|
|
||||||
msgid "Failed to add service, err 0x%04x"
|
|
||||||
msgstr "Echec de l'ajout de service, err 0x%04x"
|
|
||||||
|
|
||||||
#: ports/atmel-samd/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
|
#: ports/atmel-samd/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
|
||||||
msgid "Failed to allocate RX buffer"
|
msgid "Failed to allocate RX buffer"
|
||||||
msgstr "Echec de l'allocation du tampon RX"
|
msgstr "Echec de l'allocation du tampon RX"
|
||||||
|
@ -618,25 +628,22 @@ msgid "Failed to allocate RX buffer of %d bytes"
|
||||||
msgstr "Echec de l'allocation de %d octets du tampon RX"
|
msgstr "Echec de l'allocation de %d octets du tampon RX"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Adapter.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
#, fuzzy
|
msgid "Failed to change softdevice state, NRF_ERROR_%q"
|
||||||
msgid "Failed to change softdevice state"
|
|
||||||
msgstr "Echec de la modification de l'état du périphérique"
|
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
|
||||||
#, c-format
|
|
||||||
msgid "Failed to configure advertising, err 0x%04x"
|
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Central.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
|
msgid "Failed to connect: internal error"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
msgid "Failed to connect: timeout"
|
msgid "Failed to connect: timeout"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Scanner.c
|
#: ports/nrf/common-hal/_bleio/Service.c
|
||||||
#, fuzzy, c-format
|
msgid "Failed to create service, NRF_ERROR_%q"
|
||||||
msgid "Failed to continue scanning, err 0x%04x"
|
msgstr ""
|
||||||
msgstr "Impossible de poursuivre le scan, err 0x%04x"
|
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/__init__.c
|
#: ports/nrf/common-hal/_bleio/Connection.c
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgid "Failed to discover services"
|
msgid "Failed to discover services"
|
||||||
msgstr "Echec de la découverte de services"
|
msgstr "Echec de la découverte de services"
|
||||||
|
@ -657,7 +664,7 @@ msgid "Failed to notify or indicate attribute value, err 0x%04x"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Impossible de notifier ou d'indiquer la valeur de l'attribut, err 0x%04x"
|
"Impossible de notifier ou d'indiquer la valeur de l'attribut, err 0x%04x"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Connection.c
|
||||||
msgid "Failed to pair"
|
msgid "Failed to pair"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -666,8 +673,7 @@ msgstr ""
|
||||||
msgid "Failed to read CCCD value, err 0x%04x"
|
msgid "Failed to read CCCD value, err 0x%04x"
|
||||||
msgstr "Impossible de lire la valeur 'CCCD', err 0x%04x"
|
msgstr "Impossible de lire la valeur 'CCCD', err 0x%04x"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Characteristic.c
|
#: ports/nrf/common-hal/_bleio/__init__.c
|
||||||
#: ports/nrf/common-hal/_bleio/Descriptor.c
|
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to read attribute value, err 0x%04x"
|
msgid "Failed to read attribute value, err 0x%04x"
|
||||||
msgstr "Impossible de lire la valeur de l'attribut, err 0x%04x"
|
msgstr "Impossible de lire la valeur de l'attribut, err 0x%04x"
|
||||||
|
@ -687,35 +693,27 @@ msgstr "Echec de l'ajout de l'UUID du fournisseur, err 0x%04x"
|
||||||
msgid "Failed to release mutex, err 0x%04x"
|
msgid "Failed to release mutex, err 0x%04x"
|
||||||
msgstr "Impossible de libérer mutex, err 0x%04x"
|
msgstr "Impossible de libérer mutex, err 0x%04x"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
#, c-format
|
msgid "Failed to start advertising, NRF_ERROR_%q"
|
||||||
msgid "Failed to set device name, err 0x%04x"
|
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
#, fuzzy, c-format
|
|
||||||
msgid "Failed to start advertising, err 0x%04x"
|
|
||||||
msgstr "Impossible de commencer à diffuser, err 0x%04x"
|
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Central.c
|
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to start connecting, error 0x%04x"
|
msgid "Failed to start connecting, error 0x%04x"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Connection.c
|
||||||
#, c-format
|
msgid "Failed to start pairing, NRF_ERROR_%q"
|
||||||
msgid "Failed to start pairing, error 0x%04x"
|
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Scanner.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
#, fuzzy, c-format
|
#, fuzzy, c-format
|
||||||
msgid "Failed to start scanning, err 0x%04x"
|
msgid "Failed to start scanning, err 0x%04x"
|
||||||
msgstr "Impossible de commencer à scanner, err 0x%04x"
|
msgstr "Impossible de commencer à scanner, err 0x%04x"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
#, fuzzy, c-format
|
msgid "Failed to stop advertising, NRF_ERROR_%q"
|
||||||
msgid "Failed to stop advertising, err 0x%04x"
|
msgstr ""
|
||||||
msgstr "Echec de l'arrêt de diffusion, err 0x%04x"
|
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Characteristic.c
|
#: ports/nrf/common-hal/_bleio/Characteristic.c
|
||||||
#, c-format
|
#, c-format
|
||||||
|
@ -1022,9 +1020,8 @@ msgstr "Il n'y a plus d'espace libre sur le périphérique"
|
||||||
msgid "No such file/directory"
|
msgid "No such file/directory"
|
||||||
msgstr "Fichier/dossier introuvable"
|
msgstr "Fichier/dossier introuvable"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/__init__.c shared-bindings/_bleio/Central.c
|
#: ports/nrf/common-hal/_bleio/__init__.c
|
||||||
#: shared-bindings/_bleio/CharacteristicBuffer.c
|
#: shared-bindings/_bleio/CharacteristicBuffer.c
|
||||||
#: shared-bindings/_bleio/Peripheral.c
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgid "Not connected"
|
msgid "Not connected"
|
||||||
msgstr "Non connecté"
|
msgstr "Non connecté"
|
||||||
|
@ -1111,6 +1108,10 @@ msgstr "Ainsi que tout autre module présent sur le système de fichiers\n"
|
||||||
msgid "Pop from an empty Ps2 buffer"
|
msgid "Pop from an empty Ps2 buffer"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: shared-bindings/_bleio/Adapter.c
|
||||||
|
msgid "Prefix buffer must be on the heap"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: main.c
|
#: main.c
|
||||||
msgid "Press any key to enter the REPL. Use CTRL-D to reload."
|
msgid "Press any key to enter the REPL. Use CTRL-D to reload."
|
||||||
msgstr "Appuyez sur une touche pour entrer sur REPL ou CTRL-D pour recharger."
|
msgstr "Appuyez sur une touche pour entrer sur REPL ou CTRL-D pour recharger."
|
||||||
|
@ -1180,6 +1181,10 @@ msgstr "Le taux d'échantillonage doit être positif"
|
||||||
msgid "Sample rate too high. It must be less than %d"
|
msgid "Sample rate too high. It must be less than %d"
|
||||||
msgstr "Taux d'échantillonage trop élevé. Doit être inf. à %d"
|
msgstr "Taux d'échantillonage trop élevé. Doit être inf. à %d"
|
||||||
|
|
||||||
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
|
msgid "Scan already in progess. Stop with stop_scan."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
|
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
|
||||||
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c
|
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c
|
||||||
msgid "Serializer in use"
|
msgid "Serializer in use"
|
||||||
|
@ -1194,11 +1199,6 @@ msgstr "Tranche et valeur de tailles différentes"
|
||||||
msgid "Slices not supported"
|
msgid "Slices not supported"
|
||||||
msgstr "Tranches non supportées"
|
msgstr "Tranches non supportées"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Adapter.c
|
|
||||||
#, c-format
|
|
||||||
msgid "Soft device assert, id: 0x%08lX, pc: 0x%08lX"
|
|
||||||
msgstr "Assertion en mode 'soft-device', id: 0x%08lX, pc: 0x%08lX"
|
|
||||||
|
|
||||||
#: extmod/modure.c
|
#: extmod/modure.c
|
||||||
msgid "Splitting with sub-captures"
|
msgid "Splitting with sub-captures"
|
||||||
msgstr "Fractionnement avec des sous-captures"
|
msgstr "Fractionnement avec des sous-captures"
|
||||||
|
@ -2048,7 +2048,7 @@ msgstr "l'argument 2 de int() doit être >=2 et <=36"
|
||||||
msgid "integer required"
|
msgid "integer required"
|
||||||
msgstr "entier requis"
|
msgstr "entier requis"
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Peripheral.c shared-bindings/_bleio/Scanner.c
|
#: shared-bindings/_bleio/Adapter.c
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "interval must be in range %s-%s"
|
msgid "interval must be in range %s-%s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -2229,11 +2229,6 @@ msgstr "doit utiliser un argument nommé pour une fonction key"
|
||||||
msgid "name '%q' is not defined"
|
msgid "name '%q' is not defined"
|
||||||
msgstr "nom '%q' non défini"
|
msgstr "nom '%q' non défini"
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Peripheral.c
|
|
||||||
#, fuzzy
|
|
||||||
msgid "name must be a string"
|
|
||||||
msgstr "les noms doivent être des chaînes de caractère"
|
|
||||||
|
|
||||||
#: py/runtime.c
|
#: py/runtime.c
|
||||||
msgid "name not defined"
|
msgid "name not defined"
|
||||||
msgstr "nom non défini"
|
msgstr "nom non défini"
|
||||||
|
@ -2285,7 +2280,7 @@ msgstr ""
|
||||||
msgid "no such attribute"
|
msgid "no such attribute"
|
||||||
msgstr "pas de tel attribut"
|
msgstr "pas de tel attribut"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/__init__.c
|
#: ports/nrf/common-hal/_bleio/Connection.c
|
||||||
msgid "non-UUID found in service_uuids_whitelist"
|
msgid "non-UUID found in service_uuids_whitelist"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -2783,7 +2778,7 @@ msgstr ""
|
||||||
msgid "value_count must be > 0"
|
msgid "value_count must be > 0"
|
||||||
msgstr "'value_count' doit être > 0"
|
msgstr "'value_count' doit être > 0"
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Scanner.c
|
#: shared-bindings/_bleio/Adapter.c
|
||||||
msgid "window must be <= interval"
|
msgid "window must be <= interval"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -2873,10 +2868,22 @@ msgstr "'step' nul"
|
||||||
#~ msgid "Failed to acquire mutex"
|
#~ msgid "Failed to acquire mutex"
|
||||||
#~ msgstr "Echec de l'obtention de mutex"
|
#~ msgstr "Echec de l'obtention de mutex"
|
||||||
|
|
||||||
|
#, fuzzy, c-format
|
||||||
|
#~ msgid "Failed to add characteristic, err 0x%04x"
|
||||||
|
#~ msgstr "Echec de l'ajout de caractéristique, err 0x%04x"
|
||||||
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#~ msgid "Failed to add service"
|
#~ msgid "Failed to add service"
|
||||||
#~ msgstr "Echec de l'ajout de service"
|
#~ msgstr "Echec de l'ajout de service"
|
||||||
|
|
||||||
|
#, fuzzy, c-format
|
||||||
|
#~ msgid "Failed to add service, err 0x%04x"
|
||||||
|
#~ msgstr "Echec de l'ajout de service, err 0x%04x"
|
||||||
|
|
||||||
|
#, fuzzy
|
||||||
|
#~ msgid "Failed to change softdevice state"
|
||||||
|
#~ msgstr "Echec de la modification de l'état du périphérique"
|
||||||
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#~ msgid "Failed to connect:"
|
#~ msgid "Failed to connect:"
|
||||||
#~ msgstr "Echec de connection:"
|
#~ msgstr "Echec de connection:"
|
||||||
|
@ -2885,6 +2892,10 @@ msgstr "'step' nul"
|
||||||
#~ msgid "Failed to continue scanning"
|
#~ msgid "Failed to continue scanning"
|
||||||
#~ msgstr "Impossible de poursuivre le scan"
|
#~ msgstr "Impossible de poursuivre le scan"
|
||||||
|
|
||||||
|
#, fuzzy, c-format
|
||||||
|
#~ msgid "Failed to continue scanning, err 0x%04x"
|
||||||
|
#~ msgstr "Impossible de poursuivre le scan, err 0x%04x"
|
||||||
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#~ msgid "Failed to create mutex"
|
#~ msgid "Failed to create mutex"
|
||||||
#~ msgstr "Echec de la création de mutex"
|
#~ msgstr "Echec de la création de mutex"
|
||||||
|
@ -2905,6 +2916,10 @@ msgstr "'step' nul"
|
||||||
#~ msgid "Failed to start advertising"
|
#~ msgid "Failed to start advertising"
|
||||||
#~ msgstr "Echec du démarrage de la diffusion"
|
#~ msgstr "Echec du démarrage de la diffusion"
|
||||||
|
|
||||||
|
#, fuzzy, c-format
|
||||||
|
#~ msgid "Failed to start advertising, err 0x%04x"
|
||||||
|
#~ msgstr "Impossible de commencer à diffuser, err 0x%04x"
|
||||||
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#~ msgid "Failed to start scanning"
|
#~ msgid "Failed to start scanning"
|
||||||
#~ msgstr "Impossible de commencer à scanner"
|
#~ msgstr "Impossible de commencer à scanner"
|
||||||
|
@ -2913,6 +2928,10 @@ msgstr "'step' nul"
|
||||||
#~ msgid "Failed to stop advertising"
|
#~ msgid "Failed to stop advertising"
|
||||||
#~ msgstr "Echec de l'arrêt de diffusion"
|
#~ msgstr "Echec de l'arrêt de diffusion"
|
||||||
|
|
||||||
|
#, fuzzy, c-format
|
||||||
|
#~ msgid "Failed to stop advertising, err 0x%04x"
|
||||||
|
#~ msgstr "Echec de l'arrêt de diffusion, err 0x%04x"
|
||||||
|
|
||||||
#~ msgid "Function requires lock."
|
#~ msgid "Function requires lock."
|
||||||
#~ msgstr "La fonction nécessite un verrou."
|
#~ msgstr "La fonction nécessite un verrou."
|
||||||
|
|
||||||
|
@ -2984,6 +3003,10 @@ msgstr "'step' nul"
|
||||||
#~ msgid "STA required"
|
#~ msgid "STA required"
|
||||||
#~ msgstr "'STA' requis"
|
#~ msgstr "'STA' requis"
|
||||||
|
|
||||||
|
#, c-format
|
||||||
|
#~ msgid "Soft device assert, id: 0x%08lX, pc: 0x%08lX"
|
||||||
|
#~ msgstr "Assertion en mode 'soft-device', id: 0x%08lX, pc: 0x%08lX"
|
||||||
|
|
||||||
#~ msgid "Tile indices must be 0 - 255"
|
#~ msgid "Tile indices must be 0 - 255"
|
||||||
#~ msgstr "Les indices des tuiles doivent être compris entre 0 et 255 "
|
#~ msgstr "Les indices des tuiles doivent être compris entre 0 et 255 "
|
||||||
|
|
||||||
|
@ -3077,6 +3100,10 @@ msgstr "'step' nul"
|
||||||
#~ msgstr ""
|
#~ msgstr ""
|
||||||
#~ "l'allocation de mémoire a échoué en allouant %u octets pour un code natif"
|
#~ "l'allocation de mémoire a échoué en allouant %u octets pour un code natif"
|
||||||
|
|
||||||
|
#, fuzzy
|
||||||
|
#~ msgid "name must be a string"
|
||||||
|
#~ msgstr "les noms doivent être des chaînes de caractère"
|
||||||
|
|
||||||
#~ msgid "not a valid ADC Channel: %d"
|
#~ msgid "not a valid ADC Channel: %d"
|
||||||
#~ msgstr "canal ADC non valide : %d"
|
#~ msgstr "canal ADC non valide : %d"
|
||||||
|
|
||||||
|
|
149
locale/it_IT.po
149
locale/it_IT.po
|
@ -8,7 +8,7 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2019-09-08 17:30-0500\n"
|
"POT-Creation-Date: 2019-10-21 19:50-0700\n"
|
||||||
"PO-Revision-Date: 2018-10-02 16:27+0200\n"
|
"PO-Revision-Date: 2018-10-02 16:27+0200\n"
|
||||||
"Last-Translator: Enrico Paganin <enrico.paganin@mail.com>\n"
|
"Last-Translator: Enrico Paganin <enrico.paganin@mail.com>\n"
|
||||||
"Language-Team: \n"
|
"Language-Team: \n"
|
||||||
|
@ -262,6 +262,10 @@ msgstr "Tutti i timer per questo pin sono in uso"
|
||||||
msgid "All timers in use"
|
msgid "All timers in use"
|
||||||
msgstr "Tutti i timer utilizzati"
|
msgstr "Tutti i timer utilizzati"
|
||||||
|
|
||||||
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
|
msgid "Already advertising."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/analogio/AnalogOut.c
|
#: ports/nrf/common-hal/analogio/AnalogOut.c
|
||||||
msgid "AnalogOut functionality not supported"
|
msgid "AnalogOut functionality not supported"
|
||||||
msgstr "funzionalità AnalogOut non supportata"
|
msgstr "funzionalità AnalogOut non supportata"
|
||||||
|
@ -331,6 +335,11 @@ msgstr "La luminosità deve essere compreso tra 0 e 255"
|
||||||
msgid "Brightness not adjustable"
|
msgid "Brightness not adjustable"
|
||||||
msgstr "Illiminazione non è regolabile"
|
msgstr "Illiminazione non è regolabile"
|
||||||
|
|
||||||
|
#: shared-bindings/_bleio/UUID.c
|
||||||
|
#, c-format
|
||||||
|
msgid "Buffer + offset too small %d %d %d"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: shared-module/usb_hid/Device.c
|
#: shared-module/usb_hid/Device.c
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Buffer incorrect size. Should be %d bytes."
|
msgid "Buffer incorrect size. Should be %d bytes."
|
||||||
|
@ -465,6 +474,12 @@ msgstr ""
|
||||||
msgid "Command must be an int between 0 and 255"
|
msgid "Command must be an int between 0 and 255"
|
||||||
msgstr "I byte devono essere compresi tra 0 e 255"
|
msgstr "I byte devono essere compresi tra 0 e 255"
|
||||||
|
|
||||||
|
#: shared-bindings/_bleio/Connection.c
|
||||||
|
msgid ""
|
||||||
|
"Connection has been disconnected and can no longer be used. Create a new "
|
||||||
|
"connection."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: py/persistentcode.c
|
#: py/persistentcode.c
|
||||||
msgid "Corrupt .mpy file"
|
msgid "Corrupt .mpy file"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -508,7 +523,7 @@ msgstr "graphic deve essere lunga 2048 byte"
|
||||||
msgid "Data chunk must follow fmt chunk"
|
msgid "Data chunk must follow fmt chunk"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgid "Data too large for advertisement packet"
|
msgid "Data too large for advertisement packet"
|
||||||
msgstr "Impossibile inserire dati nel pacchetto di advertisement."
|
msgstr "Impossibile inserire dati nel pacchetto di advertisement."
|
||||||
|
@ -556,10 +571,6 @@ msgstr "Atteso un %q"
|
||||||
msgid "Expected a Characteristic"
|
msgid "Expected a Characteristic"
|
||||||
msgstr "Non è possibile aggiungere Characteristic."
|
msgstr "Non è possibile aggiungere Characteristic."
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Service.c
|
|
||||||
msgid "Expected a Peripheral"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Characteristic.c
|
#: shared-bindings/_bleio/Characteristic.c
|
||||||
msgid "Expected a Service"
|
msgid "Expected a Service"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -570,7 +581,7 @@ msgstr ""
|
||||||
msgid "Expected a UUID"
|
msgid "Expected a UUID"
|
||||||
msgstr "Atteso un %q"
|
msgstr "Atteso un %q"
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Central.c
|
#: shared-bindings/_bleio/Adapter.c
|
||||||
msgid "Expected an Address"
|
msgid "Expected an Address"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -579,6 +590,11 @@ msgstr ""
|
||||||
msgid "Expected tuple of length %d, got %d"
|
msgid "Expected tuple of length %d, got %d"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: ports/nrf/common-hal/_bleio/__init__.c
|
||||||
|
#, c-format
|
||||||
|
msgid "Failed initiate attribute read, err 0x%04x"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: shared-bindings/ps2io/Ps2.c
|
#: shared-bindings/ps2io/Ps2.c
|
||||||
msgid "Failed sending command."
|
msgid "Failed sending command."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -589,20 +605,14 @@ msgid "Failed to acquire mutex, err 0x%04x"
|
||||||
msgstr "Impossibile leggere valore dell'attributo. status: 0x%02x"
|
msgstr "Impossibile leggere valore dell'attributo. status: 0x%02x"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Service.c
|
#: ports/nrf/common-hal/_bleio/Service.c
|
||||||
#, fuzzy, c-format
|
msgid "Failed to add characteristic, NRF_ERROR_%q"
|
||||||
msgid "Failed to add characteristic, err 0x%04x"
|
msgstr ""
|
||||||
msgstr "Impossibile fermare advertisement. status: 0x%02x"
|
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Characteristic.c
|
#: ports/nrf/common-hal/_bleio/Characteristic.c
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to add descriptor, err 0x%04x"
|
msgid "Failed to add descriptor, err 0x%04x"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
|
||||||
#, fuzzy, c-format
|
|
||||||
msgid "Failed to add service, err 0x%04x"
|
|
||||||
msgstr "Impossibile fermare advertisement. status: 0x%02x"
|
|
||||||
|
|
||||||
#: ports/atmel-samd/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
|
#: ports/atmel-samd/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
|
||||||
msgid "Failed to allocate RX buffer"
|
msgid "Failed to allocate RX buffer"
|
||||||
msgstr "Impossibile allocare buffer RX"
|
msgstr "Impossibile allocare buffer RX"
|
||||||
|
@ -614,25 +624,22 @@ msgid "Failed to allocate RX buffer of %d bytes"
|
||||||
msgstr "Fallita allocazione del buffer RX di %d byte"
|
msgstr "Fallita allocazione del buffer RX di %d byte"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Adapter.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
#, fuzzy
|
msgid "Failed to change softdevice state, NRF_ERROR_%q"
|
||||||
msgid "Failed to change softdevice state"
|
|
||||||
msgstr "Impossibile fermare advertisement. status: 0x%02x"
|
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
|
||||||
#, c-format
|
|
||||||
msgid "Failed to configure advertising, err 0x%04x"
|
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Central.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
|
msgid "Failed to connect: internal error"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
msgid "Failed to connect: timeout"
|
msgid "Failed to connect: timeout"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Scanner.c
|
#: ports/nrf/common-hal/_bleio/Service.c
|
||||||
#, fuzzy, c-format
|
msgid "Failed to create service, NRF_ERROR_%q"
|
||||||
msgid "Failed to continue scanning, err 0x%04x"
|
msgstr ""
|
||||||
msgstr "Impossible iniziare la scansione. status: 0x%02x"
|
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/__init__.c
|
#: ports/nrf/common-hal/_bleio/Connection.c
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgid "Failed to discover services"
|
msgid "Failed to discover services"
|
||||||
msgstr "Impossibile fermare advertisement. status: 0x%02x"
|
msgstr "Impossibile fermare advertisement. status: 0x%02x"
|
||||||
|
@ -651,7 +658,7 @@ msgstr "Impossibile fermare advertisement. status: 0x%02x"
|
||||||
msgid "Failed to notify or indicate attribute value, err 0x%04x"
|
msgid "Failed to notify or indicate attribute value, err 0x%04x"
|
||||||
msgstr "Notificamento o indicazione di attribute value fallito, err 0x%04x"
|
msgstr "Notificamento o indicazione di attribute value fallito, err 0x%04x"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Connection.c
|
||||||
msgid "Failed to pair"
|
msgid "Failed to pair"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -660,8 +667,7 @@ msgstr ""
|
||||||
msgid "Failed to read CCCD value, err 0x%04x"
|
msgid "Failed to read CCCD value, err 0x%04x"
|
||||||
msgstr "Impossibile leggere valore dell'attributo. status: 0x%02x"
|
msgstr "Impossibile leggere valore dell'attributo. status: 0x%02x"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Characteristic.c
|
#: ports/nrf/common-hal/_bleio/__init__.c
|
||||||
#: ports/nrf/common-hal/_bleio/Descriptor.c
|
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to read attribute value, err 0x%04x"
|
msgid "Failed to read attribute value, err 0x%04x"
|
||||||
msgstr "Tentative leggere attribute value fallito, err 0x%04x"
|
msgstr "Tentative leggere attribute value fallito, err 0x%04x"
|
||||||
|
@ -681,35 +687,27 @@ msgstr "Non è possibile aggiungere l'UUID del vendor specifico da 128-bit"
|
||||||
msgid "Failed to release mutex, err 0x%04x"
|
msgid "Failed to release mutex, err 0x%04x"
|
||||||
msgstr "Impossibile leggere valore dell'attributo. status: 0x%02x"
|
msgstr "Impossibile leggere valore dell'attributo. status: 0x%02x"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
#, c-format
|
msgid "Failed to start advertising, NRF_ERROR_%q"
|
||||||
msgid "Failed to set device name, err 0x%04x"
|
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
#, fuzzy, c-format
|
|
||||||
msgid "Failed to start advertising, err 0x%04x"
|
|
||||||
msgstr "Impossibile avviare advertisement. status: 0x%02x"
|
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Central.c
|
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to start connecting, error 0x%04x"
|
msgid "Failed to start connecting, error 0x%04x"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Connection.c
|
||||||
#, c-format
|
msgid "Failed to start pairing, NRF_ERROR_%q"
|
||||||
msgid "Failed to start pairing, error 0x%04x"
|
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Scanner.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
#, fuzzy, c-format
|
#, fuzzy, c-format
|
||||||
msgid "Failed to start scanning, err 0x%04x"
|
msgid "Failed to start scanning, err 0x%04x"
|
||||||
msgstr "Impossible iniziare la scansione. status: 0x%02x"
|
msgstr "Impossible iniziare la scansione. status: 0x%02x"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
#, fuzzy, c-format
|
msgid "Failed to stop advertising, NRF_ERROR_%q"
|
||||||
msgid "Failed to stop advertising, err 0x%04x"
|
msgstr ""
|
||||||
msgstr "Impossibile fermare advertisement. status: 0x%02x"
|
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Characteristic.c
|
#: ports/nrf/common-hal/_bleio/Characteristic.c
|
||||||
#, c-format
|
#, c-format
|
||||||
|
@ -1012,9 +1010,8 @@ msgstr "Non che spazio sul dispositivo"
|
||||||
msgid "No such file/directory"
|
msgid "No such file/directory"
|
||||||
msgstr "Nessun file/directory esistente"
|
msgstr "Nessun file/directory esistente"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/__init__.c shared-bindings/_bleio/Central.c
|
#: ports/nrf/common-hal/_bleio/__init__.c
|
||||||
#: shared-bindings/_bleio/CharacteristicBuffer.c
|
#: shared-bindings/_bleio/CharacteristicBuffer.c
|
||||||
#: shared-bindings/_bleio/Peripheral.c
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgid "Not connected"
|
msgid "Not connected"
|
||||||
msgstr "Impossible connettersi all'AP"
|
msgstr "Impossible connettersi all'AP"
|
||||||
|
@ -1099,6 +1096,10 @@ msgstr "Imposssibile rimontare il filesystem"
|
||||||
msgid "Pop from an empty Ps2 buffer"
|
msgid "Pop from an empty Ps2 buffer"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: shared-bindings/_bleio/Adapter.c
|
||||||
|
msgid "Prefix buffer must be on the heap"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: main.c
|
#: main.c
|
||||||
msgid "Press any key to enter the REPL. Use CTRL-D to reload."
|
msgid "Press any key to enter the REPL. Use CTRL-D to reload."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -1170,6 +1171,10 @@ msgid "Sample rate too high. It must be less than %d"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Frequenza di campionamento troppo alta. Il valore deve essere inferiore a %d"
|
"Frequenza di campionamento troppo alta. Il valore deve essere inferiore a %d"
|
||||||
|
|
||||||
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
|
msgid "Scan already in progess. Stop with stop_scan."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
|
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
|
||||||
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c
|
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c
|
||||||
msgid "Serializer in use"
|
msgid "Serializer in use"
|
||||||
|
@ -1184,11 +1189,6 @@ msgstr ""
|
||||||
msgid "Slices not supported"
|
msgid "Slices not supported"
|
||||||
msgstr "Slice non supportate"
|
msgstr "Slice non supportate"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Adapter.c
|
|
||||||
#, c-format
|
|
||||||
msgid "Soft device assert, id: 0x%08lX, pc: 0x%08lX"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: extmod/modure.c
|
#: extmod/modure.c
|
||||||
msgid "Splitting with sub-captures"
|
msgid "Splitting with sub-captures"
|
||||||
msgstr "Suddivisione con sotto-catture"
|
msgstr "Suddivisione con sotto-catture"
|
||||||
|
@ -2008,7 +2008,7 @@ msgstr "il secondo argomanto di int() deve essere >= 2 e <= 36"
|
||||||
msgid "integer required"
|
msgid "integer required"
|
||||||
msgstr "intero richiesto"
|
msgstr "intero richiesto"
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Peripheral.c shared-bindings/_bleio/Scanner.c
|
#: shared-bindings/_bleio/Adapter.c
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "interval must be in range %s-%s"
|
msgid "interval must be in range %s-%s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -2190,11 +2190,6 @@ msgstr ""
|
||||||
msgid "name '%q' is not defined"
|
msgid "name '%q' is not defined"
|
||||||
msgstr "nome '%q'non definito"
|
msgstr "nome '%q'non definito"
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Peripheral.c
|
|
||||||
#, fuzzy
|
|
||||||
msgid "name must be a string"
|
|
||||||
msgstr "argomenti nominati devono essere stringhe"
|
|
||||||
|
|
||||||
#: py/runtime.c
|
#: py/runtime.c
|
||||||
msgid "name not defined"
|
msgid "name not defined"
|
||||||
msgstr "nome non definito"
|
msgstr "nome non definito"
|
||||||
|
@ -2246,7 +2241,7 @@ msgstr ""
|
||||||
msgid "no such attribute"
|
msgid "no such attribute"
|
||||||
msgstr "attributo inesistente"
|
msgstr "attributo inesistente"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/__init__.c
|
#: ports/nrf/common-hal/_bleio/Connection.c
|
||||||
msgid "non-UUID found in service_uuids_whitelist"
|
msgid "non-UUID found in service_uuids_whitelist"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -2739,7 +2734,7 @@ msgstr ""
|
||||||
msgid "value_count must be > 0"
|
msgid "value_count must be > 0"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Scanner.c
|
#: shared-bindings/_bleio/Adapter.c
|
||||||
msgid "window must be <= interval"
|
msgid "window must be <= interval"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -2829,10 +2824,22 @@ msgstr "zero step"
|
||||||
#~ msgid "Failed to acquire mutex"
|
#~ msgid "Failed to acquire mutex"
|
||||||
#~ msgstr "Impossibile allocare buffer RX"
|
#~ msgstr "Impossibile allocare buffer RX"
|
||||||
|
|
||||||
|
#, fuzzy, c-format
|
||||||
|
#~ msgid "Failed to add characteristic, err 0x%04x"
|
||||||
|
#~ msgstr "Impossibile fermare advertisement. status: 0x%02x"
|
||||||
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#~ msgid "Failed to add service"
|
#~ msgid "Failed to add service"
|
||||||
#~ msgstr "Impossibile fermare advertisement. status: 0x%02x"
|
#~ msgstr "Impossibile fermare advertisement. status: 0x%02x"
|
||||||
|
|
||||||
|
#, fuzzy, c-format
|
||||||
|
#~ msgid "Failed to add service, err 0x%04x"
|
||||||
|
#~ msgstr "Impossibile fermare advertisement. status: 0x%02x"
|
||||||
|
|
||||||
|
#, fuzzy
|
||||||
|
#~ msgid "Failed to change softdevice state"
|
||||||
|
#~ msgstr "Impossibile fermare advertisement. status: 0x%02x"
|
||||||
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#~ msgid "Failed to connect:"
|
#~ msgid "Failed to connect:"
|
||||||
#~ msgstr "Impossibile connettersi. status: 0x%02x"
|
#~ msgstr "Impossibile connettersi. status: 0x%02x"
|
||||||
|
@ -2841,6 +2848,10 @@ msgstr "zero step"
|
||||||
#~ msgid "Failed to continue scanning"
|
#~ msgid "Failed to continue scanning"
|
||||||
#~ msgstr "Impossible iniziare la scansione. status: 0x%02x"
|
#~ msgstr "Impossible iniziare la scansione. status: 0x%02x"
|
||||||
|
|
||||||
|
#, fuzzy, c-format
|
||||||
|
#~ msgid "Failed to continue scanning, err 0x%04x"
|
||||||
|
#~ msgstr "Impossible iniziare la scansione. status: 0x%02x"
|
||||||
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#~ msgid "Failed to create mutex"
|
#~ msgid "Failed to create mutex"
|
||||||
#~ msgstr "Impossibile leggere valore dell'attributo. status: 0x%02x"
|
#~ msgstr "Impossibile leggere valore dell'attributo. status: 0x%02x"
|
||||||
|
@ -2861,6 +2872,10 @@ msgstr "zero step"
|
||||||
#~ msgid "Failed to start advertising"
|
#~ msgid "Failed to start advertising"
|
||||||
#~ msgstr "Impossibile avviare advertisement. status: 0x%02x"
|
#~ msgstr "Impossibile avviare advertisement. status: 0x%02x"
|
||||||
|
|
||||||
|
#, fuzzy, c-format
|
||||||
|
#~ msgid "Failed to start advertising, err 0x%04x"
|
||||||
|
#~ msgstr "Impossibile avviare advertisement. status: 0x%02x"
|
||||||
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#~ msgid "Failed to start scanning"
|
#~ msgid "Failed to start scanning"
|
||||||
#~ msgstr "Impossible iniziare la scansione. status: 0x%02x"
|
#~ msgstr "Impossible iniziare la scansione. status: 0x%02x"
|
||||||
|
@ -2869,6 +2884,10 @@ msgstr "zero step"
|
||||||
#~ msgid "Failed to stop advertising"
|
#~ msgid "Failed to stop advertising"
|
||||||
#~ msgstr "Impossibile fermare advertisement. status: 0x%02x"
|
#~ msgstr "Impossibile fermare advertisement. status: 0x%02x"
|
||||||
|
|
||||||
|
#, fuzzy, c-format
|
||||||
|
#~ msgid "Failed to stop advertising, err 0x%04x"
|
||||||
|
#~ msgstr "Impossibile fermare advertisement. status: 0x%02x"
|
||||||
|
|
||||||
#~ msgid "GPIO16 does not support pull up."
|
#~ msgid "GPIO16 does not support pull up."
|
||||||
#~ msgstr "GPIO16 non supporta pull-up"
|
#~ msgstr "GPIO16 non supporta pull-up"
|
||||||
|
|
||||||
|
@ -3008,6 +3027,10 @@ msgstr "zero step"
|
||||||
#~ msgstr ""
|
#~ msgstr ""
|
||||||
#~ "allocazione di memoria fallita, allocazione di %d byte per codice nativo"
|
#~ "allocazione di memoria fallita, allocazione di %d byte per codice nativo"
|
||||||
|
|
||||||
|
#, fuzzy
|
||||||
|
#~ msgid "name must be a string"
|
||||||
|
#~ msgstr "argomenti nominati devono essere stringhe"
|
||||||
|
|
||||||
#~ msgid "not a valid ADC Channel: %d"
|
#~ msgid "not a valid ADC Channel: %d"
|
||||||
#~ msgstr "canale ADC non valido: %d"
|
#~ msgstr "canale ADC non valido: %d"
|
||||||
|
|
||||||
|
|
149
locale/pl.po
149
locale/pl.po
|
@ -7,7 +7,7 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: \n"
|
"Project-Id-Version: \n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2019-09-08 17:30-0500\n"
|
"POT-Creation-Date: 2019-10-21 19:50-0700\n"
|
||||||
"PO-Revision-Date: 2019-03-19 18:37-0700\n"
|
"PO-Revision-Date: 2019-03-19 18:37-0700\n"
|
||||||
"Last-Translator: Radomir Dopieralski <circuitpython@sheep.art.pl>\n"
|
"Last-Translator: Radomir Dopieralski <circuitpython@sheep.art.pl>\n"
|
||||||
"Language-Team: pl\n"
|
"Language-Team: pl\n"
|
||||||
|
@ -260,6 +260,10 @@ msgstr "Wszystkie timery tej nóżki w użyciu"
|
||||||
msgid "All timers in use"
|
msgid "All timers in use"
|
||||||
msgstr "Wszystkie timery w użyciu"
|
msgstr "Wszystkie timery w użyciu"
|
||||||
|
|
||||||
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
|
msgid "Already advertising."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/analogio/AnalogOut.c
|
#: ports/nrf/common-hal/analogio/AnalogOut.c
|
||||||
msgid "AnalogOut functionality not supported"
|
msgid "AnalogOut functionality not supported"
|
||||||
msgstr "AnalogOut jest niewspierane"
|
msgstr "AnalogOut jest niewspierane"
|
||||||
|
@ -328,6 +332,11 @@ msgstr "Jasność musi być pomiędzy 0 a 255"
|
||||||
msgid "Brightness not adjustable"
|
msgid "Brightness not adjustable"
|
||||||
msgstr "Jasność nie jest regulowana"
|
msgstr "Jasność nie jest regulowana"
|
||||||
|
|
||||||
|
#: shared-bindings/_bleio/UUID.c
|
||||||
|
#, c-format
|
||||||
|
msgid "Buffer + offset too small %d %d %d"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: shared-module/usb_hid/Device.c
|
#: shared-module/usb_hid/Device.c
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Buffer incorrect size. Should be %d bytes."
|
msgid "Buffer incorrect size. Should be %d bytes."
|
||||||
|
@ -458,6 +467,12 @@ msgstr ""
|
||||||
msgid "Command must be an int between 0 and 255"
|
msgid "Command must be an int between 0 and 255"
|
||||||
msgstr "Komenda musi być int pomiędzy 0 a 255"
|
msgstr "Komenda musi być int pomiędzy 0 a 255"
|
||||||
|
|
||||||
|
#: shared-bindings/_bleio/Connection.c
|
||||||
|
msgid ""
|
||||||
|
"Connection has been disconnected and can no longer be used. Create a new "
|
||||||
|
"connection."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: py/persistentcode.c
|
#: py/persistentcode.c
|
||||||
msgid "Corrupt .mpy file"
|
msgid "Corrupt .mpy file"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -500,7 +515,7 @@ msgstr "Nóżka data 0 musi być wyrównana do bajtu"
|
||||||
msgid "Data chunk must follow fmt chunk"
|
msgid "Data chunk must follow fmt chunk"
|
||||||
msgstr "Fragment danych musi następować po fragmencie fmt"
|
msgstr "Fragment danych musi następować po fragmencie fmt"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
msgid "Data too large for advertisement packet"
|
msgid "Data too large for advertisement packet"
|
||||||
msgstr "Zbyt dużo danych pakietu rozgłoszeniowego"
|
msgstr "Zbyt dużo danych pakietu rozgłoszeniowego"
|
||||||
|
|
||||||
|
@ -546,10 +561,6 @@ msgstr "Oczekiwano %q"
|
||||||
msgid "Expected a Characteristic"
|
msgid "Expected a Characteristic"
|
||||||
msgstr "Oczekiwano charakterystyki"
|
msgstr "Oczekiwano charakterystyki"
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Service.c
|
|
||||||
msgid "Expected a Peripheral"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Characteristic.c
|
#: shared-bindings/_bleio/Characteristic.c
|
||||||
msgid "Expected a Service"
|
msgid "Expected a Service"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -559,7 +570,7 @@ msgstr ""
|
||||||
msgid "Expected a UUID"
|
msgid "Expected a UUID"
|
||||||
msgstr "Oczekiwano UUID"
|
msgstr "Oczekiwano UUID"
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Central.c
|
#: shared-bindings/_bleio/Adapter.c
|
||||||
msgid "Expected an Address"
|
msgid "Expected an Address"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -568,6 +579,11 @@ msgstr ""
|
||||||
msgid "Expected tuple of length %d, got %d"
|
msgid "Expected tuple of length %d, got %d"
|
||||||
msgstr "Oczekiwano krotkę długości %d, otrzymano %d"
|
msgstr "Oczekiwano krotkę długości %d, otrzymano %d"
|
||||||
|
|
||||||
|
#: ports/nrf/common-hal/_bleio/__init__.c
|
||||||
|
#, c-format
|
||||||
|
msgid "Failed initiate attribute read, err 0x%04x"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: shared-bindings/ps2io/Ps2.c
|
#: shared-bindings/ps2io/Ps2.c
|
||||||
msgid "Failed sending command."
|
msgid "Failed sending command."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -578,20 +594,14 @@ msgid "Failed to acquire mutex, err 0x%04x"
|
||||||
msgstr "Nie udało się uzyskać blokady, błąd 0x$04x"
|
msgstr "Nie udało się uzyskać blokady, błąd 0x$04x"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Service.c
|
#: ports/nrf/common-hal/_bleio/Service.c
|
||||||
#, fuzzy, c-format
|
msgid "Failed to add characteristic, NRF_ERROR_%q"
|
||||||
msgid "Failed to add characteristic, err 0x%04x"
|
msgstr ""
|
||||||
msgstr "Nie udało się dodać charakterystyki, błąd 0x$04x"
|
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Characteristic.c
|
#: ports/nrf/common-hal/_bleio/Characteristic.c
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to add descriptor, err 0x%04x"
|
msgid "Failed to add descriptor, err 0x%04x"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
|
||||||
#, c-format
|
|
||||||
msgid "Failed to add service, err 0x%04x"
|
|
||||||
msgstr "Nie udało się dodać serwisu, błąd 0x%04x"
|
|
||||||
|
|
||||||
#: ports/atmel-samd/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
|
#: ports/atmel-samd/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
|
||||||
msgid "Failed to allocate RX buffer"
|
msgid "Failed to allocate RX buffer"
|
||||||
msgstr "Nie udała się alokacja bufora RX"
|
msgstr "Nie udała się alokacja bufora RX"
|
||||||
|
@ -603,24 +613,22 @@ msgid "Failed to allocate RX buffer of %d bytes"
|
||||||
msgstr "Nie udała się alokacja %d bajtów na bufor RX"
|
msgstr "Nie udała się alokacja %d bajtów na bufor RX"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Adapter.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
msgid "Failed to change softdevice state"
|
msgid "Failed to change softdevice state, NRF_ERROR_%q"
|
||||||
msgstr "Nie udało się zmienić stanu softdevice"
|
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
|
||||||
#, c-format
|
|
||||||
msgid "Failed to configure advertising, err 0x%04x"
|
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Central.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
|
msgid "Failed to connect: internal error"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
msgid "Failed to connect: timeout"
|
msgid "Failed to connect: timeout"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Scanner.c
|
#: ports/nrf/common-hal/_bleio/Service.c
|
||||||
#, c-format
|
msgid "Failed to create service, NRF_ERROR_%q"
|
||||||
msgid "Failed to continue scanning, err 0x%04x"
|
msgstr ""
|
||||||
msgstr "Nie udała się kontynuacja skanowania, błąd 0x%04x"
|
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/__init__.c
|
#: ports/nrf/common-hal/_bleio/Connection.c
|
||||||
msgid "Failed to discover services"
|
msgid "Failed to discover services"
|
||||||
msgstr "Nie udało się odkryć serwisów"
|
msgstr "Nie udało się odkryć serwisów"
|
||||||
|
|
||||||
|
@ -637,7 +645,7 @@ msgstr "Nie udało się odczytać stanu softdevice"
|
||||||
msgid "Failed to notify or indicate attribute value, err 0x%04x"
|
msgid "Failed to notify or indicate attribute value, err 0x%04x"
|
||||||
msgstr "Nie udało się powiadomić o wartości atrybutu, błąd 0x%04x"
|
msgstr "Nie udało się powiadomić o wartości atrybutu, błąd 0x%04x"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Connection.c
|
||||||
msgid "Failed to pair"
|
msgid "Failed to pair"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -646,8 +654,7 @@ msgstr ""
|
||||||
msgid "Failed to read CCCD value, err 0x%04x"
|
msgid "Failed to read CCCD value, err 0x%04x"
|
||||||
msgstr "Nie udało się odczytać CCCD, błąd 0x%04x"
|
msgstr "Nie udało się odczytać CCCD, błąd 0x%04x"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Characteristic.c
|
#: ports/nrf/common-hal/_bleio/__init__.c
|
||||||
#: ports/nrf/common-hal/_bleio/Descriptor.c
|
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to read attribute value, err 0x%04x"
|
msgid "Failed to read attribute value, err 0x%04x"
|
||||||
msgstr "Nie udało się odczytać wartości atrybutu, błąd 0x%04x"
|
msgstr "Nie udało się odczytać wartości atrybutu, błąd 0x%04x"
|
||||||
|
@ -667,35 +674,27 @@ msgstr "Nie udało się zarejestrować UUID dostawcy, błąd 0x%04x"
|
||||||
msgid "Failed to release mutex, err 0x%04x"
|
msgid "Failed to release mutex, err 0x%04x"
|
||||||
msgstr "Nie udało się zwolnić blokady, błąd 0x%04x"
|
msgstr "Nie udało się zwolnić blokady, błąd 0x%04x"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
#, c-format
|
msgid "Failed to start advertising, NRF_ERROR_%q"
|
||||||
msgid "Failed to set device name, err 0x%04x"
|
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
#, c-format
|
|
||||||
msgid "Failed to start advertising, err 0x%04x"
|
|
||||||
msgstr "Nie udało się rozpocząć rozgłaszania, błąd 0x%04x"
|
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Central.c
|
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to start connecting, error 0x%04x"
|
msgid "Failed to start connecting, error 0x%04x"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Connection.c
|
||||||
#, c-format
|
msgid "Failed to start pairing, NRF_ERROR_%q"
|
||||||
msgid "Failed to start pairing, error 0x%04x"
|
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Scanner.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to start scanning, err 0x%04x"
|
msgid "Failed to start scanning, err 0x%04x"
|
||||||
msgstr "Nie udało się rozpocząć skanowania, błąd 0x%04x"
|
msgstr "Nie udało się rozpocząć skanowania, błąd 0x%04x"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
#, c-format
|
msgid "Failed to stop advertising, NRF_ERROR_%q"
|
||||||
msgid "Failed to stop advertising, err 0x%04x"
|
msgstr ""
|
||||||
msgstr "Nie udało się zatrzymać rozgłaszania, błąd 0x%04x"
|
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Characteristic.c
|
#: ports/nrf/common-hal/_bleio/Characteristic.c
|
||||||
#, c-format
|
#, c-format
|
||||||
|
@ -999,9 +998,8 @@ msgstr "Brak miejsca"
|
||||||
msgid "No such file/directory"
|
msgid "No such file/directory"
|
||||||
msgstr "Brak pliku/katalogu"
|
msgstr "Brak pliku/katalogu"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/__init__.c shared-bindings/_bleio/Central.c
|
#: ports/nrf/common-hal/_bleio/__init__.c
|
||||||
#: shared-bindings/_bleio/CharacteristicBuffer.c
|
#: shared-bindings/_bleio/CharacteristicBuffer.c
|
||||||
#: shared-bindings/_bleio/Peripheral.c
|
|
||||||
msgid "Not connected"
|
msgid "Not connected"
|
||||||
msgstr "Nie podłączono"
|
msgstr "Nie podłączono"
|
||||||
|
|
||||||
|
@ -1075,6 +1073,10 @@ msgstr "Oraz moduły w systemie plików\n"
|
||||||
msgid "Pop from an empty Ps2 buffer"
|
msgid "Pop from an empty Ps2 buffer"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: shared-bindings/_bleio/Adapter.c
|
||||||
|
msgid "Prefix buffer must be on the heap"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: main.c
|
#: main.c
|
||||||
msgid "Press any key to enter the REPL. Use CTRL-D to reload."
|
msgid "Press any key to enter the REPL. Use CTRL-D to reload."
|
||||||
msgstr "Dowolny klawisz aby uruchomić konsolę. CTRL-D aby przeładować."
|
msgstr "Dowolny klawisz aby uruchomić konsolę. CTRL-D aby przeładować."
|
||||||
|
@ -1141,6 +1143,10 @@ msgstr "Częstotliwość próbkowania musi być dodatnia"
|
||||||
msgid "Sample rate too high. It must be less than %d"
|
msgid "Sample rate too high. It must be less than %d"
|
||||||
msgstr "Zbyt wysoka częstotliwość próbkowania. Musi być mniejsza niż %d"
|
msgstr "Zbyt wysoka częstotliwość próbkowania. Musi być mniejsza niż %d"
|
||||||
|
|
||||||
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
|
msgid "Scan already in progess. Stop with stop_scan."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
|
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
|
||||||
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c
|
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c
|
||||||
msgid "Serializer in use"
|
msgid "Serializer in use"
|
||||||
|
@ -1155,11 +1161,6 @@ msgstr "Fragment i wartość są różnych długości."
|
||||||
msgid "Slices not supported"
|
msgid "Slices not supported"
|
||||||
msgstr "Fragmenty nieobsługiwane"
|
msgstr "Fragmenty nieobsługiwane"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Adapter.c
|
|
||||||
#, c-format
|
|
||||||
msgid "Soft device assert, id: 0x%08lX, pc: 0x%08lX"
|
|
||||||
msgstr "Soft device assert, id: 0x%08lX, pc: 0x%08lX"
|
|
||||||
|
|
||||||
#: extmod/modure.c
|
#: extmod/modure.c
|
||||||
msgid "Splitting with sub-captures"
|
msgid "Splitting with sub-captures"
|
||||||
msgstr "Podział z podgrupami"
|
msgstr "Podział z podgrupami"
|
||||||
|
@ -1975,7 +1976,7 @@ msgstr "argument 2 do int() busi być pomiędzy 2 a 36"
|
||||||
msgid "integer required"
|
msgid "integer required"
|
||||||
msgstr "wymagana liczba całkowita"
|
msgstr "wymagana liczba całkowita"
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Peripheral.c shared-bindings/_bleio/Scanner.c
|
#: shared-bindings/_bleio/Adapter.c
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "interval must be in range %s-%s"
|
msgid "interval must be in range %s-%s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -2152,10 +2153,6 @@ msgstr "funkcja key musi być podana jako argument nazwany"
|
||||||
msgid "name '%q' is not defined"
|
msgid "name '%q' is not defined"
|
||||||
msgstr "nazwa '%q' niezdefiniowana"
|
msgstr "nazwa '%q' niezdefiniowana"
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Peripheral.c
|
|
||||||
msgid "name must be a string"
|
|
||||||
msgstr "nazwa musi być łańcuchem"
|
|
||||||
|
|
||||||
#: py/runtime.c
|
#: py/runtime.c
|
||||||
msgid "name not defined"
|
msgid "name not defined"
|
||||||
msgstr "nazwa niezdefiniowana"
|
msgstr "nazwa niezdefiniowana"
|
||||||
|
@ -2206,7 +2203,7 @@ msgstr ""
|
||||||
msgid "no such attribute"
|
msgid "no such attribute"
|
||||||
msgstr "nie ma takiego atrybutu"
|
msgstr "nie ma takiego atrybutu"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/__init__.c
|
#: ports/nrf/common-hal/_bleio/Connection.c
|
||||||
msgid "non-UUID found in service_uuids_whitelist"
|
msgid "non-UUID found in service_uuids_whitelist"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -2690,7 +2687,7 @@ msgstr ""
|
||||||
msgid "value_count must be > 0"
|
msgid "value_count must be > 0"
|
||||||
msgstr "value_count musi być > 0"
|
msgstr "value_count musi być > 0"
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Scanner.c
|
#: shared-bindings/_bleio/Adapter.c
|
||||||
msgid "window must be <= interval"
|
msgid "window must be <= interval"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -2749,15 +2746,30 @@ msgstr "zerowy krok"
|
||||||
#~ msgid "Failed to acquire mutex"
|
#~ msgid "Failed to acquire mutex"
|
||||||
#~ msgstr "Nie udało się uzyskać blokady"
|
#~ msgstr "Nie udało się uzyskać blokady"
|
||||||
|
|
||||||
|
#, fuzzy, c-format
|
||||||
|
#~ msgid "Failed to add characteristic, err 0x%04x"
|
||||||
|
#~ msgstr "Nie udało się dodać charakterystyki, błąd 0x$04x"
|
||||||
|
|
||||||
#~ msgid "Failed to add service"
|
#~ msgid "Failed to add service"
|
||||||
#~ msgstr "Nie udało się dodać serwisu"
|
#~ msgstr "Nie udało się dodać serwisu"
|
||||||
|
|
||||||
|
#, c-format
|
||||||
|
#~ msgid "Failed to add service, err 0x%04x"
|
||||||
|
#~ msgstr "Nie udało się dodać serwisu, błąd 0x%04x"
|
||||||
|
|
||||||
|
#~ msgid "Failed to change softdevice state"
|
||||||
|
#~ msgstr "Nie udało się zmienić stanu softdevice"
|
||||||
|
|
||||||
#~ msgid "Failed to connect:"
|
#~ msgid "Failed to connect:"
|
||||||
#~ msgstr "Nie udało się połączenie:"
|
#~ msgstr "Nie udało się połączenie:"
|
||||||
|
|
||||||
#~ msgid "Failed to continue scanning"
|
#~ msgid "Failed to continue scanning"
|
||||||
#~ msgstr "Nie udała się kontynuacja skanowania"
|
#~ msgstr "Nie udała się kontynuacja skanowania"
|
||||||
|
|
||||||
|
#, c-format
|
||||||
|
#~ msgid "Failed to continue scanning, err 0x%04x"
|
||||||
|
#~ msgstr "Nie udała się kontynuacja skanowania, błąd 0x%04x"
|
||||||
|
|
||||||
#~ msgid "Failed to create mutex"
|
#~ msgid "Failed to create mutex"
|
||||||
#~ msgstr "Nie udało się stworzyć blokady"
|
#~ msgstr "Nie udało się stworzyć blokady"
|
||||||
|
|
||||||
|
@ -2767,12 +2779,20 @@ msgstr "zerowy krok"
|
||||||
#~ msgid "Failed to start advertising"
|
#~ msgid "Failed to start advertising"
|
||||||
#~ msgstr "Nie udało się rozpocząć rozgłaszania"
|
#~ msgstr "Nie udało się rozpocząć rozgłaszania"
|
||||||
|
|
||||||
|
#, c-format
|
||||||
|
#~ msgid "Failed to start advertising, err 0x%04x"
|
||||||
|
#~ msgstr "Nie udało się rozpocząć rozgłaszania, błąd 0x%04x"
|
||||||
|
|
||||||
#~ msgid "Failed to start scanning"
|
#~ msgid "Failed to start scanning"
|
||||||
#~ msgstr "Nie udało się rozpocząć skanowania"
|
#~ msgstr "Nie udało się rozpocząć skanowania"
|
||||||
|
|
||||||
#~ msgid "Failed to stop advertising"
|
#~ msgid "Failed to stop advertising"
|
||||||
#~ msgstr "Nie udało się zatrzymać rozgłaszania"
|
#~ msgstr "Nie udało się zatrzymać rozgłaszania"
|
||||||
|
|
||||||
|
#, c-format
|
||||||
|
#~ msgid "Failed to stop advertising, err 0x%04x"
|
||||||
|
#~ msgstr "Nie udało się zatrzymać rozgłaszania, błąd 0x%04x"
|
||||||
|
|
||||||
#~ msgid "Invalid bit clock pin"
|
#~ msgid "Invalid bit clock pin"
|
||||||
#~ msgstr "Zła nóżka zegara"
|
#~ msgstr "Zła nóżka zegara"
|
||||||
|
|
||||||
|
@ -2790,6 +2810,10 @@ msgstr "zerowy krok"
|
||||||
#~ "bpp given"
|
#~ "bpp given"
|
||||||
#~ msgstr "Wspierane są tylko pliki BMP czarno-białe, 8bpp i 16bpp: %d bpp "
|
#~ msgstr "Wspierane są tylko pliki BMP czarno-białe, 8bpp i 16bpp: %d bpp "
|
||||||
|
|
||||||
|
#, c-format
|
||||||
|
#~ msgid "Soft device assert, id: 0x%08lX, pc: 0x%08lX"
|
||||||
|
#~ msgstr "Soft device assert, id: 0x%08lX, pc: 0x%08lX"
|
||||||
|
|
||||||
#~ msgid "Tile indices must be 0 - 255"
|
#~ msgid "Tile indices must be 0 - 255"
|
||||||
#~ msgstr "Indeks kafelka musi być pomiędzy 0 a 255 włącznie"
|
#~ msgstr "Indeks kafelka musi być pomiędzy 0 a 255 włącznie"
|
||||||
|
|
||||||
|
@ -2809,6 +2833,9 @@ msgstr "zerowy krok"
|
||||||
#~ msgid "interval not in range 0.0020 to 10.24"
|
#~ msgid "interval not in range 0.0020 to 10.24"
|
||||||
#~ msgstr "przedział poza zakresem 0.0020 do 10.24"
|
#~ msgstr "przedział poza zakresem 0.0020 do 10.24"
|
||||||
|
|
||||||
|
#~ msgid "name must be a string"
|
||||||
|
#~ msgstr "nazwa musi być łańcuchem"
|
||||||
|
|
||||||
#~ msgid "services includes an object that is not a Service"
|
#~ msgid "services includes an object that is not a Service"
|
||||||
#~ msgstr "obiekt typu innego niż Service w services"
|
#~ msgstr "obiekt typu innego niż Service w services"
|
||||||
|
|
||||||
|
|
149
locale/pt_BR.po
149
locale/pt_BR.po
|
@ -8,7 +8,7 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2019-09-08 17:30-0500\n"
|
"POT-Creation-Date: 2019-10-21 19:50-0700\n"
|
||||||
"PO-Revision-Date: 2018-10-02 21:14-0000\n"
|
"PO-Revision-Date: 2018-10-02 21:14-0000\n"
|
||||||
"Last-Translator: \n"
|
"Last-Translator: \n"
|
||||||
"Language-Team: \n"
|
"Language-Team: \n"
|
||||||
|
@ -262,6 +262,10 @@ msgstr "Todos os temporizadores para este pino estão em uso"
|
||||||
msgid "All timers in use"
|
msgid "All timers in use"
|
||||||
msgstr "Todos os temporizadores em uso"
|
msgstr "Todos os temporizadores em uso"
|
||||||
|
|
||||||
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
|
msgid "Already advertising."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/analogio/AnalogOut.c
|
#: ports/nrf/common-hal/analogio/AnalogOut.c
|
||||||
msgid "AnalogOut functionality not supported"
|
msgid "AnalogOut functionality not supported"
|
||||||
msgstr "Funcionalidade AnalogOut não suportada"
|
msgstr "Funcionalidade AnalogOut não suportada"
|
||||||
|
@ -328,6 +332,11 @@ msgstr "O brilho deve estar entre 0 e 255"
|
||||||
msgid "Brightness not adjustable"
|
msgid "Brightness not adjustable"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: shared-bindings/_bleio/UUID.c
|
||||||
|
#, c-format
|
||||||
|
msgid "Buffer + offset too small %d %d %d"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: shared-module/usb_hid/Device.c
|
#: shared-module/usb_hid/Device.c
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Buffer incorrect size. Should be %d bytes."
|
msgid "Buffer incorrect size. Should be %d bytes."
|
||||||
|
@ -461,6 +470,12 @@ msgstr ""
|
||||||
msgid "Command must be an int between 0 and 255"
|
msgid "Command must be an int between 0 and 255"
|
||||||
msgstr "Os bytes devem estar entre 0 e 255."
|
msgstr "Os bytes devem estar entre 0 e 255."
|
||||||
|
|
||||||
|
#: shared-bindings/_bleio/Connection.c
|
||||||
|
msgid ""
|
||||||
|
"Connection has been disconnected and can no longer be used. Create a new "
|
||||||
|
"connection."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: py/persistentcode.c
|
#: py/persistentcode.c
|
||||||
msgid "Corrupt .mpy file"
|
msgid "Corrupt .mpy file"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -503,7 +518,7 @@ msgstr ""
|
||||||
msgid "Data chunk must follow fmt chunk"
|
msgid "Data chunk must follow fmt chunk"
|
||||||
msgstr "Pedaço de dados deve seguir o pedaço de cortes"
|
msgstr "Pedaço de dados deve seguir o pedaço de cortes"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgid "Data too large for advertisement packet"
|
msgid "Data too large for advertisement packet"
|
||||||
msgstr "Não é possível ajustar dados no pacote de anúncios."
|
msgstr "Não é possível ajustar dados no pacote de anúncios."
|
||||||
|
@ -551,10 +566,6 @@ msgstr "Esperado um"
|
||||||
msgid "Expected a Characteristic"
|
msgid "Expected a Characteristic"
|
||||||
msgstr "Não é possível adicionar Característica."
|
msgstr "Não é possível adicionar Característica."
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Service.c
|
|
||||||
msgid "Expected a Peripheral"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Characteristic.c
|
#: shared-bindings/_bleio/Characteristic.c
|
||||||
msgid "Expected a Service"
|
msgid "Expected a Service"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -565,7 +576,7 @@ msgstr ""
|
||||||
msgid "Expected a UUID"
|
msgid "Expected a UUID"
|
||||||
msgstr "Esperado um"
|
msgstr "Esperado um"
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Central.c
|
#: shared-bindings/_bleio/Adapter.c
|
||||||
msgid "Expected an Address"
|
msgid "Expected an Address"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -574,6 +585,11 @@ msgstr ""
|
||||||
msgid "Expected tuple of length %d, got %d"
|
msgid "Expected tuple of length %d, got %d"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: ports/nrf/common-hal/_bleio/__init__.c
|
||||||
|
#, c-format
|
||||||
|
msgid "Failed initiate attribute read, err 0x%04x"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: shared-bindings/ps2io/Ps2.c
|
#: shared-bindings/ps2io/Ps2.c
|
||||||
msgid "Failed sending command."
|
msgid "Failed sending command."
|
||||||
msgstr "Falha ao enviar comando."
|
msgstr "Falha ao enviar comando."
|
||||||
|
@ -584,20 +600,14 @@ msgid "Failed to acquire mutex, err 0x%04x"
|
||||||
msgstr "Não é possível ler o valor do atributo. status: 0x%02x"
|
msgstr "Não é possível ler o valor do atributo. status: 0x%02x"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Service.c
|
#: ports/nrf/common-hal/_bleio/Service.c
|
||||||
#, fuzzy, c-format
|
msgid "Failed to add characteristic, NRF_ERROR_%q"
|
||||||
msgid "Failed to add characteristic, err 0x%04x"
|
msgstr ""
|
||||||
msgstr "Não pode parar propaganda. status: 0x%02x"
|
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Characteristic.c
|
#: ports/nrf/common-hal/_bleio/Characteristic.c
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to add descriptor, err 0x%04x"
|
msgid "Failed to add descriptor, err 0x%04x"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
|
||||||
#, fuzzy, c-format
|
|
||||||
msgid "Failed to add service, err 0x%04x"
|
|
||||||
msgstr "Não pode parar propaganda. status: 0x%02x"
|
|
||||||
|
|
||||||
#: ports/atmel-samd/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
|
#: ports/atmel-samd/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
|
||||||
msgid "Failed to allocate RX buffer"
|
msgid "Failed to allocate RX buffer"
|
||||||
msgstr "Falha ao alocar buffer RX"
|
msgstr "Falha ao alocar buffer RX"
|
||||||
|
@ -609,25 +619,22 @@ msgid "Failed to allocate RX buffer of %d bytes"
|
||||||
msgstr "Falha ao alocar buffer RX de %d bytes"
|
msgstr "Falha ao alocar buffer RX de %d bytes"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Adapter.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
#, fuzzy
|
msgid "Failed to change softdevice state, NRF_ERROR_%q"
|
||||||
msgid "Failed to change softdevice state"
|
|
||||||
msgstr "Não pode parar propaganda. status: 0x%02x"
|
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
|
||||||
#, c-format
|
|
||||||
msgid "Failed to configure advertising, err 0x%04x"
|
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Central.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
|
msgid "Failed to connect: internal error"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
msgid "Failed to connect: timeout"
|
msgid "Failed to connect: timeout"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Scanner.c
|
#: ports/nrf/common-hal/_bleio/Service.c
|
||||||
#, fuzzy, c-format
|
msgid "Failed to create service, NRF_ERROR_%q"
|
||||||
msgid "Failed to continue scanning, err 0x%04x"
|
msgstr ""
|
||||||
msgstr "Não é possível iniciar o anúncio. status: 0x%02x"
|
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/__init__.c
|
#: ports/nrf/common-hal/_bleio/Connection.c
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgid "Failed to discover services"
|
msgid "Failed to discover services"
|
||||||
msgstr "Não pode parar propaganda. status: 0x%02x"
|
msgstr "Não pode parar propaganda. status: 0x%02x"
|
||||||
|
@ -646,7 +653,7 @@ msgstr "Não pode parar propaganda. status: 0x%02x"
|
||||||
msgid "Failed to notify or indicate attribute value, err 0x%04x"
|
msgid "Failed to notify or indicate attribute value, err 0x%04x"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Connection.c
|
||||||
msgid "Failed to pair"
|
msgid "Failed to pair"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -655,8 +662,7 @@ msgstr ""
|
||||||
msgid "Failed to read CCCD value, err 0x%04x"
|
msgid "Failed to read CCCD value, err 0x%04x"
|
||||||
msgstr "Não é possível ler o valor do atributo. status: 0x%02x"
|
msgstr "Não é possível ler o valor do atributo. status: 0x%02x"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Characteristic.c
|
#: ports/nrf/common-hal/_bleio/__init__.c
|
||||||
#: ports/nrf/common-hal/_bleio/Descriptor.c
|
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to read attribute value, err 0x%04x"
|
msgid "Failed to read attribute value, err 0x%04x"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -676,35 +682,27 @@ msgstr "Não é possível adicionar o UUID de 128 bits específico do fornecedor
|
||||||
msgid "Failed to release mutex, err 0x%04x"
|
msgid "Failed to release mutex, err 0x%04x"
|
||||||
msgstr "Não é possível ler o valor do atributo. status: 0x%02x"
|
msgstr "Não é possível ler o valor do atributo. status: 0x%02x"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
#, c-format
|
msgid "Failed to start advertising, NRF_ERROR_%q"
|
||||||
msgid "Failed to set device name, err 0x%04x"
|
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
#, fuzzy, c-format
|
|
||||||
msgid "Failed to start advertising, err 0x%04x"
|
|
||||||
msgstr "Não é possível iniciar o anúncio. status: 0x%02x"
|
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Central.c
|
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to start connecting, error 0x%04x"
|
msgid "Failed to start connecting, error 0x%04x"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Connection.c
|
||||||
#, c-format
|
msgid "Failed to start pairing, NRF_ERROR_%q"
|
||||||
msgid "Failed to start pairing, error 0x%04x"
|
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Scanner.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
#, fuzzy, c-format
|
#, fuzzy, c-format
|
||||||
msgid "Failed to start scanning, err 0x%04x"
|
msgid "Failed to start scanning, err 0x%04x"
|
||||||
msgstr "Não é possível iniciar o anúncio. status: 0x%02x"
|
msgstr "Não é possível iniciar o anúncio. status: 0x%02x"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
#, fuzzy, c-format
|
msgid "Failed to stop advertising, NRF_ERROR_%q"
|
||||||
msgid "Failed to stop advertising, err 0x%04x"
|
msgstr ""
|
||||||
msgstr "Não pode parar propaganda. status: 0x%02x"
|
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Characteristic.c
|
#: ports/nrf/common-hal/_bleio/Characteristic.c
|
||||||
#, c-format
|
#, c-format
|
||||||
|
@ -1004,9 +1002,8 @@ msgstr ""
|
||||||
msgid "No such file/directory"
|
msgid "No such file/directory"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/__init__.c shared-bindings/_bleio/Central.c
|
#: ports/nrf/common-hal/_bleio/__init__.c
|
||||||
#: shared-bindings/_bleio/CharacteristicBuffer.c
|
#: shared-bindings/_bleio/CharacteristicBuffer.c
|
||||||
#: shared-bindings/_bleio/Peripheral.c
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgid "Not connected"
|
msgid "Not connected"
|
||||||
msgstr "Não é possível conectar-se ao AP"
|
msgstr "Não é possível conectar-se ao AP"
|
||||||
|
@ -1084,6 +1081,10 @@ msgstr "Não é possível remontar o sistema de arquivos"
|
||||||
msgid "Pop from an empty Ps2 buffer"
|
msgid "Pop from an empty Ps2 buffer"
|
||||||
msgstr "Buffer Ps2 vazio"
|
msgstr "Buffer Ps2 vazio"
|
||||||
|
|
||||||
|
#: shared-bindings/_bleio/Adapter.c
|
||||||
|
msgid "Prefix buffer must be on the heap"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: main.c
|
#: main.c
|
||||||
msgid "Press any key to enter the REPL. Use CTRL-D to reload."
|
msgid "Press any key to enter the REPL. Use CTRL-D to reload."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -1151,6 +1152,10 @@ msgstr ""
|
||||||
msgid "Sample rate too high. It must be less than %d"
|
msgid "Sample rate too high. It must be less than %d"
|
||||||
msgstr "Taxa de amostragem muito alta. Deve ser menor que %d"
|
msgstr "Taxa de amostragem muito alta. Deve ser menor que %d"
|
||||||
|
|
||||||
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
|
msgid "Scan already in progess. Stop with stop_scan."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
|
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
|
||||||
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c
|
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c
|
||||||
msgid "Serializer in use"
|
msgid "Serializer in use"
|
||||||
|
@ -1165,11 +1170,6 @@ msgstr ""
|
||||||
msgid "Slices not supported"
|
msgid "Slices not supported"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Adapter.c
|
|
||||||
#, c-format
|
|
||||||
msgid "Soft device assert, id: 0x%08lX, pc: 0x%08lX"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: extmod/modure.c
|
#: extmod/modure.c
|
||||||
msgid "Splitting with sub-captures"
|
msgid "Splitting with sub-captures"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -1975,7 +1975,7 @@ msgstr ""
|
||||||
msgid "integer required"
|
msgid "integer required"
|
||||||
msgstr "inteiro requerido"
|
msgstr "inteiro requerido"
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Peripheral.c shared-bindings/_bleio/Scanner.c
|
#: shared-bindings/_bleio/Adapter.c
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "interval must be in range %s-%s"
|
msgid "interval must be in range %s-%s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -2152,11 +2152,6 @@ msgstr ""
|
||||||
msgid "name '%q' is not defined"
|
msgid "name '%q' is not defined"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Peripheral.c
|
|
||||||
#, fuzzy
|
|
||||||
msgid "name must be a string"
|
|
||||||
msgstr "heap deve ser uma lista"
|
|
||||||
|
|
||||||
#: py/runtime.c
|
#: py/runtime.c
|
||||||
msgid "name not defined"
|
msgid "name not defined"
|
||||||
msgstr "nome não definido"
|
msgstr "nome não definido"
|
||||||
|
@ -2207,7 +2202,7 @@ msgstr ""
|
||||||
msgid "no such attribute"
|
msgid "no such attribute"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/__init__.c
|
#: ports/nrf/common-hal/_bleio/Connection.c
|
||||||
msgid "non-UUID found in service_uuids_whitelist"
|
msgid "non-UUID found in service_uuids_whitelist"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -2692,7 +2687,7 @@ msgstr ""
|
||||||
msgid "value_count must be > 0"
|
msgid "value_count must be > 0"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Scanner.c
|
#: shared-bindings/_bleio/Adapter.c
|
||||||
msgid "window must be <= interval"
|
msgid "window must be <= interval"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -2759,10 +2754,26 @@ msgstr "passo zero"
|
||||||
#~ msgid "Failed to acquire mutex"
|
#~ msgid "Failed to acquire mutex"
|
||||||
#~ msgstr "Falha ao alocar buffer RX"
|
#~ msgstr "Falha ao alocar buffer RX"
|
||||||
|
|
||||||
|
#, fuzzy, c-format
|
||||||
|
#~ msgid "Failed to add characteristic, err 0x%04x"
|
||||||
|
#~ msgstr "Não pode parar propaganda. status: 0x%02x"
|
||||||
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#~ msgid "Failed to add service"
|
#~ msgid "Failed to add service"
|
||||||
#~ msgstr "Não pode parar propaganda. status: 0x%02x"
|
#~ msgstr "Não pode parar propaganda. status: 0x%02x"
|
||||||
|
|
||||||
|
#, fuzzy, c-format
|
||||||
|
#~ msgid "Failed to add service, err 0x%04x"
|
||||||
|
#~ msgstr "Não pode parar propaganda. status: 0x%02x"
|
||||||
|
|
||||||
|
#, fuzzy
|
||||||
|
#~ msgid "Failed to change softdevice state"
|
||||||
|
#~ msgstr "Não pode parar propaganda. status: 0x%02x"
|
||||||
|
|
||||||
|
#, fuzzy, c-format
|
||||||
|
#~ msgid "Failed to continue scanning, err 0x%04x"
|
||||||
|
#~ msgstr "Não é possível iniciar o anúncio. status: 0x%02x"
|
||||||
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#~ msgid "Failed to create mutex"
|
#~ msgid "Failed to create mutex"
|
||||||
#~ msgstr "Não é possível ler o valor do atributo. status: 0x%02x"
|
#~ msgstr "Não é possível ler o valor do atributo. status: 0x%02x"
|
||||||
|
@ -2783,6 +2794,10 @@ msgstr "passo zero"
|
||||||
#~ msgid "Failed to start advertising"
|
#~ msgid "Failed to start advertising"
|
||||||
#~ msgstr "Não é possível iniciar o anúncio. status: 0x%02x"
|
#~ msgstr "Não é possível iniciar o anúncio. status: 0x%02x"
|
||||||
|
|
||||||
|
#, fuzzy, c-format
|
||||||
|
#~ msgid "Failed to start advertising, err 0x%04x"
|
||||||
|
#~ msgstr "Não é possível iniciar o anúncio. status: 0x%02x"
|
||||||
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#~ msgid "Failed to start scanning"
|
#~ msgid "Failed to start scanning"
|
||||||
#~ msgstr "Não é possível iniciar o anúncio. status: 0x%02x"
|
#~ msgstr "Não é possível iniciar o anúncio. status: 0x%02x"
|
||||||
|
@ -2791,6 +2806,10 @@ msgstr "passo zero"
|
||||||
#~ msgid "Failed to stop advertising"
|
#~ msgid "Failed to stop advertising"
|
||||||
#~ msgstr "Não pode parar propaganda. status: 0x%02x"
|
#~ msgstr "Não pode parar propaganda. status: 0x%02x"
|
||||||
|
|
||||||
|
#, fuzzy, c-format
|
||||||
|
#~ msgid "Failed to stop advertising, err 0x%04x"
|
||||||
|
#~ msgstr "Não pode parar propaganda. status: 0x%02x"
|
||||||
|
|
||||||
#~ msgid "GPIO16 does not support pull up."
|
#~ msgid "GPIO16 does not support pull up."
|
||||||
#~ msgstr "GPIO16 não suporta pull up."
|
#~ msgstr "GPIO16 não suporta pull up."
|
||||||
|
|
||||||
|
@ -2921,6 +2940,10 @@ msgstr "passo zero"
|
||||||
#~ msgid "memory allocation failed, allocating %u bytes for native code"
|
#~ msgid "memory allocation failed, allocating %u bytes for native code"
|
||||||
#~ msgstr "alocação de memória falhou, alocando %u bytes para código nativo"
|
#~ msgstr "alocação de memória falhou, alocando %u bytes para código nativo"
|
||||||
|
|
||||||
|
#, fuzzy
|
||||||
|
#~ msgid "name must be a string"
|
||||||
|
#~ msgstr "heap deve ser uma lista"
|
||||||
|
|
||||||
#~ msgid "not a valid ADC Channel: %d"
|
#~ msgid "not a valid ADC Channel: %d"
|
||||||
#~ msgstr "não é um canal ADC válido: %d"
|
#~ msgstr "não é um canal ADC válido: %d"
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,7 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: circuitpython-cn\n"
|
"Project-Id-Version: circuitpython-cn\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2019-09-08 17:30-0500\n"
|
"POT-Creation-Date: 2019-10-21 19:50-0700\n"
|
||||||
"PO-Revision-Date: 2019-04-13 10:10-0700\n"
|
"PO-Revision-Date: 2019-04-13 10:10-0700\n"
|
||||||
"Last-Translator: hexthat\n"
|
"Last-Translator: hexthat\n"
|
||||||
"Language-Team: Chinese Hanyu Pinyin\n"
|
"Language-Team: Chinese Hanyu Pinyin\n"
|
||||||
|
@ -261,6 +261,10 @@ msgstr "Cǐ yǐn jiǎo de suǒyǒu jìshí qì zhèngzài shǐyòng"
|
||||||
msgid "All timers in use"
|
msgid "All timers in use"
|
||||||
msgstr "Suǒyǒu jìshí qì shǐyòng"
|
msgstr "Suǒyǒu jìshí qì shǐyòng"
|
||||||
|
|
||||||
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
|
msgid "Already advertising."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/analogio/AnalogOut.c
|
#: ports/nrf/common-hal/analogio/AnalogOut.c
|
||||||
msgid "AnalogOut functionality not supported"
|
msgid "AnalogOut functionality not supported"
|
||||||
msgstr "Bù zhīchí AnalogOut gōngnéng"
|
msgstr "Bù zhīchí AnalogOut gōngnéng"
|
||||||
|
@ -329,6 +333,11 @@ msgstr "Liàngdù bìxū jiè yú 0 dào 255 zhī jiān"
|
||||||
msgid "Brightness not adjustable"
|
msgid "Brightness not adjustable"
|
||||||
msgstr "Liàngdù wúfǎ tiáozhěng"
|
msgstr "Liàngdù wúfǎ tiáozhěng"
|
||||||
|
|
||||||
|
#: shared-bindings/_bleio/UUID.c
|
||||||
|
#, c-format
|
||||||
|
msgid "Buffer + offset too small %d %d %d"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: shared-module/usb_hid/Device.c
|
#: shared-module/usb_hid/Device.c
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Buffer incorrect size. Should be %d bytes."
|
msgid "Buffer incorrect size. Should be %d bytes."
|
||||||
|
@ -459,6 +468,12 @@ msgstr "Mìnglìng bìxū wèi 0-255"
|
||||||
msgid "Command must be an int between 0 and 255"
|
msgid "Command must be an int between 0 and 255"
|
||||||
msgstr "Mìnglìng bìxū shì 0 dào 255 zhī jiān de int"
|
msgstr "Mìnglìng bìxū shì 0 dào 255 zhī jiān de int"
|
||||||
|
|
||||||
|
#: shared-bindings/_bleio/Connection.c
|
||||||
|
msgid ""
|
||||||
|
"Connection has been disconnected and can no longer be used. Create a new "
|
||||||
|
"connection."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: py/persistentcode.c
|
#: py/persistentcode.c
|
||||||
msgid "Corrupt .mpy file"
|
msgid "Corrupt .mpy file"
|
||||||
msgstr "Fǔbài de .mpy wénjiàn"
|
msgstr "Fǔbài de .mpy wénjiàn"
|
||||||
|
@ -501,7 +516,7 @@ msgstr "Shùjù 0 de yǐn jiǎo bìxū shì zì jié duìqí"
|
||||||
msgid "Data chunk must follow fmt chunk"
|
msgid "Data chunk must follow fmt chunk"
|
||||||
msgstr "Shùjù kuài bìxū zūnxún fmt qū kuài"
|
msgstr "Shùjù kuài bìxū zūnxún fmt qū kuài"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
msgid "Data too large for advertisement packet"
|
msgid "Data too large for advertisement packet"
|
||||||
msgstr "Guǎnggào bāo de shùjù tài dà"
|
msgstr "Guǎnggào bāo de shùjù tài dà"
|
||||||
|
|
||||||
|
@ -547,10 +562,6 @@ msgstr "Yùqí %q"
|
||||||
msgid "Expected a Characteristic"
|
msgid "Expected a Characteristic"
|
||||||
msgstr "Yùqí de tèdiǎn"
|
msgstr "Yùqí de tèdiǎn"
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Service.c
|
|
||||||
msgid "Expected a Peripheral"
|
|
||||||
msgstr "Qídài yīgè wàiwéi shèbèi"
|
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Characteristic.c
|
#: shared-bindings/_bleio/Characteristic.c
|
||||||
msgid "Expected a Service"
|
msgid "Expected a Service"
|
||||||
msgstr "Yùqí fúwù"
|
msgstr "Yùqí fúwù"
|
||||||
|
@ -560,7 +571,7 @@ msgstr "Yùqí fúwù"
|
||||||
msgid "Expected a UUID"
|
msgid "Expected a UUID"
|
||||||
msgstr "Yùqí UUID"
|
msgstr "Yùqí UUID"
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Central.c
|
#: shared-bindings/_bleio/Adapter.c
|
||||||
msgid "Expected an Address"
|
msgid "Expected an Address"
|
||||||
msgstr "Qídài yīgè dìzhǐ"
|
msgstr "Qídài yīgè dìzhǐ"
|
||||||
|
|
||||||
|
@ -569,6 +580,11 @@ msgstr "Qídài yīgè dìzhǐ"
|
||||||
msgid "Expected tuple of length %d, got %d"
|
msgid "Expected tuple of length %d, got %d"
|
||||||
msgstr "Qīwàng de chángdù wèi %d de yuán zǔ, dédào %d"
|
msgstr "Qīwàng de chángdù wèi %d de yuán zǔ, dédào %d"
|
||||||
|
|
||||||
|
#: ports/nrf/common-hal/_bleio/__init__.c
|
||||||
|
#, c-format
|
||||||
|
msgid "Failed initiate attribute read, err 0x%04x"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: shared-bindings/ps2io/Ps2.c
|
#: shared-bindings/ps2io/Ps2.c
|
||||||
msgid "Failed sending command."
|
msgid "Failed sending command."
|
||||||
msgstr "Fāsòng mìnglìng shībài."
|
msgstr "Fāsòng mìnglìng shībài."
|
||||||
|
@ -579,20 +595,14 @@ msgid "Failed to acquire mutex, err 0x%04x"
|
||||||
msgstr "Wúfǎ huòdé mutex, err 0x%04x"
|
msgstr "Wúfǎ huòdé mutex, err 0x%04x"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Service.c
|
#: ports/nrf/common-hal/_bleio/Service.c
|
||||||
#, c-format
|
msgid "Failed to add characteristic, NRF_ERROR_%q"
|
||||||
msgid "Failed to add characteristic, err 0x%04x"
|
msgstr ""
|
||||||
msgstr "Tiānjiā tèxìng shībài, err 0x%04x"
|
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Characteristic.c
|
#: ports/nrf/common-hal/_bleio/Characteristic.c
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to add descriptor, err 0x%04x"
|
msgid "Failed to add descriptor, err 0x%04x"
|
||||||
msgstr "Wúfǎ tiānjiā miáoshù fú, err 0x%04x"
|
msgstr "Wúfǎ tiānjiā miáoshù fú, err 0x%04x"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
|
||||||
#, c-format
|
|
||||||
msgid "Failed to add service, err 0x%04x"
|
|
||||||
msgstr "Tiānjiā fúwù shībài, err 0x%04x"
|
|
||||||
|
|
||||||
#: ports/atmel-samd/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
|
#: ports/atmel-samd/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
|
||||||
msgid "Failed to allocate RX buffer"
|
msgid "Failed to allocate RX buffer"
|
||||||
msgstr "Fēnpèi RX huǎnchōng shībài"
|
msgstr "Fēnpèi RX huǎnchōng shībài"
|
||||||
|
@ -604,24 +614,22 @@ msgid "Failed to allocate RX buffer of %d bytes"
|
||||||
msgstr "Fēnpèi RX huǎnchōng qū%d zì jié shībài"
|
msgstr "Fēnpèi RX huǎnchōng qū%d zì jié shībài"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Adapter.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
msgid "Failed to change softdevice state"
|
msgid "Failed to change softdevice state, NRF_ERROR_%q"
|
||||||
msgstr "Gēnggǎi ruǎn shèbèi zhuàngtài shībài"
|
msgstr ""
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
#, c-format
|
msgid "Failed to connect: internal error"
|
||||||
msgid "Failed to configure advertising, err 0x%04x"
|
msgstr ""
|
||||||
msgstr "Wúfǎ pèizhì guǎnggào, cuòwù 0x%04x"
|
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Central.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
msgid "Failed to connect: timeout"
|
msgid "Failed to connect: timeout"
|
||||||
msgstr "Liánjiē shībài: Chāoshí"
|
msgstr "Liánjiē shībài: Chāoshí"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Scanner.c
|
#: ports/nrf/common-hal/_bleio/Service.c
|
||||||
#, c-format
|
msgid "Failed to create service, NRF_ERROR_%q"
|
||||||
msgid "Failed to continue scanning, err 0x%04x"
|
msgstr ""
|
||||||
msgstr "Jìxù sǎomiáo shībài, err 0x%04x"
|
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/__init__.c
|
#: ports/nrf/common-hal/_bleio/Connection.c
|
||||||
msgid "Failed to discover services"
|
msgid "Failed to discover services"
|
||||||
msgstr "Fāxiàn fúwù shībài"
|
msgstr "Fāxiàn fúwù shībài"
|
||||||
|
|
||||||
|
@ -638,7 +646,7 @@ msgstr "Wúfǎ huòdé ruǎnjiàn shèbèi zhuàngtài"
|
||||||
msgid "Failed to notify or indicate attribute value, err 0x%04x"
|
msgid "Failed to notify or indicate attribute value, err 0x%04x"
|
||||||
msgstr "Wúfǎ tōngzhī huò xiǎnshì shǔxìng zhí, err 0x%04x"
|
msgstr "Wúfǎ tōngzhī huò xiǎnshì shǔxìng zhí, err 0x%04x"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Connection.c
|
||||||
msgid "Failed to pair"
|
msgid "Failed to pair"
|
||||||
msgstr "Pèiduì shībài"
|
msgstr "Pèiduì shībài"
|
||||||
|
|
||||||
|
@ -647,8 +655,7 @@ msgstr "Pèiduì shībài"
|
||||||
msgid "Failed to read CCCD value, err 0x%04x"
|
msgid "Failed to read CCCD value, err 0x%04x"
|
||||||
msgstr "Dòu qǔ CCCD zhí, err 0x%04x shībài"
|
msgstr "Dòu qǔ CCCD zhí, err 0x%04x shībài"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Characteristic.c
|
#: ports/nrf/common-hal/_bleio/__init__.c
|
||||||
#: ports/nrf/common-hal/_bleio/Descriptor.c
|
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to read attribute value, err 0x%04x"
|
msgid "Failed to read attribute value, err 0x%04x"
|
||||||
msgstr "Dòu qǔ shǔxìng zhí shībài, err 0x%04x"
|
msgstr "Dòu qǔ shǔxìng zhí shībài, err 0x%04x"
|
||||||
|
@ -668,35 +675,27 @@ msgstr "Wúfǎ zhùcè màizhǔ tèdìng de UUID, err 0x%04x"
|
||||||
msgid "Failed to release mutex, err 0x%04x"
|
msgid "Failed to release mutex, err 0x%04x"
|
||||||
msgstr "Wúfǎ shìfàng mutex, err 0x%04x"
|
msgstr "Wúfǎ shìfàng mutex, err 0x%04x"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
#, c-format
|
msgid "Failed to start advertising, NRF_ERROR_%q"
|
||||||
msgid "Failed to set device name, err 0x%04x"
|
msgstr ""
|
||||||
msgstr "Wúfǎ shèzhì shèbèi míngchēng, cuòwù 0x%04x"
|
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
#, c-format
|
|
||||||
msgid "Failed to start advertising, err 0x%04x"
|
|
||||||
msgstr "Qǐdòng guǎnggào shībài, err 0x%04x"
|
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Central.c
|
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to start connecting, error 0x%04x"
|
msgid "Failed to start connecting, error 0x%04x"
|
||||||
msgstr "Wúfǎ kāishǐ liánjiē, cuòwù 0x%04x"
|
msgstr "Wúfǎ kāishǐ liánjiē, cuòwù 0x%04x"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Connection.c
|
||||||
#, c-format
|
msgid "Failed to start pairing, NRF_ERROR_%q"
|
||||||
msgid "Failed to start pairing, error 0x%04x"
|
msgstr ""
|
||||||
msgstr "Wúfǎ kāishǐ pèiduì, cuòwù 0x%04x"
|
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Scanner.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to start scanning, err 0x%04x"
|
msgid "Failed to start scanning, err 0x%04x"
|
||||||
msgstr "Qǐdòng sǎomiáo shībài, err 0x%04x"
|
msgstr "Qǐdòng sǎomiáo shībài, err 0x%04x"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Peripheral.c
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
#, c-format
|
msgid "Failed to stop advertising, NRF_ERROR_%q"
|
||||||
msgid "Failed to stop advertising, err 0x%04x"
|
msgstr ""
|
||||||
msgstr "Wúfǎ tíngzhǐ guǎnggào, err 0x%04x"
|
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Characteristic.c
|
#: ports/nrf/common-hal/_bleio/Characteristic.c
|
||||||
#, c-format
|
#, c-format
|
||||||
|
@ -999,9 +998,8 @@ msgstr "Shèbèi shàng méiyǒu kònggé"
|
||||||
msgid "No such file/directory"
|
msgid "No such file/directory"
|
||||||
msgstr "Méiyǒu cǐ lèi wénjiàn/mùlù"
|
msgstr "Méiyǒu cǐ lèi wénjiàn/mùlù"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/__init__.c shared-bindings/_bleio/Central.c
|
#: ports/nrf/common-hal/_bleio/__init__.c
|
||||||
#: shared-bindings/_bleio/CharacteristicBuffer.c
|
#: shared-bindings/_bleio/CharacteristicBuffer.c
|
||||||
#: shared-bindings/_bleio/Peripheral.c
|
|
||||||
msgid "Not connected"
|
msgid "Not connected"
|
||||||
msgstr "Wèi liánjiē"
|
msgstr "Wèi liánjiē"
|
||||||
|
|
||||||
|
@ -1079,6 +1077,10 @@ msgstr "Zài wénjiàn xìtǒng shàng tiānjiā rènhé mókuài\n"
|
||||||
msgid "Pop from an empty Ps2 buffer"
|
msgid "Pop from an empty Ps2 buffer"
|
||||||
msgstr "Cóng kōng de Ps2 huǎnchōng qū dànchū"
|
msgstr "Cóng kōng de Ps2 huǎnchōng qū dànchū"
|
||||||
|
|
||||||
|
#: shared-bindings/_bleio/Adapter.c
|
||||||
|
msgid "Prefix buffer must be on the heap"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: main.c
|
#: main.c
|
||||||
msgid "Press any key to enter the REPL. Use CTRL-D to reload."
|
msgid "Press any key to enter the REPL. Use CTRL-D to reload."
|
||||||
msgstr "Àn xià rènhé jiàn jìnrù REPL. Shǐyòng CTRL-D chóngxīn jiāzài."
|
msgstr "Àn xià rènhé jiàn jìnrù REPL. Shǐyòng CTRL-D chóngxīn jiāzài."
|
||||||
|
@ -1145,6 +1147,10 @@ msgstr "Cǎiyàng lǜ bìxū wèi zhèng shù"
|
||||||
msgid "Sample rate too high. It must be less than %d"
|
msgid "Sample rate too high. It must be less than %d"
|
||||||
msgstr "Cǎiyàng lǜ tài gāo. Tā bìxū xiǎoyú %d"
|
msgstr "Cǎiyàng lǜ tài gāo. Tā bìxū xiǎoyú %d"
|
||||||
|
|
||||||
|
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||||
|
msgid "Scan already in progess. Stop with stop_scan."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
|
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
|
||||||
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c
|
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c
|
||||||
msgid "Serializer in use"
|
msgid "Serializer in use"
|
||||||
|
@ -1159,11 +1165,6 @@ msgstr "Qiēpiàn hé zhí bùtóng chángdù."
|
||||||
msgid "Slices not supported"
|
msgid "Slices not supported"
|
||||||
msgstr "Qiēpiàn bù shòu zhīchí"
|
msgstr "Qiēpiàn bù shòu zhīchí"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/Adapter.c
|
|
||||||
#, c-format
|
|
||||||
msgid "Soft device assert, id: 0x%08lX, pc: 0x%08lX"
|
|
||||||
msgstr "Ruǎn shèbèi wéihù, id: 0X%08lX, pc: 0X%08lX"
|
|
||||||
|
|
||||||
#: extmod/modure.c
|
#: extmod/modure.c
|
||||||
msgid "Splitting with sub-captures"
|
msgid "Splitting with sub-captures"
|
||||||
msgstr "Yǔ zi bǔhuò fēnliè"
|
msgstr "Yǔ zi bǔhuò fēnliè"
|
||||||
|
@ -1986,7 +1987,7 @@ msgstr "zhěngshù() cānshù 2 bìxū > = 2 qiě <= 36"
|
||||||
msgid "integer required"
|
msgid "integer required"
|
||||||
msgstr "xūyào zhěngshù"
|
msgstr "xūyào zhěngshù"
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Peripheral.c shared-bindings/_bleio/Scanner.c
|
#: shared-bindings/_bleio/Adapter.c
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "interval must be in range %s-%s"
|
msgid "interval must be in range %s-%s"
|
||||||
msgstr "Jiàngé bìxū zài %s-%s fànwéi nèi"
|
msgstr "Jiàngé bìxū zài %s-%s fànwéi nèi"
|
||||||
|
@ -2164,10 +2165,6 @@ msgstr "bìxū shǐyòng guānjiàn cí cānshù"
|
||||||
msgid "name '%q' is not defined"
|
msgid "name '%q' is not defined"
|
||||||
msgstr "míngchēng '%q' wèi dìngyì"
|
msgstr "míngchēng '%q' wèi dìngyì"
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Peripheral.c
|
|
||||||
msgid "name must be a string"
|
|
||||||
msgstr "míngchēng bìxū shì yīgè zìfú chuàn"
|
|
||||||
|
|
||||||
#: py/runtime.c
|
#: py/runtime.c
|
||||||
msgid "name not defined"
|
msgid "name not defined"
|
||||||
msgstr "míngchēng wèi dìngyì"
|
msgstr "míngchēng wèi dìngyì"
|
||||||
|
@ -2219,7 +2216,7 @@ msgstr "Méiyǒu kěyòng de fùwèi yǐn jiǎo"
|
||||||
msgid "no such attribute"
|
msgid "no such attribute"
|
||||||
msgstr "méiyǒu cǐ shǔxìng"
|
msgstr "méiyǒu cǐ shǔxìng"
|
||||||
|
|
||||||
#: ports/nrf/common-hal/_bleio/__init__.c
|
#: ports/nrf/common-hal/_bleio/Connection.c
|
||||||
msgid "non-UUID found in service_uuids_whitelist"
|
msgid "non-UUID found in service_uuids_whitelist"
|
||||||
msgstr "Zài service_uuids bái míngdān zhōng zhǎodào fēi UUID"
|
msgstr "Zài service_uuids bái míngdān zhōng zhǎodào fēi UUID"
|
||||||
|
|
||||||
|
@ -2703,7 +2700,7 @@ msgstr "Zhí bìxū fúhé %d zì jié"
|
||||||
msgid "value_count must be > 0"
|
msgid "value_count must be > 0"
|
||||||
msgstr "zhí jìshù bìxū wèi > 0"
|
msgstr "zhí jìshù bìxū wèi > 0"
|
||||||
|
|
||||||
#: shared-bindings/_bleio/Scanner.c
|
#: shared-bindings/_bleio/Adapter.c
|
||||||
msgid "window must be <= interval"
|
msgid "window must be <= interval"
|
||||||
msgstr "Chuāngkǒu bìxū shì <= jiàngé"
|
msgstr "Chuāngkǒu bìxū shì <= jiàngé"
|
||||||
|
|
||||||
|
@ -2762,33 +2759,71 @@ msgstr "líng bù"
|
||||||
#~ msgid "Data too large for the advertisement packet"
|
#~ msgid "Data too large for the advertisement packet"
|
||||||
#~ msgstr "Guǎnggào bāo de shùjù tài dà"
|
#~ msgstr "Guǎnggào bāo de shùjù tài dà"
|
||||||
|
|
||||||
|
#~ msgid "Expected a Peripheral"
|
||||||
|
#~ msgstr "Qídài yīgè wàiwéi shèbèi"
|
||||||
|
|
||||||
#~ msgid "Failed to acquire mutex"
|
#~ msgid "Failed to acquire mutex"
|
||||||
#~ msgstr "Wúfǎ huòdé mutex"
|
#~ msgstr "Wúfǎ huòdé mutex"
|
||||||
|
|
||||||
|
#, c-format
|
||||||
|
#~ msgid "Failed to add characteristic, err 0x%04x"
|
||||||
|
#~ msgstr "Tiānjiā tèxìng shībài, err 0x%04x"
|
||||||
|
|
||||||
#~ msgid "Failed to add service"
|
#~ msgid "Failed to add service"
|
||||||
#~ msgstr "Tiānjiā fúwù shībài"
|
#~ msgstr "Tiānjiā fúwù shībài"
|
||||||
|
|
||||||
|
#, c-format
|
||||||
|
#~ msgid "Failed to add service, err 0x%04x"
|
||||||
|
#~ msgstr "Tiānjiā fúwù shībài, err 0x%04x"
|
||||||
|
|
||||||
|
#~ msgid "Failed to change softdevice state"
|
||||||
|
#~ msgstr "Gēnggǎi ruǎn shèbèi zhuàngtài shībài"
|
||||||
|
|
||||||
|
#, c-format
|
||||||
|
#~ msgid "Failed to configure advertising, err 0x%04x"
|
||||||
|
#~ msgstr "Wúfǎ pèizhì guǎnggào, cuòwù 0x%04x"
|
||||||
|
|
||||||
#~ msgid "Failed to connect:"
|
#~ msgid "Failed to connect:"
|
||||||
#~ msgstr "Liánjiē shībài:"
|
#~ msgstr "Liánjiē shībài:"
|
||||||
|
|
||||||
#~ msgid "Failed to continue scanning"
|
#~ msgid "Failed to continue scanning"
|
||||||
#~ msgstr "Jìxù sǎomiáo shībài"
|
#~ msgstr "Jìxù sǎomiáo shībài"
|
||||||
|
|
||||||
|
#, c-format
|
||||||
|
#~ msgid "Failed to continue scanning, err 0x%04x"
|
||||||
|
#~ msgstr "Jìxù sǎomiáo shībài, err 0x%04x"
|
||||||
|
|
||||||
#~ msgid "Failed to create mutex"
|
#~ msgid "Failed to create mutex"
|
||||||
#~ msgstr "Wúfǎ chuàngjiàn hù chì suǒ"
|
#~ msgstr "Wúfǎ chuàngjiàn hù chì suǒ"
|
||||||
|
|
||||||
#~ msgid "Failed to release mutex"
|
#~ msgid "Failed to release mutex"
|
||||||
#~ msgstr "Wúfǎ shìfàng mutex"
|
#~ msgstr "Wúfǎ shìfàng mutex"
|
||||||
|
|
||||||
|
#, c-format
|
||||||
|
#~ msgid "Failed to set device name, err 0x%04x"
|
||||||
|
#~ msgstr "Wúfǎ shèzhì shèbèi míngchēng, cuòwù 0x%04x"
|
||||||
|
|
||||||
#~ msgid "Failed to start advertising"
|
#~ msgid "Failed to start advertising"
|
||||||
#~ msgstr "Qǐdòng guǎnggào shībài"
|
#~ msgstr "Qǐdòng guǎnggào shībài"
|
||||||
|
|
||||||
|
#, c-format
|
||||||
|
#~ msgid "Failed to start advertising, err 0x%04x"
|
||||||
|
#~ msgstr "Qǐdòng guǎnggào shībài, err 0x%04x"
|
||||||
|
|
||||||
|
#, c-format
|
||||||
|
#~ msgid "Failed to start pairing, error 0x%04x"
|
||||||
|
#~ msgstr "Wúfǎ kāishǐ pèiduì, cuòwù 0x%04x"
|
||||||
|
|
||||||
#~ msgid "Failed to start scanning"
|
#~ msgid "Failed to start scanning"
|
||||||
#~ msgstr "Qǐdòng sǎomiáo shībài"
|
#~ msgstr "Qǐdòng sǎomiáo shībài"
|
||||||
|
|
||||||
#~ msgid "Failed to stop advertising"
|
#~ msgid "Failed to stop advertising"
|
||||||
#~ msgstr "Wúfǎ tíngzhǐ guǎnggào"
|
#~ msgstr "Wúfǎ tíngzhǐ guǎnggào"
|
||||||
|
|
||||||
|
#, c-format
|
||||||
|
#~ msgid "Failed to stop advertising, err 0x%04x"
|
||||||
|
#~ msgstr "Wúfǎ tíngzhǐ guǎnggào, err 0x%04x"
|
||||||
|
|
||||||
#~ msgid "Invalid bit clock pin"
|
#~ msgid "Invalid bit clock pin"
|
||||||
#~ msgstr "Wúxiào de wèi shízhōng yǐn jiǎo"
|
#~ msgstr "Wúxiào de wèi shízhōng yǐn jiǎo"
|
||||||
|
|
||||||
|
@ -2819,6 +2854,10 @@ msgstr "líng bù"
|
||||||
#~ msgstr ""
|
#~ msgstr ""
|
||||||
#~ "Jǐn zhīchí dān sè, suǒyǐn 8bpp hé 16bpp huò gèng dà de BMP: %d bpp tígōng"
|
#~ "Jǐn zhīchí dān sè, suǒyǐn 8bpp hé 16bpp huò gèng dà de BMP: %d bpp tígōng"
|
||||||
|
|
||||||
|
#, c-format
|
||||||
|
#~ msgid "Soft device assert, id: 0x%08lX, pc: 0x%08lX"
|
||||||
|
#~ msgstr "Ruǎn shèbèi wéihù, id: 0X%08lX, pc: 0X%08lX"
|
||||||
|
|
||||||
#~ msgid "Tile indices must be 0 - 255"
|
#~ msgid "Tile indices must be 0 - 255"
|
||||||
#~ msgstr "Píng pū zhǐshù bìxū wèi 0 - 255"
|
#~ msgstr "Píng pū zhǐshù bìxū wèi 0 - 255"
|
||||||
|
|
||||||
|
@ -2840,6 +2879,9 @@ msgstr "líng bù"
|
||||||
#~ msgid "interval not in range 0.0020 to 10.24"
|
#~ msgid "interval not in range 0.0020 to 10.24"
|
||||||
#~ msgstr "jùlí 0.0020 Zhì 10.24 Zhī jiān de jiàngé shíjiān"
|
#~ msgstr "jùlí 0.0020 Zhì 10.24 Zhī jiān de jiàngé shíjiān"
|
||||||
|
|
||||||
|
#~ msgid "name must be a string"
|
||||||
|
#~ msgstr "míngchēng bìxū shì yīgè zìfú chuàn"
|
||||||
|
|
||||||
#~ msgid "row must be packed and word aligned"
|
#~ msgid "row must be packed and word aligned"
|
||||||
#~ msgstr "xíng bìxū dǎbāo bìngqiě zì duìqí"
|
#~ msgstr "xíng bìxū dǎbāo bìngqiě zì duìqí"
|
||||||
|
|
||||||
|
|
13
main.c
13
main.c
|
@ -69,6 +69,11 @@
|
||||||
#include "shared-module/board/__init__.h"
|
#include "shared-module/board/__init__.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if CIRCUITPY_BLEIO
|
||||||
|
#include "shared-bindings/_bleio/__init__.h"
|
||||||
|
#include "supervisor/shared/bluetooth.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
void do_str(const char *src, mp_parse_input_kind_t input_kind) {
|
void do_str(const char *src, mp_parse_input_kind_t input_kind) {
|
||||||
mp_lexer_t *lex = mp_lexer_new_from_str_len(MP_QSTR__lt_stdin_gt_, src, strlen(src), 0);
|
mp_lexer_t *lex = mp_lexer_new_from_str_len(MP_QSTR__lt_stdin_gt_, src, strlen(src), 0);
|
||||||
if (lex == NULL) {
|
if (lex == NULL) {
|
||||||
|
@ -439,6 +444,10 @@ int __attribute__((used)) main(void) {
|
||||||
// Start serial and HID after giving boot.py a chance to tweak behavior.
|
// Start serial and HID after giving boot.py a chance to tweak behavior.
|
||||||
serial_init();
|
serial_init();
|
||||||
|
|
||||||
|
#if CIRCUITPY_BLEIO
|
||||||
|
supervisor_start_bluetooth();
|
||||||
|
#endif
|
||||||
|
|
||||||
// Boot script is finished, so now go into REPL/main mode.
|
// Boot script is finished, so now go into REPL/main mode.
|
||||||
int exit_code = PYEXEC_FORCED_EXIT;
|
int exit_code = PYEXEC_FORCED_EXIT;
|
||||||
bool skip_repl = true;
|
bool skip_repl = true;
|
||||||
|
@ -475,6 +484,10 @@ void gc_collect(void) {
|
||||||
displayio_gc_collect();
|
displayio_gc_collect();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if CIRCUITPY_BLEIO
|
||||||
|
common_hal_bleio_gc_collect();
|
||||||
|
#endif
|
||||||
|
|
||||||
// This naively collects all object references from an approximate stack
|
// This naively collects all object references from an approximate stack
|
||||||
// range.
|
// range.
|
||||||
gc_collect_root((void**)sp, ((uint32_t)port_stack_get_top() - sp) / sizeof(uint32_t));
|
gc_collect_root((void**)sp, ((uint32_t)port_stack_get_top() - sp) / sizeof(uint32_t));
|
||||||
|
|
|
@ -0,0 +1,38 @@
|
||||||
|
/*
|
||||||
|
* This file is part of the MicroPython project, http://micropython.org/
|
||||||
|
*
|
||||||
|
* The MIT License (MIT)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2017 Scott Shawcroft for Adafruit Industries
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "boards/board.h"
|
||||||
|
#include "mpconfigboard.h"
|
||||||
|
|
||||||
|
void board_init(void) {
|
||||||
|
}
|
||||||
|
|
||||||
|
bool board_requests_safe_mode(void) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void reset_board(void) {
|
||||||
|
}
|
|
@ -0,0 +1,33 @@
|
||||||
|
#define MICROPY_HW_BOARD_NAME "Winterbloom Sol"
|
||||||
|
#define MICROPY_HW_MCU_NAME "samd51j20"
|
||||||
|
|
||||||
|
#define CIRCUITPY_MCU_FAMILY samd51
|
||||||
|
|
||||||
|
#define MICROPY_HW_LED_STATUS (&pin_PA23)
|
||||||
|
#define MICROPY_HW_NEOPIXEL (&pin_PB03)
|
||||||
|
|
||||||
|
// These are pins not to reset.
|
||||||
|
// QSPI Data pins
|
||||||
|
#define MICROPY_PORT_A (PORT_PA08 | PORT_PA09 | PORT_PA10 | PORT_PA11)
|
||||||
|
// QSPI CS, QSPI SCK and NeoPixel pin
|
||||||
|
#define MICROPY_PORT_B (PORT_PB03 | PORT_PB10 | PORT_PB11)
|
||||||
|
#define MICROPY_PORT_C (0)
|
||||||
|
#define MICROPY_PORT_D (0)
|
||||||
|
|
||||||
|
#define AUTORESET_DELAY_MS 500
|
||||||
|
|
||||||
|
// If you change this, then make sure to update the linker scripts as well to
|
||||||
|
// make sure you don't overwrite code
|
||||||
|
#define CIRCUITPY_INTERNAL_NVM_SIZE 8192
|
||||||
|
|
||||||
|
#define BOARD_FLASH_SIZE (FLASH_SIZE - 0x4000 - CIRCUITPY_INTERNAL_NVM_SIZE)
|
||||||
|
|
||||||
|
#define BOARD_HAS_CRYSTAL 1
|
||||||
|
|
||||||
|
#define DEFAULT_SPI_BUS_SCK (&pin_PA17)
|
||||||
|
#define DEFAULT_SPI_BUS_MOSI (&pin_PB23)
|
||||||
|
#define DEFAULT_SPI_BUS_MISO (&pin_PB22)
|
||||||
|
|
||||||
|
// USB is always used internally so skip the pin objects for it.
|
||||||
|
#define IGNORE_PIN_PA24 1
|
||||||
|
#define IGNORE_PIN_PA25 1
|
|
@ -0,0 +1,27 @@
|
||||||
|
LD_FILE = boards/samd51x20-bootloader-external-flash.ld
|
||||||
|
# Adafruit
|
||||||
|
USB_VID = 0x239A
|
||||||
|
# Allocated for Winterbloom Sol
|
||||||
|
# https://github.com/adafruit/circuitpython/issues/2217
|
||||||
|
USB_PID = 0x8062
|
||||||
|
USB_PRODUCT = "Sol"
|
||||||
|
USB_MANUFACTURER = "Winterbloom"
|
||||||
|
|
||||||
|
CHIP_VARIANT = SAMD51J20A
|
||||||
|
CHIP_FAMILY = samd51
|
||||||
|
|
||||||
|
QSPI_FLASH_FILESYSTEM = 1
|
||||||
|
EXTERNAL_FLASH_DEVICE_COUNT = 1
|
||||||
|
EXTERNAL_FLASH_DEVICES = W25Q32JV_IQ
|
||||||
|
LONGINT_IMPL = MPZ
|
||||||
|
|
||||||
|
# Disable modules that are unusable on this special-purpose board.
|
||||||
|
CIRCUITPY_AUDIOBUSIO = 0
|
||||||
|
CIRCUITPY_AUDIOIO = 0
|
||||||
|
CIRCUITPY_BLEIO = 0
|
||||||
|
CIRCUITPY_DISPLAYIO = 0
|
||||||
|
CIRCUITPY_GAMEPAD = 0
|
||||||
|
CIRCUITPY_I2CSLAVE = 0
|
||||||
|
CIRCUITPY_NETWORK = 0
|
||||||
|
CIRCUITPY_TOUCHIO = 0
|
||||||
|
CIRCUITPY_PS2IO = 0
|
|
@ -0,0 +1,15 @@
|
||||||
|
#include "shared-bindings/board/__init__.h"
|
||||||
|
|
||||||
|
STATIC const mp_rom_map_elem_t board_global_dict_table[] = {
|
||||||
|
{ MP_ROM_QSTR(MP_QSTR_SCK), MP_ROM_PTR(&pin_PA17) },
|
||||||
|
{ MP_ROM_QSTR(MP_QSTR_MOSI), MP_ROM_PTR(&pin_PB23) },
|
||||||
|
{ MP_ROM_QSTR(MP_QSTR_MISO), MP_ROM_PTR(&pin_PB22) },
|
||||||
|
{ MP_ROM_QSTR(MP_QSTR_DAC_CS), MP_ROM_PTR(&pin_PA18) },
|
||||||
|
{ MP_ROM_QSTR(MP_QSTR_G1), MP_ROM_PTR(&pin_PA20) },
|
||||||
|
{ MP_ROM_QSTR(MP_QSTR_G2), MP_ROM_PTR(&pin_PA21) },
|
||||||
|
{ MP_ROM_QSTR(MP_QSTR_G3), MP_ROM_PTR(&pin_PA22) },
|
||||||
|
{ MP_ROM_QSTR(MP_QSTR_G4), MP_ROM_PTR(&pin_PA23) },
|
||||||
|
{ MP_ROM_QSTR(MP_QSTR_NEOPIXEL), MP_ROM_PTR(&pin_PB03) },
|
||||||
|
{ MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&board_spi_obj) },
|
||||||
|
};
|
||||||
|
MP_DEFINE_CONST_DICT(board_module_globals, board_global_dict_table);
|
|
@ -41,6 +41,10 @@
|
||||||
#include "common-hal/audiopwmio/PWMAudioOut.h"
|
#include "common-hal/audiopwmio/PWMAudioOut.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if CIRCUITPY_BLEIO
|
||||||
|
#include "supervisor/shared/bluetooth.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
static bool running_background_tasks = false;
|
static bool running_background_tasks = false;
|
||||||
|
|
||||||
void background_tasks_reset(void) {
|
void background_tasks_reset(void) {
|
||||||
|
@ -62,6 +66,9 @@ void run_background_tasks(void) {
|
||||||
i2s_background();
|
i2s_background();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if CIRCUITPY_BLEIO
|
||||||
|
supervisor_bluetooth_background();
|
||||||
|
#endif
|
||||||
|
|
||||||
#if CIRCUITPY_DISPLAYIO
|
#if CIRCUITPY_DISPLAYIO
|
||||||
displayio_background();
|
displayio_background();
|
||||||
|
|
|
@ -38,6 +38,8 @@
|
||||||
#include "py/misc.h"
|
#include "py/misc.h"
|
||||||
#include "py/mpstate.h"
|
#include "py/mpstate.h"
|
||||||
|
|
||||||
|
#include "supervisor/shared/bluetooth.h"
|
||||||
|
|
||||||
nrf_nvic_state_t nrf_nvic_state = { 0 };
|
nrf_nvic_state_t nrf_nvic_state = { 0 };
|
||||||
|
|
||||||
// Flag indicating progress of internal flash operation.
|
// Flag indicating progress of internal flash operation.
|
||||||
|
@ -52,6 +54,14 @@ void ble_drv_reset() {
|
||||||
sd_flash_operation_status = SD_FLASH_OPERATION_DONE;
|
sd_flash_operation_status = SD_FLASH_OPERATION_DONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ble_drv_add_event_handler_entry(ble_drv_evt_handler_entry_t* entry, ble_drv_evt_handler_t func, void *param) {
|
||||||
|
entry->next = MP_STATE_VM(ble_drv_evt_handler_entries);
|
||||||
|
entry->param = param;
|
||||||
|
entry->func = func;
|
||||||
|
|
||||||
|
MP_STATE_VM(ble_drv_evt_handler_entries) = entry;
|
||||||
|
}
|
||||||
|
|
||||||
void ble_drv_add_event_handler(ble_drv_evt_handler_t func, void *param) {
|
void ble_drv_add_event_handler(ble_drv_evt_handler_t func, void *param) {
|
||||||
ble_drv_evt_handler_entry_t *it = MP_STATE_VM(ble_drv_evt_handler_entries);
|
ble_drv_evt_handler_entry_t *it = MP_STATE_VM(ble_drv_evt_handler_entries);
|
||||||
while (it != NULL) {
|
while (it != NULL) {
|
||||||
|
@ -64,11 +74,7 @@ void ble_drv_add_event_handler(ble_drv_evt_handler_t func, void *param) {
|
||||||
|
|
||||||
// Add a new handler to the front of the list
|
// Add a new handler to the front of the list
|
||||||
ble_drv_evt_handler_entry_t *handler = m_new_ll(ble_drv_evt_handler_entry_t, 1);
|
ble_drv_evt_handler_entry_t *handler = m_new_ll(ble_drv_evt_handler_entry_t, 1);
|
||||||
handler->next = MP_STATE_VM(ble_drv_evt_handler_entries);
|
ble_drv_add_event_handler_entry(handler, func, param);
|
||||||
handler->param = param;
|
|
||||||
handler->func = func;
|
|
||||||
|
|
||||||
MP_STATE_VM(ble_drv_evt_handler_entries) = handler;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ble_drv_remove_event_handler(ble_drv_evt_handler_t func, void *param) {
|
void ble_drv_remove_event_handler(ble_drv_evt_handler_t func, void *param) {
|
||||||
|
@ -127,10 +133,20 @@ void SD_EVT_IRQHandler(void) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ble_evt_t* event = (ble_evt_t *)m_ble_evt_buf;
|
||||||
|
|
||||||
|
if (supervisor_bluetooth_hook(event)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
ble_drv_evt_handler_entry_t *it = MP_STATE_VM(ble_drv_evt_handler_entries);
|
ble_drv_evt_handler_entry_t *it = MP_STATE_VM(ble_drv_evt_handler_entries);
|
||||||
|
bool done = false;
|
||||||
while (it != NULL) {
|
while (it != NULL) {
|
||||||
it->func((ble_evt_t *)m_ble_evt_buf, it->param);
|
done = it->func(event, it->param) || done;
|
||||||
it = it->next;
|
it = it->next;
|
||||||
}
|
}
|
||||||
|
if (!done) {
|
||||||
|
//mp_printf(&mp_plat_print, "Unhandled ble event: 0x%04x\n", event->header.evt_id);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,6 +29,8 @@
|
||||||
#ifndef MICROPY_INCLUDED_NRF_BLUETOOTH_BLE_DRV_H
|
#ifndef MICROPY_INCLUDED_NRF_BLUETOOTH_BLE_DRV_H
|
||||||
#define MICROPY_INCLUDED_NRF_BLUETOOTH_BLE_DRV_H
|
#define MICROPY_INCLUDED_NRF_BLUETOOTH_BLE_DRV_H
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
#include "ble.h"
|
#include "ble.h"
|
||||||
|
|
||||||
#define MAX_TX_IN_PROGRESS 10
|
#define MAX_TX_IN_PROGRESS 10
|
||||||
|
@ -48,7 +50,7 @@
|
||||||
#define UNIT_1_25_MS (1250)
|
#define UNIT_1_25_MS (1250)
|
||||||
#define UNIT_10_MS (10000)
|
#define UNIT_10_MS (10000)
|
||||||
|
|
||||||
typedef void (*ble_drv_evt_handler_t)(ble_evt_t*, void*);
|
typedef bool (*ble_drv_evt_handler_t)(ble_evt_t*, void*);
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
SD_FLASH_OPERATION_DONE,
|
SD_FLASH_OPERATION_DONE,
|
||||||
|
@ -69,4 +71,7 @@ void ble_drv_reset(void);
|
||||||
void ble_drv_add_event_handler(ble_drv_evt_handler_t func, void *param);
|
void ble_drv_add_event_handler(ble_drv_evt_handler_t func, void *param);
|
||||||
void ble_drv_remove_event_handler(ble_drv_evt_handler_t func, void *param);
|
void ble_drv_remove_event_handler(ble_drv_evt_handler_t func, void *param);
|
||||||
|
|
||||||
|
// Allow for user provided entries to prevent allocations outside the VM.
|
||||||
|
void ble_drv_add_event_handler_entry(ble_drv_evt_handler_entry_t* entry, ble_drv_evt_handler_t func, void *param);
|
||||||
|
|
||||||
#endif // MICROPY_INCLUDED_NRF_BLUETOOTH_BLE_DRV_H
|
#endif // MICROPY_INCLUDED_NRF_BLUETOOTH_BLE_DRV_H
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
0x00000000..0x00000FFF (4KB) Master Boot Record
|
0x00000000..0x00000FFF (4KB) Master Boot Record
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
/* Specify the memory areas (S140 6.x.x) */
|
/* Specify the memory areas (S140 6.x.x) */
|
||||||
MEMORY
|
MEMORY
|
||||||
{
|
{
|
||||||
|
@ -26,7 +27,10 @@ MEMORY
|
||||||
FLASH_FATFS (r) : ORIGIN = 0x000AD000, LENGTH = 0x040000
|
FLASH_FATFS (r) : ORIGIN = 0x000AD000, LENGTH = 0x040000
|
||||||
|
|
||||||
/* 0x2000000 - RAM:ORIGIN is reserved for Softdevice */
|
/* 0x2000000 - RAM:ORIGIN is reserved for Softdevice */
|
||||||
RAM (xrw) : ORIGIN = 0x20004000, LENGTH = 0x20040000 - 0x20004000
|
/* SoftDevice 6.1.0 takes 0x1628 bytes (5.54 kb) minimum. */
|
||||||
|
/* To measure the minimum required amount of memory for given configuration, set this number
|
||||||
|
high enough to work and then check the mutation of the value done by sd_ble_enable. */
|
||||||
|
RAM (xrw) : ORIGIN = 0x20000000 + 16K, LENGTH = 256K - 16K
|
||||||
}
|
}
|
||||||
|
|
||||||
/* produce a link error if there is not this amount of RAM for these sections */
|
/* produce a link error if there is not this amount of RAM for these sections */
|
||||||
|
@ -38,7 +42,8 @@ _minimum_heap_size = 0;
|
||||||
/*_stack_end = ORIGIN(RAM) + LENGTH(RAM);*/
|
/*_stack_end = ORIGIN(RAM) + LENGTH(RAM);*/
|
||||||
_estack = ORIGIN(RAM) + LENGTH(RAM);
|
_estack = ORIGIN(RAM) + LENGTH(RAM);
|
||||||
|
|
||||||
/* RAM extents for the garbage collector */
|
/* RAM extents for the garbage collector and soft device init */
|
||||||
|
_ram_start = ORIGIN(RAM);
|
||||||
_ram_end = ORIGIN(RAM) + LENGTH(RAM);
|
_ram_end = ORIGIN(RAM) + LENGTH(RAM);
|
||||||
_heap_end = 0x20020000; /* tunable */
|
_heap_end = 0x20020000; /* tunable */
|
||||||
|
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
* THE SOFTWARE.
|
* THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
@ -34,11 +35,18 @@
|
||||||
#include "nrfx_power.h"
|
#include "nrfx_power.h"
|
||||||
#include "nrf_nvic.h"
|
#include "nrf_nvic.h"
|
||||||
#include "nrf_sdm.h"
|
#include "nrf_sdm.h"
|
||||||
|
#include "tick.h"
|
||||||
|
#include "py/gc.h"
|
||||||
#include "py/objstr.h"
|
#include "py/objstr.h"
|
||||||
#include "py/runtime.h"
|
#include "py/runtime.h"
|
||||||
|
#include "supervisor/shared/safe_mode.h"
|
||||||
#include "supervisor/usb.h"
|
#include "supervisor/usb.h"
|
||||||
|
#include "shared-bindings/_bleio/__init__.h"
|
||||||
#include "shared-bindings/_bleio/Adapter.h"
|
#include "shared-bindings/_bleio/Adapter.h"
|
||||||
#include "shared-bindings/_bleio/Address.h"
|
#include "shared-bindings/_bleio/Address.h"
|
||||||
|
#include "shared-bindings/_bleio/Connection.h"
|
||||||
|
#include "shared-bindings/_bleio/ScanEntry.h"
|
||||||
|
#include "shared-bindings/time/__init__.h"
|
||||||
|
|
||||||
#define BLE_MIN_CONN_INTERVAL MSEC_TO_UNITS(15, UNIT_0_625_MS)
|
#define BLE_MIN_CONN_INTERVAL MSEC_TO_UNITS(15, UNIT_0_625_MS)
|
||||||
#define BLE_MAX_CONN_INTERVAL MSEC_TO_UNITS(15, UNIT_0_625_MS)
|
#define BLE_MAX_CONN_INTERVAL MSEC_TO_UNITS(15, UNIT_0_625_MS)
|
||||||
|
@ -46,10 +54,13 @@
|
||||||
#define BLE_CONN_SUP_TIMEOUT MSEC_TO_UNITS(4000, UNIT_10_MS)
|
#define BLE_CONN_SUP_TIMEOUT MSEC_TO_UNITS(4000, UNIT_10_MS)
|
||||||
|
|
||||||
STATIC void softdevice_assert_handler(uint32_t id, uint32_t pc, uint32_t info) {
|
STATIC void softdevice_assert_handler(uint32_t id, uint32_t pc, uint32_t info) {
|
||||||
mp_raise_msg_varg(&mp_type_AssertionError,
|
reset_into_safe_mode(NORDIC_SOFT_DEVICE_ASSERT);
|
||||||
translate("Soft device assert, id: 0x%08lX, pc: 0x%08lX"), id, pc);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bleio_connection_internal_t connections[BLEIO_TOTAL_CONNECTION_COUNT];
|
||||||
|
|
||||||
|
// Linker script provided ram start.
|
||||||
|
extern uint32_t _ram_start;
|
||||||
STATIC uint32_t ble_stack_enable(void) {
|
STATIC uint32_t ble_stack_enable(void) {
|
||||||
nrf_clock_lf_cfg_t clock_config = {
|
nrf_clock_lf_cfg_t clock_config = {
|
||||||
#if BOARD_HAS_32KHZ_XTAL
|
#if BOARD_HAS_32KHZ_XTAL
|
||||||
|
@ -78,34 +89,56 @@ STATIC uint32_t ble_stack_enable(void) {
|
||||||
// Start with no event handlers, etc.
|
// Start with no event handlers, etc.
|
||||||
ble_drv_reset();
|
ble_drv_reset();
|
||||||
|
|
||||||
uint32_t app_ram_start;
|
// Set everything up to have one persistent code editing connection and one user managed
|
||||||
app_ram_start = 0x20004000;
|
// connection. In the future we could move .data and .bss to the other side of the stack and
|
||||||
|
// dynamically adjust for different memory requirements of the SD based on boot.py
|
||||||
|
// configuration.
|
||||||
|
uint32_t app_ram_start = (uint32_t) &_ram_start;
|
||||||
|
|
||||||
ble_cfg_t ble_conf;
|
ble_cfg_t ble_conf;
|
||||||
ble_conf.conn_cfg.conn_cfg_tag = BLE_CONN_CFG_TAG_CUSTOM;
|
ble_conf.conn_cfg.conn_cfg_tag = BLE_CONN_CFG_TAG_CUSTOM;
|
||||||
ble_conf.conn_cfg.params.gap_conn_cfg.conn_count = BLE_GAP_CONN_COUNT_DEFAULT;
|
ble_conf.conn_cfg.params.gap_conn_cfg.conn_count = BLEIO_TOTAL_CONNECTION_COUNT;
|
||||||
|
// Event length here can influence throughput so perhaps make multiple connection profiles
|
||||||
|
// available.
|
||||||
ble_conf.conn_cfg.params.gap_conn_cfg.event_length = BLE_GAP_EVENT_LENGTH_DEFAULT;
|
ble_conf.conn_cfg.params.gap_conn_cfg.event_length = BLE_GAP_EVENT_LENGTH_DEFAULT;
|
||||||
err_code = sd_ble_cfg_set(BLE_CONN_CFG_GAP, &ble_conf, app_ram_start);
|
err_code = sd_ble_cfg_set(BLE_CONN_CFG_GAP, &ble_conf, app_ram_start);
|
||||||
if (err_code != NRF_SUCCESS)
|
if (err_code != NRF_SUCCESS) {
|
||||||
return err_code;
|
return err_code;
|
||||||
|
}
|
||||||
|
|
||||||
memset(&ble_conf, 0, sizeof(ble_conf));
|
memset(&ble_conf, 0, sizeof(ble_conf));
|
||||||
ble_conf.gap_cfg.role_count_cfg.periph_role_count = 1;
|
ble_conf.gap_cfg.role_count_cfg.adv_set_count = 1;
|
||||||
|
ble_conf.gap_cfg.role_count_cfg.periph_role_count = 2;
|
||||||
ble_conf.gap_cfg.role_count_cfg.central_role_count = 1;
|
ble_conf.gap_cfg.role_count_cfg.central_role_count = 1;
|
||||||
err_code = sd_ble_cfg_set(BLE_GAP_CFG_ROLE_COUNT, &ble_conf, app_ram_start);
|
err_code = sd_ble_cfg_set(BLE_GAP_CFG_ROLE_COUNT, &ble_conf, app_ram_start);
|
||||||
if (err_code != NRF_SUCCESS)
|
if (err_code != NRF_SUCCESS) {
|
||||||
return err_code;
|
return err_code;
|
||||||
|
}
|
||||||
|
|
||||||
memset(&ble_conf, 0, sizeof(ble_conf));
|
memset(&ble_conf, 0, sizeof(ble_conf));
|
||||||
ble_conf.conn_cfg.conn_cfg_tag = BLE_CONN_CFG_TAG_CUSTOM;
|
ble_conf.conn_cfg.conn_cfg_tag = BLE_CONN_CFG_TAG_CUSTOM;
|
||||||
ble_conf.conn_cfg.params.gatts_conn_cfg.hvn_tx_queue_size = MAX_TX_IN_PROGRESS;
|
ble_conf.conn_cfg.params.gatts_conn_cfg.hvn_tx_queue_size = MAX_TX_IN_PROGRESS;
|
||||||
err_code = sd_ble_cfg_set(BLE_CONN_CFG_GATTS, &ble_conf, app_ram_start);
|
err_code = sd_ble_cfg_set(BLE_CONN_CFG_GATTS, &ble_conf, app_ram_start);
|
||||||
if (err_code != NRF_SUCCESS)
|
if (err_code != NRF_SUCCESS) {
|
||||||
return err_code;
|
return err_code;
|
||||||
|
}
|
||||||
|
|
||||||
err_code = sd_ble_enable(&app_ram_start);
|
// Triple the GATT Server attribute size to accomodate both the CircuitPython built-in service
|
||||||
if (err_code != NRF_SUCCESS)
|
// and anything the user does.
|
||||||
|
memset(&ble_conf, 0, sizeof(ble_conf));
|
||||||
|
ble_conf.gatts_cfg.attr_tab_size.attr_tab_size = BLE_GATTS_ATTR_TAB_SIZE_DEFAULT * 3;
|
||||||
|
err_code = sd_ble_cfg_set(BLE_GATTS_CFG_ATTR_TAB_SIZE, &ble_conf, app_ram_start);
|
||||||
|
if (err_code != NRF_SUCCESS) {
|
||||||
return err_code;
|
return err_code;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO set ATT_MTU so that the maximum MTU we can negotiate is higher than the default.
|
||||||
|
|
||||||
|
// This sets app_ram_start to the minimum value needed for the settings set above.
|
||||||
|
err_code = sd_ble_enable(&app_ram_start);
|
||||||
|
if (err_code != NRF_SUCCESS) {
|
||||||
|
return err_code;
|
||||||
|
}
|
||||||
|
|
||||||
ble_gap_conn_params_t gap_conn_params = {
|
ble_gap_conn_params_t gap_conn_params = {
|
||||||
.min_conn_interval = BLE_MIN_CONN_INTERVAL,
|
.min_conn_interval = BLE_MIN_CONN_INTERVAL,
|
||||||
|
@ -122,11 +155,109 @@ STATIC uint32_t ble_stack_enable(void) {
|
||||||
return err_code;
|
return err_code;
|
||||||
}
|
}
|
||||||
|
|
||||||
void common_hal_bleio_adapter_set_enabled(bool enabled) {
|
STATIC bool adapter_on_ble_evt(ble_evt_t *ble_evt, void *self_in) {
|
||||||
const bool is_enabled = common_hal_bleio_adapter_get_enabled();
|
bleio_adapter_obj_t *self = (bleio_adapter_obj_t*)self_in;
|
||||||
|
|
||||||
|
// For debugging.
|
||||||
|
// mp_printf(&mp_plat_print, "Adapter event: 0x%04x\n", ble_evt->header.evt_id);
|
||||||
|
|
||||||
|
switch (ble_evt->header.evt_id) {
|
||||||
|
case BLE_GAP_EVT_CONNECTED: {
|
||||||
|
// Find an empty connection. One must always be available because the SD has the same
|
||||||
|
// total connection limit.
|
||||||
|
bleio_connection_internal_t *connection;
|
||||||
|
for (size_t i = 0; i < BLEIO_TOTAL_CONNECTION_COUNT; i++) {
|
||||||
|
connection = &connections[i];
|
||||||
|
if (connection->conn_handle == BLE_CONN_HANDLE_INVALID) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Central has connected.
|
||||||
|
ble_gap_evt_connected_t* connected = &ble_evt->evt.gap_evt.params.connected;
|
||||||
|
|
||||||
|
connection->conn_handle = ble_evt->evt.gap_evt.conn_handle;
|
||||||
|
connection->connection_obj = mp_const_none;
|
||||||
|
ble_drv_add_event_handler_entry(&connection->handler_entry, connection_on_ble_evt, connection);
|
||||||
|
self->connection_objs = NULL;
|
||||||
|
|
||||||
|
// See if connection interval set by Central is out of range.
|
||||||
|
// If so, negotiate our preferred range.
|
||||||
|
ble_gap_conn_params_t conn_params;
|
||||||
|
sd_ble_gap_ppcp_get(&conn_params);
|
||||||
|
if (conn_params.min_conn_interval < connected->conn_params.min_conn_interval ||
|
||||||
|
conn_params.min_conn_interval > connected->conn_params.max_conn_interval) {
|
||||||
|
sd_ble_gap_conn_param_update(ble_evt->evt.gap_evt.conn_handle, &conn_params);
|
||||||
|
}
|
||||||
|
self->current_advertising_data = NULL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case BLE_GAP_EVT_DISCONNECTED: {
|
||||||
|
// Find the connection that was disconnected.
|
||||||
|
bleio_connection_internal_t *connection;
|
||||||
|
for (size_t i = 0; i < BLEIO_TOTAL_CONNECTION_COUNT; i++) {
|
||||||
|
connection = &connections[i];
|
||||||
|
if (connection->conn_handle == ble_evt->evt.gap_evt.conn_handle) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ble_drv_remove_event_handler(connection_on_ble_evt, connection);
|
||||||
|
connection->conn_handle = BLE_CONN_HANDLE_INVALID;
|
||||||
|
if (connection->connection_obj != mp_const_none) {
|
||||||
|
bleio_connection_obj_t* obj = connection->connection_obj;
|
||||||
|
obj->connection = NULL;
|
||||||
|
obj->disconnect_reason = ble_evt->evt.gap_evt.params.disconnected.reason;
|
||||||
|
}
|
||||||
|
self->connection_objs = NULL;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case BLE_GAP_EVT_ADV_SET_TERMINATED:
|
||||||
|
self->current_advertising_data = NULL;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
// For debugging.
|
||||||
|
// mp_printf(&mp_plat_print, "Unhandled adapter event: 0x%04x\n", ble_evt->header.evt_id);
|
||||||
|
return false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
STATIC void get_address(bleio_adapter_obj_t *self, ble_gap_addr_t *address) {
|
||||||
|
uint32_t err_code;
|
||||||
|
|
||||||
|
err_code = sd_ble_gap_addr_get(address);
|
||||||
|
|
||||||
|
if (err_code != NRF_SUCCESS) {
|
||||||
|
mp_raise_OSError_msg(translate("Failed to get local address"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
char default_ble_name[] = { 'C', 'I', 'R', 'C', 'U', 'I', 'T', 'P', 'Y', 0, 0, 0, 0 , 0};
|
||||||
|
|
||||||
|
STATIC void bleio_adapter_reset_name(bleio_adapter_obj_t *self) {
|
||||||
|
uint8_t len = sizeof(default_ble_name) - 1;
|
||||||
|
|
||||||
|
ble_gap_addr_t local_address;
|
||||||
|
get_address(self, &local_address);
|
||||||
|
|
||||||
|
default_ble_name[len - 4] = nibble_to_hex_lower[local_address.addr[1] >> 4 & 0xf];
|
||||||
|
default_ble_name[len - 3] = nibble_to_hex_lower[local_address.addr[1] & 0xf];
|
||||||
|
default_ble_name[len - 2] = nibble_to_hex_lower[local_address.addr[0] >> 4 & 0xf];
|
||||||
|
default_ble_name[len - 1] = nibble_to_hex_lower[local_address.addr[0] & 0xf];
|
||||||
|
default_ble_name[len] = '\0'; // for now we add null for compatibility with C ASCIIZ strings
|
||||||
|
|
||||||
|
common_hal_bleio_adapter_set_name(self, (char*) default_ble_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
void common_hal_bleio_adapter_set_enabled(bleio_adapter_obj_t *self, bool enabled) {
|
||||||
|
const bool is_enabled = common_hal_bleio_adapter_get_enabled(self);
|
||||||
|
|
||||||
// Don't enable or disable twice
|
// Don't enable or disable twice
|
||||||
if ((is_enabled && enabled) || (!is_enabled && !enabled)) {
|
if (is_enabled == enabled) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -137,22 +268,34 @@ void common_hal_bleio_adapter_set_enabled(bool enabled) {
|
||||||
nrfx_power_uninit();
|
nrfx_power_uninit();
|
||||||
|
|
||||||
err_code = ble_stack_enable();
|
err_code = ble_stack_enable();
|
||||||
|
|
||||||
// Re-init USB hardware
|
|
||||||
init_usb_hardware();
|
|
||||||
} else {
|
} else {
|
||||||
err_code = sd_softdevice_disable();
|
err_code = sd_softdevice_disable();
|
||||||
|
|
||||||
// Re-init USB hardware
|
|
||||||
init_usb_hardware();
|
|
||||||
}
|
}
|
||||||
|
// Re-init USB hardware
|
||||||
|
init_usb_hardware();
|
||||||
|
|
||||||
if (err_code != NRF_SUCCESS) {
|
if (err_code != NRF_SUCCESS) {
|
||||||
mp_raise_OSError_msg(translate("Failed to change softdevice state"));
|
mp_raise_OSError_msg_varg(translate("Failed to change softdevice state, NRF_ERROR_%q"), MP_OBJ_QSTR_VALUE(base_error_messages[err_code - NRF_ERROR_BASE_NUM]));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add a handler for incoming peripheral connections.
|
||||||
|
if (enabled) {
|
||||||
|
for (size_t i = 0; i < BLEIO_TOTAL_CONNECTION_COUNT; i++) {
|
||||||
|
bleio_connection_internal_t *connection = &connections[i];
|
||||||
|
connection->conn_handle = BLE_CONN_HANDLE_INVALID;
|
||||||
|
}
|
||||||
|
bleio_adapter_reset_name(self);
|
||||||
|
ble_drv_add_event_handler_entry(&self->handler_entry, adapter_on_ble_evt, self);
|
||||||
|
} else {
|
||||||
|
ble_drv_reset();
|
||||||
|
self->scan_results = NULL;
|
||||||
|
self->current_advertising_data = NULL;
|
||||||
|
self->advertising_data = NULL;
|
||||||
|
self->scan_response_data = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool common_hal_bleio_adapter_get_enabled(void) {
|
bool common_hal_bleio_adapter_get_enabled(bleio_adapter_obj_t *self) {
|
||||||
uint8_t is_enabled;
|
uint8_t is_enabled;
|
||||||
|
|
||||||
const uint32_t err_code = sd_softdevice_is_enabled(&is_enabled);
|
const uint32_t err_code = sd_softdevice_is_enabled(&is_enabled);
|
||||||
|
@ -163,22 +306,11 @@ bool common_hal_bleio_adapter_get_enabled(void) {
|
||||||
return is_enabled;
|
return is_enabled;
|
||||||
}
|
}
|
||||||
|
|
||||||
void get_address(ble_gap_addr_t *address) {
|
bleio_address_obj_t *common_hal_bleio_adapter_get_address(bleio_adapter_obj_t *self) {
|
||||||
uint32_t err_code;
|
common_hal_bleio_adapter_set_enabled(self, true);
|
||||||
|
|
||||||
common_hal_bleio_adapter_set_enabled(true);
|
|
||||||
err_code = sd_ble_gap_addr_get(address);
|
|
||||||
|
|
||||||
if (err_code != NRF_SUCCESS) {
|
|
||||||
mp_raise_OSError_msg(translate("Failed to get local address"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bleio_address_obj_t *common_hal_bleio_adapter_get_address(void) {
|
|
||||||
common_hal_bleio_adapter_set_enabled(true);
|
|
||||||
|
|
||||||
ble_gap_addr_t local_address;
|
ble_gap_addr_t local_address;
|
||||||
get_address(&local_address);
|
get_address(self, &local_address);
|
||||||
|
|
||||||
bleio_address_obj_t *address = m_new_obj(bleio_address_obj_t);
|
bleio_address_obj_t *address = m_new_obj(bleio_address_obj_t);
|
||||||
address->base.type = &bleio_address_type;
|
address->base.type = &bleio_address_type;
|
||||||
|
@ -187,18 +319,326 @@ bleio_address_obj_t *common_hal_bleio_adapter_get_address(void) {
|
||||||
return address;
|
return address;
|
||||||
}
|
}
|
||||||
|
|
||||||
mp_obj_t common_hal_bleio_adapter_get_default_name(void) {
|
mp_obj_str_t* common_hal_bleio_adapter_get_name(bleio_adapter_obj_t *self) {
|
||||||
common_hal_bleio_adapter_set_enabled(true);
|
uint16_t len = 0;
|
||||||
|
sd_ble_gap_device_name_get(NULL, &len);
|
||||||
ble_gap_addr_t local_address;
|
uint8_t buf[len];
|
||||||
get_address(&local_address);
|
uint32_t err_code = sd_ble_gap_device_name_get(buf, &len);
|
||||||
|
if (err_code != NRF_SUCCESS) {
|
||||||
char name[] = { 'C', 'I', 'R', 'C', 'U', 'I', 'T', 'P', 'Y', 0, 0, 0, 0 };
|
return NULL;
|
||||||
|
}
|
||||||
name[sizeof(name) - 4] = nibble_to_hex_lower[local_address.addr[1] >> 4 & 0xf];
|
return mp_obj_new_str((char*) buf, len);
|
||||||
name[sizeof(name) - 3] = nibble_to_hex_lower[local_address.addr[1] & 0xf];
|
}
|
||||||
name[sizeof(name) - 2] = nibble_to_hex_lower[local_address.addr[0] >> 4 & 0xf];
|
|
||||||
name[sizeof(name) - 1] = nibble_to_hex_lower[local_address.addr[0] & 0xf];
|
void common_hal_bleio_adapter_set_name(bleio_adapter_obj_t *self, const char* name) {
|
||||||
|
ble_gap_conn_sec_mode_t sec;
|
||||||
return mp_obj_new_str(name, sizeof(name));
|
sec.lv = 0;
|
||||||
|
sec.sm = 0;
|
||||||
|
sd_ble_gap_device_name_set(&sec, (const uint8_t*) name, strlen(name));
|
||||||
|
}
|
||||||
|
|
||||||
|
STATIC bool scan_on_ble_evt(ble_evt_t *ble_evt, void *scan_results_in) {
|
||||||
|
bleio_scanresults_obj_t *scan_results = (bleio_scanresults_obj_t*)scan_results_in;
|
||||||
|
|
||||||
|
if (ble_evt->header.evt_id == BLE_GAP_EVT_TIMEOUT &&
|
||||||
|
ble_evt->evt.gap_evt.params.timeout.src == BLE_GAP_TIMEOUT_SRC_SCAN) {
|
||||||
|
shared_module_bleio_scanresults_set_done(scan_results, true);
|
||||||
|
ble_drv_remove_event_handler(scan_on_ble_evt, scan_results);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ble_evt->header.evt_id != BLE_GAP_EVT_ADV_REPORT) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
ble_gap_evt_adv_report_t *report = &ble_evt->evt.gap_evt.params.adv_report;
|
||||||
|
|
||||||
|
shared_module_bleio_scanresults_append(scan_results,
|
||||||
|
ticks_ms,
|
||||||
|
report->type.connectable,
|
||||||
|
report->type.scan_response,
|
||||||
|
report->rssi,
|
||||||
|
report->peer_addr.addr,
|
||||||
|
report->peer_addr.addr_type,
|
||||||
|
report->data.p_data,
|
||||||
|
report->data.len);
|
||||||
|
|
||||||
|
const uint32_t err_code = sd_ble_gap_scan_start(NULL, scan_results->common_hal_data);
|
||||||
|
if (err_code != NRF_SUCCESS) {
|
||||||
|
// TODO: Pass the error into the scan results so it can throw an exception.
|
||||||
|
scan_results->done = true;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
mp_obj_t common_hal_bleio_adapter_start_scan(bleio_adapter_obj_t *self, uint8_t* prefixes, size_t prefix_length, bool extended, mp_int_t buffer_size, mp_float_t timeout, mp_float_t interval, mp_float_t window, mp_int_t minimum_rssi, bool active) {
|
||||||
|
if (self->scan_results != NULL) {
|
||||||
|
if (!shared_module_bleio_scanresults_get_done(self->scan_results)) {
|
||||||
|
mp_raise_RuntimeError(translate("Scan already in progess. Stop with stop_scan."));
|
||||||
|
}
|
||||||
|
self->scan_results = NULL;
|
||||||
|
}
|
||||||
|
self->scan_results = shared_module_bleio_new_scanresults(buffer_size, prefixes, prefix_length, minimum_rssi);
|
||||||
|
size_t max_packet_size = extended ? BLE_GAP_SCAN_BUFFER_EXTENDED_MAX_SUPPORTED : BLE_GAP_SCAN_BUFFER_MAX;
|
||||||
|
uint8_t *raw_data = m_malloc(sizeof(ble_data_t) + max_packet_size, false);
|
||||||
|
ble_data_t * sd_data = (ble_data_t *) raw_data;
|
||||||
|
self->scan_results->common_hal_data = sd_data;
|
||||||
|
sd_data->len = max_packet_size;
|
||||||
|
sd_data->p_data = raw_data + sizeof(ble_data_t);
|
||||||
|
|
||||||
|
ble_drv_add_event_handler(scan_on_ble_evt, self->scan_results);
|
||||||
|
|
||||||
|
uint32_t nrf_timeout = SEC_TO_UNITS(timeout, UNIT_10_MS);
|
||||||
|
if (timeout <= 0.0001) {
|
||||||
|
nrf_timeout = BLE_GAP_SCAN_TIMEOUT_UNLIMITED;
|
||||||
|
}
|
||||||
|
|
||||||
|
ble_gap_scan_params_t scan_params = {
|
||||||
|
.extended = extended,
|
||||||
|
.interval = SEC_TO_UNITS(interval, UNIT_0_625_MS),
|
||||||
|
.timeout = nrf_timeout,
|
||||||
|
.window = SEC_TO_UNITS(window, UNIT_0_625_MS),
|
||||||
|
.scan_phys = BLE_GAP_PHY_1MBPS,
|
||||||
|
.active = active
|
||||||
|
};
|
||||||
|
uint32_t err_code;
|
||||||
|
err_code = sd_ble_gap_scan_start(&scan_params, sd_data);
|
||||||
|
|
||||||
|
if (err_code != NRF_SUCCESS) {
|
||||||
|
self->scan_results = NULL;
|
||||||
|
ble_drv_remove_event_handler(scan_on_ble_evt, self->scan_results);
|
||||||
|
mp_raise_OSError_msg_varg(translate("Failed to start scanning, err 0x%04x"), err_code);
|
||||||
|
}
|
||||||
|
|
||||||
|
return MP_OBJ_FROM_PTR(self->scan_results);
|
||||||
|
}
|
||||||
|
|
||||||
|
void common_hal_bleio_adapter_stop_scan(bleio_adapter_obj_t *self) {
|
||||||
|
sd_ble_gap_scan_stop();
|
||||||
|
shared_module_bleio_scanresults_set_done(self->scan_results, true);
|
||||||
|
ble_drv_remove_event_handler(scan_on_ble_evt, self->scan_results);
|
||||||
|
self->scan_results = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint16_t conn_handle;
|
||||||
|
volatile bool done;
|
||||||
|
} connect_info_t;
|
||||||
|
|
||||||
|
STATIC bool connect_on_ble_evt(ble_evt_t *ble_evt, void *info_in) {
|
||||||
|
connect_info_t *info = (connect_info_t*)info_in;
|
||||||
|
|
||||||
|
switch (ble_evt->header.evt_id) {
|
||||||
|
case BLE_GAP_EVT_CONNECTED:
|
||||||
|
info->conn_handle = ble_evt->evt.gap_evt.conn_handle;
|
||||||
|
info->done = true;
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case BLE_GAP_EVT_TIMEOUT:
|
||||||
|
// Handle will be invalid.
|
||||||
|
info->done = true;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
// For debugging.
|
||||||
|
// mp_printf(&mp_plat_print, "Unhandled central event: 0x%04x\n", ble_evt->header.evt_id);
|
||||||
|
return false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
mp_obj_t common_hal_bleio_adapter_connect(bleio_adapter_obj_t *self, bleio_address_obj_t *address, mp_float_t timeout, bool pair) {
|
||||||
|
|
||||||
|
ble_gap_addr_t addr;
|
||||||
|
|
||||||
|
addr.addr_type = address->type;
|
||||||
|
mp_buffer_info_t address_buf_info;
|
||||||
|
mp_get_buffer_raise(address->bytes, &address_buf_info, MP_BUFFER_READ);
|
||||||
|
memcpy(addr.addr, (uint8_t *) address_buf_info.buf, NUM_BLEIO_ADDRESS_BYTES);
|
||||||
|
|
||||||
|
ble_gap_scan_params_t scan_params = {
|
||||||
|
.interval = MSEC_TO_UNITS(100, UNIT_0_625_MS),
|
||||||
|
.window = MSEC_TO_UNITS(100, UNIT_0_625_MS),
|
||||||
|
.scan_phys = BLE_GAP_PHY_1MBPS,
|
||||||
|
// timeout of 0 means no timeout
|
||||||
|
.timeout = SEC_TO_UNITS(timeout, UNIT_10_MS),
|
||||||
|
};
|
||||||
|
|
||||||
|
ble_gap_conn_params_t conn_params = {
|
||||||
|
.conn_sup_timeout = MSEC_TO_UNITS(4000, UNIT_10_MS),
|
||||||
|
.min_conn_interval = MSEC_TO_UNITS(15, UNIT_1_25_MS),
|
||||||
|
.max_conn_interval = MSEC_TO_UNITS(300, UNIT_1_25_MS),
|
||||||
|
.slave_latency = 0, // number of conn events
|
||||||
|
};
|
||||||
|
|
||||||
|
connect_info_t event_info;
|
||||||
|
ble_drv_add_event_handler(connect_on_ble_evt, &event_info);
|
||||||
|
event_info.done = false;
|
||||||
|
|
||||||
|
uint32_t err_code = sd_ble_gap_connect(&addr, &scan_params, &conn_params, BLE_CONN_CFG_TAG_CUSTOM);
|
||||||
|
|
||||||
|
if (err_code != NRF_SUCCESS) {
|
||||||
|
ble_drv_remove_event_handler(connect_on_ble_evt, &event_info);
|
||||||
|
mp_raise_OSError_msg_varg(translate("Failed to start connecting, error 0x%04x"), err_code);
|
||||||
|
}
|
||||||
|
|
||||||
|
while (!event_info.done) {
|
||||||
|
RUN_BACKGROUND_TASKS;
|
||||||
|
}
|
||||||
|
|
||||||
|
ble_drv_remove_event_handler(connect_on_ble_evt, &event_info);
|
||||||
|
|
||||||
|
if (event_info.conn_handle == BLE_CONN_HANDLE_INVALID) {
|
||||||
|
mp_raise_OSError_msg(translate("Failed to connect: timeout"));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make the connection object and return it.
|
||||||
|
for (size_t i = 0; i < BLEIO_TOTAL_CONNECTION_COUNT; i++) {
|
||||||
|
bleio_connection_internal_t *connection = &connections[i];
|
||||||
|
if (connection->conn_handle == event_info.conn_handle) {
|
||||||
|
return bleio_connection_new_from_internal(connection);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mp_raise_OSError_msg(translate("Failed to connect: internal error"));
|
||||||
|
|
||||||
|
return mp_const_none;
|
||||||
|
}
|
||||||
|
|
||||||
|
// The nRF SD 6.1.0 can only do one concurrent advertisement so share the advertising handle.
|
||||||
|
uint8_t adv_handle = BLE_GAP_ADV_SET_HANDLE_NOT_SET;
|
||||||
|
|
||||||
|
STATIC void check_data_fit(size_t data_len) {
|
||||||
|
if (data_len > BLE_GAP_ADV_SET_DATA_SIZE_MAX) {
|
||||||
|
mp_raise_ValueError(translate("Data too large for advertisement packet"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t _common_hal_bleio_adapter_start_advertising(bleio_adapter_obj_t *self, bool connectable, float interval, uint8_t *advertising_data, uint16_t advertising_data_len, uint8_t *scan_response_data, uint16_t scan_response_data_len) {
|
||||||
|
if (self->current_advertising_data != NULL && self->current_advertising_data == self->advertising_data) {
|
||||||
|
return NRF_ERROR_BUSY;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the current advertising data isn't owned by the adapter then it must be an internal
|
||||||
|
// advertisement that we should stop.
|
||||||
|
if (self->current_advertising_data != NULL) {
|
||||||
|
common_hal_bleio_adapter_stop_advertising(self);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t err_code;
|
||||||
|
ble_gap_adv_params_t adv_params = {
|
||||||
|
.interval = SEC_TO_UNITS(interval, UNIT_0_625_MS),
|
||||||
|
.properties.type = connectable ? BLE_GAP_ADV_TYPE_CONNECTABLE_SCANNABLE_UNDIRECTED
|
||||||
|
: BLE_GAP_ADV_TYPE_NONCONNECTABLE_NONSCANNABLE_UNDIRECTED,
|
||||||
|
.duration = BLE_GAP_ADV_TIMEOUT_GENERAL_UNLIMITED,
|
||||||
|
.filter_policy = BLE_GAP_ADV_FP_ANY,
|
||||||
|
.primary_phy = BLE_GAP_PHY_1MBPS,
|
||||||
|
};
|
||||||
|
|
||||||
|
const ble_gap_adv_data_t ble_gap_adv_data = {
|
||||||
|
.adv_data.p_data = advertising_data,
|
||||||
|
.adv_data.len = advertising_data_len,
|
||||||
|
.scan_rsp_data.p_data = scan_response_data_len > 0 ? scan_response_data : NULL,
|
||||||
|
.scan_rsp_data.len = scan_response_data_len,
|
||||||
|
};
|
||||||
|
|
||||||
|
err_code = sd_ble_gap_adv_set_configure(&adv_handle, &ble_gap_adv_data, &adv_params);
|
||||||
|
if (err_code != NRF_SUCCESS) {
|
||||||
|
return err_code;
|
||||||
|
}
|
||||||
|
|
||||||
|
err_code = sd_ble_gap_adv_start(adv_handle, BLE_CONN_CFG_TAG_CUSTOM);
|
||||||
|
if (err_code != NRF_SUCCESS) {
|
||||||
|
return err_code;
|
||||||
|
}
|
||||||
|
self->current_advertising_data = advertising_data;
|
||||||
|
return NRF_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void common_hal_bleio_adapter_start_advertising(bleio_adapter_obj_t *self, bool connectable, mp_float_t interval, mp_buffer_info_t *advertising_data_bufinfo, mp_buffer_info_t *scan_response_data_bufinfo) {
|
||||||
|
if (self->current_advertising_data != NULL && self->current_advertising_data == self->advertising_data) {
|
||||||
|
mp_raise_OSError_msg(translate("Already advertising."));
|
||||||
|
}
|
||||||
|
// interval value has already been validated.
|
||||||
|
|
||||||
|
uint32_t err_code;
|
||||||
|
|
||||||
|
check_data_fit(advertising_data_bufinfo->len);
|
||||||
|
check_data_fit(scan_response_data_bufinfo->len);
|
||||||
|
// The advertising data buffers must not move, because the SoftDevice depends on them.
|
||||||
|
// So make them long-lived and reuse them onwards.
|
||||||
|
if (self->advertising_data == NULL) {
|
||||||
|
self->advertising_data = (uint8_t *) gc_alloc(BLE_GAP_ADV_SET_DATA_SIZE_MAX * sizeof(uint8_t), false, true);
|
||||||
|
}
|
||||||
|
if (self->scan_response_data == NULL) {
|
||||||
|
self->scan_response_data = (uint8_t *) gc_alloc(BLE_GAP_ADV_SET_DATA_SIZE_MAX * sizeof(uint8_t), false, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(self->advertising_data, advertising_data_bufinfo->buf, advertising_data_bufinfo->len);
|
||||||
|
memcpy(self->scan_response_data, scan_response_data_bufinfo->buf, scan_response_data_bufinfo->len);
|
||||||
|
|
||||||
|
err_code = _common_hal_bleio_adapter_start_advertising(self, connectable, interval, self->advertising_data, advertising_data_bufinfo->len, self->scan_response_data, scan_response_data_bufinfo->len);
|
||||||
|
|
||||||
|
if (err_code != NRF_SUCCESS) {
|
||||||
|
mp_raise_OSError_msg_varg(translate("Failed to start advertising, NRF_ERROR_%q"), MP_OBJ_QSTR_VALUE(base_error_messages[err_code - NRF_ERROR_BASE_NUM]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void common_hal_bleio_adapter_stop_advertising(bleio_adapter_obj_t *self) {
|
||||||
|
if (adv_handle == BLE_GAP_ADV_SET_HANDLE_NOT_SET)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// TODO: Don't actually stop. Switch to advertising CircuitPython if we don't already have a connection.
|
||||||
|
const uint32_t err_code = sd_ble_gap_adv_stop(adv_handle);
|
||||||
|
self->current_advertising_data = NULL;
|
||||||
|
|
||||||
|
if ((err_code != NRF_SUCCESS) && (err_code != NRF_ERROR_INVALID_STATE)) {
|
||||||
|
mp_raise_OSError_msg_varg(translate("Failed to stop advertising, NRF_ERROR_%q"), MP_OBJ_QSTR_VALUE(base_error_messages[err_code - NRF_ERROR_BASE_NUM]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool common_hal_bleio_adapter_get_connected(bleio_adapter_obj_t *self) {
|
||||||
|
for (size_t i = 0; i < BLEIO_TOTAL_CONNECTION_COUNT; i++) {
|
||||||
|
bleio_connection_internal_t *connection = &connections[i];
|
||||||
|
if (connection->conn_handle != BLE_CONN_HANDLE_INVALID) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
mp_obj_t common_hal_bleio_adapter_get_connections(bleio_adapter_obj_t *self) {
|
||||||
|
if (self->connection_objs != NULL) {
|
||||||
|
return self->connection_objs;
|
||||||
|
}
|
||||||
|
size_t total_connected = 0;
|
||||||
|
mp_obj_t items[BLEIO_TOTAL_CONNECTION_COUNT];
|
||||||
|
for (size_t i = 0; i < BLEIO_TOTAL_CONNECTION_COUNT; i++) {
|
||||||
|
bleio_connection_internal_t *connection = &connections[i];
|
||||||
|
if (connection->conn_handle != BLE_CONN_HANDLE_INVALID) {
|
||||||
|
if (connection->connection_obj == mp_const_none) {
|
||||||
|
connection->connection_obj = bleio_connection_new_from_internal(connection);
|
||||||
|
}
|
||||||
|
items[total_connected] = connection->connection_obj;
|
||||||
|
total_connected++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
self->connection_objs = mp_obj_new_tuple(total_connected, items);
|
||||||
|
return self->connection_objs;
|
||||||
|
}
|
||||||
|
|
||||||
|
void bleio_adapter_gc_collect(bleio_adapter_obj_t* adapter) {
|
||||||
|
gc_collect_root((void**)adapter, sizeof(bleio_adapter_obj_t) / sizeof(size_t));
|
||||||
|
gc_collect_root((void**)connections, sizeof(connections) / sizeof(size_t));
|
||||||
|
}
|
||||||
|
|
||||||
|
void bleio_adapter_reset(bleio_adapter_obj_t* adapter) {
|
||||||
|
common_hal_bleio_adapter_stop_scan(adapter);
|
||||||
|
common_hal_bleio_adapter_stop_advertising(adapter);
|
||||||
|
adapter->connection_objs = NULL;
|
||||||
|
for (size_t i = 0; i < BLEIO_TOTAL_CONNECTION_COUNT; i++) {
|
||||||
|
bleio_connection_internal_t *connection = &connections[i];
|
||||||
|
connection->connection_obj = mp_const_none;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,9 +30,27 @@
|
||||||
#define MICROPY_INCLUDED_NRF_COMMON_HAL_BLEIO_ADAPTER_H
|
#define MICROPY_INCLUDED_NRF_COMMON_HAL_BLEIO_ADAPTER_H
|
||||||
|
|
||||||
#include "py/obj.h"
|
#include "py/obj.h"
|
||||||
|
#include "py/objtuple.h"
|
||||||
|
|
||||||
|
#include "shared-bindings/_bleio/Connection.h"
|
||||||
|
#include "shared-bindings/_bleio/ScanResults.h"
|
||||||
|
|
||||||
|
#define BLEIO_TOTAL_CONNECTION_COUNT 2
|
||||||
|
|
||||||
|
extern bleio_connection_internal_t connections[BLEIO_TOTAL_CONNECTION_COUNT];
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
mp_obj_base_t base;
|
mp_obj_base_t base;
|
||||||
} super_adapter_obj_t;
|
uint8_t* advertising_data;
|
||||||
|
uint8_t* scan_response_data;
|
||||||
|
uint8_t* current_advertising_data;
|
||||||
|
bleio_scanresults_obj_t* scan_results;
|
||||||
|
mp_obj_t name;
|
||||||
|
mp_obj_tuple_t *connection_objs;
|
||||||
|
ble_drv_evt_handler_entry_t handler_entry;
|
||||||
|
} bleio_adapter_obj_t;
|
||||||
|
|
||||||
|
void bleio_adapter_gc_collect(bleio_adapter_obj_t* adapter);
|
||||||
|
void bleio_adapter_reset(bleio_adapter_obj_t* adapter);
|
||||||
|
|
||||||
#endif // MICROPY_INCLUDED_NRF_COMMON_HAL_BLEIO_ADAPTER_H
|
#endif // MICROPY_INCLUDED_NRF_COMMON_HAL_BLEIO_ADAPTER_H
|
||||||
|
|
|
@ -1,145 +0,0 @@
|
||||||
/*
|
|
||||||
* This file is part of the MicroPython project, http://micropython.org/
|
|
||||||
*
|
|
||||||
* The MIT License (MIT)
|
|
||||||
*
|
|
||||||
* Copyright (c) 2019 Dan Halbert for Adafruit Industries
|
|
||||||
* Copyright (c) 2018 Artur Pacholec
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#include "ble.h"
|
|
||||||
#include "ble_drv.h"
|
|
||||||
#include "ble_hci.h"
|
|
||||||
#include "nrf_soc.h"
|
|
||||||
#include "py/objstr.h"
|
|
||||||
#include "py/runtime.h"
|
|
||||||
#include "shared-bindings/_bleio/__init__.h"
|
|
||||||
#include "shared-bindings/_bleio/Adapter.h"
|
|
||||||
#include "shared-bindings/_bleio/Central.h"
|
|
||||||
|
|
||||||
STATIC void central_on_ble_evt(ble_evt_t *ble_evt, void *central_in) {
|
|
||||||
bleio_central_obj_t *central = (bleio_central_obj_t*)central_in;
|
|
||||||
|
|
||||||
switch (ble_evt->header.evt_id) {
|
|
||||||
case BLE_GAP_EVT_CONNECTED:
|
|
||||||
central->conn_handle = ble_evt->evt.gap_evt.conn_handle;
|
|
||||||
central->waiting_to_connect = false;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case BLE_GAP_EVT_TIMEOUT:
|
|
||||||
// Handle will be invalid.
|
|
||||||
central->waiting_to_connect = false;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case BLE_GAP_EVT_DISCONNECTED:
|
|
||||||
central->conn_handle = BLE_CONN_HANDLE_INVALID;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case BLE_GAP_EVT_SEC_PARAMS_REQUEST:
|
|
||||||
sd_ble_gap_sec_params_reply(central->conn_handle, BLE_GAP_SEC_STATUS_PAIRING_NOT_SUPP, NULL, NULL);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST: {
|
|
||||||
ble_gap_evt_conn_param_update_request_t *request =
|
|
||||||
&ble_evt->evt.gap_evt.params.conn_param_update_request;
|
|
||||||
sd_ble_gap_conn_param_update(central->conn_handle, &request->conn_params);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
// For debugging.
|
|
||||||
// mp_printf(&mp_plat_print, "Unhandled central event: 0x%04x\n", ble_evt->header.evt_id);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void common_hal_bleio_central_construct(bleio_central_obj_t *self) {
|
|
||||||
common_hal_bleio_adapter_set_enabled(true);
|
|
||||||
|
|
||||||
self->remote_service_list = mp_obj_new_list(0, NULL);
|
|
||||||
self->conn_handle = BLE_CONN_HANDLE_INVALID;
|
|
||||||
}
|
|
||||||
|
|
||||||
void common_hal_bleio_central_connect(bleio_central_obj_t *self, bleio_address_obj_t *address, mp_float_t timeout) {
|
|
||||||
common_hal_bleio_adapter_set_enabled(true);
|
|
||||||
ble_drv_add_event_handler(central_on_ble_evt, self);
|
|
||||||
|
|
||||||
ble_gap_addr_t addr;
|
|
||||||
|
|
||||||
addr.addr_type = address->type;
|
|
||||||
mp_buffer_info_t address_buf_info;
|
|
||||||
mp_get_buffer_raise(address->bytes, &address_buf_info, MP_BUFFER_READ);
|
|
||||||
memcpy(addr.addr, (uint8_t *) address_buf_info.buf, NUM_BLEIO_ADDRESS_BYTES);
|
|
||||||
|
|
||||||
ble_gap_scan_params_t scan_params = {
|
|
||||||
.interval = MSEC_TO_UNITS(100, UNIT_0_625_MS),
|
|
||||||
.window = MSEC_TO_UNITS(100, UNIT_0_625_MS),
|
|
||||||
.scan_phys = BLE_GAP_PHY_1MBPS,
|
|
||||||
// timeout of 0 means no timeout
|
|
||||||
.timeout = SEC_TO_UNITS(timeout, UNIT_10_MS),
|
|
||||||
};
|
|
||||||
|
|
||||||
ble_gap_conn_params_t conn_params = {
|
|
||||||
.conn_sup_timeout = MSEC_TO_UNITS(4000, UNIT_10_MS),
|
|
||||||
.min_conn_interval = MSEC_TO_UNITS(15, UNIT_1_25_MS),
|
|
||||||
.max_conn_interval = MSEC_TO_UNITS(300, UNIT_1_25_MS),
|
|
||||||
.slave_latency = 0, // number of conn events
|
|
||||||
};
|
|
||||||
|
|
||||||
self->waiting_to_connect = true;
|
|
||||||
|
|
||||||
uint32_t err_code = sd_ble_gap_connect(&addr, &scan_params, &conn_params, BLE_CONN_CFG_TAG_CUSTOM);
|
|
||||||
|
|
||||||
if (err_code != NRF_SUCCESS) {
|
|
||||||
mp_raise_OSError_msg_varg(translate("Failed to start connecting, error 0x%04x"), err_code);
|
|
||||||
}
|
|
||||||
|
|
||||||
while (self->waiting_to_connect) {
|
|
||||||
RUN_BACKGROUND_TASKS;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (self->conn_handle == BLE_CONN_HANDLE_INVALID) {
|
|
||||||
mp_raise_OSError_msg(translate("Failed to connect: timeout"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void common_hal_bleio_central_disconnect(bleio_central_obj_t *self) {
|
|
||||||
sd_ble_gap_disconnect(self->conn_handle, BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool common_hal_bleio_central_get_connected(bleio_central_obj_t *self) {
|
|
||||||
return self->conn_handle != BLE_CONN_HANDLE_INVALID;
|
|
||||||
}
|
|
||||||
|
|
||||||
mp_obj_tuple_t *common_hal_bleio_central_discover_remote_services(bleio_central_obj_t *self, mp_obj_t service_uuids_whitelist) {
|
|
||||||
common_hal_bleio_device_discover_remote_services(MP_OBJ_FROM_PTR(self), service_uuids_whitelist);
|
|
||||||
// Convert to a tuple and then clear the list so the callee will take ownership.
|
|
||||||
mp_obj_tuple_t *services_tuple = mp_obj_new_tuple(self->remote_service_list->len,
|
|
||||||
self->remote_service_list->items);
|
|
||||||
mp_obj_list_clear(self->remote_service_list);
|
|
||||||
return services_tuple;
|
|
||||||
}
|
|
||||||
|
|
||||||
mp_obj_list_t *common_hal_bleio_central_get_remote_services(bleio_central_obj_t *self) {
|
|
||||||
return self->remote_service_list;
|
|
||||||
}
|
|
|
@ -32,7 +32,7 @@
|
||||||
#include "shared-bindings/_bleio/Descriptor.h"
|
#include "shared-bindings/_bleio/Descriptor.h"
|
||||||
#include "shared-bindings/_bleio/Service.h"
|
#include "shared-bindings/_bleio/Service.h"
|
||||||
|
|
||||||
static volatile bleio_characteristic_obj_t *m_read_characteristic;
|
#include "common-hal/_bleio/Adapter.h"
|
||||||
|
|
||||||
STATIC uint16_t characteristic_get_cccd(uint16_t cccd_handle, uint16_t conn_handle) {
|
STATIC uint16_t characteristic_get_cccd(uint16_t cccd_handle, uint16_t conn_handle) {
|
||||||
uint16_t cccd;
|
uint16_t cccd;
|
||||||
|
@ -53,27 +53,6 @@ STATIC uint16_t characteristic_get_cccd(uint16_t cccd_handle, uint16_t conn_hand
|
||||||
return cccd;
|
return cccd;
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC void characteristic_on_gattc_read_rsp_evt(ble_evt_t *ble_evt, void *param) {
|
|
||||||
switch (ble_evt->header.evt_id) {
|
|
||||||
|
|
||||||
// More events may be handled later, so keep this as a switch.
|
|
||||||
|
|
||||||
case BLE_GATTC_EVT_READ_RSP: {
|
|
||||||
ble_gattc_evt_read_rsp_t *response = &ble_evt->evt.gattc_evt.params.read_rsp;
|
|
||||||
if (m_read_characteristic) {
|
|
||||||
m_read_characteristic->value = mp_obj_new_bytearray(response->len, response->data);
|
|
||||||
}
|
|
||||||
// Indicate to busy-wait loop that we've read the attribute value.
|
|
||||||
m_read_characteristic = NULL;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
|
||||||
// For debugging.
|
|
||||||
// mp_printf(&mp_plat_print, "Unhandled characteristic event: 0x%04x\n", ble_evt->header.evt_id);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
STATIC void characteristic_gatts_notify_indicate(uint16_t handle, uint16_t conn_handle, mp_buffer_info_t *bufinfo, uint16_t hvx_type) {
|
STATIC void characteristic_gatts_notify_indicate(uint16_t handle, uint16_t conn_handle, mp_buffer_info_t *bufinfo, uint16_t hvx_type) {
|
||||||
uint16_t hvx_len = bufinfo->len;
|
uint16_t hvx_len = bufinfo->len;
|
||||||
|
@ -103,35 +82,14 @@ STATIC void characteristic_gatts_notify_indicate(uint16_t handle, uint16_t conn_
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC void characteristic_gattc_read(bleio_characteristic_obj_t *characteristic) {
|
void common_hal_bleio_characteristic_construct(bleio_characteristic_obj_t *self, bleio_service_obj_t *service, uint16_t handle, bleio_uuid_obj_t *uuid, bleio_characteristic_properties_t props, bleio_attribute_security_mode_t read_perm, bleio_attribute_security_mode_t write_perm, mp_int_t max_length, bool fixed_length, mp_buffer_info_t *initial_value_bufinfo) {
|
||||||
const uint16_t conn_handle = common_hal_bleio_device_get_conn_handle(characteristic->service->device);
|
|
||||||
common_hal_bleio_check_connected(conn_handle);
|
|
||||||
|
|
||||||
// Set to NULL in event loop after event.
|
|
||||||
m_read_characteristic = characteristic;
|
|
||||||
|
|
||||||
ble_drv_add_event_handler(characteristic_on_gattc_read_rsp_evt, characteristic);
|
|
||||||
|
|
||||||
const uint32_t err_code = sd_ble_gattc_read(conn_handle, characteristic->handle, 0);
|
|
||||||
if (err_code != NRF_SUCCESS) {
|
|
||||||
mp_raise_OSError_msg_varg(translate("Failed to read attribute value, err 0x%04x"), err_code);
|
|
||||||
}
|
|
||||||
|
|
||||||
while (m_read_characteristic != NULL) {
|
|
||||||
RUN_BACKGROUND_TASKS;
|
|
||||||
}
|
|
||||||
|
|
||||||
ble_drv_remove_event_handler(characteristic_on_gattc_read_rsp_evt, characteristic);
|
|
||||||
}
|
|
||||||
|
|
||||||
void common_hal_bleio_characteristic_construct(bleio_characteristic_obj_t *self, bleio_service_obj_t *service, bleio_uuid_obj_t *uuid, bleio_characteristic_properties_t props, bleio_attribute_security_mode_t read_perm, bleio_attribute_security_mode_t write_perm, mp_int_t max_length, bool fixed_length, mp_buffer_info_t *initial_value_bufinfo) {
|
|
||||||
self->service = service;
|
self->service = service;
|
||||||
self->uuid = uuid;
|
self->uuid = uuid;
|
||||||
self->handle = BLE_GATT_HANDLE_INVALID;
|
self->handle = BLE_GATT_HANDLE_INVALID;
|
||||||
self->props = props;
|
self->props = props;
|
||||||
self->read_perm = read_perm;
|
self->read_perm = read_perm;
|
||||||
self->write_perm = write_perm;
|
self->write_perm = write_perm;
|
||||||
self->descriptor_list = mp_obj_new_list(0, NULL);
|
self->descriptor_list = NULL;
|
||||||
|
|
||||||
const mp_int_t max_length_max = fixed_length ? BLE_GATTS_FIX_ATTR_LEN_MAX : BLE_GATTS_VAR_ATTR_LEN_MAX;
|
const mp_int_t max_length_max = fixed_length ? BLE_GATTS_FIX_ATTR_LEN_MAX : BLE_GATTS_VAR_ATTR_LEN_MAX;
|
||||||
if (max_length < 0 || max_length > max_length_max) {
|
if (max_length < 0 || max_length > max_length_max) {
|
||||||
|
@ -141,10 +99,18 @@ void common_hal_bleio_characteristic_construct(bleio_characteristic_obj_t *self,
|
||||||
self->max_length = max_length;
|
self->max_length = max_length;
|
||||||
self->fixed_length = fixed_length;
|
self->fixed_length = fixed_length;
|
||||||
|
|
||||||
common_hal_bleio_characteristic_set_value(self, initial_value_bufinfo);
|
if (service->is_remote) {
|
||||||
|
self->handle = handle;
|
||||||
|
} else {
|
||||||
|
common_hal_bleio_service_add_characteristic(self->service, self, initial_value_bufinfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (initial_value_bufinfo != NULL) {
|
||||||
|
common_hal_bleio_characteristic_set_value(self, initial_value_bufinfo);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mp_obj_list_t *common_hal_bleio_characteristic_get_descriptor_list(bleio_characteristic_obj_t *self) {
|
bleio_descriptor_obj_t *common_hal_bleio_characteristic_get_descriptor_list(bleio_characteristic_obj_t *self) {
|
||||||
return self->descriptor_list;
|
return self->descriptor_list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -152,19 +118,19 @@ bleio_service_obj_t *common_hal_bleio_characteristic_get_service(bleio_character
|
||||||
return self->service;
|
return self->service;
|
||||||
}
|
}
|
||||||
|
|
||||||
mp_obj_t common_hal_bleio_characteristic_get_value(bleio_characteristic_obj_t *self) {
|
size_t common_hal_bleio_characteristic_get_value(bleio_characteristic_obj_t *self, uint8_t* buf, size_t len) {
|
||||||
// Do GATT operations only if this characteristic has been added to a registered service.
|
// Do GATT operations only if this characteristic has been added to a registered service.
|
||||||
if (self->handle != BLE_GATT_HANDLE_INVALID) {
|
if (self->handle != BLE_GATT_HANDLE_INVALID) {
|
||||||
uint16_t conn_handle = common_hal_bleio_device_get_conn_handle(self->service->device);
|
uint16_t conn_handle = bleio_connection_get_conn_handle(self->service->connection);
|
||||||
if (common_hal_bleio_service_get_is_remote(self->service)) {
|
if (common_hal_bleio_service_get_is_remote(self->service)) {
|
||||||
// self->value is set by evt handler.
|
// self->value is set by evt handler.
|
||||||
characteristic_gattc_read(self);
|
return common_hal_bleio_gattc_read(self->handle, conn_handle, buf, len);
|
||||||
} else {
|
} else {
|
||||||
self->value = common_hal_bleio_gatts_read(self->handle, conn_handle);
|
return common_hal_bleio_gatts_read(self->handle, conn_handle, buf, len);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return self->value;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void common_hal_bleio_characteristic_set_value(bleio_characteristic_obj_t *self, mp_buffer_info_t *bufinfo) {
|
void common_hal_bleio_characteristic_set_value(bleio_characteristic_obj_t *self, mp_buffer_info_t *bufinfo) {
|
||||||
|
@ -175,39 +141,40 @@ void common_hal_bleio_characteristic_set_value(bleio_characteristic_obj_t *self,
|
||||||
mp_raise_ValueError(translate("Value length > max_length"));
|
mp_raise_ValueError(translate("Value length > max_length"));
|
||||||
}
|
}
|
||||||
|
|
||||||
self->value = mp_obj_new_bytes(bufinfo->buf, bufinfo->len);
|
|
||||||
|
|
||||||
// Do GATT operations only if this characteristic has been added to a registered service.
|
// Do GATT operations only if this characteristic has been added to a registered service.
|
||||||
if (self->handle != BLE_GATT_HANDLE_INVALID) {
|
if (self->handle != BLE_GATT_HANDLE_INVALID) {
|
||||||
uint16_t conn_handle = common_hal_bleio_device_get_conn_handle(self->service->device);
|
|
||||||
|
|
||||||
if (common_hal_bleio_service_get_is_remote(self->service)) {
|
if (common_hal_bleio_service_get_is_remote(self->service)) {
|
||||||
|
uint16_t conn_handle = bleio_connection_get_conn_handle(self->service->connection);
|
||||||
// Last argument is true if write-no-reponse desired.
|
// Last argument is true if write-no-reponse desired.
|
||||||
common_hal_bleio_gattc_write(self->handle, conn_handle, bufinfo,
|
common_hal_bleio_gattc_write(self->handle, conn_handle, bufinfo,
|
||||||
(self->props & CHAR_PROP_WRITE_NO_RESPONSE));
|
(self->props & CHAR_PROP_WRITE_NO_RESPONSE));
|
||||||
} else {
|
} else {
|
||||||
|
// Always write the value locally even if no connections are active.
|
||||||
|
common_hal_bleio_gatts_write(self->handle, BLE_CONN_HANDLE_INVALID, bufinfo);
|
||||||
|
// Check to see if we need to notify or indicate any active connections.
|
||||||
|
for (size_t i = 0; i < BLEIO_TOTAL_CONNECTION_COUNT; i++) {
|
||||||
|
bleio_connection_internal_t *connection = &connections[i];
|
||||||
|
uint16_t conn_handle = connection->conn_handle;
|
||||||
|
if (connection->conn_handle == BLE_CONN_HANDLE_INVALID) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
bool sent = false;
|
uint16_t cccd = 0;
|
||||||
uint16_t cccd = 0;
|
|
||||||
|
|
||||||
const bool notify = self->props & CHAR_PROP_NOTIFY;
|
const bool notify = self->props & CHAR_PROP_NOTIFY;
|
||||||
const bool indicate = self->props & CHAR_PROP_INDICATE;
|
const bool indicate = self->props & CHAR_PROP_INDICATE;
|
||||||
if (notify | indicate) {
|
if (notify | indicate) {
|
||||||
cccd = characteristic_get_cccd(self->cccd_handle, conn_handle);
|
cccd = characteristic_get_cccd(self->cccd_handle, conn_handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
// It's possible that both notify and indicate are set.
|
// It's possible that both notify and indicate are set.
|
||||||
if (notify && (cccd & BLE_GATT_HVX_NOTIFICATION)) {
|
if (notify && (cccd & BLE_GATT_HVX_NOTIFICATION)) {
|
||||||
characteristic_gatts_notify_indicate(self->handle, conn_handle, bufinfo, BLE_GATT_HVX_NOTIFICATION);
|
characteristic_gatts_notify_indicate(self->handle, conn_handle, bufinfo, BLE_GATT_HVX_NOTIFICATION);
|
||||||
sent = true;
|
}
|
||||||
}
|
if (indicate && (cccd & BLE_GATT_HVX_INDICATION)) {
|
||||||
if (indicate && (cccd & BLE_GATT_HVX_INDICATION)) {
|
characteristic_gatts_notify_indicate(self->handle, conn_handle, bufinfo, BLE_GATT_HVX_INDICATION);
|
||||||
characteristic_gatts_notify_indicate(self->handle, conn_handle, bufinfo, BLE_GATT_HVX_INDICATION);
|
}
|
||||||
sent = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!sent) {
|
|
||||||
common_hal_bleio_gatts_write(self->handle, conn_handle, bufinfo);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -252,7 +219,8 @@ void common_hal_bleio_characteristic_add_descriptor(bleio_characteristic_obj_t *
|
||||||
mp_raise_OSError_msg_varg(translate("Failed to add descriptor, err 0x%04x"), err_code);
|
mp_raise_OSError_msg_varg(translate("Failed to add descriptor, err 0x%04x"), err_code);
|
||||||
}
|
}
|
||||||
|
|
||||||
mp_obj_list_append(self->descriptor_list, MP_OBJ_FROM_PTR(descriptor));
|
descriptor->next = self->descriptor_list;
|
||||||
|
self->descriptor_list = descriptor;
|
||||||
}
|
}
|
||||||
|
|
||||||
void common_hal_bleio_characteristic_set_cccd(bleio_characteristic_obj_t *self, bool notify, bool indicate) {
|
void common_hal_bleio_characteristic_set_cccd(bleio_characteristic_obj_t *self, bool notify, bool indicate) {
|
||||||
|
@ -264,7 +232,7 @@ void common_hal_bleio_characteristic_set_cccd(bleio_characteristic_obj_t *self,
|
||||||
mp_raise_ValueError(translate("Can't set CCCD on local Characteristic"));
|
mp_raise_ValueError(translate("Can't set CCCD on local Characteristic"));
|
||||||
}
|
}
|
||||||
|
|
||||||
const uint16_t conn_handle = common_hal_bleio_device_get_conn_handle(self->service->device);
|
const uint16_t conn_handle = bleio_connection_get_conn_handle(self->service->connection);
|
||||||
common_hal_bleio_check_connected(conn_handle);
|
common_hal_bleio_check_connected(conn_handle);
|
||||||
|
|
||||||
uint16_t cccd_value =
|
uint16_t cccd_value =
|
||||||
|
|
|
@ -29,11 +29,12 @@
|
||||||
#define MICROPY_INCLUDED_NRF_COMMON_HAL_BLEIO_CHARACTERISTIC_H
|
#define MICROPY_INCLUDED_NRF_COMMON_HAL_BLEIO_CHARACTERISTIC_H
|
||||||
|
|
||||||
#include "shared-bindings/_bleio/Attribute.h"
|
#include "shared-bindings/_bleio/Attribute.h"
|
||||||
|
#include "common-hal/_bleio/Descriptor.h"
|
||||||
#include "shared-module/_bleio/Characteristic.h"
|
#include "shared-module/_bleio/Characteristic.h"
|
||||||
#include "common-hal/_bleio/Service.h"
|
#include "common-hal/_bleio/Service.h"
|
||||||
#include "common-hal/_bleio/UUID.h"
|
#include "common-hal/_bleio/UUID.h"
|
||||||
|
|
||||||
typedef struct {
|
typedef struct _bleio_characteristic_obj {
|
||||||
mp_obj_base_t base;
|
mp_obj_base_t base;
|
||||||
// Will be MP_OBJ_NULL before being assigned to a Service.
|
// Will be MP_OBJ_NULL before being assigned to a Service.
|
||||||
bleio_service_obj_t *service;
|
bleio_service_obj_t *service;
|
||||||
|
@ -45,7 +46,7 @@ typedef struct {
|
||||||
bleio_characteristic_properties_t props;
|
bleio_characteristic_properties_t props;
|
||||||
bleio_attribute_security_mode_t read_perm;
|
bleio_attribute_security_mode_t read_perm;
|
||||||
bleio_attribute_security_mode_t write_perm;
|
bleio_attribute_security_mode_t write_perm;
|
||||||
mp_obj_list_t *descriptor_list;
|
bleio_descriptor_obj_t *descriptor_list;
|
||||||
uint16_t user_desc_handle;
|
uint16_t user_desc_handle;
|
||||||
uint16_t cccd_handle;
|
uint16_t cccd_handle;
|
||||||
uint16_t sccd_handle;
|
uint16_t sccd_handle;
|
||||||
|
|
|
@ -38,6 +38,7 @@
|
||||||
#include "tick.h"
|
#include "tick.h"
|
||||||
|
|
||||||
#include "shared-bindings/_bleio/__init__.h"
|
#include "shared-bindings/_bleio/__init__.h"
|
||||||
|
#include "shared-bindings/_bleio/Connection.h"
|
||||||
#include "common-hal/_bleio/CharacteristicBuffer.h"
|
#include "common-hal/_bleio/CharacteristicBuffer.h"
|
||||||
|
|
||||||
STATIC void write_to_ringbuf(bleio_characteristic_buffer_obj_t *self, uint8_t *data, uint16_t len) {
|
STATIC void write_to_ringbuf(bleio_characteristic_buffer_obj_t *self, uint8_t *data, uint16_t len) {
|
||||||
|
@ -50,7 +51,7 @@ STATIC void write_to_ringbuf(bleio_characteristic_buffer_obj_t *self, uint8_t *d
|
||||||
sd_nvic_critical_region_exit(is_nested_critical_region);
|
sd_nvic_critical_region_exit(is_nested_critical_region);
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC void characteristic_buffer_on_ble_evt(ble_evt_t *ble_evt, void *param) {
|
STATIC bool characteristic_buffer_on_ble_evt(ble_evt_t *ble_evt, void *param) {
|
||||||
bleio_characteristic_buffer_obj_t *self = (bleio_characteristic_buffer_obj_t *) param;
|
bleio_characteristic_buffer_obj_t *self = (bleio_characteristic_buffer_obj_t *) param;
|
||||||
switch (ble_evt->header.evt_id) {
|
switch (ble_evt->header.evt_id) {
|
||||||
case BLE_GATTS_EVT_WRITE: {
|
case BLE_GATTS_EVT_WRITE: {
|
||||||
|
@ -75,7 +76,11 @@ STATIC void characteristic_buffer_on_ble_evt(ble_evt_t *ble_evt, void *param) {
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Assumes that timeout and buffer_size have been validated before call.
|
// Assumes that timeout and buffer_size have been validated before call.
|
||||||
|
@ -150,6 +155,7 @@ void common_hal_bleio_characteristic_buffer_deinit(bleio_characteristic_buffer_o
|
||||||
bool common_hal_bleio_characteristic_buffer_connected(bleio_characteristic_buffer_obj_t *self) {
|
bool common_hal_bleio_characteristic_buffer_connected(bleio_characteristic_buffer_obj_t *self) {
|
||||||
return self->characteristic != NULL &&
|
return self->characteristic != NULL &&
|
||||||
self->characteristic->service != NULL &&
|
self->characteristic->service != NULL &&
|
||||||
self->characteristic->service->device != NULL &&
|
(!self->characteristic->service->is_remote ||
|
||||||
common_hal_bleio_device_get_conn_handle(self->characteristic->service->device) != BLE_CONN_HANDLE_INVALID;
|
(self->characteristic->service->connection != MP_OBJ_NULL &&
|
||||||
|
common_hal_bleio_connection_get_connected(self->characteristic->service->connection)));
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,629 @@
|
||||||
|
/*
|
||||||
|
* This file is part of the MicroPython project, http://micropython.org/
|
||||||
|
*
|
||||||
|
* The MIT License (MIT)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2018 Dan Halbert for Adafruit Industries
|
||||||
|
* Copyright (c) 2018 Artur Pacholec
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "shared-bindings/_bleio/Connection.h"
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include "ble.h"
|
||||||
|
#include "ble_drv.h"
|
||||||
|
#include "ble_hci.h"
|
||||||
|
#include "nrf_soc.h"
|
||||||
|
#include "py/gc.h"
|
||||||
|
#include "py/objlist.h"
|
||||||
|
#include "py/objstr.h"
|
||||||
|
#include "py/qstr.h"
|
||||||
|
#include "py/runtime.h"
|
||||||
|
#include "shared-bindings/_bleio/__init__.h"
|
||||||
|
#include "shared-bindings/_bleio/Adapter.h"
|
||||||
|
#include "shared-bindings/_bleio/Attribute.h"
|
||||||
|
#include "shared-bindings/_bleio/Characteristic.h"
|
||||||
|
#include "shared-bindings/_bleio/Service.h"
|
||||||
|
#include "shared-bindings/_bleio/UUID.h"
|
||||||
|
|
||||||
|
#define BLE_ADV_LENGTH_FIELD_SIZE 1
|
||||||
|
#define BLE_ADV_AD_TYPE_FIELD_SIZE 1
|
||||||
|
#define BLE_AD_TYPE_FLAGS_DATA_SIZE 1
|
||||||
|
|
||||||
|
static const ble_gap_sec_params_t pairing_sec_params = {
|
||||||
|
.bond = 1,
|
||||||
|
.mitm = 0,
|
||||||
|
.lesc = 0,
|
||||||
|
.keypress = 0,
|
||||||
|
.oob = 0,
|
||||||
|
.io_caps = BLE_GAP_IO_CAPS_NONE,
|
||||||
|
.min_key_size = 7,
|
||||||
|
.max_key_size = 16,
|
||||||
|
.kdist_own = { .enc = 1, .id = 1},
|
||||||
|
.kdist_peer = { .enc = 1, .id = 1},
|
||||||
|
};
|
||||||
|
|
||||||
|
static volatile bool m_discovery_in_process;
|
||||||
|
static volatile bool m_discovery_successful;
|
||||||
|
|
||||||
|
static bleio_service_obj_t *m_char_discovery_service;
|
||||||
|
static bleio_characteristic_obj_t *m_desc_discovery_characteristic;
|
||||||
|
|
||||||
|
bool dump_events = false;
|
||||||
|
|
||||||
|
bool connection_on_ble_evt(ble_evt_t *ble_evt, void *self_in) {
|
||||||
|
bleio_connection_internal_t *self = (bleio_connection_internal_t*)self_in;
|
||||||
|
|
||||||
|
if (BLE_GAP_EVT_BASE <= ble_evt->header.evt_id && ble_evt->header.evt_id <= BLE_GAP_EVT_LAST &&
|
||||||
|
ble_evt->evt.gap_evt.conn_handle != self->conn_handle) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (BLE_GATTS_EVT_BASE <= ble_evt->header.evt_id && ble_evt->header.evt_id <= BLE_GATTS_EVT_LAST &&
|
||||||
|
ble_evt->evt.gatts_evt.conn_handle != self->conn_handle) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// For debugging.
|
||||||
|
if (dump_events) {
|
||||||
|
mp_printf(&mp_plat_print, "Connection event: 0x%04x\n", ble_evt->header.evt_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (ble_evt->header.evt_id) {
|
||||||
|
case BLE_GAP_EVT_DISCONNECTED:
|
||||||
|
break;
|
||||||
|
case BLE_GAP_EVT_CONN_PARAM_UPDATE: // 0x12
|
||||||
|
break;
|
||||||
|
case BLE_GAP_EVT_PHY_UPDATE_REQUEST: {
|
||||||
|
ble_gap_phys_t const phys = {
|
||||||
|
.rx_phys = BLE_GAP_PHY_AUTO,
|
||||||
|
.tx_phys = BLE_GAP_PHY_AUTO,
|
||||||
|
};
|
||||||
|
sd_ble_gap_phy_update(ble_evt->evt.gap_evt.conn_handle, &phys);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case BLE_GAP_EVT_PHY_UPDATE: // 0x22
|
||||||
|
break;
|
||||||
|
|
||||||
|
case BLE_GAP_EVT_DATA_LENGTH_UPDATE_REQUEST:
|
||||||
|
// SoftDevice will respond to a length update request.
|
||||||
|
sd_ble_gap_data_length_update(self->conn_handle, NULL, NULL);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case BLE_GAP_EVT_DATA_LENGTH_UPDATE: // 0x24
|
||||||
|
break;
|
||||||
|
|
||||||
|
case BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST: {
|
||||||
|
// We only handle MTU of size BLE_GATT_ATT_MTU_DEFAULT.
|
||||||
|
sd_ble_gatts_exchange_mtu_reply(self->conn_handle, BLE_GATT_ATT_MTU_DEFAULT);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case BLE_GATTS_EVT_SYS_ATTR_MISSING:
|
||||||
|
sd_ble_gatts_sys_attr_set(self->conn_handle, NULL, 0, 0);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case BLE_GATTS_EVT_HVN_TX_COMPLETE: // Capture this for now. 0x55
|
||||||
|
break;
|
||||||
|
|
||||||
|
case BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST: {
|
||||||
|
ble_gap_evt_conn_param_update_request_t *request =
|
||||||
|
&ble_evt->evt.gap_evt.params.conn_param_update_request;
|
||||||
|
sd_ble_gap_conn_param_update(self->conn_handle, &request->conn_params);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case BLE_GAP_EVT_SEC_PARAMS_REQUEST: {
|
||||||
|
ble_gap_sec_keyset_t keyset = {
|
||||||
|
.keys_own = {
|
||||||
|
.p_enc_key = &self->bonding_keys.own_enc,
|
||||||
|
.p_id_key = NULL,
|
||||||
|
.p_sign_key = NULL,
|
||||||
|
.p_pk = NULL
|
||||||
|
},
|
||||||
|
|
||||||
|
.keys_peer = {
|
||||||
|
.p_enc_key = &self->bonding_keys.peer_enc,
|
||||||
|
.p_id_key = &self->bonding_keys.peer_id,
|
||||||
|
.p_sign_key = NULL,
|
||||||
|
.p_pk = NULL
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
sd_ble_gap_sec_params_reply(self->conn_handle, BLE_GAP_SEC_STATUS_SUCCESS,
|
||||||
|
&pairing_sec_params, &keyset);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case BLE_GAP_EVT_LESC_DHKEY_REQUEST:
|
||||||
|
// TODO for LESC pairing:
|
||||||
|
// sd_ble_gap_lesc_dhkey_reply(...);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case BLE_GAP_EVT_AUTH_STATUS: { // 0x19
|
||||||
|
// Pairing process completed
|
||||||
|
ble_gap_evt_auth_status_t* status = &ble_evt->evt.gap_evt.params.auth_status;
|
||||||
|
if (BLE_GAP_SEC_STATUS_SUCCESS == status->auth_status) {
|
||||||
|
// TODO _ediv = bonding_keys->own_enc.master_id.ediv;
|
||||||
|
self->pair_status = PAIR_PAIRED;
|
||||||
|
} else {
|
||||||
|
self->pair_status = PAIR_NOT_PAIRED;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case BLE_GAP_EVT_SEC_INFO_REQUEST: { // 0x14
|
||||||
|
// Peer asks for the stored keys.
|
||||||
|
// - load key and return if bonded previously.
|
||||||
|
// - Else return NULL --> Initiate key exchange
|
||||||
|
ble_gap_evt_sec_info_request_t* sec_info_request = &ble_evt->evt.gap_evt.params.sec_info_request;
|
||||||
|
(void) sec_info_request;
|
||||||
|
//if ( bond_load_keys(_role, sec_req->master_id.ediv, &bkeys) ) {
|
||||||
|
//sd_ble_gap_sec_info_reply(_conn_hdl, &bkeys.own_enc.enc_info, &bkeys.peer_id.id_info, NULL);
|
||||||
|
//
|
||||||
|
//_ediv = bkeys.own_enc.master_id.ediv;
|
||||||
|
// } else {
|
||||||
|
sd_ble_gap_sec_info_reply(self->conn_handle, NULL, NULL, NULL);
|
||||||
|
// }
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case BLE_GAP_EVT_CONN_SEC_UPDATE: { // 0x1a
|
||||||
|
ble_gap_conn_sec_t* conn_sec = &ble_evt->evt.gap_evt.params.conn_sec_update.conn_sec;
|
||||||
|
if (conn_sec->sec_mode.sm <= 1 && conn_sec->sec_mode.lv <= 1) {
|
||||||
|
// Security setup did not succeed:
|
||||||
|
// mode 0, level 0 means no access
|
||||||
|
// mode 1, level 1 means open link
|
||||||
|
// mode >=1 and/or level >=1 means encryption is set up
|
||||||
|
self->pair_status = PAIR_NOT_PAIRED;
|
||||||
|
} else {
|
||||||
|
//if ( !bond_load_cccd(_role, _conn_hdl, _ediv) ) {
|
||||||
|
if (true) { // TODO: no bonding yet
|
||||||
|
// Initialize system attributes fresh.
|
||||||
|
sd_ble_gatts_sys_attr_set(self->conn_handle, NULL, 0, 0);
|
||||||
|
}
|
||||||
|
// Not quite paired yet: wait for BLE_GAP_EVT_AUTH_STATUS SUCCESS.
|
||||||
|
self->ediv = self->bonding_keys.own_enc.master_id.ediv;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
default:
|
||||||
|
// For debugging.
|
||||||
|
if (dump_events) {
|
||||||
|
mp_printf(&mp_plat_print, "Unhandled connection event: 0x%04x\n", ble_evt->header.evt_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void bleio_connection_clear(bleio_connection_internal_t *self) {
|
||||||
|
self->remote_service_list = NULL;
|
||||||
|
|
||||||
|
self->conn_handle = BLE_CONN_HANDLE_INVALID;
|
||||||
|
self->pair_status = PAIR_NOT_PAIRED;
|
||||||
|
|
||||||
|
memset(&self->bonding_keys, 0, sizeof(self->bonding_keys));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool common_hal_bleio_connection_get_connected(bleio_connection_obj_t *self) {
|
||||||
|
if (self->connection == NULL) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return self->connection->conn_handle != BLE_CONN_HANDLE_INVALID;
|
||||||
|
}
|
||||||
|
|
||||||
|
void common_hal_bleio_connection_disconnect(bleio_connection_internal_t *self) {
|
||||||
|
sd_ble_gap_disconnect(self->conn_handle, BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
|
||||||
|
}
|
||||||
|
|
||||||
|
void common_hal_bleio_connection_pair(bleio_connection_internal_t *self) {
|
||||||
|
self->pair_status = PAIR_WAITING;
|
||||||
|
|
||||||
|
uint32_t err_code = sd_ble_gap_authenticate(self->conn_handle, &pairing_sec_params);
|
||||||
|
|
||||||
|
if (err_code != NRF_SUCCESS) {
|
||||||
|
mp_raise_OSError_msg_varg(translate("Failed to start pairing, NRF_ERROR_%q"), MP_OBJ_QSTR_VALUE(base_error_messages[err_code - NRF_ERROR_BASE_NUM]));
|
||||||
|
}
|
||||||
|
|
||||||
|
while (self->pair_status == PAIR_WAITING) {
|
||||||
|
RUN_BACKGROUND_TASKS;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (self->pair_status == PAIR_NOT_PAIRED) {
|
||||||
|
mp_raise_OSError_msg(translate("Failed to pair"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// service_uuid may be NULL, to discover all services.
|
||||||
|
STATIC bool discover_next_services(bleio_connection_internal_t* connection, uint16_t start_handle, ble_uuid_t *service_uuid) {
|
||||||
|
m_discovery_successful = false;
|
||||||
|
m_discovery_in_process = true;
|
||||||
|
|
||||||
|
uint32_t err_code = sd_ble_gattc_primary_services_discover(connection->conn_handle, start_handle, service_uuid);
|
||||||
|
|
||||||
|
if (err_code != NRF_SUCCESS) {
|
||||||
|
mp_raise_OSError_msg(translate("Failed to discover services"));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wait for a discovery event.
|
||||||
|
while (m_discovery_in_process) {
|
||||||
|
MICROPY_VM_HOOK_LOOP;
|
||||||
|
}
|
||||||
|
return m_discovery_successful;
|
||||||
|
}
|
||||||
|
|
||||||
|
STATIC bool discover_next_characteristics(bleio_connection_internal_t* connection, bleio_service_obj_t *service, uint16_t start_handle) {
|
||||||
|
m_char_discovery_service = service;
|
||||||
|
|
||||||
|
ble_gattc_handle_range_t handle_range;
|
||||||
|
handle_range.start_handle = start_handle;
|
||||||
|
handle_range.end_handle = service->end_handle;
|
||||||
|
|
||||||
|
m_discovery_successful = false;
|
||||||
|
m_discovery_in_process = true;
|
||||||
|
|
||||||
|
uint32_t err_code = sd_ble_gattc_characteristics_discover(connection->conn_handle, &handle_range);
|
||||||
|
if (err_code != NRF_SUCCESS) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wait for a discovery event.
|
||||||
|
while (m_discovery_in_process) {
|
||||||
|
MICROPY_VM_HOOK_LOOP;
|
||||||
|
}
|
||||||
|
return m_discovery_successful;
|
||||||
|
}
|
||||||
|
|
||||||
|
STATIC bool discover_next_descriptors(bleio_connection_internal_t* connection, bleio_characteristic_obj_t *characteristic, uint16_t start_handle, uint16_t end_handle) {
|
||||||
|
m_desc_discovery_characteristic = characteristic;
|
||||||
|
|
||||||
|
ble_gattc_handle_range_t handle_range;
|
||||||
|
handle_range.start_handle = start_handle;
|
||||||
|
handle_range.end_handle = end_handle;
|
||||||
|
|
||||||
|
m_discovery_successful = false;
|
||||||
|
m_discovery_in_process = true;
|
||||||
|
|
||||||
|
uint32_t err_code = sd_ble_gattc_descriptors_discover(connection->conn_handle, &handle_range);
|
||||||
|
if (err_code != NRF_SUCCESS) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wait for a discovery event.
|
||||||
|
while (m_discovery_in_process) {
|
||||||
|
MICROPY_VM_HOOK_LOOP;
|
||||||
|
}
|
||||||
|
return m_discovery_successful;
|
||||||
|
}
|
||||||
|
|
||||||
|
STATIC void on_primary_srv_discovery_rsp(ble_gattc_evt_prim_srvc_disc_rsp_t *response, bleio_connection_internal_t* connection) {
|
||||||
|
bleio_service_obj_t* tail = connection->remote_service_list;
|
||||||
|
|
||||||
|
for (size_t i = 0; i < response->count; ++i) {
|
||||||
|
ble_gattc_service_t *gattc_service = &response->services[i];
|
||||||
|
|
||||||
|
bleio_service_obj_t *service = m_new_obj(bleio_service_obj_t);
|
||||||
|
service->base.type = &bleio_service_type;
|
||||||
|
|
||||||
|
// Initialize several fields at once.
|
||||||
|
bleio_service_from_connection(service, bleio_connection_new_from_internal(connection));
|
||||||
|
|
||||||
|
service->is_remote = true;
|
||||||
|
service->start_handle = gattc_service->handle_range.start_handle;
|
||||||
|
service->end_handle = gattc_service->handle_range.end_handle;
|
||||||
|
service->handle = gattc_service->handle_range.start_handle;
|
||||||
|
|
||||||
|
if (gattc_service->uuid.type != BLE_UUID_TYPE_UNKNOWN) {
|
||||||
|
// Known service UUID.
|
||||||
|
bleio_uuid_obj_t *uuid = m_new_obj(bleio_uuid_obj_t);
|
||||||
|
uuid->base.type = &bleio_uuid_type;
|
||||||
|
bleio_uuid_construct_from_nrf_ble_uuid(uuid, &gattc_service->uuid);
|
||||||
|
service->uuid = uuid;
|
||||||
|
} else {
|
||||||
|
// The discovery response contained a 128-bit UUID that has not yet been registered with the
|
||||||
|
// softdevice via sd_ble_uuid_vs_add(). We need to fetch the 128-bit value and register it.
|
||||||
|
// For now, just set the UUID to NULL.
|
||||||
|
service->uuid = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
service->next = tail;
|
||||||
|
tail = service;
|
||||||
|
}
|
||||||
|
|
||||||
|
connection->remote_service_list = tail;
|
||||||
|
|
||||||
|
if (response->count > 0) {
|
||||||
|
m_discovery_successful = true;
|
||||||
|
}
|
||||||
|
m_discovery_in_process = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
STATIC void on_char_discovery_rsp(ble_gattc_evt_char_disc_rsp_t *response, bleio_connection_internal_t* connection) {
|
||||||
|
for (size_t i = 0; i < response->count; ++i) {
|
||||||
|
ble_gattc_char_t *gattc_char = &response->chars[i];
|
||||||
|
|
||||||
|
bleio_characteristic_obj_t *characteristic = m_new_obj(bleio_characteristic_obj_t);
|
||||||
|
characteristic->base.type = &bleio_characteristic_type;
|
||||||
|
|
||||||
|
bleio_uuid_obj_t *uuid = NULL;
|
||||||
|
|
||||||
|
if (gattc_char->uuid.type != BLE_UUID_TYPE_UNKNOWN) {
|
||||||
|
// Known characteristic UUID.
|
||||||
|
uuid = m_new_obj(bleio_uuid_obj_t);
|
||||||
|
uuid->base.type = &bleio_uuid_type;
|
||||||
|
bleio_uuid_construct_from_nrf_ble_uuid(uuid, &gattc_char->uuid);
|
||||||
|
} else {
|
||||||
|
// The discovery response contained a 128-bit UUID that has not yet been registered with the
|
||||||
|
// softdevice via sd_ble_uuid_vs_add(). We need to fetch the 128-bit value and register it.
|
||||||
|
// For now, just leave the UUID as NULL.
|
||||||
|
}
|
||||||
|
|
||||||
|
bleio_characteristic_properties_t props =
|
||||||
|
(gattc_char->char_props.broadcast ? CHAR_PROP_BROADCAST : 0) |
|
||||||
|
(gattc_char->char_props.indicate ? CHAR_PROP_INDICATE : 0) |
|
||||||
|
(gattc_char->char_props.notify ? CHAR_PROP_NOTIFY : 0) |
|
||||||
|
(gattc_char->char_props.read ? CHAR_PROP_READ : 0) |
|
||||||
|
(gattc_char->char_props.write ? CHAR_PROP_WRITE : 0) |
|
||||||
|
(gattc_char->char_props.write_wo_resp ? CHAR_PROP_WRITE_NO_RESPONSE : 0);
|
||||||
|
|
||||||
|
// Call common_hal_bleio_characteristic_construct() to initalize some fields and set up evt handler.
|
||||||
|
common_hal_bleio_characteristic_construct(
|
||||||
|
characteristic, m_char_discovery_service, gattc_char->handle_value, uuid,
|
||||||
|
props, SECURITY_MODE_OPEN, SECURITY_MODE_OPEN,
|
||||||
|
GATT_MAX_DATA_LENGTH, false, // max_length, fixed_length: values may not matter for gattc
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
mp_obj_list_append(m_char_discovery_service->characteristic_list, MP_OBJ_FROM_PTR(characteristic));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (response->count > 0) {
|
||||||
|
m_discovery_successful = true;
|
||||||
|
}
|
||||||
|
m_discovery_in_process = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
STATIC void on_desc_discovery_rsp(ble_gattc_evt_desc_disc_rsp_t *response, bleio_connection_internal_t* connection) {
|
||||||
|
for (size_t i = 0; i < response->count; ++i) {
|
||||||
|
ble_gattc_desc_t *gattc_desc = &response->descs[i];
|
||||||
|
|
||||||
|
// Remember handles for certain well-known descriptors.
|
||||||
|
switch (gattc_desc->uuid.uuid) {
|
||||||
|
case BLE_UUID_DESCRIPTOR_CLIENT_CHAR_CONFIG:
|
||||||
|
m_desc_discovery_characteristic->cccd_handle = gattc_desc->handle;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case BLE_UUID_DESCRIPTOR_SERVER_CHAR_CONFIG:
|
||||||
|
m_desc_discovery_characteristic->sccd_handle = gattc_desc->handle;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case BLE_UUID_DESCRIPTOR_CHAR_USER_DESC:
|
||||||
|
m_desc_discovery_characteristic->user_desc_handle = gattc_desc->handle;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
// TODO: sd_ble_gattc_descriptors_discover() can return things that are not descriptors,
|
||||||
|
// so ignore those.
|
||||||
|
// https://devzone.nordicsemi.com/f/nordic-q-a/49500/sd_ble_gattc_descriptors_discover-is-returning-attributes-that-are-not-descriptors
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
bleio_descriptor_obj_t *descriptor = m_new_obj(bleio_descriptor_obj_t);
|
||||||
|
descriptor->base.type = &bleio_descriptor_type;
|
||||||
|
|
||||||
|
bleio_uuid_obj_t *uuid = NULL;
|
||||||
|
|
||||||
|
if (gattc_desc->uuid.type != BLE_UUID_TYPE_UNKNOWN) {
|
||||||
|
// Known descriptor UUID.
|
||||||
|
uuid = m_new_obj(bleio_uuid_obj_t);
|
||||||
|
uuid->base.type = &bleio_uuid_type;
|
||||||
|
bleio_uuid_construct_from_nrf_ble_uuid(uuid, &gattc_desc->uuid);
|
||||||
|
} else {
|
||||||
|
// The discovery response contained a 128-bit UUID that has not yet been registered with the
|
||||||
|
// softdevice via sd_ble_uuid_vs_add(). We need to fetch the 128-bit value and register it.
|
||||||
|
// For now, just leave the UUID as NULL.
|
||||||
|
}
|
||||||
|
|
||||||
|
common_hal_bleio_descriptor_construct(
|
||||||
|
descriptor, m_desc_discovery_characteristic, uuid,
|
||||||
|
SECURITY_MODE_OPEN, SECURITY_MODE_OPEN,
|
||||||
|
GATT_MAX_DATA_LENGTH, false, mp_const_empty_bytes);
|
||||||
|
descriptor->handle = gattc_desc->handle;
|
||||||
|
|
||||||
|
mp_obj_list_append(m_desc_discovery_characteristic->descriptor_list, MP_OBJ_FROM_PTR(descriptor));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (response->count > 0) {
|
||||||
|
m_discovery_successful = true;
|
||||||
|
}
|
||||||
|
m_discovery_in_process = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
STATIC bool discovery_on_ble_evt(ble_evt_t *ble_evt, mp_obj_t payload) {
|
||||||
|
bleio_connection_internal_t* connection = MP_OBJ_TO_PTR(payload);
|
||||||
|
switch (ble_evt->header.evt_id) {
|
||||||
|
case BLE_GAP_EVT_DISCONNECTED:
|
||||||
|
m_discovery_successful = false;
|
||||||
|
m_discovery_in_process = false;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case BLE_GATTC_EVT_PRIM_SRVC_DISC_RSP:
|
||||||
|
on_primary_srv_discovery_rsp(&ble_evt->evt.gattc_evt.params.prim_srvc_disc_rsp, connection);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case BLE_GATTC_EVT_CHAR_DISC_RSP:
|
||||||
|
on_char_discovery_rsp(&ble_evt->evt.gattc_evt.params.char_disc_rsp, connection);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case BLE_GATTC_EVT_DESC_DISC_RSP:
|
||||||
|
on_desc_discovery_rsp(&ble_evt->evt.gattc_evt.params.desc_disc_rsp, connection);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
// For debugging.
|
||||||
|
// mp_printf(&mp_plat_print, "Unhandled discovery event: 0x%04x\n", ble_evt->header.evt_id);
|
||||||
|
return false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
STATIC void discover_remote_services(bleio_connection_internal_t *self, mp_obj_t service_uuids_whitelist) {
|
||||||
|
ble_drv_add_event_handler(discovery_on_ble_evt, self);
|
||||||
|
|
||||||
|
// Start over with an empty list.
|
||||||
|
self->remote_service_list = NULL;
|
||||||
|
|
||||||
|
if (service_uuids_whitelist == mp_const_none) {
|
||||||
|
// List of service UUID's not given, so discover all available services.
|
||||||
|
|
||||||
|
uint16_t next_service_start_handle = BLE_GATT_HANDLE_START;
|
||||||
|
|
||||||
|
while (discover_next_services(self, next_service_start_handle, MP_OBJ_NULL)) {
|
||||||
|
// discover_next_services() appends to remote_services_list.
|
||||||
|
|
||||||
|
// Get the most recently discovered service, and then ask for services
|
||||||
|
// whose handles start after the last attribute handle inside that service.
|
||||||
|
const bleio_service_obj_t *service = self->remote_service_list;
|
||||||
|
next_service_start_handle = service->end_handle + 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
mp_obj_iter_buf_t iter_buf;
|
||||||
|
mp_obj_t iterable = mp_getiter(service_uuids_whitelist, &iter_buf);
|
||||||
|
mp_obj_t uuid_obj;
|
||||||
|
while ((uuid_obj = mp_iternext(iterable)) != MP_OBJ_STOP_ITERATION) {
|
||||||
|
if (!MP_OBJ_IS_TYPE(uuid_obj, &bleio_uuid_type)) {
|
||||||
|
mp_raise_ValueError(translate("non-UUID found in service_uuids_whitelist"));
|
||||||
|
}
|
||||||
|
bleio_uuid_obj_t *uuid = MP_OBJ_TO_PTR(uuid_obj);
|
||||||
|
|
||||||
|
ble_uuid_t nrf_uuid;
|
||||||
|
bleio_uuid_convert_to_nrf_ble_uuid(uuid, &nrf_uuid);
|
||||||
|
|
||||||
|
// Service might or might not be discovered; that's ok. Caller has to check
|
||||||
|
// Central.remote_services to find out.
|
||||||
|
// We only need to call this once for each service to discover.
|
||||||
|
discover_next_services(self, BLE_GATT_HANDLE_START, &nrf_uuid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bleio_service_obj_t *service = self->remote_service_list;
|
||||||
|
while (service != NULL) {
|
||||||
|
// Skip the service if it had an unknown (unregistered) UUID.
|
||||||
|
if (service->uuid == NULL) {
|
||||||
|
service = service->next;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t next_char_start_handle = service->start_handle;
|
||||||
|
|
||||||
|
// Stop when we go past the end of the range of handles for this service or
|
||||||
|
// discovery call returns nothing.
|
||||||
|
// discover_next_characteristics() appends to the characteristic_list.
|
||||||
|
while (next_char_start_handle <= service->end_handle &&
|
||||||
|
discover_next_characteristics(self, service, next_char_start_handle)) {
|
||||||
|
|
||||||
|
|
||||||
|
// Get the most recently discovered characteristic, and then ask for characteristics
|
||||||
|
// whose handles start after the last attribute handle inside that characteristic.
|
||||||
|
const bleio_characteristic_obj_t *characteristic =
|
||||||
|
MP_OBJ_TO_PTR(service->characteristic_list->items[service->characteristic_list->len - 1]);
|
||||||
|
|
||||||
|
next_char_start_handle = characteristic->handle + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Got characteristics for this service. Now discover descriptors for each characteristic.
|
||||||
|
size_t char_list_len = service->characteristic_list->len;
|
||||||
|
for (size_t char_idx = 0; char_idx < char_list_len; ++char_idx) {
|
||||||
|
bleio_characteristic_obj_t *characteristic =
|
||||||
|
MP_OBJ_TO_PTR(service->characteristic_list->items[char_idx]);
|
||||||
|
const bool last_characteristic = char_idx == char_list_len - 1;
|
||||||
|
bleio_characteristic_obj_t *next_characteristic = last_characteristic
|
||||||
|
? NULL
|
||||||
|
: MP_OBJ_TO_PTR(service->characteristic_list->items[char_idx + 1]);
|
||||||
|
|
||||||
|
// Skip the characteristic if it had an unknown (unregistered) UUID.
|
||||||
|
if (characteristic->uuid == NULL) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t next_desc_start_handle = characteristic->handle + 1;
|
||||||
|
|
||||||
|
// Don't run past the end of this service or the beginning of the next characteristic.
|
||||||
|
uint16_t next_desc_end_handle = next_characteristic == NULL
|
||||||
|
? service->end_handle
|
||||||
|
: next_characteristic->handle - 1;
|
||||||
|
|
||||||
|
// Stop when we go past the end of the range of handles for this service or
|
||||||
|
// discovery call returns nothing.
|
||||||
|
// discover_next_descriptors() appends to the descriptor_list.
|
||||||
|
while (next_desc_start_handle <= service->end_handle &&
|
||||||
|
next_desc_start_handle < next_desc_end_handle &&
|
||||||
|
discover_next_descriptors(self, characteristic,
|
||||||
|
next_desc_start_handle, next_desc_end_handle)) {
|
||||||
|
|
||||||
|
// Get the most recently discovered descriptor, and then ask for descriptors
|
||||||
|
// whose handles start after that descriptor's handle.
|
||||||
|
const bleio_descriptor_obj_t *descriptor = characteristic->descriptor_list;
|
||||||
|
next_desc_start_handle = descriptor->handle + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
service = service->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
// This event handler is no longer needed.
|
||||||
|
ble_drv_remove_event_handler(discovery_on_ble_evt, self);
|
||||||
|
|
||||||
|
}
|
||||||
|
mp_obj_tuple_t *common_hal_bleio_connection_discover_remote_services(bleio_connection_obj_t *self, mp_obj_t service_uuids_whitelist) {
|
||||||
|
discover_remote_services(self->connection, service_uuids_whitelist);
|
||||||
|
// Convert to a tuple and then clear the list so the callee will take ownership.
|
||||||
|
mp_obj_tuple_t *services_tuple = service_linked_list_to_tuple(self->connection->remote_service_list);
|
||||||
|
self->connection->remote_service_list = NULL;
|
||||||
|
|
||||||
|
return services_tuple;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
uint16_t bleio_connection_get_conn_handle(bleio_connection_obj_t *self) {
|
||||||
|
if (self == NULL || self->connection == NULL) {
|
||||||
|
return BLE_CONN_HANDLE_INVALID;
|
||||||
|
}
|
||||||
|
return self->connection->conn_handle;
|
||||||
|
}
|
||||||
|
|
||||||
|
mp_obj_t bleio_connection_new_from_internal(bleio_connection_internal_t* internal) {
|
||||||
|
if (internal->connection_obj != mp_const_none) {
|
||||||
|
return internal->connection_obj;
|
||||||
|
}
|
||||||
|
bleio_connection_obj_t *connection = m_new_obj(bleio_connection_obj_t);
|
||||||
|
connection->base.type = &bleio_connection_type;
|
||||||
|
connection->connection = internal;
|
||||||
|
internal->connection_obj = connection;
|
||||||
|
|
||||||
|
return MP_OBJ_FROM_PTR(connection);
|
||||||
|
}
|
|
@ -25,8 +25,8 @@
|
||||||
* THE SOFTWARE.
|
* THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef MICROPY_INCLUDED_NRF_COMMON_HAL_BLEIO_PERIPHERAL_H
|
#ifndef MICROPY_INCLUDED_NRF_COMMON_HAL_BLEIO_CONNECTION_H
|
||||||
#define MICROPY_INCLUDED_NRF_COMMON_HAL_BLEIO_PERIPHERAL_H
|
#define MICROPY_INCLUDED_NRF_COMMON_HAL_BLEIO_CONNECTION_H
|
||||||
|
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
@ -37,6 +37,7 @@
|
||||||
|
|
||||||
#include "common-hal/_bleio/__init__.h"
|
#include "common-hal/_bleio/__init__.h"
|
||||||
#include "shared-module/_bleio/Address.h"
|
#include "shared-module/_bleio/Address.h"
|
||||||
|
#include "common-hal/_bleio/Service.h"
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
PAIR_NOT_PAIRED,
|
PAIR_NOT_PAIRED,
|
||||||
|
@ -44,24 +45,35 @@ typedef enum {
|
||||||
PAIR_PAIRED,
|
PAIR_PAIRED,
|
||||||
} pair_status_t;
|
} pair_status_t;
|
||||||
|
|
||||||
|
// We split the Connection object into two so that the internal mechanics can live outside of the
|
||||||
|
// VM. If it were one object, then we'd risk user code seeing a connection object of theirs be
|
||||||
|
// reused.
|
||||||
typedef struct {
|
typedef struct {
|
||||||
mp_obj_base_t base;
|
uint16_t conn_handle;
|
||||||
mp_obj_t name;
|
bool is_central;
|
||||||
volatile uint16_t conn_handle;
|
|
||||||
// Services provided by this peripheral.
|
|
||||||
mp_obj_list_t *service_list;
|
|
||||||
// Remote services discovered when this peripheral is acting as a client.
|
// Remote services discovered when this peripheral is acting as a client.
|
||||||
mp_obj_list_t *remote_service_list;
|
bleio_service_obj_t *remote_service_list;
|
||||||
// The advertising data and scan response buffers are held by us, not by the SD, so we must
|
// The advertising data and scan response buffers are held by us, not by the SD, so we must
|
||||||
// maintain them and not change it. If we need to change the contents during advertising,
|
// maintain them and not change it. If we need to change the contents during advertising,
|
||||||
// there are tricks to get the SD to notice (see DevZone - TBS).
|
// there are tricks to get the SD to notice (see DevZone - TBS).
|
||||||
// EDIV: Encrypted Diversifier: Identifies LTK during legacy pairing.
|
// EDIV: Encrypted Diversifier: Identifies LTK during legacy pairing.
|
||||||
bonding_keys_t bonding_keys;
|
bonding_keys_t bonding_keys;
|
||||||
uint16_t ediv;
|
uint16_t ediv;
|
||||||
uint8_t* advertising_data;
|
|
||||||
uint8_t* scan_response_data;
|
|
||||||
uint8_t adv_handle;
|
|
||||||
pair_status_t pair_status;
|
pair_status_t pair_status;
|
||||||
} bleio_peripheral_obj_t;
|
mp_obj_t connection_obj;
|
||||||
|
ble_drv_evt_handler_entry_t handler_entry;
|
||||||
|
} bleio_connection_internal_t;
|
||||||
|
|
||||||
#endif // MICROPY_INCLUDED_NRF_COMMON_HAL_BLEIO_PERIPHERAL_H
|
typedef struct {
|
||||||
|
mp_obj_base_t base;
|
||||||
|
bleio_connection_internal_t* connection;
|
||||||
|
// The HCI disconnect reason.
|
||||||
|
uint8_t disconnect_reason;
|
||||||
|
} bleio_connection_obj_t;
|
||||||
|
|
||||||
|
bool connection_on_ble_evt(ble_evt_t *ble_evt, void *self_in);
|
||||||
|
|
||||||
|
uint16_t bleio_connection_get_conn_handle(bleio_connection_obj_t *self);
|
||||||
|
mp_obj_t bleio_connection_new_from_internal(bleio_connection_internal_t* connection);
|
||||||
|
|
||||||
|
#endif // MICROPY_INCLUDED_NRF_COMMON_HAL_BLEIO_CONNECTION_H
|
|
@ -33,8 +33,6 @@
|
||||||
#include "shared-bindings/_bleio/Service.h"
|
#include "shared-bindings/_bleio/Service.h"
|
||||||
#include "shared-bindings/_bleio/UUID.h"
|
#include "shared-bindings/_bleio/UUID.h"
|
||||||
|
|
||||||
static volatile bleio_descriptor_obj_t *m_read_descriptor;
|
|
||||||
|
|
||||||
void common_hal_bleio_descriptor_construct(bleio_descriptor_obj_t *self, bleio_characteristic_obj_t *characteristic, bleio_uuid_obj_t *uuid, bleio_attribute_security_mode_t read_perm, bleio_attribute_security_mode_t write_perm, mp_int_t max_length, bool fixed_length, mp_buffer_info_t *initial_value_bufinfo) {
|
void common_hal_bleio_descriptor_construct(bleio_descriptor_obj_t *self, bleio_characteristic_obj_t *characteristic, bleio_uuid_obj_t *uuid, bleio_attribute_security_mode_t read_perm, bleio_attribute_security_mode_t write_perm, mp_int_t max_length, bool fixed_length, mp_buffer_info_t *initial_value_bufinfo) {
|
||||||
self->characteristic = characteristic;
|
self->characteristic = characteristic;
|
||||||
self->uuid = uuid;
|
self->uuid = uuid;
|
||||||
|
@ -61,62 +59,18 @@ bleio_characteristic_obj_t *common_hal_bleio_descriptor_get_characteristic(bleio
|
||||||
return self->characteristic;
|
return self->characteristic;
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC void descriptor_on_gattc_read_rsp_evt(ble_evt_t *ble_evt, void *param) {
|
size_t common_hal_bleio_descriptor_get_value(bleio_descriptor_obj_t *self, uint8_t* buf, size_t len) {
|
||||||
switch (ble_evt->header.evt_id) {
|
|
||||||
|
|
||||||
// More events may be handled later, so keep this as a switch.
|
|
||||||
|
|
||||||
case BLE_GATTC_EVT_READ_RSP: {
|
|
||||||
ble_gattc_evt_read_rsp_t *response = &ble_evt->evt.gattc_evt.params.read_rsp;
|
|
||||||
if (m_read_descriptor) {
|
|
||||||
m_read_descriptor->value = mp_obj_new_bytearray(response->len, response->data);
|
|
||||||
}
|
|
||||||
// Indicate to busy-wait loop that we've read the attribute value.
|
|
||||||
m_read_descriptor = NULL;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
|
||||||
// For debugging.
|
|
||||||
// mp_printf(&mp_plat_print, "Unhandled descriptor event: 0x%04x\n", ble_evt->header.evt_id);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
STATIC void descriptor_gattc_read(bleio_descriptor_obj_t *descriptor) {
|
|
||||||
const uint16_t conn_handle =
|
|
||||||
common_hal_bleio_device_get_conn_handle(descriptor->characteristic->service->device);
|
|
||||||
common_hal_bleio_check_connected(conn_handle);
|
|
||||||
|
|
||||||
// Set to NULL in event loop after event.
|
|
||||||
m_read_descriptor = descriptor;
|
|
||||||
|
|
||||||
ble_drv_add_event_handler(descriptor_on_gattc_read_rsp_evt, descriptor);
|
|
||||||
|
|
||||||
const uint32_t err_code = sd_ble_gattc_read(conn_handle, descriptor->handle, 0);
|
|
||||||
if (err_code != NRF_SUCCESS) {
|
|
||||||
mp_raise_OSError_msg_varg(translate("Failed to read attribute value, err 0x%04x"), err_code);
|
|
||||||
}
|
|
||||||
|
|
||||||
while (m_read_descriptor != NULL) {
|
|
||||||
MICROPY_VM_HOOK_LOOP;
|
|
||||||
}
|
|
||||||
|
|
||||||
ble_drv_remove_event_handler(descriptor_on_gattc_read_rsp_evt, descriptor);
|
|
||||||
}
|
|
||||||
|
|
||||||
mp_obj_t common_hal_bleio_descriptor_get_value(bleio_descriptor_obj_t *self) {
|
|
||||||
// Do GATT operations only if this descriptor has been registered
|
// Do GATT operations only if this descriptor has been registered
|
||||||
if (self->handle != BLE_GATT_HANDLE_INVALID) {
|
if (self->handle != BLE_GATT_HANDLE_INVALID) {
|
||||||
|
uint16_t conn_handle = bleio_connection_get_conn_handle(self->characteristic->service->connection);
|
||||||
if (common_hal_bleio_service_get_is_remote(self->characteristic->service)) {
|
if (common_hal_bleio_service_get_is_remote(self->characteristic->service)) {
|
||||||
descriptor_gattc_read(self);
|
return common_hal_bleio_gattc_read(self->handle, conn_handle, buf, len);
|
||||||
} else {
|
} else {
|
||||||
self->value = common_hal_bleio_gatts_read(
|
return common_hal_bleio_gatts_read(self->handle, conn_handle, buf, len);
|
||||||
self->handle, common_hal_bleio_device_get_conn_handle(self->characteristic->service->device));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return self->value;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void common_hal_bleio_descriptor_set_value(bleio_descriptor_obj_t *self, mp_buffer_info_t *bufinfo) {
|
void common_hal_bleio_descriptor_set_value(bleio_descriptor_obj_t *self, mp_buffer_info_t *bufinfo) {
|
||||||
|
@ -131,7 +85,7 @@ void common_hal_bleio_descriptor_set_value(bleio_descriptor_obj_t *self, mp_buff
|
||||||
|
|
||||||
// Do GATT operations only if this descriptor has been registered.
|
// Do GATT operations only if this descriptor has been registered.
|
||||||
if (self->handle != BLE_GATT_HANDLE_INVALID) {
|
if (self->handle != BLE_GATT_HANDLE_INVALID) {
|
||||||
uint16_t conn_handle = common_hal_bleio_device_get_conn_handle(self->characteristic->service->device);
|
uint16_t conn_handle = bleio_connection_get_conn_handle(self->characteristic->service->connection);
|
||||||
if (common_hal_bleio_service_get_is_remote(self->characteristic->service)) {
|
if (common_hal_bleio_service_get_is_remote(self->characteristic->service)) {
|
||||||
// false means WRITE_REQ, not write-no-response
|
// false means WRITE_REQ, not write-no-response
|
||||||
common_hal_bleio_gattc_write(self->handle, conn_handle, bufinfo, false);
|
common_hal_bleio_gattc_write(self->handle, conn_handle, bufinfo, false);
|
||||||
|
|
|
@ -31,13 +31,15 @@
|
||||||
|
|
||||||
#include "py/obj.h"
|
#include "py/obj.h"
|
||||||
|
|
||||||
#include "common-hal/_bleio/Characteristic.h"
|
|
||||||
#include "common-hal/_bleio/UUID.h"
|
#include "common-hal/_bleio/UUID.h"
|
||||||
|
|
||||||
typedef struct {
|
// Forward declare characteristic because it includes a Descriptor.
|
||||||
|
struct _bleio_characteristic_obj;
|
||||||
|
|
||||||
|
typedef struct _bleio_descriptor_obj {
|
||||||
mp_obj_base_t base;
|
mp_obj_base_t base;
|
||||||
// Will be MP_OBJ_NULL before being assigned to a Characteristic.
|
// Will be MP_OBJ_NULL before being assigned to a Characteristic.
|
||||||
bleio_characteristic_obj_t *characteristic;
|
struct _bleio_characteristic_obj *characteristic;
|
||||||
bleio_uuid_obj_t *uuid;
|
bleio_uuid_obj_t *uuid;
|
||||||
mp_obj_t value;
|
mp_obj_t value;
|
||||||
uint16_t max_length;
|
uint16_t max_length;
|
||||||
|
@ -45,6 +47,7 @@ typedef struct {
|
||||||
uint16_t handle;
|
uint16_t handle;
|
||||||
bleio_attribute_security_mode_t read_perm;
|
bleio_attribute_security_mode_t read_perm;
|
||||||
bleio_attribute_security_mode_t write_perm;
|
bleio_attribute_security_mode_t write_perm;
|
||||||
|
struct _bleio_descriptor_obj* next;
|
||||||
} bleio_descriptor_obj_t;
|
} bleio_descriptor_obj_t;
|
||||||
|
|
||||||
#endif // MICROPY_INCLUDED_NRF_COMMON_HAL_BLEIO_DESCRIPTOR_H
|
#endif // MICROPY_INCLUDED_NRF_COMMON_HAL_BLEIO_DESCRIPTOR_H
|
||||||
|
|
|
@ -1,361 +0,0 @@
|
||||||
/*
|
|
||||||
* This file is part of the MicroPython project, http://micropython.org/
|
|
||||||
*
|
|
||||||
* The MIT License (MIT)
|
|
||||||
*
|
|
||||||
* Copyright (c) 2018 Dan Halbert for Adafruit Industries
|
|
||||||
* Copyright (c) 2018 Artur Pacholec
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#include "ble.h"
|
|
||||||
#include "ble_drv.h"
|
|
||||||
#include "ble_hci.h"
|
|
||||||
#include "nrf_soc.h"
|
|
||||||
#include "py/gc.h"
|
|
||||||
#include "py/objlist.h"
|
|
||||||
#include "py/objstr.h"
|
|
||||||
#include "py/runtime.h"
|
|
||||||
#include "shared-bindings/_bleio/__init__.h"
|
|
||||||
#include "shared-bindings/_bleio/Adapter.h"
|
|
||||||
#include "shared-bindings/_bleio/Attribute.h"
|
|
||||||
#include "shared-bindings/_bleio/Characteristic.h"
|
|
||||||
#include "shared-bindings/_bleio/Peripheral.h"
|
|
||||||
#include "shared-bindings/_bleio/Service.h"
|
|
||||||
#include "shared-bindings/_bleio/UUID.h"
|
|
||||||
|
|
||||||
#define BLE_ADV_LENGTH_FIELD_SIZE 1
|
|
||||||
#define BLE_ADV_AD_TYPE_FIELD_SIZE 1
|
|
||||||
#define BLE_AD_TYPE_FLAGS_DATA_SIZE 1
|
|
||||||
|
|
||||||
static const ble_gap_sec_params_t pairing_sec_params = {
|
|
||||||
.bond = 1,
|
|
||||||
.mitm = 0,
|
|
||||||
.lesc = 0,
|
|
||||||
.keypress = 0,
|
|
||||||
.oob = 0,
|
|
||||||
.io_caps = BLE_GAP_IO_CAPS_NONE,
|
|
||||||
.min_key_size = 7,
|
|
||||||
.max_key_size = 16,
|
|
||||||
.kdist_own = { .enc = 1, .id = 1},
|
|
||||||
.kdist_peer = { .enc = 1, .id = 1},
|
|
||||||
};
|
|
||||||
|
|
||||||
STATIC void check_data_fit(size_t data_len) {
|
|
||||||
if (data_len > BLE_GAP_ADV_SET_DATA_SIZE_MAX) {
|
|
||||||
mp_raise_ValueError(translate("Data too large for advertisement packet"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
STATIC void peripheral_on_ble_evt(ble_evt_t *ble_evt, void *self_in) {
|
|
||||||
bleio_peripheral_obj_t *self = (bleio_peripheral_obj_t*)self_in;
|
|
||||||
|
|
||||||
// For debugging.
|
|
||||||
// mp_printf(&mp_plat_print, "Peripheral event: 0x%04x\n", ble_evt->header.evt_id);
|
|
||||||
|
|
||||||
switch (ble_evt->header.evt_id) {
|
|
||||||
case BLE_GAP_EVT_CONNECTED: {
|
|
||||||
// Central has connected.
|
|
||||||
ble_gap_evt_connected_t* connected = &ble_evt->evt.gap_evt.params.connected;
|
|
||||||
|
|
||||||
self->conn_handle = ble_evt->evt.gap_evt.conn_handle;
|
|
||||||
|
|
||||||
// See if connection interval set by Central is out of range.
|
|
||||||
// If so, negotiate our preferred range.
|
|
||||||
ble_gap_conn_params_t conn_params;
|
|
||||||
sd_ble_gap_ppcp_get(&conn_params);
|
|
||||||
if (conn_params.min_conn_interval < connected->conn_params.min_conn_interval ||
|
|
||||||
conn_params.min_conn_interval > connected->conn_params.max_conn_interval) {
|
|
||||||
sd_ble_gap_conn_param_update(ble_evt->evt.gap_evt.conn_handle, &conn_params);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case BLE_GAP_EVT_DISCONNECTED:
|
|
||||||
// Central has disconnected.
|
|
||||||
self->conn_handle = BLE_CONN_HANDLE_INVALID;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case BLE_GAP_EVT_PHY_UPDATE_REQUEST: {
|
|
||||||
ble_gap_phys_t const phys = {
|
|
||||||
.rx_phys = BLE_GAP_PHY_AUTO,
|
|
||||||
.tx_phys = BLE_GAP_PHY_AUTO,
|
|
||||||
};
|
|
||||||
sd_ble_gap_phy_update(ble_evt->evt.gap_evt.conn_handle, &phys);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case BLE_GAP_EVT_ADV_SET_TERMINATED:
|
|
||||||
// TODO: Someday may handle timeouts or limit reached.
|
|
||||||
break;
|
|
||||||
|
|
||||||
case BLE_GAP_EVT_DATA_LENGTH_UPDATE_REQUEST:
|
|
||||||
// SoftDevice will respond to a length update request.
|
|
||||||
sd_ble_gap_data_length_update(self->conn_handle, NULL, NULL);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST: {
|
|
||||||
// We only handle MTU of size BLE_GATT_ATT_MTU_DEFAULT.
|
|
||||||
sd_ble_gatts_exchange_mtu_reply(self->conn_handle, BLE_GATT_ATT_MTU_DEFAULT);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case BLE_GATTS_EVT_SYS_ATTR_MISSING:
|
|
||||||
sd_ble_gatts_sys_attr_set(self->conn_handle, NULL, 0, 0);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case BLE_GAP_EVT_SEC_PARAMS_REQUEST: {
|
|
||||||
ble_gap_sec_keyset_t keyset = {
|
|
||||||
.keys_own = {
|
|
||||||
.p_enc_key = &self->bonding_keys.own_enc,
|
|
||||||
.p_id_key = NULL,
|
|
||||||
.p_sign_key = NULL,
|
|
||||||
.p_pk = NULL
|
|
||||||
},
|
|
||||||
|
|
||||||
.keys_peer = {
|
|
||||||
.p_enc_key = &self->bonding_keys.peer_enc,
|
|
||||||
.p_id_key = &self->bonding_keys.peer_id,
|
|
||||||
.p_sign_key = NULL,
|
|
||||||
.p_pk = NULL
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
sd_ble_gap_sec_params_reply(self->conn_handle, BLE_GAP_SEC_STATUS_SUCCESS,
|
|
||||||
&pairing_sec_params, &keyset);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case BLE_GAP_EVT_LESC_DHKEY_REQUEST:
|
|
||||||
// TODO for LESC pairing:
|
|
||||||
// sd_ble_gap_lesc_dhkey_reply(...);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case BLE_GAP_EVT_AUTH_STATUS: {
|
|
||||||
// Pairing process completed
|
|
||||||
ble_gap_evt_auth_status_t* status = &ble_evt->evt.gap_evt.params.auth_status;
|
|
||||||
if (BLE_GAP_SEC_STATUS_SUCCESS == status->auth_status) {
|
|
||||||
// TODO _ediv = bonding_keys->own_enc.master_id.ediv;
|
|
||||||
self->pair_status = PAIR_PAIRED;
|
|
||||||
} else {
|
|
||||||
self->pair_status = PAIR_NOT_PAIRED;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case BLE_GAP_EVT_SEC_INFO_REQUEST: {
|
|
||||||
// Peer asks for the stored keys.
|
|
||||||
// - load key and return if bonded previously.
|
|
||||||
// - Else return NULL --> Initiate key exchange
|
|
||||||
ble_gap_evt_sec_info_request_t* sec_info_request = &ble_evt->evt.gap_evt.params.sec_info_request;
|
|
||||||
(void) sec_info_request;
|
|
||||||
//if ( bond_load_keys(_role, sec_req->master_id.ediv, &bkeys) ) {
|
|
||||||
//sd_ble_gap_sec_info_reply(_conn_hdl, &bkeys.own_enc.enc_info, &bkeys.peer_id.id_info, NULL);
|
|
||||||
//
|
|
||||||
//_ediv = bkeys.own_enc.master_id.ediv;
|
|
||||||
// } else {
|
|
||||||
sd_ble_gap_sec_info_reply(self->conn_handle, NULL, NULL, NULL);
|
|
||||||
// }
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case BLE_GAP_EVT_CONN_SEC_UPDATE: {
|
|
||||||
ble_gap_conn_sec_t* conn_sec = &ble_evt->evt.gap_evt.params.conn_sec_update.conn_sec;
|
|
||||||
if (conn_sec->sec_mode.sm <= 1 && conn_sec->sec_mode.lv <= 1) {
|
|
||||||
// Security setup did not succeed:
|
|
||||||
// mode 0, level 0 means no access
|
|
||||||
// mode 1, level 1 means open link
|
|
||||||
// mode >=1 and/or level >=1 means encryption is set up
|
|
||||||
self->pair_status = PAIR_NOT_PAIRED;
|
|
||||||
} else {
|
|
||||||
//if ( !bond_load_cccd(_role, _conn_hdl, _ediv) ) {
|
|
||||||
if (true) { // TODO: no bonding yet
|
|
||||||
// Initialize system attributes fresh.
|
|
||||||
sd_ble_gatts_sys_attr_set(self->conn_handle, NULL, 0, 0);
|
|
||||||
}
|
|
||||||
// Not quite paired yet: wait for BLE_GAP_EVT_AUTH_STATUS SUCCESS.
|
|
||||||
self->ediv = self->bonding_keys.own_enc.master_id.ediv;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
default:
|
|
||||||
// For debugging.
|
|
||||||
// mp_printf(&mp_plat_print, "Unhandled peripheral event: 0x%04x\n", ble_evt->header.evt_id);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void common_hal_bleio_peripheral_construct(bleio_peripheral_obj_t *self, mp_obj_t name) {
|
|
||||||
common_hal_bleio_adapter_set_enabled(true);
|
|
||||||
|
|
||||||
self->service_list = mp_obj_new_list(0, NULL);
|
|
||||||
// Used only for discovery when acting as a client.
|
|
||||||
self->remote_service_list = mp_obj_new_list(0, NULL);
|
|
||||||
self->name = name;
|
|
||||||
|
|
||||||
self->conn_handle = BLE_CONN_HANDLE_INVALID;
|
|
||||||
self->adv_handle = BLE_GAP_ADV_SET_HANDLE_NOT_SET;
|
|
||||||
self->pair_status = PAIR_NOT_PAIRED;
|
|
||||||
|
|
||||||
memset(&self->bonding_keys, 0, sizeof(self->bonding_keys));
|
|
||||||
}
|
|
||||||
|
|
||||||
void common_hal_bleio_peripheral_add_service(bleio_peripheral_obj_t *self, bleio_service_obj_t *service) {
|
|
||||||
ble_uuid_t uuid;
|
|
||||||
bleio_uuid_convert_to_nrf_ble_uuid(service->uuid, &uuid);
|
|
||||||
|
|
||||||
uint8_t service_type = BLE_GATTS_SRVC_TYPE_PRIMARY;
|
|
||||||
if (common_hal_bleio_service_get_is_secondary(service)) {
|
|
||||||
service_type = BLE_GATTS_SRVC_TYPE_SECONDARY;
|
|
||||||
}
|
|
||||||
|
|
||||||
const uint32_t err_code = sd_ble_gatts_service_add(service_type, &uuid, &service->handle);
|
|
||||||
if (err_code != NRF_SUCCESS) {
|
|
||||||
mp_raise_OSError_msg_varg(translate("Failed to add service, err 0x%04x"), err_code);
|
|
||||||
}
|
|
||||||
|
|
||||||
mp_obj_list_append(self->service_list, MP_OBJ_FROM_PTR(service));
|
|
||||||
}
|
|
||||||
|
|
||||||
mp_obj_list_t *common_hal_bleio_peripheral_get_services(bleio_peripheral_obj_t *self) {
|
|
||||||
return self->service_list;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool common_hal_bleio_peripheral_get_connected(bleio_peripheral_obj_t *self) {
|
|
||||||
return self->conn_handle != BLE_CONN_HANDLE_INVALID;
|
|
||||||
}
|
|
||||||
|
|
||||||
mp_obj_t common_hal_bleio_peripheral_get_name(bleio_peripheral_obj_t *self) {
|
|
||||||
return self->name;
|
|
||||||
}
|
|
||||||
|
|
||||||
void common_hal_bleio_peripheral_start_advertising(bleio_peripheral_obj_t *self, bool connectable, mp_float_t interval, mp_buffer_info_t *advertising_data_bufinfo, mp_buffer_info_t *scan_response_data_bufinfo) {
|
|
||||||
|
|
||||||
// interval value has already been validated.
|
|
||||||
|
|
||||||
if (connectable) {
|
|
||||||
ble_drv_add_event_handler(peripheral_on_ble_evt, self);
|
|
||||||
}
|
|
||||||
|
|
||||||
common_hal_bleio_adapter_set_enabled(true);
|
|
||||||
|
|
||||||
uint32_t err_code;
|
|
||||||
|
|
||||||
GET_STR_DATA_LEN(self->name, name_data, name_len);
|
|
||||||
if (name_len > 0) {
|
|
||||||
// Set device name, and make it available to anyone.
|
|
||||||
ble_gap_conn_sec_mode_t sec_mode;
|
|
||||||
BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode);
|
|
||||||
err_code = sd_ble_gap_device_name_set(&sec_mode, name_data, name_len);
|
|
||||||
if (err_code != NRF_SUCCESS) {
|
|
||||||
mp_raise_OSError_msg_varg(translate("Failed to set device name, err 0x%04x"), err_code);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
check_data_fit(advertising_data_bufinfo->len);
|
|
||||||
// The advertising data buffers must not move, because the SoftDevice depends on them.
|
|
||||||
// So make them long-lived.
|
|
||||||
self->advertising_data = (uint8_t *) gc_alloc(BLE_GAP_ADV_SET_DATA_SIZE_MAX * sizeof(uint8_t), false, true);
|
|
||||||
memcpy(self->advertising_data, advertising_data_bufinfo->buf, advertising_data_bufinfo->len);
|
|
||||||
|
|
||||||
check_data_fit(scan_response_data_bufinfo->len);
|
|
||||||
self->scan_response_data = (uint8_t *) gc_alloc(BLE_GAP_ADV_SET_DATA_SIZE_MAX * sizeof(uint8_t), false, true);
|
|
||||||
memcpy(self->scan_response_data, scan_response_data_bufinfo->buf, scan_response_data_bufinfo->len);
|
|
||||||
|
|
||||||
|
|
||||||
ble_gap_adv_params_t adv_params = {
|
|
||||||
.interval = SEC_TO_UNITS(interval, UNIT_0_625_MS),
|
|
||||||
.properties.type = connectable ? BLE_GAP_ADV_TYPE_CONNECTABLE_SCANNABLE_UNDIRECTED
|
|
||||||
: BLE_GAP_ADV_TYPE_NONCONNECTABLE_NONSCANNABLE_UNDIRECTED,
|
|
||||||
.duration = BLE_GAP_ADV_TIMEOUT_GENERAL_UNLIMITED,
|
|
||||||
.filter_policy = BLE_GAP_ADV_FP_ANY,
|
|
||||||
.primary_phy = BLE_GAP_PHY_1MBPS,
|
|
||||||
};
|
|
||||||
|
|
||||||
common_hal_bleio_peripheral_stop_advertising(self);
|
|
||||||
|
|
||||||
const ble_gap_adv_data_t ble_gap_adv_data = {
|
|
||||||
.adv_data.p_data = self->advertising_data,
|
|
||||||
.adv_data.len = advertising_data_bufinfo->len,
|
|
||||||
.scan_rsp_data.p_data = scan_response_data_bufinfo-> len > 0 ? self->scan_response_data : NULL,
|
|
||||||
.scan_rsp_data.len = scan_response_data_bufinfo->len,
|
|
||||||
};
|
|
||||||
|
|
||||||
err_code = sd_ble_gap_adv_set_configure(&self->adv_handle, &ble_gap_adv_data, &adv_params);
|
|
||||||
if (err_code != NRF_SUCCESS) {
|
|
||||||
mp_raise_OSError_msg_varg(translate("Failed to configure advertising, err 0x%04x"), err_code);
|
|
||||||
}
|
|
||||||
|
|
||||||
err_code = sd_ble_gap_adv_start(self->adv_handle, BLE_CONN_CFG_TAG_CUSTOM);
|
|
||||||
|
|
||||||
if (err_code != NRF_SUCCESS) {
|
|
||||||
mp_raise_OSError_msg_varg(translate("Failed to start advertising, err 0x%04x"), err_code);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void common_hal_bleio_peripheral_stop_advertising(bleio_peripheral_obj_t *self) {
|
|
||||||
if (self->adv_handle == BLE_GAP_ADV_SET_HANDLE_NOT_SET)
|
|
||||||
return;
|
|
||||||
|
|
||||||
const uint32_t err_code = sd_ble_gap_adv_stop(self->adv_handle);
|
|
||||||
|
|
||||||
if ((err_code != NRF_SUCCESS) && (err_code != NRF_ERROR_INVALID_STATE)) {
|
|
||||||
mp_raise_OSError_msg_varg(translate("Failed to stop advertising, err 0x%04x"), err_code);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void common_hal_bleio_peripheral_disconnect(bleio_peripheral_obj_t *self) {
|
|
||||||
sd_ble_gap_disconnect(self->conn_handle, BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
|
|
||||||
}
|
|
||||||
|
|
||||||
mp_obj_tuple_t *common_hal_bleio_peripheral_discover_remote_services(bleio_peripheral_obj_t *self, mp_obj_t service_uuids_whitelist) {
|
|
||||||
common_hal_bleio_device_discover_remote_services(MP_OBJ_FROM_PTR(self), service_uuids_whitelist);
|
|
||||||
// Convert to a tuple and then clear the list so the callee will take ownership.
|
|
||||||
mp_obj_tuple_t *services_tuple = mp_obj_new_tuple(self->remote_service_list->len,
|
|
||||||
self->remote_service_list->items);
|
|
||||||
mp_obj_list_clear(self->remote_service_list);
|
|
||||||
return services_tuple;
|
|
||||||
}
|
|
||||||
|
|
||||||
void common_hal_bleio_peripheral_pair(bleio_peripheral_obj_t *self) {
|
|
||||||
self->pair_status = PAIR_WAITING;
|
|
||||||
|
|
||||||
uint32_t err_code = sd_ble_gap_authenticate(self->conn_handle, &pairing_sec_params);
|
|
||||||
|
|
||||||
if (err_code != NRF_SUCCESS) {
|
|
||||||
mp_raise_OSError_msg_varg(translate("Failed to start pairing, error 0x%04x"), err_code);
|
|
||||||
}
|
|
||||||
|
|
||||||
while (self->pair_status == PAIR_WAITING) {
|
|
||||||
RUN_BACKGROUND_TASKS;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (self->pair_status == PAIR_NOT_PAIRED) {
|
|
||||||
mp_raise_OSError_msg(translate("Failed to pair"));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,105 +0,0 @@
|
||||||
/*
|
|
||||||
* This file is part of the MicroPython project, http://micropython.org/
|
|
||||||
*
|
|
||||||
* The MIT License (MIT)
|
|
||||||
*
|
|
||||||
* Copyright (c) 2019 Dan Halbert for Adafruit Industries
|
|
||||||
* Copyright (c) 2018 Artur Pacholec
|
|
||||||
* Copyright (c) 2016 Glenn Ruben Bakke
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "ble_drv.h"
|
|
||||||
#include "ble_gap.h"
|
|
||||||
#include "py/mphal.h"
|
|
||||||
#include "py/objlist.h"
|
|
||||||
#include "py/runtime.h"
|
|
||||||
#include "shared-bindings/_bleio/Adapter.h"
|
|
||||||
#include "shared-bindings/_bleio/ScanEntry.h"
|
|
||||||
#include "shared-bindings/_bleio/Scanner.h"
|
|
||||||
#include "shared-module/_bleio/ScanEntry.h"
|
|
||||||
|
|
||||||
static uint8_t m_scan_buffer_data[BLE_GAP_SCAN_BUFFER_MIN];
|
|
||||||
|
|
||||||
static ble_data_t m_scan_buffer = {
|
|
||||||
m_scan_buffer_data,
|
|
||||||
BLE_GAP_SCAN_BUFFER_MIN
|
|
||||||
};
|
|
||||||
|
|
||||||
STATIC void scanner_on_ble_evt(ble_evt_t *ble_evt, void *scanner_in) {
|
|
||||||
bleio_scanner_obj_t *scanner = (bleio_scanner_obj_t*)scanner_in;
|
|
||||||
ble_gap_evt_adv_report_t *report = &ble_evt->evt.gap_evt.params.adv_report;
|
|
||||||
|
|
||||||
if (ble_evt->header.evt_id != BLE_GAP_EVT_ADV_REPORT) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
bleio_scanentry_obj_t *entry = m_new_obj(bleio_scanentry_obj_t);
|
|
||||||
entry->base.type = &bleio_scanentry_type;
|
|
||||||
entry->rssi = report->rssi;
|
|
||||||
|
|
||||||
bleio_address_obj_t *address = m_new_obj(bleio_address_obj_t);
|
|
||||||
address->base.type = &bleio_address_type;
|
|
||||||
common_hal_bleio_address_construct(MP_OBJ_TO_PTR(address),
|
|
||||||
report->peer_addr.addr, report->peer_addr.addr_type);
|
|
||||||
entry->address = address;
|
|
||||||
|
|
||||||
entry->data = mp_obj_new_bytes(report->data.p_data, report->data.len);
|
|
||||||
|
|
||||||
mp_obj_list_append(scanner->scan_entries, MP_OBJ_FROM_PTR(entry));
|
|
||||||
|
|
||||||
const uint32_t err_code = sd_ble_gap_scan_start(NULL, &m_scan_buffer);
|
|
||||||
if (err_code != NRF_SUCCESS) {
|
|
||||||
mp_raise_OSError_msg_varg(translate("Failed to continue scanning, err 0x%04x"), err_code);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void common_hal_bleio_scanner_construct(bleio_scanner_obj_t *self) {
|
|
||||||
}
|
|
||||||
|
|
||||||
mp_obj_t common_hal_bleio_scanner_scan(bleio_scanner_obj_t *self, mp_float_t timeout, mp_float_t interval, mp_float_t window) {
|
|
||||||
common_hal_bleio_adapter_set_enabled(true);
|
|
||||||
ble_drv_add_event_handler(scanner_on_ble_evt, self);
|
|
||||||
|
|
||||||
ble_gap_scan_params_t scan_params = {
|
|
||||||
.interval = SEC_TO_UNITS(interval, UNIT_0_625_MS),
|
|
||||||
.window = SEC_TO_UNITS(window, UNIT_0_625_MS),
|
|
||||||
.scan_phys = BLE_GAP_PHY_1MBPS,
|
|
||||||
};
|
|
||||||
|
|
||||||
self->scan_entries = mp_obj_new_list(0, NULL);
|
|
||||||
|
|
||||||
uint32_t err_code;
|
|
||||||
err_code = sd_ble_gap_scan_start(&scan_params, &m_scan_buffer);
|
|
||||||
|
|
||||||
if (err_code != NRF_SUCCESS) {
|
|
||||||
mp_raise_OSError_msg_varg(translate("Failed to start scanning, err 0x%04x"), err_code);
|
|
||||||
}
|
|
||||||
|
|
||||||
mp_hal_delay_ms(timeout * 1000);
|
|
||||||
sd_ble_gap_scan_stop();
|
|
||||||
|
|
||||||
// Return list, and don't hang on to it, so it can be GC'd.
|
|
||||||
mp_obj_t entries = self->scan_entries;
|
|
||||||
self->scan_entries = MP_OBJ_NULL;
|
|
||||||
return entries;
|
|
||||||
}
|
|
|
@ -31,17 +31,44 @@
|
||||||
#include "common-hal/_bleio/__init__.h"
|
#include "common-hal/_bleio/__init__.h"
|
||||||
#include "shared-bindings/_bleio/Characteristic.h"
|
#include "shared-bindings/_bleio/Characteristic.h"
|
||||||
#include "shared-bindings/_bleio/Descriptor.h"
|
#include "shared-bindings/_bleio/Descriptor.h"
|
||||||
#include "shared-bindings/_bleio/Peripheral.h"
|
|
||||||
#include "shared-bindings/_bleio/Service.h"
|
#include "shared-bindings/_bleio/Service.h"
|
||||||
#include "shared-bindings/_bleio/Adapter.h"
|
#include "shared-bindings/_bleio/Adapter.h"
|
||||||
|
|
||||||
void common_hal_bleio_service_construct(bleio_service_obj_t *self, bleio_peripheral_obj_t *peripheral, bleio_uuid_obj_t *uuid, bool is_secondary) {
|
uint32_t _common_hal_bleio_service_construct(bleio_service_obj_t *self, bleio_uuid_obj_t *uuid, bool is_secondary, mp_obj_list_t * characteristic_list) {
|
||||||
self->device = MP_OBJ_FROM_PTR(peripheral);
|
|
||||||
self->handle = 0xFFFF;
|
self->handle = 0xFFFF;
|
||||||
self->uuid = uuid;
|
self->uuid = uuid;
|
||||||
self->characteristic_list = mp_obj_new_list(0, NULL);
|
self->characteristic_list = characteristic_list;
|
||||||
self->is_remote = false;
|
self->is_remote = false;
|
||||||
|
self->connection = NULL;
|
||||||
self->is_secondary = is_secondary;
|
self->is_secondary = is_secondary;
|
||||||
|
|
||||||
|
ble_uuid_t nordic_uuid;
|
||||||
|
bleio_uuid_convert_to_nrf_ble_uuid(uuid, &nordic_uuid);
|
||||||
|
|
||||||
|
uint8_t service_type = BLE_GATTS_SRVC_TYPE_PRIMARY;
|
||||||
|
if (is_secondary) {
|
||||||
|
service_type = BLE_GATTS_SRVC_TYPE_SECONDARY;
|
||||||
|
}
|
||||||
|
|
||||||
|
vm_used_ble = true;
|
||||||
|
|
||||||
|
return sd_ble_gatts_service_add(service_type, &nordic_uuid, &self->handle);
|
||||||
|
}
|
||||||
|
|
||||||
|
void common_hal_bleio_service_construct(bleio_service_obj_t *self, bleio_uuid_obj_t *uuid, bool is_secondary) {
|
||||||
|
const uint32_t err_code = _common_hal_bleio_service_construct(self, uuid, is_secondary, mp_obj_new_list(0, NULL));
|
||||||
|
if (err_code != NRF_SUCCESS) {
|
||||||
|
mp_raise_OSError_msg_varg(translate("Failed to create service, NRF_ERROR_%q"), MP_OBJ_QSTR_VALUE(base_error_messages[err_code - NRF_ERROR_BASE_NUM]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void bleio_service_from_connection(bleio_service_obj_t *self, mp_obj_t connection) {
|
||||||
|
self->handle = 0xFFFF;
|
||||||
|
self->uuid = NULL;
|
||||||
|
self->characteristic_list = mp_obj_new_list(0, NULL);
|
||||||
|
self->is_remote = true;
|
||||||
|
self->is_secondary = false;
|
||||||
|
self->connection = connection;
|
||||||
}
|
}
|
||||||
|
|
||||||
bleio_uuid_obj_t *common_hal_bleio_service_get_uuid(bleio_service_obj_t *self) {
|
bleio_uuid_obj_t *common_hal_bleio_service_get_uuid(bleio_service_obj_t *self) {
|
||||||
|
@ -60,7 +87,9 @@ bool common_hal_bleio_service_get_is_secondary(bleio_service_obj_t *self) {
|
||||||
return self->is_secondary;
|
return self->is_secondary;
|
||||||
}
|
}
|
||||||
|
|
||||||
void common_hal_bleio_service_add_characteristic(bleio_service_obj_t *self, bleio_characteristic_obj_t *characteristic) {
|
void common_hal_bleio_service_add_characteristic(bleio_service_obj_t *self,
|
||||||
|
bleio_characteristic_obj_t *characteristic,
|
||||||
|
mp_buffer_info_t *initial_value_bufinfo) {
|
||||||
ble_gatts_char_md_t char_md = {
|
ble_gatts_char_md_t char_md = {
|
||||||
.char_props.broadcast = (characteristic->props & CHAR_PROP_BROADCAST) ? 1 : 0,
|
.char_props.broadcast = (characteristic->props & CHAR_PROP_BROADCAST) ? 1 : 0,
|
||||||
.char_props.read = (characteristic->props & CHAR_PROP_READ) ? 1 : 0,
|
.char_props.read = (characteristic->props & CHAR_PROP_READ) ? 1 : 0,
|
||||||
|
@ -93,14 +122,11 @@ void common_hal_bleio_service_add_characteristic(bleio_service_obj_t *self, blei
|
||||||
bleio_attribute_gatts_set_security_mode(&char_attr_md.read_perm, characteristic->read_perm);
|
bleio_attribute_gatts_set_security_mode(&char_attr_md.read_perm, characteristic->read_perm);
|
||||||
bleio_attribute_gatts_set_security_mode(&char_attr_md.write_perm, characteristic->write_perm);
|
bleio_attribute_gatts_set_security_mode(&char_attr_md.write_perm, characteristic->write_perm);
|
||||||
|
|
||||||
mp_buffer_info_t char_value_bufinfo;
|
|
||||||
mp_get_buffer_raise(characteristic->value, &char_value_bufinfo, MP_BUFFER_READ);
|
|
||||||
|
|
||||||
ble_gatts_attr_t char_attr = {
|
ble_gatts_attr_t char_attr = {
|
||||||
.p_uuid = &char_uuid,
|
.p_uuid = &char_uuid,
|
||||||
.p_attr_md = &char_attr_md,
|
.p_attr_md = &char_attr_md,
|
||||||
.init_len = char_value_bufinfo.len,
|
.init_len = 0,
|
||||||
.p_value = char_value_bufinfo.buf,
|
.p_value = NULL,
|
||||||
.init_offs = 0,
|
.init_offs = 0,
|
||||||
.max_len = characteristic->max_length,
|
.max_len = characteristic->max_length,
|
||||||
};
|
};
|
||||||
|
@ -110,7 +136,7 @@ void common_hal_bleio_service_add_characteristic(bleio_service_obj_t *self, blei
|
||||||
uint32_t err_code;
|
uint32_t err_code;
|
||||||
err_code = sd_ble_gatts_characteristic_add(self->handle, &char_md, &char_attr, &char_handles);
|
err_code = sd_ble_gatts_characteristic_add(self->handle, &char_md, &char_attr, &char_handles);
|
||||||
if (err_code != NRF_SUCCESS) {
|
if (err_code != NRF_SUCCESS) {
|
||||||
mp_raise_OSError_msg_varg(translate("Failed to add characteristic, err 0x%04x"), err_code);
|
mp_raise_OSError_msg_varg(translate("Failed to add characteristic, NRF_ERROR_%q"), MP_OBJ_QSTR_VALUE(base_error_messages[err_code - NRF_ERROR_BASE_NUM]));
|
||||||
}
|
}
|
||||||
|
|
||||||
characteristic->user_desc_handle = char_handles.user_desc_handle;
|
characteristic->user_desc_handle = char_handles.user_desc_handle;
|
||||||
|
|
|
@ -31,20 +31,22 @@
|
||||||
#include "py/objlist.h"
|
#include "py/objlist.h"
|
||||||
#include "common-hal/_bleio/UUID.h"
|
#include "common-hal/_bleio/UUID.h"
|
||||||
|
|
||||||
typedef struct {
|
typedef struct bleio_service_obj {
|
||||||
mp_obj_base_t base;
|
mp_obj_base_t base;
|
||||||
// Handle for this service.
|
// Handle for the local service.
|
||||||
uint16_t handle;
|
uint16_t handle;
|
||||||
// True if created during discovery.
|
// True if created during discovery.
|
||||||
bool is_remote;
|
bool is_remote;
|
||||||
bool is_secondary;
|
bool is_secondary;
|
||||||
bleio_uuid_obj_t *uuid;
|
bleio_uuid_obj_t *uuid;
|
||||||
// May be a Peripheral, Central, etc.
|
mp_obj_t connection;
|
||||||
mp_obj_t device;
|
|
||||||
mp_obj_list_t *characteristic_list;
|
mp_obj_list_t *characteristic_list;
|
||||||
// Range of attribute handles of this service.
|
// Range of attribute handles of this remote service.
|
||||||
uint16_t start_handle;
|
uint16_t start_handle;
|
||||||
uint16_t end_handle;
|
uint16_t end_handle;
|
||||||
|
struct bleio_service_obj* next;
|
||||||
} bleio_service_obj_t;
|
} bleio_service_obj_t;
|
||||||
|
|
||||||
|
void bleio_service_from_connection(bleio_service_obj_t *self, mp_obj_t connection);
|
||||||
|
|
||||||
#endif // MICROPY_INCLUDED_NRF_COMMON_HAL_BLEIO_SERVICE_H
|
#endif // MICROPY_INCLUDED_NRF_COMMON_HAL_BLEIO_SERVICE_H
|
||||||
|
|
|
@ -30,6 +30,7 @@
|
||||||
|
|
||||||
#include "py/runtime.h"
|
#include "py/runtime.h"
|
||||||
#include "common-hal/_bleio/UUID.h"
|
#include "common-hal/_bleio/UUID.h"
|
||||||
|
#include "shared-bindings/_bleio/__init__.h"
|
||||||
#include "shared-bindings/_bleio/Adapter.h"
|
#include "shared-bindings/_bleio/Adapter.h"
|
||||||
|
|
||||||
#include "ble.h"
|
#include "ble.h"
|
||||||
|
@ -39,9 +40,7 @@
|
||||||
// If uuid128 is NULL, this is a Bluetooth SIG 16-bit UUID.
|
// If uuid128 is NULL, this is a Bluetooth SIG 16-bit UUID.
|
||||||
// If uuid128 is not NULL, it's a 128-bit (16-byte) UUID, with bytes 12 and 13 zero'd out, where
|
// If uuid128 is not NULL, it's a 128-bit (16-byte) UUID, with bytes 12 and 13 zero'd out, where
|
||||||
// the 16-bit part goes. Those 16 bits are passed in uuid16.
|
// the 16-bit part goes. Those 16 bits are passed in uuid16.
|
||||||
void common_hal_bleio_uuid_construct(bleio_uuid_obj_t *self, uint32_t uuid16, uint8_t uuid128[]) {
|
void common_hal_bleio_uuid_construct(bleio_uuid_obj_t *self, uint32_t uuid16, const uint8_t uuid128[]) {
|
||||||
common_hal_bleio_adapter_set_enabled(true);
|
|
||||||
|
|
||||||
self->nrf_ble_uuid.uuid = uuid16;
|
self->nrf_ble_uuid.uuid = uuid16;
|
||||||
if (uuid128 == NULL) {
|
if (uuid128 == NULL) {
|
||||||
self->nrf_ble_uuid.type = BLE_UUID_TYPE_BLE;
|
self->nrf_ble_uuid.type = BLE_UUID_TYPE_BLE;
|
||||||
|
@ -54,6 +53,7 @@ void common_hal_bleio_uuid_construct(bleio_uuid_obj_t *self, uint32_t uuid16, ui
|
||||||
if (err_code != NRF_SUCCESS) {
|
if (err_code != NRF_SUCCESS) {
|
||||||
mp_raise_OSError_msg_varg(translate("Failed to register Vendor-Specific UUID, err 0x%04x"), err_code);
|
mp_raise_OSError_msg_varg(translate("Failed to register Vendor-Specific UUID, err 0x%04x"), err_code);
|
||||||
}
|
}
|
||||||
|
vm_used_ble = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -65,25 +65,24 @@ uint32_t common_hal_bleio_uuid_get_uuid16(bleio_uuid_obj_t *self) {
|
||||||
return self->nrf_ble_uuid.uuid;
|
return self->nrf_ble_uuid.uuid;
|
||||||
}
|
}
|
||||||
|
|
||||||
// True if uuid128 has been successfully filled in.
|
void common_hal_bleio_uuid_get_uuid128(bleio_uuid_obj_t *self, uint8_t uuid128[16]) {
|
||||||
bool common_hal_bleio_uuid_get_uuid128(bleio_uuid_obj_t *self, uint8_t uuid128[16]) {
|
|
||||||
uint8_t length;
|
uint8_t length;
|
||||||
const uint32_t err_code = sd_ble_uuid_encode(&self->nrf_ble_uuid, &length, uuid128);
|
const uint32_t err_code = sd_ble_uuid_encode(&self->nrf_ble_uuid, &length, uuid128);
|
||||||
|
|
||||||
if (err_code != NRF_SUCCESS) {
|
if (err_code != NRF_SUCCESS) {
|
||||||
mp_raise_OSError_msg_varg(translate("Could not decode ble_uuid, err 0x%04x"), err_code);
|
mp_raise_OSError_msg_varg(translate("Could not decode ble_uuid, err 0x%04x"), err_code);
|
||||||
}
|
}
|
||||||
// If not 16 bytes, this is not a 128-bit UUID, so return.
|
|
||||||
return length == 16;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns 0 if this is a 16-bit UUID, otherwise returns a non-zero index
|
void common_hal_bleio_uuid_pack_into(bleio_uuid_obj_t *self, uint8_t* buf) {
|
||||||
// into the 128-bit uuid registration table.
|
if (self->nrf_ble_uuid.type == BLE_UUID_TYPE_BLE) {
|
||||||
uint32_t common_hal_bleio_uuid_get_uuid128_reference(bleio_uuid_obj_t *self) {
|
buf[0] = self->nrf_ble_uuid.uuid & 0xff;
|
||||||
return self->nrf_ble_uuid.type == BLE_UUID_TYPE_BLE ? 0 : self->nrf_ble_uuid.type;
|
buf[1] = self->nrf_ble_uuid.uuid >> 8;
|
||||||
|
} else {
|
||||||
|
common_hal_bleio_uuid_get_uuid128(self, buf);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void bleio_uuid_construct_from_nrf_ble_uuid(bleio_uuid_obj_t *self, ble_uuid_t *nrf_ble_uuid) {
|
void bleio_uuid_construct_from_nrf_ble_uuid(bleio_uuid_obj_t *self, ble_uuid_t *nrf_ble_uuid) {
|
||||||
if (nrf_ble_uuid->type == BLE_UUID_TYPE_UNKNOWN) {
|
if (nrf_ble_uuid->type == BLE_UUID_TYPE_UNKNOWN) {
|
||||||
mp_raise_RuntimeError(translate("Unexpected nrfx uuid type"));
|
mp_raise_RuntimeError(translate("Unexpected nrfx uuid type"));
|
||||||
|
|
|
@ -26,34 +26,58 @@
|
||||||
* THE SOFTWARE.
|
* THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
#include "py/runtime.h"
|
#include "py/runtime.h"
|
||||||
#include "shared-bindings/_bleio/__init__.h"
|
#include "shared-bindings/_bleio/__init__.h"
|
||||||
#include "shared-bindings/_bleio/Adapter.h"
|
#include "shared-bindings/_bleio/Adapter.h"
|
||||||
#include "shared-bindings/_bleio/Central.h"
|
|
||||||
#include "shared-bindings/_bleio/Characteristic.h"
|
#include "shared-bindings/_bleio/Characteristic.h"
|
||||||
|
#include "shared-bindings/_bleio/Connection.h"
|
||||||
#include "shared-bindings/_bleio/Descriptor.h"
|
#include "shared-bindings/_bleio/Descriptor.h"
|
||||||
#include "shared-bindings/_bleio/Peripheral.h"
|
|
||||||
#include "shared-bindings/_bleio/Service.h"
|
#include "shared-bindings/_bleio/Service.h"
|
||||||
#include "shared-bindings/_bleio/UUID.h"
|
#include "shared-bindings/_bleio/UUID.h"
|
||||||
|
#include "supervisor/shared/bluetooth.h"
|
||||||
|
|
||||||
#include "common-hal/_bleio/__init__.h"
|
#include "common-hal/_bleio/__init__.h"
|
||||||
|
|
||||||
static volatile bool m_discovery_in_process;
|
const mp_obj_t base_error_messages[20] = {
|
||||||
static volatile bool m_discovery_successful;
|
MP_ROM_QSTR(MP_QSTR_SUCCESS),
|
||||||
|
MP_ROM_QSTR(MP_QSTR_SVC_HANDLER_MISSING),
|
||||||
static bleio_service_obj_t *m_char_discovery_service;
|
MP_ROM_QSTR(MP_QSTR_SOFTDEVICE_NOT_ENABLED),
|
||||||
static bleio_characteristic_obj_t *m_desc_discovery_characteristic;
|
MP_ROM_QSTR(MP_QSTR_INTERNAL),
|
||||||
|
MP_ROM_QSTR(MP_QSTR_NO_MEM),
|
||||||
|
MP_ROM_QSTR(MP_QSTR_NOT_FOUND),
|
||||||
|
MP_ROM_QSTR(MP_QSTR_NOT_SUPPORTED),
|
||||||
|
MP_ROM_QSTR(MP_QSTR_INVALID_PARAM),
|
||||||
|
MP_ROM_QSTR(MP_QSTR_INVALID_STATE),
|
||||||
|
MP_ROM_QSTR(MP_QSTR_INVALID_LENGTH),
|
||||||
|
MP_ROM_QSTR(MP_QSTR_INVALID_FLAGS),
|
||||||
|
MP_ROM_QSTR(MP_QSTR_INVALID_DATA),
|
||||||
|
MP_ROM_QSTR(MP_QSTR_DATA_SIZE),
|
||||||
|
MP_ROM_QSTR(MP_QSTR_TIMEOUT),
|
||||||
|
MP_ROM_QSTR(MP_QSTR_NULL),
|
||||||
|
MP_ROM_QSTR(MP_QSTR_FORBIDDEN),
|
||||||
|
MP_ROM_QSTR(MP_QSTR_INVALID_ADDR),
|
||||||
|
MP_ROM_QSTR(MP_QSTR_BUSY),
|
||||||
|
MP_ROM_QSTR(MP_QSTR_CONN_COUNT),
|
||||||
|
MP_ROM_QSTR(MP_QSTR_RESOURCES),
|
||||||
|
};
|
||||||
|
|
||||||
// Turn off BLE on a reset or reload.
|
// Turn off BLE on a reset or reload.
|
||||||
void bleio_reset() {
|
void bleio_reset() {
|
||||||
if (common_hal_bleio_adapter_get_enabled()) {
|
bleio_adapter_reset(&common_hal_bleio_adapter_obj);
|
||||||
common_hal_bleio_adapter_set_enabled(false);
|
if (!vm_used_ble) {
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
if (common_hal_bleio_adapter_get_enabled(&common_hal_bleio_adapter_obj)) {
|
||||||
|
common_hal_bleio_adapter_set_enabled(&common_hal_bleio_adapter_obj, false);
|
||||||
|
}
|
||||||
|
supervisor_start_bluetooth();
|
||||||
}
|
}
|
||||||
|
|
||||||
// The singleton _bleio.Adapter object, bound to _bleio.adapter
|
// The singleton _bleio.Adapter object, bound to _bleio.adapter
|
||||||
// It currently only has properties and no state
|
// It currently only has properties and no state
|
||||||
const super_adapter_obj_t common_hal_bleio_adapter_obj = {
|
bleio_adapter_obj_t common_hal_bleio_adapter_obj = {
|
||||||
.base = {
|
.base = {
|
||||||
.type = &bleio_adapter_type,
|
.type = &bleio_adapter_type,
|
||||||
},
|
},
|
||||||
|
@ -65,395 +89,22 @@ void common_hal_bleio_check_connected(uint16_t conn_handle) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t common_hal_bleio_device_get_conn_handle(mp_obj_t device) {
|
|
||||||
if (MP_OBJ_IS_TYPE(device, &bleio_peripheral_type)) {
|
|
||||||
return ((bleio_peripheral_obj_t*) MP_OBJ_TO_PTR(device))->conn_handle;
|
|
||||||
} else if (MP_OBJ_IS_TYPE(device, &bleio_central_type)) {
|
|
||||||
return ((bleio_central_obj_t*) MP_OBJ_TO_PTR(device))->conn_handle;
|
|
||||||
} else {
|
|
||||||
return BLE_CONN_HANDLE_INVALID;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
mp_obj_list_t *common_hal_bleio_device_get_remote_service_list(mp_obj_t device) {
|
|
||||||
if (MP_OBJ_IS_TYPE(device, &bleio_peripheral_type)) {
|
|
||||||
return ((bleio_peripheral_obj_t*) MP_OBJ_TO_PTR(device))->remote_service_list;
|
|
||||||
} else if (MP_OBJ_IS_TYPE(device, &bleio_central_type)) {
|
|
||||||
return ((bleio_central_obj_t*) MP_OBJ_TO_PTR(device))->remote_service_list;
|
|
||||||
} else {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// service_uuid may be NULL, to discover all services.
|
|
||||||
STATIC bool discover_next_services(mp_obj_t device, uint16_t start_handle, ble_uuid_t *service_uuid) {
|
|
||||||
m_discovery_successful = false;
|
|
||||||
m_discovery_in_process = true;
|
|
||||||
|
|
||||||
uint16_t conn_handle = common_hal_bleio_device_get_conn_handle(device);
|
|
||||||
uint32_t err_code = sd_ble_gattc_primary_services_discover(conn_handle, start_handle, service_uuid);
|
|
||||||
|
|
||||||
if (err_code != NRF_SUCCESS) {
|
|
||||||
mp_raise_OSError_msg(translate("Failed to discover services"));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Wait for a discovery event.
|
|
||||||
while (m_discovery_in_process) {
|
|
||||||
MICROPY_VM_HOOK_LOOP;
|
|
||||||
}
|
|
||||||
return m_discovery_successful;
|
|
||||||
}
|
|
||||||
|
|
||||||
STATIC bool discover_next_characteristics(mp_obj_t device, bleio_service_obj_t *service, uint16_t start_handle) {
|
|
||||||
m_char_discovery_service = service;
|
|
||||||
|
|
||||||
ble_gattc_handle_range_t handle_range;
|
|
||||||
handle_range.start_handle = start_handle;
|
|
||||||
handle_range.end_handle = service->end_handle;
|
|
||||||
|
|
||||||
m_discovery_successful = false;
|
|
||||||
m_discovery_in_process = true;
|
|
||||||
|
|
||||||
uint16_t conn_handle = common_hal_bleio_device_get_conn_handle(device);
|
|
||||||
uint32_t err_code = sd_ble_gattc_characteristics_discover(conn_handle, &handle_range);
|
|
||||||
if (err_code != NRF_SUCCESS) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Wait for a discovery event.
|
|
||||||
while (m_discovery_in_process) {
|
|
||||||
MICROPY_VM_HOOK_LOOP;
|
|
||||||
}
|
|
||||||
return m_discovery_successful;
|
|
||||||
}
|
|
||||||
|
|
||||||
STATIC bool discover_next_descriptors(mp_obj_t device, bleio_characteristic_obj_t *characteristic, uint16_t start_handle, uint16_t end_handle) {
|
|
||||||
m_desc_discovery_characteristic = characteristic;
|
|
||||||
|
|
||||||
ble_gattc_handle_range_t handle_range;
|
|
||||||
handle_range.start_handle = start_handle;
|
|
||||||
handle_range.end_handle = end_handle;
|
|
||||||
|
|
||||||
m_discovery_successful = false;
|
|
||||||
m_discovery_in_process = true;
|
|
||||||
|
|
||||||
uint16_t conn_handle = common_hal_bleio_device_get_conn_handle(device);
|
|
||||||
uint32_t err_code = sd_ble_gattc_descriptors_discover(conn_handle, &handle_range);
|
|
||||||
if (err_code != NRF_SUCCESS) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Wait for a discovery event.
|
|
||||||
while (m_discovery_in_process) {
|
|
||||||
MICROPY_VM_HOOK_LOOP;
|
|
||||||
}
|
|
||||||
return m_discovery_successful;
|
|
||||||
}
|
|
||||||
|
|
||||||
STATIC void on_primary_srv_discovery_rsp(ble_gattc_evt_prim_srvc_disc_rsp_t *response, mp_obj_t device) {
|
|
||||||
for (size_t i = 0; i < response->count; ++i) {
|
|
||||||
ble_gattc_service_t *gattc_service = &response->services[i];
|
|
||||||
|
|
||||||
bleio_service_obj_t *service = m_new_obj(bleio_service_obj_t);
|
|
||||||
service->base.type = &bleio_service_type;
|
|
||||||
|
|
||||||
// Initialize several fields at once.
|
|
||||||
common_hal_bleio_service_construct(service, device, NULL, false);
|
|
||||||
|
|
||||||
service->is_remote = true;
|
|
||||||
service->start_handle = gattc_service->handle_range.start_handle;
|
|
||||||
service->end_handle = gattc_service->handle_range.end_handle;
|
|
||||||
service->handle = gattc_service->handle_range.start_handle;
|
|
||||||
|
|
||||||
if (gattc_service->uuid.type != BLE_UUID_TYPE_UNKNOWN) {
|
|
||||||
// Known service UUID.
|
|
||||||
bleio_uuid_obj_t *uuid = m_new_obj(bleio_uuid_obj_t);
|
|
||||||
uuid->base.type = &bleio_uuid_type;
|
|
||||||
bleio_uuid_construct_from_nrf_ble_uuid(uuid, &gattc_service->uuid);
|
|
||||||
service->uuid = uuid;
|
|
||||||
} else {
|
|
||||||
// The discovery response contained a 128-bit UUID that has not yet been registered with the
|
|
||||||
// softdevice via sd_ble_uuid_vs_add(). We need to fetch the 128-bit value and register it.
|
|
||||||
// For now, just set the UUID to NULL.
|
|
||||||
service->uuid = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
mp_obj_list_append(common_hal_bleio_device_get_remote_service_list(device), service);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (response->count > 0) {
|
|
||||||
m_discovery_successful = true;
|
|
||||||
}
|
|
||||||
m_discovery_in_process = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
STATIC void on_char_discovery_rsp(ble_gattc_evt_char_disc_rsp_t *response, mp_obj_t device) {
|
|
||||||
for (size_t i = 0; i < response->count; ++i) {
|
|
||||||
ble_gattc_char_t *gattc_char = &response->chars[i];
|
|
||||||
|
|
||||||
bleio_characteristic_obj_t *characteristic = m_new_obj(bleio_characteristic_obj_t);
|
|
||||||
characteristic->base.type = &bleio_characteristic_type;
|
|
||||||
|
|
||||||
bleio_uuid_obj_t *uuid = NULL;
|
|
||||||
|
|
||||||
if (gattc_char->uuid.type != BLE_UUID_TYPE_UNKNOWN) {
|
|
||||||
// Known characteristic UUID.
|
|
||||||
uuid = m_new_obj(bleio_uuid_obj_t);
|
|
||||||
uuid->base.type = &bleio_uuid_type;
|
|
||||||
bleio_uuid_construct_from_nrf_ble_uuid(uuid, &gattc_char->uuid);
|
|
||||||
} else {
|
|
||||||
// The discovery response contained a 128-bit UUID that has not yet been registered with the
|
|
||||||
// softdevice via sd_ble_uuid_vs_add(). We need to fetch the 128-bit value and register it.
|
|
||||||
// For now, just leave the UUID as NULL.
|
|
||||||
}
|
|
||||||
|
|
||||||
bleio_characteristic_properties_t props =
|
|
||||||
(gattc_char->char_props.broadcast ? CHAR_PROP_BROADCAST : 0) |
|
|
||||||
(gattc_char->char_props.indicate ? CHAR_PROP_INDICATE : 0) |
|
|
||||||
(gattc_char->char_props.notify ? CHAR_PROP_NOTIFY : 0) |
|
|
||||||
(gattc_char->char_props.read ? CHAR_PROP_READ : 0) |
|
|
||||||
(gattc_char->char_props.write ? CHAR_PROP_WRITE : 0) |
|
|
||||||
(gattc_char->char_props.write_wo_resp ? CHAR_PROP_WRITE_NO_RESPONSE : 0);
|
|
||||||
|
|
||||||
// Call common_hal_bleio_characteristic_construct() to initalize some fields and set up evt handler.
|
|
||||||
common_hal_bleio_characteristic_construct(
|
|
||||||
characteristic, m_char_discovery_service, uuid, props, SECURITY_MODE_OPEN, SECURITY_MODE_OPEN,
|
|
||||||
GATT_MAX_DATA_LENGTH, false, // max_length, fixed_length: values may not matter for gattc
|
|
||||||
mp_obj_new_list(0, NULL));
|
|
||||||
characteristic->handle = gattc_char->handle_value;
|
|
||||||
|
|
||||||
mp_obj_list_append(m_char_discovery_service->characteristic_list, MP_OBJ_FROM_PTR(characteristic));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (response->count > 0) {
|
|
||||||
m_discovery_successful = true;
|
|
||||||
}
|
|
||||||
m_discovery_in_process = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
STATIC void on_desc_discovery_rsp(ble_gattc_evt_desc_disc_rsp_t *response, mp_obj_t device) {
|
|
||||||
for (size_t i = 0; i < response->count; ++i) {
|
|
||||||
ble_gattc_desc_t *gattc_desc = &response->descs[i];
|
|
||||||
|
|
||||||
// Remember handles for certain well-known descriptors.
|
|
||||||
switch (gattc_desc->uuid.uuid) {
|
|
||||||
case BLE_UUID_DESCRIPTOR_CLIENT_CHAR_CONFIG:
|
|
||||||
m_desc_discovery_characteristic->cccd_handle = gattc_desc->handle;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case BLE_UUID_DESCRIPTOR_SERVER_CHAR_CONFIG:
|
|
||||||
m_desc_discovery_characteristic->sccd_handle = gattc_desc->handle;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case BLE_UUID_DESCRIPTOR_CHAR_USER_DESC:
|
|
||||||
m_desc_discovery_characteristic->user_desc_handle = gattc_desc->handle;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
// TODO: sd_ble_gattc_descriptors_discover() can return things that are not descriptors,
|
|
||||||
// so ignore those.
|
|
||||||
// https://devzone.nordicsemi.com/f/nordic-q-a/49500/sd_ble_gattc_descriptors_discover-is-returning-attributes-that-are-not-descriptors
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
bleio_descriptor_obj_t *descriptor = m_new_obj(bleio_descriptor_obj_t);
|
|
||||||
descriptor->base.type = &bleio_descriptor_type;
|
|
||||||
|
|
||||||
bleio_uuid_obj_t *uuid = NULL;
|
|
||||||
|
|
||||||
if (gattc_desc->uuid.type != BLE_UUID_TYPE_UNKNOWN) {
|
|
||||||
// Known descriptor UUID.
|
|
||||||
uuid = m_new_obj(bleio_uuid_obj_t);
|
|
||||||
uuid->base.type = &bleio_uuid_type;
|
|
||||||
bleio_uuid_construct_from_nrf_ble_uuid(uuid, &gattc_desc->uuid);
|
|
||||||
} else {
|
|
||||||
// The discovery response contained a 128-bit UUID that has not yet been registered with the
|
|
||||||
// softdevice via sd_ble_uuid_vs_add(). We need to fetch the 128-bit value and register it.
|
|
||||||
// For now, just leave the UUID as NULL.
|
|
||||||
}
|
|
||||||
|
|
||||||
common_hal_bleio_descriptor_construct(
|
|
||||||
descriptor, m_desc_discovery_characteristic, uuid,
|
|
||||||
SECURITY_MODE_OPEN, SECURITY_MODE_OPEN,
|
|
||||||
GATT_MAX_DATA_LENGTH, false, mp_const_empty_bytes);
|
|
||||||
descriptor->handle = gattc_desc->handle;
|
|
||||||
|
|
||||||
mp_obj_list_append(m_desc_discovery_characteristic->descriptor_list, MP_OBJ_FROM_PTR(descriptor));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (response->count > 0) {
|
|
||||||
m_discovery_successful = true;
|
|
||||||
}
|
|
||||||
m_discovery_in_process = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
STATIC void discovery_on_ble_evt(ble_evt_t *ble_evt, mp_obj_t device) {
|
|
||||||
switch (ble_evt->header.evt_id) {
|
|
||||||
case BLE_GAP_EVT_DISCONNECTED:
|
|
||||||
m_discovery_successful = false;
|
|
||||||
m_discovery_in_process = false;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case BLE_GATTC_EVT_PRIM_SRVC_DISC_RSP:
|
|
||||||
on_primary_srv_discovery_rsp(&ble_evt->evt.gattc_evt.params.prim_srvc_disc_rsp, device);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case BLE_GATTC_EVT_CHAR_DISC_RSP:
|
|
||||||
on_char_discovery_rsp(&ble_evt->evt.gattc_evt.params.char_disc_rsp, device);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case BLE_GATTC_EVT_DESC_DISC_RSP:
|
|
||||||
on_desc_discovery_rsp(&ble_evt->evt.gattc_evt.params.desc_disc_rsp, device);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
// For debugging.
|
|
||||||
// mp_printf(&mp_plat_print, "Unhandled discovery event: 0x%04x\n", ble_evt->header.evt_id);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void common_hal_bleio_device_discover_remote_services(mp_obj_t device, mp_obj_t service_uuids_whitelist) {
|
|
||||||
mp_obj_list_t *remote_services_list = common_hal_bleio_device_get_remote_service_list(device);
|
|
||||||
|
|
||||||
ble_drv_add_event_handler(discovery_on_ble_evt, device);
|
|
||||||
|
|
||||||
// Start over with an empty list.
|
|
||||||
mp_obj_list_clear(MP_OBJ_FROM_PTR(common_hal_bleio_device_get_remote_service_list(device)));
|
|
||||||
|
|
||||||
if (service_uuids_whitelist == mp_const_none) {
|
|
||||||
// List of service UUID's not given, so discover all available services.
|
|
||||||
|
|
||||||
uint16_t next_service_start_handle = BLE_GATT_HANDLE_START;
|
|
||||||
|
|
||||||
while (discover_next_services(device, next_service_start_handle, MP_OBJ_NULL)) {
|
|
||||||
// discover_next_services() appends to remote_services_list.
|
|
||||||
|
|
||||||
// Get the most recently discovered service, and then ask for services
|
|
||||||
// whose handles start after the last attribute handle inside that service.
|
|
||||||
const bleio_service_obj_t *service =
|
|
||||||
MP_OBJ_TO_PTR(remote_services_list->items[remote_services_list->len - 1]);
|
|
||||||
next_service_start_handle = service->end_handle + 1;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
mp_obj_iter_buf_t iter_buf;
|
|
||||||
mp_obj_t iterable = mp_getiter(service_uuids_whitelist, &iter_buf);
|
|
||||||
mp_obj_t uuid_obj;
|
|
||||||
while ((uuid_obj = mp_iternext(iterable)) != MP_OBJ_STOP_ITERATION) {
|
|
||||||
if (!MP_OBJ_IS_TYPE(uuid_obj, &bleio_uuid_type)) {
|
|
||||||
mp_raise_ValueError(translate("non-UUID found in service_uuids_whitelist"));
|
|
||||||
}
|
|
||||||
bleio_uuid_obj_t *uuid = MP_OBJ_TO_PTR(uuid_obj);
|
|
||||||
|
|
||||||
ble_uuid_t nrf_uuid;
|
|
||||||
bleio_uuid_convert_to_nrf_ble_uuid(uuid, &nrf_uuid);
|
|
||||||
|
|
||||||
// Service might or might not be discovered; that's ok. Caller has to check
|
|
||||||
// Central.remote_services to find out.
|
|
||||||
// We only need to call this once for each service to discover.
|
|
||||||
discover_next_services(device, BLE_GATT_HANDLE_START, &nrf_uuid);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
for (size_t service_idx = 0; service_idx < remote_services_list->len; ++service_idx) {
|
|
||||||
bleio_service_obj_t *service = MP_OBJ_TO_PTR(remote_services_list->items[service_idx]);
|
|
||||||
|
|
||||||
// Skip the service if it had an unknown (unregistered) UUID.
|
|
||||||
if (service->uuid == NULL) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint16_t next_char_start_handle = service->start_handle;
|
|
||||||
|
|
||||||
// Stop when we go past the end of the range of handles for this service or
|
|
||||||
// discovery call returns nothing.
|
|
||||||
// discover_next_characteristics() appends to the characteristic_list.
|
|
||||||
while (next_char_start_handle <= service->end_handle &&
|
|
||||||
discover_next_characteristics(device, service, next_char_start_handle)) {
|
|
||||||
|
|
||||||
|
|
||||||
// Get the most recently discovered characteristic, and then ask for characteristics
|
|
||||||
// whose handles start after the last attribute handle inside that characteristic.
|
|
||||||
const bleio_characteristic_obj_t *characteristic =
|
|
||||||
MP_OBJ_TO_PTR(service->characteristic_list->items[service->characteristic_list->len - 1]);
|
|
||||||
next_char_start_handle = characteristic->handle + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Got characteristics for this service. Now discover descriptors for each characteristic.
|
|
||||||
size_t char_list_len = service->characteristic_list->len;
|
|
||||||
for (size_t char_idx = 0; char_idx < char_list_len; ++char_idx) {
|
|
||||||
bleio_characteristic_obj_t *characteristic =
|
|
||||||
MP_OBJ_TO_PTR(service->characteristic_list->items[char_idx]);
|
|
||||||
const bool last_characteristic = char_idx == char_list_len - 1;
|
|
||||||
bleio_characteristic_obj_t *next_characteristic = last_characteristic
|
|
||||||
? NULL
|
|
||||||
: MP_OBJ_TO_PTR(service->characteristic_list->items[char_idx + 1]);
|
|
||||||
|
|
||||||
// Skip the characteristic if it had an unknown (unregistered) UUID.
|
|
||||||
if (characteristic->uuid == NULL) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint16_t next_desc_start_handle = characteristic->handle + 1;
|
|
||||||
|
|
||||||
// Don't run past the end of this service or the beginning of the next characteristic.
|
|
||||||
uint16_t next_desc_end_handle = next_characteristic == NULL
|
|
||||||
? service->end_handle
|
|
||||||
: next_characteristic->handle - 1;
|
|
||||||
|
|
||||||
// Stop when we go past the end of the range of handles for this service or
|
|
||||||
// discovery call returns nothing.
|
|
||||||
// discover_next_descriptors() appends to the descriptor_list.
|
|
||||||
while (next_desc_start_handle <= service->end_handle &&
|
|
||||||
next_desc_start_handle < next_desc_end_handle &&
|
|
||||||
discover_next_descriptors(device, characteristic,
|
|
||||||
next_desc_start_handle, next_desc_end_handle)) {
|
|
||||||
|
|
||||||
// Get the most recently discovered descriptor, and then ask for descriptors
|
|
||||||
// whose handles start after that descriptor's handle.
|
|
||||||
const bleio_descriptor_obj_t *descriptor =
|
|
||||||
MP_OBJ_TO_PTR(characteristic->descriptor_list->items[characteristic->descriptor_list->len - 1]);
|
|
||||||
next_desc_start_handle = descriptor->handle + 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// This event handler is no longer needed.
|
|
||||||
ble_drv_remove_event_handler(discovery_on_ble_evt, device);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// GATTS read of a Characteristic or Descriptor.
|
// GATTS read of a Characteristic or Descriptor.
|
||||||
mp_obj_t common_hal_bleio_gatts_read(uint16_t handle, uint16_t conn_handle) {
|
size_t common_hal_bleio_gatts_read(uint16_t handle, uint16_t conn_handle, uint8_t* buf, size_t len) {
|
||||||
// conn_handle might be BLE_CONN_HANDLE_INVALID if we're not connected, but that's OK, because
|
// conn_handle might be BLE_CONN_HANDLE_INVALID if we're not connected, but that's OK, because
|
||||||
// we can still read and write the local value.
|
// we can still read and write the local value.
|
||||||
|
|
||||||
mp_buffer_info_t bufinfo;
|
|
||||||
ble_gatts_value_t gatts_value = {
|
ble_gatts_value_t gatts_value = {
|
||||||
.p_value = NULL,
|
.p_value = buf,
|
||||||
.len = 0,
|
.len = len,
|
||||||
};
|
};
|
||||||
|
|
||||||
// Read once to find out what size buffer we need, then read again to fill buffer.
|
|
||||||
|
|
||||||
mp_obj_t value = mp_const_none;
|
|
||||||
uint32_t err_code = sd_ble_gatts_value_get(conn_handle, handle, &gatts_value);
|
uint32_t err_code = sd_ble_gatts_value_get(conn_handle, handle, &gatts_value);
|
||||||
if (err_code == NRF_SUCCESS) {
|
|
||||||
value = mp_obj_new_bytearray_of_zeros(gatts_value.len);
|
|
||||||
mp_get_buffer_raise(value, &bufinfo, MP_BUFFER_WRITE);
|
|
||||||
gatts_value.p_value = bufinfo.buf;
|
|
||||||
|
|
||||||
// Read again, with the correct size of buffer.
|
|
||||||
err_code = sd_ble_gatts_value_get(conn_handle, handle, &gatts_value);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (err_code != NRF_SUCCESS) {
|
if (err_code != NRF_SUCCESS) {
|
||||||
mp_raise_OSError_msg_varg(translate("Failed to read gatts value, err 0x%04x"), err_code);
|
mp_raise_OSError_msg_varg(translate("Failed to read gatts value, err 0x%04x"), err_code);
|
||||||
}
|
}
|
||||||
|
|
||||||
return value;
|
return gatts_value.len;
|
||||||
}
|
}
|
||||||
|
|
||||||
void common_hal_bleio_gatts_write(uint16_t handle, uint16_t conn_handle, mp_buffer_info_t *bufinfo) {
|
void common_hal_bleio_gatts_write(uint16_t handle, uint16_t conn_handle, mp_buffer_info_t *bufinfo) {
|
||||||
|
@ -471,6 +122,72 @@ void common_hal_bleio_gatts_write(uint16_t handle, uint16_t conn_handle, mp_buff
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint8_t* buf;
|
||||||
|
size_t len;
|
||||||
|
size_t final_len;
|
||||||
|
uint16_t conn_handle;
|
||||||
|
volatile uint16_t status;
|
||||||
|
volatile bool done;
|
||||||
|
} read_info_t;
|
||||||
|
|
||||||
|
STATIC bool _on_gattc_read_rsp_evt(ble_evt_t *ble_evt, void *param) {
|
||||||
|
read_info_t* read = param;
|
||||||
|
switch (ble_evt->header.evt_id) {
|
||||||
|
|
||||||
|
// More events may be handled later, so keep this as a switch.
|
||||||
|
|
||||||
|
case BLE_GATTC_EVT_READ_RSP: {
|
||||||
|
ble_gattc_evt_t* evt = &ble_evt->evt.gattc_evt;
|
||||||
|
ble_gattc_evt_read_rsp_t *response = &evt->params.read_rsp;
|
||||||
|
if (read && evt->conn_handle == read->conn_handle) {
|
||||||
|
read->status = evt->gatt_status;
|
||||||
|
size_t len = MIN(read->len, response->len);
|
||||||
|
memcpy(read->buf, response->data, len);
|
||||||
|
read->final_len = len;
|
||||||
|
// Indicate to busy-wait loop that we've read the attribute value.
|
||||||
|
read->done = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
// For debugging.
|
||||||
|
// mp_printf(&mp_plat_print, "Unhandled characteristic event: 0x%04x\n", ble_evt->header.evt_id);
|
||||||
|
return false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t common_hal_bleio_gattc_read(uint16_t handle, uint16_t conn_handle, uint8_t* buf, size_t len) {
|
||||||
|
common_hal_bleio_check_connected(conn_handle);
|
||||||
|
|
||||||
|
read_info_t read_info;
|
||||||
|
read_info.buf = buf;
|
||||||
|
read_info.len = len;
|
||||||
|
read_info.final_len = 0;
|
||||||
|
read_info.conn_handle = conn_handle;
|
||||||
|
// Set to true by the event handler.
|
||||||
|
read_info.done = false;
|
||||||
|
ble_drv_add_event_handler(_on_gattc_read_rsp_evt, &read_info);
|
||||||
|
|
||||||
|
const uint32_t err_code = sd_ble_gattc_read(conn_handle, handle, 0);
|
||||||
|
if (err_code != NRF_SUCCESS) {
|
||||||
|
mp_raise_OSError_msg_varg(translate("Failed initiate attribute read, err 0x%04x"), err_code);
|
||||||
|
}
|
||||||
|
|
||||||
|
while (!read_info.done) {
|
||||||
|
RUN_BACKGROUND_TASKS;
|
||||||
|
}
|
||||||
|
if (read_info.status != BLE_GATT_STATUS_SUCCESS) {
|
||||||
|
mp_raise_OSError_msg_varg(translate("Failed to read attribute value, err 0x%04x"), read_info.status);
|
||||||
|
}
|
||||||
|
|
||||||
|
ble_drv_remove_event_handler(_on_gattc_read_rsp_evt, &read_info);
|
||||||
|
return read_info.final_len;
|
||||||
|
}
|
||||||
|
|
||||||
void common_hal_bleio_gattc_write(uint16_t handle, uint16_t conn_handle, mp_buffer_info_t *bufinfo, bool write_no_response) {
|
void common_hal_bleio_gattc_write(uint16_t handle, uint16_t conn_handle, mp_buffer_info_t *bufinfo, bool write_no_response) {
|
||||||
common_hal_bleio_check_connected(conn_handle);
|
common_hal_bleio_check_connected(conn_handle);
|
||||||
|
|
||||||
|
@ -500,3 +217,7 @@ void common_hal_bleio_gattc_write(uint16_t handle, uint16_t conn_handle, mp_buff
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void common_hal_bleio_gc_collect(void) {
|
||||||
|
bleio_adapter_gc_collect(&common_hal_bleio_adapter_obj);
|
||||||
|
}
|
||||||
|
|
|
@ -39,4 +39,9 @@ typedef struct {
|
||||||
// 20 bytes max (23 - 3).
|
// 20 bytes max (23 - 3).
|
||||||
#define GATT_MAX_DATA_LENGTH (BLE_GATT_ATT_MTU_DEFAULT - 3)
|
#define GATT_MAX_DATA_LENGTH (BLE_GATT_ATT_MTU_DEFAULT - 3)
|
||||||
|
|
||||||
|
const mp_obj_t base_error_messages[20];
|
||||||
|
|
||||||
|
// Track if the user code modified the BLE state to know if we need to undo it on reload.
|
||||||
|
bool vm_used_ble;
|
||||||
|
|
||||||
#endif // MICROPY_INCLUDED_NRF_COMMON_HAL_BLEIO_INIT_H
|
#endif // MICROPY_INCLUDED_NRF_COMMON_HAL_BLEIO_INIT_H
|
||||||
|
|
|
@ -25,5 +25,9 @@ STATIC const mp_rom_map_elem_t board_module_globals_table[] = {
|
||||||
|
|
||||||
{ MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_PB10) },
|
{ MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_PB10) },
|
||||||
{ MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_PB11) },
|
{ MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_PB11) },
|
||||||
|
|
||||||
|
{ MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) },
|
||||||
|
{ MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&board_spi_obj) },
|
||||||
|
{ MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) },
|
||||||
};
|
};
|
||||||
MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table);
|
MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table);
|
||||||
|
|
|
@ -61,7 +61,7 @@
|
||||||
/* #define HAL_SD_MODULE_ENABLED */
|
/* #define HAL_SD_MODULE_ENABLED */
|
||||||
/* #define HAL_MMC_MODULE_ENABLED */
|
/* #define HAL_MMC_MODULE_ENABLED */
|
||||||
#define HAL_SPI_MODULE_ENABLED
|
#define HAL_SPI_MODULE_ENABLED
|
||||||
/* #define HAL_TIM_MODULE_ENABLED */
|
#define HAL_TIM_MODULE_ENABLED
|
||||||
#define HAL_UART_MODULE_ENABLED
|
#define HAL_UART_MODULE_ENABLED
|
||||||
/* #define HAL_USART_MODULE_ENABLED */
|
/* #define HAL_USART_MODULE_ENABLED */
|
||||||
/* #define HAL_IRDA_MODULE_ENABLED */
|
/* #define HAL_IRDA_MODULE_ENABLED */
|
||||||
|
|
|
@ -3,8 +3,7 @@
|
||||||
*
|
*
|
||||||
* The MIT License (MIT)
|
* The MIT License (MIT)
|
||||||
*
|
*
|
||||||
* Copyright (c) 2016 Glenn Ruben Bakke
|
* Copyright (c) 2019 Lucian Copeland for Adafruit Industries
|
||||||
* Copyright (c) 2018 Dan Halbert for Adafruit Industries
|
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
@ -35,3 +34,6 @@
|
||||||
|
|
||||||
#define AUTORESET_DELAY_MS 500
|
#define AUTORESET_DELAY_MS 500
|
||||||
#define BOARD_FLASH_SIZE (FLASH_SIZE - 0x4000)
|
#define BOARD_FLASH_SIZE (FLASH_SIZE - 0x4000)
|
||||||
|
|
||||||
|
#define DEFAULT_I2C_BUS_SCL (&pin_PB06)
|
||||||
|
#define DEFAULT_I2C_BUS_SDA (&pin_PB07)
|
||||||
|
|
|
@ -46,5 +46,7 @@ STATIC const mp_rom_map_elem_t board_module_globals_table[] = {
|
||||||
|
|
||||||
{ MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_PB06) },
|
{ MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_PB06) },
|
||||||
{ MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_PB07) },
|
{ MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_PB07) },
|
||||||
|
|
||||||
|
{ MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) },
|
||||||
};
|
};
|
||||||
MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table);
|
MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table);
|
||||||
|
|
|
@ -61,7 +61,7 @@
|
||||||
/* #define HAL_SD_MODULE_ENABLED */
|
/* #define HAL_SD_MODULE_ENABLED */
|
||||||
/* #define HAL_MMC_MODULE_ENABLED */
|
/* #define HAL_MMC_MODULE_ENABLED */
|
||||||
#define HAL_SPI_MODULE_ENABLED
|
#define HAL_SPI_MODULE_ENABLED
|
||||||
/* #define HAL_TIM_MODULE_ENABLED */
|
#define HAL_TIM_MODULE_ENABLED
|
||||||
#define HAL_UART_MODULE_ENABLED
|
#define HAL_UART_MODULE_ENABLED
|
||||||
/* #define HAL_USART_MODULE_ENABLED */
|
/* #define HAL_USART_MODULE_ENABLED */
|
||||||
/* #define HAL_IRDA_MODULE_ENABLED */
|
/* #define HAL_IRDA_MODULE_ENABLED */
|
||||||
|
|
|
@ -3,8 +3,7 @@
|
||||||
*
|
*
|
||||||
* The MIT License (MIT)
|
* The MIT License (MIT)
|
||||||
*
|
*
|
||||||
* Copyright (c) 2016 Glenn Ruben Bakke
|
* Copyright (c) 2019 Lucian Copeland for Adafruit Industries
|
||||||
* Copyright (c) 2018 Dan Halbert for Adafruit Industries
|
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
|
|
@ -61,7 +61,7 @@
|
||||||
/* #define HAL_SD_MODULE_ENABLED */
|
/* #define HAL_SD_MODULE_ENABLED */
|
||||||
/* #define HAL_MMC_MODULE_ENABLED */
|
/* #define HAL_MMC_MODULE_ENABLED */
|
||||||
#define HAL_SPI_MODULE_ENABLED
|
#define HAL_SPI_MODULE_ENABLED
|
||||||
/* #define HAL_TIM_MODULE_ENABLED */
|
#define HAL_TIM_MODULE_ENABLED
|
||||||
#define HAL_UART_MODULE_ENABLED
|
#define HAL_UART_MODULE_ENABLED
|
||||||
/* #define HAL_USART_MODULE_ENABLED */
|
/* #define HAL_USART_MODULE_ENABLED */
|
||||||
/* #define HAL_IRDA_MODULE_ENABLED */
|
/* #define HAL_IRDA_MODULE_ENABLED */
|
||||||
|
|
|
@ -3,8 +3,7 @@
|
||||||
*
|
*
|
||||||
* The MIT License (MIT)
|
* The MIT License (MIT)
|
||||||
*
|
*
|
||||||
* Copyright (c) 2016 Glenn Ruben Bakke
|
* Copyright (c) 2019 Lucian Copeland for Adafruit Industries
|
||||||
* Copyright (c) 2018 Dan Halbert for Adafruit Industries
|
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
|
|
@ -88,5 +88,7 @@ STATIC const mp_rom_map_elem_t board_module_globals_table[] = {
|
||||||
{ MP_ROM_QSTR(MP_QSTR_LED2), MP_ROM_PTR(&pin_PE01) },
|
{ MP_ROM_QSTR(MP_QSTR_LED2), MP_ROM_PTR(&pin_PE01) },
|
||||||
{ MP_ROM_QSTR(MP_QSTR_LED3), MP_ROM_PTR(&pin_PE02) },
|
{ MP_ROM_QSTR(MP_QSTR_LED3), MP_ROM_PTR(&pin_PE02) },
|
||||||
{ MP_ROM_QSTR(MP_QSTR_LED4), MP_ROM_PTR(&pin_PE03) },
|
{ MP_ROM_QSTR(MP_QSTR_LED4), MP_ROM_PTR(&pin_PE03) },
|
||||||
|
|
||||||
|
{ MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) },
|
||||||
};
|
};
|
||||||
MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table);
|
MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table);
|
||||||
|
|
|
@ -61,7 +61,7 @@
|
||||||
#define HAL_SD_MODULE_ENABLED
|
#define HAL_SD_MODULE_ENABLED
|
||||||
/* #define HAL_MMC_MODULE_ENABLED */
|
/* #define HAL_MMC_MODULE_ENABLED */
|
||||||
#define HAL_SPI_MODULE_ENABLED
|
#define HAL_SPI_MODULE_ENABLED
|
||||||
/* #define HAL_TIM_MODULE_ENABLED */
|
#define HAL_TIM_MODULE_ENABLED
|
||||||
#define HAL_UART_MODULE_ENABLED
|
#define HAL_UART_MODULE_ENABLED
|
||||||
/* #define HAL_USART_MODULE_ENABLED */
|
/* #define HAL_USART_MODULE_ENABLED */
|
||||||
/* #define HAL_IRDA_MODULE_ENABLED */
|
/* #define HAL_IRDA_MODULE_ENABLED */
|
||||||
|
|
|
@ -0,0 +1,399 @@
|
||||||
|
/*
|
||||||
|
* This file is part of the MicroPython project, http://micropython.org/
|
||||||
|
*
|
||||||
|
* The MIT License (MIT)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2019 Lucian Copeland for Adafruit Industries
|
||||||
|
* Uses code from Micropython, Copyright (c) 2013-2016 Damien P. George
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "py/runtime.h"
|
||||||
|
#include "common-hal/pulseio/PWMOut.h"
|
||||||
|
#include "shared-bindings/pulseio/PWMOut.h"
|
||||||
|
#include "supervisor/shared/translate.h"
|
||||||
|
|
||||||
|
#include "shared-bindings/microcontroller/__init__.h"
|
||||||
|
#include "stm32f4xx_hal.h"
|
||||||
|
#include "common-hal/microcontroller/Pin.h"
|
||||||
|
|
||||||
|
#define ALL_CLOCKS 0xFFFF
|
||||||
|
|
||||||
|
STATIC uint8_t reserved_tim[TIM_BANK_ARRAY_LEN];
|
||||||
|
STATIC uint32_t tim_frequencies[TIM_BANK_ARRAY_LEN];
|
||||||
|
STATIC bool never_reset_tim[TIM_BANK_ARRAY_LEN];
|
||||||
|
|
||||||
|
STATIC void tim_clock_enable(uint16_t mask);
|
||||||
|
STATIC void tim_clock_disable(uint16_t mask);
|
||||||
|
|
||||||
|
// Get the frequency (in Hz) of the source clock for the given timer.
|
||||||
|
// On STM32F405/407/415/417 there are 2 cases for how the clock freq is set.
|
||||||
|
// If the APB prescaler is 1, then the timer clock is equal to its respective
|
||||||
|
// APB clock. Otherwise (APB prescaler > 1) the timer clock is twice its
|
||||||
|
// respective APB clock. See DM00031020 Rev 4, page 115.
|
||||||
|
STATIC uint32_t timer_get_source_freq(uint32_t tim_id) {
|
||||||
|
uint32_t source, clk_div;
|
||||||
|
if (tim_id == 1 || (8 <= tim_id && tim_id <= 11)) {
|
||||||
|
// TIM{1,8,9,10,11} are on APB2
|
||||||
|
source = HAL_RCC_GetPCLK2Freq();
|
||||||
|
clk_div = RCC->CFGR & RCC_CFGR_PPRE2;
|
||||||
|
} else {
|
||||||
|
// TIM{2,3,4,5,6,7,12,13,14} are on APB1
|
||||||
|
source = HAL_RCC_GetPCLK1Freq();
|
||||||
|
clk_div = RCC->CFGR & RCC_CFGR_PPRE1;
|
||||||
|
}
|
||||||
|
if (clk_div != 0) {
|
||||||
|
// APB prescaler for this timer is > 1
|
||||||
|
source *= 2;
|
||||||
|
}
|
||||||
|
return source;
|
||||||
|
}
|
||||||
|
|
||||||
|
STATIC uint32_t timer_get_internal_duty(uint16_t duty, uint32_t period) {
|
||||||
|
//duty cycle is duty/0xFFFF fraction x (number of pulses per period)
|
||||||
|
return (duty*period)/((1<<16)-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
STATIC void timer_get_optimal_divisors(uint32_t*period, uint32_t*prescaler,
|
||||||
|
uint32_t frequency, uint32_t source_freq) {
|
||||||
|
//Find the largest possible period supported by this frequency
|
||||||
|
for (int i=0; i<(1 << 16);i++) {
|
||||||
|
*period = source_freq/(i*frequency);
|
||||||
|
if (*period < (1 << 16) && *period>=2) {
|
||||||
|
*prescaler = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (*prescaler == 0) {
|
||||||
|
mp_raise_ValueError(translate("Invalid frequency supplied"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void pwmout_reset(void) {
|
||||||
|
uint16_t never_reset_mask = 0x00;
|
||||||
|
for(int i=0;i<TIM_BANK_ARRAY_LEN;i++) {
|
||||||
|
if (!never_reset_tim[i]) {
|
||||||
|
reserved_tim[i] = 0x00;
|
||||||
|
tim_frequencies[i] = 0x00;
|
||||||
|
} else {
|
||||||
|
never_reset_mask |= 1<<i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
tim_clock_disable(ALL_CLOCKS & ~(never_reset_mask));
|
||||||
|
}
|
||||||
|
|
||||||
|
void common_hal_pulseio_pwmout_never_reset(pulseio_pwmout_obj_t *self) {
|
||||||
|
for(size_t i = 0 ; i < TIM_BANK_ARRAY_LEN; i++) {
|
||||||
|
if (mcu_tim_banks[i] == self->handle.Instance) {
|
||||||
|
never_reset_tim[i] = true;
|
||||||
|
never_reset_pin_number(self->tim->pin->port, self->tim->pin->number);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void common_hal_pulseio_pwmout_reset_ok(pulseio_pwmout_obj_t *self) {
|
||||||
|
for(size_t i = 0 ; i < TIM_BANK_ARRAY_LEN; i++) {
|
||||||
|
if (mcu_tim_banks[i] == self->handle.Instance) {
|
||||||
|
never_reset_tim[i] = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pwmout_result_t common_hal_pulseio_pwmout_construct(pulseio_pwmout_obj_t* self,
|
||||||
|
const mcu_pin_obj_t* pin,
|
||||||
|
uint16_t duty,
|
||||||
|
uint32_t frequency,
|
||||||
|
bool variable_frequency) {
|
||||||
|
TIM_TypeDef * TIMx;
|
||||||
|
uint8_t tim_num = sizeof(mcu_tim_pin_list)/sizeof(*mcu_tim_pin_list);
|
||||||
|
bool tim_chan_taken = false;
|
||||||
|
bool tim_taken_f_mismatch = false;
|
||||||
|
bool var_freq_mismatch = false;
|
||||||
|
bool first_time_setup = true;
|
||||||
|
|
||||||
|
for(uint i = 0; i < tim_num; i++) {
|
||||||
|
mcu_tim_pin_obj_t l_tim = mcu_tim_pin_list[i];
|
||||||
|
uint8_t l_tim_index = l_tim.tim_index-1;
|
||||||
|
uint8_t l_tim_channel = l_tim.channel_index-1;
|
||||||
|
|
||||||
|
//if pin is same
|
||||||
|
if (l_tim.pin == pin) {
|
||||||
|
//check if the timer has a channel active
|
||||||
|
if (reserved_tim[l_tim_index] != 0) {
|
||||||
|
//is it the same channel? (or all channels reserved by a var-freq)
|
||||||
|
if (reserved_tim[l_tim_index] & 1<<(l_tim_channel)) {
|
||||||
|
tim_chan_taken = true;
|
||||||
|
continue; //keep looking, might be another viable option
|
||||||
|
}
|
||||||
|
//If the frequencies are the same it's ok
|
||||||
|
if (tim_frequencies[l_tim_index] != frequency) {
|
||||||
|
tim_taken_f_mismatch = true;
|
||||||
|
continue; //keep looking
|
||||||
|
}
|
||||||
|
//you can't put a variable frequency on a partially reserved timer
|
||||||
|
if (variable_frequency) {
|
||||||
|
var_freq_mismatch = true;
|
||||||
|
continue; //keep looking
|
||||||
|
}
|
||||||
|
first_time_setup = false; //skip setting up the timer
|
||||||
|
}
|
||||||
|
//No problems taken, so set it up
|
||||||
|
self->tim = &l_tim;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//handle valid/invalid timer instance
|
||||||
|
if (self->tim!=NULL) {
|
||||||
|
//create instance
|
||||||
|
TIMx = mcu_tim_banks[self->tim->tim_index-1];
|
||||||
|
//reserve timer/channel
|
||||||
|
if (variable_frequency) {
|
||||||
|
reserved_tim[self->tim->tim_index-1] = 0x0F;
|
||||||
|
} else {
|
||||||
|
reserved_tim[self->tim->tim_index-1] |= 1<<(self->tim->channel_index-1);
|
||||||
|
}
|
||||||
|
tim_frequencies[self->tim->tim_index-1] = frequency;
|
||||||
|
} else { //no match found
|
||||||
|
if (tim_chan_taken) {
|
||||||
|
mp_raise_ValueError(translate("No more timers available on this pin."));
|
||||||
|
} else if (tim_taken_f_mismatch) {
|
||||||
|
mp_raise_ValueError(translate("Frequency must be the same as as the existing PWMOut using this timer"));
|
||||||
|
} else if (var_freq_mismatch) {
|
||||||
|
mp_raise_ValueError(translate("Cannot vary frequency on a timer that is already in use"));
|
||||||
|
} else {
|
||||||
|
mp_raise_ValueError(translate("Invalid pins"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
GPIO_InitTypeDef GPIO_InitStruct = {0};
|
||||||
|
GPIO_InitStruct.Pin = pin_mask(pin->number);
|
||||||
|
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
|
||||||
|
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||||
|
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
|
||||||
|
GPIO_InitStruct.Alternate = self->tim->altfn_index;
|
||||||
|
HAL_GPIO_Init(pin_port(pin->port), &GPIO_InitStruct);
|
||||||
|
|
||||||
|
tim_clock_enable(1<<(self->tim->tim_index - 1));
|
||||||
|
|
||||||
|
//translate channel into handle value
|
||||||
|
self->channel = 4 * (self->tim->channel_index - 1);
|
||||||
|
|
||||||
|
uint32_t prescaler = 0; //prescaler is 15 bit
|
||||||
|
uint32_t period = 0; //period is 16 bit
|
||||||
|
timer_get_optimal_divisors(&period, &prescaler,frequency,timer_get_source_freq(self->tim->tim_index));
|
||||||
|
|
||||||
|
//Timer init
|
||||||
|
self->handle.Instance = TIMx;
|
||||||
|
self->handle.Init.Period = period - 1;
|
||||||
|
self->handle.Init.Prescaler = prescaler - 1;
|
||||||
|
self->handle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
|
||||||
|
self->handle.Init.CounterMode = TIM_COUNTERMODE_UP;
|
||||||
|
self->handle.Init.RepetitionCounter = 0;
|
||||||
|
|
||||||
|
//only run init if this is the first instance of this timer
|
||||||
|
if (first_time_setup) {
|
||||||
|
if (HAL_TIM_PWM_Init(&self->handle) != HAL_OK) {
|
||||||
|
mp_raise_ValueError(translate("Could not initialize timer"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Channel/PWM init
|
||||||
|
self->chan_handle.OCMode = TIM_OCMODE_PWM1;
|
||||||
|
self->chan_handle.Pulse = timer_get_internal_duty(duty, period);
|
||||||
|
self->chan_handle.OCPolarity = TIM_OCPOLARITY_LOW;
|
||||||
|
self->chan_handle.OCFastMode = TIM_OCFAST_DISABLE;
|
||||||
|
self->chan_handle.OCNPolarity = TIM_OCNPOLARITY_LOW; // needed for TIM1 and TIM8
|
||||||
|
self->chan_handle.OCIdleState = TIM_OCIDLESTATE_SET; // needed for TIM1 and TIM8
|
||||||
|
self->chan_handle.OCNIdleState = TIM_OCNIDLESTATE_SET; // needed for TIM1 and TIM8
|
||||||
|
if (HAL_TIM_PWM_ConfigChannel(&self->handle, &self->chan_handle, self->channel) != HAL_OK) {
|
||||||
|
mp_raise_ValueError(translate("Could not initialize channel"));
|
||||||
|
}
|
||||||
|
if (HAL_TIM_PWM_Start(&self->handle, self->channel) != HAL_OK) {
|
||||||
|
mp_raise_ValueError(translate("Could not start PWM"));
|
||||||
|
}
|
||||||
|
|
||||||
|
self->variable_frequency = variable_frequency;
|
||||||
|
self->frequency = frequency;
|
||||||
|
self->duty_cycle = duty;
|
||||||
|
self->period = period;
|
||||||
|
|
||||||
|
return PWMOUT_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool common_hal_pulseio_pwmout_deinited(pulseio_pwmout_obj_t* self) {
|
||||||
|
return self->tim == mp_const_none;
|
||||||
|
}
|
||||||
|
|
||||||
|
void common_hal_pulseio_pwmout_deinit(pulseio_pwmout_obj_t* self) {
|
||||||
|
if (common_hal_pulseio_pwmout_deinited(self)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
//var freq shuts down entire timer, others just their channel
|
||||||
|
if (self->variable_frequency) {
|
||||||
|
reserved_tim[self->tim->tim_index-1] = 0x00;
|
||||||
|
} else {
|
||||||
|
reserved_tim[self->tim->tim_index-1] &= ~(1<<self->tim->channel_index);
|
||||||
|
HAL_TIM_PWM_Stop(&self->handle, self->channel);
|
||||||
|
}
|
||||||
|
reset_pin_number(self->tim->pin->port,self->tim->pin->number);
|
||||||
|
self->tim = mp_const_none;
|
||||||
|
|
||||||
|
//if reserved timer has no active channels, we can disable it
|
||||||
|
if (!reserved_tim[self->tim->tim_index-1]) {
|
||||||
|
tim_frequencies[self->tim->tim_index-1] = 0x00;
|
||||||
|
tim_clock_disable(1<<(self->tim->tim_index-1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void common_hal_pulseio_pwmout_set_duty_cycle(pulseio_pwmout_obj_t* self, uint16_t duty) {
|
||||||
|
uint32_t internal_duty_cycle = timer_get_internal_duty(duty, self->period);
|
||||||
|
__HAL_TIM_SET_COMPARE(&self->handle, self->channel, internal_duty_cycle);
|
||||||
|
self->duty_cycle = duty;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t common_hal_pulseio_pwmout_get_duty_cycle(pulseio_pwmout_obj_t* self) {
|
||||||
|
return self->duty_cycle;
|
||||||
|
}
|
||||||
|
|
||||||
|
void common_hal_pulseio_pwmout_set_frequency(pulseio_pwmout_obj_t* self, uint32_t frequency) {
|
||||||
|
//don't halt setup for the same frequency
|
||||||
|
if (frequency == self->frequency) return;
|
||||||
|
|
||||||
|
uint32_t prescaler = 0;
|
||||||
|
uint32_t period = 0;
|
||||||
|
timer_get_optimal_divisors(&period, &prescaler,frequency,timer_get_source_freq(self->tim->tim_index));
|
||||||
|
|
||||||
|
//shut down
|
||||||
|
HAL_TIM_PWM_Stop(&self->handle, self->channel);
|
||||||
|
|
||||||
|
//Only change altered values
|
||||||
|
self->handle.Init.Period = period - 1;
|
||||||
|
self->handle.Init.Prescaler = prescaler - 1;
|
||||||
|
|
||||||
|
//restart everything, adjusting for new speed
|
||||||
|
if (HAL_TIM_PWM_Init(&self->handle) != HAL_OK) {
|
||||||
|
mp_raise_ValueError(translate("Could not re-init timer"));
|
||||||
|
}
|
||||||
|
|
||||||
|
self->chan_handle.Pulse = timer_get_internal_duty(self->duty_cycle, period);
|
||||||
|
|
||||||
|
if (HAL_TIM_PWM_ConfigChannel(&self->handle, &self->chan_handle, self->channel) != HAL_OK) {
|
||||||
|
mp_raise_ValueError(translate("Could not re-init channel"));
|
||||||
|
}
|
||||||
|
if (HAL_TIM_PWM_Start(&self->handle, self->channel) != HAL_OK) {
|
||||||
|
mp_raise_ValueError(translate("Could not restart PWM"));
|
||||||
|
}
|
||||||
|
|
||||||
|
tim_frequencies[self->tim->tim_index-1] = frequency;
|
||||||
|
self->frequency = frequency;
|
||||||
|
self->period = period;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t common_hal_pulseio_pwmout_get_frequency(pulseio_pwmout_obj_t* self) {
|
||||||
|
return self->frequency;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool common_hal_pulseio_pwmout_get_variable_frequency(pulseio_pwmout_obj_t* self) {
|
||||||
|
return self->variable_frequency;
|
||||||
|
}
|
||||||
|
|
||||||
|
STATIC void tim_clock_enable(uint16_t mask) {
|
||||||
|
#ifdef TIM1
|
||||||
|
if (mask & 1<<0) __HAL_RCC_TIM1_CLK_ENABLE();
|
||||||
|
#endif
|
||||||
|
#ifdef TIM2
|
||||||
|
if (mask & 1<<1) __HAL_RCC_TIM2_CLK_ENABLE();
|
||||||
|
#endif
|
||||||
|
#ifdef TIM3
|
||||||
|
if (mask & 1<<2) __HAL_RCC_TIM3_CLK_ENABLE();
|
||||||
|
#endif
|
||||||
|
#ifdef TIM4
|
||||||
|
if (mask & 1<<3) __HAL_RCC_TIM4_CLK_ENABLE();
|
||||||
|
#endif
|
||||||
|
#ifdef TIM5
|
||||||
|
if (mask & 1<<4) __HAL_RCC_TIM5_CLK_ENABLE();
|
||||||
|
#endif
|
||||||
|
//6 and 7 are reserved ADC timers
|
||||||
|
#ifdef TIM8
|
||||||
|
if (mask & 1<<7) __HAL_RCC_TIM8_CLK_ENABLE();
|
||||||
|
#endif
|
||||||
|
#ifdef TIM9
|
||||||
|
if (mask & 1<<8) __HAL_RCC_TIM9_CLK_ENABLE();
|
||||||
|
#endif
|
||||||
|
#ifdef TIM10
|
||||||
|
if (mask & 1<<9) __HAL_RCC_TIM10_CLK_ENABLE();
|
||||||
|
#endif
|
||||||
|
#ifdef TIM11
|
||||||
|
if (mask & 1<<10) __HAL_RCC_TIM11_CLK_ENABLE();
|
||||||
|
#endif
|
||||||
|
#ifdef TIM12
|
||||||
|
if (mask & 1<<11) __HAL_RCC_TIM12_CLK_ENABLE();
|
||||||
|
#endif
|
||||||
|
#ifdef TIM13
|
||||||
|
if (mask & 1<<12) __HAL_RCC_TIM13_CLK_ENABLE();
|
||||||
|
#endif
|
||||||
|
#ifdef TIM14
|
||||||
|
if (mask & 1<<13) __HAL_RCC_TIM14_CLK_ENABLE();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
STATIC void tim_clock_disable(uint16_t mask) {
|
||||||
|
#ifdef TIM1
|
||||||
|
if (mask & 1<<0) __HAL_RCC_TIM1_CLK_DISABLE();
|
||||||
|
#endif
|
||||||
|
#ifdef TIM2
|
||||||
|
if (mask & 1<<1) __HAL_RCC_TIM2_CLK_DISABLE();
|
||||||
|
#endif
|
||||||
|
#ifdef TIM3
|
||||||
|
if (mask & 1<<2) __HAL_RCC_TIM3_CLK_DISABLE();
|
||||||
|
#endif
|
||||||
|
#ifdef TIM4
|
||||||
|
if (mask & 1<<3) __HAL_RCC_TIM4_CLK_DISABLE();
|
||||||
|
#endif
|
||||||
|
#ifdef TIM5
|
||||||
|
if (mask & 1<<4) __HAL_RCC_TIM5_CLK_DISABLE();
|
||||||
|
#endif
|
||||||
|
//6 and 7 are reserved ADC timers
|
||||||
|
#ifdef TIM8
|
||||||
|
if (mask & 1<<7) __HAL_RCC_TIM8_CLK_DISABLE();
|
||||||
|
#endif
|
||||||
|
#ifdef TIM9
|
||||||
|
if (mask & 1<<8) __HAL_RCC_TIM9_CLK_DISABLE();
|
||||||
|
#endif
|
||||||
|
#ifdef TIM10
|
||||||
|
if (mask & 1<<9) __HAL_RCC_TIM10_CLK_DISABLE();
|
||||||
|
#endif
|
||||||
|
#ifdef TIM11
|
||||||
|
if (mask & 1<<10) __HAL_RCC_TIM11_CLK_DISABLE();
|
||||||
|
#endif
|
||||||
|
#ifdef TIM12
|
||||||
|
if (mask & 1<<11) __HAL_RCC_TIM12_CLK_DISABLE();
|
||||||
|
#endif
|
||||||
|
#ifdef TIM13
|
||||||
|
if (mask & 1<<12) __HAL_RCC_TIM13_CLK_DISABLE();
|
||||||
|
#endif
|
||||||
|
#ifdef TIM14
|
||||||
|
if (mask & 1<<13) __HAL_RCC_TIM14_CLK_DISABLE();
|
||||||
|
#endif
|
||||||
|
}
|
|
@ -3,8 +3,7 @@
|
||||||
*
|
*
|
||||||
* The MIT License (MIT)
|
* The MIT License (MIT)
|
||||||
*
|
*
|
||||||
* Copyright (c) 2019 Dan Halbert for Adafruit Industries
|
* Copyright (c) 2019 Lucian Copeland for Adafruit Industries
|
||||||
* Copyright (c) 2018 Artur Pacholec
|
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
@ -25,19 +24,28 @@
|
||||||
* THE SOFTWARE.
|
* THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_CENTRAL_H
|
#ifndef MICROPY_INCLUDED_STM32F4_COMMON_HAL_PULSEIO_PWMOUT_H
|
||||||
#define MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_CENTRAL_H
|
#define MICROPY_INCLUDED_STM32F4_COMMON_HAL_PULSEIO_PWMOUT_H
|
||||||
|
|
||||||
#include "py/objtuple.h"
|
#include "common-hal/microcontroller/Pin.h"
|
||||||
#include "common-hal/_bleio/Central.h"
|
|
||||||
#include "common-hal/_bleio/Service.h"
|
|
||||||
|
|
||||||
extern const mp_obj_type_t bleio_central_type;
|
#include "stm32f4xx_hal.h"
|
||||||
|
#include "stm32f4/periph.h"
|
||||||
|
|
||||||
extern void common_hal_bleio_central_construct(bleio_central_obj_t *self);
|
#include "py/obj.h"
|
||||||
extern void common_hal_bleio_central_connect(bleio_central_obj_t *self, bleio_address_obj_t *address, mp_float_t timeout);
|
|
||||||
extern void common_hal_bleio_central_disconnect(bleio_central_obj_t *self);
|
|
||||||
extern bool common_hal_bleio_central_get_connected(bleio_central_obj_t *self);
|
|
||||||
extern mp_obj_tuple_t *common_hal_bleio_central_discover_remote_services(bleio_central_obj_t *self, mp_obj_t service_uuids_whitelist);
|
|
||||||
|
|
||||||
#endif // MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_CENTRAL_H
|
typedef struct {
|
||||||
|
mp_obj_base_t base;
|
||||||
|
TIM_HandleTypeDef handle;
|
||||||
|
TIM_OC_InitTypeDef chan_handle;
|
||||||
|
const mcu_tim_pin_obj_t *tim;
|
||||||
|
uint8_t channel: 7;
|
||||||
|
bool variable_frequency: 1;
|
||||||
|
uint16_t duty_cycle;
|
||||||
|
uint32_t frequency;
|
||||||
|
uint32_t period;
|
||||||
|
} pulseio_pwmout_obj_t;
|
||||||
|
|
||||||
|
void pwmout_reset(void);
|
||||||
|
|
||||||
|
#endif // MICROPY_INCLUDED_STM32F4_COMMON_HAL_PULSEIO_PWMOUT_H
|
|
@ -0,0 +1,79 @@
|
||||||
|
/*
|
||||||
|
* This file is part of the MicroPython project, http://micropython.org/
|
||||||
|
*
|
||||||
|
* The MIT License (MIT)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2019 Lucian Copeland for Adafruit Industries
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "common-hal/pulseio/PulseIn.h"
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include "py/mpconfig.h"
|
||||||
|
#include "py/gc.h"
|
||||||
|
#include "py/runtime.h"
|
||||||
|
#include "shared-bindings/microcontroller/__init__.h"
|
||||||
|
#include "shared-bindings/pulseio/PulseIn.h"
|
||||||
|
#include "tick.h"
|
||||||
|
|
||||||
|
void pulsein_reset(void) {
|
||||||
|
}
|
||||||
|
|
||||||
|
void common_hal_pulseio_pulsein_construct(pulseio_pulsein_obj_t* self, const mcu_pin_obj_t* pin,
|
||||||
|
uint16_t maxlen, bool idle_state) {
|
||||||
|
mp_raise_NotImplementedError(translate("PulseIn not yet supported"));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool common_hal_pulseio_pulsein_deinited(pulseio_pulsein_obj_t* self) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void common_hal_pulseio_pulsein_deinit(pulseio_pulsein_obj_t* self) {
|
||||||
|
}
|
||||||
|
|
||||||
|
void common_hal_pulseio_pulsein_pause(pulseio_pulsein_obj_t* self) {
|
||||||
|
}
|
||||||
|
|
||||||
|
void common_hal_pulseio_pulsein_resume(pulseio_pulsein_obj_t* self, uint16_t trigger_duration) {
|
||||||
|
}
|
||||||
|
|
||||||
|
void common_hal_pulseio_pulsein_clear(pulseio_pulsein_obj_t* self) {
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t common_hal_pulseio_pulsein_get_item(pulseio_pulsein_obj_t* self, int16_t index) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t common_hal_pulseio_pulsein_popleft(pulseio_pulsein_obj_t* self) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t common_hal_pulseio_pulsein_get_maxlen(pulseio_pulsein_obj_t* self) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool common_hal_pulseio_pulsein_get_paused(pulseio_pulsein_obj_t* self) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t common_hal_pulseio_pulsein_get_len(pulseio_pulsein_obj_t* self) {
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,53 @@
|
||||||
|
/*
|
||||||
|
* This file is part of the MicroPython project, http://micropython.org/
|
||||||
|
*
|
||||||
|
* The MIT License (MIT)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2019 Lucian Copeland for Adafruit Industries
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef MICROPY_INCLUDED_STM32F4_COMMON_HAL_PULSEIO_PULSEIN_H
|
||||||
|
#define MICROPY_INCLUDED_STM32F4_COMMON_HAL_PULSEIO_PULSEIN_H
|
||||||
|
|
||||||
|
#include "common-hal/microcontroller/Pin.h"
|
||||||
|
|
||||||
|
#include "py/obj.h"
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
mp_obj_base_t base;
|
||||||
|
|
||||||
|
uint8_t pin;
|
||||||
|
bool idle_state;
|
||||||
|
bool paused;
|
||||||
|
volatile bool first_edge;
|
||||||
|
|
||||||
|
uint16_t* buffer;
|
||||||
|
uint16_t maxlen;
|
||||||
|
|
||||||
|
volatile uint16_t start;
|
||||||
|
volatile uint16_t len;
|
||||||
|
volatile uint16_t last_us;
|
||||||
|
volatile uint64_t last_ms;
|
||||||
|
} pulseio_pulsein_obj_t;
|
||||||
|
|
||||||
|
void pulsein_reset(void);
|
||||||
|
|
||||||
|
#endif // MICROPY_INCLUDED_STM32F4_COMMON_HAL_PULSEIO_PULSEIN_H
|
|
@ -0,0 +1,55 @@
|
||||||
|
/*
|
||||||
|
* This file is part of the MicroPython project, http://micropython.org/
|
||||||
|
*
|
||||||
|
* The MIT License (MIT)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2019 Lucian Copeland for Adafruit Industries
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "common-hal/pulseio/PulseOut.h"
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "py/mpconfig.h"
|
||||||
|
#include "py/gc.h"
|
||||||
|
#include "py/runtime.h"
|
||||||
|
#include "shared-bindings/pulseio/PulseOut.h"
|
||||||
|
#include "shared-bindings/pulseio/PWMOut.h"
|
||||||
|
#include "supervisor/shared/translate.h"
|
||||||
|
|
||||||
|
|
||||||
|
void pulseout_reset() {
|
||||||
|
}
|
||||||
|
|
||||||
|
void common_hal_pulseio_pulseout_construct(pulseio_pulseout_obj_t* self,
|
||||||
|
const pulseio_pwmout_obj_t* carrier) {
|
||||||
|
mp_raise_NotImplementedError(translate("PulseOut not yet supported"));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool common_hal_pulseio_pulseout_deinited(pulseio_pulseout_obj_t* self) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void common_hal_pulseio_pulseout_deinit(pulseio_pulseout_obj_t* self) {
|
||||||
|
}
|
||||||
|
|
||||||
|
void common_hal_pulseio_pulseout_send(pulseio_pulseout_obj_t* self, uint16_t* pulses, uint16_t length) {
|
||||||
|
}
|
|
@ -3,8 +3,7 @@
|
||||||
*
|
*
|
||||||
* The MIT License (MIT)
|
* The MIT License (MIT)
|
||||||
*
|
*
|
||||||
* Copyright (c) 2019 Dan Halbert for Adafruit Industries
|
* Copyright (c) 2019 Lucian Copeland for Adafruit Industries
|
||||||
* Copyright (c) 2018 Artur Pacholec
|
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
@ -25,20 +24,19 @@
|
||||||
* THE SOFTWARE.
|
* THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef MICROPY_INCLUDED_SHARED_MODULE_BLEIO_CENTRAL_H
|
#ifndef MICROPY_INCLUDED_STM32F4_COMMON_HAL_PULSEIO_PULSEOUT_H
|
||||||
#define MICROPY_INCLUDED_SHARED_MODULE_BLEIO_CENTRAL_H
|
#define MICROPY_INCLUDED_STM32F4_COMMON_HAL_PULSEIO_PULSEOUT_H
|
||||||
|
|
||||||
#include <stdbool.h>
|
#include "common-hal/microcontroller/Pin.h"
|
||||||
|
#include "common-hal/pulseio/PWMOut.h"
|
||||||
|
|
||||||
#include "py/objlist.h"
|
#include "py/obj.h"
|
||||||
#include "shared-module/_bleio/Address.h"
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
mp_obj_base_t base;
|
mp_obj_base_t base;
|
||||||
volatile bool waiting_to_connect;
|
const pulseio_pwmout_obj_t *pwmout;
|
||||||
volatile uint16_t conn_handle;
|
} pulseio_pulseout_obj_t;
|
||||||
// Services discovered after connecting to a remote peripheral.
|
|
||||||
mp_obj_list_t *remote_service_list;
|
|
||||||
} bleio_central_obj_t;
|
|
||||||
|
|
||||||
#endif // MICROPY_INCLUDED_SHARED_MODULE_BLEIO_CENTRAL_H
|
void pulseout_reset(void);
|
||||||
|
|
||||||
|
#endif // MICROPY_INCLUDED_STM32F4_COMMON_HAL_PULSEIO_PULSEOUT_H
|
|
@ -0,0 +1 @@
|
||||||
|
// No pulseio module functions.
|
|
@ -20,6 +20,7 @@ CIRCUITPY_DIGITALIO = 1
|
||||||
CIRCUITPY_ANALOGIO = 1
|
CIRCUITPY_ANALOGIO = 1
|
||||||
CIRCUITPY_MICROCONTROLLER = 1
|
CIRCUITPY_MICROCONTROLLER = 1
|
||||||
CIRCUITPY_BUSIO = 1
|
CIRCUITPY_BUSIO = 1
|
||||||
|
CIRCUITPY_PULSEIO = 1
|
||||||
CIRCUITPY_OS = 1
|
CIRCUITPY_OS = 1
|
||||||
CIRCUITPY_STORAGE = 1
|
CIRCUITPY_STORAGE = 1
|
||||||
CIRCUITPY_RANDOM = 1
|
CIRCUITPY_RANDOM = 1
|
||||||
|
|
|
@ -99,6 +99,22 @@ typedef struct {
|
||||||
.pin = spi_pin, \
|
.pin = spi_pin, \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Timers
|
||||||
|
typedef struct {
|
||||||
|
uint8_t tim_index:4;
|
||||||
|
uint8_t altfn_index:4;
|
||||||
|
uint8_t channel_index:4;
|
||||||
|
const mcu_pin_obj_t * pin;
|
||||||
|
} mcu_tim_pin_obj_t;
|
||||||
|
|
||||||
|
#define TIM(index, alt, channel, tim_pin) \
|
||||||
|
{ \
|
||||||
|
.tim_index = index, \
|
||||||
|
.altfn_index = alt, \
|
||||||
|
.channel_index = channel, \
|
||||||
|
.pin = tim_pin, \
|
||||||
|
}
|
||||||
|
|
||||||
//Starter Lines
|
//Starter Lines
|
||||||
|
|
||||||
#ifdef STM32F411xE
|
#ifdef STM32F411xE
|
||||||
|
|
|
@ -85,4 +85,78 @@ const mcu_spi_nss_obj_t mcu_spi_nss_list[6] = {
|
||||||
SPI(3, 6, &pin_PA04),
|
SPI(3, 6, &pin_PA04),
|
||||||
SPI(3, 6, &pin_PA15),
|
SPI(3, 6, &pin_PA15),
|
||||||
};
|
};
|
||||||
//UART, Etc
|
|
||||||
|
//Timers
|
||||||
|
//TIM6 and TIM7 are basic timers that are only used by DAC, and don't have pins
|
||||||
|
TIM_TypeDef * mcu_tim_banks[14] = {TIM1, TIM2, TIM3, TIM4, TIM5, NULL, NULL, TIM8, TIM9, TIM10,
|
||||||
|
TIM11, TIM12, TIM13, TIM14};
|
||||||
|
|
||||||
|
const mcu_tim_pin_obj_t mcu_tim_pin_list[56] = {
|
||||||
|
TIM(2,1,1,&pin_PA00),
|
||||||
|
TIM(5,2,1,&pin_PA00),
|
||||||
|
TIM(2,1,2,&pin_PA01),
|
||||||
|
TIM(5,2,2,&pin_PA01),
|
||||||
|
TIM(2,1,3,&pin_PA02),
|
||||||
|
TIM(5,2,3,&pin_PA02),
|
||||||
|
TIM(2,1,4,&pin_PA03),
|
||||||
|
TIM(5,2,4,&pin_PA03),
|
||||||
|
TIM(9,3,1,&pin_PA02),
|
||||||
|
TIM(9,3,2,&pin_PA03),
|
||||||
|
TIM(3,2,1,&pin_PA06),
|
||||||
|
TIM(13,9,1,&pin_PA06),
|
||||||
|
TIM(3,2,2,&pin_PA07),
|
||||||
|
TIM(14,9,1,&pin_PA07),
|
||||||
|
TIM(1,1,1,&pin_PA08),
|
||||||
|
TIM(1,1,2,&pin_PA09),
|
||||||
|
TIM(1,1,3,&pin_PA10),
|
||||||
|
TIM(1,1,4,&pin_PA11),
|
||||||
|
TIM(2,1,1,&pin_PA15),
|
||||||
|
TIM(3,2,3,&pin_PB00),
|
||||||
|
TIM(3,2,4,&pin_PB01),
|
||||||
|
TIM(2,1,2,&pin_PB03),
|
||||||
|
TIM(3,2,1,&pin_PB04),
|
||||||
|
TIM(3,2,2,&pin_PB05),
|
||||||
|
TIM(4,2,1,&pin_PB06),
|
||||||
|
TIM(4,2,2,&pin_PB07),
|
||||||
|
TIM(4,2,3,&pin_PB08),
|
||||||
|
TIM(10,2,1,&pin_PB08),
|
||||||
|
TIM(4,2,4,&pin_PB09),
|
||||||
|
TIM(11,2,1,&pin_PB09),
|
||||||
|
TIM(2,1,3,&pin_PB10),
|
||||||
|
TIM(2,1,4,&pin_PB11),
|
||||||
|
TIM(12,9,1,&pin_PB14),
|
||||||
|
TIM(12,9,2,&pin_PB15),
|
||||||
|
TIM(3,2,1,&pin_PC06),
|
||||||
|
TIM(3,2,2,&pin_PC07),
|
||||||
|
TIM(3,2,3,&pin_PC08),
|
||||||
|
TIM(3,2,4,&pin_PC09),
|
||||||
|
TIM(8,3,1,&pin_PC06),
|
||||||
|
TIM(8,3,2,&pin_PC07),
|
||||||
|
TIM(8,3,3,&pin_PC08),
|
||||||
|
TIM(8,3,4,&pin_PC09),
|
||||||
|
TIM(4,2,1,&pin_PD12),
|
||||||
|
TIM(4,2,2,&pin_PD13),
|
||||||
|
TIM(4,2,3,&pin_PD14),
|
||||||
|
TIM(4,2,4,&pin_PD15),
|
||||||
|
TIM(9,3,1,&pin_PE05),
|
||||||
|
TIM(9,3,2,&pin_PE06),
|
||||||
|
TIM(1,1,1,&pin_PE09),
|
||||||
|
TIM(1,1,2,&pin_PE11),
|
||||||
|
TIM(1,1,3,&pin_PE13),
|
||||||
|
TIM(1,1,4,&pin_PE14),
|
||||||
|
TIM(10,3,1,&pin_PF06),
|
||||||
|
TIM(11,3,1,&pin_PF07),
|
||||||
|
TIM(13,9,1,&pin_PF08),
|
||||||
|
TIM(14,9,1,&pin_PF09),
|
||||||
|
// TIM(12,9,1,&pin_PH06), //TODO: include these when pin map is expanded
|
||||||
|
// TIM(12,9,2,&pin_PH09),
|
||||||
|
// TIM(5,2,1,&pin_PH10),
|
||||||
|
// TIM(5,2,2,&pin_PH11),
|
||||||
|
// TIM(5,2,3,&pin_PH12),
|
||||||
|
// TIM(5,2,4,&pin_PI00),
|
||||||
|
// TIM(8,3,4,&pin_PI02),
|
||||||
|
// TIM(8,3,1,&pin_PI05),
|
||||||
|
// TIM(8,3,2,&pin_PI06),
|
||||||
|
// TIM(8,3,3,&pin_PI07),
|
||||||
|
};
|
||||||
|
|
||||||
|
|
|
@ -41,5 +41,10 @@ extern const mcu_spi_mosi_obj_t mcu_spi_mosi_list[6];
|
||||||
extern const mcu_spi_miso_obj_t mcu_spi_miso_list[6];
|
extern const mcu_spi_miso_obj_t mcu_spi_miso_list[6];
|
||||||
extern const mcu_spi_nss_obj_t mcu_spi_nss_list[6];
|
extern const mcu_spi_nss_obj_t mcu_spi_nss_list[6];
|
||||||
|
|
||||||
|
#define TIM_BANK_ARRAY_LEN 14
|
||||||
|
#define TIM_PIN_ARRAY_LEN 56
|
||||||
|
TIM_TypeDef * mcu_tim_banks[TIM_BANK_ARRAY_LEN];
|
||||||
|
const mcu_tim_pin_obj_t mcu_tim_pin_list[TIM_PIN_ARRAY_LEN];
|
||||||
|
|
||||||
|
|
||||||
#endif // MICROPY_INCLUDED_STM32F4_PERIPHERALS_STM32F405XX_PERIPH_H
|
#endif // MICROPY_INCLUDED_STM32F4_PERIPHERALS_STM32F405XX_PERIPH_H
|
|
@ -120,3 +120,55 @@ const mcu_spi_nss_obj_t mcu_spi_nss_list[12] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
//UART, Etc
|
//UART, Etc
|
||||||
|
|
||||||
|
//Timers
|
||||||
|
//TIM6 and TIM7 are basic timers that are only used by DAC, and don't have pins
|
||||||
|
TIM_TypeDef * mcu_tim_banks[14] = {TIM1, TIM2, TIM3, TIM4, TIM5, NULL, NULL, NULL, TIM9, TIM10,
|
||||||
|
TIM11, NULL, NULL, NULL};
|
||||||
|
|
||||||
|
const mcu_tim_pin_obj_t mcu_tim_pin_list[44] = {
|
||||||
|
TIM(2,1,1,&pin_PA00),
|
||||||
|
TIM(5,2,1,&pin_PA00),
|
||||||
|
TIM(2,1,2,&pin_PA01),
|
||||||
|
TIM(5,2,2,&pin_PA01),
|
||||||
|
TIM(2,1,3,&pin_PA02),
|
||||||
|
TIM(5,2,3,&pin_PA02),
|
||||||
|
TIM(2,1,4,&pin_PA03),
|
||||||
|
TIM(5,2,4,&pin_PA03),
|
||||||
|
TIM(9,3,1,&pin_PA02),
|
||||||
|
TIM(9,3,2,&pin_PA03),
|
||||||
|
TIM(3,2,1,&pin_PA06),
|
||||||
|
TIM(3,2,2,&pin_PA07),
|
||||||
|
TIM(1,1,1,&pin_PA08),
|
||||||
|
TIM(1,1,2,&pin_PA09),
|
||||||
|
TIM(1,1,3,&pin_PA10),
|
||||||
|
TIM(1,1,4,&pin_PA11),
|
||||||
|
TIM(2,1,1,&pin_PA15),
|
||||||
|
TIM(3,2,3,&pin_PB00),
|
||||||
|
TIM(3,2,4,&pin_PB01),
|
||||||
|
TIM(2,1,2,&pin_PB03),
|
||||||
|
TIM(3,2,1,&pin_PB04),
|
||||||
|
TIM(3,2,2,&pin_PB05),
|
||||||
|
TIM(4,2,1,&pin_PB06),
|
||||||
|
TIM(4,2,2,&pin_PB07),
|
||||||
|
TIM(4,2,3,&pin_PB08),
|
||||||
|
TIM(10,2,1,&pin_PB08),
|
||||||
|
TIM(4,2,4,&pin_PB09),
|
||||||
|
TIM(11,2,1,&pin_PB09),
|
||||||
|
TIM(2,1,3,&pin_PB10),
|
||||||
|
TIM(3,2,1,&pin_PC06),
|
||||||
|
TIM(3,2,2,&pin_PC07),
|
||||||
|
TIM(3,2,3,&pin_PC08),
|
||||||
|
TIM(3,2,4,&pin_PC09),
|
||||||
|
TIM(4,2,1,&pin_PD12),
|
||||||
|
TIM(4,2,2,&pin_PD13),
|
||||||
|
TIM(4,2,3,&pin_PD14),
|
||||||
|
TIM(4,2,4,&pin_PD15),
|
||||||
|
TIM(9,3,1,&pin_PE05),
|
||||||
|
TIM(9,3,2,&pin_PE06),
|
||||||
|
TIM(1,1,1,&pin_PE09),
|
||||||
|
TIM(1,1,2,&pin_PE11),
|
||||||
|
TIM(1,1,3,&pin_PE13),
|
||||||
|
TIM(1,1,4,&pin_PE14),
|
||||||
|
};
|
||||||
|
|
||||||
|
|
|
@ -41,4 +41,9 @@ extern const mcu_spi_mosi_obj_t mcu_spi_mosi_list[14];
|
||||||
extern const mcu_spi_miso_obj_t mcu_spi_miso_list[12];
|
extern const mcu_spi_miso_obj_t mcu_spi_miso_list[12];
|
||||||
extern const mcu_spi_nss_obj_t mcu_spi_nss_list[12];
|
extern const mcu_spi_nss_obj_t mcu_spi_nss_list[12];
|
||||||
|
|
||||||
|
#define TIM_BANK_ARRAY_LEN 14
|
||||||
|
TIM_TypeDef * mcu_tim_banks[14];
|
||||||
|
#define TIM_PIN_ARRAY_LEN 44
|
||||||
|
const mcu_tim_pin_obj_t mcu_tim_pin_list[44];
|
||||||
|
|
||||||
#endif // MICROPY_INCLUDED_STM32F4_PERIPHERALS_STM32F411VE_PERIPH_H
|
#endif // MICROPY_INCLUDED_STM32F4_PERIPHERALS_STM32F411VE_PERIPH_H
|
|
@ -121,3 +121,71 @@ const mcu_spi_nss_obj_t mcu_spi_nss_list[12] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
//UART, Etc
|
//UART, Etc
|
||||||
|
|
||||||
|
//Timers
|
||||||
|
//TIM6 and TIM7 are basic timers that are only used by DAC, and don't have pins
|
||||||
|
TIM_TypeDef * mcu_tim_banks[14] = {TIM1, TIM2, TIM3, TIM4, TIM5, NULL, NULL, TIM8, TIM9, TIM10,
|
||||||
|
TIM11, TIM12, TIM13, TIM14};
|
||||||
|
|
||||||
|
const mcu_tim_pin_obj_t mcu_tim_pin_list[60] = {
|
||||||
|
TIM(2,1,1,&pin_PA00),
|
||||||
|
TIM(5,2,1,&pin_PA00),
|
||||||
|
TIM(2,1,2,&pin_PA01),
|
||||||
|
TIM(5,2,2,&pin_PA01),
|
||||||
|
TIM(2,1,3,&pin_PA02),
|
||||||
|
TIM(5,2,3,&pin_PA02),
|
||||||
|
TIM(2,1,4,&pin_PA03),
|
||||||
|
TIM(5,2,4,&pin_PA03),
|
||||||
|
TIM(9,3,1,&pin_PA02),
|
||||||
|
TIM(9,3,2,&pin_PA03),
|
||||||
|
TIM(3,2,1,&pin_PA06),
|
||||||
|
TIM(13,9,1,&pin_PA06),
|
||||||
|
TIM(3,2,2,&pin_PA07),
|
||||||
|
TIM(14,9,1,&pin_PA07),
|
||||||
|
TIM(1,1,1,&pin_PA08),
|
||||||
|
TIM(1,1,2,&pin_PA09),
|
||||||
|
TIM(1,1,3,&pin_PA10),
|
||||||
|
TIM(1,1,4,&pin_PA11),
|
||||||
|
TIM(2,1,1,&pin_PA15),
|
||||||
|
TIM(3,2,3,&pin_PB00),
|
||||||
|
TIM(3,2,4,&pin_PB01),
|
||||||
|
TIM(2,1,2,&pin_PB03),
|
||||||
|
TIM(3,2,1,&pin_PB04),
|
||||||
|
TIM(3,2,2,&pin_PB05),
|
||||||
|
TIM(4,2,1,&pin_PB06),
|
||||||
|
TIM(4,2,2,&pin_PB07),
|
||||||
|
TIM(4,2,3,&pin_PB08),
|
||||||
|
TIM(10,2,1,&pin_PB08),
|
||||||
|
TIM(4,2,4,&pin_PB09),
|
||||||
|
TIM(11,2,1,&pin_PB09),
|
||||||
|
TIM(2,1,3,&pin_PB10),
|
||||||
|
TIM(2,1,4,&pin_PB11),
|
||||||
|
TIM(12,9,1,&pin_PB14),
|
||||||
|
TIM(12,9,2,&pin_PB15),
|
||||||
|
TIM(3,2,1,&pin_PC06),
|
||||||
|
TIM(3,2,2,&pin_PC07),
|
||||||
|
TIM(3,2,3,&pin_PC08),
|
||||||
|
TIM(3,2,4,&pin_PC09),
|
||||||
|
TIM(8,3,1,&pin_PC06),
|
||||||
|
TIM(8,3,2,&pin_PC07),
|
||||||
|
TIM(8,3,3,&pin_PC08),
|
||||||
|
TIM(8,3,4,&pin_PC09),
|
||||||
|
TIM(4,2,1,&pin_PD12),
|
||||||
|
TIM(4,2,2,&pin_PD13),
|
||||||
|
TIM(4,2,3,&pin_PD14),
|
||||||
|
TIM(4,2,4,&pin_PD15),
|
||||||
|
TIM(9,3,1,&pin_PE05),
|
||||||
|
TIM(9,3,2,&pin_PE06),
|
||||||
|
TIM(1,1,1,&pin_PE09),
|
||||||
|
TIM(1,1,2,&pin_PE11),
|
||||||
|
TIM(1,1,3,&pin_PE13),
|
||||||
|
TIM(1,1,4,&pin_PE14),
|
||||||
|
TIM(10,3,1,&pin_PF06),
|
||||||
|
TIM(11,3,1,&pin_PF07),
|
||||||
|
TIM(13,9,1,&pin_PF08),
|
||||||
|
TIM(14,9,1,&pin_PF09),
|
||||||
|
TIM(5,2,1,&pin_PF03),
|
||||||
|
TIM(5,2,2,&pin_PF04),
|
||||||
|
TIM(5,2,3,&pin_PF05),
|
||||||
|
TIM(5,2,4,&pin_PF10),
|
||||||
|
};
|
||||||
|
|
|
@ -42,4 +42,9 @@ extern const mcu_spi_mosi_obj_t mcu_spi_mosi_list[14];
|
||||||
extern const mcu_spi_miso_obj_t mcu_spi_miso_list[12];
|
extern const mcu_spi_miso_obj_t mcu_spi_miso_list[12];
|
||||||
extern const mcu_spi_nss_obj_t mcu_spi_nss_list[12];
|
extern const mcu_spi_nss_obj_t mcu_spi_nss_list[12];
|
||||||
|
|
||||||
|
#define TIM_BANK_ARRAY_LEN 14
|
||||||
|
TIM_TypeDef * mcu_tim_banks[14];
|
||||||
|
#define TIM_PIN_ARRAY_LEN 60
|
||||||
|
const mcu_tim_pin_obj_t mcu_tim_pin_list[60];
|
||||||
|
|
||||||
#endif // MICROPY_INCLUDED_STM32F4_PERIPHERALS_STM32F411VE_PERIPH_H
|
#endif // MICROPY_INCLUDED_STM32F4_PERIPHERALS_STM32F411VE_PERIPH_H
|
|
@ -33,6 +33,7 @@
|
||||||
#include "common-hal/microcontroller/Pin.h"
|
#include "common-hal/microcontroller/Pin.h"
|
||||||
#include "common-hal/busio/I2C.h"
|
#include "common-hal/busio/I2C.h"
|
||||||
#include "common-hal/busio/SPI.h"
|
#include "common-hal/busio/SPI.h"
|
||||||
|
#include "common-hal/pulseio/PWMOut.h"
|
||||||
|
|
||||||
#include "stm32f4/clocks.h"
|
#include "stm32f4/clocks.h"
|
||||||
#include "stm32f4/gpio.h"
|
#include "stm32f4/gpio.h"
|
||||||
|
@ -57,6 +58,7 @@ void reset_port(void) {
|
||||||
reset_all_pins();
|
reset_all_pins();
|
||||||
i2c_reset();
|
i2c_reset();
|
||||||
spi_reset();
|
spi_reset();
|
||||||
|
pwmout_reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
void reset_to_bootloader(void) {
|
void reset_to_bootloader(void) {
|
||||||
|
|
|
@ -229,12 +229,10 @@ SRC_COMMON_HAL_ALL = \
|
||||||
_bleio/__init__.c \
|
_bleio/__init__.c \
|
||||||
_bleio/Adapter.c \
|
_bleio/Adapter.c \
|
||||||
_bleio/Attribute.c \
|
_bleio/Attribute.c \
|
||||||
_bleio/Central.c \
|
|
||||||
_bleio/Characteristic.c \
|
_bleio/Characteristic.c \
|
||||||
_bleio/CharacteristicBuffer.c \
|
_bleio/CharacteristicBuffer.c \
|
||||||
|
_bleio/Connection.c \
|
||||||
_bleio/Descriptor.c \
|
_bleio/Descriptor.c \
|
||||||
_bleio/Peripheral.c \
|
|
||||||
_bleio/Scanner.c \
|
|
||||||
_bleio/Service.c \
|
_bleio/Service.c \
|
||||||
_bleio/UUID.c \
|
_bleio/UUID.c \
|
||||||
analogio/AnalogIn.c \
|
analogio/AnalogIn.c \
|
||||||
|
@ -307,6 +305,7 @@ SRC_SHARED_MODULE_ALL = \
|
||||||
_bleio/Address.c \
|
_bleio/Address.c \
|
||||||
_bleio/Attribute.c \
|
_bleio/Attribute.c \
|
||||||
_bleio/ScanEntry.c \
|
_bleio/ScanEntry.c \
|
||||||
|
_bleio/ScanResults.c \
|
||||||
_pixelbuf/PixelBuf.c \
|
_pixelbuf/PixelBuf.c \
|
||||||
_pixelbuf/__init__.c \
|
_pixelbuf/__init__.c \
|
||||||
_stage/Layer.c \
|
_stage/Layer.c \
|
||||||
|
|
|
@ -99,4 +99,11 @@ static inline void ringbuf_put_n(ringbuf_t* r, uint8_t* buf, uint8_t bufsize)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void ringbuf_get_n(ringbuf_t* r, uint8_t* buf, uint8_t bufsize)
|
||||||
|
{
|
||||||
|
for(uint8_t i=0; i < bufsize; i++) {
|
||||||
|
buf[i] = ringbuf_get(r);
|
||||||
|
}
|
||||||
|
}
|
||||||
#endif // MICROPY_INCLUDED_PY_RINGBUF_H
|
#endif // MICROPY_INCLUDED_PY_RINGBUF_H
|
||||||
|
|
2
py/vm.c
2
py/vm.c
|
@ -758,7 +758,7 @@ unwind_jump:;
|
||||||
} else {
|
} else {
|
||||||
PUSH(value); // push the next iteration value
|
PUSH(value); // push the next iteration value
|
||||||
}
|
}
|
||||||
DISPATCH();
|
DISPATCH_WITH_PEND_EXC_CHECK();
|
||||||
}
|
}
|
||||||
|
|
||||||
// matched against: SETUP_EXCEPT, SETUP_FINALLY, SETUP_WITH
|
// matched against: SETUP_EXCEPT, SETUP_FINALLY, SETUP_WITH
|
||||||
|
|
|
@ -25,22 +25,45 @@
|
||||||
* THE SOFTWARE.
|
* THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
#include "py/objproperty.h"
|
#include "py/objproperty.h"
|
||||||
|
#include "py/runtime.h"
|
||||||
#include "shared-bindings/_bleio/Address.h"
|
#include "shared-bindings/_bleio/Address.h"
|
||||||
#include "shared-bindings/_bleio/Adapter.h"
|
#include "shared-bindings/_bleio/Adapter.h"
|
||||||
|
|
||||||
|
#define ADV_INTERVAL_MIN (0.0020f)
|
||||||
|
#define ADV_INTERVAL_MIN_STRING "0.0020"
|
||||||
|
#define ADV_INTERVAL_MAX (10.24f)
|
||||||
|
#define ADV_INTERVAL_MAX_STRING "10.24"
|
||||||
|
// 20ms is recommended by Apple
|
||||||
|
#define ADV_INTERVAL_DEFAULT (0.1f)
|
||||||
|
|
||||||
|
#define INTERVAL_DEFAULT (0.1f)
|
||||||
|
#define INTERVAL_MIN (0.0025f)
|
||||||
|
#define INTERVAL_MIN_STRING "0.0025"
|
||||||
|
#define INTERVAL_MAX (40.959375f)
|
||||||
|
#define INTERVAL_MAX_STRING "40.959375"
|
||||||
|
#define WINDOW_DEFAULT (0.1f)
|
||||||
|
|
||||||
//| .. currentmodule:: _bleio
|
//| .. currentmodule:: _bleio
|
||||||
//|
|
//|
|
||||||
//| :class:`Adapter` --- BLE adapter information
|
//| :class:`Adapter` --- BLE adapter
|
||||||
//| ----------------------------------------------------
|
//| ----------------------------------------------------
|
||||||
//|
|
//|
|
||||||
//| Get current status of the BLE adapter
|
//| The Adapter manages the discovery and connection to other nearby Bluetooth Low Energy devices.
|
||||||
|
//| This part of the Bluetooth Low Energy Specification is known as Generic Access Profile (GAP).
|
||||||
//|
|
//|
|
||||||
//| Usage::
|
//| Discovery of other devices happens during a scanning process that listens for small packets of
|
||||||
|
//| information, known as advertisements, that are broadcast unencrypted. The advertising packets
|
||||||
|
//| have two different uses. The first is to broadcast a small piece of data to anyone who cares and
|
||||||
|
//| and nothing more. These are known as Beacons. The second class of advertisement is to promote
|
||||||
|
//| additional functionality available after the devices establish a connection. For example, a
|
||||||
|
//| BLE keyboard may advertise that it can provide key information, but not what the key info is.
|
||||||
//|
|
//|
|
||||||
//| import _bleio
|
//| The built-in BLE adapter can do both parts of this process: it can scan for other device
|
||||||
//| _bleio.adapter.enabled = True
|
//| advertisements and it can advertise its own data. Furthermore, Adapters can accept incoming
|
||||||
//| print(_bleio.adapter.address)
|
//| connections and also initiate connections.
|
||||||
//|
|
//|
|
||||||
|
|
||||||
//| .. class:: Adapter()
|
//| .. class:: Adapter()
|
||||||
|
@ -49,19 +72,19 @@
|
||||||
//| Use `_bleio.adapter` to access the sole instance available.
|
//| Use `_bleio.adapter` to access the sole instance available.
|
||||||
//|
|
//|
|
||||||
|
|
||||||
//| .. attribute:: adapter.enabled
|
//| .. attribute:: enabled
|
||||||
//|
|
//|
|
||||||
//| State of the BLE adapter.
|
//| State of the BLE adapter.
|
||||||
//|
|
//|
|
||||||
STATIC mp_obj_t bleio_adapter_get_enabled(mp_obj_t self) {
|
STATIC mp_obj_t bleio_adapter_get_enabled(mp_obj_t self) {
|
||||||
return mp_obj_new_bool(common_hal_bleio_adapter_get_enabled());
|
return mp_obj_new_bool(common_hal_bleio_adapter_get_enabled(self));
|
||||||
}
|
}
|
||||||
MP_DEFINE_CONST_FUN_OBJ_1(bleio_adapter_get_enabled_obj, bleio_adapter_get_enabled);
|
MP_DEFINE_CONST_FUN_OBJ_1(bleio_adapter_get_enabled_obj, bleio_adapter_get_enabled);
|
||||||
|
|
||||||
static mp_obj_t bleio_adapter_set_enabled(mp_obj_t self, mp_obj_t value) {
|
static mp_obj_t bleio_adapter_set_enabled(mp_obj_t self, mp_obj_t value) {
|
||||||
const bool enabled = mp_obj_is_true(value);
|
const bool enabled = mp_obj_is_true(value);
|
||||||
|
|
||||||
common_hal_bleio_adapter_set_enabled(enabled);
|
common_hal_bleio_adapter_set_enabled(self, enabled);
|
||||||
|
|
||||||
return mp_const_none;
|
return mp_const_none;
|
||||||
}
|
}
|
||||||
|
@ -74,12 +97,12 @@ const mp_obj_property_t bleio_adapter_enabled_obj = {
|
||||||
(mp_obj_t)&mp_const_none_obj },
|
(mp_obj_t)&mp_const_none_obj },
|
||||||
};
|
};
|
||||||
|
|
||||||
//| .. attribute:: adapter.address
|
//| .. attribute:: address
|
||||||
//|
|
//|
|
||||||
//| MAC address of the BLE adapter. (read-only)
|
//| MAC address of the BLE adapter. (read-only)
|
||||||
//|
|
//|
|
||||||
STATIC mp_obj_t bleio_adapter_get_address(mp_obj_t self) {
|
STATIC mp_obj_t bleio_adapter_get_address(mp_obj_t self) {
|
||||||
return MP_OBJ_FROM_PTR(common_hal_bleio_adapter_get_address());
|
return MP_OBJ_FROM_PTR(common_hal_bleio_adapter_get_address(self));
|
||||||
|
|
||||||
}
|
}
|
||||||
MP_DEFINE_CONST_FUN_OBJ_1(bleio_adapter_get_address_obj, bleio_adapter_get_address);
|
MP_DEFINE_CONST_FUN_OBJ_1(bleio_adapter_get_address_obj, bleio_adapter_get_address);
|
||||||
|
@ -91,29 +114,260 @@ const mp_obj_property_t bleio_adapter_address_obj = {
|
||||||
(mp_obj_t)&mp_const_none_obj },
|
(mp_obj_t)&mp_const_none_obj },
|
||||||
};
|
};
|
||||||
|
|
||||||
//| .. attribute:: adapter.default_name
|
//| .. attribute:: name
|
||||||
//|
|
//|
|
||||||
//| default_name of the BLE adapter. (read-only)
|
//| name of the BLE adapter used once connected. Not used in advertisements.
|
||||||
//| The name is "CIRCUITPY" + the last four hex digits of ``adapter.address``,
|
//| The name is "CIRCUITPY" + the last four hex digits of ``adapter.address``,
|
||||||
//| to make it easy to distinguish multiple CircuitPython boards.
|
//| to make it easy to distinguish multiple CircuitPython boards.
|
||||||
//|
|
//|
|
||||||
STATIC mp_obj_t bleio_adapter_get_default_name(mp_obj_t self) {
|
STATIC mp_obj_t bleio_adapter_get_name(mp_obj_t self) {
|
||||||
return common_hal_bleio_adapter_get_default_name();
|
return MP_OBJ_FROM_PTR(common_hal_bleio_adapter_get_name(self));
|
||||||
|
}
|
||||||
|
MP_DEFINE_CONST_FUN_OBJ_1(bleio_adapter_get_name_obj, bleio_adapter_get_name);
|
||||||
|
|
||||||
|
|
||||||
|
STATIC mp_obj_t bleio_adapter_set_name(mp_obj_t self, mp_obj_t new_name) {
|
||||||
|
common_hal_bleio_adapter_set_name(self, mp_obj_str_get_str(new_name));
|
||||||
|
return mp_const_none;
|
||||||
|
}
|
||||||
|
MP_DEFINE_CONST_FUN_OBJ_2(bleio_adapter_set_name_obj, bleio_adapter_set_name);
|
||||||
|
|
||||||
|
const mp_obj_property_t bleio_adapter_name_obj = {
|
||||||
|
.base.type = &mp_type_property,
|
||||||
|
.proxy = { (mp_obj_t)&bleio_adapter_get_name_obj,
|
||||||
|
(mp_obj_t)&bleio_adapter_set_name_obj,
|
||||||
|
(mp_obj_t)&mp_const_none_obj },
|
||||||
|
};
|
||||||
|
|
||||||
|
//| .. method:: start_advertising(data, *, scan_response=None, connectable=True, interval=0.1)
|
||||||
|
//|
|
||||||
|
//| Starts advertising until `stop_advertising` is called or if connectable, another device
|
||||||
|
//| connects to us.
|
||||||
|
//|
|
||||||
|
//| :param buf data: advertising data packet bytes
|
||||||
|
//| :param buf scan_response: scan response data packet bytes. ``None`` if no scan response is needed.
|
||||||
|
//| :param bool connectable: If `True` then other devices are allowed to connect to this peripheral.
|
||||||
|
//| :param float interval: advertising interval, in seconds
|
||||||
|
//|
|
||||||
|
STATIC mp_obj_t bleio_adapter_start_advertising(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
|
||||||
|
bleio_adapter_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]);
|
||||||
|
|
||||||
|
enum { ARG_data, ARG_scan_response, ARG_connectable, ARG_interval };
|
||||||
|
static const mp_arg_t allowed_args[] = {
|
||||||
|
{ MP_QSTR_data, MP_ARG_REQUIRED | MP_ARG_OBJ },
|
||||||
|
{ MP_QSTR_scan_response, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} },
|
||||||
|
{ MP_QSTR_connectable, MP_ARG_KW_ONLY | MP_ARG_BOOL, {.u_bool = true} },
|
||||||
|
{ MP_QSTR_interval, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
|
||||||
|
};
|
||||||
|
|
||||||
|
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
|
||||||
|
mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
|
||||||
|
|
||||||
|
mp_buffer_info_t data_bufinfo;
|
||||||
|
mp_get_buffer_raise(args[ARG_data].u_obj, &data_bufinfo, MP_BUFFER_READ);
|
||||||
|
|
||||||
|
// Pass an empty buffer if scan_response not provided.
|
||||||
|
mp_buffer_info_t scan_response_bufinfo = { 0 };
|
||||||
|
if (args[ARG_scan_response].u_obj != mp_const_none) {
|
||||||
|
mp_get_buffer_raise(args[ARG_scan_response].u_obj, &scan_response_bufinfo, MP_BUFFER_READ);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (args[ARG_interval].u_obj == MP_OBJ_NULL) {
|
||||||
|
args[ARG_interval].u_obj = mp_obj_new_float(ADV_INTERVAL_DEFAULT);
|
||||||
|
}
|
||||||
|
|
||||||
|
const mp_float_t interval = mp_obj_float_get(args[ARG_interval].u_obj);
|
||||||
|
if (interval < ADV_INTERVAL_MIN || interval > ADV_INTERVAL_MAX) {
|
||||||
|
mp_raise_ValueError_varg(translate("interval must be in range %s-%s"),
|
||||||
|
ADV_INTERVAL_MIN_STRING, ADV_INTERVAL_MAX_STRING);
|
||||||
|
}
|
||||||
|
|
||||||
|
common_hal_bleio_adapter_start_advertising(self, args[ARG_connectable].u_bool, interval,
|
||||||
|
&data_bufinfo, &scan_response_bufinfo);
|
||||||
|
|
||||||
|
return mp_const_none;
|
||||||
|
}
|
||||||
|
STATIC MP_DEFINE_CONST_FUN_OBJ_KW(bleio_adapter_start_advertising_obj, 2, bleio_adapter_start_advertising);
|
||||||
|
|
||||||
|
//| .. method:: stop_advertising()
|
||||||
|
//|
|
||||||
|
//| Stop sending advertising packets.
|
||||||
|
STATIC mp_obj_t bleio_adapter_stop_advertising(mp_obj_t self_in) {
|
||||||
|
bleio_adapter_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
||||||
|
|
||||||
|
common_hal_bleio_adapter_stop_advertising(self);
|
||||||
|
|
||||||
|
return mp_const_none;
|
||||||
|
}
|
||||||
|
STATIC MP_DEFINE_CONST_FUN_OBJ_1(bleio_adapter_stop_advertising_obj, bleio_adapter_stop_advertising);
|
||||||
|
|
||||||
|
//| .. method:: start_scan(prefixes=b"", \*, buffer_size=512, extended=False, timeout=None, interval=0.1, window=0.1, minimum_rssi=-80)
|
||||||
|
//|
|
||||||
|
//| Starts a BLE scan and returns an iterator of results. Advertisements and scan responses are
|
||||||
|
//| filtered and returned separately.
|
||||||
|
//|
|
||||||
|
//| :param sequence prefixes: Sequence of byte string prefixes to filter advertising packets
|
||||||
|
//| with. A packet without an advertising structure that matches one of the prefixes is
|
||||||
|
//| ignored. Format is one byte for length (n) and n bytes of prefix and can be repeated.
|
||||||
|
//| :param int buffer_size: the maximum number of advertising bytes to buffer.
|
||||||
|
//| :param bool extended: When True, support extended advertising packets. Increasing buffer_size is recommended when this is set.
|
||||||
|
//| :param float timeout: the scan timeout in seconds. If None, will scan until `stop_scan` is called.
|
||||||
|
//| :param float interval: the interval (in seconds) between the start of two consecutive scan windows
|
||||||
|
//| Must be in the range 0.0025 - 40.959375 seconds.
|
||||||
|
//| :param float window: the duration (in seconds) to scan a single BLE channel.
|
||||||
|
//| window must be <= interval.
|
||||||
|
//| :param int minimum_rssi: the minimum rssi of entries to return.
|
||||||
|
//| :param bool active: retrieve scan responses for scannable advertisements.
|
||||||
|
//| :returns: an iterable of `_bleio.ScanEntry` objects
|
||||||
|
//| :rtype: iterable
|
||||||
|
//|
|
||||||
|
STATIC mp_obj_t bleio_adapter_start_scan(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
|
||||||
|
enum { ARG_prefixes, ARG_buffer_size, ARG_extended, ARG_timeout, ARG_interval, ARG_window, ARG_minimum_rssi, ARG_active };
|
||||||
|
static const mp_arg_t allowed_args[] = {
|
||||||
|
{ MP_QSTR_prefixes, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
|
||||||
|
{ MP_QSTR_buffer_size, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 512} },
|
||||||
|
{ MP_QSTR_extended, MP_ARG_KW_ONLY | MP_ARG_BOOL, {.u_bool = false} },
|
||||||
|
{ MP_QSTR_timeout, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
|
||||||
|
{ MP_QSTR_interval, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
|
||||||
|
{ MP_QSTR_window, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
|
||||||
|
{ MP_QSTR_minimum_rssi, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = -80} },
|
||||||
|
{ MP_QSTR_active, MP_ARG_KW_ONLY | MP_ARG_BOOL, {.u_bool = true} },
|
||||||
|
};
|
||||||
|
|
||||||
|
bleio_adapter_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]);
|
||||||
|
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
|
||||||
|
mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
|
||||||
|
|
||||||
|
mp_float_t timeout = 0;
|
||||||
|
if (args[ARG_timeout].u_obj != MP_OBJ_NULL) {
|
||||||
|
timeout = mp_obj_get_float(args[ARG_timeout].u_obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (args[ARG_interval].u_obj == MP_OBJ_NULL) {
|
||||||
|
args[ARG_interval].u_obj = mp_obj_new_float(INTERVAL_DEFAULT);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (args[ARG_window].u_obj == MP_OBJ_NULL) {
|
||||||
|
args[ARG_window].u_obj = mp_obj_new_float(WINDOW_DEFAULT);
|
||||||
|
}
|
||||||
|
|
||||||
|
const mp_float_t interval = mp_obj_float_get(args[ARG_interval].u_obj);
|
||||||
|
if (interval < INTERVAL_MIN || interval > INTERVAL_MAX) {
|
||||||
|
mp_raise_ValueError_varg(translate("interval must be in range %s-%s"), INTERVAL_MIN_STRING, INTERVAL_MAX_STRING);
|
||||||
|
}
|
||||||
|
|
||||||
|
const mp_float_t window = mp_obj_float_get(args[ARG_window].u_obj);
|
||||||
|
if (window > interval) {
|
||||||
|
mp_raise_ValueError(translate("window must be <= interval"));
|
||||||
|
}
|
||||||
|
|
||||||
|
mp_buffer_info_t prefix_bufinfo;
|
||||||
|
prefix_bufinfo.len = 0;
|
||||||
|
if (args[ARG_prefixes].u_obj != MP_OBJ_NULL) {
|
||||||
|
mp_get_buffer_raise(args[ARG_prefixes].u_obj, &prefix_bufinfo, MP_BUFFER_READ);
|
||||||
|
if (gc_nbytes(prefix_bufinfo.buf) == 0) {
|
||||||
|
mp_raise_ValueError(translate("Prefix buffer must be on the heap"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return common_hal_bleio_adapter_start_scan(self, prefix_bufinfo.buf, prefix_bufinfo.len, args[ARG_extended].u_bool, args[ARG_buffer_size].u_int, timeout, interval, window, args[ARG_minimum_rssi].u_int, args[ARG_active].u_bool);
|
||||||
|
}
|
||||||
|
STATIC MP_DEFINE_CONST_FUN_OBJ_KW(bleio_adapter_start_scan_obj, 1, bleio_adapter_start_scan);
|
||||||
|
|
||||||
|
//| .. method:: stop_scan()
|
||||||
|
//|
|
||||||
|
//| Stop the current scan.
|
||||||
|
STATIC mp_obj_t bleio_adapter_stop_scan(mp_obj_t self_in) {
|
||||||
|
bleio_adapter_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
||||||
|
|
||||||
|
common_hal_bleio_adapter_stop_scan(self);
|
||||||
|
|
||||||
|
return mp_const_none;
|
||||||
|
}
|
||||||
|
STATIC MP_DEFINE_CONST_FUN_OBJ_1(bleio_adapter_stop_scan_obj, bleio_adapter_stop_scan);
|
||||||
|
|
||||||
|
//| .. attribute:: connected
|
||||||
|
//|
|
||||||
|
//| True when the adapter is connected to another device regardless of who initiated the
|
||||||
|
//| connection. (read-only)
|
||||||
|
//|
|
||||||
|
STATIC mp_obj_t bleio_adapter_get_connected(mp_obj_t self) {
|
||||||
|
return mp_obj_new_bool(common_hal_bleio_adapter_get_connected(self));
|
||||||
|
|
||||||
}
|
}
|
||||||
MP_DEFINE_CONST_FUN_OBJ_1(bleio_adapter_get_default_name_obj, bleio_adapter_get_default_name);
|
MP_DEFINE_CONST_FUN_OBJ_1(bleio_adapter_get_connected_obj, bleio_adapter_get_connected);
|
||||||
|
|
||||||
const mp_obj_property_t bleio_adapter_default_name_obj = {
|
const mp_obj_property_t bleio_adapter_connected_obj = {
|
||||||
.base.type = &mp_type_property,
|
.base.type = &mp_type_property,
|
||||||
.proxy = { (mp_obj_t)&bleio_adapter_get_default_name_obj,
|
.proxy = { (mp_obj_t)&bleio_adapter_get_connected_obj,
|
||||||
(mp_obj_t)&mp_const_none_obj,
|
(mp_obj_t)&mp_const_none_obj,
|
||||||
(mp_obj_t)&mp_const_none_obj },
|
(mp_obj_t)&mp_const_none_obj },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//| .. attribute:: connections
|
||||||
|
//|
|
||||||
|
//| Tuple of active connections including those initiated through
|
||||||
|
//| :py:meth:`_bleio.Adapter.connect`. (read-only)
|
||||||
|
//|
|
||||||
|
STATIC mp_obj_t bleio_adapter_get_connections(mp_obj_t self) {
|
||||||
|
return common_hal_bleio_adapter_get_connections(self);
|
||||||
|
}
|
||||||
|
MP_DEFINE_CONST_FUN_OBJ_1(bleio_adapter_get_connections_obj, bleio_adapter_get_connections);
|
||||||
|
|
||||||
|
const mp_obj_property_t bleio_adapter_connections_obj = {
|
||||||
|
.base.type = &mp_type_property,
|
||||||
|
.proxy = { (mp_obj_t)&bleio_adapter_get_connections_obj,
|
||||||
|
(mp_obj_t)&mp_const_none_obj,
|
||||||
|
(mp_obj_t)&mp_const_none_obj },
|
||||||
|
};
|
||||||
|
|
||||||
|
//| .. method:: connect(address, *, timeout, pair=False)
|
||||||
|
//|
|
||||||
|
//| Attempts a connection to the device with the given address.
|
||||||
|
//|
|
||||||
|
//| :param Address address: The address of the peripheral to connect to
|
||||||
|
//| :param float/int timeout: Try to connect for timeout seconds.
|
||||||
|
//|
|
||||||
|
STATIC mp_obj_t bleio_adapter_connect(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
|
||||||
|
bleio_adapter_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]);
|
||||||
|
|
||||||
|
enum { ARG_address, ARG_timeout, ARG_pair };
|
||||||
|
static const mp_arg_t allowed_args[] = {
|
||||||
|
{ MP_QSTR_address, MP_ARG_REQUIRED | MP_ARG_OBJ },
|
||||||
|
{ MP_QSTR_timeout, MP_ARG_KW_ONLY | MP_ARG_REQUIRED | MP_ARG_OBJ },
|
||||||
|
{ MP_QSTR_pair, MP_ARG_KW_ONLY | MP_ARG_BOOL, { .u_bool = false } },
|
||||||
|
};
|
||||||
|
|
||||||
|
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
|
||||||
|
mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
|
||||||
|
|
||||||
|
if (!MP_OBJ_IS_TYPE(args[ARG_address].u_obj, &bleio_address_type)) {
|
||||||
|
mp_raise_ValueError(translate("Expected an Address"));
|
||||||
|
}
|
||||||
|
|
||||||
|
bleio_address_obj_t *address = MP_OBJ_TO_PTR(args[ARG_address].u_obj);
|
||||||
|
mp_float_t timeout = mp_obj_get_float(args[ARG_timeout].u_obj);
|
||||||
|
|
||||||
|
return common_hal_bleio_adapter_connect(self, address, timeout, args[ARG_pair].u_bool);
|
||||||
|
}
|
||||||
|
STATIC MP_DEFINE_CONST_FUN_OBJ_KW(bleio_adapter_connect_obj, 2, bleio_adapter_connect);
|
||||||
|
|
||||||
|
|
||||||
STATIC const mp_rom_map_elem_t bleio_adapter_locals_dict_table[] = {
|
STATIC const mp_rom_map_elem_t bleio_adapter_locals_dict_table[] = {
|
||||||
{ MP_ROM_QSTR(MP_QSTR_enabled), MP_ROM_PTR(&bleio_adapter_enabled_obj) },
|
{ MP_ROM_QSTR(MP_QSTR_enabled), MP_ROM_PTR(&bleio_adapter_enabled_obj) },
|
||||||
{ MP_ROM_QSTR(MP_QSTR_address), MP_ROM_PTR(&bleio_adapter_address_obj) },
|
{ MP_ROM_QSTR(MP_QSTR_address), MP_ROM_PTR(&bleio_adapter_address_obj) },
|
||||||
{ MP_ROM_QSTR(MP_QSTR_default_name), MP_ROM_PTR(&bleio_adapter_default_name_obj) },
|
{ MP_ROM_QSTR(MP_QSTR_name), MP_ROM_PTR(&bleio_adapter_name_obj) },
|
||||||
|
|
||||||
|
{ MP_ROM_QSTR(MP_QSTR_start_advertising), MP_ROM_PTR(&bleio_adapter_start_advertising_obj) },
|
||||||
|
{ MP_ROM_QSTR(MP_QSTR_stop_advertising), MP_ROM_PTR(&bleio_adapter_stop_advertising_obj) },
|
||||||
|
|
||||||
|
{ MP_ROM_QSTR(MP_QSTR_start_scan), MP_ROM_PTR(&bleio_adapter_start_scan_obj) },
|
||||||
|
{ MP_ROM_QSTR(MP_QSTR_stop_scan), MP_ROM_PTR(&bleio_adapter_stop_scan_obj) },
|
||||||
|
|
||||||
|
{ MP_ROM_QSTR(MP_QSTR_connect), MP_ROM_PTR(&bleio_adapter_connect_obj) },
|
||||||
|
|
||||||
|
{ MP_ROM_QSTR(MP_QSTR_connected), MP_ROM_PTR(&bleio_adapter_connected_obj) },
|
||||||
|
{ MP_ROM_QSTR(MP_QSTR_connections), MP_ROM_PTR(&bleio_adapter_connections_obj) },
|
||||||
};
|
};
|
||||||
|
|
||||||
STATIC MP_DEFINE_CONST_DICT(bleio_adapter_locals_dict, bleio_adapter_locals_dict_table);
|
STATIC MP_DEFINE_CONST_DICT(bleio_adapter_locals_dict, bleio_adapter_locals_dict_table);
|
||||||
|
|
|
@ -28,13 +28,33 @@
|
||||||
#ifndef MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_ADAPTER_H
|
#ifndef MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_ADAPTER_H
|
||||||
#define MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_ADAPTER_H
|
#define MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_ADAPTER_H
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "common-hal/_bleio/Adapter.h"
|
||||||
|
|
||||||
|
#include "py/objstr.h"
|
||||||
#include "shared-module/_bleio/Address.h"
|
#include "shared-module/_bleio/Address.h"
|
||||||
|
|
||||||
const mp_obj_type_t bleio_adapter_type;
|
const mp_obj_type_t bleio_adapter_type;
|
||||||
|
|
||||||
extern bool common_hal_bleio_adapter_get_enabled(void);
|
extern bool common_hal_bleio_adapter_get_enabled(bleio_adapter_obj_t *self);
|
||||||
extern void common_hal_bleio_adapter_set_enabled(bool enabled);
|
extern void common_hal_bleio_adapter_set_enabled(bleio_adapter_obj_t *self, bool enabled);
|
||||||
extern bleio_address_obj_t *common_hal_bleio_adapter_get_address(void);
|
extern bool common_hal_bleio_adapter_get_connected(bleio_adapter_obj_t *self);
|
||||||
extern mp_obj_t common_hal_bleio_adapter_get_default_name(void);
|
extern bleio_address_obj_t *common_hal_bleio_adapter_get_address(bleio_adapter_obj_t *self);
|
||||||
|
|
||||||
|
extern mp_obj_str_t* common_hal_bleio_adapter_get_name(bleio_adapter_obj_t *self);
|
||||||
|
extern void common_hal_bleio_adapter_set_name(bleio_adapter_obj_t *self, const char* name);
|
||||||
|
|
||||||
|
extern uint32_t _common_hal_bleio_adapter_start_advertising(bleio_adapter_obj_t *self, bool connectable, float interval, uint8_t *advertising_data, uint16_t advertising_data_len, uint8_t *scan_response_data, uint16_t scan_response_data_len);
|
||||||
|
|
||||||
|
extern void common_hal_bleio_adapter_start_advertising(bleio_adapter_obj_t *self, bool connectable, mp_float_t interval, mp_buffer_info_t *advertising_data_bufinfo, mp_buffer_info_t *scan_response_data_bufinfo);
|
||||||
|
void common_hal_bleio_adapter_stop_advertising(bleio_adapter_obj_t *self);
|
||||||
|
|
||||||
|
mp_obj_t common_hal_bleio_adapter_start_scan(bleio_adapter_obj_t *self, uint8_t* prefixes, size_t prefix_length, bool extended, mp_int_t buffer_size, mp_float_t timeout, mp_float_t interval, mp_float_t window, mp_int_t minimum_rssi, bool active);
|
||||||
|
void common_hal_bleio_adapter_stop_scan(bleio_adapter_obj_t *self);
|
||||||
|
|
||||||
|
bool common_hal_bleio_adapter_get_connected(bleio_adapter_obj_t *self);
|
||||||
|
mp_obj_t common_hal_bleio_adapter_get_connections(bleio_adapter_obj_t *self);
|
||||||
|
mp_obj_t common_hal_bleio_adapter_connect(bleio_adapter_obj_t *self, bleio_address_obj_t *address, mp_float_t timeout, bool pair);
|
||||||
|
|
||||||
#endif // MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_ADAPTER_H
|
#endif // MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_ADAPTER_H
|
||||||
|
|
|
@ -116,8 +116,9 @@ const mp_obj_property_t bleio_address_address_bytes_obj = {
|
||||||
//| .. attribute:: type
|
//| .. attribute:: type
|
||||||
//|
|
//|
|
||||||
//| The address type (read-only).
|
//| The address type (read-only).
|
||||||
//| One of the integer values: `PUBLIC`, `RANDOM_STATIC`,
|
//|
|
||||||
//| `RANDOM_PRIVATE_RESOLVABLE`, or `RANDOM_PRIVATE_NON_RESOLVABLE`.
|
//| One of the integer values: `PUBLIC`, `RANDOM_STATIC`, `RANDOM_PRIVATE_RESOLVABLE`,
|
||||||
|
//| or `RANDOM_PRIVATE_NON_RESOLVABLE`.
|
||||||
//|
|
//|
|
||||||
STATIC mp_obj_t bleio_address_get_type(mp_obj_t self_in) {
|
STATIC mp_obj_t bleio_address_get_type(mp_obj_t self_in) {
|
||||||
bleio_address_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
bleio_address_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
||||||
|
@ -159,6 +160,28 @@ STATIC mp_obj_t bleio_address_binary_op(mp_binary_op_t op, mp_obj_t lhs_in, mp_o
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//| .. method:: __hash__()
|
||||||
|
//|
|
||||||
|
//| Returns a hash for the Address data.
|
||||||
|
//|
|
||||||
|
STATIC mp_obj_t bleio_address_unary_op(mp_unary_op_t op, mp_obj_t self_in) {
|
||||||
|
switch (op) {
|
||||||
|
// Two Addresses are equal if their address bytes and address_type are equal
|
||||||
|
case MP_UNARY_OP_HASH: {
|
||||||
|
mp_obj_t bytes = common_hal_bleio_address_get_address_bytes(MP_OBJ_TO_PTR(self_in));
|
||||||
|
GET_STR_HASH(bytes, h);
|
||||||
|
if (h == 0) {
|
||||||
|
GET_STR_DATA_LEN(bytes, data, len);
|
||||||
|
h = qstr_compute_hash(data, len);
|
||||||
|
}
|
||||||
|
h ^= common_hal_bleio_address_get_type(MP_OBJ_TO_PTR(self_in));
|
||||||
|
return MP_OBJ_NEW_SMALL_INT(h);
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return MP_OBJ_NULL; // op not supported
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
STATIC void bleio_address_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) {
|
STATIC void bleio_address_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) {
|
||||||
bleio_address_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
bleio_address_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
||||||
mp_buffer_info_t buf_info;
|
mp_buffer_info_t buf_info;
|
||||||
|
@ -205,6 +228,7 @@ const mp_obj_type_t bleio_address_type = {
|
||||||
.name = MP_QSTR_Address,
|
.name = MP_QSTR_Address,
|
||||||
.make_new = bleio_address_make_new,
|
.make_new = bleio_address_make_new,
|
||||||
.print = bleio_address_print,
|
.print = bleio_address_print,
|
||||||
|
.unary_op = bleio_address_unary_op,
|
||||||
.binary_op = bleio_address_binary_op,
|
.binary_op = bleio_address_binary_op,
|
||||||
.locals_dict = (mp_obj_dict_t*)&bleio_address_locals_dict
|
.locals_dict = (mp_obj_dict_t*)&bleio_address_locals_dict
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,207 +0,0 @@
|
||||||
/*
|
|
||||||
* This file is part of the MicroPython project, http://micropython.org/
|
|
||||||
*
|
|
||||||
* The MIT License (MIT)
|
|
||||||
*
|
|
||||||
* Copyright (c) 2019 Dan Halbert for Adafruit Industries
|
|
||||||
* Copyright (c) 2018 Artur Pacholec
|
|
||||||
* Copyright (c) 2016 Glenn Ruben Bakke
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#include "ble_drv.h"
|
|
||||||
#include "py/objarray.h"
|
|
||||||
#include "py/objproperty.h"
|
|
||||||
#include "py/objstr.h"
|
|
||||||
#include "py/runtime.h"
|
|
||||||
#include "shared-bindings/_bleio/Adapter.h"
|
|
||||||
#include "shared-bindings/_bleio/Address.h"
|
|
||||||
#include "shared-bindings/_bleio/Characteristic.h"
|
|
||||||
#include "shared-bindings/_bleio/Central.h"
|
|
||||||
#include "shared-bindings/_bleio/Service.h"
|
|
||||||
|
|
||||||
//| .. currentmodule:: _bleio
|
|
||||||
//|
|
|
||||||
//| :class:`Central` -- A BLE central device
|
|
||||||
//| =========================================================
|
|
||||||
//|
|
|
||||||
//| Implement a BLE central, which runs locally. Can connect to a given address.
|
|
||||||
//|
|
|
||||||
//| Usage::
|
|
||||||
//|
|
|
||||||
//| import _bleio
|
|
||||||
//|
|
|
||||||
//| scanner = _bleio.Scanner()
|
|
||||||
//| entries = scanner.scan(2.5)
|
|
||||||
//|
|
|
||||||
//| my_entry = None
|
|
||||||
//| for entry in entries:
|
|
||||||
//| if entry.name is not None and entry.name == 'InterestingPeripheral':
|
|
||||||
//| my_entry = entry
|
|
||||||
//| break
|
|
||||||
//|
|
|
||||||
//| if not my_entry:
|
|
||||||
//| raise Exception("'InterestingPeripheral' not found")
|
|
||||||
//|
|
|
||||||
//| central = _bleio.Central()
|
|
||||||
//| central.connect(my_entry.address, 10) # timeout after 10 seconds
|
|
||||||
//| remote_services = central.discover_remote_services()
|
|
||||||
//|
|
|
||||||
|
|
||||||
//| .. class:: Central()
|
|
||||||
//|
|
|
||||||
//| Create a new Central object.
|
|
||||||
//|
|
|
||||||
STATIC mp_obj_t bleio_central_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
|
|
||||||
mp_arg_check_num(n_args, kw_args, 0, 0, false);
|
|
||||||
|
|
||||||
bleio_central_obj_t *self = m_new_obj(bleio_central_obj_t);
|
|
||||||
self->base.type = &bleio_central_type;
|
|
||||||
|
|
||||||
common_hal_bleio_central_construct(self);
|
|
||||||
|
|
||||||
return MP_OBJ_FROM_PTR(self);
|
|
||||||
}
|
|
||||||
|
|
||||||
//| .. method:: connect(address, timeout, *, service_uuids_whitelist=None)
|
|
||||||
//| Attempts a connection to the remote peripheral.
|
|
||||||
//|
|
|
||||||
//| :param Address address: The address of the peripheral to connect to
|
|
||||||
//| :param float/int timeout: Try to connect for timeout seconds.
|
|
||||||
//|
|
|
||||||
STATIC mp_obj_t bleio_central_connect(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
|
|
||||||
bleio_central_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]);
|
|
||||||
|
|
||||||
enum { ARG_address, ARG_timeout, ARG_service_uuids_whitelist };
|
|
||||||
static const mp_arg_t allowed_args[] = {
|
|
||||||
{ MP_QSTR_address, MP_ARG_REQUIRED | MP_ARG_OBJ },
|
|
||||||
{ MP_QSTR_timeout, MP_ARG_REQUIRED | MP_ARG_OBJ },
|
|
||||||
};
|
|
||||||
|
|
||||||
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
|
|
||||||
mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
|
|
||||||
|
|
||||||
if (!MP_OBJ_IS_TYPE(args[ARG_address].u_obj, &bleio_address_type)) {
|
|
||||||
mp_raise_ValueError(translate("Expected an Address"));
|
|
||||||
}
|
|
||||||
|
|
||||||
bleio_address_obj_t *address = MP_OBJ_TO_PTR(args[ARG_address].u_obj);
|
|
||||||
mp_float_t timeout = mp_obj_get_float(args[ARG_timeout].u_obj);
|
|
||||||
|
|
||||||
// common_hal_bleio_central_connect() will validate that services is an iterable or None.
|
|
||||||
common_hal_bleio_central_connect(self, address, timeout);
|
|
||||||
|
|
||||||
return mp_const_none;
|
|
||||||
}
|
|
||||||
STATIC MP_DEFINE_CONST_FUN_OBJ_KW(bleio_central_connect_obj, 3, bleio_central_connect);
|
|
||||||
|
|
||||||
|
|
||||||
//| .. method:: disconnect()
|
|
||||||
//|
|
|
||||||
//| Disconnects from the remote peripheral.
|
|
||||||
//|
|
|
||||||
STATIC mp_obj_t bleio_central_disconnect(mp_obj_t self_in) {
|
|
||||||
bleio_central_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
|
||||||
|
|
||||||
common_hal_bleio_central_disconnect(self);
|
|
||||||
|
|
||||||
return mp_const_none;
|
|
||||||
}
|
|
||||||
STATIC MP_DEFINE_CONST_FUN_OBJ_1(bleio_central_disconnect_obj, bleio_central_disconnect);
|
|
||||||
|
|
||||||
//| .. method:: discover_remote_services(service_uuids_whitelist=None)
|
|
||||||
//| Do BLE discovery for all services or for the given service UUIDS,
|
|
||||||
//| to find their handles and characteristics, and return the discovered services.
|
|
||||||
//| `Peripheral.connected` must be True.
|
|
||||||
//|
|
|
||||||
//| :param iterable service_uuids_whitelist: an iterable of :py:class:~`UUID` objects for the services
|
|
||||||
//| provided by the peripheral that you want to use.
|
|
||||||
//| The peripheral may provide more services, but services not listed are ignored
|
|
||||||
//| and will not be returned.
|
|
||||||
//|
|
|
||||||
//| If service_uuids_whitelist is None, then all services will undergo discovery, which can be slow.
|
|
||||||
//|
|
|
||||||
//| If the service UUID is 128-bit, or its characteristic UUID's are 128-bit, you
|
|
||||||
//| you must have already created a :py:class:~`UUID` object for that UUID in order for the
|
|
||||||
//| service or characteristic to be discovered. Creating the UUID causes the UUID to be registered
|
|
||||||
//| for use. (This restriction may be lifted in the future.)
|
|
||||||
//|
|
|
||||||
//| :return: A tuple of services provided by the remote peripheral.
|
|
||||||
//|
|
|
||||||
STATIC mp_obj_t bleio_central_discover_remote_services(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
|
|
||||||
bleio_central_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]);
|
|
||||||
|
|
||||||
enum { ARG_service_uuids_whitelist };
|
|
||||||
static const mp_arg_t allowed_args[] = {
|
|
||||||
{ MP_QSTR_service_uuids_whitelist, MP_ARG_OBJ, {.u_obj = mp_const_none} },
|
|
||||||
};
|
|
||||||
|
|
||||||
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
|
|
||||||
mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
|
|
||||||
|
|
||||||
if (!common_hal_bleio_central_get_connected(self)) {
|
|
||||||
mp_raise_ValueError(translate("Not connected"));
|
|
||||||
}
|
|
||||||
|
|
||||||
return MP_OBJ_FROM_PTR(common_hal_bleio_central_discover_remote_services(
|
|
||||||
MP_OBJ_FROM_PTR(self),
|
|
||||||
args[ARG_service_uuids_whitelist].u_obj));
|
|
||||||
}
|
|
||||||
STATIC MP_DEFINE_CONST_FUN_OBJ_KW(bleio_central_discover_remote_services_obj, 1, bleio_central_discover_remote_services);
|
|
||||||
|
|
||||||
//| .. attribute:: connected
|
|
||||||
//|
|
|
||||||
//| True if connected to a remove peripheral.
|
|
||||||
//|
|
|
||||||
STATIC mp_obj_t bleio_central_get_connected(mp_obj_t self_in) {
|
|
||||||
bleio_central_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
|
||||||
|
|
||||||
return mp_obj_new_bool(common_hal_bleio_central_get_connected(self));
|
|
||||||
}
|
|
||||||
STATIC MP_DEFINE_CONST_FUN_OBJ_1(bleio_central_get_connected_obj, bleio_central_get_connected);
|
|
||||||
|
|
||||||
const mp_obj_property_t bleio_central_connected_obj = {
|
|
||||||
.base.type = &mp_type_property,
|
|
||||||
.proxy = { (mp_obj_t)&bleio_central_get_connected_obj,
|
|
||||||
(mp_obj_t)&mp_const_none_obj,
|
|
||||||
(mp_obj_t)&mp_const_none_obj },
|
|
||||||
};
|
|
||||||
|
|
||||||
STATIC const mp_rom_map_elem_t bleio_central_locals_dict_table[] = {
|
|
||||||
// Methods
|
|
||||||
{ MP_ROM_QSTR(MP_QSTR_connect), MP_ROM_PTR(&bleio_central_connect_obj) },
|
|
||||||
{ MP_ROM_QSTR(MP_QSTR_disconnect), MP_ROM_PTR(&bleio_central_disconnect_obj) },
|
|
||||||
{ MP_ROM_QSTR(MP_QSTR_discover_remote_services), MP_ROM_PTR(&bleio_central_discover_remote_services_obj) },
|
|
||||||
|
|
||||||
// Properties
|
|
||||||
{ MP_ROM_QSTR(MP_QSTR_connected), MP_ROM_PTR(&bleio_central_connected_obj) },
|
|
||||||
};
|
|
||||||
|
|
||||||
STATIC MP_DEFINE_CONST_DICT(bleio_central_locals_dict, bleio_central_locals_dict_table);
|
|
||||||
|
|
||||||
const mp_obj_type_t bleio_central_type = {
|
|
||||||
{ &mp_type_type },
|
|
||||||
.name = MP_QSTR_Central,
|
|
||||||
.make_new = bleio_central_make_new,
|
|
||||||
.locals_dict = (mp_obj_dict_t*)&bleio_central_locals_dict
|
|
||||||
};
|
|
|
@ -45,8 +45,8 @@
|
||||||
//|
|
//|
|
||||||
//| There is no regular constructor for a Characteristic. A new local Characteristic can be created
|
//| There is no regular constructor for a Characteristic. A new local Characteristic can be created
|
||||||
//| and attached to a Service by calling `add_to_service()`.
|
//| and attached to a Service by calling `add_to_service()`.
|
||||||
//| Remote Characteristic objects are created by `Central.discover_remote_services()`
|
//| Remote Characteristic objects are created by `Connection.discover_remote_services()`
|
||||||
//| or `Peripheral.discover_remote_services()` as part of remote Services.
|
//| as part of remote Services.
|
||||||
//|
|
//|
|
||||||
|
|
||||||
//| .. method:: add_to_service(service, uuid, *, properties=0, read_perm=`Attribute.OPEN`, write_perm=`Attribute.OPEN`, max_length=20, fixed_length=False, initial_value=None)
|
//| .. method:: add_to_service(service, uuid, *, properties=0, read_perm=`Attribute.OPEN`, write_perm=`Attribute.OPEN`, max_length=20, fixed_length=False, initial_value=None)
|
||||||
|
@ -134,12 +134,10 @@ STATIC mp_obj_t bleio_characteristic_add_to_service(size_t n_args, const mp_obj_
|
||||||
// Range checking on max_length arg is done by the common_hal layer, because
|
// Range checking on max_length arg is done by the common_hal layer, because
|
||||||
// it may vary depending on underlying BLE implementation.
|
// it may vary depending on underlying BLE implementation.
|
||||||
common_hal_bleio_characteristic_construct(
|
common_hal_bleio_characteristic_construct(
|
||||||
characteristic, MP_OBJ_TO_PTR(service_obj), MP_OBJ_TO_PTR(uuid_obj),
|
characteristic, MP_OBJ_TO_PTR(service_obj), 0, MP_OBJ_TO_PTR(uuid_obj),
|
||||||
properties, read_perm, write_perm,
|
properties, read_perm, write_perm,
|
||||||
max_length, fixed_length, &initial_value_bufinfo);
|
max_length, fixed_length, &initial_value_bufinfo);
|
||||||
|
|
||||||
common_hal_bleio_service_add_characteristic(service_obj, characteristic);
|
|
||||||
|
|
||||||
return MP_OBJ_FROM_PTR(characteristic);
|
return MP_OBJ_FROM_PTR(characteristic);
|
||||||
}
|
}
|
||||||
STATIC MP_DEFINE_CONST_FUN_OBJ_KW(bleio_characteristic_add_to_service_fun_obj, 3, bleio_characteristic_add_to_service);
|
STATIC MP_DEFINE_CONST_FUN_OBJ_KW(bleio_characteristic_add_to_service_fun_obj, 3, bleio_characteristic_add_to_service);
|
||||||
|
@ -170,7 +168,8 @@ const mp_obj_property_t bleio_characteristic_properties_obj = {
|
||||||
//| .. attribute:: uuid
|
//| .. attribute:: uuid
|
||||||
//|
|
//|
|
||||||
//| The UUID of this characteristic. (read-only)
|
//| The UUID of this characteristic. (read-only)
|
||||||
//| Will be ``None`` if the 128-bit UUID for this characteristic is not known.
|
//|
|
||||||
|
//| Will be ``None`` if the 128-bit UUID for this characteristic is not known.
|
||||||
//|
|
//|
|
||||||
STATIC mp_obj_t bleio_characteristic_get_uuid(mp_obj_t self_in) {
|
STATIC mp_obj_t bleio_characteristic_get_uuid(mp_obj_t self_in) {
|
||||||
bleio_characteristic_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
bleio_characteristic_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
||||||
|
@ -194,7 +193,9 @@ const mp_obj_property_t bleio_characteristic_uuid_obj = {
|
||||||
STATIC mp_obj_t bleio_characteristic_get_value(mp_obj_t self_in) {
|
STATIC mp_obj_t bleio_characteristic_get_value(mp_obj_t self_in) {
|
||||||
bleio_characteristic_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
bleio_characteristic_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
||||||
|
|
||||||
return common_hal_bleio_characteristic_get_value(self);
|
uint8_t temp[512];
|
||||||
|
size_t actual_len = common_hal_bleio_characteristic_get_value(self, temp, sizeof(temp));
|
||||||
|
return mp_obj_new_bytearray(actual_len, temp);
|
||||||
}
|
}
|
||||||
STATIC MP_DEFINE_CONST_FUN_OBJ_1(bleio_characteristic_get_value_obj, bleio_characteristic_get_value);
|
STATIC MP_DEFINE_CONST_FUN_OBJ_1(bleio_characteristic_get_value_obj, bleio_characteristic_get_value);
|
||||||
|
|
||||||
|
@ -224,8 +225,20 @@ const mp_obj_property_t bleio_characteristic_value_obj = {
|
||||||
STATIC mp_obj_t bleio_characteristic_get_descriptors(mp_obj_t self_in) {
|
STATIC mp_obj_t bleio_characteristic_get_descriptors(mp_obj_t self_in) {
|
||||||
bleio_characteristic_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
bleio_characteristic_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
||||||
// Return list as a tuple so user won't be able to change it.
|
// Return list as a tuple so user won't be able to change it.
|
||||||
mp_obj_list_t *char_list = common_hal_bleio_characteristic_get_descriptor_list(self);
|
bleio_descriptor_obj_t *descriptors = common_hal_bleio_characteristic_get_descriptor_list(self);
|
||||||
return mp_obj_new_tuple(char_list->len, char_list->items);
|
bleio_descriptor_obj_t *head = descriptors;
|
||||||
|
size_t len = 0;
|
||||||
|
while (head != NULL) {
|
||||||
|
len++;
|
||||||
|
head = head->next;
|
||||||
|
}
|
||||||
|
mp_obj_tuple_t * t = MP_OBJ_TO_PTR(mp_obj_new_tuple(len, NULL));
|
||||||
|
head = descriptors;
|
||||||
|
for (size_t i = len - 1; i >= 0; i--) {
|
||||||
|
t->items[i] = MP_OBJ_FROM_PTR(head);
|
||||||
|
head = head->next;
|
||||||
|
}
|
||||||
|
return MP_OBJ_FROM_PTR(t);
|
||||||
}
|
}
|
||||||
STATIC MP_DEFINE_CONST_FUN_OBJ_1(bleio_characteristic_get_descriptors_obj, bleio_characteristic_get_descriptors);
|
STATIC MP_DEFINE_CONST_FUN_OBJ_1(bleio_characteristic_get_descriptors_obj, bleio_characteristic_get_descriptors);
|
||||||
|
|
||||||
|
@ -282,7 +295,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_KW(bleio_characteristic_set_cccd_obj, 1, bleio_ch
|
||||||
|
|
||||||
STATIC const mp_rom_map_elem_t bleio_characteristic_locals_dict_table[] = {
|
STATIC const mp_rom_map_elem_t bleio_characteristic_locals_dict_table[] = {
|
||||||
{ MP_ROM_QSTR(MP_QSTR_add_to_service), MP_ROM_PTR(&bleio_characteristic_add_to_service_obj) },
|
{ MP_ROM_QSTR(MP_QSTR_add_to_service), MP_ROM_PTR(&bleio_characteristic_add_to_service_obj) },
|
||||||
{ MP_ROM_QSTR(MP_QSTR_properties), MP_ROM_PTR(&bleio_characteristic_get_properties_obj) },
|
{ MP_ROM_QSTR(MP_QSTR_properties), MP_ROM_PTR(&bleio_characteristic_properties_obj) },
|
||||||
{ MP_ROM_QSTR(MP_QSTR_uuid), MP_ROM_PTR(&bleio_characteristic_uuid_obj) },
|
{ MP_ROM_QSTR(MP_QSTR_uuid), MP_ROM_PTR(&bleio_characteristic_uuid_obj) },
|
||||||
{ MP_ROM_QSTR(MP_QSTR_value), MP_ROM_PTR(&bleio_characteristic_value_obj) },
|
{ MP_ROM_QSTR(MP_QSTR_value), MP_ROM_PTR(&bleio_characteristic_value_obj) },
|
||||||
{ MP_ROM_QSTR(MP_QSTR_set_cccd), MP_ROM_PTR(&bleio_characteristic_set_cccd_obj) },
|
{ MP_ROM_QSTR(MP_QSTR_set_cccd), MP_ROM_PTR(&bleio_characteristic_set_cccd_obj) },
|
||||||
|
|
|
@ -36,12 +36,12 @@
|
||||||
|
|
||||||
extern const mp_obj_type_t bleio_characteristic_type;
|
extern const mp_obj_type_t bleio_characteristic_type;
|
||||||
|
|
||||||
extern void common_hal_bleio_characteristic_construct(bleio_characteristic_obj_t *self, bleio_service_obj_t *service, bleio_uuid_obj_t *uuid, bleio_characteristic_properties_t props, bleio_attribute_security_mode_t read_perm, bleio_attribute_security_mode_t write_perm, mp_int_t max_length, bool fixed_length, mp_buffer_info_t *initial_value_bufinfo);
|
extern void common_hal_bleio_characteristic_construct(bleio_characteristic_obj_t *self, bleio_service_obj_t *service, uint16_t handle, bleio_uuid_obj_t *uuid, bleio_characteristic_properties_t props, bleio_attribute_security_mode_t read_perm, bleio_attribute_security_mode_t write_perm, mp_int_t max_length, bool fixed_length, mp_buffer_info_t *initial_value_bufinfo);
|
||||||
extern mp_obj_t common_hal_bleio_characteristic_get_value(bleio_characteristic_obj_t *self);
|
extern size_t common_hal_bleio_characteristic_get_value(bleio_characteristic_obj_t *self, uint8_t* buf, size_t len);
|
||||||
extern void common_hal_bleio_characteristic_set_value(bleio_characteristic_obj_t *self, mp_buffer_info_t *bufinfo);
|
extern void common_hal_bleio_characteristic_set_value(bleio_characteristic_obj_t *self, mp_buffer_info_t *bufinfo);
|
||||||
extern bleio_characteristic_properties_t common_hal_bleio_characteristic_get_properties(bleio_characteristic_obj_t *self);
|
extern bleio_characteristic_properties_t common_hal_bleio_characteristic_get_properties(bleio_characteristic_obj_t *self);
|
||||||
extern bleio_uuid_obj_t *common_hal_bleio_characteristic_get_uuid(bleio_characteristic_obj_t *self);
|
extern bleio_uuid_obj_t *common_hal_bleio_characteristic_get_uuid(bleio_characteristic_obj_t *self);
|
||||||
extern mp_obj_list_t *common_hal_bleio_characteristic_get_descriptor_list(bleio_characteristic_obj_t *self);
|
extern bleio_descriptor_obj_t *common_hal_bleio_characteristic_get_descriptor_list(bleio_characteristic_obj_t *self);
|
||||||
extern bleio_service_obj_t *common_hal_bleio_characteristic_get_service(bleio_characteristic_obj_t *self);
|
extern bleio_service_obj_t *common_hal_bleio_characteristic_get_service(bleio_characteristic_obj_t *self);
|
||||||
extern void common_hal_bleio_characteristic_add_descriptor(bleio_characteristic_obj_t *self, bleio_descriptor_obj_t *descriptor);
|
extern void common_hal_bleio_characteristic_add_descriptor(bleio_characteristic_obj_t *self, bleio_descriptor_obj_t *descriptor);
|
||||||
extern void common_hal_bleio_characteristic_set_cccd(bleio_characteristic_obj_t *self, bool notify, bool indicate);
|
extern void common_hal_bleio_characteristic_set_cccd(bleio_characteristic_obj_t *self, bool notify, bool indicate);
|
||||||
|
|
|
@ -0,0 +1,171 @@
|
||||||
|
/*
|
||||||
|
* This file is part of the MicroPython project, http://micropython.org/
|
||||||
|
*
|
||||||
|
* The MIT License (MIT)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2019 Dan Halbert for Adafruit Industries
|
||||||
|
* Copyright (c) 2018 Artur Pacholec
|
||||||
|
* Copyright (c) 2016 Glenn Ruben Bakke
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "shared-bindings/_bleio/Connection.h"
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include "ble_drv.h"
|
||||||
|
#include "py/objarray.h"
|
||||||
|
#include "py/objproperty.h"
|
||||||
|
#include "py/objstr.h"
|
||||||
|
#include "py/runtime.h"
|
||||||
|
#include "shared-bindings/_bleio/Adapter.h"
|
||||||
|
#include "shared-bindings/_bleio/Address.h"
|
||||||
|
#include "shared-bindings/_bleio/Characteristic.h"
|
||||||
|
#include "shared-bindings/_bleio/Service.h"
|
||||||
|
|
||||||
|
//| .. currentmodule:: _bleio
|
||||||
|
//|
|
||||||
|
//| :class:`Connection` -- A BLE connection
|
||||||
|
//| =========================================================
|
||||||
|
//|
|
||||||
|
//| A BLE connection to another device. Used to discover and interact with services on the other
|
||||||
|
//| device.
|
||||||
|
//|
|
||||||
|
//| Usage::
|
||||||
|
//|
|
||||||
|
//| import _bleio
|
||||||
|
//|
|
||||||
|
//| my_entry = None
|
||||||
|
//| for entry in _bleio.adapter.scan(2.5):
|
||||||
|
//| if entry.name is not None and entry.name == 'InterestingPeripheral':
|
||||||
|
//| my_entry = entry
|
||||||
|
//| break
|
||||||
|
//|
|
||||||
|
//| if not my_entry:
|
||||||
|
//| raise Exception("'InterestingPeripheral' not found")
|
||||||
|
//|
|
||||||
|
//| connection = _bleio.adapter.connect(my_entry.address, timeout=10)
|
||||||
|
//|
|
||||||
|
|
||||||
|
STATIC void ensure_connected(bleio_connection_obj_t *self) {
|
||||||
|
if (!common_hal_bleio_connection_get_connected(self)) {
|
||||||
|
mp_raise_ValueError(translate("Connection has been disconnected and can no longer be used. Create a new connection."));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//| .. class:: Connection()
|
||||||
|
//|
|
||||||
|
//| Connections cannot be made directly. Instead, to initiate a connection use `Adapter.connect`.
|
||||||
|
//| Connections may also be made when another device initiates a connection. To use a Connection
|
||||||
|
//| created by a peer, read the `Adapter.connections` property.
|
||||||
|
//|
|
||||||
|
//| .. method:: disconnect()
|
||||||
|
//|
|
||||||
|
//| Disconnects from the remote peripheral.
|
||||||
|
//|
|
||||||
|
STATIC mp_obj_t bleio_connection_disconnect(mp_obj_t self_in) {
|
||||||
|
bleio_connection_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
||||||
|
ensure_connected(self);
|
||||||
|
|
||||||
|
common_hal_bleio_connection_disconnect(self->connection);
|
||||||
|
|
||||||
|
return mp_const_none;
|
||||||
|
}
|
||||||
|
STATIC MP_DEFINE_CONST_FUN_OBJ_1(bleio_connection_disconnect_obj, bleio_connection_disconnect);
|
||||||
|
|
||||||
|
//| .. method:: discover_remote_services(service_uuids_whitelist=None)
|
||||||
|
//|
|
||||||
|
//| Do BLE discovery for all services or for the given service UUIDS,
|
||||||
|
//| to find their handles and characteristics, and return the discovered services.
|
||||||
|
//| `Connection.connected` must be True.
|
||||||
|
//|
|
||||||
|
//| :param iterable service_uuids_whitelist:
|
||||||
|
//|
|
||||||
|
//| an iterable of :py:class:~`UUID` objects for the services provided by the peripheral
|
||||||
|
//| that you want to use.
|
||||||
|
//|
|
||||||
|
//| The peripheral may provide more services, but services not listed are ignored
|
||||||
|
//| and will not be returned.
|
||||||
|
//|
|
||||||
|
//| If service_uuids_whitelist is None, then all services will undergo discovery, which can be
|
||||||
|
//| slow.
|
||||||
|
//|
|
||||||
|
//| If the service UUID is 128-bit, or its characteristic UUID's are 128-bit, you
|
||||||
|
//| you must have already created a :py:class:~`UUID` object for that UUID in order for the
|
||||||
|
//| service or characteristic to be discovered. Creating the UUID causes the UUID to be
|
||||||
|
//| registered for use. (This restriction may be lifted in the future.)
|
||||||
|
//|
|
||||||
|
//| :return: A tuple of `_bleio.Service` objects provided by the remote peripheral.
|
||||||
|
//|
|
||||||
|
STATIC mp_obj_t bleio_connection_discover_remote_services(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
|
||||||
|
bleio_connection_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]);
|
||||||
|
|
||||||
|
enum { ARG_service_uuids_whitelist };
|
||||||
|
static const mp_arg_t allowed_args[] = {
|
||||||
|
{ MP_QSTR_service_uuids_whitelist, MP_ARG_OBJ, {.u_obj = mp_const_none} },
|
||||||
|
};
|
||||||
|
|
||||||
|
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
|
||||||
|
mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
|
||||||
|
|
||||||
|
ensure_connected(self);
|
||||||
|
|
||||||
|
return MP_OBJ_FROM_PTR(common_hal_bleio_connection_discover_remote_services(
|
||||||
|
self,
|
||||||
|
args[ARG_service_uuids_whitelist].u_obj));
|
||||||
|
}
|
||||||
|
STATIC MP_DEFINE_CONST_FUN_OBJ_KW(bleio_connection_discover_remote_services_obj, 1, bleio_connection_discover_remote_services);
|
||||||
|
|
||||||
|
//| .. attribute:: connected
|
||||||
|
//|
|
||||||
|
//| True if connected to a remote peer.
|
||||||
|
//|
|
||||||
|
STATIC mp_obj_t bleio_connection_get_connected(mp_obj_t self_in) {
|
||||||
|
bleio_connection_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
||||||
|
|
||||||
|
return mp_obj_new_bool(common_hal_bleio_connection_get_connected(self));
|
||||||
|
}
|
||||||
|
STATIC MP_DEFINE_CONST_FUN_OBJ_1(bleio_connection_get_connected_obj, bleio_connection_get_connected);
|
||||||
|
|
||||||
|
const mp_obj_property_t bleio_connection_connected_obj = {
|
||||||
|
.base.type = &mp_type_property,
|
||||||
|
.proxy = { (mp_obj_t)&bleio_connection_get_connected_obj,
|
||||||
|
(mp_obj_t)&mp_const_none_obj,
|
||||||
|
(mp_obj_t)&mp_const_none_obj },
|
||||||
|
};
|
||||||
|
|
||||||
|
STATIC const mp_rom_map_elem_t bleio_connection_locals_dict_table[] = {
|
||||||
|
// Methods
|
||||||
|
{ MP_ROM_QSTR(MP_QSTR_disconnect), MP_ROM_PTR(&bleio_connection_disconnect_obj) },
|
||||||
|
{ MP_ROM_QSTR(MP_QSTR_discover_remote_services), MP_ROM_PTR(&bleio_connection_discover_remote_services_obj) },
|
||||||
|
|
||||||
|
// Properties
|
||||||
|
{ MP_ROM_QSTR(MP_QSTR_connected), MP_ROM_PTR(&bleio_connection_connected_obj) },
|
||||||
|
};
|
||||||
|
|
||||||
|
STATIC MP_DEFINE_CONST_DICT(bleio_connection_locals_dict, bleio_connection_locals_dict_table);
|
||||||
|
|
||||||
|
const mp_obj_type_t bleio_connection_type = {
|
||||||
|
{ &mp_type_type },
|
||||||
|
.name = MP_QSTR_Connection,
|
||||||
|
.locals_dict = (mp_obj_dict_t*)&bleio_connection_locals_dict,
|
||||||
|
.unary_op = mp_generic_unary_op,
|
||||||
|
};
|
|
@ -25,16 +25,17 @@
|
||||||
* THE SOFTWARE.
|
* THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_SCANNER_H
|
#ifndef MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_CONNECTION_H
|
||||||
#define MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_SCANNER_H
|
#define MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_CONNECTION_H
|
||||||
|
|
||||||
#include "py/objtype.h"
|
#include "py/objtuple.h"
|
||||||
#include "common-hal/_bleio/Scanner.h"
|
#include "common-hal/_bleio/Connection.h"
|
||||||
|
#include "common-hal/_bleio/Service.h"
|
||||||
|
|
||||||
extern const mp_obj_type_t bleio_scanner_type;
|
extern const mp_obj_type_t bleio_connection_type;
|
||||||
|
|
||||||
extern void common_hal_bleio_scanner_construct(bleio_scanner_obj_t *self);
|
extern void common_hal_bleio_connection_disconnect(bleio_connection_internal_t *self);
|
||||||
extern mp_obj_t common_hal_bleio_scanner_scan(bleio_scanner_obj_t *self, mp_float_t timeout, mp_float_t interval, mp_float_t window);
|
extern bool common_hal_bleio_connection_get_connected(bleio_connection_obj_t *self);
|
||||||
extern void common_hal_bleio_scanner_stop(bleio_scanner_obj_t *self);
|
extern mp_obj_tuple_t *common_hal_bleio_connection_discover_remote_services(bleio_connection_obj_t *self, mp_obj_t service_uuids_whitelist);
|
||||||
|
|
||||||
#endif // MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_SCANNER_H
|
#endif // MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_CONNECTION_H
|
|
@ -46,9 +46,8 @@
|
||||||
//|
|
//|
|
||||||
//| There is no regular constructor for a Descriptor. A new local Descriptor can be created
|
//| There is no regular constructor for a Descriptor. A new local Descriptor can be created
|
||||||
//| and attached to a Characteristic by calling `add_to_characteristic()`.
|
//| and attached to a Characteristic by calling `add_to_characteristic()`.
|
||||||
//| Remote Descriptor objects are created by `Central.discover_remote_services()`
|
//| Remote Descriptor objects are created by `Connection.discover_remote_services()`
|
||||||
//| or `Peripheral.discover_remote_services()` as part of remote Characteristics
|
//| as part of remote Characteristics in the remote Services that are discovered.
|
||||||
//| in the remote Services that are discovered.
|
|
||||||
//|
|
//|
|
||||||
//| .. classmethod:: add_to_characteristic(characteristic, uuid, *, read_perm=`Attribute.OPEN`, write_perm=`Attribute.OPEN`, max_length=20, fixed_length=False, initial_value=b'')
|
//| .. classmethod:: add_to_characteristic(characteristic, uuid, *, read_perm=`Attribute.OPEN`, write_perm=`Attribute.OPEN`, max_length=20, fixed_length=False, initial_value=b'')
|
||||||
//|
|
//|
|
||||||
|
@ -180,7 +179,9 @@ const mp_obj_property_t bleio_descriptor_characteristic_obj = {
|
||||||
STATIC mp_obj_t bleio_descriptor_get_value(mp_obj_t self_in) {
|
STATIC mp_obj_t bleio_descriptor_get_value(mp_obj_t self_in) {
|
||||||
bleio_descriptor_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
bleio_descriptor_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
||||||
|
|
||||||
return common_hal_bleio_descriptor_get_value(self);
|
uint8_t temp[512];
|
||||||
|
size_t actual_len = common_hal_bleio_descriptor_get_value(self, temp, sizeof(temp));
|
||||||
|
return mp_obj_new_bytearray(actual_len, temp);
|
||||||
}
|
}
|
||||||
STATIC MP_DEFINE_CONST_FUN_OBJ_1(bleio_descriptor_get_value_obj, bleio_descriptor_get_value);
|
STATIC MP_DEFINE_CONST_FUN_OBJ_1(bleio_descriptor_get_value_obj, bleio_descriptor_get_value);
|
||||||
|
|
||||||
|
|
|
@ -38,7 +38,7 @@ extern const mp_obj_type_t bleio_descriptor_type;
|
||||||
extern void common_hal_bleio_descriptor_construct(bleio_descriptor_obj_t *self, bleio_characteristic_obj_t *characteristic, bleio_uuid_obj_t *uuid, bleio_attribute_security_mode_t read_perm, bleio_attribute_security_mode_t write_perm, mp_int_t max_length, bool fixed_length, mp_buffer_info_t *initial_value_bufinfo);
|
extern void common_hal_bleio_descriptor_construct(bleio_descriptor_obj_t *self, bleio_characteristic_obj_t *characteristic, bleio_uuid_obj_t *uuid, bleio_attribute_security_mode_t read_perm, bleio_attribute_security_mode_t write_perm, mp_int_t max_length, bool fixed_length, mp_buffer_info_t *initial_value_bufinfo);
|
||||||
extern bleio_uuid_obj_t *common_hal_bleio_descriptor_get_uuid(bleio_descriptor_obj_t *self);
|
extern bleio_uuid_obj_t *common_hal_bleio_descriptor_get_uuid(bleio_descriptor_obj_t *self);
|
||||||
extern bleio_characteristic_obj_t *common_hal_bleio_descriptor_get_characteristic(bleio_descriptor_obj_t *self);
|
extern bleio_characteristic_obj_t *common_hal_bleio_descriptor_get_characteristic(bleio_descriptor_obj_t *self);
|
||||||
extern mp_obj_t common_hal_bleio_descriptor_get_value(bleio_descriptor_obj_t *self);
|
extern size_t common_hal_bleio_descriptor_get_value(bleio_descriptor_obj_t *self, uint8_t* buf, size_t len);
|
||||||
extern void common_hal_bleio_descriptor_set_value(bleio_descriptor_obj_t *self, mp_buffer_info_t *bufinfo);
|
extern void common_hal_bleio_descriptor_set_value(bleio_descriptor_obj_t *self, mp_buffer_info_t *bufinfo);
|
||||||
|
|
||||||
#endif // MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_DESCRIPTOR_H
|
#endif // MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_DESCRIPTOR_H
|
||||||
|
|
|
@ -1,325 +0,0 @@
|
||||||
/*
|
|
||||||
* This file is part of the MicroPython project, http://micropython.org/
|
|
||||||
*
|
|
||||||
* The MIT License (MIT)
|
|
||||||
*
|
|
||||||
* Copyright (c) 2019 Dan Halbert for Adafruit Industries
|
|
||||||
* Copyright (c) 2018 Artur Pacholec
|
|
||||||
* Copyright (c) 2016 Glenn Ruben Bakke
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#include "ble_drv.h"
|
|
||||||
#include "py/objarray.h"
|
|
||||||
#include "py/objproperty.h"
|
|
||||||
#include "py/objstr.h"
|
|
||||||
#include "py/runtime.h"
|
|
||||||
|
|
||||||
#include "shared-bindings/_bleio/Adapter.h"
|
|
||||||
#include "shared-bindings/_bleio/Characteristic.h"
|
|
||||||
#include "shared-bindings/_bleio/Peripheral.h"
|
|
||||||
#include "shared-bindings/_bleio/Service.h"
|
|
||||||
#include "shared-bindings/_bleio/UUID.h"
|
|
||||||
#include "shared-module/_bleio/ScanEntry.h"
|
|
||||||
|
|
||||||
#include "common-hal/_bleio/Peripheral.h"
|
|
||||||
|
|
||||||
#define ADV_INTERVAL_MIN (0.0020f)
|
|
||||||
#define ADV_INTERVAL_MIN_STRING "0.0020"
|
|
||||||
#define ADV_INTERVAL_MAX (10.24f)
|
|
||||||
#define ADV_INTERVAL_MAX_STRING "10.24"
|
|
||||||
// 20ms is recommended by Apple
|
|
||||||
#define ADV_INTERVAL_DEFAULT (0.1f)
|
|
||||||
|
|
||||||
//| .. currentmodule:: _bleio
|
|
||||||
//|
|
|
||||||
//| :class:`Peripheral` -- A BLE peripheral device
|
|
||||||
//| =========================================================
|
|
||||||
//|
|
|
||||||
//| Implement a BLE peripheral which runs locally.
|
|
||||||
//| Set up using the supplied services, and then allow advertising to be started and stopped.
|
|
||||||
//|
|
|
||||||
//| Usage::
|
|
||||||
//|
|
|
||||||
//| from _bleio import Characteristic, Peripheral, Service
|
|
||||||
//| from adafruit_ble.advertising import ServerAdvertisement
|
|
||||||
//|
|
|
||||||
//| # Create a peripheral and start it up.
|
|
||||||
//| peripheral = _bleio.Peripheral()
|
|
||||||
//|
|
|
||||||
//| # Create a Service and add it to this Peripheral.
|
|
||||||
//| service = Service.add_to_peripheral(peripheral, _bleio.UUID(0x180f))
|
|
||||||
//|
|
|
||||||
//| # Create a Characteristic and add it to the Service.
|
|
||||||
//| characteristic = Characteristic.add_to_service(service,
|
|
||||||
//| _bleio.UUID(0x2919), properties=Characteristic.READ | Characteristic.NOTIFY)
|
|
||||||
//|
|
|
||||||
//| adv = ServerAdvertisement(peripheral)
|
|
||||||
//| peripheral.start_advertising(adv.advertising_data_bytes, scan_response=adv.scan_response_bytes)
|
|
||||||
//|
|
|
||||||
//| while not peripheral.connected:
|
|
||||||
//| # Wait for connection.
|
|
||||||
//| pass
|
|
||||||
//|
|
|
||||||
//| .. class:: Peripheral(name=None)
|
|
||||||
//|
|
|
||||||
//| Create a new Peripheral object.
|
|
||||||
//|
|
|
||||||
//| :param str name: The name used when advertising this peripheral. If name is None,
|
|
||||||
//| _bleio.adapter.default_name will be used.
|
|
||||||
//|
|
|
||||||
STATIC mp_obj_t bleio_peripheral_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
|
|
||||||
enum { ARG_name };
|
|
||||||
static const mp_arg_t allowed_args[] = {
|
|
||||||
{ MP_QSTR_name, MP_ARG_OBJ, {.u_obj = mp_const_none} },
|
|
||||||
};
|
|
||||||
|
|
||||||
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
|
|
||||||
mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
|
|
||||||
|
|
||||||
bleio_peripheral_obj_t *self = m_new_obj(bleio_peripheral_obj_t);
|
|
||||||
self->base.type = &bleio_peripheral_type;
|
|
||||||
|
|
||||||
mp_obj_t name = args[ARG_name].u_obj;
|
|
||||||
if (name == mp_const_none) {
|
|
||||||
name = common_hal_bleio_adapter_get_default_name();
|
|
||||||
} else if (!MP_OBJ_IS_STR(name)) {
|
|
||||||
mp_raise_ValueError(translate("name must be a string"));
|
|
||||||
}
|
|
||||||
|
|
||||||
common_hal_bleio_peripheral_construct(self, name);
|
|
||||||
|
|
||||||
return MP_OBJ_FROM_PTR(self);
|
|
||||||
}
|
|
||||||
|
|
||||||
//| .. attribute:: connected (read-only)
|
|
||||||
//|
|
|
||||||
//| True if connected to a BLE Central device.
|
|
||||||
//|
|
|
||||||
STATIC mp_obj_t bleio_peripheral_get_connected(mp_obj_t self_in) {
|
|
||||||
bleio_peripheral_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
|
||||||
|
|
||||||
return mp_obj_new_bool(common_hal_bleio_peripheral_get_connected(self));
|
|
||||||
}
|
|
||||||
STATIC MP_DEFINE_CONST_FUN_OBJ_1(bleio_peripheral_get_connected_obj, bleio_peripheral_get_connected);
|
|
||||||
|
|
||||||
const mp_obj_property_t bleio_peripheral_connected_obj = {
|
|
||||||
.base.type = &mp_type_property,
|
|
||||||
.proxy = { (mp_obj_t)&bleio_peripheral_get_connected_obj,
|
|
||||||
(mp_obj_t)&mp_const_none_obj,
|
|
||||||
(mp_obj_t)&mp_const_none_obj },
|
|
||||||
};
|
|
||||||
|
|
||||||
//| .. attribute:: services
|
|
||||||
//|
|
|
||||||
//| A tuple of :py:class:`Service` objects offered by this peripheral. (read-only)
|
|
||||||
//|
|
|
||||||
STATIC mp_obj_t bleio_peripheral_get_services(mp_obj_t self_in) {
|
|
||||||
bleio_peripheral_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
|
||||||
// Return list as a tuple so user won't be able to change it.
|
|
||||||
mp_obj_list_t *services_list = common_hal_bleio_peripheral_get_services(self);
|
|
||||||
return mp_obj_new_tuple(services_list->len, services_list->items);
|
|
||||||
}
|
|
||||||
STATIC MP_DEFINE_CONST_FUN_OBJ_1(bleio_peripheral_get_services_obj, bleio_peripheral_get_services);
|
|
||||||
|
|
||||||
const mp_obj_property_t bleio_peripheral_services_obj = {
|
|
||||||
.base.type = &mp_type_property,
|
|
||||||
.proxy = { (mp_obj_t)&bleio_peripheral_get_services_obj,
|
|
||||||
(mp_obj_t)&mp_const_none_obj,
|
|
||||||
(mp_obj_t)&mp_const_none_obj },
|
|
||||||
};
|
|
||||||
|
|
||||||
//| .. attribute:: name
|
|
||||||
//|
|
|
||||||
//| The peripheral's name, included when advertising. (read-only)
|
|
||||||
//|
|
|
||||||
STATIC mp_obj_t bleio_peripheral_get_name(mp_obj_t self_in) {
|
|
||||||
bleio_peripheral_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
|
||||||
|
|
||||||
return common_hal_bleio_peripheral_get_name(self);
|
|
||||||
}
|
|
||||||
MP_DEFINE_CONST_FUN_OBJ_1(bleio_peripheral_get_name_obj, bleio_peripheral_get_name);
|
|
||||||
|
|
||||||
const mp_obj_property_t bleio_peripheral_name_obj = {
|
|
||||||
.base.type = &mp_type_property,
|
|
||||||
.proxy = { (mp_obj_t)&bleio_peripheral_get_name_obj,
|
|
||||||
(mp_obj_t)&mp_const_none_obj,
|
|
||||||
(mp_obj_t)&mp_const_none_obj },
|
|
||||||
};
|
|
||||||
|
|
||||||
//| .. method:: start_advertising(data, *, scan_response=None, connectable=True, interval=0.1)
|
|
||||||
//|
|
|
||||||
//| Starts advertising the peripheral. The peripheral's name and
|
|
||||||
//| services are included in the advertisement packets.
|
|
||||||
//|
|
|
||||||
//| :param buf data: advertising data packet bytes
|
|
||||||
//| :param buf scan_response: scan response data packet bytes. ``None`` if no scan response is needed.
|
|
||||||
//| :param bool connectable: If `True` then other devices are allowed to connect to this peripheral.
|
|
||||||
//| :param float interval: advertising interval, in seconds
|
|
||||||
//|
|
|
||||||
STATIC mp_obj_t bleio_peripheral_start_advertising(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
|
|
||||||
bleio_peripheral_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]);
|
|
||||||
|
|
||||||
enum { ARG_data, ARG_scan_response, ARG_connectable, ARG_interval };
|
|
||||||
static const mp_arg_t allowed_args[] = {
|
|
||||||
{ MP_QSTR_data, MP_ARG_REQUIRED | MP_ARG_OBJ },
|
|
||||||
{ MP_QSTR_scan_response, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} },
|
|
||||||
{ MP_QSTR_connectable, MP_ARG_KW_ONLY | MP_ARG_BOOL, {.u_bool = true} },
|
|
||||||
{ MP_QSTR_interval, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
|
|
||||||
};
|
|
||||||
|
|
||||||
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
|
|
||||||
mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
|
|
||||||
|
|
||||||
mp_buffer_info_t data_bufinfo;
|
|
||||||
mp_get_buffer_raise(args[ARG_data].u_obj, &data_bufinfo, MP_BUFFER_READ);
|
|
||||||
|
|
||||||
// Pass an empty buffer if scan_response not provided.
|
|
||||||
mp_buffer_info_t scan_response_bufinfo = { 0 };
|
|
||||||
if (args[ARG_scan_response].u_obj != mp_const_none) {
|
|
||||||
mp_get_buffer_raise(args[ARG_scan_response].u_obj, &scan_response_bufinfo, MP_BUFFER_READ);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (args[ARG_interval].u_obj == MP_OBJ_NULL) {
|
|
||||||
args[ARG_interval].u_obj = mp_obj_new_float(ADV_INTERVAL_DEFAULT);
|
|
||||||
}
|
|
||||||
|
|
||||||
const mp_float_t interval = mp_obj_float_get(args[ARG_interval].u_obj);
|
|
||||||
if (interval < ADV_INTERVAL_MIN || interval > ADV_INTERVAL_MAX) {
|
|
||||||
mp_raise_ValueError_varg(translate("interval must be in range %s-%s"),
|
|
||||||
ADV_INTERVAL_MIN_STRING, ADV_INTERVAL_MAX_STRING);
|
|
||||||
}
|
|
||||||
|
|
||||||
common_hal_bleio_peripheral_start_advertising(self, args[ARG_connectable].u_bool, interval,
|
|
||||||
&data_bufinfo, &scan_response_bufinfo);
|
|
||||||
|
|
||||||
return mp_const_none;
|
|
||||||
}
|
|
||||||
STATIC MP_DEFINE_CONST_FUN_OBJ_KW(bleio_peripheral_start_advertising_obj, 2, bleio_peripheral_start_advertising);
|
|
||||||
|
|
||||||
//| .. method:: stop_advertising()
|
|
||||||
//|
|
|
||||||
//| Stop sending advertising packets.
|
|
||||||
STATIC mp_obj_t bleio_peripheral_stop_advertising(mp_obj_t self_in) {
|
|
||||||
bleio_peripheral_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
|
||||||
|
|
||||||
common_hal_bleio_peripheral_stop_advertising(self);
|
|
||||||
|
|
||||||
return mp_const_none;
|
|
||||||
}
|
|
||||||
STATIC MP_DEFINE_CONST_FUN_OBJ_1(bleio_peripheral_stop_advertising_obj, bleio_peripheral_stop_advertising);
|
|
||||||
|
|
||||||
//| .. method:: disconnect()
|
|
||||||
//|
|
|
||||||
//| Disconnects from the remote central.
|
|
||||||
//| Normally the central initiates a disconnection. Use this only
|
|
||||||
//| if necessary for your application.
|
|
||||||
//|
|
|
||||||
STATIC mp_obj_t bleio_peripheral_disconnect(mp_obj_t self_in) {
|
|
||||||
bleio_peripheral_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
|
||||||
|
|
||||||
common_hal_bleio_peripheral_disconnect(self);
|
|
||||||
|
|
||||||
return mp_const_none;
|
|
||||||
}
|
|
||||||
STATIC MP_DEFINE_CONST_FUN_OBJ_1(bleio_peripheral_disconnect_obj, bleio_peripheral_disconnect);
|
|
||||||
|
|
||||||
//| .. method:: discover_remote_services(service_uuids_whitelist=None)
|
|
||||||
//| Do BLE discovery for all services or for the given service UUIDS,
|
|
||||||
//| to find their handles and characteristics, and return the discovered services.
|
|
||||||
//| `Peripheral.connected` must be True.
|
|
||||||
//|
|
|
||||||
//| :param iterable service_uuids_whitelist: an iterable of :py:class:~`UUID` objects for the services
|
|
||||||
//| provided by the peripheral that you want to use.
|
|
||||||
//| The peripheral may provide more services, but services not listed are ignored
|
|
||||||
//| and will not be returned.
|
|
||||||
//|
|
|
||||||
//| If service_uuids_whitelist is None, then all services will undergo discovery, which can be slow.
|
|
||||||
//|
|
|
||||||
//| If the service UUID is 128-bit, or its characteristic UUID's are 128-bit, you
|
|
||||||
//| you must have already created a :py:class:~`UUID` object for that UUID in order for the
|
|
||||||
//| service or characteristic to be discovered. Creating the UUID causes the UUID to be registered
|
|
||||||
//| for use. (This restriction may be lifted in the future.)
|
|
||||||
//|
|
|
||||||
//| Thought it is unusual for a peripheral to act as a BLE client, it can do so, and
|
|
||||||
//| needs to be able to do discovery on its peer (a central).
|
|
||||||
//| Examples include a peripheral accessing a central that provides Current Time Service,
|
|
||||||
//| Apple Notification Center Service, or Battery Service.
|
|
||||||
//|
|
|
||||||
//| :return: A tuple of services provided by the remote central.
|
|
||||||
//|
|
|
||||||
STATIC mp_obj_t bleio_peripheral_discover_remote_services(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
|
|
||||||
bleio_peripheral_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]);
|
|
||||||
|
|
||||||
enum { ARG_service_uuids_whitelist };
|
|
||||||
static const mp_arg_t allowed_args[] = {
|
|
||||||
{ MP_QSTR_service_uuids_whitelist, MP_ARG_OBJ, {.u_obj = mp_const_none} },
|
|
||||||
};
|
|
||||||
|
|
||||||
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
|
|
||||||
mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
|
|
||||||
|
|
||||||
if (!common_hal_bleio_peripheral_get_connected(self)) {
|
|
||||||
mp_raise_ValueError(translate("Not connected"));
|
|
||||||
}
|
|
||||||
|
|
||||||
return MP_OBJ_FROM_PTR(common_hal_bleio_peripheral_discover_remote_services(
|
|
||||||
MP_OBJ_FROM_PTR(self),
|
|
||||||
args[ARG_service_uuids_whitelist].u_obj));
|
|
||||||
}
|
|
||||||
STATIC MP_DEFINE_CONST_FUN_OBJ_KW(bleio_peripheral_discover_remote_services_obj, 1, bleio_peripheral_discover_remote_services);
|
|
||||||
|
|
||||||
//| .. method:: pair()
|
|
||||||
//|
|
|
||||||
//| Request pairing with connected central.
|
|
||||||
STATIC mp_obj_t bleio_peripheral_pair(mp_obj_t self_in) {
|
|
||||||
bleio_peripheral_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
|
||||||
|
|
||||||
common_hal_bleio_peripheral_pair(self);
|
|
||||||
|
|
||||||
return mp_const_none;
|
|
||||||
}
|
|
||||||
STATIC MP_DEFINE_CONST_FUN_OBJ_1(bleio_peripheral_pair_obj, bleio_peripheral_pair);
|
|
||||||
|
|
||||||
STATIC const mp_rom_map_elem_t bleio_peripheral_locals_dict_table[] = {
|
|
||||||
// Methods
|
|
||||||
{ MP_ROM_QSTR(MP_QSTR_start_advertising), MP_ROM_PTR(&bleio_peripheral_start_advertising_obj) },
|
|
||||||
{ MP_ROM_QSTR(MP_QSTR_stop_advertising), MP_ROM_PTR(&bleio_peripheral_stop_advertising_obj) },
|
|
||||||
{ MP_ROM_QSTR(MP_QSTR_disconnect), MP_ROM_PTR(&bleio_peripheral_disconnect_obj) },
|
|
||||||
{ MP_ROM_QSTR(MP_QSTR_discover_remote_services), MP_ROM_PTR(&bleio_peripheral_discover_remote_services_obj) },
|
|
||||||
{ MP_ROM_QSTR(MP_QSTR_pair), MP_ROM_PTR(&bleio_peripheral_pair_obj) },
|
|
||||||
|
|
||||||
// Properties
|
|
||||||
{ MP_ROM_QSTR(MP_QSTR_connected), MP_ROM_PTR(&bleio_peripheral_connected_obj) },
|
|
||||||
{ MP_ROM_QSTR(MP_QSTR_name), MP_ROM_PTR(&bleio_peripheral_name_obj) },
|
|
||||||
{ MP_ROM_QSTR(MP_QSTR_services), MP_ROM_PTR(&bleio_peripheral_services_obj) },
|
|
||||||
};
|
|
||||||
|
|
||||||
STATIC MP_DEFINE_CONST_DICT(bleio_peripheral_locals_dict, bleio_peripheral_locals_dict_table);
|
|
||||||
|
|
||||||
const mp_obj_type_t bleio_peripheral_type = {
|
|
||||||
{ &mp_type_type },
|
|
||||||
.name = MP_QSTR_Peripheral,
|
|
||||||
.make_new = bleio_peripheral_make_new,
|
|
||||||
.locals_dict = (mp_obj_dict_t*)&bleio_peripheral_locals_dict
|
|
||||||
};
|
|
|
@ -1,48 +0,0 @@
|
||||||
/*
|
|
||||||
* This file is part of the MicroPython project, http://micropython.org/
|
|
||||||
*
|
|
||||||
* The MIT License (MIT)
|
|
||||||
*
|
|
||||||
* Copyright (c) 2019 Dan Halbert for Adafruit Industries
|
|
||||||
* Copyright (c) 2018 Artur Pacholec
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_PERIPHERAL_H
|
|
||||||
#define MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_PERIPHERAL_H
|
|
||||||
|
|
||||||
#include "py/objtuple.h"
|
|
||||||
#include "common-hal/_bleio/Peripheral.h"
|
|
||||||
#include "common-hal/_bleio/Service.h"
|
|
||||||
|
|
||||||
extern const mp_obj_type_t bleio_peripheral_type;
|
|
||||||
|
|
||||||
extern void common_hal_bleio_peripheral_construct(bleio_peripheral_obj_t *self, mp_obj_t name);
|
|
||||||
extern void common_hal_bleio_peripheral_add_service(bleio_peripheral_obj_t *self, bleio_service_obj_t *service);
|
|
||||||
extern mp_obj_list_t *common_hal_bleio_peripheral_get_services(bleio_peripheral_obj_t *self);
|
|
||||||
extern bool common_hal_bleio_peripheral_get_connected(bleio_peripheral_obj_t *self);
|
|
||||||
extern mp_obj_t common_hal_bleio_peripheral_get_name(bleio_peripheral_obj_t *self);
|
|
||||||
extern void common_hal_bleio_peripheral_start_advertising(bleio_peripheral_obj_t *device, bool connectable, float interval, mp_buffer_info_t *advertising_data_bufinfo, mp_buffer_info_t *scan_response_data_bufinfo);
|
|
||||||
extern void common_hal_bleio_peripheral_stop_advertising(bleio_peripheral_obj_t *device);
|
|
||||||
extern void common_hal_bleio_peripheral_disconnect(bleio_peripheral_obj_t *device);
|
|
||||||
extern mp_obj_tuple_t *common_hal_bleio_peripheral_discover_remote_services(bleio_peripheral_obj_t *self, mp_obj_t service_uuids_whitelist);
|
|
||||||
extern void common_hal_bleio_peripheral_pair(bleio_peripheral_obj_t *device);
|
|
||||||
|
|
||||||
#endif // MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_PERIPHERAL_H
|
|
|
@ -29,6 +29,7 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "py/objproperty.h"
|
#include "py/objproperty.h"
|
||||||
|
#include "py/runtime.h"
|
||||||
#include "shared-bindings/_bleio/Address.h"
|
#include "shared-bindings/_bleio/Address.h"
|
||||||
#include "shared-bindings/_bleio/ScanEntry.h"
|
#include "shared-bindings/_bleio/ScanEntry.h"
|
||||||
#include "shared-bindings/_bleio/UUID.h"
|
#include "shared-bindings/_bleio/UUID.h"
|
||||||
|
@ -36,14 +37,43 @@
|
||||||
|
|
||||||
//| .. currentmodule:: _bleio
|
//| .. currentmodule:: _bleio
|
||||||
//|
|
//|
|
||||||
//| :class:`ScanEntry` -- BLE scan response entry
|
//| :class:`ScanEntry` -- BLE scan data
|
||||||
//| =========================================================
|
//| =========================================================
|
||||||
//|
|
//|
|
||||||
//| Encapsulates information about a device that was received as a
|
//| Encapsulates information about a device that was received during scanning. It can be
|
||||||
//| response to a BLE scan request. This object may only be created
|
//| advertisement or scan response data. This object may only be created by a `_bleio.ScanResults`:
|
||||||
//| by a `_bleio.Scanner`: it has no user-visible constructor.
|
//| it has no user-visible constructor.
|
||||||
//|
|
//|
|
||||||
|
|
||||||
|
//| .. class:: ScanEntry()
|
||||||
|
//|
|
||||||
|
//| Cannot be instantiated directly. Use `_bleio.Adapter.start_scan`.
|
||||||
|
//|
|
||||||
|
//| .. method:: matches(prefixes, *, all=True)
|
||||||
|
//|
|
||||||
|
//| Returns True if the ScanEntry matches all prefixes when ``all`` is True. This is stricter
|
||||||
|
//| than the scan filtering which accepts any advertisements that match any of the prefixes
|
||||||
|
//| where all is False.
|
||||||
|
//|
|
||||||
|
STATIC mp_obj_t bleio_scanentry_matches(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
|
||||||
|
bleio_scanentry_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]);
|
||||||
|
|
||||||
|
enum { ARG_prefixes, ARG_all };
|
||||||
|
static const mp_arg_t allowed_args[] = {
|
||||||
|
{ MP_QSTR_prefixes, MP_ARG_OBJ | MP_ARG_REQUIRED },
|
||||||
|
{ MP_QSTR_all, MP_ARG_BOOL | MP_ARG_KW_ONLY, {.u_bool = true} },
|
||||||
|
};
|
||||||
|
|
||||||
|
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
|
||||||
|
mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
|
||||||
|
|
||||||
|
|
||||||
|
mp_buffer_info_t bufinfo;
|
||||||
|
mp_get_buffer_raise(args[ARG_prefixes].u_obj, &bufinfo, MP_BUFFER_READ);
|
||||||
|
return mp_obj_new_bool(common_hal_bleio_scanentry_matches(self, bufinfo.buf, bufinfo.len, args[ARG_all].u_bool));
|
||||||
|
}
|
||||||
|
STATIC MP_DEFINE_CONST_FUN_OBJ_KW(bleio_scanentry_matches_obj, 2, bleio_scanentry_matches);
|
||||||
|
|
||||||
//| .. attribute:: address
|
//| .. attribute:: address
|
||||||
//|
|
//|
|
||||||
//| The address of the device (read-only), of type `_bleio.Address`.
|
//| The address of the device (read-only), of type `_bleio.Address`.
|
||||||
|
@ -95,11 +125,47 @@ const mp_obj_property_t bleio_scanentry_rssi_obj = {
|
||||||
(mp_obj_t)&mp_const_none_obj },
|
(mp_obj_t)&mp_const_none_obj },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//| .. attribute:: connectable
|
||||||
|
//|
|
||||||
|
//| True if the device can be connected to. (read-only)
|
||||||
|
//|
|
||||||
|
STATIC mp_obj_t scanentry_get_connectable(mp_obj_t self_in) {
|
||||||
|
bleio_scanentry_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
||||||
|
return mp_obj_new_bool(common_hal_bleio_scanentry_get_connectable(self));
|
||||||
|
}
|
||||||
|
STATIC MP_DEFINE_CONST_FUN_OBJ_1(bleio_scanentry_get_connectable_obj, scanentry_get_connectable);
|
||||||
|
|
||||||
|
const mp_obj_property_t bleio_scanentry_connectable_obj = {
|
||||||
|
.base.type = &mp_type_property,
|
||||||
|
.proxy = { (mp_obj_t)&bleio_scanentry_get_connectable_obj,
|
||||||
|
(mp_obj_t)&mp_const_none_obj,
|
||||||
|
(mp_obj_t)&mp_const_none_obj },
|
||||||
|
};
|
||||||
|
|
||||||
|
//| .. attribute:: scan_response
|
||||||
|
//|
|
||||||
|
//| True if the entry was a scan response. (read-only)
|
||||||
|
//|
|
||||||
|
STATIC mp_obj_t scanentry_get_scan_response(mp_obj_t self_in) {
|
||||||
|
bleio_scanentry_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
||||||
|
return mp_obj_new_bool(common_hal_bleio_scanentry_get_scan_response(self));
|
||||||
|
}
|
||||||
|
STATIC MP_DEFINE_CONST_FUN_OBJ_1(bleio_scanentry_get_scan_response_obj, scanentry_get_scan_response);
|
||||||
|
|
||||||
|
const mp_obj_property_t bleio_scanentry_scan_response_obj = {
|
||||||
|
.base.type = &mp_type_property,
|
||||||
|
.proxy = { (mp_obj_t)&bleio_scanentry_get_scan_response_obj,
|
||||||
|
(mp_obj_t)&mp_const_none_obj,
|
||||||
|
(mp_obj_t)&mp_const_none_obj },
|
||||||
|
};
|
||||||
|
|
||||||
STATIC const mp_rom_map_elem_t bleio_scanentry_locals_dict_table[] = {
|
STATIC const mp_rom_map_elem_t bleio_scanentry_locals_dict_table[] = {
|
||||||
{ MP_ROM_QSTR(MP_QSTR_address), MP_ROM_PTR(&bleio_scanentry_address_obj) },
|
{ MP_ROM_QSTR(MP_QSTR_address), MP_ROM_PTR(&bleio_scanentry_address_obj) },
|
||||||
{ MP_ROM_QSTR(MP_QSTR_advertisement_bytes), MP_ROM_PTR(&bleio_scanentry_advertisement_bytes_obj) },
|
{ MP_ROM_QSTR(MP_QSTR_advertisement_bytes), MP_ROM_PTR(&bleio_scanentry_advertisement_bytes_obj) },
|
||||||
{ MP_ROM_QSTR(MP_QSTR_rssi), MP_ROM_PTR(&bleio_scanentry_rssi_obj) },
|
{ MP_ROM_QSTR(MP_QSTR_rssi), MP_ROM_PTR(&bleio_scanentry_rssi_obj) },
|
||||||
|
{ MP_ROM_QSTR(MP_QSTR_connectable), MP_ROM_PTR(&bleio_scanentry_connectable_obj) },
|
||||||
|
{ MP_ROM_QSTR(MP_QSTR_scan_response), MP_ROM_PTR(&bleio_scanentry_scan_response_obj) },
|
||||||
|
{ MP_ROM_QSTR(MP_QSTR_matches), MP_ROM_PTR(&bleio_scanentry_matches_obj) },
|
||||||
};
|
};
|
||||||
|
|
||||||
STATIC MP_DEFINE_CONST_DICT(bleio_scanentry_locals_dict, bleio_scanentry_locals_dict_table);
|
STATIC MP_DEFINE_CONST_DICT(bleio_scanentry_locals_dict, bleio_scanentry_locals_dict_table);
|
||||||
|
|
|
@ -37,5 +37,8 @@ extern const mp_obj_type_t bleio_scanentry_type;
|
||||||
mp_obj_t common_hal_bleio_scanentry_get_address(bleio_scanentry_obj_t *self);
|
mp_obj_t common_hal_bleio_scanentry_get_address(bleio_scanentry_obj_t *self);
|
||||||
mp_obj_t common_hal_bleio_scanentry_get_advertisement_bytes(bleio_scanentry_obj_t *self);
|
mp_obj_t common_hal_bleio_scanentry_get_advertisement_bytes(bleio_scanentry_obj_t *self);
|
||||||
mp_int_t common_hal_bleio_scanentry_get_rssi(bleio_scanentry_obj_t *self);
|
mp_int_t common_hal_bleio_scanentry_get_rssi(bleio_scanentry_obj_t *self);
|
||||||
|
bool common_hal_bleio_scanentry_get_connectable(bleio_scanentry_obj_t *self);
|
||||||
|
bool common_hal_bleio_scanentry_get_scan_response(bleio_scanentry_obj_t *self);
|
||||||
|
bool common_hal_bleio_scanentry_matches(bleio_scanentry_obj_t *self, uint8_t* prefixes, size_t prefixes_len, bool all);
|
||||||
|
|
||||||
#endif // MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_SCANENTRY_H
|
#endif // MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_SCANENTRY_H
|
||||||
|
|
|
@ -0,0 +1,72 @@
|
||||||
|
/*
|
||||||
|
* This file is part of the MicroPython project, http://micropython.org/
|
||||||
|
*
|
||||||
|
* The MIT License (MIT)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2019 Dan Halbert for Adafruit Industries
|
||||||
|
* Copyright (c) 2018 Artur Pacholec
|
||||||
|
* Copyright (c) 2017 Glenn Ruben Bakke
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "py/objproperty.h"
|
||||||
|
#include "py/runtime.h"
|
||||||
|
#include "shared-bindings/_bleio/ScanResults.h"
|
||||||
|
|
||||||
|
//| .. currentmodule:: _bleio
|
||||||
|
//|
|
||||||
|
//| :class:`ScanResults` -- An Iterator over BLE scanning results
|
||||||
|
//| ===============================================================
|
||||||
|
//|
|
||||||
|
//| Iterates over advertising data received while scanning. This object is always created
|
||||||
|
//| by a `_bleio.Adapter`: it has no user-visible constructor.
|
||||||
|
//|
|
||||||
|
STATIC mp_obj_t scanresults_iternext(mp_obj_t self_in) {
|
||||||
|
mp_check_self(MP_OBJ_IS_TYPE(self_in, &bleio_scanresults_type));
|
||||||
|
bleio_scanresults_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
||||||
|
mp_obj_t scan_entry = common_hal_bleio_scanresults_next(self);
|
||||||
|
if (scan_entry != mp_const_none) {
|
||||||
|
return scan_entry;
|
||||||
|
}
|
||||||
|
return MP_OBJ_STOP_ITERATION;
|
||||||
|
}
|
||||||
|
|
||||||
|
//| .. class:: ScanResults()
|
||||||
|
//|
|
||||||
|
//| Cannot be instantiated directly. Use `_bleio.Adapter.start_scan`.
|
||||||
|
//|
|
||||||
|
//| .. method:: __iter__()
|
||||||
|
//|
|
||||||
|
//| Returns itself since it is the iterator.
|
||||||
|
//|
|
||||||
|
//| .. method:: __next__()
|
||||||
|
//|
|
||||||
|
//| Returns the next `_bleio.ScanEntry`. Blocks if none have been received and scanning is still
|
||||||
|
//| active. Raises `StopIteration` if scanning is finished and no other results are available.
|
||||||
|
//|
|
||||||
|
|
||||||
|
const mp_obj_type_t bleio_scanresults_type = {
|
||||||
|
{ &mp_type_type },
|
||||||
|
.name = MP_QSTR_ScanResults,
|
||||||
|
.getiter = mp_identity_getiter,
|
||||||
|
.iternext = scanresults_iternext,
|
||||||
|
};
|
|
@ -5,6 +5,7 @@
|
||||||
*
|
*
|
||||||
* Copyright (c) 2019 Dan Halbert for Adafruit Industries
|
* Copyright (c) 2019 Dan Halbert for Adafruit Industries
|
||||||
* Copyright (c) 2018 Artur Pacholec
|
* Copyright (c) 2018 Artur Pacholec
|
||||||
|
* Copyright (c) 2017 Glenn Ruben Bakke
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
@ -25,16 +26,14 @@
|
||||||
* THE SOFTWARE.
|
* THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef MICROPY_INCLUDED_NRF_COMMON_HAL_BLEIO_SCANNER_H
|
#ifndef MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_SCANRESULTS_H
|
||||||
#define MICROPY_INCLUDED_NRF_COMMON_HAL_BLEIO_SCANNER_H
|
#define MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_SCANRESULTS_H
|
||||||
|
|
||||||
#include "py/obj.h"
|
#include "py/obj.h"
|
||||||
|
#include "shared-module/_bleio/ScanResults.h"
|
||||||
|
|
||||||
typedef struct {
|
extern const mp_obj_type_t bleio_scanresults_type;
|
||||||
mp_obj_base_t base;
|
|
||||||
mp_obj_t scan_entries;
|
|
||||||
uint16_t interval;
|
|
||||||
uint16_t window;
|
|
||||||
} bleio_scanner_obj_t;
|
|
||||||
|
|
||||||
#endif // MICROPY_INCLUDED_NRF_COMMON_HAL_BLEIO_SCANNER_H
|
mp_obj_t common_hal_bleio_scanresults_next(bleio_scanresults_obj_t *self);
|
||||||
|
|
||||||
|
#endif // MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_SCANRESULTS_H
|
|
@ -1,129 +0,0 @@
|
||||||
/*
|
|
||||||
* This file is part of the MicroPython project, http://micropython.org/
|
|
||||||
*
|
|
||||||
* The MIT License (MIT)
|
|
||||||
*
|
|
||||||
* Copyright (c) 2019 Dan Halbert for Adafruit Industries
|
|
||||||
* Copyright (c) 2018 Artur Pacholec
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "py/objproperty.h"
|
|
||||||
#include "py/runtime.h"
|
|
||||||
#include "shared-bindings/_bleio/ScanEntry.h"
|
|
||||||
#include "shared-bindings/_bleio/Scanner.h"
|
|
||||||
|
|
||||||
#define INTERVAL_DEFAULT (0.1f)
|
|
||||||
#define INTERVAL_MIN (0.0025f)
|
|
||||||
#define INTERVAL_MIN_STRING "0.0025"
|
|
||||||
#define INTERVAL_MAX (40.959375f)
|
|
||||||
#define INTERVAL_MAX_STRING "40.959375"
|
|
||||||
#define WINDOW_DEFAULT (0.1f)
|
|
||||||
|
|
||||||
//| .. currentmodule:: _bleio
|
|
||||||
//|
|
|
||||||
//| :class:`Scanner` -- scan for nearby BLE devices
|
|
||||||
//| =========================================================
|
|
||||||
//|
|
|
||||||
//| Scan for nearby BLE devices.
|
|
||||||
//|
|
|
||||||
//| Usage::
|
|
||||||
//|
|
|
||||||
//| import _bleio
|
|
||||||
//| scanner = _bleio.Scanner()
|
|
||||||
//| entries = scanner.scan(2.5) # Scan for 2.5 seconds
|
|
||||||
//|
|
|
||||||
|
|
||||||
//| .. class:: Scanner()
|
|
||||||
//|
|
|
||||||
//| Create a new Scanner object.
|
|
||||||
//|
|
|
||||||
STATIC mp_obj_t bleio_scanner_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *all_args, mp_map_t *kw_args) {
|
|
||||||
mp_arg_check_num(n_args, kw_args, 0, 0, false);
|
|
||||||
|
|
||||||
bleio_scanner_obj_t *self = m_new_obj(bleio_scanner_obj_t);
|
|
||||||
self->base.type = type;
|
|
||||||
|
|
||||||
common_hal_bleio_scanner_construct(self);
|
|
||||||
|
|
||||||
return MP_OBJ_FROM_PTR(self);
|
|
||||||
}
|
|
||||||
|
|
||||||
//| .. method:: scan(timeout, \*, interval=0.1, window=0.1)
|
|
||||||
//|
|
|
||||||
//| Performs a BLE scan.
|
|
||||||
//|
|
|
||||||
//| :param float timeout: the scan timeout in seconds
|
|
||||||
//| :param float interval: the interval (in seconds) between the start of two consecutive scan windows
|
|
||||||
//| Must be in the range 0.0025 - 40.959375 seconds.
|
|
||||||
//| :param float window: the duration (in seconds) to scan a single BLE channel.
|
|
||||||
//| window must be <= interval.
|
|
||||||
//| :returns: an iterable of `ScanEntry` objects
|
|
||||||
//| :rtype: iterable
|
|
||||||
//|
|
|
||||||
STATIC mp_obj_t bleio_scanner_scan(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
|
|
||||||
enum { ARG_timeout, ARG_interval, ARG_window };
|
|
||||||
static const mp_arg_t allowed_args[] = {
|
|
||||||
{ MP_QSTR_timeout, MP_ARG_REQUIRED | MP_ARG_OBJ },
|
|
||||||
{ MP_QSTR_interval, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
|
|
||||||
{ MP_QSTR_window, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
|
|
||||||
};
|
|
||||||
|
|
||||||
bleio_scanner_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]);
|
|
||||||
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
|
|
||||||
mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
|
|
||||||
|
|
||||||
const mp_float_t timeout = mp_obj_get_float(args[ARG_timeout].u_obj);
|
|
||||||
|
|
||||||
if (args[ARG_interval].u_obj == MP_OBJ_NULL) {
|
|
||||||
args[ARG_interval].u_obj = mp_obj_new_float(INTERVAL_DEFAULT);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (args[ARG_window].u_obj == MP_OBJ_NULL) {
|
|
||||||
args[ARG_window].u_obj = mp_obj_new_float(WINDOW_DEFAULT);
|
|
||||||
}
|
|
||||||
|
|
||||||
const mp_float_t interval = mp_obj_float_get(args[ARG_interval].u_obj);
|
|
||||||
if (interval < INTERVAL_MIN || interval > INTERVAL_MAX) {
|
|
||||||
mp_raise_ValueError_varg(translate("interval must be in range %s-%s"), INTERVAL_MIN_STRING, INTERVAL_MAX_STRING);
|
|
||||||
}
|
|
||||||
|
|
||||||
const mp_float_t window = mp_obj_float_get(args[ARG_window].u_obj);
|
|
||||||
if (window > interval) {
|
|
||||||
mp_raise_ValueError(translate("window must be <= interval"));
|
|
||||||
}
|
|
||||||
|
|
||||||
return common_hal_bleio_scanner_scan(self, timeout, interval, window);
|
|
||||||
}
|
|
||||||
STATIC MP_DEFINE_CONST_FUN_OBJ_KW(bleio_scanner_scan_obj, 2, bleio_scanner_scan);
|
|
||||||
|
|
||||||
|
|
||||||
STATIC const mp_rom_map_elem_t bleio_scanner_locals_dict_table[] = {
|
|
||||||
{ MP_ROM_QSTR(MP_QSTR_scan), MP_ROM_PTR(&bleio_scanner_scan_obj) },
|
|
||||||
};
|
|
||||||
|
|
||||||
STATIC MP_DEFINE_CONST_DICT(bleio_scanner_locals_dict, bleio_scanner_locals_dict_table);
|
|
||||||
|
|
||||||
const mp_obj_type_t bleio_scanner_type = {
|
|
||||||
{ &mp_type_type },
|
|
||||||
.name = MP_QSTR_Scanner,
|
|
||||||
.make_new = bleio_scanner_make_new,
|
|
||||||
.locals_dict = (mp_obj_dict_t*)&bleio_scanner_locals_dict
|
|
||||||
};
|
|
|
@ -29,54 +29,38 @@
|
||||||
#include "py/objproperty.h"
|
#include "py/objproperty.h"
|
||||||
#include "py/runtime.h"
|
#include "py/runtime.h"
|
||||||
#include "shared-bindings/_bleio/Characteristic.h"
|
#include "shared-bindings/_bleio/Characteristic.h"
|
||||||
#include "shared-bindings/_bleio/Peripheral.h"
|
|
||||||
#include "shared-bindings/_bleio/Service.h"
|
#include "shared-bindings/_bleio/Service.h"
|
||||||
#include "shared-bindings/_bleio/UUID.h"
|
#include "shared-bindings/_bleio/UUID.h"
|
||||||
|
|
||||||
//| .. currentmodule:: _bleio
|
//| .. currentmodule:: _bleio
|
||||||
//|
|
//|
|
||||||
//| :class:`Service` -- BLE service
|
//| :class:`Service` -- BLE GATT Service
|
||||||
//| =========================================================
|
//| =========================================================
|
||||||
//|
|
//|
|
||||||
//| Stores information about a BLE service and its characteristics.
|
//| Stores information about a BLE service and its characteristics.
|
||||||
//|
|
//|
|
||||||
//| .. class:: Service
|
//| .. class:: Service(uuid, *, secondary=False)
|
||||||
//|
|
//|
|
||||||
//| There is no regular constructor for a Service. A new local Service can be created
|
//| Create a new Service identified by the specified UUID. It can be accessed by all
|
||||||
//| and attached to a Peripheral by calling `add_to_peripheral()`.
|
//| connections. This is known as a Service server. Client Service objects are created via
|
||||||
//| Remote Service objects are created by `Central.discover_remote_services()`
|
//| `Connection.discover_remote_services`.
|
||||||
//| or `Peripheral.discover_remote_services()`.
|
|
||||||
//|
|
//|
|
||||||
//| .. classmethod:: add_to_peripheral(peripheral, uuid, *, secondary=False)
|
//| To mark the Service as secondary, pass `True` as :py:data:`secondary`.
|
||||||
//|
|
//|
|
||||||
//| Create a new Service object, identified by the specified UUID, and add it
|
//| :param UUID uuid: The uuid of the service
|
||||||
//| to the given Peripheral.
|
//| :param bool secondary: If the service is a secondary one
|
||||||
//|
|
|
||||||
//| To mark the service as secondary, pass `True` as :py:data:`secondary`.
|
|
||||||
//|
|
|
||||||
//| :param Peripheral peripheral: The peripheral that will provide this service
|
|
||||||
//| :param UUID uuid: The uuid of the service
|
|
||||||
//| :param bool secondary: If the service is a secondary one
|
|
||||||
//
|
//
|
||||||
//| :return: the new Service
|
//| :return: the new Service
|
||||||
//|
|
//|
|
||||||
STATIC mp_obj_t bleio_service_add_to_peripheral(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
|
STATIC mp_obj_t bleio_service_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
|
||||||
// class is arg[0], which we can ignore.
|
enum { ARG_uuid, ARG_secondary };
|
||||||
|
|
||||||
enum { ARG_peripheral, ARG_uuid, ARG_secondary };
|
|
||||||
static const mp_arg_t allowed_args[] = {
|
static const mp_arg_t allowed_args[] = {
|
||||||
{ MP_QSTR_peripheral, MP_ARG_REQUIRED | MP_ARG_OBJ,},
|
|
||||||
{ MP_QSTR_uuid, MP_ARG_REQUIRED | MP_ARG_OBJ },
|
{ MP_QSTR_uuid, MP_ARG_REQUIRED | MP_ARG_OBJ },
|
||||||
{ MP_QSTR_secondary, MP_ARG_KW_ONLY | MP_ARG_BOOL, {.u_bool = false} },
|
{ MP_QSTR_secondary, MP_ARG_KW_ONLY | MP_ARG_BOOL, {.u_bool = false} },
|
||||||
};
|
};
|
||||||
|
|
||||||
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
|
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
|
||||||
mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
|
mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
|
||||||
|
|
||||||
const mp_obj_t peripheral_obj = args[ARG_peripheral].u_obj;
|
|
||||||
if (!MP_OBJ_IS_TYPE(peripheral_obj, &bleio_peripheral_type)) {
|
|
||||||
mp_raise_ValueError(translate("Expected a Peripheral"));
|
|
||||||
}
|
|
||||||
|
|
||||||
const mp_obj_t uuid_obj = args[ARG_uuid].u_obj;
|
const mp_obj_t uuid_obj = args[ARG_uuid].u_obj;
|
||||||
if (!MP_OBJ_IS_TYPE(uuid_obj, &bleio_uuid_type)) {
|
if (!MP_OBJ_IS_TYPE(uuid_obj, &bleio_uuid_type)) {
|
||||||
|
@ -88,19 +72,15 @@ STATIC mp_obj_t bleio_service_add_to_peripheral(size_t n_args, const mp_obj_t *p
|
||||||
bleio_service_obj_t *service = m_new_obj(bleio_service_obj_t);
|
bleio_service_obj_t *service = m_new_obj(bleio_service_obj_t);
|
||||||
service->base.type = &bleio_service_type;
|
service->base.type = &bleio_service_type;
|
||||||
|
|
||||||
common_hal_bleio_service_construct(
|
common_hal_bleio_service_construct(service, MP_OBJ_TO_PTR(uuid_obj), is_secondary);
|
||||||
service, MP_OBJ_TO_PTR(peripheral_obj), MP_OBJ_TO_PTR(uuid_obj), is_secondary);
|
|
||||||
|
|
||||||
common_hal_bleio_peripheral_add_service(peripheral_obj, service);
|
|
||||||
|
|
||||||
return MP_OBJ_FROM_PTR(service);
|
return MP_OBJ_FROM_PTR(service);
|
||||||
}
|
}
|
||||||
STATIC MP_DEFINE_CONST_FUN_OBJ_KW(bleio_service_add_to_peripheral_fun_obj, 3, bleio_service_add_to_peripheral);
|
|
||||||
STATIC MP_DEFINE_CONST_CLASSMETHOD_OBJ(bleio_service_add_to_peripheral_obj, MP_ROM_PTR(&bleio_service_add_to_peripheral_fun_obj));
|
|
||||||
|
|
||||||
//| .. attribute:: characteristics
|
//| .. attribute:: characteristics
|
||||||
//|
|
//|
|
||||||
//| A tuple of :py:class:`Characteristic` designating the characteristics that are offered by this service. (read-only)
|
//| A tuple of :py:class:`Characteristic` designating the characteristics that are offered by
|
||||||
|
//| this service. (read-only)
|
||||||
//|
|
//|
|
||||||
STATIC mp_obj_t bleio_service_get_characteristics(mp_obj_t self_in) {
|
STATIC mp_obj_t bleio_service_get_characteristics(mp_obj_t self_in) {
|
||||||
bleio_service_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
bleio_service_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
||||||
|
@ -156,7 +136,8 @@ const mp_obj_property_t bleio_service_secondary_obj = {
|
||||||
//| .. attribute:: uuid
|
//| .. attribute:: uuid
|
||||||
//|
|
//|
|
||||||
//| The UUID of this service. (read-only)
|
//| The UUID of this service. (read-only)
|
||||||
//| Will be ``None`` if the 128-bit UUID for this service is not known.
|
//|
|
||||||
|
//| Will be ``None`` if the 128-bit UUID for this service is not known.
|
||||||
//|
|
//|
|
||||||
STATIC mp_obj_t bleio_service_get_uuid(mp_obj_t self_in) {
|
STATIC mp_obj_t bleio_service_get_uuid(mp_obj_t self_in) {
|
||||||
bleio_service_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
bleio_service_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
||||||
|
@ -175,10 +156,10 @@ const mp_obj_property_t bleio_service_uuid_obj = {
|
||||||
|
|
||||||
|
|
||||||
STATIC const mp_rom_map_elem_t bleio_service_locals_dict_table[] = {
|
STATIC const mp_rom_map_elem_t bleio_service_locals_dict_table[] = {
|
||||||
{ MP_ROM_QSTR(MP_QSTR_add_to_peripheral), MP_ROM_PTR(&bleio_service_add_to_peripheral_obj) },
|
|
||||||
{ MP_ROM_QSTR(MP_QSTR_characteristics), MP_ROM_PTR(&bleio_service_characteristics_obj) },
|
{ MP_ROM_QSTR(MP_QSTR_characteristics), MP_ROM_PTR(&bleio_service_characteristics_obj) },
|
||||||
{ MP_ROM_QSTR(MP_QSTR_secondary), MP_ROM_PTR(&bleio_service_secondary_obj) },
|
{ MP_ROM_QSTR(MP_QSTR_secondary), MP_ROM_PTR(&bleio_service_secondary_obj) },
|
||||||
{ MP_ROM_QSTR(MP_QSTR_uuid), MP_ROM_PTR(&bleio_service_uuid_obj) },
|
{ MP_ROM_QSTR(MP_QSTR_uuid), MP_ROM_PTR(&bleio_service_uuid_obj) },
|
||||||
|
{ MP_ROM_QSTR(MP_QSTR_remote), MP_ROM_PTR(&bleio_service_remote_obj) },
|
||||||
};
|
};
|
||||||
STATIC MP_DEFINE_CONST_DICT(bleio_service_locals_dict, bleio_service_locals_dict_table);
|
STATIC MP_DEFINE_CONST_DICT(bleio_service_locals_dict, bleio_service_locals_dict_table);
|
||||||
|
|
||||||
|
@ -196,6 +177,25 @@ STATIC void bleio_service_print(const mp_print_t *print, mp_obj_t self_in, mp_pr
|
||||||
const mp_obj_type_t bleio_service_type = {
|
const mp_obj_type_t bleio_service_type = {
|
||||||
{ &mp_type_type },
|
{ &mp_type_type },
|
||||||
.name = MP_QSTR_Service,
|
.name = MP_QSTR_Service,
|
||||||
|
.make_new = bleio_service_make_new,
|
||||||
.print = bleio_service_print,
|
.print = bleio_service_print,
|
||||||
.locals_dict = (mp_obj_dict_t*)&bleio_service_locals_dict
|
.locals_dict = (mp_obj_dict_t*)&bleio_service_locals_dict
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Helper for classes that store lists of services.
|
||||||
|
mp_obj_tuple_t* service_linked_list_to_tuple(bleio_service_obj_t * services) {
|
||||||
|
// Return list as a tuple so user won't be able to change it.
|
||||||
|
bleio_service_obj_t *head = services;
|
||||||
|
size_t len = 0;
|
||||||
|
while (head != NULL) {
|
||||||
|
len++;
|
||||||
|
head = head->next;
|
||||||
|
}
|
||||||
|
mp_obj_tuple_t * t = MP_OBJ_TO_PTR(mp_obj_new_tuple(len, NULL));
|
||||||
|
head = services;
|
||||||
|
for (int32_t i = len - 1; i >= 0; i--) {
|
||||||
|
t->items[i] = MP_OBJ_FROM_PTR(head);
|
||||||
|
head = head->next;
|
||||||
|
}
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
|
@ -28,16 +28,24 @@
|
||||||
#ifndef MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_SERVICE_H
|
#ifndef MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_SERVICE_H
|
||||||
#define MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_SERVICE_H
|
#define MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_SERVICE_H
|
||||||
|
|
||||||
#include "common-hal/_bleio/Peripheral.h"
|
#include "common-hal/_bleio/Characteristic.h"
|
||||||
|
#include "common-hal/_bleio/Connection.h"
|
||||||
#include "common-hal/_bleio/Service.h"
|
#include "common-hal/_bleio/Service.h"
|
||||||
|
|
||||||
|
#include "py/objtuple.h"
|
||||||
|
|
||||||
const mp_obj_type_t bleio_service_type;
|
const mp_obj_type_t bleio_service_type;
|
||||||
|
|
||||||
extern void common_hal_bleio_service_construct(bleio_service_obj_t *self, bleio_peripheral_obj_t *peripheral, bleio_uuid_obj_t *uuid, bool is_secondary);
|
// Private version that doesn't allocate on the heap
|
||||||
|
extern uint32_t _common_hal_bleio_service_construct(bleio_service_obj_t *self, bleio_uuid_obj_t *uuid, bool is_secondary, mp_obj_list_t * characteristic_list);
|
||||||
|
extern void common_hal_bleio_service_construct(bleio_service_obj_t *self, bleio_uuid_obj_t *uuid, bool is_secondary);
|
||||||
|
extern void common_hal_bleio_service_from_remote_service(bleio_service_obj_t *self, bleio_connection_obj_t* connection, bleio_uuid_obj_t *uuid, bool is_secondary);
|
||||||
extern bleio_uuid_obj_t *common_hal_bleio_service_get_uuid(bleio_service_obj_t *self);
|
extern bleio_uuid_obj_t *common_hal_bleio_service_get_uuid(bleio_service_obj_t *self);
|
||||||
extern mp_obj_list_t *common_hal_bleio_service_get_characteristic_list(bleio_service_obj_t *self);
|
extern mp_obj_list_t *common_hal_bleio_service_get_characteristic_list(bleio_service_obj_t *self);
|
||||||
extern bool common_hal_bleio_service_get_is_remote(bleio_service_obj_t *self);
|
extern bool common_hal_bleio_service_get_is_remote(bleio_service_obj_t *self);
|
||||||
extern bool common_hal_bleio_service_get_is_secondary(bleio_service_obj_t *self);
|
extern bool common_hal_bleio_service_get_is_secondary(bleio_service_obj_t *self);
|
||||||
extern void common_hal_bleio_service_add_characteristic(bleio_service_obj_t *self, bleio_characteristic_obj_t *characteristic);
|
extern void common_hal_bleio_service_add_characteristic(bleio_service_obj_t *self, bleio_characteristic_obj_t *characteristic, mp_buffer_info_t *initial_value_bufinfo);
|
||||||
|
|
||||||
|
mp_obj_tuple_t* service_linked_list_to_tuple(bleio_service_obj_t * services);
|
||||||
|
|
||||||
#endif // MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_SERVICE_H
|
#endif // MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_SERVICE_H
|
||||||
|
|
|
@ -156,9 +156,10 @@ STATIC mp_obj_t bleio_uuid_get_uuid128(mp_obj_t self_in) {
|
||||||
bleio_uuid_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
bleio_uuid_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
||||||
|
|
||||||
uint8_t uuid128[16];
|
uint8_t uuid128[16];
|
||||||
if (!common_hal_bleio_uuid_get_uuid128(self, uuid128)) {
|
if (common_hal_bleio_uuid_get_size(self) != 128) {
|
||||||
mp_raise_AttributeError(translate("not a 128-bit UUID"));
|
mp_raise_AttributeError(translate("not a 128-bit UUID"));
|
||||||
}
|
}
|
||||||
|
common_hal_bleio_uuid_get_uuid128(self, uuid128);
|
||||||
return mp_obj_new_bytes(uuid128, 16);
|
return mp_obj_new_bytes(uuid128, 16);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -192,10 +193,42 @@ const mp_obj_property_t bleio_uuid_size_obj = {
|
||||||
(mp_obj_t)&mp_const_none_obj},
|
(mp_obj_t)&mp_const_none_obj},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
//| .. method:: pack_into(buffer, offset=0)
|
||||||
|
//|
|
||||||
|
//| Packs the UUID into the given buffer at the given offset.
|
||||||
|
//|
|
||||||
|
STATIC mp_obj_t bleio_uuid_pack_into(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
|
||||||
|
bleio_uuid_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]);
|
||||||
|
|
||||||
|
enum { ARG_buffer, ARG_offset };
|
||||||
|
static const mp_arg_t allowed_args[] = {
|
||||||
|
{ MP_QSTR_buffer, MP_ARG_OBJ | MP_ARG_REQUIRED },
|
||||||
|
{ MP_QSTR_offset, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 0} },
|
||||||
|
};
|
||||||
|
|
||||||
|
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
|
||||||
|
mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
|
||||||
|
|
||||||
|
|
||||||
|
mp_buffer_info_t bufinfo;
|
||||||
|
mp_get_buffer_raise(args[ARG_buffer].u_obj, &bufinfo, MP_BUFFER_WRITE);
|
||||||
|
|
||||||
|
size_t offset = args[ARG_offset].u_int;
|
||||||
|
if (offset + common_hal_bleio_uuid_get_size(self) / 8 > bufinfo.len) {
|
||||||
|
mp_raise_ValueError(translate("Buffer + offset too small %d %d %d"));
|
||||||
|
}
|
||||||
|
|
||||||
|
common_hal_bleio_uuid_pack_into(self, bufinfo.buf + offset);
|
||||||
|
return mp_const_none;
|
||||||
|
}
|
||||||
|
STATIC MP_DEFINE_CONST_FUN_OBJ_KW(bleio_uuid_pack_into_obj, 2, bleio_uuid_pack_into);
|
||||||
|
|
||||||
STATIC const mp_rom_map_elem_t bleio_uuid_locals_dict_table[] = {
|
STATIC const mp_rom_map_elem_t bleio_uuid_locals_dict_table[] = {
|
||||||
{ MP_ROM_QSTR(MP_QSTR_uuid16), MP_ROM_PTR(&bleio_uuid_uuid16_obj) },
|
{ MP_ROM_QSTR(MP_QSTR_uuid16), MP_ROM_PTR(&bleio_uuid_uuid16_obj) },
|
||||||
{ MP_ROM_QSTR(MP_QSTR_uuid128), MP_ROM_PTR(&bleio_uuid_uuid128_obj) },
|
{ MP_ROM_QSTR(MP_QSTR_uuid128), MP_ROM_PTR(&bleio_uuid_uuid128_obj) },
|
||||||
{ MP_ROM_QSTR(MP_QSTR_size), MP_ROM_PTR(&bleio_uuid_size_obj) },
|
{ MP_ROM_QSTR(MP_QSTR_size), MP_ROM_PTR(&bleio_uuid_size_obj) },
|
||||||
|
{ MP_ROM_QSTR(MP_QSTR_pack_into), MP_ROM_PTR(&bleio_uuid_pack_into_obj) },
|
||||||
};
|
};
|
||||||
|
|
||||||
STATIC MP_DEFINE_CONST_DICT(bleio_uuid_locals_dict, bleio_uuid_locals_dict_table);
|
STATIC MP_DEFINE_CONST_DICT(bleio_uuid_locals_dict, bleio_uuid_locals_dict_table);
|
||||||
|
@ -231,13 +264,19 @@ STATIC mp_obj_t bleio_uuid_unary_op(mp_unary_op_t op, mp_obj_t self_in) {
|
||||||
//|
|
//|
|
||||||
STATIC mp_obj_t bleio_uuid_binary_op(mp_binary_op_t op, mp_obj_t lhs_in, mp_obj_t rhs_in) {
|
STATIC mp_obj_t bleio_uuid_binary_op(mp_binary_op_t op, mp_obj_t lhs_in, mp_obj_t rhs_in) {
|
||||||
switch (op) {
|
switch (op) {
|
||||||
// Two UUID's are equal if their uuid16 values and uuid128 references match.
|
// Two UUID's are equal if their uuid16 values match or their uuid128 values match.
|
||||||
case MP_BINARY_OP_EQUAL:
|
case MP_BINARY_OP_EQUAL:
|
||||||
if (MP_OBJ_IS_TYPE(rhs_in, &bleio_uuid_type)) {
|
if (MP_OBJ_IS_TYPE(rhs_in, &bleio_uuid_type)) {
|
||||||
return mp_obj_new_bool(
|
if (common_hal_bleio_uuid_get_size(lhs_in) == 16 &&
|
||||||
common_hal_bleio_uuid_get_uuid16(lhs_in) == common_hal_bleio_uuid_get_uuid16(rhs_in) &&
|
common_hal_bleio_uuid_get_size(rhs_in) == 16) {
|
||||||
common_hal_bleio_uuid_get_uuid128_reference(lhs_in) ==
|
return mp_obj_new_bool(common_hal_bleio_uuid_get_uuid16(lhs_in) ==
|
||||||
common_hal_bleio_uuid_get_uuid128_reference(rhs_in));
|
common_hal_bleio_uuid_get_uuid16(rhs_in));
|
||||||
|
}
|
||||||
|
uint8_t lhs[16];
|
||||||
|
uint8_t rhs[16];
|
||||||
|
common_hal_bleio_uuid_get_uuid128(lhs_in, lhs);
|
||||||
|
common_hal_bleio_uuid_get_uuid128(rhs_in, rhs);
|
||||||
|
return mp_obj_new_bool(memcmp(lhs, rhs, sizeof(lhs)) == 0);
|
||||||
} else {
|
} else {
|
||||||
return mp_const_false;
|
return mp_const_false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,10 +34,11 @@ void bleio_uuid_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t
|
||||||
|
|
||||||
extern const mp_obj_type_t bleio_uuid_type;
|
extern const mp_obj_type_t bleio_uuid_type;
|
||||||
|
|
||||||
extern void common_hal_bleio_uuid_construct(bleio_uuid_obj_t *self, mp_int_t uuid16, uint8_t uuid128[]);
|
extern void common_hal_bleio_uuid_construct(bleio_uuid_obj_t *self, mp_int_t uuid16, const uint8_t uuid128[]);
|
||||||
extern uint32_t common_hal_bleio_uuid_get_uuid16(bleio_uuid_obj_t *self);
|
extern uint32_t common_hal_bleio_uuid_get_uuid16(bleio_uuid_obj_t *self);
|
||||||
extern bool common_hal_bleio_uuid_get_uuid128(bleio_uuid_obj_t *self, uint8_t uuid128[16]);
|
extern bool common_hal_bleio_uuid_get_uuid128(bleio_uuid_obj_t *self, uint8_t uuid128[16]);
|
||||||
extern uint32_t common_hal_bleio_uuid_get_uuid128_reference(bleio_uuid_obj_t *self);
|
|
||||||
extern uint32_t common_hal_bleio_uuid_get_size(bleio_uuid_obj_t *self);
|
extern uint32_t common_hal_bleio_uuid_get_size(bleio_uuid_obj_t *self);
|
||||||
|
|
||||||
|
void common_hal_bleio_uuid_pack_into(bleio_uuid_obj_t *self, uint8_t* buf);
|
||||||
|
|
||||||
#endif // MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_UUID_H
|
#endif // MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_UUID_H
|
||||||
|
|
|
@ -29,13 +29,12 @@
|
||||||
#include "shared-bindings/_bleio/__init__.h"
|
#include "shared-bindings/_bleio/__init__.h"
|
||||||
#include "shared-bindings/_bleio/Address.h"
|
#include "shared-bindings/_bleio/Address.h"
|
||||||
#include "shared-bindings/_bleio/Attribute.h"
|
#include "shared-bindings/_bleio/Attribute.h"
|
||||||
#include "shared-bindings/_bleio/Central.h"
|
|
||||||
#include "shared-bindings/_bleio/Characteristic.h"
|
#include "shared-bindings/_bleio/Characteristic.h"
|
||||||
#include "shared-bindings/_bleio/CharacteristicBuffer.h"
|
#include "shared-bindings/_bleio/CharacteristicBuffer.h"
|
||||||
|
#include "shared-bindings/_bleio/Connection.h"
|
||||||
#include "shared-bindings/_bleio/Descriptor.h"
|
#include "shared-bindings/_bleio/Descriptor.h"
|
||||||
#include "shared-bindings/_bleio/Peripheral.h"
|
|
||||||
#include "shared-bindings/_bleio/ScanEntry.h"
|
#include "shared-bindings/_bleio/ScanEntry.h"
|
||||||
#include "shared-bindings/_bleio/Scanner.h"
|
#include "shared-bindings/_bleio/ScanResults.h"
|
||||||
#include "shared-bindings/_bleio/Service.h"
|
#include "shared-bindings/_bleio/Service.h"
|
||||||
#include "shared-bindings/_bleio/UUID.h"
|
#include "shared-bindings/_bleio/UUID.h"
|
||||||
|
|
||||||
|
@ -64,34 +63,32 @@
|
||||||
//| Address
|
//| Address
|
||||||
//| Adapter
|
//| Adapter
|
||||||
//| Attribute
|
//| Attribute
|
||||||
//| Central
|
|
||||||
//| Characteristic
|
//| Characteristic
|
||||||
//| CharacteristicBuffer
|
//| CharacteristicBuffer
|
||||||
|
//| Connection
|
||||||
//| Descriptor
|
//| Descriptor
|
||||||
//| Peripheral
|
|
||||||
//| ScanEntry
|
//| ScanEntry
|
||||||
//| Scanner
|
//| ScanResults
|
||||||
//| Service
|
//| Service
|
||||||
//| UUID
|
//| UUID
|
||||||
//|
|
//|
|
||||||
//| .. attribute:: adapter
|
//| .. attribute:: adapter
|
||||||
//|
|
//|
|
||||||
//| BLE Adapter information, such as enabled state as well as MAC
|
//| BLE Adapter used to manage device discovery and connections.
|
||||||
//| address.
|
|
||||||
//| This object is the sole instance of `_bleio.Adapter`.
|
//| This object is the sole instance of `_bleio.Adapter`.
|
||||||
//|
|
//|
|
||||||
|
|
||||||
STATIC const mp_rom_map_elem_t bleio_module_globals_table[] = {
|
STATIC const mp_rom_map_elem_t bleio_module_globals_table[] = {
|
||||||
{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR__bleio) },
|
{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR__bleio) },
|
||||||
|
{ MP_ROM_QSTR(MP_QSTR_Adapter), MP_ROM_PTR(&bleio_adapter_type) },
|
||||||
{ MP_ROM_QSTR(MP_QSTR_Address), MP_ROM_PTR(&bleio_address_type) },
|
{ MP_ROM_QSTR(MP_QSTR_Address), MP_ROM_PTR(&bleio_address_type) },
|
||||||
{ MP_ROM_QSTR(MP_QSTR_Attribute), MP_ROM_PTR(&bleio_attribute_type) },
|
{ MP_ROM_QSTR(MP_QSTR_Attribute), MP_ROM_PTR(&bleio_attribute_type) },
|
||||||
{ MP_ROM_QSTR(MP_QSTR_Central), MP_ROM_PTR(&bleio_central_type) },
|
{ MP_ROM_QSTR(MP_QSTR_Connection), MP_ROM_PTR(&bleio_connection_type) },
|
||||||
{ MP_ROM_QSTR(MP_QSTR_Characteristic), MP_ROM_PTR(&bleio_characteristic_type) },
|
{ MP_ROM_QSTR(MP_QSTR_Characteristic), MP_ROM_PTR(&bleio_characteristic_type) },
|
||||||
{ MP_ROM_QSTR(MP_QSTR_CharacteristicBuffer), MP_ROM_PTR(&bleio_characteristic_buffer_type) },
|
{ MP_ROM_QSTR(MP_QSTR_CharacteristicBuffer), MP_ROM_PTR(&bleio_characteristic_buffer_type) },
|
||||||
{ MP_ROM_QSTR(MP_QSTR_Descriptor), MP_ROM_PTR(&bleio_descriptor_type) },
|
{ MP_ROM_QSTR(MP_QSTR_Descriptor), MP_ROM_PTR(&bleio_descriptor_type) },
|
||||||
{ MP_ROM_QSTR(MP_QSTR_Peripheral), MP_ROM_PTR(&bleio_peripheral_type) },
|
|
||||||
{ MP_ROM_QSTR(MP_QSTR_ScanEntry), MP_ROM_PTR(&bleio_scanentry_type) },
|
{ MP_ROM_QSTR(MP_QSTR_ScanEntry), MP_ROM_PTR(&bleio_scanentry_type) },
|
||||||
{ MP_ROM_QSTR(MP_QSTR_Scanner), MP_ROM_PTR(&bleio_scanner_type) },
|
{ MP_ROM_QSTR(MP_QSTR_ScanResults), MP_ROM_PTR(&bleio_scanresults_type) },
|
||||||
{ MP_ROM_QSTR(MP_QSTR_Service), MP_ROM_PTR(&bleio_service_type) },
|
{ MP_ROM_QSTR(MP_QSTR_Service), MP_ROM_PTR(&bleio_service_type) },
|
||||||
{ MP_ROM_QSTR(MP_QSTR_UUID), MP_ROM_PTR(&bleio_uuid_type) },
|
{ MP_ROM_QSTR(MP_QSTR_UUID), MP_ROM_PTR(&bleio_uuid_type) },
|
||||||
|
|
||||||
|
|
|
@ -36,17 +36,19 @@
|
||||||
#include "common-hal/_bleio/__init__.h"
|
#include "common-hal/_bleio/__init__.h"
|
||||||
#include "common-hal/_bleio/Adapter.h"
|
#include "common-hal/_bleio/Adapter.h"
|
||||||
|
|
||||||
extern const super_adapter_obj_t common_hal_bleio_adapter_obj;
|
extern bleio_adapter_obj_t common_hal_bleio_adapter_obj;
|
||||||
|
|
||||||
extern void common_hal_bleio_check_connected(uint16_t conn_handle);
|
void common_hal_bleio_check_connected(uint16_t conn_handle);
|
||||||
|
|
||||||
extern uint16_t common_hal_bleio_device_get_conn_handle(mp_obj_t device);
|
uint16_t common_hal_bleio_device_get_conn_handle(mp_obj_t device);
|
||||||
extern mp_obj_list_t *common_hal_bleio_device_get_remote_service_list(mp_obj_t device);
|
mp_obj_list_t *common_hal_bleio_device_get_remote_service_list(mp_obj_t device);
|
||||||
extern void common_hal_bleio_device_discover_remote_services(mp_obj_t device, mp_obj_t service_uuids_whitelist);
|
void common_hal_bleio_device_discover_remote_services(mp_obj_t device, mp_obj_t service_uuids_whitelist);
|
||||||
|
|
||||||
extern mp_obj_t common_hal_bleio_gatts_read(uint16_t handle, uint16_t conn_handle);
|
size_t common_hal_bleio_gatts_read(uint16_t handle, uint16_t conn_handle, uint8_t* buf, size_t len);
|
||||||
extern void common_hal_bleio_gatts_write(uint16_t handle, uint16_t conn_handle, mp_buffer_info_t *bufinfo);
|
void common_hal_bleio_gatts_write(uint16_t handle, uint16_t conn_handle, mp_buffer_info_t *bufinfo);
|
||||||
extern void common_hal_bleio_gattc_write(uint16_t handle, uint16_t conn_handle, mp_buffer_info_t *bufinfo, bool write_no_response);
|
size_t common_hal_bleio_gattc_read(uint16_t handle, uint16_t conn_handle, uint8_t* buf, size_t len);
|
||||||
|
void common_hal_bleio_gattc_write(uint16_t handle, uint16_t conn_handle, mp_buffer_info_t *bufinfo, bool write_no_response);
|
||||||
|
|
||||||
|
void common_hal_bleio_gc_collect(void);
|
||||||
|
|
||||||
#endif // MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO___INIT___H
|
#endif // MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO___INIT___H
|
||||||
|
|
|
@ -37,9 +37,50 @@ mp_obj_t common_hal_bleio_scanentry_get_address(bleio_scanentry_obj_t *self) {
|
||||||
}
|
}
|
||||||
|
|
||||||
mp_obj_t common_hal_bleio_scanentry_get_advertisement_bytes(bleio_scanentry_obj_t *self) {
|
mp_obj_t common_hal_bleio_scanentry_get_advertisement_bytes(bleio_scanentry_obj_t *self) {
|
||||||
return self->data;
|
return MP_OBJ_FROM_PTR(self->data);
|
||||||
}
|
}
|
||||||
|
|
||||||
mp_int_t common_hal_bleio_scanentry_get_rssi(bleio_scanentry_obj_t *self) {
|
mp_int_t common_hal_bleio_scanentry_get_rssi(bleio_scanentry_obj_t *self) {
|
||||||
return self->rssi;
|
return self->rssi;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool common_hal_bleio_scanentry_get_connectable(bleio_scanentry_obj_t *self) {
|
||||||
|
return self->connectable;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool common_hal_bleio_scanentry_get_scan_response(bleio_scanentry_obj_t *self) {
|
||||||
|
return self->scan_response;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool bleio_scanentry_data_matches(const uint8_t* data, size_t len, const uint8_t* prefixes, size_t prefixes_length, bool any) {
|
||||||
|
if (prefixes_length == 0) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
size_t i = 0;
|
||||||
|
while(i < prefixes_length) {
|
||||||
|
uint8_t prefix_length = prefixes[i];
|
||||||
|
i += 1;
|
||||||
|
size_t j = 0;
|
||||||
|
while (j < len) {
|
||||||
|
uint8_t structure_length = data[j];
|
||||||
|
j += 1;
|
||||||
|
if (structure_length == 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (structure_length >= prefix_length && memcmp(data + j, prefixes + i, prefix_length) == 0) {
|
||||||
|
if (any) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
} else if (!any) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
j += structure_length;
|
||||||
|
}
|
||||||
|
i += prefix_length;
|
||||||
|
}
|
||||||
|
return !any;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool common_hal_bleio_scanentry_matches(bleio_scanentry_obj_t *self, const uint8_t* prefixes, size_t prefixes_len, bool all) {
|
||||||
|
return bleio_scanentry_data_matches(self->data->data, self->data->len, prefixes, prefixes_len, !all);
|
||||||
|
}
|
||||||
|
|
|
@ -29,14 +29,19 @@
|
||||||
#define MICROPY_INCLUDED_SHARED_MODULE_BLEIO_SCANENTRY_H
|
#define MICROPY_INCLUDED_SHARED_MODULE_BLEIO_SCANENTRY_H
|
||||||
|
|
||||||
#include "py/obj.h"
|
#include "py/obj.h"
|
||||||
|
#include "py/objstr.h"
|
||||||
#include "shared-bindings/_bleio/Address.h"
|
#include "shared-bindings/_bleio/Address.h"
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
mp_obj_base_t base;
|
mp_obj_base_t base;
|
||||||
bool connectable;
|
bool connectable;
|
||||||
|
bool scan_response;
|
||||||
int8_t rssi;
|
int8_t rssi;
|
||||||
bleio_address_obj_t *address;
|
bleio_address_obj_t *address;
|
||||||
mp_obj_t data;
|
mp_obj_str_t *data;
|
||||||
|
uint64_t time_received;
|
||||||
} bleio_scanentry_obj_t;
|
} bleio_scanentry_obj_t;
|
||||||
|
|
||||||
|
bool bleio_scanentry_data_matches(const uint8_t* data, size_t len, const uint8_t* prefixes, size_t prefix_length, bool any);
|
||||||
|
|
||||||
#endif // MICROPY_INCLUDED_SHARED_MODULE_BLEIO_SCANENTRY_H
|
#endif // MICROPY_INCLUDED_SHARED_MODULE_BLEIO_SCANENTRY_H
|
||||||
|
|
|
@ -0,0 +1,139 @@
|
||||||
|
/*
|
||||||
|
* This file is part of the MicroPython project, http://micropython.org/
|
||||||
|
*
|
||||||
|
* The MIT License (MIT)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2019 Dan Halbert for Adafruit Industries
|
||||||
|
* Copyright (c) 2018 Artur Pacholec
|
||||||
|
* Copyright (c) 2017 Glenn Ruben Bakke
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "lib/utils/interrupt_char.h"
|
||||||
|
#include "py/objstr.h"
|
||||||
|
#include "py/runtime.h"
|
||||||
|
#include "shared-bindings/_bleio/ScanEntry.h"
|
||||||
|
#include "shared-bindings/_bleio/ScanResults.h"
|
||||||
|
|
||||||
|
bleio_scanresults_obj_t* shared_module_bleio_new_scanresults(size_t buffer_size, uint8_t* prefixes, size_t prefixes_len, mp_int_t minimum_rssi) {
|
||||||
|
bleio_scanresults_obj_t* self = m_new_obj(bleio_scanresults_obj_t);
|
||||||
|
self->base.type = &bleio_scanresults_type;
|
||||||
|
ringbuf_alloc(&self->buf, buffer_size, false);
|
||||||
|
self->prefixes = prefixes;
|
||||||
|
self->prefix_length = prefixes_len;
|
||||||
|
self->minimum_rssi = minimum_rssi;
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
mp_obj_t common_hal_bleio_scanresults_next(bleio_scanresults_obj_t *self) {
|
||||||
|
while (ringbuf_count(&self->buf) == 0 && !self->done && !mp_hal_is_interrupted()) {
|
||||||
|
RUN_BACKGROUND_TASKS;
|
||||||
|
}
|
||||||
|
if (ringbuf_count(&self->buf) == 0 || mp_hal_is_interrupted()) {
|
||||||
|
return mp_const_none;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create a ScanEntry out of the data on the buffer.
|
||||||
|
uint8_t type = ringbuf_get(&self->buf);
|
||||||
|
bool connectable = (type & (1 << 0)) != 0;
|
||||||
|
bool scan_response = (type & (1 << 1)) != 0;
|
||||||
|
uint64_t ticks_ms;
|
||||||
|
ringbuf_get_n(&self->buf, (uint8_t*) &ticks_ms, sizeof(ticks_ms));
|
||||||
|
uint8_t rssi = ringbuf_get(&self->buf);
|
||||||
|
uint8_t peer_addr[NUM_BLEIO_ADDRESS_BYTES];
|
||||||
|
ringbuf_get_n(&self->buf, peer_addr, sizeof(peer_addr));
|
||||||
|
uint8_t addr_type = ringbuf_get(&self->buf);
|
||||||
|
uint16_t len;
|
||||||
|
ringbuf_get_n(&self->buf, (uint8_t*) &len, sizeof(len));
|
||||||
|
|
||||||
|
mp_obj_str_t *o = MP_OBJ_TO_PTR(mp_obj_new_bytes_of_zeros(len));
|
||||||
|
ringbuf_get_n(&self->buf, (uint8_t*) o->data, len);
|
||||||
|
|
||||||
|
bleio_scanentry_obj_t *entry = m_new_obj(bleio_scanentry_obj_t);
|
||||||
|
entry->base.type = &bleio_scanentry_type;
|
||||||
|
entry->rssi = rssi;
|
||||||
|
|
||||||
|
bleio_address_obj_t *address = m_new_obj(bleio_address_obj_t);
|
||||||
|
address->base.type = &bleio_address_type;
|
||||||
|
common_hal_bleio_address_construct(MP_OBJ_TO_PTR(address), peer_addr, addr_type);
|
||||||
|
entry->address = address;
|
||||||
|
|
||||||
|
entry->data = o;
|
||||||
|
entry->time_received = ticks_ms;
|
||||||
|
entry->connectable = connectable;
|
||||||
|
entry->scan_response = scan_response;
|
||||||
|
|
||||||
|
return MP_OBJ_FROM_PTR(entry);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void shared_module_bleio_scanresults_append(bleio_scanresults_obj_t* self,
|
||||||
|
uint64_t ticks_ms,
|
||||||
|
bool connectable,
|
||||||
|
bool scan_response,
|
||||||
|
int8_t rssi,
|
||||||
|
uint8_t *peer_addr,
|
||||||
|
uint8_t addr_type,
|
||||||
|
uint8_t *data,
|
||||||
|
uint16_t len) {
|
||||||
|
int32_t packet_size = sizeof(uint8_t) + sizeof(ticks_ms) + sizeof(rssi) + NUM_BLEIO_ADDRESS_BYTES +
|
||||||
|
sizeof(addr_type) + sizeof(len) + len;
|
||||||
|
int32_t empty_space = self->buf.size - ringbuf_count(&self->buf);
|
||||||
|
if (packet_size >= empty_space) {
|
||||||
|
// We can't fit the packet so skip it.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// Filter the packet.
|
||||||
|
if (rssi < self->minimum_rssi) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If any prefixes are provided, then only include packets that include at least one of them.
|
||||||
|
if (!bleio_scanentry_data_matches(data, len, self->prefixes, self->prefix_length, true)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
uint8_t type = 0;
|
||||||
|
if (connectable) {
|
||||||
|
type |= 1 << 0;
|
||||||
|
}
|
||||||
|
if (scan_response) {
|
||||||
|
type |= 1 << 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add the packet to the buffer.
|
||||||
|
ringbuf_put(&self->buf, type);
|
||||||
|
ringbuf_put_n(&self->buf, (uint8_t*) &ticks_ms, sizeof(ticks_ms));
|
||||||
|
ringbuf_put(&self->buf, rssi);
|
||||||
|
ringbuf_put_n(&self->buf, peer_addr, NUM_BLEIO_ADDRESS_BYTES);
|
||||||
|
ringbuf_put(&self->buf, addr_type);
|
||||||
|
ringbuf_put_n(&self->buf, (uint8_t*) &len, sizeof(len));
|
||||||
|
ringbuf_put_n(&self->buf, data, len);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool shared_module_bleio_scanresults_get_done(bleio_scanresults_obj_t* self) {
|
||||||
|
return self->done;
|
||||||
|
}
|
||||||
|
|
||||||
|
void shared_module_bleio_scanresults_set_done(bleio_scanresults_obj_t* self, bool done) {
|
||||||
|
self->done = done;
|
||||||
|
self->common_hal_data = NULL;
|
||||||
|
}
|
|
@ -0,0 +1,64 @@
|
||||||
|
/*
|
||||||
|
* This file is part of the MicroPython project, http://micropython.org/
|
||||||
|
*
|
||||||
|
* The MIT License (MIT)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2019 Dan Halbert for Adafruit Industries
|
||||||
|
* Copyright (c) 2018 Artur Pacholec
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef MICROPY_INCLUDED_SHARED_MODULE_BLEIO_SCANRESULTS_H
|
||||||
|
#define MICROPY_INCLUDED_SHARED_MODULE_BLEIO_SCANRESULTS_H
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "py/obj.h"
|
||||||
|
#include "py/ringbuf.h"
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
mp_obj_base_t base;
|
||||||
|
// Pointers that needs to live until the scan is done.
|
||||||
|
void* common_hal_data;
|
||||||
|
ringbuf_t buf;
|
||||||
|
// Prefixes is a length encoded array of prefixes.
|
||||||
|
uint8_t* prefixes;
|
||||||
|
size_t prefix_length;
|
||||||
|
mp_int_t minimum_rssi;
|
||||||
|
bool active;
|
||||||
|
bool done;
|
||||||
|
} bleio_scanresults_obj_t;
|
||||||
|
|
||||||
|
bleio_scanresults_obj_t* shared_module_bleio_new_scanresults(size_t buffer_size, uint8_t* prefixes, size_t prefixes_len, mp_int_t minimum_rssi);
|
||||||
|
|
||||||
|
bool shared_module_bleio_scanresults_get_done(bleio_scanresults_obj_t* self);
|
||||||
|
void shared_module_bleio_scanresults_set_done(bleio_scanresults_obj_t* self, bool done);
|
||||||
|
|
||||||
|
void shared_module_bleio_scanresults_append(bleio_scanresults_obj_t* self,
|
||||||
|
uint64_t ticks_ms,
|
||||||
|
bool connectable,
|
||||||
|
bool scan_result,
|
||||||
|
int8_t rssi,
|
||||||
|
uint8_t *peer_addr,
|
||||||
|
uint8_t addr_type,
|
||||||
|
uint8_t* data,
|
||||||
|
uint16_t len);
|
||||||
|
|
||||||
|
#endif // MICROPY_INCLUDED_SHARED_MODULE_BLEIO_SCANRESULTS_H
|
|
@ -76,3 +76,11 @@ void autoreload_stop() {
|
||||||
autoreload_delay_ms = 0;
|
autoreload_delay_ms = 0;
|
||||||
reload_requested = false;
|
reload_requested = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void autoreload_now() {
|
||||||
|
if (!autoreload_enabled || autoreload_suspended || reload_requested) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
mp_raise_reload_exception();
|
||||||
|
reload_requested = true;
|
||||||
|
}
|
||||||
|
|
|
@ -43,4 +43,6 @@ bool autoreload_is_enabled(void);
|
||||||
void autoreload_suspend(void);
|
void autoreload_suspend(void);
|
||||||
void autoreload_resume(void);
|
void autoreload_resume(void);
|
||||||
|
|
||||||
|
void autoreload_now(void);
|
||||||
|
|
||||||
#endif // MICROPY_INCLUDED_SUPERVISOR_AUTORELOAD_H
|
#endif // MICROPY_INCLUDED_SUPERVISOR_AUTORELOAD_H
|
||||||
|
|
|
@ -0,0 +1,340 @@
|
||||||
|
/*
|
||||||
|
* This file is part of the MicroPython project, http://micropython.org/
|
||||||
|
*
|
||||||
|
* The MIT License (MIT)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2019 Scott Shawcroft for Adafruit Industries
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "extmod/vfs.h"
|
||||||
|
#include "extmod/vfs_fat.h"
|
||||||
|
|
||||||
|
#include "shared-bindings/_bleio/__init__.h"
|
||||||
|
#include "shared-bindings/_bleio/Adapter.h"
|
||||||
|
#include "shared-bindings/_bleio/Characteristic.h"
|
||||||
|
#include "shared-bindings/_bleio/Service.h"
|
||||||
|
#include "shared-bindings/_bleio/UUID.h"
|
||||||
|
|
||||||
|
#include "common-hal/_bleio/__init__.h"
|
||||||
|
|
||||||
|
#include "supervisor/shared/autoreload.h"
|
||||||
|
|
||||||
|
#include "py/mpstate.h"
|
||||||
|
|
||||||
|
bleio_service_obj_t supervisor_ble_service;
|
||||||
|
bleio_uuid_obj_t supervisor_ble_service_uuid;
|
||||||
|
bleio_characteristic_obj_t supervisor_ble_version_characteristic;
|
||||||
|
bleio_uuid_obj_t supervisor_ble_version_uuid;
|
||||||
|
bleio_characteristic_obj_t supervisor_ble_filename_characteristic;
|
||||||
|
bleio_uuid_obj_t supervisor_ble_filename_uuid;
|
||||||
|
bleio_characteristic_obj_t supervisor_ble_length_characteristic;
|
||||||
|
bleio_uuid_obj_t supervisor_ble_length_uuid;
|
||||||
|
bleio_characteristic_obj_t supervisor_ble_contents_characteristic;
|
||||||
|
bleio_uuid_obj_t supervisor_ble_contents_uuid;
|
||||||
|
const uint8_t circuitpython_base_uuid[16] = {0x6e, 0x68, 0x74, 0x79, 0x50, 0x74, 0x69, 0x75, 0x63, 0x72, 0x69, 0x43, 0x00, 0x00, 0xaf, 0xad };
|
||||||
|
uint8_t circuitpython_advertising_data[] = { 0x02, 0x01, 0x06, 0x02, 0x0a, 0x00, 0x11, 0x07, 0x6e, 0x68, 0x74, 0x79, 0x50, 0x74, 0x69, 0x75, 0x63, 0x72, 0x69, 0x43, 0x00, 0x01, 0xaf, 0xad, 0x06, 0x08, 0x43, 0x49, 0x52, 0x43, 0x55 };
|
||||||
|
uint8_t circuitpython_scan_response_data[15] = {0x0e, 0x09, 0x43, 0x49, 0x52, 0x43, 0x55, 0x49, 0x54, 0x50, 0x59, 0x00, 0x00, 0x00, 0x00};
|
||||||
|
mp_obj_list_t service_list;
|
||||||
|
mp_obj_t service_list_items[1];
|
||||||
|
mp_obj_list_t characteristic_list;
|
||||||
|
mp_obj_t characteristic_list_items[4];
|
||||||
|
|
||||||
|
void supervisor_bluetooth_start_advertising(void) {
|
||||||
|
bool is_connected = common_hal_bleio_adapter_get_connected(&common_hal_bleio_adapter_obj);
|
||||||
|
if (is_connected) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// TODO: switch to Adafruit short UUID for the advertisement and add manufacturing data to distinguish ourselves from arduino.
|
||||||
|
_common_hal_bleio_adapter_start_advertising(&common_hal_bleio_adapter_obj,
|
||||||
|
true,
|
||||||
|
1.0,
|
||||||
|
circuitpython_advertising_data,
|
||||||
|
sizeof(circuitpython_advertising_data),
|
||||||
|
circuitpython_scan_response_data,
|
||||||
|
sizeof(circuitpython_scan_response_data));
|
||||||
|
}
|
||||||
|
|
||||||
|
void supervisor_start_bluetooth(void) {
|
||||||
|
common_hal_bleio_adapter_set_enabled(&common_hal_bleio_adapter_obj, true);
|
||||||
|
|
||||||
|
supervisor_ble_service_uuid.base.type = &bleio_uuid_type;
|
||||||
|
common_hal_bleio_uuid_construct(&supervisor_ble_service_uuid, 0x0100, circuitpython_base_uuid);
|
||||||
|
|
||||||
|
// We know we'll only be 1 characteristic so we can statically allocate it.
|
||||||
|
characteristic_list.base.type = &mp_type_list;
|
||||||
|
characteristic_list.alloc = sizeof(characteristic_list_items) / sizeof(characteristic_list_items[0]);
|
||||||
|
characteristic_list.len = 0;
|
||||||
|
characteristic_list.items = characteristic_list_items;
|
||||||
|
mp_seq_clear(characteristic_list.items, 0, characteristic_list.alloc, sizeof(*characteristic_list.items));
|
||||||
|
|
||||||
|
_common_hal_bleio_service_construct(&supervisor_ble_service, &supervisor_ble_service_uuid, false /* is secondary */, &characteristic_list);
|
||||||
|
|
||||||
|
// File length
|
||||||
|
supervisor_ble_version_uuid.base.type = &bleio_uuid_type;
|
||||||
|
common_hal_bleio_uuid_construct(&supervisor_ble_version_uuid, 0x0203, circuitpython_base_uuid);
|
||||||
|
common_hal_bleio_characteristic_construct(&supervisor_ble_version_characteristic,
|
||||||
|
&supervisor_ble_service,
|
||||||
|
0, // handle (for remote only)
|
||||||
|
&supervisor_ble_version_uuid,
|
||||||
|
CHAR_PROP_READ,
|
||||||
|
SECURITY_MODE_OPEN,
|
||||||
|
SECURITY_MODE_NO_ACCESS,
|
||||||
|
4, // max length
|
||||||
|
true, // fixed length
|
||||||
|
NULL); // no initial value
|
||||||
|
|
||||||
|
uint32_t version = 1;
|
||||||
|
mp_buffer_info_t bufinfo;
|
||||||
|
bufinfo.buf = &version;
|
||||||
|
bufinfo.len = sizeof(version);
|
||||||
|
common_hal_bleio_characteristic_set_value(&supervisor_ble_version_characteristic, &bufinfo);
|
||||||
|
|
||||||
|
// Active filename.
|
||||||
|
supervisor_ble_filename_uuid.base.type = &bleio_uuid_type;
|
||||||
|
common_hal_bleio_uuid_construct(&supervisor_ble_filename_uuid, 0x0200, circuitpython_base_uuid);
|
||||||
|
common_hal_bleio_characteristic_construct(&supervisor_ble_filename_characteristic,
|
||||||
|
&supervisor_ble_service,
|
||||||
|
0, // handle (for remote only)
|
||||||
|
&supervisor_ble_filename_uuid,
|
||||||
|
CHAR_PROP_READ | CHAR_PROP_WRITE,
|
||||||
|
SECURITY_MODE_OPEN,
|
||||||
|
SECURITY_MODE_OPEN,
|
||||||
|
500, // max length
|
||||||
|
false, // fixed length
|
||||||
|
NULL); // no initial value
|
||||||
|
|
||||||
|
char code_py[] = "/code.py";
|
||||||
|
bufinfo.buf = code_py;
|
||||||
|
bufinfo.len = sizeof(code_py);
|
||||||
|
common_hal_bleio_characteristic_set_value(&supervisor_ble_filename_characteristic, &bufinfo);
|
||||||
|
|
||||||
|
// File length
|
||||||
|
supervisor_ble_length_uuid.base.type = &bleio_uuid_type;
|
||||||
|
common_hal_bleio_uuid_construct(&supervisor_ble_length_uuid, 0x0202, circuitpython_base_uuid);
|
||||||
|
common_hal_bleio_characteristic_construct(&supervisor_ble_length_characteristic,
|
||||||
|
&supervisor_ble_service,
|
||||||
|
0, // handle (for remote only)
|
||||||
|
&supervisor_ble_length_uuid,
|
||||||
|
CHAR_PROP_NOTIFY | CHAR_PROP_READ,
|
||||||
|
SECURITY_MODE_OPEN,
|
||||||
|
SECURITY_MODE_NO_ACCESS,
|
||||||
|
4, // max length
|
||||||
|
true, // fixed length
|
||||||
|
NULL); // no initial value
|
||||||
|
|
||||||
|
// File actions
|
||||||
|
supervisor_ble_contents_uuid.base.type = &bleio_uuid_type;
|
||||||
|
common_hal_bleio_uuid_construct(&supervisor_ble_contents_uuid, 0x0201, circuitpython_base_uuid);
|
||||||
|
common_hal_bleio_characteristic_construct(&supervisor_ble_contents_characteristic,
|
||||||
|
&supervisor_ble_service,
|
||||||
|
0, // handle (for remote only)
|
||||||
|
&supervisor_ble_contents_uuid,
|
||||||
|
CHAR_PROP_NOTIFY | CHAR_PROP_WRITE_NO_RESPONSE | CHAR_PROP_WRITE,
|
||||||
|
SECURITY_MODE_OPEN,
|
||||||
|
SECURITY_MODE_OPEN,
|
||||||
|
500, // max length
|
||||||
|
false, // fixed length
|
||||||
|
NULL); // no initial value
|
||||||
|
|
||||||
|
supervisor_bluetooth_start_advertising();
|
||||||
|
vm_used_ble = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
FIL active_file;
|
||||||
|
volatile bool new_filename;
|
||||||
|
volatile bool run_ble_background;
|
||||||
|
bool was_connected;
|
||||||
|
|
||||||
|
void update_file_length(void) {
|
||||||
|
int32_t file_length = -1;
|
||||||
|
mp_buffer_info_t bufinfo;
|
||||||
|
bufinfo.buf = &file_length;
|
||||||
|
bufinfo.len = sizeof(file_length);
|
||||||
|
if (active_file.obj.fs != 0) {
|
||||||
|
file_length = (int32_t) f_size(&active_file);
|
||||||
|
}
|
||||||
|
common_hal_bleio_characteristic_set_value(&supervisor_ble_length_characteristic, &bufinfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
void open_current_file(void) {
|
||||||
|
if (active_file.obj.fs != 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
uint16_t max_len = supervisor_ble_filename_characteristic.max_length;
|
||||||
|
uint8_t path[max_len];
|
||||||
|
size_t length = common_hal_bleio_characteristic_get_value(&supervisor_ble_filename_characteristic, path, max_len - 1);
|
||||||
|
path[length] = '\0';
|
||||||
|
|
||||||
|
FATFS *fs = &((fs_user_mount_t *) MP_STATE_VM(vfs_mount_table)->obj)->fatfs;
|
||||||
|
f_open(fs, &active_file, (char*) path, FA_READ | FA_WRITE);
|
||||||
|
|
||||||
|
update_file_length();
|
||||||
|
}
|
||||||
|
|
||||||
|
void close_current_file(void) {
|
||||||
|
f_close(&active_file);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t current_command[1024 / sizeof(uint32_t)];
|
||||||
|
volatile size_t current_offset;
|
||||||
|
|
||||||
|
void supervisor_bluetooth_background(void) {
|
||||||
|
if (!run_ble_background) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
bool is_connected = common_hal_bleio_adapter_get_connected(&common_hal_bleio_adapter_obj);
|
||||||
|
if (!was_connected && is_connected) {
|
||||||
|
open_current_file();
|
||||||
|
} else if (was_connected && !is_connected) {
|
||||||
|
close_current_file();
|
||||||
|
new_filename = false;
|
||||||
|
}
|
||||||
|
was_connected = is_connected;
|
||||||
|
run_ble_background = false;
|
||||||
|
if (!is_connected) {
|
||||||
|
supervisor_bluetooth_start_advertising();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (new_filename) {
|
||||||
|
close_current_file();
|
||||||
|
open_current_file();
|
||||||
|
|
||||||
|
new_filename = false;
|
||||||
|
// get length and set the characteristic for it
|
||||||
|
}
|
||||||
|
uint16_t current_length = ((uint16_t*) current_command)[0];
|
||||||
|
if (current_length > 0 && current_length == current_offset) {
|
||||||
|
uint16_t command = ((uint16_t *) current_command)[1];
|
||||||
|
|
||||||
|
if (command == 1) {
|
||||||
|
uint16_t max_len = 20; //supervisor_ble_contents_characteristic.max_length;
|
||||||
|
uint8_t buf[max_len];
|
||||||
|
mp_buffer_info_t bufinfo;
|
||||||
|
bufinfo.buf = buf;
|
||||||
|
f_lseek(&active_file, 0);
|
||||||
|
while (f_read(&active_file, buf, max_len, &bufinfo.len) == FR_OK) {
|
||||||
|
if (bufinfo.len == 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
common_hal_bleio_characteristic_set_value(&supervisor_ble_contents_characteristic, &bufinfo);
|
||||||
|
}
|
||||||
|
} else if (command == 2) { // patch
|
||||||
|
uint32_t offset = current_command[1];
|
||||||
|
uint32_t remove_length = current_command[2];
|
||||||
|
uint32_t insert_length = current_command[3];
|
||||||
|
uint32_t file_length = (int32_t) f_size(&active_file);
|
||||||
|
//uint32_t data_shift_length = fileLength - offset - remove_length;
|
||||||
|
int32_t data_shift = insert_length - remove_length;
|
||||||
|
uint32_t new_length = file_length + data_shift;
|
||||||
|
|
||||||
|
// TODO: Make these loops smarter to read and write on sector boundaries.
|
||||||
|
if (data_shift < 0) {
|
||||||
|
for (uint32_t shift_offset = offset + insert_length; shift_offset < new_length; shift_offset++) {
|
||||||
|
uint8_t data;
|
||||||
|
UINT actual;
|
||||||
|
f_lseek(&active_file, shift_offset - data_shift);
|
||||||
|
f_read(&active_file, &data, 1, &actual);
|
||||||
|
f_lseek(&active_file, shift_offset);
|
||||||
|
f_write(&active_file, &data, 1, &actual);
|
||||||
|
}
|
||||||
|
f_truncate(&active_file);
|
||||||
|
} else if (data_shift > 0) {
|
||||||
|
f_lseek(&active_file, file_length);
|
||||||
|
// Fill end with 0xff so we don't need to erase.
|
||||||
|
uint8_t data = 0xff;
|
||||||
|
for (size_t i = 0; i < (size_t) data_shift; i++) {
|
||||||
|
UINT actual;
|
||||||
|
f_write(&active_file, &data, 1, &actual);
|
||||||
|
}
|
||||||
|
for (uint32_t shift_offset = new_length - 1; shift_offset >= offset + insert_length ; shift_offset--) {
|
||||||
|
UINT actual;
|
||||||
|
f_lseek(&active_file, shift_offset - data_shift);
|
||||||
|
f_read(&active_file, &data, 1, &actual);
|
||||||
|
f_lseek(&active_file, shift_offset);
|
||||||
|
f_write(&active_file, &data, 1, &actual);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
f_lseek(&active_file, offset);
|
||||||
|
uint8_t* data = (uint8_t *) (current_command + 4);
|
||||||
|
UINT written;
|
||||||
|
f_write(&active_file, data, insert_length, &written);
|
||||||
|
f_sync(&active_file);
|
||||||
|
// Notify the new file length.
|
||||||
|
update_file_length();
|
||||||
|
|
||||||
|
// Trigger an autoreload
|
||||||
|
autoreload_now();
|
||||||
|
}
|
||||||
|
current_offset = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// This happens in an interrupt so we need to be quick.
|
||||||
|
bool supervisor_bluetooth_hook(ble_evt_t *ble_evt) {
|
||||||
|
// Catch writes to filename or contents. Length is read-only.
|
||||||
|
|
||||||
|
bool done = false;
|
||||||
|
switch (ble_evt->header.evt_id) {
|
||||||
|
case BLE_GAP_EVT_CONNECTED:
|
||||||
|
// We run our background task even if it wasn't us connected to because we may want to
|
||||||
|
// advertise if the user code stopped advertising.
|
||||||
|
run_ble_background = true;
|
||||||
|
break;
|
||||||
|
case BLE_GAP_EVT_DISCONNECTED:
|
||||||
|
run_ble_background = true;
|
||||||
|
break;
|
||||||
|
case BLE_GATTS_EVT_WRITE: {
|
||||||
|
// A client wrote to a characteristic.
|
||||||
|
|
||||||
|
ble_gatts_evt_write_t *evt_write = &ble_evt->evt.gatts_evt.params.write;
|
||||||
|
// Event handle must match the handle for my characteristic.
|
||||||
|
if (evt_write->handle == supervisor_ble_contents_characteristic.handle) {
|
||||||
|
// Handle events
|
||||||
|
//write_to_ringbuf(self, evt_write->data, evt_write->len);
|
||||||
|
// First packet includes a uint16_t le for length at the start.
|
||||||
|
uint16_t current_length = ((uint16_t*) current_command)[0];
|
||||||
|
memcpy(((uint8_t*) current_command) + current_offset, evt_write->data, evt_write->len);
|
||||||
|
current_offset += evt_write->len;
|
||||||
|
current_length = ((uint16_t*) current_command)[0];
|
||||||
|
if (current_offset == current_length) {
|
||||||
|
run_ble_background = true;
|
||||||
|
done = true;
|
||||||
|
}
|
||||||
|
} else if (evt_write->handle == supervisor_ble_filename_characteristic.handle) {
|
||||||
|
new_filename = true;
|
||||||
|
run_ble_background = true;
|
||||||
|
done = true;
|
||||||
|
} else {
|
||||||
|
return done;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
// For debugging.
|
||||||
|
// mp_printf(&mp_plat_print, "Unhandled peripheral event: 0x%04x\n", ble_evt->header.evt_id);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return done;
|
||||||
|
}
|
|
@ -0,0 +1,34 @@
|
||||||
|
/*
|
||||||
|
* This file is part of the MicroPython project, http://micropython.org/
|
||||||
|
*
|
||||||
|
* The MIT License (MIT)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2019 Scott Shawcroft for Adafruit Industries
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef MICROPY_INCLUDED_SUPERVISOR_SHARED_BLUETOOTH_H
|
||||||
|
#define MICROPY_INCLUDED_SUPERVISOR_SHARED_BLUETOOTH_H
|
||||||
|
|
||||||
|
void supervisor_start_bluetooth(void);
|
||||||
|
bool supervisor_bluetooth_hook(ble_evt_t *ble_evt);
|
||||||
|
void supervisor_bluetooth_background(void);
|
||||||
|
|
||||||
|
#endif
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue