nds_nflib/extras/wifi/examples/udptalk/source/main.c
Antonio Niño Díaz 151db13cc0 license: Fix licenses
- Creative Commons (except for CC0) shouldn't be used for code:

   https://creativecommons.org/faq/#can-i-apply-a-creative-commons-license-to-software

   MIT has the same spirit as the CC-BY license.

- CC-BY has been retained for the assets included in the repository.

- Also, the years were wrong, this library was started in 2009.

- Make all examples use the CC0 license.
2023-04-01 19:56:45 +01:00

405 lines
7.6 KiB
C
Raw Blame History

// SPDX-License-Identifier: CC0-1.0
//
// SPDX-FileContributor: NightFox & Co., 2010
/*
-------------------------------------------------
NightFox's Lib Template
Ejemplo basico comunicacion con el protocolo UDP
Requiere DevkitARM
Requiere NightFox's Lib
Codigo por NightFox
http://www.nightfoxandco.com
Inicio 10 de Octubre del 2009
-------------------------------------------------
*/
/*
-------------------------------------------------
Includes
-------------------------------------------------
*/
// Includes propietarios NDS
#include <nds.h>
// Includes C++
#include <stdio.h>
#include <string.h>
#include <unistd.h>
// Includes propios
#include <nf_lib.h>
#include "nf_wifi.h"
/*
-------------------------------------------------
Defines
-------------------------------------------------
*/
#define myport 22334
char server_ip[18]; // Guarda la IP del servidor
bool _ConnectWIFI(void); // Conectate al punto de acceso por defecto
u8 _SelectMode(void); // Servidor o cliente
s16 _SendData(const char* mydata); // Envia datos por el canal abierto
s16 _GetData(void); // Recibe datos por el canal abierto
s16 _LookForServer(void); // Busca un servidor al que conectarse
/*
-------------------------------------------------
Main() - Bloque general del programa
-------------------------------------------------
*/
int main(int argc, char **argv) {
u8 modo = 0; // Cliente (1) - Servidor (2)
u16 keys = 0; // Lectura del teclado
u32 contador = 0;
char temp[256];
bool loop = true;
bool senddata = true;
// Inicializa las 2D
NF_Set2D(0, 0); // Modo 2D_0 en la pantalla superior
NF_Set2D(1, 0); // Modo 2D_0 en la pantalla inferior
// Inicializa la consola de texto
consoleDemoInit();
consoleClear();
// Intenta conectarte al WFC...
if (_ConnectWIFI()) {
// Selecciona si seras servidor o cliente
modo = _SelectMode();
// Inicia como servidor o cliente
if (modo == 1) {
// Cliente
if (_LookForServer() > 0) {
//if (1) {
NF_WIFI_CreateUdpSender(server_ip, myport);
} else {
loop = false;
}
} else {
// Servidor
NF_WIFI_CreateUdpListener(myport);
}
// Envia o recive datos hasta cancelar la transmision
while (loop) {
// Lee el teclado
scanKeys();
keys = keysDown();
if (modo == 1) { // Envio de datos al servidor
// Si pulsas A, envia datos
if (keys & KEY_A) senddata = true;
// Si pulsas B, pausa el envio
if (keys & KEY_B) senddata = false;
// Si pulsas X, resetea el contador
if (keys & KEY_X) contador = 0;
// Si se pulsa R, sal
if (keys & KEY_R) loop = false;
if (senddata) {
if (loop) {
// Debes enviar datos...
sprintf(temp, "%05lu", contador);
} else {
// o la se<73>al de salida?
sprintf(temp, "Exit");
}
// Envia y verifica si se han recibido
printf("Envio: %s\n", temp);
if (_SendData(temp) > 0) {
// Imprime los datos recibidos
printf("Verificado: %s\n\n", NF_RECV_BUFFER);
// Incrementa el valor
contador ++;
if (contador > 9999) contador = 0;
} else {
printf("Error de envio.\n");
}
}
} else { // Recepcion de datos desde el cliente
// Si se pulsa R, sal
if (keys & KEY_R) loop = false;
// Recibe los datos
if (_GetData() > 0) {
// Imprime los datos recibidos
printf("Recivido: %s\n", NF_RECV_BUFFER);
// Si has recibido la se<73>al de salida...
if (strcmp(NF_RECV_BUFFER, "Exit") == 0) loop = false;
} else {
// Si no hay datos, esperalos
printf("Esperando datos...\n");
}
}
// Espera al sincronismo vertical
swiWaitForVBlank();
}
}
// Cierra el socket
close(NF_SOCKET);
// Deten el WIFI
NF_WiFiDisconnectAp();
// Informa
printf("\nSesion finalizada\n");
while (1) {
swiWaitForVBlank();
}
return 0;
}
/*
-------------------------------------------------
Funciones
-------------------------------------------------
*/
// Intenta conectarte al punto de acceso por defecto
bool _ConnectWIFI(void) {
bool status = false;
// Intenta conectarte al AP...
printf("Conectando via WFC...\n\n");
swiWaitForVBlank();
if (NF_WiFiConnectDefaultAp()) {
// Devuelve los parametros de la conexion TCP/IP con el AP
printf("Conexion realizada.\n\n");
printf("Ip : %s\n", inet_ntoa(NF_IP));
printf("Gateway: %s\n", inet_ntoa(NF_GATEWAY));
printf("Mask : %s\n", inet_ntoa(NF_MASK));
printf("Dns1 : %s\n", inet_ntoa(NF_DNS1));
printf("Dns2 : %s\n\n", inet_ntoa(NF_DNS2));
// Marca como conectado
status = true;
} else {
// No se ha podido conectar
printf("Conexion no establecida\n");
}
swiWaitForVBlank();
return status;
}
// Selecciona si seras Cliente (1) o Servidor (2)
u8 _SelectMode(void) {
u8 modo = 0;
u16 keys = 0;
printf("A - Cliente\nB - Servidor\n");
swiWaitForVBlank();
while (modo == 0) {
scanKeys();
keys = keysDown();
if (keys & KEY_A) modo = 1;
if (keys & KEY_B) modo = 2;
swiWaitForVBlank();
}
return modo;
}
// Envia datos por el canal abierto
s16 _SendData(const char* mydata) {
// Variables
bool checksum = false;
bool timeout = false;
s32 status = 0;
char buffer[NF_WIFI_BUFFER_SIZE];
// Copia los datos al buffer
sprintf(buffer, "%s", mydata);
while (!checksum && !timeout) {
// Envia los datos por UDP
NF_WIFI_UdpSend(buffer);
// Espera la confirmacion de los datos
status = NF_WIFI_UdpListen(600000); // Time out 600 milisegundos
// Realiza un checksum de los datos
if (status > 0) {
if ((strcmp(NF_SEND_BUFFER, NF_RECV_BUFFER) == 0)) {
// Si el envio es correcto, continua
checksum = true;
} else {
checksum = true;
status = -1; // Error de checksum
}
} else {
timeout = true;
status = -2; // Time out
}
}
// Devuelve el estado
return status;
}
// Recibe datos por el canal abierto
s16 _GetData(void) {
// Variables
s32 status = 0;
// Espera los datos
status = NF_WIFI_UdpListen(300000); // Time out 300 milisegundos
// Si se han recibido datos, devuelvelos para su verificacion
if (status > 0) NF_WIFI_UdpSend(NF_RECV_BUFFER);
// Devuelve el estado
return status;
}
// Escanea el rango de IP's para encontrar el servidor
s16 _LookForServer(void) {
// Variables locales
char myip[18];
char temp[64];
char character[2];
u16 n = 0;
u16 p = 0;
bool loop = true;
s8 status = 0;
u16 keys = 0;
// Guarda la direccion IP local (su rango, por ejemplo "192.168.0."
sprintf(temp, "%s", inet_ntoa(NF_IP));
for (n = 0; n < (strlen(temp)); n ++) {
// Copia el caracter
memcpy((myip + n), (temp + n), 1);
memcpy(character, (temp + n), 1);
character[1] = '\0';
// Si es un punto...
if (strcmp(character, ".") == 0) {
p ++;
// Si es el 3er punto...
if (p == 3) {
myip[(n + 1)] = '\0'; // Pon el caracter terminador
n = strlen(temp); // Y termina
}
}
}
// Escanea todo el rango de IP's
p = 0;
for (n = 1; n < 255; n ++) {
// Lee el teclado
scanKeys();
keys = keysDown();
// Calcula la IP
sprintf(temp, "%s%d", myip, n);
printf("%s ", temp);
swiWaitForVBlank();
// Crea el socket de envio
NF_WIFI_CreateUdpSender(temp, myport);
// Envia y verifica si se han recibido
loop = true;
while (loop) {
status = _SendData("HANDSHAKE");
if (status > 0) {
// Imprime los datos recibidos
printf("Encontrado.\n");
// Guarda el valor
sprintf(server_ip, temp);
p = n;
n = 255;
loop = false;
} else {
printf("Time Out.\n");
if (status == -2) loop = false;
}
}
// Cierra el socket creado
close(NF_SOCKET);
// Si pulsas cancelar
if (keys & KEY_R) n = 255;
}
return p;
}