Begin Network Implementation

This commit is contained in:
André Schweiger 2017-01-26 23:23:58 +01:00
parent 31d576e879
commit a014be2c5a
4 changed files with 241 additions and 3 deletions

195
source/Network.c Normal file
View file

@ -0,0 +1,195 @@
#include "Network.h"
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
bool udsRunning;
size_t scannedNetworksCount;
udsNetworkScanInfo *scannedNetworks;
bool isConnected;
bool isServer;
size_t networkBufferSize;
u32 *networkBuffer;
udsNetworkStruct networkStruct;
udsBindContext networkBindCtx;
void networkInit() {
Result ret = udsInit(0x3000, NULL);
if(R_FAILED(ret)) {
udsRunning = false;
} else {
udsRunning = true;
scannedNetworksCount = 0;
scannedNetworks = NULL;
isConnected = false;
isServer = false;
networkBufferSize = 0x4000;
networkBuffer = malloc(networkBufferSize);
}
}
void networkExit() {
//TODO: Additionally to shutting down the service, clear any left over memory!
if(udsRunning) {
//cleanup any dynamically reserved memory
if(scannedNetworks!=NULL) free(scannedNetworks);
scannedNetworks = NULL;
free(networkBuffer);
networkDisconnect();
udsExit();
}
}
bool networkAvailable() {
return udsRunning;
}
bool networkHost() {
if(udsRunning && !isConnected) {
udsGenerateDefaultNetworkStruct(&networkStruct, NETWORK_WLANCOMMID, 0, NETWORK_MAXPLAYERS);
Result ret = udsCreateNetwork(&networkStruct, NETWORK_PASSPHRASE, strlen(NETWORK_PASSPHRASE)+1, &networkBindCtx, NETWORK_CHANNEL, NETWORK_RECVBUFSIZE);
if(R_FAILED(ret)) {
return false;
} else {
isConnected = true;
isServer = true;
return true;
}
}
return false;
}
void networkScan() {
if(udsRunning) {
//reset values from last scan
if(scannedNetworks!=NULL) free(scannedNetworks);
scannedNetworks = NULL;
scannedNetworksCount = 0;
//scan
memset(networkBuffer, 0, networkBufferSize);
Result ret = udsScanBeacons(networkBuffer, networkBufferSize, &scannedNetworks, &scannedNetworksCount, NETWORK_WLANCOMMID, 0, NULL, isConnected);
if(R_FAILED(ret)) {
//TODO: what do?
scannedNetworksCount = 0;
}
}
}
int networkGetScanCount() {
if(udsRunning) {
return scannedNetworksCount;
} else {
return 0;
}
}
bool networkGetScanName(char *name, int pos) {
if(udsRunning) {
if(pos<0 || pos>=scannedNetworksCount) return false;
Result ret = udsGetNodeInfoUsername(&scannedNetworks[pos].nodes[0], name);
if(R_FAILED(ret)) {
//TODO: what do?
return false;
}
return true;
}
return false;
}
bool networkConnect(int pos) {
if(udsRunning && !isConnected) {
if(pos<0 || pos>=scannedNetworksCount) return false;
Result ret = udsConnectNetwork(&scannedNetworks[pos].network, NETWORK_PASSPHRASE, strlen(NETWORK_PASSPHRASE)+1, &networkBindCtx, UDS_BROADCAST_NETWORKNODEID, UDSCONTYPE_Client, NETWORK_CHANNEL, NETWORK_RECVBUFSIZE);
if(R_FAILED(ret)) {
return false;
} else {
isConnected = true;
isServer = false;
return true;
}
}
return false;
}
void networkDisconnect() {
//TODO: For clients this just means disconnect, for the server it means destroy the network
if(udsRunning && isConnected) {
//TODO
if(isServer) {
udsDisconnectNetwork();
} else {
//TODO: Clients need to cleanup too, how can I tell they got disconnected
udsDestroyNetwork();
}
udsUnbind(&networkBindCtx);
isConnected = false;
}
}
bool networkConnected() {
return isConnected;
}
void networkSend(networkPacket *packet, size_t size) {
if(udsRunning && isConnected) {
//Server broadcasts to all clients but clients only send info to server
u16 dest;
if(isServer) {
dest = UDS_BROADCAST_NETWORKNODEID;
} else {
dest = UDS_HOST_NETWORKNODEID;
}
Result ret = udsSendTo(dest, NETWORK_CHANNEL, UDS_SENDFLAG_Default, packet, size);
if(UDS_CHECK_SENDTO_FATALERROR(ret)) {
//TODO: what do?
}
}
}
void networkRecieve() {
//TODO: Should recieve actually handle all the packets or just return them?
if(udsRunning && isConnected) {
size_t actualSize = 0;
u16 sourceNetworkNodeID;
memset(networkBuffer, 0, networkBufferSize);
Result ret = udsPullPacket(&networkBindCtx, networkBuffer, networkBufferSize, &actualSize, &sourceNetworkNodeID);
if(R_FAILED(ret)) {
//TODO: what do?
}
//actualSize will be 0 if no packet is available
if(actualSize) {
networkPacket *packet = (networkPacket*) networkBuffer;
//TODO: Differenciate the packets and process them
if(packet->analyze.type==0) {
}
}
}
}

