Oliver Fabel 1 год назад
Родитель
Сommit
b00c5cd968
4 измененных файлов с 118 добавлено и 17 удалено
  1. 1 1
      genhdr/mpversion.h
  2. 9 0
      genhdr/qstrdefs.generated.h
  3. 98 16
      mp_flipper_modflipperzero.c
  4. 10 0
      mp_flipper_modflipperzero.h

+ 1 - 1
genhdr/mpversion.h

@@ -1,4 +1,4 @@
 // This file was generated by py/makeversionhdr.py
 #define MICROPY_GIT_TAG "v1.23.0-preview.322.g5114f2c1e"
 #define MICROPY_GIT_HASH "5114f2c1e"
-#define MICROPY_BUILD_DATE "2024-09-03"
+#define MICROPY_BUILD_DATE "2024-09-04"

+ 9 - 0
genhdr/qstrdefs.generated.h

@@ -194,6 +194,13 @@ QDEF1(MP_QSTR_GPIO_PIN_PB3, 2, 12, "GPIO_PIN_PB3")
 QDEF1(MP_QSTR_GPIO_PIN_PC0, 32, 12, "GPIO_PIN_PC0")
 QDEF1(MP_QSTR_GPIO_PIN_PC1, 33, 12, "GPIO_PIN_PC1")
 QDEF1(MP_QSTR_GPIO_PIN_PC3, 35, 12, "GPIO_PIN_PC3")
+QDEF1(MP_QSTR_GPIO_PULL_DOWN, 163, 14, "GPIO_PULL_DOWN")
+QDEF1(MP_QSTR_GPIO_PULL_NO, 144, 12, "GPIO_PULL_NO")
+QDEF1(MP_QSTR_GPIO_PULL_UP, 52, 12, "GPIO_PULL_UP")
+QDEF1(MP_QSTR_GPIO_SPEED_HIGH, 125, 15, "GPIO_SPEED_HIGH")
+QDEF1(MP_QSTR_GPIO_SPEED_LOW, 71, 14, "GPIO_SPEED_LOW")
+QDEF1(MP_QSTR_GPIO_SPEED_MEDIUM, 78, 17, "GPIO_SPEED_MEDIUM")
+QDEF1(MP_QSTR_GPIO_SPEED_VERY_HIGH, 154, 20, "GPIO_SPEED_VERY_HIGH")
 QDEF1(MP_QSTR_INPUT_BUTTON_BACK, 174, 17, "INPUT_BUTTON_BACK")
 QDEF1(MP_QSTR_INPUT_BUTTON_DOWN, 247, 17, "INPUT_BUTTON_DOWN")
 QDEF1(MP_QSTR_INPUT_BUTTON_LEFT, 94, 17, "INPUT_BUTTON_LEFT")
@@ -340,6 +347,7 @@ QDEF1(MP_QSTR___repl_print__, 1, 14, "__repl_print__")
 QDEF1(MP_QSTR___reversed__, 97, 12, "__reversed__")
 QDEF0(MP_QSTR___sub__, 33, 7, "__sub__")
 QDEF1(MP_QSTR___traceback__, 79, 13, "__traceback__")
+QDEF1(MP_QSTR__gpio_trigger_handler, 235, 21, "_gpio_trigger_handler")
 QDEF1(MP_QSTR__input_trigger_handler, 108, 22, "_input_trigger_handler")
 QDEF1(MP_QSTR_add, 68, 3, "add")
 QDEF1(MP_QSTR_bin, 224, 3, "bin")
