From fdb97eda09ca1968df8a919d15ebd1fe191fb57e Mon Sep 17 00:00:00 2001 From: Dan Halbert Date: Thu, 31 Aug 2017 13:48:30 -0400 Subject: Add microcontroller.cpu.temperature, for use as a simple sensor on minimal boards. (#211) * Add microcontroller.cpu, the sole instance of microcontroller.Processor. microcontroller.cpu.frequency is the clock frequency, in Hz. microcontroller.cpu.temperature is the reading from the internal temperature sensor, in Celsius. None if not available. * Squeeze firmware size by using -finline-limit. Otherwise non-Express builds were slightly too big. * Update submodules. * Fix documentation glitches --- shared-bindings/index.rst | 29 ++++++-- shared-bindings/microcontroller/Processor.c | 107 ++++++++++++++++++++++++++++ shared-bindings/microcontroller/Processor.h | 39 ++++++++++ shared-bindings/microcontroller/__init__.c | 25 +++++-- shared-bindings/microcontroller/__init__.h | 6 ++ shared-bindings/nvm/ByteArray.c | 7 +- 6 files changed, 194 insertions(+), 19 deletions(-) create mode 100644 shared-bindings/microcontroller/Processor.c create mode 100644 shared-bindings/microcontroller/Processor.h (limited to 'shared-bindings') diff --git a/shared-bindings/index.rst b/shared-bindings/index.rst index ab92fd57c..49b6ce5bc 100644 --- a/shared-bindings/index.rst +++ b/shared-bindings/index.rst @@ -12,13 +12,28 @@ limited. For example, a microcontroller without analog features will not have Support Matrix --------------- -=============== ========== ========= =========== ======= ======= =========== ================= =============== ================ ======= ========= ======== ========= ======== ========= ======= ========= -Port `analogio` `audioio` `bitbangio` `board` `busio` `digitalio` `microcontroller` `multiterminal` `neopixel_write` `os` `pulseio` `random` `storage` `time` `touchio` `uheap` `usb_hid` -=============== ========== ========= =========== ======= ======= =========== ================= =============== ================ ======= ========= ======== ========= ======== ========= ======= ========= -SAMD21 **Yes** No No **Yes** **Yes** **Yes** **Yes** No **Yes** **Yes** No **Yes** **Yes** **Yes** **Yes** Debug **Yes** -SAMD21 Express **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** No **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** Debug **Yes** -ESP8266 **Yes** No **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** No **Yes** **Yes** **Yes** No Debug No -=============== ========== ========= =========== ======= ======= =========== ================= =============== ================ ======= ========= ======== ========= ======== ========= ======= ========= +================= ======= ============== ======= +Module / Port SAMD21 SAMD21 Express ESP8266 +================= ======= ============== ======= +`analogio` **Yes** **Yes** **Yes** +`audioio` No **Yes** No +`bitbangio` No **Yes** **Yes** +`board` **Yes** **Yes** **Yes** +`busio` **Yes** **Yes** **Yes** +`digitalio` **Yes** **Yes** **Yes** +`microcontroller` **Yes** **Yes** **Yes** +`multiterminal` No No **Yes** +`neopixel_write` **Yes** **Yes** **Yes** +`nvm` No **Yes** No +`os` **Yes** **Yes** **Yes** +`pulseio` No **Yes** No +`random` **Yes** **Yes** **Yes** +`storage` **Yes** **Yes** **Yes** +`time` **Yes** **Yes** **Yes** +`touchio` **Yes** **Yes** No +`uheap` Debug Debug Debug +`usb_hid` **Yes** **Yes** No +================= ======= ============== ======= Modules --------- diff --git a/shared-bindings/microcontroller/Processor.c b/shared-bindings/microcontroller/Processor.c new file mode 100644 index 000000000..0e843bd31 --- /dev/null +++ b/shared-bindings/microcontroller/Processor.c @@ -0,0 +1,107 @@ +/* + * This file is part of the Micro Python project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2017 Dan Halbert 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 "shared-bindings/microcontroller/__init__.h" +#include "shared-bindings/microcontroller/Processor.h" + +#include +#include + +#include "py/objproperty.h" + +#include "py/objproperty.h" +#include "py/runtime.h" + +//| .. currentmodule:: microcontroller +//| +//| :class:`Processor` --- Microcontroller CPU information and control +//| -------------------------------------------------------- +//| +//| Get information about the microcontroller CPU and control it. +//| +//| Usage:: +//| +//| import microcontroller +//| print(microcontroller.cpu.frequency) +//| print(microcontroller.cpu.temperature) +//| + +//| .. class:: Processor() +//| +//| You cannot create an instance of `microcontroller.Processor`. +//| Use `microcontroller.cpu` to access the sole instance available. +//| + +//| .. attribute:: frequency +//| +//| Return the CPU operating frequency as an int, in Hz. +//| +STATIC mp_obj_t mcu_processor_get_frequency(mp_obj_t self) { + return mp_obj_new_int_from_uint(common_hal_mcu_processor_get_frequency()); +} + +MP_DEFINE_CONST_FUN_OBJ_1(mcu_processor_get_frequency_obj, mcu_processor_get_frequency); + +const mp_obj_property_t mcu_processor_frequency_obj = { + .base.type = &mp_type_property, + .proxy = {(mp_obj_t)&mcu_processor_get_frequency_obj, // getter + (mp_obj_t)&mp_const_none_obj, // no setter + (mp_obj_t)&mp_const_none_obj, // no deleter + }, +}; + +//| .. attribute:: temperature +//| +//| Return the on-chip temperature, in Celsius, as a float. +//| If the temperature is not available, return `None`. +//| +STATIC mp_obj_t mcu_processor_get_temperature(mp_obj_t self) { + float temperature = common_hal_mcu_processor_get_temperature(); + return isnan(temperature) ? mp_const_none : mp_obj_new_float(temperature); +} + +MP_DEFINE_CONST_FUN_OBJ_1(mcu_processor_get_temperature_obj, mcu_processor_get_temperature); + +const mp_obj_property_t mcu_processor_temperature_obj = { + .base.type = &mp_type_property, + .proxy = {(mp_obj_t)&mcu_processor_get_temperature_obj, // getter + (mp_obj_t)&mp_const_none_obj, // no setter + (mp_obj_t)&mp_const_none_obj, // no deleter + }, +}; + +STATIC const mp_rom_map_elem_t mcu_processor_locals_dict_table[] = { + { MP_ROM_QSTR(MP_QSTR_frequency), MP_ROM_PTR(&mcu_processor_frequency_obj) }, + { MP_ROM_QSTR(MP_QSTR_temperature), MP_ROM_PTR(&mcu_processor_temperature_obj) }, +}; + +STATIC MP_DEFINE_CONST_DICT(mcu_processor_locals_dict, mcu_processor_locals_dict_table); + +const mp_obj_type_t mcu_processor_type = { + { &mp_type_type }, + .name = MP_QSTR_Processor, + .locals_dict = (mp_obj_t)&mcu_processor_locals_dict, +}; diff --git a/shared-bindings/microcontroller/Processor.h b/shared-bindings/microcontroller/Processor.h new file mode 100644 index 000000000..a79dea478 --- /dev/null +++ b/shared-bindings/microcontroller/Processor.h @@ -0,0 +1,39 @@ +/* + * This file is part of the Micro Python 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. + */ + +#ifndef MICROPY_INCLUDED_SHARED_BINDINGS_MICROCONTROLLER_PROCESSOR_H +#define MICROPY_INCLUDED_SHARED_BINDINGS_MICROCONTROLLER_PROCESSOR_H + +#include "py/obj.h" + +#include "common-hal/microcontroller/Processor.h" + +const mp_obj_type_t mcu_processor_type; + +uint32_t common_hal_mcu_processor_get_frequency(void); +float common_hal_mcu_processor_get_temperature(void); + +#endif // MICROPY_INCLUDED_SHARED_BINDINGS_MICROCONTROLLER_PROCESSOR_H diff --git a/shared-bindings/microcontroller/__init__.c b/shared-bindings/microcontroller/__init__.c index 56d363eed..0546ebf30 100644 --- a/shared-bindings/microcontroller/__init__.c +++ b/shared-bindings/microcontroller/__init__.c @@ -32,13 +32,17 @@ #include "py/obj.h" #include "py/runtime.h" +#include "common-hal/microcontroller/Pin.h" +#include "common-hal/microcontroller/Processor.h" + #include "shared-bindings/microcontroller/__init__.h" #include "shared-bindings/microcontroller/Pin.h" -#include "common-hal/microcontroller/Pin.h" +#include "shared-bindings/microcontroller/Processor.h" + #include "py/runtime.h" -//| :mod:`microcontroller` --- Pin references and core functionality +//| :mod:`microcontroller` --- Pin references and cpu functionality //| ================================================================ //| //| .. module:: microcontroller @@ -56,6 +60,12 @@ //| Pin //| +//| .. attribute:: cpu +//| +//| CPU information and control, such as temperature and clock frequency. +//| This object is the sole instance of `microcontroller.Processor`. +//| + //| .. method:: delay_us(delay) //| //| Dedicated delay method used for very short delays. DO NOT do long delays @@ -92,8 +102,8 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_0(mcu_enable_interrupts_obj, mcu_enable_interrupt //| .. attribute:: nvm //| -//| Available non-volatile memory. Its a `nvm.ByteArray` when available or -//| ``None`` otherwise. +//| Available non-volatile memory. +//| This object is the sole instance of `nvm.ByteArray` when available or ``None`` otherwise. //| //| :mod:`microcontroller.pin` --- Microcontroller pin names @@ -112,16 +122,19 @@ const mp_obj_module_t mcu_pin_module = { STATIC const mp_rom_map_elem_t mcu_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_microcontroller) }, + { MP_ROM_QSTR(MP_QSTR_cpu), MP_ROM_PTR(&common_hal_mcu_processor_obj) }, { MP_ROM_QSTR(MP_QSTR_delay_us), MP_ROM_PTR(&mcu_delay_us_obj) }, { MP_ROM_QSTR(MP_QSTR_disable_interrupts), MP_ROM_PTR(&mcu_disable_interrupts_obj) }, { MP_ROM_QSTR(MP_QSTR_enable_interrupts), MP_ROM_PTR(&mcu_enable_interrupts_obj) }, #if CIRCUITPY_INTERNAL_NVM_SIZE > 0 - { MP_ROM_QSTR(MP_QSTR_nvm), &common_hal_mcu_nvm_obj }, + { MP_ROM_QSTR(MP_QSTR_nvm), MP_ROM_PTR(&common_hal_mcu_nvm_obj) }, #else - { MP_ROM_QSTR(MP_QSTR_nvm), &mp_const_none_obj }, + { MP_ROM_QSTR(MP_QSTR_nvm), MP_ROM_PTR(&mp_const_none_obj) }, #endif { MP_ROM_QSTR(MP_QSTR_Pin), MP_ROM_PTR(&mcu_pin_type) }, { MP_ROM_QSTR(MP_QSTR_pin), MP_ROM_PTR(&mcu_pin_module) }, + { MP_ROM_QSTR(MP_QSTR_Processor), MP_ROM_PTR(&mcu_processor_type) }, + }; STATIC MP_DEFINE_CONST_DICT(mcu_module_globals, mcu_module_globals_table); diff --git a/shared-bindings/microcontroller/__init__.h b/shared-bindings/microcontroller/__init__.h index 9bad926cd..d43db4bf4 100644 --- a/shared-bindings/microcontroller/__init__.h +++ b/shared-bindings/microcontroller/__init__.h @@ -1,3 +1,4 @@ + /* * This file is part of the MicroPython project, http://micropython.org/ * @@ -30,6 +31,8 @@ #include "py/mpconfig.h" #include "py/obj.h" +#include "common-hal/microcontroller/Processor.h" + extern void common_hal_mcu_delay_us(uint32_t); extern void common_hal_mcu_disable_interrupts(void); @@ -37,6 +40,9 @@ extern void common_hal_mcu_enable_interrupts(void); extern const mp_obj_dict_t mcu_pin_globals; +extern const mcu_processor_obj_t common_hal_mcu_processor_obj; + + #if CIRCUITPY_INTERNAL_NVM_SIZE > 0 #include "common-hal/nvm/ByteArray.h" diff --git a/shared-bindings/nvm/ByteArray.c b/shared-bindings/nvm/ByteArray.c index 0ba511a77..361d03c55 100644 --- a/shared-bindings/nvm/ByteArray.c +++ b/shared-bindings/nvm/ByteArray.c @@ -46,12 +46,8 @@ //| .. class:: ByteArray() //| -//| Not currently dynamically supported. Access one through `microcontroller.nvm`. +//| Not currently dynamically supported. Access the sole instance through `microcontroller.nvm`. //| -STATIC mp_obj_t nvm_bytearray_make_new(const mp_obj_type_t *type, - mp_uint_t n_args, mp_uint_t n_kw, const mp_obj_t *args) { - return mp_const_none; -} //| .. method:: __len__() //| @@ -151,7 +147,6 @@ STATIC mp_obj_t nvm_bytearray_subscr(mp_obj_t self_in, mp_obj_t index_in, mp_obj const mp_obj_type_t nvm_bytearray_type = { { &mp_type_type }, .name = MP_QSTR_ByteArray, - .make_new = nvm_bytearray_make_new, .subscr = nvm_bytearray_subscr, .unary_op = nvm_bytearray_unary_op, .print = NULL, -- cgit v1.2.3