Space for the DS program.
There is a lot of errors but i'm using a old PC ( 350Mhz - win 98 )... only word pad seems to work correctly...
CODE
// Conversation between a pc and a DS
// Version 0.0001 16/03 15h08.
#include <PA9.h> // PAlib include
#include "C:\Projects\HelloWorld\source\wifi_shared.h"
#include "C:\Projects\HelloWorld\source\wifi_arm7.h"
//Template c ( ARM 7 surement )
//#include "C:\Documents and Settings\jleroy\Bureau\jl\librairie\wifi_lib_test\arm9\source\template.c"
#include "nds.h"
#include <nds/arm9/console.h> //basic print funcionality
#include <stdio.h>
#include <Stdlib.h>
#include <string.h>
#include <stdarg.h>
//#include "C:\Documents and Settings\jleroy\Bureau\jl\librairie\wifi_lib\arm9\include\dswifi9.h"
//#include "C:\Documents and Settings\jleroy\Bureau\jl\librairie\wifi_lib\arm9\include\sys\socket.h"
//#include "C:\Documents and Settings\jleroy\Bureau\jl\librairie\wifi_lib\arm9\include\netinet\in.h"
//#include "C:\Documents and Settings\jleroy\Bureau\jl\librairie\wifi_lib_test\arm9\data\ascii.bin"
//Ajout provenant du fichier template
#define VRAM1 ((u16 *) 0x06000000)
#define VRAM2 ((u16 *) 0x06200000)
#define VCOUNT (*((u16 volatile *) 0x04000006))
//#define PAL_BG1 ((volatile u16 *)0x05000000) // inutile
//#define PAL_BG1 ((volatile u16 *)0x05000400) // changer % à sgstair ici PAL_BG2
#define RGB(r,g,b) ((r) | ((g)<<5) | ((b)<<10))
Wifi_AccessPoint global_connectAP;
unsigned char global_wepkeys[4][32];
int global_wepkeyid, global_wepmode;
int global_dhcp; // 0=none, 1=get IP, 2=get DNS
unsigned long global_ipaddr, global_snmask, global_gateway, global_dns1,global_dns2;
void ScrollUpTop() {
int i;
for(i=0;i<23*32;i++)
VRAM1[0x07C00+i]=VRAM1[0x07C00+i+32];
for(i=0;i<32;i++) {
VRAM1[0x07C00+23*32+i]=' ';
}
}
void printtop(const char * str) {
int x;
ScrollUpTop();
x=0;
while(*str) {
if(x==32) {x=0; ScrollUpTop();}
VRAM1[0x07C00+23*32+x++]=*str;
str++;
}
}
void sgIP_dbgprint(char * txt,...) {
char buffer[256];
va_list args;
va_start(args,txt);
vsprintf(buffer,txt,args);
printtop(buffer);
}
void printbtm(int x, int y, const char * str) {
while(*str) {
if(x==32) {x=0; y++;}
if(y==24) return;
VRAM2[0x07C00+y*32+x++]=*str;
str++;
}
}
void printbtmn(int x, int y, const char * str, int n) {
while(*str && 0<=--n) {
if(x==32) {x=0; y++;}
if(y==24) return;
VRAM2[0x07C00+y*32+x++]=*str;
str++;
}
}
void * sgIP_malloc(int size) { return malloc(size); }
void sgIP_free(void * ptr) { free(ptr); }
//Cette fonction provient de Dsreg.h
#define IME (*((u16 volatile *) 0x04000208)) //Elle était mise en commentaires.
//Ces fonctions proviennent de wifi_arm9.c ( autres en dessous )
int sgIP_DisableInterrupts() {
int a;
a=IME;
IME=0;
return a;
}
void sgIP_RestoreInterrupts(int old_ime) {
IME=old_ime;
}
//Ajout provenant du fichier in.h
#define INADDR_ANY 0x00000000
#define INADDR_BROADCAST 0xFFFFFFFF
#define INADDR_NONE 0xFFFFFFFF
struct in_addr {
unsigned long s_addr;
};
struct sockaddr_in {
unsigned short sin_family;
unsigned short sin_port;
struct in_addr sin_addr;
unsigned char sin_zero[8];
};
//Fonctions provenant de socket.h
#define PF_UNSPEC 0
#define PF_INET 2
#define PF_INET6 10
#define AF_UNSPEC PF_UNSPEC
#define AF_INET PF_INET
#define AF_INET6 PF_INET6
#define SOCK_STREAM 1
#define SOCK_DGRAM 2
#define FIONBIO 1
//#ifndef ntohs
#define ntohs(num) htons(num)
#define ntohl(num) htonl(num)
//#endif
//Fonctions provenant de sgIP_socket.h
#define SGIP_SOCKET_FLAG_ACTIVE 0x8000
#define SGIP_SOCKET_FLAG_NONBLOCKING 0x4000
#define SGIP_SOCKET_FLAG_TYPEMASK 0x0001
#define SGIP_SOCKET_FLAG_TYPE_TCP 0x0001
#define SGIP_SOCKET_FLAG_TYPE_UDP 0x0000
typedef struct SGIP_SOCKET_DATA {
unsigned int flags;
void * conn_ptr;
} sgIP_socket_data;
//Fonctions provenant de sgIP_Config.h
#define SGIP_SOCKET_MAXSOCKETS 32
// SGIP_TCPRECEIVEBUFFERLENGTH: The size (in bytes) of the receive FIFO in a TCP connection
#define SGIP_TCP_RECEIVEBUFFERLENGTH 8192
// SGIP_TCPTRANSMITBUFFERLENGTH: The size (in bytes) of the transmit FIFO in a TCP connection
#define SGIP_TCP_TRANSMITBUFFERLENGTH 8192
// SGIP_TCPOOBBUFFERLENGTH: The size (in bytes) of the receive OOB data FIFO in a TCP connection
#define SGIP_TCP_OOBBUFFERLENGTH 256
// SGIP_MEMBLOCK_DATASIZE: This is the maximum data size contained in a single sgIP_memblock.
// for best performance ensure this value is larger than any packet that is expected to be
// received, however, in a memory-tight situation, much smaller values can be used.
#define SGIP_MEMBLOCK_DATASIZE 1600
// SGIP_MEMBLOCK_BASENUM: The starting number of memblocks that will be allocated. This is
// also the total number of memblocks that will be allocated if sgIP is not configured to use
// dynamic memory allocation.
#define SGIP_MEMBLOCK_BASENUM 12
// SGIP_MAXHWHEADER: The maximum allocated size for hardware headers.
#define SGIP_MAXHWHEADER 16
// SGIP_TCP_TTL: Time-to-live value given to outgoing packets, in the absence of a reason to
// manually override this value.
#define SGIP_IP_TTL 128
// SGIP_HUB_MAXHWINTERFACES: The maximum number of hardware interfaces the sgIP hub will
// connect to. A hardware interface being some port (ethernet, wifi, etc) that will relay
// packets to the outside world.
#define SGIP_HUB_MAXHWINTERFACES 1
// SGIP_MAXHWADDRLEN: The maximum usable hardware address length. Ethernet is 6 bytes.
#define SGIP_MAXHWADDRLEN 8
// SGIP_ARP_MAXENTRIES: The maximum number of cached ARP entries - this is defined staticly
// because it's somewhat impractical to dynamicly allocate memory for such a small structure
// (at least on most smaller systems)
#define SGIP_ARP_MAXENTRIES 32
#define SGIP_INTR_PROTECT() \
int tIME; \
tIME=sgIP_DisableInterrupts();
#define SGIP_INTR_REPROTECT() \
tIME=sgIP_DisableInterrupts();
#define SGIP_INTR_UNPROTECT() \
sgIP_RestoreInterrupts(tIME);
//#else // !SGIP_INTERRUPT_THREADING_MO
// SGIP_DEBUG: Enable debug logging.
// requires external function "void sgIP_dbgprint(char *,...);"
#define SGIP_DEBUG
#ifdef SGIP_DEBUG
#define SGIP_DEBUG_MESSAGE(param) sgIP_dbgprint param
#define SGIP_DEBUG_ERROR(param) sgIP_dbgprint param; while(1);
#else
#define SGIP_DEBUG_MESSAGE(param)
#define SGIP_DEBUG_ERROR(param)
#endif
//Fonctions provenant de sgIP_socket.c
sgIP_socket_data socketlist[SGIP_SOCKET_MAXSOCKETS];
//Ces fonctions appartiennent à SgIP_memblock.h
typedef struct SGIP_MEMBLOCK {
int totallength;
int thislength;
struct SGIP_MEMBLOCK * next;
char * datastart;
char reserved[SGIP_MEMBLOCK_DATASIZE-16]; // assume the other 4 values are 16 bytes total in length.
} sgIP_memblock;
#define SGIP_MEMBLOCK_INTERNALSIZE (SGIP_MEMBLOCK_DATASIZE-16)
#define SGIP_MEMBLOCK_FIRSTINTERNALSIZE (SGIP_MEMBLOCK_DATASIZE-16-SGIP_MAXHWHEADER)
//Ces fonctions appartiennent à sgIP_memblock.c
#include <stdlib.h>
#ifndef SGIP_USEDYNAMICMEMORY
sgIP_memblock memblock_pool[SGIP_MEMBLOCK_BASENUM];
#else
sgIP_memblock * memblock_pool;
#endif
sgIP_memblock * memblock_poolfree; //
int numused, numfree; //
void * pool_link; //
sgIP_memblock * sgIP_memblock_getunused() { //
//int i;
sgIP_memblock * mb;
SGIP_INTR_PROTECT();
if(memblock_poolfree) { // we still have free memblocks!
mb=memblock_poolfree;
memblock_poolfree=mb->next;
numfree--;
numused++;
} else { // oh noes, we have no more free memblocks.
mb = 0; // eventually alloc new blocks, but for now just stop.
}
SGIP_INTR_UNPROTECT();
return mb;
}
void sgIP_memblock_Init() {
int i;
#ifdef SGIP_USEDYNAMICMEMORY
pool_link = sgIP_malloc(sizeof(sgIP_memblock)*SGIP_MEMBLOCK_BASENUM+4);
((long *)pool_link)[0]=0;
memblock_pool = (sgIP_memblock *) (((char *)pool_link)+4);
#endif
numused=numfree=0;
memblock_poolfree=0;
for(i=0;i<SGIP_MEMBLOCK_BASENUM;i++) {
memblock_pool[i].totallength=0;
memblock_pool[i].next=memblock_poolfree;
memblock_poolfree=memblock_pool+i;
numfree++;
}
}
void sgIP_memblock_free(sgIP_memblock * mb) { //
sgIP_memblock * f;
SGIP_INTR_PROTECT();
while(mb) {
mb->totallength=0;
mb->thislength=0;
f=mb;
mb = mb->next;
numfree++; // reinstate memblock into the pool!
numused--;
f->next=memblock_poolfree;
memblock_poolfree=f;
}
// SGIP_DEBUG_MESSAGE(("memblock_free: %i free, %i used",numfree,numused));
SGIP_INTR_UNPROTECT();
}
sgIP_memblock * sgIP_memblock_allocHW(int headersize, int packetsize) { //
sgIP_memblock * mb, * tmb, *t;
int totlen;
mb = sgIP_memblock_getunused();
if(!mb) return 0;
mb->totallength=headersize+packetsize;
mb->datastart=mb->reserved+SGIP_MAXHWHEADER-headersize;
mb->next=0;
mb->thislength=headersize+SGIP_MEMBLOCK_FIRSTINTERNALSIZE;
if(mb->thislength>=mb->totallength) {
mb->thislength = mb->totallength;
// SGIP_DEBUG_MESSAGE(("memblock_alloc: %i free, %i used",numfree,numused));
return mb;
} else { // need more blocks
totlen=mb->thislength;
tmb=mb;
while(totlen<mb->totallength) {
t=sgIP_memblock_getunused();
if(!t) { // we're skrewed.
sgIP_memblock_free(mb);
return 0;
}
tmb->next=t;
t->totallength=mb->totallength;
t->datastart=mb->reserved; // no header on blocks after the first.
t->next=0;
t->thislength=SGIP_MEMBLOCK_INTERNALSIZE;
if(t->thislength+totlen>=mb->totallength) {
t->thislength=mb->totallength-totlen;
// SGIP_DEBUG_MESSAGE(("memblock_alloc: %i free, %i used",numfree,numused));
return mb;
} else { // need YET more blocks.
totlen+=t->thislength;
tmb=t;
} // the cycle contiues.
}
sgIP_memblock_free(mb); // should never get here.
}
return 0;
}
sgIP_memblock * sgIP_memblock_alloc(int packetsize) {//
return sgIP_memblock_allocHW(0,packetsize);
}
// positive to expose, negative to hide.
void sgIP_memblock_exposeheader(sgIP_memblock * mb, int change) {//
if(mb) {
mb->thislength+=change;
mb->totallength+=change;
mb->datastart-=change;
while(mb->next) {
mb->next->totallength=mb->totallength;
mb=mb->next;
}
}
}
int sgIP_memblock_IPChecksum(sgIP_memblock * mb, int startbyte, int chksum_length) {
int chksum_temp,offset;
// check checksum
chksum_temp=0;
offset=0;
while(mb && startbyte>mb->thislength) { startbyte-=mb->thislength; mb=mb->next; }
if(!mb) return 0;
while(chksum_length) {
while(startbyte+offset+1<mb->thislength && chksum_length>1) {
chksum_temp+= ((unsigned char *)mb->datastart)[startbyte+offset] + (((unsigned char *)mb->datastart)[startbyte+offset+1]<<8);
offset+=2;
chksum_length-=2;
}
chksum_temp += chksum_temp>>16;
chksum_temp &= 0xFFFF;
if(startbyte+offset<mb->thislength && chksum_length>0) {
chksum_temp+= ((unsigned char *)mb->datastart)[startbyte+offset];
if(chksum_length==1) break;
chksum_length--;
offset=0;
startbyte=0;
mb=mb->next;
if(!mb) break;
if(mb->thislength==0) break;
chksum_temp+= ((unsigned char *)mb->datastart)[startbyte+offset]<<8;
if(chksum_length==1) break;
offset++;
chksum_length--;
}
}
chksum_temp += chksum_temp>>16;
chksum_temp &= 0xFFFF;
return chksum_temp;
}
//Fonctions provenant de sgIP_Hub.h
// SGIP_HUB_MAXHWINTERFACES: The maximum number of hardware interfaces the sgIP hub will
// connect to. A hardware interface being some port (ethernet, wifi, etc) that will relay
// packets to the outside world.
#define SGIP_HUB_MAXHWINTERFACES 1
#define SGIP_LITTLEENDIAN //( Ces lignes proviennent de sgIP_Config.h
#ifdef SGIP_LITTLEENDIAN
unsigned short htons(unsigned short num) {
return ((num<<8)&0xFF00) | (num>>8);
}
unsigned long htonl(unsigned long num) {
return (num<<24) | ((num&0xFF00)<<8) | ((num&0xFF0000)>>8) | (num>>24);
}
#else
unsigned short htons(unsigned short num) {
return num;
}
unsigned long htonl(unsigned long num) {
return num;
}
#endif
#define SGIP_FLAG_PROTOCOL_IN_USE 0x0001
#define SGIP_FLAG_PROTOCOL_ENABLED 0x8000
#define SGIP_FLAG_HWINTERFACE_IN_USE 0x0001
#define SGIP_FLAG_HWINTERFACE_CONNECTED 0x0002
#define SGIP_FLAG_HWINTERFACE_USEDHCP 0x0004
#define SGIP_FLAG_HWINTERFACE_CHANGENETWORK 0x0008
#define SGIP_FLAG_HWINTERFACE_ENABLED 0x8000
// structure sgIP_Hub_Protocol: Used to record the interface between the sgIP Hub and a protocol handler
typedef struct SGIP_HUB_PROTOCOL {
unsigned short flags;
unsigned short protocol;
int (*ReceivePacket)(sgIP_memblock *);
} sgIP_Hub_Protocol;
typedef struct SGIP_HUB_HWINTERFACE {
unsigned short flags;
unsigned short hwaddrlen;
int MTU;
int (*TransmitFunction)(struct SGIP_HUB_HWINTERFACE *, sgIP_memblock *);
void * userdata;
unsigned long ipaddr, gateway, snmask, dns[3];
unsigned char hwaddr[SGIP_MAXHWADDRLEN];
} sgIP_Hub_HWInterface;
typedef struct SGIP_HEADER_ETHERNET {
unsigned char dest_mac[6];
unsigned char src_mac[6];
unsigned short protocol;
} sgIP_Header_Ethernet;
sgIP_Hub_HWInterface HWInterfaces[SGIP_HUB_MAXHWINTERFACES];
int sgIP_Hub_SendRawPacket(sgIP_Hub_HWInterface * hw, sgIP_memblock * packet); //définition après
//Fonctions provenant de sgIP_ARP.h
#define SGIP_ARP_FLAG_ACTIVE 0x0001
#define SGIP_ARP_FLAG_HAVEHWADDR 0x0002
typedef struct SGIP_ARP_RECORD {
unsigned short flags, retrycount;
unsigned long idletime;
sgIP_Hub_HWInterface * linked_interface;
sgIP_memblock * queued_packet;
int linked_protocol;
unsigned long protocol_address;
char hw_address[SGIP_MAXHWADDRLEN];
} sgIP_ARP_Record;
typedef struct SGIP_HEADER_ARP {
unsigned short hwspace; // ethernet=1;
unsigned short protocol;
unsigned char hw_addr_len;
unsigned char protocol_addr_len;
unsigned short opcode; // request=1, reply=2
unsigned char addresses[8+12]; // sender HW, sender Protocol, dest HW, dest Protocol
} sgIP_Header_ARP;
sgIP_ARP_Record ArpRecords[SGIP_ARP_MAXENTRIES];
#define SGIP_HEADER_ARP_BASESIZE 8
//Fonctions provenant de sgIP_ARP.c
int sgIP_FindArpSlot(sgIP_Hub_HWInterface * hw, unsigned long destip) {
int i;
for(i=0;i<SGIP_ARP_MAXENTRIES;i++) {
if(ArpRecords[i].flags&SGIP_ARP_FLAG_ACTIVE) {
if(ArpRecords[i].linked_interface==hw && ArpRecords[i].protocol_address==destip) return i;
}
}
return -1;
}
int sgIP_GetArpSlot() {
int i,m,midle;
m=0;
midle=0;
for(i=0;i<SGIP_ARP_MAXENTRIES;i++) {
if(ArpRecords[i].flags&SGIP_ARP_FLAG_ACTIVE) {
if(ArpRecords[i].idletime>=midle) {
midle=ArpRecords[i].idletime; m=i;
}
} else {
return i;
}
}
// this slot *was* in use, so let's fix that situation.
if(ArpRecords[m].queued_packet) sgIP_memblock_free(ArpRecords[m].queued_packet);
ArpRecords[m].flags=0;
ArpRecords[m].retrycount=0;
ArpRecords[m].idletime=0;
ArpRecords[m].queued_packet=0;
return m;
}
int sgIP_is_broadcast_address(sgIP_Hub_HWInterface * hw, unsigned long ipaddr) {
if((hw->snmask | ipaddr) == 0xFFFFFFFF) return 1;
return 0;
}
int sgIP_ARP_SendARPRequest(sgIP_Hub_HWInterface * hw, int protocol, unsigned long protocol_addr) {
int i;
if(!hw) return 0;
sgIP_memblock * mb = sgIP_memblock_alloc(SGIP_HEADER_ARP_BASESIZE+2*4 + 2*hw->hwaddrlen);
if(!mb) return 0;
// Construct ARP packet
sgIP_Header_ARP * arp = (sgIP_Header_ARP *) mb->datastart;
arp->hwspace=htons(1); // 1=ethernet
arp->protocol=(protocol);
arp->opcode=htons(1); // 1=request
arp->hw_addr_len=hw->hwaddrlen;
arp->protocol_addr_len= 4;
for(i=0;i<hw->hwaddrlen;i++) arp->addresses[i]=hw->hwaddr[i];
for(i=0;i<4;i++) arp->addresses[i+hw->hwaddrlen]=(hw->ipaddr>>(i*8))&255;
for(i=0;i<hw->hwaddrlen;i++) arp->addresses[i+4+hw->hwaddrlen]=0;
for(i=0;i<4;i++) arp->addresses[i+hw->hwaddrlen*2+4]=(protocol_addr>>(i*8))&255;
// construct ethernet header
sgIP_memblock_exposeheader(mb,14); // add 14 bytes at the start for the header
sgIP_Header_Ethernet * ether = (sgIP_Header_Ethernet *) mb->datastart;
for(i=0;i<6;i++) {
ether->src_mac[i] = hw->hwaddr[i];
ether->dest_mac[i]= 0xFF; // broadcast packet
}
ether->protocol=htons(0x0806); // ARP protocol
// Send ethernet packet
return sgIP_Hub_SendRawPacket(hw,mb); // this function will free the memory block when it's done.
}
int sgIP_ARP_SendProtocolFrame(sgIP_Hub_HWInterface * hw, sgIP_memblock * mb, unsigned short protocol, unsigned long destaddr) {
int i,j;
int m;
sgIP_Header_Ethernet * ether;
if(!hw || !mb) return 0;
sgIP_memblock_exposeheader(mb,14); // add 14 bytes at the start for the header
if(sgIP_is_broadcast_address(hw,destaddr)) {
// construct ethernet header
ether = (sgIP_Header_Ethernet *) mb->datastart;
for(j=0;j<6;j++) {
ether->src_mac[j] = hw->hwaddr[j];
ether->dest_mac[j]= 0xFF; // broadcast destination
}
ether->protocol=protocol;
return sgIP_Hub_SendRawPacket(hw,mb); // this function will free the memory block when it's done.
}
i=sgIP_FindArpSlot(hw,destaddr);
if(i!=-1) {
if(ArpRecords[i].flags & SGIP_ARP_FLAG_HAVEHWADDR) { // we have the adddress
ArpRecords[i].idletime=0;
// construct ethernet header
ether = (sgIP_Header_Ethernet *) mb->datastart;
for(j=0;j<6;j++) {
ether->src_mac[j] = hw->hwaddr[j];
ether->dest_mac[j]= ArpRecords[i].hw_address[j];
}
ether->protocol=protocol;
return sgIP_Hub_SendRawPacket(hw,mb); // this function will free the memory block when it's done.
} else { // we don't have the address, but are looking for it.
if(ArpRecords[i].queued_packet) { // if there is already a queued packet, reject the new one.
sgIP_memblock_free(mb);
return 0; // couldn't send.
} else {
sgIP_memblock_exposeheader(mb,-14); // re-hide ethernet header.
ArpRecords[i].queued_packet=mb; // queue packet.
ArpRecords[i].linked_protocol=protocol; // queue packet.
return 0;
}
}
}
m=sgIP_GetArpSlot(); // gets and cleans out an arp slot for us
// build new record
ArpRecords[m].flags=SGIP_ARP_FLAG_ACTIVE;
ArpRecords[m].idletime=0;
ArpRecords[m].retrycount=0;
ArpRecords[m].linked_interface=hw;
ArpRecords[m].protocol_address=destaddr;
sgIP_memblock_exposeheader(mb,-14); // re-hide ethernet header.
ArpRecords[m].queued_packet=mb;
ArpRecords[m].linked_protocol=protocol;
sgIP_ARP_SendARPRequest(hw,protocol,destaddr);
return 0; // queued, but not sent yet.
}
//Fonctions provenant de sgIP_Hub.c
int sgIP_Hub_SendProtocolPacket(int protocol, sgIP_memblock * packet, unsigned long dest_address, unsigned long src_address) {
if(!packet) return 0;
sgIP_Hub_HWInterface * hw;
int i;
hw=0;
// figure out what hardware interface is in use.
for(i=0;i<SGIP_HUB_MAXHWINTERFACES;i++) if(HWInterfaces[i].ipaddr==src_address) {hw=HWInterfaces+i; break;}
if(!hw) {
sgIP_memblock_free(packet);
return 0;
}
// resolve protocol address to hardware address & send packet
if((src_address & hw->snmask) == (dest_address & hw->snmask)) { // on same network, send directly.
return sgIP_ARP_SendProtocolFrame(hw,packet,protocol,dest_address);
} else { // eek, on different network. Send to gateway
return sgIP_ARP_SendProtocolFrame(hw,packet,protocol,hw->gateway);
}
}
// send packet on a hardware interface.
int sgIP_Hub_SendRawPacket(sgIP_Hub_HWInterface * hw, sgIP_memblock * packet) {
if(!hw || !packet) return 0;
if(hw->flags&SGIP_FLAG_HWINTERFACE_ENABLED) {
return hw->TransmitFunction(hw,packet);
}
sgIP_memblock_free(packet);
return 0;
}
unsigned long sgIP_Hub_GetCompatibleIP(unsigned long destIP) {
int n;
for(n=0;n<SGIP_HUB_MAXHWINTERFACES;n++) {
if((HWInterfaces[n].flags&SGIP_FLAG_HWINTERFACE_IN_USE)) {
if((HWInterfaces[n].ipaddr & HWInterfaces[n].snmask) == (destIP & HWInterfaces[n].snmask)) return HWInterfaces[n].ipaddr;
}
}
for(n=0;n<SGIP_HUB_MAXHWINTERFACES;n++) {
if((HWInterfaces[n].flags&SGIP_FLAG_HWINTERFACE_IN_USE)) {
return HWInterfaces[n].ipaddr;
}
}
return 0;
}
//Toutes ces fonctions appartiennent à sg_IP.h
typedef struct SGIP_HEADER_IP {
unsigned char version_ihl; // version = top 4 bits == 4, IHL = header length in 32bit increments = bottom 4 bits
unsigned char type_of_service; // [3bit prescidence][ D ][ T ][ R ][ 0 0 ] - D=low delya, T=high thoroughput, R= high reliability
unsigned short tot_length; // total length of packet including header
unsigned short identification; // value assigned by sender to aid in packet reassembly
unsigned short fragment_offset; // top 3 bits are flags [0][DF][MF] (Don't Fragment / More Fragments Exist) - offset is in 8-byte chunks.
unsigned char TTL; // time to live, measured in hops
unsigned char protocol; // protocols: ICMP=1, TCP=6, UDP=17
unsigned short header_checksum; // checksum:
unsigned long src_address; // src address is 32bit IP address
unsigned long dest_address; // dest address is 32bit IP address
unsigned char options[4]; // optional options come here.
} sgIP_Header_IP;
//Toutes ces fonctions appartiennent à sgIP_IP.c
int idnum_count;
int sgIP_IP_RequiredHeaderSize() {
return 5*4; // we'll not include zeroed options.
}
int sgIP_IP_SendViaIP(sgIP_memblock * mb, int protocol, unsigned long srcip, unsigned long destip) {
sgIP_Header_IP * iphdr;
unsigned short * chksum_calc;
int chksum_temp,i;
sgIP_memblock_exposeheader(mb,20);
iphdr=(sgIP_Header_IP *)mb->datastart;
chksum_calc=(unsigned short *)mb->datastart;
iphdr->dest_address=destip;
iphdr->fragment_offset=0;
iphdr->header_checksum=0;
iphdr->identification=idnum_count++;
iphdr->protocol=protocol;
iphdr->src_address=srcip;
iphdr->tot_length=htons(mb->totallength);
iphdr->TTL=SGIP_IP_TTL;
iphdr->type_of_service=0;
iphdr->version_ihl=0x45;
chksum_temp=0;
for(i=0;i<10;i++) chksum_temp+=chksum_calc[i];
chksum_temp += chksum_temp>>16;
chksum_temp &= 0xFFFF;
chksum_temp = ~chksum_temp;
if(chksum_temp==0) chksum_temp=0xFFFF;
iphdr->header_checksum=chksum_temp;
sgIP_Hub_SendProtocolPacket(htons(0x0800),mb,destip,srcip);
return 0;}
unsigned long sgIP_IP_GetLocalBindAddr(unsigned long srcip, unsigned long destip) {
if(srcip) return srcip;
return sgIP_Hub_GetCompatibleIP(destip);
}
//Cette fonction provient de SgIP_TCP.h
// sgIP_Record_TCP - a TCP record, to store data for an active TCP connection.
typedef struct SGIP_RECORD_TCP {
struct SGIP_RECORD_TCP * next; // operate as a linked list
// TCP state information
int tcpstate;
unsigned long sequence;
unsigned long ack;
unsigned long rxwindow;
unsigned long txwindow;
unsigned long srcip;
unsigned long destip;
unsigned short srcport,destport;
void * listendata;
int maxlisten;
// TCP buffer information:
int buf_rx_in, buf_rx_out;
int buf_tx_in, buf_tx_out;
int buf_oob_in, buf_oob_out;
unsigned char buf_rx[SGIP_TCP_RECEIVEBUFFERLENGTH];
unsigned char buf_tx[SGIP_TCP_TRANSMITBUFFERLENGTH];
unsigned char buf_oob[SGIP_TCP_OOBBUFFERLENGTH];
} sgIP_Record_TCP;
//Cette fonction provient de SgIP_UDP.h
enum SGIP_UDP_STATE {
SGIP_UDP_STATE_UNBOUND, // newly allocated
SGIP_UDP_STATE_BOUND, // got a source address/port
SGIP_UDP_STATE_UNUSED, // no longer in use.
};
typedef struct SGIP_HEADER_UDP {
unsigned short srcport,destport;
unsigned short length,checksum;
} sgIP_Header_UDP;
typedef struct SGIP_RECORD_UDP {
struct SGIP_RECORD_UDP * next;
int state;
unsigned long srcip;
unsigned long destip;
unsigned short srcport,destport;
sgIP_memblock * incoming_queue;
sgIP_memblock * incoming_queue_end;
} sgIP_Record_UDP;
sgIP_Record_UDP * udprecords;
sgIP_Record_UDP * sgIP_UDP_AllocRecord() {
SGIP_INTR_PROTECT();
sgIP_Record_UDP * rec;
rec = (sgIP_Record_UDP *)sgIP_malloc(sizeof(sgIP_Record_UDP));
if(rec) {
rec->destip=0;
rec->destport=0;
rec->incoming_queue=0;
rec->incoming_queue_end=0;
rec->srcip=0;
rec->srcport=0;
rec->state=0;
rec->next=udprecords;
udprecords=rec;
}
SGIP_INTR_UNPROTECT();
return rec;
}
void sgIP_sockets_Init() {
int i;
for(i=0;i<SGIP_SOCKET_MAXSOCKETS;i++) {
socketlist[i].conn_ptr=0;
socketlist[i].flags = 0;
}
}
int socket(int domain, int type, int protocol) {
int s;
if(domain!=AF_INET) return -1;
if(protocol!=0) return -1;
if(type!=SOCK_DGRAM && type!=SOCK_STREAM) return -1;
SGIP_INTR_PROTECT();
for(s=0;s<SGIP_SOCKET_MAXSOCKETS;s++) if(!(socketlist[s].flags&SGIP_SOCKET_FLAG_ACTIVE)) break;
if(type==SOCK_STREAM) {
//socketlist[s].flags=SGIP_SOCKET_FLAG_ACTIVE | SGIP_SOCKET_FLAG_TYPE_TCP;
//socketlist[s].conn_ptr=sgIP_TCP_AllocRecord();
} else if(type==SOCK_DGRAM) {
socketlist[s].flags=SGIP_SOCKET_FLAG_ACTIVE | SGIP_SOCKET_FLAG_TYPE_UDP;
socketlist[s].conn_ptr=sgIP_UDP_AllocRecord();
} else {
SGIP_INTR_UNPROTECT();
return -1;
}
#ifdef SGIP_SOCKET_DEFAULT_NONBLOCK
socketlist[s].flags|=SGIP_SOCKET_FLAG_NONBLOCKING;
#endif
SGIP_INTR_UNPROTECT();
return s+1;
}
void sgIP_UDP_FreeRecord(sgIP_Record_UDP * rec) {
if(!rec) return;
SGIP_INTR_PROTECT();
sgIP_Record_UDP * t;
// incoming queue is all clumped together as a single memblock, so, time to free it all in one call :)
if(rec->incoming_queue) sgIP_memblock_free(rec->incoming_queue); // woohoo!
rec->state=0;
if(udprecords==rec) {
udprecords=rec->next;
} else {
t=udprecords;
while(t) {
if(t->next==rec) {
t->next=rec->next;
break;
}
t=t->next;
}
}
sgIP_free(rec);
SGIP_INTR_UNPROTECT();
}
int close(int socket) {
if(socket<1 || socket>SGIP_SOCKET_MAXSOCKETS) return -1;
SGIP_INTR_PROTECT();
socket--;
if((socketlist[socket].flags&SGIP_SOCKET_FLAG_TYPEMASK)==SGIP_SOCKET_FLAG_TYPE_TCP) {
;//sgIP_TCP_FreeRecord((sgIP_Record_TCP *)socketlist[socket].conn_ptr);
} else if((socketlist[socket].flags&SGIP_SOCKET_FLAG_TYPEMASK)==SGIP_SOCKET_FLAG_TYPE_UDP) {
sgIP_UDP_FreeRecord((sgIP_Record_UDP *)socketlist[socket].conn_ptr);
}
socketlist[socket].conn_ptr=0;
socketlist[socket].flags=0;
SGIP_INTR_UNPROTECT();
return 0;
}
int sgIP_UDP_Bind(sgIP_Record_UDP * rec, int srcport, unsigned long srcip) {
if(!rec) return 0;
SGIP_INTR_PROTECT();
if(rec->state!=SGIP_UDP_STATE_UNUSED) {
rec->srcip=srcip;
rec->srcport=srcport;
if(rec->state==SGIP_UDP_STATE_UNBOUND) rec->state=SGIP_UDP_STATE_BOUND;
}
SGIP_INTR_UNPROTECT();
return 0;
}
int bind(int socket,const struct sockaddr * addr, int addr_len) {
if(socket<1 || socket>SGIP_SOCKET_MAXSOCKETS) return -1;
SGIP_INTR_PROTECT();
int retval=-1;
socket--;
if((socketlist[socket].flags&SGIP_SOCKET_FLAG_TYPEMASK)==SGIP_SOCKET_FLAG_TYPE_TCP) {
} else if((socketlist[socket].flags&SGIP_SOCKET_FLAG_TYPEMASK)==SGIP_SOCKET_FLAG_TYPE_UDP) {
retval=sgIP_UDP_Bind((sgIP_Record_UDP *)socketlist[socket].conn_ptr,((struct sockaddr_in *)addr)->sin_port,((struct sockaddr_in *)addr)->sin_addr.s_addr);
}
SGIP_INTR_UNPROTECT();
return 0;
}
int sgIP_UDP_CalcChecksum(sgIP_memblock * mb, unsigned long srcip, unsigned long destip, int totallength) {
int checksum;//i;
if(!mb) return 0;
if(mb->totallength&1) mb->datastart[mb->totallength]=0;
checksum=sgIP_memblock_IPChecksum(mb,0,mb->totallength);
// add in checksum of "faux header"
checksum+=(destip&0xFFFF);
checksum+=(destip>>16);
checksum+=(srcip&0xFFFF);
checksum+=(srcip>>16);
checksum+=htons(totallength);
checksum+=(17)<<8;
checksum+=(checksum>>16);
checksum&=0xFFFF;
return checksum;
}
int sgIP_UDP_SendPacket(sgIP_Record_UDP * rec, char * data, int datalen, unsigned long destip, int destport) {
if(!rec || !data) return 0;
if(rec->state!=SGIP_UDP_STATE_BOUND) return 0;
int packetsize=sgIP_IP_RequiredHeaderSize()+8+datalen;
sgIP_memblock * mb = sgIP_memblock_alloc(packetsize);
if(!mb) return 0;
sgIP_memblock_exposeheader(mb,-sgIP_IP_RequiredHeaderSize()); // hide IP header space for later
SGIP_INTR_PROTECT();
unsigned long srcip = sgIP_IP_GetLocalBindAddr(rec->srcip,destip);
sgIP_Header_UDP * udp = (sgIP_Header_UDP *) mb->datastart;
udp->srcport=rec->srcport;
udp->destport=destport;
udp->length=htons(datalen+8);
udp->checksum=0;
int i;
for(i=0;i<datalen;i++) {
mb->datastart[i+8]=data[i];
}
udp->checksum=~sgIP_UDP_CalcChecksum(mb,srcip,destip,mb->totallength);
if(udp->checksum==0) udp->checksum=0xFFFF;
sgIP_IP_SendViaIP(mb,17,srcip,destip);
SGIP_INTR_UNPROTECT();
return datalen;
}
int sgIP_UDP_SendTo(sgIP_Record_UDP * rec, char * buf, int buflength, int flags, unsigned long dest_ip, int dest_port) {
return sgIP_UDP_SendPacket(rec,buf,buflength,dest_ip,dest_port);
}
int sendto(int socket, const void * data, int sendlength, int flags, const struct sockaddr * addr, int addr_len) {
if(socket<1 || socket>SGIP_SOCKET_MAXSOCKETS) return -1;
if(!addr) return -1;
SGIP_INTR_PROTECT();
int retval=-1;
socket--;
if((socketlist[socket].flags&SGIP_SOCKET_FLAG_TYPEMASK)==SGIP_SOCKET_FLAG_TYPE_TCP) {
} else if((socketlist[socket].flags&SGIP_SOCKET_FLAG_TYPEMASK)==SGIP_SOCKET_FLAG_TYPE_UDP) {
retval=sgIP_UDP_SendTo((sgIP_Record_UDP *)socketlist[socket].conn_ptr,
(char *)data,sendlength,flags,
((struct sockaddr_in *)addr)->sin_addr.s_addr,
((struct sockaddr_in *)addr)->sin_port);
}
SGIP_INTR_UNPROTECT();
return retval;
}
int sgIP_UDP_RecvFrom(sgIP_Record_UDP * rec, char * destbuf, int buflength, int flags, unsigned long * sender_ip, unsigned short * sender_port) {
if(!rec || !destbuf || !sender_ip || !sender_port || buflength==0) return -1;
SGIP_INTR_PROTECT();
if(rec->incoming_queue==0) {
SGIP_INTR_UNPROTECT();
return -1;
}
int packetlen=rec->incoming_queue->totallength-12;
if(packetlen>buflength) {
SGIP_INTR_UNPROTECT();
return -1;
}
sgIP_memblock * mb;
*sender_ip=*((unsigned long *)rec->incoming_queue->datastart);
*sender_port=((unsigned short *)rec->incoming_queue->datastart)[2];
int totlen,first, buf_start,i;
totlen=rec->incoming_queue->totallength;
first=12;
buf_start=0;
while(totlen>0 && rec->incoming_queue) {
totlen-=rec->incoming_queue->thislength;
for(i=first;i<rec->incoming_queue->thislength;i++) {
destbuf[buf_start+i-first]=rec->incoming_queue->datastart[i];
}
buf_start+=rec->incoming_queue->thislength-first;
first=0;
mb=rec->incoming_queue;
rec->incoming_queue=rec->incoming_queue->next;
mb->next=0;
sgIP_memblock_free(mb);
}
if(!(rec->incoming_queue)) rec->incoming_queue_end=0;
SGIP_INTR_UNPROTECT();
return buf_start;
}
int recvfrom(int socket, void * data, int recvlength, int flags, struct sockaddr * addr, int * addr_len) {
if(socket<1 || socket>SGIP_SOCKET_MAXSOCKETS) return -1;
if(!addr) return -1;
SGIP_INTR_PROTECT();
int retval=-1;
socket--;
if((socketlist[socket].flags&SGIP_SOCKET_FLAG_TYPEMASK)==SGIP_SOCKET_FLAG_TYPE_TCP) {
} else if((socketlist[socket].flags&SGIP_SOCKET_FLAG_TYPEMASK)==SGIP_SOCKET_FLAG_TYPE_UDP) {
retval=sgIP_UDP_RecvFrom((sgIP_Record_UDP *)socketlist[socket].conn_ptr,data,recvlength,flags,&(((struct sockaddr_in *)addr)->sin_addr.s_addr),&(((struct sockaddr_in *)addr)->sin_port));
*addr_len = sizeof(struct sockaddr_in);
}
SGIP_INTR_UNPROTECT();
return retval;;
}
int ioctl(int socket, long cmd, void * arg) {
if(socket<1 || socket>SGIP_SOCKET_MAXSOCKETS) return -1;
socket--;
int retval;
retval=0;
SGIP_INTR_PROTECT();
switch(cmd) {
case FIONBIO:
if(!arg){
retval=-1;
} else {
socketlist[socket].flags &= ~SGIP_SOCKET_FLAG_NONBLOCKING;
if(*((unsigned long *)arg)) socketlist[socket].flags |= SGIP_SOCKET_FLAG_NONBLOCKING;
}
break;
}
SGIP_INTR_UNPROTECT();
return retval;
}
//Ces fonctions proviennent de wifi_arm9.c
sgIP_Hub_HWInterface * wifi_hw;
u32 Wifi_GetIP() {
if(wifi_hw) return wifi_hw->ipaddr;
return 0;
}
void Wifi_DisableWifi() {
WifiData->reqMode=WIFIMODE_DISABLED;
WifiData->reqReqFlags &= ~WFLAG_REQ_APCONNECT;
}
int Wifi_DisconnectAP() {
WifiData->reqMode=WIFIMODE_NORMAL;
WifiData->reqReqFlags &= ~WFLAG_REQ_APCONNECT;
return 0;}
//Ces fonctions appartiennt à SgIP_UDP.h
void sgIP_UDP_Init() {
udprecords=0;
}
int sgIP_UDP_ReceivePacket(sgIP_memblock * mb, unsigned long srcip, unsigned long destip) {
if(!mb) return 0;
int chk = sgIP_UDP_CalcChecksum(mb,srcip,destip,mb->totallength);
if(chk!=0xFFFF) {
SGIP_DEBUG_MESSAGE(("UDP receive checksum incorrect"));
sgIP_memblock_free(mb);
return 0; // checksum error
}
sgIP_Header_UDP * udp;
udp=(sgIP_Header_UDP *)mb->datastart;
sgIP_Record_UDP * rec; //, *t;
sgIP_memblock *tmb;
SGIP_INTR_PROTECT();
rec=udprecords;
while(rec) {
if((rec->srcip==destip || rec->srcip==0) && rec->srcport==udp->destport && rec->state!=SGIP_UDP_STATE_UNUSED) break; // a match!
rec=rec->next;
}
if(!rec) { // no matching records
sgIP_memblock_free(mb);
SGIP_INTR_UNPROTECT();
return 0;
}
// we have a record and a packet for it; add some data to the record and stuff it into the record queue.
sgIP_memblock_exposeheader(mb,4);
*((unsigned long *)mb->datastart)=srcip; // keep srcip around.
if(rec->incoming_queue==0) {
rec->incoming_queue=mb;
} else {
rec->incoming_queue_end->next=mb;
}
tmb=mb;
while(tmb->next) tmb=tmb->next;
rec->incoming_queue_end=tmb;
// ok, data added to queue - yay!
// that means... we're done.
SGIP_INTR_UNPROTECT();
return 0;
}
//MAIN
int main(void) {
// comments : PAlib Inits
PA_Init();
PA_InitVBL();
// comments : Text Init
PA_InitText(1, // Top screen...
2); // Use background number 2
PA_OutputSimpleText(1,1,1,"-------------------------");
PA_OutputSimpleText(1,1,2,"LITTLE GAME vers. 0.00001");
PA_OutputSimpleText(1,1,3,"-------------------------");
// comments : Wifi's Initialisation
Wifi_Init(0);//u32 Wifi_pass= //???
Wifi_Start(); //??? REchercher TxQueue et TxRaw
//Configuration du réseau
global_connectAP.ssid_len=7;
strcpy(global_connectAP.ssid,"linksys");
global_connectAP.rssi=0;
global_connectAP.channel=1;
global_connectAP.flags=0;
global_wepkeyid=0;
global_wepmode=0;
global_dhcp=0;
global_ipaddr=0xBD01A8C0; //192.168.1.189 à l'envers
global_snmask=0x00FFFFFF; //255.255.255.0 à l'envers
global_gateway=0x0101A8C0; //192.168.1.1 à l'envers
global_dns1=0x0101A8C0; //192.168.1.1 à l'envers
global_dns2=0;
//Wifi_SetStaticIP(global_ipaddr,global_gateway,global_snmask,global_dns1,global_dns2); //Do_ConnectAP();
//Wifi_ConnectAP(&global_connectAP,global_wepmode,global_wepkeyid,global_wepkeys[0]);
//Wifi_EnableWifi(); //Do_ConfigureWifi()
//wifi_ScanMode();
char rcvdbuf[4096];
char sendbuf[4096];
// //Do_Play_UDPTest()
int sock;
int portnum;
int rcvd=0,i=1,j,lastmsglen=0;
unsigned long destip,srcip;
struct sockaddr_in sain, sain_;
//char * tmp;
char buf[64];
char Obstacle_lutxt[64];
portnum=8888;
sock=socket(AF_INET,SOCK_DGRAM,0); // Recherche socket
sain.sin_family=AF_INET;
sain.sin_port=htons(portnum);
sain.sin_addr.s_addr=INADDR_ANY;
bind(sock,(struct sockaddr *) &sain,sizeof(sain)); // Recherche bind
//rcvd=0;
//i=1;
ioctl(sock,FIONBIO,&i);
destip=Wifi_GetIP(); //rechercher cette fonction
//lastmsglen=0;
PA_OutputSimpleText(1,1,5,"Wifi initialisé."); // Top screen, tile x = 1, y = 1...
PA_OutputSimpleText(1,1,6,"Appuyer sur A pour lancer le jeu.");
while(!Pad.Newpress.A)
{PA_WaitForVBL();}
//PA_OutputSimpleText(1,1,7,"Feu !");
while(!Pad.Newpress.B)
{
PA_OutputSimpleText(1,1,13," ");
PA_OutputSimpleText(1,1,14," ");
PA_OutputSimpleText(1,1,15," ");
PA_OutputSimpleText(1,1,6,"Appuyer sur X. ");
while(!Pad.Newpress.X)
{PA_WaitForVBL();}
// Envoyer un paquet pour signaler à l'ordinateur qu'il peut envoyer un premier paquet
strcpy(sendbuf,"Vas-y tu peux envoyer l'obstacle !");
sain.sin_family=AF_INET;
sain.sin_port=htons(portnum);
sain.sin_addr.s_addr=destip;
sendto(sock,sendbuf,strlen(sendbuf),0,(struct sockaddr *)&sain,sizeof(sain));
// Recevoir un paquet de données indiquant le prochain obstacle
PA_OutputSimpleText(1,1,6,"Appuyer sur A pour recevoir un obstacle.");
while(!Pad.Newpress.A)
{PA_WaitForVBL();}
// process incoming data...
i=sizeof(sain_);
if((j=recvfrom(sock,rcvdbuf,4095,0,(struct sockaddr *)&sain_,&i))!=-1)
{ lastmsglen=j; rcvd++; }
// display info
sprintf(buf,"%i Received",rcvd);
printbtm(29-strlen(buf),15,buf);
if(rcvd)
{
srcip=sain_.sin_addr.s_addr;
strcpy(buf,"Affichage de l'IP dz l'expéditeur.");
//sprintf(buf,"From:%i.%i.%i.%i:%i",(srcip)&255,(srcip>>8)&255,(srcip>>16)&255,(srcip>>24)&255,ntohs(sain_.sin_port));
printbtm(1,7,buf);
sprintf(buf,"Msg Len: %i",lastmsglen);
printbtm(1,8,buf);
rcvdbuf[lastmsglen]=0;
// have rows 9-14 to display msg- 5 lines
for(i=0;i<11;i++) {
if(i*30<lastmsglen) printbtmn(1,9+i,rcvdbuf+i*30,30);
}
}
//Traitement de l'information
int Obstacle_lu=rcvdbuf-"111111";
PA_OutputSimpleText(1,1,11,"Message traduit :");
sprintf(Obstacle_lutxt,"%i",Obstacle_lu);
printbtm(1,12,Obstacle_lutxt);
//PA_OutputSimpleText(1,1,6,"Appuyer sur Y ");
//while(!Pad.Newpress.Y)
// {PA_WaitForVBL();}
// Selon le contenu du paquet, on affiche différentes phrases
switch(Obstacle_lu)
{
case 111111: //1B207 ou 11011001000000111
PA_OutputSimpleText(1,1,13,"Il faut aller tout droit. (X)");
break;
case 222222: //3640E ou 110110010000001110
PA_OutputSimpleText(1,1,13,"Il faut tourner à droite. (A)");
break;
case 333333: //51615 ou 1010001011000010101
PA_OutputSimpleText(1,1,13,"Il faut tourner à gauche. (Y)");
break;
default: //execute no matter what.
PA_OutputSimpleText(1,1,13,"None is true - appuyez sur X !");
break;
}
PA_OutputSimpleText(1,1,6," ");
PA_OutputSimpleText(1,1,7," ");
PA_OutputSimpleText(1,1,8," ");
PA_OutputSimpleText(1,1,9," ");
PA_OutputSimpleText(1,1,6,"Appuies sur la direction que tu veux suivre (X)");
while((!Pad.Newpress.X) )//(!Pad.Newpress.Y)) //!Pad.Newpress.A|!Pad.Newpress.B|!Pad.Newpress.X|!Pad.Newpress.Y)
{PA_WaitForVBL();}
PA_OutputSimpleText(1,1,6," ");
PA_OutputSimpleText(1,1,7," ");
PA_OutputSimpleText(1,1,8," ");
PA_OutputSimpleText(1,1,9," ");
PA_OutputSimpleText(1,1,10," ");
PA_OutputSimpleText(1,1,11," ");
PA_OutputSimpleText(1,1,12," ");
PA_OutputSimpleText(1,1,13," ");
if(Pad.Newpress.X) //(Obstacle_lu==111111 && !Pad.Newpress.X)|(Obstacle_lu==222222 && !Pad.Newpress.A)|(Obstacle_lu==333333 && !Pad.Newpress.Y))
{
PA_OutputSimpleText(1,1,14,"Coooool");
//Envoi de la direction suivie
strcpy(sendbuf,"La direction est bien suivie.");
sain.sin_family=AF_INET;
sain.sin_port=htons(portnum);
sain.sin_addr.s_addr=destip;
sendto(sock,sendbuf,strlen(sendbuf),0,(struct sockaddr *)&sain,sizeof(sain));
}
else
{
PA_OutputSimpleText(1,1,14,"GAME OVER");
//Envoi d'un message de fin
strcpy(sendbuf,"The game is over!");
sain.sin_family=AF_INET;
sain.sin_port=htons(portnum);
sain.sin_addr.s_addr=destip;
sendto(sock,sendbuf,strlen(sendbuf),0,(struct sockaddr *)&sain,sizeof(sain));
break;
//break;
}
PA_OutputSimpleText(1,1,15,"Passage à l'obstacle suivant ?");
PA_OutputSimpleText(1,1,6,"Appuyer sur Y ");
while(!Pad.Newpress.Y)
{PA_WaitForVBL();}
//while(1) { // Inifinite loop
//PA_WaitForVBL();
//}
}
PA_OutputSimpleText(1,1,20,"Arrêt!");
PA_OutputSimpleText(1,1,21,"Redémarrez le jeu !");
Wifi_DisconnectAP();
Wifi_DisableWifi();
Wifi_Shutdown();// stop wifi.
return 0;
}
Edit my message to see all the code...