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(¤tloc, &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;
}
--
⑨