diff source/main.c @ 3:4c4be527a8d5

Send the entire state (including both pads and touch screen), and other fixes.
author Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
date Tue, 18 Aug 2015 00:25:10 +0100
parents 5ba54fc65608
children 557d35fcf15a
line wrap: on
line diff
--- a/source/main.c
+++ b/source/main.c
@@ -22,19 +22,25 @@
 #include <string.h>
 #include <sys/socket.h>
 
+struct state_t {
+	u32 keys;
+	circlePosition pad, cpad;
+	touchPosition touch;
+};
+
 static u32 *SOC_buffer = NULL;
 
 int create_socket(int domain, int type, struct sockaddr *addr)
 {
 	int fd = socket(domain, type, 0);
 	if (fd < 0) {
-		printf("socket() failed.\n");
+		puts("socket() failed.");
 		return -1;
 	}
 
 	if (addr) {
 		if (connect(fd, addr, sizeof(*addr)) < 0) {
-			printf("connect() failed.\n");
+			puts("connect() failed.");
 			return -1;
 		}
 	}
@@ -46,13 +52,13 @@ struct sockaddr* get_sockaddr_from_hostn
 {
 	struct hostent *server = gethostbyname(hostname);
 	if (!server) {
-		printf("gethostbyname() failed.\n");
+		puts("gethostbyname() failed.");
 		return NULL;
 	}
 
 	struct sockaddr_in *addr = calloc(1, sizeof(struct sockaddr_in));
 	if (!addr) {
-		printf("calloc() failed.\n");
+		puts("calloc() failed.");
 		return NULL;
 	}
 
@@ -68,7 +74,7 @@ struct sockaddr* get_sockaddr_from_ip(co
 {
 	struct sockaddr_in *addr = calloc(1, sizeof(struct sockaddr_in));
 	if (!addr) {
-		printf("calloc() failed.\n");
+		puts("calloc() failed.");
 		return NULL;
 	}
 
@@ -94,20 +100,22 @@ struct network_t *networkInit(const char
 
 	SOC_buffer = (u32*)memalign(SOC_ALIGN, SOC_BUFFERSIZE);
 	if (!SOC_buffer) {
-		printf("calloc() failed.\n");
+		puts("memalign() failed.");
 		return NULL;
 	}
 
 	unsigned initialized = SOC_Initialize(SOC_buffer, SOC_BUFFERSIZE);
 	if (initialized) {
-		printf("SOC_Initialize() failed.\n");
+		puts("SOC_Initialize() failed.");
 		return NULL;
 	}
 
 	//struct sockaddr *addr = get_sockaddr_from_hostname(hostname, port);
 	struct sockaddr *addr = get_sockaddr_from_ip(hostname, port);
-	if (!addr)
+	if (!addr) {
+		puts("get_sockaddr_from_ip() failed.");
 		return NULL;
+	}
 
 	// TODO: IPv6
 	int domain = AF_INET;
@@ -120,14 +128,25 @@ struct network_t *networkInit(const char
 	return n;
 }
 
-int sendKeys(struct network_t *n, u32 keys)
+int sendState(struct network_t *n, struct state_t *state)
 {
-	const char *msg = (const char*) &keys;
-	int msglen = sizeof(keys);
+	const char *msg = (const char*) state;
+	const int msglen = sizeof(struct state_t);
 	return sendto(n->udp_fd, msg, msglen, 0, n->addr, n->addr_size);
 }
 
-int main(int argc, char **argv)
+void exitWithMessage(const char *message)
+{
+	puts(message);
+	fflush(stdout);
+	gfxFlushBuffers();
+	gfxSwapBuffers();
+	for (int i=0; i < 60; ++i)
+		gspWaitForVBlank();
+	gfxExit();
+}
+
+int main(void)
 {
 	//Matrix containing the name of each key. Useful for printing when a key is pressed
 	char keysNames[32][32] = {
@@ -147,70 +166,64 @@ int main(int argc, char **argv)
 	//Initialize console on top screen. Using NULL as the second argument tells the console library to use the internal console structure as current one
 	consoleInit(GFX_TOP, NULL);
 
-	u32 old_keys = 0; //In these variables there will be information about keys detected in the previous frame
+	struct state_t old_state = {0xffffffff, {0xffff, 0xffff}, {0xffff, 0xffff}, {0xffff, 0xffff}}; //In these variables there will be information about keys detected in the previous frame
 
 	// Initialize the network
 	struct network_t *n = networkInit("192.168.0.13", 16150);
 	if (!n) {
-		printf("HORROR!");
-		fflush(stdout);
-		gfxFlushBuffers();
-		gfxSwapBuffers();
-		for(;;);
+		exitWithMessage("networkInit() failed.");
+		return 1;
 	}
 
-	printf("\x1b[0;0HPress Start to exit.");
-	printf("\x1b[1;0HCirclePad position:");
-
 	// Main loop
 	while (aptMainLoop())
 	{
+		static struct state_t state;
+
 		//Scan all the inputs. This should be done once for each frame
 		hidScanInput();
 
 		//hidKeysHeld returns information about which buttons have are held down in this frame
-		u32 keys = hidKeysHeld();
+		state.keys = hidKeysHeld();
 
-		//if (keys & KEY_START) break; // break in order to return to hbmenu
+		//Read both pads position
+		hidCircleRead(&state.pad);
+		hidCstickRead(&state.cpad);
+
+		// FIXME: use HOME instead
+		if (state.keys & KEY_START) break; // break in order to return to hbmenu
 
 		//Do the keys printing only if keys have changed
-		if (keys != old_keys)
+		if (memcmp(&state, &old_state, sizeof(struct state_t)))
 		{
 			//Clear console
 			consoleClear();
 
-			//These two lines must be rewritten because we cleared the whole console
-			printf("\x1b[0;0HPress Start to exit.");
-			printf("\x1b[1;0HCirclePad position:");
+			//Every line must be rewritten because we cleared the whole console
+			printf("\x1b[0;0HPress Start to exit.\n");
 
-			printf("\x1b[3;0H"); //Move the cursor to the fourth row because on the third one we'll write the circle pad position
+			//Print both pads position
+			printf("CirclePad position: %04d; %04d\n", state.pad.dx, state.pad.dy);
+			printf("CPad position:      %04d; %04d\n", state.cpad.dx, state.cpad.dy);
+
+			//Move the cursor to the fourth row because on the third one we'll write the circle pad position
+			printf("\x1b[3;0H");
 
 			//Check if some of the keys are down, held or up
 			for (int i = 0; i < 32; i++)
 			{
-				if (keys & BIT(i)) printf("%s\n", keysNames[i]);
+				if (state.keys & BIT(i))
+					printf("%s\n", keysNames[i]);
 			}
 
-			if (sendKeys(n, keys) < 0) {
-				perror("sendKeys");
-				printf("HORROR! sendKeys()!");
-				fflush(stdout);
-				gfxFlushBuffers();
-				gfxSwapBuffers();
-				for(;;);
+			if (sendState(n, &state) < 0) {
+				exitWithMessage("sendState() failed.");
+				return 1;
 			}
 		}
 
 		//Set keys old values for the next frame
-		old_keys = keys;
-
-		circlePosition pos;
-
-		//Read the CirclePad position
-		hidCircleRead(&pos);
-
-		//Print the CirclePad position
-		printf("\x1b[2;0H%04d; %04d", pos.dx, pos.dy);
+		memcpy(&old_state, &state, sizeof(struct state_t));
 
 		// Flush and swap framebuffers
 		gfxFlushBuffers();
@@ -221,6 +234,6 @@ int main(int argc, char **argv)
 	}
 
 	// Exit services
-	gfxExit();
+	exitWithMessage("Exiting...");
 	return 0;
 }