SubGhz: fix Hormann HSM (#2158)

* SubGhz: fix Hormann HSM
* SubGhz: add check pattern hormann protocol

Co-authored-by: あく <alleteam@gmail.com>
This commit is contained in:
Skorpionm 2022-12-20 16:42:16 +04:00 committed by GitHub
parent 4cee550cc6
commit 797eab8924
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -8,6 +8,8 @@
#define TAG "SubGhzProtocolHormannHSM" #define TAG "SubGhzProtocolHormannHSM"
#define HORMANN_HSM_PATTERN 0xFF000000003
static const SubGhzBlockConst subghz_protocol_hormann_const = { static const SubGhzBlockConst subghz_protocol_hormann_const = {
.te_short = 500, .te_short = 500,
.te_long = 1000, .te_long = 1000,
@ -101,20 +103,13 @@ static bool subghz_protocol_encoder_hormann_get_upload(SubGhzProtocolEncoderHorm
furi_assert(instance); furi_assert(instance);
size_t index = 0; size_t index = 0;
size_t size_upload = 3 + (instance->generic.data_count_bit * 2 + 2) * 20 + 1; size_t size_upload = (instance->generic.data_count_bit * 2 + 2) * 20 + 1;
if(size_upload > instance->encoder.size_upload) { if(size_upload > instance->encoder.size_upload) {
FURI_LOG_E(TAG, "Size upload exceeds allocated encoder buffer."); FURI_LOG_E(TAG, "Size upload exceeds allocated encoder buffer.");
return false; return false;
} else { } else {
instance->encoder.size_upload = size_upload; instance->encoder.size_upload = size_upload;
} }
//Send header
instance->encoder.upload[index++] =
level_duration_make(false, (uint32_t)subghz_protocol_hormann_const.te_short * 64);
instance->encoder.upload[index++] =
level_duration_make(true, (uint32_t)subghz_protocol_hormann_const.te_short * 64);
instance->encoder.upload[index++] =
level_duration_make(false, (uint32_t)subghz_protocol_hormann_const.te_short * 64);
instance->encoder.repeat = 10; //original remote does 10 repeats instance->encoder.repeat = 10; //original remote does 10 repeats
for(size_t repeat = 0; repeat < 20; repeat++) { for(size_t repeat = 0; repeat < 20; repeat++) {
@ -209,6 +204,10 @@ void subghz_protocol_decoder_hormann_free(void* context) {
free(instance); free(instance);
} }
static bool subghz_protocol_decoder_hormann_check_pattern(SubGhzProtocolDecoderHormann* instance) {
return (instance->decoder.decode_data & HORMANN_HSM_PATTERN) == HORMANN_HSM_PATTERN;
}
void subghz_protocol_decoder_hormann_reset(void* context) { void subghz_protocol_decoder_hormann_reset(void* context) {
furi_assert(context); furi_assert(context);
SubGhzProtocolDecoderHormann* instance = context; SubGhzProtocolDecoderHormann* instance = context;
@ -221,25 +220,9 @@ void subghz_protocol_decoder_hormann_feed(void* context, bool level, uint32_t du
switch(instance->decoder.parser_step) { switch(instance->decoder.parser_step) {
case HormannDecoderStepReset: case HormannDecoderStepReset:
if((level) && (DURATION_DIFF(duration, subghz_protocol_hormann_const.te_short * 64) <
subghz_protocol_hormann_const.te_delta * 64)) {
instance->decoder.parser_step = HormannDecoderStepFoundStartHeader;
}
break;
case HormannDecoderStepFoundStartHeader:
if((!level) && (DURATION_DIFF(duration, subghz_protocol_hormann_const.te_short * 64) <
subghz_protocol_hormann_const.te_delta * 64)) {
instance->decoder.parser_step = HormannDecoderStepFoundHeader;
} else {
instance->decoder.parser_step = HormannDecoderStepReset;
}
break;
case HormannDecoderStepFoundHeader:
if((level) && (DURATION_DIFF(duration, subghz_protocol_hormann_const.te_short * 24) < if((level) && (DURATION_DIFF(duration, subghz_protocol_hormann_const.te_short * 24) <
subghz_protocol_hormann_const.te_delta * 24)) { subghz_protocol_hormann_const.te_delta * 24)) {
instance->decoder.parser_step = HormannDecoderStepFoundStartBit; instance->decoder.parser_step = HormannDecoderStepFoundStartBit;
} else {
instance->decoder.parser_step = HormannDecoderStepReset;
} }
break; break;
case HormannDecoderStepFoundStartBit: case HormannDecoderStepFoundStartBit:
@ -254,7 +237,8 @@ void subghz_protocol_decoder_hormann_feed(void* context, bool level, uint32_t du
break; break;
case HormannDecoderStepSaveDuration: case HormannDecoderStepSaveDuration:
if(level) { //save interval if(level) { //save interval
if(duration >= (subghz_protocol_hormann_const.te_short * 5)) { if(duration >= (subghz_protocol_hormann_const.te_short * 5) &&
subghz_protocol_decoder_hormann_check_pattern(instance)) {
instance->decoder.parser_step = HormannDecoderStepFoundStartBit; instance->decoder.parser_step = HormannDecoderStepFoundStartBit;
if(instance->decoder.decode_count_bit >= if(instance->decoder.decode_count_bit >=
subghz_protocol_hormann_const.min_count_bit_for_found) { subghz_protocol_hormann_const.min_count_bit_for_found) {