parent
3af92fe737
commit
fb0d50a71a
|
@ -67,6 +67,7 @@ inline bool LocalFileExists(const char* name)
|
||||||
void* Thread_Create(void (*func)());
|
void* Thread_Create(void (*func)());
|
||||||
void Thread_Free(void* thread);
|
void Thread_Free(void* thread);
|
||||||
void Thread_Wait(void* thread);
|
void Thread_Wait(void* thread);
|
||||||
|
void Thread_Sleep(u32 ms);
|
||||||
|
|
||||||
void* Semaphore_Create();
|
void* Semaphore_Create();
|
||||||
void Semaphore_Free(void* sema);
|
void Semaphore_Free(void* sema);
|
||||||
|
@ -74,6 +75,9 @@ void Semaphore_Reset(void* sema);
|
||||||
void Semaphore_Wait(void* sema);
|
void Semaphore_Wait(void* sema);
|
||||||
void Semaphore_Post(void* sema);
|
void Semaphore_Post(void* sema);
|
||||||
|
|
||||||
|
u64 Perf_GetFrequency();
|
||||||
|
u64 Perf_GetCounter();
|
||||||
|
|
||||||
void* GL_GetProcAddress(const char* proc);
|
void* GL_GetProcAddress(const char* proc);
|
||||||
|
|
||||||
// local multiplayer comm interface
|
// local multiplayer comm interface
|
||||||
|
|
61
src/Wifi.cpp
61
src/Wifi.cpp
|
@ -84,6 +84,12 @@ int MPNumReplies;
|
||||||
bool MPInited;
|
bool MPInited;
|
||||||
bool LANInited;
|
bool LANInited;
|
||||||
|
|
||||||
|
// TEST ZONE
|
||||||
|
void* WifiThread;
|
||||||
|
bool WifiThreadRunning;
|
||||||
|
void WifiThreadFunc();
|
||||||
|
bool WifiOn;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// multiplayer host TX sequence:
|
// multiplayer host TX sequence:
|
||||||
|
@ -129,6 +135,11 @@ bool Init()
|
||||||
|
|
||||||
WifiAP::Init();
|
WifiAP::Init();
|
||||||
|
|
||||||
|
// HAX!!!!!
|
||||||
|
WifiThreadRunning = true;
|
||||||
|
WifiOn = false;
|
||||||
|
WifiThread = Platform::Thread_Create(WifiThreadFunc);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -140,10 +151,16 @@ void DeInit()
|
||||||
Platform::LAN_DeInit();
|
Platform::LAN_DeInit();
|
||||||
|
|
||||||
WifiAP::DeInit();
|
WifiAP::DeInit();
|
||||||
|
|
||||||
|
WifiThreadRunning = false;
|
||||||
|
Platform::Thread_Wait(WifiThread);
|
||||||
|
Platform::Thread_Free(WifiThread);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Reset()
|
void Reset()
|
||||||
{
|
{
|
||||||
|
WifiOn = false;
|
||||||
|
|
||||||
memset(RAM, 0, 0x2000);
|
memset(RAM, 0, 0x2000);
|
||||||
memset(IO, 0, 0x1000);
|
memset(IO, 0, 0x1000);
|
||||||
|
|
||||||
|
@ -1103,7 +1120,43 @@ void USTimer(u32 param)
|
||||||
|
|
||||||
// TODO: make it more accurate, eventually
|
// TODO: make it more accurate, eventually
|
||||||
// in the DS, the wifi system has its own 22MHz clock and doesn't use the system clock
|
// in the DS, the wifi system has its own 22MHz clock and doesn't use the system clock
|
||||||
NDS::ScheduleEvent(NDS::Event_Wifi, true, 33, USTimer, 0);
|
//NDS::ScheduleEvent(NDS::Event_Wifi, true, 33, USTimer, 0);
|
||||||
|
}
|
||||||
|
extern "C" int SDL_SetThreadPriority(int prio);
|
||||||
|
void WifiThreadFunc()
|
||||||
|
{
|
||||||
|
SDL_SetThreadPriority(2);
|
||||||
|
|
||||||
|
u64 perffreq = Platform::Perf_GetFrequency();
|
||||||
|
float ustime = perffreq / 1000000.0f;
|
||||||
|
u64 perflast = Platform::Perf_GetCounter();
|
||||||
|
printf("wifi: perf=%lld ustime=%f\n", perffreq, ustime);
|
||||||
|
|
||||||
|
float error = 0;
|
||||||
|
|
||||||
|
while (WifiThreadRunning)
|
||||||
|
{
|
||||||
|
if (!WifiOn)
|
||||||
|
{
|
||||||
|
Platform::Thread_Sleep(17);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
USTimer(0);
|
||||||
|
|
||||||
|
// TODO better timing control!!
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
u64 perfcur = Platform::Perf_GetCounter();
|
||||||
|
u64 time = perfcur - perflast;
|
||||||
|
u64 target = (u64)ustime;
|
||||||
|
if (time >= target)
|
||||||
|
{
|
||||||
|
perflast = perfcur;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1350,7 +1403,8 @@ void Write(u32 addr, u16 val)
|
||||||
if ((IOPORT(W_PowerUS) & 0x0001) && !(val & 0x0001))
|
if ((IOPORT(W_PowerUS) & 0x0001) && !(val & 0x0001))
|
||||||
{
|
{
|
||||||
printf("WIFI ON\n");
|
printf("WIFI ON\n");
|
||||||
NDS::ScheduleEvent(NDS::Event_Wifi, false, 33, USTimer, 0);
|
//NDS::ScheduleEvent(NDS::Event_Wifi, false, 33, USTimer, 0);
|
||||||
|
WifiOn = true;
|
||||||
if (!MPInited)
|
if (!MPInited)
|
||||||
{
|
{
|
||||||
Platform::MP_Init();
|
Platform::MP_Init();
|
||||||
|
@ -1365,7 +1419,8 @@ void Write(u32 addr, u16 val)
|
||||||
else if (!(IOPORT(W_PowerUS) & 0x0001) && (val & 0x0001))
|
else if (!(IOPORT(W_PowerUS) & 0x0001) && (val & 0x0001))
|
||||||
{
|
{
|
||||||
printf("WIFI OFF\n");
|
printf("WIFI OFF\n");
|
||||||
NDS::CancelEvent(NDS::Event_Wifi);
|
//NDS::CancelEvent(NDS::Event_Wifi);
|
||||||
|
WifiOn = false;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -343,6 +343,11 @@ void Thread_Wait(void* thread)
|
||||||
SDL_WaitThread((SDL_Thread*)((ThreadData*)thread)->ID, NULL);
|
SDL_WaitThread((SDL_Thread*)((ThreadData*)thread)->ID, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Thread_Sleep(u32 ms)
|
||||||
|
{
|
||||||
|
SDL_Delay(ms);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void* Semaphore_Create()
|
void* Semaphore_Create()
|
||||||
{
|
{
|
||||||
|
@ -370,6 +375,17 @@ void Semaphore_Post(void* sema)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
u64 Perf_GetFrequency()
|
||||||
|
{
|
||||||
|
return SDL_GetPerformanceFrequency();
|
||||||
|
}
|
||||||
|
|
||||||
|
u64 Perf_GetCounter()
|
||||||
|
{
|
||||||
|
return SDL_GetPerformanceCounter();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void* GL_GetProcAddress(const char* proc)
|
void* GL_GetProcAddress(const char* proc)
|
||||||
{
|
{
|
||||||
return uiGLGetProcAddress(proc);
|
return uiGLGetProcAddress(proc);
|
||||||
|
|
Loading…
Reference in New Issue