Update Services with ndsp and wifi status checker

This commit is contained in:
Thomas Edvalson
2015-12-05 20:56:45 -05:00
parent 3a48b2052a
commit d42465368f
2 changed files with 46 additions and 28 deletions
+7 -6
View File
@@ -9,12 +9,13 @@
namespace cpp3ds {
enum ServiceName {
NETWORK = 1 << 0,
AUDIO = 1 << 1,
CONFIG = 1 << 2,
ROMFS = 1 << 3,
NETWORK = 1 << 0,
AUDIO = 1 << 1,
CONFIG = 1 << 2,
ROMFS = 1 << 3,
WIFI_STATUS = 1 << 4,
ALL = 0xFFFF
ALL = 0xFFFF
};
class Service {
@@ -26,7 +27,7 @@ public:
private:
static Uint16 m_enabledServices;
#ifndef EMULATION
static u32* socBuffer;
static u32* m_socBuffer;
#endif
};
+39 -22
View File
@@ -1,5 +1,6 @@
#include <cpp3ds/Config.hpp>
#include <cpp3ds/System/Service.hpp>
#include <cpp3ds/System/Err.hpp>
#include <3ds.h>
#include <malloc.h>
#include <sys/unistd.h>
@@ -8,7 +9,7 @@
namespace cpp3ds {
Uint16 Service::m_enabledServices = 0x0;
u32* Service::socBuffer = NULL;
u32* Service::m_socBuffer = nullptr;
bool Service::enable(ServiceName service) {
@@ -16,32 +17,39 @@ bool Service::enable(ServiceName service) {
return true;
bool success = false;
Result result;
switch (service) {
case ALL:
return enable(NETWORK) && enable(AUDIO) &&
enable(CONFIG) && enable(ROMFS);
case NETWORK:
socBuffer = (u32*) memalign(0x1000, 0x100000);
if (!socBuffer)
m_socBuffer = (u32*) memalign(0x1000, 0x100000);
if (m_socBuffer == nullptr)
break;
if (SOC_Initialize(socBuffer, 0x100000) != 0) {
free(socBuffer);
socBuffer = NULL;
result = socInit(m_socBuffer, 0x100000);
if (result != 0) {
err() << "Network service (soc:U) failed to initialize: " << std::hex << result;
socExit();
free(m_socBuffer);
break;
}
success = true;
break;
case AUDIO:
success = csndInit() == 0;
result = ndspInit();
success = R_SUCCEEDED(result);
if (!success)
err() << "Audio service (dsp) failed to initialize: " << std::hex << result;
break;
case CONFIG:
initCfgu();
success = true;
success = R_SUCCEEDED(cfguInit());
break;
case ROMFS:
romfsInit();
success = strcmp(getcwd(NULL,0), "romfs:/") == 0;
success = R_SUCCEEDED(romfsInit());
break;
case WIFI_STATUS:
success = R_SUCCEEDED(acInit());
break;
default:
break;
@@ -54,31 +62,32 @@ bool Service::enable(ServiceName service) {
bool Service::disable(ServiceName service) {
if (service & ~m_enabledServices)
if (service == ALL)
return disable(NETWORK) && disable(AUDIO) &&
disable(CONFIG) && disable(ROMFS);
if (!isEnabled(service))
return true;
bool success = true;
switch (service) {
case ALL:
return disable(NETWORK) && disable(AUDIO) &&
disable(CONFIG) && disable(ROMFS);
case NETWORK:
SOC_Shutdown();
free(socBuffer);
socBuffer = NULL;
socExit();
free(m_socBuffer);
break;
case AUDIO:
// TODO: Stop all audio
csndExecCmds(true);
csndExit();
ndspExit();
break;
case CONFIG:
exitCfgu();
cfguExit();
break;
case ROMFS:
romfsExit();
break;
case WIFI_STATUS:
acExit();
break;
default:
break;
}
@@ -90,6 +99,14 @@ bool Service::disable(ServiceName service) {
bool Service::isEnabled(ServiceName service) {
if (service == NETWORK) {
if (!enable(WIFI_STATUS))
return false;
u32 status;
Result result = ACU_GetWifiStatus(&status);
if (result != 0 || status == 0)
return false;
}
return service & m_enabledServices;
}