1
mirror of https://github.com/DarkFlippers/unleashed-firmware.git synced 2025-12-12 04:34:43 +04:00

subghz bugfixes and experimental options

This commit is contained in:
MX
2025-03-15 07:23:23 +03:00
parent ab8ea27200
commit 8ca3581fb0
16 changed files with 554 additions and 429 deletions

View File

@@ -26,7 +26,7 @@ const char* const debug_pin_text[DEBUG_P_COUNT] = {
"17(1W)", "17(1W)",
}; };
#define DEBUG_COUNTER_COUNT 13 #define DEBUG_COUNTER_COUNT 16
const char* const debug_counter_text[DEBUG_COUNTER_COUNT] = { const char* const debug_counter_text[DEBUG_COUNTER_COUNT] = {
"+1", "+1",
"+2", "+2",
@@ -34,21 +34,26 @@ const char* const debug_counter_text[DEBUG_COUNTER_COUNT] = {
"+4", "+4",
"+5", "+5",
"+10", "+10",
"0", "+50",
"OVFL",
"No",
"-1", "-1",
"-2", "-2",
"-3", "-3",
"-4", "-4",
"-5", "-5",
"-10", "-10",
"-50",
}; };
const uint32_t debug_counter_val[DEBUG_COUNTER_COUNT] = { const int32_t debug_counter_val[DEBUG_COUNTER_COUNT] = {
1, 1,
2, 2,
3, 3,
4, 4,
5, 5,
10, 10,
50,
65535,
0, 0,
-1, -1,
-2, -2,
@@ -56,6 +61,7 @@ const uint32_t debug_counter_val[DEBUG_COUNTER_COUNT] = {
-4, -4,
-5, -5,
-10, -10,
-50,
}; };
static void subghz_scene_radio_settings_set_device(VariableItem* item) { static void subghz_scene_radio_settings_set_device(VariableItem* item) {
@@ -118,7 +124,7 @@ void subghz_scene_radio_settings_on_enter(void* context) {
SubGhz* subghz = context; SubGhz* subghz = context;
VariableItemList* variable_item_list = subghz->variable_item_list; VariableItemList* variable_item_list = subghz->variable_item_list;
uint8_t value_index; int32_t value_index;
VariableItem* item; VariableItem* item;
uint8_t value_count_device = RADIO_DEVICE_COUNT; uint8_t value_count_device = RADIO_DEVICE_COUNT;
@@ -152,7 +158,7 @@ void subghz_scene_radio_settings_on_enter(void* context) {
furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug) ? DEBUG_COUNTER_COUNT : 3, furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug) ? DEBUG_COUNTER_COUNT : 3,
subghz_scene_receiver_config_set_debug_counter, subghz_scene_receiver_config_set_debug_counter,
subghz); subghz);
value_index = value_index_uint32( value_index = value_index_int32(
furi_hal_subghz_get_rolling_counter_mult(), furi_hal_subghz_get_rolling_counter_mult(),
debug_counter_val, debug_counter_val,
furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug) ? DEBUG_COUNTER_COUNT : 3); furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug) ? DEBUG_COUNTER_COUNT : 3);

View File

