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

subghz_protocol_common.h « protocols « subghz « lib - github.com/ClusterM/flipperzero-firmware.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 4abae60b108ba68100a63d6bac4445eba011a015 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
#pragma once

#include <m-string.h>
#include <furi_hal.h>
#include <stdint.h>
#include <flipper_format/flipper_format.h>

#define bit_read(value, bit) (((value) >> (bit)) & 0x01)
#define bit_set(value, bit) ((value) |= (1UL << (bit)))
#define bit_clear(value, bit) ((value) &= ~(1UL << (bit)))
#define bit_write(value, bit, bitvalue) (bitvalue ? bit_set(value, bit) : bit_clear(value, bit))

#define SUBGHZ_TX_PIN_HIGH()
#define SUBGHZ_TX_PIN_LOW()
#define DURATION_DIFF(x, y) ((x < y) ? (y - x) : (x - y))

#define SUBGHZ_APP_FOLDER "/any/subghz"
#define SUBGHZ_RAW_FOLDER "/ext/subghz"
#define SUBGHZ_APP_EXTENSION ".sub"
#define SUBGHZ_ENCODER_UPLOAD_MAX_SIZE 2048

#define SUBGHZ_PARSER_TAG "SubGhzParser"
#define SUBGHZ_KEY_FILE_VERSION 1
#define SUBGHZ_KEY_FILE_TYPE "Flipper SubGhz Key File"

#define SUBGHZ_RAW_FILE_VERSION 1
#define SUBGHZ_RAW_FILE_TYPE "Flipper SubGhz RAW File"

typedef enum {
    SubGhzProtocolCommonTypeUnknown,
    SubGhzProtocolCommonTypeStatic,
    SubGhzProtocolCommonTypeDynamic,
    SubGhzProtocolCommonTypeRAW,
} SubGhzProtocolCommonType;

typedef struct SubGhzProtocolCommon SubGhzProtocolCommon;
typedef struct SubGhzProtocolCommonEncoder SubGhzProtocolCommonEncoder;
typedef struct SubGhzProtocolCommonLoad SubGhzProtocolCommonLoad;

typedef void (*SubGhzProtocolCommonCallback)(SubGhzProtocolCommon* parser, void* context);

typedef void (*SubGhzProtocolCommonToStr)(SubGhzProtocolCommon* instance, string_t output);

//Get string to save
typedef bool (
    *SubGhzProtocolCommonSaveFile)(SubGhzProtocolCommon* instance, FlipperFormat* flipper_format);

//Load protocol from file
typedef bool (*SubGhzProtocolCommonLoadFromFile)(
    FlipperFormat* flipper_format,
    SubGhzProtocolCommon* instance,
    const char* file_path);
//Load protocol
typedef void (*SubGhzProtocolCommonLoadFromRAW)(SubGhzProtocolCommon* instance, void* context);
//Get upload encoder protocol
typedef bool (*SubGhzProtocolCommonEncoderGetUpLoad)(
    SubGhzProtocolCommon* instance,
    SubGhzProtocolCommonEncoder* encoder);

typedef LevelDuration (*SubGhzProtocolCommonEncoderCallback)(void* context);
typedef void (*SubGhzProtocolCommonEncoderCallbackEnd)(void* context);

struct SubGhzProtocolCommon {
    const char* name;
    uint16_t te_long;
    uint16_t te_short;
    uint16_t te_delta;
    uint8_t code_count_bit;
    uint8_t code_last_count_bit;
    uint64_t code_found;
    uint64_t code_last_found;
    uint8_t code_min_count_bit_for_found;
    uint8_t btn;
    uint8_t header_count;
    SubGhzProtocolCommonType type_protocol;
    uint32_t te_last;
    uint32_t serial;
    uint32_t parser_step;
    uint16_t cnt;

    /* Standard Callback for on rx complete event */
    SubGhzProtocolCommonCallback callback;
    void* context;

    /* Dump To String */
    SubGhzProtocolCommonToStr to_string;
    /* Get string to save */
    SubGhzProtocolCommonSaveFile to_save_file;
    /* Load protocol from file */
    SubGhzProtocolCommonLoadFromFile to_load_protocol_from_file;
    /* Load protocol from RAW data */
    SubGhzProtocolCommonLoadFromRAW to_load_protocol;
    /* Get upload encoder protocol */
    SubGhzProtocolCommonEncoderGetUpLoad get_upload_protocol;
};

