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 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_COUNT_PARSE 196 | ||||
| #define TEST_RANDOM_COUNT_PARSE 208 | ||||
| #define TEST_TIMEOUT 10000 | ||||
| 
 | ||||
| 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); | ||||
|     } | ||||
|     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) { | ||||
|         printf("\033[0;31mRandom test ERROR TimeOut\033[0m\r\n"); | ||||
|         return false; | ||||
| @ -419,6 +419,14 @@ MU_TEST(subghz_decoder_magellen_test) { | ||||
|         "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
 | ||||
| MU_TEST(subghz_encoder_princeton_test) { | ||||
|     mu_assert( | ||||
| @ -528,6 +536,12 @@ MU_TEST(subghz_encoder_magellen_test) { | ||||
|         "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_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_honeywell_wdb_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_came_test); | ||||
| @ -585,6 +600,7 @@ MU_TEST_SUITE(subghz) { | ||||
|     MU_RUN_TEST(subghz_encoder_phoenix_v2_test); | ||||
|     MU_RUN_TEST(subghz_encoder_honeywell_wdb_test); | ||||
|     MU_RUN_TEST(subghz_encoder_magellen_test); | ||||
|     MU_RUN_TEST(subghz_encoder_intertechno_v3_test); | ||||
| 
 | ||||
|     MU_RUN_TEST(subghz_random_test); | ||||
|     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) | ||||
| * | ||||
| *   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_2: ? | ||||
| *   bit_3: 1-power on | ||||
| *   bit_4: model type - door alarm | ||||
| *   bit_4: model type - wireless reed | ||||
| *   bit_5: model type - motion sensor | ||||
| *   bit_6: ? | ||||
| *   bit_7: ? | ||||
| @ -379,11 +379,12 @@ static void subghz_protocol_magellen_get_event_serialize(uint8_t event, string_t | ||||
|     string_cat_printf( | ||||
|         output, | ||||
|         "%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 >> 2) & 0x1 ? ", ?" : ""), | ||||
|         ((event >> 3) & 0x1 ? ", Power On" : ""), | ||||
|         ((event >> 4) & 0x1 ? ", MT:Door_Alarm" : ""), | ||||
|         ((event >> 4) & 0x1 ? ", MT:Wireless_Reed" : ""), | ||||
|         ((event >> 5) & 0x1 ? ", MT:Motion_Sensor" : ""), | ||||
|         ((event >> 6) & 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_chamb_code,    &subghz_protocol_power_smart, &subghz_protocol_marantec, | ||||
|     &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 "honeywell_wdb.h" | ||||
| #include "magellen.h" | ||||
| #include "intertechno_v3.h" | ||||
| 
 | ||||
| /**
 | ||||
|  * Registration by name SubGhzProtocol. | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Skorpionm
						Skorpionm