From 1b407f28d07b73c71e987755ddae5cba001d7619 Mon Sep 17 00:00:00 2001 From: HTotoo Date: Sat, 9 Dec 2023 22:53:35 +0100 Subject: [PATCH] Dooya proto added --- firmware/application/apps/ui_subghzd.cpp | 2 + firmware/baseband/fprotos/s-dooya.hpp | 113 ++++++++++++++++++++ firmware/baseband/fprotos/subghzdprotos.hpp | 2 + firmware/baseband/fprotos/subghztypes.hpp | 3 +- 4 files changed, 119 insertions(+), 1 deletion(-) create mode 100644 firmware/baseband/fprotos/s-dooya.hpp diff --git a/firmware/application/apps/ui_subghzd.cpp b/firmware/application/apps/ui_subghzd.cpp index 7c2e13ea..9211bfdc 100644 --- a/firmware/application/apps/ui_subghzd.cpp +++ b/firmware/application/apps/ui_subghzd.cpp @@ -148,6 +148,8 @@ const char* SubGhzDView::getSensorTypeName(FPROTO_SUBGHZD_SENSOR type) { return "Clemsa"; case FPS_DOITRAND: return "Doitrand"; + case FPS_DOOYA: + return "Dooya"; case FPS_Invalid: default: return "Unknown"; diff --git a/firmware/baseband/fprotos/s-dooya.hpp b/firmware/baseband/fprotos/s-dooya.hpp new file mode 100644 index 00000000..fa362e3d --- /dev/null +++ b/firmware/baseband/fprotos/s-dooya.hpp @@ -0,0 +1,113 @@ + +#ifndef __FPROTO_DOOYA_H__ +#define __FPROTO_DOOYA_H__ + +#include "subghzdbase.hpp" + +typedef enum { + DooyaDecoderStepReset = 0, + DooyaDecoderStepFoundStartBit, + DooyaDecoderStepSaveDuration, + DooyaDecoderStepCheckDuration, +} DooyaDecoderStep; + +class FProtoSubGhzDDooya : public FProtoSubGhzDBase { + public: + FProtoSubGhzDDooya() { + sensorType = FPS_DOOYA; + } + + void feed(bool level, uint32_t duration) { + switch (parser_step) { + case DooyaDecoderStepReset: + if ((!level) && (DURATION_DIFF(duration, te_long * 12) < te_delta * 20)) { + parser_step = DooyaDecoderStepFoundStartBit; + } + break; + + case DooyaDecoderStepFoundStartBit: + if (!level) { + if (DURATION_DIFF(duration, te_long * 2) < te_delta * 3) { + parser_step = DooyaDecoderStepSaveDuration; + decode_data = 0; + decode_count_bit = 0; + } else { + parser_step = DooyaDecoderStepReset; + } + } else if ( + DURATION_DIFF(duration, te_short * 13) < te_delta * 5) { + break; + } else { + parser_step = DooyaDecoderStepReset; + } + break; + + case DooyaDecoderStepSaveDuration: + if (level) { + te_last = duration; + parser_step = DooyaDecoderStepCheckDuration; + } else { + parser_step = DooyaDecoderStepReset; + } + break; + + case DooyaDecoderStepCheckDuration: + if (!level) { + if (duration >= (te_long * 4)) { + // add last bit + if (DURATION_DIFF(te_last, te_short) < te_delta) { + subghz_protocol_blocks_add_bit(0); + } else if ( + DURATION_DIFF(te_last, te_long) < + te_delta * 2) { + subghz_protocol_blocks_add_bit(1); + } else { + parser_step = DooyaDecoderStepReset; + break; + } + parser_step = DooyaDecoderStepFoundStartBit; + if (decode_count_bit == + min_count_bit_for_found) { + data = decode_data; + data_count_bit = decode_count_bit; + + // controller: + serial = (data >> 16); + if ((data >> 12) & 0x0F) { + cnt = (data >> 8) & 0x0F; + } else { + cnt = 0xFF; + } + btn = data & 0xFF; + + if (callback) callback(this); + } + break; + } else if ( + (DURATION_DIFF(te_last, te_short) < te_delta) && + (DURATION_DIFF(duration, te_long) < te_delta * 2)) { + subghz_protocol_blocks_add_bit(0); + parser_step = DooyaDecoderStepSaveDuration; + } else if ( + (DURATION_DIFF(te_last, te_long) < te_delta * 2) && + (DURATION_DIFF(duration, te_short) < te_delta)) { + subghz_protocol_blocks_add_bit(1); + parser_step = DooyaDecoderStepSaveDuration; + } else { + parser_step = DooyaDecoderStepReset; + } + } else { + parser_step = DooyaDecoderStepReset; + } + break; + } + } + + protected: + uint32_t te_short = 366; + uint32_t te_long = 733; + uint32_t te_delta = 120; + uint32_t min_count_bit_for_found = 40; +}; + +#endif diff --git a/firmware/baseband/fprotos/subghzdprotos.hpp b/firmware/baseband/fprotos/subghzdprotos.hpp index 033fdb31..8ca621ca 100644 --- a/firmware/baseband/fprotos/subghzdprotos.hpp +++ b/firmware/baseband/fprotos/subghzdprotos.hpp @@ -19,6 +19,7 @@ So include here the .hpp, and add a new element to the protos vector in the cons #include "s-chambcode.hpp" #include "s-clemsa.hpp" #include "s-doitrand.hpp" +#include "s-dooya.hpp" #ifndef __FPROTO_PROTOLISTSGZ_H__ #define __FPROTO_PROTOLISTSGZ_H__ @@ -36,6 +37,7 @@ class SubGhzDProtos : public FProtoListGeneral { protos.push_back(std::make_unique()); // 9 protos.push_back(std::make_unique()); // 10 protos.push_back(std::make_unique()); // 11 + protos.push_back(std::make_unique()); // 11 // set callback for them for (const auto& obj : protos) { diff --git a/firmware/baseband/fprotos/subghztypes.hpp b/firmware/baseband/fprotos/subghztypes.hpp index 36c2a108..96a28557 100644 --- a/firmware/baseband/fprotos/subghztypes.hpp +++ b/firmware/baseband/fprotos/subghztypes.hpp @@ -30,6 +30,7 @@ enum FPROTO_SUBGHZD_SENSOR { FPS_CHAMBCODE = 9, FPS_CLEMSA = 10, FPS_DOITRAND = 11, + FPS_DOOYA = 12, }; -#endif \ No newline at end of file +#endif