2
2
3
3
#include <stdlib.h>
4
4
#include <m-dict.h>
5
+ #include <m-array.h>
5
6
#include <flipper_format/flipper_format.h>
6
7
7
8
#include "infrared_signal.h"
8
9
10
+ ARRAY_DEF (SignalPositionArray , size_t , M_DEFAULT_OPLIST );
11
+
9
12
typedef struct {
10
- uint32_t index ;
11
- uint32_t count ;
13
+ size_t index ;
14
+ SignalPositionArray_t signals ;
12
15
} InfraredBruteForceRecord ;
13
16
17
+ static inline void ir_bf_record_init (InfraredBruteForceRecord * record ) {
18
+ record -> index = 0 ;
19
+ SignalPositionArray_init (record -> signals );
20
+ }
21
+ #define IR_BF_RECORD_INIT (r ) (ir_bf_record_init(&(r)))
22
+
23
+ static inline void
24
+ ir_bf_record_init_set (InfraredBruteForceRecord * dest , const InfraredBruteForceRecord * src ) {
25
+ dest -> index = src -> index ;
26
+ SignalPositionArray_init_set (dest -> signals , src -> signals );
27
+ }
28
+ #define IR_BF_RECORD_INIT_SET (d , s ) (ir_bf_record_init_set(&(d), &(s)))
29
+
30
+ static inline void
31
+ ir_bf_record_set (InfraredBruteForceRecord * dest , const InfraredBruteForceRecord * src ) {
32
+ dest -> index = src -> index ;
33
+ SignalPositionArray_set (dest -> signals , src -> signals );
34
+ }
35
+ #define IR_BF_RECORD_SET (d , s ) (ir_bf_record_set(&(d), &(s)))
36
+
37
+ static inline void ir_bf_record_clear (InfraredBruteForceRecord * record ) {
38
+ SignalPositionArray_clear (record -> signals );
39
+ }
40
+ #define IR_BF_RECORD_CLEAR (r ) (ir_bf_record_clear(&(r)))
41
+
42
+ #define IR_BF_RECORD_OPLIST \
43
+ (INIT(IR_BF_RECORD_INIT), \
44
+ INIT_SET(IR_BF_RECORD_INIT_SET), \
45
+ SET(IR_BF_RECORD_SET), \
46
+ CLEAR(IR_BF_RECORD_CLEAR))
47
+
14
48
DICT_DEF2 (
15
49
InfraredBruteForceRecordDict ,
16
50
FuriString * ,
17
51
FURI_STRING_OPLIST ,
18
52
InfraredBruteForceRecord ,
19
- M_POD_OPLIST );
53
+ IR_BF_RECORD_OPLIST );
20
54
21
55
struct InfraredBruteForce {
22
56
FlipperFormat * ff ;
23
57
const char * db_filename ;
24
58
FuriString * current_record_name ;
59
+ InfraredBruteForceRecord current_record ;
25
60
InfraredSignal * current_signal ;
26
61
InfraredBruteForceRecordDict_t records ;
27
62
bool is_started ;
@@ -39,18 +74,21 @@ InfraredBruteForce* infrared_brute_force_alloc(void) {
39
74
}
40
75
41
76
void infrared_brute_force_free (InfraredBruteForce * brute_force ) {
77
+ furi_check (brute_force );
42
78
furi_assert (!brute_force -> is_started );
43
79
InfraredBruteForceRecordDict_clear (brute_force -> records );
44
80
furi_string_free (brute_force -> current_record_name );
45
81
free (brute_force );
46
82
}
47
83
48
84
void infrared_brute_force_set_db_filename (InfraredBruteForce * brute_force , const char * db_filename ) {
85
+ furi_check (brute_force );
49
86
furi_assert (!brute_force -> is_started );
50
87
brute_force -> db_filename = db_filename ;
51
88
}
52
89
53
90
InfraredErrorCode infrared_brute_force_calculate_messages (InfraredBruteForce * brute_force ) {
91
+ furi_check (brute_force );
54
92
furi_assert (!brute_force -> is_started );
55
93
furi_assert (brute_force -> db_filename );
56
94
InfraredErrorCode error = InfraredErrorCodeNone ;
@@ -66,19 +104,19 @@ InfraredErrorCode infrared_brute_force_calculate_messages(InfraredBruteForce* br
66
104
break ;
67
105
}
68
106
69
- bool signals_valid = false;
107
+ size_t signal_start = flipper_format_tell (ff );
108
+ bool signal_valid = false;
70
109
while (infrared_signal_read_name (ff , signal_name ) == InfraredErrorCodeNone ) {
71
110
error = infrared_signal_read_body (signal , ff );
72
- signals_valid = (!INFRARED_ERROR_PRESENT (error )) && infrared_signal_is_valid (signal );
73
- if (!signals_valid ) break ;
111
+ signal_valid = (!INFRARED_ERROR_PRESENT (error )) && infrared_signal_is_valid (signal );
112
+ if (!signal_valid ) break ;
74
113
75
114
InfraredBruteForceRecord * record =
76
115
InfraredBruteForceRecordDict_get (brute_force -> records , signal_name );
77
- if (record ) { //-V547
78
- ++ (record -> count );
79
- }
116
+ furi_assert (record );
117
+ SignalPositionArray_push_back (record -> signals , signal_start );
80
118
}
81
- if (!signals_valid ) break ;
119
+ if (!signal_valid ) break ;
82
120
} while (false);
83
121
84
122
infrared_signal_free (signal );
@@ -93,6 +131,7 @@ bool infrared_brute_force_start(
93
131
InfraredBruteForce * brute_force ,
94
132
uint32_t index ,
95
133
uint32_t * record_count ) {
134
+ furi_check (brute_force );
96
135
furi_assert (!brute_force -> is_started );
97
136
bool success = false;
98
137
* record_count = 0 ;
@@ -103,9 +142,10 @@ bool infrared_brute_force_start(
103
142
InfraredBruteForceRecordDict_next (it )) {
104
143
const InfraredBruteForceRecordDict_itref_t * record = InfraredBruteForceRecordDict_cref (it );
105
144
if (record -> value .index == index ) {
106
- * record_count = record -> value .count ;
145
+ * record_count = SignalPositionArray_size ( record -> value .signals ) ;
107
146
if (* record_count ) {
108
147
furi_string_set (brute_force -> current_record_name , record -> key );
148
+ brute_force -> current_record = record -> value ;
109
149
}
110
150
break ;
111
151
}
@@ -124,10 +164,12 @@ bool infrared_brute_force_start(
124
164
}
125
165
126
166
bool infrared_brute_force_is_started (const InfraredBruteForce * brute_force ) {
167
+ furi_check (brute_force );
127
168
return brute_force -> is_started ;
128
169
}
129
170
130
171
void infrared_brute_force_stop (InfraredBruteForce * brute_force ) {
172
+ furi_check (brute_force );
131
173
furi_assert (brute_force -> is_started );
132
174
furi_string_reset (brute_force -> current_record_name );
133
175
infrared_signal_free (brute_force -> current_signal );
@@ -138,25 +180,32 @@ void infrared_brute_force_stop(InfraredBruteForce* brute_force) {
138
180
furi_record_close (RECORD_STORAGE );
139
181
}
140
182
141
- bool infrared_brute_force_send_next (InfraredBruteForce * brute_force ) {
183
+ bool infrared_brute_force_send (InfraredBruteForce * brute_force , uint32_t signal_index ) {
184
+ furi_check (brute_force );
142
185
furi_assert (brute_force -> is_started );
143
186
144
- const bool success = infrared_signal_search_by_name_and_read (
145
- brute_force -> current_signal ,
146
- brute_force -> ff ,
147
- furi_string_get_cstr (brute_force -> current_record_name )) ==
148
- InfraredErrorCodeNone ;
149
- if (success ) {
150
- infrared_signal_transmit (brute_force -> current_signal );
151
- }
152
- return success ;
187
+ if (signal_index >= SignalPositionArray_size (brute_force -> current_record .signals )) return false;
188
+
189
+ size_t signal_start =
190
+ * SignalPositionArray_cget (brute_force -> current_record .signals , signal_index );
191
+ if (!flipper_format_seek (brute_force -> ff , signal_start , FlipperFormatOffsetFromStart ))
192
+ return false;
193
+
194
+ if (INFRARED_ERROR_PRESENT (
195
+ infrared_signal_read_body (brute_force -> current_signal , brute_force -> ff )))
196
+ return false;
197
+
198
+ infrared_signal_transmit (brute_force -> current_signal );
199
+ return true;
153
200
}
154
201
155
202
void infrared_brute_force_add_record (
156
203
InfraredBruteForce * brute_force ,
157
204
uint32_t index ,
158
205
const char * name ) {
159
- InfraredBruteForceRecord value = {.index = index , .count = 0 };
206
+ InfraredBruteForceRecord value ;
207
+ ir_bf_record_init (& value );
208
+ value .index = index ;
160
209
FuriString * key ;
161
210
key = furi_string_alloc_set (name );
162
211
InfraredBruteForceRecordDict_set_at (brute_force -> records , key , value );
0 commit comments