struct SubGhzProtocolCommonEncoder {
    bool start;
    size_t repeat;
    size_t front;
    size_t size_upload;
    LevelDuration* upload;

    SubGhzProtocolCommonEncoderCallback callback;
    SubGhzProtocolCommonEncoderCallbackEnd callback_end;
    void* context;
    void* context_end;
};

struct SubGhzProtocolCommonLoad {
    uint64_t code_found;
    uint8_t code_count_bit;
    uint32_t param1;
    uint32_t param2;
    uint32_t param3;
};

/** Allocate SubGhzProtocolCommonEncoder
 * 
 * @return SubGhzProtocolCommonEncoder* 
 */
SubGhzProtocolCommonEncoder* subghz_protocol_encoder_common_alloc();

/** Free SubGhzProtocolCommonEncoder
 * 
 * @param instance 
 */
void subghz_protocol_encoder_common_free(SubGhzProtocolCommonEncoder* instance);

void subghz_protocol_encoder_common_set_callback(
    SubGhzProtocolCommonEncoder* instance,
    SubGhzProtocolCommonEncoderCallback callback,
    void* context);

void subghz_protocol_encoder_common_set_callback_end(
    SubGhzProtocolCommonEncoder* instance,
    SubGhzProtocolCommonEncoderCallbackEnd callback_end,
    void* context_end);

/** Get count repeat left
 * 
 * @param instance - SubGhzProtocolCommonEncoder instance
 * @return count repeat left
 */
size_t subghz_encoder_common_get_repeat_left(SubGhzProtocolCommonEncoder* instance);

/** Get LevelDuration this encoder step
 * 
 * @param context - SubGhzProtocolCommonEncoder context
 * @return LevelDuration this step
 */
LevelDuration subghz_protocol_encoder_common_yield(void* context);

/** Add data bit to code_found
 * 
 * @param common - SubGhzProtocolCommon common
 * @param bit - add bit
 */
void subghz_protocol_common_add_bit(SubGhzProtocolCommon* common, uint8_t bit);

/** Checking that the duration is included in the interval
 * 
 * @param common - SubGhzProtocolCommon common
 * @param duration duration reference
 * @param duration_check duration checked
 * @return true on success
 */
bool subghz_protocol_common_check_interval(
    SubGhzProtocolCommon* common,
    uint32_t duration,
    uint16_t duration_check);

/** Bit-by-bit data mirroring
 * 
 * @param key - data to mirror
 * @param count_bit number of data bits
 * @return mirrored data
 */
uint64_t subghz_protocol_common_reverse_key(uint64_t key, uint8_t count_bit);

/** Callback protocol
 * 
 * @param instance - SubGhzProtocolCommon* instance
 * @param callback
 * @param context
 */
void subghz_protocol_common_set_callback(
    SubGhzProtocolCommon* instance,
    SubGhzProtocolCommonCallback callback,
    void* context);

/** outputting information from the parser
 * 
 * @param instance - SubGhzProtocolCommon* instance
 * @param output   - output string
 */
void subghz_protocol_common_to_str(SubGhzProtocolCommon* instance, string_t output);

/** Converting a string to a HEX array
 * 
 * @param str - string data
 * @param buff - uint8_t* buff
 * @param len - size buff
 * @return bool
 */
bool subghz_protocol_common_read_hex(string_t str, uint8_t* buff, uint16_t len);

/** Adding data to a file
 * 
 * @param instance  - SubGhzProtocolCommon instance
 * @param flipper_format - FlipperFormat 
 * @return bool
 */
bool subghz_protocol_common_to_save_file(
    SubGhzProtocolCommon* instance,
    FlipperFormat* flipper_format);

/** Loading data to a file
 * 
 * @param instance  - SubGhzProtocolCommon instance
 * @param flipper_format - FlipperFormat 
 * @return bool
 */
bool subghz_protocol_common_to_load_protocol_from_file(
    SubGhzProtocolCommon* instance,
    FlipperFormat* flipper_format);