subghz_protocol_common.h 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. #pragma once
  2. #include <m-string.h>
  3. #include <furi-hal.h>
  4. #include <stdint.h>
  5. #include <lib/flipper_file/flipper_file.h>
  6. #define bit_read(value, bit) (((value) >> (bit)) & 0x01)
  7. #define bit_set(value, bit) ((value) |= (1UL << (bit)))
  8. #define bit_clear(value, bit) ((value) &= ~(1UL << (bit)))
  9. #define bit_write(value, bit, bitvalue) (bitvalue ? bit_set(value, bit) : bit_clear(value, bit))
  10. #define SUBGHZ_TX_PIN_HIGH()
  11. #define SUBGHZ_TX_PIN_LOW()
  12. #define DURATION_DIFF(x, y) ((x < y) ? (y - x) : (x - y))
  13. #define SUBGHZ_APP_FOLDER "/any/subghz"
  14. #define SUBGHZ_APP_PATH_FOLDER "/any/subghz/saved"
  15. #define SUBGHZ_RAW_FOLDER "/ext/subghz"
  16. #define SUBGHZ_RAW_PATH_FOLDER "/ext/subghz/saved"
  17. #define SUBGHZ_APP_EXTENSION ".sub"
  18. #define SUBGHZ_ENCODER_UPLOAD_MAX_SIZE 2048
  19. #define SUBGHZ_KEY_TAG "SubGhzParser"
  20. #define SUBGHZ_KEY_FILE_VERSION 1
  21. #define SUBGHZ_KEY_FILE_TYPE "Flipper SubGhz Key File"
  22. #define SUBGHZ_RAW_TAG "SubGhzRAW"
  23. #define SUBGHZ_RAW_FILE_VERSION 1
  24. #define SUBGHZ_RAW_FILE_TYPE "Flipper SubGhz RAW File"
  25. typedef enum {
  26. SubGhzProtocolCommonTypeUnknown,
  27. SubGhzProtocolCommonTypeStatic,
  28. SubGhzProtocolCommonTypeDynamic,
  29. SubGhzProtocolCommonTypeRAW,
  30. } SubGhzProtocolCommonType;
  31. typedef struct SubGhzProtocolCommon SubGhzProtocolCommon;
  32. typedef struct SubGhzProtocolCommonEncoder SubGhzProtocolCommonEncoder;
  33. typedef struct SubGhzProtocolCommonLoad SubGhzProtocolCommonLoad;
  34. typedef void (*SubGhzProtocolCommonCallback)(SubGhzProtocolCommon* parser, void* context);
  35. typedef void (*SubGhzProtocolCommonToStr)(SubGhzProtocolCommon* instance, string_t output);
  36. //Get string to save
  37. typedef bool (
  38. *SubGhzProtocolCommonSaveFile)(SubGhzProtocolCommon* instance, FlipperFile* flipper_file);
  39. //Load protocol from file
  40. typedef bool (*SubGhzProtocolCommonLoadFromFile)(
  41. FlipperFile* flipper_file,
  42. SubGhzProtocolCommon* instance,
  43. const char* file_path);
  44. //Load protocol
  45. typedef void (*SubGhzProtocolCommonLoadFromRAW)(SubGhzProtocolCommon* instance, void* context);
  46. //Get upload encoder protocol
  47. typedef bool (*SubGhzProtocolCommonEncoderGetUpLoad)(
  48. SubGhzProtocolCommon* instance,
  49. SubGhzProtocolCommonEncoder* encoder);
  50. typedef LevelDuration (*SubGhzProtocolCommonEncoderCallback)(void* context);
  51. typedef void (*SubGhzProtocolCommonEncoderCallbackEnd)(void* context);
  52. struct SubGhzProtocolCommon {
  53. const char* name;
  54. uint16_t te_long;
  55. uint16_t te_short;
  56. uint16_t te_delta;
  57. uint8_t code_count_bit;
  58. uint8_t code_last_count_bit;
  59. uint64_t code_found;
  60. uint64_t code_last_found;
  61. uint8_t code_min_count_bit_for_found;
  62. uint8_t btn;
  63. uint8_t header_count;
  64. SubGhzProtocolCommonType type_protocol;
  65. uint32_t te_last;
  66. uint32_t serial;
  67. uint32_t parser_step;
  68. uint16_t cnt;
  69. /* Standard Callback for on rx complete event */
  70. SubGhzProtocolCommonCallback callback;
  71. void* context;
  72. /* Dump To String */
  73. SubGhzProtocolCommonToStr to_string;
  74. /* Get string to save */
  75. SubGhzProtocolCommonSaveFile to_save_file;
  76. /* Load protocol from file */
  77. SubGhzProtocolCommonLoadFromFile to_load_protocol_from_file;
  78. /* Load protocol from RAW data */
  79. SubGhzProtocolCommonLoadFromRAW to_load_protocol;
  80. /* Get upload encoder protocol */
  81. SubGhzProtocolCommonEncoderGetUpLoad get_upload_protocol;
  82. };
  83. struct SubGhzProtocolCommonEncoder {
  84. bool start;
  85. size_t repeat;
  86. size_t front;
  87. size_t size_upload;
  88. LevelDuration* upload;
  89. SubGhzProtocolCommonEncoderCallback callback;
  90. SubGhzProtocolCommonEncoderCallbackEnd callback_end;
  91. void* context;
  92. void* context_end;
  93. };
  94. struct SubGhzProtocolCommonLoad {
  95. uint64_t code_found;
  96. uint8_t code_count_bit;
  97. uint32_t param1;
  98. uint32_t param2;
  99. uint32_t param3;
  100. };
  101. /** Allocate SubGhzProtocolCommonEncoder
  102. *
  103. * @return SubGhzProtocolCommonEncoder*
  104. */
  105. SubGhzProtocolCommonEncoder* subghz_protocol_encoder_common_alloc();
  106. /** Free SubGhzProtocolCommonEncoder
  107. *
  108. * @param instance
  109. */
  110. void subghz_protocol_encoder_common_free(SubGhzProtocolCommonEncoder* instance);
  111. void subghz_protocol_encoder_common_set_callback(
  112. SubGhzProtocolCommonEncoder* instance,
  113. SubGhzProtocolCommonEncoderCallback callback,
  114. void* context);
  115. void subghz_protocol_encoder_common_set_callback_end(
  116. SubGhzProtocolCommonEncoder* instance,
  117. SubGhzProtocolCommonEncoderCallbackEnd callback_end,
  118. void* context_end);
  119. /** Get count repeat left
  120. *
  121. * @param instance - SubGhzProtocolCommonEncoder instance
  122. * @return count repeat left
  123. */
  124. size_t subghz_encoder_common_get_repeat_left(SubGhzProtocolCommonEncoder* instance);
  125. /** Get LevelDuration this encoder step
  126. *
  127. * @param context - SubGhzProtocolCommonEncoder context
  128. * @return LevelDuration this step
  129. */
  130. LevelDuration subghz_protocol_encoder_common_yield(void* context);
  131. /** Add data bit to code_found
  132. *
  133. * @param common - SubGhzProtocolCommon common
  134. * @param bit - add bit
  135. */
  136. void subghz_protocol_common_add_bit(SubGhzProtocolCommon* common, uint8_t bit);
  137. /** Checking that the duration is included in the interval
  138. *
  139. * @param common - SubGhzProtocolCommon common
  140. * @param duration duration reference
  141. * @param duration_check duration checked
  142. * @return true on success
  143. */
  144. bool subghz_protocol_common_check_interval(
  145. SubGhzProtocolCommon* common,
  146. uint32_t duration,
  147. uint16_t duration_check);
  148. /** Bit-by-bit data mirroring
  149. *
  150. * @param key - data to mirror
  151. * @param count_bit number of data bits
  152. * @return mirrored data
  153. */
  154. uint64_t subghz_protocol_common_reverse_key(uint64_t key, uint8_t count_bit);
  155. /** Callback protocol
  156. *
  157. * @param instance - SubGhzProtocolCommon* instance
  158. * @param callback
  159. * @param context
  160. */
  161. void subghz_protocol_common_set_callback(
  162. SubGhzProtocolCommon* instance,
  163. SubGhzProtocolCommonCallback callback,
  164. void* context);
  165. /** outputting information from the parser
  166. *
  167. * @param instance - SubGhzProtocolCommon* instance
  168. * @param output - output string
  169. */
  170. void subghz_protocol_common_to_str(SubGhzProtocolCommon* instance, string_t output);
  171. /** Converting a string to a HEX array
  172. *
  173. * @param str - string data
  174. * @param buff - uint8_t* buff
  175. * @param len - size buff
  176. * @return bool
  177. */
  178. bool subghz_protocol_common_read_hex(string_t str, uint8_t* buff, uint16_t len);
  179. /** Adding data to a file
  180. *
  181. * @param instance - SubGhzProtocolCommon instance
  182. * @param flipper_file - FlipperFile
  183. * @return bool
  184. */
  185. bool subghz_protocol_common_to_save_file(SubGhzProtocolCommon* instance, FlipperFile* flipper_file);
  186. /** Loading data to a file
  187. *
  188. * @param instance - SubGhzProtocolCommon instance
  189. * @param flipper_file - FlipperFile
  190. * @return bool
  191. */
  192. bool subghz_protocol_common_to_load_protocol_from_file(
  193. SubGhzProtocolCommon* instance,
  194. FlipperFile* flipper_file);