@@ -193,7 +193,8 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) {
GenInfo gen_info = {0}; GenInfo gen_info = {0};
switch(event.event) { switch(event.event) {
case SetTypePricenton433: case SetTypePricenton433:
gen_info = (GenInfo){.type = GenData, gen_info = (GenInfo){
.type = GenData,
.mod = "AM650", .mod = "AM650",
.freq = 433920000, .freq = 433920000,
.data.name = SUBGHZ_PROTOCOL_PRINCETON_NAME, .data.name = SUBGHZ_PROTOCOL_PRINCETON_NAME,
@@ -202,7 +203,8 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) {
.data.te = 400}; .data.te = 400};
break; break;
case SetTypePricenton315: case SetTypePricenton315:
gen_info = (GenInfo){.type = GenData, gen_info = (GenInfo){
.type = GenData,
.mod = "AM650", .mod = "AM650",
.freq = 315000000, .freq = 315000000,
.data.name = SUBGHZ_PROTOCOL_PRINCETON_NAME, .data.name = SUBGHZ_PROTOCOL_PRINCETON_NAME,
@@ -211,7 +213,8 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) {
.data.te = 400}; .data.te = 400};
break; break;
case SetTypeNiceFlo12bit: case SetTypeNiceFlo12bit:
gen_info = (GenInfo){.type = GenData, gen_info = (GenInfo){
.type = GenData,
.mod = "AM650", .mod = "AM650",
.freq = 433920000, .freq = 433920000,
.data.name = SUBGHZ_PROTOCOL_NICE_FLO_NAME, .data.name = SUBGHZ_PROTOCOL_NICE_FLO_NAME,
@@ -220,7 +223,8 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) {
.data.te = 0}; .data.te = 0};
break; break;
case SetTypeNiceFlo24bit: case SetTypeNiceFlo24bit:
gen_info = (GenInfo){.type = GenData, gen_info = (GenInfo){
.type = GenData,
.mod = "AM650", .mod = "AM650",
.freq = 433920000, .freq = 433920000,
.data.name = SUBGHZ_PROTOCOL_NICE_FLO_NAME, .data.name = SUBGHZ_PROTOCOL_NICE_FLO_NAME,
@@ -229,7 +233,8 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) {
.data.te = 0}; .data.te = 0};
break; break;
case SetTypeCAME12bit: case SetTypeCAME12bit:
gen_info = (GenInfo){.type = GenData, gen_info = (GenInfo){
.type = GenData,
.mod = "AM650", .mod = "AM650",
.freq = 433920000, .freq = 433920000,
.data.name = SUBGHZ_PROTOCOL_CAME_NAME, .data.name = SUBGHZ_PROTOCOL_CAME_NAME,
@@ -238,7 +243,8 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) {
.data.te = 0}; .data.te = 0};
break; break;
case SetTypeCAME24bit: case SetTypeCAME24bit:
gen_info = (GenInfo){.type = GenData, gen_info = (GenInfo){
.type = GenData,
.mod = "AM650", .mod = "AM650",
.freq = 433920000, .freq = 433920000,
.data.name = SUBGHZ_PROTOCOL_CAME_NAME, .data.name = SUBGHZ_PROTOCOL_CAME_NAME,
@@ -247,7 +253,8 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) {
.data.te = 0}; .data.te = 0};
break; break;
case SetTypeCAME12bit868: case SetTypeCAME12bit868:
gen_info = (GenInfo){.type = GenData, gen_info = (GenInfo){
.type = GenData,
.mod = "AM650", .mod = "AM650",
.freq = 868350000, .freq = 868350000,
.data.name = SUBGHZ_PROTOCOL_CAME_NAME, .data.name = SUBGHZ_PROTOCOL_CAME_NAME,
@@ -256,7 +263,8 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) {
.data.te = 0}; .data.te = 0};
break; break;
case SetTypeCAME24bit868: case SetTypeCAME24bit868:
gen_info = (GenInfo){.type = GenData, gen_info = (GenInfo){
.type = GenData,
.mod = "AM650", .mod = "AM650",
.freq = 868350000, .freq = 868350000,
.data.name = SUBGHZ_PROTOCOL_CAME_NAME, .data.name = SUBGHZ_PROTOCOL_CAME_NAME,
@@ -265,7 +273,8 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) {
.data.te = 0}; .data.te = 0};
break; break;
case SetTypeLinear_300_00: case SetTypeLinear_300_00:
gen_info = (GenInfo){.type = GenData, gen_info = (GenInfo){
.type = GenData,
.mod = "AM650", .mod = "AM650",
.freq = 300000000, .freq = 300000000,
.data.name = SUBGHZ_PROTOCOL_LINEAR_NAME, .data.name = SUBGHZ_PROTOCOL_LINEAR_NAME,
@@ -274,7 +283,8 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) {
.data.te = 0}; .data.te = 0};
break; break;
case SetTypeBETT_433: case SetTypeBETT_433:
gen_info = (GenInfo){.type = GenData, gen_info = (GenInfo){
.type = GenData,
.mod = "AM650", .mod = "AM650",
.freq = 433920000, .freq = 433920000,
.data.name = SUBGHZ_PROTOCOL_BETT_NAME, .data.name = SUBGHZ_PROTOCOL_BETT_NAME,
@@ -283,12 +293,12 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) {
.data.te = 0}; .data.te = 0};
break; break;
case SetTypeCAMETwee: case SetTypeCAMETwee:
gen_info = (GenInfo){.type = GenData, gen_info = (GenInfo){
.type = GenData,
.mod = "AM650", .mod = "AM650",
.freq = 433920000, .freq = 433920000,
.data.name = SUBGHZ_PROTOCOL_CAME_TWEE_NAME, .data.name = SUBGHZ_PROTOCOL_CAME_TWEE_NAME,
.data.key = 0x003FFF7200000000 | .data.key = 0x003FFF7200000000 | ((key & 0x0FFFFFF0) ^ 0xE0E0E0EE), // ????
((key & 0x0FFFFFF0) ^ 0xE0E0E0EE), // ????
.data.bits = 54, .data.bits = 54,
.data.te = 0}; .data.te = 0};
break; break;
@@ -329,12 +339,12 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) {
.data.te = 0}; .data.te = 0};
break; break;
case SetTypeReversRB2_433: case SetTypeReversRB2_433:
gen_info = (GenInfo){.type = GenData, gen_info = (GenInfo){
.type = GenData,
.mod = "AM650", .mod = "AM650",
.freq = 433920000, .freq = 433920000,
.data.name = SUBGHZ_PROTOCOL_REVERSRB2_NAME, // 64bits no buttons .data.name = SUBGHZ_PROTOCOL_REVERSRB2_NAME, // 64bits no buttons
.data.key = (key & 0x00000FFFFFFFF000) | 0xFFFFF00000000000 | .data.key = (key & 0x00000FFFFFFFF000) | 0xFFFFF00000000000 | 0x0000000000000A00,
0x0000000000000A00,
.data.bits = 64, .data.bits = 64,
.data.te = 0}; .data.te = 0};
break; break;
@@ -349,7 +359,8 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) {
.data.te = 0}; .data.te = 0};
break; break;
case SetTypeFaacSLH_433: case SetTypeFaacSLH_433:
gen_info = (GenInfo){.type = GenFaacSLH, gen_info = (GenInfo){
.type = GenFaacSLH,
.mod = "AM650", .mod = "AM650",
.freq = 433920000, .freq = 433920000,
.faac_slh.serial = ((key & 0x00FFFFF0) | 0xA0000006) >> 4, .faac_slh.serial = ((key & 0x00FFFFF0) | 0xA0000006) >> 4,
@@ -359,7 +370,8 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) {
.faac_slh.manuf = "FAAC_SLH"}; .faac_slh.manuf = "FAAC_SLH"};
break; break;
case SetTypeFaacSLH_868: case SetTypeFaacSLH_868:
gen_info = (GenInfo){.type = GenFaacSLH, gen_info = (GenInfo){
.type = GenFaacSLH,
.mod = "AM650", .mod = "AM650",
.freq = 868350000, .freq = 868350000,
.faac_slh.serial = ((key & 0x00FFFFF0) | 0xA0000006) >> 4, .faac_slh.serial = ((key & 0x00FFFFF0) | 0xA0000006) >> 4,
@@ -369,7 +381,8 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) {
.faac_slh.manuf = "FAAC_SLH"}; .faac_slh.manuf = "FAAC_SLH"};
break; break;
case SetTypeBeninca433: case SetTypeBeninca433:
gen_info = (GenInfo){.type = GenKeeloq, gen_info = (GenInfo){
.type = GenKeeloq,
.mod = "AM650", .mod = "AM650",
.freq = 433920000, .freq = 433920000,
.keeloq.serial = (key & 0x000FFF00) | 0x00800080, .keeloq.serial = (key & 0x000FFF00) | 0x00800080,
@@ -378,7 +391,8 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) {
.keeloq.manuf = "Beninca"}; .keeloq.manuf = "Beninca"};
break; break;
case SetTypeBeninca868: case SetTypeBeninca868:
gen_info = (GenInfo){.type = GenKeeloq, gen_info = (GenInfo){
.type = GenKeeloq,
.mod = "AM650", .mod = "AM650",
.freq = 868350000, .freq = 868350000,
.keeloq.serial = (key & 0x000FFF00) | 0x00800080, .keeloq.serial = (key & 0x000FFF00) | 0x00800080,
@@ -387,7 +401,8 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) {
.keeloq.manuf = "Beninca"}; .keeloq.manuf = "Beninca"};
break; break;
case SetTypeAllmatic433: case SetTypeAllmatic433:
gen_info = (GenInfo){.type = GenKeeloq, gen_info = (GenInfo){
.type = GenKeeloq,
.mod = "AM650", .mod = "AM650",
.freq = 433920000, .freq = 433920000,
.keeloq.serial = (key & 0x00FFFF00) | 0x01000011, .keeloq.serial = (key & 0x00FFFF00) | 0x01000011,
@@ -396,7 +411,8 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) {
.keeloq.manuf = "Beninca"}; .keeloq.manuf = "Beninca"};
break; break;
case SetTypeAllmatic868: case SetTypeAllmatic868:
gen_info = (GenInfo){.type = GenKeeloq, gen_info = (GenInfo){
.type = GenKeeloq,
.mod = "AM650", .mod = "AM650",
.freq = 868350000, .freq = 868350000,
.keeloq.serial = (key & 0x00FFFF00) | 0x01000011, .keeloq.serial = (key & 0x00FFFF00) | 0x01000011,
@@ -405,7 +421,8 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) {
.keeloq.manuf = "Beninca"}; .keeloq.manuf = "Beninca"};
break; break;
case SetTypeCenturion433: case SetTypeCenturion433:
gen_info = (GenInfo){.type = GenKeeloq, gen_info = (GenInfo){
.type = GenKeeloq,
.mod = "AM650", .mod = "AM650",
.freq = 433920000, .freq = 433920000,
.keeloq.serial = (key & 0x0000FFFF), .keeloq.serial = (key & 0x0000FFFF),
@@ -414,7 +431,8 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) {
.keeloq.manuf = "Centurion"}; .keeloq.manuf = "Centurion"};
break; break;
case SetTypeMonarch433: case SetTypeMonarch433:
gen_info = (GenInfo){.type = GenKeeloq, gen_info = (GenInfo){
.type = GenKeeloq,
.mod = "AM650", .mod = "AM650",
.freq = 433920000, .freq = 433920000,
.keeloq.serial = (key & 0x0000FFFF), .keeloq.serial = (key & 0x0000FFFF),
@@ -423,7 +441,8 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) {
.keeloq.manuf = "Monarch"}; .keeloq.manuf = "Monarch"};
break; break;
case SetTypeJollyMotors433: case SetTypeJollyMotors433:
gen_info = (GenInfo){.type = GenKeeloq, gen_info = (GenInfo){
.type = GenKeeloq,
.mod = "AM650", .mod = "AM650",
.freq = 433920000, .freq = 433920000,
.keeloq.serial = (key & 0x000FFFFF), .keeloq.serial = (key & 0x000FFFFF),
@@ -432,7 +451,8 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) {
.keeloq.manuf = "Jolly_Motors"}; .keeloq.manuf = "Jolly_Motors"};
break; break;
case SetTypeElmesElectronic: case SetTypeElmesElectronic:
gen_info = (GenInfo){.type = GenKeeloq, gen_info = (GenInfo){
.type = GenKeeloq,
.mod = "AM650", .mod = "AM650",
.freq = 433920000, .freq = 433920000,
.keeloq.serial = (key & 0x00FFFFFF) | 0x02000000, .keeloq.serial = (key & 0x00FFFFFF) | 0x02000000,
@@ -441,7 +461,8 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) {
.keeloq.manuf = "Elmes_Poland"}; .keeloq.manuf = "Elmes_Poland"};
break; break;
case SetTypeANMotorsAT4: case SetTypeANMotorsAT4:
gen_info = (GenInfo){.type = GenKeeloq, gen_info = (GenInfo){
.type = GenKeeloq,
.mod = "AM650", .mod = "AM650",
.freq = 433920000, .freq = 433920000,
.keeloq.serial = (key & 0x000FFFFF) | 0x04700000, .keeloq.serial = (key & 0x000FFFFF) | 0x04700000,
@@ -450,7 +471,8 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) {
.keeloq.manuf = "AN-Motors"}; .keeloq.manuf = "AN-Motors"};
break; break;
case SetTypeAprimatic: case SetTypeAprimatic:
gen_info = (GenInfo){.type = GenKeeloq, gen_info = (GenInfo){
.type = GenKeeloq,
.mod = "AM650", .mod = "AM650",
.freq = 433920000, .freq = 433920000,
.keeloq.serial = (key & 0x000FFFFF) | 0x00600000, .keeloq.serial = (key & 0x000FFFFF) | 0x00600000,
@@ -459,7 +481,8 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) {
.keeloq.manuf = "Aprimatic"}; .keeloq.manuf = "Aprimatic"};
break; break;
case SetTypeGibidi433: case SetTypeGibidi433:
gen_info = (GenInfo){.type = GenKeeloq, gen_info = (GenInfo){
.type = GenKeeloq,
.mod = "AM650", .mod = "AM650",
.freq = 433920000, .freq = 433920000,
.keeloq.serial = key & 0x00FFFFFF, .keeloq.serial = key & 0x00FFFFFF,
@@ -468,7 +491,8 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) {
.keeloq.manuf = "Gibidi"}; .keeloq.manuf = "Gibidi"};
break; break;
case SetTypeGSN: case SetTypeGSN:
gen_info = (GenInfo){.type = GenKeeloq, gen_info = (GenInfo){
.type = GenKeeloq,
.mod = "AM650", .mod = "AM650",
.freq = 433920000, .freq = 433920000,
.keeloq.serial = key & 0x0FFFFFFF, .keeloq.serial = key & 0x0FFFFFFF,
@@ -477,7 +501,8 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) {
.keeloq.manuf = "GSN"}; .keeloq.manuf = "GSN"};
break; break;
case SetTypeIronLogic: case SetTypeIronLogic:
gen_info = (GenInfo){.type = GenKeeloq, gen_info = (GenInfo){
.type = GenKeeloq,
.mod = "AM650", .mod = "AM650",
.freq = 433920000, .freq = 433920000,
.keeloq.serial = key & 0x00FFFFF0, .keeloq.serial = key & 0x00FFFFF0,
@@ -486,7 +511,8 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) {
.keeloq.manuf = "IronLogic"}; .keeloq.manuf = "IronLogic"};
break; break;
case SetTypeStilmatic: case SetTypeStilmatic:
gen_info = (GenInfo){.type = GenKeeloq, gen_info = (GenInfo){
.type = GenKeeloq,
.mod = "AM650", .mod = "AM650",
.freq = 433920000, .freq = 433920000,
.keeloq.serial = key & 0x0FFFFFFF, .keeloq.serial = key & 0x0FFFFFFF,
@@ -495,7 +521,8 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) {
.keeloq.manuf = "Stilmatic"}; .keeloq.manuf = "Stilmatic"};
break; break;
case SetTypeSommer_FM_434: case SetTypeSommer_FM_434:
gen_info = (GenInfo){.type = GenKeeloq, gen_info = (GenInfo){
.type = GenKeeloq,
.mod = "FM476", .mod = "FM476",
.freq = 434420000, .freq = 434420000,
.keeloq.serial = (key & 0x0000FFFF) | 0x01700000, .keeloq.serial = (key & 0x0000FFFF) | 0x01700000,
@@ -504,7 +531,8 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) {
.keeloq.manuf = "Sommer(fsk476)"}; .keeloq.manuf = "Sommer(fsk476)"};
break; break;
case SetTypeSommer_FM_868: case SetTypeSommer_FM_868:
gen_info = (GenInfo){.type = GenKeeloq, gen_info = (GenInfo){
.type = GenKeeloq,
.mod = "FM476", .mod = "FM476",
.freq = 868800000, .freq = 868800000,
.keeloq.serial = (key & 0x0000FFFF) | 0x01700000, .keeloq.serial = (key & 0x0000FFFF) | 0x01700000,
@@ -513,7 +541,8 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) {
.keeloq.manuf = "Sommer(fsk476)"}; .keeloq.manuf = "Sommer(fsk476)"};
break; break;
case SetTypeSommer_FM238_434: case SetTypeSommer_FM238_434:
gen_info = (GenInfo){.type = GenKeeloq, gen_info = (GenInfo){
.type = GenKeeloq,
.mod = "FM238", .mod = "FM238",
.freq = 434420000, .freq = 434420000,
.keeloq.serial = key & 0x0000FFFF, .keeloq.serial = key & 0x0000FFFF,
@@ -522,7 +551,8 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) {
.keeloq.manuf = "Sommer(fsk476)"}; .keeloq.manuf = "Sommer(fsk476)"};
break; break;
case SetTypeSommer_FM238_868: case SetTypeSommer_FM238_868:
gen_info = (GenInfo){.type = GenKeeloq, gen_info = (GenInfo){
.type = GenKeeloq,
.mod = "FM238", .mod = "FM238",
.freq = 868800000, .freq = 868800000,
.keeloq.serial = key & 0x0000FFFF, .keeloq.serial = key & 0x0000FFFF,
@@ -531,7 +561,8 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) {
.keeloq.manuf = "Sommer(fsk476)"}; .keeloq.manuf = "Sommer(fsk476)"};
break; break;
case SetTypeDTMNeo433: case SetTypeDTMNeo433:
gen_info = (GenInfo){.type = GenKeeloq, gen_info = (GenInfo){
.type = GenKeeloq,
.mod = "AM650", .mod = "AM650",
.freq = 433920000, .freq = 433920000,
.keeloq.serial = key & 0x000FFFFF, .keeloq.serial = key & 0x000FFFFF,
@@ -540,7 +571,8 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) {
.keeloq.manuf = "DTM_Neo"}; .keeloq.manuf = "DTM_Neo"};
break; break;
case SetTypeCAMESpace: case SetTypeCAMESpace:
gen_info = (GenInfo){.type = GenKeeloq, gen_info = (GenInfo){
.type = GenKeeloq,
.mod = "AM650", .mod = "AM650",
.freq = 433920000, .freq = 433920000,
.keeloq.serial = key & 0x00FFFFFF, .keeloq.serial = key & 0x00FFFFFF,
@@ -549,21 +581,24 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) {
.keeloq.manuf = "Came_Space"}; .keeloq.manuf = "Came_Space"};
break; break;
case SetTypeCameAtomo433: case SetTypeCameAtomo433:
gen_info = (GenInfo){.type = GenCameAtomo, gen_info = (GenInfo){
.type = GenCameAtomo,
.mod = "AM650", .mod = "AM650",
.freq = 433920000, .freq = 433920000,
.keeloq.serial = (key & 0x0FFFFFFF) | 0x10000000, .keeloq.serial = (key & 0x0FFFFFFF) | 0x10000000,
.keeloq.cnt = 0x03}; .keeloq.cnt = 0x03};
break; break;
case SetTypeCameAtomo868: case SetTypeCameAtomo868:
gen_info = (GenInfo){.type = GenCameAtomo, gen_info = (GenInfo){
.type = GenCameAtomo,
.mod = "AM650", .mod = "AM650",
.freq = 868350000, .freq = 868350000,
.keeloq.serial = (key & 0x0FFFFFFF) | 0x10000000, .keeloq.serial = (key & 0x0FFFFFFF) | 0x10000000,
.keeloq.cnt = 0x03}; .keeloq.cnt = 0x03};
break; break;
case SetTypeBFTMitto: case SetTypeBFTMitto:
gen_info = (GenInfo){.type = GenKeeloqBFT, gen_info = (GenInfo){
.type = GenKeeloqBFT,
.mod = "AM650", .mod = "AM650",
.freq = 433920000, .freq = 433920000,
.keeloq_bft.serial = key & 0x000FFFFF, .keeloq_bft.serial = key & 0x000FFFFF,
@@ -573,7 +608,8 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) {
.keeloq_bft.manuf = "BFT"}; .keeloq_bft.manuf = "BFT"};
break; break;
case SetTypeAlutechAT4N: case SetTypeAlutechAT4N:
gen_info = (GenInfo){.type = GenAlutechAt4n, gen_info = (GenInfo){
.type = GenAlutechAt4n,
.mod = "AM650", .mod = "AM650",
.freq = 433920000, .freq = 433920000,
.alutech_at_4n.serial = (key & 0x000FFFFF) | 0x00100000, .alutech_at_4n.serial = (key & 0x000FFFFF) | 0x00100000,
@@ -581,7 +617,8 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) {
.alutech_at_4n.cnt = 0x03}; .alutech_at_4n.cnt = 0x03};
break; break;
case SetTypeSomfyTelis: case SetTypeSomfyTelis:
gen_info = (GenInfo){.type = GenSomfyTelis, gen_info = (GenInfo){
.type = GenSomfyTelis,
.mod = "AM650", .mod = "AM650",
.freq = 433420000, .freq = 433420000,
.somfy_telis.serial = key & 0x00FFFFFF, .somfy_telis.serial = key & 0x00FFFFFF,
@@ -589,7 +626,8 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) {
.somfy_telis.cnt = 0x03}; .somfy_telis.cnt = 0x03};
break; break;
case SetTypeDoorHan_433_92: case SetTypeDoorHan_433_92:
gen_info = (GenInfo){.type = GenKeeloq, gen_info = (GenInfo){
.type = GenKeeloq,
.mod = "AM650", .mod = "AM650",
.freq = 433920000, .freq = 433920000,
.keeloq.serial = key & 0x0FFFFFFF, .keeloq.serial = key & 0x0FFFFFFF,
@@ -598,7 +636,8 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) {
.keeloq.manuf = "DoorHan"}; .keeloq.manuf = "DoorHan"};
break; break;
case SetTypeDoorHan_315_00: case SetTypeDoorHan_315_00:
gen_info = (GenInfo){.type = GenKeeloq, gen_info = (GenInfo){
.type = GenKeeloq,
.mod = "AM650", .mod = "AM650",
.freq = 315000000, .freq = 315000000,
.keeloq.serial = key & 0x0FFFFFFF, .keeloq.serial = key & 0x0FFFFFFF,
@@ -607,7 +646,8 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) {
.keeloq.manuf = "DoorHan"}; .keeloq.manuf = "DoorHan"};
break; break;
case SetTypeNiceFlorS_433_92: case SetTypeNiceFlorS_433_92:
gen_info = (GenInfo){.type = GenNiceFlorS, gen_info = (GenInfo){
.type = GenNiceFlorS,
.mod = "AM650", .mod = "AM650",
.freq = 433920000, .freq = 433920000,
.nice_flor_s.serial = key & 0x0FFFFFFF, .nice_flor_s.serial = key & 0x0FFFFFFF,
@@ -616,7 +656,8 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) {
.nice_flor_s.nice_one = false}; .nice_flor_s.nice_one = false};
break; break;
case SetTypeNiceOne_433_92: case SetTypeNiceOne_433_92:
gen_info = (GenInfo){.type = GenNiceFlorS, gen_info = (GenInfo){
.type = GenNiceFlorS,
.mod = "AM650", .mod = "AM650",
.freq = 433920000, .freq = 433920000,
.nice_flor_s.serial = key & 0x0FFFFFFF, .nice_flor_s.serial = key & 0x0FFFFFFF,
@@ -625,7 +666,8 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) {
.nice_flor_s.nice_one = true}; .nice_flor_s.nice_one = true};
break; break;
case SetTypeNiceSmilo_433_92: case SetTypeNiceSmilo_433_92:
gen_info = (GenInfo){.type = GenKeeloq, gen_info = (GenInfo){
.type = GenKeeloq,
.mod = "AM650", .mod = "AM650",
.freq = 433920000, .freq = 433920000,
.keeloq.serial = key & 0x00FFFFFF, .keeloq.serial = key & 0x00FFFFFF,
@@ -634,7 +676,8 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) {
.keeloq.manuf = "NICE_Smilo"}; .keeloq.manuf = "NICE_Smilo"};
break; break;
case SetTypeNiceMHouse_433_92: case SetTypeNiceMHouse_433_92:
gen_info = (GenInfo){.type = GenKeeloq, gen_info = (GenInfo){
.type = GenKeeloq,
.mod = "AM650", .mod = "AM650",
.freq = 433920000, .freq = 433920000,
.keeloq.serial = key & 0x00FFFFFF, .keeloq.serial = key & 0x00FFFFFF,
@@ -643,7 +686,8 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) {
.keeloq.manuf = "NICE_MHOUSE"}; .keeloq.manuf = "NICE_MHOUSE"};
break; break;
case SetTypeDeaMio433: case SetTypeDeaMio433:
gen_info = (GenInfo){.type = GenKeeloq, gen_info = (GenInfo){
.type = GenKeeloq,
.mod = "AM650", .mod = "AM650",
.freq = 433920000, .freq = 433920000,
.keeloq.serial = (key & 0x0FFFF000) | 0x00000869, .keeloq.serial = (key & 0x0FFFF000) | 0x00000869,
@@ -652,7 +696,8 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) {
.keeloq.manuf = "Dea_Mio"}; .keeloq.manuf = "Dea_Mio"};
break; break;
case SetTypeGeniusBravo433: case SetTypeGeniusBravo433:
gen_info = (GenInfo){.type = GenKeeloq, gen_info = (GenInfo){
.type = GenKeeloq,
.mod = "AM650", .mod = "AM650",
.freq = 433920000, .freq = 433920000,
.keeloq.serial = key & 0x00FFFFFF, .keeloq.serial = key & 0x00FFFFFF,
@@ -661,7 +706,8 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) {
.keeloq.manuf = "Genius_Bravo"}; .keeloq.manuf = "Genius_Bravo"};
break; break;
case SetTypeJCM_433_92: case SetTypeJCM_433_92:
gen_info = (GenInfo){.type = GenKeeloq, gen_info = (GenInfo){
.type = GenKeeloq,
.mod = "AM650", .mod = "AM650",
.freq = 433920000, .freq = 433920000,
.keeloq.serial = key & 0x00FFFFFF, .keeloq.serial = key & 0x00FFFFFF,
@@ -670,7 +716,8 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) {
.keeloq.manuf = "JCM_Tech"}; .keeloq.manuf = "JCM_Tech"};
break; break;
case SetTypeNovoferm_433_92: case SetTypeNovoferm_433_92:
gen_info = (GenInfo){.type = GenKeeloq, gen_info = (GenInfo){
.type = GenKeeloq,
.mod = "AM650", .mod = "AM650",
.freq = 433920000, .freq = 433920000,
.keeloq.serial = (key & 0x0000FFFF) | 0x018F0000, .keeloq.serial = (key & 0x0000FFFF) | 0x018F0000,
@@ -679,7 +726,8 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) {
.keeloq.manuf = "Novoferm"}; .keeloq.manuf = "Novoferm"};
break; break;
case SetTypeHormannEcoStar_433_92: case SetTypeHormannEcoStar_433_92:
gen_info = (GenInfo){.type = GenKeeloq, gen_info = (GenInfo){
.type = GenKeeloq,
.mod = "AM650", .mod = "AM650",
.freq = 433920000, .freq = 433920000,
.keeloq.serial = (key & 0x000FFFFF) | 0x02200000, .keeloq.serial = (key & 0x000FFFFF) | 0x02200000,
@@ -688,7 +736,8 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) {
.keeloq.manuf = "EcoStar"}; .keeloq.manuf = "EcoStar"};
break; break;
case SetTypeFAACRCXT_433_92: case SetTypeFAACRCXT_433_92:
gen_info = (GenInfo){.type = GenKeeloq, gen_info = (GenInfo){
.type = GenKeeloq,
.mod = "AM650", .mod = "AM650",
.freq = 433920000, .freq = 433920000,
.keeloq.serial = (key & 0x0000FFFF) | 0x00100000, .keeloq.serial = (key & 0x0000FFFF) | 0x00100000,
@@ -697,7 +746,8 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) {
.keeloq.manuf = "FAAC_RC,XT"}; .keeloq.manuf = "FAAC_RC,XT"};
break; break;
case SetTypeFAACRCXT_868: case SetTypeFAACRCXT_868:
gen_info = (GenInfo){.type = GenKeeloq, gen_info = (GenInfo){
.type = GenKeeloq,
.mod = "AM650", .mod = "AM650",
.freq = 868350000, .freq = 868350000,
.keeloq.serial = (key & 0x0000FFFF) | 0x00100000, .keeloq.serial = (key & 0x0000FFFF) | 0x00100000,
@@ -706,7 +756,8 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) {
.keeloq.manuf = "FAAC_RC,XT"}; .keeloq.manuf = "FAAC_RC,XT"};
break; break;
case SetTypeNormstahl_433_92: case SetTypeNormstahl_433_92:
gen_info = (GenInfo){.type = GenKeeloq, gen_info = (GenInfo){
.type = GenKeeloq,
.mod = "AM650", .mod = "AM650",
.freq = 433920000, .freq = 433920000,
.keeloq.serial = key & 0x0000FFFF, .keeloq.serial = key & 0x0000FFFF,
@@ -715,7 +766,8 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) {
.keeloq.manuf = "Normstahl"}; .keeloq.manuf = "Normstahl"};
break; break;
case SetTypeHCS101_433_92: case SetTypeHCS101_433_92:
gen_info = (GenInfo){.type = GenKeeloq, gen_info = (GenInfo){
.type = GenKeeloq,
.mod = "AM650", .mod = "AM650",
.freq = 433920000, .freq = 433920000,
.keeloq.serial = key & 0x000FFFFF, .keeloq.serial = key & 0x000FFFFF,
@@ -733,7 +785,8 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) {
gen_info = (GenInfo){.type = GenSecPlus1, .mod = "AM650", .freq = 433920000}; gen_info = (GenInfo){.type = GenSecPlus1, .mod = "AM650", .freq = 433920000};
break; break;
case SetTypeSecPlus_v2_310_00: case SetTypeSecPlus_v2_310_00:
gen_info = (GenInfo){.type = GenSecPlus2, gen_info = (GenInfo){
.type = GenSecPlus2,
.mod = "AM650", .mod = "AM650",
.freq = 310000000, .freq = 310000000,
.sec_plus_2.serial = (key & 0x7FFFF3FC), // 850LM pairing .sec_plus_2.serial = (key & 0x7FFFF3FC), // 850LM pairing
@@ -741,7 +794,8 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) {
.sec_plus_2.cnt = 0xE500000}; .sec_plus_2.cnt = 0xE500000};
break; break;
case SetTypeSecPlus_v2_315_00: case SetTypeSecPlus_v2_315_00:
gen_info = (GenInfo){.type = GenSecPlus2, gen_info = (GenInfo){
.type = GenSecPlus2,
.mod = "AM650", .mod = "AM650",
.freq = 315000000, .freq = 315000000,
.sec_plus_2.serial = (key & 0x7FFFF3FC), // 850LM pairing .sec_plus_2.serial = (key & 0x7FFFF3FC), // 850LM pairing
@@ -749,7 +803,8 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) {
.sec_plus_2.cnt = 0xE500000}; .sec_plus_2.cnt = 0xE500000};
break; break;
case SetTypeSecPlus_v2_390_00: case SetTypeSecPlus_v2_390_00:
gen_info = (GenInfo){.type = GenSecPlus2, gen_info = (GenInfo){
.type = GenSecPlus2,
.mod = "AM650", .mod = "AM650",
.freq = 390000000, .freq = 390000000,
.sec_plus_2.serial = (key & 0x7FFFF3FC), // 850LM pairing .sec_plus_2.serial = (key & 0x7FFFF3FC), // 850LM pairing
@@ -757,7 +812,8 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) {
.sec_plus_2.cnt = 0xE500000}; .sec_plus_2.cnt = 0xE500000};
break; break;
case SetTypeSecPlus_v2_433_00: case SetTypeSecPlus_v2_433_00:
gen_info = (GenInfo){.type = GenSecPlus2, gen_info = (GenInfo){
.type = GenSecPlus2,
.mod = "AM650", .mod = "AM650",
.freq = 433920000, .freq = 433920000,
.sec_plus_2.serial = (key & 0x7FFFF3FC), // 850LM pairing .sec_plus_2.serial = (key & 0x7FFFF3FC), // 850LM pairing

View File

@@ -79,7 +79,7 @@ bool subghz_scene_transmitter_on_event(void* context, SceneManagerEvent event) {
subghz_txrx_stop(subghz->txrx); subghz_txrx_stop(subghz->txrx);
if(subghz_custom_btn_get() != SUBGHZ_CUSTOM_BTN_OK) { if(subghz_custom_btn_get() != SUBGHZ_CUSTOM_BTN_OK) {
subghz_custom_btn_set(SUBGHZ_CUSTOM_BTN_OK); subghz_custom_btn_set(SUBGHZ_CUSTOM_BTN_OK);
int8_t tmp_counter = furi_hal_subghz_get_rolling_counter_mult(); int32_t tmp_counter = furi_hal_subghz_get_rolling_counter_mult();
furi_hal_subghz_set_rolling_counter_mult(0); furi_hal_subghz_set_rolling_counter_mult(0);
// Calling restore! // Calling restore!
subghz_tx_start(subghz, subghz_txrx_get_fff_data(subghz->txrx)); subghz_tx_start(subghz, subghz_txrx_get_fff_data(subghz->txrx));

View File

@@ -279,7 +279,7 @@ static bool subghz_protocol_alutech_at_4n_gen_data(
} else { } else {
instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult();
} }
} else if(instance->generic.cnt >= 0xFFFF) { } else if((instance->generic.cnt >= 0xFFFF) && (furi_hal_subghz_get_rolling_counter_mult() != 0)) {
instance->generic.cnt = 0; instance->generic.cnt = 0;
} }
crc = subghz_protocol_alutech_at_4n_decrypt_data_crc((uint8_t)(instance->generic.cnt & 0xFF)); crc = subghz_protocol_alutech_at_4n_decrypt_data_crc((uint8_t)(instance->generic.cnt & 0xFF));

View File

@@ -191,7 +191,7 @@ static void subghz_protocol_encoder_came_atomo_get_upload(
} else { } else {
instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult();
} }
} else if(instance->generic.cnt >= 0xFFFF) { } else if((instance->generic.cnt >= 0xFFFF) && (furi_hal_subghz_get_rolling_counter_mult() != 0)) {
instance->generic.cnt = 0; instance->generic.cnt = 0;
} }

View File

@@ -140,10 +140,41 @@ static bool subghz_protocol_faac_slh_gen_data(SubGhzProtocolEncoderFaacSLH* inst
data_prg[0] = 0x00; data_prg[0] = 0x00;
if(allow_zero_seed || (instance->generic.seed != 0x0)) { if(allow_zero_seed || (instance->generic.seed != 0x0)) {
if(!(furi_hal_subghz_get_rolling_counter_mult() >= 0xFFFF)) {
if(instance->generic.cnt < 0xFFFFF) {
if((instance->generic.cnt + furi_hal_subghz_get_rolling_counter_mult()) >
0xFFFFF) {
instance->generic.cnt = 0;
} else {
instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult();
}
} else if(
(instance->generic.cnt >= 0xFFFFF) &&
(furi_hal_subghz_get_rolling_counter_mult() != 0)) {
instance->generic.cnt = 0;
}
} else {
instance->generic.cnt += 1;
}
if(temp_counter_backup != 0x0) { if(temp_counter_backup != 0x0) {
if(!(furi_hal_subghz_get_rolling_counter_mult() >= 0xFFFF)) {
if(temp_counter_backup < 0xFFFFF) {
if((temp_counter_backup + furi_hal_subghz_get_rolling_counter_mult()) >
0xFFFFF) {
temp_counter_backup = 0;
} else {
temp_counter_backup += furi_hal_subghz_get_rolling_counter_mult(); temp_counter_backup += furi_hal_subghz_get_rolling_counter_mult();
} }
} else if(
(temp_counter_backup >= 0xFFFFF) &&
(furi_hal_subghz_get_rolling_counter_mult() != 0)) {
temp_counter_backup = 0;
}
} else {
temp_counter_backup += 1;
}
}
} }
data_prg[1] = instance->generic.cnt & 0xFF; data_prg[1] = instance->generic.cnt & 0xFF;
@@ -193,8 +224,10 @@ static bool subghz_protocol_faac_slh_gen_data(SubGhzProtocolEncoderFaacSLH* inst
(temp_fix_backup != 0x0) && !faac_prog_mode) { (temp_fix_backup != 0x0) && !faac_prog_mode) {
instance->generic.serial = temp_fix_backup >> 4; instance->generic.serial = temp_fix_backup >> 4;
instance->generic.btn = temp_fix_backup & 0xF; instance->generic.btn = temp_fix_backup & 0xF;
if(temp_counter_backup != 0x0) {
instance->generic.cnt = temp_counter_backup; instance->generic.cnt = temp_counter_backup;
} }
}
uint32_t fix = instance->generic.serial << 4 | instance->generic.btn; uint32_t fix = instance->generic.serial << 4 | instance->generic.btn;
uint32_t hop = 0; uint32_t hop = 0;
uint32_t decrypt = 0; uint32_t decrypt = 0;
@@ -207,8 +240,33 @@ static bool subghz_protocol_faac_slh_gen_data(SubGhzProtocolEncoderFaacSLH* inst
} }
if(allow_zero_seed || (instance->generic.seed != 0x0)) { if(allow_zero_seed || (instance->generic.seed != 0x0)) {
if(!(furi_hal_subghz_get_rolling_counter_mult() >= 0xFFFF)) {
if(instance->generic.cnt < 0xFFFFF) {
if((instance->generic.cnt + furi_hal_subghz_get_rolling_counter_mult()) >
0xFFFFF) {
instance->generic.cnt = 0;
} else {
instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult();
} }
} else if(
(instance->generic.cnt >= 0xFFFFF) &&
(furi_hal_subghz_get_rolling_counter_mult() != 0)) {
instance->generic.cnt = 0;
}
} else {
if(instance->generic.cnt < 0xFFFFF) {
if((instance->generic.cnt + 0xFFFFF) > 0xFFFFF) {
instance->generic.cnt = 0;
} else {
instance->generic.cnt += 0xFFFFF;
}
} else if(
(instance->generic.cnt >= 0xFFFFF) &&
(furi_hal_subghz_get_rolling_counter_mult() != 0)) {
instance->generic.cnt = 0;
}
}
}
if((instance->generic.cnt % 2) == 0) { if((instance->generic.cnt % 2) == 0) {
decrypt = fixx[6] << 28 | fixx[7] << 24 | fixx[5] << 20 | decrypt = fixx[6] << 28 | fixx[7] << 24 | fixx[5] << 20 |
@@ -248,7 +306,7 @@ bool subghz_protocol_faac_slh_create_data(
const char* manufacture_name, const char* manufacture_name,
SubGhzRadioPreset* preset) { SubGhzRadioPreset* preset) {
furi_assert(context); furi_assert(context);
// roguemaster don't steal!!! // OwO
SubGhzProtocolEncoderFaacSLH* instance = context; SubGhzProtocolEncoderFaacSLH* instance = context;
instance->generic.serial = serial; instance->generic.serial = serial;
instance->generic.btn = btn; instance->generic.btn = btn;

View File

@@ -151,6 +151,9 @@ static void subghz_protocol_encoder_hay21_get_upload(SubGhzProtocolEncoderHay21*
} else { } else {
instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult();
} }
if(furi_hal_subghz_get_rolling_counter_mult() >= 0xF) {
instance->generic.cnt = 0xF;
}
} else if(instance->generic.cnt >= 0xF) { } else if(instance->generic.cnt >= 0xF) {
instance->generic.cnt = 0; instance->generic.cnt = 0;
} }

