subghz_test.c 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808
  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/protocol_items.h>
  9. #include <flipper_format/flipper_format_i.h>
  10. #define TAG "SubGhz TEST"
  11. #define KEYSTORE_DIR_NAME EXT_PATH("subghz/assets/keeloq_mfcodes")
  12. #define CAME_ATOMO_DIR_NAME EXT_PATH("subghz/assets/came_atomo")
  13. #define NICE_FLOR_S_DIR_NAME EXT_PATH("subghz/assets/nice_flor_s")
  14. #define TEST_RANDOM_DIR_NAME EXT_PATH("unit_tests/subghz/test_random_raw.sub")
  15. #define TEST_RANDOM_COUNT_PARSE 253
  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. UNUSED(receiver);
  27. UNUSED(context);
  28. FuriString* text;
  29. text = furi_string_alloc();
  30. subghz_protocol_decoder_base_get_string(decoder_base, text);
  31. subghz_receiver_reset(receiver_handler);
  32. FURI_LOG_T(TAG, "\r\n%s", furi_string_get_cstr(text));
  33. furi_string_free(text);
  34. subghz_test_decoder_count++;
  35. }
  36. static void subghz_test_init(void) {
  37. environment_handler = subghz_environment_alloc();
  38. subghz_environment_set_came_atomo_rainbow_table_file_name(
  39. environment_handler, CAME_ATOMO_DIR_NAME);
  40. subghz_environment_set_nice_flor_s_rainbow_table_file_name(
  41. environment_handler, NICE_FLOR_S_DIR_NAME);
  42. subghz_environment_set_protocol_registry(
  43. environment_handler, (void*)&subghz_protocol_registry);
  44. receiver_handler = subghz_receiver_alloc_init(environment_handler);
  45. subghz_receiver_set_filter(receiver_handler, SubGhzProtocolFlag_Decodable);
  46. subghz_receiver_set_rx_callback(receiver_handler, subghz_test_rx_callback, NULL);
  47. }
  48. static void subghz_test_deinit(void) {
  49. subghz_receiver_free(receiver_handler);
  50. subghz_environment_free(environment_handler);
  51. }
  52. static bool subghz_decoder_test(const char* path, const char* name_decoder) {
  53. subghz_test_decoder_count = 0;
  54. uint32_t test_start = furi_get_tick();
  55. SubGhzProtocolDecoderBase* decoder =
  56. subghz_receiver_search_decoder_base_by_name(receiver_handler, name_decoder);
  57. if(decoder) {
  58. file_worker_encoder_handler = subghz_file_encoder_worker_alloc();
  59. if(subghz_file_encoder_worker_start(file_worker_encoder_handler, path)) {
  60. // the worker needs a file in order to open and read part of the file
  61. furi_delay_ms(100);
  62. LevelDuration level_duration;
  63. while(furi_get_tick() - test_start < TEST_TIMEOUT) {
  64. level_duration =
  65. subghz_file_encoder_worker_get_level_duration(file_worker_encoder_handler);
  66. if(!level_duration_is_reset(level_duration)) {
  67. bool level = level_duration_get_level(level_duration);
  68. uint32_t duration = level_duration_get_duration(level_duration);
  69. // Yield, to load data inside the worker
  70. furi_thread_yield();
  71. decoder->protocol->decoder->feed(decoder, level, duration);
  72. } else {
  73. break;
  74. }
  75. }
  76. furi_delay_ms(10);
  77. }
  78. if(subghz_file_encoder_worker_is_running(file_worker_encoder_handler)) {
  79. subghz_file_encoder_worker_stop(file_worker_encoder_handler);
  80. }
  81. subghz_file_encoder_worker_free(file_worker_encoder_handler);
  82. }
  83. FURI_LOG_T(TAG, "\r\n Decoder count parse \033[0;33m%d\033[0m ", subghz_test_decoder_count);
  84. if(furi_get_tick() - test_start > TEST_TIMEOUT) {
  85. printf("\033[0;31mTest decoder %s ERROR TimeOut\033[0m\r\n", name_decoder);
  86. return false;
  87. } else {
  88. return subghz_test_decoder_count ? true : false;
  89. }
  90. }
  91. static bool subghz_decode_random_test(const char* path) {
  92. subghz_test_decoder_count = 0;
  93. subghz_receiver_reset(receiver_handler);
  94. uint32_t test_start = furi_get_tick();
  95. file_worker_encoder_handler = subghz_file_encoder_worker_alloc();
  96. if(subghz_file_encoder_worker_start(file_worker_encoder_handler, path)) {
  97. // the worker needs a file in order to open and read part of the file
  98. furi_delay_ms(100);
  99. LevelDuration level_duration;
  100. while(furi_get_tick() - test_start < TEST_TIMEOUT * 10) {
  101. level_duration =
  102. subghz_file_encoder_worker_get_level_duration(file_worker_encoder_handler);
  103. if(!level_duration_is_reset(level_duration)) {
  104. bool level = level_duration_get_level(level_duration);
  105. uint32_t duration = level_duration_get_duration(level_duration);
  106. // Yield, to load data inside the worker
  107. furi_thread_yield();
  108. subghz_receiver_decode(receiver_handler, level, duration);
  109. } else {
  110. break;
  111. }
  112. }
  113. furi_delay_ms(10);
  114. if(subghz_file_encoder_worker_is_running(file_worker_encoder_handler)) {
  115. subghz_file_encoder_worker_stop(file_worker_encoder_handler);
  116. }
  117. subghz_file_encoder_worker_free(file_worker_encoder_handler);
  118. }
  119. FURI_LOG_D(TAG, "\r\n Decoder count parse \033[0;33m%d\033[0m ", subghz_test_decoder_count);
  120. if(furi_get_tick() - test_start > TEST_TIMEOUT * 10) {
  121. printf("\033[0;31mRandom test ERROR TimeOut\033[0m\r\n");
  122. return false;
  123. } else if(subghz_test_decoder_count == TEST_RANDOM_COUNT_PARSE) {
  124. return true;
  125. } else {
  126. return false;
  127. }
  128. }
  129. static bool subghz_encoder_test(const char* path) {
  130. subghz_test_decoder_count = 0;
  131. uint32_t test_start = furi_get_tick();
  132. FuriString* temp_str;
  133. temp_str = furi_string_alloc();
  134. bool file_load = false;
  135. Storage* storage = furi_record_open(RECORD_STORAGE);
  136. FlipperFormat* fff_data_file = flipper_format_file_alloc(storage);
  137. do {
  138. if(!flipper_format_file_open_existing(fff_data_file, path)) {
  139. FURI_LOG_E(TAG, "Error open file %s", path);
  140. break;
  141. }
  142. if(!flipper_format_read_string(fff_data_file, "Preset", temp_str)) {
  143. FURI_LOG_E(TAG, "Missing Preset");
  144. break;
  145. }
  146. if(!flipper_format_read_string(fff_data_file, "Protocol", temp_str)) {
  147. FURI_LOG_E(TAG, "Missing Protocol");
  148. break;
  149. }
  150. file_load = true;
  151. } while(false);
  152. if(file_load) {
  153. SubGhzTransmitter* transmitter =
  154. subghz_transmitter_alloc_init(environment_handler, furi_string_get_cstr(temp_str));
  155. subghz_transmitter_deserialize(transmitter, fff_data_file);
  156. SubGhzProtocolDecoderBase* decoder = subghz_receiver_search_decoder_base_by_name(
  157. receiver_handler, furi_string_get_cstr(temp_str));
  158. if(decoder) {
  159. LevelDuration level_duration;
  160. while(furi_get_tick() - test_start < TEST_TIMEOUT) {
  161. level_duration = subghz_transmitter_yield(transmitter);
  162. if(!level_duration_is_reset(level_duration)) {
  163. bool level = level_duration_get_level(level_duration);
  164. uint32_t duration = level_duration_get_duration(level_duration);
  165. decoder->protocol->decoder->feed(decoder, level, duration);
  166. } else {
  167. break;
  168. }
  169. }
  170. furi_delay_ms(10);
  171. }
  172. subghz_transmitter_free(transmitter);
  173. }
  174. flipper_format_free(fff_data_file);
  175. FURI_LOG_T(TAG, "\r\n Decoder count parse \033[0;33m%d\033[0m ", subghz_test_decoder_count);
  176. if(furi_get_tick() - test_start > TEST_TIMEOUT) {
  177. printf(
  178. "\033[0;31mTest encoder %s ERROR TimeOut\033[0m\r\n", furi_string_get_cstr(temp_str));
  179. subghz_test_decoder_count = 0;
  180. }
  181. furi_string_free(temp_str);
  182. return subghz_test_decoder_count ? true : false;
  183. }
  184. MU_TEST(subghz_keystore_test) {
  185. mu_assert(
  186. subghz_environment_load_keystore(environment_handler, KEYSTORE_DIR_NAME),
  187. "Test keystore error");
  188. }
  189. typedef enum {
  190. SubGhzHalAsyncTxTestTypeNormal,
  191. SubGhzHalAsyncTxTestTypeInvalidStart,
  192. SubGhzHalAsyncTxTestTypeInvalidMid,
  193. SubGhzHalAsyncTxTestTypeInvalidEnd,
  194. SubGhzHalAsyncTxTestTypeResetStart,
  195. SubGhzHalAsyncTxTestTypeResetMid,
  196. SubGhzHalAsyncTxTestTypeResetEnd,
  197. } SubGhzHalAsyncTxTestType;
  198. typedef struct {
  199. SubGhzHalAsyncTxTestType type;
  200. size_t pos;
  201. } SubGhzHalAsyncTxTest;
  202. #define SUBGHZ_HAL_TEST_DURATION 1
  203. static LevelDuration subghz_hal_async_tx_test_yield(void* context) {
  204. SubGhzHalAsyncTxTest* test = context;
  205. bool is_odd = test->pos % 2;
  206. if(test->type == SubGhzHalAsyncTxTestTypeNormal) {
  207. if(test->pos < API_HAL_SUBGHZ_ASYNC_TX_BUFFER_FULL * 8) {
  208. test->pos++;
  209. return level_duration_make(is_odd, SUBGHZ_HAL_TEST_DURATION);
  210. } else if(test->pos == API_HAL_SUBGHZ_ASYNC_TX_BUFFER_FULL * 8) {
  211. test->pos++;
  212. return level_duration_reset();
  213. } else {
  214. furi_crash("Yield after reset");
  215. }
  216. } else if(test->type == SubGhzHalAsyncTxTestTypeInvalidStart) {
  217. if(test->pos == 0) {
  218. test->pos++;
  219. return level_duration_make(!is_odd, SUBGHZ_HAL_TEST_DURATION);
  220. } else if(test->pos < API_HAL_SUBGHZ_ASYNC_TX_BUFFER_FULL * 8) {
  221. test->pos++;
  222. return level_duration_make(is_odd, SUBGHZ_HAL_TEST_DURATION);
  223. } else if(test->pos == API_HAL_SUBGHZ_ASYNC_TX_BUFFER_FULL * 8) {
  224. test->pos++;
  225. return level_duration_reset();
  226. } else {
  227. furi_crash("Yield after reset");
  228. }
  229. } else if(test->type == SubGhzHalAsyncTxTestTypeInvalidMid) {
  230. if(test->pos == API_HAL_SUBGHZ_ASYNC_TX_BUFFER_HALF / 2) {
  231. test->pos++;
  232. return level_duration_make(!is_odd, SUBGHZ_HAL_TEST_DURATION);
  233. } else if(test->pos < API_HAL_SUBGHZ_ASYNC_TX_BUFFER_FULL * 8) {
  234. test->pos++;
  235. return level_duration_make(is_odd, SUBGHZ_HAL_TEST_DURATION);
  236. } else if(test->pos == API_HAL_SUBGHZ_ASYNC_TX_BUFFER_FULL * 8) {
  237. test->pos++;
  238. return level_duration_reset();
  239. } else {
  240. furi_crash("Yield after reset");
  241. }
  242. } else if(test->type == SubGhzHalAsyncTxTestTypeInvalidEnd) {
  243. if(test->pos == API_HAL_SUBGHZ_ASYNC_TX_BUFFER_FULL - 1) {
  244. test->pos++;
  245. return level_duration_make(!is_odd, SUBGHZ_HAL_TEST_DURATION);
  246. } else if(test->pos < API_HAL_SUBGHZ_ASYNC_TX_BUFFER_FULL * 8) {
  247. test->pos++;
  248. return level_duration_make(is_odd, SUBGHZ_HAL_TEST_DURATION);
  249. } else if(test->pos == API_HAL_SUBGHZ_ASYNC_TX_BUFFER_FULL * 8) {
  250. test->pos++;
  251. return level_duration_reset();
  252. } else {
  253. furi_crash("Yield after reset");
  254. }
  255. } else if(test->type == SubGhzHalAsyncTxTestTypeResetStart) {
  256. if(test->pos == 0) {
  257. test->pos++;
  258. return level_duration_reset();
  259. } else {
  260. furi_crash("Yield after reset");
  261. }
  262. } else if(test->type == SubGhzHalAsyncTxTestTypeResetMid) {
  263. if(test->pos < API_HAL_SUBGHZ_ASYNC_TX_BUFFER_HALF / 2) {
  264. test->pos++;
  265. return level_duration_make(is_odd, SUBGHZ_HAL_TEST_DURATION);
  266. } else if(test->pos == API_HAL_SUBGHZ_ASYNC_TX_BUFFER_HALF / 2) {
  267. test->pos++;
  268. return level_duration_reset();
  269. } else {
  270. furi_crash("Yield after reset");
  271. }
  272. } else if(test->type == SubGhzHalAsyncTxTestTypeResetEnd) {
  273. if(test->pos < API_HAL_SUBGHZ_ASYNC_TX_BUFFER_FULL - 1) {
  274. test->pos++;
  275. return level_duration_make(is_odd, SUBGHZ_HAL_TEST_DURATION);
  276. } else if(test->pos == API_HAL_SUBGHZ_ASYNC_TX_BUFFER_FULL - 1) {
  277. test->pos++;
  278. return level_duration_reset();
  279. } else {
  280. furi_crash("Yield after reset");
  281. }
  282. } else {
  283. furi_crash("Programming error");
  284. }
  285. }
  286. bool subghz_hal_async_tx_test_run(SubGhzHalAsyncTxTestType type) {
  287. SubGhzHalAsyncTxTest test = {0};
  288. test.type = type;
  289. furi_hal_subghz_reset();
  290. furi_hal_subghz_load_preset(FuriHalSubGhzPresetOok650Async);
  291. furi_hal_subghz_set_frequency_and_path(433920000);
  292. if(!furi_hal_subghz_start_async_tx(subghz_hal_async_tx_test_yield, &test)) {
  293. return false;
  294. }
  295. while(!furi_hal_subghz_is_async_tx_complete()) {
  296. furi_delay_ms(10);
  297. }
  298. furi_hal_subghz_stop_async_tx();
  299. furi_hal_subghz_sleep();
  300. return true;
  301. }
  302. MU_TEST(subghz_hal_async_tx_test) {
  303. mu_assert(
  304. subghz_hal_async_tx_test_run(SubGhzHalAsyncTxTestTypeNormal),
  305. "Test furi_hal_async_tx normal");
  306. mu_assert(
  307. subghz_hal_async_tx_test_run(SubGhzHalAsyncTxTestTypeInvalidStart),
  308. "Test furi_hal_async_tx invalid start");
  309. mu_assert(
  310. subghz_hal_async_tx_test_run(SubGhzHalAsyncTxTestTypeInvalidMid),
  311. "Test furi_hal_async_tx invalid mid");
  312. mu_assert(
  313. subghz_hal_async_tx_test_run(SubGhzHalAsyncTxTestTypeInvalidEnd),
  314. "Test furi_hal_async_tx invalid end");
  315. mu_assert(
  316. subghz_hal_async_tx_test_run(SubGhzHalAsyncTxTestTypeResetStart),
  317. "Test furi_hal_async_tx reset start");
  318. mu_assert(
  319. subghz_hal_async_tx_test_run(SubGhzHalAsyncTxTestTypeResetMid),
  320. "Test furi_hal_async_tx reset mid");
  321. mu_assert(
  322. subghz_hal_async_tx_test_run(SubGhzHalAsyncTxTestTypeResetEnd),
  323. "Test furi_hal_async_tx reset end");
  324. }
  325. //test decoders
  326. MU_TEST(subghz_decoder_came_atomo_test) {
  327. mu_assert(
  328. subghz_decoder_test(
  329. EXT_PATH("unit_tests/subghz/came_atomo_raw.sub"), SUBGHZ_PROTOCOL_CAME_ATOMO_NAME),
  330. "Test decoder " SUBGHZ_PROTOCOL_CAME_ATOMO_NAME " error\r\n");
  331. }
  332. MU_TEST(subghz_decoder_came_test) {
  333. mu_assert(
  334. subghz_decoder_test(EXT_PATH("unit_tests/subghz/came_raw.sub"), SUBGHZ_PROTOCOL_CAME_NAME),
  335. "Test decoder " SUBGHZ_PROTOCOL_CAME_NAME " error\r\n");
  336. }
  337. MU_TEST(subghz_decoder_came_twee_test) {
  338. mu_assert(
  339. subghz_decoder_test(
  340. EXT_PATH("unit_tests/subghz/came_twee_raw.sub"), SUBGHZ_PROTOCOL_CAME_TWEE_NAME),
  341. "Test decoder " SUBGHZ_PROTOCOL_CAME_TWEE_NAME " error\r\n");
  342. }
  343. MU_TEST(subghz_decoder_faac_slh_test) {
  344. mu_assert(
  345. subghz_decoder_test(
  346. EXT_PATH("unit_tests/subghz/faac_slh_raw.sub"), SUBGHZ_PROTOCOL_FAAC_SLH_NAME),
  347. "Test decoder " SUBGHZ_PROTOCOL_FAAC_SLH_NAME " error\r\n");
  348. }
  349. MU_TEST(subghz_decoder_gate_tx_test) {
  350. mu_assert(
  351. subghz_decoder_test(
  352. EXT_PATH("unit_tests/subghz/gate_tx_raw.sub"), SUBGHZ_PROTOCOL_GATE_TX_NAME),
  353. "Test decoder " SUBGHZ_PROTOCOL_GATE_TX_NAME " error\r\n");
  354. }
  355. MU_TEST(subghz_decoder_hormann_hsm_test) {
  356. mu_assert(
  357. subghz_decoder_test(
  358. EXT_PATH("unit_tests/subghz/hormann_hsm_raw.sub"), SUBGHZ_PROTOCOL_HORMANN_HSM_NAME),
  359. "Test decoder " SUBGHZ_PROTOCOL_HORMANN_HSM_NAME " error\r\n");
  360. }
  361. MU_TEST(subghz_decoder_ido_test) {
  362. mu_assert(
  363. subghz_decoder_test(
  364. EXT_PATH("unit_tests/subghz/ido_117_111_raw.sub"), SUBGHZ_PROTOCOL_IDO_NAME),
  365. "Test decoder " SUBGHZ_PROTOCOL_IDO_NAME " error\r\n");
  366. }
  367. MU_TEST(subghz_decoder_keelog_test) {
  368. mu_assert(
  369. subghz_decoder_test(
  370. EXT_PATH("unit_tests/subghz/doorhan_raw.sub"), SUBGHZ_PROTOCOL_KEELOQ_NAME),
  371. "Test decoder " SUBGHZ_PROTOCOL_KEELOQ_NAME " error\r\n");
  372. }
  373. MU_TEST(subghz_decoder_kia_seed_test) {
  374. mu_assert(
  375. subghz_decoder_test(
  376. EXT_PATH("unit_tests/subghz/kia_seed_raw.sub"), SUBGHZ_PROTOCOL_KIA_NAME),
  377. "Test decoder " SUBGHZ_PROTOCOL_KIA_NAME " error\r\n");
  378. }
  379. MU_TEST(subghz_decoder_nero_radio_test) {
  380. mu_assert(
  381. subghz_decoder_test(
  382. EXT_PATH("unit_tests/subghz/nero_radio_raw.sub"), SUBGHZ_PROTOCOL_NERO_RADIO_NAME),
  383. "Test decoder " SUBGHZ_PROTOCOL_NERO_RADIO_NAME " error\r\n");
  384. }
  385. MU_TEST(subghz_decoder_nero_sketch_test) {
  386. mu_assert(
  387. subghz_decoder_test(
  388. EXT_PATH("unit_tests/subghz/nero_sketch_raw.sub"), SUBGHZ_PROTOCOL_NERO_SKETCH_NAME),
  389. "Test decoder " SUBGHZ_PROTOCOL_NERO_SKETCH_NAME " error\r\n");
  390. }
  391. MU_TEST(subghz_decoder_nice_flo_test) {
  392. mu_assert(
  393. subghz_decoder_test(
  394. EXT_PATH("unit_tests/subghz/nice_flo_raw.sub"), SUBGHZ_PROTOCOL_NICE_FLO_NAME),
  395. "Test decoder " SUBGHZ_PROTOCOL_NICE_FLO_NAME " error\r\n");
  396. }
  397. MU_TEST(subghz_decoder_nice_flor_s_test) {
  398. mu_assert(
  399. subghz_decoder_test(
  400. EXT_PATH("unit_tests/subghz/nice_flor_s_raw.sub"), SUBGHZ_PROTOCOL_NICE_FLOR_S_NAME),
  401. "Test decoder " SUBGHZ_PROTOCOL_NICE_FLOR_S_NAME " error\r\n");
  402. }
  403. MU_TEST(subghz_decoder_princeton_test) {
  404. mu_assert(
  405. subghz_decoder_test(
  406. EXT_PATH("unit_tests/subghz/Princeton_raw.sub"), SUBGHZ_PROTOCOL_PRINCETON_NAME),
  407. "Test decoder " SUBGHZ_PROTOCOL_PRINCETON_NAME " error\r\n");
  408. }
  409. MU_TEST(subghz_decoder_scher_khan_magic_code_test) {
  410. mu_assert(
  411. subghz_decoder_test(
  412. EXT_PATH("unit_tests/subghz/scher_khan_magic_code.sub"),
  413. SUBGHZ_PROTOCOL_SCHER_KHAN_NAME),
  414. "Test decoder " SUBGHZ_PROTOCOL_SCHER_KHAN_NAME " error\r\n");
  415. }
  416. MU_TEST(subghz_decoder_somfy_keytis_test) {
  417. mu_assert(
  418. subghz_decoder_test(
  419. EXT_PATH("unit_tests/subghz/Somfy_keytis_raw.sub"), SUBGHZ_PROTOCOL_SOMFY_KEYTIS_NAME),
  420. "Test decoder " SUBGHZ_PROTOCOL_SOMFY_KEYTIS_NAME " error\r\n");
  421. }
  422. MU_TEST(subghz_decoder_somfy_telis_test) {
  423. mu_assert(
  424. subghz_decoder_test(
  425. EXT_PATH("unit_tests/subghz/somfy_telis_raw.sub"), SUBGHZ_PROTOCOL_SOMFY_TELIS_NAME),
  426. "Test decoder " SUBGHZ_PROTOCOL_SOMFY_TELIS_NAME " error\r\n");
  427. }
  428. MU_TEST(subghz_decoder_star_line_test) {
  429. mu_assert(
  430. subghz_decoder_test(
  431. EXT_PATH("unit_tests/subghz/cenmax_raw.sub"), SUBGHZ_PROTOCOL_STAR_LINE_NAME),
  432. "Test decoder " SUBGHZ_PROTOCOL_STAR_LINE_NAME " error\r\n");
  433. }
  434. MU_TEST(subghz_decoder_linear_test) {
  435. mu_assert(
  436. subghz_decoder_test(
  437. EXT_PATH("unit_tests/subghz/linear_raw.sub"), SUBGHZ_PROTOCOL_LINEAR_NAME),
  438. "Test decoder " SUBGHZ_PROTOCOL_LINEAR_NAME " error\r\n");
  439. }
  440. MU_TEST(subghz_decoder_megacode_test) {
  441. mu_assert(
  442. subghz_decoder_test(
  443. EXT_PATH("unit_tests/subghz/megacode_raw.sub"), SUBGHZ_PROTOCOL_MEGACODE_NAME),
  444. "Test decoder " SUBGHZ_PROTOCOL_MEGACODE_NAME " error\r\n");
  445. }
  446. MU_TEST(subghz_decoder_secplus_v1_test) {
  447. mu_assert(
  448. subghz_decoder_test(
  449. EXT_PATH("unit_tests/subghz/security_pls_1_0_raw.sub"),
  450. SUBGHZ_PROTOCOL_SECPLUS_V1_NAME),
  451. "Test decoder " SUBGHZ_PROTOCOL_SECPLUS_V1_NAME " error\r\n");
  452. }
  453. MU_TEST(subghz_decoder_secplus_v2_test) {
  454. mu_assert(
  455. subghz_decoder_test(
  456. EXT_PATH("unit_tests/subghz/security_pls_2_0_raw.sub"),
  457. SUBGHZ_PROTOCOL_SECPLUS_V2_NAME),
  458. "Test decoder " SUBGHZ_PROTOCOL_SECPLUS_V2_NAME " error\r\n");
  459. }
  460. MU_TEST(subghz_decoder_holtek_test) {
  461. mu_assert(
  462. subghz_decoder_test(
  463. EXT_PATH("unit_tests/subghz/holtek_raw.sub"), SUBGHZ_PROTOCOL_HOLTEK_NAME),
  464. "Test decoder " SUBGHZ_PROTOCOL_HOLTEK_NAME " error\r\n");
  465. }
  466. MU_TEST(subghz_decoder_power_smart_test) {
  467. mu_assert(
  468. subghz_decoder_test(
  469. EXT_PATH("unit_tests/subghz/power_smart_raw.sub"), SUBGHZ_PROTOCOL_POWER_SMART_NAME),
  470. "Test decoder " SUBGHZ_PROTOCOL_POWER_SMART_NAME " error\r\n");
  471. }
  472. MU_TEST(subghz_decoder_marantec_test) {
  473. mu_assert(
  474. subghz_decoder_test(
  475. EXT_PATH("unit_tests/subghz/marantec_raw.sub"), SUBGHZ_PROTOCOL_MARANTEC_NAME),
  476. "Test decoder " SUBGHZ_PROTOCOL_MARANTEC_NAME " error\r\n");
  477. }
  478. MU_TEST(subghz_decoder_bett_test) {
  479. mu_assert(
  480. subghz_decoder_test(EXT_PATH("unit_tests/subghz/bett_raw.sub"), SUBGHZ_PROTOCOL_BETT_NAME),
  481. "Test decoder " SUBGHZ_PROTOCOL_BETT_NAME " error\r\n");
  482. }
  483. MU_TEST(subghz_decoder_doitrand_test) {
  484. mu_assert(
  485. subghz_decoder_test(
  486. EXT_PATH("unit_tests/subghz/doitrand_raw.sub"), SUBGHZ_PROTOCOL_DOITRAND_NAME),
  487. "Test decoder " SUBGHZ_PROTOCOL_DOITRAND_NAME " error\r\n");
  488. }
  489. MU_TEST(subghz_decoder_phoenix_v2_test) {
  490. mu_assert(
  491. subghz_decoder_test(
  492. EXT_PATH("unit_tests/subghz/phoenix_v2_raw.sub"), SUBGHZ_PROTOCOL_PHOENIX_V2_NAME),
  493. "Test decoder " SUBGHZ_PROTOCOL_PHOENIX_V2_NAME " error\r\n");
  494. }
  495. MU_TEST(subghz_decoder_honeywell_wdb_test) {
  496. mu_assert(
  497. subghz_decoder_test(
  498. EXT_PATH("unit_tests/subghz/honeywell_wdb_raw.sub"),
  499. SUBGHZ_PROTOCOL_HONEYWELL_WDB_NAME),
  500. "Test decoder " SUBGHZ_PROTOCOL_HONEYWELL_WDB_NAME " error\r\n");
  501. }
  502. MU_TEST(subghz_decoder_magellan_test) {
  503. mu_assert(
  504. subghz_decoder_test(
  505. EXT_PATH("unit_tests/subghz/magellan_raw.sub"), SUBGHZ_PROTOCOL_MAGELLAN_NAME),
  506. "Test decoder " SUBGHZ_PROTOCOL_MAGELLAN_NAME " error\r\n");
  507. }
  508. MU_TEST(subghz_decoder_intertechno_v3_test) {
  509. mu_assert(
  510. subghz_decoder_test(
  511. EXT_PATH("unit_tests/subghz/intertechno_v3_raw.sub"),
  512. SUBGHZ_PROTOCOL_INTERTECHNO_V3_NAME),
  513. "Test decoder " SUBGHZ_PROTOCOL_INTERTECHNO_V3_NAME " error\r\n");
  514. }
  515. MU_TEST(subghz_decoder_clemsa_test) {
  516. mu_assert(
  517. subghz_decoder_test(
  518. EXT_PATH("unit_tests/subghz/clemsa_raw.sub"), SUBGHZ_PROTOCOL_CLEMSA_NAME),
  519. "Test decoder " SUBGHZ_PROTOCOL_CLEMSA_NAME " error\r\n");
  520. }
  521. MU_TEST(subghz_decoder_ansonic_test) {
  522. mu_assert(
  523. subghz_decoder_test(
  524. EXT_PATH("unit_tests/subghz/ansonic_raw.sub"), SUBGHZ_PROTOCOL_ANSONIC_NAME),
  525. "Test decoder " SUBGHZ_PROTOCOL_ANSONIC_NAME " error\r\n");
  526. }
  527. MU_TEST(subghz_decoder_smc5326_test) {
  528. mu_assert(
  529. subghz_decoder_test(
  530. EXT_PATH("unit_tests/subghz/smc5326_raw.sub"), SUBGHZ_PROTOCOL_SMC5326_NAME),
  531. "Test decoder " SUBGHZ_PROTOCOL_SMC5326_NAME " error\r\n");
  532. }
  533. //test encoders
  534. MU_TEST(subghz_encoder_princeton_test) {
  535. mu_assert(
  536. subghz_encoder_test(EXT_PATH("unit_tests/subghz/princeton.sub")),
  537. "Test encoder " SUBGHZ_PROTOCOL_PRINCETON_NAME " error\r\n");
  538. }
  539. MU_TEST(subghz_encoder_came_test) {
  540. mu_assert(
  541. subghz_encoder_test(EXT_PATH("unit_tests/subghz/came.sub")),
  542. "Test encoder " SUBGHZ_PROTOCOL_CAME_NAME " error\r\n");
  543. }
  544. MU_TEST(subghz_encoder_came_twee_test) {
  545. mu_assert(
  546. subghz_encoder_test(EXT_PATH("unit_tests/subghz/came_twee.sub")),
  547. "Test encoder " SUBGHZ_PROTOCOL_CAME_TWEE_NAME " error\r\n");
  548. }
  549. MU_TEST(subghz_encoder_gate_tx_test) {
  550. mu_assert(
  551. subghz_encoder_test(EXT_PATH("unit_tests/subghz/gate_tx.sub")),
  552. "Test encoder " SUBGHZ_PROTOCOL_GATE_TX_NAME " error\r\n");
  553. }
  554. MU_TEST(subghz_encoder_nice_flo_test) {
  555. mu_assert(
  556. subghz_encoder_test(EXT_PATH("unit_tests/subghz/nice_flo.sub")),
  557. "Test encoder " SUBGHZ_PROTOCOL_NICE_FLO_NAME " error\r\n");
  558. }
  559. MU_TEST(subghz_encoder_keelog_test) {
  560. mu_assert(
  561. subghz_encoder_test(EXT_PATH("unit_tests/subghz/doorhan.sub")),
  562. "Test encoder " SUBGHZ_PROTOCOL_KEELOQ_NAME " error\r\n");
  563. }
  564. MU_TEST(subghz_encoder_linear_test) {
  565. mu_assert(
  566. subghz_encoder_test(EXT_PATH("unit_tests/subghz/linear.sub")),
  567. "Test encoder " SUBGHZ_PROTOCOL_LINEAR_NAME " error\r\n");
  568. }
  569. MU_TEST(subghz_encoder_megacode_test) {
  570. mu_assert(
  571. subghz_encoder_test(EXT_PATH("unit_tests/subghz/megacode.sub")),
  572. "Test encoder " SUBGHZ_PROTOCOL_MEGACODE_NAME " error\r\n");
  573. }
  574. MU_TEST(subghz_encoder_holtek_test) {
  575. mu_assert(
  576. subghz_encoder_test(EXT_PATH("unit_tests/subghz/holtek.sub")),
  577. "Test encoder " SUBGHZ_PROTOCOL_HOLTEK_NAME " error\r\n");
  578. }
  579. MU_TEST(subghz_encoder_secplus_v1_test) {
  580. mu_assert(
  581. subghz_encoder_test(EXT_PATH("unit_tests/subghz/security_pls_1_0.sub")),
  582. "Test encoder " SUBGHZ_PROTOCOL_SECPLUS_V1_NAME " error\r\n");
  583. }
  584. MU_TEST(subghz_encoder_secplus_v2_test) {
  585. mu_assert(
  586. subghz_encoder_test(EXT_PATH("unit_tests/subghz/security_pls_2_0.sub")),
  587. "Test encoder " SUBGHZ_PROTOCOL_SECPLUS_V2_NAME " error\r\n");
  588. }
  589. MU_TEST(subghz_encoder_power_smart_test) {
  590. mu_assert(
  591. subghz_encoder_test(EXT_PATH("unit_tests/subghz/power_smart.sub")),
  592. "Test encoder " SUBGHZ_PROTOCOL_POWER_SMART_NAME " error\r\n");
  593. }
  594. MU_TEST(subghz_encoder_marantec_test) {
  595. mu_assert(
  596. subghz_encoder_test(EXT_PATH("unit_tests/subghz/marantec.sub")),
  597. "Test encoder " SUBGHZ_PROTOCOL_MARANTEC_NAME " error\r\n");
  598. }
  599. MU_TEST(subghz_encoder_bett_test) {
  600. mu_assert(
  601. subghz_encoder_test(EXT_PATH("unit_tests/subghz/bett.sub")),
  602. "Test encoder " SUBGHZ_PROTOCOL_BETT_NAME " error\r\n");
  603. }
  604. MU_TEST(subghz_encoder_doitrand_test) {
  605. mu_assert(
  606. subghz_encoder_test(EXT_PATH("unit_tests/subghz/doitrand.sub")),
  607. "Test encoder " SUBGHZ_PROTOCOL_DOITRAND_NAME " error\r\n");
  608. }
  609. MU_TEST(subghz_encoder_phoenix_v2_test) {
  610. mu_assert(
  611. subghz_encoder_test(EXT_PATH("unit_tests/subghz/phoenix_v2.sub")),
  612. "Test encoder " SUBGHZ_PROTOCOL_PHOENIX_V2_NAME " error\r\n");
  613. }
  614. MU_TEST(subghz_encoder_honeywell_wdb_test) {
  615. mu_assert(
  616. subghz_encoder_test(EXT_PATH("unit_tests/subghz/honeywell_wdb.sub")),
  617. "Test encoder " SUBGHZ_PROTOCOL_HONEYWELL_WDB_NAME " error\r\n");
  618. }
  619. MU_TEST(subghz_encoder_magellan_test) {
  620. mu_assert(
  621. subghz_encoder_test(EXT_PATH("unit_tests/subghz/magellan.sub")),
  622. "Test encoder " SUBGHZ_PROTOCOL_MAGELLAN_NAME " error\r\n");
  623. }
  624. MU_TEST(subghz_encoder_intertechno_v3_test) {
  625. mu_assert(
  626. subghz_encoder_test(EXT_PATH("unit_tests/subghz/intertechno_v3.sub")),
  627. "Test encoder " SUBGHZ_PROTOCOL_INTERTECHNO_V3_NAME " error\r\n");
  628. }
  629. MU_TEST(subghz_encoder_clemsa_test) {
  630. mu_assert(
  631. subghz_encoder_test(EXT_PATH("unit_tests/subghz/clemsa.sub")),
  632. "Test encoder " SUBGHZ_PROTOCOL_CLEMSA_NAME " error\r\n");
  633. }
  634. MU_TEST(subghz_encoder_ansonic_test) {
  635. mu_assert(
  636. subghz_encoder_test(EXT_PATH("unit_tests/subghz/ansonic.sub")),
  637. "Test encoder " SUBGHZ_PROTOCOL_ANSONIC_NAME " error\r\n");
  638. }
  639. MU_TEST(subghz_encoder_smc5326_test) {
  640. mu_assert(
  641. subghz_encoder_test(EXT_PATH("unit_tests/subghz/smc5326.sub")),
  642. "Test encoder " SUBGHZ_PROTOCOL_SMC5326_NAME " error\r\n");
  643. }
  644. MU_TEST(subghz_random_test) {
  645. mu_assert(subghz_decode_random_test(TEST_RANDOM_DIR_NAME), "Random test error\r\n");
  646. }
  647. MU_TEST_SUITE(subghz) {
  648. subghz_test_init();
  649. MU_RUN_TEST(subghz_keystore_test);
  650. MU_RUN_TEST(subghz_hal_async_tx_test);
  651. MU_RUN_TEST(subghz_decoder_came_atomo_test);
  652. MU_RUN_TEST(subghz_decoder_came_test);
  653. MU_RUN_TEST(subghz_decoder_came_twee_test);
  654. MU_RUN_TEST(subghz_decoder_faac_slh_test);
  655. MU_RUN_TEST(subghz_decoder_gate_tx_test);
  656. MU_RUN_TEST(subghz_decoder_hormann_hsm_test);
  657. MU_RUN_TEST(subghz_decoder_ido_test);
  658. MU_RUN_TEST(subghz_decoder_keelog_test);
  659. MU_RUN_TEST(subghz_decoder_kia_seed_test);
  660. MU_RUN_TEST(subghz_decoder_nero_radio_test);
  661. MU_RUN_TEST(subghz_decoder_nero_sketch_test);
  662. MU_RUN_TEST(subghz_decoder_nice_flo_test);
  663. MU_RUN_TEST(subghz_decoder_nice_flor_s_test);
  664. MU_RUN_TEST(subghz_decoder_princeton_test);
  665. MU_RUN_TEST(subghz_decoder_scher_khan_magic_code_test);
  666. MU_RUN_TEST(subghz_decoder_somfy_keytis_test);
  667. MU_RUN_TEST(subghz_decoder_somfy_telis_test);
  668. MU_RUN_TEST(subghz_decoder_star_line_test);
  669. MU_RUN_TEST(subghz_decoder_linear_test);
  670. MU_RUN_TEST(subghz_decoder_megacode_test);
  671. MU_RUN_TEST(subghz_decoder_secplus_v1_test);
  672. MU_RUN_TEST(subghz_decoder_secplus_v2_test);
  673. MU_RUN_TEST(subghz_decoder_holtek_test);
  674. MU_RUN_TEST(subghz_decoder_power_smart_test);
  675. MU_RUN_TEST(subghz_decoder_marantec_test);
  676. MU_RUN_TEST(subghz_decoder_bett_test);
  677. MU_RUN_TEST(subghz_decoder_doitrand_test);
  678. MU_RUN_TEST(subghz_decoder_phoenix_v2_test);
  679. MU_RUN_TEST(subghz_decoder_honeywell_wdb_test);
  680. MU_RUN_TEST(subghz_decoder_magellan_test);
  681. MU_RUN_TEST(subghz_decoder_intertechno_v3_test);
  682. MU_RUN_TEST(subghz_decoder_clemsa_test);
  683. MU_RUN_TEST(subghz_decoder_ansonic_test);
  684. MU_RUN_TEST(subghz_decoder_smc5326_test);
  685. MU_RUN_TEST(subghz_encoder_princeton_test);
  686. MU_RUN_TEST(subghz_encoder_came_test);
  687. MU_RUN_TEST(subghz_encoder_came_twee_test);
  688. MU_RUN_TEST(subghz_encoder_gate_tx_test);
  689. MU_RUN_TEST(subghz_encoder_nice_flo_test);
  690. MU_RUN_TEST(subghz_encoder_keelog_test);
  691. MU_RUN_TEST(subghz_encoder_linear_test);
  692. MU_RUN_TEST(subghz_encoder_megacode_test);
  693. MU_RUN_TEST(subghz_encoder_holtek_test);
  694. MU_RUN_TEST(subghz_encoder_secplus_v1_test);
  695. MU_RUN_TEST(subghz_encoder_secplus_v2_test);
  696. MU_RUN_TEST(subghz_encoder_power_smart_test);
  697. MU_RUN_TEST(subghz_encoder_marantec_test);
  698. MU_RUN_TEST(subghz_encoder_bett_test);
  699. MU_RUN_TEST(subghz_encoder_doitrand_test);
  700. MU_RUN_TEST(subghz_encoder_phoenix_v2_test);
  701. MU_RUN_TEST(subghz_encoder_honeywell_wdb_test);
  702. MU_RUN_TEST(subghz_encoder_magellan_test);
  703. MU_RUN_TEST(subghz_encoder_intertechno_v3_test);
  704. MU_RUN_TEST(subghz_encoder_clemsa_test);
  705. MU_RUN_TEST(subghz_encoder_ansonic_test);
  706. MU_RUN_TEST(subghz_encoder_smc5326_test);
  707. MU_RUN_TEST(subghz_random_test);
  708. subghz_test_deinit();
  709. }
  710. int run_minunit_test_subghz() {
  711. MU_RUN_SUITE(subghz);
  712. return MU_EXIT_CODE;
  713. }