Merge commit 'f869d6b2e339c04469c6c9ea3fb2fabd7bbb2d8c' into nrf2_merge
This is prep for merging in the NRF5 pull request.
This commit is contained in:
commit
73c15dcf8b
23
.gitattributes
vendored
23
.gitattributes
vendored
@ -15,16 +15,13 @@
|
|||||||
# These should also not be modified by git.
|
# These should also not be modified by git.
|
||||||
tests/basics/string_cr_conversion.py -text
|
tests/basics/string_cr_conversion.py -text
|
||||||
tests/basics/string_crlf_conversion.py -text
|
tests/basics/string_crlf_conversion.py -text
|
||||||
stmhal/pybcdc.inf_template -text
|
ports/stm32/pybcdc.inf_template -text
|
||||||
stmhal/usbd_* -text
|
ports/stm32/usbd_* -text
|
||||||
stmhal/boards/*/stm32f4xx_hal_conf.h -text
|
ports/stm32/usbdev/** -text
|
||||||
stmhal/cmsis/** -text
|
ports/stm32/usbhost/** -text
|
||||||
stmhal/hal/** -text
|
ports/cc3200/hal/aes.c -text
|
||||||
stmhal/usbdev/** -text
|
ports/cc3200/hal/aes.h -text
|
||||||
stmhal/usbhost/** -text
|
ports/cc3200/hal/des.c -text
|
||||||
cc3200/hal/aes.c -text
|
ports/cc3200/hal/i2s.c -text
|
||||||
cc3200/hal/aes.h -text
|
ports/cc3200/hal/i2s.h -text
|
||||||
cc3200/hal/des.c -text
|
ports/cc3200/version.h -text
|
||||||
cc3200/hal/i2s.c -text
|
|
||||||
cc3200/hal/i2s.h -text
|
|
||||||
cc3200/version.h -text
|
|
||||||
|
11
.gitmodules
vendored
11
.gitmodules
vendored
@ -11,19 +11,12 @@
|
|||||||
[submodule "lib/berkeley-db-1.xx"]
|
[submodule "lib/berkeley-db-1.xx"]
|
||||||
path = lib/berkeley-db-1.xx
|
path = lib/berkeley-db-1.xx
|
||||||
url = https://github.com/pfalcon/berkeley-db-1.xx
|
url = https://github.com/pfalcon/berkeley-db-1.xx
|
||||||
[submodule "freetouch2"]
|
|
||||||
path = atmel-samd/freetouch
|
|
||||||
url = https://github.com/adafruit/Adafruit_FreeTouch.git
|
|
||||||
[submodule "tools/uf2"]
|
[submodule "tools/uf2"]
|
||||||
path = tools/uf2
|
path = tools/uf2
|
||||||
url = https://github.com/Microsoft/uf2.git
|
url = https://github.com/Microsoft/uf2.git
|
||||||
[submodule "atmel-samd/frozen/Adafruit_CircuitPython_NeoPixel"]
|
[submodule "atmel-samd/frozen/Adafruit_CircuitPython_NeoPixel"]
|
||||||
path = frozen/Adafruit_CircuitPython_NeoPixel
|
path = frozen/Adafruit_CircuitPython_NeoPixel
|
||||||
url = https://github.com/adafruit/Adafruit_CircuitPython_NeoPixel
|
url = https://github.com/adafruit/Adafruit_CircuitPython_NeoPixel
|
||||||
[submodule "atmel-samd/asf4"]
|
|
||||||
path = atmel-samd/asf4
|
|
||||||
url = https://github.com/adafruit/asf4.git
|
|
||||||
branch = circuitpython
|
|
||||||
[submodule "frozen/Adafruit_CircuitPython_Thermistor"]
|
[submodule "frozen/Adafruit_CircuitPython_Thermistor"]
|
||||||
path = frozen/Adafruit_CircuitPython_Thermistor
|
path = frozen/Adafruit_CircuitPython_Thermistor
|
||||||
url = https://github.com/adafruit/Adafruit_CircuitPython_Thermistor.git
|
url = https://github.com/adafruit/Adafruit_CircuitPython_Thermistor.git
|
||||||
@ -33,3 +26,7 @@
|
|||||||
[submodule "frozen/Adafruit_CircuitPython_BusDevice"]
|
[submodule "frozen/Adafruit_CircuitPython_BusDevice"]
|
||||||
path = frozen/Adafruit_CircuitPython_BusDevice
|
path = frozen/Adafruit_CircuitPython_BusDevice
|
||||||
url = https://github.com/adafruit/Adafruit_CircuitPython_BusDevice.git
|
url = https://github.com/adafruit/Adafruit_CircuitPython_BusDevice.git
|
||||||
|
[submodule "lib/stm32lib"]
|
||||||
|
path = lib/stm32lib
|
||||||
|
url = https://github.com/micropython/stm32lib
|
||||||
|
branch = work-F4-1.13.1+F7-1.5.0+L4-1.3.0
|
||||||
|
33
.travis.yml
33
.travis.yml
@ -37,9 +37,8 @@ before_script:
|
|||||||
- sudo apt-get install -y --force-yes gcc-arm-embedded
|
- sudo apt-get install -y --force-yes gcc-arm-embedded
|
||||||
# For teensy build
|
# For teensy build
|
||||||
- sudo apt-get install realpath
|
- sudo apt-get install realpath
|
||||||
# For coverage testing
|
# For coverage testing (upgrade is used to get latest urllib3 version)
|
||||||
# cpp-coveralls 0.4 conflicts with urllib3 preinstalled in Travis VM
|
- sudo pip install --upgrade cpp-coveralls
|
||||||
- sudo pip install cpp-coveralls==0.3.12
|
|
||||||
- gcc --version
|
- gcc --version
|
||||||
- arm-none-eabi-gcc --version
|
- arm-none-eabi-gcc --version
|
||||||
- python3 --version
|
- python3 --version
|
||||||
@ -48,30 +47,30 @@ script:
|
|||||||
# Build mpy-cross first because other builds depend on it.
|
# Build mpy-cross first because other builds depend on it.
|
||||||
- make -C mpy-cross
|
- make -C mpy-cross
|
||||||
- tools/build_adafruit_bins.sh
|
- tools/build_adafruit_bins.sh
|
||||||
- make -C minimal CROSS=1 build/firmware.bin
|
- make -C ports/minimal CROSS=1 build/firmware.bin
|
||||||
- ls -l minimal/build/firmware.bin
|
- ls -l ports/minimal/build/firmware.bin
|
||||||
- mkdir -p ${HOME}/persist
|
- mkdir -p ${HOME}/persist
|
||||||
# Save new firmware for reference, but only if building a main branch, not a pull request
|
# Save new firmware for reference, but only if building a main branch, not a pull request
|
||||||
- 'if [ "$TRAVIS_PULL_REQUEST" = "false" ]; then cp minimal/build/firmware.bin ${HOME}/persist/; fi'
|
- 'if [ "$TRAVIS_PULL_REQUEST" = "false" ]; then cp ports/minimal/build/firmware.bin ${HOME}/persist/; fi'
|
||||||
- make -C unix deplibs
|
- make -C ports/unix deplibs
|
||||||
- make -C unix
|
- make -C ports/unix
|
||||||
- make -C bare-arm
|
- make -C ports/bare-arm
|
||||||
- make -C qemu-arm test
|
- make -C ports/qemu-arm test
|
||||||
|
|
||||||
# run tests without coverage info
|
# run tests without coverage info
|
||||||
#- (cd tests && MICROPY_CPYTHON3=python3.4 ./run-tests)
|
#- (cd tests && MICROPY_CPYTHON3=python3.4 ./run-tests)
|
||||||
#- (cd tests && MICROPY_CPYTHON3=python3.4 ./run-tests --emit native)
|
#- (cd tests && MICROPY_CPYTHON3=python3.4 ./run-tests --emit native)
|
||||||
|
|
||||||
# run tests with coverage info
|
# run tests with coverage info
|
||||||
- make -C unix coverage
|
- make -C ports/unix coverage
|
||||||
- (cd tests && MICROPY_CPYTHON3=python3.4 MICROPY_MICROPYTHON=../unix/micropython_coverage ./run-tests)
|
- (cd tests && MICROPY_CPYTHON3=python3.4 MICROPY_MICROPYTHON=../ports/unix/micropython_coverage ./run-tests)
|
||||||
- (cd tests && MICROPY_CPYTHON3=python3.4 MICROPY_MICROPYTHON=../unix/micropython_coverage ./run-tests -d thread)
|
- (cd tests && MICROPY_CPYTHON3=python3.4 MICROPY_MICROPYTHON=../ports/unix/micropython_coverage ./run-tests -d thread)
|
||||||
- (cd tests && MICROPY_CPYTHON3=python3.4 MICROPY_MICROPYTHON=../unix/micropython_coverage ./run-tests --emit native)
|
- (cd tests && MICROPY_CPYTHON3=python3.4 MICROPY_MICROPYTHON=../ports/unix/micropython_coverage ./run-tests --emit native)
|
||||||
- (cd tests && MICROPY_CPYTHON3=python3.4 MICROPY_MICROPYTHON=../unix/micropython_coverage ./run-tests --via-mpy -d basics float)
|
- (cd tests && MICROPY_CPYTHON3=python3.4 MICROPY_MICROPYTHON=../ports/unix/micropython_coverage ./run-tests --via-mpy -d basics float)
|
||||||
|
|
||||||
# run coveralls coverage analysis (try to, even if some builds/tests failed)
|
# run coveralls coverage analysis (try to, even if some builds/tests failed)
|
||||||
#- (cd unix && coveralls --root .. --build-root . --gcov $(which gcov) --gcov-options '\-o build-coverage/' --include py --include extmod)
|
#- (cd ports/unix && coveralls --root ../.. --build-root . --gcov $(which gcov) --gcov-options '\-o build-coverage/' --include py --include extmod)
|
||||||
|
|
||||||
after_failure:
|
after_failure:
|
||||||
- (cd tests && for exp in *.exp; do testbase=$(basename $exp .exp); echo -e "\nFAILURE $testbase"; diff -u $testbase.exp $testbase.out; done)
|
- (cd tests && for exp in *.exp; do testbase=$(basename $exp .exp); echo -e "\nFAILURE $testbase"; diff -u $testbase.exp $testbase.out; done)
|
||||||
- (grep "FAIL" qemu-arm/build/console.out)
|
- (grep "FAIL" ports/qemu-arm/build/console.out)
|
||||||
|
24
README.md
24
README.md
@ -177,24 +177,24 @@ CircuitPython:
|
|||||||
Ports include the code unique to a microcontroller line and also
|
Ports include the code unique to a microcontroller line and also
|
||||||
variations based on the board.
|
variations based on the board.
|
||||||
|
|
||||||
* `atmel-samd` Support for SAMD21 based boards such as [Arduino Zero][],
|
* `ports/atmel-samd` Support for SAMD21 based boards such as [Arduino Zero][],
|
||||||
[Adafruit Feather M0 Basic][], and [Adafruit Feather M0 Bluefruit LE][].
|
[Adafruit Feather M0 Basic][], and [Adafruit Feather M0 Bluefruit LE][].
|
||||||
* `bare-arm` A bare minimum version of MicroPython for ARM MCUs.
|
* `ports/bare-arm` A bare minimum version of MicroPython for ARM MCUs.
|
||||||
* `cc3200` Support for boards based [CC3200](http://www.ti.com/product/CC3200)
|
* `ports/cc3200` Support for boards based [CC3200](http://www.ti.com/product/CC3200)
|
||||||
from TI such as the [WiPy 1.0](https://www.pycom.io/solutions/py-boards/wipy1/).
|
from TI such as the [WiPy 1.0](https://www.pycom.io/solutions/py-boards/wipy1/).
|
||||||
* `esp8266` Support for boards based on ESP8266 WiFi modules such as the
|
* `ports/esp8266` Support for boards based on ESP8266 WiFi modules such as the
|
||||||
[Adafruit Feather HUZZAH][].
|
[Adafruit Feather HUZZAH][].
|
||||||
* `minimal` A minimal MicroPython port. Start with this if you want
|
* `ports/minimal` A minimal MicroPython port. Start with this if you want
|
||||||
to port MicroPython to another microcontroller.
|
to port MicroPython to another microcontroller.
|
||||||
* `pic16bit` Support for 16-bit PIC microcontrollers.
|
* `ports/pic16bit` Support for 16-bit PIC microcontrollers.
|
||||||
* `qemu-arm` Support for ARM emulation through [QEMU](https://qemu.org).
|
* `ports/qemu-arm` Support for ARM emulation through [QEMU](https://qemu.org).
|
||||||
* `stmhal` Support for boards based on STM32 microcontrollers including
|
* `ports/stm32` Support for boards based on STM32 microcontrollers including
|
||||||
the MicroPython flagship [PyBoard](https://store.micropython.org/store/#/products/PYBv1_1).
|
the MicroPython flagship [PyBoard](https://store.micropython.org/store/#/products/PYBv1_1).
|
||||||
* `teensy` Support for the Teensy line of boards such as the
|
* `ports/teensy` Support for the Teensy line of boards such as the
|
||||||
[Teensy 3.1](https://www.pjrc.com/teensy/teensy31.html).
|
[Teensy 3.1](https://www.pjrc.com/teensy/teensy31.html).
|
||||||
* `unix` Support for UNIX.
|
* `ports/unix` Support for UNIX.
|
||||||
* `windows` Support for [Windows](https://www.microsoft.com/en-us/windows/).
|
* `ports/windows` Support for [Windows](https://www.microsoft.com/en-us/windows/).
|
||||||
* `zephyr` Support for [Zephyr](https://www.zephyrproject.org/), a
|
* `ports/zephyr` Support for [Zephyr](https://www.zephyrproject.org/), a
|
||||||
real-time operating system by the Linux Foundation.
|
real-time operating system by the Linux Foundation.
|
||||||
|
|
||||||
CircuitPython only maintains the `atmel-samd` and `esp8266` ports. The
|
CircuitPython only maintains the `atmel-samd` and `esp8266` ports. The
|
||||||
|
@ -1 +0,0 @@
|
|||||||
Subproject commit 7d8a8f99989a4de5b3fbf491df956d1aaca2c172
|
|
Binary file not shown.
@ -1,91 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of the MicroPython project, http://micropython.org/
|
|
||||||
*
|
|
||||||
* The MIT License (MIT)
|
|
||||||
*
|
|
||||||
* Copyright (c) 2013, 2014 Damien P. George
|
|
||||||
* Copyright (c) 2015 Daniel Campora
|
|
||||||
*
|
|
||||||
* 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 <string.h>
|
|
||||||
|
|
||||||
#include "py/mpstate.h"
|
|
||||||
#include "mpexception.h"
|
|
||||||
|
|
||||||
|
|
||||||
/******************************************************************************
|
|
||||||
DECLARE PRIVATE FUNCTIONS
|
|
||||||
******************************************************************************/
|
|
||||||
STATIC void mpexception_set_user_interrupt (int chr, void *data);
|
|
||||||
|
|
||||||
/******************************************************************************
|
|
||||||
DECLARE EXPORTED DATA
|
|
||||||
******************************************************************************/
|
|
||||||
const char mpexception_value_invalid_arguments[] = "invalid argument(s) value";
|
|
||||||
const char mpexception_num_type_invalid_arguments[] = "invalid argument(s) num/type";
|
|
||||||
const char mpexception_uncaught[] = "uncaught exception";
|
|
||||||
|
|
||||||
int user_interrupt_char = -1;
|
|
||||||
|
|
||||||
/******************************************************************************
|
|
||||||
DECLARE PRIVATE DATA
|
|
||||||
******************************************************************************/
|
|
||||||
STATIC void *user_interrupt_data = NULL;
|
|
||||||
|
|
||||||
/******************************************************************************
|
|
||||||
DEFINE PUBLIC FUNCTIONS
|
|
||||||
******************************************************************************/
|
|
||||||
|
|
||||||
void mpexception_init0 (void) {
|
|
||||||
// Create an exception object for interrupting through the stdin uart
|
|
||||||
MP_STATE_PORT(mp_const_user_interrupt) = mp_obj_new_exception(&mp_type_KeyboardInterrupt);
|
|
||||||
mpexception_set_user_interrupt (-1, MP_STATE_PORT(mp_const_user_interrupt));
|
|
||||||
}
|
|
||||||
|
|
||||||
void mpexception_set_interrupt_char (int c) {
|
|
||||||
if (c != -1) {
|
|
||||||
mp_obj_exception_clear_traceback(MP_STATE_PORT(mp_const_user_interrupt));
|
|
||||||
}
|
|
||||||
mpexception_set_user_interrupt(c, MP_STATE_PORT(mp_const_user_interrupt));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Call this function to raise a pending exception during an interrupt.
|
|
||||||
// It will try to raise the exception "softly" by setting the
|
|
||||||
// mp_pending_exception variable hoping that the VM will notice it.
|
|
||||||
void mpexception_nlr_jump (void *o) {
|
|
||||||
if (MP_STATE_PORT(mp_pending_exception) == MP_OBJ_NULL) {
|
|
||||||
MP_STATE_PORT(mp_pending_exception) = o;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void mpexception_keyboard_nlr_jump (void) {
|
|
||||||
mpexception_nlr_jump (user_interrupt_data);
|
|
||||||
}
|
|
||||||
|
|
||||||
/******************************************************************************
|
|
||||||
DEFINE PRIVATE FUNCTIONS
|
|
||||||
******************************************************************************/
|
|
||||||
|
|
||||||
STATIC void mpexception_set_user_interrupt (int chr, void *data) {
|
|
||||||
user_interrupt_char = chr;
|
|
||||||
user_interrupt_data = data;
|
|
||||||
}
|
|
@ -20,6 +20,20 @@ To set the colour of pixels use::
|
|||||||
>>> np[1] = (0, 128, 0) # set to green, half brightness
|
>>> np[1] = (0, 128, 0) # set to green, half brightness
|
||||||
>>> np[2] = (0, 0, 64) # set to blue, quarter brightness
|
>>> np[2] = (0, 0, 64) # set to blue, quarter brightness
|
||||||
|
|
||||||
|
For LEDs with more than 3 colours, such as RGBW pixels or RGBY pixels, the
|
||||||
|
NeoPixel class takes a ``bpp`` parameter. To setup a NeoPixel object for an
|
||||||
|
RGBW Pixel, do the following::
|
||||||
|
|
||||||
|
>>> import machine, neopixel
|
||||||
|
>>> np = neopixel.NeoPixel(machine.Pin(4), 8, bpp=4)
|
||||||
|
|
||||||
|
In a 4-bpp mode, remember to use 4-tuples instead of 3-tuples to set the colour.
|
||||||
|
For example to set the first three pixels use::
|
||||||
|
|
||||||
|
>>> np[0] = (255, 0, 0, 128) # Orange in an RGBY Setup
|
||||||
|
>>> np[1] = (0, 255, 0, 128) # Yellow-green in an RGBY Setup
|
||||||
|
>>> np[2] = (0, 0, 255, 128) # Green-blue in an RGBY Setup
|
||||||
|
|
||||||
Then use the ``write()`` method to output the colours to the LEDs::
|
Then use the ``write()`` method to output the colours to the LEDs::
|
||||||
|
|
||||||
>>> np.write()
|
>>> np.write()
|
||||||
|
@ -76,20 +76,24 @@ Example::
|
|||||||
Functions
|
Functions
|
||||||
---------
|
---------
|
||||||
|
|
||||||
.. function:: open(stream, \*, flags=0, cachesize=0, pagesize=0, minkeypage=0)
|
.. function:: open(stream, \*, flags=0, pagesize=0, cachesize=0, minkeypage=0)
|
||||||
|
|
||||||
Open a database from a random-access `stream` (like an open file). All
|
Open a database from a random-access `stream` (like an open file). All
|
||||||
other parameters are optional and keyword-only, and allow to tweak advanced
|
other parameters are optional and keyword-only, and allow to tweak advanced
|
||||||
parameters of the database operation (most users will not need them):
|
parameters of the database operation (most users will not need them):
|
||||||
|
|
||||||
* *flags* - Currently unused.
|
* *flags* - Currently unused.
|
||||||
* *cachesize* - Suggested maximum memory cache size in bytes. For a
|
|
||||||
board with enough memory using larger values may improve performance.
|
|
||||||
The value is only a recommendation, the module may use more memory if
|
|
||||||
values set too low.
|
|
||||||
* *pagesize* - Page size used for the nodes in BTree. Acceptable range
|
* *pagesize* - Page size used for the nodes in BTree. Acceptable range
|
||||||
is 512-65536. If 0, underlying I/O block size will be used (the best
|
is 512-65536. If 0, a port-specific default will be used, optimized for
|
||||||
compromise between memory usage and performance).
|
port's memory usage and/or performance.
|
||||||
|
* *cachesize* - Suggested memory cache size in bytes. For a
|
||||||
|
board with enough memory using larger values may improve performance.
|
||||||
|
Cache policy is as follows: entire cache is not allocated at once;
|
||||||
|
instead, accessing a new page in database will allocate a memory buffer
|
||||||
|
for it, until value specified by *cachesize* is reached. Then, these
|
||||||
|
buffers will be managed using LRU (least recently used) policy. More
|
||||||
|
buffers may still be allocated if needed (e.g., if a database contains
|
||||||
|
big keys and/or values). Allocated cache buffers aren't reclaimed.
|
||||||
* *minkeypage* - Minimum number of keys to store per page. Default value
|
* *minkeypage* - Minimum number of keys to store per page. Default value
|
||||||
of 0 equivalent to 2.
|
of 0 equivalent to 2.
|
||||||
|
|
||||||
|
@ -38,9 +38,9 @@ Constructors
|
|||||||
- *width* is the width of the FrameBuffer in pixels
|
- *width* is the width of the FrameBuffer in pixels
|
||||||
- *height* is the height of the FrameBuffer in pixels
|
- *height* is the height of the FrameBuffer in pixels
|
||||||
- *format* specifies the type of pixel used in the FrameBuffer;
|
- *format* specifies the type of pixel used in the FrameBuffer;
|
||||||
valid values are ``framebuf.MVLSB``, ``framebuf.RGB565``
|
permissible values are listed under Constants below. These set the
|
||||||
and ``framebuf.GS4_HMSB``. MVLSB is monochrome 1-bit color,
|
number of bits used to encode a color value and the layout of these
|
||||||
RGB565 is RGB 16-bit color, and GS4_HMSB is grayscale 4-bit color.
|
bits in *buffer*.
|
||||||
Where a color value c is passed to a method, c is a small integer
|
Where a color value c is passed to a method, c is a small integer
|
||||||
with an encoding that is dependent on the format of the FrameBuffer.
|
with an encoding that is dependent on the format of the FrameBuffer.
|
||||||
- *stride* is the number of pixels between each horizontal line
|
- *stride* is the number of pixels between each horizontal line
|
||||||
@ -110,8 +110,9 @@ Other methods
|
|||||||
corresponding color will be considered transparent: all pixels with that
|
corresponding color will be considered transparent: all pixels with that
|
||||||
color value will not be drawn.
|
color value will not be drawn.
|
||||||
|
|
||||||
This method works between FrameBuffer's utilising different formats, but the
|
This method works between FrameBuffer instances utilising different formats,
|
||||||
resulting colors may be unexpected due to the mismatch in color formats.
|
but the resulting colors may be unexpected due to the mismatch in color
|
||||||
|
formats.
|
||||||
|
|
||||||
Constants
|
Constants
|
||||||
---------
|
---------
|
||||||
|
@ -4,17 +4,44 @@
|
|||||||
class Signal -- control and sense external I/O devices
|
class Signal -- control and sense external I/O devices
|
||||||
======================================================
|
======================================================
|
||||||
|
|
||||||
The Signal class is a simple extension of Pin class. Unlike Pin, which
|
The Signal class is a simple extension of the `Pin` class. Unlike Pin, which
|
||||||
can be only in "absolute" 0 and 1 states, a Signal can be in "asserted"
|
can be only in "absolute" 0 and 1 states, a Signal can be in "asserted"
|
||||||
(on) or "deasserted" (off) states, while being inverted (active-low) or
|
(on) or "deasserted" (off) states, while being inverted (active-low) or
|
||||||
not. Summing up, it adds logical inversion support to Pin functionality.
|
not. In other words, it adds logical inversion support to Pin functionality.
|
||||||
While this may seem a simple addition, it is exactly what is needed to
|
While this may seem a simple addition, it is exactly what is needed to
|
||||||
support wide array of simple digital devices in a way portable across
|
support wide array of simple digital devices in a way portable across
|
||||||
different boards, which is one of the major MicroPython goals. Regardless
|
different boards, which is one of the major MicroPython goals. Regardless
|
||||||
whether different users have an active-high or active-low LED, a normally
|
of whether different users have an active-high or active-low LED, a normally
|
||||||
open or normally closed relay - you can develop single, nicely looking
|
open or normally closed relay - you can develop a single, nicely looking
|
||||||
application which works with each of them, and capture hardware
|
application which works with each of them, and capture hardware
|
||||||
configuration differences in few lines on the config file of your app.
|
configuration differences in few lines in the config file of your app.
|
||||||
|
|
||||||
|
Example::
|
||||||
|
|
||||||
|
from machine import Pin, Signal
|
||||||
|
|
||||||
|
# Suppose you have an active-high LED on pin 0
|
||||||
|
led1_pin = Pin(0, Pin.OUT)
|
||||||
|
# ... and active-low LED on pin 1
|
||||||
|
led2_pin = Pin(1, Pin.OUT)
|
||||||
|
|
||||||
|
# Now to light up both of them using Pin class, you'll need to set
|
||||||
|
# them to different values
|
||||||
|
led1_pin.value(1)
|
||||||
|
led2_pin.value(0)
|
||||||
|
|
||||||
|
# Signal class allows to abstract away active-high/active-low
|
||||||
|
# difference
|
||||||
|
led1 = Signal(led1_pin, invert=False)
|
||||||
|
led2 = Signal(led2_pin, invert=True)
|
||||||
|
|
||||||
|
# Now lighting up them looks the same
|
||||||
|
led1.value(1)
|
||||||
|
led2.value(1)
|
||||||
|
|
||||||
|
# Even better:
|
||||||
|
led1.on()
|
||||||
|
led2.on()
|
||||||
|
|
||||||
Following is the guide when Signal vs Pin should be used:
|
Following is the guide when Signal vs Pin should be used:
|
||||||
|
|
||||||
@ -33,11 +60,11 @@ architecture of MicroPython: Pin offers the lowest overhead, which may
|
|||||||
be important when bit-banging protocols. But Signal adds additional
|
be important when bit-banging protocols. But Signal adds additional
|
||||||
flexibility on top of Pin, at the cost of minor overhead (much smaller
|
flexibility on top of Pin, at the cost of minor overhead (much smaller
|
||||||
than if you implemented active-high vs active-low device differences in
|
than if you implemented active-high vs active-low device differences in
|
||||||
Python manually!). Also, Pin is low-level object which needs to be
|
Python manually!). Also, Pin is a low-level object which needs to be
|
||||||
implemented for each support board, while Signal is a high-level object
|
implemented for each support board, while Signal is a high-level object
|
||||||
which comes for free once Pin is implemented.
|
which comes for free once Pin is implemented.
|
||||||
|
|
||||||
If in doubt, give the Signal a try! Once again, it is developed to save
|
If in doubt, give the Signal a try! Once again, it is offered to save
|
||||||
developers from the need to handle unexciting differences like active-low
|
developers from the need to handle unexciting differences like active-low
|
||||||
vs active-high signals, and allow other users to share and enjoy your
|
vs active-high signals, and allow other users to share and enjoy your
|
||||||
application, instead of being frustrated by the fact that it doesn't
|
application, instead of being frustrated by the fact that it doesn't
|
||||||
|
@ -46,7 +46,7 @@ Functions
|
|||||||
|
|
||||||
.. function:: mem_info([verbose])
|
.. function:: mem_info([verbose])
|
||||||
|
|
||||||
Print information about currently used memory. If the *verbose`* argument
|
Print information about currently used memory. If the *verbose* argument
|
||||||
is given then extra information is printed.
|
is given then extra information is printed.
|
||||||
|
|
||||||
The information that is printed is implementation dependent, but currently
|
The information that is printed is implementation dependent, but currently
|
||||||
|
@ -9,7 +9,7 @@ This module provides network drivers and routing configuration. To use this
|
|||||||
module, a MicroPython variant/build with network capabilities must be installed.
|
module, a MicroPython variant/build with network capabilities must be installed.
|
||||||
Network drivers for specific hardware are available within this module and are
|
Network drivers for specific hardware are available within this module and are
|
||||||
used to configure hardware network interface(s). Network services provided
|
used to configure hardware network interface(s). Network services provided
|
||||||
by configured interfaces are then available for use via the :mod:`socket`
|
by configured interfaces are then available for use via the :mod:`usocket`
|
||||||
module.
|
module.
|
||||||
|
|
||||||
For example::
|
For example::
|
||||||
@ -39,9 +39,9 @@ Common network adapter interface
|
|||||||
================================
|
================================
|
||||||
|
|
||||||
This section describes an (implied) abstract base class for all network
|
This section describes an (implied) abstract base class for all network
|
||||||
interface classes implemented by different ports of MicroPython for
|
interface classes implemented by `MicroPython ports <MicroPython port>`
|
||||||
different hardware. This means that MicroPython does not actually
|
for different hardware. This means that MicroPython does not actually
|
||||||
provide `AbstractNIC` class, but any actual NIC class, as described
|
provide ``AbstractNIC`` class, but any actual NIC class, as described
|
||||||
in the following sections, implements methods as described here.
|
in the following sections, implements methods as described here.
|
||||||
|
|
||||||
.. class:: AbstractNIC(id=None, ...)
|
.. class:: AbstractNIC(id=None, ...)
|
||||||
@ -411,7 +411,7 @@ parameter should be `id`.
|
|||||||
print(ap.config('channel'))
|
print(ap.config('channel'))
|
||||||
|
|
||||||
Following are commonly supported parameters (availability of a specific parameter
|
Following are commonly supported parameters (availability of a specific parameter
|
||||||
depends on network technology type, driver, and MicroPython port).
|
depends on network technology type, driver, and `MicroPython port`).
|
||||||
|
|
||||||
========= ===========
|
========= ===========
|
||||||
Parameter Description
|
Parameter Description
|
||||||
|
@ -89,8 +89,22 @@ Functions
|
|||||||
Return a bytes object with n random bytes. Whenever possible, it is
|
Return a bytes object with n random bytes. Whenever possible, it is
|
||||||
generated by the hardware random number generator.
|
generated by the hardware random number generator.
|
||||||
|
|
||||||
.. function:: dupterm(stream_object)
|
.. function:: dupterm(stream_object, index=0)
|
||||||
|
|
||||||
Duplicate or switch MicroPython terminal (the REPL) on the passed stream-like
|
Duplicate or switch the MicroPython terminal (the REPL) on the given stream-like
|
||||||
object. The given object must implement the ``readinto()`` and ``write()``
|
object. The *stream_object* argument must implement the ``readinto()`` and
|
||||||
methods. If ``None`` is passed, previously set redirection is cancelled.
|
``write()`` methods. The stream should be in non-blocking mode and
|
||||||
|
``readinto()`` should return ``None`` if there is no data available for reading.
|
||||||
|
|
||||||
|
After calling this function all terminal output is repeated on this stream,
|
||||||
|
and any input that is available on the stream is passed on to the terminal input.
|
||||||
|
|
||||||
|
The *index* parameter should be a non-negative integer and specifies which
|
||||||
|
duplication slot is set. A given port may implement more than one slot (slot 0
|
||||||
|
will always be available) and in that case terminal input and output is
|
||||||
|
duplicated on all the slots that are set.
|
||||||
|
|
||||||
|
If ``None`` is passed as the *stream_object* then duplication is cancelled on
|
||||||
|
the slot given by *index*.
|
||||||
|
|
||||||
|
The function returns the previous stream-like object in the given slot.
|
||||||
|
@ -117,12 +117,12 @@ Constants
|
|||||||
.. data:: usocket.SOL_*
|
.. data:: usocket.SOL_*
|
||||||
|
|
||||||
Socket option levels (an argument to `setsockopt()`). The exact
|
Socket option levels (an argument to `setsockopt()`). The exact
|
||||||
inventory depends on a MicroPython port.
|
inventory depends on a `MicroPython port`.
|
||||||
|
|
||||||
.. data:: usocket.SO_*
|
.. data:: usocket.SO_*
|
||||||
|
|
||||||
Socket options (an argument to `setsockopt()`). The exact
|
Socket options (an argument to `setsockopt()`). The exact
|
||||||
inventory depends on a MicroPython port.
|
inventory depends on a `MicroPython port`.
|
||||||
|
|
||||||
Constants specific to WiPy:
|
Constants specific to WiPy:
|
||||||
|
|
||||||
|
@ -15,4 +15,4 @@ It's as simple as::
|
|||||||
if uart.any():
|
if uart.any():
|
||||||
usb.write(uart.read(256))
|
usb.write(uart.read(256))
|
||||||
|
|
||||||
pass_through(pyb.USB_VCP(), pyb.UART(1, 9600))
|
pass_through(pyb.USB_VCP(), pyb.UART(1, 9600, timeout=0))
|
||||||
|
@ -279,7 +279,7 @@ After importing the modules, execute:
|
|||||||
|
|
||||||
Then copy and paste all the Q(xxx) lines into a text editor. Check for and
|
Then copy and paste all the Q(xxx) lines into a text editor. Check for and
|
||||||
remove lines which are obviously invalid. Open the file qstrdefsport.h which
|
remove lines which are obviously invalid. Open the file qstrdefsport.h which
|
||||||
will be found in stmhal (or the equivalent directory for the architecture in
|
will be found in ports/stm32 (or the equivalent directory for the architecture in
|
||||||
use). Copy and paste the corrected lines at the end of the file. Save the file,
|
use). Copy and paste the corrected lines at the end of the file. Save the file,
|
||||||
rebuild and flash the firmware. The outcome can be checked by importing the
|
rebuild and flash the firmware. The outcome can be checked by importing the
|
||||||
modules and again issuing:
|
modules and again issuing:
|
||||||
|
@ -56,9 +56,9 @@ Glossary
|
|||||||
which provides implementations for many modules from CPython's
|
which provides implementations for many modules from CPython's
|
||||||
standard library. However, large subset of these modules require
|
standard library. However, large subset of these modules require
|
||||||
POSIX-like environment (Linux, MacOS, Windows may be partially
|
POSIX-like environment (Linux, MacOS, Windows may be partially
|
||||||
supported), and thus would work or make sense only with MicroPython
|
supported), and thus would work or make sense only with
|
||||||
Unix port. Some subset of modules is however usable for baremetal ports
|
`MicroPython Unix port`. Some subset of modules is however usable
|
||||||
too.
|
for `baremetal` ports too.
|
||||||
|
|
||||||
Unlike monolithic :term:`CPython` stdlib, micropython-lib modules
|
Unlike monolithic :term:`CPython` stdlib, micropython-lib modules
|
||||||
are intended to be installed individually - either using manual
|
are intended to be installed individually - either using manual
|
||||||
|
@ -21,6 +21,7 @@ This summarises the points detailed below and lists the principal recommendation
|
|||||||
|
|
||||||
* Keep the code as short and simple as possible.
|
* Keep the code as short and simple as possible.
|
||||||
* Avoid memory allocation: no appending to lists or insertion into dictionaries, no floating point.
|
* Avoid memory allocation: no appending to lists or insertion into dictionaries, no floating point.
|
||||||
|
* Consider using ``micropython.schedule`` to work around the above constraint.
|
||||||
* Where an ISR returns multiple bytes use a pre-allocated ``bytearray``. If multiple integers are to be
|
* Where an ISR returns multiple bytes use a pre-allocated ``bytearray``. If multiple integers are to be
|
||||||
shared between an ISR and the main program consider an array (``array.array``).
|
shared between an ISR and the main program consider an array (``array.array``).
|
||||||
* Where data is shared between the main program and an ISR, consider disabling interrupts prior to accessing
|
* Where data is shared between the main program and an ISR, consider disabling interrupts prior to accessing
|
||||||
@ -158,6 +159,26 @@ On platforms with hardware floating point (such as the Pyboard) the inline ARM T
|
|||||||
round this limitation. This is because the processor stores float values in a machine word; values can be shared
|
round this limitation. This is because the processor stores float values in a machine word; values can be shared
|
||||||
between the ISR and main program code via an array of floats.
|
between the ISR and main program code via an array of floats.
|
||||||
|
|
||||||
|
Using micropython.schedule
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
This function enables an ISR to schedule a callback for execution "very soon". The callback is queued for
|
||||||
|
execution which will take place at a time when the heap is not locked. Hence it can create Python objects
|
||||||
|
and use floats. The callback is also guaranteed to run at a time when the main program has completed any
|
||||||
|
update of Python objects, so the callback will not encounter partially updated objects.
|
||||||
|
|
||||||
|
Typical usage is to handle sensor hardware. The ISR acquires data from the hardware and enables it to
|
||||||
|
issue a further interrupt. It then schedules a callback to process the data.
|
||||||
|
|
||||||
|
Scheduled callbacks should comply with the principles of interrupt handler design outlined below. This is to
|
||||||
|
avoid problems resulting from I/O activity and the modification of shared data which can arise in any code
|
||||||
|
which pre-empts the main program loop.
|
||||||
|
|
||||||
|
Execution time needs to be considered in relation to the frequency with which interrupts can occur. If an
|
||||||
|
interrupt occurs while the previous callback is executing, a further instance of the callback will be queued
|
||||||
|
for execution; this will run after the current instance has completed. A sustained high interrupt repetition
|
||||||
|
rate therefore carries a risk of unconstrained queue growth and eventual failure with a ``RuntimeError``.
|
||||||
|
|
||||||
Exceptions
|
Exceptions
|
||||||
----------
|
----------
|
||||||
|
|
||||||
|
@ -34,8 +34,6 @@
|
|||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "py/nlr.h"
|
|
||||||
#include "py/obj.h"
|
|
||||||
#include "py/runtime.h"
|
#include "py/runtime.h"
|
||||||
#include "pin.h"
|
#include "pin.h"
|
||||||
#include "led.h"
|
#include "led.h"
|
||||||
|
@ -32,7 +32,21 @@ class SSD1306:
|
|||||||
self.external_vcc = external_vcc
|
self.external_vcc = external_vcc
|
||||||
self.pages = self.height // 8
|
self.pages = self.height // 8
|
||||||
self.buffer = bytearray(self.pages * self.width)
|
self.buffer = bytearray(self.pages * self.width)
|
||||||
self.framebuf = framebuf.FrameBuffer(self.buffer, self.width, self.height, framebuf.MVLSB)
|
fb = framebuf.FrameBuffer(self.buffer, self.width, self.height, framebuf.MONO_VLSB)
|
||||||
|
self.framebuf = fb
|
||||||
|
# Provide methods for accessing FrameBuffer graphics primitives. This is a
|
||||||
|
# workround because inheritance from a native class is currently unsupported.
|
||||||
|
# http://docs.micropython.org/en/latest/pyboard/library/framebuf.html
|
||||||
|
self.fill = fb.fill
|
||||||
|
self.pixel = fb.pixel
|
||||||
|
self.hline = fb.hline
|
||||||
|
self.vline = fb.vline
|
||||||
|
self.line = fb.line
|
||||||
|
self.rect = fb.rect
|
||||||
|
self.fill_rect = fb.fill_rect
|
||||||
|
self.text = fb.text
|
||||||
|
self.scroll = fb.scroll
|
||||||
|
self.blit = fb.blit
|
||||||
self.poweron()
|
self.poweron()
|
||||||
self.init_display()
|
self.init_display()
|
||||||
|
|
||||||
@ -88,18 +102,6 @@ class SSD1306:
|
|||||||
self.write_cmd(self.pages - 1)
|
self.write_cmd(self.pages - 1)
|
||||||
self.write_data(self.buffer)
|
self.write_data(self.buffer)
|
||||||
|
|
||||||
def fill(self, col):
|
|
||||||
self.framebuf.fill(col)
|
|
||||||
|
|
||||||
def pixel(self, x, y, col):
|
|
||||||
self.framebuf.pixel(x, y, col)
|
|
||||||
|
|
||||||
def scroll(self, dx, dy):
|
|
||||||
self.framebuf.scroll(dx, dy)
|
|
||||||
|
|
||||||
def text(self, string, x, y, col=1):
|
|
||||||
self.framebuf.text(string, x, y, col)
|
|
||||||
|
|
||||||
|
|
||||||
class SSD1306_I2C(SSD1306):
|
class SSD1306_I2C(SSD1306):
|
||||||
def __init__(self, width, height, i2c, addr=0x3c, external_vcc=False):
|
def __init__(self, width, height, i2c, addr=0x3c, external_vcc=False):
|
||||||
|
@ -49,10 +49,8 @@ STATIC uint8_t buf[SECTOR_SIZE];
|
|||||||
void mp_spiflash_init(mp_spiflash_t *self) {
|
void mp_spiflash_init(mp_spiflash_t *self) {
|
||||||
mp_hal_pin_write(self->cs, 1);
|
mp_hal_pin_write(self->cs, 1);
|
||||||
mp_hal_pin_output(self->cs);
|
mp_hal_pin_output(self->cs);
|
||||||
mp_hal_pin_write(self->spi.sck, 0);
|
const mp_machine_spi_p_t *protocol = self->spi->type->protocol;
|
||||||
mp_hal_pin_output(self->spi.sck);
|
protocol->init(self->spi, 0, NULL, (mp_map_t*)&mp_const_empty_map);
|
||||||
mp_hal_pin_output(self->spi.mosi);
|
|
||||||
mp_hal_pin_input(self->spi.miso);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC void mp_spiflash_acquire_bus(mp_spiflash_t *self) {
|
STATIC void mp_spiflash_acquire_bus(mp_spiflash_t *self) {
|
||||||
@ -66,7 +64,8 @@ STATIC void mp_spiflash_release_bus(mp_spiflash_t *self) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
STATIC void mp_spiflash_transfer(mp_spiflash_t *self, size_t len, const uint8_t *src, uint8_t *dest) {
|
STATIC void mp_spiflash_transfer(mp_spiflash_t *self, size_t len, const uint8_t *src, uint8_t *dest) {
|
||||||
mp_machine_soft_spi_transfer(&self->spi.base, len, src, dest);
|
const mp_machine_spi_p_t *protocol = self->spi->type->protocol;
|
||||||
|
protocol->transfer(self->spi, len, src, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC int mp_spiflash_wait_sr(mp_spiflash_t *self, uint8_t mask, uint8_t val, uint32_t timeout) {
|
STATIC int mp_spiflash_wait_sr(mp_spiflash_t *self, uint8_t mask, uint8_t val, uint32_t timeout) {
|
||||||
|
@ -30,8 +30,7 @@
|
|||||||
|
|
||||||
typedef struct _mp_spiflash_t {
|
typedef struct _mp_spiflash_t {
|
||||||
mp_hal_pin_obj_t cs;
|
mp_hal_pin_obj_t cs;
|
||||||
// TODO replace with generic SPI object
|
mp_obj_base_t *spi; // object must have protocol pointing to mp_machine_spi_p_t struct
|
||||||
mp_machine_soft_spi_obj_t spi;
|
|
||||||
} mp_spiflash_t;
|
} mp_spiflash_t;
|
||||||
|
|
||||||
void mp_spiflash_init(mp_spiflash_t *self);
|
void mp_spiflash_init(mp_spiflash_t *self);
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
"""Test for nrf24l01 module."""
|
"""Test for nrf24l01 module."""
|
||||||
|
|
||||||
import struct
|
import struct
|
||||||
import pyb
|
import utime
|
||||||
from pyb import Pin, SPI
|
from machine import Pin, SPI
|
||||||
from nrf24l01 import NRF24L01
|
from nrf24l01 import NRF24L01
|
||||||
|
|
||||||
pipes = (b'\xf0\xf0\xf0\xf0\xe1', b'\xf0\xf0\xf0\xf0\xd2')
|
pipes = (b'\xf0\xf0\xf0\xf0\xe1', b'\xf0\xf0\xf0\xf0\xd2')
|
||||||
@ -24,7 +24,7 @@ def master():
|
|||||||
while num_successes < num_needed and num_failures < num_needed:
|
while num_successes < num_needed and num_failures < num_needed:
|
||||||
# stop listening and send packet
|
# stop listening and send packet
|
||||||
nrf.stop_listening()
|
nrf.stop_listening()
|
||||||
millis = pyb.millis()
|
millis = utime.ticks_ms()
|
||||||
led_state = max(1, (led_state << 1) & 0x0f)
|
led_state = max(1, (led_state << 1) & 0x0f)
|
||||||
print('sending:', millis, led_state)
|
print('sending:', millis, led_state)
|
||||||
try:
|
try:
|
||||||
@ -36,10 +36,10 @@ def master():
|
|||||||
nrf.start_listening()
|
nrf.start_listening()
|
||||||
|
|
||||||
# wait for response, with 250ms timeout
|
# wait for response, with 250ms timeout
|
||||||
start_time = pyb.millis()
|
start_time = utime.ticks_ms()
|
||||||
timeout = False
|
timeout = False
|
||||||
while not nrf.any() and not timeout:
|
while not nrf.any() and not timeout:
|
||||||
if pyb.elapsed_millis(start_time) > 250:
|
if utime.ticks_diff(utime.ticks_ms(), start_time) > 250:
|
||||||
timeout = True
|
timeout = True
|
||||||
|
|
||||||
if timeout:
|
if timeout:
|
||||||
@ -51,11 +51,11 @@ def master():
|
|||||||
got_millis, = struct.unpack('i', nrf.recv())
|
got_millis, = struct.unpack('i', nrf.recv())
|
||||||
|
|
||||||
# print response and round-trip delay
|
# print response and round-trip delay
|
||||||
print('got response:', got_millis, '(delay', pyb.millis() - got_millis, 'ms)')
|
print('got response:', got_millis, '(delay', utime.ticks_diff(utime.ticks_ms(), got_millis), 'ms)')
|
||||||
num_successes += 1
|
num_successes += 1
|
||||||
|
|
||||||
# delay then loop
|
# delay then loop
|
||||||
pyb.delay(250)
|
utime.sleep_ms(250)
|
||||||
|
|
||||||
print('master finished sending; successes=%d, failures=%d' % (num_successes, num_failures))
|
print('master finished sending; successes=%d, failures=%d' % (num_successes, num_failures))
|
||||||
|
|
||||||
@ -69,18 +69,19 @@ def slave():
|
|||||||
print('NRF24L01 slave mode, waiting for packets... (ctrl-C to stop)')
|
print('NRF24L01 slave mode, waiting for packets... (ctrl-C to stop)')
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
pyb.wfi()
|
machine.idle()
|
||||||
if nrf.any():
|
if nrf.any():
|
||||||
while nrf.any():
|
while nrf.any():
|
||||||
buf = nrf.recv()
|
buf = nrf.recv()
|
||||||
millis, led_state = struct.unpack('ii', buf)
|
millis, led_state = struct.unpack('ii', buf)
|
||||||
print('received:', millis, led_state)
|
print('received:', millis, led_state)
|
||||||
for i in range(4):
|
for led in leds:
|
||||||
if led_state & (1 << i):
|
if led_state & 1:
|
||||||
pyb.LED(i + 1).on()
|
led.on()
|
||||||
else:
|
else:
|
||||||
pyb.LED(i + 1).off()
|
led.off()
|
||||||
pyb.delay(15)
|
led_state >>= 1
|
||||||
|
utime.sleep_ms(15)
|
||||||
|
|
||||||
nrf.stop_listening()
|
nrf.stop_listening()
|
||||||
try:
|
try:
|
||||||
@ -90,6 +91,12 @@ def slave():
|
|||||||
print('sent response')
|
print('sent response')
|
||||||
nrf.start_listening()
|
nrf.start_listening()
|
||||||
|
|
||||||
|
try:
|
||||||
|
import pyb
|
||||||
|
leds = [pyb.LED(i + 1) for i in range(4)]
|
||||||
|
except:
|
||||||
|
leds = []
|
||||||
|
|
||||||
print('NRF24L01 test module loaded')
|
print('NRF24L01 test module loaded')
|
||||||
print('NRF24L01 pinout for test:')
|
print('NRF24L01 pinout for test:')
|
||||||
print(' CE on Y4')
|
print(' CE on Y4')
|
||||||
|
@ -1 +0,0 @@
|
|||||||
../../drivers/onewire/ds18x20.py
|
|
@ -1 +0,0 @@
|
|||||||
../../drivers/onewire/onewire.py
|
|
@ -1 +0,0 @@
|
|||||||
../../tools/upip.py
|
|
@ -1 +0,0 @@
|
|||||||
../../tools/upip_utarfile.py
|
|
@ -1,5 +1,5 @@
|
|||||||
# Print a nice list of pins, their current settings, and available afs.
|
# Print a nice list of pins, their current settings, and available afs.
|
||||||
# Requires pins_af.py from stmhal/build-PYBV10/ directory.
|
# Requires pins_af.py from ports/stm32/build-PYBV10/ directory.
|
||||||
|
|
||||||
import pyb
|
import pyb
|
||||||
import pins_af
|
import pins_af
|
||||||
|
@ -269,7 +269,7 @@ int mp_machine_soft_i2c_readfrom(mp_obj_base_t *self_in, uint16_t addr, uint8_t
|
|||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
// MicroPython bindings for I2C
|
// MicroPython bindings for I2C
|
||||||
|
|
||||||
STATIC void machine_i2c_obj_init_helper(machine_i2c_obj_t *self, mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
|
STATIC void machine_i2c_obj_init_helper(machine_i2c_obj_t *self, size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
|
||||||
enum { ARG_scl, ARG_sda, ARG_freq, ARG_timeout };
|
enum { ARG_scl, ARG_sda, ARG_freq, ARG_timeout };
|
||||||
static const mp_arg_t allowed_args[] = {
|
static const mp_arg_t allowed_args[] = {
|
||||||
{ MP_QSTR_scl, MP_ARG_REQUIRED | MP_ARG_OBJ },
|
{ MP_QSTR_scl, MP_ARG_REQUIRED | MP_ARG_OBJ },
|
||||||
|
@ -24,8 +24,8 @@
|
|||||||
* THE SOFTWARE.
|
* THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "py/runtime.h"
|
||||||
#include "extmod/machine_mem.h"
|
#include "extmod/machine_mem.h"
|
||||||
#include "py/nlr.h"
|
|
||||||
|
|
||||||
#if MICROPY_PY_MACHINE
|
#if MICROPY_PY_MACHINE
|
||||||
|
|
||||||
|
@ -30,6 +30,7 @@
|
|||||||
#include "py/obj.h"
|
#include "py/obj.h"
|
||||||
#include "py/runtime.h"
|
#include "py/runtime.h"
|
||||||
#include "extmod/virtpin.h"
|
#include "extmod/virtpin.h"
|
||||||
|
#include "extmod/machine_pinbase.h"
|
||||||
|
|
||||||
// PinBase class
|
// PinBase class
|
||||||
|
|
||||||
@ -40,10 +41,8 @@ typedef struct _mp_pinbase_t {
|
|||||||
mp_obj_base_t base;
|
mp_obj_base_t base;
|
||||||
} mp_pinbase_t;
|
} mp_pinbase_t;
|
||||||
|
|
||||||
STATIC const mp_obj_type_t pinbase_type;
|
STATIC const mp_pinbase_t pinbase_singleton = {
|
||||||
|
.base = { &machine_pinbase_type },
|
||||||
STATIC mp_pinbase_t pinbase_singleton = {
|
|
||||||
.base = { &pinbase_type },
|
|
||||||
};
|
};
|
||||||
|
|
||||||
STATIC mp_obj_t pinbase_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) {
|
STATIC mp_obj_t pinbase_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) {
|
||||||
|
@ -29,9 +29,7 @@
|
|||||||
#include <errno.h> // for declaration of global errno variable
|
#include <errno.h> // for declaration of global errno variable
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
|
||||||
#include "py/nlr.h"
|
|
||||||
#include "py/runtime.h"
|
#include "py/runtime.h"
|
||||||
#include "py/runtime0.h"
|
|
||||||
#include "py/stream.h"
|
#include "py/stream.h"
|
||||||
|
|
||||||
#if MICROPY_PY_BTREE
|
#if MICROPY_PY_BTREE
|
||||||
@ -281,7 +279,7 @@ STATIC mp_obj_t btree_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC mp_obj_t btree_binary_op(mp_uint_t op, mp_obj_t lhs_in, mp_obj_t rhs_in) {
|
STATIC mp_obj_t btree_binary_op(mp_binary_op_t op, mp_obj_t lhs_in, mp_obj_t rhs_in) {
|
||||||
mp_obj_btree_t *self = MP_OBJ_TO_PTR(lhs_in);
|
mp_obj_btree_t *self = MP_OBJ_TO_PTR(lhs_in);
|
||||||
switch (op) {
|
switch (op) {
|
||||||
case MP_BINARY_OP_IN: {
|
case MP_BINARY_OP_IN: {
|
||||||
|
@ -27,13 +27,11 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "py/nlr.h"
|
|
||||||
#include "py/obj.h"
|
|
||||||
#include "py/runtime.h"
|
#include "py/runtime.h"
|
||||||
|
|
||||||
#if MICROPY_PY_FRAMEBUF
|
#if MICROPY_PY_FRAMEBUF
|
||||||
|
|
||||||
#include "stmhal/font_petme128_8x8.h"
|
#include "ports/stm32/font_petme128_8x8.h"
|
||||||
|
|
||||||
typedef struct _mp_obj_framebuf_t {
|
typedef struct _mp_obj_framebuf_t {
|
||||||
mp_obj_base_t base;
|
mp_obj_base_t base;
|
||||||
|
@ -29,7 +29,6 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#include "py/nlr.h"
|
|
||||||
#include "py/objlist.h"
|
#include "py/objlist.h"
|
||||||
#include "py/runtime.h"
|
#include "py/runtime.h"
|
||||||
#include "py/stream.h"
|
#include "py/stream.h"
|
||||||
@ -1070,7 +1069,7 @@ STATIC mp_obj_t lwip_socket_setblocking(mp_obj_t self_in, mp_obj_t flag_in) {
|
|||||||
}
|
}
|
||||||
STATIC MP_DEFINE_CONST_FUN_OBJ_2(lwip_socket_setblocking_obj, lwip_socket_setblocking);
|
STATIC MP_DEFINE_CONST_FUN_OBJ_2(lwip_socket_setblocking_obj, lwip_socket_setblocking);
|
||||||
|
|
||||||
STATIC mp_obj_t lwip_socket_setsockopt(mp_uint_t n_args, const mp_obj_t *args) {
|
STATIC mp_obj_t lwip_socket_setsockopt(size_t n_args, const mp_obj_t *args) {
|
||||||
(void)n_args; // always 4
|
(void)n_args; // always 4
|
||||||
lwip_socket_obj_t *socket = args[0];
|
lwip_socket_obj_t *socket = args[0];
|
||||||
|
|
||||||
@ -1120,7 +1119,7 @@ STATIC mp_obj_t lwip_socket_setsockopt(mp_uint_t n_args, const mp_obj_t *args) {
|
|||||||
}
|
}
|
||||||
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(lwip_socket_setsockopt_obj, 4, 4, lwip_socket_setsockopt);
|
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(lwip_socket_setsockopt_obj, 4, 4, lwip_socket_setsockopt);
|
||||||
|
|
||||||
STATIC mp_obj_t lwip_socket_makefile(mp_uint_t n_args, const mp_obj_t *args) {
|
STATIC mp_obj_t lwip_socket_makefile(size_t n_args, const mp_obj_t *args) {
|
||||||
(void)n_args;
|
(void)n_args;
|
||||||
return args[0];
|
return args[0];
|
||||||
}
|
}
|
||||||
|
@ -28,13 +28,10 @@
|
|||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "py/nlr.h"
|
|
||||||
#include "py/runtime.h"
|
#include "py/runtime.h"
|
||||||
#include "py/binary.h"
|
#include "py/binary.h"
|
||||||
#include "extmod/modubinascii.h"
|
#include "extmod/modubinascii.h"
|
||||||
|
|
||||||
#include "uzlib/tinf.h"
|
|
||||||
|
|
||||||
mp_obj_t mod_binascii_hexlify(size_t n_args, const mp_obj_t *args) {
|
mp_obj_t mod_binascii_hexlify(size_t n_args, const mp_obj_t *args) {
|
||||||
// Second argument is for an extension to allow a separator to be used
|
// Second argument is for an extension to allow a separator to be used
|
||||||
// between values.
|
// between values.
|
||||||
@ -221,6 +218,8 @@ mp_obj_t mod_binascii_b2a_base64(mp_obj_t data) {
|
|||||||
MP_DEFINE_CONST_FUN_OBJ_1(mod_binascii_b2a_base64_obj, mod_binascii_b2a_base64);
|
MP_DEFINE_CONST_FUN_OBJ_1(mod_binascii_b2a_base64_obj, mod_binascii_b2a_base64);
|
||||||
|
|
||||||
#if MICROPY_PY_UBINASCII_CRC32
|
#if MICROPY_PY_UBINASCII_CRC32
|
||||||
|
#include "uzlib/tinf.h"
|
||||||
|
|
||||||
mp_obj_t mod_binascii_crc32(size_t n_args, const mp_obj_t *args) {
|
mp_obj_t mod_binascii_crc32(size_t n_args, const mp_obj_t *args) {
|
||||||
mp_buffer_info_t bufinfo;
|
mp_buffer_info_t bufinfo;
|
||||||
mp_get_buffer_raise(args[0], &bufinfo, MP_BUFFER_READ);
|
mp_get_buffer_raise(args[0], &bufinfo, MP_BUFFER_READ);
|
||||||
|
@ -28,7 +28,6 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
#include "py/nlr.h"
|
|
||||||
#include "py/runtime.h"
|
#include "py/runtime.h"
|
||||||
#include "py/objtuple.h"
|
#include "py/objtuple.h"
|
||||||
#include "py/binary.h"
|
#include "py/binary.h"
|
||||||
|
@ -27,7 +27,6 @@
|
|||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "py/nlr.h"
|
|
||||||
#include "py/runtime.h"
|
#include "py/runtime.h"
|
||||||
|
|
||||||
#if MICROPY_PY_UHASHLIB
|
#if MICROPY_PY_UHASHLIB
|
||||||
|
@ -24,9 +24,7 @@
|
|||||||
* THE SOFTWARE.
|
* THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "py/nlr.h"
|
|
||||||
#include "py/objlist.h"
|
#include "py/objlist.h"
|
||||||
#include "py/runtime0.h"
|
|
||||||
#include "py/runtime.h"
|
#include "py/runtime.h"
|
||||||
|
|
||||||
#if MICROPY_PY_UHEAPQ
|
#if MICROPY_PY_UHEAPQ
|
||||||
|
@ -26,7 +26,6 @@
|
|||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#include "py/nlr.h"
|
|
||||||
#include "py/objlist.h"
|
#include "py/objlist.h"
|
||||||
#include "py/objstringio.h"
|
#include "py/objstringio.h"
|
||||||
#include "py/parsenum.h"
|
#include "py/parsenum.h"
|
||||||
|
@ -27,7 +27,6 @@
|
|||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
//#include "py/nlr.h"
|
|
||||||
#include "py/runtime.h"
|
#include "py/runtime.h"
|
||||||
|
|
||||||
#if MICROPY_PY_URANDOM
|
#if MICROPY_PY_URANDOM
|
||||||
|
@ -28,13 +28,15 @@
|
|||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "py/nlr.h"
|
|
||||||
#include "py/runtime.h"
|
#include "py/runtime.h"
|
||||||
#include "py/binary.h"
|
#include "py/binary.h"
|
||||||
#include "py/objstr.h"
|
#include "py/objstr.h"
|
||||||
|
#include "py/stackctrl.h"
|
||||||
|
|
||||||
#if MICROPY_PY_URE
|
#if MICROPY_PY_URE
|
||||||
|
|
||||||
|
#define re1_5_stack_chk() MP_STACK_CHECK()
|
||||||
|
|
||||||
#include "re1.5/re1.5.h"
|
#include "re1.5/re1.5.h"
|
||||||
|
|
||||||
#define FLAG_DEBUG 0x1000
|
#define FLAG_DEBUG 0x1000
|
||||||
|
@ -27,7 +27,6 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "py/nlr.h"
|
|
||||||
#include "py/runtime.h"
|
#include "py/runtime.h"
|
||||||
#include "py/stream.h"
|
#include "py/stream.h"
|
||||||
|
|
||||||
|
@ -31,10 +31,8 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <errno.h> // needed because mp_is_nonblocking_error uses system error codes
|
#include <errno.h> // needed because mp_is_nonblocking_error uses system error codes
|
||||||
|
|
||||||
#include "py/nlr.h"
|
|
||||||
#include "py/runtime.h"
|
#include "py/runtime.h"
|
||||||
#include "py/stream.h"
|
#include "py/stream.h"
|
||||||
#include "py/obj.h"
|
|
||||||
|
|
||||||
// mbedtls_time_t
|
// mbedtls_time_t
|
||||||
#include "mbedtls/platform.h"
|
#include "mbedtls/platform.h"
|
||||||
@ -67,7 +65,7 @@ struct ssl_args {
|
|||||||
|
|
||||||
STATIC const mp_obj_type_t ussl_socket_type;
|
STATIC const mp_obj_type_t ussl_socket_type;
|
||||||
|
|
||||||
static void mbedtls_debug(void *ctx, int level, const char *file, int line, const char *str) {
|
void mbedtls_debug(void *ctx, int level, const char *file, int line, const char *str) {
|
||||||
printf("DBG:%s:%04d: %s\n", file, line, str);
|
printf("DBG:%s:%04d: %s\n", file, line, str);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -123,8 +121,10 @@ STATIC mp_obj_ssl_socket_t *socket_new(mp_obj_t sock, struct ssl_args *args) {
|
|||||||
mbedtls_x509_crt_init(&o->cert);
|
mbedtls_x509_crt_init(&o->cert);
|
||||||
mbedtls_pk_init(&o->pkey);
|
mbedtls_pk_init(&o->pkey);
|
||||||
mbedtls_ctr_drbg_init(&o->ctr_drbg);
|
mbedtls_ctr_drbg_init(&o->ctr_drbg);
|
||||||
|
#ifdef MBEDTLS_DEBUG_C
|
||||||
// Debug level (0-4)
|
// Debug level (0-4)
|
||||||
mbedtls_debug_set_threshold(0);
|
mbedtls_debug_set_threshold(0);
|
||||||
|
#endif
|
||||||
|
|
||||||
mbedtls_entropy_init(&o->entropy);
|
mbedtls_entropy_init(&o->entropy);
|
||||||
const byte seed[] = "upy";
|
const byte seed[] = "upy";
|
||||||
@ -144,7 +144,9 @@ STATIC mp_obj_ssl_socket_t *socket_new(mp_obj_t sock, struct ssl_args *args) {
|
|||||||
|
|
||||||
mbedtls_ssl_conf_authmode(&o->conf, MBEDTLS_SSL_VERIFY_NONE);
|
mbedtls_ssl_conf_authmode(&o->conf, MBEDTLS_SSL_VERIFY_NONE);
|
||||||
mbedtls_ssl_conf_rng(&o->conf, mbedtls_ctr_drbg_random, &o->ctr_drbg);
|
mbedtls_ssl_conf_rng(&o->conf, mbedtls_ctr_drbg_random, &o->ctr_drbg);
|
||||||
|
#ifdef MBEDTLS_DEBUG_C
|
||||||
mbedtls_ssl_conf_dbg(&o->conf, mbedtls_debug, NULL);
|
mbedtls_ssl_conf_dbg(&o->conf, mbedtls_debug, NULL);
|
||||||
|
#endif
|
||||||
|
|
||||||
ret = mbedtls_ssl_setup(&o->ssl, &o->conf);
|
ret = mbedtls_ssl_setup(&o->ssl, &o->conf);
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
|
@ -27,9 +27,7 @@
|
|||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "py/nlr.h"
|
|
||||||
#include "py/objlist.h"
|
#include "py/objlist.h"
|
||||||
#include "py/runtime0.h"
|
|
||||||
#include "py/runtime.h"
|
#include "py/runtime.h"
|
||||||
#include "py/smallint.h"
|
#include "py/smallint.h"
|
||||||
|
|
||||||
@ -189,7 +187,7 @@ STATIC mp_obj_t mod_utimeq_dump(mp_obj_t heap_in) {
|
|||||||
STATIC MP_DEFINE_CONST_FUN_OBJ_1(mod_utimeq_dump_obj, mod_utimeq_dump);
|
STATIC MP_DEFINE_CONST_FUN_OBJ_1(mod_utimeq_dump_obj, mod_utimeq_dump);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
STATIC mp_obj_t utimeq_unary_op(mp_uint_t op, mp_obj_t self_in) {
|
STATIC mp_obj_t utimeq_unary_op(mp_unary_op_t op, mp_obj_t self_in) {
|
||||||
mp_obj_utimeq_t *self = MP_OBJ_TO_PTR(self_in);
|
mp_obj_utimeq_t *self = MP_OBJ_TO_PTR(self_in);
|
||||||
switch (op) {
|
switch (op) {
|
||||||
case MP_UNARY_OP_BOOL: return mp_obj_new_bool(self->len != 0);
|
case MP_UNARY_OP_BOOL: return mp_obj_new_bool(self->len != 0);
|
||||||
|
@ -27,7 +27,6 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "py/nlr.h"
|
|
||||||
#include "py/runtime.h"
|
#include "py/runtime.h"
|
||||||
#include "py/stream.h"
|
#include "py/stream.h"
|
||||||
#include "py/mperrno.h"
|
#include "py/mperrno.h"
|
||||||
|
@ -28,8 +28,6 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "py/nlr.h"
|
|
||||||
#include "py/obj.h"
|
|
||||||
#include "py/runtime.h"
|
#include "py/runtime.h"
|
||||||
#include "py/stream.h"
|
#include "py/stream.h"
|
||||||
#include "py/builtin.h"
|
#include "py/builtin.h"
|
||||||
|
@ -28,8 +28,6 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "py/nlr.h"
|
|
||||||
#include "py/obj.h"
|
|
||||||
#include "py/runtime.h"
|
#include "py/runtime.h"
|
||||||
#include "py/stream.h"
|
#include "py/stream.h"
|
||||||
#include "extmod/modwebsocket.h"
|
#include "extmod/modwebsocket.h"
|
||||||
|
@ -55,7 +55,7 @@ static const char *_compilecode(const char *re, ByteProg *prog, int sizecode)
|
|||||||
for (cnt = 0; *re != ']'; re++, cnt++) {
|
for (cnt = 0; *re != ']'; re++, cnt++) {
|
||||||
if (!*re) return NULL;
|
if (!*re) return NULL;
|
||||||
EMIT(PC++, *re);
|
EMIT(PC++, *re);
|
||||||
if (re[1] == '-') {
|
if (re[1] == '-' && re[2] != ']') {
|
||||||
re += 2;
|
re += 2;
|
||||||
}
|
}
|
||||||
EMIT(PC++, *re);
|
EMIT(PC++, *re);
|
||||||
|
@ -48,6 +48,9 @@ void printre(Regexp*);
|
|||||||
#ifndef re1_5_fatal
|
#ifndef re1_5_fatal
|
||||||
void re1_5_fatal(char*);
|
void re1_5_fatal(char*);
|
||||||
#endif
|
#endif
|
||||||
|
#ifndef re1_5_stack_chk
|
||||||
|
#define re1_5_stack_chk()
|
||||||
|
#endif
|
||||||
void *mal(int);
|
void *mal(int);
|
||||||
|
|
||||||
struct Prog
|
struct Prog
|
||||||
|
@ -10,6 +10,8 @@ recursiveloop(char *pc, const char *sp, Subject *input, const char **subp, int n
|
|||||||
const char *old;
|
const char *old;
|
||||||
int off;
|
int off;
|
||||||
|
|
||||||
|
re1_5_stack_chk();
|
||||||
|
|
||||||
for(;;) {
|
for(;;) {
|
||||||
if(inst_is_consumer(*pc)) {
|
if(inst_is_consumer(*pc)) {
|
||||||
// If we need to match a character, but there's none left, it's fail
|
// If we need to match a character, but there's none left, it's fail
|
||||||
|
@ -27,7 +27,6 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "py/mpconfig.h"
|
#include "py/mpconfig.h"
|
||||||
|
|
||||||
#include "py/nlr.h"
|
|
||||||
#include "py/runtime.h"
|
#include "py/runtime.h"
|
||||||
#include "py/objtuple.h"
|
#include "py/objtuple.h"
|
||||||
#include "py/objarray.h"
|
#include "py/objarray.h"
|
||||||
@ -68,7 +67,7 @@ void mp_uos_dupterm_tx_strn(const char *str, size_t len) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC mp_obj_t mp_uos_dupterm(mp_uint_t n_args, const mp_obj_t *args) {
|
STATIC mp_obj_t mp_uos_dupterm(size_t n_args, const mp_obj_t *args) {
|
||||||
if (n_args == 0) {
|
if (n_args == 0) {
|
||||||
if (MP_STATE_PORT(term_obj) == MP_OBJ_NULL) {
|
if (MP_STATE_PORT(term_obj) == MP_OBJ_NULL) {
|
||||||
return mp_const_none;
|
return mp_const_none;
|
||||||
|
@ -27,7 +27,6 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "py/runtime0.h"
|
|
||||||
#include "py/runtime.h"
|
#include "py/runtime.h"
|
||||||
#include "py/objstr.h"
|
#include "py/objstr.h"
|
||||||
#include "py/mperrno.h"
|
#include "py/mperrno.h"
|
||||||
|
@ -33,7 +33,6 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "py/nlr.h"
|
|
||||||
#include "py/runtime.h"
|
#include "py/runtime.h"
|
||||||
#include "py/mperrno.h"
|
#include "py/mperrno.h"
|
||||||
#include "lib/oofatfs/ff.h"
|
#include "lib/oofatfs/ff.h"
|
||||||
|
@ -31,7 +31,6 @@
|
|||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#include "py/nlr.h"
|
|
||||||
#include "py/runtime.h"
|
#include "py/runtime.h"
|
||||||
#include "py/stream.h"
|
#include "py/stream.h"
|
||||||
#include "py/mperrno.h"
|
#include "py/mperrno.h"
|
||||||
|
@ -28,7 +28,6 @@
|
|||||||
#if MICROPY_VFS_FAT
|
#if MICROPY_VFS_FAT
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "py/nlr.h"
|
|
||||||
#include "py/runtime.h"
|
#include "py/runtime.h"
|
||||||
#include "lib/oofatfs/ff.h"
|
#include "lib/oofatfs/ff.h"
|
||||||
#include "extmod/vfs_fat.h"
|
#include "extmod/vfs_fat.h"
|
||||||
|
@ -1 +1 @@
|
|||||||
Subproject commit dab957dacddcbf6cbc85d42df62e189e4877bb72
|
Subproject commit 35aaec4418ad78628a3b935885dd189d41ce779b
|
@ -3,5 +3,5 @@
|
|||||||
NORETURN void abort_(void);
|
NORETURN void abort_(void);
|
||||||
|
|
||||||
NORETURN void abort_(void) {
|
NORETURN void abort_(void) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_RuntimeError, "abort() called"));
|
mp_raise_msg(&mp_type_RuntimeError, "abort() called");
|
||||||
}
|
}
|
||||||
|
@ -61,7 +61,12 @@ float log2f(float x) { return logf(x) / (float)_M_LN2; }
|
|||||||
static const float _M_LN10 = 2.30258509299404; // 0x40135d8e
|
static const float _M_LN10 = 2.30258509299404; // 0x40135d8e
|
||||||
float log10f(float x) { return logf(x) / (float)_M_LN10; }
|
float log10f(float x) { return logf(x) / (float)_M_LN10; }
|
||||||
|
|
||||||
float tanhf(float x) { return sinhf(x) / coshf(x); }
|
float tanhf(float x) {
|
||||||
|
if (isinf(x)) {
|
||||||
|
return copysignf(1, x);
|
||||||
|
}
|
||||||
|
return sinhf(x) / coshf(x);
|
||||||
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -29,8 +29,6 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "py/obj.h"
|
|
||||||
#include "py/nlr.h"
|
|
||||||
#include "py/runtime.h"
|
#include "py/runtime.h"
|
||||||
#include "lib/netutils/netutils.h"
|
#include "lib/netutils/netutils.h"
|
||||||
|
|
||||||
|
1
lib/stm32lib
Submodule
1
lib/stm32lib
Submodule
@ -0,0 +1 @@
|
|||||||
|
Subproject commit d2bcfda543d3b99361e44112aca929225bdcc07f
|
@ -29,7 +29,6 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "py/nlr.h"
|
|
||||||
#include "py/compile.h"
|
#include "py/compile.h"
|
||||||
#include "py/runtime.h"
|
#include "py/runtime.h"
|
||||||
#include "py/repl.h"
|
#include "py/repl.h"
|
||||||
|
@ -65,7 +65,7 @@ SRC_C = \
|
|||||||
# Add fmode when compiling with mingw gcc
|
# Add fmode when compiling with mingw gcc
|
||||||
COMPILER_TARGET := $(shell $(CC) -dumpmachine)
|
COMPILER_TARGET := $(shell $(CC) -dumpmachine)
|
||||||
ifneq (,$(findstring mingw,$(COMPILER_TARGET)))
|
ifneq (,$(findstring mingw,$(COMPILER_TARGET)))
|
||||||
SRC_C += windows/fmode.c
|
SRC_C += ports/windows/fmode.c
|
||||||
endif
|
endif
|
||||||
|
|
||||||
OBJ = $(PY_O)
|
OBJ = $(PY_O)
|
||||||
|
@ -29,14 +29,13 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
#include "py/mpstate.h"
|
|
||||||
#include "py/compile.h"
|
#include "py/compile.h"
|
||||||
#include "py/persistentcode.h"
|
#include "py/persistentcode.h"
|
||||||
#include "py/runtime.h"
|
#include "py/runtime.h"
|
||||||
#include "py/gc.h"
|
#include "py/gc.h"
|
||||||
#include "py/stackctrl.h"
|
#include "py/stackctrl.h"
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
#include "windows/fmode.h"
|
#include "ports/windows/fmode.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Command line options, with their defaults
|
// Command line options, with their defaults
|
||||||
|
@ -9,7 +9,7 @@ endif
|
|||||||
# If the build directory is not given, make it reflect the board name.
|
# If the build directory is not given, make it reflect the board name.
|
||||||
BUILD ?= build-$(BOARD)
|
BUILD ?= build-$(BOARD)
|
||||||
|
|
||||||
include ../py/mkenv.mk
|
include ../../py/mkenv.mk
|
||||||
-include mpconfigport.mk
|
-include mpconfigport.mk
|
||||||
include boards/$(BOARD)/mpconfigboard.mk
|
include boards/$(BOARD)/mpconfigboard.mk
|
||||||
|
|
||||||
@ -28,7 +28,7 @@ BOSSAC := tools/bossac_osx
|
|||||||
HAL_DIR=hal/$(MCU_SERIES)
|
HAL_DIR=hal/$(MCU_SERIES)
|
||||||
|
|
||||||
INC += -I. \
|
INC += -I. \
|
||||||
-I.. \
|
-I../.. \
|
||||||
-I../lib/mp-readline \
|
-I../lib/mp-readline \
|
||||||
-I../lib/timeutils \
|
-I../lib/timeutils \
|
||||||
-Iasf4/$(CHIP_FAMILY) \
|
-Iasf4/$(CHIP_FAMILY) \
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user