Moved netloader to the worker thread. Minor improvements.

This commit is contained in:
yellows8 2018-10-20 11:06:53 -04:00
parent 59e2d7a306
commit 45a10488b1
6 changed files with 129 additions and 24 deletions

View File

@ -62,6 +62,7 @@ typedef union {
#include "theme.h" #include "theme.h"
#include "message-box.h" #include "message-box.h"
#include "power.h" #include "power.h"
#include "netloader.h"
void menuStartupPath(void); void menuStartupPath(void);
void menuStartup(void); void menuStartup(void);

View File

@ -43,13 +43,12 @@ static enum
void launchMenuNetloaderTask() { void launchMenuNetloaderTask() {
if(hbmenu_state == HBMENU_DEFAULT) if(hbmenu_state == HBMENU_DEFAULT)
if(netloader_activate() == 0) hbmenu_state = HBMENU_NETLOADER_ACTIVE; workerSchedule(netloaderTask, NULL);
} }
void launchMenuBackTask() { void launchMenuBackTask() {
if(hbmenu_state == HBMENU_NETLOADER_ACTIVE) { if(hbmenu_state == HBMENU_NETLOADER_ACTIVE) {
netloader_deactivate(); netloaderSignalExit();
hbmenu_state = HBMENU_DEFAULT;
} }
else if(hbmenu_state == HBMENU_THEME_MENU) { else if(hbmenu_state == HBMENU_THEME_MENU) {
hbmenu_state = HBMENU_DEFAULT; hbmenu_state = HBMENU_DEFAULT;
@ -496,10 +495,13 @@ void drawButtons(menu_s* menu, bool emptyDir, int *x_image_out) {
void menuLoop(void) { void menuLoop(void) {
menuEntry_s* me; menuEntry_s* me;
menuEntry_s* netloader_me = NULL;
menu_s* menu = menuGetCurrent(); menu_s* menu = menuGetCurrent();
int i; int i;
int x, y; int x, y;
int menupath_x_endpos = 918 + 40; int menupath_x_endpos = 918 + 40;
bool netloader_activated = 0, netloader_launch_app = 0;
char netloader_errormsg[1024];
for (y=0; y<450; y++) { for (y=0; y<450; y++) {
for (x=0; x<1280; x+=4) {// don't draw bottom pixels as they are covered by the waves for (x=0; x<1280; x+=4) {// don't draw bottom pixels as they are covered by the waves
@ -531,19 +533,23 @@ void menuLoop(void) {
drawTime(); drawTime();
drawCharge(); drawCharge();
netloaderGetState(&netloader_activated, &netloader_launch_app, &netloader_me, netloader_errormsg, sizeof(netloader_errormsg));
if(hbmenu_state == HBMENU_DEFAULT && netloader_activated) {
hbmenu_state = HBMENU_NETLOADER_ACTIVE;
} else if(hbmenu_state == HBMENU_NETLOADER_ACTIVE && !netloader_activated && !netloader_launch_app) {
hbmenu_state = HBMENU_DEFAULT;
}
if (netloader_errormsg[0]) menuCreateMsgBox(780,300, netloader_errormsg);
if (menu->nEntries==0 || hbmenu_state == HBMENU_NETLOADER_ACTIVE) if (menu->nEntries==0 || hbmenu_state == HBMENU_NETLOADER_ACTIVE)
{ {
if (hbmenu_state == HBMENU_NETLOADER_ACTIVE) { if (hbmenu_state == HBMENU_NETLOADER_ACTIVE) {
menuEntry_s me; if (netloader_launch_app) {
menuEntryInit(&me,ENTRY_TYPE_FILE);
int netloader_result = netloader_loop(&me);
if( netloader_result != 0) {
hbmenu_state = HBMENU_DEFAULT; hbmenu_state = HBMENU_DEFAULT;
if (netloader_result == 1) {
menuCreateMsgBox(240,240, textGetString(StrId_Loading)); menuCreateMsgBox(240,240, textGetString(StrId_Loading));
launchMenuEntryTask(&me); launchMenuEntryTask(netloader_me);
}
} }
} else { } else {
DrawText(interuiregular14, 64, 128 + 18, themeCurrent.textColor, textGetString(StrId_NoAppsFound_Msg)); DrawText(interuiregular14, 64, 128 + 18, themeCurrent.textColor, textGetString(StrId_NoAppsFound_Msg));

View File

@ -40,20 +40,22 @@ static int netloader_datafd = -1;
#if PING_ENABLED #if PING_ENABLED
static int netloader_udpfd = -1; static int netloader_udpfd = -1;
#endif #endif
unsigned char in[ZLIB_CHUNK]; static unsigned char in[ZLIB_CHUNK];
unsigned char out[ZLIB_CHUNK]; static unsigned char out[ZLIB_CHUNK];
static mtx_t netloader_mtx;
static bool netloader_initialized = 0;
static bool netloader_exitflag = 0;
static bool netloader_activated = 0, netloader_launchapp = 0;
static menuEntry_s netloader_me;
static char netloader_errortext[1024];
//--------------------------------------------------------------------------------- //---------------------------------------------------------------------------------
static void netloader_error(const char *func, int err) { static void netloader_error(const char *func, int err) {
//--------------------------------------------------------------------------------- //---------------------------------------------------------------------------------
char errortext[1024]; memset(netloader_errortext, 0, sizeof(netloader_errortext));
snprintf(netloader_errortext, sizeof(netloader_errortext)-1, "%s: err=%d\n %s\n", func, err, strerror(errno));
memset(errortext, 0, sizeof(errortext));
snprintf(errortext, sizeof(errortext)-1, "%s: err=%d\n %s\n", func, err, strerror(errno));
menuCreateMsgBox(780,300, errortext);
netloader_deactivate();
} }
//--------------------------------------------------------------------------------- //---------------------------------------------------------------------------------
@ -558,7 +560,6 @@ int netloader_loop(menuEntry_s *me) {
if(netloader_datafd >= 0) if(netloader_datafd >= 0)
{ {
int result = loadnro(me, netloader_datafd,sa_remote.sin_addr); int result = loadnro(me, netloader_datafd,sa_remote.sin_addr);
netloader_deactivate();
if (result== 0) { if (result== 0) {
return 1; return 1;
} else { } else {
@ -568,3 +569,84 @@ int netloader_loop(menuEntry_s *me) {
return 0; return 0;
} }
void netloaderGetState(bool *activated, bool *launch_app, menuEntry_s **me, char *errormsg, size_t errormsg_size) {
mtx_lock(&netloader_mtx);
*activated = netloader_activated;
*launch_app = netloader_launchapp;
*me = &netloader_me;
memset(errormsg, 0, errormsg_size);
if(netloader_errortext[0]) {
strncpy(errormsg, netloader_errortext, errormsg_size-1);
memset(netloader_errortext, 0, sizeof(netloader_errortext));
}
mtx_unlock(&netloader_mtx);
}
static bool netloaderGetExit(void) {
bool flag;
mtx_lock(&netloader_mtx);
flag = netloader_exitflag;
mtx_unlock(&netloader_mtx);
return flag;
}
void netloaderSignalExit(void) {
mtx_lock(&netloader_mtx);
netloader_exitflag = 1;
mtx_unlock(&netloader_mtx);
}
bool netloaderInit(void)
{
if (netloader_initialized) return 1;
if (mtx_init(&netloader_mtx, mtx_plain) != thrd_success) return 0;
netloader_initialized = 1;
return 1;
}
void netloaderExit(void)
{
if (!netloader_initialized) return;
netloader_initialized = 0;
mtx_destroy(&netloader_mtx);
}
//---------------------------------------------------------------------------------
void netloaderTask(void* arg) {
//---------------------------------------------------------------------------------
int ret=0;
menuEntryInit(&netloader_me,ENTRY_TYPE_FILE);
mtx_lock(&netloader_mtx);
netloader_exitflag = 0;
netloader_activated = 0;
netloader_launchapp = 0;
mtx_unlock(&netloader_mtx);
if(netloader_activate() == 0) {
mtx_lock(&netloader_mtx);
netloader_activated = 1;
mtx_unlock(&netloader_mtx);
}
else {
netloader_deactivate();
return;
}
while((ret = netloader_loop(&netloader_me)) == 0 && !netloaderGetExit());
netloader_deactivate();
mtx_lock(&netloader_mtx);
netloader_exitflag = 0;
netloader_activated = 0;
if (ret==1) netloader_launchapp = 1;
mtx_unlock(&netloader_mtx);
}

View File

@ -3,3 +3,11 @@
int netloader_activate(void); int netloader_activate(void);
int netloader_deactivate(void); int netloader_deactivate(void);
int netloader_loop(menuEntry_s *me); int netloader_loop(menuEntry_s *me);
bool netloaderInit(void);
void netloaderExit(void);
void netloaderTask(void* arg);
void netloaderGetState(bool *activated, bool *launch_app, menuEntry_s **me, char *errormsg, size_t errormsg_size);
void netloaderSignalExit(void);

View File

@ -83,6 +83,11 @@ int main(int argc, char **argv)
snprintf(errormsg, sizeof(errormsg)-1, "Error: fontInitialize() failed."); snprintf(errormsg, sizeof(errormsg)-1, "Error: fontInitialize() failed.");
} }
if (R_SUCCEEDED(rc) && !netloaderInit()) {
rc = 4;
snprintf(errormsg, sizeof(errormsg)-1, "Error: netloaderInit() failed.");
}
#ifdef ENABLE_AUDIO #ifdef ENABLE_AUDIO
if (R_SUCCEEDED(rc)) audio_initialize(); if (R_SUCCEEDED(rc)) audio_initialize();
#endif #endif
@ -164,6 +169,7 @@ int main(int argc, char **argv)
audio_exit(); audio_exit();
#endif #endif
netloaderExit();
fontExit(); fontExit();
launchExit(); launchExit();
workerExit(); workerExit();

View File

@ -21,6 +21,7 @@ int main()
fontInitialize(); fontInitialize();
workerInit(); workerInit();
menuStartup(); menuStartup();
netloaderInit();
while (window.isOpen()) while (window.isOpen())
{ {
@ -53,6 +54,7 @@ int main()
window.display(); window.display();
} }
netloaderExit();
workerExit(); workerExit();
fontExit(); fontExit();