Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/ClusterM/flipperzero-firmware.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlbert Kharisov <ah@bright-box.com>2021-08-11 20:51:06 +0300
committerGitHub <noreply@github.com>2021-08-11 20:51:06 +0300
commit5ed9bdbc37a0fe339885e018811c82a9ddf74b83 (patch)
tree59861f52e6f6f21441fc108c0ad8d74b935a125d /applications/irda
parent86963555569adbb2fce6cd4b05875f31c7cec79b (diff)
[FL-1652, FL-1554] IRDA: Continuous transmitting (#636)
* [FL-1652] IRDA: Continuous transmitting * continuous encoding and sending signals by pressing button on menu * fast buttons scrolling in remote menu * bruteforce: stop reading file if progress == 100% * IRDA: .hpp -> .h * [FL-1554] IRDA: xTaskNotify -> osEventsFlagSet * IRDA: some stability fixes * Irda: minor cleanup, api-hal to furi-hal rename. Co-authored-by: あく <alleteam@gmail.com>
Diffstat (limited to 'applications/irda')
-rw-r--r--applications/irda/cli/irda-cli.cpp9
-rw-r--r--applications/irda/irda-app-brute-force.cpp5
-rw-r--r--applications/irda/irda-app-brute-force.h (renamed from applications/irda/irda-app-brute-force.hpp)10
-rw-r--r--applications/irda/irda-app-event.h (renamed from applications/irda/irda-app-event.hpp)3
-rw-r--r--applications/irda/irda-app-file-parser.cpp4
-rw-r--r--applications/irda/irda-app-file-parser.h (renamed from applications/irda/irda-app-file-parser.hpp)13
-rw-r--r--applications/irda/irda-app-remote-manager.cpp4
-rw-r--r--applications/irda/irda-app-remote-manager.h (renamed from applications/irda/irda-app-remote-manager.hpp)17
-rw-r--r--applications/irda/irda-app-view-manager.cpp14
-rw-r--r--applications/irda/irda-app-view-manager.h (renamed from applications/irda/irda-app-view-manager.hpp)3
-rw-r--r--applications/irda/irda-app.cpp21
-rw-r--r--applications/irda/irda-app.h (renamed from applications/irda/irda-app.hpp)22
-rw-r--r--applications/irda/irda-runner.cpp2
-rw-r--r--applications/irda/scene/irda-app-scene-edit-delete-done.cpp2
-rw-r--r--applications/irda/scene/irda-app-scene-edit-delete.cpp4
-rw-r--r--applications/irda/scene/irda-app-scene-edit-key-select.cpp2
-rw-r--r--applications/irda/scene/irda-app-scene-edit-rename-done.cpp2
-rw-r--r--applications/irda/scene/irda-app-scene-edit-rename.cpp2
-rw-r--r--applications/irda/scene/irda-app-scene-edit.cpp2
-rw-r--r--applications/irda/scene/irda-app-scene-learn-done.cpp2
-rw-r--r--applications/irda/scene/irda-app-scene-learn-enter-name.cpp2
-rw-r--r--applications/irda/scene/irda-app-scene-learn-success.cpp8
-rw-r--r--applications/irda/scene/irda-app-scene-learn.cpp16
-rw-r--r--applications/irda/scene/irda-app-scene-remote-list.cpp4
-rw-r--r--applications/irda/scene/irda-app-scene-remote.cpp64
-rw-r--r--applications/irda/scene/irda-app-scene-start.cpp2
-rw-r--r--applications/irda/scene/irda-app-scene-universal-common.cpp21
-rw-r--r--applications/irda/scene/irda-app-scene-universal-tv.cpp4
-rw-r--r--applications/irda/scene/irda-app-scene-universal.cpp2
-rw-r--r--applications/irda/scene/irda-app-scene.h (renamed from applications/irda/scene/irda-app-scene.hpp)33
-rw-r--r--applications/irda/view/irda-app-brut-view.c4
-rw-r--r--applications/irda/view/irda-app-brut-view.h2
32 files changed, 201 insertions, 104 deletions
diff --git a/applications/irda/cli/irda-cli.cpp b/applications/irda/cli/irda-cli.cpp
index 0a28dd9a..6cde9c95 100644
--- a/applications/irda/cli/irda-cli.cpp
+++ b/applications/irda/cli/irda-cli.cpp
@@ -19,7 +19,7 @@ static void signal_received_callback(void* context, IrdaWorkerSignal* received_s
Cli* cli = (Cli*)context;
if(irda_worker_signal_is_decoded(received_signal)) {
- const IrdaMessage* message = irda_worker_get_decoded_message(received_signal);
+ const IrdaMessage* message = irda_worker_get_decoded_signal(received_signal);
buf_cnt = sniprintf(
buf,
sizeof(buf),
@@ -54,16 +54,15 @@ static void irda_cli_start_ir_rx(Cli* cli, string_t args, void* context) {
}
IrdaWorker* worker = irda_worker_alloc();
- irda_worker_set_context(worker, cli);
- irda_worker_start(worker);
- irda_worker_set_received_signal_callback(worker, signal_received_callback);
+ irda_worker_rx_start(worker);
+ irda_worker_rx_set_received_signal_callback(worker, signal_received_callback, cli);
printf("Receiving IRDA...\r\nPress Ctrl+C to abort\r\n");
while(!cli_cmd_interrupt_received(cli)) {
delay(50);
}
- irda_worker_stop(worker);
+ irda_worker_rx_stop(worker);
irda_worker_free(worker);
}
diff --git a/applications/irda/irda-app-brute-force.cpp b/applications/irda/irda-app-brute-force.cpp
index 8709dce6..42797d21 100644
--- a/applications/irda/irda-app-brute-force.cpp
+++ b/applications/irda/irda-app-brute-force.cpp
@@ -1,5 +1,5 @@
-#include "irda-app-brute-force.hpp"
-#include "irda/irda-app-file-parser.hpp"
+#include "irda-app-brute-force.h"
+#include "irda/irda-app-file-parser.h"
#include "m-string.h"
#include <file-worker-cpp.h>
#include <memory>
@@ -47,7 +47,6 @@ void IrdaAppBruteForce::stop_bruteforce() {
}
}
-// TODO: [FL-1418] replace with timer-chained consequence of messages.
bool IrdaAppBruteForce::send_next_bruteforce(void) {
furi_assert(current_record.size());
furi_assert(file_parser);
diff --git a/applications/irda/irda-app-brute-force.hpp b/applications/irda/irda-app-brute-force.h
index ef9ab80d..174f74f5 100644
--- a/applications/irda/irda-app-brute-force.hpp
+++ b/applications/irda/irda-app-brute-force.h
@@ -1,7 +1,7 @@
#pragma once
#include "furi/check.h"
#include <unordered_map>
-#include "irda-app-file-parser.hpp"
+#include "irda-app-file-parser.h"
#include <memory>
class IrdaAppBruteForce {
@@ -28,7 +28,9 @@ public:
bool start_bruteforce(int index, int& record_amount);
void add_record(int index, const char* name);
- IrdaAppBruteForce(const char* filename) : universal_db_filename (filename) {}
- ~IrdaAppBruteForce() {}
+ IrdaAppBruteForce(const char* filename)
+ : universal_db_filename(filename) {
+ }
+ ~IrdaAppBruteForce() {
+ }
};
-
diff --git a/applications/irda/irda-app-event.hpp b/applications/irda/irda-app-event.h
index eb4848fa..752ce09f 100644
--- a/applications/irda/irda-app-event.hpp
+++ b/applications/irda/irda-app-event.h
@@ -9,6 +9,8 @@ public:
Exit,
Back,
MenuSelected,
+ MenuSelectedPress,
+ MenuSelectedRelease,
DialogExSelected,
NextScene,
IrdaMessageReceived,
@@ -24,4 +26,3 @@ public:
Type type;
};
-
diff --git a/applications/irda/irda-app-file-parser.cpp b/applications/irda/irda-app-file-parser.cpp
index 11fd563e..8cd0499b 100644
--- a/applications/irda/irda-app-file-parser.cpp
+++ b/applications/irda/irda-app-file-parser.cpp
@@ -1,6 +1,6 @@
-#include "irda-app-file-parser.hpp"
+#include "irda-app-file-parser.h"
#include "furi/check.h"
-#include "irda-app-remote-manager.hpp"
+#include "irda-app-remote-manager.h"
#include "irda-app-signal.h"
#include "m-string.h"
#include <text-store.h>
diff --git a/applications/irda/irda-app-file-parser.hpp b/applications/irda/irda-app-file-parser.h
index 2ece1a30..f3d42e49 100644
--- a/applications/irda/irda-app-file-parser.hpp
+++ b/applications/irda/irda-app-file-parser.h
@@ -26,8 +26,16 @@ public:
std::string make_name(const std::string& full_name) const;
private:
- size_t stringify_message(const IrdaAppSignal& signal, const char* name, char* content, size_t content_len);
- size_t stringify_raw_signal(const IrdaAppSignal& signal, const char* name, char* content, size_t content_len);
+ size_t stringify_message(
+ const IrdaAppSignal& signal,
+ const char* name,
+ char* content,
+ size_t content_len);
+ size_t stringify_raw_signal(
+ const IrdaAppSignal& signal,
+ const char* name,
+ char* content,
+ size_t content_len);
std::unique_ptr<IrdaFileSignal> parse_signal(const std::string& str) const;
std::unique_ptr<IrdaFileSignal> parse_signal_raw(const std::string& str) const;
std::string make_full_name(const std::string& name) const;
@@ -41,4 +49,3 @@ private:
char file_buf[128];
size_t file_buf_cnt = 0;
};
-
diff --git a/applications/irda/irda-app-remote-manager.cpp b/applications/irda/irda-app-remote-manager.cpp
index 4c339e85..cd98893e 100644
--- a/applications/irda/irda-app-remote-manager.cpp
+++ b/applications/irda/irda-app-remote-manager.cpp
@@ -1,4 +1,4 @@
-#include "irda-app-remote-manager.hpp"
+#include "irda-app-remote-manager.h"
#include <storage/storage.h>
#include "furi.h"
#include "furi/check.h"
@@ -8,7 +8,7 @@
#include <stdint.h>
#include <string>
#include <utility>
-#include "irda-app-file-parser.hpp"
+#include "irda-app-file-parser.h"
static const std::string default_remote_name = "remote";
diff --git a/applications/irda/irda-app-remote-manager.hpp b/applications/irda/irda-app-remote-manager.h
index e8e0a48c..60993b30 100644
--- a/applications/irda/irda-app-remote-manager.hpp
+++ b/applications/irda/irda-app-remote-manager.h
@@ -12,21 +12,27 @@ class IrdaAppRemoteButton {
friend class IrdaAppRemoteManager;
std::string name;
IrdaAppSignal signal;
+
public:
IrdaAppRemoteButton(const char* name, const IrdaAppSignal& signal)
- : name(name), signal (signal) {}
- ~IrdaAppRemoteButton() {}
+ : name(name)
+ , signal(signal) {
+ }
+ ~IrdaAppRemoteButton() {
+ }
};
class IrdaAppRemote {
friend class IrdaAppRemoteManager;
std::vector<IrdaAppRemoteButton> buttons;
std::string name;
+
public:
- IrdaAppRemote(const std::string& name) : name(name) {}
+ IrdaAppRemote(const std::string& name)
+ : name(name) {
+ }
- IrdaAppRemote& operator=(std::string& new_name) noexcept
- {
+ IrdaAppRemote& operator=(std::string& new_name) noexcept {
name = new_name;
buttons.clear();
return *this;
@@ -61,4 +67,3 @@ public:
bool store();
bool load(const std::string& name);
};
-
diff --git a/applications/irda/irda-app-view-manager.cpp b/applications/irda/irda-app-view-manager.cpp
index cc2371f7..6c65b005 100644
--- a/applications/irda/irda-app-view-manager.cpp
+++ b/applications/irda/irda-app-view-manager.cpp
@@ -1,7 +1,7 @@
#include "furi.h"
#include "gui/modules/button_panel.h"
-#include "irda-app.hpp"
-#include "irda/irda-app-event.hpp"
+#include "irda-app.h"
+#include "irda/irda-app-event.h"
#include <callback-connector.h>
IrdaAppViewManager::IrdaAppViewManager() {
@@ -112,8 +112,14 @@ void IrdaAppViewManager::receive_event(IrdaAppEvent* event) {
}
void IrdaAppViewManager::send_event(IrdaAppEvent* event) {
- osStatus_t result = osMessageQueuePut(event_queue, event, 0, 0);
- furi_check(result == osOK);
+ uint32_t timeout = 0;
+ /* Rapid button hammering on Remote Scene causes queue overflow - ignore it,
+ * but try to keep button release event - it switches off IRDA DMA sending. */
+ if(event->type == IrdaAppEvent::Type::MenuSelectedRelease) {
+ timeout = 200;
+ }
+ osMessageQueuePut(event_queue, event, 0, timeout);
+ /* furi_check(result == osOK); */
}
uint32_t IrdaAppViewManager::previous_view_callback(void* context) {
diff --git a/applications/irda/irda-app-view-manager.hpp b/applications/irda/irda-app-view-manager.h
index 4569a104..1f38b472 100644
--- a/applications/irda/irda-app-view-manager.hpp
+++ b/applications/irda/irda-app-view-manager.h
@@ -6,7 +6,7 @@
#include <gui/modules/dialog_ex.h>
#include <gui/modules/submenu.h>
#include <gui/modules/popup.h>
-#include "irda-app.hpp"
+#include "irda-app.h"
#include "view/irda-app-brut-view.h"
#include "gui/modules/button_panel.h"
@@ -57,4 +57,3 @@ private:
void add_view(ViewType view_type, View* view);
};
-
diff --git a/applications/irda/irda-app.cpp b/applications/irda/irda-app.cpp
index 1e2de687..5dd7c7b4 100644
--- a/applications/irda/irda-app.cpp
+++ b/applications/irda/irda-app.cpp
@@ -1,5 +1,5 @@
-#include "irda-app.hpp"
-#include "irda/irda-app-file-parser.hpp"
+#include "irda-app.h"
+#include "irda/irda-app-file-parser.h"
#include <irda_worker.h>
#include <furi.h>
#include <gui/gui.h>
@@ -222,22 +222,33 @@ void IrdaApp::notify_click() {
notification_message_block(notification, &sequence);
}
-void IrdaApp::notify_click_and_blink() {
+void IrdaApp::notify_click_and_green_blink() {
static const NotificationSequence sequence = {
&message_click,
&message_delay_1,
&message_sound_off,
- &message_red_0,
&message_green_255,
- &message_blue_0,
&message_delay_10,
&message_green_0,
+ &message_do_not_reset,
NULL,
};
notification_message_block(notification, &sequence);
}
+void IrdaApp::notify_blink_green() {
+ static const NotificationSequence sequence = {
+ &message_green_255,
+ &message_delay_10,
+ &message_green_0,
+ &message_do_not_reset,
+ NULL,
+ };
+
+ notification_message(notification, &sequence);
+}
+
void IrdaApp::notify_double_vibro() {
notification_message(notification, &sequence_double_vibro);
}
diff --git a/applications/irda/irda-app.hpp b/applications/irda/irda-app.h
index 0562aefb..cc7611a4 100644
--- a/applications/irda/irda-app.hpp
+++ b/applications/irda/irda-app.h
@@ -2,17 +2,16 @@
#include <map>
#include <irda.h>
#include <furi.h>
-#include "scene/irda-app-scene.hpp"
-#include "irda-app-event.hpp"
-#include "scene/irda-app-scene.hpp"
-#include "irda-app-view-manager.hpp"
-#include "irda-app-remote-manager.hpp"
+#include "scene/irda-app-scene.h"
+#include "irda-app-event.h"
+#include "scene/irda-app-scene.h"
+#include "irda-app-view-manager.h"
+#include "irda-app-remote-manager.h"
#include <forward_list>
#include <stdint.h>
#include <notification/notification-messages.h>
#include <irda_worker.h>
-
class IrdaApp {
public:
enum class EditElement : uint8_t {
@@ -71,7 +70,7 @@ public:
void set_learn_new_remote(bool value);
enum : int {
- ButtonNA = -1,
+ ButtonNA = -1,
};
int get_current_button();
void set_current_button(int value);
@@ -83,7 +82,8 @@ public:
void notify_green_on();
void notify_green_off();
void notify_click();
- void notify_click_and_blink();
+ void notify_click_and_green_blink();
+ void notify_blink_green();
static void text_input_callback(void* context);
static void popup_callback(void* context);
@@ -95,9 +95,9 @@ public:
~IrdaApp() {
irda_worker_free(irda_worker);
furi_record_close("notification");
- for (auto &it : scenes)
- delete it.second;
+ for(auto& it : scenes) delete it.second;
}
+
private:
static const uint8_t text_store_size = 128;
static const uint8_t text_store_max = 2;
@@ -120,7 +120,7 @@ private:
{Scene::Start, new IrdaAppSceneStart()},
{Scene::Universal, new IrdaAppSceneUniversal()},
{Scene::UniversalTV, new IrdaAppSceneUniversalTV()},
-// {Scene::UniversalAudio, new IrdaAppSceneUniversalAudio()},
+ // {Scene::UniversalAudio, new IrdaAppSceneUniversalAudio()},
{Scene::Learn, new IrdaAppSceneLearn()},
{Scene::LearnSuccess, new IrdaAppSceneLearnSuccess()},
{Scene::LearnEnterName, new IrdaAppSceneLearnEnterName()},
diff --git a/applications/irda/irda-runner.cpp b/applications/irda/irda-runner.cpp
index bf9f51bc..cad6fd0a 100644
--- a/applications/irda/irda-runner.cpp
+++ b/applications/irda/irda-runner.cpp
@@ -1,4 +1,4 @@
-#include "irda-app.hpp"
+#include "irda-app.h"
extern "C" int32_t irda_app(void* p) {
IrdaApp* app = new IrdaApp();
diff --git a/applications/irda/scene/irda-app-scene-edit-delete-done.cpp b/applications/irda/scene/irda-app-scene-edit-delete-done.cpp
index fa5422dd..ddde3e7b 100644
--- a/applications/irda/scene/irda-app-scene-edit-delete-done.cpp
+++ b/applications/irda/scene/irda-app-scene-edit-delete-done.cpp
@@ -1,4 +1,4 @@
-#include "../irda-app.hpp"
+#include "../irda-app.h"
void IrdaAppSceneEditDeleteDone::on_enter(IrdaApp* app) {
IrdaAppViewManager* view_manager = app->get_view_manager();
diff --git a/applications/irda/scene/irda-app-scene-edit-delete.cpp b/applications/irda/scene/irda-app-scene-edit-delete.cpp
index c16ee7f2..c5d1cdd7 100644
--- a/applications/irda/scene/irda-app-scene-edit-delete.cpp
+++ b/applications/irda/scene/irda-app-scene-edit-delete.cpp
@@ -1,6 +1,6 @@
-#include "../irda-app.hpp"
+#include "../irda-app.h"
#include "irda.h"
-#include "irda/scene/irda-app-scene.hpp"
+#include "irda/scene/irda-app-scene.h"
#include <string>
static void dialog_result_callback(DialogExResult result, void* context) {
diff --git a/applications/irda/scene/irda-app-scene-edit-key-select.cpp b/applications/irda/scene/irda-app-scene-edit-key-select.cpp
index 41956b1d..8a6733d8 100644
--- a/applications/irda/scene/irda-app-scene-edit-key-select.cpp
+++ b/applications/irda/scene/irda-app-scene-edit-key-select.cpp
@@ -1,4 +1,4 @@
-#include "../irda-app.hpp"
+#include "../irda-app.h"
#include "gui/modules/submenu.h"
static void submenu_callback(void* context, uint32_t index) {
diff --git a/applications/irda/scene/irda-app-scene-edit-rename-done.cpp b/applications/irda/scene/irda-app-scene-edit-rename-done.cpp
index 8e547f94..d3d135c7 100644
--- a/applications/irda/scene/irda-app-scene-edit-rename-done.cpp
+++ b/applications/irda/scene/irda-app-scene-edit-rename-done.cpp
@@ -1,4 +1,4 @@
-#include "../irda-app.hpp"
+#include "../irda-app.h"
void IrdaAppSceneEditRenameDone::on_enter(IrdaApp* app) {
IrdaAppViewManager* view_manager = app->get_view_manager();
diff --git a/applications/irda/scene/irda-app-scene-edit-rename.cpp b/applications/irda/scene/irda-app-scene-edit-rename.cpp
index 24b4d0f9..d821d03f 100644
--- a/applications/irda/scene/irda-app-scene-edit-rename.cpp
+++ b/applications/irda/scene/irda-app-scene-edit-rename.cpp
@@ -1,4 +1,4 @@
-#include "../irda-app.hpp"
+#include "../irda-app.h"
void IrdaAppSceneEditRename::on_enter(IrdaApp* app) {
IrdaAppViewManager* view_manager = app->get_view_manager();
diff --git a/applications/irda/scene/irda-app-scene-edit.cpp b/applications/irda/scene/irda-app-scene-edit.cpp
index 0ecb8d9e..1b659313 100644
--- a/applications/irda/scene/irda-app-scene-edit.cpp
+++ b/applications/irda/scene/irda-app-scene-edit.cpp
@@ -1,4 +1,4 @@
-#include "../irda-app.hpp"
+#include "../irda-app.h"
#include "gui/modules/submenu.h"
typedef enum {
diff --git a/applications/irda/scene/irda-app-scene-learn-done.cpp b/applications/irda/scene/irda-app-scene-learn-done.cpp
index a9bd2049..5a3bfcc7 100644
--- a/applications/irda/scene/irda-app-scene-learn-done.cpp
+++ b/applications/irda/scene/irda-app-scene-learn-done.cpp
@@ -1,4 +1,4 @@
-#include "../irda-app.hpp"
+#include "../irda-app.h"
void IrdaAppSceneLearnDone::on_enter(IrdaApp* app) {
IrdaAppViewManager* view_manager = app->get_view_manager();
diff --git a/applications/irda/scene/irda-app-scene-learn-enter-name.cpp b/applications/irda/scene/irda-app-scene-learn-enter-name.cpp
index a3b403e0..185e7fbc 100644
--- a/applications/irda/scene/irda-app-scene-learn-enter-name.cpp
+++ b/applications/irda/scene/irda-app-scene-learn-enter-name.cpp
@@ -1,4 +1,4 @@
-#include "../irda-app.hpp"
+#include "../irda-app.h"
#include "gui/modules/text_input.h"
void IrdaAppSceneLearnEnterName::on_enter(IrdaApp* app) {
diff --git a/applications/irda/scene/irda-app-scene-learn-success.cpp b/applications/irda/scene/irda-app-scene-learn-success.cpp
index 4ade76df..8fa0c87b 100644
--- a/applications/irda/scene/irda-app-scene-learn-success.cpp
+++ b/applications/irda/scene/irda-app-scene-learn-success.cpp
@@ -1,6 +1,6 @@
-#include "../irda-app.hpp"
+#include "../irda-app.h"
#include "irda.h"
-#include "../irda-app-file-parser.hpp"
+#include "../irda-app-file-parser.h"
#include <memory>
static void dialog_result_callback(DialogExResult result, void* context) {
@@ -51,6 +51,10 @@ void IrdaAppSceneLearnSuccess::on_enter(IrdaApp* app) {
bool IrdaAppSceneLearnSuccess::on_event(IrdaApp* app, IrdaAppEvent* event) {
bool consumed = false;
+ if(event->type == IrdaAppEvent::Type::Tick) {
+ /* Send event every tick to suppress any switching off green light */
+ app->notify_green_on();
+ }
if(event->type == IrdaAppEvent::Type::DialogExSelected) {
switch(event->payload.dialog_ex_result) {
diff --git a/applications/irda/scene/irda-app-scene-learn.cpp b/applications/irda/scene/irda-app-scene-learn.cpp
index 7fdd8bf7..cbbbbe7a 100644
--- a/applications/irda/scene/irda-app-scene-learn.cpp
+++ b/applications/irda/scene/irda-app-scene-learn.cpp
@@ -1,5 +1,5 @@
-#include "../irda-app.hpp"
-#include "../irda-app-event.hpp"
+#include "../irda-app.h"
+#include "../irda-app-event.h"
#include <irda_worker.h>
static void signal_received_callback(void* context, IrdaWorkerSignal* received_signal) {
@@ -9,7 +9,7 @@ static void signal_received_callback(void* context, IrdaWorkerSignal* received_s
IrdaApp* app = static_cast<IrdaApp*>(context);
if(irda_worker_signal_is_decoded(received_signal)) {
- IrdaAppSignal signal(irda_worker_get_decoded_message(received_signal));
+ IrdaAppSignal signal(irda_worker_get_decoded_signal(received_signal));
app->set_received_signal(signal);
} else {
const uint32_t* timings;
@@ -19,7 +19,7 @@ static void signal_received_callback(void* context, IrdaWorkerSignal* received_s
app->set_received_signal(signal);
}
- irda_worker_set_received_signal_callback(app->get_irda_worker(), NULL);
+ irda_worker_rx_set_received_signal_callback(app->get_irda_worker(), NULL, NULL);
IrdaAppEvent event;
event.type = IrdaAppEvent::Type::IrdaMessageReceived;
auto view_manager = app->get_view_manager();
@@ -31,9 +31,8 @@ void IrdaAppSceneLearn::on_enter(IrdaApp* app) {
auto popup = view_manager->get_popup();
auto worker = app->get_irda_worker();
- irda_worker_set_context(worker, app);
- irda_worker_set_received_signal_callback(worker, signal_received_callback);
- irda_worker_start(worker);
+ irda_worker_rx_set_received_signal_callback(worker, signal_received_callback, app);
+ irda_worker_rx_start(worker);
popup_set_icon(popup, 0, 32, &I_IrdaLearnShort_128x31);
popup_set_text(
@@ -58,11 +57,9 @@ bool IrdaAppSceneLearn::on_event(IrdaApp* app, IrdaAppEvent* event) {
case IrdaAppEvent::Type::IrdaMessageReceived:
app->notify_success();
app->switch_to_next_scene_without_saving(IrdaApp::Scene::LearnSuccess);
- irda_worker_stop(app->get_irda_worker());
break;
case IrdaAppEvent::Type::Back:
consumed = true;
- irda_worker_stop(app->get_irda_worker());
app->switch_to_previous_scene();
break;
default:
@@ -73,4 +70,5 @@ bool IrdaAppSceneLearn::on_event(IrdaApp* app, IrdaAppEvent* event) {
}
void IrdaAppSceneLearn::on_exit(IrdaApp* app) {
+ irda_worker_rx_stop(app->get_irda_worker());
}
diff --git a/applications/irda/scene/irda-app-scene-remote-list.cpp b/applications/irda/scene/irda-app-scene-remote-list.cpp
index d2b56e48..b6e8aab1 100644
--- a/applications/irda/scene/irda-app-scene-remote-list.cpp
+++ b/applications/irda/scene/irda-app-scene-remote-list.cpp
@@ -1,5 +1,5 @@
-#include "../irda-app.hpp"
-#include "irda/irda-app-event.hpp"
+#include "../irda-app.h"
+#include "irda/irda-app-event.h"
void IrdaAppSceneRemoteList::on_enter(IrdaApp* app) {
IrdaAppFileParser file_parser;
diff --git a/applications/irda/scene/irda-app-scene-remote.cpp b/applications/irda/scene/irda-app-scene-remote.cpp
index 9260babe..94cf61ec 100644
--- a/applications/irda/scene/irda-app-scene-remote.cpp
+++ b/applications/irda/scene/irda-app-scene-remote.cpp
@@ -1,5 +1,7 @@
-#include "../irda-app.hpp"
+#include "../irda-app.h"
#include "gui/modules/button_menu.h"
+#include "input/input.h"
+#include "irda_worker.h"
typedef enum {
ButtonIndexPlus = -2,
@@ -7,22 +9,41 @@ typedef enum {
ButtonIndexNA = 0,
} ButtonIndex;
-static void button_menu_callback(void* context, int32_t index) {
+static void button_menu_callback(void* context, int32_t index, InputType type) {
IrdaApp* app = static_cast<IrdaApp*>(context);
IrdaAppEvent event;
- event.type = IrdaAppEvent::Type::MenuSelected;
+ if(type == InputTypePress) {
+ event.type = IrdaAppEvent::Type::MenuSelectedPress;
+ } else if(type == InputTypeRelease) {
+ event.type = IrdaAppEvent::Type::MenuSelectedRelease;
+ } else if(type == InputTypeShort) {
+ event.type = IrdaAppEvent::Type::MenuSelected;
+ } else {
+ furi_assert(0);
+ }
+
event.payload.menu_index = index;
app->get_view_manager()->send_event(&event);
}
+static void irda_app_message_sent_callback(void* context) {
+ IrdaApp* app = static_cast<IrdaApp*>(context);
+ app->notify_blink_green();
+}
+
void IrdaAppSceneRemote::on_enter(IrdaApp* app) {
IrdaAppViewManager* view_manager = app->get_view_manager();
ButtonMenu* button_menu = view_manager->get_button_menu();
auto remote_manager = app->get_remote_manager();
int i = 0;
+ button_pressed = false;
+ irda_worker_tx_set_get_signal_callback(
+ app->get_irda_worker(), irda_worker_tx_get_signal_steady_callback, app);
+ irda_worker_tx_set_signal_sent_callback(
+ app->get_irda_worker(), irda_app_message_sent_callback, app);
buttons_names = remote_manager->get_button_list();
i = 0;
@@ -48,24 +69,49 @@ void IrdaAppSceneRemote::on_enter(IrdaApp* app) {
bool IrdaAppSceneRemote::on_event(IrdaApp* app, IrdaAppEvent* event) {
bool consumed = true;
- if(event->type == IrdaAppEvent::Type::MenuSelected) {
+ if((event->type == IrdaAppEvent::Type::MenuSelected) ||
+ (event->type == IrdaAppEvent::Type::MenuSelectedPress) ||
+ (event->type == IrdaAppEvent::Type::MenuSelectedRelease)) {
switch(event->payload.menu_index) {
case ButtonIndexPlus:
+ furi_assert(event->type == IrdaAppEvent::Type::MenuSelected);
app->notify_click();
buttonmenu_item_selected = event->payload.menu_index;
app->set_learn_new_remote(false);
app->switch_to_next_scene(IrdaApp::Scene::Learn);
break;
case ButtonIndexEdit:
+ furi_assert(event->type == IrdaAppEvent::Type::MenuSelected);
app->notify_click();
buttonmenu_item_selected = event->payload.menu_index;
app->switch_to_next_scene(IrdaApp::Scene::Edit);
break;
default:
- app->notify_click_and_blink();
- auto remote_manager = app->get_remote_manager();
- auto signal = remote_manager->get_button_data(event->payload.menu_index);
- signal.transmit();
+ furi_assert(event->type != IrdaAppEvent::Type::MenuSelected);
+ bool pressed = (event->type == IrdaAppEvent::Type::MenuSelectedPress);
+
+ if(pressed && !button_pressed) {
+ button_pressed = true;
+ app->notify_click_and_green_blink();
+
+ auto button_signal =
+ app->get_remote_manager()->get_button_data(event->payload.menu_index);
+ if(button_signal.is_raw()) {
+ irda_worker_set_raw_signal(
+ app->get_irda_worker(),
+ button_signal.get_raw_signal().timings,
+ button_signal.get_raw_signal().timings_cnt);
+ } else {
+ irda_worker_set_decoded_signal(
+ app->get_irda_worker(), &button_signal.get_message());
+ }
+
+ irda_worker_tx_start(app->get_irda_worker());
+ } else if(!pressed && button_pressed) {
+ button_pressed = false;
+ irda_worker_tx_stop(app->get_irda_worker());
+ app->notify_green_off();
+ }
break;
}
} else if(event->type == IrdaAppEvent::Type::Back) {
@@ -79,6 +125,8 @@ bool IrdaAppSceneRemote::on_event(IrdaApp* app, IrdaAppEvent* event) {
}
void IrdaAppSceneRemote::on_exit(IrdaApp* app) {
+ irda_worker_tx_set_get_signal_callback(app->get_irda_worker(), nullptr, nullptr);
+ irda_worker_tx_set_signal_sent_callback(app->get_irda_worker(), nullptr, nullptr);
IrdaAppViewManager* view_manager = app->get_view_manager();
ButtonMenu* button_menu = view_manager->get_button_menu();
diff --git a/applications/irda/scene/irda-app-scene-start.cpp b/applications/irda/scene/irda-app-scene-start.cpp
index 6d9e77f8..4b6bf13e 100644
--- a/applications/irda/scene/irda-app-scene-start.cpp
+++ b/applications/irda/scene/irda-app-scene-start.cpp
@@ -1,4 +1,4 @@
-#include "../irda-app.hpp"
+#include "../irda-app.h"
typedef enum {
SubmenuIndexUniversalLibrary,
diff --git a/applications/irda/scene/irda-app-scene-universal-common.cpp b/applications/irda/scene/irda-app-scene-universal-common.cpp
index 88e7cf34..8e2e3747 100644
--- a/applications/irda/scene/irda-app-scene-universal-common.cpp
+++ b/applications/irda/scene/irda-app-scene-universal-common.cpp
@@ -1,12 +1,12 @@
-#include "../irda-app.hpp"
+#include "../irda-app.h"
#include "assets_icons.h"
#include "gui/modules/button_menu.h"
#include "gui/modules/button_panel.h"
#include "../view/irda-app-brut-view.h"
#include "gui/view.h"
-#include "irda/irda-app-event.hpp"
-#include "irda/irda-app-view-manager.hpp"
-#include "irda/scene/irda-app-scene.hpp"
+#include "irda/irda-app-event.h"
+#include "irda/irda-app-view-manager.h"
+#include "irda/scene/irda-app-scene.h"
void IrdaAppSceneUniversalCommon::irda_app_item_callback(void* context, uint32_t index) {
IrdaApp* app = static_cast<IrdaApp*>(context);
@@ -49,10 +49,11 @@ void IrdaAppSceneUniversalCommon::show_popup(IrdaApp* app, int record_amount) {
button_panel_set_popup_input_callback(button_panel, irda_popup_brut_input_callback, app);
}
-void IrdaAppSceneUniversalCommon::progress_popup(IrdaApp* app) {
- popup_brut_increase_progress(app->get_view_manager()->get_popup_brut());
+bool IrdaAppSceneUniversalCommon::progress_popup(IrdaApp* app) {
+ bool result = popup_brut_increase_progress(app->get_view_manager()->get_popup_brut());
auto button_panel = app->get_view_manager()->get_button_panel();
with_view_model_cpp(button_panel_get_view(button_panel), void*, model, { return true; });
+ return result;
}
bool IrdaAppSceneUniversalCommon::on_event(IrdaApp* app, IrdaAppEvent* event) {
@@ -63,9 +64,11 @@ bool IrdaAppSceneUniversalCommon::on_event(IrdaApp* app, IrdaAppEvent* event) {
auto view_manager = app->get_view_manager();
IrdaAppEvent tick_event = {.type = IrdaAppEvent::Type::Tick};
view_manager->send_event(&tick_event);
- if(brute_force.send_next_bruteforce()) {
- progress_popup(app);
- } else {
+ bool result = brute_force.send_next_bruteforce();
+ if(result) {
+ result = progress_popup(app);
+ }
+ if(!result) {
brute_force.stop_bruteforce();
brute_force_started = false;
remove_popup(app);
diff --git a/applications/irda/scene/irda-app-scene-universal-tv.cpp b/applications/irda/scene/irda-app-scene-universal-tv.cpp
index 6723990e..92a9ce37 100644
--- a/applications/irda/scene/irda-app-scene-universal-tv.cpp
+++ b/applications/irda/scene/irda-app-scene-universal-tv.cpp
@@ -1,5 +1,5 @@
-#include "irda/scene/irda-app-scene.hpp"
-#include "irda/irda-app.hpp"
+#include "irda/scene/irda-app-scene.h"
+#include "irda/irda-app.h"
void IrdaAppSceneUniversalTV::on_enter(IrdaApp* app) {
IrdaAppViewManager* view_manager = app->get_view_manager();
diff --git a/applications/irda/scene/irda-app-scene-universal.cpp b/applications/irda/scene/irda-app-scene-universal.cpp
index b29adbe7..61a61fd2 100644
--- a/applications/irda/scene/irda-app-scene-universal.cpp
+++ b/applications/irda/scene/irda-app-scene-universal.cpp
@@ -1,4 +1,4 @@
-#include "../irda-app.hpp"
+#include "../irda-app.h"
typedef enum {
SubmenuIndexUniversalTV,
diff --git a/applications/irda/scene/irda-app-scene.hpp b/applications/irda/scene/irda-app-scene.h
index da80acfa..11eb1b38 100644
--- a/applications/irda/scene/irda-app-scene.hpp
+++ b/applications/irda/scene/irda-app-scene.h
@@ -1,11 +1,10 @@
#pragma once
-#include "../irda-app-event.hpp"
+#include "../irda-app-event.h"
#include <furi-hal-irda.h>
#include "irda.h"
#include <vector>
#include <string>
-#include "../irda-app-brute-force.hpp"
-
+#include "../irda-app-brute-force.h"
class IrdaApp;
@@ -24,6 +23,7 @@ public:
void on_enter(IrdaApp* app) final;
bool on_event(IrdaApp* app, IrdaAppEvent* event) final;
void on_exit(IrdaApp* app) final;
+
private:
uint32_t submenu_item_selected = 0;
};
@@ -33,6 +33,7 @@ public:
void on_enter(IrdaApp* app) final;
bool on_event(IrdaApp* app, IrdaAppEvent* event) final;
void on_exit(IrdaApp* app) final;
+
private:
uint32_t submenu_item_selected = 0;
};
@@ -70,9 +71,11 @@ public:
void on_enter(IrdaApp* app) final;
bool on_event(IrdaApp* app, IrdaAppEvent* event) final;
void on_exit(IrdaApp* app) final;
+
private:
std::vector<std::string> buttons_names;
uint32_t buttonmenu_item_selected = 0;
+ bool button_pressed = false;
};
class IrdaAppSceneRemoteList : public IrdaAppScene {
@@ -80,6 +83,7 @@ public:
void on_enter(IrdaApp* app) final;
bool on_event(IrdaApp* app, IrdaAppEvent* event) final;
void on_exit(IrdaApp* app) final;
+
private:
uint32_t submenu_item_selected = 0;
std::vector<std::string> remote_names;
@@ -90,6 +94,7 @@ public:
void on_enter(IrdaApp* app) final;
bool on_event(IrdaApp* app, IrdaAppEvent* event) final;
void on_exit(IrdaApp* app) final;
+
private:
uint32_t submenu_item_selected = 0;
};
@@ -99,6 +104,7 @@ public:
void on_enter(IrdaApp* app) final;
bool on_event(IrdaApp* app, IrdaAppEvent* event) final;
void on_exit(IrdaApp* app) final;
+
private:
std::vector<std::string> buttons_names;
};
@@ -133,16 +139,20 @@ public:
class IrdaAppSceneUniversalCommon : public IrdaAppScene {
bool brute_force_started = false;
+
protected:
bool on_event(IrdaApp* app, IrdaAppEvent* event) final;
void on_exit(IrdaApp* app) final;
IrdaAppBruteForce brute_force;
void remove_popup(IrdaApp* app);
void show_popup(IrdaApp* app, int record_amount);
- void progress_popup(IrdaApp* app);
+ bool progress_popup(IrdaApp* app);
static void irda_app_item_callback(void* context, uint32_t index);
- IrdaAppSceneUniversalCommon(const char* filename) : brute_force(filename) {}
- ~IrdaAppSceneUniversalCommon() {}
+ IrdaAppSceneUniversalCommon(const char* filename)
+ : brute_force(filename) {
+ }
+ ~IrdaAppSceneUniversalCommon() {
+ }
};
class IrdaAppSceneUniversalTV : public IrdaAppSceneUniversalCommon {
@@ -151,13 +161,16 @@ public:
IrdaAppSceneUniversalTV()
: IrdaAppSceneUniversalCommon("/ext/irda/universal/tv.ir") {
}
- ~IrdaAppSceneUniversalTV() {}
+ ~IrdaAppSceneUniversalTV() {
+ }
};
class IrdaAppSceneUniversalAudio : public IrdaAppSceneUniversalCommon {
public:
void on_enter(IrdaApp* app) final;
- IrdaAppSceneUniversalAudio() : IrdaAppSceneUniversalCommon("/ext/irda/universal/audio.ir") {}
- ~IrdaAppSceneUniversalAudio() {}
+ IrdaAppSceneUniversalAudio()
+ : IrdaAppSceneUniversalCommon("/ext/irda/universal/audio.ir") {
+ }
+ ~IrdaAppSceneUniversalAudio() {
+ }
};
-
diff --git a/applications/irda/view/irda-app-brut-view.c b/applications/irda/view/irda-app-brut-view.c
index 56936383..7f502464 100644
--- a/applications/irda/view/irda-app-brut-view.c
+++ b/applications/irda/view/irda-app-brut-view.c
@@ -15,13 +15,15 @@ struct IrdaAppPopupBrut {
char percents_string_storage[8];
};
-void popup_brut_increase_progress(IrdaAppPopupBrut* popup_brut) {
+bool popup_brut_increase_progress(IrdaAppPopupBrut* popup_brut) {
furi_assert(popup_brut);
if(popup_brut->progress < popup_brut->progress_max)
++popup_brut->progress;
else
furi_assert(0);
+
+ return popup_brut->progress < popup_brut->progress_max;
}
void popup_brut_draw_callback(Canvas* canvas, void* context) {
diff --git a/applications/irda/view/irda-app-brut-view.h b/applications/irda/view/irda-app-brut-view.h
index e9f0ec62..3f6b973a 100644
--- a/applications/irda/view/irda-app-brut-view.h
+++ b/applications/irda/view/irda-app-brut-view.h
@@ -7,7 +7,7 @@ extern "C" {
typedef struct IrdaAppPopupBrut IrdaAppPopupBrut;
-void popup_brut_increase_progress(IrdaAppPopupBrut* popup_brut);
+bool popup_brut_increase_progress(IrdaAppPopupBrut* popup_brut);
IrdaAppPopupBrut* popup_brut_alloc();
void popup_brut_free(IrdaAppPopupBrut* popup_brut);
void popup_brut_draw_callback(Canvas* canvas, void* model);