|
@@ -6,7 +6,7 @@
|
|
|
|
|
|
|
|
#include "mp_flipper_context.h"
|
|
#include "mp_flipper_context.h"
|
|
|
|
|
|
|
|
-static void infrared_receive_callback(void* ctx, bool level, uint32_t duration) {
|
|
|
|
|
|
|
+inline static void on_rx(void* ctx, bool level, uint32_t duration) {
|
|
|
mp_flipper_infrared_rx_t* session = ctx;
|
|
mp_flipper_infrared_rx_t* session = ctx;
|
|
|
|
|
|
|
|
if(session->pointer == 0 && !level) {
|
|
if(session->pointer == 0 && !level) {
|
|
@@ -22,12 +22,29 @@ static void infrared_receive_callback(void* ctx, bool level, uint32_t duration)
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-static void infrared_timeout_callback(void* ctx) {
|
|
|
|
|
|
|
+inline static void on_rx_timeout(void* ctx) {
|
|
|
mp_flipper_infrared_rx_t* session = ctx;
|
|
mp_flipper_infrared_rx_t* session = ctx;
|
|
|
|
|
|
|
|
session->running = false;
|
|
session->running = false;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+inline static FuriHalInfraredTxGetDataState on_tx(void* ctx, uint32_t* duration, bool* level) {
|
|
|
|
|
+ mp_flipper_infrared_tx_t* session = ctx;
|
|
|
|
|
+
|
|
|
|
|
+ *duration = session->provider(session->signal, session->index);
|
|
|
|
|
+ *level = session->level;
|
|
|
|
|
+
|
|
|
|
|
+ session->index++;
|
|
|
|
|
+
|
|
|
|
|
+ if(session->index >= session->size) {
|
|
|
|
|
+ session->index = 0;
|
|
|
|
|
+ session->repeat--;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ session->level = !session->level;
|
|
|
|
|
|
|
|
- furi_hal_infrared_async_rx_stop();
|
|
|
|
|
|
|
+ return session->repeat > 0 ? FuriHalInfraredTxGetDataStateOk :
|
|
|
|
|
+ FuriHalInfraredTxGetDataStateLastDone;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
inline uint32_t* mp_flipper_infrared_receive(uint32_t timeout, size_t* length) {
|
|
inline uint32_t* mp_flipper_infrared_receive(uint32_t timeout, size_t* length) {
|
|
@@ -38,18 +55,55 @@ inline uint32_t* mp_flipper_infrared_receive(uint32_t timeout, size_t* length) {
|
|
|
session->pointer = 0;
|
|
session->pointer = 0;
|
|
|
session->running = true;
|
|
session->running = true;
|
|
|
|
|
|
|
|
- furi_hal_infrared_async_rx_set_capture_isr_callback(infrared_receive_callback, session);
|
|
|
|
|
- furi_hal_infrared_async_rx_set_timeout_isr_callback(infrared_timeout_callback, session);
|
|
|
|
|
|
|
+ if(!furi_hal_infrared_is_busy()) {
|
|
|
|
|
+ furi_hal_infrared_async_rx_set_capture_isr_callback(on_rx, session);
|
|
|
|
|
+ furi_hal_infrared_async_rx_set_timeout_isr_callback(on_rx_timeout, session);
|
|
|
|
|
+
|
|
|
|
|
+ furi_hal_infrared_async_rx_start();
|
|
|
|
|
|
|
|
- furi_hal_infrared_async_rx_start();
|
|
|
|
|
|
|
+ furi_hal_infrared_async_rx_set_timeout(timeout);
|
|
|
|
|
|
|
|
- furi_hal_infrared_async_rx_set_timeout(timeout);
|
|
|
|
|
|
|
+ while(session->running) {
|
|
|
|
|
+ furi_delay_tick(10);
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- while(session->running) {
|
|
|
|
|
- furi_delay_tick(10);
|
|
|
|
|
|
|
+ furi_hal_infrared_async_rx_stop();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
*length = session->pointer;
|
|
*length = session->pointer;
|
|
|
|
|
|
|
|
return session->buffer;
|
|
return session->buffer;
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+inline 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) {
|
|
|
|
|
+ if(furi_hal_infrared_is_busy()) {
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ const mp_flipper_context_t* ctx = mp_flipper_context;
|
|
|
|
|
+
|
|
|
|
|
+ mp_flipper_infrared_tx_t* session = ctx->infrared_tx;
|
|
|
|
|
+
|
|
|
|
|
+ session->index = 0;
|
|
|
|
|
+ session->level = true;
|
|
|
|
|
+ session->provider = callback;
|
|
|
|
|
+ session->signal = signal;
|
|
|
|
|
+ session->repeat = repeat;
|
|
|
|
|
+ session->size = length;
|
|
|
|
|
+
|
|
|
|
|
+ furi_hal_infrared_set_tx_output(FuriHalInfraredTxPinInternal);
|
|
|
|
|
+
|
|
|
|
|
+ furi_hal_infrared_async_tx_set_data_isr_callback(on_tx, session);
|
|
|
|
|
+
|
|
|
|
|
+ furi_hal_infrared_async_tx_start(frequency, duty);
|
|
|
|
|
+
|
|
|
|
|
+ furi_hal_infrared_async_tx_wait_termination();
|
|
|
|
|
+
|
|
|
|
|
+ return true;
|
|
|
|
|
+}
|