diff options
Diffstat (limited to 'source/main.c')
-rw-r--r-- | source/main.c | 215 |
1 files changed, 212 insertions, 3 deletions
diff --git a/source/main.c b/source/main.c index 162ca2d..0f996bb 100644 --- a/source/main.c +++ b/source/main.c @@ -25,6 +25,12 @@ #include <string.h> #include <nds.h> #include <fat.h> +#include <dswifi9.h> + +#include "ds81_ipc.h" + +#include "ds81_global.h" +#include "ds81_fader.h" #include "framebuffer.h" #include "gui.h" @@ -45,6 +51,7 @@ static const char *main_menu[]= "Sticky Shift On", "Sticky Shift Off", "Map Joypad to Keys", + "Select Web Server (WFC)", "Cancel", NULL }; @@ -55,14 +62,89 @@ typedef enum MenuSelectTape, MenuStickyOn, MenuStickyOff, - MenuMapJoypad + MenuMapJoypad, + MenuConfigNetwork } MenuOpt; +/* Hope ints are atomic... Having said that we are on the one processor so + I doubt it'll mess up. Which are usually famous last words. +*/ +static volatile int wifi_enabled = FALSE; + +static u32 main_heartbeat; + + +/* ---------------------------------------- IRQ FUNCS +*/ + +static void Timer(void) +{ + { + static int c=0; + char s[32]; + sprintf(s,"%d",(c++)/50); + FB_Print(s,0,184-10,FB_RGB(31,31,31),FB_RGB(10,10,10)); + } + + if (wifi_enabled) + { + Wifi_Timer(50); + } +} + +static void ARM9_SyncToARM7(void) +{ + REG_IPC_FIFO_TX = DS81_WIFI_SYNC_IPC; +} + + +static void ARM9_Fifo(void) +{ + static int c=0; + u32 v; + + v = REG_IPC_FIFO_RX; + + { + char s[32]; + sprintf(s,"%d:%x ",c++,v); + FB_Print(s,0,184,FB_RGB(31,31,31),FB_RGB(10,10,10)); + } + + if (v == DS81_WIFI_SYNC_IPC) + { + Wifi_Sync(); + } +} + + /* ---------------------------------------- DISPLAY FUNCS */ static void VBlankFunc(void) { +#if 0 + char t[32]; + + if (IPC->rtc_hours < 12) + { + sprintf(t,"%2.2d:%2.2d:%2.2d",IPC->rtc_hours, + IPC->rtc_minutes, + IPC->rtc_seconds); + } + else + { + sprintf(t,"%2.2d:%2.2d:%2.2d",IPC->rtc_hours-40, + IPC->rtc_minutes, + IPC->rtc_seconds); + } + + FB_Print(t,192,0,FB_RGB(31,31,31),FB_RGB(10,10,10)); + + sprintf(t,"H:%8.8x M:%8.8x",IPC->heartbeat,main_heartbeat); + FB_Print(t,0,0,FB_RGB(31,31,31),FB_RGB(10,10,10)); +#endif + scanKeys(); } @@ -218,6 +300,109 @@ static void MapJoypad(void) } +/* ---------------------------------------- NETWORK CONFIGURATION +*/ +static const char *AssocStatus(enum WIFI_ASSOCSTATUS s, int *exit_loop) +{ + switch(s) + { + case ASSOCSTATUS_DISCONNECTED: + return "Not trying to connect..."; + + case ASSOCSTATUS_SEARCHING: + return "Searching for AP..."; + + case ASSOCSTATUS_AUTHENTICATING: + return "Connecting (authenticate)..."; + + case ASSOCSTATUS_ASSOCIATING: + return "Connecting (associating)..."; + + case ASSOCSTATUS_ACQUIRINGDHCP: + return "Requesting IP address..."; + + case ASSOCSTATUS_ASSOCIATED: + *exit_loop = 1; + return "Associated"; + + case ASSOCSTATUS_CANNOTCONNECT: + *exit_loop = 1; + return "Cannot connect"; + + default: + *exit_loop = 1; + return "Unknown status"; + } +} + +static void ConfigNetwork(void) +{ + int col; + int coli; + u32 wifi_pass; + enum WIFI_ASSOCSTATUS assoc; + int exit_loop; + + FB_Clear(); + + FB_Centre("Initialising WIFI...",0,FB_RGB(31,31,31),-1); + + wifi_pass = Wifi_Init(WIFIINIT_OPTION_USELED); + + REG_IPC_FIFO_TX = DS81_WIFI_INIT_IPC; + REG_IPC_FIFO_TX = wifi_pass; + + Wifi_SetSyncHandler(ARM9_SyncToARM7); + wifi_enabled = TRUE; + + FB_Centre("Waiting for WIFI...",10,FB_RGB(31,31,31),-1); + + col = 31; + coli = -1; + + while(Wifi_CheckInit() == 0) + { + FB_Centre("Waiting for WIFI...",10,FB_RGB(col,col,col),-1); + DS81_BOUNCE(col,coli); + swiWaitForVBlank(); + } + + FB_Centre("Waiting for WIFI...",10,FB_RGB(31,31,31),-1); + + FB_Centre("Using WFC settings...",20,FB_RGB(31,31,31),-1); + Wifi_AutoConnect(); + + FB_Centre("Waiting for association...",30,FB_RGB(31,31,31),-1); + exit_loop = FALSE; + + while(!exit_loop) + { + assoc = Wifi_AssocStatus(); + + FB_Centre(AssocStatus(assoc,&exit_loop),40,FB_RGB(col,col,col),-1); + DS81_BOUNCE(col,coli); + swiWaitForVBlank(); + } + + FB_Centre(AssocStatus(assoc,&exit_loop),40,FB_RGB(31,31,31),-1); + + FB_Centre("Press a key...",60,FB_RGB(31,31,31),-1); + + while(!keysDown()) + { + swiWaitForVBlank(); + } + + while(keysHeld()) + { + swiWaitForVBlank(); + } + + SK_DisplayKeyboard(BG_GFX_SUB); + swiWaitForVBlank(); +} + + /* ---------------------------------------- MAIN */ int main(int argc, char *argv[]) @@ -255,12 +440,30 @@ int main(int argc, char *argv[]) SUB_BG2_CX = 0; SUB_BG2_CY = 0; + /* Tell 'framebuffer' routines to use this + */ + FB_Init(BG_GFX_SUB); + + /* Set up interrupts and timers + */ irqInit(); irqSet(IRQ_VBLANK,VBlankFunc); + irqEnable(IRQ_VBLANK); - keysSetRepeat(30,15); + REG_IPC_FIFO_CR = IPC_FIFO_ENABLE | IPC_FIFO_RECV_IRQ; - FB_Init(BG_GFX_SUB); + TIMER3_CR = 0; + + irqSet(IRQ_TIMER3,Timer); + TIMER3_DATA = TIMER_FREQ_256(20); + TIMER3_CR = TIMER_ENABLE | TIMER_IRQ_REQ | TIMER_DIV_256; + + irqSet(IRQ_FIFO_NOT_EMPTY,ARM9_Fifo); + irqEnable(IRQ_FIFO_NOT_EMPTY); + + /* All required stuff initialised + */ + keysSetRepeat(30,15); z80 = Z80Init(ZX81ReadMem, ZX81WriteMem, @@ -285,6 +488,8 @@ int main(int argc, char *argv[]) { SoftKeyEvent ev; + main_heartbeat++; + Z80Exec(z80); while(SK_GetEvent(&ev)) @@ -316,6 +521,10 @@ int main(int argc, char *argv[]) case MenuMapJoypad: MapJoypad(); break; + + case MenuConfigNetwork: + ConfigNetwork(); + break; } SK_DisplayKeyboard(BG_GFX_SUB); |