View File

@@ -190,7 +190,9 @@ static bool subghz_protocol_keeloq_gen_data(
} else { } else {
instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult();
} }
} else if(instance->generic.cnt >= 0xFFFF) { } else if(
(instance->generic.cnt >= 0xFFFF) &&
(furi_hal_subghz_get_rolling_counter_mult() != 0)) {
instance->generic.cnt = 0; instance->generic.cnt = 0;
} }
} }

View File

@@ -161,7 +161,7 @@ static bool subghz_protocol_kinggates_stylo_4k_gen_data(
} else { } else {
instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult();
} }
} else if(instance->generic.cnt >= 0xFFFF) { } else if((instance->generic.cnt >= 0xFFFF) && (furi_hal_subghz_get_rolling_counter_mult() != 0)) {
instance->generic.cnt = 0; instance->generic.cnt = 0;
} }

View File

@@ -157,7 +157,7 @@ static void subghz_protocol_encoder_nice_flor_s_get_upload(
} else { } else {
instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult();
} }
} else if(instance->generic.cnt >= 0xFFFF) { } else if((instance->generic.cnt >= 0xFFFF) && (furi_hal_subghz_get_rolling_counter_mult() != 0)) {
instance->generic.cnt = 0; instance->generic.cnt = 0;
} }
uint64_t decrypt = ((uint64_t)instance->generic.serial << 16) | instance->generic.cnt; uint64_t decrypt = ((uint64_t)instance->generic.serial << 16) | instance->generic.cnt;

