Skip to content

Commit

Permalink
Finished learn mode and signal analyzer (#3)
Browse files Browse the repository at this point in the history
* Implemented signal receiver and learn mode view skeleton

* Receive and display infrared message in learn mode

* Fixed variable type

* Added buttons to received ir signal view

* Stable IR signal receiver and analyzer

* Stable signal handling and learn navigation skeleton

* Ask to enter new remote name when finishing learn

* Implemented exit dialog warning for learning mode

* Finished learn mode and signal analyzer

---------

Co-authored-by: Sandro Kalatozishvili <[email protected]>
  • Loading branch information
kala13x and Sandro Kalatozishvili committed Oct 7, 2023
1 parent e6a83b1 commit a08a27b
Show file tree
Hide file tree
Showing 25 changed files with 1,380 additions and 48 deletions.
5 changes: 4 additions & 1 deletion .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@
"infrared_remote.h": "c",
"xremote_navigation_view.h": "c",
"xremote_settings_view.h": "c",
"xremote_learn_view.h": "c"
"xremote_learn_view.h": "c",
"system_error": "c",
"typeinfo": "c",
"xremote_analyzer.h": "c"
}
}
17 changes: 14 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,16 +40,16 @@ Button name | Description
## Progress

- [x] Application menu
- [ ] Learn new remote
- [ ] Signal analyzer
- [x] Learn new remote
- [x] Signal analyzer
- [x] Use saved remote
- [x] General button page
- [x] Control buttons page
- [x] Navigation buttons page
- [x] Player buttons page
- [ ] Custom buttons page
- [ ] Full button list
- [ ] Edit remote file
- [ ] Rename remote file
- [ ] Delete remote file
- [x] Application settings
- [x] GUI to change settings
Expand Down Expand Up @@ -81,6 +81,17 @@ Button name | Description
</tr>
</table>

<table align="center">
<tr>
<td align="center">Learn mode</td>
<td align="center">Received signal</td>
</tr>
<tr>
<td><img src="https://github.com/kala13x/flipper-xremote/blob/main/screens/learn_mode.png" alt="XRemote learn mode"></td>
<td><img src="https://github.com/kala13x/flipper-xremote/blob/main/screens/signal_view.png" alt="XRemote received signal"></td>
</tr>
</table>

<table align="center">
<tr>
<td align="center">Settings</td>
Expand Down
15 changes: 15 additions & 0 deletions infrared/infrared_remote.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
Modifications made:
- Added function infrared_remote_get_button_by_name()
- Added function infrared_remote_delete_button_by_name()
- Added function infrared_remote_push_button()
*/

#include "infrared_remote.h"
Expand Down Expand Up @@ -113,6 +115,13 @@ bool infrared_remote_add_button(InfraredRemote* remote, const char* name, Infrar
return infrared_remote_store(remote);
}

void infrared_remote_push_button(InfraredRemote* remote, const char* name, InfraredSignal* signal) {
InfraredRemoteButton* button = infrared_remote_button_alloc();
infrared_remote_button_set_name(button, name);
infrared_remote_button_set_signal(button, signal);
InfraredButtonArray_push_back(remote->buttons, button);
}