@@ -397,6 +405,7 @@ QDEF1(MP_QSTR_maximum_space_recursion_space_depth_space_exceeded, 115, 32, "maxi
 QDEF1(MP_QSTR_min, 175, 3, "min")
 QDEF1(MP_QSTR_module, 191, 6, "module")
 QDEF1(MP_QSTR_oct, 253, 3, "oct")
+QDEF1(MP_QSTR_on_gpio, 106, 7, "on_gpio")
 QDEF1(MP_QSTR_on_input, 141, 8, "on_input")
 QDEF1(MP_QSTR_random, 190, 6, "random")
 QDEF1(MP_QSTR_rb, 213, 2, "rb")

+ 98 - 16
mp_flipper_modflipperzero.c

@@ -7,13 +7,6 @@
 
 #include "mp_flipper_modflipperzero.h"
 
-typedef struct {
-    uint8_t button;
-    uint8_t type;
-} on_input_arg_t;
-
-static void* mp_flipper_on_input_callback = NULL;
-
 static mp_obj_t flipperzero_light_set(mp_obj_t light_obj, mp_obj_t brightness_obj) {
     mp_int_t light = mp_obj_get_int(light_obj);
     mp_int_t brightness = mp_obj_get_int(brightness_obj);
@@ -389,6 +382,8 @@ static mp_obj_t flipperzero_canvas_clear() {
 }
 static MP_DEFINE_CONST_FUN_OBJ_0(flipperzero_canvas_clear_obj, flipperzero_canvas_clear);
 
+static void* mp_flipper_on_input_callback = NULL;
+
 static mp_obj_t flipperzero_on_input(mp_obj_t callback_obj) {
     mp_flipper_on_input_callback = callback_obj;
 
@@ -410,15 +405,6 @@ static mp_obj_t flipperzero_input_trigger_handler(mp_obj_t flags_obj) {
 }
 static MP_DEFINE_CONST_FUN_OBJ_1(flipperzero_input_trigger_handler_obj, flipperzero_input_trigger_handler);
 
-void mp_flipper_on_input(uint16_t button, uint16_t type) {
-    if(mp_flipper_on_input_callback != NULL) {
-        uint16_t flags = button | type;
-        mp_obj_t flags_obj = mp_obj_new_int_from_uint(flags);
-
-        mp_sched_schedule(&flipperzero_input_trigger_handler_obj, flags_obj);
-    }
-}
-
 static mp_obj_t flipperzero_dialog_message_set_text(size_t n_args, const mp_obj_t* args) {
     if(n_args < 3) {
         return mp_const_none;
@@ -480,6 +466,34 @@ static mp_obj_t flipperzero_dialog_message_clear() {
 }
 static MP_DEFINE_CONST_FUN_OBJ_0(flipperzero_dialog_message_clear_obj, flipperzero_dialog_message_clear);
 
+static void* mp_flipper_on_gpio_callback = NULL;
+static void* mp_flipper_on_gpio_callbacks[] = {
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+};
+
+static void* flipperzero_gpio_interrupt_make_callback(uint8_t pin, bool rising) {
+    void callback() {
+        mp_flipper_on_gpio(pin, rising);
+    }
+
+    return callback;
+}
+
 static mp_obj_t flipperzero_gpio_init_pin(size_t n_args, const mp_obj_t* args) {
     if(n_args != 2) {
         return mp_const_none;
@@ -490,6 +504,22 @@ static mp_obj_t flipperzero_gpio_init_pin(size_t n_args, const mp_obj_t* args) {
 
     mp_flipper_gpio_init_pin(pin, mode);
 
+    uint8_t index = pin * 2;
+
+    if(mode & MP_FLIPPER_GPIO_MODE_INTERRUPT_RISE) {
+        mp_flipper_on_gpio_callbacks[index] = flipperzero_gpio_interrupt_make_callback(pin, true);
+    } else {
+        mp_flipper_on_gpio_callbacks[index] = NULL;
+    }
+
+    index += 1;
+
+    if(mode & MP_FLIPPER_GPIO_MODE_INTERRUPT_FALL) {
+        mp_flipper_on_gpio_callbacks[index] = flipperzero_gpio_interrupt_make_callback(pin, false);
+    } else {
+        mp_flipper_on_gpio_callbacks[index] = NULL;
+    }
+
     return mp_const_none;
 }
 static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(flipperzero_gpio_init_pin_obj, 2, 2, flipperzero_gpio_init_pin);
@@ -513,6 +543,27 @@ static mp_obj_t flipperzero_gpio_get_pin(mp_obj_t pin_obj) {
 }
 static MP_DEFINE_CONST_FUN_OBJ_1(flipperzero_gpio_get_pin_obj, flipperzero_gpio_get_pin);
 
+static mp_obj_t flipperzero_on_gpio(mp_obj_t callback_obj) {
+    mp_flipper_on_gpio_callback = callback_obj;
+
+    return callback_obj;
+}
+static MP_DEFINE_CONST_FUN_OBJ_1(flipperzero_on_gpio_obj, flipperzero_on_gpio);
+
+static mp_obj_t flipperzero_gpio_trigger_handler(mp_obj_t flags_obj) {
+    if(mp_flipper_on_gpio_callback != NULL) {
+        mp_int_t flags = mp_obj_get_int(flags_obj);
+
+        mp_obj_t rising_obj = flags & 1 ? mp_const_false : mp_const_true;
+        mp_obj_t pin_obj = mp_obj_new_int(flags >> 1);
+
+        mp_call_function_2_protected(mp_flipper_on_gpio_callback, rising_obj, pin_obj);
+    }
+
+    return mp_const_none;
+}
+static MP_DEFINE_CONST_FUN_OBJ_1(flipperzero_gpio_trigger_handler_obj, flipperzero_gpio_trigger_handler);
+
 static const mp_rom_map_elem_t flipperzero_module_globals_table[] = {
     // light
     {MP_OBJ_NEW_QSTR(MP_QSTR___name__), MP_OBJ_NEW_QSTR(MP_QSTR_flipperzero)},
@@ -715,10 +766,21 @@ for octave in range(9):
     {MP_ROM_QSTR(MP_QSTR_GPIO_MODE_ANALOG), MP_ROM_INT(MP_FLIPPER_GPIO_MODE_ANALOG)},
     {MP_ROM_QSTR(MP_QSTR_GPIO_MODE_INTERRUPT_RISE), MP_ROM_INT(MP_FLIPPER_GPIO_MODE_INTERRUPT_RISE)},
     {MP_ROM_QSTR(MP_QSTR_GPIO_MODE_INTERRUPT_FALL), MP_ROM_INT(MP_FLIPPER_GPIO_MODE_INTERRUPT_FALL)},
+    // gpio - pull
+    {MP_ROM_QSTR(MP_QSTR_GPIO_PULL_NO), MP_ROM_INT(MP_FLIPPER_GPIO_PULL_NO)},
+    {MP_ROM_QSTR(MP_QSTR_GPIO_PULL_UP), MP_ROM_INT(MP_FLIPPER_GPIO_PULL_UP)},
+    {MP_ROM_QSTR(MP_QSTR_GPIO_PULL_DOWN), MP_ROM_INT(MP_FLIPPER_GPIO_PULL_DOWN)},
+    // gpio - speed
+    {MP_ROM_QSTR(MP_QSTR_GPIO_SPEED_LOW), MP_ROM_INT(MP_FLIPPER_GPIO_SPEED_LOW)},
+    {MP_ROM_QSTR(MP_QSTR_GPIO_SPEED_MEDIUM), MP_ROM_INT(MP_FLIPPER_GPIO_SPEED_MEDIUM)},
+    {MP_ROM_QSTR(MP_QSTR_GPIO_SPEED_HIGH), MP_ROM_INT(MP_FLIPPER_GPIO_SPEED_HIGH)},
+    {MP_ROM_QSTR(MP_QSTR_GPIO_SPEED_VERY_HIGH), MP_ROM_INT(MP_FLIPPER_GPIO_SPEED_VERY_HIGH)},
     // gpio - functions
     {MP_ROM_QSTR(MP_QSTR_gpio_init_pin), MP_ROM_PTR(&flipperzero_gpio_init_pin_obj)},
     {MP_ROM_QSTR(MP_QSTR_gpio_set_pin), MP_ROM_PTR(&flipperzero_gpio_set_pin_obj)},
     {MP_ROM_QSTR(MP_QSTR_gpio_get_pin), MP_ROM_PTR(&flipperzero_gpio_get_pin_obj)},
+    {MP_ROM_QSTR(MP_QSTR_on_gpio), MP_ROM_PTR(&flipperzero_on_gpio_obj)},
+    {MP_ROM_QSTR(MP_QSTR__gpio_trigger_handler), MP_ROM_PTR(&flipperzero_gpio_trigger_handler_obj)},
 };
 static MP_DEFINE_CONST_DICT(flipperzero_module_globals, flipperzero_module_globals_table);
 
@@ -728,3 +790,23 @@ const mp_obj_module_t flipperzero_module = {
 };
 
 MP_REGISTER_MODULE(MP_QSTR_flipperzero, flipperzero_module);
+
+void mp_flipper_on_input(uint16_t button, uint16_t type) {
+    if(mp_flipper_on_input_callback != NULL) {
+        uint16_t flags = button | type;
+        mp_obj_t flags_obj = mp_obj_new_int_from_uint(flags);
+
+        mp_sched_schedule(&flipperzero_input_trigger_handler_obj, flags_obj);
+    }
+}
+
+void mp_flipper_on_gpio(uint8_t pin, bool rising) {
+    uint8_t index = pin * 2 + (rising ? 0 : 1);
+
+    if(mp_flipper_on_gpio_callbacks[index] != NULL) {
+        uint16_t flags = pin << 1 + (rising ? 0 : 1);
+        mp_obj_t flags_obj = mp_obj_new_int_from_uint(flags);
+
+        mp_sched_schedule(&flipperzero_gpio_trigger_handler_obj, flags_obj);
+    }
+}

+ 10 - 0
mp_flipper_modflipperzero.h

@@ -216,6 +216,16 @@ void mp_flipper_dialog_message_clear();
 #define MP_FLIPPER_GPIO_MODE_INTERRUPT_RISE (1 << 4)
 #define MP_FLIPPER_GPIO_MODE_INTERRUPT_FALL (1 << 5)
 
+#define MP_FLIPPER_GPIO_PULL_NO (0)
+#define MP_FLIPPER_GPIO_PULL_UP (1)
+#define MP_FLIPPER_GPIO_PULL_DOWN (2)
+
+#define MP_FLIPPER_GPIO_SPEED_LOW (0)
+#define MP_FLIPPER_GPIO_SPEED_MEDIUM (1)
+#define MP_FLIPPER_GPIO_SPEED_HIGH (2)
+#define MP_FLIPPER_GPIO_SPEED_VERY_HIGH (3)
+
 void mp_flipper_gpio_init_pin(uint8_t raw_pin, uint8_t raw_mode);
 void mp_flipper_gpio_set_pin(uint8_t raw_pin, bool state);
 bool mp_flipper_gpio_get_pin(uint8_t raw_pin);
+void mp_flipper_on_gpio(uint8_t pin, bool rising);