summaryrefslogtreecommitdiff
path: root/source/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'source/main.c')
-rw-r--r--source/main.c215
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);