shithub: map

Download patch

ref: 16db494271a75689ee7e6da9ff3d3d20f0a3fd2b
parent: 99e6eda7182651155b2baa3957242898fa489f37
author: sirjofri <sirjofri@sirjofri.de>
date: Mon Mar 31 15:44:47 EDT 2025

fixes centering of image, fetches data more lazily. introduces graphical glitch

--- a/gps.c
+++ b/gps.c
@@ -14,8 +14,8 @@
 	int n, quality;
 	char *nop;
 	
-	ret.lon = 180.;
-	ret.lat = 90.;
+	ret.lon = 0.;
+	ret.lat = 0.;
 	
 	fd = open("/mnt/gps/position", OREAD);
 	if (fd < 0) {
@@ -40,8 +40,8 @@
 		return ret;
 	}
 	
-	ret.lon = 180 + strtod(fields[3], &nop);
-	ret.lat = 90 + strtod(fields[4], &nop);
+	ret.lon = /*180 +*/ strtod(fields[3], &nop);
+	ret.lat = /*90 +*/ strtod(fields[4], &nop);
 	debugprint("GPS: %f %f\n", ret.lon, ret.lat);
 	return ret;
 }
--- a/map.c
+++ b/map.c
@@ -43,7 +43,9 @@
 
 int tilesize = 256;
 
+int needsrequestimage = 0;
 Point mapimagesize;
+Point viewsize;
 Image *mapimage;
 QLock mapimagelock;
 
@@ -58,12 +60,12 @@
 	char ns;
 	char we;
 	
-	ns = gpsloc.lat > 90 ? 'N' : 'S';
-	we = gpsloc.lon > 180 ? 'E' : 'W';
+	ns = gpsloc.lat > 0 ? 'N' : 'S';
+	we = gpsloc.lon > 0 ? 'E' : 'W';
 	
 	snprint(statusline, sizeof statusline, "Loc: %f%c %f%c Z: %d %c %s",
-		fabs(gpsloc.lon - 180), we,
-		fabs(gpsloc.lat - 90), ns,
+		fabs(gpsloc.lon), we,
+		fabs(gpsloc.lat), ns,
 		currentloc.z,
 		copyright ? ':' : ' ',
 		copyright ? copyright : "");
@@ -108,7 +110,7 @@
 	for (int i = 0; i <= maxzoom; i++) {
 		zoomsquared[i] = 1;
 		for (int j = 0; j <= i; j++)
-			zoomsquared[i] *= 2;
+			zoomsquared[i] *= 2.;
 	}
 }
 
@@ -115,7 +117,10 @@
 static double
 gettiledeg(void)
 {
-	return 360 / zoomsquared[currentloc.z];
+	double x = 360. / zoomsquared[currentloc.z];
+	if (x < 0.1)
+		x = 0.1;
+	return x;
 }
 
 NWindow *mainwindow;
@@ -135,27 +140,16 @@
 static GPos
 gpsoff(void)
 {
-	GPos p;
-	double x, y;
+	if (gpsloc.lat > 90.)
+		gpsloc.lat = 90.;
+	if (gpsloc.lat < -90.)
+		gpsloc.lat = -90.;
+	if (gpsloc.lon > 180.)
+		gpsloc.lon -= 180.;
+	if (gpsloc.lon < -180.)
+		gpsloc.lon = 360. - gpsloc.lon;
 	
-	/* TODO: fix: "zoom point" should be centered properly */
-	
-	if (gpsloc.lat > 180)
-		gpsloc.lat = 180;
-	if (gpsloc.lat < 0)
-		gpsloc.lat = 0;
-	if (gpsloc.lon > 360)
-		gpsloc.lon -= 360;
-	if (gpsloc.lon < 0)
-		gpsloc.lon = 360 - gpsloc.lon;
-	
-	x = mapimagesize.x / 2. / (double)tilesize;
-	y = mapimagesize.y / 2. / (double)tilesize;
-
-	tile2gps(&x, &y, currentloc.z);
-	p.lon = gpsloc.lon - x;
-	p.lat = gpsloc.lat - y;
-	return p;
+	return gpsloc;
 }
 
 enum {
@@ -163,10 +157,36 @@
 	Credraw,
 };
 
+static int
+locequals(GBundle *A, GBundle *B)
+{
+	return A->x == B->x && A->y == B->y && A->z == B->z;
+}
+
 static void
 locupdated(void)
 {
-	currentloc = getbundle(gpsoff(), currentloc.z, &drawoffset);
+	GBundle newloc;
+	Point off, o, oo;
+	
+	oo.x = viewsize.x/2.;
+	oo.y = viewsize.y/2.;
+	off.x = oo.x/tilesize + 1;
+	off.y = oo.y/tilesize + 1;
+	newloc = getbundle(gpsoff(), currentloc.z, &drawoffset);
+	newloc.x -= off.x;
+	newloc.y -= off.y;
+	debugprint("location updated: %f,%f\n", gpsloc.lon, gpsloc.lat);
+	if (!locequals(&currentloc, &newloc)) {
+		currentloc = newloc;
+		needsrequestimage++;
+		debugprint(" with requestimage");
+	}
+	debugprint("\n");
+	o = mulpt(off, tilesize);
+	o = subpt(o, oo);
+	o = addpt(o, drawoffset);
+	nimage->offset = drawoffset = o;
 }
 
 int debug;
