Anuncios Google

Leer el estado de la batería

Tutoriales avanzados de Homebrewes

Leer el estado de la batería

En este tutorial os voy a enseñar cómo leer el estado de la batería en la nintendo DS FAT y la Nintendo DS Lite mediante código. Este tutorial sirve para todas la librerías basadas en libnds (libnds, NFlib, Palib...).

Realmente la teoría es sencilla, primero leeremos la batería desde el ARM7 (el secundario), luego usando el sistema FIFO (un sistema de comunicación) le enviamos los datos al procesador ARM9 (el principal).

Paso 1:

Para tener control sobre el ARM7 y el ARM9 usaremos el template de libnds que los combina, este lo podemos encontrar en devkitpro/examples/nds/templates/combined, en caso de no tener la carpeta examples (por hacer una instalación en Linux, por ejemplo) los podemos descargar desde SourceForge.

Paso 2:

Hacer la conexión entre los dos ARMs, como la conexión ya se encuentra establecida sólo tendremos que enviar los datos. Para hacer esto usaremos la función:

fifoSendValue32 (int channel, u32 value32)

donde channel es el canal FIFO por el que enviaremos los datos y value32 los datos que enviaremos.

En el archivo del ARM7 en el while ponemos:

- Si es una DS lite

fifoSendValue32 (1,((readPowerManagement(4) & 8)>>3) + (readPowerManagement(1)<<1)+2);

- Si es una DS Fat (las viejas):

fifoSendValue32 (1,((readPowerManagement(4) & 8)>>3) +2);

Esto requiere un poco de explicación: la función lo que hace es coger los valores de los registros de gestión de energía (Power Management) y lee el estado de la batería, luego le sumo dos, y envía este valor por el canal FIFO que le hemos dicho, en este caso el 1. ¿Por qué le sumo dos? Si continuais leyendo os doy la explicación.

Nota: en una Dsi (aunque no lo he probado, supongo que en  una Dsi Xl ,también) nos dará error siempre.

Paso 3:

Ahora toca recibir los datos con el ARM9, la función es la siguiente:

fifoGetValue32 ( int channel )  

Esta función devuelve los que haya por el canal FIFO elegido, y si ha habido un error devuelve cero (por eso en la función de antes le hemos sumado 2 para poder diferenciar el error de la lectura de la bateria con el cero que devuelve la función ((readPowerManagement(4) & 8)>>3) + (readPowerManagement(1)<<1); , o del error que nos pueda devolver en caso de que solo le sumaramos 1.

Ahora que sabemos esto sólo tenemos que mostrarlo:

-Si es una DS Lite:

switch (fifoGetValue32(1)){		
		case -1: NF_WriteText(0,1,1,5,"Error desconocido");
		case 0: NF_WriteText(0,1,1,5,"Error de FIFO");
		case 1: NF_WriteText(0,1,1,5,"Error de lectura de bateria");
		case 2: NF_WriteText(0,1,1,5,"La batería está bien");
		case 3: NF_WriteText(0,1,1,5,"La batería está mal");
                }

-Si es una Fat:

 

Nota: la diferencia está en que la phat no dice si esta cargando o no.

Y listo.

Paso 4 (opcional):

Como se trata de un template vacío, si usamos una librería debemos ponerla.

- Si usamos NFlib:

Entramos dentro de la carpeta de arm9 y en el makefile cambiamos:

LIBS    :=      -lnds9

por:

LIBS    :=      -lnflib -lfilesystem -lfat -lnds9

y cambiamos:

LIBDIRS :=      $(LIBNDS)

por:

LIBDIRS :=      $(LIBNDS) $(TOPDIR)/nflib

y añadimos en el template.c:

#include <nf_lib.h>

Bueno, aquí termina este pequeño tutorial. Cualquier pregunta diganmela, si puedo se la responderé.

NOTA: Quiero dar gracias a KnightFox, a Almamu y a 4n4bol

4.234045
Tu voto: Ninguno Votos totales: 4.2 (47 votos)

Anuncios Google