From: notaz <notasas@gmail.com>
Date: Mon, 20 Oct 2014 01:33:32 +0000 (+0300)
Subject: rewrite main loop
X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=beaf6d8944f484d2254bfdae1cbef2820be8f674;p=megadrive.git

rewrite main loop
---

diff --git a/main.c b/main.c
index 0a52e57..3ad3bec 100644
--- a/main.c
+++ b/main.c
@@ -355,10 +355,11 @@ static void do_usb(void *buf)
 
 int main(void)
 {
+	uint32_t led_time = 0;
+	uint32_t scheck_time = 0;
 	uint32_t edge_cnt_last;
 	uint32_t edge_cnt;
 	uint8_t buf[64];
-	int timeout;
 	int ret;
 
 	delay(1000); // wait for usb..
@@ -404,15 +405,21 @@ int main(void)
 	asm("mrs %0, BASEPRI" : "=r"(ret));
 	printf("BASEPRI: %d\n", ret);
 
-	timeout = 1000;
 	edge_cnt_last = g.edge_cnt;
 
 	while (1) {
 		struct tas_pkt pkt;
+		uint32_t now;
 
 		while (g.stream_enable_to && !g.stream_ended
 		  && get_space_to() > sizeof(pkt.data) / STREAM_EL_SZ)
 		{
+			if (g.t_i == g.t_o && g.frame_cnt != 0) {
+				printf("underflow detected\n");
+				g.stream_enable_to = 0;
+				break;
+			}
+
 			pkt.type = PKT_STREAM_REQ;
 			pkt.req.frame = g.frame_cnt;
 
@@ -453,31 +460,43 @@ int main(void)
 			}
 		}
 
-		if (timeout == 1000) {
+		now = millis();
+
+		// start condition check
+		if (now - scheck_time > 1000) {
 			edge_cnt = g.edge_cnt;
 			//printf("e: %d th: %d\n", edge_cnt - edge_cnt_last,
 			//      (GPIOB_PDIR >> CORE_PIN0_BIT) & 1);
-			if (edge_cnt - edge_cnt_last > 10000) {
+			if ((g.stream_enable_to || g.stream_enable_from)
+			    && !g.stream_started
+			    && edge_cnt - edge_cnt_last > 10000)
+			{
 				do_start_seq();
 				edge_cnt = g.edge_cnt;
 			}
 			edge_cnt_last = edge_cnt;
+			scheck_time = now;
 		}
 
-		ret = usb_rawhid_recv(buf, timeout);
-		if (ret == 64) {
-			CORE_PIN13_PORTSET = CORE_PIN13_BITMASK;
-
-			do_usb(buf);
-			timeout = 20;
-		}
-		else if (ret == 0) {
-			CORE_PIN13_PORTCLEAR = CORE_PIN13_BITMASK;
-			timeout = 1000;
+		// led?
+		if (CORE_PIN13_PORTREG & CORE_PIN13_BITMASK) {
+			if ((int)(now - led_time) > 10)
+				CORE_PIN13_PORTCLEAR = CORE_PIN13_BITMASK;
 		}
-		else {
-			printf("usb_rawhid_recv: %d\n", ret);
-			timeout = 1000;
+
+		// something on rawhid?
+		if (usb_rawhid_available() > 0)
+		{
+			ret = usb_rawhid_recv(buf, 20);
+			if (ret == 64) {
+				led_time = millis();
+				CORE_PIN13_PORTSET = CORE_PIN13_BITMASK;
+
+				do_usb(buf);
+			}
+			else {
+				printf("usb_rawhid_recv: %d\n", ret);
+			}
 		}
 	}