Oliver Fabel 1 год назад
Родитель
Сommit
b1662b7f4f
3 измененных файлов с 32 добавлено и 1 удалено
  1. 1 0
      genhdr/qstrdefs.generated.h
  2. 20 0
      mp_flipper_modflipperzero.c
  3. 11 1
      mp_flipper_modflipperzero.h

+ 1 - 0
genhdr/qstrdefs.generated.h

@@ -394,6 +394,7 @@ QDEF1(MP_QSTR_gpio_init_pin, 185, 13, "gpio_init_pin")
 QDEF1(MP_QSTR_gpio_set_pin, 65, 12, "gpio_set_pin")
 QDEF1(MP_QSTR_hex, 112, 3, "hex")
 QDEF1(MP_QSTR_infrared_receive, 112, 16, "infrared_receive")
+QDEF1(MP_QSTR_infrared_transmit, 81, 17, "infrared_transmit")
 QDEF1(MP_QSTR_intersection, 40, 12, "intersection")
 QDEF1(MP_QSTR_intersection_update, 6, 19, "intersection_update")
 QDEF1(MP_QSTR_isdisjoint, 247, 10, "isdisjoint")

+ 20 - 0
mp_flipper_modflipperzero.c

@@ -590,6 +590,25 @@ static mp_obj_t flipperzero_infrared_receive(size_t n_args, const mp_obj_t* args
 }
 static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(flipperzero_infrared_receive_obj, 0, 1, flipperzero_infrared_receive);
 
+inline static uint32_t flipperzero_infrared_tx_signal_provider(mp_obj_t* signal, const size_t index) {
+    return mp_obj_get_int(signal[index]);
+}
+
+static mp_obj_t flipperzero_infrared_transmit(size_t n_args, const mp_obj_t* args) {
+    size_t size = 0;
+    mp_obj_t* signal;
+    mp_obj_t size_obj = mp_obj_get_array(args[0], &size, &signal);
+
+    mp_int_t repeat = n_args > 1 ? mp_obj_get_int(args[1]) : 1;
+    mp_int_t frequency = n_args > 2 ? mp_obj_get_int(args[1]) : MP_FLIPPER_INFRARED_TX_DEFAULT_FREQUENCY;
+    mp_int_t duty_cycle = n_args > 3 ? mp_obj_get_float(args[1]) : MP_FLIPPER_INFRARED_TX_DEFAULT_DUTY_CYCLE;
+
+    return mp_flipper_infrared_transmit(signal, length, flipperzero_infrared_tx_signal_provider, repeat, frequency, duty_cycle) ?
+               mp_const_true :
+               mp_const_false;
+}
+static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(flipperzero_infrared_transmit_obj, 1, 4, flipperzero_infrared_transmit);
+
 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)},
@@ -817,6 +836,7 @@ for octave in range(9):
     {MP_ROM_QSTR(MP_QSTR_pwm_is_running), MP_ROM_PTR(&flipperzero_pwm_is_running_obj)},
     // infrared - functions
     {MP_ROM_QSTR(MP_QSTR_infrared_receive), MP_ROM_PTR(&flipperzero_infrared_receive_obj)},
+    {MP_ROM_QSTR(MP_QSTR_infrared_transmit), MP_ROM_PTR(&flipperzero_infrared_transmit_obj)},
 };
 static MP_DEFINE_CONST_DICT(flipperzero_module_globals, flipperzero_module_globals_table);
 

+ 11 - 1
mp_flipper_modflipperzero.h

@@ -243,6 +243,16 @@ void mp_flipper_pwm_stop(uint8_t raw_pin);
 bool mp_flipper_pwm_is_running(uint8_t raw_pin);
 
 #define MP_FLIPPER_INFRARED_RX_DEFAULT_TIMEOUT (1000000)
+#define MP_FLIPPER_INFRARED_TX_DEFAULT_FREQUENCY (38000)
+#define MP_FLIPPER_INFRARED_TX_DEFAULT_DUTY_CYCLE (0.33)
+
+typedef uint32_t (*mp_flipper_infrared_signal_tx_provider)(void* signal, const size_t index);
 
 uint32_t* mp_flipper_infrared_receive(uint32_t timeout, size_t* length);
-bool mp_flipper_infrared_transmit(uint16_t* signal, size_t length);
+bool mp_flipper_infrared_transmit(
+    void* signal,
+    size_t length,
+    mp_flipper_infrared_signal_tx_provider callback,
+    uint32_t repeat,
+    uint32_t frequency,
+    float duty);