Skip to content

Commit 492306c

Browse files
Merge branch 'dev' into developer-docs-editing
2 parents b78662e + c9ab2b6 commit 492306c

35 files changed

Lines changed: 739 additions & 347 deletions

.github/actions/submit_sdk/action.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ runs:
4949
- name: Submit SDK
5050
shell: bash
5151
run: |
52-
curl -sX 'GET' \
52+
curl --fail -sX 'GET' \
5353
'${{ inputs.catalog-url }}/api/v0/0/sdk?length=500' \
5454
-H 'Accept: application/json' > sdk_versions.json
5555
if jq -r -e ".[] | select((.api == \"${{ inputs.firmware-api }}\") and .target == \"${{ inputs.firmware-target }}\")" sdk_versions.json > found_sdk.json ; then
@@ -61,15 +61,15 @@ runs:
6161
if ! echo "${{ inputs.firmware-version }}" | grep -q -- "-rc" ; then
6262
SDK_ID=$(jq -r ._id found_sdk.json)
6363
echo "Marking SDK $SDK_ID as released"
64-
curl -X 'POST' \
64+
curl --fail-with-body -X 'POST' \
6565
"${{ inputs.catalog-url }}/api/v0/0/sdk/${SDK_ID}/release" \
6666
-H 'Accept: application/json' \
6767
-H 'Authorization: Bearer ${{ inputs.catalog-api-token }}' \
6868
-d ''
6969
fi
7070
else
7171
echo "API version ${{ inputs.firmware-api }} doesn't exist in catalog, adding"
72-
curl -X 'POST' \
72+
curl --fail-with-body -X 'POST' \
7373
'${{ inputs.catalog-url }}/api/v0/0/sdk' \
7474
-H 'Accept: application/json' \
7575
-H 'Authorization: Bearer ${{ inputs.catalog-api-token }}' \

applications/debug/unit_tests/application.fam

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@ App(
131131
apptype=FlipperAppType.PLUGIN,
132132
entry_point="get_api",
133133
requires=["unit_tests"],
134+
fap_libs=["infrared"],
134135
)
135136

