[FL-3488] Assign tickets to all TODO items (#2988)
Co-authored-by: あく <alleteam@gmail.com>
This commit is contained in:
		
							parent
							
								
									200c44bdca
								
							
						
					
					
						commit
						e353433cd8
					
				@ -174,7 +174,7 @@ bool WIEGAND::DoWiegandConversion() {
 | 
				
			|||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                // TODO: Handle validation failure case!
 | 
					                // TODO FL-3490: Handle validation failure case!
 | 
				
			||||||
            } else if(4 == _bitCount) {
 | 
					            } else if(4 == _bitCount) {
 | 
				
			||||||
                // 4-bit Wiegand codes have no data integrity check so we just
 | 
					                // 4-bit Wiegand codes have no data integrity check so we just
 | 
				
			||||||
                // read the LOW nibble.
 | 
					                // read the LOW nibble.
 | 
				
			||||||
 | 
				
			|||||||
@ -56,7 +56,6 @@ static void subghz_test_packet_rx_callback(bool level, uint32_t duration, void*
 | 
				
			|||||||
    subghz_decoder_princeton_for_testing_parse(instance->decoder, level, duration);
 | 
					    subghz_decoder_princeton_for_testing_parse(instance->decoder, level, duration);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//todo
 | 
					 | 
				
			||||||
static void subghz_test_packet_rx_pt_callback(SubGhzDecoderPrinceton* parser, void* context) {
 | 
					static void subghz_test_packet_rx_pt_callback(SubGhzDecoderPrinceton* parser, void* context) {
 | 
				
			||||||
    UNUSED(parser);
 | 
					    UNUSED(parser);
 | 
				
			||||||
    furi_assert(context);
 | 
					    furi_assert(context);
 | 
				
			||||||
 | 
				
			|||||||
@ -26,7 +26,7 @@ void test_furi_memmgr() {
 | 
				
			|||||||
        mu_assert_int_eq(66, ((uint8_t*)ptr)[i]);
 | 
					        mu_assert_int_eq(66, ((uint8_t*)ptr)[i]);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // TODO: fix realloc to copy only old size, and write testcase that leftover of reallocated memory is zero-initialized
 | 
					    // TODO FL-3492: fix realloc to copy only old size, and write testcase that leftover of reallocated memory is zero-initialized
 | 
				
			||||||
    free(ptr);
 | 
					    free(ptr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // allocate and zero-initialize array (calloc)
 | 
					    // allocate and zero-initialize array (calloc)
 | 
				
			||||||
 | 
				
			|||||||
@ -69,7 +69,7 @@ MU_TEST(mu_test_furi_string_mem) {
 | 
				
			|||||||
    mu_check(string != NULL);
 | 
					    mu_check(string != NULL);
 | 
				
			||||||
    mu_check(!furi_string_empty(string));
 | 
					    mu_check(!furi_string_empty(string));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // TODO: how to test furi_string_reserve?
 | 
					    // TODO FL-3493: how to test furi_string_reserve?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // test furi_string_reset
 | 
					    // test furi_string_reset
 | 
				
			||||||
    furi_string_reset(string);
 | 
					    furi_string_reset(string);
 | 
				
			||||||
 | 
				
			|||||||
@ -311,7 +311,7 @@ MU_TEST(test_bit_lib_test_parity) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
MU_TEST(test_bit_lib_remove_bit_every_nth) {
 | 
					MU_TEST(test_bit_lib_remove_bit_every_nth) {
 | 
				
			||||||
    // TODO: more tests
 | 
					    // TODO FL-3494: more tests
 | 
				
			||||||
    uint8_t data_i[1] = {0b00001111};
 | 
					    uint8_t data_i[1] = {0b00001111};
 | 
				
			||||||
    uint8_t data_o[1] = {0b00011111};
 | 
					    uint8_t data_o[1] = {0b00011111};
 | 
				
			||||||
    size_t length;
 | 
					    size_t length;
 | 
				
			||||||
 | 
				
			|||||||
@ -90,7 +90,7 @@ void unit_tests_cli(Cli* cli, FuriString* args, void* context) {
 | 
				
			|||||||
    Loader* loader = furi_record_open(RECORD_LOADER);
 | 
					    Loader* loader = furi_record_open(RECORD_LOADER);
 | 
				
			||||||
    NotificationApp* notification = furi_record_open(RECORD_NOTIFICATION);
 | 
					    NotificationApp* notification = furi_record_open(RECORD_NOTIFICATION);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // TODO: lock device while test running
 | 
					    // TODO FL-3491: lock device while test running
 | 
				
			||||||
    if(loader_is_locked(loader)) {
 | 
					    if(loader_is_locked(loader)) {
 | 
				
			||||||
        printf("RPC: stop all applications to run tests\r\n");
 | 
					        printf("RPC: stop all applications to run tests\r\n");
 | 
				
			||||||
        notification_message(notification, &sequence_blink_magenta_100);
 | 
					        notification_message(notification, &sequence_blink_magenta_100);
 | 
				
			||||||
 | 
				
			|||||||
@ -333,7 +333,7 @@ bool subghz_device_cc1101_ext_rx_pipe_not_empty() {
 | 
				
			|||||||
        (CC1101_STATUS_RXBYTES) | CC1101_BURST,
 | 
					        (CC1101_STATUS_RXBYTES) | CC1101_BURST,
 | 
				
			||||||
        (uint8_t*)status);
 | 
					        (uint8_t*)status);
 | 
				
			||||||
    furi_hal_spi_release(subghz_device_cc1101_ext->spi_bus_handle);
 | 
					    furi_hal_spi_release(subghz_device_cc1101_ext->spi_bus_handle);
 | 
				
			||||||
    // TODO: you can add a buffer overflow flag if needed
 | 
					    // TODO FL-3520: you can add a buffer overflow flag if needed
 | 
				
			||||||
    if(status->NUM_RXBYTES > 0) {
 | 
					    if(status->NUM_RXBYTES > 0) {
 | 
				
			||||||
        return true;
 | 
					        return true;
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
 | 
				
			|||||||
@ -19,7 +19,7 @@ void gpio_scene_usb_uart_on_enter(void* context) {
 | 
				
			|||||||
    uint32_t prev_state = scene_manager_get_scene_state(app->scene_manager, GpioAppViewUsbUart);
 | 
					    uint32_t prev_state = scene_manager_get_scene_state(app->scene_manager, GpioAppViewUsbUart);
 | 
				
			||||||
    if(prev_state == 0) {
 | 
					    if(prev_state == 0) {
 | 
				
			||||||
        scene_usb_uart = malloc(sizeof(SceneUsbUartBridge));
 | 
					        scene_usb_uart = malloc(sizeof(SceneUsbUartBridge));
 | 
				
			||||||
        scene_usb_uart->cfg.vcp_ch = 0; // TODO: settings load
 | 
					        scene_usb_uart->cfg.vcp_ch = 0; // TODO FL-3495: settings load
 | 
				
			||||||
        scene_usb_uart->cfg.uart_ch = 0;
 | 
					        scene_usb_uart->cfg.uart_ch = 0;
 | 
				
			||||||
        scene_usb_uart->cfg.flow_pins = 0;
 | 
					        scene_usb_uart->cfg.flow_pins = 0;
 | 
				
			||||||
        scene_usb_uart->cfg.baudrate_mode = 0;
 | 
					        scene_usb_uart->cfg.baudrate_mode = 0;
 | 
				
			||||||
 | 
				
			|||||||
@ -85,7 +85,7 @@ static void infrared_cli_print_usage(void) {
 | 
				
			|||||||
    printf("\tir decode <input_file> [<output_file>]\r\n");
 | 
					    printf("\tir decode <input_file> [<output_file>]\r\n");
 | 
				
			||||||
    printf("\tir universal <remote_name> <signal_name>\r\n");
 | 
					    printf("\tir universal <remote_name> <signal_name>\r\n");
 | 
				
			||||||
    printf("\tir universal list <remote_name>\r\n");
 | 
					    printf("\tir universal list <remote_name>\r\n");
 | 
				
			||||||
    // TODO: Do not hardcode universal remote names
 | 
					    // TODO FL-3496: Do not hardcode universal remote names
 | 
				
			||||||
    printf("\tAvailable universal remotes: tv audio ac projector\r\n");
 | 
					    printf("\tAvailable universal remotes: tv audio ac projector\r\n");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -211,7 +211,7 @@ static bool infrared_cli_decode_raw_signal(
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    size_t i;
 | 
					    size_t i;
 | 
				
			||||||
    for(i = 0; i < raw_signal->timings_size; ++i) {
 | 
					    for(i = 0; i < raw_signal->timings_size; ++i) {
 | 
				
			||||||
        // TODO: Any infrared_check_decoder_ready() magic?
 | 
					        // TODO FL-3523: Any infrared_check_decoder_ready() magic?
 | 
				
			||||||
        const InfraredMessage* message = infrared_decode(decoder, level, raw_signal->timings[i]);
 | 
					        const InfraredMessage* message = infrared_decode(decoder, level, raw_signal->timings[i]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if(message) {
 | 
					        if(message) {
 | 
				
			||||||
 | 
				
			|||||||
@ -334,7 +334,6 @@ static void subghz_txrx_tx_stop(SubGhzTxRx* instance) {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
    subghz_txrx_idle(instance);
 | 
					    subghz_txrx_idle(instance);
 | 
				
			||||||
    subghz_txrx_speaker_off(instance);
 | 
					    subghz_txrx_speaker_off(instance);
 | 
				
			||||||
    //Todo: Show message
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
FlipperFormat* subghz_txrx_get_fff_data(SubGhzTxRx* instance) {
 | 
					FlipperFormat* subghz_txrx_get_fff_data(SubGhzTxRx* instance) {
 | 
				
			||||||
 | 
				
			|||||||
@ -30,7 +30,7 @@ bool subghz_txrx_gen_data_protocol(
 | 
				
			|||||||
        subghz_receiver_search_decoder_base_by_name(instance->receiver, protocol_name);
 | 
					        subghz_receiver_search_decoder_base_by_name(instance->receiver, protocol_name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if(instance->decoder_result == NULL) {
 | 
					    if(instance->decoder_result == NULL) {
 | 
				
			||||||
        //TODO: Error
 | 
					        //TODO FL-3502: Error
 | 
				
			||||||
        // furi_string_set(error_str, "Protocol not\nfound!");
 | 
					        // furi_string_set(error_str, "Protocol not\nfound!");
 | 
				
			||||||
        // scene_manager_next_scene(scene_manager, SubGhzSceneShowErrorSub);
 | 
					        // scene_manager_next_scene(scene_manager, SubGhzSceneShowErrorSub);
 | 
				
			||||||
        FURI_LOG_E(TAG, "Protocol not found!");
 | 
					        FURI_LOG_E(TAG, "Protocol not found!");
 | 
				
			||||||
 | 
				
			|||||||
@ -24,7 +24,7 @@ static void subghz_scene_radio_settings_set_device(VariableItem* item) {
 | 
				
			|||||||
    if(!subghz_txrx_radio_device_is_external_connected(
 | 
					    if(!subghz_txrx_radio_device_is_external_connected(
 | 
				
			||||||
           subghz->txrx, SUBGHZ_DEVICE_CC1101_EXT_NAME) &&
 | 
					           subghz->txrx, SUBGHZ_DEVICE_CC1101_EXT_NAME) &&
 | 
				
			||||||
       radio_device_value[index] == SubGhzRadioDeviceTypeExternalCC1101) {
 | 
					       radio_device_value[index] == SubGhzRadioDeviceTypeExternalCC1101) {
 | 
				
			||||||
        //ToDo correct if there is more than 1 module
 | 
					        // TODO FL-3501: correct if there is more than 1 module
 | 
				
			||||||
        index = 0;
 | 
					        index = 0;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    variable_item_set_current_value_text(item, radio_device_text[index]);
 | 
					    variable_item_set_current_value_text(item, radio_device_text[index]);
 | 
				
			||||||
 | 
				
			|||||||
@ -23,7 +23,7 @@ static bool subghz_scene_receiver_info_update_parser(void* context) {
 | 
				
			|||||||
    if(subghz_txrx_load_decoder_by_name_protocol(
 | 
					    if(subghz_txrx_load_decoder_by_name_protocol(
 | 
				
			||||||
           subghz->txrx,
 | 
					           subghz->txrx,
 | 
				
			||||||
           subghz_history_get_protocol_name(subghz->history, subghz->idx_menu_chosen))) {
 | 
					           subghz_history_get_protocol_name(subghz->history, subghz->idx_menu_chosen))) {
 | 
				
			||||||
        //todo we are trying to deserialize without checking for errors, since it is assumed that we just received this chignal
 | 
					        // 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_get_decoder(subghz->txrx),
 | 
					            subghz_txrx_get_decoder(subghz->txrx),
 | 
				
			||||||
            subghz_history_get_raw_data(subghz->history, subghz->idx_menu_chosen));
 | 
					            subghz_history_get_raw_data(subghz->history, subghz->idx_menu_chosen));
 | 
				
			||||||
 | 
				
			|||||||
@ -134,7 +134,7 @@ bool subghz_key_load(SubGhz* subghz, const char* file_path, bool show_dialog) {
 | 
				
			|||||||
        SubGhzSetting* setting = subghz_txrx_get_setting(subghz->txrx);
 | 
					        SubGhzSetting* setting = subghz_txrx_get_setting(subghz->txrx);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if(!strcmp(furi_string_get_cstr(temp_str), "CUSTOM")) {
 | 
					        if(!strcmp(furi_string_get_cstr(temp_str), "CUSTOM")) {
 | 
				
			||||||
            //Todo add Custom_preset_module
 | 
					            //TODO FL-3551: add Custom_preset_module
 | 
				
			||||||
            //delete preset if it already exists
 | 
					            //delete preset if it already exists
 | 
				
			||||||
            subghz_setting_delete_custom_preset(setting, furi_string_get_cstr(temp_str));
 | 
					            subghz_setting_delete_custom_preset(setting, furi_string_get_cstr(temp_str));
 | 
				
			||||||
            //load custom preset from file
 | 
					            //load custom preset from file
 | 
				
			||||||
@ -289,7 +289,7 @@ bool subghz_save_protocol_to_file(
 | 
				
			|||||||
        if(!storage_simply_remove(storage, dev_file_name)) {
 | 
					        if(!storage_simply_remove(storage, dev_file_name)) {
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        //ToDo check Write
 | 
					        //TODO FL-3552: check Write
 | 
				
			||||||
        stream_seek(flipper_format_stream, 0, StreamOffsetFromStart);
 | 
					        stream_seek(flipper_format_stream, 0, StreamOffsetFromStart);
 | 
				
			||||||
        stream_save_to_file(flipper_format_stream, storage, dev_file_name, FSOM_CREATE_ALWAYS);
 | 
					        stream_save_to_file(flipper_format_stream, storage, dev_file_name, FSOM_CREATE_ALWAYS);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -101,7 +101,7 @@ static void desktop_clock_draw_callback(Canvas* canvas, void* context) {
 | 
				
			|||||||
    char buffer[20];
 | 
					    char buffer[20];
 | 
				
			||||||
    snprintf(buffer, sizeof(buffer), "%02u:%02u", hour, desktop->time_minute);
 | 
					    snprintf(buffer, sizeof(buffer), "%02u:%02u", hour, desktop->time_minute);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // ToDo: never do that, may cause visual glitches
 | 
					    // TODO FL-3515: never do that, may cause visual glitches
 | 
				
			||||||
    view_port_set_width(
 | 
					    view_port_set_width(
 | 
				
			||||||
        desktop->clock_viewport,
 | 
					        desktop->clock_viewport,
 | 
				
			||||||
        canvas_string_width(canvas, buffer) - 1 + (desktop->time_minute % 10 == 1));
 | 
					        canvas_string_width(canvas, buffer) - 1 + (desktop->time_minute % 10 == 1));
 | 
				
			||||||
@ -126,7 +126,7 @@ static bool desktop_custom_event_callback(void* context, uint32_t event) {
 | 
				
			|||||||
        return true;
 | 
					        return true;
 | 
				
			||||||
    case DesktopGlobalAfterAppFinished:
 | 
					    case DesktopGlobalAfterAppFinished:
 | 
				
			||||||
        animation_manager_load_and_continue_animation(desktop->animation_manager);
 | 
					        animation_manager_load_and_continue_animation(desktop->animation_manager);
 | 
				
			||||||
        // TODO: Implement a message mechanism for loading settings and (optionally)
 | 
					        // TODO FL-3497: Implement a message mechanism for loading settings and (optionally)
 | 
				
			||||||
        // locking and unlocking
 | 
					        // locking and unlocking
 | 
				
			||||||
        DESKTOP_SETTINGS_LOAD(&desktop->settings);
 | 
					        DESKTOP_SETTINGS_LOAD(&desktop->settings);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -103,7 +103,6 @@ void button_panel_reserve(ButtonPanel* button_panel, size_t reserve_x, size_t re
 | 
				
			|||||||
                ButtonArray_t* array = ButtonMatrix_get(model->button_matrix, i);
 | 
					                ButtonArray_t* array = ButtonMatrix_get(model->button_matrix, i);
 | 
				
			||||||
                ButtonArray_init(*array);
 | 
					                ButtonArray_init(*array);
 | 
				
			||||||
                ButtonArray_reserve(*array, reserve_x);
 | 
					                ButtonArray_reserve(*array, reserve_x);
 | 
				
			||||||
                // TODO: do we need to clear allocated memory of ptr-s to ButtonItem ??
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            LabelList_init(model->labels);
 | 
					            LabelList_init(model->labels);
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
 | 
				
			|||||||
@ -272,7 +272,7 @@ void view_dispatcher_handle_input(ViewDispatcher* view_dispatcher, InputEvent* e
 | 
				
			|||||||
            } else if(view_dispatcher->navigation_event_callback) {
 | 
					            } else if(view_dispatcher->navigation_event_callback) {
 | 
				
			||||||
                // Dispatch navigation event
 | 
					                // Dispatch navigation event
 | 
				
			||||||
                if(!view_dispatcher->navigation_event_callback(view_dispatcher->event_context)) {
 | 
					                if(!view_dispatcher->navigation_event_callback(view_dispatcher->event_context)) {
 | 
				
			||||||
                    // TODO: should we allow view_dispatcher to stop without navigation_event_callback?
 | 
					                    // TODO FL-3514: should we allow view_dispatcher to stop without navigation_event_callback?
 | 
				
			||||||
                    view_dispatcher_stop(view_dispatcher);
 | 
					                    view_dispatcher_stop(view_dispatcher);
 | 
				
			||||||
                    return;
 | 
					                    return;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
				
			|||||||
@ -7,7 +7,7 @@
 | 
				
			|||||||
#include "gui.h"
 | 
					#include "gui.h"
 | 
				
			||||||
#include "gui_i.h"
 | 
					#include "gui_i.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// TODO add mutex to view_port ops
 | 
					// TODO FL-3498: add mutex to view_port ops
 | 
				
			||||||
 | 
					
 | 
				
			||||||
_Static_assert(ViewPortOrientationMAX == 4, "Incorrect ViewPortOrientation count");
 | 
					_Static_assert(ViewPortOrientationMAX == 4, "Incorrect ViewPortOrientation count");
 | 
				
			||||||
_Static_assert(
 | 
					_Static_assert(
 | 
				
			||||||
 | 
				
			|||||||
@ -62,7 +62,7 @@ LoaderStatus loader_start_with_gui_error(Loader* loader, const char* name, const
 | 
				
			|||||||
        dialog_message_free(message);
 | 
					        dialog_message_free(message);
 | 
				
			||||||
        furi_record_close(RECORD_DIALOGS);
 | 
					        furi_record_close(RECORD_DIALOGS);
 | 
				
			||||||
    } else if(status == LoaderStatusErrorUnknownApp || status == LoaderStatusErrorInternal) {
 | 
					    } else if(status == LoaderStatusErrorUnknownApp || status == LoaderStatusErrorInternal) {
 | 
				
			||||||
        // TODO: we have many places where we can emit a double start, ex: desktop, menu
 | 
					        // TODO FL-3522: we have many places where we can emit a double start, ex: desktop, menu
 | 
				
			||||||
        // so i prefer to not show LoaderStatusErrorAppStarted error message for now
 | 
					        // so i prefer to not show LoaderStatusErrorAppStarted error message for now
 | 
				
			||||||
        DialogsApp* dialogs = furi_record_open(RECORD_DIALOGS);
 | 
					        DialogsApp* dialogs = furi_record_open(RECORD_DIALOGS);
 | 
				
			||||||
        DialogMessage* message = dialog_message_alloc();
 | 
					        DialogMessage* message = dialog_message_alloc();
 | 
				
			||||||
 | 
				
			|||||||
@ -28,7 +28,7 @@ static void loader_cli_info(Loader* loader) {
 | 
				
			|||||||
    if(!loader_is_locked(loader)) {
 | 
					    if(!loader_is_locked(loader)) {
 | 
				
			||||||
        printf("No application is running\r\n");
 | 
					        printf("No application is running\r\n");
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        // TODO: print application name ???
 | 
					        // TODO FL-3513: print application name ???
 | 
				
			||||||
        printf("Application is running\r\n");
 | 
					        printf("Application is running\r\n");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -30,7 +30,7 @@ void power_draw_battery_callback(Canvas* canvas, void* context) {
 | 
				
			|||||||
        if(power->state == PowerStateCharging) {
 | 
					        if(power->state == PowerStateCharging) {
 | 
				
			||||||
            canvas_set_bitmap_mode(canvas, 1);
 | 
					            canvas_set_bitmap_mode(canvas, 1);
 | 
				
			||||||
            canvas_set_color(canvas, ColorWhite);
 | 
					            canvas_set_color(canvas, ColorWhite);
 | 
				
			||||||
            // TODO: replace -1 magic for uint8_t with re-framing
 | 
					            // TODO FL-3510: replace -1 magic for uint8_t with re-framing
 | 
				
			||||||
            canvas_draw_icon(canvas, 8, -1, &I_Charging_lightning_mask_9x10);
 | 
					            canvas_draw_icon(canvas, 8, -1, &I_Charging_lightning_mask_9x10);
 | 
				
			||||||
            canvas_set_color(canvas, ColorBlack);
 | 
					            canvas_set_color(canvas, ColorBlack);
 | 
				
			||||||
            canvas_draw_icon(canvas, 8, -1, &I_Charging_lightning_9x10);
 | 
					            canvas_draw_icon(canvas, 8, -1, &I_Charging_lightning_9x10);
 | 
				
			||||||
 | 
				
			|||||||
@ -279,7 +279,7 @@ static void rpc_system_gui_start_virtual_display_process(const PB_Main* request,
 | 
				
			|||||||
        return;
 | 
					        return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // TODO: consider refactoring
 | 
					    // TODO FL-3511: consider refactoring
 | 
				
			||||||
    // Using display framebuffer size as an XBM buffer size is like comparing apples and oranges
 | 
					    // Using display framebuffer size as an XBM buffer size is like comparing apples and oranges
 | 
				
			||||||
    // Glad they both are 1024 for now
 | 
					    // Glad they both are 1024 for now
 | 
				
			||||||
    size_t buffer_size = canvas_get_buffer_size(rpc_gui->gui->canvas);
 | 
					    size_t buffer_size = canvas_get_buffer_size(rpc_gui->gui->canvas);
 | 
				
			||||||
 | 
				
			|||||||
@ -399,7 +399,7 @@ static FS_Error storage_process_common_fs_info(
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/****************** Raw SD API ******************/
 | 
					/****************** Raw SD API ******************/
 | 
				
			||||||
// TODO think about implementing a custom storage API to split that kind of api linkage
 | 
					// TODO FL-3521: think about implementing a custom storage API to split that kind of api linkage
 | 
				
			||||||
#include "storages/storage_ext.h"
 | 
					#include "storages/storage_ext.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static FS_Error storage_process_sd_format(Storage* app) {
 | 
					static FS_Error storage_process_sd_format(Storage* app) {
 | 
				
			||||||
 | 
				
			|||||||
@ -100,7 +100,7 @@ FS_Error sd_unmount_card(StorageData* storage) {
 | 
				
			|||||||
    storage->status = StorageStatusNotReady;
 | 
					    storage->status = StorageStatusNotReady;
 | 
				
			||||||
    error = FR_DISK_ERR;
 | 
					    error = FR_DISK_ERR;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // TODO do i need to close the files?
 | 
					    // TODO FL-3522: do i need to close the files?
 | 
				
			||||||
    f_mount(0, sd_data->path, 0);
 | 
					    f_mount(0, sd_data->path, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return storage_ext_parse_error(error);
 | 
					    return storage_ext_parse_error(error);
 | 
				
			||||||
 | 
				
			|||||||
@ -80,7 +80,7 @@ bool updater_scene_main_on_event(void* context, SceneManagerEvent event) {
 | 
				
			|||||||
            break;
 | 
					            break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        case UpdaterCustomEventSdUnmounted:
 | 
					        case UpdaterCustomEventSdUnmounted:
 | 
				
			||||||
            // TODO: error out, stop worker (it's probably dead actually)
 | 
					            // TODO FL-3499: error out, stop worker (it's probably dead actually)
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
        default:
 | 
					        default:
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
 | 
				
			|||||||
@ -225,7 +225,7 @@ void furi_hal_resources_init() {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int32_t furi_hal_resources_get_ext_pin_number(const GpioPin* gpio) {
 | 
					int32_t furi_hal_resources_get_ext_pin_number(const GpioPin* gpio) {
 | 
				
			||||||
    // TODO: describe second ROW
 | 
					    // TODO FL-3500: describe second ROW
 | 
				
			||||||
    if(gpio == &gpio_ext_pa7)
 | 
					    if(gpio == &gpio_ext_pa7)
 | 
				
			||||||
        return 2;
 | 
					        return 2;
 | 
				
			||||||
    else if(gpio == &gpio_ext_pa6)
 | 
					    else if(gpio == &gpio_ext_pa6)
 | 
				
			||||||
 | 
				
			|||||||
@ -222,7 +222,7 @@ bool ble_glue_wait_for_c2_start(int32_t timeout) {
 | 
				
			|||||||
    bool started = false;
 | 
					    bool started = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    do {
 | 
					    do {
 | 
				
			||||||
        // TODO: use mutex?
 | 
					        // TODO FL-3505: use mutex?
 | 
				
			||||||
        started = ble_glue->status == BleGlueStatusC2Started;
 | 
					        started = ble_glue->status == BleGlueStatusC2Started;
 | 
				
			||||||
        if(!started) {
 | 
					        if(!started) {
 | 
				
			||||||
            timeout--;
 | 
					            timeout--;
 | 
				
			||||||
 | 
				
			|||||||
@ -14,7 +14,7 @@ void flipper_gatt_characteristic_init(
 | 
				
			|||||||
    furi_assert(char_instance);
 | 
					    furi_assert(char_instance);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Copy the descriptor to the instance, since it may point to stack memory
 | 
					    // Copy the descriptor to the instance, since it may point to stack memory
 | 
				
			||||||
    // TODO: only copy if really comes from stack
 | 
					    // TODO FL-3506: only copy if really comes from stack
 | 
				
			||||||
    char_instance->characteristic = malloc(sizeof(FlipperGattCharacteristicParams));
 | 
					    char_instance->characteristic = malloc(sizeof(FlipperGattCharacteristicParams));
 | 
				
			||||||
    memcpy(
 | 
					    memcpy(
 | 
				
			||||||
        (void*)char_instance->characteristic,
 | 
					        (void*)char_instance->characteristic,
 | 
				
			||||||
 | 
				
			|||||||
@ -283,7 +283,7 @@ static SdSpiCmdAnswer
 | 
				
			|||||||
        cmd_answer.r1 = sd_spi_wait_for_data_and_read();
 | 
					        cmd_answer.r1 = sd_spi_wait_for_data_and_read();
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
    case SdSpiCmdAnswerTypeR1B:
 | 
					    case SdSpiCmdAnswerTypeR1B:
 | 
				
			||||||
        // TODO: can be wrong, at least for SD_CMD12_STOP_TRANSMISSION you need to purge one byte before reading R1
 | 
					        // TODO FL-3507: can be wrong, at least for SD_CMD12_STOP_TRANSMISSION you need to purge one byte before reading R1
 | 
				
			||||||
        cmd_answer.r1 = sd_spi_wait_for_data_and_read();
 | 
					        cmd_answer.r1 = sd_spi_wait_for_data_and_read();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // In general this shenenigans seems suspicious, please double check SD specs if you are using SdSpiCmdAnswerTypeR1B
 | 
					        // In general this shenenigans seems suspicious, please double check SD specs if you are using SdSpiCmdAnswerTypeR1B
 | 
				
			||||||
@ -322,7 +322,7 @@ static SdSpiDataResponce sd_spi_get_data_response(uint32_t timeout_ms) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    switch(responce & 0x1F) {
 | 
					    switch(responce & 0x1F) {
 | 
				
			||||||
    case SdSpiDataResponceOK:
 | 
					    case SdSpiDataResponceOK:
 | 
				
			||||||
        // TODO: check timings
 | 
					        // TODO FL-3508: check timings
 | 
				
			||||||
        sd_spi_deselect_card();
 | 
					        sd_spi_deselect_card();
 | 
				
			||||||
        sd_spi_select_card();
 | 
					        sd_spi_select_card();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -684,7 +684,7 @@ static SdSpiStatus sd_spi_cmd_write_blocks(
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Send dummy byte for NWR timing : one byte between CMD_WRITE and TOKEN
 | 
					        // Send dummy byte for NWR timing : one byte between CMD_WRITE and TOKEN
 | 
				
			||||||
        // TODO: check bytes count
 | 
					        // TODO FL-3509: check bytes count
 | 
				
			||||||
        sd_spi_write_byte(SD_DUMMY_BYTE);
 | 
					        sd_spi_write_byte(SD_DUMMY_BYTE);
 | 
				
			||||||
        sd_spi_write_byte(SD_DUMMY_BYTE);
 | 
					        sd_spi_write_byte(SD_DUMMY_BYTE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -402,7 +402,6 @@ void furi_hal_nfc_ll_txrx_on();
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
void furi_hal_nfc_ll_txrx_off();
 | 
					void furi_hal_nfc_ll_txrx_off();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// TODO rework all pollers with furi_hal_nfc_ll_txrx_bits
 | 
					 | 
				
			||||||
FuriHalNfcReturn furi_hal_nfc_ll_txrx(
 | 
					FuriHalNfcReturn furi_hal_nfc_ll_txrx(
 | 
				
			||||||
    uint8_t* txBuf,
 | 
					    uint8_t* txBuf,
 | 
				
			||||||
    uint16_t txBufLen,
 | 
					    uint16_t txBufLen,
 | 
				
			||||||
 | 
				
			|||||||
@ -207,7 +207,7 @@ bool furi_hal_subghz_rx_pipe_not_empty() {
 | 
				
			|||||||
    cc1101_read_reg(
 | 
					    cc1101_read_reg(
 | 
				
			||||||
        &furi_hal_spi_bus_handle_subghz, (CC1101_STATUS_RXBYTES) | CC1101_BURST, (uint8_t*)status);
 | 
					        &furi_hal_spi_bus_handle_subghz, (CC1101_STATUS_RXBYTES) | CC1101_BURST, (uint8_t*)status);
 | 
				
			||||||
    furi_hal_spi_release(&furi_hal_spi_bus_handle_subghz);
 | 
					    furi_hal_spi_release(&furi_hal_spi_bus_handle_subghz);
 | 
				
			||||||
    // TODO: you can add a buffer overflow flag if needed
 | 
					    // TODO FL-3503: you can add a buffer overflow flag if needed
 | 
				
			||||||
    if(status->NUM_RXBYTES > 0) {
 | 
					    if(status->NUM_RXBYTES > 0) {
 | 
				
			||||||
        return true;
 | 
					        return true;
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
 | 
				
			|||||||
@ -38,7 +38,7 @@ static bool flipper_update_mount_sd() {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static bool flipper_update_init() {
 | 
					static bool flipper_update_init() {
 | 
				
			||||||
    // TODO: Configure missing peripherals properly
 | 
					    // TODO FL-3504: Configure missing peripherals properly
 | 
				
			||||||
    furi_hal_bus_enable(FuriHalBusHSEM);
 | 
					    furi_hal_bus_enable(FuriHalBusHSEM);
 | 
				
			||||||
    furi_hal_bus_enable(FuriHalBusIPCC);
 | 
					    furi_hal_bus_enable(FuriHalBusIPCC);
 | 
				
			||||||
    furi_hal_bus_enable(FuriHalBusRNG);
 | 
					    furi_hal_bus_enable(FuriHalBusRNG);
 | 
				
			||||||
 | 
				
			|||||||
@ -23,7 +23,7 @@ env.Append(
 | 
				
			|||||||
env.Append(
 | 
					env.Append(
 | 
				
			||||||
    CPPPATH=[
 | 
					    CPPPATH=[
 | 
				
			||||||
        "#/",
 | 
					        "#/",
 | 
				
			||||||
        "#/lib",  # TODO: remove!
 | 
					        "#/lib",  # TODO FL-3553: remove!
 | 
				
			||||||
        "#/lib/mlib",
 | 
					        "#/lib/mlib",
 | 
				
			||||||
        # Ugly hack
 | 
					        # Ugly hack
 | 
				
			||||||
        Dir("../assets/compiled"),
 | 
					        Dir("../assets/compiled"),
 | 
				
			||||||
 | 
				
			|||||||
@ -69,7 +69,7 @@ static bool bq27220_parameter_check(
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            uint8_t checksum = bq27220_get_checksum(buffer, size + 2);
 | 
					            uint8_t checksum = bq27220_get_checksum(buffer, size + 2);
 | 
				
			||||||
            buffer[0] = checksum;
 | 
					            buffer[0] = checksum;
 | 
				
			||||||
            buffer[1] = 4 + size; // TODO: why 4?
 | 
					            buffer[1] = 4 + size; // TODO FL-3519: why 4?
 | 
				
			||||||
            if(!furi_hal_i2c_write_mem(
 | 
					            if(!furi_hal_i2c_write_mem(
 | 
				
			||||||
                   handle, BQ27220_ADDRESS, CommandMACDataSum, buffer, 2, BQ27220_I2C_TIMEOUT)) {
 | 
					                   handle, BQ27220_ADDRESS, CommandMACDataSum, buffer, 2, BQ27220_I2C_TIMEOUT)) {
 | 
				
			||||||
                FURI_LOG_I(TAG, "CRC write failed");
 | 
					                FURI_LOG_I(TAG, "CRC write failed");
 | 
				
			||||||
 | 
				
			|||||||
@ -16,7 +16,7 @@ extern "C" {
 | 
				
			|||||||
#define FAP_MANIFEST_SUPPORTED_VERSION 1
 | 
					#define FAP_MANIFEST_SUPPORTED_VERSION 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define FAP_MANIFEST_MAX_APP_NAME_LENGTH 32
 | 
					#define FAP_MANIFEST_MAX_APP_NAME_LENGTH 32
 | 
				
			||||||
#define FAP_MANIFEST_MAX_ICON_SIZE 32 // TODO: reduce size?
 | 
					#define FAP_MANIFEST_MAX_ICON_SIZE 32 // TODO FL-3524: reduce size?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#pragma pack(push, 1)
 | 
					#pragma pack(push, 1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -507,7 +507,7 @@ static SectionType elf_preload_section(
 | 
				
			|||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // ignore .ARM and .rel.ARM sections
 | 
					    // ignore .ARM and .rel.ARM sections
 | 
				
			||||||
    // TODO: how to do it not by name?
 | 
					    // TODO FL-3525: how to do it not by name?
 | 
				
			||||||
    // .ARM: type 0x70000001, flags SHF_ALLOC | SHF_LINK_ORDER
 | 
					    // .ARM: type 0x70000001, flags SHF_ALLOC | SHF_LINK_ORDER
 | 
				
			||||||
    // .rel.ARM: type 0x9, flags SHT_REL
 | 
					    // .rel.ARM: type 0x9, flags SHT_REL
 | 
				
			||||||
    if(str_prefix(name, ".ARM.") || str_prefix(name, ".rel.ARM.") ||
 | 
					    if(str_prefix(name, ".ARM.") || str_prefix(name, ".rel.ARM.") ||
 | 
				
			||||||
@ -792,7 +792,7 @@ bool elf_file_load_section_table(ELFFile* elf) {
 | 
				
			|||||||
    FuriString* name = furi_string_alloc();
 | 
					    FuriString* name = furi_string_alloc();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    FURI_LOG_D(TAG, "Scan ELF indexs...");
 | 
					    FURI_LOG_D(TAG, "Scan ELF indexs...");
 | 
				
			||||||
    // TODO: why we start from 1?
 | 
					    // TODO FL-3526: why we start from 1?
 | 
				
			||||||
    for(size_t section_idx = 1; section_idx < elf->sections_count; section_idx++) {
 | 
					    for(size_t section_idx = 1; section_idx < elf->sections_count; section_idx++) {
 | 
				
			||||||
        Elf32_Shdr section_header;
 | 
					        Elf32_Shdr section_header;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -828,7 +828,7 @@ ElfProcessSectionResult elf_process_section(
 | 
				
			|||||||
    Elf32_Shdr section_header;
 | 
					    Elf32_Shdr section_header;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // find section
 | 
					    // find section
 | 
				
			||||||
    // TODO: why we start from 1?
 | 
					    // TODO FL-3526: why we start from 1?
 | 
				
			||||||
    for(size_t section_idx = 1; section_idx < elf->sections_count; section_idx++) {
 | 
					    for(size_t section_idx = 1; section_idx < elf->sections_count; section_idx++) {
 | 
				
			||||||
        furi_string_reset(section_name);
 | 
					        furi_string_reset(section_name);
 | 
				
			||||||
        if(!elf_read_section(elf, section_idx, §ion_header, section_name)) {
 | 
					        if(!elf_read_section(elf, section_idx, §ion_header, section_name)) {
 | 
				
			||||||
 | 
				
			|||||||
@ -127,7 +127,7 @@ void ibutton_worker_mode_write_blank_tick(iButtonWorker* worker) {
 | 
				
			|||||||
    furi_assert(worker->key);
 | 
					    furi_assert(worker->key);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const bool success = ibutton_protocols_write_blank(worker->protocols, worker->key);
 | 
					    const bool success = ibutton_protocols_write_blank(worker->protocols, worker->key);
 | 
				
			||||||
    // TODO: pass a proper result to the callback
 | 
					    // TODO FL-3527: pass a proper result to the callback
 | 
				
			||||||
    const iButtonWorkerWriteResult result = success ? iButtonWorkerWriteOK :
 | 
					    const iButtonWorkerWriteResult result = success ? iButtonWorkerWriteOK :
 | 
				
			||||||
                                                      iButtonWorkerWriteNoDetect;
 | 
					                                                      iButtonWorkerWriteNoDetect;
 | 
				
			||||||
    if(worker->write_cb != NULL) {
 | 
					    if(worker->write_cb != NULL) {
 | 
				
			||||||
@ -139,7 +139,7 @@ void ibutton_worker_mode_write_copy_tick(iButtonWorker* worker) {
 | 
				
			|||||||
    furi_assert(worker->key);
 | 
					    furi_assert(worker->key);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const bool success = ibutton_protocols_write_copy(worker->protocols, worker->key);
 | 
					    const bool success = ibutton_protocols_write_copy(worker->protocols, worker->key);
 | 
				
			||||||
    // TODO: pass a proper result to the callback
 | 
					    // TODO FL-3527: pass a proper result to the callback
 | 
				
			||||||
    const iButtonWorkerWriteResult result = success ? iButtonWorkerWriteOK :
 | 
					    const iButtonWorkerWriteResult result = success ? iButtonWorkerWriteOK :
 | 
				
			||||||
                                                      iButtonWorkerWriteNoDetect;
 | 
					                                                      iButtonWorkerWriteNoDetect;
 | 
				
			||||||
    if(worker->write_cb != NULL) {
 | 
					    if(worker->write_cb != NULL) {
 | 
				
			||||||
 | 
				
			|||||||
@ -62,7 +62,7 @@ bool rw1990_write_v1(OneWireHost* host, const uint8_t* data, size_t data_size) {
 | 
				
			|||||||
    onewire_host_write_bit(host, true);
 | 
					    onewire_host_write_bit(host, true);
 | 
				
			||||||
    furi_delay_us(10000);
 | 
					    furi_delay_us(10000);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // TODO: Better error handling
 | 
					    // TODO FL-3528: Better error handling
 | 
				
			||||||
    return rw1990_read_and_compare(host, data, data_size);
 | 
					    return rw1990_read_and_compare(host, data, data_size);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -90,6 +90,6 @@ bool rw1990_write_v2(OneWireHost* host, const uint8_t* data, size_t data_size) {
 | 
				
			|||||||
    onewire_host_write_bit(host, false);
 | 
					    onewire_host_write_bit(host, false);
 | 
				
			||||||
    furi_delay_us(10000);
 | 
					    furi_delay_us(10000);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // TODO: Better error handling
 | 
					    // TODO Fl-3528: Better error handling
 | 
				
			||||||
    return rw1990_read_and_compare(host, data, data_size);
 | 
					    return rw1990_read_and_compare(host, data, data_size);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -21,7 +21,7 @@ bool tm2004_write(OneWireHost* host, const uint8_t* data, size_t data_size) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        onewire_host_write(host, data[i]);
 | 
					        onewire_host_write(host, data[i]);
 | 
				
			||||||
        answer = onewire_host_read(host);
 | 
					        answer = onewire_host_read(host);
 | 
				
			||||||
        // TODO: check answer CRC
 | 
					        // TODO FL-3529: check answer CRC
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // pulse indicating that data is correct
 | 
					        // pulse indicating that data is correct
 | 
				
			||||||
        furi_delay_us(600);
 | 
					        furi_delay_us(600);
 | 
				
			||||||
@ -37,6 +37,6 @@ bool tm2004_write(OneWireHost* host, const uint8_t* data, size_t data_size) {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // TODO: Better error handling
 | 
					    // TODO FL-3529: Better error handling
 | 
				
			||||||
    return i == data_size;
 | 
					    return i == data_size;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -149,7 +149,7 @@ bool dallas_common_emulate_search_rom(OneWireSlave* bus, const DallasCommonRomDa
 | 
				
			|||||||
            if(!onewire_slave_send_bit(bus, !bit)) return false;
 | 
					            if(!onewire_slave_send_bit(bus, !bit)) return false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            onewire_slave_receive_bit(bus);
 | 
					            onewire_slave_receive_bit(bus);
 | 
				
			||||||
            // TODO: check for errors and return if any
 | 
					            // TODO FL-3530: check for errors and return if any
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -53,7 +53,7 @@ const iButtonProtocolDallasBase ibutton_protocol_ds1971 = {
 | 
				
			|||||||
    .name = DS1971_FAMILY_NAME,
 | 
					    .name = DS1971_FAMILY_NAME,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    .read = dallas_ds1971_read,
 | 
					    .read = dallas_ds1971_read,
 | 
				
			||||||
    .write_blank = NULL, // TODO: Implement writing to blank
 | 
					    .write_blank = NULL, // TODO FL-3531: Implement writing to blank
 | 
				
			||||||
    .write_copy = dallas_ds1971_write_copy,
 | 
					    .write_copy = dallas_ds1971_write_copy,
 | 
				
			||||||
    .emulate = dallas_ds1971_emulate,
 | 
					    .emulate = dallas_ds1971_emulate,
 | 
				
			||||||
    .save = dallas_ds1971_save,
 | 
					    .save = dallas_ds1971_save,
 | 
				
			||||||
 | 
				
			|||||||
@ -73,7 +73,7 @@ bool dallas_ds1992_read(OneWireHost* host, iButtonProtocolData* protocol_data) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
bool dallas_ds1992_write_blank(OneWireHost* host, iButtonProtocolData* protocol_data) {
 | 
					bool dallas_ds1992_write_blank(OneWireHost* host, iButtonProtocolData* protocol_data) {
 | 
				
			||||||
    DS1992ProtocolData* data = protocol_data;
 | 
					    DS1992ProtocolData* data = protocol_data;
 | 
				
			||||||
    // TODO: Make this work, currently broken
 | 
					    // TODO FL-3532: Make this work, currently broken
 | 
				
			||||||
    return tm2004_write(host, (uint8_t*)data, sizeof(DallasCommonRomData) + DS1992_SRAM_DATA_SIZE);
 | 
					    return tm2004_write(host, (uint8_t*)data, sizeof(DallasCommonRomData) + DS1992_SRAM_DATA_SIZE);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -159,7 +159,7 @@ static bool dallas_ds1996_command_callback(uint8_t command, void* context) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    case DALLAS_COMMON_CMD_MATCH_ROM:
 | 
					    case DALLAS_COMMON_CMD_MATCH_ROM:
 | 
				
			||||||
    case DALLAS_COMMON_CMD_OVERDRIVE_MATCH_ROM:
 | 
					    case DALLAS_COMMON_CMD_OVERDRIVE_MATCH_ROM:
 | 
				
			||||||
        /* TODO: Match ROM command support */
 | 
					        /* TODO FL-3533: Match ROM command support */
 | 
				
			||||||
    default:
 | 
					    default:
 | 
				
			||||||
        return false;
 | 
					        return false;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
@ -17,13 +17,13 @@ bool lfrfid_dict_file_save(ProtocolDict* dict, ProtocolId protocol, const char*
 | 
				
			|||||||
        if(!flipper_format_file_open_always(file, filename)) break;
 | 
					        if(!flipper_format_file_open_always(file, filename)) break;
 | 
				
			||||||
        if(!flipper_format_write_header_cstr(file, LFRFID_DICT_FILETYPE, 1)) break;
 | 
					        if(!flipper_format_write_header_cstr(file, LFRFID_DICT_FILETYPE, 1)) break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // TODO: write comment about protocol types into file
 | 
					        // TODO FL-3517: write comment about protocol types into file
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if(!flipper_format_write_string_cstr(
 | 
					        if(!flipper_format_write_string_cstr(
 | 
				
			||||||
               file, "Key type", protocol_dict_get_name(dict, protocol)))
 | 
					               file, "Key type", protocol_dict_get_name(dict, protocol)))
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // TODO: write comment about protocol sizes into file
 | 
					        // TODO FL-3517: write comment about protocol sizes into file
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        protocol_dict_get_data(dict, protocol, data, data_size);
 | 
					        protocol_dict_get_data(dict, protocol, data, data_size);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -26,8 +26,8 @@ typedef enum {
 | 
				
			|||||||
} LFRFIDWorkerReadType;
 | 
					} LFRFIDWorkerReadType;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef enum {
 | 
					typedef enum {
 | 
				
			||||||
    LFRFIDWorkerReadSenseStart, // TODO: not implemented
 | 
					    LFRFIDWorkerReadSenseStart, // TODO FL-3516: not implemented
 | 
				
			||||||
    LFRFIDWorkerReadSenseEnd, // TODO: not implemented
 | 
					    LFRFIDWorkerReadSenseEnd, // TODO FL-3516: not implemented
 | 
				
			||||||
    LFRFIDWorkerReadSenseCardStart,
 | 
					    LFRFIDWorkerReadSenseCardStart,
 | 
				
			||||||
    LFRFIDWorkerReadSenseCardEnd,
 | 
					    LFRFIDWorkerReadSenseCardEnd,
 | 
				
			||||||
    LFRFIDWorkerReadStartASK,
 | 
					    LFRFIDWorkerReadStartASK,
 | 
				
			||||||
 | 
				
			|||||||
@ -193,7 +193,7 @@ bool protocol_hid_ex_generic_write_data(ProtocolHIDEx* protocol, void* data) {
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void protocol_hid_ex_generic_render_data(ProtocolHIDEx* protocol, FuriString* result) {
 | 
					void protocol_hid_ex_generic_render_data(ProtocolHIDEx* protocol, FuriString* result) {
 | 
				
			||||||
    // TODO: parser and render functions
 | 
					    // TODO FL-3518: parser and render functions
 | 
				
			||||||
    UNUSED(protocol);
 | 
					    UNUSED(protocol);
 | 
				
			||||||
    furi_string_printf(result, "Generic HID Extended\r\nData: Unknown");
 | 
					    furi_string_printf(result, "Generic HID Extended\r\nData: Unknown");
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
				
			|||||||
@ -38,7 +38,7 @@ uint8_t bit_lib_get_bits(const uint8_t* data, size_t position, uint8_t length) {
 | 
				
			|||||||
    if(shift == 0) {
 | 
					    if(shift == 0) {
 | 
				
			||||||
        return data[position / 8] >> (8 - length);
 | 
					        return data[position / 8] >> (8 - length);
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        // TODO fix read out of bounds
 | 
					        // TODO FL-3534: fix read out of bounds
 | 
				
			||||||
        uint8_t value = (data[position / 8] << (shift));
 | 
					        uint8_t value = (data[position / 8] << (shift));
 | 
				
			||||||
        value |= data[position / 8 + 1] >> (8 - shift);
 | 
					        value |= data[position / 8 + 1] >> (8 - shift);
 | 
				
			||||||
        value = value >> (8 - length);
 | 
					        value = value >> (8 - length);
 | 
				
			||||||
 | 
				
			|||||||
@ -29,7 +29,7 @@ ReturnCode nfcv_inventory(uint8_t* uid) {
 | 
				
			|||||||
    ReturnCode ret = ERR_NONE;
 | 
					    ReturnCode ret = ERR_NONE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for(int tries = 0; tries < NFCV_COMMAND_RETRIES; tries++) {
 | 
					    for(int tries = 0; tries < NFCV_COMMAND_RETRIES; tries++) {
 | 
				
			||||||
        /* TODO: needs proper abstraction via fury_hal(_ll)_* */
 | 
					        /* TODO: needs proper abstraction via furi_hal(_ll)_* */
 | 
				
			||||||
        ret = rfalNfcvPollerInventory(RFAL_NFCV_NUM_SLOTS_1, 0, NULL, &res, &received);
 | 
					        ret = rfalNfcvPollerInventory(RFAL_NFCV_NUM_SLOTS_1, 0, NULL, &res, &received);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if(ret == ERR_NONE) {
 | 
					        if(ret == ERR_NONE) {
 | 
				
			||||||
@ -89,7 +89,7 @@ ReturnCode nfcv_read_sysinfo(FuriHalNfcDevData* nfc_data, NfcVData* nfcv_data) {
 | 
				
			|||||||
    FURI_LOG_D(TAG, "Read SYSTEM INFORMATION...");
 | 
					    FURI_LOG_D(TAG, "Read SYSTEM INFORMATION...");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for(int tries = 0; tries < NFCV_COMMAND_RETRIES; tries++) {
 | 
					    for(int tries = 0; tries < NFCV_COMMAND_RETRIES; tries++) {
 | 
				
			||||||
        /* TODO: needs proper abstraction via fury_hal(_ll)_* */
 | 
					        /* TODO: needs proper abstraction via furi_hal(_ll)_* */
 | 
				
			||||||
        ret = rfalNfcvPollerGetSystemInformation(
 | 
					        ret = rfalNfcvPollerGetSystemInformation(
 | 
				
			||||||
            RFAL_NFCV_REQ_FLAG_DEFAULT, NULL, rxBuf, sizeof(rxBuf), &received);
 | 
					            RFAL_NFCV_REQ_FLAG_DEFAULT, NULL, rxBuf, sizeof(rxBuf), &received);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -59,7 +59,6 @@ int __wrap_fflush(FILE* stream) {
 | 
				
			|||||||
__attribute__((__noreturn__)) void __wrap___assert(const char* file, int line, const char* e) {
 | 
					__attribute__((__noreturn__)) void __wrap___assert(const char* file, int line, const char* e) {
 | 
				
			||||||
    UNUSED(file);
 | 
					    UNUSED(file);
 | 
				
			||||||
    UNUSED(line);
 | 
					    UNUSED(line);
 | 
				
			||||||
    // TODO: message file and line number
 | 
					 | 
				
			||||||
    furi_crash(e);
 | 
					    furi_crash(e);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -68,6 +67,5 @@ __attribute__((__noreturn__)) void
 | 
				
			|||||||
    UNUSED(file);
 | 
					    UNUSED(file);
 | 
				
			||||||
    UNUSED(line);
 | 
					    UNUSED(line);
 | 
				
			||||||
    UNUSED(func);
 | 
					    UNUSED(func);
 | 
				
			||||||
    // TODO: message file and line number
 | 
					 | 
				
			||||||
    furi_crash(e);
 | 
					    furi_crash(e);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -22,7 +22,7 @@ void subghz_device_registry_init(void) {
 | 
				
			|||||||
        SUBGHZ_RADIO_DEVICE_PLUGIN_API_VERSION,
 | 
					        SUBGHZ_RADIO_DEVICE_PLUGIN_API_VERSION,
 | 
				
			||||||
        firmware_api_interface);
 | 
					        firmware_api_interface);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    //ToDo: fix path to plugins
 | 
					    //TODO FL-3556: fix path to plugins
 | 
				
			||||||
    if(plugin_manager_load_all(subghz_device->manager, "/any/apps_data/subghz/plugins") !=
 | 
					    if(plugin_manager_load_all(subghz_device->manager, "/any/apps_data/subghz/plugins") !=
 | 
				
			||||||
       //if(plugin_manager_load_all(subghz_device->manager, APP_DATA_PATH("plugins")) !=
 | 
					       //if(plugin_manager_load_all(subghz_device->manager, APP_DATA_PATH("plugins")) !=
 | 
				
			||||||
       PluginManagerErrorNone) {
 | 
					       PluginManagerErrorNone) {
 | 
				
			||||||
 | 
				
			|||||||
@ -744,7 +744,7 @@ static bool
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
                            bin_raw_debug("\r\n\r\n");
 | 
					                            bin_raw_debug("\r\n\r\n");
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
                            //todo can be optimized
 | 
					                            //TODO FL-3557: can be optimized
 | 
				
			||||||
                            BinRAW_Markup markup_temp[BIN_RAW_MAX_MARKUP_COUNT];
 | 
					                            BinRAW_Markup markup_temp[BIN_RAW_MAX_MARKUP_COUNT];
 | 
				
			||||||
                            memcpy(
 | 
					                            memcpy(
 | 
				
			||||||
                                markup_temp,
 | 
					                                markup_temp,
 | 
				
			||||||
@ -770,7 +770,7 @@ static bool
 | 
				
			|||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        //todo can be optimized
 | 
					        //TODO FL-3557: can be optimized
 | 
				
			||||||
        if(bin_raw_type == BinRAWTypeGap) {
 | 
					        if(bin_raw_type == BinRAWTypeGap) {
 | 
				
			||||||
            if(data_temp != 0) { //there are sequences with the same number of bits
 | 
					            if(data_temp != 0) { //there are sequences with the same number of bits
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -122,7 +122,7 @@ static bool subghz_protocol_keeloq_gen_data(SubGhzProtocolEncoderKeeloq* instanc
 | 
				
			|||||||
    uint32_t fix = (uint32_t)btn << 28 | instance->generic.serial;
 | 
					    uint32_t fix = (uint32_t)btn << 28 | instance->generic.serial;
 | 
				
			||||||
    uint32_t decrypt = (uint32_t)btn << 28 |
 | 
					    uint32_t decrypt = (uint32_t)btn << 28 |
 | 
				
			||||||
                       (instance->generic.serial & 0x3FF)
 | 
					                       (instance->generic.serial & 0x3FF)
 | 
				
			||||||
                           << 16 | //ToDo in some protocols the discriminator is 0
 | 
					                           << 16 | //TODO FL-3558: in some protocols the discriminator is 0
 | 
				
			||||||
                       instance->generic.cnt;
 | 
					                       instance->generic.cnt;
 | 
				
			||||||
    uint32_t hop = 0;
 | 
					    uint32_t hop = 0;
 | 
				
			||||||
    uint64_t man = 0;
 | 
					    uint64_t man = 0;
 | 
				
			||||||
@ -149,7 +149,7 @@ static bool subghz_protocol_keeloq_gen_data(SubGhzProtocolEncoderKeeloq* instanc
 | 
				
			|||||||
                    hop = subghz_protocol_keeloq_common_encrypt(decrypt, man);
 | 
					                    hop = subghz_protocol_keeloq_common_encrypt(decrypt, man);
 | 
				
			||||||
                    break;
 | 
					                    break;
 | 
				
			||||||
                case KEELOQ_LEARNING_UNKNOWN:
 | 
					                case KEELOQ_LEARNING_UNKNOWN:
 | 
				
			||||||
                    hop = 0; //todo
 | 
					                    hop = 0; //TODO FL-3559
 | 
				
			||||||
                    break;
 | 
					                    break;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                break;
 | 
					                break;
 | 
				
			||||||
@ -200,7 +200,7 @@ static bool
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    //gen new key
 | 
					    //gen new key
 | 
				
			||||||
    if(subghz_protocol_keeloq_gen_data(instance, btn)) {
 | 
					    if(subghz_protocol_keeloq_gen_data(instance, btn)) {
 | 
				
			||||||
        //ToDo if you need to add a callback to automatically update the data on the display
 | 
					        //TODO FL-3560: if you need to add a callback to automatically update the data on the display
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        return false;
 | 
					        return false;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
@ -265,7 +265,7 @@ SubGhzProtocolStatus
 | 
				
			|||||||
    furi_assert(context);
 | 
					    furi_assert(context);
 | 
				
			||||||
    UNUSED(context);
 | 
					    UNUSED(context);
 | 
				
			||||||
    UNUSED(flipper_format);
 | 
					    UNUSED(flipper_format);
 | 
				
			||||||
    //ToDo stub, for backwards compatibility
 | 
					    // stub, for backwards compatibility
 | 
				
			||||||
    return SubGhzProtocolStatusOk;
 | 
					    return SubGhzProtocolStatusOk;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -273,7 +273,6 @@ void subghz_protocol_decoder_raw_get_string(void* context, FuriString* output) {
 | 
				
			|||||||
    furi_assert(context);
 | 
					    furi_assert(context);
 | 
				
			||||||
    //SubGhzProtocolDecoderRAW* instance = context;
 | 
					    //SubGhzProtocolDecoderRAW* instance = context;
 | 
				
			||||||
    UNUSED(context);
 | 
					    UNUSED(context);
 | 
				
			||||||
    //ToDo no use
 | 
					 | 
				
			||||||
    furi_string_cat_printf(output, "RAW Date");
 | 
					    furi_string_cat_printf(output, "RAW Date");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -380,7 +380,7 @@ static void subghz_protocol_secplus_v2_encode(SubGhzProtocolEncoderSecPlus_v2* i
 | 
				
			|||||||
    uint8_t roll_2[9] = {0};
 | 
					    uint8_t roll_2[9] = {0};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    instance->generic.cnt++;
 | 
					    instance->generic.cnt++;
 | 
				
			||||||
    //ToDo it is not known what value the counter starts
 | 
					    //TODO Fl-3548: it is not known what value the counter starts
 | 
				
			||||||
    if(instance->generic.cnt > 0xFFFFFFF) instance->generic.cnt = 0xE500000;
 | 
					    if(instance->generic.cnt > 0xFFFFFFF) instance->generic.cnt = 0xE500000;
 | 
				
			||||||
    uint32_t rolling = subghz_protocol_blocks_reverse_key(instance->generic.cnt, 28);
 | 
					    uint32_t rolling = subghz_protocol_blocks_reverse_key(instance->generic.cnt, 28);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -344,7 +344,7 @@ void subghz_setting_load(SubGhzSetting* instance, const char* file_path) {
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
            while(flipper_format_read_uint32(
 | 
					            while(flipper_format_read_uint32(
 | 
				
			||||||
                fff_data_file, "Frequency", (uint32_t*)&temp_data32, 1)) {
 | 
					                fff_data_file, "Frequency", (uint32_t*)&temp_data32, 1)) {
 | 
				
			||||||
                //Todo: add a frequency support check depending on the selected radio device
 | 
					                //Todo FL-3535: add a frequency support check depending on the selected radio device
 | 
				
			||||||
                if(furi_hal_subghz_is_frequency_valid(temp_data32)) {
 | 
					                if(furi_hal_subghz_is_frequency_valid(temp_data32)) {
 | 
				
			||||||
                    FURI_LOG_I(TAG, "Frequency loaded %lu", temp_data32);
 | 
					                    FURI_LOG_I(TAG, "Frequency loaded %lu", temp_data32);
 | 
				
			||||||
                    FrequencyList_push_back(instance->frequencies, temp_data32);
 | 
					                    FrequencyList_push_back(instance->frequencies, temp_data32);
 | 
				
			||||||
 | 
				
			|||||||
@ -165,7 +165,7 @@ static int32_t subghz_tx_rx_worker_thread(void* context) {
 | 
				
			|||||||
                    SUBGHZ_TXRX_WORKER_TIMEOUT_READ_WRITE_BUF);
 | 
					                    SUBGHZ_TXRX_WORKER_TIMEOUT_READ_WRITE_BUF);
 | 
				
			||||||
                subghz_tx_rx_worker_tx(instance, data, SUBGHZ_TXRX_WORKER_MAX_TXRX_SIZE);
 | 
					                subghz_tx_rx_worker_tx(instance, data, SUBGHZ_TXRX_WORKER_MAX_TXRX_SIZE);
 | 
				
			||||||
            } else {
 | 
					            } else {
 | 
				
			||||||
                //todo checking that he managed to write all the data to the TX buffer
 | 
					                //TODO FL-3554: checking that it managed to write all the data to the TX buffer
 | 
				
			||||||
                furi_stream_buffer_receive(
 | 
					                furi_stream_buffer_receive(
 | 
				
			||||||
                    instance->stream_tx, &data, size_tx, SUBGHZ_TXRX_WORKER_TIMEOUT_READ_WRITE_BUF);
 | 
					                    instance->stream_tx, &data, size_tx, SUBGHZ_TXRX_WORKER_TIMEOUT_READ_WRITE_BUF);
 | 
				
			||||||
                subghz_tx_rx_worker_tx(instance, data, size_tx);
 | 
					                subghz_tx_rx_worker_tx(instance, data, size_tx);
 | 
				
			||||||
@ -178,7 +178,7 @@ static int32_t subghz_tx_rx_worker_thread(void* context) {
 | 
				
			|||||||
                       furi_stream_buffer_bytes_available(instance->stream_rx) == 0) {
 | 
					                       furi_stream_buffer_bytes_available(instance->stream_rx) == 0) {
 | 
				
			||||||
                        callback_rx = true;
 | 
					                        callback_rx = true;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    //todo checking that he managed to write all the data to the RX buffer
 | 
					                    //TODO FL-3554: checking that it managed to write all the data to the RX buffer
 | 
				
			||||||
                    furi_stream_buffer_send(
 | 
					                    furi_stream_buffer_send(
 | 
				
			||||||
                        instance->stream_rx,
 | 
					                        instance->stream_rx,
 | 
				
			||||||
                        &data,
 | 
					                        &data,
 | 
				
			||||||
@ -189,7 +189,7 @@ static int32_t subghz_tx_rx_worker_thread(void* context) {
 | 
				
			|||||||
                        callback_rx = false;
 | 
					                        callback_rx = false;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                } else {
 | 
					                } else {
 | 
				
			||||||
                    //todo RX buffer overflow
 | 
					                    //TODO FL-3555: RX buffer overflow
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
				
			|||||||
@ -4,7 +4,7 @@
 | 
				
			|||||||
#define CRC_DATA_BUFFER_MAX_LEN 512
 | 
					#define CRC_DATA_BUFFER_MAX_LEN 512
 | 
				
			||||||
 | 
					
 | 
				
			||||||
uint32_t crc32_calc_buffer(uint32_t crc, const void* buffer, size_t size) {
 | 
					uint32_t crc32_calc_buffer(uint32_t crc, const void* buffer, size_t size) {
 | 
				
			||||||
    // TODO: consider removing dependency on LFS
 | 
					    // TODO FL-3547: consider removing dependency on LFS
 | 
				
			||||||
    return ~lfs_crc(~crc, buffer, size);
 | 
					    return ~lfs_crc(~crc, buffer, size);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -134,7 +134,7 @@ static size_t file_stream_size(FileStream* stream) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static size_t file_stream_write(FileStream* stream, const uint8_t* data, size_t size) {
 | 
					static size_t file_stream_write(FileStream* stream, const uint8_t* data, size_t size) {
 | 
				
			||||||
    // TODO cache
 | 
					    // TODO FL-3545: cache
 | 
				
			||||||
    size_t need_to_write = size;
 | 
					    size_t need_to_write = size;
 | 
				
			||||||
    while(need_to_write > 0) {
 | 
					    while(need_to_write > 0) {
 | 
				
			||||||
        uint16_t was_written =
 | 
					        uint16_t was_written =
 | 
				
			||||||
@ -148,7 +148,7 @@ static size_t file_stream_write(FileStream* stream, const uint8_t* data, size_t
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static size_t file_stream_read(FileStream* stream, uint8_t* data, size_t size) {
 | 
					static size_t file_stream_read(FileStream* stream, uint8_t* data, size_t size) {
 | 
				
			||||||
    // TODO cache
 | 
					    // TODO FL-3545: cache
 | 
				
			||||||
    size_t need_to_read = size;
 | 
					    size_t need_to_read = size;
 | 
				
			||||||
    while(need_to_read > 0) {
 | 
					    while(need_to_read > 0) {
 | 
				
			||||||
        uint16_t was_read =
 | 
					        uint16_t was_read =
 | 
				
			||||||
@ -172,7 +172,7 @@ static bool file_stream_delete_and_insert(
 | 
				
			|||||||
    // open scratchpad
 | 
					    // open scratchpad
 | 
				
			||||||
    Stream* scratch_stream = file_stream_alloc(_stream->storage);
 | 
					    Stream* scratch_stream = file_stream_alloc(_stream->storage);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // TODO: we need something like "storage_open_tmpfile and storage_close_tmpfile"
 | 
					    // TODO FL-3546: we need something like "storage_open_tmpfile and storage_close_tmpfile"
 | 
				
			||||||
    FuriString* scratch_name;
 | 
					    FuriString* scratch_name;
 | 
				
			||||||
    FuriString* tmp_name;
 | 
					    FuriString* tmp_name;
 | 
				
			||||||
    tmp_name = furi_string_alloc();
 | 
					    tmp_name = furi_string_alloc();
 | 
				
			||||||
 | 
				
			|||||||
@ -106,7 +106,7 @@ static size_t string_stream_size(StringStream* stream) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static size_t string_stream_write(StringStream* stream, const char* data, size_t size) {
 | 
					static size_t string_stream_write(StringStream* stream, const char* data, size_t size) {
 | 
				
			||||||
    // TODO: can be optimized for edge cases
 | 
					    // TODO FL-3544: can be optimized for edge cases
 | 
				
			||||||
    size_t i;
 | 
					    size_t i;
 | 
				
			||||||
    for(i = 0; i < size; i++) {
 | 
					    for(i = 0; i < size; i++) {
 | 
				
			||||||
        string_stream_write_char(stream, data[i]);
 | 
					        string_stream_write_char(stream, data[i]);
 | 
				
			||||||
 | 
				
			|||||||
@ -55,7 +55,7 @@ uint8_t dfu_file_validate_headers(File* dfuf, const DfuValidationParams* referen
 | 
				
			|||||||
    if((dfu_suffix.bLength != sizeof(DfuSuffix)) || (dfu_suffix.bcdDFU != DFU_SUFFIX_VERSION)) {
 | 
					    if((dfu_suffix.bLength != sizeof(DfuSuffix)) || (dfu_suffix.bcdDFU != DFU_SUFFIX_VERSION)) {
 | 
				
			||||||
        return 0;
 | 
					        return 0;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    /* TODO: check DfuSignature?.. */
 | 
					    /* TODO FL-3561: check DfuSignature?.. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if((dfu_suffix.idVendor != reference_params->vendor) ||
 | 
					    if((dfu_suffix.idVendor != reference_params->vendor) ||
 | 
				
			||||||
       (dfu_suffix.idProduct != reference_params->product) ||
 | 
					       (dfu_suffix.idProduct != reference_params->product) ||
 | 
				
			||||||
@ -137,7 +137,7 @@ bool dfu_file_process_targets(const DfuUpdateTask* task, File* dfuf, const uint8
 | 
				
			|||||||
            return UpdateBlockResult_Failed;
 | 
					            return UpdateBlockResult_Failed;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /* TODO: look into TargetPrefix and validate/filter?.. */
 | 
					        /* TODO FL-3562: look into TargetPrefix and validate/filter?.. */
 | 
				
			||||||
        for(uint32_t i_element = 0; i_element < target_prefix.dwNbElements; ++i_element) {
 | 
					        for(uint32_t i_element = 0; i_element < target_prefix.dwNbElements; ++i_element) {
 | 
				
			||||||
            bytes_read = storage_file_read(dfuf, &image_element, sizeof(ImageElementHeader));
 | 
					            bytes_read = storage_file_read(dfuf, &image_element, sizeof(ImageElementHeader));
 | 
				
			||||||
            if(bytes_read != sizeof(ImageElementHeader)) {
 | 
					            if(bytes_read != sizeof(ImageElementHeader)) {
 | 
				
			||||||
 | 
				
			|||||||
@ -54,7 +54,7 @@ static bool
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    FuriString* filetype;
 | 
					    FuriString* filetype;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // TODO: compare filetype?
 | 
					    // TODO FL-3543: compare filetype?
 | 
				
			||||||
    filetype = furi_string_alloc();
 | 
					    filetype = furi_string_alloc();
 | 
				
			||||||
    update_manifest->valid =
 | 
					    update_manifest->valid =
 | 
				
			||||||
        flipper_format_read_header(flipper_file, filetype, &update_manifest->manifest_version) &&
 | 
					        flipper_format_read_header(flipper_file, filetype, &update_manifest->manifest_version) &&
 | 
				
			||||||
 | 
				
			|||||||
@ -38,7 +38,7 @@ from SCons.Tool.cxx import CXXSuffixes
 | 
				
			|||||||
from SCons.Tool.cc import CSuffixes
 | 
					from SCons.Tool.cc import CSuffixes
 | 
				
			||||||
from SCons.Tool.asm import ASSuffixes, ASPPSuffixes
 | 
					from SCons.Tool.asm import ASSuffixes, ASPPSuffixes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# TODO: Is there a better way to do this than this global? Right now this exists so that the
 | 
					# TODO FL-3542: Is there a better way to do this than this global? Right now this exists so that the
 | 
				
			||||||
# emitter we add can record all of the things it emits, so that the scanner for the top level
 | 
					# emitter we add can record all of the things it emits, so that the scanner for the top level
 | 
				
			||||||
# compilation database can access the complete list, and also so that the writer has easy
 | 
					# compilation database can access the complete list, and also so that the writer has easy
 | 
				
			||||||
# access to write all of the files. But it seems clunky. How can the emitter and the scanner
 | 
					# access to write all of the files. But it seems clunky. How can the emitter and the scanner
 | 
				
			||||||
@ -91,7 +91,7 @@ def make_emit_compilation_DB_entry(comstr):
 | 
				
			|||||||
            __COMPILATIONDB_ENV=env,
 | 
					            __COMPILATIONDB_ENV=env,
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # TODO: Technically, these next two lines should not be required: it should be fine to
 | 
					        # TODO FL-3541: Technically, these next two lines should not be required: it should be fine to
 | 
				
			||||||
        # cache the entries. However, they don't seem to update properly. Since they are quick
 | 
					        # cache the entries. However, they don't seem to update properly. Since they are quick
 | 
				
			||||||
        # to re-generate disable caching and sidestep this problem.
 | 
					        # to re-generate disable caching and sidestep this problem.
 | 
				
			||||||
        env.AlwaysBuild(entry)
 | 
					        env.AlwaysBuild(entry)
 | 
				
			||||||
 | 
				
			|||||||
@ -150,7 +150,7 @@ class FlipperStorage:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        for line in lines:
 | 
					        for line in lines:
 | 
				
			||||||
            try:
 | 
					            try:
 | 
				
			||||||
                # TODO: better decoding, considering non-ascii characters
 | 
					                # TODO FL-3539: better decoding, considering non-ascii characters
 | 
				
			||||||
                line = line.decode("ascii")
 | 
					                line = line.decode("ascii")
 | 
				
			||||||
            except Exception:
 | 
					            except Exception:
 | 
				
			||||||
                continue
 | 
					                continue
 | 
				
			||||||
@ -193,7 +193,7 @@ class FlipperStorage:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        for line in lines:
 | 
					        for line in lines:
 | 
				
			||||||
            try:
 | 
					            try:
 | 
				
			||||||
                # TODO: better decoding, considering non-ascii characters
 | 
					                # TODO FL-3539: better decoding, considering non-ascii characters
 | 
				
			||||||
                line = line.decode("ascii")
 | 
					                line = line.decode("ascii")
 | 
				
			||||||
            except Exception:
 | 
					            except Exception:
 | 
				
			||||||
                continue
 | 
					                continue
 | 
				
			||||||
 | 
				
			|||||||
@ -78,7 +78,7 @@ class OpenOCD:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    def _wait_for_openocd_tcl(self):
 | 
					    def _wait_for_openocd_tcl(self):
 | 
				
			||||||
        """Wait for OpenOCD to start"""
 | 
					        """Wait for OpenOCD to start"""
 | 
				
			||||||
        # TODO: timeout
 | 
					        # TODO Fl-3538: timeout
 | 
				
			||||||
        while True:
 | 
					        while True:
 | 
				
			||||||
            stderr = self.process.stderr
 | 
					            stderr = self.process.stderr
 | 
				
			||||||
            if not stderr:
 | 
					            if not stderr:
 | 
				
			||||||
@ -128,7 +128,7 @@ class OpenOCD:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    def _recv(self):
 | 
					    def _recv(self):
 | 
				
			||||||
        """Read from the stream until the token (\x1a) was received."""
 | 
					        """Read from the stream until the token (\x1a) was received."""
 | 
				
			||||||
        # TODO: timeout
 | 
					        # TODO FL-3538: timeout
 | 
				
			||||||
        data = bytes()
 | 
					        data = bytes()
 | 
				
			||||||
        while True:
 | 
					        while True:
 | 
				
			||||||
            chunk = self.socket.recv(4096)
 | 
					            chunk = self.socket.recv(4096)
 | 
				
			||||||
 | 
				
			|||||||
@ -247,7 +247,7 @@ class STM32WB55:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    def flash_wait_for_operation(self):
 | 
					    def flash_wait_for_operation(self):
 | 
				
			||||||
        # Wait for flash operation to complete
 | 
					        # Wait for flash operation to complete
 | 
				
			||||||
        # TODO: timeout
 | 
					        # TODO FL-3537: timeout
 | 
				
			||||||
        while True:
 | 
					        while True:
 | 
				
			||||||
            self.FLASH_SR.load()
 | 
					            self.FLASH_SR.load()
 | 
				
			||||||
            if self.FLASH_SR.BSY == 0:
 | 
					            if self.FLASH_SR.BSY == 0:
 | 
				
			||||||
 | 
				
			|||||||
@ -1,7 +1,7 @@
 | 
				
			|||||||
Set-StrictMode -Version 2.0
 | 
					Set-StrictMode -Version 2.0
 | 
				
			||||||
$ErrorActionPreference = "Stop"
 | 
					$ErrorActionPreference = "Stop"
 | 
				
			||||||
[Net.ServicePointManager]::SecurityProtocol = "tls12, tls11, tls"
 | 
					[Net.ServicePointManager]::SecurityProtocol = "tls12, tls11, tls"
 | 
				
			||||||
# TODO: fix
 | 
					# TODO FL-3536: fix path to download_dir
 | 
				
			||||||
$download_dir = (Get-Item "$PSScriptRoot\..\..").FullName
 | 
					$download_dir = (Get-Item "$PSScriptRoot\..\..").FullName
 | 
				
			||||||
$toolchain_version = $args[0]
 | 
					$toolchain_version = $args[0]
 | 
				
			||||||
$toolchain_target_path = $args[1]
 | 
					$toolchain_target_path = $args[1]
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user