View File

@@ -136,7 +136,7 @@ static bool
} else { } else {
instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult();
} }
} else if(instance->generic.cnt >= 0xFFFF) { } else if((instance->generic.cnt >= 0xFFFF) && (furi_hal_subghz_get_rolling_counter_mult() != 0)) {
instance->generic.cnt = 0; instance->generic.cnt = 0;
} }

View File

@@ -130,7 +130,7 @@ static bool subghz_protocol_somfy_telis_gen_data(
} else { } else {
instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult();
} }
} else if(instance->generic.cnt >= 0xFFFF) { } else if((instance->generic.cnt >= 0xFFFF) && (furi_hal_subghz_get_rolling_counter_mult() != 0)) {
instance->generic.cnt = 0; instance->generic.cnt = 0;
} }

View File

@@ -135,7 +135,7 @@ static bool
} else { } else {
instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult();
} }
} else if(instance->generic.cnt >= 0xFFFF) { } else if((instance->generic.cnt >= 0xFFFF) && (furi_hal_subghz_get_rolling_counter_mult() != 0)) {
instance->generic.cnt = 0; instance->generic.cnt = 0;
} }
uint32_t fix = btn << 24 | instance->generic.serial; uint32_t fix = btn << 24 | instance->generic.serial;

