Add automatic IR blaster detection

removed last_settings because it isnt needed anymore
This commit is contained in:
Sil333033
2024-01-27 20:33:10 +01:00
parent cb635ff2d2
commit 7c4f6de06f
8 changed files with 87 additions and 128 deletions

View File

@@ -1319,8 +1319,11 @@ Function,+,furi_hal_infrared_async_tx_set_signal_sent_isr_callback,void,"FuriHal
Function,+,furi_hal_infrared_async_tx_start,void,"uint32_t, float"
Function,+,furi_hal_infrared_async_tx_stop,void,
Function,+,furi_hal_infrared_async_tx_wait_termination,void,
Function,+,furi_hal_infrared_block_external_output,void,_Bool
Function,+,furi_hal_infrared_get_debug_out_status,_Bool,
Function,+,furi_hal_infrared_is_busy,_Bool,
Function,+,furi_hal_infrared_is_external_connected,_Bool,
Function,+,furi_hal_infrared_is_external_output_blocked,_Bool,
Function,+,furi_hal_infrared_set_debug_out,void,_Bool
Function,-,furi_hal_init,void,
Function,-,furi_hal_init_early,void,
1 entry status name type params
1319 Function + furi_hal_infrared_async_tx_start void uint32_t, float
1320 Function + furi_hal_infrared_async_tx_stop void
1321 Function + furi_hal_infrared_async_tx_wait_termination void
1322 Function + furi_hal_infrared_block_external_output void _Bool
1323 Function + furi_hal_infrared_get_debug_out_status _Bool
1324 Function + furi_hal_infrared_is_busy _Bool
1325 Function + furi_hal_infrared_is_external_connected _Bool
1326 Function + furi_hal_infrared_is_external_output_blocked _Bool
1327 Function + furi_hal_infrared_set_debug_out void _Bool
1328 Function - furi_hal_init void
1329 Function - furi_hal_init_early void

View File

@@ -2,6 +2,7 @@
#include <furi_hal_interrupt.h>
#include <furi_hal_resources.h>
#include <furi_hal_bus.h>
#include <furi_hal_power.h>
#include <stm32wbxx_ll_tim.h>
#include <stm32wbxx_ll_dma.h>
@@ -79,6 +80,7 @@ static volatile InfraredState furi_hal_infrared_state = InfraredStateIdle;
static InfraredTimTx infrared_tim_tx;
static InfraredTimRx infrared_tim_rx;
static bool infrared_external_output;
static bool block_external;
static void furi_hal_infrared_tx_fill_buffer(uint8_t buf_num, uint8_t polarity_shift);
static void furi_hal_infrared_async_tx_free_resources(void);
@@ -648,12 +650,29 @@ void furi_hal_infrared_async_tx_start(uint32_t freq, float duty_cycle) {
furi_delay_us(5);
LL_TIM_GenerateEvent_UPDATE(INFRARED_DMA_TIMER); /* DMA -> TIMx_RCR */
furi_delay_us(5);
if(block_external) {
infrared_external_output = false;
} else {
infrared_external_output = furi_hal_infrared_is_external_connected();
}
if(infrared_external_output) {
if(!furi_hal_power_is_otg_enabled()) {
uint8_t attempts = 0;
while(!furi_hal_power_is_otg_enabled() && attempts++ < 5) {
furi_hal_power_enable_otg();
furi_delay_ms(10);
}
furi_delay_ms(100);
}
LL_GPIO_ResetOutputPin(
gpio_ext_pa7.port, gpio_ext_pa7.pin); /* when disable it prevents false pulse */
furi_hal_gpio_init_ex(
&gpio_ext_pa7, GpioModeAltFunctionPushPull, GpioPullUp, GpioSpeedHigh, GpioAltFn1TIM1);
} else {
furi_hal_power_disable_otg();
LL_GPIO_ResetOutputPin(
gpio_infrared_tx.port,
gpio_infrared_tx.pin); /* when disable it prevents false pulse */
@@ -708,3 +727,19 @@ void furi_hal_infrared_async_tx_set_signal_sent_isr_callback(
infrared_tim_tx.signal_sent_callback = callback;
infrared_tim_tx.signal_sent_context = context;
}
bool furi_hal_infrared_is_external_connected() {
furi_hal_gpio_init(&gpio_ext_pa7, GpioModeInput, GpioPullUp, GpioSpeedHigh);
furi_delay_ms(1);
bool is_external_connected = !furi_hal_gpio_read(&gpio_ext_pa7);
furi_hal_gpio_init(&gpio_ext_pa7, GpioModeAnalog, GpioPullDown, GpioSpeedLow);
return is_external_connected;
}
void furi_hal_infrared_block_external_output(bool block) {
block_external = block;
}
bool furi_hal_infrared_is_external_output_blocked(void) {
return block_external;
}

View File

@@ -149,6 +149,25 @@ void furi_hal_infrared_async_tx_set_signal_sent_isr_callback(
FuriHalInfraredTxSignalSentISRCallback callback,
void* context);
/** Check if a module (like IR Blaster) is connected to PA7
*
* return true if a module is connected, false otherwise
*/
bool furi_hal_infrared_is_external_connected();
/** Block external output on PA7
*
* if blocked, its forced to internal IR. If unblocked, external IR is used if connected
* @param block true to block, false to unblock
*/
void furi_hal_infrared_block_external_output(bool block);
/** Check if external output on PA7 is blocked
*
* @return true if blocked, false otherwise
*/
bool furi_hal_infrared_is_external_output_blocked();
#ifdef __cplusplus
}
#endif