subghz_test.c 32 KB

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