136137
App(

applications/debug/unit_tests/tests/infrared/infrared_test.c

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#include <flipper_format.h>
33
#include <infrared.h>
44
#include <common/infrared_common_i.h>
5+
#include <lib/infrared/signal/infrared_brute_force.h>
56
#include "../test.h" // IWYU pragma: keep
67

78
#define IR_TEST_FILES_DIR EXT_PATH("unit_tests/infrared/")
@@ -13,6 +14,7 @@ typedef struct {
1314
InfraredEncoderHandler* encoder_handler;
1415
FuriString* file_path;
1516
FlipperFormat* ff;
17+
InfraredBruteForce* brutedb;
1618
} InfraredTest;
1719

1820
static InfraredTest* test;
@@ -24,12 +26,14 @@ static void infrared_test_alloc(void) {
2426
test->encoder_handler = infrared_alloc_encoder();
2527
test->ff = flipper_format_buffered_file_alloc(storage);
2628
test->file_path = furi_string_alloc();
29+
test->brutedb = infrared_brute_force_alloc();
2730
}
2831

2932
static void infrared_test_free(void) {
3033
furi_check(test);
3134
infrared_free_decoder(test->decoder_handler);
3235
infrared_free_encoder(test->encoder_handler);
36+
infrared_brute_force_free(test->brutedb);
3337
flipper_format_free(test->ff);
3438
furi_string_free(test->file_path);
3539
furi_record_close(RECORD_STORAGE);
@@ -523,6 +527,74 @@ MU_TEST(infrared_test_encoder_decoder_all) {
523527
infrared_test_run_encoder_decoder(InfraredProtocolPioneer, 1);
524528
}
525529

530+
MU_TEST(infrared_test_ac_database) {
531+
infrared_brute_force_set_db_filename(test->brutedb, EXT_PATH("infrared/assets/ac.ir"));
532+
uint32_t i = 0;
533+
infrared_brute_force_add_record(test->brutedb, i++, "Off");
534+
infrared_brute_force_add_record(test->brutedb, i++, "Dh");
535+
infrared_brute_force_add_record(test->brutedb, i++, "Cool_hi");
536+
infrared_brute_force_add_record(test->brutedb, i++, "Heat_hi");
537+
infrared_brute_force_add_record(test->brutedb, i++, "Cool_lo");
538+
infrared_brute_force_add_record(test->brutedb, i++, "Heat_lo");
539+
540+
mu_assert(
541+
infrared_brute_force_calculate_messages(test->brutedb) == InfraredErrorCodeNone,
542+
"universal ac database is invalid");
543+
544+
infrared_brute_force_reset(test->brutedb);
545+
}
546+
547+
MU_TEST(infrared_test_audio_database) {
548+
infrared_brute_force_set_db_filename(test->brutedb, EXT_PATH("infrared/assets/audio.ir"));
549+
uint32_t i = 0;
550+
infrared_brute_force_add_record(test->brutedb, i++, "Power");
551+
infrared_brute_force_add_record(test->brutedb, i++, "Mute");
552+
infrared_brute_force_add_record(test->brutedb, i++, "Play");
553+
infrared_brute_force_add_record(test->brutedb, i++, "Pause");
554+
infrared_brute_force_add_record(test->brutedb, i++, "Prev");
555+
infrared_brute_force_add_record(test->brutedb, i++, "Next");
556+
infrared_brute_force_add_record(test->brutedb, i++, "Vol_dn");
557+
infrared_brute_force_add_record(test->brutedb, i++, "Vol_up");
558+
559+
mu_assert(
560+
infrared_brute_force_calculate_messages(test->brutedb) == InfraredErrorCodeNone,
561+
"universal audio database is invalid");
562+
563+
infrared_brute_force_reset(test->brutedb);
564+
}
565+
566+
MU_TEST(infrared_test_projector_database) {
567+
infrared_brute_force_set_db_filename(test->brutedb, EXT_PATH("infrared/assets/projector.ir"));
568+
uint32_t i = 0;
569+
infrared_brute_force_add_record(test->brutedb, i++, "Power");
570+
infrared_brute_force_add_record(test->brutedb, i++, "Mute");
571+
infrared_brute_force_add_record(test->brutedb, i++, "Vol_up");
572+
infrared_brute_force_add_record(test->brutedb, i++, "Vol_dn");
573+
574+
mu_assert(
575+
infrared_brute_force_calculate_messages(test->brutedb) == InfraredErrorCodeNone,
576+
"universal projector database is invalid");
577+
578+
infrared_brute_force_reset(test->brutedb);
579+
}
580+
581+
MU_TEST(infrared_test_tv_database) {
582+
infrared_brute_force_set_db_filename(test->brutedb, EXT_PATH("infrared/assets/tv.ir"));
583+
uint32_t i = 0;
584+
infrared_brute_force_add_record(test->brutedb, i++, "Power");
585+
infrared_brute_force_add_record(test->brutedb, i++, "Mute");
586+
infrared_brute_force_add_record(test->brutedb, i++, "Vol_up");
587+
infrared_brute_force_add_record(test->brutedb, i++, "Ch_next");
588+
infrared_brute_force_add_record(test->brutedb, i++, "Vol_dn");
589+
infrared_brute_force_add_record(test->brutedb, i++, "Ch_prev");
590+
591+
mu_assert(
592+
infrared_brute_force_calculate_messages(test->brutedb) == InfraredErrorCodeNone,
593+
"universal tv database is invalid");
594+
595+
infrared_brute_force_reset(test->brutedb);
596+
}
597+
526598
MU_TEST_SUITE(infrared_test) {
527599
MU_SUITE_CONFIGURE(&infrared_test_alloc, &infrared_test_free);
528600

@@ -543,6 +615,10 @@ MU_TEST_SUITE(infrared_test) {
543615
MU_RUN_TEST(infrared_test_decoder_pioneer);
544616
MU_RUN_TEST(infrared_test_decoder_mixed);
545617
MU_RUN_TEST(infrared_test_encoder_decoder_all);
618+
MU_RUN_TEST(infrared_test_ac_database);
619+
MU_RUN_TEST(infrared_test_audio_database);
620+
MU_RUN_TEST(infrared_test_projector_database);
621+
MU_RUN_TEST(infrared_test_tv_database);
546622
}
547623

548624
int run_minunit_test_infrared(void) {

applications/main/infrared/application.fam

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ App(
99
order=40,
1010
sources=["*.c", "!infrared_cli.c"],
1111
resources="resources",
12-
fap_libs=["assets"],
12+
fap_libs=["assets", "infrared"],
1313
fap_icon="icon.png",
1414
fap_category="Infrared",
1515
)
@@ -20,9 +20,6 @@ App(
2020
apptype=FlipperAppType.PLUGIN,
2121
entry_point="cli_ir_ep",
2222
requires=["cli"],
23-
sources=[
24-
"infrared_cli.c",
25-
"infrared_brute_force.c",
26-
"infrared_signal.c",
27-
],
23+
sources=["infrared_cli.c"],
24+
fap_libs=["infrared"],
2825
)

applications/main/infrared/infrared_app.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,7 @@
33
* @brief Infrared application - start here.
44
*
55
* @see infrared_app_i.h for the main application data structure and functions.
6-
* @see infrared_signal.h for the infrared signal library - loading, storing and transmitting signals.
7-
* @see infrared_remote.hl for the infrared remote library - loading, storing and manipulating remotes.
8-
* @see infrared_brute_force.h for the infrared brute force - loading and transmitting multiple signals.
6+
* @see infrared_remote.h for the infrared remote library - loading, storing and manipulating remotes
97
*/
108
#pragma once
119

applications/main/infrared/infrared_app_i.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131

3232
#include "infrared_app.h"
3333
#include "infrared_remote.h"
34-
#include "infrared_brute_force.h"
34+
#include <lib/infrared/signal/infrared_brute_force.h>
3535
#include "infrared_custom_event.h"
3636

3737
#include "scenes/infrared_scene.h"

applications/main/infrared/infrared_cli.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88
#include <toolbox/pipe.h>
99
#include <m-dict.h>
1010

11-
#include "infrared_signal.h"
12-
#include "infrared_brute_force.h"
11+
#include <lib/infrared/signal/infrared_signal.h>
12+
#include <lib/infrared/signal/infrared_brute_force.h>
1313

1414
#define INFRARED_CLI_BUF_SIZE (10U)
1515
#define INFRARED_CLI_FILE_NAME_SIZE (256U)

applications/main/infrared/infrared_remote.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
*/
1212
#pragma once
1313

14-
#include "infrared_signal.h"
14+
#include <lib/infrared/signal/infrared_signal.h>
1515

1616
/**
1717
* @brief InfraredRemote opaque type declaration.

applications/main/nfc/helpers/protocol_support/felica/felica.c

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -102,19 +102,21 @@ static void nfc_scene_read_success_on_enter_felica(NfcApp* instance) {
102102
temp_str, "\e#%s\n", nfc_device_get_name(device, NfcDeviceNameTypeFull));
103103
nfc_render_felica_info(data, NfcProtocolFormatTypeShort, temp_str);
104104
} else {
105-
bool all_unlocked = data->blocks_read == data->blocks_total;
106-
furi_string_cat_printf(
107-
temp_str,
108-
"\e#%s\n",
109-
all_unlocked ? "All Blocks Are Unlocked" : "Some Blocks Are Locked");
110-
nfc_render_felica_idm(data, NfcProtocolFormatTypeShort, temp_str);
111-
uint8_t* ck_data = instance->felica_auth->card_key.data;
112-
furi_string_cat_printf(temp_str, "Key:");
113-
for(uint8_t i = 0; i < 7; i++) {
114-
furi_string_cat_printf(temp_str, " %02X", ck_data[i]);
115-
if(i == 6) furi_string_cat_printf(temp_str, "...");
105+
if(data->workflow_type == FelicaLite) {
106+
bool all_unlocked = data->blocks_read == data->blocks_total;
107+
furi_string_cat_printf(
108+
temp_str,
109+
"\e#%s\n",
110+
all_unlocked ? "All Blocks Are Unlocked" : "Some Blocks Are Locked");
111+
nfc_render_felica_idm(data, NfcProtocolFormatTypeShort, temp_str);
112+
uint8_t* ck_data = instance->felica_auth->card_key.data;
113+
furi_string_cat_printf(temp_str, "Key:");
114+
for(uint8_t i = 0; i < 7; i++) {
115+
furi_string_cat_printf(temp_str, " %02X", ck_data[i]);
116+
if(i == 6) furi_string_cat_printf(temp_str, "...");
117+
}
118+
nfc_render_felica_blocks_count(data, temp_str, false);
116119
}
117-
nfc_render_felica_blocks_count(data, temp_str, false);
118120
}
119121
felica_auth_reset(instance->felica_auth);
120122

applications/main/nfc/helpers/protocol_support/felica/felica_render.c

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,10 @@ void nfc_render_felica_blocks_count(
66
bool render_auth_notification) {
77
if(data->workflow_type == FelicaLite) {
88
furi_string_cat_printf(str, "Blocks: %u\n", data->blocks_total);
9-
109
furi_string_cat_printf(str, "\nBlocks Read: %u/%u", data->blocks_read, data->blocks_total);
1110
if(render_auth_notification && data->blocks_read != data->blocks_total) {
1211
furi_string_cat_printf(str, "\nAuth-protected blocks!");
1312
}
14-
} else if(data->workflow_type == FelicaStandard) {
15-
furi_string_cat_printf(
16-
str, "Public blocks Read: %lu", simple_array_get_count(data->public_blocks));
1713
}
1814
}
1915

@@ -54,11 +50,7 @@ void nfc_render_felica_info(
5450
}
5551

5652
furi_string_cat_printf(str, "\n");
57-
furi_string_cat_printf(
58-
str,
59-
"Services found: %lu \nAreas found: %lu\n",
60-
simple_array_get_count(data->services),
61-
simple_array_get_count(data->areas));
53+
furi_string_cat_printf(str, "Systems found: %lu \n", simple_array_get_count(data->systems));
6254

6355
nfc_render_felica_blocks_count(data, str, true);
6456
}
@@ -136,9 +128,9 @@ void nfc_more_info_render_felica_lite_dump(const FelicaData* data, FuriString* s
136128
nfc_render_felica_block(&data->data.fs.crc_check, str, "CRC_CHCK", 15, 17);
137129
}
138130

139-
void nfc_more_info_render_felica_dir(const FelicaData* data, FuriString* str) {
140-
const size_t area_count = simple_array_get_count(data->areas);
141-
const size_t service_count = simple_array_get_count(data->services);
131+
void nfc_more_info_render_felica_dir(const FelicaSystem* system, FuriString* str) {
132+
const size_t area_count = simple_array_get_count(system->areas);
133+
const size_t service_count = simple_array_get_count(system->services);
142134

143135
furi_string_cat_printf(str, "\e#Directory Tree:\n");
144136

@@ -150,11 +142,12 @@ void nfc_more_info_render_felica_dir(const FelicaData* data, FuriString* str) {
150142
furi_string_cat_printf(
151143
str, "::: ... are readable services\n||| ... are locked services\n");
152144
}
153-
felica_write_directory_tree(data, str);
145+
felica_write_directory_tree(system, str);
154146
}
155147

156148
void nfc_more_info_render_felica_blocks(
157149
const FelicaData* data,
150+
const FelicaSystem* system,
158151
FuriString* str,
159152
const uint16_t service_code_key) {
160153
furi_string_cat_printf(str, "\n");
@@ -190,9 +183,9 @@ void nfc_more_info_render_felica_blocks(
190183
nfc_render_felica_block(&data->data.fs.crc_check, str, "CRC_CHCK", 15, 17);
191184

192185
} else if(data->workflow_type == FelicaStandard) {
193-
uint32_t public_blocks_count = simple_array_get_count(data->public_blocks);
186+
uint32_t public_blocks_count = simple_array_get_count(system->public_blocks);
194187
for(size_t i = 0; i < public_blocks_count; i++) {
195-
FelicaPublicBlock* public_block = simple_array_get(data->public_blocks, i);
188+
FelicaPublicBlock* public_block = simple_array_get(system->public_blocks, i);
196189
if(public_block->service_code != service_code_key) {
197190
continue; // Skip blocks not matching the requested service code
198191
}

0 commit comments

Comments
 (0)