From e03357610439a808bc4c97849f314b7f8cf08953 Mon Sep 17 00:00:00 2001 From: Raphael Assenat Date: Mon, 2 Nov 2015 21:52:32 -0500 Subject: [PATCH 1/4] error count should be init. to zero --- main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.c b/main.c index fe6beb1..03c0d81 100644 --- a/main.c +++ b/main.c @@ -270,7 +270,7 @@ int main(void) gamepad_data pad_data; unsigned char gamepad_vibrate = 0; unsigned char state = STATE_WAIT_POLLTIME; - int error_count; + int error_count=0; hwinit(); usart1_init(); From 5a698b7f573e2246616e34673e171f2773d915b7 Mon Sep 17 00:00:00 2001 From: Raphael Assenat Date: Mon, 2 Nov 2015 21:53:05 -0500 Subject: [PATCH 2/4] Add context for callbacks --- tool/main.c | 13 ++++--------- tool/mempak_gcn64usb.c | 8 ++++---- tool/mempak_gcn64usb.h | 4 ++-- 3 files changed, 10 insertions(+), 15 deletions(-) diff --git a/tool/main.c b/tool/main.c index 19528fb..df472c2 100644 --- a/tool/main.c +++ b/tool/main.c @@ -157,14 +157,9 @@ struct option longopts[] = { { }, }; -static void mempak_read_progress_cb(int addr) +static void mempak_progress_cb(int addr, void *ctx) { - printf("\rReading address 0x%04x / 0x%04x ", addr, MEMPAK_MEM_SIZE); fflush(stdout); -} - -static void mempak_write_progress_cb(int addr) -{ - printf("\rWriting address 0x%04x / 0x%04x ", addr, MEMPAK_MEM_SIZE); fflush(stdout); + printf("\r%s 0x%04x / 0x%04x ", (char*)ctx, addr, MEMPAK_MEM_SIZE); fflush(stdout); } static int listDevices(void) @@ -384,7 +379,7 @@ int main(int argc, char **argv) int res; printf("Reading mempak...\n"); - res = gcn64lib_mempak_download(hdl, 0, &pak, mempak_read_progress_cb); + res = gcn64lib_mempak_download(hdl, 0, &pak, mempak_progress_cb, "Reading address"); printf("\n"); switch (res) { @@ -436,7 +431,7 @@ int main(int argc, char **argv) } printf("Writing to mempak...\n"); - res = gcn64lib_mempak_upload(hdl, 0, pak, mempak_write_progress_cb); + res = gcn64lib_mempak_upload(hdl, 0, pak, mempak_progress_cb, "Writing address"); printf("\n"); if (res) { switch(res) diff --git a/tool/mempak_gcn64usb.c b/tool/mempak_gcn64usb.c index dad0db0..b61bb02 100644 --- a/tool/mempak_gcn64usb.c +++ b/tool/mempak_gcn64usb.c @@ -162,7 +162,7 @@ int gcn64lib_mempak_writeBlock(gcn64_hdl_t hdl, unsigned short addr, unsigned ch * \param progressCb Callback to notify read progress (called after each block) * \return 0: Success, -1: No mempak, -2: IO/error, -3: Other errors */ -int gcn64lib_mempak_download(gcn64_hdl_t hdl, int channel, mempak_structure_t **mempak, void (*progressCb)(int cur_addr)) +int gcn64lib_mempak_download(gcn64_hdl_t hdl, int channel, mempak_structure_t **mempak, void (*progressCb)(int cur_addr, void *ctx), void *ctx) { mempak_structure_t *pak; unsigned short addr; @@ -189,7 +189,7 @@ int gcn64lib_mempak_download(gcn64_hdl_t hdl, int channel, mempak_structure_t ** return -2; } if (progressCb) { - progressCb(addr); + progressCb(addr, ctx); } } *mempak = pak; @@ -197,7 +197,7 @@ int gcn64lib_mempak_download(gcn64_hdl_t hdl, int channel, mempak_structure_t ** return 0; } -int gcn64lib_mempak_upload(gcn64_hdl_t hdl, int channel, mempak_structure_t *pak, void (*progressCb)(int cur_addr)) +int gcn64lib_mempak_upload(gcn64_hdl_t hdl, int channel, mempak_structure_t *pak, void (*progressCb)(int cur_addr, void *ctx), void *ctx) { unsigned short addr; unsigned char readback[0x20]; @@ -230,7 +230,7 @@ int gcn64lib_mempak_upload(gcn64_hdl_t hdl, int channel, mempak_structure_t *pak } if (progressCb) { - progressCb(addr); + progressCb(addr, ctx); } } diff --git a/tool/mempak_gcn64usb.h b/tool/mempak_gcn64usb.h index 0293fc5..afc5a6b 100644 --- a/tool/mempak_gcn64usb.h +++ b/tool/mempak_gcn64usb.h @@ -7,7 +7,7 @@ int gcn64lib_mempak_detect(gcn64_hdl_t hdl); int gcn64lib_mempak_readBlock(gcn64_hdl_t hdl, unsigned short addr, unsigned char dst[32]); int gcn64lib_mempak_writeBlock(gcn64_hdl_t hdl, unsigned short addr, unsigned char data[32]); -int gcn64lib_mempak_download(gcn64_hdl_t hdl, int channel, mempak_structure_t **mempak, void (*progressCb)(int cur_addr)); -int gcn64lib_mempak_upload(gcn64_hdl_t hdl, int channel, mempak_structure_t *pak, void (*progressCb)(int cur_addr)); +int gcn64lib_mempak_download(gcn64_hdl_t hdl, int channel, mempak_structure_t **mempak, void (*progressCb)(int cur_addr, void *ctx), void *ctx); +int gcn64lib_mempak_upload(gcn64_hdl_t hdl, int channel, mempak_structure_t *pak, void (*progressCb)(int cur_addr, void *ctx), void *ctx); #endif // _mempak_gcn64usb_h__ From 452e324d07e4d8fe0d44956f0528235f51ff909f Mon Sep 17 00:00:00 2001 From: Raphael Assenat Date: Mon, 2 Nov 2015 21:53:35 -0500 Subject: [PATCH 3/4] Add read n64 mempak support --- tool/gcn64cfg.glade | 81 +++++++++++++++++++++++++++++++++++++ tool/gcn64ctl_gui.c | 58 +++++++++++++++++++++++--- tool/gcn64ctl_gui_mpkedit.h | 3 ++ 3 files changed, 137 insertions(+), 5 deletions(-) diff --git a/tool/gcn64cfg.glade b/tool/gcn64cfg.glade index a05310d..8b99ee7 100644 --- a/tool/gcn64cfg.glade +++ b/tool/gcn64cfg.glade @@ -666,6 +666,7 @@ Author: Raphaël Assénat True True True + True @@ -1056,4 +1057,84 @@ Author: Raphaël Assénat + + False + True + dialog + win_mempak_edit + + + False + vertical + 2 + + + False + end + + + gtk-stop + True + True + True + True + 0.49000000953674316 + True + + + + True + True + 0 + + + + + False + False + 0 + + + + + True + False + True + vertical + + + True + False + Mempak operation in progress... + + + False + True + 0 + + + + + True + False + center + True + True + + + False + True + 1 + + + + + False + True + 1 + + + + + diff --git a/tool/gcn64ctl_gui.c b/tool/gcn64ctl_gui.c index 0b7a045..979174a 100644 --- a/tool/gcn64ctl_gui.c +++ b/tool/gcn64ctl_gui.c @@ -4,8 +4,10 @@ #include #include "../requests.h" #include "ihex.h" - +#include "mempak.h" #include "gcn64ctl_gui.h" +#include "mempak_gcn64usb.h" +#include "gcn64lib.h" static void updateGuiFromAdapter(struct application *app); gboolean rebuild_device_list_store(gpointer data); @@ -566,6 +568,56 @@ G_MODULE_EXPORT void onFileRescan(GtkWidget *wid, gpointer data) rebuild_device_list_store(data); } +static void mempak_io_progress_cb(int progress, void *ctx) +{ + struct application *app = ctx; + GET_UI_ELEMENT(GtkProgressBar, mempak_io_progress); + gdouble fract; + + fract = progress/MEMPAK_BLOCK_SIZE; + + gtk_progress_bar_set_fraction(mempak_io_progress, progress/((gdouble)MEMPAK_MEM_SIZE)); + while (gtk_events_pending()) { + gtk_main_iteration_do(FALSE); + } + +} + +G_MODULE_EXPORT void read_n64_pak(GtkWidget *wid, gpointer data) +{ + struct application *app = data; + GET_UI_ELEMENT(GtkWindow, win_mempak_edit); + GET_UI_ELEMENT(GtkDialog, mempak_io_dialog); + GET_UI_ELEMENT(GtkLabel, mempak_op_label); + mempak_structure_t *mpk; + int res; + + printf("N64 read mempak\n"); + if (!app->current_adapter_handle) + return; + + gtk_widget_show(GTK_WIDGET(mempak_io_dialog)); + gtk_label_set_text(mempak_op_label, "Reading memory pack..."); + + res = gcn64lib_mempak_download(app->current_adapter_handle, 0, &mpk, mempak_io_progress_cb, app); + + gtk_widget_hide(GTK_WIDGET(mempak_io_dialog)); + if (res != 0) { + switch(res) + { + case -1: errorPopop(app, "No mempak detected"); break; + case -2: errorPopop(app, "I/O error reading mempak"); break; + default: + case -3: errorPopop(app, "Error reading mempak"); break; + } + } + else { + mpke_replaceMpk(app, mpk, NULL); + gtk_widget_show(GTK_WIDGET(win_mempak_edit)); + } +} + + int main( int argc, char **argv ) @@ -597,9 +649,6 @@ main( int argc, /* Connect signals */ gtk_builder_connect_signals( app.builder, &app ); - /* Destroy builder, since we don't need it anymore */ -// g_object_unref( G_OBJECT( builder ) ); - /* Show window. All other widgets are automatically shown by GtkBuilder */ gtk_widget_show( GTK_WIDGET(window) ); @@ -610,4 +659,3 @@ main( int argc, return( 0 ); } - diff --git a/tool/gcn64ctl_gui_mpkedit.h b/tool/gcn64ctl_gui_mpkedit.h index e94795d..1804824 100644 --- a/tool/gcn64ctl_gui_mpkedit.h +++ b/tool/gcn64ctl_gui_mpkedit.h @@ -1,10 +1,13 @@ #ifndef gcn64ctl_gui_mpkedit_h__ #define gcn64ctl_gui_mpkedit_h__ +#include "mempak.h" + struct mpkedit_data; struct application; struct mpkedit_data *mpkedit_new(struct application *app); void mpkedit_free(struct mpkedit_data *mpke); +void mpke_replaceMpk(struct application *app, mempak_structure_t *mpk, char *filename); #endif From 4beb3805c40888c5b41b9ac40832b2385e96caec Mon Sep 17 00:00:00 2001 From: Raphael Assenat Date: Mon, 2 Nov 2015 21:55:17 -0500 Subject: [PATCH 4/4] Fix warning --- intervaltimer.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/intervaltimer.c b/intervaltimer.c index d47efad..0339a3e 100644 --- a/intervaltimer.c +++ b/intervaltimer.c @@ -28,8 +28,6 @@ void intervaltimer_set(int interval_ms) char intervaltimer_get(void) { - char a; - if (TIFR1 & (1<