|
@@ -14,19 +14,21 @@
|
|
|
#include <toolbox/stream/file_stream.h>
|
|
#include <toolbox/stream/file_stream.h>
|
|
|
#include "../helpers/gb_cartridge_speaker.h"
|
|
#include "../helpers/gb_cartridge_speaker.h"
|
|
|
#include "../helpers/sequential_file.h"
|
|
#include "../helpers/sequential_file.h"
|
|
|
-#include <stdio.h> // Para sprintf
|
|
|
|
|
|
|
+#include <stdio.h> // Para sprintf
|
|
|
#include <string.h> // Para strlen
|
|
#include <string.h> // Para strlen
|
|
|
|
|
|
|
|
static uint64_t last_toggle_time = 0;
|
|
static uint64_t last_toggle_time = 0;
|
|
|
-struct GBCartridgeScene5 {
|
|
|
|
|
- View* view;
|
|
|
|
|
|
|
+struct GBCartridgeScene5
|
|
|
|
|
+{
|
|
|
|
|
+ View *view;
|
|
|
GBCartridgeScene5Callback callback;
|
|
GBCartridgeScene5Callback callback;
|
|
|
- void* context;
|
|
|
|
|
- GBCartridge* app;
|
|
|
|
|
|
|
+ void *context;
|
|
|
|
|
+ GBCartridge *app;
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
-typedef struct {
|
|
|
|
|
- char* event_type;
|
|
|
|
|
|
|
+typedef struct
|
|
|
|
|
+{
|
|
|
|
|
+ char *event_type;
|
|
|
int progress;
|
|
int progress;
|
|
|
int total_ram;
|
|
int total_ram;
|
|
|
int transfered;
|
|
int transfered;
|
|
@@ -34,7 +36,7 @@ typedef struct {
|
|
|
int elapsed_time;
|
|
int elapsed_time;
|
|
|
int start_time;
|
|
int start_time;
|
|
|
|
|
|
|
|
- char* cart_dump_ram_filename_sequential;
|
|
|
|
|
|
|
+ char *cart_dump_ram_filename_sequential;
|
|
|
bool rx_active;
|
|
bool rx_active;
|
|
|
|
|
|
|
|
char* event_title;
|
|
char* event_title;
|
|
@@ -46,9 +48,10 @@ typedef struct {
|
|
|
|
|
|
|
|
} GameBoyCartridgeRAMWriteModel;
|
|
} GameBoyCartridgeRAMWriteModel;
|
|
|
|
|
|
|
|
-static bool select_ram_file(GBCartridge* app, File* file) {
|
|
|
|
|
|
|
+static bool select_ram_file(GBCartridge *app, File *file)
|
|
|
|
|
+{
|
|
|
bool result = false;
|
|
bool result = false;
|
|
|
- FuriString* file_path = furi_string_alloc();
|
|
|
|
|
|
|
+ FuriString *file_path = furi_string_alloc();
|
|
|
furi_string_set(file_path, MALVEKE_APP_FOLDER_RAMS);
|
|
furi_string_set(file_path, MALVEKE_APP_FOLDER_RAMS);
|
|
|
DialogsFileBrowserOptions browser_options;
|
|
DialogsFileBrowserOptions browser_options;
|
|
|
dialog_file_browser_set_basic_options(&browser_options, "sav", NULL);
|
|
dialog_file_browser_set_basic_options(&browser_options, "sav", NULL);
|
|
@@ -59,13 +62,16 @@ static bool select_ram_file(GBCartridge* app, File* file) {
|
|
|
bool res = dialog_file_browser_show(app->dialogs, file_path, file_path, &browser_options);
|
|
bool res = dialog_file_browser_show(app->dialogs, file_path, file_path, &browser_options);
|
|
|
// UNUSED(res);
|
|
// UNUSED(res);
|
|
|
// FURI_LOG_I(TAG, "File selected: %s", furi_string_get_cstr(file_path));
|
|
// FURI_LOG_I(TAG, "File selected: %s", furi_string_get_cstr(file_path));
|
|
|
- if(res) {
|
|
|
|
|
|
|
+ if (res)
|
|
|
|
|
+ {
|
|
|
if(!storage_file_open(file, furi_string_get_cstr(file_path), FSAM_READ, FSOM_OPEN_EXISTING))
|
|
if(!storage_file_open(file, furi_string_get_cstr(file_path), FSAM_READ, FSOM_OPEN_EXISTING))
|
|
|
// if (!file_stream_open(stream, furi_string_get_cstr(file_path), FSAM_READ, FSOM_OPEN_EXISTING))
|
|
// if (!file_stream_open(stream, furi_string_get_cstr(file_path), FSAM_READ, FSOM_OPEN_EXISTING))
|
|
|
{
|
|
{
|
|
|
// FURI_LOG_D(TAG, "Cannot open file \"%s\"", furi_string_get_cstr(file_path));
|
|
// FURI_LOG_D(TAG, "Cannot open file \"%s\"", furi_string_get_cstr(file_path));
|
|
|
// file_stream_close(stream);
|
|
// file_stream_close(stream);
|
|
|
- } else {
|
|
|
|
|
|
|
+ }
|
|
|
|
|
+ else
|
|
|
|
|
+ {
|
|
|
// FURI_LOG_D(TAG, "Open file \"%s\"", furi_string_get_cstr(file_path));
|
|
// FURI_LOG_D(TAG, "Open file \"%s\"", furi_string_get_cstr(file_path));
|
|
|
result = true;
|
|
result = true;
|
|
|
}
|
|
}
|
|
@@ -79,11 +85,13 @@ static int32_t cartridge_writting_worker_thread(void* thread_context) {
|
|
|
UNUSED(app);
|
|
UNUSED(app);
|
|
|
File* file = storage_file_alloc(app->storage);
|
|
File* file = storage_file_alloc(app->storage);
|
|
|
|
|
|
|
|
- if(select_ram_file(app, file)) {
|
|
|
|
|
|
|
+ if (select_ram_file(app, file))
|
|
|
|
|
+ {
|
|
|
uint16_t fileSize = storage_file_size(file);
|
|
uint16_t fileSize = storage_file_size(file);
|
|
|
-
|
|
|
|
|
- FURI_LOG_I(TAG, "fileSize: %d ", fileSize);
|
|
|
|
|
- with_view_model(
|
|
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ FURI_LOG_I(TAG, "fileSize: %d " , fileSize);
|
|
|
|
|
+ with_view_model(
|
|
|
app->gb_cartridge_scene_5->view,
|
|
app->gb_cartridge_scene_5->view,
|
|
|
GameBoyCartridgeRAMWriteModel * model,
|
|
GameBoyCartridgeRAMWriteModel * model,
|
|
|
{
|
|
{
|
|
@@ -92,27 +100,24 @@ static int32_t cartridge_writting_worker_thread(void* thread_context) {
|
|
|
},
|
|
},
|
|
|
true);
|
|
true);
|
|
|
|
|
|
|
|
- char gbcartridge_start_command[80]; // A reasonably sized buffer.
|
|
|
|
|
- snprintf(
|
|
|
|
|
- gbcartridge_start_command,
|
|
|
|
|
- sizeof(gbcartridge_start_command),
|
|
|
|
|
- "gbcartridge -w -a %d\n",
|
|
|
|
|
- fileSize);
|
|
|
|
|
-
|
|
|
|
|
- uart_tx((uint8_t*)gbcartridge_start_command, strlen(gbcartridge_start_command));
|
|
|
|
|
|
|
|
|
|
|
|
+ char gbcartridge_start_command[80]; // A reasonably sized buffer.
|
|
|
|
|
+ snprintf(gbcartridge_start_command, sizeof(gbcartridge_start_command), "gbcartridge -w -a %d\n", fileSize);
|
|
|
|
|
+
|
|
|
|
|
+ uart_tx((uint8_t *)gbcartridge_start_command, strlen(gbcartridge_start_command));
|
|
|
|
|
+
|
|
|
furi_delay_ms(500); // wait
|
|
furi_delay_ms(500); // wait
|
|
|
uint8_t* the_savefile = NULL;
|
|
uint8_t* the_savefile = NULL;
|
|
|
size_t savefile_size = 0;
|
|
size_t savefile_size = 0;
|
|
|
with_view_model(
|
|
with_view_model(
|
|
|
- app->gb_cartridge_scene_5->view,
|
|
|
|
|
- GameBoyCartridgeRAMWriteModel * model,
|
|
|
|
|
- {
|
|
|
|
|
- model->event_title = "Transferring...";
|
|
|
|
|
- model->transfered = 0;
|
|
|
|
|
- model->start_time = furi_hal_rtc_get_timestamp(); // Registra el tiempo de inicio
|
|
|
|
|
- },
|
|
|
|
|
- true);
|
|
|
|
|
|
|
+ app->gb_cartridge_scene_5->view,
|
|
|
|
|
+ GameBoyCartridgeRAMWriteModel * model,
|
|
|
|
|
+ {
|
|
|
|
|
+ model->event_title = "Transferring...";
|
|
|
|
|
+ model->transfered = 0;
|
|
|
|
|
+ model->start_time = furi_hal_rtc_get_timestamp(); // Registra el tiempo de inicio
|
|
|
|
|
+ },
|
|
|
|
|
+ true);
|
|
|
the_savefile = malloc(fileSize); // to be freed by caller
|
|
the_savefile = malloc(fileSize); // to be freed by caller
|
|
|
uint8_t* buf_ptr = the_savefile;
|
|
uint8_t* buf_ptr = the_savefile;
|
|
|
size_t read = 0;
|
|
size_t read = 0;
|
|
@@ -129,7 +134,9 @@ static int32_t cartridge_writting_worker_thread(void* thread_context) {
|
|
|
with_view_model(
|
|
with_view_model(
|
|
|
app->gb_cartridge_scene_5->view,
|
|
app->gb_cartridge_scene_5->view,
|
|
|
GameBoyCartridgeRAMWriteModel * model,
|
|
GameBoyCartridgeRAMWriteModel * model,
|
|
|
- { model->event_title = "Writing Cartridge..."; },
|
|
|
|
|
|
|
+ {
|
|
|
|
|
+ model->event_title = "Writing Cartridge...";
|
|
|
|
|
+ },
|
|
|
true);
|
|
true);
|
|
|
free(the_savefile);
|
|
free(the_savefile);
|
|
|
|
|
|
|
@@ -137,34 +144,40 @@ static int32_t cartridge_writting_worker_thread(void* thread_context) {
|
|
|
storage_file_close(file);
|
|
storage_file_close(file);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
return 0;
|
|
return 0;
|
|
|
}
|
|
}
|
|
|
void gb_cartridge_scene_5_set_callback(
|
|
void gb_cartridge_scene_5_set_callback(
|
|
|
- GBCartridgeScene5* instance,
|
|
|
|
|
|
|
+ GBCartridgeScene5 *instance,
|
|
|
GBCartridgeScene5Callback callback,
|
|
GBCartridgeScene5Callback callback,
|
|
|
- void* context) {
|
|
|
|
|
|
|
+ void *context)
|
|
|
|
|
+{
|
|
|
furi_assert(instance);
|
|
furi_assert(instance);
|
|
|
furi_assert(callback);
|
|
furi_assert(callback);
|
|
|
instance->callback = callback;
|
|
instance->callback = callback;
|
|
|
instance->context = context;
|
|
instance->context = context;
|
|
|
}
|
|
}
|
|
|
-static void drawProgressBar(Canvas* canvas, int progress) {
|
|
|
|
|
- for(int x = 0; x < 64 - 14 - UI_PADDING - UI_PADDING - UI_PADDING - UI_PADDING; x += 5) {
|
|
|
|
|
- for(int row = 0; row < 20; row += 5) {
|
|
|
|
|
- if(progress > 0) {
|
|
|
|
|
- canvas_draw_box(
|
|
|
|
|
- canvas, 14 /*ARROW*/ + UI_PADDING + 2 + x + 4, /*45*/ 26 + row, 4, 4);
|
|
|
|
|
|
|
+static void drawProgressBar(Canvas *canvas, int progress)
|
|
|
|
|
+{
|
|
|
|
|
+ for (int x = 0; x < 64 - 14 - UI_PADDING - UI_PADDING - UI_PADDING - UI_PADDING; x += 5)
|
|
|
|
|
+ {
|
|
|
|
|
+ for (int row = 0; row < 20; row += 5)
|
|
|
|
|
+ {
|
|
|
|
|
+ if (progress > 0)
|
|
|
|
|
+ {
|
|
|
|
|
+ canvas_draw_box(canvas, 14 /*ARROW*/ + UI_PADDING + 2 + x + 4, /*45*/ 26 + row, 4, 4);
|
|
|
progress--;
|
|
progress--;
|
|
|
- } else {
|
|
|
|
|
- canvas_draw_frame(
|
|
|
|
|
- canvas, 14 /*ARROW*/ + UI_PADDING + 2 + x + 4, /*45*/ 26 + row, 4, 4);
|
|
|
|
|
|
|
+ }
|
|
|
|
|
+ else
|
|
|
|
|
+ {
|
|
|
|
|
+ canvas_draw_frame(canvas, 14 /*ARROW*/ + UI_PADDING + 2 + x + 4, /*45*/ 26 + row, 4, 4);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-void gb_cartridge_scene_5_draw(Canvas* canvas, GameBoyCartridgeRAMWriteModel* model) {
|
|
|
|
|
|
|
+void gb_cartridge_scene_5_draw(Canvas *canvas, GameBoyCartridgeRAMWriteModel *model)
|
|
|
|
|
+{
|
|
|
// Clear the screen.
|
|
// Clear the screen.
|
|
|
canvas_set_color(canvas, ColorBlack);
|
|
canvas_set_color(canvas, ColorBlack);
|
|
|
|
|
|
|
@@ -177,64 +190,57 @@ void gb_cartridge_scene_5_draw(Canvas* canvas, GameBoyCartridgeRAMWriteModel* mo
|
|
|
canvas_set_font(canvas, FontPrimary);
|
|
canvas_set_font(canvas, FontPrimary);
|
|
|
char progressText[42];
|
|
char progressText[42];
|
|
|
int progress = 0;
|
|
int progress = 0;
|
|
|
- if(model->total_ram > 0 && model->transfered > 0) {
|
|
|
|
|
|
|
+ if (model->total_ram > 0 && model->transfered > 0)
|
|
|
|
|
+ {
|
|
|
progress = model->transfered * 100 / model->total_ram;
|
|
progress = model->transfered * 100 / model->total_ram;
|
|
|
}
|
|
}
|
|
|
snprintf(progressText, sizeof(progressText), "%d%% Write RAM...", progress);
|
|
snprintf(progressText, sizeof(progressText), "%d%% Write RAM...", progress);
|
|
|
canvas_draw_str_aligned(canvas, 128 / 2, 0, AlignCenter, AlignTop, progressText);
|
|
canvas_draw_str_aligned(canvas, 128 / 2, 0, AlignCenter, AlignTop, progressText);
|
|
|
canvas_set_font(canvas, FontSecondary);
|
|
canvas_set_font(canvas, FontSecondary);
|
|
|
|
|
|
|
|
- canvas_draw_str_aligned(canvas, 128 / 2, 12, AlignCenter, AlignTop, model->event_title);
|
|
|
|
|
|
|
+ canvas_draw_str_aligned(canvas, 128/2, 12, AlignCenter, AlignTop, model->event_title);
|
|
|
|
|
|
|
|
char total_ram_str[20];
|
|
char total_ram_str[20];
|
|
|
- snprintf(
|
|
|
|
|
- total_ram_str,
|
|
|
|
|
- sizeof(total_ram_str),
|
|
|
|
|
- "of %.2lf MiB",
|
|
|
|
|
- (double)(model->total_ram / 1024.0 / 1024.0));
|
|
|
|
|
|
|
+ snprintf(total_ram_str, sizeof(total_ram_str), "of %.2lf MiB", (double)(model->total_ram / 1024.0 / 1024.0));
|
|
|
|
|
|
|
|
char transfered_ram_str[20];
|
|
char transfered_ram_str[20];
|
|
|
- snprintf(
|
|
|
|
|
- transfered_ram_str,
|
|
|
|
|
- sizeof(transfered_ram_str),
|
|
|
|
|
- "%.2lf MiB",
|
|
|
|
|
- (double)(model->transfered / 1024.0 / 1024.0));
|
|
|
|
|
|
|
+ snprintf(transfered_ram_str, sizeof(transfered_ram_str), "%.2lf MiB", (double)(model->transfered / 1024.0 / 1024.0));
|
|
|
|
|
|
|
|
// Calcula la Tasa de Transferencia en KiB/s
|
|
// Calcula la Tasa de Transferencia en KiB/s
|
|
|
char transfer_rate_str[20];
|
|
char transfer_rate_str[20];
|
|
|
- if(model->transfered > 0 && model->elapsed_time > 0) {
|
|
|
|
|
- double transfer_rate_kibps =
|
|
|
|
|
- (double)model->transfered / ((double)model->elapsed_time) / (double)1024.0;
|
|
|
|
|
|
|
+ if (model->transfered > 0 && model->elapsed_time > 0)
|
|
|
|
|
+ {
|
|
|
|
|
+ double transfer_rate_kibps = (double)model->transfered / ((double)model->elapsed_time) / (double)1024.0;
|
|
|
snprintf(transfer_rate_str, sizeof(transfer_rate_str), "%.2lf KiB/s", transfer_rate_kibps);
|
|
snprintf(transfer_rate_str, sizeof(transfer_rate_str), "%.2lf KiB/s", transfer_rate_kibps);
|
|
|
- } else {
|
|
|
|
|
|
|
+ }
|
|
|
|
|
+ else
|
|
|
|
|
+ {
|
|
|
snprintf(transfer_rate_str, sizeof(transfer_rate_str), "0 KiB/s");
|
|
snprintf(transfer_rate_str, sizeof(transfer_rate_str), "0 KiB/s");
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- canvas_draw_str_aligned(
|
|
|
|
|
- canvas, (128 / 2) + UI_PADDING, 22 + 2, AlignLeft, AlignTop, transfered_ram_str);
|
|
|
|
|
- canvas_draw_str_aligned(
|
|
|
|
|
- canvas, (128 / 2) + UI_PADDING, 30 + 2, AlignLeft, AlignTop, total_ram_str);
|
|
|
|
|
- canvas_draw_str_aligned(
|
|
|
|
|
- canvas, (128 / 2) + UI_PADDING, 38 + 2, AlignLeft, AlignTop, transfer_rate_str);
|
|
|
|
|
|
|
+ canvas_draw_str_aligned(canvas, (128 / 2) + UI_PADDING, 22 + 2, AlignLeft, AlignTop, transfered_ram_str);
|
|
|
|
|
+ canvas_draw_str_aligned(canvas, (128 / 2) + UI_PADDING, 30 + 2, AlignLeft, AlignTop, total_ram_str);
|
|
|
|
|
+ canvas_draw_str_aligned(canvas, (128 / 2) + UI_PADDING, 38 + 2, AlignLeft, AlignTop, transfer_rate_str);
|
|
|
|
|
|
|
|
- if(model->rx_active) {
|
|
|
|
|
|
|
+ if (model->rx_active)
|
|
|
|
|
+ {
|
|
|
canvas_draw_icon_ex(canvas, UI_PADDING, 28, &I_ArrowUpFilled_14x15, IconRotation180);
|
|
canvas_draw_icon_ex(canvas, UI_PADDING, 28, &I_ArrowUpFilled_14x15, IconRotation180);
|
|
|
- } else {
|
|
|
|
|
|
|
+ }
|
|
|
|
|
+ else
|
|
|
|
|
+ {
|
|
|
canvas_draw_icon_ex(canvas, UI_PADDING, 28, &I_ArrowUpEmpty_14x15, IconRotation180);
|
|
canvas_draw_icon_ex(canvas, UI_PADDING, 28, &I_ArrowUpEmpty_14x15, IconRotation180);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
char totalText[42];
|
|
char totalText[42];
|
|
|
snprintf(totalText, sizeof(totalText), "%d", model->total_ram);
|
|
snprintf(totalText, sizeof(totalText), "%d", model->total_ram);
|
|
|
|
|
|
|
|
- drawProgressBar(
|
|
|
|
|
- canvas,
|
|
|
|
|
- (progress * UI_PROGRESS_ROWS * UI_PROGRESS_COLS) /
|
|
|
|
|
- 100); // Pinta las primeras 10 cajas de negro
|
|
|
|
|
-
|
|
|
|
|
|
|
+ drawProgressBar(canvas, (progress * UI_PROGRESS_ROWS * UI_PROGRESS_COLS) / 100); // Pinta las primeras 10 cajas de negro
|
|
|
|
|
+
|
|
|
elements_button_center(canvas, "Write");
|
|
elements_button_center(canvas, "Write");
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-static void gb_cartridge_scene_5_model_init(GameBoyCartridgeRAMWriteModel* const model) {
|
|
|
|
|
|
|
+static void gb_cartridge_scene_5_model_init(GameBoyCartridgeRAMWriteModel *const model)
|
|
|
|
|
+{
|
|
|
model->progress = 0;
|
|
model->progress = 0;
|
|
|
model->total_ram = 0;
|
|
model->total_ram = 0;
|
|
|
model->transfered = 0;
|
|
model->transfered = 0;
|
|
@@ -249,6 +255,8 @@ void gameboy_handle_rx_data_cb(uint8_t* buf, size_t len, void* context) {
|
|
|
UNUSED(buf);
|
|
UNUSED(buf);
|
|
|
GBCartridge* instance = context;
|
|
GBCartridge* instance = context;
|
|
|
|
|
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
with_view_model(
|
|
with_view_model(
|
|
|
instance->gb_cartridge_scene_5->view,
|
|
instance->gb_cartridge_scene_5->view,
|
|
|
GameBoyCartridgeRAMWriteModel * model,
|
|
GameBoyCartridgeRAMWriteModel * model,
|
|
@@ -257,11 +265,12 @@ void gameboy_handle_rx_data_cb(uint8_t* buf, size_t len, void* context) {
|
|
|
|
|
|
|
|
uint64_t current_time = furi_hal_rtc_get_timestamp();
|
|
uint64_t current_time = furi_hal_rtc_get_timestamp();
|
|
|
model->elapsed_time = current_time - model->start_time;
|
|
model->elapsed_time = current_time - model->start_time;
|
|
|
- if(current_time - last_toggle_time >= 0.2) {
|
|
|
|
|
|
|
+ if (current_time - last_toggle_time >= 0.2) {
|
|
|
model->rx_active = !model->rx_active;
|
|
model->rx_active = !model->rx_active;
|
|
|
last_toggle_time = current_time;
|
|
last_toggle_time = current_time;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+
|
|
|
cJSON* json = cJSON_Parse((char*)buf);
|
|
cJSON* json = cJSON_Parse((char*)buf);
|
|
|
if(json == NULL) {
|
|
if(json == NULL) {
|
|
|
} else {
|
|
} else {
|
|
@@ -287,15 +296,16 @@ void gameboy_handle_rx_data_cb(uint8_t* buf, size_t len, void* context) {
|
|
|
} else {
|
|
} else {
|
|
|
model->value = 0;
|
|
model->value = 0;
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
}
|
|
}
|
|
|
- if(strcmp(model->event_type, "progress") == 0) {
|
|
|
|
|
|
|
+ if (strcmp(model->event_type, "progress") == 0) {
|
|
|
// progress
|
|
// progress
|
|
|
cJSON* progress = cJSON_GetObjectItemCaseSensitive(json, "progress");
|
|
cJSON* progress = cJSON_GetObjectItemCaseSensitive(json, "progress");
|
|
|
if(cJSON_IsNumber(progress)) {
|
|
if(cJSON_IsNumber(progress)) {
|
|
|
model->transfered += progress->valueint;
|
|
model->transfered += progress->valueint;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
- if(strcmp(model->event_type, "success") == 0) {
|
|
|
|
|
|
|
+ if (strcmp(model->event_type, "success") == 0) {
|
|
|
notification_success(instance->notification);
|
|
notification_success(instance->notification);
|
|
|
model->transfered = model->total_ram;
|
|
model->transfered = model->total_ram;
|
|
|
model->event_title = "Done!";
|
|
model->event_title = "Done!";
|
|
@@ -303,19 +313,22 @@ void gameboy_handle_rx_data_cb(uint8_t* buf, size_t len, void* context) {
|
|
|
},
|
|
},
|
|
|
true);
|
|
true);
|
|
|
}
|
|
}
|
|
|
-bool gb_cartridge_scene_5_input(InputEvent* event, void* context) {
|
|
|
|
|
|
|
+bool gb_cartridge_scene_5_input(InputEvent *event, void *context)
|
|
|
|
|
+{
|
|
|
furi_assert(context);
|
|
furi_assert(context);
|
|
|
- GBCartridgeScene5* instance = context;
|
|
|
|
|
|
|
+ GBCartridgeScene5 *instance = context;
|
|
|
|
|
|
|
|
- if(event->type == InputTypeRelease) {
|
|
|
|
|
- switch(event->key) {
|
|
|
|
|
|
|
+ if (event->type == InputTypeRelease)
|
|
|
|
|
+ {
|
|
|
|
|
+ switch (event->key)
|
|
|
|
|
+ {
|
|
|
case InputKeyBack:
|
|
case InputKeyBack:
|
|
|
with_view_model(
|
|
with_view_model(
|
|
|
instance->view,
|
|
instance->view,
|
|
|
GameBoyCartridgeRAMWriteModel * model,
|
|
GameBoyCartridgeRAMWriteModel * model,
|
|
|
{
|
|
{
|
|
|
UNUSED(model);
|
|
UNUSED(model);
|
|
|
- GBCartridge* app = (GBCartridge*)instance->context;
|
|
|
|
|
|
|
+ GBCartridge *app = (GBCartridge *)instance->context;
|
|
|
// Unregister rx callback
|
|
// Unregister rx callback
|
|
|
uart_set_handle_rx_data_cb(app->uart, NULL);
|
|
uart_set_handle_rx_data_cb(app->uart, NULL);
|
|
|
uart_set_handle_rx_data_cb(app->lp_uart, NULL);
|
|
uart_set_handle_rx_data_cb(app->lp_uart, NULL);
|
|
@@ -329,11 +342,13 @@ bool gb_cartridge_scene_5_input(InputEvent* event, void* context) {
|
|
|
case InputKeyLeft:
|
|
case InputKeyLeft:
|
|
|
case InputKeyRight:
|
|
case InputKeyRight:
|
|
|
break;
|
|
break;
|
|
|
- case InputKeyOk: {
|
|
|
|
|
- GBCartridge* app = ((GBCartridge*)instance->context);
|
|
|
|
|
|
|
+ case InputKeyOk:
|
|
|
|
|
+ {
|
|
|
|
|
+ GBCartridge *app = ((GBCartridge *)instance->context);
|
|
|
uart_set_handle_rx_data_cb(app->uart, gameboy_handle_rx_data_cb);
|
|
uart_set_handle_rx_data_cb(app->uart, gameboy_handle_rx_data_cb);
|
|
|
cartridge_writting_worker_thread(app);
|
|
cartridge_writting_worker_thread(app);
|
|
|
- } break;
|
|
|
|
|
|
|
+ }
|
|
|
|
|
+ break;
|
|
|
case InputKeyMAX:
|
|
case InputKeyMAX:
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
@@ -342,16 +357,19 @@ bool gb_cartridge_scene_5_input(InputEvent* event, void* context) {
|
|
|
return true;
|
|
return true;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-void gb_cartridge_scene_5_exit(void* context) {
|
|
|
|
|
|
|
+void gb_cartridge_scene_5_exit(void *context)
|
|
|
|
|
+{
|
|
|
furi_assert(context);
|
|
furi_assert(context);
|
|
|
- GBCartridge* app = context;
|
|
|
|
|
|
|
+ GBCartridge *app = context;
|
|
|
gb_cartridge_stop_all_sound(app);
|
|
gb_cartridge_stop_all_sound(app);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-void gb_cartridge_scene_5_enter(void* context) {
|
|
|
|
|
|
|
+void gb_cartridge_scene_5_enter(void *context)
|
|
|
|
|
+{
|
|
|
|
|
+
|
|
|
furi_assert(context);
|
|
furi_assert(context);
|
|
|
- GBCartridgeScene5* instance = context;
|
|
|
|
|
- GBCartridge* app = (GBCartridge*)instance->context;
|
|
|
|
|
|
|
+ GBCartridgeScene5 *instance = context;
|
|
|
|
|
+ GBCartridge *app = (GBCartridge *)instance->context;
|
|
|
|
|
|
|
|
UNUSED(app);
|
|
UNUSED(app);
|
|
|
with_view_model(
|
|
with_view_model(
|
|
@@ -364,11 +382,11 @@ void gb_cartridge_scene_5_enter(void* context) {
|
|
|
false);
|
|
false);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-GBCartridgeScene5* gb_cartridge_scene_5_alloc() {
|
|
|
|
|
- GBCartridgeScene5* instance = malloc(sizeof(GBCartridgeScene5));
|
|
|
|
|
|
|
+GBCartridgeScene5 *gb_cartridge_scene_5_alloc()
|
|
|
|
|
+{
|
|
|
|
|
+ GBCartridgeScene5 *instance = malloc(sizeof(GBCartridgeScene5));
|
|
|
instance->view = view_alloc();
|
|
instance->view = view_alloc();
|
|
|
- view_allocate_model(
|
|
|
|
|
- instance->view, ViewModelTypeLocking, sizeof(GameBoyCartridgeRAMWriteModel));
|
|
|
|
|
|
|
+ view_allocate_model(instance->view, ViewModelTypeLocking, sizeof(GameBoyCartridgeRAMWriteModel));
|
|
|
|
|
|
|
|
view_set_context(instance->view, instance);
|
|
view_set_context(instance->view, instance);
|
|
|
view_set_draw_callback(instance->view, (ViewDrawCallback)gb_cartridge_scene_5_draw);
|
|
view_set_draw_callback(instance->view, (ViewDrawCallback)gb_cartridge_scene_5_draw);
|
|
@@ -379,13 +397,16 @@ GBCartridgeScene5* gb_cartridge_scene_5_alloc() {
|
|
|
with_view_model(
|
|
with_view_model(
|
|
|
instance->view,
|
|
instance->view,
|
|
|
GameBoyCartridgeRAMWriteModel * model,
|
|
GameBoyCartridgeRAMWriteModel * model,
|
|
|
- { gb_cartridge_scene_5_model_init(model); },
|
|
|
|
|
|
|
+ {
|
|
|
|
|
+ gb_cartridge_scene_5_model_init(model);
|
|
|
|
|
+ },
|
|
|
true);
|
|
true);
|
|
|
|
|
|
|
|
return instance;
|
|
return instance;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-void gb_cartridge_scene_5_free(GBCartridgeScene5* instance) {
|
|
|
|
|
|
|
+void gb_cartridge_scene_5_free(GBCartridgeScene5 *instance)
|
|
|
|
|
+{
|
|
|
GBCartridge* app = instance->context;
|
|
GBCartridge* app = instance->context;
|
|
|
UNUSED(app);
|
|
UNUSED(app);
|
|
|
furi_assert(instance);
|
|
furi_assert(instance);
|
|
@@ -393,7 +414,8 @@ void gb_cartridge_scene_5_free(GBCartridgeScene5* instance) {
|
|
|
free(instance);
|
|
free(instance);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-View* gb_cartridge_scene_5_get_view(GBCartridgeScene5* instance) {
|
|
|
|
|
|
|
+View *gb_cartridge_scene_5_get_view(GBCartridgeScene5 *instance)
|
|
|
|
|
+{
|
|
|
furi_assert(instance);
|
|
furi_assert(instance);
|
|
|
|
|
|
|
|
return instance->view;
|
|
return instance->view;
|