Skip to content
This repository has been archived by the owner on Jul 28, 2024. It is now read-only.

Commit

Permalink
Add automatic IR blaster detection
Browse files Browse the repository at this point in the history
removed last_settings because it isnt needed anymore
  • Loading branch information
Sil333033 committed Jan 27, 2024
1 parent cb635ff commit 7c4f6de
Show file tree
Hide file tree
Showing 8 changed files with 87 additions and 128 deletions.
17 changes: 5 additions & 12 deletions applications/main/infrared/infrared_app.c
Original file line number Diff line number Diff line change
Expand Up @@ -204,20 +204,15 @@ static InfraredApp* infrared_alloc() {
infrared->loading = loading_alloc();
infrared->progress = infrared_progress_view_alloc();

infrared->last_settings = infrared_last_settings_alloc();
infrared_last_settings_load(infrared->last_settings);

if(infrared->last_settings->ext_5v) {
if(furi_hal_infrared_is_external_connected()) {
uint8_t attempts = 0;
while(!furi_hal_power_is_otg_enabled() && attempts++ < 5) {
furi_hal_power_enable_otg();
furi_delay_ms(10);
}
}

if(infrared->last_settings->ext_out && !furi_hal_infrared_get_debug_out_status()) {
furi_hal_infrared_set_debug_out(true);
}
furi_hal_infrared_block_external_output(false);

return infrared;
}
Expand Down Expand Up @@ -286,13 +281,11 @@ static void infrared_free(InfraredApp* infrared) {
furi_string_free(infrared->file_path);
furi_string_free(infrared->button_name);

if(infrared->last_settings->ext_5v) {
if(furi_hal_power_is_otg_enabled()) {
furi_hal_power_disable_otg();
}
if(furi_hal_power_is_otg_enabled()) {
furi_hal_power_disable_otg();
}

infrared_last_settings_free(infrared->last_settings);
furi_hal_infrared_block_external_output(false);

free(infrared);
}
Expand Down
4 changes: 2 additions & 2 deletions applications/main/infrared/infrared_app_i.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
#include "infrared_remote.h"
#include "infrared_brute_force.h"
#include "infrared_custom_event.h"
#include "infrared_last_settings.h"
// #include "infrared_last_settings.h"

#include "scenes/infrared_scene.h"
#include "views/infrared_progress_view.h"
Expand Down Expand Up @@ -129,7 +129,7 @@ struct InfraredApp {
/** Arbitrary text storage for various inputs. */
char text_store[INFRARED_TEXT_STORE_NUM][INFRARED_TEXT_STORE_SIZE + 1];
InfraredAppState app_state; /**< Application state. */
InfraredLastSettings* last_settings; /**< Last settings. */
//InfraredLastSettings* last_settings; /**< Last settings. */

void* rpc_ctx; /**< Pointer to the RPC context object. */
};
Expand Down
88 changes: 0 additions & 88 deletions applications/main/infrared/infrared_last_settings.c

This file was deleted.

15 changes: 0 additions & 15 deletions applications/main/infrared/infrared_last_settings.h

This file was deleted.

34 changes: 23 additions & 11 deletions applications/main/infrared/scenes/infrared_scene_debug_settings.c
Original file line number Diff line number Diff line change
Expand Up @@ -9,19 +9,22 @@ const char* const infrared_debug_cfg_variables_text[] = {
};

static void infrared_scene_debug_settings_changed(VariableItem* item) {
InfraredApp* infrared = variable_item_get_context(item);
value_index_ir = variable_item_get_current_value_index(item);

variable_item_set_current_value_text(item, infrared_debug_cfg_variables_text[value_index_ir]);

furi_hal_infrared_set_debug_out(value_index_ir);

infrared->last_settings->ext_out = value_index_ir == 1;
infrared_last_settings_save(infrared->last_settings);
if(value_index_ir == 0) {
furi_hal_infrared_set_debug_out(false);
furi_hal_infrared_block_external_output(true);
if(furi_hal_power_is_otg_enabled()) {
furi_hal_power_disable_otg();
}
} else {
furi_hal_infrared_block_external_output(false);
}
}

static void infrared_scene_debug_settings_power_changed(VariableItem* item) {
InfraredApp* infrared = variable_item_get_context(item);
bool value = variable_item_get_current_value_index(item);
if(value) {
for(int i = 0; i < 5 && !furi_hal_power_is_otg_enabled(); i++) {
Expand All @@ -34,9 +37,6 @@ static void infrared_scene_debug_settings_power_changed(VariableItem* item) {
}
}
variable_item_set_current_value_text(item, value ? "ON" : "OFF");

infrared->last_settings->ext_5v = value;
infrared_last_settings_save(infrared->last_settings);
}

static void infrared_debug_settings_start_var_list_enter_callback(void* context, uint32_t index) {
Expand All @@ -49,7 +49,10 @@ void infrared_scene_debug_settings_on_enter(void* context) {

VariableItemList* variable_item_list = infrared->variable_item_list;

value_index_ir = furi_hal_infrared_get_debug_out_status();
value_index_ir =
(furi_hal_infrared_is_external_connected() &&
!furi_hal_infrared_is_external_output_blocked());

VariableItem* item = variable_item_list_add(
variable_item_list,
"Send signal to",
Expand All @@ -70,10 +73,19 @@ void infrared_scene_debug_settings_on_enter(void* context) {
infrared_scene_debug_settings_power_changed,
infrared);
bool enabled = furi_hal_power_is_otg_enabled() ||
furi_hal_power_is_charging(); // 5v is enabled via hardware if charging
furi_hal_power_is_charging() || // 5v is enabled via hardware if charging
furi_hal_infrared_is_external_connected();
variable_item_set_current_value_index(item, enabled);
variable_item_set_current_value_text(item, enabled ? "ON" : "OFF");

if(furi_hal_infrared_is_external_connected() && !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);
}
}

view_dispatcher_switch_to_view(infrared->view_dispatcher, InfraredViewVariableItemList);
}

Expand Down
3 changes: 3 additions & 0 deletions targets/f7/api_symbols.csv
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
35 changes: 35 additions & 0 deletions targets/f7/furi_hal/furi_hal_infrared.c
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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 */
Expand Down Expand Up @@ -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;
}
19 changes: 19 additions & 0 deletions targets/furi_hal_include/furi_hal_infrared.h
Original file line number Diff line number Diff line change
Expand Up @@ -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

0 comments on commit 7c4f6de

Please sign in to comment.