View File

@@ -1716,7 +1716,7 @@ Function,+,furi_hal_subghz_flush_tx,void,
Function,+,furi_hal_subghz_get_data_gpio,const GpioPin*, Function,+,furi_hal_subghz_get_data_gpio,const GpioPin*,
Function,+,furi_hal_subghz_get_ext_leds_and_amp,_Bool, Function,+,furi_hal_subghz_get_ext_leds_and_amp,_Bool,
Function,+,furi_hal_subghz_get_lqi,uint8_t, Function,+,furi_hal_subghz_get_lqi,uint8_t,
Function,+,furi_hal_subghz_get_rolling_counter_mult,int8_t, Function,+,furi_hal_subghz_get_rolling_counter_mult,int32_t,
Function,+,furi_hal_subghz_get_rssi,float, Function,+,furi_hal_subghz_get_rssi,float,
Function,+,furi_hal_subghz_idle,void, Function,+,furi_hal_subghz_idle,void,
Function,-,furi_hal_subghz_init,void, Function,-,furi_hal_subghz_init,void,
@@ -1736,7 +1736,7 @@ Function,+,furi_hal_subghz_set_ext_leds_and_amp,void,_Bool
Function,+,furi_hal_subghz_set_frequency,uint32_t,uint32_t Function,+,furi_hal_subghz_set_frequency,uint32_t,uint32_t
Function,+,furi_hal_subghz_set_frequency_and_path,uint32_t,uint32_t Function,+,furi_hal_subghz_set_frequency_and_path,uint32_t,uint32_t
Function,+,furi_hal_subghz_set_path,void,FuriHalSubGhzPath Function,+,furi_hal_subghz_set_path,void,FuriHalSubGhzPath
Function,+,furi_hal_subghz_set_rolling_counter_mult,void,int8_t Function,+,furi_hal_subghz_set_rolling_counter_mult,void,int32_t
Function,+,furi_hal_subghz_shutdown,void, Function,+,furi_hal_subghz_shutdown,void,
Function,+,furi_hal_subghz_sleep,void, Function,+,furi_hal_subghz_sleep,void,
Function,+,furi_hal_subghz_start_async_rx,void,"FuriHalSubGhzCaptureCallback, void*" Function,+,furi_hal_subghz_start_async_rx,void,"FuriHalSubGhzCaptureCallback, void*"
1 entry status name type params
1716 Function + furi_hal_subghz_get_data_gpio const GpioPin*
1717 Function + furi_hal_subghz_get_ext_leds_and_amp _Bool
1718 Function + furi_hal_subghz_get_lqi uint8_t
1719 Function + furi_hal_subghz_get_rolling_counter_mult int8_t int32_t
1720 Function + furi_hal_subghz_get_rssi float
1721 Function + furi_hal_subghz_idle void
1722 Function - furi_hal_subghz_init void
1736 Function + furi_hal_subghz_set_frequency uint32_t uint32_t
1737 Function + furi_hal_subghz_set_frequency_and_path uint32_t uint32_t
1738 Function + furi_hal_subghz_set_path void FuriHalSubGhzPath
1739 Function + furi_hal_subghz_set_rolling_counter_mult void int8_t int32_t
1740 Function + furi_hal_subghz_shutdown void
1741 Function + furi_hal_subghz_sleep void
1742 Function + furi_hal_subghz_start_async_rx void FuriHalSubGhzCaptureCallback, void*

