subghz_test.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405
  1. #include <furi.h>
  2. #include <furi_hal.h>
  3. #include "../minunit.h"
  4. #include <lib/subghz/receiver.h>
  5. #include <lib/subghz/transmitter.h>
  6. #include <lib/subghz/subghz_keystore.h>
  7. #include <lib/subghz/subghz_file_encoder_worker.h>
  8. #include <lib/subghz/protocols/registry.h>
  9. #include <flipper_format/flipper_format_i.h>
  10. #define TAG "SubGhz TEST"
  11. #define KEYSTORE_DIR_NAME "/ext/subghz/assets/keeloq_mfcodes"
  12. #define CAME_ATOMO_DIR_NAME "/ext/subghz/assets/came_atomo"
  13. #define NICE_FLOR_S_DIR_NAME "/ext/subghz/assets/nice_flor_s"
  14. #define TEST_RANDOM_DIR_NAME "/ext/unit_tests/subghz/test_random_raw.sub"
  15. #define TEST_RANDOM_COUNT_PARSE 59
  16. #define TEST_TIMEOUT 10000
  17. static SubGhzEnvironment* environment_handler;
  18. static SubGhzReceiver* receiver_handler;
  19. //static SubGhzTransmitter* transmitter_handler;
  20. static SubGhzFileEncoderWorker* file_worker_encoder_handler;
  21. static uint16_t subghz_test_decoder_count = 0;
  22. static void subghz_test_rx_callback(
  23. SubGhzReceiver* receiver,
  24. SubGhzProtocolDecoderBase* decoder_base,
  25. void* context) {
  26. string_t text;
  27. string_init(text);
  28. subghz_protocol_decoder_base_get_string(decoder_base, text);
  29. subghz_receiver_reset(receiver_handler);
  30. FURI_LOG_I(TAG, "\r\n%s", string_get_cstr(text));
  31. string_clear(text);
  32. subghz_test_decoder_count++;
  33. }
  34. static void subghz_test_init(void) {
  35. environment_handler = subghz_environment_alloc();
  36. subghz_environment_set_came_atomo_rainbow_table_file_name(
  37. environment_handler, CAME_ATOMO_DIR_NAME);
  38. subghz_environment_set_nice_flor_s_rainbow_table_file_name(
  39. environment_handler, NICE_FLOR_S_DIR_NAME);
  40. receiver_handler = subghz_receiver_alloc_init(environment_handler);
  41. subghz_receiver_set_filter(receiver_handler, SubGhzProtocolFlag_Decodable);
  42. subghz_receiver_set_rx_callback(receiver_handler, subghz_test_rx_callback, NULL);
  43. }
  44. static void subghz_test_deinit(void) {
  45. subghz_receiver_free(receiver_handler);
  46. subghz_environment_free(environment_handler);
  47. }
  48. static bool subghz_decode_test(const char* path, const char* name_decoder) {
  49. subghz_test_decoder_count = 0;
  50. uint32_t test_start = furi_hal_get_tick();
  51. SubGhzProtocolDecoderBase* decoder =
  52. subghz_receiver_search_decoder_base_by_name(receiver_handler, name_decoder);
  53. if(decoder) {
  54. file_worker_encoder_handler = subghz_file_encoder_worker_alloc();
  55. if(subghz_file_encoder_worker_start(file_worker_encoder_handler, path)) {
  56. //the worker needs a file in order to open and read part of the file
  57. osDelay(100);
  58. LevelDuration level_duration;
  59. while(furi_hal_get_tick() - test_start < TEST_TIMEOUT) {
  60. furi_hal_delay_us(
  61. 500); //you need to have time to read from the file from the SD card
  62. level_duration =
  63. subghz_file_encoder_worker_get_level_duration(file_worker_encoder_handler);
  64. if(!level_duration_is_reset(level_duration)) {
  65. bool level = level_duration_get_level(level_duration);
  66. uint32_t duration = level_duration_get_duration(level_duration);
  67. decoder->protocol->decoder->feed(decoder, level, duration);
  68. } else {
  69. break;
  70. }
  71. }
  72. furi_hal_delay_ms(10);
  73. }
  74. if(subghz_file_encoder_worker_is_running(file_worker_encoder_handler)) {
  75. subghz_file_encoder_worker_stop(file_worker_encoder_handler);
  76. }
  77. subghz_file_encoder_worker_free(file_worker_encoder_handler);
  78. }
  79. FURI_LOG_I(TAG, "\r\n Decoder count parse \033[0;33m%d\033[0m ", subghz_test_decoder_count);
  80. if(furi_hal_get_tick() - test_start > TEST_TIMEOUT) {
  81. printf("\033[0;31mTest decoder %s ERROR TimeOut\033[0m\r\n", name_decoder);
  82. return false;
  83. } else {
  84. return subghz_test_decoder_count ? true : false;
  85. }
  86. }
  87. static bool subghz_decode_ramdom_test(const char* path) {
  88. subghz_test_decoder_count = 0;
  89. subghz_receiver_reset(receiver_handler);
  90. uint32_t test_start = furi_hal_get_tick();
  91. file_worker_encoder_handler = subghz_file_encoder_worker_alloc();
  92. if(subghz_file_encoder_worker_start(file_worker_encoder_handler, path)) {
  93. //the worker needs a file in order to open and read part of the file
  94. osDelay(100);
  95. LevelDuration level_duration;
  96. while(furi_hal_get_tick() - test_start < TEST_TIMEOUT * 10) {
  97. furi_hal_delay_us(500); //you need to have time to read from the file from the SD card
  98. level_duration =
  99. subghz_file_encoder_worker_get_level_duration(file_worker_encoder_handler);
  100. if(!level_duration_is_reset(level_duration)) {
  101. bool level = level_duration_get_level(level_duration);
  102. uint32_t duration = level_duration_get_duration(level_duration);
  103. subghz_receiver_decode(receiver_handler, level, duration);
  104. } else {
  105. break;
  106. }
  107. }
  108. furi_hal_delay_ms(10);
  109. if(subghz_file_encoder_worker_is_running(file_worker_encoder_handler)) {
  110. subghz_file_encoder_worker_stop(file_worker_encoder_handler);
  111. }
  112. subghz_file_encoder_worker_free(file_worker_encoder_handler);
  113. }
  114. FURI_LOG_I(TAG, "\r\n Decoder count parse \033[0;33m%d\033[0m ", subghz_test_decoder_count);
  115. if(furi_hal_get_tick() - test_start > TEST_TIMEOUT * 10) {
  116. printf("\033[0;31mRandom test ERROR TimeOut\033[0m\r\n");
  117. return false;
  118. } else if(subghz_test_decoder_count == TEST_RANDOM_COUNT_PARSE) {
  119. return true;
  120. } else {
  121. return false;
  122. }
  123. }
  124. static bool subghz_ecode_test(const char* path) {
  125. subghz_test_decoder_count = 0;
  126. uint32_t test_start = furi_hal_get_tick();
  127. string_t temp_str;
  128. string_init(temp_str);
  129. bool file_load = false;
  130. Storage* storage = furi_record_open("storage");
  131. FlipperFormat* fff_data_file = flipper_format_file_alloc(storage);
  132. do {
  133. if(!flipper_format_file_open_existing(fff_data_file, path)) {
  134. FURI_LOG_E(TAG, "Error open file %s", path);
  135. break;
  136. }
  137. if(!flipper_format_read_string(fff_data_file, "Preset", temp_str)) {
  138. FURI_LOG_E(TAG, "Missing Preset");
  139. break;
  140. }
  141. if(!flipper_format_read_string(fff_data_file, "Protocol", temp_str)) {
  142. FURI_LOG_E(TAG, "Missing Protocol");
  143. break;
  144. }
  145. file_load = true;
  146. } while(false);
  147. if(file_load) {
  148. SubGhzTransmitter* transmitter =
  149. subghz_transmitter_alloc_init(environment_handler, string_get_cstr(temp_str));
  150. subghz_transmitter_deserialize(transmitter, fff_data_file);
  151. SubGhzProtocolDecoderBase* decoder = subghz_receiver_search_decoder_base_by_name(
  152. receiver_handler, string_get_cstr(temp_str));
  153. if(decoder) {
  154. LevelDuration level_duration;
  155. while(furi_hal_get_tick() - test_start < TEST_TIMEOUT) {
  156. level_duration = subghz_transmitter_yield(transmitter);
  157. if(!level_duration_is_reset(level_duration)) {
  158. bool level = level_duration_get_level(level_duration);
  159. uint32_t duration = level_duration_get_duration(level_duration);
  160. decoder->protocol->decoder->feed(decoder, level, duration);
  161. } else {
  162. break;
  163. }
  164. }
  165. furi_hal_delay_ms(10);
  166. }
  167. subghz_transmitter_free(transmitter);
  168. }
  169. flipper_format_free(fff_data_file);
  170. FURI_LOG_I(TAG, "\r\n Decoder count parse \033[0;33m%d\033[0m ", subghz_test_decoder_count);
  171. if(furi_hal_get_tick() - test_start > TEST_TIMEOUT) {
  172. printf("\033[0;31mTest encoder %s ERROR TimeOut\033[0m\r\n", string_get_cstr(temp_str));
  173. subghz_test_decoder_count = 0;
  174. }
  175. string_clear(temp_str);
  176. return subghz_test_decoder_count ? true : false;
  177. }
  178. MU_TEST(subghz_keystore_test) {
  179. mu_assert(
  180. subghz_environment_load_keystore(environment_handler, KEYSTORE_DIR_NAME),
  181. "Test keystore error");
  182. }
  183. MU_TEST(subghz_decoder_came_atomo_test) {
  184. mu_assert(
  185. subghz_decode_test(
  186. "/ext/unit_tests/subghz/came_atomo_raw.sub", SUBGHZ_PROTOCOL_CAME_ATOMO_NAME),
  187. "Test decoder " SUBGHZ_PROTOCOL_CAME_ATOMO_NAME " error\r\n");
  188. }
  189. MU_TEST(subghz_decoder_came_test) {
  190. mu_assert(
  191. subghz_decode_test("/ext/unit_tests/subghz/came_raw.sub", SUBGHZ_PROTOCOL_CAME_NAME),
  192. "Test decoder " SUBGHZ_PROTOCOL_CAME_NAME " error\r\n");
  193. }
  194. MU_TEST(subghz_decoder_came_twee_test) {
  195. mu_assert(
  196. subghz_decode_test(
  197. "/ext/unit_tests/subghz/came_twee_raw.sub", SUBGHZ_PROTOCOL_CAME_TWEE_NAME),
  198. "Test decoder " SUBGHZ_PROTOCOL_CAME_TWEE_NAME " error\r\n");
  199. }
  200. MU_TEST(subghz_decoder_faac_slh_test) {
  201. mu_assert(
  202. subghz_decode_test(
  203. "/ext/unit_tests/subghz/faac_slh_raw.sub", SUBGHZ_PROTOCOL_FAAC_SLH_NAME),
  204. "Test decoder " SUBGHZ_PROTOCOL_FAAC_SLH_NAME " error\r\n");
  205. }
  206. MU_TEST(subghz_decoder_gate_tx_test) {
  207. mu_assert(
  208. subghz_decode_test("/ext/unit_tests/subghz/gate_tx_raw.sub", SUBGHZ_PROTOCOL_GATE_TX_NAME),
  209. "Test decoder " SUBGHZ_PROTOCOL_GATE_TX_NAME " error\r\n");
  210. }
  211. MU_TEST(subghz_decoder_hormann_hsm_test) {
  212. mu_assert(
  213. subghz_decode_test(
  214. "/ext/unit_tests/subghz/hormann_hsm_raw.sub", SUBGHZ_PROTOCOL_HORMANN_HSM_NAME),
  215. "Test decoder " SUBGHZ_PROTOCOL_HORMANN_HSM_NAME " error\r\n");
  216. }
  217. MU_TEST(subghz_decoder_ido_test) {
  218. mu_assert(
  219. subghz_decode_test("/ext/unit_tests/subghz/ido_117_111_raw.sub", SUBGHZ_PROTOCOL_IDO_NAME),
  220. "Test decoder " SUBGHZ_PROTOCOL_IDO_NAME " error\r\n");
  221. }
  222. MU_TEST(subghz_decoder_keelog_test) {
  223. mu_assert(
  224. subghz_decode_test("/ext/unit_tests/subghz/doorhan_raw.sub", SUBGHZ_PROTOCOL_KEELOQ_NAME),
  225. "Test decoder " SUBGHZ_PROTOCOL_KEELOQ_NAME " error\r\n");
  226. }
  227. MU_TEST(subghz_decoder_kia_seed_test) {
  228. mu_assert(
  229. subghz_decode_test("/ext/unit_tests/subghz/kia_seed_raw.sub", SUBGHZ_PROTOCOL_KIA_NAME),
  230. "Test decoder " SUBGHZ_PROTOCOL_KIA_NAME " error\r\n");
  231. }
  232. MU_TEST(subghz_decoder_nero_radio_test) {
  233. mu_assert(
  234. subghz_decode_test(
  235. "/ext/unit_tests/subghz/nero_radio_raw.sub", SUBGHZ_PROTOCOL_NERO_RADIO_NAME),
  236. "Test decoder " SUBGHZ_PROTOCOL_NERO_RADIO_NAME " error\r\n");
  237. }
  238. MU_TEST(subghz_decoder_nero_sketch_test) {
  239. mu_assert(
  240. subghz_decode_test(
  241. "/ext/unit_tests/subghz/nero_sketch_raw.sub", SUBGHZ_PROTOCOL_NERO_SKETCH_NAME),
  242. "Test decoder " SUBGHZ_PROTOCOL_NERO_SKETCH_NAME " error\r\n");
  243. }
  244. MU_TEST(subghz_decoder_nice_flo_test) {
  245. mu_assert(
  246. subghz_decode_test(
  247. "/ext/unit_tests/subghz/nice_flo_raw.sub", SUBGHZ_PROTOCOL_NICE_FLO_NAME),
  248. "Test decoder " SUBGHZ_PROTOCOL_NICE_FLO_NAME " error\r\n");
  249. }
  250. MU_TEST(subghz_decoder_nice_flor_s_test) {
  251. mu_assert(
  252. subghz_decode_test(
  253. "/ext/unit_tests/subghz/nice_flor_s_raw.sub", SUBGHZ_PROTOCOL_NICE_FLOR_S_NAME),
  254. "Test decoder " SUBGHZ_PROTOCOL_NICE_FLOR_S_NAME " error\r\n");
  255. }
  256. MU_TEST(subghz_decoder_princeton_test) {
  257. mu_assert(
  258. subghz_decode_test(
  259. "/ext/unit_tests/subghz/Princeton_raw.sub", SUBGHZ_PROTOCOL_PRINCETON_NAME),
  260. "Test decoder " SUBGHZ_PROTOCOL_PRINCETON_NAME " error\r\n");
  261. }
  262. MU_TEST(subghz_decoder_scher_khan_magic_code_test) {
  263. mu_assert(
  264. subghz_decode_test(
  265. "/ext/unit_tests/subghz/scher_khan_magic_code.sub", SUBGHZ_PROTOCOL_SCHER_KHAN_NAME),
  266. "Test decoder " SUBGHZ_PROTOCOL_SCHER_KHAN_NAME " error\r\n");
  267. }
  268. MU_TEST(subghz_decoder_somfy_keytis_test) {
  269. mu_assert(
  270. subghz_decode_test(
  271. "/ext/unit_tests/subghz/Somfy_keytis_raw.sub", SUBGHZ_PROTOCOL_SOMFY_KEYTIS_NAME),
  272. "Test decoder " SUBGHZ_PROTOCOL_SOMFY_KEYTIS_NAME " error\r\n");
  273. }
  274. MU_TEST(subghz_decoder_somfy_telis_test) {
  275. mu_assert(
  276. subghz_decode_test(
  277. "/ext/unit_tests/subghz/somfy_telis_raw.sub", SUBGHZ_PROTOCOL_SOMFY_TELIS_NAME),
  278. "Test decoder " SUBGHZ_PROTOCOL_SOMFY_TELIS_NAME " error\r\n");
  279. }
  280. MU_TEST(subghz_decoder_star_line_test) {
  281. mu_assert(
  282. subghz_decode_test("/ext/unit_tests/subghz/cenmax_raw.sub", SUBGHZ_PROTOCOL_STAR_LINE_NAME),
  283. "Test decoder " SUBGHZ_PROTOCOL_STAR_LINE_NAME " error\r\n");
  284. }
  285. MU_TEST(subghz_ecoder_princeton_test) {
  286. mu_assert(
  287. subghz_ecode_test("/ext/unit_tests/subghz/princeton.sub"),
  288. "Test encoder " SUBGHZ_PROTOCOL_PRINCETON_NAME " error\r\n");
  289. }
  290. MU_TEST(subghz_ecoder_came_test) {
  291. mu_assert(
  292. subghz_ecode_test("/ext/unit_tests/subghz/came.sub"),
  293. "Test encoder " SUBGHZ_PROTOCOL_CAME_NAME " error\r\n");
  294. }
  295. MU_TEST(subghz_ecoder_came_twee_test) {
  296. mu_assert(
  297. subghz_ecode_test("/ext/unit_tests/subghz/came_twee.sub"),
  298. "Test encoder " SUBGHZ_PROTOCOL_CAME_TWEE_NAME " error\r\n");
  299. }
  300. MU_TEST(subghz_ecoder_gate_tx_test) {
  301. mu_assert(
  302. subghz_ecode_test("/ext/unit_tests/subghz/gate_tx.sub"),
  303. "Test encoder " SUBGHZ_PROTOCOL_GATE_TX_NAME " error\r\n");
  304. }
  305. MU_TEST(subghz_ecoder_nice_flo_test) {
  306. mu_assert(
  307. subghz_ecode_test("/ext/unit_tests/subghz/nice_flo.sub"),
  308. "Test encoder " SUBGHZ_PROTOCOL_NICE_FLO_NAME " error\r\n");
  309. }
  310. MU_TEST(subghz_ecoder_keelog_test) {
  311. mu_assert(
  312. subghz_ecode_test("/ext/unit_tests/subghz/doorhan.sub"),
  313. "Test encoder " SUBGHZ_PROTOCOL_KEELOQ_NAME " error\r\n");
  314. }
  315. MU_TEST(subghz_random_test) {
  316. mu_assert(subghz_decode_ramdom_test(TEST_RANDOM_DIR_NAME), "Random test error\r\n");
  317. }
  318. MU_TEST_SUITE(subghz) {
  319. //MU_SUITE_CONFIGURE(&subghz_test_init, &subghz_test_deinit);
  320. subghz_test_init();
  321. MU_RUN_TEST(subghz_keystore_test);
  322. MU_RUN_TEST(subghz_decoder_came_atomo_test);
  323. MU_RUN_TEST(subghz_decoder_came_test);
  324. MU_RUN_TEST(subghz_decoder_came_twee_test);
  325. MU_RUN_TEST(subghz_decoder_faac_slh_test);
  326. MU_RUN_TEST(subghz_decoder_gate_tx_test);
  327. MU_RUN_TEST(subghz_decoder_hormann_hsm_test);
  328. MU_RUN_TEST(subghz_decoder_ido_test);
  329. MU_RUN_TEST(subghz_decoder_keelog_test);
  330. MU_RUN_TEST(subghz_decoder_kia_seed_test);
  331. MU_RUN_TEST(subghz_decoder_nero_radio_test);
  332. MU_RUN_TEST(subghz_decoder_nero_sketch_test);
  333. MU_RUN_TEST(subghz_decoder_nice_flo_test);
  334. MU_RUN_TEST(subghz_decoder_nice_flor_s_test);
  335. MU_RUN_TEST(subghz_decoder_princeton_test);
  336. MU_RUN_TEST(subghz_decoder_scher_khan_magic_code_test);
  337. MU_RUN_TEST(subghz_decoder_somfy_keytis_test);
  338. MU_RUN_TEST(subghz_decoder_somfy_telis_test);
  339. MU_RUN_TEST(subghz_decoder_star_line_test);
  340. MU_RUN_TEST(subghz_ecoder_princeton_test);
  341. MU_RUN_TEST(subghz_ecoder_came_test);
  342. MU_RUN_TEST(subghz_ecoder_came_twee_test);
  343. MU_RUN_TEST(subghz_ecoder_gate_tx_test);
  344. MU_RUN_TEST(subghz_ecoder_nice_flo_test);
  345. MU_RUN_TEST(subghz_ecoder_keelog_test);
  346. MU_RUN_TEST(subghz_random_test);
  347. subghz_test_deinit();
  348. }
  349. int run_minunit_test_subghz() {
  350. MU_RUN_SUITE(subghz);
  351. return MU_EXIT_CODE;
  352. }