@@ -187,6 +207,7 @@
 	if (!b)
 		return;
 	
+	debugprint("redraw\n");
 	nateredraw(0);
 }
 
@@ -202,7 +223,12 @@
 void
 redrawmap(void)
 {
-	requestimage(currentloc, imageupdated);
+	if (needsrequestimage) {
+		requestimage(currentloc, imageupdated);
+		return;
+	}
+	needsrequestimage = 0;
+	imageupdated();
 }
 
 void
@@ -216,8 +242,10 @@
 	}
 	ncallcalcrect(mainwindow, screen, screen->r);
 	r.min = ZP;
-	r.max.x = Dx(nimage->slot.r);
-	r.max.y = Dy(nimage->slot.r);
+	viewsize.x = Dx(nimage->slot.r);
+	viewsize.y = Dy(nimage->slot.r);
+	r.max.x = (viewsize.x/tilesize + 2) * tilesize;
+	r.max.y = (viewsize.y/tilesize + 2) * tilesize;
 	mapimagesize = r.max;
 	
 	mapimage = allocimage(display, r, screen->chan, 0, DWhite);
@@ -224,6 +252,8 @@
 	nimage->image = mapimage;
 	unlockmapimage();
 	
+	locupdated();
+	
 	debugprint("initimage: %R %p\n", r, mapimage);
 }
 
@@ -278,9 +308,10 @@
 {
 	double v;
 	double deg = gettiledeg();
+	fprint(2, "deg: %f\n", deg);
 	if (x) *x = deg * m;
 	if (y) {
-		v = 1. - fabs(gpsloc.lat - 90) / 90.;
+		v = 1. - fabs(gpsloc.lat) / 90.;
 		if (v < 0.1)
 			v = 0.1;
 		*y = deg * m * v;
@@ -292,6 +323,8 @@
 {
 	double v;
 	double off = 0.5;
+	int ret = Cnil;
+	USED(ret); /* paranoia */
 	
 	switch (kbdc) {
 	case Kdel:
@@ -298,31 +331,40 @@
 	case 'q':
 		exits(nil);
 	case '.':
-		return inczoom(+1);
+		ret = inczoom(+1);
+		break;
 	case ',':
-		return inczoom(-1);
+		ret = inczoom(-1);
+		break;
 	case Kleft:
 		calcoffset(off, &v, nil);
 		gpsloc.lon -= v;
-		goto Loc;
+		ret = Credraw;
+		break;
 	case Kright:
 		calcoffset(off, &v, nil);
 		gpsloc.lon += v;
-		goto Loc;
+		ret = Credraw;
+		break;
 	case Kup:
 		calcoffset(off, nil, &v);
 		gpsloc.lat += v;
-		goto Loc;
+		ret = Credraw;
+		break;
 	case Kdown:
 		calcoffset(off, nil, &v);
 		gpsloc.lat -= v;
-		goto Loc;
+		ret = Credraw;
+		break;
+	default:
+		return Cnil;
 	}
-	return Cnil;
 
-Loc:
-	locupdated();
-	return Credraw;
+	if (ret == Credraw) {
+		locupdated();
+		return Credraw;
+	}
+	return ret;
 }
 
 static void
@@ -342,7 +384,7 @@
 handleplumb(Plumbmsg* pm)
 {
 	GPos pos;
-	int zoom;
+	int z;
 	if (pm->ndata < 0)
 		goto Out;
 	
@@ -350,8 +392,9 @@
 		goto Out;
 	
 	gpsloc = pos;
-	if (zoom >= 0)
-		currentloc.z = zoom;
+	z = zoom;
+	if (z >= 0 && z <= maxzoom)
+		currentloc.z = zoom = z;
 	locupdated();
 	handlecmd(Credraw);
 	
--- a/parse.c
+++ b/parse.c
@@ -27,16 +27,12 @@
 	default:
 		return 0;
 	case 'N': case 'n':
-		*lat = n + 90;
-		break;
 	case 'S': case 's':
-		*lat = 90 - n;
+		*lat = n;
 		break;
 	case 'W': case 'w':
-		*lon = 180 - n;
-		break;
 	case 'E': case 'e':
-		*lon = 180 + n;
+		*lon = n;
 		break;
 	}
 	return 1;
--- a/tile.c
+++ b/tile.c
@@ -63,5 +63,7 @@
 	ret.x = lon2tilex(pos.lon, z, &offset->x);
 	ret.y = lat2tiley(pos.lat, z, &offset->y);
 	ret.z = z;
+	debugprint("bundle for %f,%f = %d, %d, %d\n",
+		pos.lon, pos.lat, ret.z, ret.x, ret.y);
 	return ret;
 }
--