View File

@@ -51,7 +51,7 @@ typedef struct {
volatile SubGhzRegulation regulation; volatile SubGhzRegulation regulation;
const GpioPin* async_mirror_pin; const GpioPin* async_mirror_pin;
int8_t rolling_counter_mult; int32_t rolling_counter_mult;
bool ext_leds_and_amp : 1; bool ext_leds_and_amp : 1;
bool dangerous_frequency_i : 1; bool dangerous_frequency_i : 1;
} FuriHalSubGhz; } FuriHalSubGhz;
@@ -65,11 +65,11 @@ volatile FuriHalSubGhz furi_hal_subghz = {
.dangerous_frequency_i = false, .dangerous_frequency_i = false,
}; };
int8_t furi_hal_subghz_get_rolling_counter_mult(void) { int32_t furi_hal_subghz_get_rolling_counter_mult(void) {
return furi_hal_subghz.rolling_counter_mult; return furi_hal_subghz.rolling_counter_mult;
} }
void furi_hal_subghz_set_rolling_counter_mult(int8_t mult) { void furi_hal_subghz_set_rolling_counter_mult(int32_t mult) {
furi_hal_subghz.rolling_counter_mult = mult; furi_hal_subghz.rolling_counter_mult = mult;
} }

View File

@@ -174,14 +174,14 @@ uint32_t furi_hal_subghz_set_frequency_and_path(uint32_t value);
bool furi_hal_subghz_is_tx_allowed(uint32_t value); bool furi_hal_subghz_is_tx_allowed(uint32_t value);
/** Get the current rolling protocols counter ++/-- value /** Get the current rolling protocols counter ++/-- value
* @return int8_t current value * @return int32_t current value
*/ */
int8_t furi_hal_subghz_get_rolling_counter_mult(void); int32_t furi_hal_subghz_get_rolling_counter_mult(void);
/** Set the current rolling protocols counter ++/-- value /** Set the current rolling protocols counter ++/-- value
* @param mult int8_t = -1, -10, -100, 0, 1, 10, 100 * @param mult int32_t = -1, -10, -50, 0, 1, 10, 50
*/ */
void furi_hal_subghz_set_rolling_counter_mult(int8_t mult); void furi_hal_subghz_set_rolling_counter_mult(int32_t mult);
/** Set frequency /** Set frequency
* *