40
source/Network.h Normal file
View file

@ -0,0 +1,40 @@
#pragma once
#include <3ds.h>
#define NETWORK_WLANCOMMID 0x11441850
#define NETWORK_PASSPHRASE "minicraft3ds localplay passphrase"
#define NETWORK_CHANNEL 1
#define NETWORK_RECVBUFSIZE UDS_DEFAULT_RECVBUFSIZE
#define NETWORK_MAXPLAYERS UDS_MAXNODES
//TODO: Every other packet struct should start with a u8 type to match this
typedef struct {
u8 type;
} packetAnalyze;
typedef struct {
union {
packetAnalyze analyze;
};
} networkPacket;
void networkInit();
void networkExit();
bool networkAvailable();
bool networkHost();
void networkScan();
int networkGetScanCount();
bool networkGetScanName(char *name, int pos); //TODO: Name should be long enough to handle all allowed names (char[256])
bool networkConnect(int pos);
void networkDisconnect();
bool networkConnected();
void networkSend(networkPacket *packet, size_t size); //TODO: Should this be a pointer? Calling function needs to cleanup itself
void networkRecieve(); //TODO: Should recieve actually handle all the packets or just return them?

View file

@ -124,7 +124,7 @@ void openNPCMenu(int npc) {
currentTalk2 = "or stupid to be walking"; currentTalk2 = "or stupid to be walking";
currentTalk3 = "around in this dungeon."; currentTalk3 = "around in this dungeon.";
currentTalk4 = ""; currentTalk4 = "";
currentTalk5 = "Who can I help you?"; currentTalk5 = "How can I help you?";
break; break;
case NPC_DWARF: case NPC_DWARF:
if(questManager.questlines[1].currentQuest<=1) { if(questManager.questlines[1].currentQuest<=1) {

View file

@ -12,6 +12,7 @@
#include "MapGen.h" #include "MapGen.h"
#include "Menu.h" #include "Menu.h"
#include "texturepack.h" #include "texturepack.h"
#include "Network.h"
// TODO: Dungeon is way to difficult // TODO: Dungeon is way to difficult
// -> Skeleton arrows are slower, do a little less damage // -> Skeleton arrows are slower, do a little less damage
@ -182,9 +183,10 @@ int main() {
osSetSpeedupEnable(shouldSpeedup); osSetSpeedupEnable(shouldSpeedup);
fclose(file); fclose(file);
} }
sf2d_init(); sf2d_init();
csndInit(); csndInit();
networkInit();
noItem = newItem(ITEM_NULL, 0); noItem = newItem(ITEM_NULL, 0);
initMenus(); initMenus();
@ -325,6 +327,7 @@ int main() {
sf2d_free_texture(minimap[4]); sf2d_free_texture(minimap[4]);
sf2d_free_texture(minimap[5]); sf2d_free_texture(minimap[5]);
freeSounds(); freeSounds();
networkExit();
csndExit(); csndExit();
cfguExit(); cfguExit();
sf2d_fini(); sf2d_fini();