bool infrared_remote_rename_button(InfraredRemote* remote, const char* new_name, size_t index) {
furi_assert(index < InfraredButtonArray_size(remote->buttons));
InfraredRemoteButton* button = *InfraredButtonArray_get(remote->buttons, index);
Expand All @@ -128,6 +137,12 @@ bool infrared_remote_delete_button(InfraredRemote* remote, size_t index) {
return infrared_remote_store(remote);
}

bool infrared_remote_delete_button_by_name(InfraredRemote* remote, const char* name) {
size_t index = 0;
if (!infrared_remote_find_button_by_name(remote, name, &index)) return false;
return infrared_remote_delete_button(remote, index);
}

void infrared_remote_move_button(InfraredRemote* remote, size_t index_orig, size_t index_dest) {
furi_assert(index_orig < InfraredButtonArray_size(remote->buttons));
furi_assert(index_dest < InfraredButtonArray_size(remote->buttons));
Expand Down
4 changes: 4 additions & 0 deletions infrared/infrared_remote.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
Modifications made:
- Added function infrared_remote_get_button_by_name()
- Added function infrared_remote_delete_button_by_name()
- Added function infrared_remote_push_button()
*/

#pragma once
Expand All @@ -32,8 +34,10 @@ bool infrared_remote_find_button_by_name(InfraredRemote* remote, const char* nam
InfraredRemoteButton* infrared_remote_get_button_by_name(InfraredRemote* remote, const char* name);

bool infrared_remote_add_button(InfraredRemote* remote, const char* name, InfraredSignal* signal);
void infrared_remote_push_button(InfraredRemote* remote, const char* name, InfraredSignal* signal);
bool infrared_remote_rename_button(InfraredRemote* remote, const char* new_name, size_t index);
bool infrared_remote_delete_button(InfraredRemote* remote, size_t index);
bool infrared_remote_delete_button_by_name(InfraredRemote* remote, const char* name);
void infrared_remote_move_button(InfraredRemote* remote, size_t index_orig, size_t index_dest);

bool infrared_remote_store(InfraredRemote* remote);
Expand Down
Binary file modified screens/app_menu.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added screens/learn_mode.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified screens/saved_remote_apps.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added screens/signal_view.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
60 changes: 50 additions & 10 deletions views/xremote_common_view.c
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,50 @@
#include "xremote_common_view.h"
#include "../xremote_app.h"

typedef struct {
int index;
const char *name;
} XRemoteButton;

static const XRemoteButton g_buttons[XREMOTE_BUTTON_COUNT + 1] =
{
{ 0, XREMOTE_COMMAND_POWER },
{ 1, XREMOTE_COMMAND_SETUP },
{ 2, XREMOTE_COMMAND_INPUT },
{ 3, XREMOTE_COMMAND_MENU },
{ 4, XREMOTE_COMMAND_LIST },
{ 5, XREMOTE_COMMAND_INFO },
{ 6, XREMOTE_COMMAND_BACK },
{ 7, XREMOTE_COMMAND_OK },
{ 8, XREMOTE_COMMAND_UP },
{ 9, XREMOTE_COMMAND_DOWN },
{ 10, XREMOTE_COMMAND_LEFT },
{ 11, XREMOTE_COMMAND_RIGHT },
{ 12, XREMOTE_COMMAND_JUMP_FORWARD },
{ 13, XREMOTE_COMMAND_JUMP_BACKWARD },
{ 14, XREMOTE_COMMAND_FAST_FORWARD },
{ 15, XREMOTE_COMMAND_FAST_BACKWARD },
{ 16, XREMOTE_COMMAND_PLAY_PAUSE },
{ 17, XREMOTE_COMMAND_PAUSE },
{ 18, XREMOTE_COMMAND_PLAY },
{ 19, XREMOTE_COMMAND_STOP },
{ 20, XREMOTE_COMMAND_MUTE },
{ 21, XREMOTE_COMMAND_MODE },
{ 22, XREMOTE_COMMAND_VOL_UP },
{ 23, XREMOTE_COMMAND_VOL_DOWN },
{ 24, XREMOTE_COMMAND_NEXT_CHAN },
{ 25, XREMOTE_COMMAND_PREV_CHAN },
{ -1, NULL }
};

const char* xremote_button_get_name(int index)
{
if (index > XREMOTE_BUTTON_COUNT) return NULL;
return g_buttons[index].name;
}

struct XRemoteView {
XRemoteViewClearCallback on_clear;
XRemoteClearCallback on_clear;
XRemoteAppContext* app_ctx;
View* view;
void *context;
Expand Down Expand Up @@ -39,17 +81,14 @@ void xremote_view_clear_context(XRemoteView* rview)
{
furi_assert(rview);

if (rview->context != NULL &&
rview->on_clear != NULL)
{
if (rview->context && rview->on_clear)
rview->on_clear(rview->context);
rview->context = NULL;
}

rview->context = NULL;
}

void xremote_view_set_context(XRemoteView* rview, void *context, XRemoteViewClearCallback on_clear)
void xremote_view_set_context(XRemoteView* rview, void *context, XRemoteClearCallback on_clear)
{
furi_assert(rview);
xremote_view_clear_context(rview);
rview->context = context;
rview->on_clear = on_clear;
Expand Down Expand Up @@ -209,9 +248,10 @@ void xremote_canvas_draw_header(Canvas* canvas, ViewOrientation orient, const ch

canvas_set_font(canvas, FontPrimary);
elements_multiline_text_aligned(canvas, x, 0, align, AlignTop, "XRemote");

canvas_set_font(canvas, FontSecondary);
elements_multiline_text_aligned(canvas, x, 12, align, AlignTop, section);

if (section != NULL)
elements_multiline_text_aligned(canvas, x, 12, align, AlignTop, section);
}

void xremote_canvas_draw_exit_footer(Canvas* canvas, ViewOrientation orient, const char *text)
Expand Down
24 changes: 22 additions & 2 deletions views/xremote_common_view.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@

#include "../infrared/infrared_remote.h"

#define XREMOTE_BUTTON_COUNT 26
#define XREMOTE_COMMAND_POWER "Power"
#define XREMOTE_COMMAND_SETUP "Setup"
#define XREMOTE_COMMAND_INPUT "Input"
Expand Down Expand Up @@ -47,6 +48,18 @@
#define XREMOTE_COMMAND_NEXT_CHAN "Ch_next"
#define XREMOTE_COMMAND_PREV_CHAN "Ch_prev"

typedef enum {
XRemoteEventReserved = 200,
XRemoteEventSignalReceived,
XRemoteEventSignalFinish,
XRemoteEventSignalSave,
XRemoteEventSignalRetry,
XRemoteEventSignalSend,
XRemoteEventSignalSkip,
XRemoteEventSignalAskExit,
XRemoteEventSignalExit
} XRemoteEvent;

typedef enum {
/* Navigation */
XRemoteIconOk,
Expand Down Expand Up @@ -80,11 +93,15 @@ typedef struct {

typedef enum {
XRemoteViewNone,
XRemoteViewSignal,
XRemoteViewTextInput,
XRemoteViewDialogExit,

/* Main page */
XRemoteViewSubmenu,
XRemoteViewLearn,
XRemoteViewSaved,
XRemoteViewAnalyzer,
XRemoteViewSettings,
XRemoteViewAbout,

Expand All @@ -98,8 +115,11 @@ typedef enum {
} XRemoteViewID;

typedef struct XRemoteView XRemoteView;
typedef void (*XRemoteViewClearCallback)(void *context);
typedef void (*XRemoteClearCallback)(void *context);
typedef void (*XRemoteViewDrawFunction)(Canvas*, XRemoteViewModel*);
typedef XRemoteView* (*XRemoteViewAllocator)(void* app_ctx);

const char* xremote_button_get_name(int index);

void xremote_canvas_draw_header(Canvas* canvas, ViewOrientation orient, const char* section);
void xremote_canvas_draw_exit_footer(Canvas* canvas, ViewOrientation orient, const char *text);
Expand All @@ -118,7 +138,7 @@ InfraredRemoteButton* xremote_view_get_button_by_name(XRemoteView *rview, const
bool xremote_view_press_button(XRemoteView *rview, InfraredRemoteButton* button);
bool xremote_view_send_ir_msg_by_name(XRemoteView *rview, const char *name);

void xremote_view_set_context(XRemoteView* rview, void *context, XRemoteViewClearCallback on_clear);
void xremote_view_set_context(XRemoteView* rview, void *context, XRemoteClearCallback on_clear);
void* xremote_view_get_context(XRemoteView* rview);
void xremote_view_clear_context(XRemoteView* rview);
void* xremote_view_get_app_context(XRemoteView* rview);
Expand Down
Loading

0 comments on commit a08a27b

Please sign in to comment.