[FL-3106] SubGhz: better and more verbose error handling in protocols, stricter CAME validation (#2443)
* SubGhz: add error protocol * WS: add error protocol * SubGhz: error processing * SubGhz: more stringent CAME protocol restrictions * SubGhz: fix header duration CAME protocol * SubGhz: delete comments * SubGhz: sync SubGhzProtocolStatus with FuriStatus * SubGhz: update documentation and bump api_version Co-authored-by: あく <alleteam@gmail.com>
This commit is contained in:
		
							parent
							
								
									6cc5119c64
								
							
						
					
					
						commit
						72ca6b25e9
					
				| @ -53,6 +53,7 @@ typedef enum { | |||||||
|     SubGhzLoadKeyStateUnknown, |     SubGhzLoadKeyStateUnknown, | ||||||
|     SubGhzLoadKeyStateOK, |     SubGhzLoadKeyStateOK, | ||||||
|     SubGhzLoadKeyStateParseErr, |     SubGhzLoadKeyStateParseErr, | ||||||
|  |     SubGhzLoadKeyStateProtocolDescriptionErr, | ||||||
| } SubGhzLoadKeyState; | } SubGhzLoadKeyState; | ||||||
| 
 | 
 | ||||||
| /** SubGhzLock */ | /** SubGhzLock */ | ||||||
|  | |||||||
| @ -22,7 +22,9 @@ static bool subghz_scene_receiver_info_update_parser(void* context) { | |||||||
|     subghz->txrx->decoder_result = subghz_receiver_search_decoder_base_by_name( |     subghz->txrx->decoder_result = subghz_receiver_search_decoder_base_by_name( | ||||||
|         subghz->txrx->receiver, |         subghz->txrx->receiver, | ||||||
|         subghz_history_get_protocol_name(subghz->txrx->history, subghz->txrx->idx_menu_chosen)); |         subghz_history_get_protocol_name(subghz->txrx->history, subghz->txrx->idx_menu_chosen)); | ||||||
|  | 
 | ||||||
|     if(subghz->txrx->decoder_result) { |     if(subghz->txrx->decoder_result) { | ||||||
|  |         //todo we are trying to deserialize without checking for errors, since it is assumed that we just received this chignal
 | ||||||
|         subghz_protocol_decoder_base_deserialize( |         subghz_protocol_decoder_base_deserialize( | ||||||
|             subghz->txrx->decoder_result, |             subghz->txrx->decoder_result, | ||||||
|             subghz_history_get_raw_data(subghz->txrx->history, subghz->txrx->idx_menu_chosen)); |             subghz_history_get_raw_data(subghz->txrx->history, subghz->txrx->idx_menu_chosen)); | ||||||
| @ -128,7 +130,6 @@ bool subghz_scene_receiver_info_on_event(void* context, SceneManagerEvent event) | |||||||
|                        subghz, |                        subghz, | ||||||
|                        subghz_history_get_raw_data( |                        subghz_history_get_raw_data( | ||||||
|                            subghz->txrx->history, subghz->txrx->idx_menu_chosen))) { |                            subghz->txrx->history, subghz->txrx->idx_menu_chosen))) { | ||||||
|                     scene_manager_next_scene(subghz->scene_manager, SubGhzSceneShowOnlyRx); |  | ||||||
|                     if(subghz->txrx->txrx_state == SubGhzTxRxStateTx) { |                     if(subghz->txrx->txrx_state == SubGhzTxRxStateTx) { | ||||||
|                         subghz_tx_stop(subghz); |                         subghz_tx_stop(subghz); | ||||||
|                     } |                     } | ||||||
|  | |||||||
| @ -34,8 +34,9 @@ bool subghz_scene_set_type_submenu_gen_data_protocol( | |||||||
|     do { |     do { | ||||||
|         Stream* fff_data_stream = flipper_format_get_raw_stream(subghz->txrx->fff_data); |         Stream* fff_data_stream = flipper_format_get_raw_stream(subghz->txrx->fff_data); | ||||||
|         stream_clean(fff_data_stream); |         stream_clean(fff_data_stream); | ||||||
|         if(!subghz_protocol_decoder_base_serialize( |         if(subghz_protocol_decoder_base_serialize( | ||||||
|                subghz->txrx->decoder_result, subghz->txrx->fff_data, subghz->txrx->preset)) { |                subghz->txrx->decoder_result, subghz->txrx->fff_data, subghz->txrx->preset) != | ||||||
|  |            SubGhzProtocolStatusOk) { | ||||||
|             FURI_LOG_E(TAG, "Unable to serialize"); |             FURI_LOG_E(TAG, "Unable to serialize"); | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|  | |||||||
| @ -9,9 +9,8 @@ void subghz_scene_transmitter_callback(SubGhzCustomEvent event, void* context) { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_scene_transmitter_update_data_show(void* context) { | bool subghz_scene_transmitter_update_data_show(void* context) { | ||||||
|     //ToDo Fix
 |  | ||||||
|     SubGhz* subghz = context; |     SubGhz* subghz = context; | ||||||
| 
 |     bool ret = false; | ||||||
|     if(subghz->txrx->decoder_result) { |     if(subghz->txrx->decoder_result) { | ||||||
|         FuriString* key_str; |         FuriString* key_str; | ||||||
|         FuriString* frequency_str; |         FuriString* frequency_str; | ||||||
| @ -22,30 +21,29 @@ bool subghz_scene_transmitter_update_data_show(void* context) { | |||||||
|         modulation_str = furi_string_alloc(); |         modulation_str = furi_string_alloc(); | ||||||
|         uint8_t show_button = 0; |         uint8_t show_button = 0; | ||||||
| 
 | 
 | ||||||
|         subghz_protocol_decoder_base_deserialize( |         if(subghz_protocol_decoder_base_deserialize( | ||||||
|             subghz->txrx->decoder_result, subghz->txrx->fff_data); |                subghz->txrx->decoder_result, subghz->txrx->fff_data) == SubGhzProtocolStatusOk) { | ||||||
|         subghz_protocol_decoder_base_get_string(subghz->txrx->decoder_result, key_str); |             subghz_protocol_decoder_base_get_string(subghz->txrx->decoder_result, key_str); | ||||||
| 
 | 
 | ||||||
|         if((subghz->txrx->decoder_result->protocol->flag & SubGhzProtocolFlag_Send) == |             if((subghz->txrx->decoder_result->protocol->flag & SubGhzProtocolFlag_Send) == | ||||||
|            SubGhzProtocolFlag_Send) { |                SubGhzProtocolFlag_Send) { | ||||||
|             show_button = 1; |                 show_button = 1; | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             subghz_get_frequency_modulation(subghz, frequency_str, modulation_str); | ||||||
|  |             subghz_view_transmitter_add_data_to_show( | ||||||
|  |                 subghz->subghz_transmitter, | ||||||
|  |                 furi_string_get_cstr(key_str), | ||||||
|  |                 furi_string_get_cstr(frequency_str), | ||||||
|  |                 furi_string_get_cstr(modulation_str), | ||||||
|  |                 show_button); | ||||||
|  |             ret = true; | ||||||
|         } |         } | ||||||
| 
 |  | ||||||
|         subghz_get_frequency_modulation(subghz, frequency_str, modulation_str); |  | ||||||
|         subghz_view_transmitter_add_data_to_show( |  | ||||||
|             subghz->subghz_transmitter, |  | ||||||
|             furi_string_get_cstr(key_str), |  | ||||||
|             furi_string_get_cstr(frequency_str), |  | ||||||
|             furi_string_get_cstr(modulation_str), |  | ||||||
|             show_button); |  | ||||||
| 
 |  | ||||||
|         furi_string_free(frequency_str); |         furi_string_free(frequency_str); | ||||||
|         furi_string_free(modulation_str); |         furi_string_free(modulation_str); | ||||||
|         furi_string_free(key_str); |         furi_string_free(key_str); | ||||||
| 
 |  | ||||||
|         return true; |  | ||||||
|     } |     } | ||||||
|     return false; |     return ret; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void subghz_scene_transmitter_on_enter(void* context) { | void subghz_scene_transmitter_on_enter(void* context) { | ||||||
|  | |||||||
| @ -153,7 +153,6 @@ bool subghz_tx_start(SubGhz* subghz, FlipperFormat* flipper_format) { | |||||||
|             FURI_LOG_E(TAG, "Missing Protocol"); |             FURI_LOG_E(TAG, "Missing Protocol"); | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         //ToDo FIX
 |  | ||||||
|         if(!flipper_format_insert_or_update_uint32(flipper_format, "Repeat", &repeat, 1)) { |         if(!flipper_format_insert_or_update_uint32(flipper_format, "Repeat", &repeat, 1)) { | ||||||
|             FURI_LOG_E(TAG, "Unable Repeat"); |             FURI_LOG_E(TAG, "Unable Repeat"); | ||||||
|             break; |             break; | ||||||
| @ -163,7 +162,8 @@ bool subghz_tx_start(SubGhz* subghz, FlipperFormat* flipper_format) { | |||||||
|             subghz->txrx->environment, furi_string_get_cstr(temp_str)); |             subghz->txrx->environment, furi_string_get_cstr(temp_str)); | ||||||
| 
 | 
 | ||||||
|         if(subghz->txrx->transmitter) { |         if(subghz->txrx->transmitter) { | ||||||
|             if(subghz_transmitter_deserialize(subghz->txrx->transmitter, flipper_format)) { |             if(subghz_transmitter_deserialize(subghz->txrx->transmitter, flipper_format) == | ||||||
|  |                SubGhzProtocolStatusOk) { | ||||||
|                 if(strcmp(furi_string_get_cstr(subghz->txrx->preset->name), "") != 0) { |                 if(strcmp(furi_string_get_cstr(subghz->txrx->preset->name), "") != 0) { | ||||||
|                     subghz_begin( |                     subghz_begin( | ||||||
|                         subghz, |                         subghz, | ||||||
| @ -186,7 +186,12 @@ bool subghz_tx_start(SubGhz* subghz, FlipperFormat* flipper_format) { | |||||||
|                     //Start TX
 |                     //Start TX
 | ||||||
|                     furi_hal_subghz_start_async_tx( |                     furi_hal_subghz_start_async_tx( | ||||||
|                         subghz_transmitter_yield, subghz->txrx->transmitter); |                         subghz_transmitter_yield, subghz->txrx->transmitter); | ||||||
|  |                 } else { | ||||||
|  |                     subghz_dialog_message_show_only_rx(subghz); | ||||||
|                 } |                 } | ||||||
|  |             } else { | ||||||
|  |                 dialog_message_show_storage_error( | ||||||
|  |                     subghz->dialogs, "Error in protocol\nparameters\ndescription"); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         if(!ret) { |         if(!ret) { | ||||||
| @ -333,8 +338,10 @@ bool subghz_key_load(SubGhz* subghz, const char* file_path, bool show_dialog) { | |||||||
|         subghz->txrx->decoder_result = subghz_receiver_search_decoder_base_by_name( |         subghz->txrx->decoder_result = subghz_receiver_search_decoder_base_by_name( | ||||||
|             subghz->txrx->receiver, furi_string_get_cstr(temp_str)); |             subghz->txrx->receiver, furi_string_get_cstr(temp_str)); | ||||||
|         if(subghz->txrx->decoder_result) { |         if(subghz->txrx->decoder_result) { | ||||||
|             if(!subghz_protocol_decoder_base_deserialize( |             SubGhzProtocolStatus status = subghz_protocol_decoder_base_deserialize( | ||||||
|                    subghz->txrx->decoder_result, subghz->txrx->fff_data)) { |                 subghz->txrx->decoder_result, subghz->txrx->fff_data); | ||||||
|  |             if(status != SubGhzProtocolStatusOk) { | ||||||
|  |                 load_key_state = SubGhzLoadKeyStateProtocolDescriptionErr; | ||||||
|                 break; |                 break; | ||||||
|             } |             } | ||||||
|         } else { |         } else { | ||||||
| @ -355,6 +362,12 @@ bool subghz_key_load(SubGhz* subghz, const char* file_path, bool show_dialog) { | |||||||
|             dialog_message_show_storage_error(subghz->dialogs, "Cannot parse\nfile"); |             dialog_message_show_storage_error(subghz->dialogs, "Cannot parse\nfile"); | ||||||
|         } |         } | ||||||
|         return false; |         return false; | ||||||
|  |     case SubGhzLoadKeyStateProtocolDescriptionErr: | ||||||
|  |         if(show_dialog) { | ||||||
|  |             dialog_message_show_storage_error( | ||||||
|  |                 subghz->dialogs, "Error in protocol\nparameters\ndescription"); | ||||||
|  |         } | ||||||
|  |         return false; | ||||||
| 
 | 
 | ||||||
|     case SubGhzLoadKeyStateOK: |     case SubGhzLoadKeyStateOK: | ||||||
|         return true; |         return true; | ||||||
|  | |||||||
| @ -3,7 +3,7 @@ | |||||||
| #include <furi.h> | #include <furi.h> | ||||||
| #include <furi_hal.h> | #include <furi_hal.h> | ||||||
| 
 | 
 | ||||||
| #define WS_VERSION_APP "0.7" | #define WS_VERSION_APP "0.8" | ||||||
| #define WS_DEVELOPED "SkorP" | #define WS_DEVELOPED "SkorP" | ||||||
| #define WS_GITHUB "https://github.com/flipperdevices/flipperzero-firmware"
 | #define WS_GITHUB "https://github.com/flipperdevices/flipperzero-firmware"
 | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -258,7 +258,7 @@ uint8_t ws_protocol_decoder_acurite_592txr_get_hash_data(void* context) { | |||||||
|         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); |         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool ws_protocol_decoder_acurite_592txr_serialize( | SubGhzProtocolStatus ws_protocol_decoder_acurite_592txr_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset) { |     SubGhzRadioPreset* preset) { | ||||||
| @ -267,22 +267,14 @@ bool ws_protocol_decoder_acurite_592txr_serialize( | |||||||
|     return ws_block_generic_serialize(&instance->generic, flipper_format, preset); |     return ws_block_generic_serialize(&instance->generic, flipper_format, preset); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool ws_protocol_decoder_acurite_592txr_deserialize(void* context, FlipperFormat* flipper_format) { | SubGhzProtocolStatus | ||||||
|  |     ws_protocol_decoder_acurite_592txr_deserialize(void* context, FlipperFormat* flipper_format) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     WSProtocolDecoderAcurite_592TXR* instance = context; |     WSProtocolDecoderAcurite_592TXR* instance = context; | ||||||
|     bool ret = false; |     return ws_block_generic_deserialize_check_count_bit( | ||||||
|     do { |         &instance->generic, | ||||||
|         if(!ws_block_generic_deserialize(&instance->generic, flipper_format)) { |         flipper_format, | ||||||
|             break; |         ws_protocol_acurite_592txr_const.min_count_bit_for_found); | ||||||
|         } |  | ||||||
|         if(instance->generic.data_count_bit != |  | ||||||
|            ws_protocol_acurite_592txr_const.min_count_bit_for_found) { |  | ||||||
|             FURI_LOG_E(TAG, "Wrong number of bits in key"); |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|         ret = true; |  | ||||||
|     } while(false); |  | ||||||
|     return ret; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void ws_protocol_decoder_acurite_592txr_get_string(void* context, FuriString* output) { | void ws_protocol_decoder_acurite_592txr_get_string(void* context, FuriString* output) { | ||||||
|  | |||||||
| @ -56,9 +56,9 @@ uint8_t ws_protocol_decoder_acurite_592txr_get_hash_data(void* context); | |||||||
|  * @param context Pointer to a WSProtocolDecoderAcurite_592TXR instance |  * @param context Pointer to a WSProtocolDecoderAcurite_592TXR instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @param preset The modulation on which the signal was received, SubGhzRadioPreset |  * @param preset The modulation on which the signal was received, SubGhzRadioPreset | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool ws_protocol_decoder_acurite_592txr_serialize( | SubGhzProtocolStatus ws_protocol_decoder_acurite_592txr_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset); |     SubGhzRadioPreset* preset); | ||||||
| @ -67,9 +67,10 @@ bool ws_protocol_decoder_acurite_592txr_serialize( | |||||||
|  * Deserialize data WSProtocolDecoderAcurite_592TXR. |  * Deserialize data WSProtocolDecoderAcurite_592TXR. | ||||||
|  * @param context Pointer to a WSProtocolDecoderAcurite_592TXR instance |  * @param context Pointer to a WSProtocolDecoderAcurite_592TXR instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool ws_protocol_decoder_acurite_592txr_deserialize(void* context, FlipperFormat* flipper_format); | SubGhzProtocolStatus | ||||||
|  |     ws_protocol_decoder_acurite_592txr_deserialize(void* context, FlipperFormat* flipper_format); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Getting a textual representation of the received data. |  * Getting a textual representation of the received data. | ||||||
|  | |||||||
| @ -199,7 +199,7 @@ uint8_t ws_protocol_decoder_acurite_606tx_get_hash_data(void* context) { | |||||||
|         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); |         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool ws_protocol_decoder_acurite_606tx_serialize( | SubGhzProtocolStatus ws_protocol_decoder_acurite_606tx_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset) { |     SubGhzRadioPreset* preset) { | ||||||
| @ -208,22 +208,14 @@ bool ws_protocol_decoder_acurite_606tx_serialize( | |||||||
|     return ws_block_generic_serialize(&instance->generic, flipper_format, preset); |     return ws_block_generic_serialize(&instance->generic, flipper_format, preset); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool ws_protocol_decoder_acurite_606tx_deserialize(void* context, FlipperFormat* flipper_format) { | SubGhzProtocolStatus | ||||||
|  |     ws_protocol_decoder_acurite_606tx_deserialize(void* context, FlipperFormat* flipper_format) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     WSProtocolDecoderAcurite_606TX* instance = context; |     WSProtocolDecoderAcurite_606TX* instance = context; | ||||||
|     bool ret = false; |     return ws_block_generic_deserialize_check_count_bit( | ||||||
|     do { |         &instance->generic, | ||||||
|         if(!ws_block_generic_deserialize(&instance->generic, flipper_format)) { |         flipper_format, | ||||||
|             break; |         ws_protocol_acurite_606tx_const.min_count_bit_for_found); | ||||||
|         } |  | ||||||
|         if(instance->generic.data_count_bit != |  | ||||||
|            ws_protocol_acurite_606tx_const.min_count_bit_for_found) { |  | ||||||
|             FURI_LOG_E(TAG, "Wrong number of bits in key"); |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|         ret = true; |  | ||||||
|     } while(false); |  | ||||||
|     return ret; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void ws_protocol_decoder_acurite_606tx_get_string(void* context, FuriString* output) { | void ws_protocol_decoder_acurite_606tx_get_string(void* context, FuriString* output) { | ||||||
|  | |||||||
| @ -56,9 +56,9 @@ uint8_t ws_protocol_decoder_acurite_606tx_get_hash_data(void* context); | |||||||
|  * @param context Pointer to a WSProtocolDecoderAcurite_606TX instance |  * @param context Pointer to a WSProtocolDecoderAcurite_606TX instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @param preset The modulation on which the signal was received, SubGhzRadioPreset |  * @param preset The modulation on which the signal was received, SubGhzRadioPreset | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool ws_protocol_decoder_acurite_606tx_serialize( | SubGhzProtocolStatus ws_protocol_decoder_acurite_606tx_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset); |     SubGhzRadioPreset* preset); | ||||||
| @ -67,9 +67,10 @@ bool ws_protocol_decoder_acurite_606tx_serialize( | |||||||
|  * Deserialize data WSProtocolDecoderAcurite_606TX. |  * Deserialize data WSProtocolDecoderAcurite_606TX. | ||||||
|  * @param context Pointer to a WSProtocolDecoderAcurite_606TX instance |  * @param context Pointer to a WSProtocolDecoderAcurite_606TX instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool ws_protocol_decoder_acurite_606tx_deserialize(void* context, FlipperFormat* flipper_format); | SubGhzProtocolStatus | ||||||
|  |     ws_protocol_decoder_acurite_606tx_deserialize(void* context, FlipperFormat* flipper_format); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Getting a textual representation of the received data. |  * Getting a textual representation of the received data. | ||||||
|  | |||||||
| @ -199,7 +199,7 @@ uint8_t ws_protocol_decoder_acurite_609txc_get_hash_data(void* context) { | |||||||
|         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); |         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool ws_protocol_decoder_acurite_609txc_serialize( | SubGhzProtocolStatus ws_protocol_decoder_acurite_609txc_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset) { |     SubGhzRadioPreset* preset) { | ||||||
| @ -208,22 +208,14 @@ bool ws_protocol_decoder_acurite_609txc_serialize( | |||||||
|     return ws_block_generic_serialize(&instance->generic, flipper_format, preset); |     return ws_block_generic_serialize(&instance->generic, flipper_format, preset); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool ws_protocol_decoder_acurite_609txc_deserialize(void* context, FlipperFormat* flipper_format) { | SubGhzProtocolStatus | ||||||
|  |     ws_protocol_decoder_acurite_609txc_deserialize(void* context, FlipperFormat* flipper_format) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     WSProtocolDecoderAcurite_609TXC* instance = context; |     WSProtocolDecoderAcurite_609TXC* instance = context; | ||||||
|     bool ret = false; |     return ws_block_generic_deserialize_check_count_bit( | ||||||
|     do { |         &instance->generic, | ||||||
|         if(!ws_block_generic_deserialize(&instance->generic, flipper_format)) { |         flipper_format, | ||||||
|             break; |         ws_protocol_acurite_609txc_const.min_count_bit_for_found); | ||||||
|         } |  | ||||||
|         if(instance->generic.data_count_bit != |  | ||||||
|            ws_protocol_acurite_609txc_const.min_count_bit_for_found) { |  | ||||||
|             FURI_LOG_E(TAG, "Wrong number of bits in key"); |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|         ret = true; |  | ||||||
|     } while(false); |  | ||||||
|     return ret; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void ws_protocol_decoder_acurite_609txc_get_string(void* context, FuriString* output) { | void ws_protocol_decoder_acurite_609txc_get_string(void* context, FuriString* output) { | ||||||
|  | |||||||
| @ -56,9 +56,9 @@ uint8_t ws_protocol_decoder_acurite_609txc_get_hash_data(void* context); | |||||||
|  * @param context Pointer to a WSProtocolDecoderAcurite_609TXC instance |  * @param context Pointer to a WSProtocolDecoderAcurite_609TXC instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @param preset The modulation on which the signal was received, SubGhzRadioPreset |  * @param preset The modulation on which the signal was received, SubGhzRadioPreset | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool ws_protocol_decoder_acurite_609txc_serialize( | SubGhzProtocolStatus ws_protocol_decoder_acurite_609txc_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset); |     SubGhzRadioPreset* preset); | ||||||
| @ -67,9 +67,10 @@ bool ws_protocol_decoder_acurite_609txc_serialize( | |||||||
|  * Deserialize data WSProtocolDecoderAcurite_609TXC. |  * Deserialize data WSProtocolDecoderAcurite_609TXC. | ||||||
|  * @param context Pointer to a WSProtocolDecoderAcurite_609TXC instance |  * @param context Pointer to a WSProtocolDecoderAcurite_609TXC instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool ws_protocol_decoder_acurite_609txc_deserialize(void* context, FlipperFormat* flipper_format); | SubGhzProtocolStatus | ||||||
|  |     ws_protocol_decoder_acurite_609txc_deserialize(void* context, FlipperFormat* flipper_format); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Getting a textual representation of the received data. |  * Getting a textual representation of the received data. | ||||||
|  | |||||||
| @ -228,7 +228,7 @@ uint8_t ws_protocol_decoder_ambient_weather_get_hash_data(void* context) { | |||||||
|         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); |         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool ws_protocol_decoder_ambient_weather_serialize( | SubGhzProtocolStatus ws_protocol_decoder_ambient_weather_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset) { |     SubGhzRadioPreset* preset) { | ||||||
| @ -237,22 +237,14 @@ bool ws_protocol_decoder_ambient_weather_serialize( | |||||||
|     return ws_block_generic_serialize(&instance->generic, flipper_format, preset); |     return ws_block_generic_serialize(&instance->generic, flipper_format, preset); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool ws_protocol_decoder_ambient_weather_deserialize(void* context, FlipperFormat* flipper_format) { | SubGhzProtocolStatus | ||||||
|  |     ws_protocol_decoder_ambient_weather_deserialize(void* context, FlipperFormat* flipper_format) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     WSProtocolDecoderAmbient_Weather* instance = context; |     WSProtocolDecoderAmbient_Weather* instance = context; | ||||||
|     bool ret = false; |     return ws_block_generic_deserialize_check_count_bit( | ||||||
|     do { |         &instance->generic, | ||||||
|         if(!ws_block_generic_deserialize(&instance->generic, flipper_format)) { |         flipper_format, | ||||||
|             break; |         ws_protocol_ambient_weather_const.min_count_bit_for_found); | ||||||
|         } |  | ||||||
|         if(instance->generic.data_count_bit != |  | ||||||
|            ws_protocol_ambient_weather_const.min_count_bit_for_found) { |  | ||||||
|             FURI_LOG_E(TAG, "Wrong number of bits in key"); |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|         ret = true; |  | ||||||
|     } while(false); |  | ||||||
|     return ret; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void ws_protocol_decoder_ambient_weather_get_string(void* context, FuriString* output) { | void ws_protocol_decoder_ambient_weather_get_string(void* context, FuriString* output) { | ||||||
|  | |||||||
| @ -56,9 +56,9 @@ uint8_t ws_protocol_decoder_ambient_weather_get_hash_data(void* context); | |||||||
|  * @param context Pointer to a WSProtocolDecoderAmbient_Weather instance |  * @param context Pointer to a WSProtocolDecoderAmbient_Weather instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @param preset The modulation on which the signal was received, SubGhzRadioPreset |  * @param preset The modulation on which the signal was received, SubGhzRadioPreset | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool ws_protocol_decoder_ambient_weather_serialize( | SubGhzProtocolStatus ws_protocol_decoder_ambient_weather_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset); |     SubGhzRadioPreset* preset); | ||||||
| @ -67,9 +67,10 @@ bool ws_protocol_decoder_ambient_weather_serialize( | |||||||
|  * Deserialize data WSProtocolDecoderAmbient_Weather. |  * Deserialize data WSProtocolDecoderAmbient_Weather. | ||||||
|  * @param context Pointer to a WSProtocolDecoderAmbient_Weather instance |  * @param context Pointer to a WSProtocolDecoderAmbient_Weather instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool ws_protocol_decoder_ambient_weather_deserialize(void* context, FlipperFormat* flipper_format); | SubGhzProtocolStatus | ||||||
|  |     ws_protocol_decoder_ambient_weather_deserialize(void* context, FlipperFormat* flipper_format); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Getting a textual representation of the received data. |  * Getting a textual representation of the received data. | ||||||
|  | |||||||
| @ -210,7 +210,7 @@ uint8_t ws_protocol_decoder_auriol_th_get_hash_data(void* context) { | |||||||
|         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); |         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool ws_protocol_decoder_auriol_th_serialize( | SubGhzProtocolStatus ws_protocol_decoder_auriol_th_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset) { |     SubGhzRadioPreset* preset) { | ||||||
| @ -219,22 +219,12 @@ bool ws_protocol_decoder_auriol_th_serialize( | |||||||
|     return ws_block_generic_serialize(&instance->generic, flipper_format, preset); |     return ws_block_generic_serialize(&instance->generic, flipper_format, preset); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool ws_protocol_decoder_auriol_th_deserialize(void* context, FlipperFormat* flipper_format) { | SubGhzProtocolStatus | ||||||
|  |     ws_protocol_decoder_auriol_th_deserialize(void* context, FlipperFormat* flipper_format) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     WSProtocolDecoderAuriol_TH* instance = context; |     WSProtocolDecoderAuriol_TH* instance = context; | ||||||
|     bool ret = false; |     return ws_block_generic_deserialize_check_count_bit( | ||||||
|     do { |         &instance->generic, flipper_format, ws_protocol_auriol_th_const.min_count_bit_for_found); | ||||||
|         if(!ws_block_generic_deserialize(&instance->generic, flipper_format)) { |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|         if(instance->generic.data_count_bit != |  | ||||||
|            ws_protocol_auriol_th_const.min_count_bit_for_found) { |  | ||||||
|             FURI_LOG_E(TAG, "Wrong number of bits in key"); |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|         ret = true; |  | ||||||
|     } while(false); |  | ||||||
|     return ret; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void ws_protocol_decoder_auriol_th_get_string(void* context, FuriString* output) { | void ws_protocol_decoder_auriol_th_get_string(void* context, FuriString* output) { | ||||||
|  | |||||||
| @ -56,9 +56,9 @@ uint8_t ws_protocol_decoder_auriol_th_get_hash_data(void* context); | |||||||
|  * @param context Pointer to a WSProtocolDecoderAuriol_TH instance |  * @param context Pointer to a WSProtocolDecoderAuriol_TH instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @param preset The modulation on which the signal was received, SubGhzRadioPreset |  * @param preset The modulation on which the signal was received, SubGhzRadioPreset | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool ws_protocol_decoder_auriol_th_serialize( | SubGhzProtocolStatus ws_protocol_decoder_auriol_th_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset); |     SubGhzRadioPreset* preset); | ||||||
| @ -67,9 +67,10 @@ bool ws_protocol_decoder_auriol_th_serialize( | |||||||
|  * Deserialize data WSProtocolDecoderAuriol_TH. |  * Deserialize data WSProtocolDecoderAuriol_TH. | ||||||
|  * @param context Pointer to a WSProtocolDecoderAuriol_TH instance |  * @param context Pointer to a WSProtocolDecoderAuriol_TH instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool ws_protocol_decoder_auriol_th_deserialize(void* context, FlipperFormat* flipper_format); | SubGhzProtocolStatus | ||||||
|  |     ws_protocol_decoder_auriol_th_deserialize(void* context, FlipperFormat* flipper_format); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Getting a textual representation of the received data. |  * Getting a textual representation of the received data. | ||||||
|  | |||||||
| @ -217,7 +217,7 @@ uint8_t ws_protocol_decoder_gt_wt_02_get_hash_data(void* context) { | |||||||
|         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); |         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool ws_protocol_decoder_gt_wt_02_serialize( | SubGhzProtocolStatus ws_protocol_decoder_gt_wt_02_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset) { |     SubGhzRadioPreset* preset) { | ||||||
| @ -226,22 +226,12 @@ bool ws_protocol_decoder_gt_wt_02_serialize( | |||||||
|     return ws_block_generic_serialize(&instance->generic, flipper_format, preset); |     return ws_block_generic_serialize(&instance->generic, flipper_format, preset); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool ws_protocol_decoder_gt_wt_02_deserialize(void* context, FlipperFormat* flipper_format) { | SubGhzProtocolStatus | ||||||
|  |     ws_protocol_decoder_gt_wt_02_deserialize(void* context, FlipperFormat* flipper_format) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     WSProtocolDecoderGT_WT02* instance = context; |     WSProtocolDecoderGT_WT02* instance = context; | ||||||
|     bool ret = false; |     return ws_block_generic_deserialize_check_count_bit( | ||||||
|     do { |         &instance->generic, flipper_format, ws_protocol_gt_wt_02_const.min_count_bit_for_found); | ||||||
|         if(!ws_block_generic_deserialize(&instance->generic, flipper_format)) { |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|         if(instance->generic.data_count_bit != |  | ||||||
|            ws_protocol_gt_wt_02_const.min_count_bit_for_found) { |  | ||||||
|             FURI_LOG_E(TAG, "Wrong number of bits in key"); |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|         ret = true; |  | ||||||
|     } while(false); |  | ||||||
|     return ret; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void ws_protocol_decoder_gt_wt_02_get_string(void* context, FuriString* output) { | void ws_protocol_decoder_gt_wt_02_get_string(void* context, FuriString* output) { | ||||||
|  | |||||||
| @ -56,9 +56,9 @@ uint8_t ws_protocol_decoder_gt_wt_02_get_hash_data(void* context); | |||||||
|  * @param context Pointer to a WSProtocolDecoderGT_WT02 instance |  * @param context Pointer to a WSProtocolDecoderGT_WT02 instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @param preset The modulation on which the signal was received, SubGhzRadioPreset |  * @param preset The modulation on which the signal was received, SubGhzRadioPreset | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool ws_protocol_decoder_gt_wt_02_serialize( | SubGhzProtocolStatus ws_protocol_decoder_gt_wt_02_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset); |     SubGhzRadioPreset* preset); | ||||||
| @ -67,9 +67,10 @@ bool ws_protocol_decoder_gt_wt_02_serialize( | |||||||
|  * Deserialize data WSProtocolDecoderGT_WT02. |  * Deserialize data WSProtocolDecoderGT_WT02. | ||||||
|  * @param context Pointer to a WSProtocolDecoderGT_WT02 instance |  * @param context Pointer to a WSProtocolDecoderGT_WT02 instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool ws_protocol_decoder_gt_wt_02_deserialize(void* context, FlipperFormat* flipper_format); | SubGhzProtocolStatus | ||||||
|  |     ws_protocol_decoder_gt_wt_02_deserialize(void* context, FlipperFormat* flipper_format); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Getting a textual representation of the received data. |  * Getting a textual representation of the received data. | ||||||
|  | |||||||
| @ -292,7 +292,7 @@ uint8_t ws_protocol_decoder_gt_wt_03_get_hash_data(void* context) { | |||||||
|         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); |         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool ws_protocol_decoder_gt_wt_03_serialize( | SubGhzProtocolStatus ws_protocol_decoder_gt_wt_03_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset) { |     SubGhzRadioPreset* preset) { | ||||||
| @ -301,22 +301,12 @@ bool ws_protocol_decoder_gt_wt_03_serialize( | |||||||
|     return ws_block_generic_serialize(&instance->generic, flipper_format, preset); |     return ws_block_generic_serialize(&instance->generic, flipper_format, preset); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool ws_protocol_decoder_gt_wt_03_deserialize(void* context, FlipperFormat* flipper_format) { | SubGhzProtocolStatus | ||||||
|  |     ws_protocol_decoder_gt_wt_03_deserialize(void* context, FlipperFormat* flipper_format) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     WSProtocolDecoderGT_WT03* instance = context; |     WSProtocolDecoderGT_WT03* instance = context; | ||||||
|     bool ret = false; |     return ws_block_generic_deserialize_check_count_bit( | ||||||
|     do { |         &instance->generic, flipper_format, ws_protocol_gt_wt_03_const.min_count_bit_for_found); | ||||||
|         if(!ws_block_generic_deserialize(&instance->generic, flipper_format)) { |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|         if(instance->generic.data_count_bit != |  | ||||||
|            ws_protocol_gt_wt_03_const.min_count_bit_for_found) { |  | ||||||
|             FURI_LOG_E(TAG, "Wrong number of bits in key"); |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|         ret = true; |  | ||||||
|     } while(false); |  | ||||||
|     return ret; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void ws_protocol_decoder_gt_wt_03_get_string(void* context, FuriString* output) { | void ws_protocol_decoder_gt_wt_03_get_string(void* context, FuriString* output) { | ||||||
|  | |||||||
| @ -56,9 +56,9 @@ uint8_t ws_protocol_decoder_gt_wt_03_get_hash_data(void* context); | |||||||
|  * @param context Pointer to a WSProtocolDecoderGT_WT03 instance |  * @param context Pointer to a WSProtocolDecoderGT_WT03 instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @param preset The modulation on which the signal was received, SubGhzRadioPreset |  * @param preset The modulation on which the signal was received, SubGhzRadioPreset | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool ws_protocol_decoder_gt_wt_03_serialize( | SubGhzProtocolStatus ws_protocol_decoder_gt_wt_03_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset); |     SubGhzRadioPreset* preset); | ||||||
| @ -67,9 +67,10 @@ bool ws_protocol_decoder_gt_wt_03_serialize( | |||||||
|  * Deserialize data WSProtocolDecoderGT_WT03. |  * Deserialize data WSProtocolDecoderGT_WT03. | ||||||
|  * @param context Pointer to a WSProtocolDecoderGT_WT03 instance |  * @param context Pointer to a WSProtocolDecoderGT_WT03 instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool ws_protocol_decoder_gt_wt_03_deserialize(void* context, FlipperFormat* flipper_format); | SubGhzProtocolStatus | ||||||
|  |     ws_protocol_decoder_gt_wt_03_deserialize(void* context, FlipperFormat* flipper_format); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Getting a textual representation of the received data. |  * Getting a textual representation of the received data. | ||||||
|  | |||||||
| @ -248,7 +248,7 @@ uint8_t ws_protocol_decoder_infactory_get_hash_data(void* context) { | |||||||
|         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); |         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool ws_protocol_decoder_infactory_serialize( | SubGhzProtocolStatus ws_protocol_decoder_infactory_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset) { |     SubGhzRadioPreset* preset) { | ||||||
| @ -257,22 +257,12 @@ bool ws_protocol_decoder_infactory_serialize( | |||||||
|     return ws_block_generic_serialize(&instance->generic, flipper_format, preset); |     return ws_block_generic_serialize(&instance->generic, flipper_format, preset); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool ws_protocol_decoder_infactory_deserialize(void* context, FlipperFormat* flipper_format) { | SubGhzProtocolStatus | ||||||
|  |     ws_protocol_decoder_infactory_deserialize(void* context, FlipperFormat* flipper_format) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     WSProtocolDecoderInfactory* instance = context; |     WSProtocolDecoderInfactory* instance = context; | ||||||
|     bool ret = false; |     return ws_block_generic_deserialize_check_count_bit( | ||||||
|     do { |         &instance->generic, flipper_format, ws_protocol_infactory_const.min_count_bit_for_found); | ||||||
|         if(!ws_block_generic_deserialize(&instance->generic, flipper_format)) { |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|         if(instance->generic.data_count_bit != |  | ||||||
|            ws_protocol_infactory_const.min_count_bit_for_found) { |  | ||||||
|             FURI_LOG_E(TAG, "Wrong number of bits in key"); |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|         ret = true; |  | ||||||
|     } while(false); |  | ||||||
|     return ret; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void ws_protocol_decoder_infactory_get_string(void* context, FuriString* output) { | void ws_protocol_decoder_infactory_get_string(void* context, FuriString* output) { | ||||||
|  | |||||||
| @ -56,9 +56,9 @@ uint8_t ws_protocol_decoder_infactory_get_hash_data(void* context); | |||||||
|  * @param context Pointer to a WSProtocolDecoderInfactory instance |  * @param context Pointer to a WSProtocolDecoderInfactory instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @param preset The modulation on which the signal was received, SubGhzRadioPreset |  * @param preset The modulation on which the signal was received, SubGhzRadioPreset | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool ws_protocol_decoder_infactory_serialize( | SubGhzProtocolStatus ws_protocol_decoder_infactory_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset); |     SubGhzRadioPreset* preset); | ||||||
| @ -67,9 +67,10 @@ bool ws_protocol_decoder_infactory_serialize( | |||||||
|  * Deserialize data WSProtocolDecoderInfactory. |  * Deserialize data WSProtocolDecoderInfactory. | ||||||
|  * @param context Pointer to a WSProtocolDecoderInfactory instance |  * @param context Pointer to a WSProtocolDecoderInfactory instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool ws_protocol_decoder_infactory_deserialize(void* context, FlipperFormat* flipper_format); | SubGhzProtocolStatus | ||||||
|  |     ws_protocol_decoder_infactory_deserialize(void* context, FlipperFormat* flipper_format); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Getting a textual representation of the received data. |  * Getting a textual representation of the received data. | ||||||
|  | |||||||
| @ -281,7 +281,7 @@ uint8_t ws_protocol_decoder_lacrosse_tx_get_hash_data(void* context) { | |||||||
|         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); |         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool ws_protocol_decoder_lacrosse_tx_serialize( | SubGhzProtocolStatus ws_protocol_decoder_lacrosse_tx_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset) { |     SubGhzRadioPreset* preset) { | ||||||
| @ -290,22 +290,12 @@ bool ws_protocol_decoder_lacrosse_tx_serialize( | |||||||
|     return ws_block_generic_serialize(&instance->generic, flipper_format, preset); |     return ws_block_generic_serialize(&instance->generic, flipper_format, preset); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool ws_protocol_decoder_lacrosse_tx_deserialize(void* context, FlipperFormat* flipper_format) { | SubGhzProtocolStatus | ||||||
|  |     ws_protocol_decoder_lacrosse_tx_deserialize(void* context, FlipperFormat* flipper_format) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     WSProtocolDecoderLaCrosse_TX* instance = context; |     WSProtocolDecoderLaCrosse_TX* instance = context; | ||||||
|     bool ret = false; |     return ws_block_generic_deserialize_check_count_bit( | ||||||
|     do { |         &instance->generic, flipper_format, ws_protocol_lacrosse_tx_const.min_count_bit_for_found); | ||||||
|         if(!ws_block_generic_deserialize(&instance->generic, flipper_format)) { |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|         if(instance->generic.data_count_bit != |  | ||||||
|            ws_protocol_lacrosse_tx_const.min_count_bit_for_found) { |  | ||||||
|             FURI_LOG_E(TAG, "Wrong number of bits in key"); |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|         ret = true; |  | ||||||
|     } while(false); |  | ||||||
|     return ret; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void ws_protocol_decoder_lacrosse_tx_get_string(void* context, FuriString* output) { | void ws_protocol_decoder_lacrosse_tx_get_string(void* context, FuriString* output) { | ||||||
|  | |||||||
| @ -56,9 +56,9 @@ uint8_t ws_protocol_decoder_lacrosse_tx_get_hash_data(void* context); | |||||||
|  * @param context Pointer to a WSProtocolDecoderLaCrosse_TX instance |  * @param context Pointer to a WSProtocolDecoderLaCrosse_TX instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @param preset The modulation on which the signal was received, SubGhzRadioPreset |  * @param preset The modulation on which the signal was received, SubGhzRadioPreset | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool ws_protocol_decoder_lacrosse_tx_serialize( | SubGhzProtocolStatus ws_protocol_decoder_lacrosse_tx_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset); |     SubGhzRadioPreset* preset); | ||||||
| @ -67,9 +67,10 @@ bool ws_protocol_decoder_lacrosse_tx_serialize( | |||||||
|  * Deserialize data WSProtocolDecoderLaCrosse_TX. |  * Deserialize data WSProtocolDecoderLaCrosse_TX. | ||||||
|  * @param context Pointer to a WSProtocolDecoderLaCrosse_TX instance |  * @param context Pointer to a WSProtocolDecoderLaCrosse_TX instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool ws_protocol_decoder_lacrosse_tx_deserialize(void* context, FlipperFormat* flipper_format); | SubGhzProtocolStatus | ||||||
|  |     ws_protocol_decoder_lacrosse_tx_deserialize(void* context, FlipperFormat* flipper_format); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Getting a textual representation of the received data. |  * Getting a textual representation of the received data. | ||||||
|  | |||||||
| @ -247,7 +247,7 @@ uint8_t ws_protocol_decoder_lacrosse_tx141thbv2_get_hash_data(void* context) { | |||||||
|         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); |         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool ws_protocol_decoder_lacrosse_tx141thbv2_serialize( | SubGhzProtocolStatus ws_protocol_decoder_lacrosse_tx141thbv2_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset) { |     SubGhzRadioPreset* preset) { | ||||||
| @ -256,24 +256,15 @@ bool ws_protocol_decoder_lacrosse_tx141thbv2_serialize( | |||||||
|     return ws_block_generic_serialize(&instance->generic, flipper_format, preset); |     return ws_block_generic_serialize(&instance->generic, flipper_format, preset); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool ws_protocol_decoder_lacrosse_tx141thbv2_deserialize( | SubGhzProtocolStatus ws_protocol_decoder_lacrosse_tx141thbv2_deserialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format) { |     FlipperFormat* flipper_format) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     WSProtocolDecoderLaCrosse_TX141THBv2* instance = context; |     WSProtocolDecoderLaCrosse_TX141THBv2* instance = context; | ||||||
|     bool ret = false; |     return ws_block_generic_deserialize_check_count_bit( | ||||||
|     do { |         &instance->generic, | ||||||
|         if(!ws_block_generic_deserialize(&instance->generic, flipper_format)) { |         flipper_format, | ||||||
|             break; |         ws_protocol_lacrosse_tx141thbv2_const.min_count_bit_for_found); | ||||||
|         } |  | ||||||
|         if(instance->generic.data_count_bit != |  | ||||||
|            ws_protocol_lacrosse_tx141thbv2_const.min_count_bit_for_found) { |  | ||||||
|             FURI_LOG_E(TAG, "Wrong number of bits in key"); |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|         ret = true; |  | ||||||
|     } while(false); |  | ||||||
|     return ret; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void ws_protocol_decoder_lacrosse_tx141thbv2_get_string(void* context, FuriString* output) { | void ws_protocol_decoder_lacrosse_tx141thbv2_get_string(void* context, FuriString* output) { | ||||||
|  | |||||||
| @ -56,9 +56,9 @@ uint8_t ws_protocol_decoder_lacrosse_tx141thbv2_get_hash_data(void* context); | |||||||
|  * @param context Pointer to a WSProtocolDecoderLaCrosse_TX141THBv2 instance |  * @param context Pointer to a WSProtocolDecoderLaCrosse_TX141THBv2 instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @param preset The modulation on which the signal was received, SubGhzRadioPreset |  * @param preset The modulation on which the signal was received, SubGhzRadioPreset | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool ws_protocol_decoder_lacrosse_tx141thbv2_serialize( | SubGhzProtocolStatus ws_protocol_decoder_lacrosse_tx141thbv2_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset); |     SubGhzRadioPreset* preset); | ||||||
| @ -67,9 +67,9 @@ bool ws_protocol_decoder_lacrosse_tx141thbv2_serialize( | |||||||
|  * Deserialize data WSProtocolDecoderLaCrosse_TX141THBv2. |  * Deserialize data WSProtocolDecoderLaCrosse_TX141THBv2. | ||||||
|  * @param context Pointer to a WSProtocolDecoderLaCrosse_TX141THBv2 instance |  * @param context Pointer to a WSProtocolDecoderLaCrosse_TX141THBv2 instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool ws_protocol_decoder_lacrosse_tx141thbv2_deserialize( | SubGhzProtocolStatus ws_protocol_decoder_lacrosse_tx141thbv2_deserialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format); |     FlipperFormat* flipper_format); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -216,7 +216,7 @@ uint8_t ws_protocol_decoder_nexus_th_get_hash_data(void* context) { | |||||||
|         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); |         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool ws_protocol_decoder_nexus_th_serialize( | SubGhzProtocolStatus ws_protocol_decoder_nexus_th_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset) { |     SubGhzRadioPreset* preset) { | ||||||
| @ -225,22 +225,12 @@ bool ws_protocol_decoder_nexus_th_serialize( | |||||||
|     return ws_block_generic_serialize(&instance->generic, flipper_format, preset); |     return ws_block_generic_serialize(&instance->generic, flipper_format, preset); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool ws_protocol_decoder_nexus_th_deserialize(void* context, FlipperFormat* flipper_format) { | SubGhzProtocolStatus | ||||||
|  |     ws_protocol_decoder_nexus_th_deserialize(void* context, FlipperFormat* flipper_format) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     WSProtocolDecoderNexus_TH* instance = context; |     WSProtocolDecoderNexus_TH* instance = context; | ||||||
|     bool ret = false; |     return ws_block_generic_deserialize_check_count_bit( | ||||||
|     do { |         &instance->generic, flipper_format, ws_protocol_nexus_th_const.min_count_bit_for_found); | ||||||
|         if(!ws_block_generic_deserialize(&instance->generic, flipper_format)) { |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|         if(instance->generic.data_count_bit != |  | ||||||
|            ws_protocol_nexus_th_const.min_count_bit_for_found) { |  | ||||||
|             FURI_LOG_E(TAG, "Wrong number of bits in key"); |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|         ret = true; |  | ||||||
|     } while(false); |  | ||||||
|     return ret; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void ws_protocol_decoder_nexus_th_get_string(void* context, FuriString* output) { | void ws_protocol_decoder_nexus_th_get_string(void* context, FuriString* output) { | ||||||
|  | |||||||
| @ -56,9 +56,9 @@ uint8_t ws_protocol_decoder_nexus_th_get_hash_data(void* context); | |||||||
|  * @param context Pointer to a WSProtocolDecoderNexus_TH instance |  * @param context Pointer to a WSProtocolDecoderNexus_TH instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @param preset The modulation on which the signal was received, SubGhzRadioPreset |  * @param preset The modulation on which the signal was received, SubGhzRadioPreset | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool ws_protocol_decoder_nexus_th_serialize( | SubGhzProtocolStatus ws_protocol_decoder_nexus_th_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset); |     SubGhzRadioPreset* preset); | ||||||
| @ -67,9 +67,10 @@ bool ws_protocol_decoder_nexus_th_serialize( | |||||||
|  * Deserialize data WSProtocolDecoderNexus_TH. |  * Deserialize data WSProtocolDecoderNexus_TH. | ||||||
|  * @param context Pointer to a WSProtocolDecoderNexus_TH instance |  * @param context Pointer to a WSProtocolDecoderNexus_TH instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool ws_protocol_decoder_nexus_th_deserialize(void* context, FlipperFormat* flipper_format); | SubGhzProtocolStatus | ||||||
|  |     ws_protocol_decoder_nexus_th_deserialize(void* context, FlipperFormat* flipper_format); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Getting a textual representation of the received data. |  * Getting a textual representation of the received data. | ||||||
|  | |||||||
| @ -302,17 +302,19 @@ uint8_t ws_protocol_decoder_oregon2_get_hash_data(void* context) { | |||||||
|         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); |         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool ws_protocol_decoder_oregon2_serialize( | SubGhzProtocolStatus ws_protocol_decoder_oregon2_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset) { |     SubGhzRadioPreset* preset) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     WSProtocolDecoderOregon2* instance = context; |     WSProtocolDecoderOregon2* instance = context; | ||||||
|     if(!ws_block_generic_serialize(&instance->generic, flipper_format, preset)) return false; |     SubGhzProtocolStatus ret = SubGhzProtocolStatusError; | ||||||
|  |     ret = ws_block_generic_serialize(&instance->generic, flipper_format, preset); | ||||||
|  |     if(ret != SubGhzProtocolStatusOk) return ret; | ||||||
|     uint32_t temp = instance->var_bits; |     uint32_t temp = instance->var_bits; | ||||||
|     if(!flipper_format_write_uint32(flipper_format, "VarBits", &temp, 1)) { |     if(!flipper_format_write_uint32(flipper_format, "VarBits", &temp, 1)) { | ||||||
|         FURI_LOG_E(TAG, "Error adding VarBits"); |         FURI_LOG_E(TAG, "Error adding VarBits"); | ||||||
|         return false; |         return SubGhzProtocolStatusErrorParserOthers; | ||||||
|     } |     } | ||||||
|     if(!flipper_format_write_hex( |     if(!flipper_format_write_hex( | ||||||
|            flipper_format, |            flipper_format, | ||||||
| @ -320,22 +322,25 @@ bool ws_protocol_decoder_oregon2_serialize( | |||||||
|            (const uint8_t*)&instance->var_data, |            (const uint8_t*)&instance->var_data, | ||||||
|            sizeof(instance->var_data))) { |            sizeof(instance->var_data))) { | ||||||
|         FURI_LOG_E(TAG, "Error adding VarData"); |         FURI_LOG_E(TAG, "Error adding VarData"); | ||||||
|         return false; |         return SubGhzProtocolStatusErrorParserOthers; | ||||||
|     } |     } | ||||||
|     return true; |     return ret; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool ws_protocol_decoder_oregon2_deserialize(void* context, FlipperFormat* flipper_format) { | SubGhzProtocolStatus | ||||||
|  |     ws_protocol_decoder_oregon2_deserialize(void* context, FlipperFormat* flipper_format) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     WSProtocolDecoderOregon2* instance = context; |     WSProtocolDecoderOregon2* instance = context; | ||||||
|     bool ret = false; |  | ||||||
|     uint32_t temp_data; |     uint32_t temp_data; | ||||||
|  |     SubGhzProtocolStatus ret = SubGhzProtocolStatusError; | ||||||
|     do { |     do { | ||||||
|         if(!ws_block_generic_deserialize(&instance->generic, flipper_format)) { |         ret = ws_block_generic_deserialize(&instance->generic, flipper_format); | ||||||
|  |         if(ret != SubGhzProtocolStatusOk) { | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         if(!flipper_format_read_uint32(flipper_format, "VarBits", &temp_data, 1)) { |         if(!flipper_format_read_uint32(flipper_format, "VarBits", &temp_data, 1)) { | ||||||
|             FURI_LOG_E(TAG, "Missing VarLen"); |             FURI_LOG_E(TAG, "Missing VarLen"); | ||||||
|  |             ret = SubGhzProtocolStatusErrorParserOthers; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         instance->var_bits = (uint8_t)temp_data; |         instance->var_bits = (uint8_t)temp_data; | ||||||
| @ -345,13 +350,14 @@ bool ws_protocol_decoder_oregon2_deserialize(void* context, FlipperFormat* flipp | |||||||
|                (uint8_t*)&instance->var_data, |                (uint8_t*)&instance->var_data, | ||||||
|                sizeof(instance->var_data))) { //-V1051
 |                sizeof(instance->var_data))) { //-V1051
 | ||||||
|             FURI_LOG_E(TAG, "Missing VarData"); |             FURI_LOG_E(TAG, "Missing VarData"); | ||||||
|  |             ret = SubGhzProtocolStatusErrorParserOthers; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         if(instance->generic.data_count_bit != ws_oregon2_const.min_count_bit_for_found) { |         if(instance->generic.data_count_bit != ws_oregon2_const.min_count_bit_for_found) { | ||||||
|             FURI_LOG_E(TAG, "Wrong number of bits in key: %d", instance->generic.data_count_bit); |             FURI_LOG_E(TAG, "Wrong number of bits in key: %d", instance->generic.data_count_bit); | ||||||
|  |             ret = SubGhzProtocolStatusErrorValueBitCount; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         ret = true; |  | ||||||
|     } while(false); |     } while(false); | ||||||
|     return ret; |     return ret; | ||||||
| } | } | ||||||
|  | |||||||
| @ -283,7 +283,7 @@ uint8_t ws_protocol_decoder_oregon_v1_get_hash_data(void* context) { | |||||||
|         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); |         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool ws_protocol_decoder_oregon_v1_serialize( | SubGhzProtocolStatus ws_protocol_decoder_oregon_v1_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset) { |     SubGhzRadioPreset* preset) { | ||||||
| @ -292,22 +292,12 @@ bool ws_protocol_decoder_oregon_v1_serialize( | |||||||
|     return ws_block_generic_serialize(&instance->generic, flipper_format, preset); |     return ws_block_generic_serialize(&instance->generic, flipper_format, preset); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool ws_protocol_decoder_oregon_v1_deserialize(void* context, FlipperFormat* flipper_format) { | SubGhzProtocolStatus | ||||||
|  |     ws_protocol_decoder_oregon_v1_deserialize(void* context, FlipperFormat* flipper_format) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     WSProtocolDecoderOregon_V1* instance = context; |     WSProtocolDecoderOregon_V1* instance = context; | ||||||
|     bool ret = false; |     return ws_block_generic_deserialize_check_count_bit( | ||||||
|     do { |         &instance->generic, flipper_format, ws_protocol_oregon_v1_const.min_count_bit_for_found); | ||||||
|         if(!ws_block_generic_deserialize(&instance->generic, flipper_format)) { |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|         if(instance->generic.data_count_bit != |  | ||||||
|            ws_protocol_oregon_v1_const.min_count_bit_for_found) { |  | ||||||
|             FURI_LOG_E(TAG, "Wrong number of bits in key"); |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|         ret = true; |  | ||||||
|     } while(false); |  | ||||||
|     return ret; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void ws_protocol_decoder_oregon_v1_get_string(void* context, FuriString* output) { | void ws_protocol_decoder_oregon_v1_get_string(void* context, FuriString* output) { | ||||||
|  | |||||||
| @ -56,9 +56,9 @@ uint8_t ws_protocol_decoder_oregon_v1_get_hash_data(void* context); | |||||||
|  * @param context Pointer to a WSProtocolDecoderOregon_V1 instance |  * @param context Pointer to a WSProtocolDecoderOregon_V1 instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @param preset The modulation on which the signal was received, SubGhzRadioPreset |  * @param preset The modulation on which the signal was received, SubGhzRadioPreset | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool ws_protocol_decoder_oregon_v1_serialize( | SubGhzProtocolStatus ws_protocol_decoder_oregon_v1_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset); |     SubGhzRadioPreset* preset); | ||||||
| @ -67,9 +67,10 @@ bool ws_protocol_decoder_oregon_v1_serialize( | |||||||
|  * Deserialize data WSProtocolDecoderOregon_V1. |  * Deserialize data WSProtocolDecoderOregon_V1. | ||||||
|  * @param context Pointer to a WSProtocolDecoderOregon_V1 instance |  * @param context Pointer to a WSProtocolDecoderOregon_V1 instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool ws_protocol_decoder_oregon_v1_deserialize(void* context, FlipperFormat* flipper_format); | SubGhzProtocolStatus | ||||||
|  |     ws_protocol_decoder_oregon_v1_deserialize(void* context, FlipperFormat* flipper_format); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Getting a textual representation of the received data. |  * Getting a textual representation of the received data. | ||||||
|  | |||||||
| @ -211,7 +211,7 @@ uint8_t ws_protocol_decoder_thermopro_tx4_get_hash_data(void* context) { | |||||||
|         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); |         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool ws_protocol_decoder_thermopro_tx4_serialize( | SubGhzProtocolStatus ws_protocol_decoder_thermopro_tx4_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset) { |     SubGhzRadioPreset* preset) { | ||||||
| @ -220,22 +220,14 @@ bool ws_protocol_decoder_thermopro_tx4_serialize( | |||||||
|     return ws_block_generic_serialize(&instance->generic, flipper_format, preset); |     return ws_block_generic_serialize(&instance->generic, flipper_format, preset); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool ws_protocol_decoder_thermopro_tx4_deserialize(void* context, FlipperFormat* flipper_format) { | SubGhzProtocolStatus | ||||||
|  |     ws_protocol_decoder_thermopro_tx4_deserialize(void* context, FlipperFormat* flipper_format) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     WSProtocolDecoderThermoPRO_TX4* instance = context; |     WSProtocolDecoderThermoPRO_TX4* instance = context; | ||||||
|     bool ret = false; |     return ws_block_generic_deserialize_check_count_bit( | ||||||
|     do { |         &instance->generic, | ||||||
|         if(!ws_block_generic_deserialize(&instance->generic, flipper_format)) { |         flipper_format, | ||||||
|             break; |         ws_protocol_thermopro_tx4_const.min_count_bit_for_found); | ||||||
|         } |  | ||||||
|         if(instance->generic.data_count_bit != |  | ||||||
|            ws_protocol_thermopro_tx4_const.min_count_bit_for_found) { |  | ||||||
|             FURI_LOG_E(TAG, "Wrong number of bits in key"); |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|         ret = true; |  | ||||||
|     } while(false); |  | ||||||
|     return ret; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void ws_protocol_decoder_thermopro_tx4_get_string(void* context, FuriString* output) { | void ws_protocol_decoder_thermopro_tx4_get_string(void* context, FuriString* output) { | ||||||
|  | |||||||
| @ -56,9 +56,9 @@ uint8_t ws_protocol_decoder_thermopro_tx4_get_hash_data(void* context); | |||||||
|  * @param context Pointer to a WSProtocolDecoderThermoPRO_TX4 instance |  * @param context Pointer to a WSProtocolDecoderThermoPRO_TX4 instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @param preset The modulation on which the signal was received, SubGhzRadioPreset |  * @param preset The modulation on which the signal was received, SubGhzRadioPreset | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool ws_protocol_decoder_thermopro_tx4_serialize( | SubGhzProtocolStatus ws_protocol_decoder_thermopro_tx4_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset); |     SubGhzRadioPreset* preset); | ||||||
| @ -67,9 +67,10 @@ bool ws_protocol_decoder_thermopro_tx4_serialize( | |||||||
|  * Deserialize data WSProtocolDecoderThermoPRO_TX4. |  * Deserialize data WSProtocolDecoderThermoPRO_TX4. | ||||||
|  * @param context Pointer to a WSProtocolDecoderThermoPRO_TX4 instance |  * @param context Pointer to a WSProtocolDecoderThermoPRO_TX4 instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool ws_protocol_decoder_thermopro_tx4_deserialize(void* context, FlipperFormat* flipper_format); | SubGhzProtocolStatus | ||||||
|  |     ws_protocol_decoder_thermopro_tx4_deserialize(void* context, FlipperFormat* flipper_format); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Getting a textual representation of the received data. |  * Getting a textual representation of the received data. | ||||||
|  | |||||||
| @ -246,7 +246,7 @@ uint8_t ws_protocol_decoder_tx_8300_get_hash_data(void* context) { | |||||||
|         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); |         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool ws_protocol_decoder_tx_8300_serialize( | SubGhzProtocolStatus ws_protocol_decoder_tx_8300_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset) { |     SubGhzRadioPreset* preset) { | ||||||
| @ -255,21 +255,12 @@ bool ws_protocol_decoder_tx_8300_serialize( | |||||||
|     return ws_block_generic_serialize(&instance->generic, flipper_format, preset); |     return ws_block_generic_serialize(&instance->generic, flipper_format, preset); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool ws_protocol_decoder_tx_8300_deserialize(void* context, FlipperFormat* flipper_format) { | SubGhzProtocolStatus | ||||||
|  |     ws_protocol_decoder_tx_8300_deserialize(void* context, FlipperFormat* flipper_format) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     WSProtocolDecoderTX_8300* instance = context; |     WSProtocolDecoderTX_8300* instance = context; | ||||||
|     bool ret = false; |     return ws_block_generic_deserialize_check_count_bit( | ||||||
|     do { |         &instance->generic, flipper_format, ws_protocol_tx_8300_const.min_count_bit_for_found); | ||||||
|         if(!ws_block_generic_deserialize(&instance->generic, flipper_format)) { |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|         if(instance->generic.data_count_bit != ws_protocol_tx_8300_const.min_count_bit_for_found) { |  | ||||||
|             FURI_LOG_E(TAG, "Wrong number of bits in key"); |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|         ret = true; |  | ||||||
|     } while(false); |  | ||||||
|     return ret; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void ws_protocol_decoder_tx_8300_get_string(void* context, FuriString* output) { | void ws_protocol_decoder_tx_8300_get_string(void* context, FuriString* output) { | ||||||
|  | |||||||
| @ -56,9 +56,9 @@ uint8_t ws_protocol_decoder_tx_8300_get_hash_data(void* context); | |||||||
|  * @param context Pointer to a WSProtocolDecoderTX_8300 instance |  * @param context Pointer to a WSProtocolDecoderTX_8300 instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @param preset The modulation on which the signal was received, SubGhzRadioPreset |  * @param preset The modulation on which the signal was received, SubGhzRadioPreset | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool ws_protocol_decoder_tx_8300_serialize( | SubGhzProtocolStatus ws_protocol_decoder_tx_8300_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset); |     SubGhzRadioPreset* preset); | ||||||
| @ -67,9 +67,10 @@ bool ws_protocol_decoder_tx_8300_serialize( | |||||||
|  * Deserialize data WSProtocolDecoderTX_8300. |  * Deserialize data WSProtocolDecoderTX_8300. | ||||||
|  * @param context Pointer to a WSProtocolDecoderTX_8300 instance |  * @param context Pointer to a WSProtocolDecoderTX_8300 instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool ws_protocol_decoder_tx_8300_deserialize(void* context, FlipperFormat* flipper_format); | SubGhzProtocolStatus | ||||||
|  |     ws_protocol_decoder_tx_8300_deserialize(void* context, FlipperFormat* flipper_format); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Getting a textual representation of the received data. |  * Getting a textual representation of the received data. | ||||||
|  | |||||||
| @ -21,12 +21,12 @@ void ws_block_generic_get_preset_name(const char* preset_name, FuriString* prese | |||||||
|     furi_string_set(preset_str, preset_name_temp); |     furi_string_set(preset_str, preset_name_temp); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool ws_block_generic_serialize( | SubGhzProtocolStatus ws_block_generic_serialize( | ||||||
|     WSBlockGeneric* instance, |     WSBlockGeneric* instance, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset) { |     SubGhzRadioPreset* preset) { | ||||||
|     furi_assert(instance); |     furi_assert(instance); | ||||||
|     bool res = false; |     SubGhzProtocolStatus res = SubGhzProtocolStatusError; | ||||||
|     FuriString* temp_str; |     FuriString* temp_str; | ||||||
|     temp_str = furi_string_alloc(); |     temp_str = furi_string_alloc(); | ||||||
|     do { |     do { | ||||||
| @ -34,11 +34,13 @@ bool ws_block_generic_serialize( | |||||||
|         if(!flipper_format_write_header_cstr( |         if(!flipper_format_write_header_cstr( | ||||||
|                flipper_format, WS_KEY_FILE_TYPE, WS_KEY_FILE_VERSION)) { |                flipper_format, WS_KEY_FILE_TYPE, WS_KEY_FILE_VERSION)) { | ||||||
|             FURI_LOG_E(TAG, "Unable to add header"); |             FURI_LOG_E(TAG, "Unable to add header"); | ||||||
|  |             res = SubGhzProtocolStatusErrorParserHeader; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         if(!flipper_format_write_uint32(flipper_format, "Frequency", &preset->frequency, 1)) { |         if(!flipper_format_write_uint32(flipper_format, "Frequency", &preset->frequency, 1)) { | ||||||
|             FURI_LOG_E(TAG, "Unable to add Frequency"); |             FURI_LOG_E(TAG, "Unable to add Frequency"); | ||||||
|  |             res = SubGhzProtocolStatusErrorParserFrequency; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
| @ -46,34 +48,40 @@ bool ws_block_generic_serialize( | |||||||
|         if(!flipper_format_write_string_cstr( |         if(!flipper_format_write_string_cstr( | ||||||
|                flipper_format, "Preset", furi_string_get_cstr(temp_str))) { |                flipper_format, "Preset", furi_string_get_cstr(temp_str))) { | ||||||
|             FURI_LOG_E(TAG, "Unable to add Preset"); |             FURI_LOG_E(TAG, "Unable to add Preset"); | ||||||
|  |             res = SubGhzProtocolStatusErrorParserPreset; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         if(!strcmp(furi_string_get_cstr(temp_str), "FuriHalSubGhzPresetCustom")) { |         if(!strcmp(furi_string_get_cstr(temp_str), "FuriHalSubGhzPresetCustom")) { | ||||||
|             if(!flipper_format_write_string_cstr( |             if(!flipper_format_write_string_cstr( | ||||||
|                    flipper_format, "Custom_preset_module", "CC1101")) { |                    flipper_format, "Custom_preset_module", "CC1101")) { | ||||||
|                 FURI_LOG_E(TAG, "Unable to add Custom_preset_module"); |                 FURI_LOG_E(TAG, "Unable to add Custom_preset_module"); | ||||||
|  |                 res = SubGhzProtocolStatusErrorParserCustomPreset; | ||||||
|                 break; |                 break; | ||||||
|             } |             } | ||||||
|             if(!flipper_format_write_hex( |             if(!flipper_format_write_hex( | ||||||
|                    flipper_format, "Custom_preset_data", preset->data, preset->data_size)) { |                    flipper_format, "Custom_preset_data", preset->data, preset->data_size)) { | ||||||
|                 FURI_LOG_E(TAG, "Unable to add Custom_preset_data"); |                 FURI_LOG_E(TAG, "Unable to add Custom_preset_data"); | ||||||
|  |                 res = SubGhzProtocolStatusErrorParserCustomPreset; | ||||||
|                 break; |                 break; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         if(!flipper_format_write_string_cstr(flipper_format, "Protocol", instance->protocol_name)) { |         if(!flipper_format_write_string_cstr(flipper_format, "Protocol", instance->protocol_name)) { | ||||||
|             FURI_LOG_E(TAG, "Unable to add Protocol"); |             FURI_LOG_E(TAG, "Unable to add Protocol"); | ||||||
|  |             res = SubGhzProtocolStatusErrorParserProtocolName; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         uint32_t temp_data = instance->id; |         uint32_t temp_data = instance->id; | ||||||
|         if(!flipper_format_write_uint32(flipper_format, "Id", &temp_data, 1)) { |         if(!flipper_format_write_uint32(flipper_format, "Id", &temp_data, 1)) { | ||||||
|             FURI_LOG_E(TAG, "Unable to add Id"); |             FURI_LOG_E(TAG, "Unable to add Id"); | ||||||
|  |             res = SubGhzProtocolStatusErrorParserOthers; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         temp_data = instance->data_count_bit; |         temp_data = instance->data_count_bit; | ||||||
|         if(!flipper_format_write_uint32(flipper_format, "Bit", &temp_data, 1)) { |         if(!flipper_format_write_uint32(flipper_format, "Bit", &temp_data, 1)) { | ||||||
|             FURI_LOG_E(TAG, "Unable to add Bit"); |             FURI_LOG_E(TAG, "Unable to add Bit"); | ||||||
|  |             res = SubGhzProtocolStatusErrorParserBitCount; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
| @ -84,18 +92,21 @@ bool ws_block_generic_serialize( | |||||||
| 
 | 
 | ||||||
|         if(!flipper_format_write_hex(flipper_format, "Data", key_data, sizeof(uint64_t))) { |         if(!flipper_format_write_hex(flipper_format, "Data", key_data, sizeof(uint64_t))) { | ||||||
|             FURI_LOG_E(TAG, "Unable to add Data"); |             FURI_LOG_E(TAG, "Unable to add Data"); | ||||||
|  |             res = SubGhzProtocolStatusErrorParserOthers; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         temp_data = instance->battery_low; |         temp_data = instance->battery_low; | ||||||
|         if(!flipper_format_write_uint32(flipper_format, "Batt", &temp_data, 1)) { |         if(!flipper_format_write_uint32(flipper_format, "Batt", &temp_data, 1)) { | ||||||
|             FURI_LOG_E(TAG, "Unable to add Battery_low"); |             FURI_LOG_E(TAG, "Unable to add Battery_low"); | ||||||
|  |             res = SubGhzProtocolStatusErrorParserOthers; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         temp_data = instance->humidity; |         temp_data = instance->humidity; | ||||||
|         if(!flipper_format_write_uint32(flipper_format, "Hum", &temp_data, 1)) { |         if(!flipper_format_write_uint32(flipper_format, "Hum", &temp_data, 1)) { | ||||||
|             FURI_LOG_E(TAG, "Unable to add Humidity"); |             FURI_LOG_E(TAG, "Unable to add Humidity"); | ||||||
|  |             res = SubGhzProtocolStatusErrorParserOthers; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
| @ -107,52 +118,60 @@ bool ws_block_generic_serialize( | |||||||
|         temp_data = curr_ts; |         temp_data = curr_ts; | ||||||
|         if(!flipper_format_write_uint32(flipper_format, "Ts", &temp_data, 1)) { |         if(!flipper_format_write_uint32(flipper_format, "Ts", &temp_data, 1)) { | ||||||
|             FURI_LOG_E(TAG, "Unable to add timestamp"); |             FURI_LOG_E(TAG, "Unable to add timestamp"); | ||||||
|  |             res = SubGhzProtocolStatusErrorParserOthers; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         temp_data = instance->channel; |         temp_data = instance->channel; | ||||||
|         if(!flipper_format_write_uint32(flipper_format, "Ch", &temp_data, 1)) { |         if(!flipper_format_write_uint32(flipper_format, "Ch", &temp_data, 1)) { | ||||||
|             FURI_LOG_E(TAG, "Unable to add Channel"); |             FURI_LOG_E(TAG, "Unable to add Channel"); | ||||||
|  |             res = SubGhzProtocolStatusErrorParserOthers; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         temp_data = instance->btn; |         temp_data = instance->btn; | ||||||
|         if(!flipper_format_write_uint32(flipper_format, "Btn", &temp_data, 1)) { |         if(!flipper_format_write_uint32(flipper_format, "Btn", &temp_data, 1)) { | ||||||
|             FURI_LOG_E(TAG, "Unable to add Btn"); |             FURI_LOG_E(TAG, "Unable to add Btn"); | ||||||
|  |             res = SubGhzProtocolStatusErrorParserOthers; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         float temp = instance->temp; |         float temp = instance->temp; | ||||||
|         if(!flipper_format_write_float(flipper_format, "Temp", &temp, 1)) { |         if(!flipper_format_write_float(flipper_format, "Temp", &temp, 1)) { | ||||||
|             FURI_LOG_E(TAG, "Unable to add Temperature"); |             FURI_LOG_E(TAG, "Unable to add Temperature"); | ||||||
|  |             res = SubGhzProtocolStatusErrorParserOthers; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         res = true; |         res = SubGhzProtocolStatusOk; | ||||||
|     } while(false); |     } while(false); | ||||||
|     furi_string_free(temp_str); |     furi_string_free(temp_str); | ||||||
|     return res; |     return res; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool ws_block_generic_deserialize(WSBlockGeneric* instance, FlipperFormat* flipper_format) { | SubGhzProtocolStatus | ||||||
|  |     ws_block_generic_deserialize(WSBlockGeneric* instance, FlipperFormat* flipper_format) { | ||||||
|     furi_assert(instance); |     furi_assert(instance); | ||||||
|     bool res = false; |     SubGhzProtocolStatus res = SubGhzProtocolStatusError; | ||||||
|     uint32_t temp_data = 0; |     uint32_t temp_data = 0; | ||||||
| 
 | 
 | ||||||
|     do { |     do { | ||||||
|         if(!flipper_format_rewind(flipper_format)) { |         if(!flipper_format_rewind(flipper_format)) { | ||||||
|             FURI_LOG_E(TAG, "Rewind error"); |             FURI_LOG_E(TAG, "Rewind error"); | ||||||
|  |             res = SubGhzProtocolStatusErrorParserOthers; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         if(!flipper_format_read_uint32(flipper_format, "Id", (uint32_t*)&temp_data, 1)) { |         if(!flipper_format_read_uint32(flipper_format, "Id", (uint32_t*)&temp_data, 1)) { | ||||||
|             FURI_LOG_E(TAG, "Missing Id"); |             FURI_LOG_E(TAG, "Missing Id"); | ||||||
|  |             res = SubGhzProtocolStatusErrorParserOthers; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         instance->id = (uint32_t)temp_data; |         instance->id = (uint32_t)temp_data; | ||||||
| 
 | 
 | ||||||
|         if(!flipper_format_read_uint32(flipper_format, "Bit", (uint32_t*)&temp_data, 1)) { |         if(!flipper_format_read_uint32(flipper_format, "Bit", (uint32_t*)&temp_data, 1)) { | ||||||
|             FURI_LOG_E(TAG, "Missing Bit"); |             FURI_LOG_E(TAG, "Missing Bit"); | ||||||
|  |             res = SubGhzProtocolStatusErrorParserBitCount; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         instance->data_count_bit = (uint8_t)temp_data; |         instance->data_count_bit = (uint8_t)temp_data; | ||||||
| @ -160,6 +179,7 @@ bool ws_block_generic_deserialize(WSBlockGeneric* instance, FlipperFormat* flipp | |||||||
|         uint8_t key_data[sizeof(uint64_t)] = {0}; |         uint8_t key_data[sizeof(uint64_t)] = {0}; | ||||||
|         if(!flipper_format_read_hex(flipper_format, "Data", key_data, sizeof(uint64_t))) { |         if(!flipper_format_read_hex(flipper_format, "Data", key_data, sizeof(uint64_t))) { | ||||||
|             FURI_LOG_E(TAG, "Missing Data"); |             FURI_LOG_E(TAG, "Missing Data"); | ||||||
|  |             res = SubGhzProtocolStatusErrorParserOthers; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
| @ -169,30 +189,35 @@ bool ws_block_generic_deserialize(WSBlockGeneric* instance, FlipperFormat* flipp | |||||||
| 
 | 
 | ||||||
|         if(!flipper_format_read_uint32(flipper_format, "Batt", (uint32_t*)&temp_data, 1)) { |         if(!flipper_format_read_uint32(flipper_format, "Batt", (uint32_t*)&temp_data, 1)) { | ||||||
|             FURI_LOG_E(TAG, "Missing Battery_low"); |             FURI_LOG_E(TAG, "Missing Battery_low"); | ||||||
|  |             res = SubGhzProtocolStatusErrorParserOthers; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         instance->battery_low = (uint8_t)temp_data; |         instance->battery_low = (uint8_t)temp_data; | ||||||
| 
 | 
 | ||||||
|         if(!flipper_format_read_uint32(flipper_format, "Hum", (uint32_t*)&temp_data, 1)) { |         if(!flipper_format_read_uint32(flipper_format, "Hum", (uint32_t*)&temp_data, 1)) { | ||||||
|             FURI_LOG_E(TAG, "Missing Humidity"); |             FURI_LOG_E(TAG, "Missing Humidity"); | ||||||
|  |             res = SubGhzProtocolStatusErrorParserOthers; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         instance->humidity = (uint8_t)temp_data; |         instance->humidity = (uint8_t)temp_data; | ||||||
| 
 | 
 | ||||||
|         if(!flipper_format_read_uint32(flipper_format, "Ts", (uint32_t*)&temp_data, 1)) { |         if(!flipper_format_read_uint32(flipper_format, "Ts", (uint32_t*)&temp_data, 1)) { | ||||||
|             FURI_LOG_E(TAG, "Missing timestamp"); |             FURI_LOG_E(TAG, "Missing timestamp"); | ||||||
|  |             res = SubGhzProtocolStatusErrorParserOthers; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         instance->timestamp = (uint32_t)temp_data; |         instance->timestamp = (uint32_t)temp_data; | ||||||
| 
 | 
 | ||||||
|         if(!flipper_format_read_uint32(flipper_format, "Ch", (uint32_t*)&temp_data, 1)) { |         if(!flipper_format_read_uint32(flipper_format, "Ch", (uint32_t*)&temp_data, 1)) { | ||||||
|             FURI_LOG_E(TAG, "Missing Channel"); |             FURI_LOG_E(TAG, "Missing Channel"); | ||||||
|  |             res = SubGhzProtocolStatusErrorParserOthers; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         instance->channel = (uint8_t)temp_data; |         instance->channel = (uint8_t)temp_data; | ||||||
| 
 | 
 | ||||||
|         if(!flipper_format_read_uint32(flipper_format, "Btn", (uint32_t*)&temp_data, 1)) { |         if(!flipper_format_read_uint32(flipper_format, "Btn", (uint32_t*)&temp_data, 1)) { | ||||||
|             FURI_LOG_E(TAG, "Missing Btn"); |             FURI_LOG_E(TAG, "Missing Btn"); | ||||||
|  |             res = SubGhzProtocolStatusErrorParserOthers; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         instance->btn = (uint8_t)temp_data; |         instance->btn = (uint8_t)temp_data; | ||||||
| @ -200,12 +225,32 @@ bool ws_block_generic_deserialize(WSBlockGeneric* instance, FlipperFormat* flipp | |||||||
|         float temp; |         float temp; | ||||||
|         if(!flipper_format_read_float(flipper_format, "Temp", (float*)&temp, 1)) { |         if(!flipper_format_read_float(flipper_format, "Temp", (float*)&temp, 1)) { | ||||||
|             FURI_LOG_E(TAG, "Missing Temperature"); |             FURI_LOG_E(TAG, "Missing Temperature"); | ||||||
|  |             res = SubGhzProtocolStatusErrorParserOthers; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         instance->temp = temp; |         instance->temp = temp; | ||||||
| 
 | 
 | ||||||
|         res = true; |         res = SubGhzProtocolStatusOk; | ||||||
|     } while(0); |     } while(0); | ||||||
| 
 | 
 | ||||||
|     return res; |     return res; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | SubGhzProtocolStatus ws_block_generic_deserialize_check_count_bit( | ||||||
|  |     WSBlockGeneric* instance, | ||||||
|  |     FlipperFormat* flipper_format, | ||||||
|  |     uint16_t count_bit) { | ||||||
|  |     SubGhzProtocolStatus ret = SubGhzProtocolStatusError; | ||||||
|  |     do { | ||||||
|  |         ret = ws_block_generic_deserialize(instance, flipper_format); | ||||||
|  |         if(ret != SubGhzProtocolStatusOk) { | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |         if(instance->data_count_bit != count_bit) { | ||||||
|  |             FURI_LOG_E(TAG, "Wrong number of bits in key"); | ||||||
|  |             ret = SubGhzProtocolStatusErrorValueBitCount; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |     } while(false); | ||||||
|  |     return ret; | ||||||
| } | } | ||||||
| @ -48,9 +48,9 @@ void ws_block_generic_get_preset_name(const char* preset_name, FuriString* prese | |||||||
|  * @param instance Pointer to a WSBlockGeneric instance |  * @param instance Pointer to a WSBlockGeneric instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @param preset The modulation on which the signal was received, SubGhzRadioPreset |  * @param preset The modulation on which the signal was received, SubGhzRadioPreset | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool ws_block_generic_serialize( | SubGhzProtocolStatus ws_block_generic_serialize( | ||||||
|     WSBlockGeneric* instance, |     WSBlockGeneric* instance, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset); |     SubGhzRadioPreset* preset); | ||||||
| @ -59,9 +59,22 @@ bool ws_block_generic_serialize( | |||||||
|  * Deserialize data WSBlockGeneric. |  * Deserialize data WSBlockGeneric. | ||||||
|  * @param instance Pointer to a WSBlockGeneric instance |  * @param instance Pointer to a WSBlockGeneric instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool ws_block_generic_deserialize(WSBlockGeneric* instance, FlipperFormat* flipper_format); | SubGhzProtocolStatus | ||||||
|  |     ws_block_generic_deserialize(WSBlockGeneric* instance, FlipperFormat* flipper_format); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * Deserialize data WSBlockGeneric. | ||||||
|  |  * @param instance Pointer to a WSBlockGeneric instance | ||||||
|  |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  |  * @param count_bit Count bit protocol | ||||||
|  |  * @return status | ||||||
|  |  */ | ||||||
|  | SubGhzProtocolStatus ws_block_generic_deserialize_check_count_bit( | ||||||
|  |     WSBlockGeneric* instance, | ||||||
|  |     FlipperFormat* flipper_format, | ||||||
|  |     uint16_t count_bit); | ||||||
| 
 | 
 | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
| } | } | ||||||
|  | |||||||
| @ -1,5 +1,5 @@ | |||||||
| entry,status,name,type,params | entry,status,name,type,params | ||||||
| Version,+,16.0,, | Version,+,17.0,, | ||||||
| Header,+,applications/services/bt/bt_service/bt.h,, | Header,+,applications/services/bt/bt_service/bt.h,, | ||||||
| Header,+,applications/services/cli/cli.h,, | Header,+,applications/services/cli/cli.h,, | ||||||
| Header,+,applications/services/cli/cli_vcp.h,, | Header,+,applications/services/cli/cli_vcp.h,, | ||||||
|  | |||||||
| 
 | 
| @ -1,5 +1,5 @@ | |||||||
| entry,status,name,type,params | entry,status,name,type,params | ||||||
| Version,+,16.0,, | Version,+,17.0,, | ||||||
| Header,+,applications/services/bt/bt_service/bt.h,, | Header,+,applications/services/bt/bt_service/bt.h,, | ||||||
| Header,+,applications/services/cli/cli.h,, | Header,+,applications/services/cli/cli.h,, | ||||||
| Header,+,applications/services/cli/cli_vcp.h,, | Header,+,applications/services/cli/cli_vcp.h,, | ||||||
| @ -2588,9 +2588,10 @@ Function,-,strupr,char*,char* | |||||||
| Function,-,strverscmp,int,"const char*, const char*" | Function,-,strverscmp,int,"const char*, const char*" | ||||||
| Function,-,strxfrm,size_t,"char*, const char*, size_t" | Function,-,strxfrm,size_t,"char*, const char*, size_t" | ||||||
| Function,-,strxfrm_l,size_t,"char*, const char*, size_t, locale_t" | Function,-,strxfrm_l,size_t,"char*, const char*, size_t, locale_t" | ||||||
| Function,+,subghz_block_generic_deserialize,_Bool,"SubGhzBlockGeneric*, FlipperFormat*" | Function,+,subghz_block_generic_deserialize,SubGhzProtocolStatus,"SubGhzBlockGeneric*, FlipperFormat*" | ||||||
|  | Function,+,subghz_block_generic_deserialize_check_count_bit,SubGhzProtocolStatus,"SubGhzBlockGeneric*, FlipperFormat*, uint16_t" | ||||||
| Function,+,subghz_block_generic_get_preset_name,void,"const char*, FuriString*" | Function,+,subghz_block_generic_get_preset_name,void,"const char*, FuriString*" | ||||||
| Function,+,subghz_block_generic_serialize,_Bool,"SubGhzBlockGeneric*, FlipperFormat*, SubGhzRadioPreset*" | Function,+,subghz_block_generic_serialize,SubGhzProtocolStatus,"SubGhzBlockGeneric*, FlipperFormat*, SubGhzRadioPreset*" | ||||||
| Function,+,subghz_environment_alloc,SubGhzEnvironment*, | Function,+,subghz_environment_alloc,SubGhzEnvironment*, | ||||||
| Function,+,subghz_environment_free,void,SubGhzEnvironment* | Function,+,subghz_environment_free,void,SubGhzEnvironment* | ||||||
| Function,+,subghz_environment_get_alutech_at_4n_rainbow_table_file_name,const char*,SubGhzEnvironment* | Function,+,subghz_environment_get_alutech_at_4n_rainbow_table_file_name,const char*,SubGhzEnvironment* | ||||||
| @ -2632,19 +2633,19 @@ Function,+,subghz_protocol_blocks_parity_bytes,uint8_t,"const uint8_t[], size_t" | |||||||
| Function,+,subghz_protocol_blocks_reverse_key,uint64_t,"uint64_t, uint8_t" | Function,+,subghz_protocol_blocks_reverse_key,uint64_t,"uint64_t, uint8_t" | ||||||
| Function,+,subghz_protocol_blocks_set_bit_array,void,"_Bool, uint8_t[], size_t, size_t" | Function,+,subghz_protocol_blocks_set_bit_array,void,"_Bool, uint8_t[], size_t, size_t" | ||||||
| Function,+,subghz_protocol_blocks_xor_bytes,uint8_t,"const uint8_t[], size_t" | Function,+,subghz_protocol_blocks_xor_bytes,uint8_t,"const uint8_t[], size_t" | ||||||
| Function,-,subghz_protocol_decoder_base_deserialize,_Bool,"SubGhzProtocolDecoderBase*, FlipperFormat*" | Function,+,subghz_protocol_decoder_base_deserialize,SubGhzProtocolStatus,"SubGhzProtocolDecoderBase*, FlipperFormat*" | ||||||
| Function,+,subghz_protocol_decoder_base_get_hash_data,uint8_t,SubGhzProtocolDecoderBase* | Function,+,subghz_protocol_decoder_base_get_hash_data,uint8_t,SubGhzProtocolDecoderBase* | ||||||
| Function,+,subghz_protocol_decoder_base_get_string,_Bool,"SubGhzProtocolDecoderBase*, FuriString*" | Function,+,subghz_protocol_decoder_base_get_string,_Bool,"SubGhzProtocolDecoderBase*, FuriString*" | ||||||
| Function,+,subghz_protocol_decoder_base_serialize,_Bool,"SubGhzProtocolDecoderBase*, FlipperFormat*, SubGhzRadioPreset*" | Function,+,subghz_protocol_decoder_base_serialize,SubGhzProtocolStatus,"SubGhzProtocolDecoderBase*, FlipperFormat*, SubGhzRadioPreset*" | ||||||
| Function,-,subghz_protocol_decoder_base_set_decoder_callback,void,"SubGhzProtocolDecoderBase*, SubGhzProtocolDecoderBaseRxCallback, void*" | Function,-,subghz_protocol_decoder_base_set_decoder_callback,void,"SubGhzProtocolDecoderBase*, SubGhzProtocolDecoderBaseRxCallback, void*" | ||||||
| Function,+,subghz_protocol_decoder_raw_alloc,void*,SubGhzEnvironment* | Function,+,subghz_protocol_decoder_raw_alloc,void*,SubGhzEnvironment* | ||||||
| Function,+,subghz_protocol_decoder_raw_deserialize,_Bool,"void*, FlipperFormat*" | Function,+,subghz_protocol_decoder_raw_deserialize,SubGhzProtocolStatus,"void*, FlipperFormat*" | ||||||
| Function,+,subghz_protocol_decoder_raw_feed,void,"void*, _Bool, uint32_t" | Function,+,subghz_protocol_decoder_raw_feed,void,"void*, _Bool, uint32_t" | ||||||
| Function,+,subghz_protocol_decoder_raw_free,void,void* | Function,+,subghz_protocol_decoder_raw_free,void,void* | ||||||
| Function,+,subghz_protocol_decoder_raw_get_string,void,"void*, FuriString*" | Function,+,subghz_protocol_decoder_raw_get_string,void,"void*, FuriString*" | ||||||
| Function,+,subghz_protocol_decoder_raw_reset,void,void* | Function,+,subghz_protocol_decoder_raw_reset,void,void* | ||||||
| Function,+,subghz_protocol_encoder_raw_alloc,void*,SubGhzEnvironment* | Function,+,subghz_protocol_encoder_raw_alloc,void*,SubGhzEnvironment* | ||||||
| Function,+,subghz_protocol_encoder_raw_deserialize,_Bool,"void*, FlipperFormat*" | Function,+,subghz_protocol_encoder_raw_deserialize,SubGhzProtocolStatus,"void*, FlipperFormat*" | ||||||
| Function,+,subghz_protocol_encoder_raw_free,void,void* | Function,+,subghz_protocol_encoder_raw_free,void,void* | ||||||
| Function,+,subghz_protocol_encoder_raw_stop,void,void* | Function,+,subghz_protocol_encoder_raw_stop,void,void* | ||||||
| Function,+,subghz_protocol_encoder_raw_yield,LevelDuration,void* | Function,+,subghz_protocol_encoder_raw_yield,LevelDuration,void* | ||||||
| @ -2682,7 +2683,7 @@ Function,+,subghz_setting_get_preset_name,const char*,"SubGhzSetting*, size_t" | |||||||
| Function,+,subghz_setting_load,void,"SubGhzSetting*, const char*" | Function,+,subghz_setting_load,void,"SubGhzSetting*, const char*" | ||||||
| Function,+,subghz_setting_load_custom_preset,_Bool,"SubGhzSetting*, const char*, FlipperFormat*" | Function,+,subghz_setting_load_custom_preset,_Bool,"SubGhzSetting*, const char*, FlipperFormat*" | ||||||
| Function,+,subghz_transmitter_alloc_init,SubGhzTransmitter*,"SubGhzEnvironment*, const char*" | Function,+,subghz_transmitter_alloc_init,SubGhzTransmitter*,"SubGhzEnvironment*, const char*" | ||||||
| Function,+,subghz_transmitter_deserialize,_Bool,"SubGhzTransmitter*, FlipperFormat*" | Function,+,subghz_transmitter_deserialize,SubGhzProtocolStatus,"SubGhzTransmitter*, FlipperFormat*" | ||||||
| Function,+,subghz_transmitter_free,void,SubGhzTransmitter* | Function,+,subghz_transmitter_free,void,SubGhzTransmitter* | ||||||
| Function,+,subghz_transmitter_get_protocol_instance,SubGhzProtocolEncoderBase*,SubGhzTransmitter* | Function,+,subghz_transmitter_get_protocol_instance,SubGhzProtocolEncoderBase*,SubGhzTransmitter* | ||||||
| Function,+,subghz_transmitter_stop,_Bool,SubGhzTransmitter* | Function,+,subghz_transmitter_stop,_Bool,SubGhzTransmitter* | ||||||
|  | |||||||
| 
 | 
| @ -20,12 +20,12 @@ void subghz_block_generic_get_preset_name(const char* preset_name, FuriString* p | |||||||
|     furi_string_set(preset_str, preset_name_temp); |     furi_string_set(preset_str, preset_name_temp); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_block_generic_serialize( | SubGhzProtocolStatus subghz_block_generic_serialize( | ||||||
|     SubGhzBlockGeneric* instance, |     SubGhzBlockGeneric* instance, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset) { |     SubGhzRadioPreset* preset) { | ||||||
|     furi_assert(instance); |     furi_assert(instance); | ||||||
|     bool res = false; |     SubGhzProtocolStatus res = SubGhzProtocolStatusError; | ||||||
|     FuriString* temp_str; |     FuriString* temp_str; | ||||||
|     temp_str = furi_string_alloc(); |     temp_str = furi_string_alloc(); | ||||||
|     do { |     do { | ||||||
| @ -33,11 +33,13 @@ bool subghz_block_generic_serialize( | |||||||
|         if(!flipper_format_write_header_cstr( |         if(!flipper_format_write_header_cstr( | ||||||
|                flipper_format, SUBGHZ_KEY_FILE_TYPE, SUBGHZ_KEY_FILE_VERSION)) { |                flipper_format, SUBGHZ_KEY_FILE_TYPE, SUBGHZ_KEY_FILE_VERSION)) { | ||||||
|             FURI_LOG_E(TAG, "Unable to add header"); |             FURI_LOG_E(TAG, "Unable to add header"); | ||||||
|  |             res = SubGhzProtocolStatusErrorParserHeader; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         if(!flipper_format_write_uint32(flipper_format, "Frequency", &preset->frequency, 1)) { |         if(!flipper_format_write_uint32(flipper_format, "Frequency", &preset->frequency, 1)) { | ||||||
|             FURI_LOG_E(TAG, "Unable to add Frequency"); |             FURI_LOG_E(TAG, "Unable to add Frequency"); | ||||||
|  |             res = SubGhzProtocolStatusErrorParserFrequency; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
| @ -45,27 +47,32 @@ bool subghz_block_generic_serialize( | |||||||
|         if(!flipper_format_write_string_cstr( |         if(!flipper_format_write_string_cstr( | ||||||
|                flipper_format, "Preset", furi_string_get_cstr(temp_str))) { |                flipper_format, "Preset", furi_string_get_cstr(temp_str))) { | ||||||
|             FURI_LOG_E(TAG, "Unable to add Preset"); |             FURI_LOG_E(TAG, "Unable to add Preset"); | ||||||
|  |             res = SubGhzProtocolStatusErrorParserPreset; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         if(!strcmp(furi_string_get_cstr(temp_str), "FuriHalSubGhzPresetCustom")) { |         if(!strcmp(furi_string_get_cstr(temp_str), "FuriHalSubGhzPresetCustom")) { | ||||||
|             if(!flipper_format_write_string_cstr( |             if(!flipper_format_write_string_cstr( | ||||||
|                    flipper_format, "Custom_preset_module", "CC1101")) { |                    flipper_format, "Custom_preset_module", "CC1101")) { | ||||||
|                 FURI_LOG_E(TAG, "Unable to add Custom_preset_module"); |                 FURI_LOG_E(TAG, "Unable to add Custom_preset_module"); | ||||||
|  |                 res = SubGhzProtocolStatusErrorParserCustomPreset; | ||||||
|                 break; |                 break; | ||||||
|             } |             } | ||||||
|             if(!flipper_format_write_hex( |             if(!flipper_format_write_hex( | ||||||
|                    flipper_format, "Custom_preset_data", preset->data, preset->data_size)) { |                    flipper_format, "Custom_preset_data", preset->data, preset->data_size)) { | ||||||
|                 FURI_LOG_E(TAG, "Unable to add Custom_preset_data"); |                 FURI_LOG_E(TAG, "Unable to add Custom_preset_data"); | ||||||
|  |                 res = SubGhzProtocolStatusErrorParserCustomPreset; | ||||||
|                 break; |                 break; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         if(!flipper_format_write_string_cstr(flipper_format, "Protocol", instance->protocol_name)) { |         if(!flipper_format_write_string_cstr(flipper_format, "Protocol", instance->protocol_name)) { | ||||||
|             FURI_LOG_E(TAG, "Unable to add Protocol"); |             FURI_LOG_E(TAG, "Unable to add Protocol"); | ||||||
|  |             res = SubGhzProtocolStatusErrorParserProtocolName; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         uint32_t temp = instance->data_count_bit; |         uint32_t temp = instance->data_count_bit; | ||||||
|         if(!flipper_format_write_uint32(flipper_format, "Bit", &temp, 1)) { |         if(!flipper_format_write_uint32(flipper_format, "Bit", &temp, 1)) { | ||||||
|             FURI_LOG_E(TAG, "Unable to add Bit"); |             FURI_LOG_E(TAG, "Unable to add Bit"); | ||||||
|  |             res = SubGhzProtocolStatusErrorParserBitCount; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
| @ -76,17 +83,19 @@ bool subghz_block_generic_serialize( | |||||||
| 
 | 
 | ||||||
|         if(!flipper_format_write_hex(flipper_format, "Key", key_data, sizeof(uint64_t))) { |         if(!flipper_format_write_hex(flipper_format, "Key", key_data, sizeof(uint64_t))) { | ||||||
|             FURI_LOG_E(TAG, "Unable to add Key"); |             FURI_LOG_E(TAG, "Unable to add Key"); | ||||||
|  |             res = SubGhzProtocolStatusErrorParserKey; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         res = true; |         res = SubGhzProtocolStatusOk; | ||||||
|     } while(false); |     } while(false); | ||||||
|     furi_string_free(temp_str); |     furi_string_free(temp_str); | ||||||
|     return res; |     return res; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_block_generic_deserialize(SubGhzBlockGeneric* instance, FlipperFormat* flipper_format) { | SubGhzProtocolStatus | ||||||
|  |     subghz_block_generic_deserialize(SubGhzBlockGeneric* instance, FlipperFormat* flipper_format) { | ||||||
|     furi_assert(instance); |     furi_assert(instance); | ||||||
|     bool res = false; |     SubGhzProtocolStatus res = SubGhzProtocolStatusError; | ||||||
|     FuriString* temp_str; |     FuriString* temp_str; | ||||||
|     temp_str = furi_string_alloc(); |     temp_str = furi_string_alloc(); | ||||||
|     uint32_t temp_data = 0; |     uint32_t temp_data = 0; | ||||||
| @ -94,10 +103,12 @@ bool subghz_block_generic_deserialize(SubGhzBlockGeneric* instance, FlipperForma | |||||||
|     do { |     do { | ||||||
|         if(!flipper_format_rewind(flipper_format)) { |         if(!flipper_format_rewind(flipper_format)) { | ||||||
|             FURI_LOG_E(TAG, "Rewind error"); |             FURI_LOG_E(TAG, "Rewind error"); | ||||||
|  |             res = SubGhzProtocolStatusErrorParserOthers; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         if(!flipper_format_read_uint32(flipper_format, "Bit", (uint32_t*)&temp_data, 1)) { |         if(!flipper_format_read_uint32(flipper_format, "Bit", (uint32_t*)&temp_data, 1)) { | ||||||
|             FURI_LOG_E(TAG, "Missing Bit"); |             FURI_LOG_E(TAG, "Missing Bit"); | ||||||
|  |             res = SubGhzProtocolStatusErrorParserBitCount; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         instance->data_count_bit = (uint16_t)temp_data; |         instance->data_count_bit = (uint16_t)temp_data; | ||||||
| @ -105,16 +116,36 @@ bool subghz_block_generic_deserialize(SubGhzBlockGeneric* instance, FlipperForma | |||||||
|         uint8_t key_data[sizeof(uint64_t)] = {0}; |         uint8_t key_data[sizeof(uint64_t)] = {0}; | ||||||
|         if(!flipper_format_read_hex(flipper_format, "Key", key_data, sizeof(uint64_t))) { |         if(!flipper_format_read_hex(flipper_format, "Key", key_data, sizeof(uint64_t))) { | ||||||
|             FURI_LOG_E(TAG, "Missing Key"); |             FURI_LOG_E(TAG, "Missing Key"); | ||||||
|  |             res = SubGhzProtocolStatusErrorParserKey; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         for(uint8_t i = 0; i < sizeof(uint64_t); i++) { |         for(uint8_t i = 0; i < sizeof(uint64_t); i++) { | ||||||
|             instance->data = instance->data << 8 | key_data[i]; |             instance->data = instance->data << 8 | key_data[i]; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         res = true; |         res = SubGhzProtocolStatusOk; | ||||||
|     } while(0); |     } while(0); | ||||||
| 
 | 
 | ||||||
|     furi_string_free(temp_str); |     furi_string_free(temp_str); | ||||||
| 
 | 
 | ||||||
|     return res; |     return res; | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | SubGhzProtocolStatus subghz_block_generic_deserialize_check_count_bit( | ||||||
|  |     SubGhzBlockGeneric* instance, | ||||||
|  |     FlipperFormat* flipper_format, | ||||||
|  |     uint16_t count_bit) { | ||||||
|  |     SubGhzProtocolStatus ret = SubGhzProtocolStatusError; | ||||||
|  |     do { | ||||||
|  |         ret = subghz_block_generic_deserialize(instance, flipper_format); | ||||||
|  |         if(ret != SubGhzProtocolStatusOk) { | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |         if(instance->data_count_bit != count_bit) { | ||||||
|  |             FURI_LOG_E(TAG, "Wrong number of bits in key"); | ||||||
|  |             ret = SubGhzProtocolStatusErrorValueBitCount; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |     } while(false); | ||||||
|  |     return ret; | ||||||
|  | } | ||||||
| @ -36,9 +36,9 @@ void subghz_block_generic_get_preset_name(const char* preset_name, FuriString* p | |||||||
|  * @param instance Pointer to a SubGhzBlockGeneric instance |  * @param instance Pointer to a SubGhzBlockGeneric instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @param preset The modulation on which the signal was received, SubGhzRadioPreset |  * @param preset The modulation on which the signal was received, SubGhzRadioPreset | ||||||
|  * @return true On success |  * @return Status Error | ||||||
|  */ |  */ | ||||||
| bool subghz_block_generic_serialize( | SubGhzProtocolStatus subghz_block_generic_serialize( | ||||||
|     SubGhzBlockGeneric* instance, |     SubGhzBlockGeneric* instance, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset); |     SubGhzRadioPreset* preset); | ||||||
| @ -47,9 +47,22 @@ bool subghz_block_generic_serialize( | |||||||
|  * Deserialize data SubGhzBlockGeneric. |  * Deserialize data SubGhzBlockGeneric. | ||||||
|  * @param instance Pointer to a SubGhzBlockGeneric instance |  * @param instance Pointer to a SubGhzBlockGeneric instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @return true On success |  * @return Status Error | ||||||
|  */ |  */ | ||||||
| bool subghz_block_generic_deserialize(SubGhzBlockGeneric* instance, FlipperFormat* flipper_format); | SubGhzProtocolStatus | ||||||
|  |     subghz_block_generic_deserialize(SubGhzBlockGeneric* instance, FlipperFormat* flipper_format); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * Deserialize data SubGhzBlockGeneric. | ||||||
|  |  * @param instance Pointer to a SubGhzBlockGeneric instance | ||||||
|  |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  |  * @param count_bit Count bit protocol | ||||||
|  |  * @return Status Error | ||||||
|  |  */ | ||||||
|  | SubGhzProtocolStatus subghz_block_generic_deserialize_check_count_bit( | ||||||
|  |     SubGhzBlockGeneric* instance, | ||||||
|  |     FlipperFormat* flipper_format, | ||||||
|  |     uint16_t count_bit); | ||||||
| 
 | 
 | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
| } | } | ||||||
|  | |||||||
| @ -385,46 +385,46 @@ uint8_t subghz_protocol_decoder_alutech_at_4n_get_hash_data(void* context) { | |||||||
|     return (uint8_t)instance->crc; |     return (uint8_t)instance->crc; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_decoder_alutech_at_4n_serialize( | SubGhzProtocolStatus subghz_protocol_decoder_alutech_at_4n_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset) { |     SubGhzRadioPreset* preset) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     SubGhzProtocolDecoderAlutech_at_4n* instance = context; |     SubGhzProtocolDecoderAlutech_at_4n* instance = context; | ||||||
|     bool res = subghz_block_generic_serialize(&instance->generic, flipper_format, preset); |     SubGhzProtocolStatus res = | ||||||
|     if(res && !flipper_format_write_uint32(flipper_format, "CRC", &instance->crc, 1)) { |         subghz_block_generic_serialize(&instance->generic, flipper_format, preset); | ||||||
|  |     if((res == SubGhzProtocolStatusOk) && | ||||||
|  |        !flipper_format_write_uint32(flipper_format, "CRC", &instance->crc, 1)) { | ||||||
|         FURI_LOG_E(TAG, "Unable to add CRC"); |         FURI_LOG_E(TAG, "Unable to add CRC"); | ||||||
|         res = false; |         res = SubGhzProtocolStatusErrorParserOthers; | ||||||
|     } |     } | ||||||
|     return res; |     return res; | ||||||
| 
 |  | ||||||
|     return subghz_block_generic_serialize(&instance->generic, flipper_format, preset); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_decoder_alutech_at_4n_deserialize( | SubGhzProtocolStatus subghz_protocol_decoder_alutech_at_4n_deserialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format) { |     FlipperFormat* flipper_format) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     SubGhzProtocolDecoderAlutech_at_4n* instance = context; |     SubGhzProtocolDecoderAlutech_at_4n* instance = context; | ||||||
|     bool ret = false; |     SubGhzProtocolStatus ret = SubGhzProtocolStatusError; | ||||||
|     do { |     do { | ||||||
|         if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) { |         ret = subghz_block_generic_deserialize_check_count_bit( | ||||||
|             break; |             &instance->generic, | ||||||
|         } |             flipper_format, | ||||||
|         if(instance->generic.data_count_bit != |             subghz_protocol_alutech_at_4n_const.min_count_bit_for_found); | ||||||
|            subghz_protocol_alutech_at_4n_const.min_count_bit_for_found) { |         if(ret != SubGhzProtocolStatusOk) { | ||||||
|             FURI_LOG_E(TAG, "Wrong number of bits in key"); |  | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         if(!flipper_format_rewind(flipper_format)) { |         if(!flipper_format_rewind(flipper_format)) { | ||||||
|             FURI_LOG_E(TAG, "Rewind error"); |             FURI_LOG_E(TAG, "Rewind error"); | ||||||
|  |             ret = SubGhzProtocolStatusErrorParserOthers; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         if(!flipper_format_read_uint32(flipper_format, "CRC", (uint32_t*)&instance->crc, 1)) { |         if(!flipper_format_read_uint32(flipper_format, "CRC", (uint32_t*)&instance->crc, 1)) { | ||||||
|             FURI_LOG_E(TAG, "Missing CRC"); |             FURI_LOG_E(TAG, "Missing CRC"); | ||||||
|  |             ret = SubGhzProtocolStatusErrorParserOthers; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         ret = true; |  | ||||||
|     } while(false); |     } while(false); | ||||||
|     return ret; |     return ret; | ||||||
| } | } | ||||||
|  | |||||||
| @ -49,9 +49,9 @@ uint8_t subghz_protocol_decoder_alutech_at_4n_get_hash_data(void* context); | |||||||
|  * @param context Pointer to a SubGhzProtocolDecoderAlutech_at_4n instance |  * @param context Pointer to a SubGhzProtocolDecoderAlutech_at_4n instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @param preset The modulation on which the signal was received, SubGhzRadioPreset |  * @param preset The modulation on which the signal was received, SubGhzRadioPreset | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_decoder_alutech_at_4n_serialize( | SubGhzProtocolStatus subghz_protocol_decoder_alutech_at_4n_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset); |     SubGhzRadioPreset* preset); | ||||||
| @ -60,11 +60,10 @@ bool subghz_protocol_decoder_alutech_at_4n_serialize( | |||||||
|  * Deserialize data SubGhzProtocolDecoderAlutech_at_4n. |  * Deserialize data SubGhzProtocolDecoderAlutech_at_4n. | ||||||
|  * @param context Pointer to a SubGhzProtocolDecoderAlutech_at_4n instance |  * @param context Pointer to a SubGhzProtocolDecoderAlutech_at_4n instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_decoder_alutech_at_4n_deserialize( | SubGhzProtocolStatus | ||||||
|     void* context, |     subghz_protocol_decoder_alutech_at_4n_deserialize(void* context, FlipperFormat* flipper_format); | ||||||
|     FlipperFormat* flipper_format); |  | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Getting a textual representation of the received data. |  * Getting a textual representation of the received data. | ||||||
|  | |||||||
| @ -136,28 +136,29 @@ static bool subghz_protocol_encoder_ansonic_get_upload(SubGhzProtocolEncoderAnso | |||||||
|     return true; |     return true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_encoder_ansonic_deserialize(void* context, FlipperFormat* flipper_format) { | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_encoder_ansonic_deserialize(void* context, FlipperFormat* flipper_format) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     SubGhzProtocolEncoderAnsonic* instance = context; |     SubGhzProtocolEncoderAnsonic* instance = context; | ||||||
|     bool res = false; |     SubGhzProtocolStatus res = SubGhzProtocolStatusError; | ||||||
|     do { |     do { | ||||||
|         if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) { |         res = subghz_block_generic_deserialize_check_count_bit( | ||||||
|  |             &instance->generic, | ||||||
|  |             flipper_format, | ||||||
|  |             subghz_protocol_ansonic_const.min_count_bit_for_found); | ||||||
|  |         if(res != SubGhzProtocolStatusOk) { | ||||||
|             FURI_LOG_E(TAG, "Deserialize error"); |             FURI_LOG_E(TAG, "Deserialize error"); | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         if(instance->generic.data_count_bit != |  | ||||||
|            subghz_protocol_ansonic_const.min_count_bit_for_found) { |  | ||||||
|             FURI_LOG_E(TAG, "Wrong number of bits in key"); |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|         //optional parameter parameter
 |         //optional parameter parameter
 | ||||||
|         flipper_format_read_uint32( |         flipper_format_read_uint32( | ||||||
|             flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); |             flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); | ||||||
| 
 | 
 | ||||||
|         if(!subghz_protocol_encoder_ansonic_get_upload(instance)) break; |         if(!subghz_protocol_encoder_ansonic_get_upload(instance)) { | ||||||
|  |             res = SubGhzProtocolStatusErrorEncoderGetUpload; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|         instance->encoder.is_running = true; |         instance->encoder.is_running = true; | ||||||
| 
 |  | ||||||
|         res = true; |  | ||||||
|     } while(false); |     } while(false); | ||||||
| 
 | 
 | ||||||
|     return res; |     return res; | ||||||
| @ -301,7 +302,7 @@ uint8_t subghz_protocol_decoder_ansonic_get_hash_data(void* context) { | |||||||
|         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); |         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_decoder_ansonic_serialize( | SubGhzProtocolStatus subghz_protocol_decoder_ansonic_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset) { |     SubGhzRadioPreset* preset) { | ||||||
| @ -310,22 +311,12 @@ bool subghz_protocol_decoder_ansonic_serialize( | |||||||
|     return subghz_block_generic_serialize(&instance->generic, flipper_format, preset); |     return subghz_block_generic_serialize(&instance->generic, flipper_format, preset); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_decoder_ansonic_deserialize(void* context, FlipperFormat* flipper_format) { | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_decoder_ansonic_deserialize(void* context, FlipperFormat* flipper_format) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     SubGhzProtocolDecoderAnsonic* instance = context; |     SubGhzProtocolDecoderAnsonic* instance = context; | ||||||
|     bool ret = false; |     return subghz_block_generic_deserialize_check_count_bit( | ||||||
|     do { |         &instance->generic, flipper_format, subghz_protocol_ansonic_const.min_count_bit_for_found); | ||||||
|         if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) { |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|         if(instance->generic.data_count_bit != |  | ||||||
|            subghz_protocol_ansonic_const.min_count_bit_for_found) { |  | ||||||
|             FURI_LOG_E(TAG, "Wrong number of bits in key"); |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|         ret = true; |  | ||||||
|     } while(false); |  | ||||||
|     return ret; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void subghz_protocol_decoder_ansonic_get_string(void* context, FuriString* output) { | void subghz_protocol_decoder_ansonic_get_string(void* context, FuriString* output) { | ||||||
|  | |||||||
| @ -30,7 +30,8 @@ void subghz_protocol_encoder_ansonic_free(void* context); | |||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @return true On success |  * @return true On success | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_encoder_ansonic_deserialize(void* context, FlipperFormat* flipper_format); | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_encoder_ansonic_deserialize(void* context, FlipperFormat* flipper_format); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Forced transmission stop. |  * Forced transmission stop. | ||||||
| @ -86,7 +87,7 @@ uint8_t subghz_protocol_decoder_ansonic_get_hash_data(void* context); | |||||||
|  * @param preset The modulation on which the signal was received, SubGhzRadioPreset |  * @param preset The modulation on which the signal was received, SubGhzRadioPreset | ||||||
|  * @return true On success |  * @return true On success | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_decoder_ansonic_serialize( | SubGhzProtocolStatus subghz_protocol_decoder_ansonic_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset); |     SubGhzRadioPreset* preset); | ||||||
| @ -97,7 +98,8 @@ bool subghz_protocol_decoder_ansonic_serialize( | |||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @return true On success |  * @return true On success | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_decoder_ansonic_deserialize(void* context, FlipperFormat* flipper_format); | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_decoder_ansonic_deserialize(void* context, FlipperFormat* flipper_format); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Getting a textual representation of the received data. |  * Getting a textual representation of the received data. | ||||||
|  | |||||||
| @ -23,11 +23,11 @@ bool subghz_protocol_decoder_base_get_string( | |||||||
|     return status; |     return status; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_decoder_base_serialize( | SubGhzProtocolStatus subghz_protocol_decoder_base_serialize( | ||||||
|     SubGhzProtocolDecoderBase* decoder_base, |     SubGhzProtocolDecoderBase* decoder_base, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset) { |     SubGhzRadioPreset* preset) { | ||||||
|     bool status = false; |     SubGhzProtocolStatus status = SubGhzProtocolStatusError; | ||||||
| 
 | 
 | ||||||
|     if(decoder_base->protocol && decoder_base->protocol->decoder && |     if(decoder_base->protocol && decoder_base->protocol->decoder && | ||||||
|        decoder_base->protocol->decoder->serialize) { |        decoder_base->protocol->decoder->serialize) { | ||||||
| @ -37,10 +37,10 @@ bool subghz_protocol_decoder_base_serialize( | |||||||
|     return status; |     return status; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_decoder_base_deserialize( | SubGhzProtocolStatus subghz_protocol_decoder_base_deserialize( | ||||||
|     SubGhzProtocolDecoderBase* decoder_base, |     SubGhzProtocolDecoderBase* decoder_base, | ||||||
|     FlipperFormat* flipper_format) { |     FlipperFormat* flipper_format) { | ||||||
|     bool status = false; |     SubGhzProtocolStatus status = SubGhzProtocolStatusError; | ||||||
| 
 | 
 | ||||||
|     if(decoder_base->protocol && decoder_base->protocol->decoder && |     if(decoder_base->protocol && decoder_base->protocol->decoder && | ||||||
|        decoder_base->protocol->decoder->deserialize) { |        decoder_base->protocol->decoder->deserialize) { | ||||||
|  | |||||||
| @ -49,9 +49,9 @@ bool subghz_protocol_decoder_base_get_string( | |||||||
|  * @param decoder_base Pointer to a SubGhzProtocolDecoderBase instance |  * @param decoder_base Pointer to a SubGhzProtocolDecoderBase instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @param preset The modulation on which the signal was received, SubGhzRadioPreset |  * @param preset The modulation on which the signal was received, SubGhzRadioPreset | ||||||
|  * @return true On success |  * @return Status Error | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_decoder_base_serialize( | SubGhzProtocolStatus subghz_protocol_decoder_base_serialize( | ||||||
|     SubGhzProtocolDecoderBase* decoder_base, |     SubGhzProtocolDecoderBase* decoder_base, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset); |     SubGhzRadioPreset* preset); | ||||||
| @ -60,9 +60,9 @@ bool subghz_protocol_decoder_base_serialize( | |||||||
|  * Deserialize data SubGhzProtocolDecoderBase. |  * Deserialize data SubGhzProtocolDecoderBase. | ||||||
|  * @param decoder_base Pointer to a SubGhzProtocolDecoderBase instance |  * @param decoder_base Pointer to a SubGhzProtocolDecoderBase instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @return true On success |  * @return Status Error | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_decoder_base_deserialize( | SubGhzProtocolStatus subghz_protocol_decoder_base_deserialize( | ||||||
|     SubGhzProtocolDecoderBase* decoder_base, |     SubGhzProtocolDecoderBase* decoder_base, | ||||||
|     FlipperFormat* flipper_format); |     FlipperFormat* flipper_format); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -155,31 +155,32 @@ static bool subghz_protocol_encoder_bett_get_upload(SubGhzProtocolEncoderBETT* i | |||||||
|     return true; |     return true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_encoder_bett_deserialize(void* context, FlipperFormat* flipper_format) { | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_encoder_bett_deserialize(void* context, FlipperFormat* flipper_format) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     SubGhzProtocolEncoderBETT* instance = context; |     SubGhzProtocolEncoderBETT* instance = context; | ||||||
|     bool res = false; |     SubGhzProtocolStatus ret = SubGhzProtocolStatusError; | ||||||
|     do { |     do { | ||||||
|         if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) { |         ret = subghz_block_generic_deserialize_check_count_bit( | ||||||
|  |             &instance->generic, | ||||||
|  |             flipper_format, | ||||||
|  |             subghz_protocol_bett_const.min_count_bit_for_found); | ||||||
|  |         if(ret != SubGhzProtocolStatusOk) { | ||||||
|             FURI_LOG_E(TAG, "Deserialize error"); |             FURI_LOG_E(TAG, "Deserialize error"); | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         if(instance->generic.data_count_bit != |  | ||||||
|            subghz_protocol_bett_const.min_count_bit_for_found) { |  | ||||||
|             FURI_LOG_E(TAG, "Wrong number of bits in key"); |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|         //optional parameter parameter
 |         //optional parameter parameter
 | ||||||
|         flipper_format_read_uint32( |         flipper_format_read_uint32( | ||||||
|             flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); |             flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); | ||||||
| 
 | 
 | ||||||
|         if(!subghz_protocol_encoder_bett_get_upload(instance)) break; |         if(!subghz_protocol_encoder_bett_get_upload(instance)) { | ||||||
|  |             ret = SubGhzProtocolStatusErrorEncoderGetUpload; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|         instance->encoder.is_running = true; |         instance->encoder.is_running = true; | ||||||
| 
 |  | ||||||
|         res = true; |  | ||||||
|     } while(false); |     } while(false); | ||||||
| 
 | 
 | ||||||
|     return res; |     return ret; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void subghz_protocol_encoder_bett_stop(void* context) { | void subghz_protocol_encoder_bett_stop(void* context) { | ||||||
| @ -295,7 +296,7 @@ uint8_t subghz_protocol_decoder_bett_get_hash_data(void* context) { | |||||||
|         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); |         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_decoder_bett_serialize( | SubGhzProtocolStatus subghz_protocol_decoder_bett_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset) { |     SubGhzRadioPreset* preset) { | ||||||
| @ -304,22 +305,12 @@ bool subghz_protocol_decoder_bett_serialize( | |||||||
|     return subghz_block_generic_serialize(&instance->generic, flipper_format, preset); |     return subghz_block_generic_serialize(&instance->generic, flipper_format, preset); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_decoder_bett_deserialize(void* context, FlipperFormat* flipper_format) { | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_decoder_bett_deserialize(void* context, FlipperFormat* flipper_format) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     SubGhzProtocolDecoderBETT* instance = context; |     SubGhzProtocolDecoderBETT* instance = context; | ||||||
|     bool ret = false; |     return subghz_block_generic_deserialize_check_count_bit( | ||||||
|     do { |         &instance->generic, flipper_format, subghz_protocol_bett_const.min_count_bit_for_found); | ||||||
|         if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) { |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|         if(instance->generic.data_count_bit != |  | ||||||
|            subghz_protocol_bett_const.min_count_bit_for_found) { |  | ||||||
|             FURI_LOG_E(TAG, "Wrong number of bits in key"); |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|         ret = true; |  | ||||||
|     } while(false); |  | ||||||
|     return ret; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void subghz_protocol_decoder_bett_get_string(void* context, FuriString* output) { | void subghz_protocol_decoder_bett_get_string(void* context, FuriString* output) { | ||||||
|  | |||||||
| @ -28,9 +28,10 @@ void subghz_protocol_encoder_bett_free(void* context); | |||||||
|  * Deserialize and generating an upload to send. |  * Deserialize and generating an upload to send. | ||||||
|  * @param context Pointer to a SubGhzProtocolEncoderBETT instance |  * @param context Pointer to a SubGhzProtocolEncoderBETT instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_encoder_bett_deserialize(void* context, FlipperFormat* flipper_format); | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_encoder_bett_deserialize(void* context, FlipperFormat* flipper_format); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Forced transmission stop. |  * Forced transmission stop. | ||||||
| @ -84,9 +85,9 @@ uint8_t subghz_protocol_decoder_bett_get_hash_data(void* context); | |||||||
|  * @param context Pointer to a SubGhzProtocolDecoderBETT instance |  * @param context Pointer to a SubGhzProtocolDecoderBETT instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @param preset The modulation on which the signal was received, SubGhzRadioPreset |  * @param preset The modulation on which the signal was received, SubGhzRadioPreset | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_decoder_bett_serialize( | SubGhzProtocolStatus subghz_protocol_decoder_bett_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset); |     SubGhzRadioPreset* preset); | ||||||
| @ -95,9 +96,10 @@ bool subghz_protocol_decoder_bett_serialize( | |||||||
|  * Deserialize data SubGhzProtocolDecoderBETT. |  * Deserialize data SubGhzProtocolDecoderBETT. | ||||||
|  * @param context Pointer to a SubGhzProtocolDecoderBETT instance |  * @param context Pointer to a SubGhzProtocolDecoderBETT instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_decoder_bett_deserialize(void* context, FlipperFormat* flipper_format); | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_decoder_bett_deserialize(void* context, FlipperFormat* flipper_format); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Getting a textual representation of the received data. |  * Getting a textual representation of the received data. | ||||||
|  | |||||||
| @ -219,20 +219,23 @@ static bool subghz_protocol_encoder_bin_raw_get_upload(SubGhzProtocolEncoderBinR | |||||||
|     return true; |     return true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_encoder_bin_raw_deserialize(void* context, FlipperFormat* flipper_format) { | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_encoder_bin_raw_deserialize(void* context, FlipperFormat* flipper_format) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     SubGhzProtocolEncoderBinRAW* instance = context; |     SubGhzProtocolEncoderBinRAW* instance = context; | ||||||
| 
 | 
 | ||||||
|     bool res = false; |     SubGhzProtocolStatus res = SubGhzProtocolStatusError; | ||||||
|     uint32_t temp_data = 0; |     uint32_t temp_data = 0; | ||||||
| 
 | 
 | ||||||
|     do { |     do { | ||||||
|         if(!flipper_format_rewind(flipper_format)) { |         if(!flipper_format_rewind(flipper_format)) { | ||||||
|             FURI_LOG_E(TAG, "Rewind error"); |             FURI_LOG_E(TAG, "Rewind error"); | ||||||
|  |             res = SubGhzProtocolStatusErrorParserOthers; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         if(!flipper_format_read_uint32(flipper_format, "Bit", (uint32_t*)&temp_data, 1)) { |         if(!flipper_format_read_uint32(flipper_format, "Bit", (uint32_t*)&temp_data, 1)) { | ||||||
|             FURI_LOG_E(TAG, "Missing Bit"); |             FURI_LOG_E(TAG, "Missing Bit"); | ||||||
|  |             res = SubGhzProtocolStatusErrorParserBitCount; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
| @ -240,6 +243,7 @@ bool subghz_protocol_encoder_bin_raw_deserialize(void* context, FlipperFormat* f | |||||||
| 
 | 
 | ||||||
|         if(!flipper_format_read_uint32(flipper_format, "TE", (uint32_t*)&instance->te, 1)) { |         if(!flipper_format_read_uint32(flipper_format, "TE", (uint32_t*)&instance->te, 1)) { | ||||||
|             FURI_LOG_E(TAG, "Missing TE"); |             FURI_LOG_E(TAG, "Missing TE"); | ||||||
|  |             res = SubGhzProtocolStatusErrorParserTe; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
| @ -251,11 +255,13 @@ bool subghz_protocol_encoder_bin_raw_deserialize(void* context, FlipperFormat* f | |||||||
|         while(flipper_format_read_uint32(flipper_format, "Bit_RAW", (uint32_t*)&temp_data, 1)) { |         while(flipper_format_read_uint32(flipper_format, "Bit_RAW", (uint32_t*)&temp_data, 1)) { | ||||||
|             if(ind >= BIN_RAW_MAX_MARKUP_COUNT) { |             if(ind >= BIN_RAW_MAX_MARKUP_COUNT) { | ||||||
|                 FURI_LOG_E(TAG, "Markup overflow"); |                 FURI_LOG_E(TAG, "Markup overflow"); | ||||||
|  |                 res = SubGhzProtocolStatusErrorParserOthers; | ||||||
|                 break; |                 break; | ||||||
|             } |             } | ||||||
|             byte_count += subghz_protocol_bin_raw_get_full_byte(temp_data); |             byte_count += subghz_protocol_bin_raw_get_full_byte(temp_data); | ||||||
|             if(byte_count > BIN_RAW_BUF_DATA_SIZE) { |             if(byte_count > BIN_RAW_BUF_DATA_SIZE) { | ||||||
|                 FURI_LOG_E(TAG, "Receive buffer overflow"); |                 FURI_LOG_E(TAG, "Receive buffer overflow"); | ||||||
|  |                 res = SubGhzProtocolStatusErrorParserOthers; | ||||||
|                 break; |                 break; | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
| @ -270,6 +276,7 @@ bool subghz_protocol_encoder_bin_raw_deserialize(void* context, FlipperFormat* f | |||||||
|                    subghz_protocol_bin_raw_get_full_byte(temp_data))) { |                    subghz_protocol_bin_raw_get_full_byte(temp_data))) { | ||||||
|                 instance->data_markup[ind].bit_count = 0; |                 instance->data_markup[ind].bit_count = 0; | ||||||
|                 FURI_LOG_E(TAG, "Missing Data_RAW"); |                 FURI_LOG_E(TAG, "Missing Data_RAW"); | ||||||
|  |                 res = SubGhzProtocolStatusErrorParserOthers; | ||||||
|                 break; |                 break; | ||||||
|             } |             } | ||||||
|             ind++; |             ind++; | ||||||
| @ -297,16 +304,20 @@ bool subghz_protocol_encoder_bin_raw_deserialize(void* context, FlipperFormat* f | |||||||
| #endif | #endif | ||||||
|         if(!flipper_format_rewind(flipper_format)) { |         if(!flipper_format_rewind(flipper_format)) { | ||||||
|             FURI_LOG_E(TAG, "Rewind error"); |             FURI_LOG_E(TAG, "Rewind error"); | ||||||
|  |             res = SubGhzProtocolStatusErrorParserOthers; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         //optional parameter parameter
 |         //optional parameter parameter
 | ||||||
|         flipper_format_read_uint32( |         flipper_format_read_uint32( | ||||||
|             flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); |             flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); | ||||||
| 
 | 
 | ||||||
|         if(!subghz_protocol_encoder_bin_raw_get_upload(instance)) break; |         if(!subghz_protocol_encoder_bin_raw_get_upload(instance)) { | ||||||
|  |             break; | ||||||
|  |             res = SubGhzProtocolStatusErrorEncoderGetUpload; | ||||||
|  |         } | ||||||
|         instance->encoder.is_running = true; |         instance->encoder.is_running = true; | ||||||
| 
 | 
 | ||||||
|         res = true; |         res = SubGhzProtocolStatusOk; | ||||||
|     } while(0); |     } while(0); | ||||||
| 
 | 
 | ||||||
|     return res; |     return res; | ||||||
| @ -957,14 +968,14 @@ uint8_t subghz_protocol_decoder_bin_raw_get_hash_data(void* context) { | |||||||
|         subghz_protocol_bin_raw_get_full_byte(instance->data_markup[0].bit_count)); |         subghz_protocol_bin_raw_get_full_byte(instance->data_markup[0].bit_count)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_decoder_bin_raw_serialize( | SubGhzProtocolStatus subghz_protocol_decoder_bin_raw_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset) { |     SubGhzRadioPreset* preset) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     SubGhzProtocolDecoderBinRAW* instance = context; |     SubGhzProtocolDecoderBinRAW* instance = context; | ||||||
| 
 | 
 | ||||||
|     bool res = false; |     SubGhzProtocolStatus res = SubGhzProtocolStatusError; | ||||||
|     FuriString* temp_str; |     FuriString* temp_str; | ||||||
|     temp_str = furi_string_alloc(); |     temp_str = furi_string_alloc(); | ||||||
|     do { |     do { | ||||||
| @ -972,11 +983,13 @@ bool subghz_protocol_decoder_bin_raw_serialize( | |||||||
|         if(!flipper_format_write_header_cstr( |         if(!flipper_format_write_header_cstr( | ||||||
|                flipper_format, SUBGHZ_KEY_FILE_TYPE, SUBGHZ_KEY_FILE_VERSION)) { |                flipper_format, SUBGHZ_KEY_FILE_TYPE, SUBGHZ_KEY_FILE_VERSION)) { | ||||||
|             FURI_LOG_E(TAG, "Unable to add header"); |             FURI_LOG_E(TAG, "Unable to add header"); | ||||||
|  |             res = SubGhzProtocolStatusErrorParserHeader; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         if(!flipper_format_write_uint32(flipper_format, "Frequency", &preset->frequency, 1)) { |         if(!flipper_format_write_uint32(flipper_format, "Frequency", &preset->frequency, 1)) { | ||||||
|             FURI_LOG_E(TAG, "Unable to add Frequency"); |             FURI_LOG_E(TAG, "Unable to add Frequency"); | ||||||
|  |             res = SubGhzProtocolStatusErrorParserFrequency; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
| @ -984,34 +997,40 @@ bool subghz_protocol_decoder_bin_raw_serialize( | |||||||
|         if(!flipper_format_write_string_cstr( |         if(!flipper_format_write_string_cstr( | ||||||
|                flipper_format, "Preset", furi_string_get_cstr(temp_str))) { |                flipper_format, "Preset", furi_string_get_cstr(temp_str))) { | ||||||
|             FURI_LOG_E(TAG, "Unable to add Preset"); |             FURI_LOG_E(TAG, "Unable to add Preset"); | ||||||
|  |             res = SubGhzProtocolStatusErrorParserPreset; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         if(!strcmp(furi_string_get_cstr(temp_str), "FuriHalSubGhzPresetCustom")) { |         if(!strcmp(furi_string_get_cstr(temp_str), "FuriHalSubGhzPresetCustom")) { | ||||||
|             if(!flipper_format_write_string_cstr( |             if(!flipper_format_write_string_cstr( | ||||||
|                    flipper_format, "Custom_preset_module", "CC1101")) { |                    flipper_format, "Custom_preset_module", "CC1101")) { | ||||||
|                 FURI_LOG_E(TAG, "Unable to add Custom_preset_module"); |                 FURI_LOG_E(TAG, "Unable to add Custom_preset_module"); | ||||||
|  |                 res = SubGhzProtocolStatusErrorParserCustomPreset; | ||||||
|                 break; |                 break; | ||||||
|             } |             } | ||||||
|             if(!flipper_format_write_hex( |             if(!flipper_format_write_hex( | ||||||
|                    flipper_format, "Custom_preset_data", preset->data, preset->data_size)) { |                    flipper_format, "Custom_preset_data", preset->data, preset->data_size)) { | ||||||
|                 FURI_LOG_E(TAG, "Unable to add Custom_preset_data"); |                 FURI_LOG_E(TAG, "Unable to add Custom_preset_data"); | ||||||
|  |                 res = SubGhzProtocolStatusErrorParserCustomPreset; | ||||||
|                 break; |                 break; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         if(!flipper_format_write_string_cstr( |         if(!flipper_format_write_string_cstr( | ||||||
|                flipper_format, "Protocol", instance->generic.protocol_name)) { |                flipper_format, "Protocol", instance->generic.protocol_name)) { | ||||||
|             FURI_LOG_E(TAG, "Unable to add Protocol"); |             FURI_LOG_E(TAG, "Unable to add Protocol"); | ||||||
|  |             res = SubGhzProtocolStatusErrorParserProtocolName; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         uint32_t temp = instance->generic.data_count_bit; |         uint32_t temp = instance->generic.data_count_bit; | ||||||
|         if(!flipper_format_write_uint32(flipper_format, "Bit", &temp, 1)) { |         if(!flipper_format_write_uint32(flipper_format, "Bit", &temp, 1)) { | ||||||
|             FURI_LOG_E(TAG, "Unable to add Bit"); |             FURI_LOG_E(TAG, "Unable to add Bit"); | ||||||
|  |             res = SubGhzProtocolStatusErrorParserBitCount; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         if(!flipper_format_write_uint32(flipper_format, "TE", &instance->te, 1)) { |         if(!flipper_format_write_uint32(flipper_format, "TE", &instance->te, 1)) { | ||||||
|             FURI_LOG_E(TAG, "Unable to add TE"); |             FURI_LOG_E(TAG, "Unable to add TE"); | ||||||
|  |             res = SubGhzProtocolStatusErrorParserTe; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
| @ -1020,6 +1039,7 @@ bool subghz_protocol_decoder_bin_raw_serialize( | |||||||
|             temp = instance->data_markup[i].bit_count; |             temp = instance->data_markup[i].bit_count; | ||||||
|             if(!flipper_format_write_uint32(flipper_format, "Bit_RAW", &temp, 1)) { |             if(!flipper_format_write_uint32(flipper_format, "Bit_RAW", &temp, 1)) { | ||||||
|                 FURI_LOG_E(TAG, "Bit_RAW"); |                 FURI_LOG_E(TAG, "Bit_RAW"); | ||||||
|  |                 res = SubGhzProtocolStatusErrorParserOthers; | ||||||
|                 break; |                 break; | ||||||
|             } |             } | ||||||
|             if(!flipper_format_write_hex( |             if(!flipper_format_write_hex( | ||||||
| @ -1028,31 +1048,35 @@ bool subghz_protocol_decoder_bin_raw_serialize( | |||||||
|                    instance->data + instance->data_markup[i].byte_bias, |                    instance->data + instance->data_markup[i].byte_bias, | ||||||
|                    subghz_protocol_bin_raw_get_full_byte(instance->data_markup[i].bit_count))) { |                    subghz_protocol_bin_raw_get_full_byte(instance->data_markup[i].bit_count))) { | ||||||
|                 FURI_LOG_E(TAG, "Unable to add Data_RAW"); |                 FURI_LOG_E(TAG, "Unable to add Data_RAW"); | ||||||
|  |                 res = SubGhzProtocolStatusErrorParserOthers; | ||||||
|                 break; |                 break; | ||||||
|             } |             } | ||||||
|             i++; |             i++; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         res = true; |         res = SubGhzProtocolStatusOk; | ||||||
|     } while(false); |     } while(false); | ||||||
|     furi_string_free(temp_str); |     furi_string_free(temp_str); | ||||||
|     return res; |     return res; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_decoder_bin_raw_deserialize(void* context, FlipperFormat* flipper_format) { | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_decoder_bin_raw_deserialize(void* context, FlipperFormat* flipper_format) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     SubGhzProtocolDecoderBinRAW* instance = context; |     SubGhzProtocolDecoderBinRAW* instance = context; | ||||||
| 
 | 
 | ||||||
|     bool res = false; |     SubGhzProtocolStatus res = SubGhzProtocolStatusError; | ||||||
|     uint32_t temp_data = 0; |     uint32_t temp_data = 0; | ||||||
| 
 | 
 | ||||||
|     do { |     do { | ||||||
|         if(!flipper_format_rewind(flipper_format)) { |         if(!flipper_format_rewind(flipper_format)) { | ||||||
|             FURI_LOG_E(TAG, "Rewind error"); |             FURI_LOG_E(TAG, "Rewind error"); | ||||||
|  |             res = SubGhzProtocolStatusErrorParserOthers; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         if(!flipper_format_read_uint32(flipper_format, "Bit", (uint32_t*)&temp_data, 1)) { |         if(!flipper_format_read_uint32(flipper_format, "Bit", (uint32_t*)&temp_data, 1)) { | ||||||
|             FURI_LOG_E(TAG, "Missing Bit"); |             FURI_LOG_E(TAG, "Missing Bit"); | ||||||
|  |             res = SubGhzProtocolStatusErrorParserBitCount; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
| @ -1060,6 +1084,7 @@ bool subghz_protocol_decoder_bin_raw_deserialize(void* context, FlipperFormat* f | |||||||
| 
 | 
 | ||||||
|         if(!flipper_format_read_uint32(flipper_format, "TE", (uint32_t*)&instance->te, 1)) { |         if(!flipper_format_read_uint32(flipper_format, "TE", (uint32_t*)&instance->te, 1)) { | ||||||
|             FURI_LOG_E(TAG, "Missing TE"); |             FURI_LOG_E(TAG, "Missing TE"); | ||||||
|  |             res = SubGhzProtocolStatusErrorParserTe; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
| @ -1071,11 +1096,13 @@ bool subghz_protocol_decoder_bin_raw_deserialize(void* context, FlipperFormat* f | |||||||
|         while(flipper_format_read_uint32(flipper_format, "Bit_RAW", (uint32_t*)&temp_data, 1)) { |         while(flipper_format_read_uint32(flipper_format, "Bit_RAW", (uint32_t*)&temp_data, 1)) { | ||||||
|             if(ind >= BIN_RAW_MAX_MARKUP_COUNT) { |             if(ind >= BIN_RAW_MAX_MARKUP_COUNT) { | ||||||
|                 FURI_LOG_E(TAG, "Markup overflow"); |                 FURI_LOG_E(TAG, "Markup overflow"); | ||||||
|  |                 res = SubGhzProtocolStatusErrorParserOthers; | ||||||
|                 break; |                 break; | ||||||
|             } |             } | ||||||
|             byte_count += subghz_protocol_bin_raw_get_full_byte(temp_data); |             byte_count += subghz_protocol_bin_raw_get_full_byte(temp_data); | ||||||
|             if(byte_count > BIN_RAW_BUF_DATA_SIZE) { |             if(byte_count > BIN_RAW_BUF_DATA_SIZE) { | ||||||
|                 FURI_LOG_E(TAG, "Receive buffer overflow"); |                 FURI_LOG_E(TAG, "Receive buffer overflow"); | ||||||
|  |                 res = SubGhzProtocolStatusErrorParserOthers; | ||||||
|                 break; |                 break; | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
| @ -1090,12 +1117,13 @@ bool subghz_protocol_decoder_bin_raw_deserialize(void* context, FlipperFormat* f | |||||||
|                    subghz_protocol_bin_raw_get_full_byte(temp_data))) { |                    subghz_protocol_bin_raw_get_full_byte(temp_data))) { | ||||||
|                 instance->data_markup[ind].bit_count = 0; |                 instance->data_markup[ind].bit_count = 0; | ||||||
|                 FURI_LOG_E(TAG, "Missing Data_RAW"); |                 FURI_LOG_E(TAG, "Missing Data_RAW"); | ||||||
|  |                 res = SubGhzProtocolStatusErrorParserOthers; | ||||||
|                 break; |                 break; | ||||||
|             } |             } | ||||||
|             ind++; |             ind++; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         res = true; |         res = SubGhzProtocolStatusOk; | ||||||
|     } while(0); |     } while(0); | ||||||
| 
 | 
 | ||||||
|     return res; |     return res; | ||||||
|  | |||||||
| @ -28,9 +28,10 @@ void subghz_protocol_encoder_bin_raw_free(void* context); | |||||||
|  * Deserialize and generating an upload to send. |  * Deserialize and generating an upload to send. | ||||||
|  * @param context Pointer to a SubGhzProtocolEncoderBinRAW instance |  * @param context Pointer to a SubGhzProtocolEncoderBinRAW instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_encoder_bin_raw_deserialize(void* context, FlipperFormat* flipper_format); | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_encoder_bin_raw_deserialize(void* context, FlipperFormat* flipper_format); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Forced transmission stop. |  * Forced transmission stop. | ||||||
| @ -88,9 +89,9 @@ void subghz_protocol_decoder_bin_raw_data_input_rssi( | |||||||
|  * @param context Pointer to a SubGhzProtocolDecoderBinRAW instance |  * @param context Pointer to a SubGhzProtocolDecoderBinRAW instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @param preset The modulation on which the signal was received, SubGhzRadioPreset |  * @param preset The modulation on which the signal was received, SubGhzRadioPreset | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_decoder_bin_raw_serialize( | SubGhzProtocolStatus subghz_protocol_decoder_bin_raw_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset); |     SubGhzRadioPreset* preset); | ||||||
| @ -99,9 +100,10 @@ bool subghz_protocol_decoder_bin_raw_serialize( | |||||||
|  * Deserialize data SubGhzProtocolDecoderBinRAW. |  * Deserialize data SubGhzProtocolDecoderBinRAW. | ||||||
|  * @param context Pointer to a SubGhzProtocolDecoderBinRAW instance |  * @param context Pointer to a SubGhzProtocolDecoderBinRAW instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_decoder_bin_raw_deserialize(void* context, FlipperFormat* flipper_format); | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_decoder_bin_raw_deserialize(void* context, FlipperFormat* flipper_format); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Getting a textual representation of the received data. |  * Getting a textual representation of the received data. | ||||||
|  | |||||||
| @ -13,6 +13,7 @@ | |||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
| #define TAG "SubGhzProtocolCAME" | #define TAG "SubGhzProtocolCAME" | ||||||
|  | #define CAME_12_COUNT_BIT 12 | ||||||
| #define CAME_24_COUNT_BIT 24 | #define CAME_24_COUNT_BIT 24 | ||||||
| #define PRASTEL_COUNT_BIT 25 | #define PRASTEL_COUNT_BIT 25 | ||||||
| #define PRASTEL_NAME "Prastel" | #define PRASTEL_NAME "Prastel" | ||||||
| @ -108,6 +109,7 @@ void subghz_protocol_encoder_came_free(void* context) { | |||||||
|  */ |  */ | ||||||
| static bool subghz_protocol_encoder_came_get_upload(SubGhzProtocolEncoderCame* instance) { | static bool subghz_protocol_encoder_came_get_upload(SubGhzProtocolEncoderCame* instance) { | ||||||
|     furi_assert(instance); |     furi_assert(instance); | ||||||
|  |     uint32_t header_te = 0; | ||||||
|     size_t index = 0; |     size_t index = 0; | ||||||
|     size_t size_upload = (instance->generic.data_count_bit * 2) + 2; |     size_t size_upload = (instance->generic.data_count_bit * 2) + 2; | ||||||
|     if(size_upload > instance->encoder.size_upload) { |     if(size_upload > instance->encoder.size_upload) { | ||||||
| @ -117,13 +119,28 @@ static bool subghz_protocol_encoder_came_get_upload(SubGhzProtocolEncoderCame* i | |||||||
|         instance->encoder.size_upload = size_upload; |         instance->encoder.size_upload = size_upload; | ||||||
|     } |     } | ||||||
|     //Send header
 |     //Send header
 | ||||||
|     instance->encoder.upload[index++] = level_duration_make( | 
 | ||||||
|         false, |     switch(instance->generic.data_count_bit) { | ||||||
|         (((instance->generic.data_count_bit == CAME_24_COUNT_BIT) || |     case CAME_24_COUNT_BIT: | ||||||
|           (instance->generic.data_count_bit == |         // CAME 24 Bit = 24320 us
 | ||||||
|            subghz_protocol_came_const.min_count_bit_for_found)) ? |         header_te = 76; | ||||||
|              (uint32_t)subghz_protocol_came_const.te_short * 76 : |         break; | ||||||
|              (uint32_t)subghz_protocol_came_const.te_short * 39)); |     case CAME_12_COUNT_BIT: | ||||||
|  |     case AIRFORCE_COUNT_BIT: | ||||||
|  |         // CAME 12 Bit Original only! and Airforce protocol = 15040 us
 | ||||||
|  |         header_te = 47; | ||||||
|  |         break; | ||||||
|  |     case PRASTEL_COUNT_BIT: | ||||||
|  |         // PRASTEL = 11520 us
 | ||||||
|  |         header_te = 36; | ||||||
|  |         break; | ||||||
|  |     default: | ||||||
|  |         // Some wrong detected protocols, 5120 us
 | ||||||
|  |         header_te = 16; | ||||||
|  |         break; | ||||||
|  |     } | ||||||
|  |     instance->encoder.upload[index++] = | ||||||
|  |         level_duration_make(false, (uint32_t)subghz_protocol_came_const.te_short * header_te); | ||||||
|     //Send start bit
 |     //Send start bit
 | ||||||
|     instance->encoder.upload[index++] = |     instance->encoder.upload[index++] = | ||||||
|         level_duration_make(true, (uint32_t)subghz_protocol_came_const.te_short); |         level_duration_make(true, (uint32_t)subghz_protocol_came_const.te_short); | ||||||
| @ -146,30 +163,33 @@ static bool subghz_protocol_encoder_came_get_upload(SubGhzProtocolEncoderCame* i | |||||||
|     return true; |     return true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_encoder_came_deserialize(void* context, FlipperFormat* flipper_format) { | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_encoder_came_deserialize(void* context, FlipperFormat* flipper_format) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     SubGhzProtocolEncoderCame* instance = context; |     SubGhzProtocolEncoderCame* instance = context; | ||||||
|     bool res = false; |     SubGhzProtocolStatus ret = SubGhzProtocolStatusError; | ||||||
|     do { |     do { | ||||||
|         if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) { |         ret = subghz_block_generic_deserialize(&instance->generic, flipper_format); | ||||||
|             FURI_LOG_E(TAG, "Deserialize error"); |         if(ret != SubGhzProtocolStatusOk) { | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         if((instance->generic.data_count_bit > PRASTEL_COUNT_BIT)) { |         if((instance->generic.data_count_bit > PRASTEL_COUNT_BIT)) { | ||||||
|             FURI_LOG_E(TAG, "Wrong number of bits in key"); |             FURI_LOG_E(TAG, "Wrong number of bits in key"); | ||||||
|  |             ret = SubGhzProtocolStatusErrorValueBitCount; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         //optional parameter parameter
 |         //optional parameter parameter
 | ||||||
|         flipper_format_read_uint32( |         flipper_format_read_uint32( | ||||||
|             flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); |             flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); | ||||||
| 
 | 
 | ||||||
|         if(!subghz_protocol_encoder_came_get_upload(instance)) break; |         if(!subghz_protocol_encoder_came_get_upload(instance)) { | ||||||
|  |             ret = SubGhzProtocolStatusErrorEncoderGetUpload; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|         instance->encoder.is_running = true; |         instance->encoder.is_running = true; | ||||||
| 
 |  | ||||||
|         res = true; |  | ||||||
|     } while(false); |     } while(false); | ||||||
| 
 | 
 | ||||||
|     return res; |     return ret; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void subghz_protocol_encoder_came_stop(void* context) { | void subghz_protocol_encoder_came_stop(void* context) { | ||||||
| @ -244,8 +264,11 @@ void subghz_protocol_decoder_came_feed(void* context, bool level, uint32_t durat | |||||||
|         if(!level) { //save interval
 |         if(!level) { //save interval
 | ||||||
|             if(duration >= (subghz_protocol_came_const.te_short * 4)) { |             if(duration >= (subghz_protocol_came_const.te_short * 4)) { | ||||||
|                 instance->decoder.parser_step = CameDecoderStepFoundStartBit; |                 instance->decoder.parser_step = CameDecoderStepFoundStartBit; | ||||||
|                 if(instance->decoder.decode_count_bit >= |                 if((instance->decoder.decode_count_bit == | ||||||
|                    subghz_protocol_came_const.min_count_bit_for_found) { |                     subghz_protocol_came_const.min_count_bit_for_found) || | ||||||
|  |                    (instance->decoder.decode_count_bit == AIRFORCE_COUNT_BIT) || | ||||||
|  |                    (instance->decoder.decode_count_bit == PRASTEL_COUNT_BIT) || | ||||||
|  |                    (instance->decoder.decode_count_bit == CAME_24_COUNT_BIT)) { | ||||||
|                     instance->generic.serial = 0x0; |                     instance->generic.serial = 0x0; | ||||||
|                     instance->generic.btn = 0x0; |                     instance->generic.btn = 0x0; | ||||||
| 
 | 
 | ||||||
| @ -294,7 +317,7 @@ uint8_t subghz_protocol_decoder_came_get_hash_data(void* context) { | |||||||
|         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); |         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_decoder_came_serialize( | SubGhzProtocolStatus subghz_protocol_decoder_came_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset) { |     SubGhzRadioPreset* preset) { | ||||||
| @ -303,19 +326,21 @@ bool subghz_protocol_decoder_came_serialize( | |||||||
|     return subghz_block_generic_serialize(&instance->generic, flipper_format, preset); |     return subghz_block_generic_serialize(&instance->generic, flipper_format, preset); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_decoder_came_deserialize(void* context, FlipperFormat* flipper_format) { | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_decoder_came_deserialize(void* context, FlipperFormat* flipper_format) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     SubGhzProtocolDecoderCame* instance = context; |     SubGhzProtocolDecoderCame* instance = context; | ||||||
|     bool ret = false; |     SubGhzProtocolStatus ret = SubGhzProtocolStatusError; | ||||||
|     do { |     do { | ||||||
|         if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) { |         ret = subghz_block_generic_deserialize(&instance->generic, flipper_format); | ||||||
|  |         if(ret != SubGhzProtocolStatusOk) { | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         if((instance->generic.data_count_bit > PRASTEL_COUNT_BIT)) { |         if((instance->generic.data_count_bit > PRASTEL_COUNT_BIT)) { | ||||||
|             FURI_LOG_E(TAG, "Wrong number of bits in key"); |             FURI_LOG_E(TAG, "Wrong number of bits in key"); | ||||||
|  |             ret = SubGhzProtocolStatusErrorValueBitCount; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         ret = true; |  | ||||||
|     } while(false); |     } while(false); | ||||||
|     return ret; |     return ret; | ||||||
| } | } | ||||||
|  | |||||||
| @ -28,9 +28,10 @@ void subghz_protocol_encoder_came_free(void* context); | |||||||
|  * Deserialize and generating an upload to send. |  * Deserialize and generating an upload to send. | ||||||
|  * @param context Pointer to a SubGhzProtocolEncoderCame instance |  * @param context Pointer to a SubGhzProtocolEncoderCame instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_encoder_came_deserialize(void* context, FlipperFormat* flipper_format); | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_encoder_came_deserialize(void* context, FlipperFormat* flipper_format); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Forced transmission stop. |  * Forced transmission stop. | ||||||
| @ -84,9 +85,9 @@ uint8_t subghz_protocol_decoder_came_get_hash_data(void* context); | |||||||
|  * @param context Pointer to a SubGhzProtocolDecoderCame instance |  * @param context Pointer to a SubGhzProtocolDecoderCame instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @param preset The modulation on which the signal was received, SubGhzRadioPreset |  * @param preset The modulation on which the signal was received, SubGhzRadioPreset | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_decoder_came_serialize( | SubGhzProtocolStatus subghz_protocol_decoder_came_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset); |     SubGhzRadioPreset* preset); | ||||||
| @ -95,9 +96,10 @@ bool subghz_protocol_decoder_came_serialize( | |||||||
|  * Deserialize data SubGhzProtocolDecoderCame. |  * Deserialize data SubGhzProtocolDecoderCame. | ||||||
|  * @param context Pointer to a SubGhzProtocolDecoderCame instance |  * @param context Pointer to a SubGhzProtocolDecoderCame instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_decoder_came_deserialize(void* context, FlipperFormat* flipper_format); | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_decoder_came_deserialize(void* context, FlipperFormat* flipper_format); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Getting a textual representation of the received data. |  * Getting a textual representation of the received data. | ||||||
|  | |||||||
| @ -298,7 +298,7 @@ uint8_t subghz_protocol_decoder_came_atomo_get_hash_data(void* context) { | |||||||
|         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); |         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_decoder_came_atomo_serialize( | SubGhzProtocolStatus subghz_protocol_decoder_came_atomo_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset) { |     SubGhzRadioPreset* preset) { | ||||||
| @ -307,22 +307,14 @@ bool subghz_protocol_decoder_came_atomo_serialize( | |||||||
|     return subghz_block_generic_serialize(&instance->generic, flipper_format, preset); |     return subghz_block_generic_serialize(&instance->generic, flipper_format, preset); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_decoder_came_atomo_deserialize(void* context, FlipperFormat* flipper_format) { | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_decoder_came_atomo_deserialize(void* context, FlipperFormat* flipper_format) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     SubGhzProtocolDecoderCameAtomo* instance = context; |     SubGhzProtocolDecoderCameAtomo* instance = context; | ||||||
|     bool ret = false; |     return subghz_block_generic_deserialize_check_count_bit( | ||||||
|     do { |         &instance->generic, | ||||||
|         if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) { |         flipper_format, | ||||||
|             break; |         subghz_protocol_came_atomo_const.min_count_bit_for_found); | ||||||
|         } |  | ||||||
|         if(instance->generic.data_count_bit != |  | ||||||
|            subghz_protocol_came_atomo_const.min_count_bit_for_found) { |  | ||||||
|             FURI_LOG_E(TAG, "Wrong number of bits in key"); |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|         ret = true; |  | ||||||
|     } while(false); |  | ||||||
|     return ret; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void subghz_protocol_decoder_came_atomo_get_string(void* context, FuriString* output) { | void subghz_protocol_decoder_came_atomo_get_string(void* context, FuriString* output) { | ||||||
|  | |||||||
| @ -49,9 +49,9 @@ uint8_t subghz_protocol_decoder_came_atomo_get_hash_data(void* context); | |||||||
|  * @param context Pointer to a SubGhzProtocolDecoderCameAtomo instance |  * @param context Pointer to a SubGhzProtocolDecoderCameAtomo instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @param preset The modulation on which the signal was received, SubGhzRadioPreset |  * @param preset The modulation on which the signal was received, SubGhzRadioPreset | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_decoder_came_atomo_serialize( | SubGhzProtocolStatus subghz_protocol_decoder_came_atomo_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset); |     SubGhzRadioPreset* preset); | ||||||
| @ -60,9 +60,10 @@ bool subghz_protocol_decoder_came_atomo_serialize( | |||||||
|  * Deserialize data SubGhzProtocolDecoderCameAtomo. |  * Deserialize data SubGhzProtocolDecoderCameAtomo. | ||||||
|  * @param context Pointer to a SubGhzProtocolDecoderCameAtomo instance |  * @param context Pointer to a SubGhzProtocolDecoderCameAtomo instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_decoder_came_atomo_deserialize(void* context, FlipperFormat* flipper_format); | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_decoder_came_atomo_deserialize(void* context, FlipperFormat* flipper_format); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Getting a textual representation of the received data. |  * Getting a textual representation of the received data. | ||||||
|  | |||||||
| @ -241,18 +241,17 @@ static void subghz_protocol_came_twee_remote_controller(SubGhzBlockGeneric* inst | |||||||
|     instance->cnt = data >> 6; |     instance->cnt = data >> 6; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_encoder_came_twee_deserialize(void* context, FlipperFormat* flipper_format) { | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_encoder_came_twee_deserialize(void* context, FlipperFormat* flipper_format) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     SubGhzProtocolEncoderCameTwee* instance = context; |     SubGhzProtocolEncoderCameTwee* instance = context; | ||||||
|     bool res = false; |     SubGhzProtocolStatus res = SubGhzProtocolStatusError; | ||||||
|     do { |     do { | ||||||
|         if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) { |         res = subghz_block_generic_deserialize_check_count_bit( | ||||||
|             FURI_LOG_E(TAG, "Deserialize error"); |             &instance->generic, | ||||||
|             break; |             flipper_format, | ||||||
|         } |             subghz_protocol_came_twee_const.min_count_bit_for_found); | ||||||
|         if(instance->generic.data_count_bit != |         if(res != SubGhzProtocolStatusOk) { | ||||||
|            subghz_protocol_came_twee_const.min_count_bit_for_found) { |  | ||||||
|             FURI_LOG_E(TAG, "Wrong number of bits in key"); |  | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         //optional parameter parameter
 |         //optional parameter parameter
 | ||||||
| @ -262,8 +261,6 @@ bool subghz_protocol_encoder_came_twee_deserialize(void* context, FlipperFormat* | |||||||
|         subghz_protocol_came_twee_remote_controller(&instance->generic); |         subghz_protocol_came_twee_remote_controller(&instance->generic); | ||||||
|         subghz_protocol_encoder_came_twee_get_upload(instance); |         subghz_protocol_encoder_came_twee_get_upload(instance); | ||||||
|         instance->encoder.is_running = true; |         instance->encoder.is_running = true; | ||||||
| 
 |  | ||||||
|         res = true; |  | ||||||
|     } while(false); |     } while(false); | ||||||
| 
 | 
 | ||||||
|     return res; |     return res; | ||||||
| @ -419,7 +416,7 @@ uint8_t subghz_protocol_decoder_came_twee_get_hash_data(void* context) { | |||||||
|         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); |         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_decoder_came_twee_serialize( | SubGhzProtocolStatus subghz_protocol_decoder_came_twee_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset) { |     SubGhzRadioPreset* preset) { | ||||||
| @ -428,22 +425,14 @@ bool subghz_protocol_decoder_came_twee_serialize( | |||||||
|     return subghz_block_generic_serialize(&instance->generic, flipper_format, preset); |     return subghz_block_generic_serialize(&instance->generic, flipper_format, preset); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_decoder_came_twee_deserialize(void* context, FlipperFormat* flipper_format) { | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_decoder_came_twee_deserialize(void* context, FlipperFormat* flipper_format) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     SubGhzProtocolDecoderCameTwee* instance = context; |     SubGhzProtocolDecoderCameTwee* instance = context; | ||||||
|     bool ret = false; |     return subghz_block_generic_deserialize_check_count_bit( | ||||||
|     do { |         &instance->generic, | ||||||
|         if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) { |         flipper_format, | ||||||
|             break; |         subghz_protocol_came_twee_const.min_count_bit_for_found); | ||||||
|         } |  | ||||||
|         if(instance->generic.data_count_bit != |  | ||||||
|            subghz_protocol_came_twee_const.min_count_bit_for_found) { |  | ||||||
|             FURI_LOG_E(TAG, "Wrong number of bits in key"); |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|         ret = true; |  | ||||||
|     } while(false); |  | ||||||
|     return ret; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void subghz_protocol_decoder_came_twee_get_string(void* context, FuriString* output) { | void subghz_protocol_decoder_came_twee_get_string(void* context, FuriString* output) { | ||||||
|  | |||||||
| @ -28,9 +28,10 @@ void subghz_protocol_encoder_came_twee_free(void* context); | |||||||
|  * Deserialize and generating an upload to send. |  * Deserialize and generating an upload to send. | ||||||
|  * @param context Pointer to a SubGhzProtocolEncoderCameTwee instance |  * @param context Pointer to a SubGhzProtocolEncoderCameTwee instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_encoder_came_twee_deserialize(void* context, FlipperFormat* flipper_format); | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_encoder_came_twee_deserialize(void* context, FlipperFormat* flipper_format); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Forced transmission stop. |  * Forced transmission stop. | ||||||
| @ -84,9 +85,9 @@ uint8_t subghz_protocol_decoder_came_twee_get_hash_data(void* context); | |||||||
|  * @param context Pointer to a SubGhzProtocolDecoderCameTwee instance |  * @param context Pointer to a SubGhzProtocolDecoderCameTwee instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @param preset The modulation on which the signal was received, SubGhzRadioPreset |  * @param preset The modulation on which the signal was received, SubGhzRadioPreset | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_decoder_came_twee_serialize( | SubGhzProtocolStatus subghz_protocol_decoder_came_twee_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset); |     SubGhzRadioPreset* preset); | ||||||
| @ -95,9 +96,10 @@ bool subghz_protocol_decoder_came_twee_serialize( | |||||||
|  * Deserialize data SubGhzProtocolDecoderCameTwee. |  * Deserialize data SubGhzProtocolDecoderCameTwee. | ||||||
|  * @param context Pointer to a SubGhzProtocolDecoderCameTwee instance |  * @param context Pointer to a SubGhzProtocolDecoderCameTwee instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_decoder_came_twee_deserialize(void* context, FlipperFormat* flipper_format); | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_decoder_came_twee_deserialize(void* context, FlipperFormat* flipper_format); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Getting a textual representation of the received data. |  * Getting a textual representation of the received data. | ||||||
|  | |||||||
| @ -207,31 +207,35 @@ static bool | |||||||
|     return true; |     return true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_encoder_chamb_code_deserialize(void* context, FlipperFormat* flipper_format) { | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_encoder_chamb_code_deserialize(void* context, FlipperFormat* flipper_format) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     SubGhzProtocolEncoderChamb_Code* instance = context; |     SubGhzProtocolEncoderChamb_Code* instance = context; | ||||||
|     bool res = false; |     SubGhzProtocolStatus ret = SubGhzProtocolStatusError; | ||||||
|     do { |     do { | ||||||
|         if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) { |         ret = subghz_block_generic_deserialize(&instance->generic, flipper_format); | ||||||
|             FURI_LOG_E(TAG, "Deserialize error"); |         if(ret != SubGhzProtocolStatusOk) { | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         if(instance->generic.data_count_bit > |         if(instance->generic.data_count_bit > | ||||||
|            subghz_protocol_chamb_code_const.min_count_bit_for_found) { |            subghz_protocol_chamb_code_const.min_count_bit_for_found) { | ||||||
|             FURI_LOG_E(TAG, "Wrong number of bits in key"); |             FURI_LOG_E(TAG, "Wrong number of bits in key"); | ||||||
|  |             ret = SubGhzProtocolStatusErrorValueBitCount; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         //optional parameter parameter
 |         //optional parameter parameter
 | ||||||
|         flipper_format_read_uint32( |         flipper_format_read_uint32( | ||||||
|             flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); |             flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); | ||||||
| 
 | 
 | ||||||
|         if(!subghz_protocol_encoder_chamb_code_get_upload(instance)) break; |         if(!subghz_protocol_encoder_chamb_code_get_upload(instance)) { | ||||||
|  |             ret = SubGhzProtocolStatusErrorEncoderGetUpload; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|         instance->encoder.is_running = true; |         instance->encoder.is_running = true; | ||||||
| 
 | 
 | ||||||
|         res = true; |  | ||||||
|     } while(false); |     } while(false); | ||||||
| 
 | 
 | ||||||
|     return res; |     return ret; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void subghz_protocol_encoder_chamb_code_stop(void* context) { | void subghz_protocol_encoder_chamb_code_stop(void* context) { | ||||||
| @ -425,7 +429,7 @@ uint8_t subghz_protocol_decoder_chamb_code_get_hash_data(void* context) { | |||||||
|         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); |         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_decoder_chamb_code_serialize( | SubGhzProtocolStatus subghz_protocol_decoder_chamb_code_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset) { |     SubGhzRadioPreset* preset) { | ||||||
| @ -434,20 +438,22 @@ bool subghz_protocol_decoder_chamb_code_serialize( | |||||||
|     return subghz_block_generic_serialize(&instance->generic, flipper_format, preset); |     return subghz_block_generic_serialize(&instance->generic, flipper_format, preset); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_decoder_chamb_code_deserialize(void* context, FlipperFormat* flipper_format) { | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_decoder_chamb_code_deserialize(void* context, FlipperFormat* flipper_format) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     SubGhzProtocolDecoderChamb_Code* instance = context; |     SubGhzProtocolDecoderChamb_Code* instance = context; | ||||||
|     bool ret = false; |     SubGhzProtocolStatus ret = SubGhzProtocolStatusError; | ||||||
|     do { |     do { | ||||||
|         if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) { |         ret = subghz_block_generic_deserialize(&instance->generic, flipper_format); | ||||||
|  |         if(ret != SubGhzProtocolStatusOk) { | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         if(instance->generic.data_count_bit > |         if(instance->generic.data_count_bit > | ||||||
|            subghz_protocol_chamb_code_const.min_count_bit_for_found) { |            subghz_protocol_chamb_code_const.min_count_bit_for_found) { | ||||||
|             FURI_LOG_E(TAG, "Wrong number of bits in key"); |             FURI_LOG_E(TAG, "Wrong number of bits in key"); | ||||||
|  |             ret = SubGhzProtocolStatusErrorValueBitCount; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         ret = true; |  | ||||||
|     } while(false); |     } while(false); | ||||||
|     return ret; |     return ret; | ||||||
| } | } | ||||||
|  | |||||||
| @ -28,9 +28,10 @@ void subghz_protocol_encoder_chamb_code_free(void* context); | |||||||
|  * Deserialize and generating an upload to send. |  * Deserialize and generating an upload to send. | ||||||
|  * @param context Pointer to a SubGhzProtocolEncoderChamb_Code instance |  * @param context Pointer to a SubGhzProtocolEncoderChamb_Code instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_encoder_chamb_code_deserialize(void* context, FlipperFormat* flipper_format); | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_encoder_chamb_code_deserialize(void* context, FlipperFormat* flipper_format); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Forced transmission stop. |  * Forced transmission stop. | ||||||
| @ -84,9 +85,9 @@ uint8_t subghz_protocol_decoder_chamb_code_get_hash_data(void* context); | |||||||
|  * @param context Pointer to a SubGhzProtocolDecoderChamb_Code instance |  * @param context Pointer to a SubGhzProtocolDecoderChamb_Code instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @param preset The modulation on which the signal was received, SubGhzRadioPreset |  * @param preset The modulation on which the signal was received, SubGhzRadioPreset | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_decoder_chamb_code_serialize( | SubGhzProtocolStatus subghz_protocol_decoder_chamb_code_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset); |     SubGhzRadioPreset* preset); | ||||||
| @ -95,9 +96,10 @@ bool subghz_protocol_decoder_chamb_code_serialize( | |||||||
|  * Deserialize data SubGhzProtocolDecoderChamb_Code. |  * Deserialize data SubGhzProtocolDecoderChamb_Code. | ||||||
|  * @param context Pointer to a SubGhzProtocolDecoderChamb_Code instance |  * @param context Pointer to a SubGhzProtocolDecoderChamb_Code instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_decoder_chamb_code_deserialize(void* context, FlipperFormat* flipper_format); | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_decoder_chamb_code_deserialize(void* context, FlipperFormat* flipper_format); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Getting a textual representation of the received data. |  * Getting a textual representation of the received data. | ||||||
|  | |||||||
| @ -155,31 +155,32 @@ static bool subghz_protocol_encoder_clemsa_get_upload(SubGhzProtocolEncoderClems | |||||||
|     return true; |     return true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_encoder_clemsa_deserialize(void* context, FlipperFormat* flipper_format) { | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_encoder_clemsa_deserialize(void* context, FlipperFormat* flipper_format) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     SubGhzProtocolEncoderClemsa* instance = context; |     SubGhzProtocolEncoderClemsa* instance = context; | ||||||
|     bool res = false; |     SubGhzProtocolStatus ret = SubGhzProtocolStatusError; | ||||||
|     do { |     do { | ||||||
|         if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) { |         ret = subghz_block_generic_deserialize_check_count_bit( | ||||||
|             FURI_LOG_E(TAG, "Deserialize error"); |             &instance->generic, | ||||||
|             break; |             flipper_format, | ||||||
|         } |             subghz_protocol_clemsa_const.min_count_bit_for_found); | ||||||
|         if(instance->generic.data_count_bit != |         if(ret != SubGhzProtocolStatusOk) { | ||||||
|            subghz_protocol_clemsa_const.min_count_bit_for_found) { |  | ||||||
|             FURI_LOG_E(TAG, "Wrong number of bits in key"); |  | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         //optional parameter parameter
 |         //optional parameter parameter
 | ||||||
|         flipper_format_read_uint32( |         flipper_format_read_uint32( | ||||||
|             flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); |             flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); | ||||||
| 
 | 
 | ||||||
|         if(!subghz_protocol_encoder_clemsa_get_upload(instance)) break; |         if(!subghz_protocol_encoder_clemsa_get_upload(instance)) { | ||||||
|  |             ret = SubGhzProtocolStatusErrorEncoderGetUpload; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|         instance->encoder.is_running = true; |         instance->encoder.is_running = true; | ||||||
| 
 | 
 | ||||||
|         res = true; |  | ||||||
|     } while(false); |     } while(false); | ||||||
| 
 | 
 | ||||||
|     return res; |     return ret; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void subghz_protocol_encoder_clemsa_stop(void* context) { | void subghz_protocol_encoder_clemsa_stop(void* context) { | ||||||
| @ -316,7 +317,7 @@ uint8_t subghz_protocol_decoder_clemsa_get_hash_data(void* context) { | |||||||
|         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); |         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_decoder_clemsa_serialize( | SubGhzProtocolStatus subghz_protocol_decoder_clemsa_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset) { |     SubGhzRadioPreset* preset) { | ||||||
| @ -325,22 +326,12 @@ bool subghz_protocol_decoder_clemsa_serialize( | |||||||
|     return subghz_block_generic_serialize(&instance->generic, flipper_format, preset); |     return subghz_block_generic_serialize(&instance->generic, flipper_format, preset); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_decoder_clemsa_deserialize(void* context, FlipperFormat* flipper_format) { | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_decoder_clemsa_deserialize(void* context, FlipperFormat* flipper_format) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     SubGhzProtocolDecoderClemsa* instance = context; |     SubGhzProtocolDecoderClemsa* instance = context; | ||||||
|     bool ret = false; |     return subghz_block_generic_deserialize_check_count_bit( | ||||||
|     do { |         &instance->generic, flipper_format, subghz_protocol_clemsa_const.min_count_bit_for_found); | ||||||
|         if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) { |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|         if(instance->generic.data_count_bit != |  | ||||||
|            subghz_protocol_clemsa_const.min_count_bit_for_found) { |  | ||||||
|             FURI_LOG_E(TAG, "Wrong number of bits in key"); |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|         ret = true; |  | ||||||
|     } while(false); |  | ||||||
|     return ret; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void subghz_protocol_decoder_clemsa_get_string(void* context, FuriString* output) { | void subghz_protocol_decoder_clemsa_get_string(void* context, FuriString* output) { | ||||||
|  | |||||||
| @ -28,9 +28,10 @@ void subghz_protocol_encoder_clemsa_free(void* context); | |||||||
|  * Deserialize and generating an upload to send. |  * Deserialize and generating an upload to send. | ||||||
|  * @param context Pointer to a SubGhzProtocolEncoderClemsa instance |  * @param context Pointer to a SubGhzProtocolEncoderClemsa instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_encoder_clemsa_deserialize(void* context, FlipperFormat* flipper_format); | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_encoder_clemsa_deserialize(void* context, FlipperFormat* flipper_format); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Forced transmission stop. |  * Forced transmission stop. | ||||||
| @ -84,9 +85,9 @@ uint8_t subghz_protocol_decoder_clemsa_get_hash_data(void* context); | |||||||
|  * @param context Pointer to a SubGhzProtocolDecoderClemsa instance |  * @param context Pointer to a SubGhzProtocolDecoderClemsa instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @param preset The modulation on which the signal was received, SubGhzRadioPreset |  * @param preset The modulation on which the signal was received, SubGhzRadioPreset | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_decoder_clemsa_serialize( | SubGhzProtocolStatus subghz_protocol_decoder_clemsa_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset); |     SubGhzRadioPreset* preset); | ||||||
| @ -95,9 +96,10 @@ bool subghz_protocol_decoder_clemsa_serialize( | |||||||
|  * Deserialize data SubGhzProtocolDecoderClemsa. |  * Deserialize data SubGhzProtocolDecoderClemsa. | ||||||
|  * @param context Pointer to a SubGhzProtocolDecoderClemsa instance |  * @param context Pointer to a SubGhzProtocolDecoderClemsa instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_decoder_clemsa_deserialize(void* context, FlipperFormat* flipper_format); | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_decoder_clemsa_deserialize(void* context, FlipperFormat* flipper_format); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Getting a textual representation of the received data. |  * Getting a textual representation of the received data. | ||||||
|  | |||||||
| @ -136,31 +136,31 @@ static bool subghz_protocol_encoder_doitrand_get_upload(SubGhzProtocolEncoderDoi | |||||||
|     return true; |     return true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_encoder_doitrand_deserialize(void* context, FlipperFormat* flipper_format) { | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_encoder_doitrand_deserialize(void* context, FlipperFormat* flipper_format) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     SubGhzProtocolEncoderDoitrand* instance = context; |     SubGhzProtocolEncoderDoitrand* instance = context; | ||||||
|     bool res = false; |     SubGhzProtocolStatus ret = SubGhzProtocolStatusError; | ||||||
|     do { |     do { | ||||||
|         if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) { |         ret = subghz_block_generic_deserialize_check_count_bit( | ||||||
|             FURI_LOG_E(TAG, "Deserialize error"); |             &instance->generic, | ||||||
|             break; |             flipper_format, | ||||||
|         } |             subghz_protocol_doitrand_const.min_count_bit_for_found); | ||||||
|         if(instance->generic.data_count_bit != |         if(ret != SubGhzProtocolStatusOk) { | ||||||
|            subghz_protocol_doitrand_const.min_count_bit_for_found) { |  | ||||||
|             FURI_LOG_E(TAG, "Wrong number of bits in key"); |  | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         //optional parameter parameter
 |         //optional parameter parameter
 | ||||||
|         flipper_format_read_uint32( |         flipper_format_read_uint32( | ||||||
|             flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); |             flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); | ||||||
| 
 | 
 | ||||||
|         if(!subghz_protocol_encoder_doitrand_get_upload(instance)) break; |         if(!subghz_protocol_encoder_doitrand_get_upload(instance)) { | ||||||
|  |             ret = SubGhzProtocolStatusErrorEncoderGetUpload; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|         instance->encoder.is_running = true; |         instance->encoder.is_running = true; | ||||||
| 
 |  | ||||||
|         res = true; |  | ||||||
|     } while(false); |     } while(false); | ||||||
| 
 | 
 | ||||||
|     return res; |     return ret; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void subghz_protocol_encoder_doitrand_stop(void* context) { | void subghz_protocol_encoder_doitrand_stop(void* context) { | ||||||
| @ -310,7 +310,7 @@ uint8_t subghz_protocol_decoder_doitrand_get_hash_data(void* context) { | |||||||
|         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); |         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_decoder_doitrand_serialize( | SubGhzProtocolStatus subghz_protocol_decoder_doitrand_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset) { |     SubGhzRadioPreset* preset) { | ||||||
| @ -319,22 +319,14 @@ bool subghz_protocol_decoder_doitrand_serialize( | |||||||
|     return subghz_block_generic_serialize(&instance->generic, flipper_format, preset); |     return subghz_block_generic_serialize(&instance->generic, flipper_format, preset); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_decoder_doitrand_deserialize(void* context, FlipperFormat* flipper_format) { | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_decoder_doitrand_deserialize(void* context, FlipperFormat* flipper_format) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     SubGhzProtocolDecoderDoitrand* instance = context; |     SubGhzProtocolDecoderDoitrand* instance = context; | ||||||
|     bool ret = false; |     return subghz_block_generic_deserialize_check_count_bit( | ||||||
|     do { |         &instance->generic, | ||||||
|         if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) { |         flipper_format, | ||||||
|             break; |         subghz_protocol_doitrand_const.min_count_bit_for_found); | ||||||
|         } |  | ||||||
|         if(instance->generic.data_count_bit != |  | ||||||
|            subghz_protocol_doitrand_const.min_count_bit_for_found) { |  | ||||||
|             FURI_LOG_E(TAG, "Wrong number of bits in key"); |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|         ret = true; |  | ||||||
|     } while(false); |  | ||||||
|     return ret; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void subghz_protocol_decoder_doitrand_get_string(void* context, FuriString* output) { | void subghz_protocol_decoder_doitrand_get_string(void* context, FuriString* output) { | ||||||
|  | |||||||
| @ -28,9 +28,10 @@ void subghz_protocol_encoder_doitrand_free(void* context); | |||||||
|  * Deserialize and generating an upload to send. |  * Deserialize and generating an upload to send. | ||||||
|  * @param context Pointer to a SubGhzProtocolEncoderDoitrand instance |  * @param context Pointer to a SubGhzProtocolEncoderDoitrand instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_encoder_doitrand_deserialize(void* context, FlipperFormat* flipper_format); | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_encoder_doitrand_deserialize(void* context, FlipperFormat* flipper_format); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Forced transmission stop. |  * Forced transmission stop. | ||||||
| @ -84,9 +85,9 @@ uint8_t subghz_protocol_decoder_doitrand_get_hash_data(void* context); | |||||||
|  * @param context Pointer to a SubGhzProtocolDecoderDoitrand instance |  * @param context Pointer to a SubGhzProtocolDecoderDoitrand instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @param preset The modulation on which the signal was received, SubGhzRadioPreset |  * @param preset The modulation on which the signal was received, SubGhzRadioPreset | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_decoder_doitrand_serialize( | SubGhzProtocolStatus subghz_protocol_decoder_doitrand_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset); |     SubGhzRadioPreset* preset); | ||||||
| @ -95,9 +96,10 @@ bool subghz_protocol_decoder_doitrand_serialize( | |||||||
|  * Deserialize data SubGhzProtocolDecoderDoitrand. |  * Deserialize data SubGhzProtocolDecoderDoitrand. | ||||||
|  * @param context Pointer to a SubGhzProtocolDecoderDoitrand instance |  * @param context Pointer to a SubGhzProtocolDecoderDoitrand instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_decoder_doitrand_deserialize(void* context, FlipperFormat* flipper_format); | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_decoder_doitrand_deserialize(void* context, FlipperFormat* flipper_format); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Getting a textual representation of the received data. |  * Getting a textual representation of the received data. | ||||||
|  | |||||||
| @ -146,31 +146,31 @@ static bool subghz_protocol_encoder_dooya_get_upload(SubGhzProtocolEncoderDooya* | |||||||
|     return true; |     return true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_encoder_dooya_deserialize(void* context, FlipperFormat* flipper_format) { | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_encoder_dooya_deserialize(void* context, FlipperFormat* flipper_format) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     SubGhzProtocolEncoderDooya* instance = context; |     SubGhzProtocolEncoderDooya* instance = context; | ||||||
|     bool res = false; |     SubGhzProtocolStatus ret = SubGhzProtocolStatusError; | ||||||
|     do { |     do { | ||||||
|         if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) { |         ret = subghz_block_generic_deserialize_check_count_bit( | ||||||
|             FURI_LOG_E(TAG, "Deserialize error"); |             &instance->generic, | ||||||
|             break; |             flipper_format, | ||||||
|         } |             subghz_protocol_dooya_const.min_count_bit_for_found); | ||||||
|         if(instance->generic.data_count_bit != |         if(ret != SubGhzProtocolStatusOk) { | ||||||
|            subghz_protocol_dooya_const.min_count_bit_for_found) { |  | ||||||
|             FURI_LOG_E(TAG, "Wrong number of bits in key"); |  | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         //optional parameter parameter
 |         //optional parameter parameter
 | ||||||
|         flipper_format_read_uint32( |         flipper_format_read_uint32( | ||||||
|             flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); |             flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); | ||||||
| 
 | 
 | ||||||
|         if(!subghz_protocol_encoder_dooya_get_upload(instance)) break; |         if(!subghz_protocol_encoder_dooya_get_upload(instance)) { | ||||||
|  |             ret = SubGhzProtocolStatusErrorEncoderGetUpload; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|         instance->encoder.is_running = true; |         instance->encoder.is_running = true; | ||||||
| 
 |  | ||||||
|         res = true; |  | ||||||
|     } while(false); |     } while(false); | ||||||
| 
 | 
 | ||||||
|     return res; |     return ret; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void subghz_protocol_encoder_dooya_stop(void* context) { | void subghz_protocol_encoder_dooya_stop(void* context) { | ||||||
| @ -354,7 +354,7 @@ uint8_t subghz_protocol_decoder_dooya_get_hash_data(void* context) { | |||||||
|         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); |         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_decoder_dooya_serialize( | SubGhzProtocolStatus subghz_protocol_decoder_dooya_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset) { |     SubGhzRadioPreset* preset) { | ||||||
| @ -363,22 +363,12 @@ bool subghz_protocol_decoder_dooya_serialize( | |||||||
|     return subghz_block_generic_serialize(&instance->generic, flipper_format, preset); |     return subghz_block_generic_serialize(&instance->generic, flipper_format, preset); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_decoder_dooya_deserialize(void* context, FlipperFormat* flipper_format) { | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_decoder_dooya_deserialize(void* context, FlipperFormat* flipper_format) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     SubGhzProtocolDecoderDooya* instance = context; |     SubGhzProtocolDecoderDooya* instance = context; | ||||||
|     bool ret = false; |     return subghz_block_generic_deserialize_check_count_bit( | ||||||
|     do { |         &instance->generic, flipper_format, subghz_protocol_dooya_const.min_count_bit_for_found); | ||||||
|         if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) { |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|         if(instance->generic.data_count_bit != |  | ||||||
|            subghz_protocol_dooya_const.min_count_bit_for_found) { |  | ||||||
|             FURI_LOG_E(TAG, "Wrong number of bits in key"); |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|         ret = true; |  | ||||||
|     } while(false); |  | ||||||
|     return ret; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  | |||||||
| @ -28,9 +28,10 @@ void subghz_protocol_encoder_dooya_free(void* context); | |||||||
|  * Deserialize and generating an upload to send. |  * Deserialize and generating an upload to send. | ||||||
|  * @param context Pointer to a SubGhzProtocolEncoderDooya instance |  * @param context Pointer to a SubGhzProtocolEncoderDooya instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_encoder_dooya_deserialize(void* context, FlipperFormat* flipper_format); | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_encoder_dooya_deserialize(void* context, FlipperFormat* flipper_format); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Forced transmission stop. |  * Forced transmission stop. | ||||||
| @ -84,9 +85,9 @@ uint8_t subghz_protocol_decoder_dooya_get_hash_data(void* context); | |||||||
|  * @param context Pointer to a SubGhzProtocolDecoderDooya instance |  * @param context Pointer to a SubGhzProtocolDecoderDooya instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @param preset The modulation on which the signal was received, SubGhzRadioPreset |  * @param preset The modulation on which the signal was received, SubGhzRadioPreset | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_decoder_dooya_serialize( | SubGhzProtocolStatus subghz_protocol_decoder_dooya_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset); |     SubGhzRadioPreset* preset); | ||||||
| @ -95,9 +96,10 @@ bool subghz_protocol_decoder_dooya_serialize( | |||||||
|  * Deserialize data SubGhzProtocolDecoderDooya. |  * Deserialize data SubGhzProtocolDecoderDooya. | ||||||
|  * @param context Pointer to a SubGhzProtocolDecoderDooya instance |  * @param context Pointer to a SubGhzProtocolDecoderDooya instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_decoder_dooya_deserialize(void* context, FlipperFormat* flipper_format); | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_decoder_dooya_deserialize(void* context, FlipperFormat* flipper_format); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Getting a textual representation of the received data. |  * Getting a textual representation of the received data. | ||||||
|  | |||||||
| @ -180,7 +180,7 @@ uint8_t subghz_protocol_decoder_faac_slh_get_hash_data(void* context) { | |||||||
|         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); |         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_decoder_faac_slh_serialize( | SubGhzProtocolStatus subghz_protocol_decoder_faac_slh_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset) { |     SubGhzRadioPreset* preset) { | ||||||
| @ -189,22 +189,14 @@ bool subghz_protocol_decoder_faac_slh_serialize( | |||||||
|     return subghz_block_generic_serialize(&instance->generic, flipper_format, preset); |     return subghz_block_generic_serialize(&instance->generic, flipper_format, preset); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_decoder_faac_slh_deserialize(void* context, FlipperFormat* flipper_format) { | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_decoder_faac_slh_deserialize(void* context, FlipperFormat* flipper_format) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     SubGhzProtocolDecoderFaacSLH* instance = context; |     SubGhzProtocolDecoderFaacSLH* instance = context; | ||||||
|     bool ret = false; |     return subghz_block_generic_deserialize_check_count_bit( | ||||||
|     do { |         &instance->generic, | ||||||
|         if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) { |         flipper_format, | ||||||
|             break; |         subghz_protocol_faac_slh_const.min_count_bit_for_found); | ||||||
|         } |  | ||||||
|         if(instance->generic.data_count_bit != |  | ||||||
|            subghz_protocol_faac_slh_const.min_count_bit_for_found) { |  | ||||||
|             FURI_LOG_E(TAG, "Wrong number of bits in key"); |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|         ret = true; |  | ||||||
|     } while(false); |  | ||||||
|     return ret; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void subghz_protocol_decoder_faac_slh_get_string(void* context, FuriString* output) { | void subghz_protocol_decoder_faac_slh_get_string(void* context, FuriString* output) { | ||||||
|  | |||||||
| @ -50,9 +50,9 @@ uint8_t subghz_protocol_decoder_faac_slh_get_hash_data(void* context); | |||||||
|  * @param context Pointer to a SubGhzProtocolDecoderFaacSLH instance |  * @param context Pointer to a SubGhzProtocolDecoderFaacSLH instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @param preset The modulation on which the signal was received, SubGhzRadioPreset |  * @param preset The modulation on which the signal was received, SubGhzRadioPreset | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_decoder_faac_slh_serialize( | SubGhzProtocolStatus subghz_protocol_decoder_faac_slh_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset); |     SubGhzRadioPreset* preset); | ||||||
| @ -61,9 +61,10 @@ bool subghz_protocol_decoder_faac_slh_serialize( | |||||||
|  * Deserialize data SubGhzProtocolDecoderFaacSLH. |  * Deserialize data SubGhzProtocolDecoderFaacSLH. | ||||||
|  * @param context Pointer to a SubGhzProtocolDecoderFaacSLH instance |  * @param context Pointer to a SubGhzProtocolDecoderFaacSLH instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_decoder_faac_slh_deserialize(void* context, FlipperFormat* flipper_format); | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_decoder_faac_slh_deserialize(void* context, FlipperFormat* flipper_format); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Getting a textual representation of the received data. |  * Getting a textual representation of the received data. | ||||||
|  | |||||||
| @ -129,31 +129,31 @@ static bool subghz_protocol_encoder_gate_tx_get_upload(SubGhzProtocolEncoderGate | |||||||
|     return true; |     return true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_encoder_gate_tx_deserialize(void* context, FlipperFormat* flipper_format) { | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_encoder_gate_tx_deserialize(void* context, FlipperFormat* flipper_format) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     SubGhzProtocolEncoderGateTx* instance = context; |     SubGhzProtocolEncoderGateTx* instance = context; | ||||||
|     bool res = false; |     SubGhzProtocolStatus ret = SubGhzProtocolStatusError; | ||||||
|     do { |     do { | ||||||
|         if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) { |         ret = subghz_block_generic_deserialize_check_count_bit( | ||||||
|             FURI_LOG_E(TAG, "Deserialize error"); |             &instance->generic, | ||||||
|             break; |             flipper_format, | ||||||
|         } |             subghz_protocol_gate_tx_const.min_count_bit_for_found); | ||||||
|         if(instance->generic.data_count_bit != |         if(ret != SubGhzProtocolStatusOk) { | ||||||
|            subghz_protocol_gate_tx_const.min_count_bit_for_found) { |  | ||||||
|             FURI_LOG_E(TAG, "Wrong number of bits in key"); |  | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         //optional parameter parameter
 |         //optional parameter parameter
 | ||||||
|         flipper_format_read_uint32( |         flipper_format_read_uint32( | ||||||
|             flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); |             flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); | ||||||
| 
 | 
 | ||||||
|         if(!subghz_protocol_encoder_gate_tx_get_upload(instance)) break; |         if(!subghz_protocol_encoder_gate_tx_get_upload(instance)) { | ||||||
|  |             ret = SubGhzProtocolStatusErrorEncoderGetUpload; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|         instance->encoder.is_running = true; |         instance->encoder.is_running = true; | ||||||
| 
 |  | ||||||
|         res = true; |  | ||||||
|     } while(false); |     } while(false); | ||||||
| 
 | 
 | ||||||
|     return res; |     return ret; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void subghz_protocol_encoder_gate_tx_stop(void* context) { | void subghz_protocol_encoder_gate_tx_stop(void* context) { | ||||||
| @ -290,7 +290,7 @@ uint8_t subghz_protocol_decoder_gate_tx_get_hash_data(void* context) { | |||||||
|         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); |         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_decoder_gate_tx_serialize( | SubGhzProtocolStatus subghz_protocol_decoder_gate_tx_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset) { |     SubGhzRadioPreset* preset) { | ||||||
| @ -299,22 +299,12 @@ bool subghz_protocol_decoder_gate_tx_serialize( | |||||||
|     return subghz_block_generic_serialize(&instance->generic, flipper_format, preset); |     return subghz_block_generic_serialize(&instance->generic, flipper_format, preset); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_decoder_gate_tx_deserialize(void* context, FlipperFormat* flipper_format) { | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_decoder_gate_tx_deserialize(void* context, FlipperFormat* flipper_format) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     SubGhzProtocolDecoderGateTx* instance = context; |     SubGhzProtocolDecoderGateTx* instance = context; | ||||||
|     bool ret = false; |     return subghz_block_generic_deserialize_check_count_bit( | ||||||
|     do { |         &instance->generic, flipper_format, subghz_protocol_gate_tx_const.min_count_bit_for_found); | ||||||
|         if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) { |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|         if(instance->generic.data_count_bit != |  | ||||||
|            subghz_protocol_gate_tx_const.min_count_bit_for_found) { |  | ||||||
|             FURI_LOG_E(TAG, "Wrong number of bits in key"); |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|         ret = true; |  | ||||||
|     } while(false); |  | ||||||
|     return ret; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void subghz_protocol_decoder_gate_tx_get_string(void* context, FuriString* output) { | void subghz_protocol_decoder_gate_tx_get_string(void* context, FuriString* output) { | ||||||
|  | |||||||
| @ -28,9 +28,10 @@ void subghz_protocol_encoder_gate_tx_free(void* context); | |||||||
|  * Deserialize and generating an upload to send. |  * Deserialize and generating an upload to send. | ||||||
|  * @param context Pointer to a SubGhzProtocolEncoderGateTx instance |  * @param context Pointer to a SubGhzProtocolEncoderGateTx instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_encoder_gate_tx_deserialize(void* context, FlipperFormat* flipper_format); | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_encoder_gate_tx_deserialize(void* context, FlipperFormat* flipper_format); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Forced transmission stop. |  * Forced transmission stop. | ||||||
| @ -84,9 +85,9 @@ uint8_t subghz_protocol_decoder_gate_tx_get_hash_data(void* context); | |||||||
|  * @param context Pointer to a SubGhzProtocolDecoderGateTx instance |  * @param context Pointer to a SubGhzProtocolDecoderGateTx instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @param preset The modulation on which the signal was received, SubGhzRadioPreset |  * @param preset The modulation on which the signal was received, SubGhzRadioPreset | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_decoder_gate_tx_serialize( | SubGhzProtocolStatus subghz_protocol_decoder_gate_tx_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset); |     SubGhzRadioPreset* preset); | ||||||
| @ -95,9 +96,10 @@ bool subghz_protocol_decoder_gate_tx_serialize( | |||||||
|  * Deserialize data SubGhzProtocolDecoderGateTx. |  * Deserialize data SubGhzProtocolDecoderGateTx. | ||||||
|  * @param context Pointer to a SubGhzProtocolDecoderGateTx instance |  * @param context Pointer to a SubGhzProtocolDecoderGateTx instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_decoder_gate_tx_deserialize(void* context, FlipperFormat* flipper_format); | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_decoder_gate_tx_deserialize(void* context, FlipperFormat* flipper_format); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Getting a textual representation of the received data. |  * Getting a textual representation of the received data. | ||||||
|  | |||||||
| @ -142,31 +142,31 @@ static bool subghz_protocol_encoder_holtek_get_upload(SubGhzProtocolEncoderHolte | |||||||
|     return true; |     return true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_encoder_holtek_deserialize(void* context, FlipperFormat* flipper_format) { | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_encoder_holtek_deserialize(void* context, FlipperFormat* flipper_format) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     SubGhzProtocolEncoderHoltek* instance = context; |     SubGhzProtocolEncoderHoltek* instance = context; | ||||||
|     bool res = false; |     SubGhzProtocolStatus ret = SubGhzProtocolStatusError; | ||||||
|     do { |     do { | ||||||
|         if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) { |         ret = subghz_block_generic_deserialize_check_count_bit( | ||||||
|             FURI_LOG_E(TAG, "Deserialize error"); |             &instance->generic, | ||||||
|             break; |             flipper_format, | ||||||
|         } |             subghz_protocol_holtek_const.min_count_bit_for_found); | ||||||
|         if(instance->generic.data_count_bit != |         if(ret != SubGhzProtocolStatusOk) { | ||||||
|            subghz_protocol_holtek_const.min_count_bit_for_found) { |  | ||||||
|             FURI_LOG_E(TAG, "Wrong number of bits in key"); |  | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         //optional parameter parameter
 |         //optional parameter parameter
 | ||||||
|         flipper_format_read_uint32( |         flipper_format_read_uint32( | ||||||
|             flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); |             flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); | ||||||
| 
 | 
 | ||||||
|         if(!subghz_protocol_encoder_holtek_get_upload(instance)) break; |         if(!subghz_protocol_encoder_holtek_get_upload(instance)) { | ||||||
|  |             ret = SubGhzProtocolStatusErrorEncoderGetUpload; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|         instance->encoder.is_running = true; |         instance->encoder.is_running = true; | ||||||
| 
 |  | ||||||
|         res = true; |  | ||||||
|     } while(false); |     } while(false); | ||||||
| 
 | 
 | ||||||
|     return res; |     return ret; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void subghz_protocol_encoder_holtek_stop(void* context) { | void subghz_protocol_encoder_holtek_stop(void* context) { | ||||||
| @ -322,7 +322,7 @@ uint8_t subghz_protocol_decoder_holtek_get_hash_data(void* context) { | |||||||
|         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); |         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_decoder_holtek_serialize( | SubGhzProtocolStatus subghz_protocol_decoder_holtek_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset) { |     SubGhzRadioPreset* preset) { | ||||||
| @ -331,22 +331,12 @@ bool subghz_protocol_decoder_holtek_serialize( | |||||||
|     return subghz_block_generic_serialize(&instance->generic, flipper_format, preset); |     return subghz_block_generic_serialize(&instance->generic, flipper_format, preset); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_decoder_holtek_deserialize(void* context, FlipperFormat* flipper_format) { | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_decoder_holtek_deserialize(void* context, FlipperFormat* flipper_format) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     SubGhzProtocolDecoderHoltek* instance = context; |     SubGhzProtocolDecoderHoltek* instance = context; | ||||||
|     bool ret = false; |     return subghz_block_generic_deserialize_check_count_bit( | ||||||
|     do { |         &instance->generic, flipper_format, subghz_protocol_holtek_const.min_count_bit_for_found); | ||||||
|         if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) { |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|         if(instance->generic.data_count_bit != |  | ||||||
|            subghz_protocol_holtek_const.min_count_bit_for_found) { |  | ||||||
|             FURI_LOG_E(TAG, "Wrong number of bits in key"); |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|         ret = true; |  | ||||||
|     } while(false); |  | ||||||
|     return ret; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void subghz_protocol_decoder_holtek_get_string(void* context, FuriString* output) { | void subghz_protocol_decoder_holtek_get_string(void* context, FuriString* output) { | ||||||
|  | |||||||
| @ -28,9 +28,10 @@ void subghz_protocol_encoder_holtek_free(void* context); | |||||||
|  * Deserialize and generating an upload to send. |  * Deserialize and generating an upload to send. | ||||||
|  * @param context Pointer to a SubGhzProtocolEncoderHoltek instance |  * @param context Pointer to a SubGhzProtocolEncoderHoltek instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_encoder_holtek_deserialize(void* context, FlipperFormat* flipper_format); | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_encoder_holtek_deserialize(void* context, FlipperFormat* flipper_format); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Forced transmission stop. |  * Forced transmission stop. | ||||||
| @ -84,9 +85,9 @@ uint8_t subghz_protocol_decoder_holtek_get_hash_data(void* context); | |||||||
|  * @param context Pointer to a SubGhzProtocolDecoderHoltek instance |  * @param context Pointer to a SubGhzProtocolDecoderHoltek instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @param preset The modulation on which the signal was received, SubGhzRadioPreset |  * @param preset The modulation on which the signal was received, SubGhzRadioPreset | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_decoder_holtek_serialize( | SubGhzProtocolStatus subghz_protocol_decoder_holtek_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset); |     SubGhzRadioPreset* preset); | ||||||
| @ -95,9 +96,10 @@ bool subghz_protocol_decoder_holtek_serialize( | |||||||
|  * Deserialize data SubGhzProtocolDecoderHoltek. |  * Deserialize data SubGhzProtocolDecoderHoltek. | ||||||
|  * @param context Pointer to a SubGhzProtocolDecoderHoltek instance |  * @param context Pointer to a SubGhzProtocolDecoderHoltek instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_decoder_holtek_deserialize(void* context, FlipperFormat* flipper_format); | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_decoder_holtek_deserialize(void* context, FlipperFormat* flipper_format); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Getting a textual representation of the received data. |  * Getting a textual representation of the received data. | ||||||
|  | |||||||
| @ -147,39 +147,41 @@ static bool | |||||||
|     return true; |     return true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_encoder_holtek_th12x_deserialize(void* context, FlipperFormat* flipper_format) { | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_encoder_holtek_th12x_deserialize(void* context, FlipperFormat* flipper_format) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     SubGhzProtocolEncoderHoltek_HT12X* instance = context; |     SubGhzProtocolEncoderHoltek_HT12X* instance = context; | ||||||
|     bool res = false; |     SubGhzProtocolStatus ret = SubGhzProtocolStatusError; | ||||||
|     do { |     do { | ||||||
|         if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) { |         ret = subghz_block_generic_deserialize_check_count_bit( | ||||||
|             FURI_LOG_E(TAG, "Deserialize error"); |             &instance->generic, | ||||||
|  |             flipper_format, | ||||||
|  |             subghz_protocol_holtek_th12x_const.min_count_bit_for_found); | ||||||
|  |         if(ret != SubGhzProtocolStatusOk) { | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         if(!flipper_format_rewind(flipper_format)) { |         if(!flipper_format_rewind(flipper_format)) { | ||||||
|             FURI_LOG_E(TAG, "Rewind error"); |             FURI_LOG_E(TAG, "Rewind error"); | ||||||
|  |             ret = SubGhzProtocolStatusErrorParserOthers; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         if(!flipper_format_read_uint32(flipper_format, "TE", (uint32_t*)&instance->te, 1)) { |         if(!flipper_format_read_uint32(flipper_format, "TE", (uint32_t*)&instance->te, 1)) { | ||||||
|             FURI_LOG_E(TAG, "Missing TE"); |             FURI_LOG_E(TAG, "Missing TE"); | ||||||
|             break; |             ret = SubGhzProtocolStatusErrorParserTe; | ||||||
|         } |  | ||||||
|         if(instance->generic.data_count_bit != |  | ||||||
|            subghz_protocol_holtek_th12x_const.min_count_bit_for_found) { |  | ||||||
|             FURI_LOG_E(TAG, "Wrong number of bits in key"); |  | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         //optional parameter parameter
 |         //optional parameter parameter
 | ||||||
|         flipper_format_read_uint32( |         flipper_format_read_uint32( | ||||||
|             flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); |             flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); | ||||||
| 
 | 
 | ||||||
|         if(!subghz_protocol_encoder_holtek_th12x_get_upload(instance)) break; |         if(!subghz_protocol_encoder_holtek_th12x_get_upload(instance)) { | ||||||
|  |             ret = SubGhzProtocolStatusErrorEncoderGetUpload; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|         instance->encoder.is_running = true; |         instance->encoder.is_running = true; | ||||||
| 
 |  | ||||||
|         res = true; |  | ||||||
|     } while(false); |     } while(false); | ||||||
| 
 | 
 | ||||||
|     return res; |     return ret; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void subghz_protocol_encoder_holtek_th12x_stop(void* context) { | void subghz_protocol_encoder_holtek_th12x_stop(void* context) { | ||||||
| @ -327,42 +329,45 @@ uint8_t subghz_protocol_decoder_holtek_th12x_get_hash_data(void* context) { | |||||||
|         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); |         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_decoder_holtek_th12x_serialize( | SubGhzProtocolStatus subghz_protocol_decoder_holtek_th12x_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset) { |     SubGhzRadioPreset* preset) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     SubGhzProtocolDecoderHoltek_HT12X* instance = context; |     SubGhzProtocolDecoderHoltek_HT12X* instance = context; | ||||||
|     bool res = subghz_block_generic_serialize(&instance->generic, flipper_format, preset); |     SubGhzProtocolStatus ret = | ||||||
|     if(res && !flipper_format_write_uint32(flipper_format, "TE", &instance->te, 1)) { |         subghz_block_generic_serialize(&instance->generic, flipper_format, preset); | ||||||
|  |     if((ret == SubGhzProtocolStatusOk) && | ||||||
|  |        !flipper_format_write_uint32(flipper_format, "TE", &instance->te, 1)) { | ||||||
|         FURI_LOG_E(TAG, "Unable to add TE"); |         FURI_LOG_E(TAG, "Unable to add TE"); | ||||||
|         res = false; |         ret = SubGhzProtocolStatusErrorParserTe; | ||||||
|     } |     } | ||||||
|     return res; |     return ret; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_decoder_holtek_th12x_deserialize(void* context, FlipperFormat* flipper_format) { | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_decoder_holtek_th12x_deserialize(void* context, FlipperFormat* flipper_format) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     SubGhzProtocolDecoderHoltek_HT12X* instance = context; |     SubGhzProtocolDecoderHoltek_HT12X* instance = context; | ||||||
|     bool ret = false; |     SubGhzProtocolStatus ret = SubGhzProtocolStatusError; | ||||||
|     do { |     do { | ||||||
|         if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) { |         ret = subghz_block_generic_deserialize_check_count_bit( | ||||||
|             break; |             &instance->generic, | ||||||
|         } |             flipper_format, | ||||||
|         if(instance->generic.data_count_bit != |             subghz_protocol_holtek_th12x_const.min_count_bit_for_found); | ||||||
|            subghz_protocol_holtek_th12x_const.min_count_bit_for_found) { |         if(ret != SubGhzProtocolStatusOk) { | ||||||
|             FURI_LOG_E(TAG, "Wrong number of bits in key"); |  | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         if(!flipper_format_rewind(flipper_format)) { |         if(!flipper_format_rewind(flipper_format)) { | ||||||
|             FURI_LOG_E(TAG, "Rewind error"); |             FURI_LOG_E(TAG, "Rewind error"); | ||||||
|  |             ret = SubGhzProtocolStatusErrorParserOthers; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         if(!flipper_format_read_uint32(flipper_format, "TE", (uint32_t*)&instance->te, 1)) { |         if(!flipper_format_read_uint32(flipper_format, "TE", (uint32_t*)&instance->te, 1)) { | ||||||
|             FURI_LOG_E(TAG, "Missing TE"); |             FURI_LOG_E(TAG, "Missing TE"); | ||||||
|  |             ret = SubGhzProtocolStatusErrorParserTe; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         ret = true; |  | ||||||
|     } while(false); |     } while(false); | ||||||
|     return ret; |     return ret; | ||||||
| } | } | ||||||
|  | |||||||
| @ -28,9 +28,10 @@ void subghz_protocol_encoder_holtek_th12x_free(void* context); | |||||||
|  * Deserialize and generating an upload to send. |  * Deserialize and generating an upload to send. | ||||||
|  * @param context Pointer to a SubGhzProtocolEncoderHoltek_HT12X instance |  * @param context Pointer to a SubGhzProtocolEncoderHoltek_HT12X instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_encoder_holtek_th12x_deserialize(void* context, FlipperFormat* flipper_format); | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_encoder_holtek_th12x_deserialize(void* context, FlipperFormat* flipper_format); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Forced transmission stop. |  * Forced transmission stop. | ||||||
| @ -84,9 +85,9 @@ uint8_t subghz_protocol_decoder_holtek_th12x_get_hash_data(void* context); | |||||||
|  * @param context Pointer to a SubGhzProtocolDecoderHoltek_HT12X instance |  * @param context Pointer to a SubGhzProtocolDecoderHoltek_HT12X instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @param preset The modulation on which the signal was received, SubGhzRadioPreset |  * @param preset The modulation on which the signal was received, SubGhzRadioPreset | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_decoder_holtek_th12x_serialize( | SubGhzProtocolStatus subghz_protocol_decoder_holtek_th12x_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset); |     SubGhzRadioPreset* preset); | ||||||
| @ -95,9 +96,10 @@ bool subghz_protocol_decoder_holtek_th12x_serialize( | |||||||
|  * Deserialize data SubGhzProtocolDecoderHoltek_HT12X. |  * Deserialize data SubGhzProtocolDecoderHoltek_HT12X. | ||||||
|  * @param context Pointer to a SubGhzProtocolDecoderHoltek_HT12X instance |  * @param context Pointer to a SubGhzProtocolDecoderHoltek_HT12X instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_decoder_holtek_th12x_deserialize(void* context, FlipperFormat* flipper_format); | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_decoder_holtek_th12x_deserialize(void* context, FlipperFormat* flipper_format); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Getting a textual representation of the received data. |  * Getting a textual representation of the received data. | ||||||
|  | |||||||
| @ -142,33 +142,32 @@ static bool subghz_protocol_encoder_honeywell_wdb_get_upload( | |||||||
|     return true; |     return true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_encoder_honeywell_wdb_deserialize( | SubGhzProtocolStatus subghz_protocol_encoder_honeywell_wdb_deserialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format) { |     FlipperFormat* flipper_format) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     SubGhzProtocolEncoderHoneywell_WDB* instance = context; |     SubGhzProtocolEncoderHoneywell_WDB* instance = context; | ||||||
|     bool res = false; |     SubGhzProtocolStatus ret = SubGhzProtocolStatusError; | ||||||
|     do { |     do { | ||||||
|         if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) { |         ret = subghz_block_generic_deserialize_check_count_bit( | ||||||
|             FURI_LOG_E(TAG, "Deserialize error"); |             &instance->generic, | ||||||
|             break; |             flipper_format, | ||||||
|         } |             subghz_protocol_honeywell_wdb_const.min_count_bit_for_found); | ||||||
|         if(instance->generic.data_count_bit != |         if(ret != SubGhzProtocolStatusOk) { | ||||||
|            subghz_protocol_honeywell_wdb_const.min_count_bit_for_found) { |  | ||||||
|             FURI_LOG_E(TAG, "Wrong number of bits in key"); |  | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         //optional parameter parameter
 |         //optional parameter parameter
 | ||||||
|         flipper_format_read_uint32( |         flipper_format_read_uint32( | ||||||
|             flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); |             flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); | ||||||
| 
 | 
 | ||||||
|         if(!subghz_protocol_encoder_honeywell_wdb_get_upload(instance)) break; |         if(!subghz_protocol_encoder_honeywell_wdb_get_upload(instance)) { | ||||||
|  |             ret = SubGhzProtocolStatusErrorEncoderGetUpload; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|         instance->encoder.is_running = true; |         instance->encoder.is_running = true; | ||||||
| 
 |  | ||||||
|         res = true; |  | ||||||
|     } while(false); |     } while(false); | ||||||
| 
 | 
 | ||||||
|     return res; |     return ret; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void subghz_protocol_encoder_honeywell_wdb_stop(void* context) { | void subghz_protocol_encoder_honeywell_wdb_stop(void* context) { | ||||||
| @ -345,7 +344,7 @@ uint8_t subghz_protocol_decoder_honeywell_wdb_get_hash_data(void* context) { | |||||||
|         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); |         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_decoder_honeywell_wdb_serialize( | SubGhzProtocolStatus subghz_protocol_decoder_honeywell_wdb_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset) { |     SubGhzRadioPreset* preset) { | ||||||
| @ -354,24 +353,15 @@ bool subghz_protocol_decoder_honeywell_wdb_serialize( | |||||||
|     return subghz_block_generic_serialize(&instance->generic, flipper_format, preset); |     return subghz_block_generic_serialize(&instance->generic, flipper_format, preset); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_decoder_honeywell_wdb_deserialize( | SubGhzProtocolStatus subghz_protocol_decoder_honeywell_wdb_deserialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format) { |     FlipperFormat* flipper_format) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     SubGhzProtocolDecoderHoneywell_WDB* instance = context; |     SubGhzProtocolDecoderHoneywell_WDB* instance = context; | ||||||
|     bool ret = false; |     return subghz_block_generic_deserialize_check_count_bit( | ||||||
|     do { |         &instance->generic, | ||||||
|         if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) { |         flipper_format, | ||||||
|             break; |         subghz_protocol_honeywell_wdb_const.min_count_bit_for_found); | ||||||
|         } |  | ||||||
|         if(instance->generic.data_count_bit != |  | ||||||
|            subghz_protocol_honeywell_wdb_const.min_count_bit_for_found) { |  | ||||||
|             FURI_LOG_E(TAG, "Wrong number of bits in key"); |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|         ret = true; |  | ||||||
|     } while(false); |  | ||||||
|     return ret; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void subghz_protocol_decoder_honeywell_wdb_get_string(void* context, FuriString* output) { | void subghz_protocol_decoder_honeywell_wdb_get_string(void* context, FuriString* output) { | ||||||
|  | |||||||
| @ -28,11 +28,10 @@ void subghz_protocol_encoder_honeywell_wdb_free(void* context); | |||||||
|  * Deserialize and generating an upload to send. |  * Deserialize and generating an upload to send. | ||||||
|  * @param context Pointer to a SubGhzProtocolEncoderHoneywell_WDB instance |  * @param context Pointer to a SubGhzProtocolEncoderHoneywell_WDB instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_encoder_honeywell_wdb_deserialize( | SubGhzProtocolStatus | ||||||
|     void* context, |     subghz_protocol_encoder_honeywell_wdb_deserialize(void* context, FlipperFormat* flipper_format); | ||||||
|     FlipperFormat* flipper_format); |  | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Forced transmission stop. |  * Forced transmission stop. | ||||||
| @ -86,9 +85,9 @@ uint8_t subghz_protocol_decoder_honeywell_wdb_get_hash_data(void* context); | |||||||
|  * @param context Pointer to a SubGhzProtocolDecoderHoneywell_WDB instance |  * @param context Pointer to a SubGhzProtocolDecoderHoneywell_WDB instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @param preset The modulation on which the signal was received, SubGhzRadioPreset |  * @param preset The modulation on which the signal was received, SubGhzRadioPreset | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_decoder_honeywell_wdb_serialize( | SubGhzProtocolStatus subghz_protocol_decoder_honeywell_wdb_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset); |     SubGhzRadioPreset* preset); | ||||||
| @ -97,11 +96,10 @@ bool subghz_protocol_decoder_honeywell_wdb_serialize( | |||||||
|  * Deserialize data SubGhzProtocolDecoderHoneywell_WDB. |  * Deserialize data SubGhzProtocolDecoderHoneywell_WDB. | ||||||
|  * @param context Pointer to a SubGhzProtocolDecoderHoneywell_WDB instance |  * @param context Pointer to a SubGhzProtocolDecoderHoneywell_WDB instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_decoder_honeywell_wdb_deserialize( | SubGhzProtocolStatus | ||||||
|     void* context, |     subghz_protocol_decoder_honeywell_wdb_deserialize(void* context, FlipperFormat* flipper_format); | ||||||
|     FlipperFormat* flipper_format); |  | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Getting a textual representation of the received data. |  * Getting a textual representation of the received data. | ||||||
|  | |||||||
| @ -140,31 +140,31 @@ static bool subghz_protocol_encoder_hormann_get_upload(SubGhzProtocolEncoderHorm | |||||||
|     return true; |     return true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_encoder_hormann_deserialize(void* context, FlipperFormat* flipper_format) { | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_encoder_hormann_deserialize(void* context, FlipperFormat* flipper_format) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     SubGhzProtocolEncoderHormann* instance = context; |     SubGhzProtocolEncoderHormann* instance = context; | ||||||
|     bool res = false; |     SubGhzProtocolStatus ret = SubGhzProtocolStatusError; | ||||||
|     do { |     do { | ||||||
|         if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) { |         ret = subghz_block_generic_deserialize_check_count_bit( | ||||||
|             FURI_LOG_E(TAG, "Deserialize error"); |             &instance->generic, | ||||||
|             break; |             flipper_format, | ||||||
|         } |             subghz_protocol_hormann_const.min_count_bit_for_found); | ||||||
|         if(instance->generic.data_count_bit != |         if(ret != SubGhzProtocolStatusOk) { | ||||||
|            subghz_protocol_hormann_const.min_count_bit_for_found) { |  | ||||||
|             FURI_LOG_E(TAG, "Wrong number of bits in key"); |  | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         //optional parameter parameter
 |         //optional parameter parameter
 | ||||||
|         flipper_format_read_uint32( |         flipper_format_read_uint32( | ||||||
|             flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); |             flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); | ||||||
| 
 | 
 | ||||||
|         if(!subghz_protocol_encoder_hormann_get_upload(instance)) break; |         if(!subghz_protocol_encoder_hormann_get_upload(instance)) { | ||||||
|  |             ret = SubGhzProtocolStatusErrorEncoderGetUpload; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|         instance->encoder.is_running = true; |         instance->encoder.is_running = true; | ||||||
| 
 |  | ||||||
|         res = true; |  | ||||||
|     } while(false); |     } while(false); | ||||||
| 
 | 
 | ||||||
|     return res; |     return ret; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void subghz_protocol_encoder_hormann_stop(void* context) { | void subghz_protocol_encoder_hormann_stop(void* context) { | ||||||
| @ -295,7 +295,7 @@ uint8_t subghz_protocol_decoder_hormann_get_hash_data(void* context) { | |||||||
|         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); |         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_decoder_hormann_serialize( | SubGhzProtocolStatus subghz_protocol_decoder_hormann_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset) { |     SubGhzRadioPreset* preset) { | ||||||
| @ -304,22 +304,12 @@ bool subghz_protocol_decoder_hormann_serialize( | |||||||
|     return subghz_block_generic_serialize(&instance->generic, flipper_format, preset); |     return subghz_block_generic_serialize(&instance->generic, flipper_format, preset); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_decoder_hormann_deserialize(void* context, FlipperFormat* flipper_format) { | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_decoder_hormann_deserialize(void* context, FlipperFormat* flipper_format) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     SubGhzProtocolDecoderHormann* instance = context; |     SubGhzProtocolDecoderHormann* instance = context; | ||||||
|     bool ret = false; |     return subghz_block_generic_deserialize_check_count_bit( | ||||||
|     do { |         &instance->generic, flipper_format, subghz_protocol_hormann_const.min_count_bit_for_found); | ||||||
|         if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) { |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|         if(instance->generic.data_count_bit != |  | ||||||
|            subghz_protocol_hormann_const.min_count_bit_for_found) { |  | ||||||
|             FURI_LOG_E(TAG, "Wrong number of bits in key"); |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|         ret = true; |  | ||||||
|     } while(false); |  | ||||||
|     return ret; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void subghz_protocol_decoder_hormann_get_string(void* context, FuriString* output) { | void subghz_protocol_decoder_hormann_get_string(void* context, FuriString* output) { | ||||||
|  | |||||||
| @ -28,9 +28,10 @@ void subghz_protocol_encoder_hormann_free(void* context); | |||||||
|  * Deserialize and generating an upload to send. |  * Deserialize and generating an upload to send. | ||||||
|  * @param context Pointer to a SubGhzProtocolEncoderHormann instance |  * @param context Pointer to a SubGhzProtocolEncoderHormann instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_encoder_hormann_deserialize(void* context, FlipperFormat* flipper_format); | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_encoder_hormann_deserialize(void* context, FlipperFormat* flipper_format); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Forced transmission stop. |  * Forced transmission stop. | ||||||
| @ -84,9 +85,9 @@ uint8_t subghz_protocol_decoder_hormann_get_hash_data(void* context); | |||||||
|  * @param context Pointer to a SubGhzProtocolDecoderHormann instance |  * @param context Pointer to a SubGhzProtocolDecoderHormann instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @param preset The modulation on which the signal was received, SubGhzRadioPreset |  * @param preset The modulation on which the signal was received, SubGhzRadioPreset | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_decoder_hormann_serialize( | SubGhzProtocolStatus subghz_protocol_decoder_hormann_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset); |     SubGhzRadioPreset* preset); | ||||||
| @ -95,9 +96,10 @@ bool subghz_protocol_decoder_hormann_serialize( | |||||||
|  * Deserialize data SubGhzProtocolDecoderHormann. |  * Deserialize data SubGhzProtocolDecoderHormann. | ||||||
|  * @param context Pointer to a SubGhzProtocolDecoderHormann instance |  * @param context Pointer to a SubGhzProtocolDecoderHormann instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_decoder_hormann_deserialize(void* context, FlipperFormat* flipper_format); | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_decoder_hormann_deserialize(void* context, FlipperFormat* flipper_format); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Getting a textual representation of the received data. |  * Getting a textual representation of the received data. | ||||||
|  | |||||||
| @ -179,7 +179,7 @@ uint8_t subghz_protocol_decoder_ido_get_hash_data(void* context) { | |||||||
|         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); |         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_decoder_ido_serialize( | SubGhzProtocolStatus subghz_protocol_decoder_ido_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset) { |     SubGhzRadioPreset* preset) { | ||||||
| @ -188,21 +188,12 @@ bool subghz_protocol_decoder_ido_serialize( | |||||||
|     return subghz_block_generic_serialize(&instance->generic, flipper_format, preset); |     return subghz_block_generic_serialize(&instance->generic, flipper_format, preset); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_decoder_ido_deserialize(void* context, FlipperFormat* flipper_format) { | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_decoder_ido_deserialize(void* context, FlipperFormat* flipper_format) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     SubGhzProtocolDecoderIDo* instance = context; |     SubGhzProtocolDecoderIDo* instance = context; | ||||||
|     bool ret = false; |     return subghz_block_generic_deserialize_check_count_bit( | ||||||
|     do { |         &instance->generic, flipper_format, subghz_protocol_ido_const.min_count_bit_for_found); | ||||||
|         if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) { |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|         if(instance->generic.data_count_bit != subghz_protocol_ido_const.min_count_bit_for_found) { |  | ||||||
|             FURI_LOG_E(TAG, "Wrong number of bits in key"); |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|         ret = true; |  | ||||||
|     } while(false); |  | ||||||
|     return ret; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void subghz_protocol_decoder_ido_get_string(void* context, FuriString* output) { | void subghz_protocol_decoder_ido_get_string(void* context, FuriString* output) { | ||||||
|  | |||||||
| @ -50,9 +50,9 @@ uint8_t subghz_protocol_decoder_ido_get_hash_data(void* context); | |||||||
|  * @param context Pointer to a SubGhzProtocolDecoderIDo instance |  * @param context Pointer to a SubGhzProtocolDecoderIDo instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @param preset The modulation on which the signal was received, SubGhzRadioPreset |  * @param preset The modulation on which the signal was received, SubGhzRadioPreset | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_decoder_ido_serialize( | SubGhzProtocolStatus subghz_protocol_decoder_ido_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset); |     SubGhzRadioPreset* preset); | ||||||
| @ -61,9 +61,10 @@ bool subghz_protocol_decoder_ido_serialize( | |||||||
|  * Deserialize data SubGhzProtocolDecoderIDo. |  * Deserialize data SubGhzProtocolDecoderIDo. | ||||||
|  * @param context Pointer to a SubGhzProtocolDecoderIDo instance |  * @param context Pointer to a SubGhzProtocolDecoderIDo instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_decoder_ido_deserialize(void* context, FlipperFormat* flipper_format); | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_decoder_ido_deserialize(void* context, FlipperFormat* flipper_format); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Getting a textual representation of the received data. |  * Getting a textual representation of the received data. | ||||||
|  | |||||||
| @ -158,34 +158,36 @@ static bool subghz_protocol_encoder_intertechno_v3_get_upload( | |||||||
|     return true; |     return true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_encoder_intertechno_v3_deserialize( | SubGhzProtocolStatus subghz_protocol_encoder_intertechno_v3_deserialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format) { |     FlipperFormat* flipper_format) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     SubGhzProtocolEncoderIntertechno_V3* instance = context; |     SubGhzProtocolEncoderIntertechno_V3* instance = context; | ||||||
|     bool res = false; |     SubGhzProtocolStatus ret = SubGhzProtocolStatusError; | ||||||
|     do { |     do { | ||||||
|         if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) { |         ret = subghz_block_generic_deserialize(&instance->generic, flipper_format); | ||||||
|             FURI_LOG_E(TAG, "Deserialize error"); |         if(ret != SubGhzProtocolStatusOk) { | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         if((instance->generic.data_count_bit != |         if((instance->generic.data_count_bit != | ||||||
|             subghz_protocol_intertechno_v3_const.min_count_bit_for_found) && |             subghz_protocol_intertechno_v3_const.min_count_bit_for_found) && | ||||||
|            (instance->generic.data_count_bit != INTERTECHNO_V3_DIMMING_COUNT_BIT)) { |            (instance->generic.data_count_bit != INTERTECHNO_V3_DIMMING_COUNT_BIT)) { | ||||||
|             FURI_LOG_E(TAG, "Wrong number of bits in key"); |             FURI_LOG_E(TAG, "Wrong number of bits in key"); | ||||||
|  |             ret = SubGhzProtocolStatusErrorValueBitCount; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         //optional parameter parameter
 |         //optional parameter parameter
 | ||||||
|         flipper_format_read_uint32( |         flipper_format_read_uint32( | ||||||
|             flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); |             flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); | ||||||
| 
 | 
 | ||||||
|         if(!subghz_protocol_encoder_intertechno_v3_get_upload(instance)) break; |         if(!subghz_protocol_encoder_intertechno_v3_get_upload(instance)) { | ||||||
|  |             ret = SubGhzProtocolStatusErrorEncoderGetUpload; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|         instance->encoder.is_running = true; |         instance->encoder.is_running = true; | ||||||
| 
 |  | ||||||
|         res = true; |  | ||||||
|     } while(false); |     } while(false); | ||||||
| 
 | 
 | ||||||
|     return res; |     return ret; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void subghz_protocol_encoder_intertechno_v3_stop(void* context) { | void subghz_protocol_encoder_intertechno_v3_stop(void* context) { | ||||||
| @ -404,7 +406,7 @@ uint8_t subghz_protocol_decoder_intertechno_v3_get_hash_data(void* context) { | |||||||
|         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); |         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_decoder_intertechno_v3_serialize( | SubGhzProtocolStatus subghz_protocol_decoder_intertechno_v3_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset) { |     SubGhzRadioPreset* preset) { | ||||||
| @ -413,23 +415,24 @@ bool subghz_protocol_decoder_intertechno_v3_serialize( | |||||||
|     return subghz_block_generic_serialize(&instance->generic, flipper_format, preset); |     return subghz_block_generic_serialize(&instance->generic, flipper_format, preset); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_decoder_intertechno_v3_deserialize( | SubGhzProtocolStatus subghz_protocol_decoder_intertechno_v3_deserialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format) { |     FlipperFormat* flipper_format) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     SubGhzProtocolDecoderIntertechno_V3* instance = context; |     SubGhzProtocolDecoderIntertechno_V3* instance = context; | ||||||
|     bool ret = false; |     SubGhzProtocolStatus ret = SubGhzProtocolStatusError; | ||||||
|     do { |     do { | ||||||
|         if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) { |         ret = subghz_block_generic_deserialize(&instance->generic, flipper_format); | ||||||
|  |         if(ret != SubGhzProtocolStatusOk) { | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         if((instance->generic.data_count_bit != |         if((instance->generic.data_count_bit != | ||||||
|             subghz_protocol_intertechno_v3_const.min_count_bit_for_found) && |             subghz_protocol_intertechno_v3_const.min_count_bit_for_found) && | ||||||
|            (instance->generic.data_count_bit != INTERTECHNO_V3_DIMMING_COUNT_BIT)) { |            (instance->generic.data_count_bit != INTERTECHNO_V3_DIMMING_COUNT_BIT)) { | ||||||
|             FURI_LOG_E(TAG, "Wrong number of bits in key"); |             FURI_LOG_E(TAG, "Wrong number of bits in key"); | ||||||
|  |             ret = SubGhzProtocolStatusErrorValueBitCount; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         ret = true; |  | ||||||
|     } while(false); |     } while(false); | ||||||
|     return ret; |     return ret; | ||||||
| } | } | ||||||
|  | |||||||
| @ -28,9 +28,9 @@ void subghz_protocol_encoder_intertechno_v3_free(void* context); | |||||||
|  * Deserialize and generating an upload to send. |  * Deserialize and generating an upload to send. | ||||||
|  * @param context Pointer to a SubGhzProtocolEncoderIntertechno_V3 instance |  * @param context Pointer to a SubGhzProtocolEncoderIntertechno_V3 instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @return true On success |  * @return Starus error | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_encoder_intertechno_v3_deserialize( | SubGhzProtocolStatus subghz_protocol_encoder_intertechno_v3_deserialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format); |     FlipperFormat* flipper_format); | ||||||
| 
 | 
 | ||||||
| @ -86,9 +86,9 @@ uint8_t subghz_protocol_decoder_intertechno_v3_get_hash_data(void* context); | |||||||
|  * @param context Pointer to a SubGhzProtocolDecoderIntertechno_V3 instance |  * @param context Pointer to a SubGhzProtocolDecoderIntertechno_V3 instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @param preset The modulation on which the signal was received, SubGhzRadioPreset |  * @param preset The modulation on which the signal was received, SubGhzRadioPreset | ||||||
|  * @return true On success |  * @return Starus error | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_decoder_intertechno_v3_serialize( | SubGhzProtocolStatus subghz_protocol_decoder_intertechno_v3_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset); |     SubGhzRadioPreset* preset); | ||||||
| @ -97,9 +97,9 @@ bool subghz_protocol_decoder_intertechno_v3_serialize( | |||||||
|  * Deserialize data SubGhzProtocolDecoderIntertechno_V3. |  * Deserialize data SubGhzProtocolDecoderIntertechno_V3. | ||||||
|  * @param context Pointer to a SubGhzProtocolDecoderIntertechno_V3 instance |  * @param context Pointer to a SubGhzProtocolDecoderIntertechno_V3 instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @return true On success |  * @return Starus error | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_decoder_intertechno_v3_deserialize( | SubGhzProtocolStatus subghz_protocol_decoder_intertechno_v3_deserialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format); |     FlipperFormat* flipper_format); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -254,18 +254,17 @@ static bool | |||||||
|     return true; |     return true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_encoder_keeloq_deserialize(void* context, FlipperFormat* flipper_format) { | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_encoder_keeloq_deserialize(void* context, FlipperFormat* flipper_format) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     SubGhzProtocolEncoderKeeloq* instance = context; |     SubGhzProtocolEncoderKeeloq* instance = context; | ||||||
|     bool res = false; |     SubGhzProtocolStatus ret = SubGhzProtocolStatusError; | ||||||
|     do { |     do { | ||||||
|         if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) { |         ret = subghz_block_generic_deserialize_check_count_bit( | ||||||
|             FURI_LOG_E(TAG, "Deserialize error"); |             &instance->generic, | ||||||
|             break; |             flipper_format, | ||||||
|         } |             subghz_protocol_keeloq_const.min_count_bit_for_found); | ||||||
|         if(instance->generic.data_count_bit != |         if(ret != SubGhzProtocolStatusOk) { | ||||||
|            subghz_protocol_keeloq_const.min_count_bit_for_found) { |  | ||||||
|             FURI_LOG_E(TAG, "Wrong number of bits in key"); |  | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         subghz_protocol_keeloq_check_remote_controller( |         subghz_protocol_keeloq_check_remote_controller( | ||||||
| @ -273,6 +272,7 @@ bool subghz_protocol_encoder_keeloq_deserialize(void* context, FlipperFormat* fl | |||||||
| 
 | 
 | ||||||
|         if(strcmp(instance->manufacture_name, "DoorHan") != 0) { |         if(strcmp(instance->manufacture_name, "DoorHan") != 0) { | ||||||
|             FURI_LOG_E(TAG, "Wrong manufacturer name"); |             FURI_LOG_E(TAG, "Wrong manufacturer name"); | ||||||
|  |             ret = SubGhzProtocolStatusErrorParserOthers; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
| @ -280,10 +280,13 @@ bool subghz_protocol_encoder_keeloq_deserialize(void* context, FlipperFormat* fl | |||||||
|         flipper_format_read_uint32( |         flipper_format_read_uint32( | ||||||
|             flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); |             flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); | ||||||
| 
 | 
 | ||||||
|         if(!subghz_protocol_encoder_keeloq_get_upload(instance, instance->generic.btn)) break; |         if(!subghz_protocol_encoder_keeloq_get_upload(instance, instance->generic.btn)) { | ||||||
| 
 |             ret = SubGhzProtocolStatusErrorEncoderGetUpload; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|         if(!flipper_format_rewind(flipper_format)) { |         if(!flipper_format_rewind(flipper_format)) { | ||||||
|             FURI_LOG_E(TAG, "Rewind error"); |             FURI_LOG_E(TAG, "Rewind error"); | ||||||
|  |             ret = SubGhzProtocolStatusErrorParserOthers; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         uint8_t key_data[sizeof(uint64_t)] = {0}; |         uint8_t key_data[sizeof(uint64_t)] = {0}; | ||||||
| @ -292,15 +295,14 @@ bool subghz_protocol_encoder_keeloq_deserialize(void* context, FlipperFormat* fl | |||||||
|         } |         } | ||||||
|         if(!flipper_format_update_hex(flipper_format, "Key", key_data, sizeof(uint64_t))) { |         if(!flipper_format_update_hex(flipper_format, "Key", key_data, sizeof(uint64_t))) { | ||||||
|             FURI_LOG_E(TAG, "Unable to add Key"); |             FURI_LOG_E(TAG, "Unable to add Key"); | ||||||
|  |             ret = SubGhzProtocolStatusErrorParserKey; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         instance->encoder.is_running = true; |         instance->encoder.is_running = true; | ||||||
| 
 |  | ||||||
|         res = true; |  | ||||||
|     } while(false); |     } while(false); | ||||||
| 
 | 
 | ||||||
|     return res; |     return ret; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void subghz_protocol_encoder_keeloq_stop(void* context) { | void subghz_protocol_encoder_keeloq_stop(void* context) { | ||||||
| @ -669,7 +671,7 @@ uint8_t subghz_protocol_decoder_keeloq_get_hash_data(void* context) { | |||||||
|         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); |         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_decoder_keeloq_serialize( | SubGhzProtocolStatus subghz_protocol_decoder_keeloq_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset) { |     SubGhzRadioPreset* preset) { | ||||||
| @ -678,34 +680,24 @@ bool subghz_protocol_decoder_keeloq_serialize( | |||||||
|     subghz_protocol_keeloq_check_remote_controller( |     subghz_protocol_keeloq_check_remote_controller( | ||||||
|         &instance->generic, instance->keystore, &instance->manufacture_name); |         &instance->generic, instance->keystore, &instance->manufacture_name); | ||||||
| 
 | 
 | ||||||
|     bool res = subghz_block_generic_serialize(&instance->generic, flipper_format, preset); |     SubGhzProtocolStatus res = | ||||||
|  |         subghz_block_generic_serialize(&instance->generic, flipper_format, preset); | ||||||
| 
 | 
 | ||||||
|     if(res && !flipper_format_write_string_cstr( |     if((res == SubGhzProtocolStatusOk) && | ||||||
|                   flipper_format, "Manufacture", instance->manufacture_name)) { |        !flipper_format_write_string_cstr( | ||||||
|  |            flipper_format, "Manufacture", instance->manufacture_name)) { | ||||||
|         FURI_LOG_E(TAG, "Unable to add manufacture name"); |         FURI_LOG_E(TAG, "Unable to add manufacture name"); | ||||||
|         res = false; |         res = SubGhzProtocolStatusErrorParserOthers; | ||||||
|     } |     } | ||||||
|     return res; |     return res; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_decoder_keeloq_deserialize(void* context, FlipperFormat* flipper_format) { | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_decoder_keeloq_deserialize(void* context, FlipperFormat* flipper_format) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     SubGhzProtocolDecoderKeeloq* instance = context; |     SubGhzProtocolDecoderKeeloq* instance = context; | ||||||
|     bool res = false; |     return subghz_block_generic_deserialize_check_count_bit( | ||||||
|     do { |         &instance->generic, flipper_format, subghz_protocol_keeloq_const.min_count_bit_for_found); | ||||||
|         if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) { |  | ||||||
|             FURI_LOG_E(TAG, "Deserialize error"); |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|         if(instance->generic.data_count_bit != |  | ||||||
|            subghz_protocol_keeloq_const.min_count_bit_for_found) { |  | ||||||
|             FURI_LOG_E(TAG, "Wrong number of bits in key"); |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|         res = true; |  | ||||||
|     } while(false); |  | ||||||
| 
 |  | ||||||
|     return res; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void subghz_protocol_decoder_keeloq_get_string(void* context, FuriString* output) { | void subghz_protocol_decoder_keeloq_get_string(void* context, FuriString* output) { | ||||||
|  | |||||||
| @ -48,9 +48,10 @@ bool subghz_protocol_keeloq_create_data( | |||||||
|  * Deserialize and generating an upload to send. |  * Deserialize and generating an upload to send. | ||||||
|  * @param context Pointer to a SubGhzProtocolEncoderKeeloq instance |  * @param context Pointer to a SubGhzProtocolEncoderKeeloq instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_encoder_keeloq_deserialize(void* context, FlipperFormat* flipper_format); | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_encoder_keeloq_deserialize(void* context, FlipperFormat* flipper_format); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Forced transmission stop. |  * Forced transmission stop. | ||||||
| @ -104,9 +105,9 @@ uint8_t subghz_protocol_decoder_keeloq_get_hash_data(void* context); | |||||||
|  * @param context Pointer to a SubGhzProtocolDecoderKeeloq instance |  * @param context Pointer to a SubGhzProtocolDecoderKeeloq instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @param preset The modulation on which the signal was received, SubGhzRadioPreset |  * @param preset The modulation on which the signal was received, SubGhzRadioPreset | ||||||
|  * @return true On success |  * @return SubGhzProtocolStatus | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_decoder_keeloq_serialize( | SubGhzProtocolStatus subghz_protocol_decoder_keeloq_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset); |     SubGhzRadioPreset* preset); | ||||||
| @ -115,9 +116,10 @@ bool subghz_protocol_decoder_keeloq_serialize( | |||||||
|  * Deserialize data SubGhzProtocolDecoderKeeloq. |  * Deserialize data SubGhzProtocolDecoderKeeloq. | ||||||
|  * @param context Pointer to a SubGhzProtocolDecoderKeeloq instance |  * @param context Pointer to a SubGhzProtocolDecoderKeeloq instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @return true On success |  * @return SubGhzProtocolStatus | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_decoder_keeloq_deserialize(void* context, FlipperFormat* flipper_format); | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_decoder_keeloq_deserialize(void* context, FlipperFormat* flipper_format); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Getting a textual representation of the received data. |  * Getting a textual representation of the received data. | ||||||
|  | |||||||
| @ -230,7 +230,7 @@ uint8_t subghz_protocol_decoder_kia_get_hash_data(void* context) { | |||||||
|         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); |         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_decoder_kia_serialize( | SubGhzProtocolStatus subghz_protocol_decoder_kia_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset) { |     SubGhzRadioPreset* preset) { | ||||||
| @ -239,21 +239,12 @@ bool subghz_protocol_decoder_kia_serialize( | |||||||
|     return subghz_block_generic_serialize(&instance->generic, flipper_format, preset); |     return subghz_block_generic_serialize(&instance->generic, flipper_format, preset); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_decoder_kia_deserialize(void* context, FlipperFormat* flipper_format) { | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_decoder_kia_deserialize(void* context, FlipperFormat* flipper_format) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     SubGhzProtocolDecoderKIA* instance = context; |     SubGhzProtocolDecoderKIA* instance = context; | ||||||
|     bool ret = false; |     return subghz_block_generic_deserialize_check_count_bit( | ||||||
|     do { |         &instance->generic, flipper_format, subghz_protocol_kia_const.min_count_bit_for_found); | ||||||
|         if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) { |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|         if(instance->generic.data_count_bit != subghz_protocol_kia_const.min_count_bit_for_found) { |  | ||||||
|             FURI_LOG_E(TAG, "Wrong number of bits in key"); |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|         ret = true; |  | ||||||
|     } while(false); |  | ||||||
|     return ret; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void subghz_protocol_decoder_kia_get_string(void* context, FuriString* output) { | void subghz_protocol_decoder_kia_get_string(void* context, FuriString* output) { | ||||||
|  | |||||||
| @ -50,9 +50,9 @@ uint8_t subghz_protocol_decoder_kia_get_hash_data(void* context); | |||||||
|  * @param context Pointer to a SubGhzProtocolDecoderKIA instance |  * @param context Pointer to a SubGhzProtocolDecoderKIA instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @param preset The modulation on which the signal was received, SubGhzRadioPreset |  * @param preset The modulation on which the signal was received, SubGhzRadioPreset | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_decoder_kia_serialize( | SubGhzProtocolStatus subghz_protocol_decoder_kia_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset); |     SubGhzRadioPreset* preset); | ||||||
| @ -61,9 +61,10 @@ bool subghz_protocol_decoder_kia_serialize( | |||||||
|  * Deserialize data SubGhzProtocolDecoderKIA. |  * Deserialize data SubGhzProtocolDecoderKIA. | ||||||
|  * @param context Pointer to a SubGhzProtocolDecoderKIA instance |  * @param context Pointer to a SubGhzProtocolDecoderKIA instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_decoder_kia_deserialize(void* context, FlipperFormat* flipper_format); | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_decoder_kia_deserialize(void* context, FlipperFormat* flipper_format); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Getting a textual representation of the received data. |  * Getting a textual representation of the received data. | ||||||
|  | |||||||
| @ -260,56 +260,56 @@ uint8_t subghz_protocol_decoder_kinggates_stylo_4k_get_hash_data(void* context) | |||||||
|         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); |         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_decoder_kinggates_stylo_4k_serialize( | SubGhzProtocolStatus subghz_protocol_decoder_kinggates_stylo_4k_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset) { |     SubGhzRadioPreset* preset) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     SubGhzProtocolDecoderKingGates_stylo_4k* instance = context; |     SubGhzProtocolDecoderKingGates_stylo_4k* instance = context; | ||||||
|     bool res = subghz_block_generic_serialize(&instance->generic, flipper_format, preset); |     SubGhzProtocolStatus ret = | ||||||
|  |         subghz_block_generic_serialize(&instance->generic, flipper_format, preset); | ||||||
| 
 | 
 | ||||||
|     uint8_t key_data[sizeof(uint64_t)] = {0}; |     uint8_t key_data[sizeof(uint64_t)] = {0}; | ||||||
|     for(size_t i = 0; i < sizeof(uint64_t); i++) { |     for(size_t i = 0; i < sizeof(uint64_t); i++) { | ||||||
|         key_data[sizeof(uint64_t) - i - 1] = (instance->data >> (i * 8)) & 0xFF; |         key_data[sizeof(uint64_t) - i - 1] = (instance->data >> (i * 8)) & 0xFF; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     if(res && !flipper_format_write_hex(flipper_format, "Data", key_data, sizeof(uint64_t))) { |     if((ret == SubGhzProtocolStatusOk) && | ||||||
|  |        !flipper_format_write_hex(flipper_format, "Data", key_data, sizeof(uint64_t))) { | ||||||
|         FURI_LOG_E(TAG, "Unable to add Data"); |         FURI_LOG_E(TAG, "Unable to add Data"); | ||||||
|         res = false; |         ret = SubGhzProtocolStatusErrorParserOthers; | ||||||
|     } |     } | ||||||
|     return res; |     return ret; | ||||||
| 
 |  | ||||||
|     return subghz_block_generic_serialize(&instance->generic, flipper_format, preset); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_decoder_kinggates_stylo_4k_deserialize( | SubGhzProtocolStatus subghz_protocol_decoder_kinggates_stylo_4k_deserialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format) { |     FlipperFormat* flipper_format) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     SubGhzProtocolDecoderKingGates_stylo_4k* instance = context; |     SubGhzProtocolDecoderKingGates_stylo_4k* instance = context; | ||||||
|     bool ret = false; |     SubGhzProtocolStatus ret = SubGhzProtocolStatusError; | ||||||
|     do { |     do { | ||||||
|         if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) { |         ret = subghz_block_generic_deserialize_check_count_bit( | ||||||
|             break; |             &instance->generic, | ||||||
|         } |             flipper_format, | ||||||
|         if(instance->generic.data_count_bit != |             subghz_protocol_kinggates_stylo_4k_const.min_count_bit_for_found); | ||||||
|            subghz_protocol_kinggates_stylo_4k_const.min_count_bit_for_found) { |         if(ret != SubGhzProtocolStatusOk) { | ||||||
|             FURI_LOG_E(TAG, "Wrong number of bits in key"); |  | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         if(!flipper_format_rewind(flipper_format)) { |         if(!flipper_format_rewind(flipper_format)) { | ||||||
|             FURI_LOG_E(TAG, "Rewind error"); |             FURI_LOG_E(TAG, "Rewind error"); | ||||||
|  |             ret = SubGhzProtocolStatusErrorParserOthers; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         uint8_t key_data[sizeof(uint64_t)] = {0}; |         uint8_t key_data[sizeof(uint64_t)] = {0}; | ||||||
|         if(!flipper_format_read_hex(flipper_format, "Data", key_data, sizeof(uint64_t))) { |         if(!flipper_format_read_hex(flipper_format, "Data", key_data, sizeof(uint64_t))) { | ||||||
|             FURI_LOG_E(TAG, "Missing Data"); |             FURI_LOG_E(TAG, "Missing Data"); | ||||||
|  |             ret = SubGhzProtocolStatusErrorParserOthers; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         for(uint8_t i = 0; i < sizeof(uint64_t); i++) { |         for(uint8_t i = 0; i < sizeof(uint64_t); i++) { | ||||||
|             instance->data = instance->data << 8 | key_data[i]; |             instance->data = instance->data << 8 | key_data[i]; | ||||||
|         } |         } | ||||||
|         ret = true; |  | ||||||
|     } while(false); |     } while(false); | ||||||
|     return ret; |     return ret; | ||||||
| } | } | ||||||
|  | |||||||
| @ -49,9 +49,9 @@ uint8_t subghz_protocol_decoder_kinggates_stylo_4k_get_hash_data(void* context); | |||||||
|  * @param context Pointer to a SubGhzProtocolDecoderKingGates_stylo_4k instance |  * @param context Pointer to a SubGhzProtocolDecoderKingGates_stylo_4k instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @param preset The modulation on which the signal was received, SubGhzRadioPreset |  * @param preset The modulation on which the signal was received, SubGhzRadioPreset | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_decoder_kinggates_stylo_4k_serialize( | SubGhzProtocolStatus subghz_protocol_decoder_kinggates_stylo_4k_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset); |     SubGhzRadioPreset* preset); | ||||||
| @ -60,9 +60,9 @@ bool subghz_protocol_decoder_kinggates_stylo_4k_serialize( | |||||||
|  * Deserialize data SubGhzProtocolDecoderKingGates_stylo_4k. |  * Deserialize data SubGhzProtocolDecoderKingGates_stylo_4k. | ||||||
|  * @param context Pointer to a SubGhzProtocolDecoderKingGates_stylo_4k instance |  * @param context Pointer to a SubGhzProtocolDecoderKingGates_stylo_4k instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_decoder_kinggates_stylo_4k_deserialize( | SubGhzProtocolStatus subghz_protocol_decoder_kinggates_stylo_4k_deserialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format); |     FlipperFormat* flipper_format); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -147,31 +147,31 @@ static bool subghz_protocol_encoder_linear_get_upload(SubGhzProtocolEncoderLinea | |||||||
|     return true; |     return true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_encoder_linear_deserialize(void* context, FlipperFormat* flipper_format) { | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_encoder_linear_deserialize(void* context, FlipperFormat* flipper_format) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     SubGhzProtocolEncoderLinear* instance = context; |     SubGhzProtocolEncoderLinear* instance = context; | ||||||
|     bool res = false; |     SubGhzProtocolStatus ret = SubGhzProtocolStatusError; | ||||||
|     do { |     do { | ||||||
|         if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) { |         ret = subghz_block_generic_deserialize_check_count_bit( | ||||||
|             FURI_LOG_E(TAG, "Deserialize error"); |             &instance->generic, | ||||||
|             break; |             flipper_format, | ||||||
|         } |             subghz_protocol_linear_const.min_count_bit_for_found); | ||||||
|         if(instance->generic.data_count_bit != |         if(ret != SubGhzProtocolStatusOk) { | ||||||
|            subghz_protocol_linear_const.min_count_bit_for_found) { |  | ||||||
|             FURI_LOG_E(TAG, "Wrong number of bits in key"); |  | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         //optional parameter parameter
 |         //optional parameter parameter
 | ||||||
|         flipper_format_read_uint32( |         flipper_format_read_uint32( | ||||||
|             flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); |             flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); | ||||||
| 
 | 
 | ||||||
|         if(!subghz_protocol_encoder_linear_get_upload(instance)) break; |         if(!subghz_protocol_encoder_linear_get_upload(instance)) { | ||||||
|  |             ret = SubGhzProtocolStatusErrorEncoderGetUpload; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|         instance->encoder.is_running = true; |         instance->encoder.is_running = true; | ||||||
| 
 |  | ||||||
|         res = true; |  | ||||||
|     } while(false); |     } while(false); | ||||||
| 
 | 
 | ||||||
|     return res; |     return ret; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void subghz_protocol_encoder_linear_stop(void* context) { | void subghz_protocol_encoder_linear_stop(void* context) { | ||||||
| @ -300,7 +300,7 @@ uint8_t subghz_protocol_decoder_linear_get_hash_data(void* context) { | |||||||
|         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); |         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_decoder_linear_serialize( | SubGhzProtocolStatus subghz_protocol_decoder_linear_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset) { |     SubGhzRadioPreset* preset) { | ||||||
| @ -309,22 +309,12 @@ bool subghz_protocol_decoder_linear_serialize( | |||||||
|     return subghz_block_generic_serialize(&instance->generic, flipper_format, preset); |     return subghz_block_generic_serialize(&instance->generic, flipper_format, preset); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_decoder_linear_deserialize(void* context, FlipperFormat* flipper_format) { | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_decoder_linear_deserialize(void* context, FlipperFormat* flipper_format) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     SubGhzProtocolDecoderLinear* instance = context; |     SubGhzProtocolDecoderLinear* instance = context; | ||||||
|     bool ret = false; |     return subghz_block_generic_deserialize_check_count_bit( | ||||||
|     do { |         &instance->generic, flipper_format, subghz_protocol_linear_const.min_count_bit_for_found); | ||||||
|         if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) { |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|         if(instance->generic.data_count_bit != |  | ||||||
|            subghz_protocol_linear_const.min_count_bit_for_found) { |  | ||||||
|             FURI_LOG_E(TAG, "Wrong number of bits in key"); |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|         ret = true; |  | ||||||
|     } while(false); |  | ||||||
|     return ret; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void subghz_protocol_decoder_linear_get_string(void* context, FuriString* output) { | void subghz_protocol_decoder_linear_get_string(void* context, FuriString* output) { | ||||||
|  | |||||||
| @ -28,9 +28,10 @@ void subghz_protocol_encoder_linear_free(void* context); | |||||||
|  * Deserialize and generating an upload to send. |  * Deserialize and generating an upload to send. | ||||||
|  * @param context Pointer to a SubGhzProtocolEncoderLinear instance |  * @param context Pointer to a SubGhzProtocolEncoderLinear instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_encoder_linear_deserialize(void* context, FlipperFormat* flipper_format); | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_encoder_linear_deserialize(void* context, FlipperFormat* flipper_format); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Forced transmission stop. |  * Forced transmission stop. | ||||||
| @ -84,9 +85,9 @@ uint8_t subghz_protocol_decoder_linear_get_hash_data(void* context); | |||||||
|  * @param context Pointer to a SubGhzProtocolDecoderLinear instance |  * @param context Pointer to a SubGhzProtocolDecoderLinear instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @param preset The modulation on which the signal was received, SubGhzRadioPreset |  * @param preset The modulation on which the signal was received, SubGhzRadioPreset | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_decoder_linear_serialize( | SubGhzProtocolStatus subghz_protocol_decoder_linear_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset); |     SubGhzRadioPreset* preset); | ||||||
| @ -95,9 +96,10 @@ bool subghz_protocol_decoder_linear_serialize( | |||||||
|  * Deserialize data SubGhzProtocolDecoderLinear. |  * Deserialize data SubGhzProtocolDecoderLinear. | ||||||
|  * @param context Pointer to a SubGhzProtocolDecoderLinear instance |  * @param context Pointer to a SubGhzProtocolDecoderLinear instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_decoder_linear_deserialize(void* context, FlipperFormat* flipper_format); | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_decoder_linear_deserialize(void* context, FlipperFormat* flipper_format); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Getting a textual representation of the received data. |  * Getting a textual representation of the received data. | ||||||
|  | |||||||
| @ -150,33 +150,32 @@ static bool | |||||||
|     return true; |     return true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_encoder_linear_delta3_deserialize( | SubGhzProtocolStatus subghz_protocol_encoder_linear_delta3_deserialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format) { |     FlipperFormat* flipper_format) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     SubGhzProtocolEncoderLinearDelta3* instance = context; |     SubGhzProtocolEncoderLinearDelta3* instance = context; | ||||||
|     bool res = false; |     SubGhzProtocolStatus ret = SubGhzProtocolStatusError; | ||||||
|     do { |     do { | ||||||
|         if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) { |         ret = subghz_block_generic_deserialize_check_count_bit( | ||||||
|             FURI_LOG_E(TAG, "Deserialize error"); |             &instance->generic, | ||||||
|             break; |             flipper_format, | ||||||
|         } |             subghz_protocol_linear_delta3_const.min_count_bit_for_found); | ||||||
|         if(instance->generic.data_count_bit != |         if(ret != SubGhzProtocolStatusOk) { | ||||||
|            subghz_protocol_linear_delta3_const.min_count_bit_for_found) { |  | ||||||
|             FURI_LOG_E(TAG, "Wrong number of bits in key"); |  | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         //optional parameter parameter
 |         //optional parameter parameter
 | ||||||
|         flipper_format_read_uint32( |         flipper_format_read_uint32( | ||||||
|             flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); |             flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); | ||||||
| 
 | 
 | ||||||
|         if(!subghz_protocol_encoder_linear_delta3_get_upload(instance)) break; |         if(!subghz_protocol_encoder_linear_delta3_get_upload(instance)) { | ||||||
|  |             ret = SubGhzProtocolStatusErrorEncoderGetUpload; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|         instance->encoder.is_running = true; |         instance->encoder.is_running = true; | ||||||
| 
 |  | ||||||
|         res = true; |  | ||||||
|     } while(false); |     } while(false); | ||||||
| 
 | 
 | ||||||
|     return res; |     return ret; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void subghz_protocol_encoder_linear_delta3_stop(void* context) { | void subghz_protocol_encoder_linear_delta3_stop(void* context) { | ||||||
| @ -312,7 +311,7 @@ uint8_t subghz_protocol_decoder_linear_delta3_get_hash_data(void* context) { | |||||||
|         &instance->decoder, (instance->decoder.decode_count_bit / 8)); |         &instance->decoder, (instance->decoder.decode_count_bit / 8)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_decoder_linear_delta3_serialize( | SubGhzProtocolStatus subghz_protocol_decoder_linear_delta3_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset) { |     SubGhzRadioPreset* preset) { | ||||||
| @ -321,24 +320,15 @@ bool subghz_protocol_decoder_linear_delta3_serialize( | |||||||
|     return subghz_block_generic_serialize(&instance->generic, flipper_format, preset); |     return subghz_block_generic_serialize(&instance->generic, flipper_format, preset); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_decoder_linear_delta3_deserialize( | SubGhzProtocolStatus subghz_protocol_decoder_linear_delta3_deserialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format) { |     FlipperFormat* flipper_format) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     SubGhzProtocolDecoderLinearDelta3* instance = context; |     SubGhzProtocolDecoderLinearDelta3* instance = context; | ||||||
|     bool ret = false; |     return subghz_block_generic_deserialize_check_count_bit( | ||||||
|     do { |         &instance->generic, | ||||||
|         if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) { |         flipper_format, | ||||||
|             break; |         subghz_protocol_linear_delta3_const.min_count_bit_for_found); | ||||||
|         } |  | ||||||
|         if(instance->generic.data_count_bit != |  | ||||||
|            subghz_protocol_linear_delta3_const.min_count_bit_for_found) { |  | ||||||
|             FURI_LOG_E(TAG, "Wrong number of bits in key"); |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|         ret = true; |  | ||||||
|     } while(false); |  | ||||||
|     return ret; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void subghz_protocol_decoder_linear_delta3_get_string(void* context, FuriString* output) { | void subghz_protocol_decoder_linear_delta3_get_string(void* context, FuriString* output) { | ||||||
|  | |||||||
| @ -28,11 +28,10 @@ void subghz_protocol_encoder_linear_delta3_free(void* context); | |||||||
|  * Deserialize and generating an upload to send. |  * Deserialize and generating an upload to send. | ||||||
|  * @param context Pointer to a SubGhzProtocolEncoderLinearDelta3 instance |  * @param context Pointer to a SubGhzProtocolEncoderLinearDelta3 instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_encoder_linear_delta3_deserialize( | SubGhzProtocolStatus | ||||||
|     void* context, |     subghz_protocol_encoder_linear_delta3_deserialize(void* context, FlipperFormat* flipper_format); | ||||||
|     FlipperFormat* flipper_format); |  | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Forced transmission stop. |  * Forced transmission stop. | ||||||
| @ -86,9 +85,9 @@ uint8_t subghz_protocol_decoder_linear_delta3_get_hash_data(void* context); | |||||||
|  * @param context Pointer to a SubGhzProtocolDecoderLinearDelta3 instance |  * @param context Pointer to a SubGhzProtocolDecoderLinearDelta3 instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @param preset The modulation on which the signal was received, SubGhzRadioPreset |  * @param preset The modulation on which the signal was received, SubGhzRadioPreset | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_decoder_linear_delta3_serialize( | SubGhzProtocolStatus subghz_protocol_decoder_linear_delta3_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset); |     SubGhzRadioPreset* preset); | ||||||
| @ -97,11 +96,10 @@ bool subghz_protocol_decoder_linear_delta3_serialize( | |||||||
|  * Deserialize data SubGhzProtocolDecoderLinearDelta3. |  * Deserialize data SubGhzProtocolDecoderLinearDelta3. | ||||||
|  * @param context Pointer to a SubGhzProtocolDecoderLinearDelta3 instance |  * @param context Pointer to a SubGhzProtocolDecoderLinearDelta3 instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_decoder_linear_delta3_deserialize( | SubGhzProtocolStatus | ||||||
|     void* context, |     subghz_protocol_decoder_linear_delta3_deserialize(void* context, FlipperFormat* flipper_format); | ||||||
|     FlipperFormat* flipper_format); |  | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Getting a textual representation of the received data. |  * Getting a textual representation of the received data. | ||||||
|  | |||||||
| @ -150,31 +150,31 @@ static bool subghz_protocol_encoder_magellan_get_upload(SubGhzProtocolEncoderMag | |||||||
|     return true; |     return true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_encoder_magellan_deserialize(void* context, FlipperFormat* flipper_format) { | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_encoder_magellan_deserialize(void* context, FlipperFormat* flipper_format) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     SubGhzProtocolEncoderMagellan* instance = context; |     SubGhzProtocolEncoderMagellan* instance = context; | ||||||
|     bool res = false; |     SubGhzProtocolStatus ret = SubGhzProtocolStatusError; | ||||||
|     do { |     do { | ||||||
|         if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) { |         ret = subghz_block_generic_deserialize_check_count_bit( | ||||||
|             FURI_LOG_E(TAG, "Deserialize error"); |             &instance->generic, | ||||||
|             break; |             flipper_format, | ||||||
|         } |             subghz_protocol_magellan_const.min_count_bit_for_found); | ||||||
|         if(instance->generic.data_count_bit != |         if(ret != SubGhzProtocolStatusOk) { | ||||||
|            subghz_protocol_magellan_const.min_count_bit_for_found) { |  | ||||||
|             FURI_LOG_E(TAG, "Wrong number of bits in key"); |  | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         //optional parameter parameter
 |         //optional parameter parameter
 | ||||||
|         flipper_format_read_uint32( |         flipper_format_read_uint32( | ||||||
|             flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); |             flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); | ||||||
| 
 | 
 | ||||||
|         if(!subghz_protocol_encoder_magellan_get_upload(instance)) break; |         if(!subghz_protocol_encoder_magellan_get_upload(instance)) { | ||||||
|  |             ret = SubGhzProtocolStatusErrorEncoderGetUpload; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|         instance->encoder.is_running = true; |         instance->encoder.is_running = true; | ||||||
| 
 |  | ||||||
|         res = true; |  | ||||||
|     } while(false); |     } while(false); | ||||||
| 
 | 
 | ||||||
|     return res; |     return ret; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void subghz_protocol_encoder_magellan_stop(void* context) { | void subghz_protocol_encoder_magellan_stop(void* context) { | ||||||
| @ -397,7 +397,7 @@ uint8_t subghz_protocol_decoder_magellan_get_hash_data(void* context) { | |||||||
|         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); |         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_decoder_magellan_serialize( | SubGhzProtocolStatus subghz_protocol_decoder_magellan_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset) { |     SubGhzRadioPreset* preset) { | ||||||
| @ -406,22 +406,14 @@ bool subghz_protocol_decoder_magellan_serialize( | |||||||
|     return subghz_block_generic_serialize(&instance->generic, flipper_format, preset); |     return subghz_block_generic_serialize(&instance->generic, flipper_format, preset); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_decoder_magellan_deserialize(void* context, FlipperFormat* flipper_format) { | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_decoder_magellan_deserialize(void* context, FlipperFormat* flipper_format) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     SubGhzProtocolDecoderMagellan* instance = context; |     SubGhzProtocolDecoderMagellan* instance = context; | ||||||
|     bool ret = false; |     return subghz_block_generic_deserialize_check_count_bit( | ||||||
|     do { |         &instance->generic, | ||||||
|         if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) { |         flipper_format, | ||||||
|             break; |         subghz_protocol_magellan_const.min_count_bit_for_found); | ||||||
|         } |  | ||||||
|         if(instance->generic.data_count_bit != |  | ||||||
|            subghz_protocol_magellan_const.min_count_bit_for_found) { |  | ||||||
|             FURI_LOG_E(TAG, "Wrong number of bits in key"); |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|         ret = true; |  | ||||||
|     } while(false); |  | ||||||
|     return ret; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void subghz_protocol_decoder_magellan_get_string(void* context, FuriString* output) { | void subghz_protocol_decoder_magellan_get_string(void* context, FuriString* output) { | ||||||
|  | |||||||
| @ -28,9 +28,10 @@ void subghz_protocol_encoder_magellan_free(void* context); | |||||||
|  * Deserialize and generating an upload to send. |  * Deserialize and generating an upload to send. | ||||||
|  * @param context Pointer to a SubGhzProtocolEncoderMagellan instance |  * @param context Pointer to a SubGhzProtocolEncoderMagellan instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_encoder_magellan_deserialize(void* context, FlipperFormat* flipper_format); | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_encoder_magellan_deserialize(void* context, FlipperFormat* flipper_format); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Forced transmission stop. |  * Forced transmission stop. | ||||||
| @ -84,9 +85,9 @@ uint8_t subghz_protocol_decoder_magellan_get_hash_data(void* context); | |||||||
|  * @param context Pointer to a SubGhzProtocolDecoderMagellan instance |  * @param context Pointer to a SubGhzProtocolDecoderMagellan instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @param preset The modulation on which the signal was received, SubGhzRadioPreset |  * @param preset The modulation on which the signal was received, SubGhzRadioPreset | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_decoder_magellan_serialize( | SubGhzProtocolStatus subghz_protocol_decoder_magellan_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset); |     SubGhzRadioPreset* preset); | ||||||
| @ -95,9 +96,10 @@ bool subghz_protocol_decoder_magellan_serialize( | |||||||
|  * Deserialize data SubGhzProtocolDecoderMagellan. |  * Deserialize data SubGhzProtocolDecoderMagellan. | ||||||
|  * @param context Pointer to a SubGhzProtocolDecoderMagellan instance |  * @param context Pointer to a SubGhzProtocolDecoderMagellan instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_decoder_magellan_deserialize(void* context, FlipperFormat* flipper_format); | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_decoder_magellan_deserialize(void* context, FlipperFormat* flipper_format); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Getting a textual representation of the received data. |  * Getting a textual representation of the received data. | ||||||
|  | |||||||
| @ -188,18 +188,17 @@ static void subghz_protocol_marantec_remote_controller(SubGhzBlockGeneric* insta | |||||||
|     instance->serial = ((instance->data >> 12) & 0xFFFFFF00) | ((instance->data >> 8) & 0xFF); |     instance->serial = ((instance->data >> 12) & 0xFFFFFF00) | ((instance->data >> 8) & 0xFF); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_encoder_marantec_deserialize(void* context, FlipperFormat* flipper_format) { | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_encoder_marantec_deserialize(void* context, FlipperFormat* flipper_format) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     SubGhzProtocolEncoderMarantec* instance = context; |     SubGhzProtocolEncoderMarantec* instance = context; | ||||||
|     bool res = false; |     SubGhzProtocolStatus ret = SubGhzProtocolStatusError; | ||||||
|     do { |     do { | ||||||
|         if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) { |         ret = subghz_block_generic_deserialize_check_count_bit( | ||||||
|             FURI_LOG_E(TAG, "Deserialize error"); |             &instance->generic, | ||||||
|             break; |             flipper_format, | ||||||
|         } |             subghz_protocol_marantec_const.min_count_bit_for_found); | ||||||
|         if(instance->generic.data_count_bit != |         if(ret != SubGhzProtocolStatusOk) { | ||||||
|            subghz_protocol_marantec_const.min_count_bit_for_found) { |  | ||||||
|             FURI_LOG_E(TAG, "Wrong number of bits in key"); |  | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         //optional parameter parameter
 |         //optional parameter parameter
 | ||||||
| @ -209,11 +208,9 @@ bool subghz_protocol_encoder_marantec_deserialize(void* context, FlipperFormat* | |||||||
|         subghz_protocol_marantec_remote_controller(&instance->generic); |         subghz_protocol_marantec_remote_controller(&instance->generic); | ||||||
|         subghz_protocol_encoder_marantec_get_upload(instance); |         subghz_protocol_encoder_marantec_get_upload(instance); | ||||||
|         instance->encoder.is_running = true; |         instance->encoder.is_running = true; | ||||||
| 
 |  | ||||||
|         res = true; |  | ||||||
|     } while(false); |     } while(false); | ||||||
| 
 | 
 | ||||||
|     return res; |     return ret; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void subghz_protocol_encoder_marantec_stop(void* context) { | void subghz_protocol_encoder_marantec_stop(void* context) { | ||||||
| @ -346,7 +343,7 @@ uint8_t subghz_protocol_decoder_marantec_get_hash_data(void* context) { | |||||||
|         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); |         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_decoder_marantec_serialize( | SubGhzProtocolStatus subghz_protocol_decoder_marantec_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset) { |     SubGhzRadioPreset* preset) { | ||||||
| @ -355,22 +352,14 @@ bool subghz_protocol_decoder_marantec_serialize( | |||||||
|     return subghz_block_generic_serialize(&instance->generic, flipper_format, preset); |     return subghz_block_generic_serialize(&instance->generic, flipper_format, preset); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_decoder_marantec_deserialize(void* context, FlipperFormat* flipper_format) { | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_decoder_marantec_deserialize(void* context, FlipperFormat* flipper_format) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     SubGhzProtocolDecoderMarantec* instance = context; |     SubGhzProtocolDecoderMarantec* instance = context; | ||||||
|     bool ret = false; |     return subghz_block_generic_deserialize_check_count_bit( | ||||||
|     do { |         &instance->generic, | ||||||
|         if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) { |         flipper_format, | ||||||
|             break; |         subghz_protocol_marantec_const.min_count_bit_for_found); | ||||||
|         } |  | ||||||
|         if(instance->generic.data_count_bit != |  | ||||||
|            subghz_protocol_marantec_const.min_count_bit_for_found) { |  | ||||||
|             FURI_LOG_E(TAG, "Wrong number of bits in key"); |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|         ret = true; |  | ||||||
|     } while(false); |  | ||||||
|     return ret; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void subghz_protocol_decoder_marantec_get_string(void* context, FuriString* output) { | void subghz_protocol_decoder_marantec_get_string(void* context, FuriString* output) { | ||||||
|  | |||||||
| @ -28,9 +28,10 @@ void subghz_protocol_encoder_marantec_free(void* context); | |||||||
|  * Deserialize and generating an upload to send. |  * Deserialize and generating an upload to send. | ||||||
|  * @param context Pointer to a SubGhzProtocolEncoderMarantec instance |  * @param context Pointer to a SubGhzProtocolEncoderMarantec instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_encoder_marantec_deserialize(void* context, FlipperFormat* flipper_format); | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_encoder_marantec_deserialize(void* context, FlipperFormat* flipper_format); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Forced transmission stop. |  * Forced transmission stop. | ||||||
| @ -84,9 +85,9 @@ uint8_t subghz_protocol_decoder_marantec_get_hash_data(void* context); | |||||||
|  * @param context Pointer to a SubGhzProtocolDecoderMarantec instance |  * @param context Pointer to a SubGhzProtocolDecoderMarantec instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @param preset The modulation on which the signal was received, SubGhzRadioPreset |  * @param preset The modulation on which the signal was received, SubGhzRadioPreset | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_decoder_marantec_serialize( | SubGhzProtocolStatus subghz_protocol_decoder_marantec_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset); |     SubGhzRadioPreset* preset); | ||||||
| @ -95,9 +96,10 @@ bool subghz_protocol_decoder_marantec_serialize( | |||||||
|  * Deserialize data SubGhzProtocolDecoderMarantec. |  * Deserialize data SubGhzProtocolDecoderMarantec. | ||||||
|  * @param context Pointer to a SubGhzProtocolDecoderMarantec instance |  * @param context Pointer to a SubGhzProtocolDecoderMarantec instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_decoder_marantec_deserialize(void* context, FlipperFormat* flipper_format); | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_decoder_marantec_deserialize(void* context, FlipperFormat* flipper_format); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Getting a textual representation of the received data. |  * Getting a textual representation of the received data. | ||||||
|  | |||||||
| @ -175,31 +175,31 @@ static bool subghz_protocol_encoder_megacode_get_upload(SubGhzProtocolEncoderMeg | |||||||
|     return true; |     return true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_encoder_megacode_deserialize(void* context, FlipperFormat* flipper_format) { | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_encoder_megacode_deserialize(void* context, FlipperFormat* flipper_format) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     SubGhzProtocolEncoderMegaCode* instance = context; |     SubGhzProtocolEncoderMegaCode* instance = context; | ||||||
|     bool res = false; |     SubGhzProtocolStatus ret = SubGhzProtocolStatusError; | ||||||
|     do { |     do { | ||||||
|         if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) { |         ret = subghz_block_generic_deserialize_check_count_bit( | ||||||
|             FURI_LOG_E(TAG, "Deserialize error"); |             &instance->generic, | ||||||
|             break; |             flipper_format, | ||||||
|         } |             subghz_protocol_megacode_const.min_count_bit_for_found); | ||||||
|         if(instance->generic.data_count_bit != |         if(ret != SubGhzProtocolStatusOk) { | ||||||
|            subghz_protocol_megacode_const.min_count_bit_for_found) { |  | ||||||
|             FURI_LOG_E(TAG, "Wrong number of bits in key"); |  | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         //optional parameter parameter
 |         //optional parameter parameter
 | ||||||
|         flipper_format_read_uint32( |         flipper_format_read_uint32( | ||||||
|             flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); |             flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); | ||||||
| 
 | 
 | ||||||
|         if(!subghz_protocol_encoder_megacode_get_upload(instance)) break; |         if(!subghz_protocol_encoder_megacode_get_upload(instance)) { | ||||||
|  |             ret = SubGhzProtocolStatusErrorEncoderGetUpload; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|         instance->encoder.is_running = true; |         instance->encoder.is_running = true; | ||||||
| 
 |  | ||||||
|         res = true; |  | ||||||
|     } while(false); |     } while(false); | ||||||
| 
 | 
 | ||||||
|     return res; |     return ret; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void subghz_protocol_encoder_megacode_stop(void* context) { | void subghz_protocol_encoder_megacode_stop(void* context) { | ||||||
| @ -381,7 +381,7 @@ uint8_t subghz_protocol_decoder_megacode_get_hash_data(void* context) { | |||||||
|         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); |         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_decoder_megacode_serialize( | SubGhzProtocolStatus subghz_protocol_decoder_megacode_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset) { |     SubGhzRadioPreset* preset) { | ||||||
| @ -390,22 +390,14 @@ bool subghz_protocol_decoder_megacode_serialize( | |||||||
|     return subghz_block_generic_serialize(&instance->generic, flipper_format, preset); |     return subghz_block_generic_serialize(&instance->generic, flipper_format, preset); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_decoder_megacode_deserialize(void* context, FlipperFormat* flipper_format) { | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_decoder_megacode_deserialize(void* context, FlipperFormat* flipper_format) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     SubGhzProtocolDecoderMegaCode* instance = context; |     SubGhzProtocolDecoderMegaCode* instance = context; | ||||||
|     bool ret = false; |     return subghz_block_generic_deserialize_check_count_bit( | ||||||
|     do { |         &instance->generic, | ||||||
|         if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) { |         flipper_format, | ||||||
|             break; |         subghz_protocol_megacode_const.min_count_bit_for_found); | ||||||
|         } |  | ||||||
|         if(instance->generic.data_count_bit != |  | ||||||
|            subghz_protocol_megacode_const.min_count_bit_for_found) { |  | ||||||
|             FURI_LOG_E(TAG, "Wrong number of bits in key"); |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|         ret = true; |  | ||||||
|     } while(false); |  | ||||||
|     return ret; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void subghz_protocol_decoder_megacode_get_string(void* context, FuriString* output) { | void subghz_protocol_decoder_megacode_get_string(void* context, FuriString* output) { | ||||||
|  | |||||||
| @ -28,9 +28,10 @@ void subghz_protocol_encoder_megacode_free(void* context); | |||||||
|  * Deserialize and generating an upload to send. |  * Deserialize and generating an upload to send. | ||||||
|  * @param context Pointer to a SubGhzProtocolEncoderMegaCode instance |  * @param context Pointer to a SubGhzProtocolEncoderMegaCode instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_encoder_megacode_deserialize(void* context, FlipperFormat* flipper_format); | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_encoder_megacode_deserialize(void* context, FlipperFormat* flipper_format); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Forced transmission stop. |  * Forced transmission stop. | ||||||
| @ -84,9 +85,9 @@ uint8_t subghz_protocol_decoder_megacode_get_hash_data(void* context); | |||||||
|  * @param context Pointer to a SubGhzProtocolDecoderMegaCode instance |  * @param context Pointer to a SubGhzProtocolDecoderMegaCode instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @param preset The modulation on which the signal was received, SubGhzRadioPreset |  * @param preset The modulation on which the signal was received, SubGhzRadioPreset | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_decoder_megacode_serialize( | SubGhzProtocolStatus subghz_protocol_decoder_megacode_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset); |     SubGhzRadioPreset* preset); | ||||||
| @ -95,9 +96,10 @@ bool subghz_protocol_decoder_megacode_serialize( | |||||||
|  * Deserialize data SubGhzProtocolDecoderMegaCode. |  * Deserialize data SubGhzProtocolDecoderMegaCode. | ||||||
|  * @param context Pointer to a SubGhzProtocolDecoderMegaCode instance |  * @param context Pointer to a SubGhzProtocolDecoderMegaCode instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_decoder_megacode_deserialize(void* context, FlipperFormat* flipper_format); | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_decoder_megacode_deserialize(void* context, FlipperFormat* flipper_format); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Getting a textual representation of the received data. |  * Getting a textual representation of the received data. | ||||||
|  | |||||||
| @ -154,31 +154,31 @@ static bool | |||||||
|     return true; |     return true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_encoder_nero_radio_deserialize(void* context, FlipperFormat* flipper_format) { | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_encoder_nero_radio_deserialize(void* context, FlipperFormat* flipper_format) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     SubGhzProtocolEncoderNeroRadio* instance = context; |     SubGhzProtocolEncoderNeroRadio* instance = context; | ||||||
|     bool res = false; |     SubGhzProtocolStatus ret = SubGhzProtocolStatusError; | ||||||
|     do { |     do { | ||||||
|         if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) { |         ret = subghz_block_generic_deserialize_check_count_bit( | ||||||
|             FURI_LOG_E(TAG, "Deserialize error"); |             &instance->generic, | ||||||
|             break; |             flipper_format, | ||||||
|         } |             subghz_protocol_nero_radio_const.min_count_bit_for_found); | ||||||
|         if(instance->generic.data_count_bit != |         if(ret != SubGhzProtocolStatusOk) { | ||||||
|            subghz_protocol_nero_radio_const.min_count_bit_for_found) { |  | ||||||
|             FURI_LOG_E(TAG, "Wrong number of bits in key"); |  | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         //optional parameter parameter
 |         //optional parameter parameter
 | ||||||
|         flipper_format_read_uint32( |         flipper_format_read_uint32( | ||||||
|             flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); |             flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); | ||||||
| 
 | 
 | ||||||
|         if(!subghz_protocol_encoder_nero_radio_get_upload(instance)) break; |         if(!subghz_protocol_encoder_nero_radio_get_upload(instance)) { | ||||||
|  |             ret = SubGhzProtocolStatusErrorEncoderGetUpload; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|         instance->encoder.is_running = true; |         instance->encoder.is_running = true; | ||||||
| 
 |  | ||||||
|         res = true; |  | ||||||
|     } while(false); |     } while(false); | ||||||
| 
 | 
 | ||||||
|     return res; |     return ret; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void subghz_protocol_encoder_nero_radio_stop(void* context) { | void subghz_protocol_encoder_nero_radio_stop(void* context) { | ||||||
| @ -343,7 +343,7 @@ uint8_t subghz_protocol_decoder_nero_radio_get_hash_data(void* context) { | |||||||
|         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); |         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_decoder_nero_radio_serialize( | SubGhzProtocolStatus subghz_protocol_decoder_nero_radio_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset) { |     SubGhzRadioPreset* preset) { | ||||||
| @ -352,22 +352,14 @@ bool subghz_protocol_decoder_nero_radio_serialize( | |||||||
|     return subghz_block_generic_serialize(&instance->generic, flipper_format, preset); |     return subghz_block_generic_serialize(&instance->generic, flipper_format, preset); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_decoder_nero_radio_deserialize(void* context, FlipperFormat* flipper_format) { | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_decoder_nero_radio_deserialize(void* context, FlipperFormat* flipper_format) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     SubGhzProtocolDecoderNeroRadio* instance = context; |     SubGhzProtocolDecoderNeroRadio* instance = context; | ||||||
|     bool ret = false; |     return subghz_block_generic_deserialize_check_count_bit( | ||||||
|     do { |         &instance->generic, | ||||||
|         if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) { |         flipper_format, | ||||||
|             break; |         subghz_protocol_nero_radio_const.min_count_bit_for_found); | ||||||
|         } |  | ||||||
|         if(instance->generic.data_count_bit != |  | ||||||
|            subghz_protocol_nero_radio_const.min_count_bit_for_found) { |  | ||||||
|             FURI_LOG_E(TAG, "Wrong number of bits in key"); |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|         ret = true; |  | ||||||
|     } while(false); |  | ||||||
|     return ret; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void subghz_protocol_decoder_nero_radio_get_string(void* context, FuriString* output) { | void subghz_protocol_decoder_nero_radio_get_string(void* context, FuriString* output) { | ||||||
|  | |||||||
| @ -28,9 +28,10 @@ void subghz_protocol_encoder_nero_radio_free(void* context); | |||||||
|  * Deserialize and generating an upload to send. |  * Deserialize and generating an upload to send. | ||||||
|  * @param context Pointer to a SubGhzProtocolEncoderNeroRadio instance |  * @param context Pointer to a SubGhzProtocolEncoderNeroRadio instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_encoder_nero_radio_deserialize(void* context, FlipperFormat* flipper_format); | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_encoder_nero_radio_deserialize(void* context, FlipperFormat* flipper_format); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Forced transmission stop. |  * Forced transmission stop. | ||||||
| @ -84,9 +85,9 @@ uint8_t subghz_protocol_decoder_nero_radio_get_hash_data(void* context); | |||||||
|  * @param context Pointer to a SubGhzProtocolDecoderNeroRadio instance |  * @param context Pointer to a SubGhzProtocolDecoderNeroRadio instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @param preset The modulation on which the signal was received, SubGhzRadioPreset |  * @param preset The modulation on which the signal was received, SubGhzRadioPreset | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_decoder_nero_radio_serialize( | SubGhzProtocolStatus subghz_protocol_decoder_nero_radio_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset); |     SubGhzRadioPreset* preset); | ||||||
| @ -95,9 +96,10 @@ bool subghz_protocol_decoder_nero_radio_serialize( | |||||||
|  * Deserialize data SubGhzProtocolDecoderNeroRadio. |  * Deserialize data SubGhzProtocolDecoderNeroRadio. | ||||||
|  * @param context Pointer to a SubGhzProtocolDecoderNeroRadio instance |  * @param context Pointer to a SubGhzProtocolDecoderNeroRadio instance | ||||||
|  * @param flipper_format Pointer to a FlipperFormat instance |  * @param flipper_format Pointer to a FlipperFormat instance | ||||||
|  * @return true On success |  * @return status | ||||||
|  */ |  */ | ||||||
| bool subghz_protocol_decoder_nero_radio_deserialize(void* context, FlipperFormat* flipper_format); | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_decoder_nero_radio_deserialize(void* context, FlipperFormat* flipper_format); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Getting a textual representation of the received data. |  * Getting a textual representation of the received data. | ||||||
|  | |||||||
| @ -148,31 +148,31 @@ static bool | |||||||
|     return true; |     return true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_encoder_nero_sketch_deserialize(void* context, FlipperFormat* flipper_format) { | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_encoder_nero_sketch_deserialize(void* context, FlipperFormat* flipper_format) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     SubGhzProtocolEncoderNeroSketch* instance = context; |     SubGhzProtocolEncoderNeroSketch* instance = context; | ||||||
|     bool res = false; |     SubGhzProtocolStatus ret = SubGhzProtocolStatusError; | ||||||
|     do { |     do { | ||||||
|         if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) { |         ret = subghz_block_generic_deserialize_check_count_bit( | ||||||
|             FURI_LOG_E(TAG, "Deserialize error"); |             &instance->generic, | ||||||
|             break; |             flipper_format, | ||||||
|         } |             subghz_protocol_nero_sketch_const.min_count_bit_for_found); | ||||||
|         if(instance->generic.data_count_bit != |         if(ret != SubGhzProtocolStatusOk) { | ||||||
|            subghz_protocol_nero_sketch_const.min_count_bit_for_found) { |  | ||||||
|             FURI_LOG_E(TAG, "Wrong number of bits in key"); |  | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         //optional parameter parameter
 |         //optional parameter parameter
 | ||||||
|         flipper_format_read_uint32( |         flipper_format_read_uint32( | ||||||
|             flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); |             flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); | ||||||
| 
 | 
 | ||||||
|         if(!subghz_protocol_encoder_nero_sketch_get_upload(instance)) break; |         if(!subghz_protocol_encoder_nero_sketch_get_upload(instance)) { | ||||||
|  |             ret = SubGhzProtocolStatusErrorEncoderGetUpload; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|         instance->encoder.is_running = true; |         instance->encoder.is_running = true; | ||||||
| 
 |  | ||||||
|         res = true; |  | ||||||
|     } while(false); |     } while(false); | ||||||
| 
 | 
 | ||||||
|     return res; |     return ret; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void subghz_protocol_encoder_nero_sketch_stop(void* context) { | void subghz_protocol_encoder_nero_sketch_stop(void* context) { | ||||||
| @ -328,7 +328,7 @@ uint8_t subghz_protocol_decoder_nero_sketch_get_hash_data(void* context) { | |||||||
|         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); |         &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_decoder_nero_sketch_serialize( | SubGhzProtocolStatus subghz_protocol_decoder_nero_sketch_serialize( | ||||||
|     void* context, |     void* context, | ||||||
|     FlipperFormat* flipper_format, |     FlipperFormat* flipper_format, | ||||||
|     SubGhzRadioPreset* preset) { |     SubGhzRadioPreset* preset) { | ||||||
| @ -337,22 +337,14 @@ bool subghz_protocol_decoder_nero_sketch_serialize( | |||||||
|     return subghz_block_generic_serialize(&instance->generic, flipper_format, preset); |     return subghz_block_generic_serialize(&instance->generic, flipper_format, preset); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_protocol_decoder_nero_sketch_deserialize(void* context, FlipperFormat* flipper_format) { | SubGhzProtocolStatus | ||||||
|  |     subghz_protocol_decoder_nero_sketch_deserialize(void* context, FlipperFormat* flipper_format) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     SubGhzProtocolDecoderNeroSketch* instance = context; |     SubGhzProtocolDecoderNeroSketch* instance = context; | ||||||
|     bool ret = false; |     return subghz_block_generic_deserialize_check_count_bit( | ||||||
|     do { |         &instance->generic, | ||||||
|         if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) { |         flipper_format, | ||||||
|             break; |         subghz_protocol_nero_sketch_const.min_count_bit_for_found); | ||||||
|         } |  | ||||||
|         if(instance->generic.data_count_bit != |  | ||||||
|            subghz_protocol_nero_sketch_const.min_count_bit_for_found) { |  | ||||||
|             FURI_LOG_E(TAG, "Wrong number of bits in key"); |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|         ret = true; |  | ||||||
|     } while(false); |  | ||||||
|     return ret; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void subghz_protocol_decoder_nero_sketch_get_string(void* context, FuriString* output) { | void subghz_protocol_decoder_nero_sketch_get_string(void* context, FuriString* output) { | ||||||
|  | |||||||
Some files were not shown because too many files have changed in this diff Show More
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Skorpionm
						Skorpionm