This commit is contained in:
Willy-JL
2024-03-29 00:47:07 +00:00
81 changed files with 1260 additions and 970 deletions

View File

@@ -1,7 +1,10 @@
#include "infrared_app_i.h"
#include <furi_hal_power.h>
#include <string.h>
#include <toolbox/path.h>
#include <toolbox/saved_struct.h>
#include <dolphin/dolphin.h>
#define TAG "InfraredApp"
@@ -9,6 +12,13 @@
#define INFRARED_TX_MIN_INTERVAL_MS (50U)
#define INFRARED_TASK_STACK_SIZE (2048UL)
#define INFRARED_SETTINGS_VERSION (0)
#define INFRARED_SETTINGS_MAGIC (0x1F)
typedef struct {
uint8_t tx_pin;
} InfraredSettings;
static const NotificationSequence*
infrared_notification_sequences[InfraredNotificationMessageCount] = {
&sequence_success,
@@ -174,12 +184,6 @@ static InfraredApp* infrared_alloc(void) {
view_dispatcher_add_view(
view_dispatcher, InfraredViewDialogEx, dialog_ex_get_view(infrared->dialog_ex));
infrared->variable_item_list = variable_item_list_alloc();
view_dispatcher_add_view(
infrared->view_dispatcher,
InfraredViewVariableItemList,
variable_item_list_get_view(infrared->variable_item_list));
infrared->button_menu = button_menu_alloc();
view_dispatcher_add_view(
view_dispatcher, InfraredViewButtonMenu, button_menu_get_view(infrared->button_menu));
@@ -187,6 +191,12 @@ static InfraredApp* infrared_alloc(void) {
infrared->popup = popup_alloc();
view_dispatcher_add_view(view_dispatcher, InfraredViewPopup, popup_get_view(infrared->popup));
infrared->var_item_list = variable_item_list_alloc();
view_dispatcher_add_view(
view_dispatcher,
InfraredViewVariableList,
variable_item_list_get_view(infrared->var_item_list));
infrared->view_stack = view_stack_alloc();
view_dispatcher_add_view(
view_dispatcher, InfraredViewStack, view_stack_get_view(infrared->view_stack));
@@ -210,10 +220,6 @@ static InfraredApp* infrared_alloc(void) {
infrared->button_panel = button_panel_alloc();
infrared->progress = infrared_progress_view_alloc();
infrared->last_settings = infrared_last_settings_alloc();
infrared_last_settings_load(infrared->last_settings);
infrared_last_settings_apply(infrared->last_settings);
return infrared;
}
@@ -241,15 +247,15 @@ static void infrared_free(InfraredApp* infrared) {
view_dispatcher_remove_view(view_dispatcher, InfraredViewDialogEx);
dialog_ex_free(infrared->dialog_ex);
view_dispatcher_remove_view(infrared->view_dispatcher, InfraredViewVariableItemList);
variable_item_list_free(infrared->variable_item_list);
view_dispatcher_remove_view(view_dispatcher, InfraredViewButtonMenu);
button_menu_free(infrared->button_menu);
view_dispatcher_remove_view(view_dispatcher, InfraredViewPopup);
popup_free(infrared->popup);
view_dispatcher_remove_view(view_dispatcher, InfraredViewVariableList);
variable_item_list_free(infrared->var_item_list);
view_dispatcher_remove_view(view_dispatcher, InfraredViewStack);
view_stack_free(infrared->view_stack);
@@ -287,9 +293,6 @@ static void infrared_free(InfraredApp* infrared) {
furi_string_free(infrared->file_path);
furi_string_free(infrared->button_name);
infrared_last_settings_reset(infrared->last_settings);
infrared_last_settings_free(infrared->last_settings);
free(infrared);
}
@@ -447,6 +450,59 @@ void infrared_show_error_message(const InfraredApp* infrared, const char* fmt, .
va_end(args);
}
void infrared_set_tx_pin(InfraredApp* infrared, FuriHalInfraredTxPin tx_pin) {
if(tx_pin < FuriHalInfraredTxPinMax) {
furi_hal_infrared_set_tx_output(tx_pin);
} else {
FuriHalInfraredTxPin tx_pin_detected = furi_hal_infrared_detect_tx_output();
furi_hal_infrared_set_tx_output(tx_pin_detected);
if(tx_pin_detected != FuriHalInfraredTxPinInternal) {
infrared_enable_otg(infrared, true);
}
}
infrared->app_state.tx_pin = tx_pin;
}
void infrared_enable_otg(InfraredApp* infrared, bool enable) {
if(enable) {
furi_hal_power_enable_otg();
} else {
furi_hal_power_disable_otg();
}
infrared->app_state.is_otg_enabled = enable;
}
static void infrared_load_settings(InfraredApp* infrared) {
InfraredSettings settings = {0};
if(!saved_struct_load(
INFRARED_SETTINGS_PATH,
&settings,
sizeof(InfraredSettings),
INFRARED_SETTINGS_MAGIC,
INFRARED_SETTINGS_VERSION)) {
FURI_LOG_D(TAG, "Failed to load settings, using defaults");
}
infrared_set_tx_pin(infrared, settings.tx_pin);
}
void infrared_save_settings(InfraredApp* infrared) {
InfraredSettings settings = {
.tx_pin = infrared->app_state.tx_pin,
};
if(!saved_struct_save(
INFRARED_SETTINGS_PATH,
&settings,
sizeof(InfraredSettings),
INFRARED_SETTINGS_MAGIC,
INFRARED_SETTINGS_VERSION)) {
FURI_LOG_E(TAG, "Failed to save settings");
}
}
void infrared_signal_received_callback(void* context, InfraredWorkerSignal* received_signal) {
furi_assert(context);
InfraredApp* infrared = context;
@@ -484,9 +540,10 @@ void infrared_popup_closed_callback(void* context) {
infrared->view_dispatcher, InfraredCustomEventTypePopupClosed);
}
int32_t infrared_app(char* p) {
int32_t infrared_app(void* p) {
InfraredApp* infrared = infrared_alloc();
infrared_load_settings(infrared);
infrared_make_app_folder(infrared);
bool is_remote_loaded = false;
@@ -529,6 +586,9 @@ int32_t infrared_app(char* p) {
view_dispatcher_run(infrared->view_dispatcher);
infrared_set_tx_pin(infrared, FuriHalInfraredTxPinInternal);
infrared_enable_otg(infrared, false);
infrared_free(infrared);
return 0;
}