SubGhz: add protocol Intertechno_V3 (#1622)
* SubGhz: add decode Intertechno_V3 * SubGhz: add encoder Intertechno V3 * SubGhz: add uni_test Intertechno V3 * SubGhz: fix syntax * SubGhz: add Intertechno V3 dimming mode * SubGhz: fix parsing event Magellen protocol * SubGhz: fix syntax * SubGhz: fix encoder dimm mode Co-authored-by: Aleksandr Kutuzov <alleteam@gmail.com>
This commit is contained in:
		
							parent
							
								
									311b60f815
								
							
						
					
					
						commit
						0ee4573a65
					
				| @ -13,7 +13,7 @@ | |||||||
| #define CAME_ATOMO_DIR_NAME EXT_PATH("subghz/assets/came_atomo") | #define CAME_ATOMO_DIR_NAME EXT_PATH("subghz/assets/came_atomo") | ||||||
| #define NICE_FLOR_S_DIR_NAME EXT_PATH("subghz/assets/nice_flor_s") | #define NICE_FLOR_S_DIR_NAME EXT_PATH("subghz/assets/nice_flor_s") | ||||||
| #define TEST_RANDOM_DIR_NAME EXT_PATH("unit_tests/subghz/test_random_raw.sub") | #define TEST_RANDOM_DIR_NAME EXT_PATH("unit_tests/subghz/test_random_raw.sub") | ||||||
| #define TEST_RANDOM_COUNT_PARSE 196 | #define TEST_RANDOM_COUNT_PARSE 208 | ||||||
| #define TEST_TIMEOUT 10000 | #define TEST_TIMEOUT 10000 | ||||||
| 
 | 
 | ||||||
| static SubGhzEnvironment* environment_handler; | static SubGhzEnvironment* environment_handler; | ||||||
| @ -127,7 +127,7 @@ static bool subghz_decode_random_test(const char* path) { | |||||||
|         } |         } | ||||||
|         subghz_file_encoder_worker_free(file_worker_encoder_handler); |         subghz_file_encoder_worker_free(file_worker_encoder_handler); | ||||||
|     } |     } | ||||||
|     FURI_LOG_T(TAG, "\r\n Decoder count parse \033[0;33m%d\033[0m ", subghz_test_decoder_count); |     FURI_LOG_D(TAG, "\r\n Decoder count parse \033[0;33m%d\033[0m ", subghz_test_decoder_count); | ||||||
|     if(furi_get_tick() - test_start > TEST_TIMEOUT * 10) { |     if(furi_get_tick() - test_start > TEST_TIMEOUT * 10) { | ||||||
|         printf("\033[0;31mRandom test ERROR TimeOut\033[0m\r\n"); |         printf("\033[0;31mRandom test ERROR TimeOut\033[0m\r\n"); | ||||||
|         return false; |         return false; | ||||||
| @ -419,6 +419,14 @@ MU_TEST(subghz_decoder_magellen_test) { | |||||||
|         "Test decoder " SUBGHZ_PROTOCOL_MAGELLEN_NAME " error\r\n"); |         "Test decoder " SUBGHZ_PROTOCOL_MAGELLEN_NAME " error\r\n"); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | MU_TEST(subghz_decoder_intertechno_v3_test) { | ||||||
|  |     mu_assert( | ||||||
|  |         subghz_decoder_test( | ||||||
|  |             EXT_PATH("unit_tests/subghz/intertechno_v3_raw.sub"), | ||||||
|  |             SUBGHZ_PROTOCOL_INTERTECHNO_V3_NAME), | ||||||
|  |         "Test decoder " SUBGHZ_PROTOCOL_INTERTECHNO_V3_NAME " error\r\n"); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| //test encoders
 | //test encoders
 | ||||||
| MU_TEST(subghz_encoder_princeton_test) { | MU_TEST(subghz_encoder_princeton_test) { | ||||||
|     mu_assert( |     mu_assert( | ||||||
| @ -528,6 +536,12 @@ MU_TEST(subghz_encoder_magellen_test) { | |||||||
|         "Test encoder " SUBGHZ_PROTOCOL_MAGELLEN_NAME " error\r\n"); |         "Test encoder " SUBGHZ_PROTOCOL_MAGELLEN_NAME " error\r\n"); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | MU_TEST(subghz_encoder_intertechno_v3_test) { | ||||||
|  |     mu_assert( | ||||||
|  |         subghz_encoder_test(EXT_PATH("unit_tests/subghz/intertechno_v3.sub")), | ||||||
|  |         "Test encoder " SUBGHZ_PROTOCOL_INTERTECHNO_V3_NAME " error\r\n"); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| MU_TEST(subghz_random_test) { | MU_TEST(subghz_random_test) { | ||||||
|     mu_assert(subghz_decode_random_test(TEST_RANDOM_DIR_NAME), "Random test error\r\n"); |     mu_assert(subghz_decode_random_test(TEST_RANDOM_DIR_NAME), "Random test error\r\n"); | ||||||
| } | } | ||||||
| @ -566,6 +580,7 @@ MU_TEST_SUITE(subghz) { | |||||||
|     MU_RUN_TEST(subghz_decoder_phoenix_v2_test); |     MU_RUN_TEST(subghz_decoder_phoenix_v2_test); | ||||||
|     MU_RUN_TEST(subghz_decoder_honeywell_wdb_test); |     MU_RUN_TEST(subghz_decoder_honeywell_wdb_test); | ||||||
|     MU_RUN_TEST(subghz_decoder_magellen_test); |     MU_RUN_TEST(subghz_decoder_magellen_test); | ||||||
|  |     MU_RUN_TEST(subghz_decoder_intertechno_v3_test); | ||||||
| 
 | 
 | ||||||
|     MU_RUN_TEST(subghz_encoder_princeton_test); |     MU_RUN_TEST(subghz_encoder_princeton_test); | ||||||
|     MU_RUN_TEST(subghz_encoder_came_test); |     MU_RUN_TEST(subghz_encoder_came_test); | ||||||
| @ -585,6 +600,7 @@ MU_TEST_SUITE(subghz) { | |||||||
|     MU_RUN_TEST(subghz_encoder_phoenix_v2_test); |     MU_RUN_TEST(subghz_encoder_phoenix_v2_test); | ||||||
|     MU_RUN_TEST(subghz_encoder_honeywell_wdb_test); |     MU_RUN_TEST(subghz_encoder_honeywell_wdb_test); | ||||||
|     MU_RUN_TEST(subghz_encoder_magellen_test); |     MU_RUN_TEST(subghz_encoder_magellen_test); | ||||||
|  |     MU_RUN_TEST(subghz_encoder_intertechno_v3_test); | ||||||
| 
 | 
 | ||||||
|     MU_RUN_TEST(subghz_random_test); |     MU_RUN_TEST(subghz_random_test); | ||||||
|     subghz_test_deinit(); |     subghz_test_deinit(); | ||||||
|  | |||||||
							
								
								
									
										7
									
								
								assets/unit_tests/subghz/intertechno_v3.sub
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								assets/unit_tests/subghz/intertechno_v3.sub
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,7 @@ | |||||||
|  | Filetype: Flipper SubGhz Key File | ||||||
|  | Version: 1 | ||||||
|  | Frequency: 433920000 | ||||||
|  | Preset: FuriHalSubGhzPresetOok650Async | ||||||
|  | Protocol: Intertechno_V3 | ||||||
|  | Bit: 32 | ||||||
|  | Key: 00 00 00 00 3F 86 C5 9F | ||||||
							
								
								
									
										13
									
								
								assets/unit_tests/subghz/intertechno_v3_raw.sub
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								assets/unit_tests/subghz/intertechno_v3_raw.sub
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,13 @@ | |||||||
|  | Filetype: Flipper SubGhz RAW File | ||||||
|  | Version: 1 | ||||||
|  | Frequency: 433920000 | ||||||
|  | Preset: FuriHalSubGhzPresetOok650Async | ||||||
|  | Protocol: RAW | ||||||
|  | RAW_Data: 15041 -66 15883 -66 12643 -66 12681 -66 3413 -68 2713 -68 33389 -66 1445 -66 1279 -68 1027 -66 6911 -98 25229 -66 3967 -100 3019 -100 6131 -66 955 -66 3605 -66 12411 -98 1419 -66 3593 -68 2753 -66 2457 -66 6007 -66 627 -100 1597 -66 3071 -98 22749 -66 333 -66 12829 -66 4313 -132 855 -66 44097 -64 20391 -98 29999 -66 3539 -98 557 -66 1489 -100 4081 -100 3857 -64 2895 -132 2261 -166 3089 -66 2429 -68 34467 -66 3585 -66 3087 -66 3329 -132 5287 -66 1063 -98 15259 -100 2535 -66 995 -66 13057 -100 24233 -68 531 -100 26415 -66 1761 -100 2717 -66 4071 -100 12191 -66 23367 -68 2323 -66 19809 -248 245 -1388 255 -242 275 -1358 273 -1370 277 -246 277 -1368 275 -246 275 -1362 275 -244 275 -1364 275 -244 275 -1362 275 -244 275 -1328 273 -278 273 -1358 275 -246 275 -238 263 -1384 275 -246 273 -1358 275 -244 273 -1358 275 -246 275 -1360 275 -1344 277 -246 275 -1358 275 -244 275 -234 263 -1382 277 -1344 277 -246 279 -1362 275 -246 271 -234 261 -1380 275 -246 273 -1360 275 -246 275 -1366 277 -1340 277 -248 279 -238 263 -1382 275 -1344 277 -246 279 -1364 277 -244 275 -234 263 -1382 277 -244 273 -1358 275 -1344 277 -248 279 -1368 275 -244 273 -1360 239 -280 271 -1358 275 -244 275 -1358 275 -174 269 -10298 289 -2660 267 -238 299 -1356 275 -244 275 -1356 275 -1344 277 -248 277 -1360 275 -246 275 -1328 309 -244 273 -1358 277 -244 275 -1356 275 -246 273 -1326 309 -244 275 -1356 275 -246 273 -234 263 -1380 277 -246 273 -1326 309 -244 273 -1356 277 -246 277 -1358 275 -1338 279 -248 279 -1364 275 -246 273 -234 261 -1380 277 -1344 279 -250 277 -1330 309 -244 273 -232 261 -1384 275 -246 273 -1356 275 -248 275 -1360 275 -1340 279 -248 277 -236 263 -1380 277 -1342 279 -248 279 -1366 275 -246 273 -234 263 -1380 275 -246 275 -1358 275 -1340 279 -248 281 -1336 309 -244 273 -1358 275 -246 273 -1360 275 -244 273 -1358 275 -176 267 -10306 257 -2646 299 -234 301 -1354 277 -246 275 -1356 277 -1340 279 -250 279 -1332 309 -244 275 -1358 275 -248 273 -1326 309 -246 273 -1326 309 -244 275 -1356 277 -248 275 -1328 309 -246 273 -234 261 -1382 277 -246 277 -1326 309 -244 275 -1358 277 -246 277 -1356 277 -1346 277 -250 277 -1358 277 -246 275 -234 263 -1382 279 -1346 279 -248 281 -1330 307 -246 273 -236 261 -1380 277 -246 277 -1360 277 -246 277 -1360 275 -1344 279 -248 279 -236 263 -1384 277 -1340 279 -250 281 -1338 307 -246 271 -234 261 -1384 277 -246 275 -1356 277 -1340 279 -250 283 -1336 309 -246 273 -1356 277 -246 273 -1360 277 -246 | ||||||
|  | RAW_Data: 275 -1328 309 -174 269 -10296 289 -2648 267 -238 299 -1356 277 -246 275 -1324 307 -1342 279 -250 277 -1330 309 -244 275 -1362 277 -244 275 -1356 275 -248 273 -1328 309 -244 273 -1328 309 -244 275 -1360 277 -246 275 -234 259 -1384 277 -246 275 -1360 275 -246 273 -1358 277 -248 277 -1362 275 -1344 277 -248 277 -1328 307 -246 273 -236 261 -1384 277 -1348 279 -248 279 -1360 277 -246 273 -234 263 -1388 275 -246 275 -1360 277 -248 279 -1368 277 -1344 279 -248 279 -240 265 -1386 275 -1342 279 -286 247 -1372 275 -248 275 -238 265 -1386 277 -248 275 -1360 275 -1344 277 -286 247 -1374 275 -246 275 -1362 277 -246 275 -1360 277 -248 275 -1326 307 -174 269 -10290 287 -2654 269 -236 301 -1352 275 -248 273 -1326 311 -1340 277 -248 277 -1328 309 -244 273 -1358 275 -244 275 -1326 309 -244 273 -1356 277 -244 273 -1356 275 -246 275 -1358 275 -244 275 -234 261 -1382 277 -246 273 -1358 275 -246 273 -1360 277 -246 273 -1324 309 -1340 277 -248 277 -1328 307 -246 271 -234 259 -1382 277 -1346 279 -248 277 -1330 309 -244 271 -232 259 -1382 277 -244 275 -1356 277 -248 273 -1354 277 -1342 277 -248 275 -236 261 -1380 277 -1344 277 -248 279 -1330 307 -246 273 -234 261 -1378 277 -246 273 -1356 277 -1342 277 -248 277 -1330 309 -244 273 -1322 307 -246 273 -1326 309 -244 273 -1322 309 -176 267 -10298 257 -2682 265 -236 299 -1324 309 -248 273 -1324 311 -1342 277 -246 279 -1360 277 -244 275 -1362 275 -244 275 -1358 275 -244 275 -1360 275 -246 273 -1360 275 -244 277 -1360 275 -246 273 -234 263 -1384 275 -246 273 -1358 275 -246 275 -1360 277 -246 277 -1356 277 -1342 279 -248 277 -1364 275 -244 275 -234 261 -1384 275 -1344 277 -250 279 -1366 275 -246 273 -236 263 -1384 277 -246 275 -1358 277 -246 277 -1362 277 -1342 279 -248 279 -236 265 -1382 277 -1346 277 -248 281 -1366 275 -246 275 -234 265 -1384 275 -246 273 -1358 277 -1344 279 -248 279 -1364 275 -244 275 -1324 309 -246 273 -1324 307 -246 273 -1326 309 -174 267 -118796 133 -100 131 -892 329 -166 199 -132 131 -166 99 -100 265 -264 4663 -134 4889 -100 365 -98 5921 -100 5903 -68 4877 -98 2953 -98 1645 -64 1687 -66 981 -98 10769 -66 18319 -66 4831 -66 13301 -66 893 -132 5967 -100 15949 -66 3749 -66 497 -100 625 -66 1147 -66 469 -66 1261 -66 3651 -100 265 -100 26741 -68 6873 -66 4485 -100 2667 -68 3159 -68 2857 -132 2655 -66 12903 -66 1277 -66 1711 -66 787 -100 1327 -198 727 -64 1677 -100 1187 -66 1019 -66 891 -66 4303 -100 11297 -66 3923 -254 253 -1380 247 -292 253 -1344 | ||||||
|  | RAW_Data: 277 -1346 277 -250 279 -1364 275 -244 275 -1362 275 -244 275 -1356 275 -246 273 -1358 241 -278 273 -1356 275 -246 273 -1360 275 -246 273 -234 263 -1382 275 -244 273 -1358 275 -246 273 -1360 275 -246 273 -1358 275 -1340 277 -248 277 -1362 275 -246 273 -234 261 -1380 277 -1344 277 -248 279 -1362 275 -244 273 -236 261 -1380 275 -244 275 -1360 275 -246 275 -1358 275 -1346 277 -246 275 -236 263 -1384 275 -1342 277 -248 277 -1364 277 -244 273 -234 261 -1378 277 -246 273 -1356 277 -1340 277 -248 281 -1334 307 -246 271 -1356 275 -246 273 -1358 275 -244 273 -1326 309 -174 267 -10296 257 -2650 297 -232 263 -1384 277 -244 273 -1358 275 -1340 279 -248 279 -1328 309 -244 275 -1328 307 -244 273 -1356 275 -244 275 -1358 275 -246 273 -1324 309 -244 275 -1328 307 -244 273 -234 261 -1382 275 -246 273 -1326 309 -244 273 -1358 275 -246 273 -1358 275 -1338 279 -248 279 -1330 309 -244 273 -232 261 -1380 277 -1344 279 -248 279 -1330 309 -244 271 -234 261 -1382 275 -246 273 -1358 277 -244 275 -1330 309 -1338 277 -246 277 -236 263 -1380 277 -1342 277 -248 279 -1364 275 -246 273 -232 261 -1380 275 -248 275 -1328 307 -1338 277 -248 279 -1334 309 -244 271 -1358 275 -244 275 -1324 307 -246 271 -1328 309 -174 265 -10270 291 -2640 297 -232 297 -1350 277 -248 275 -1326 309 -1340 277 -248 277 -1328 309 -244 273 -1358 275 -246 273 -1326 309 -244 273 -1354 275 -246 273 -1330 307 -244 273 -1358 275 -246 273 -234 263 -1380 275 -246 273 -1358 275 -246 273 -1360 275 -244 273 -1358 275 -1340 277 -248 279 -1364 275 -244 273 -232 261 -1380 277 -1342 279 -250 279 -1332 307 -244 271 -234 261 -1378 277 -246 273 -1358 275 -248 275 -1360 275 -1340 277 -248 275 -236 263 -1382 277 -1344 277 -246 277 -1364 275 -246 273 -234 259 -1380 275 -246 273 -1362 275 -1342 275 -248 277 -1334 309 -244 271 -1356 275 -244 275 -1326 307 -244 273 -1356 275 -176 267 -10290 289 -2644 267 -238 301 -1320 309 -246 273 -1324 309 -1340 277 -248 277 -1328 307 -246 273 -1326 307 -246 273 -1324 309 -246 273 -1322 309 -246 273 -1322 307 -246 275 -1326 309 -246 273 -234 259 -1382 275 -246 275 -1322 309 -246 273 -1326 309 -246 273 -1326 309 -1340 277 -248 275 -1326 309 -246 273 -232 261 -1380 279 -1346 277 -250 277 -1328 309 -244 271 -232 261 -1380 277 -246 273 -1358 275 -248 273 -1328 307 -1340 277 -248 277 -236 261 -1380 277 -1344 277 -248 279 -1328 309 -244 275 -232 261 -1378 277 -248 273 -1326 309 -1344 277 -248 277 -1358 277 -246 273 -1328 307 -244 271 -1324 309 -244 | ||||||
|  | RAW_Data: 273 -1324 309 -174 267 -10270 289 -2638 297 -234 297 -1352 275 -248 275 -1328 307 -1340 277 -248 275 -1330 309 -244 273 -1358 275 -244 275 -1326 309 -244 271 -1356 275 -244 275 -1326 307 -246 273 -1326 309 -244 273 -234 261 -1378 275 -248 275 -1326 309 -244 271 -1356 277 -248 273 -1328 309 -1338 277 -248 277 -1328 309 -244 271 -232 261 -1380 277 -1348 279 -248 277 -1328 307 -246 271 -234 259 -1384 275 -244 275 -1356 277 -246 275 -1326 309 -1344 275 -248 275 -236 261 -1378 277 -1342 277 -250 279 -1334 309 -244 271 -232 261 -1380 277 -246 273 -1326 307 -1344 277 -248 277 -1328 309 -246 273 -1326 309 -244 271 -1324 309 -244 273 -1324 307 -176 267 -10288 287 -2618 299 -236 299 -1354 277 -244 273 -1326 307 -1340 279 -248 275 -1328 309 -244 275 -1326 309 -246 273 -1324 307 -246 273 -1322 309 -244 273 -1322 309 -244 275 -1328 309 -246 273 -232 261 -1380 277 -246 275 -1324 309 -244 273 -1356 277 -246 275 -1324 309 -1340 279 -246 277 -1328 309 -244 273 -232 261 -1382 277 -1344 279 -250 277 -1324 309 -246 273 -234 261 -1380 277 -246 273 -1358 277 -246 273 -1328 309 -1340 277 -248 275 -236 261 -1380 275 -1344 279 -248 279 -1360 277 -244 273 -234 261 -1380 277 -246 275 -1354 277 -1344 277 -248 277 -1328 311 -246 273 -1324 307 -244 273 -1324 309 -244 273 -1320 309 -176 269 -118210 761 -168 267 -66 563 -132 99 -132 3543 -66 5345 -100 4355 -66 4617 -68 20503 -166 2379 -132 293 -98 4117 -66 1151 -98 3353 -66 3485 -66 2491 -66 6133 -66 233 -68 16307 -68 16959 -98 357 -66 5419 -134 799 -100 327 -100 791 -66 2481 -66 963 -100 3481 -98 1679 -134 2473 -100 227 -68 3087 -66 11527 -130 4305 -98 435 -66 563 -100 2887 -100 267 -66 1787 -66 9655 -66 4793 -100 2119 -66 359 -98 1313 -132 3393 -234 995 -66 2681 -98 99 -130 1379 -100 3757 -100 21695 -132 5135 -100 693 -98 4631 -100 2325 -68 4937 -66 10409 -98 897 -100 1287 -66 2565 -66 3753 -66 4055 -66 2023 -68 1961 -68 629 -66 431 -66 5039 -66 2155 -100 2673 -66 1163 -98 6539 -100 825 -66 1197 -100 3053 -66 13973 -68 15515 -100 1861 -66 1027 -66 797 -98 959 -98 787 -132 787 -64 3811 -132 1747 -66 6683 -66 1033 -68 24927 -66 1259 -100 1125 -68 663 -66 1687 -66 4357 -132 4567 -66 3969 -98 3317 -132 433 -134 6043 -66 3249 -100 431 -98 2367 -100 11265 -66 5085 -68 2355 -64 1815 -66 1395 -274 241 -1366 275 -244 275 -1362 275 -1338 277 -284 243 -1368 239 -278 275 -1362 275 -244 275 -1360 241 -278 273 -1356 275 -246 275 -1360 239 -280 275 -1360 | ||||||
|  | RAW_Data: 275 -244 275 -234 263 -1386 239 -280 273 -1356 275 -244 273 -1360 275 -244 277 -1364 275 -1336 277 -248 277 -1366 275 -244 273 -234 263 -1386 275 -1340 277 -248 279 -1364 275 -244 275 -234 263 -1384 273 -244 275 -1358 275 -244 275 -1364 275 -1342 275 -248 277 -236 265 -1384 275 -1340 277 -282 243 -1366 275 -246 273 -236 263 -1382 277 -244 275 -1358 275 -1342 277 -248 277 -1364 275 -246 275 -1360 239 -280 273 -1358 241 -278 275 -1356 275 -210 233 -10302 257 -2652 297 -232 297 -1354 277 -244 275 -1358 275 -1340 279 -248 279 -1360 275 -246 275 -1360 275 -246 273 -1360 275 -244 275 -1328 309 -242 273 -1324 309 -244 275 -1360 275 -246 273 -234 261 -1384 275 -246 273 -1358 275 -244 275 -1358 277 -248 273 -1358 275 -1340 279 -248 277 -1334 307 -242 273 -232 261 -1380 277 -1348 277 -250 277 -1364 275 -244 275 -234 261 -1380 277 -244 275 -1358 277 -246 277 -1360 277 -1342 275 -248 275 -236 263 -1380 277 -1344 277 -248 279 -1368 275 -244 275 -232 261 -1382 277 -244 275 -1356 275 -1344 277 -248 279 -1362 275 -246 275 -1360 275 -246 273 -1356 275 -246 273 -1356 275 -176 267 -10302 257 -2648 299 -234 297 -1352 277 -246 275 -1326 309 -1340 279 -248 277 -1330 309 -244 275 -1328 309 -244 273 -1324 309 -244 275 -1324 309 -246 273 -1324 307 -246 275 -1328 309 -244 273 -234 261 -1378 277 -248 275 -1328 309 -244 273 -1356 277 -248 275 -1326 309 -1344 277 -248 275 -1326 309 -246 273 -234 259 -1380 277 -1348 281 -248 279 -1328 307 -246 273 -234 259 -1382 277 -246 275 -1360 275 -248 275 -1324 309 -1340 279 -248 277 -238 261 -1382 277 -1344 277 -248 279 -1330 311 -244 273 -234 259 -1378 277 -248 275 -1326 309 -1340 279 -248 279 -1336 307 -246 271 -1324 309 -244 275 -1324 307 -246 273 -1326 309 -174 269 -10296 257 -2648 299 -234 297 -1352 277 -248 273 -1326 309 -1342 277 -248 277 -1328 309 -246 275 -1328 309 -244 273 -1326 309 -244 273 -1322 309 -244 273 -1328 307 -244 275 -1328 309 -246 273 -234 261 -1382 277 -246 275 -1326 309 -244 273 -1352 277 -248 275 -1330 309 -1340 277 -248 277 -1328 309 -244 275 -232 261 -1384 277 -1342 279 -250 279 -1328 309 -244 273 -234 263 -1380 277 -246 273 -1360 277 -246 275 -1326 309 -1340 277 -250 277 -236 263 -1382 277 -1342 277 -248 279 -1362 277 -246 273 -234 263 -1382 277 -244 275 -1356 277 -1340 279 -248 279 -1362 275 -246 275 -1328 307 -246 273 -1356 275 -246 273 -1356 275 -174 269 -10292 287 -2650 269 -236 301 -1354 275 -248 273 -1358 275 -1340 279 -248 277 -1332 307 -246 275 -1328 | ||||||
|  | RAW_Data: 309 -244 273 -1324 309 -244 273 -1356 275 -246 273 -1358 275 -244 277 -1330 309 -244 273 -234 261 -1382 277 -244 275 -1358 275 -246 273 -1356 277 -248 275 -1360 275 -1340 277 -248 277 -1360 275 -246 273 -236 261 -1382 279 -1344 279 -248 279 -1360 277 -244 273 -234 261 -1380 277 -246 275 -1360 277 -246 273 -1360 275 -1342 279 -248 275 -236 263 -1382 275 -1344 279 -248 279 -1362 277 -246 273 -234 263 -1380 277 -246 275 -1356 275 -1342 277 -248 281 -1336 307 -246 271 -1354 277 -246 275 -1328 307 -244 273 -1352 277 -176 269 -10300 257 -2650 299 -232 297 -1354 277 -246 275 -1356 277 -1342 277 -248 279 -1328 309 -244 275 -1360 275 -246 273 -1328 307 -246 273 -1356 277 -246 277 -1326 309 -244 277 -1360 277 -246 273 -234 263 -1384 277 -246 275 -1324 309 -246 275 -1358 277 -246 277 -1360 277 -1344 277 -248 277 -1326 309 -246 273 -236 261 -1382 277 -1348 279 -250 281 -1330 307 -246 273 -234 263 -1386 277 -244 275 -1356 277 -248 277 -1362 277 -1342 277 -250 277 -238 263 -1384 277 -1342 277 -250 281 -1332 309 -246 273 -234 263 -1380 277 -246 275 -1360 277 -1342 279 -248 281 -1334 307 -246 273 -1356 275 -248 275 -1328 309 -244 275 -1324 309 -176 269 -115034 163 -362 67 -894 529 -166 14663 -98 4135 -66 3681 -100 299 -68 9829 -66 3517 -64 21569 -66 3251 -66 2209 -64 23701 -66 3359 -68 1057 -66 723 -66 299 -134 765 -66 589 -98 1687 -134 2153 -66 3081 -68 10447 -66 11643 -66 2451 -66 2277 -66 2897 -66 755 -100 5539 -64 5117 -132 4867 -134 3931 -64 625 -66 1317 -98 11597 -66 2255 -66 1165 -66 1123 -66 6371 -100 699 -68 1811 -66 621 -68 2191 -64 1291 -134 3003 -66 2423 -64 1463 -66 663 -100 1127 -100 6169 -100 489 -100 6087 -100 2027 -66 1195 -66 13195 -66 557 -66 40423 -98 1919 -100 1061 -132 201 -66 2553 -132 12549 -66 1789 -100 921 -134 1067 -66 729 -66 10029 -66 3909 -100 265 -100 16017 -134 21177 -68 2461 -66 2215 -68 1197 -66 5911 -66 2645 -66 3419 -132 16275 -64 5091 -68 2123 -66 2677 -64 10305 -66 12381 -100 427 -166 25331 -66 2457 -66 11859 -248 279 -1368 275 -246 275 -1360 275 -1340 277 -246 279 -1364 239 -278 275 -1358 275 -244 275 -1362 239 -278 273 -1358 239 -280 271 -1360 241 -278 273 -1360 275 -244 275 -234 261 -1384 239 -280 273 -1356 275 -244 273 -1360 275 -244 275 -1358 275 -1344 277 -248 275 -1358 275 -244 273 -236 261 -1384 275 -1342 279 -246 279 -1360 275 -244 275 -234 263 -1384 239 -278 273 -1358 275 -244 275 -1362 275 -1342 275 -248 275 -238 263 -1382 275 -1344 275 -248 | ||||||
|  | RAW_Data: 277 -1364 275 -244 273 -234 263 -1380 275 -246 273 -1358 275 -1342 277 -246 279 -1366 275 -244 273 -1362 239 -278 239 -1386 275 -246 273 -1360 241 -208 269 -10290 257 -2686 265 -232 265 -1384 275 -246 275 -1358 275 -1344 277 -248 275 -1358 275 -246 275 -1360 277 -244 273 -1326 309 -244 271 -1354 275 -244 275 -1358 275 -246 273 -1358 275 -246 273 -234 263 -1378 275 -246 275 -1360 275 -244 273 -1356 275 -246 275 -1360 275 -1342 277 -246 277 -1360 275 -246 273 -232 261 -1382 277 -1342 279 -248 279 -1360 275 -244 275 -232 261 -1380 277 -244 275 -1356 277 -246 277 -1360 275 -1342 277 -246 275 -236 263 -1384 275 -1342 277 -248 277 -1362 275 -246 273 -234 261 -1378 277 -246 275 -1328 307 -1340 277 -246 279 -1366 275 -244 273 -1326 307 -244 273 -1324 309 -244 273 -1356 275 -174 267 -10304 255 -2648 297 -230 263 -1382 277 -244 275 -1330 307 -1338 277 -248 277 -1330 309 -244 273 -1356 275 -246 273 -1362 275 -244 273 -1356 275 -244 273 -1326 307 -244 273 -1360 273 -246 273 -236 261 -1380 275 -244 275 -1328 307 -244 273 -1358 275 -244 275 -1360 275 -1342 277 -246 277 -1364 275 -244 271 -232 261 -1384 277 -1340 279 -248 279 -1360 275 -246 273 -234 261 -1380 275 -244 275 -1360 277 -244 275 -1356 275 -1342 279 -246 277 -236 263 -1382 275 -1340 277 -248 279 -1366 275 -246 271 -234 261 -1382 277 -244 275 -1354 275 -1342 277 -248 277 -1364 273 -246 273 -1362 275 -244 271 -1360 275 -244 273 -1358 275 -174 267 -10272 289 -2646 265 -262 261 -1382 277 -244 275 -1356 275 -1342 277 -248 277 -1364 275 -244 275 -1360 275 -244 273 -1358 275 -244 273 -1358 275 -244 273 -1326 307 -244 275 -1358 275 -246 273 -234 261 -1382 275 -246 273 -1358 275 -244 273 -1358 275 -246 275 -1360 275 -1338 277 -248 277 -1362 277 -244 271 -234 261 -1380 277 -1344 279 -248 277 -1332 273 -278 271 -234 261 -1382 275 -244 275 -1356 277 -246 275 -1360 277 -1340 277 -246 277 -234 263 -1384 275 -1342 277 -248 277 -1366 275 -244 273 -234 261 -1380 275 -246 273 -1360 275 -1340 277 -246 279 -1334 307 -244 273 -1356 275 -246 273 -1360 275 -244 271 -1354 277 -174 269 -10300 257 -2648 297 -230 263 -1384 277 -244 273 -1356 277 -1342 277 -248 277 -1362 275 -244 275 -1330 307 -244 273 -1324 309 -244 273 -1324 307 -246 273 -1326 307 -244 273 -1358 275 -246 273 -234 261 -1380 277 -246 273 -1358 275 -244 275 -1354 277 -248 275 -1360 275 -1338 279 -246 277 -1360 275 -244 273 -234 261 -1378 279 -1344 279 -248 279 -1330 309 -244 271 -232 261 -1380 277 -246 273 -1360 | ||||||
|  | RAW_Data: 277 -244 275 -1360 275 -1340 277 -246 277 -236 261 -1380 275 -1346 277 -248 277 -1362 275 -246 273 -234 263 -1380 275 -244 275 -1358 275 -1340 277 -248 279 -1334 309 -244 273 -1324 307 -246 273 -1356 275 -244 273 -1356 275 -174 269 -10302 257 -2644 297 -232 263 -1384 277 -246 275 -1354 275 -1344 277 -248 275 -1360 275 -246 275 -1358 275 -246 273 -1326 307 -246 273 -1324 307 -244 273 -1328 307 -244 273 -1358 275 -244 273 -236 261 -1380 275 -246 273 -1358 275 -244 273 -1358 275 -246 273 -1360 275 -1344 275 -248 275 -1360 275 -244 273 -234 261 -1378 277 -1344 279 -248 277 -1362 275 -246 273 -234 261 -1378 275 -244 275 -1360 275 -246 275 -1358 275 -1344 277 -246 277 -234 263 -1380 275 -1338 279 -246 281 -1368 275 -244 271 -234 261 -1386 275 -244 271 -1358 275 -1342 277 -246 279 -1362 275 -244 275 -1326 273 -278 273 -1358 239 -278 273 -1358 275 -174 267 -127478 195 -964 2317 -66 763 -98 1455 -100 16109 -66 5683 -98 11469 -66 34413 -66 5443 -66 11613 -66 2737 -66 12191 -66 2951 -68 1851 -68 1895 -68 2643  | ||||||
							
								
								
									
										472
									
								
								lib/subghz/protocols/intertechno_v3.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										472
									
								
								lib/subghz/protocols/intertechno_v3.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,472 @@ | |||||||
|  | #include "intertechno_v3.h" | ||||||
|  | 
 | ||||||
|  | #include "../blocks/const.h" | ||||||
|  | #include "../blocks/decoder.h" | ||||||
|  | #include "../blocks/encoder.h" | ||||||
|  | #include "../blocks/generic.h" | ||||||
|  | #include "../blocks/math.h" | ||||||
|  | 
 | ||||||
|  | #define TAG "SubGhzProtocolIntertechnoV3" | ||||||
|  | 
 | ||||||
|  | #define CH_PATTERN "%c%c%c%c" | ||||||
|  | #define CNT_TO_CH(ch) \ | ||||||
|  |     (ch & 0x8 ? '1' : '0'), (ch & 0x4 ? '1' : '0'), (ch & 0x2 ? '1' : '0'), (ch & 0x1 ? '1' : '0') | ||||||
|  | 
 | ||||||
|  | #define INTERTECHNO_V3_DIMMING_COUNT_BIT 36 | ||||||
|  | 
 | ||||||
|  | static const SubGhzBlockConst subghz_protocol_intertechno_v3_const = { | ||||||
|  |     .te_short = 275, | ||||||
|  |     .te_long = 1375, | ||||||
|  |     .te_delta = 150, | ||||||
|  |     .min_count_bit_for_found = 32, | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | struct SubGhzProtocolDecoderIntertechno_V3 { | ||||||
|  |     SubGhzProtocolDecoderBase base; | ||||||
|  | 
 | ||||||
|  |     SubGhzBlockDecoder decoder; | ||||||
|  |     SubGhzBlockGeneric generic; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | struct SubGhzProtocolEncoderIntertechno_V3 { | ||||||
|  |     SubGhzProtocolEncoderBase base; | ||||||
|  | 
 | ||||||
|  |     SubGhzProtocolBlockEncoder encoder; | ||||||
|  |     SubGhzBlockGeneric generic; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | typedef enum { | ||||||
|  |     IntertechnoV3DecoderStepReset = 0, | ||||||
|  |     IntertechnoV3DecoderStepStartSync, | ||||||
|  |     IntertechnoV3DecoderStepFoundSync, | ||||||
|  |     IntertechnoV3DecoderStepStartDuration, | ||||||
|  |     IntertechnoV3DecoderStepSaveDuration, | ||||||
|  |     IntertechnoV3DecoderStepCheckDuration, | ||||||
|  |     IntertechnoV3DecoderStepEndDuration, | ||||||
|  | } IntertechnoV3DecoderStep; | ||||||
|  | 
 | ||||||
|  | const SubGhzProtocolDecoder subghz_protocol_intertechno_v3_decoder = { | ||||||
|  |     .alloc = subghz_protocol_decoder_intertechno_v3_alloc, | ||||||
|  |     .free = subghz_protocol_decoder_intertechno_v3_free, | ||||||
|  | 
 | ||||||
|  |     .feed = subghz_protocol_decoder_intertechno_v3_feed, | ||||||
|  |     .reset = subghz_protocol_decoder_intertechno_v3_reset, | ||||||
|  | 
 | ||||||
|  |     .get_hash_data = subghz_protocol_decoder_intertechno_v3_get_hash_data, | ||||||
|  |     .serialize = subghz_protocol_decoder_intertechno_v3_serialize, | ||||||
|  |     .deserialize = subghz_protocol_decoder_intertechno_v3_deserialize, | ||||||
|  |     .get_string = subghz_protocol_decoder_intertechno_v3_get_string, | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | const SubGhzProtocolEncoder subghz_protocol_intertechno_v3_encoder = { | ||||||
|  |     .alloc = subghz_protocol_encoder_intertechno_v3_alloc, | ||||||
|  |     .free = subghz_protocol_encoder_intertechno_v3_free, | ||||||
|  | 
 | ||||||
|  |     .deserialize = subghz_protocol_encoder_intertechno_v3_deserialize, | ||||||
|  |     .stop = subghz_protocol_encoder_intertechno_v3_stop, | ||||||
|  |     .yield = subghz_protocol_encoder_intertechno_v3_yield, | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | const SubGhzProtocol subghz_protocol_intertechno_v3 = { | ||||||
|  |     .name = SUBGHZ_PROTOCOL_INTERTECHNO_V3_NAME, | ||||||
|  |     .type = SubGhzProtocolTypeStatic, | ||||||
|  |     .flag = SubGhzProtocolFlag_433 | SubGhzProtocolFlag_315 | SubGhzProtocolFlag_868 | | ||||||
|  |             SubGhzProtocolFlag_AM | SubGhzProtocolFlag_Decodable | SubGhzProtocolFlag_Load | | ||||||
|  |             SubGhzProtocolFlag_Save | SubGhzProtocolFlag_Send, | ||||||
|  | 
 | ||||||
|  |     .decoder = &subghz_protocol_intertechno_v3_decoder, | ||||||
|  |     .encoder = &subghz_protocol_intertechno_v3_encoder, | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | void* subghz_protocol_encoder_intertechno_v3_alloc(SubGhzEnvironment* environment) { | ||||||
|  |     UNUSED(environment); | ||||||
|  |     SubGhzProtocolEncoderIntertechno_V3* instance = | ||||||
|  |         malloc(sizeof(SubGhzProtocolEncoderIntertechno_V3)); | ||||||
|  | 
 | ||||||
|  |     instance->base.protocol = &subghz_protocol_intertechno_v3; | ||||||
|  |     instance->generic.protocol_name = instance->base.protocol->name; | ||||||
|  | 
 | ||||||
|  |     instance->encoder.repeat = 10; | ||||||
|  |     instance->encoder.size_upload = 256; | ||||||
|  |     instance->encoder.upload = malloc(instance->encoder.size_upload * sizeof(LevelDuration)); | ||||||
|  |     instance->encoder.is_running = false; | ||||||
|  |     return instance; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void subghz_protocol_encoder_intertechno_v3_free(void* context) { | ||||||
|  |     furi_assert(context); | ||||||
|  |     SubGhzProtocolEncoderIntertechno_V3* instance = context; | ||||||
|  |     free(instance->encoder.upload); | ||||||
|  |     free(instance); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * Generating an upload from data. | ||||||
|  |  * @param instance Pointer to a SubGhzProtocolEncoderIntertechno_V3 instance | ||||||
|  |  * @return true On success | ||||||
|  |  */ | ||||||
|  | static bool subghz_protocol_encoder_intertechno_v3_get_upload( | ||||||
|  |     SubGhzProtocolEncoderIntertechno_V3* instance) { | ||||||
|  |     furi_assert(instance); | ||||||
|  |     size_t index = 0; | ||||||
|  | 
 | ||||||
|  |     //Send header
 | ||||||
|  |     instance->encoder.upload[index++] = | ||||||
|  |         level_duration_make(true, (uint32_t)subghz_protocol_intertechno_v3_const.te_short); | ||||||
|  |     instance->encoder.upload[index++] = | ||||||
|  |         level_duration_make(false, (uint32_t)subghz_protocol_intertechno_v3_const.te_short * 38); | ||||||
|  |     //Send sync
 | ||||||
|  |     instance->encoder.upload[index++] = | ||||||
|  |         level_duration_make(true, (uint32_t)subghz_protocol_intertechno_v3_const.te_short); | ||||||
|  |     instance->encoder.upload[index++] = | ||||||
|  |         level_duration_make(false, (uint32_t)subghz_protocol_intertechno_v3_const.te_short * 10); | ||||||
|  |     //Send key data
 | ||||||
|  |     for(uint8_t i = instance->generic.data_count_bit; i > 0; i--) { | ||||||
|  |         if((instance->generic.data_count_bit == INTERTECHNO_V3_DIMMING_COUNT_BIT) && (i == 9)) { | ||||||
|  |             //send bit dimm
 | ||||||
|  |             instance->encoder.upload[index++] = | ||||||
|  |                 level_duration_make(true, (uint32_t)subghz_protocol_intertechno_v3_const.te_short); | ||||||
|  |             instance->encoder.upload[index++] = level_duration_make( | ||||||
|  |                 false, (uint32_t)subghz_protocol_intertechno_v3_const.te_short); | ||||||
|  |             instance->encoder.upload[index++] = | ||||||
|  |                 level_duration_make(true, (uint32_t)subghz_protocol_intertechno_v3_const.te_short); | ||||||
|  |             instance->encoder.upload[index++] = level_duration_make( | ||||||
|  |                 false, (uint32_t)subghz_protocol_intertechno_v3_const.te_short); | ||||||
|  |         } else if(bit_read(instance->generic.data, i - 1)) { | ||||||
|  |             //send bit 1
 | ||||||
|  |             instance->encoder.upload[index++] = | ||||||
|  |                 level_duration_make(true, (uint32_t)subghz_protocol_intertechno_v3_const.te_short); | ||||||
|  |             instance->encoder.upload[index++] = | ||||||
|  |                 level_duration_make(false, (uint32_t)subghz_protocol_intertechno_v3_const.te_long); | ||||||
|  |             instance->encoder.upload[index++] = | ||||||
|  |                 level_duration_make(true, (uint32_t)subghz_protocol_intertechno_v3_const.te_short); | ||||||
|  |             instance->encoder.upload[index++] = level_duration_make( | ||||||
|  |                 false, (uint32_t)subghz_protocol_intertechno_v3_const.te_short); | ||||||
|  |         } else { | ||||||
|  |             //send bit 0
 | ||||||
|  |             instance->encoder.upload[index++] = | ||||||
|  |                 level_duration_make(true, (uint32_t)subghz_protocol_intertechno_v3_const.te_short); | ||||||
|  |             instance->encoder.upload[index++] = level_duration_make( | ||||||
|  |                 false, (uint32_t)subghz_protocol_intertechno_v3_const.te_short); | ||||||
|  |             instance->encoder.upload[index++] = | ||||||
|  |                 level_duration_make(true, (uint32_t)subghz_protocol_intertechno_v3_const.te_short); | ||||||
|  |             instance->encoder.upload[index++] = | ||||||
|  |                 level_duration_make(false, (uint32_t)subghz_protocol_intertechno_v3_const.te_long); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     instance->encoder.size_upload = index; | ||||||
|  |     return true; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | bool subghz_protocol_encoder_intertechno_v3_deserialize( | ||||||
|  |     void* context, | ||||||
|  |     FlipperFormat* flipper_format) { | ||||||
|  |     furi_assert(context); | ||||||
|  |     SubGhzProtocolEncoderIntertechno_V3* instance = context; | ||||||
|  |     bool res = false; | ||||||
|  |     do { | ||||||
|  |         if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) { | ||||||
|  |             FURI_LOG_E(TAG, "Deserialize error"); | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |         if((instance->generic.data_count_bit != | ||||||
|  |             subghz_protocol_intertechno_v3_const.min_count_bit_for_found) && | ||||||
|  |            (instance->generic.data_count_bit != INTERTECHNO_V3_DIMMING_COUNT_BIT)) { | ||||||
|  |             FURI_LOG_E(TAG, "Wrong number of bits in key"); | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |         //optional parameter parameter
 | ||||||
|  |         flipper_format_read_uint32( | ||||||
|  |             flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); | ||||||
|  | 
 | ||||||
|  |         subghz_protocol_encoder_intertechno_v3_get_upload(instance); | ||||||
|  |         instance->encoder.is_running = true; | ||||||
|  | 
 | ||||||
|  |         res = true; | ||||||
|  |     } while(false); | ||||||
|  | 
 | ||||||
|  |     return res; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void subghz_protocol_encoder_intertechno_v3_stop(void* context) { | ||||||
|  |     SubGhzProtocolEncoderIntertechno_V3* instance = context; | ||||||
|  |     instance->encoder.is_running = false; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | LevelDuration subghz_protocol_encoder_intertechno_v3_yield(void* context) { | ||||||
|  |     SubGhzProtocolEncoderIntertechno_V3* instance = context; | ||||||
|  | 
 | ||||||
|  |     if(instance->encoder.repeat == 0 || !instance->encoder.is_running) { | ||||||
|  |         instance->encoder.is_running = false; | ||||||
|  |         return level_duration_reset(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     LevelDuration ret = instance->encoder.upload[instance->encoder.front]; | ||||||
|  | 
 | ||||||
|  |     if(++instance->encoder.front == instance->encoder.size_upload) { | ||||||
|  |         instance->encoder.repeat--; | ||||||
|  |         instance->encoder.front = 0; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     return ret; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void* subghz_protocol_decoder_intertechno_v3_alloc(SubGhzEnvironment* environment) { | ||||||
|  |     UNUSED(environment); | ||||||
|  |     SubGhzProtocolDecoderIntertechno_V3* instance = | ||||||
|  |         malloc(sizeof(SubGhzProtocolDecoderIntertechno_V3)); | ||||||
|  |     instance->base.protocol = &subghz_protocol_intertechno_v3; | ||||||
|  |     instance->generic.protocol_name = instance->base.protocol->name; | ||||||
|  |     return instance; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void subghz_protocol_decoder_intertechno_v3_free(void* context) { | ||||||
|  |     furi_assert(context); | ||||||
|  |     SubGhzProtocolDecoderIntertechno_V3* instance = context; | ||||||
|  |     free(instance); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void subghz_protocol_decoder_intertechno_v3_reset(void* context) { | ||||||
|  |     furi_assert(context); | ||||||
|  |     SubGhzProtocolDecoderIntertechno_V3* instance = context; | ||||||
|  |     instance->decoder.parser_step = IntertechnoV3DecoderStepReset; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void subghz_protocol_decoder_intertechno_v3_feed(void* context, bool level, uint32_t duration) { | ||||||
|  |     furi_assert(context); | ||||||
|  |     SubGhzProtocolDecoderIntertechno_V3* instance = context; | ||||||
|  |     switch(instance->decoder.parser_step) { | ||||||
|  |     case IntertechnoV3DecoderStepReset: | ||||||
|  |         if((!level) && | ||||||
|  |            (DURATION_DIFF(duration, subghz_protocol_intertechno_v3_const.te_short * 37) < | ||||||
|  |             subghz_protocol_intertechno_v3_const.te_delta * 15)) { | ||||||
|  |             instance->decoder.parser_step = IntertechnoV3DecoderStepStartSync; | ||||||
|  |         } | ||||||
|  |         break; | ||||||
|  |     case IntertechnoV3DecoderStepStartSync: | ||||||
|  |         if(level && (DURATION_DIFF(duration, subghz_protocol_intertechno_v3_const.te_short) < | ||||||
|  |                      subghz_protocol_intertechno_v3_const.te_delta)) { | ||||||
|  |             instance->decoder.parser_step = IntertechnoV3DecoderStepFoundSync; | ||||||
|  |         } else { | ||||||
|  |             instance->decoder.parser_step = IntertechnoV3DecoderStepReset; | ||||||
|  |         } | ||||||
|  |         break; | ||||||
|  | 
 | ||||||
|  |     case IntertechnoV3DecoderStepFoundSync: | ||||||
|  |         if(!level && (DURATION_DIFF(duration, subghz_protocol_intertechno_v3_const.te_short * 10) < | ||||||
|  |                       subghz_protocol_intertechno_v3_const.te_delta * 3)) { | ||||||
|  |             instance->decoder.parser_step = IntertechnoV3DecoderStepStartDuration; | ||||||
|  |             instance->decoder.decode_data = 0; | ||||||
|  |             instance->decoder.decode_count_bit = 0; | ||||||
|  |         } else { | ||||||
|  |             instance->decoder.parser_step = IntertechnoV3DecoderStepReset; | ||||||
|  |         } | ||||||
|  |         break; | ||||||
|  | 
 | ||||||
|  |     case IntertechnoV3DecoderStepStartDuration: | ||||||
|  |         if(level && (DURATION_DIFF(duration, subghz_protocol_intertechno_v3_const.te_short) < | ||||||
|  |                      subghz_protocol_intertechno_v3_const.te_delta)) { | ||||||
|  |             instance->decoder.parser_step = IntertechnoV3DecoderStepSaveDuration; | ||||||
|  |         } else { | ||||||
|  |             instance->decoder.parser_step = IntertechnoV3DecoderStepReset; | ||||||
|  |         } | ||||||
|  |         break; | ||||||
|  | 
 | ||||||
|  |     case IntertechnoV3DecoderStepSaveDuration: | ||||||
|  |         if(!level) { //save interval
 | ||||||
|  |             if(duration >= (subghz_protocol_intertechno_v3_const.te_short * 11)) { | ||||||
|  |                 instance->decoder.parser_step = IntertechnoV3DecoderStepStartSync; | ||||||
|  |                 if((instance->decoder.decode_count_bit == | ||||||
|  |                     subghz_protocol_intertechno_v3_const.min_count_bit_for_found) || | ||||||
|  |                    (instance->decoder.decode_count_bit == INTERTECHNO_V3_DIMMING_COUNT_BIT)) { | ||||||
|  |                     instance->generic.data = instance->decoder.decode_data; | ||||||
|  |                     instance->generic.data_count_bit = instance->decoder.decode_count_bit; | ||||||
|  | 
 | ||||||
|  |                     if(instance->base.callback) | ||||||
|  |                         instance->base.callback(&instance->base, instance->base.context); | ||||||
|  |                 } | ||||||
|  |                 break; | ||||||
|  |             } | ||||||
|  |             instance->decoder.te_last = duration; | ||||||
|  |             instance->decoder.parser_step = IntertechnoV3DecoderStepCheckDuration; | ||||||
|  |         } else { | ||||||
|  |             instance->decoder.parser_step = IntertechnoV3DecoderStepReset; | ||||||
|  |         } | ||||||
|  |         break; | ||||||
|  |     case IntertechnoV3DecoderStepCheckDuration: | ||||||
|  |         if(level) { | ||||||
|  |             //Add 0 bit
 | ||||||
|  |             if((DURATION_DIFF( | ||||||
|  |                     instance->decoder.te_last, subghz_protocol_intertechno_v3_const.te_short) < | ||||||
|  |                 subghz_protocol_intertechno_v3_const.te_delta) && | ||||||
|  |                (DURATION_DIFF(duration, subghz_protocol_intertechno_v3_const.te_short) < | ||||||
|  |                 subghz_protocol_intertechno_v3_const.te_delta)) { | ||||||
|  |                 subghz_protocol_blocks_add_bit(&instance->decoder, 0); | ||||||
|  |                 instance->decoder.parser_step = IntertechnoV3DecoderStepEndDuration; | ||||||
|  |             } else if( | ||||||
|  |                 //Add 1 bit
 | ||||||
|  |                 (DURATION_DIFF( | ||||||
|  |                      instance->decoder.te_last, subghz_protocol_intertechno_v3_const.te_long) < | ||||||
|  |                  subghz_protocol_intertechno_v3_const.te_delta * 2) && | ||||||
|  |                 (DURATION_DIFF(duration, subghz_protocol_intertechno_v3_const.te_short) < | ||||||
|  |                  subghz_protocol_intertechno_v3_const.te_delta)) { | ||||||
|  |                 subghz_protocol_blocks_add_bit(&instance->decoder, 1); | ||||||
|  |                 instance->decoder.parser_step = IntertechnoV3DecoderStepEndDuration; | ||||||
|  | 
 | ||||||
|  |             } else if( | ||||||
|  |                 //Add dimm_state
 | ||||||
|  |                 (DURATION_DIFF( | ||||||
|  |                      instance->decoder.te_last, subghz_protocol_intertechno_v3_const.te_short) < | ||||||
|  |                  subghz_protocol_intertechno_v3_const.te_delta * 2) && | ||||||
|  |                 (DURATION_DIFF(duration, subghz_protocol_intertechno_v3_const.te_short) < | ||||||
|  |                  subghz_protocol_intertechno_v3_const.te_delta) && | ||||||
|  |                 (instance->decoder.decode_count_bit == 27)) { | ||||||
|  |                 subghz_protocol_blocks_add_bit(&instance->decoder, 0); | ||||||
|  |                 instance->decoder.parser_step = IntertechnoV3DecoderStepEndDuration; | ||||||
|  | 
 | ||||||
|  |             } else | ||||||
|  |                 instance->decoder.parser_step = IntertechnoV3DecoderStepReset; | ||||||
|  |         } else { | ||||||
|  |             instance->decoder.parser_step = IntertechnoV3DecoderStepReset; | ||||||
|  |         } | ||||||
|  |         break; | ||||||
|  | 
 | ||||||
|  |     case IntertechnoV3DecoderStepEndDuration: | ||||||
|  |         if(!level && ((DURATION_DIFF(duration, subghz_protocol_intertechno_v3_const.te_short) < | ||||||
|  |                        subghz_protocol_intertechno_v3_const.te_delta) || | ||||||
|  |                       (DURATION_DIFF(duration, subghz_protocol_intertechno_v3_const.te_long) < | ||||||
|  |                        subghz_protocol_intertechno_v3_const.te_delta * 2))) { | ||||||
|  |             instance->decoder.parser_step = IntertechnoV3DecoderStepStartDuration; | ||||||
|  |         } else { | ||||||
|  |             instance->decoder.parser_step = IntertechnoV3DecoderStepReset; | ||||||
|  |         } | ||||||
|  |         break; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /** 
 | ||||||
|  |  * Analysis of received data | ||||||
|  |  * @param instance Pointer to a SubGhzBlockGeneric* instance | ||||||
|  |  */ | ||||||
|  | static void subghz_protocol_intertechno_v3_check_remote_controller(SubGhzBlockGeneric* instance) { | ||||||
|  |     /*
 | ||||||
|  |  *  A frame is either 32 or 36 bits: | ||||||
|  |  *      | ||||||
|  |  *               _ | ||||||
|  |  *   start bit: | |__________ (T,10T) | ||||||
|  |  *          _   _ | ||||||
|  |  *   '0':  | |_| |_____  (T,T,T,5T) | ||||||
|  |  *          _       _ | ||||||
|  |  *   '1':  | |_____| |_  (T,5T,T,T) | ||||||
|  |  *          _   _ | ||||||
|  |  *   dimm: | |_| |_     (T,T,T,T) | ||||||
|  |  *  | ||||||
|  |  *              _ | ||||||
|  |  *   stop bit: | |____...____ (T,38T) | ||||||
|  |  *  | ||||||
|  |  *  if frame 32 bits | ||||||
|  |  *                     SSSSSSSSSSSSSSSSSSSSSSSSSS all_ch  on/off  ~ch | ||||||
|  |  *  Key:0x3F86C59F  => 00111111100001101100010110   0       1     1111 | ||||||
|  |  *  | ||||||
|  |  *  if frame 36 bits | ||||||
|  |  *                     SSSSSSSSSSSSSSSSSSSSSSSSSS  all_ch dimm  ~ch   dimm_level | ||||||
|  |  *  Key:0x42D2E8856 => 01000010110100101110100010   0      X    0101  0110 | ||||||
|  |  *  | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  |     if(instance->data_count_bit == subghz_protocol_intertechno_v3_const.min_count_bit_for_found) { | ||||||
|  |         instance->serial = (instance->data >> 6) & 0x3FFFFFF; | ||||||
|  |         if((instance->data >> 5) & 0x1) { | ||||||
|  |             instance->cnt = 1 << 5; | ||||||
|  |         } else { | ||||||
|  |             instance->cnt = (~instance->data & 0xF); | ||||||
|  |         } | ||||||
|  |         instance->btn = (instance->data >> 4) & 0x1; | ||||||
|  |     } else if(instance->data_count_bit == INTERTECHNO_V3_DIMMING_COUNT_BIT) { | ||||||
|  |         instance->serial = (instance->data >> 10) & 0x3FFFFFF; | ||||||
|  |         if((instance->data >> 9) & 0x1) { | ||||||
|  |             instance->cnt = 1 << 5; | ||||||
|  |         } else { | ||||||
|  |             instance->cnt = (~(instance->data >> 4) & 0xF); | ||||||
|  |         } | ||||||
|  |         instance->btn = (instance->data) & 0xF; | ||||||
|  |     } else { | ||||||
|  |         instance->serial = 0; | ||||||
|  |         instance->cnt = 0; | ||||||
|  |         instance->btn = 0; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | uint8_t subghz_protocol_decoder_intertechno_v3_get_hash_data(void* context) { | ||||||
|  |     furi_assert(context); | ||||||
|  |     SubGhzProtocolDecoderIntertechno_V3* instance = context; | ||||||
|  |     return subghz_protocol_blocks_get_hash_data( | ||||||
|  |         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | bool subghz_protocol_decoder_intertechno_v3_serialize( | ||||||
|  |     void* context, | ||||||
|  |     FlipperFormat* flipper_format, | ||||||
|  |     SubGhzPresetDefinition* preset) { | ||||||
|  |     furi_assert(context); | ||||||
|  |     SubGhzProtocolDecoderIntertechno_V3* instance = context; | ||||||
|  |     return subghz_block_generic_serialize(&instance->generic, flipper_format, preset); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | bool subghz_protocol_decoder_intertechno_v3_deserialize( | ||||||
|  |     void* context, | ||||||
|  |     FlipperFormat* flipper_format) { | ||||||
|  |     furi_assert(context); | ||||||
|  |     SubGhzProtocolDecoderIntertechno_V3* instance = context; | ||||||
|  |     bool ret = false; | ||||||
|  |     do { | ||||||
|  |         if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) { | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |         if((instance->generic.data_count_bit != | ||||||
|  |             subghz_protocol_intertechno_v3_const.min_count_bit_for_found) && | ||||||
|  |            (instance->generic.data_count_bit != INTERTECHNO_V3_DIMMING_COUNT_BIT)) { | ||||||
|  |             FURI_LOG_E(TAG, "Wrong number of bits in key"); | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |         ret = true; | ||||||
|  |     } while(false); | ||||||
|  |     return ret; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void subghz_protocol_decoder_intertechno_v3_get_string(void* context, string_t output) { | ||||||
|  |     furi_assert(context); | ||||||
|  |     SubGhzProtocolDecoderIntertechno_V3* instance = context; | ||||||
|  | 
 | ||||||
|  |     subghz_protocol_intertechno_v3_check_remote_controller(&instance->generic); | ||||||
|  | 
 | ||||||
|  |     string_cat_printf( | ||||||
|  |         output, | ||||||
|  |         "%.11s %db\r\n" | ||||||
|  |         "Key:0x%08llX\r\n" | ||||||
|  |         "Sn:%07lX\r\n", | ||||||
|  |         instance->generic.protocol_name, | ||||||
|  |         instance->generic.data_count_bit, | ||||||
|  |         instance->generic.data, | ||||||
|  |         instance->generic.serial); | ||||||
|  | 
 | ||||||
|  |     if(instance->generic.data_count_bit == | ||||||
|  |        subghz_protocol_intertechno_v3_const.min_count_bit_for_found) { | ||||||
|  |         if(instance->generic.cnt >> 5) { | ||||||
|  |             string_cat_printf( | ||||||
|  |                 output, "Ch: All Btn:%s\r\n", (instance->generic.btn ? "On" : "Off")); | ||||||
|  |         } else { | ||||||
|  |             string_cat_printf( | ||||||
|  |                 output, | ||||||
|  |                 "Ch:" CH_PATTERN " Btn:%s\r\n", | ||||||
|  |                 CNT_TO_CH(instance->generic.cnt), | ||||||
|  |                 (instance->generic.btn ? "On" : "Off")); | ||||||
|  |         } | ||||||
|  |     } else if(instance->generic.data_count_bit == INTERTECHNO_V3_DIMMING_COUNT_BIT) { | ||||||
|  |         string_cat_printf( | ||||||
|  |             output, | ||||||
|  |             "Ch:" CH_PATTERN " Dimm:%d%%\r\n", | ||||||
|  |             CNT_TO_CH(instance->generic.cnt), | ||||||
|  |             (int)(6.67 * (float)instance->generic.btn)); | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										111
									
								
								lib/subghz/protocols/intertechno_v3.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										111
									
								
								lib/subghz/protocols/intertechno_v3.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,111 @@ | |||||||
|  | #pragma once | ||||||
|  | 
 | ||||||
|  | #include "base.h" | ||||||
|  | 
 | ||||||
|  | #define SUBGHZ_PROTOCOL_INTERTECHNO_V3_NAME "Intertechno_V3" | ||||||
|  | 
 | ||||||
|  | typedef struct SubGhzProtocolDecoderIntertechno_V3 SubGhzProtocolDecoderIntertechno_V3; | ||||||
|  | typedef struct SubGhzProtocolEncoderIntertechno_V3 SubGhzProtocolEncoderIntertechno_V3; | ||||||
|  | 
 | ||||||
|  | extern const SubGhzProtocolDecoder subghz_protocol_intertechno_v3_decoder; | ||||||
|  | extern const SubGhzProtocolEncoder subghz_protocol_intertechno_v3_encoder; | ||||||
|  | extern const SubGhzProtocol subghz_protocol_intertechno_v3; | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * Allocate SubGhzProtocolEncoderIntertechno_V3. | ||||||
|  |  * @param environment Pointer to a SubGhzEnvironment instance | ||||||
|  |  * @return SubGhzProtocolEncoderIntertechno_V3* pointer to a SubGhzProtocolEncoderIntertechno_V3 instance | ||||||
|  |  */ | ||||||
|  | void* subghz_protocol_encoder_intertechno_v3_alloc(SubGhzEnvironment* environment); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * Free SubGhzProtocolEncoderIntertechno_V3. | ||||||
|  |  * @param context Pointer to a SubGhzProtocolEncoderIntertechno_V3 instance | ||||||
|  |  */ | ||||||
|  | void subghz_protocol_encoder_intertechno_v3_free(void* context); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * Deserialize and generating an upload to send. | ||||||
|  |  * @param context Pointer to a SubGhzProtocolEncoderIntertechno_V3 instance | ||||||
|  |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  |  * @return true On success | ||||||
|  |  */ | ||||||
|  | bool subghz_protocol_encoder_intertechno_v3_deserialize( | ||||||
|  |     void* context, | ||||||
|  |     FlipperFormat* flipper_format); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * Forced transmission stop. | ||||||
|  |  * @param context Pointer to a SubGhzProtocolEncoderIntertechno_V3 instance | ||||||
|  |  */ | ||||||
|  | void subghz_protocol_encoder_intertechno_v3_stop(void* context); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * Getting the level and duration of the upload to be loaded into DMA. | ||||||
|  |  * @param context Pointer to a SubGhzProtocolEncoderIntertechno_V3 instance | ||||||
|  |  * @return LevelDuration  | ||||||
|  |  */ | ||||||
|  | LevelDuration subghz_protocol_encoder_intertechno_v3_yield(void* context); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * Allocate SubGhzProtocolDecoderIntertechno_V3. | ||||||
|  |  * @param environment Pointer to a SubGhzEnvironment instance | ||||||
|  |  * @return SubGhzProtocolDecoderIntertechno_V3* pointer to a SubGhzProtocolDecoderIntertechno_V3 instance | ||||||
|  |  */ | ||||||
|  | void* subghz_protocol_decoder_intertechno_v3_alloc(SubGhzEnvironment* environment); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * Free SubGhzProtocolDecoderIntertechno_V3. | ||||||
|  |  * @param context Pointer to a SubGhzProtocolDecoderIntertechno_V3 instance | ||||||
|  |  */ | ||||||
|  | void subghz_protocol_decoder_intertechno_v3_free(void* context); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * Reset decoder SubGhzProtocolDecoderIntertechno_V3. | ||||||
|  |  * @param context Pointer to a SubGhzProtocolDecoderIntertechno_V3 instance | ||||||
|  |  */ | ||||||
|  | void subghz_protocol_decoder_intertechno_v3_reset(void* context); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * Parse a raw sequence of levels and durations received from the air. | ||||||
|  |  * @param context Pointer to a SubGhzProtocolDecoderIntertechno_V3 instance | ||||||
|  |  * @param level Signal level true-high false-low | ||||||
|  |  * @param duration Duration of this level in, us | ||||||
|  |  */ | ||||||
|  | void subghz_protocol_decoder_intertechno_v3_feed(void* context, bool level, uint32_t duration); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * Getting the hash sum of the last randomly received parcel. | ||||||
|  |  * @param context Pointer to a SubGhzProtocolDecoderIntertechno_V3 instance | ||||||
|  |  * @return hash Hash sum | ||||||
|  |  */ | ||||||
|  | uint8_t subghz_protocol_decoder_intertechno_v3_get_hash_data(void* context); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * Serialize data SubGhzProtocolDecoderIntertechno_V3. | ||||||
|  |  * @param context Pointer to a SubGhzProtocolDecoderIntertechno_V3 instance | ||||||
|  |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  |  * @param preset The modulation on which the signal was received, SubGhzPresetDefinition | ||||||
|  |  * @return true On success | ||||||
|  |  */ | ||||||
|  | bool subghz_protocol_decoder_intertechno_v3_serialize( | ||||||
|  |     void* context, | ||||||
|  |     FlipperFormat* flipper_format, | ||||||
|  |     SubGhzPresetDefinition* preset); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * Deserialize data SubGhzProtocolDecoderIntertechno_V3. | ||||||
|  |  * @param context Pointer to a SubGhzProtocolDecoderIntertechno_V3 instance | ||||||
|  |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  |  * @return true On success | ||||||
|  |  */ | ||||||
|  | bool subghz_protocol_decoder_intertechno_v3_deserialize( | ||||||
|  |     void* context, | ||||||
|  |     FlipperFormat* flipper_format); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * Getting a textual representation of the received data. | ||||||
|  |  * @param context Pointer to a SubGhzProtocolDecoderIntertechno_V3 instance | ||||||
|  |  * @param output Resulting text | ||||||
|  |  */ | ||||||
|  | void subghz_protocol_decoder_intertechno_v3_get_string(void* context, string_t output); | ||||||
| @ -360,11 +360,11 @@ static void subghz_protocol_magellen_check_remote_controller(SubGhzBlockGeneric* | |||||||
| *   0x1275EC =>  0x12-event codes, 0x75EC-serial (dec 117236) | *   0x1275EC =>  0x12-event codes, 0x75EC-serial (dec 117236) | ||||||
| * | * | ||||||
| *   event codes | *   event codes | ||||||
| *   bit_0: 1-alarm, 0-close | *   bit_0: 1-Open/Motion, 0-close/ok | ||||||
| *   bit_1: 1-Tamper On (alarm), 0-Tamper Off (ok) | *   bit_1: 1-Tamper On (alarm), 0-Tamper Off (ok) | ||||||
| *   bit_2: ? | *   bit_2: ? | ||||||
| *   bit_3: 1-power on | *   bit_3: 1-power on | ||||||
| *   bit_4: model type - door alarm | *   bit_4: model type - wireless reed | ||||||
| *   bit_5: model type - motion sensor | *   bit_5: model type - motion sensor | ||||||
| *   bit_6: ? | *   bit_6: ? | ||||||
| *   bit_7: ? | *   bit_7: ? | ||||||
| @ -379,11 +379,12 @@ static void subghz_protocol_magellen_get_event_serialize(uint8_t event, string_t | |||||||
|     string_cat_printf( |     string_cat_printf( | ||||||
|         output, |         output, | ||||||
|         "%s%s%s%s%s%s%s%s", |         "%s%s%s%s%s%s%s%s", | ||||||
|         (event & 0x1 ? " Alarm" : "Ok"), |         ((event >> 4) & 0x1 ? (event & 0x1 ? " Open" : " Close") : | ||||||
|  |                               (event & 0x1 ? " Motion" : " Ok")), | ||||||
|         ((event >> 1) & 0x1 ? ", Tamper On (Alarm)" : ""), |         ((event >> 1) & 0x1 ? ", Tamper On (Alarm)" : ""), | ||||||
|         ((event >> 2) & 0x1 ? ", ?" : ""), |         ((event >> 2) & 0x1 ? ", ?" : ""), | ||||||
|         ((event >> 3) & 0x1 ? ", Power On" : ""), |         ((event >> 3) & 0x1 ? ", Power On" : ""), | ||||||
|         ((event >> 4) & 0x1 ? ", MT:Door_Alarm" : ""), |         ((event >> 4) & 0x1 ? ", MT:Wireless_Reed" : ""), | ||||||
|         ((event >> 5) & 0x1 ? ", MT:Motion_Sensor" : ""), |         ((event >> 5) & 0x1 ? ", MT:Motion_Sensor" : ""), | ||||||
|         ((event >> 6) & 0x1 ? ", ?" : ""), |         ((event >> 6) & 0x1 ? ", ?" : ""), | ||||||
|         ((event >> 7) & 0x1 ? ", ?" : "")); |         ((event >> 7) & 0x1 ? ", ?" : "")); | ||||||
|  | |||||||
| @ -11,7 +11,7 @@ const SubGhzProtocol* subghz_protocol_registry[] = { | |||||||
|     &subghz_protocol_secplus_v1,    &subghz_protocol_megacode,    &subghz_protocol_holtek, |     &subghz_protocol_secplus_v1,    &subghz_protocol_megacode,    &subghz_protocol_holtek, | ||||||
|     &subghz_protocol_chamb_code,    &subghz_protocol_power_smart, &subghz_protocol_marantec, |     &subghz_protocol_chamb_code,    &subghz_protocol_power_smart, &subghz_protocol_marantec, | ||||||
|     &subghz_protocol_bett,          &subghz_protocol_doitrand,    &subghz_protocol_phoenix_v2, |     &subghz_protocol_bett,          &subghz_protocol_doitrand,    &subghz_protocol_phoenix_v2, | ||||||
|     &subghz_protocol_honeywell_wdb, &subghz_protocol_magellen, |     &subghz_protocol_honeywell_wdb, &subghz_protocol_magellen,    &subghz_protocol_intertechno_v3, | ||||||
| 
 | 
 | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -34,6 +34,7 @@ | |||||||
| #include "phoenix_v2.h" | #include "phoenix_v2.h" | ||||||
| #include "honeywell_wdb.h" | #include "honeywell_wdb.h" | ||||||
| #include "magellen.h" | #include "magellen.h" | ||||||
|  | #include "intertechno_v3.h" | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Registration by name SubGhzProtocol. |  * Registration by name SubGhzProtocol. | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Skorpionm
						Skorpionm