*+M2EXTENSIONS *>
<*-CHECKDIV *>
<*-CHECKRANGE *>
<*-GENFRAME*>
<*+NOPTRALIAS*>
<*-DOREORDER*>
<*-GENPTRINIT*>
<*HEAPLIMIT="1000000000"*>
<*CPU="PENTIUM"*>
<*NEW WITHHTML*>
<*NEW SAVESTAT *>
<*NEW MYMATH *>
<*-MYMATH *>
<* IF TARGET_FAMILY="WIN32" THEN *>
<*-WITHHTML*>
<*-SAVESTAT*>
<* ELSIF TARGET_FAMILY="UNIX" THEN *>
<*-WITHHTML*>
<*-SAVESTAT*>
<* END *>
MODULE aprsmap; (* aprs tracks on osm map by oe5dxl *)
FROM SYSTEM IMPORT FILL, ADR, INT16, INT8, CAST, MOVE, CARD8, CARD16, SHIFT;
FROM useri IMPORT refresh, redraw, CONFSET, killallmenus, saveconfig,
CURSDOWN, CURSLEFT, CURSUP, CURSRIGHT, CURSBS, CURSENTER,
CMDRDLOG, CMDFZOOMOUT, CMDFZOOMIN, CMDZOOMSQUARE, CMDVIDEO,
CMDDOWNLOAD, CMDSTARTDOWNLOAD, CMD1USER, CMD1USERRF, CMDANIMATE1,
CMDANIMATEMENU, CMDINTERNSTAT, CMDFIND, CMDDELWAYPOINT, CMDMH,
CMDLISTWINLINE, CMDRADIORANGE, CMDCLICKWATCH, CURSHOME,
CMDRESETIMGPARMS, CFGHEARD, CFGRAWDECODED, CMDCENTER, CMDCENTERMOUSE,
CMDSETMARK1LOCK, CMDSETMARK2LOCK, CONFPOISYMFIND, SCREENSHOT,
mainpop, conf2int, textautosize, newxsize, newysize, postoconfig,
killmenuid, initmenus, loadconfig, textautomenu, ColConfset,
sayonoff, debugmem, getview, refrinfo, localtime, refrlog, isblown,
confstr, confappend, configon, configbool, AddConfLine, setcfg,
clrconfig, starthint, Setmap, helptext, saveXYtocfg, maximized,
getstartxysize, copypaste, conf2real, guesssize, hoverinfo, say,
MINMHZ, ALTINVAL, gpsalt, confflags, textbubble, mapbritocfg, findopl,
popwatchcall, allocimage, panoimage, xmouse, mainys, rdonesymb,
DOCKX, int2cfg, BRIMUL, resetimgparms, beaconediting, beaconed,
poligonmenu, DEFAULTLUMOBJ, CMDZOOMTOMARKS, cMULTISYMBOL, MAXANTALT,
CMDFOLLOW, anywatchfollow, keychar, DoDirectConf;
FROM osi IMPORT WrStr, WrStrLn, WrInt, FdValid, InvalidFd, File, Exists,
RdBin, WrBin, Close, OpenRead, OpenReadLong, OpenWrite, floor,
power, pi, sqrt, exp, ln, Seekcur, Seek, Erase, DIRSEP, DIRSEP2,
time, ALLOCATE, DEALLOCATE;
FROM xosi IMPORT Eventloop, InitX, allocxbuf, Shift, Ctrl, Gammatab, closewin, pulling,
StopProg, WrHeadline, headmh;
FROM maptool IMPORT pIMAGE, IMAGE, xsize, ysize, waypoint, vector, mercator, mapxy,
drawsym, drawstr, shine, loadmap, addmap, SimpleRelief, drawpois,
shiftx, shifty, xytodeg, cc, area, shiftmap, center, saveppm, POIfind,
Colset, startmapdelay,limpos, makebw, realzoom, setmark, cleanfind,
cmpwild, zoominout, IsMapLoaded, clr, loadfont, vistime, drawarrow,
ruler, POIname, FLOATERRCORR, StartMapPackage, mappack, MINZOOM,
MAXZOOM, geoprofile, Radiorange, drawareasym, drawpoligon,
drawpoliobj, findmultiline, poisactiv;
FROM aprsdecode IMPORT DAT, TYPES, Decode, Stoframe, lums, finezoom, parmzoom, initparms,
quit, parmfinezoom, tracenew, click, ERRSET, ERRFLAGS, FRAMEBUF,
LF, systime, realtime, MONCALL, initzoom, CLICKTYPS, MAPNAME,
inittilex, inittiley, mappos, pVARDAT, purge, initxsize, Checktracks,
DEGSYM, DRAWHINTS, sDRAWHINTS, lasttcprx, updateintervall,
initysize, pOPHIST, pFRAMEHIST, ophist, ophist2, trunc, COLTYP,
delwaypoint, tcpconnstat, udpsocks, DELETSYM, SYMBOL, CLICKOBJECT,
lastanyudprx, objsender, udpconnstat, beeplim, Stopticker,
SHOWTEMPWIND, maploadpid, serialpid, serialpid2, MINTEMP, MAXTEMP,
rxidle, lastlooped, mountains, pMOUNTAIN, FILENAME, BEGINOFTIME,
ismultiline, STORM, AREASYMB, SYMBOLSET, MAPGAMMATAB, logdone, WITHX11,
FOLLOWX, FOLLOWWATCH, autoshots, Watchclock;
FROM aprspos IMPORT distance, posvalid, KNOTS, PI2, RAD, azimuth, SKNOTS;
FROM aprsstr IMPORT POSITION, IntToStr, Append, Assign, DateToStr, FixToStr, Length,
posinval, TimeToStr, StrToTime, TIME, cleanfilename, InStr,
loctopos, StrToFix, StrCmp;
FROM aprstext IMPORT strcp, measure, postostr, deganytopos, getmypos,
DateLocToStr, oppo, setmark1, setmarkalti, TEXTCOLLGR, TEXTCOLEND,
logfndate;
FROM libsrtm IMPORT closesrtmfile, srtmmem;
<* IF TARGET_FAMILY="UNIX" THEN *>
FROM signal IMPORT signal, SIGTERM, SIGINT, SIGPIPE;
<* END *>
CONST
MINLIG=60;
MAXZOOMOBJ=14;
MAXCOLORS=10;
MINCOLOR=ORD("0");
MAPGETTIMEOUT=30;
HISTSIZE=20;
VIDEOFN="map.y4m";
VIDEORATE=25;
MARKERTIME=10; (* marker life time for unimportant marker settings *)
NOSYMT="/"; NOSYMB="/"; (* show this symbol if user has none *)
HOVERDIST=0.2; (* part of symbol size *)
POIINFOWINID=190;
MINPOIINFOTIME=10; (* min opentime for poi info window *)
POIINFOREADSPEED=20; (* characters per second extra readtime for poi info *)
TYPE
SET8=SET OF [0..7];
SET16=SET OF [0..15];
SET32=SET OF [0..31];
VIDBUF=ARRAY[0..10000000] OF CHAR;
MHOPS=(OPHEARD, OPSENT, OPOBJ);
VIEW=RECORD
pos:POSITION;
zoom:REAL;
mhop:MONCALL;
onesymbol:SYMBOL;
onesymbolset:SYMBOLSET;
rf:INTEGER;
mhtxv:MHOPS;
wxcol:CHAR;
lumtrack,
lumwaypoint,
lummap,
lumsym,
lumobj,
lumtext:INTEGER;
mapname:MAPNAME;
maplumcorr:MAPGAMMATAB;
-- altimap,
focus:BOOLEAN;
findpush:BOOLEAN;
END;
TABS=RECORD
stkpo,stktop:CARDINAL;
posstk:ARRAY[0..HISTSIZE-1] OF VIEW;
END;
VAR
image, rfimg:pIMAGE;
shottrigg,
withx:BOOLEAN;
lastxupdate, maptime, laststatref, realday, makeimagetime:TIME;
cycleorder,
maptrys:CARDINAL;
uptime:TIME;
newpos0, newpos1:POSITION;
videofd:File;
gammatab:ARRAY[0..1023] OF CHAR;
mhtx:MHOPS;
pandone, onetipp:BOOLEAN;
tabview, alttabview:TABS;
vidbuf:POINTER TO VIDBUF;
mestxt:ARRAY[0..200] OF CHAR;
radio:RECORD
wasaltimap,
wasradio :BOOLEAN;
markpos, measurepos,mappos:POSITION;
initzoom :INTEGER;
finezoom :REAL;
ant1, ant2, ant3 :INTEGER;
bri, contr :INTEGER;
qual :INTEGER;
refrac :REAL;
c1, c2 :COLTYP;
END;
clickwatchpos:POSITION;
autoshottime:TIME;
batchp, batchlen:CARDINAL;
batchbuf:ARRAY[0..9999] OF CHAR;
PROCEDURE Error(text:ARRAY OF CHAR);
BEGIN
WrStr(text); WrStrLn(" error abort");
HALT
END Error;
PROCEDURE sqr(x:REAL):REAL; BEGIN RETURN x*x END sqr;
PROCEDURE makegammatab;
VAR i:CARDINAL;
PROCEDURE gammac(c:CARDINAL):CARDINAL;
CONST GAMMA=1.0/2.2;
BEGIN
IF c=0 THEN RETURN 0 END;
IF c<1024 THEN RETURN trunc(exp(ln(FLOAT(c)/1024.0)*GAMMA)*255.5) END;
RETURN 255
END gammac;
BEGIN
FOR i:=0 TO HIGH(gammatab) DO gammatab[i]:=CHR(gammac(i)) END;
END makegammatab;
PROCEDURE tooltips(typ:CHAR);
VAR s:ARRAY[0..20] OF CHAR;
pos:POSITION;
BEGIN
IF typ=" " THEN
IF (initzoom<=1) & (uptime+2=realtime) THEN starthint(10005, TRUE) END;
ELSIF typ="n" THEN
IF configon(fCONNECT) & (uptime+60>realtime) THEN
confstr(fSERVERFILT, s);
IF (CAP(s[0])="M") & NOT (getmypos(pos) & configon(fALLOWNETTX))
THEN starthint(10007, TRUE) ELSE starthint(10006, TRUE) END;
END;
ELSIF typ="m" THEN
IF uptime+180>realtime THEN starthint(10010, TRUE) END;
ELSIF typ="b" THEN
IF NOT onetipp THEN starthint(10015, TRUE) END;
onetipp:=TRUE;
ELSIF typ="B" THEN
IF NOT onetipp THEN starthint(10016, TRUE) END;
onetipp:=TRUE;
END;
END tooltips;
PROCEDURE mapbri(v:INTEGER);
VAR s,h:ARRAY[0..99] OF CHAR;
BEGIN
INC(v, VAL(CARDINAL, lums.map)/BRIMUL);
IF v<0 THEN v:=0 ELSIF v>100 THEN v:=100 END;
lums.map:=v*BRIMUL;
int2cfg(fLMAP, v); mapbritocfg;
s:="Brightness Map ";
IntToStr(v, 1, h); Append(s, h); Append(s, "%");
say(s, 4, "b");
END mapbri;
PROCEDURE fullbritime(down:BOOLEAN);
VAR s,h:ARRAY[0..99] OF CHAR;
d,n:CARDINAL;
BEGIN
d:=60*30;
IF lums.firstdim<60*15 THEN d:=60
ELSIF lums.firstdim<60*60 THEN d:=60*5
ELSIF lums.firstdim<60*60*3 THEN d:=60*15 END;
n:=lums.firstdim DIV d;
IF down THEN
IF n>1 THEN DEC(n) END;
ELSE INC(n) END;
lums.firstdim:=n*d;
IF lums.firstdim>lums.purgetime THEN lums.firstdim:=lums.purgetime END;
int2cfg(fTFULL, lums.firstdim DIV 60);
s:="Fullbright Time ";
IntToStr(lums.firstdim DIV 60, 1, h); Append(s, h); Append(s, "Min");
say(s, 4, "b");
END fullbritime;
PROCEDURE movest(width:CARDINAL):REAL;
BEGIN
RETURN power(2.0, -realzoom(initzoom, finezoom))*FLOAT(width)*FLOAT(lums.movestep)*0.0002;
END movest;
PROCEDURE shiftfine():REAL;
VAR s:REAL;
BEGIN
IF Shift THEN s:=0.1 ELSE s:=1.0 END;
IF configon(fINVMOV) THEN s:=-s END;
RETURN s
END shiftfine;
PROCEDURE rdlogdate(s-:ARRAY OF CHAR; VAR t:TIME; VAR p:CARDINAL):BOOLEAN;
(* 20130526:235959 *)
CONST MON=ARRAY OF TIME {0,0,31,59,90,120,151,181,212,243,273,304,334};
VAR i:CARDINAL;
d, y:TIME;
c:CHAR;
dt:BOOLEAN; (* second since 1970 or yyyymmdd:hhmmss *)
BEGIN
dt:=s[8]=":";
i:=0;
d:=0;
LOOP
c:=s[i];
IF (c<"0") OR (c>"9") THEN EXIT END;
d:=d*10+ORD(c)-ORD("0");
INC(i);
IF dt THEN
IF i=4 THEN (* year *)
IF (d<1970) OR (d>2100) THEN RETURN FALSE
ELSE t:=((d-1970)*365 + (d-1969) DIV 4) END; (* days since 1970 *)
y:=d;
d:=0;
ELSIF i=6 THEN (* month *)
IF d>12 THEN RETURN FALSE END;
INC(t, MON[d]);
IF (y MOD 4=0) & (d>2) THEN INC(t) END;
d:=0;
ELSIF i=8 THEN (* day *)
IF d<=0 THEN RETURN FALSE ELSE t:=(t+d-1)*(60*60*24); INC(i); d:=0 END;
ELSIF i=11 THEN INC(t, d*(60*60)); d:=0;
ELSIF i=13 THEN INC(t, d*60); d:=0;
ELSIF i=15 THEN INC(t, d); EXIT
ELSIF i>15 THEN RETURN FALSE END;
END;
END;
IF NOT dt THEN t:=d END;
p:=i;
RETURN TRUE
END rdlogdate;
PROCEDURE cmpcall(a-:ARRAY OF CHAR; i:CARDINAL; b-:ARRAY OF CHAR):BOOLEAN;
VAR j:CARDINAL;
BEGIN
j:=0;
REPEAT
IF a[i]<>b[j] THEN RETURN FALSE END;
INC(i);
INC(j);
UNTIL b[j]=0C;
RETURN a[i]=">"
END cmpcall;
PROCEDURE rdlonglog(VAR optab:pOPHIST; fn:ARRAY OF CHAR; from, to:TIME;
VAR firstread, lastread:TIME; VAR lines:INTEGER);
CONST MINSTEP=5000; (* stop binary search *)
SEEKBUF=1024; (* buffer size while binary search *)
RETR=200; (* if unsort file break binary search *)
VAR fc:File;
rp, len, ret:INTEGER;
ib:ARRAY[0..32767] OF CHAR;
wp, i, j:CARDINAL;
mbuf:FRAMEBUF;
start, end, ot:TIME;
op:pOPHIST;
dat:DAT;
lfc:CARDINAL;
new:BOOLEAN;
PROCEDURE binseek(time:TIME; bof:BOOLEAN; VAR first, last:TIME);
VAR rp, len, seekstep:INTEGER;
sb:ARRAY[0..1023] OF CHAR;
mbuf:FRAMEBUF;
lfc, retry:CARDINAL;
ftime:TIME;
BEGIN
retry:=0;
first:=0;
last:=0;
seekstep:=MAX(INTEGER) DIV 2;
LOOP
len:=0;
rp:=0;
wp:=0;
IF bof THEN lfc:=2 ELSE lfc:=0 END;
bof:=FALSE;
LOOP
IF rp>=len THEN
len:=RdBin(fc, sb, SIZE(sb));
rp:=0;
END;
IF len<=0 THEN lfc:=0; EXIT END;
mbuf[wp]:=sb[rp];
IF mbuf[wp]=LF THEN
mbuf[wp]:=0C;
wp:=0;
INC(lfc);
IF lfc>=2 THEN EXIT END;
ELSIF wp=2) & rdlogdate(mbuf, ftime, i) THEN (* we are in file *)
IF first=0 THEN
first:=ftime;
IF timelast THEN last:=ftime END;
ELSE ftime:=MAX(TIME) END; (* we are behind eof *)
IF (ftime
"+CR+LF);
(*
graphs(click.table[entc].opf, click.table[entc].typf, systime);
btimehist(click.table[entc].opf);
*)
END;
END;
END;
FOR decoded:=FALSE TO TRUE DO
anch:=1;
entc:=click.entries;
WHILE entc>0 DO
DEC(entc);
IF click.table[entc].opf<>NIL THEN
pv:=NIL;
dtime:=0;
IF NOT decoded THEN wr(fd, "
") END;
pf:=click.table[entc].pff0;
pfend:=click.table[entc].pff;
IF pfend<>NIL THEN pfend:=pfend^.next END;
IF pf=NIL THEN pf:=click.table[entc].opf^.frames; pfend:=NIL END;
WHILE pf<>pfend DO
IF (click.table[entc].typf<>"R") OR samepath(pf) THEN
IF decoded THEN
wr(fd, '
"+CR+LF);
IF posvalid(pf^.vardat^.pos) THEN pv:=pf^.vardat END;
dtime:=pf^.time;
ELSE
wr(fd, '');
TimeToStr(pf^.time MOD 86400, h);
Append(h, "");
wr(fd, h);
decode(h, pf^.vardat, pv, pf^.time, dtime, pf^.nodraw, FALSE);
coltxt(fd, h, TRUE);
wr(fd, " "+CR+LF);
END;
INC(anch);
END;
pf:=pf^.next;
END;
IF NOT decoded THEN wr(fd, ""+CR+LF) END;
END;
END;
END;
wr(fd, ""+CR+LF+""+CR+LF);
Close(fd);
END html;
<* END *>
PROCEDURE drawsquer(img:pIMAGE; p0-,p1-:POSITION; r,g,b:INTEGER);
VAR x0, y0, x1, y1:REAL;
col:COLTYP;
BEGIN
IF posvalid(p0) & posvalid(p1)
& (mapxy(p0, x0, y1)>=-1) & (mapxy(p1, x1, y0)>=-1) THEN
col.r:=r; col.g:=g; col.b:=b;
area(img, VAL(INTEGER,x0), VAL(INTEGER,y0), VAL(INTEGER,x1), VAL(INTEGER,y1), col, TRUE);
END;
END drawsquer;
PROCEDURE drawzoomsquer(img:pIMAGE);
CONST R=300; G=300; B=200; W=350;
VAR x,y,x1,y1:REAL;
BEGIN
IF click.zoomtox>=0 THEN
x:= VAL(REAL, click.x);
y:= VAL(REAL, click.y);
x1:=VAL(REAL, click.zoomtox);
y1:=VAL(REAL, click.zoomtoy);
vector(img, x, y, x1, y, R, G, B, W, 0.0);
vector(img, x1, y, x1, y1, R, G, B, W, 0.0);
vector(img, x1, y1, x, y1, R, G, B, W, 0.0);
vector(img, x, y1, x, y, R, G, B, W, 0.0);
-- col.r:=60; col.g:=60; col.b:=100;
-- area(image, click.x, click.y, click.zoomtox, click.zoomtoy, col, TRUE);
END;
END drawzoomsquer;
PROCEDURE qth(loc:ARRAY OF CHAR):BOOLEAN;
CONST FIELD=1.0/24.0*pi/180.0;
SFIELD=1.0/240.0*pi/180.0;
VAR pos, pos1:POSITION;
BEGIN
loctopos(pos, loc);
IF NOT posvalid(pos) THEN RETURN FALSE END;
setmark1(pos, TRUE, MAX(INTEGER), 0);
pos1:=pos;
pos.long:=(FLOAT(trunc((pos.long*(180.0/pi) + 180.0)*12.0))/12.0 - (180.0 - 1.0/24.0))*(pi/180.0);
pos.lat :=(FLOAT(trunc((pos.lat *(180.0/pi) + 90.0)*24.0))/24.0 - ( 90.0 - 1.0/48.0))*(pi/180.0);
limpos(pos);
click.squerpos0.lat:=pos.lat+FIELD/2.0;
click.squerpos1.lat:=pos.lat-FIELD/2.0;
click.squerpos0.long:=pos.long-FIELD;
click.squerpos1.long:=pos.long+FIELD;
limpos(click.squerpos0);
limpos(click.squerpos1);
pos.long:=(FLOAT(trunc((pos1.long*(180.0/pi) + 180.0)*120.0))/120.0 - (180.0 - 1.0/240.0))*(pi/180.0);
pos.lat :=(FLOAT(trunc((pos1.lat *(180.0/pi) + 90.0)*240.0))/240.0 - ( 90.0 - 1.0/480.0))*(pi/180.0);
limpos(pos);
click.squerspos0.lat:=pos.lat+SFIELD/2.0;
click.squerspos1.lat:=pos.lat-SFIELD/2.0;
click.squerspos0.long:=pos.long-SFIELD;
click.squerspos1.long:=pos.long+SFIELD;
limpos(click.squerspos0);
limpos(click.squerspos1);
(*
pos1.lat:=pos.lat-FIELD;
pos.lat:=pos.lat+FIELD;
pos1.long:=pos.long+FIELD*2.0;
pos.long:=pos.long-FIELD*2.0;
limpos(pos);
limpos(pos1);
mapzoom(pos, pos1, conf2int(fDEFZOOM, 0, 1, MAXZOOM, MAXZOOMOBJ), TRUE);
*)
centerpos(click.markpos, mappos);
RETURN TRUE
END qth;
PROCEDURE midscreenpos(VAR pos:POSITION);
BEGIN xytodeg(VAL(REAL,xsize)*0.5, VAL(REAL,ysize)*0.5, pos) END midscreenpos;
PROCEDURE zoominoutpush(in, fine, allowrev, mouseismiddle:BOOLEAN);
VAR z:REAL;
BEGIN
z:=realzoom(initzoom, finezoom);
IF z=FLOAT(trunc(z)) THEN push(z, FALSE) END;
zoominout(in, fine, allowrev, mouseismiddle);
END zoominoutpush;
PROCEDURE find(allpoi:BOOLEAN);
VAR h:ARRAY[0..200] OF CHAR;
hm:MONCALL;
err, poiok:BOOLEAN;
op:pOPHIST;
pos, pos1:POSITION;
BEGIN
IF allpoi THEN confstr(fFIND, h) ELSE confstr(fPOIFILTER, h) END;
IF NOT qth(h) THEN (* not a locator *)
deganytopos(h, pos);
poiok:=FALSE;
IF NOT posvalid(pos) THEN (* get position of POI name *)
POIfind(pos, allpoi, h);
poiok:=posvalid(pos);
END;
IF posvalid(pos) THEN (* poi or lat / long *)
IF allpoi THEN
click.mhop[0]:=0C;
click.onesymbol.tab:=0C;
END;
push(realzoom(initzoom, finezoom), TRUE);
setmark1(pos, TRUE, MAX(INTEGER), 0);
-- click.markpos:=pos; click.marktime:=0; click.markalti:=MAX(INTEGER);
centerpos(pos, mappos);
pandone:=FALSE;
textautosize(DOCKX, 0, 3, 4, "b", "marker set");
END;
IF allpoi & (poiok OR NOT posvalid(pos)) THEN (* search in aprs names *)
op:=findop(h, TRUE);
mainpop;
findopl(1);
IF op<>NIL THEN
click.mhop[0]:=0C;
click.onesymbol.tab:=0C;
mhtx:=OPSENT;
IF NOT poiok THEN (* else let focus on poi *)
push(realzoom(initzoom, finezoom),TRUE);
IF (click.entries>0) & (click.table[0].opf<>NIL) THEN
op:=oppo(click.table[0].opf^.call);
IF op<>NIL THEN click.mhop:=op^.call END;
END;
pandone:=FALSE;
lums.rf:=0;
IF op<>NIL THEN
err:=FALSE;
Assign(h, op^.call);
IF NOT posvalid(op^.lastpos) THEN err:=TRUE; Append(h, " No valid Position!") END;
IF op^.sym.tab<" " THEN
err:=TRUE;
Append(h, " No valid Symbol!");
IF posvalid(op^.lastpos) THEN (* set marker instead of missing symbol *)
setmark1(op^.lastpos, FALSE, MAX(INTEGER), realtime);
END;
END;
IF err THEN textautosize(0, 0, 3, 0, "b", h) END;
END;
END;
ELSIF NOT poiok THEN
Assign(hm, h);
findsize(pos, pos1, hm, "O");
IF posvalid(pos) THEN
push(realzoom(initzoom, finezoom), FALSE);
click.mhop:=hm;
mhtx:=OPOBJ;
pandone:=FALSE;
ELSE textautosize(0, 0, 3, 10, "e", LF+"not found!"+LF) END;
END;
END;
END;
END find;
PROCEDURE internstat;
VAR op:pOPHIST;
fr:pFRAMEHIST;
opc, frc, varc, bytec:CARDINAL;
oldest, newest:TIME;
s:ARRAY[0..10000] OF CHAR;
h:ARRAY[0..30] OF CHAR;
ut:TIME;
i:CARDINAL;
BEGIN
newest:=0;
oldest:=MAX(TIME);
opc:=0;
frc:=0;
varc:=0;
bytec:=0;
op:=ophist;
WHILE op<>NIL DO
INC(opc);
fr:=op^.frames;
WHILE fr<>NIL DO
INC(frc);
IF fr^.timenewest THEN newest:=fr^.time END;
IF fr^.vardat^.lastref=fr THEN
INC(varc);
INC(bytec, Length(fr^.vardat^.raw));
END;
fr:=fr^.next;
END;
op:=op^.next;
END;
Assign(s, "System Stat");
ut:=time();
IF ut>uptime THEN
Append(s, LF+"Uptime:"); TimeToStr(ut-uptime, h); Append(s, h);
END;
Append(s, LF+"Objects:"); IntToStr(opc, 1, h); Append(s, h);
Append(s, LF+"Frames:"); IntToStr(frc, 1, h); Append(s, h);
Append(s, LF+"Different Frames:"); IntToStr(varc, 1, h); Append(s, h);
Append(s, LF+"Rawdata Bytes:"); IntToStr(bytec, 1, h); Append(s, h);
IF frc>0 THEN
Append(s, LF+"Compressed to:"); IntToStr(100*varc DIV frc, 1, h); Append(s, h); Append(s, "%");
END;
IF newest>0 THEN
Append(s, LF+"Oldest:"); DateLocToStr(oldest, h); Append(s, h);
Append(s, LF+"Newest:"); DateLocToStr(newest, h); Append(s, h);
END;
Append(s, LF+"Heap Rawdata:"); IntToStr(debugmem.mon, 1, h); Append(s, h);
Append(s, LF+"Heap Screen: "); IntToStr(debugmem.screens, 1, h); Append(s, h);
Append(s, LF+"Heap Menus: "); IntToStr(debugmem.menus, 1, h); Append(s, h);
Append(s, LF+"Srtm Cache: "); IntToStr(srtmmem, 1, h); Append(s, h);
Append(s, LF+"POI Cache: "); IntToStr(debugmem.poi, 1, h); Append(s, h);
tcpconnstat(s);
FOR i:=0 TO HIGH(udpsocks) DO udpconnstat(i, s) END;
say(s, 0, "b");
END internstat;
PROCEDURE setshowall;
BEGIN
click.mhop[0]:=0C;
click.onesymbol.tab:=0C;
click.watchmhop:=FALSE;
lums.wxcol:=0C;
configbool(fGEOPROFIL, FALSE);
say("Show All", 2, "g");
END setshowall;
PROCEDURE View(n:CARDINAL);
VAR z:REAL;
pos, mid:POSITION;
s, h:ARRAY[0..100] OF CHAR;
BEGIN
IF Shift THEN
z:=realzoom(initzoom, finezoom);
FixToStr(z+0.05, 2, s);
midscreenpos(mid);
Append(s, " "); postostr(mid, "4", h); Append(s, h);
setcfg(fVIEW, n, s, 1);
killallmenus;
say("View stored!", 4, "r");
ELSE
z:=0.0;
posinval(pos);
getview(fVIEW, n, z, pos);
push(realzoom(initzoom, finezoom), FALSE);
IF z<>0.0 THEN
midscreenpos(mid);
mid.lat:=mid.lat+FLOATERRCORR;
initzoom:=trunc(z);
finezoom:=1.0+z-FLOAT(initzoom);
shiftmap(xsize DIV 2, ysize DIV 2, ysize, realzoom(initzoom, finezoom), mid);
mappos:=mid;
END;
IF posvalid(pos) THEN centerpos(pos, mappos) END;
pandone:=FALSE;
IF click.mhop[0]<>0C THEN setshowall END;
rdonesymb(FALSE, TRUE); (* show all symbols *)
END;
END View;
PROCEDURE follow;
VAR op:pOPHIST;
BEGIN
tracenew.winevent:=0;
op:=findop(tracenew.call, FALSE);
IF op<>NIL THEN
(*
WrInt(ORD(tracenew.follow), 2);
WrInt(ORD(click.mhop[0]=0C), 2);
WrInt(ORD(click.mhop=op^.call), 2);
WrInt(ORD(tracenew.beep), 2);
WrStrLn(" follow");
*)
IF tracenew.follow & ((click.mhop[0]=0C) OR (click.mhop=op^.call)) THEN pantoop(op) END;
IF tracenew.beep & configon(fBEEPWATCH) THEN
beeplim(100, conf2int(fBEEPWATCH, 0, 20, 8000, 800), conf2int(fBEEPWATCH, 1, 0, 5000, 100));
END;
clickwatchpos:=op^.lastpos;
popwatchcall(tracenew.call);
IF tracenew.follow THEN
-- IF lums.centering<100 THEN
-- click.markpos:=op^.lastpos
-- ELSE
click.clickpos:=op^.lastpos
-- END;
END;
maptrys:=30;
END;
tracenew.call[0]:=0C;
END follow;
PROCEDURE MapPackage;
VAR lu, rd:POSITION;
s, s1:ARRAY[0..999] OF CHAR;
BEGIN
xytodeg(0.0, VAL(REAL,ysize), lu);
xytodeg(VAL(REAL,xsize), 0.0, rd);
textautosize(0, 0, 16, 0, "b", "Calculating Sizes");
redraw(image);
StartMapPackage(lu, rd, conf2int(fDOWNLOADZOOM, 0, 1, MAXZOOM, 6), TRUE);
s:= "Left up : "; postostr(mappack.leftup, "2", s1); Append(s, s1);
Append(s, LF+"Right down: "); postostr(mappack.rightdown, "2", s1); Append(s, s1);
Append(s, LF+"From Zoom 1 to "); IntToStr(mappack.tozoom, 1, s1); Append(s, s1);
IF NOT click.chkmaps THEN Append(s, LF+"Map Check aborted!");
ELSE
Append(s, LF+"Total Tiles : "); IntToStr(mappack.mapscnt, 1, s1); Append(s, s1);
Append(s, LF+"Download Tiles: "); IntToStr(mappack.needcnt, 1, s1); Append(s, s1);
Append(s, LF+"Estimated "); FixToStr(FLOAT(mappack.needcnt)*0.018, 3, s1);
Append(s, s1); Append(s, "MByte");
END;
killmenuid(16);
IF mappack.needcnt>0 THEN textautomenu(DOCKX, 0, 16, 0, "r", s, " Start Download", CMDSTARTDOWNLOAD);
ELSE textautosize(DOCKX, 0, 16, 0, "b", s) END;
END MapPackage;
PROCEDURE zoomtosquare;
CONST TOSMALL=5;
VAR p1, p2:POSITION;
BEGIN
IF (click.zoomtox>=0)
& ((ABS(click.x-click.zoomtox)>TOSMALL) OR (ABS(click.y-click.zoomtoy)>TOSMALL)) THEN
xytodeg(VAL(REAL,click.x), VAL(REAL,click.y), p1);
xytodeg(VAL(REAL,click.zoomtox), VAL(REAL,click.zoomtoy), p2);
zoomtomarks(p1, p2);
END;
click.zoomtox:=-1; (* zoom done *)
END zoomtosquare;
PROCEDURE screenshot;
VAR s, h, hh:ARRAY[0..999] OF CHAR;
c:CHAR;
i, j, n:CARDINAL;
ok:INTEGER;
BEGIN
confstr(fFOTOFN, s);
s[HIGH(s)]:=0C;
h:=s;
i:=0;
WHILE (s[i]<>0C) & (s[i]<>"%") DO INC(i) END;
IF s[i]="%" THEN
IF s[i+1]="t" THEN (* insert date in filename *)
s[i]:=0C;
DateToStr(time()+localtime(), hh);
n:=0;
WHILE hh[n]<>0C DO
IF (hh[n]<"0") OR (hh[n]>"9") THEN hh[n]:="-" END;
INC(n);
END;
Append(s, hh);
INC(i, 2);
WHILE h[i]<>0C DO Append(s, h[i]); INC(i) END;
ELSIF s[i+1]="n" THEN (* insert serial number until new file *)
n:=0;
REPEAT
s[i]:=CHR(n DIV 100 MOD 10 + ORD("0"));
s[i+1]:=CHR(n DIV 10 MOD 10 + ORD("0"));
s[i+2]:=CHR(n MOD 10 + ORD("0"));
s[i+3]:=0C;
j:=i+2;
WHILE h[j]<>0C DO Append(s, h[j]); INC(j) END;
INC(n);
UNTIL (n>999) OR NOT Exists(s);
END;
END;
IF s<>0C THEN
killallmenus; (* dump panorama image pointer *)
IF panoimage<>NIL THEN ok:=saveppm(s, panoimage, HIGH(panoimage^)+1, HIGH(panoimage^[0])+1, FALSE);
ELSE ok:=saveppm(s, image, xsize, ysize, autoshots<>0) END;
IF ok<0 THEN Append(s, " write error"); c:="e"; ELSE Append(s, " saved"); c:="b"; END;
textautosize(0, 0, 6, 0, c, s);
ELSE
IF WITHX11 THEN
textautosize(0, 0, 6, 0, "e", LF+"no filename"+LF);
ELSE
WrStrLn("no image filename");
END
END;
END screenshot;
PROCEDURE drawtime(img:pIMAGE; t:TIME; fast:INTEGER);
TYPE sCHGEN=SET OF [0..34];
CONST CHGEN=ARRAY OF sCHGEN {{1,2,3, 5,9,10,14,15,19,20,24,25,29,31,32,33},
{2, 6,7,10,12,17,22,27,31,32,33},
{1,2,3, 5,9, 14, 18, 22, 26, 30..34},
{1,2,3, 9, 14, 16,17,18, 24, 29, 31,32,33},
{0,5, 8,10,13, 15,18, 20..24, 28, 33},
{0..4, 5,10..13, 19, 24, 25,29, 31,32,33},
{2, 6, 10, 15..18, 20,24, 25,29, 31,32,33},
{0..4, 9, 13, 17, 21, 26, 31},
{1,2,3, 5,9, 10,14, 16,17,18, 20,24, 25,29, 31,32,33},
{1,2,3, 5,9, 10,14, 16..19, 24, 29, 31,32,33},
{30},
{10, 25},
{}};
POSX=4;
POSY=18;
dimmlev=200.0*256.0;
VAR s:ARRAY[0..31] OF CHAR;
ch:CARDINAL;
col:COLTYP;
i, x, y, px, l:CARDINAL;
lum:REAL;
BEGIN
DateToStr(t+localtime(), s);
s[16]:=0C; (* strip off seconds *)
IF fast<0 THEN fast:=0 ELSIF fast>200 THEN fast:=200 END;
fast:=fast*4;
col.r:=1000; col.g:=1000-fast; col.b:=200+fast;
l:=0;
i:=0;
px:=POSX;
WHILE s[i]>0C DO
ch:=ORD(s[i]);
IF (ch>=ORD("0")) & (ch<=ORD("9")) THEN DEC(ch, ORD("0"))
ELSIF ch=ORD(".") THEN ch:=10 ELSIF ch=ORD(":") THEN ch:=11 ELSE ch:=12 END;
IF ch<=HIGH(CHGEN) THEN s[l]:=CHR(ch); INC(l) END;
IF ch<=9 THEN INC(px, 12) ELSE INC(px, 5) END;
INC(i);
END;
FOR y:=POSY+1 TO POSY-15 BY -1 DO
FOR x:=POSX TO px DO
WITH img^[x][y] DO
lum:=FLOAT(VAL(CARDINAL,r)*87 + VAL(CARDINAL,g)*140 + VAL(CARDINAL,b)*28);
IF lum>dimmlev THEN
lum:=dimmlev/lum;
r:=trunc(FLOAT(r)*lum);
g:=trunc(FLOAT(g)*lum);
b:=trunc(FLOAT(b)*lum);
END;
END;
END;
END;
px:=POSX;
i:=0;
WHILE i0 THEN
pf:=click.table[click.selected].pff0;
IF (pf<>NIL) & posvalid(pf^.vardat^.pos) THEN
oldpos:=pf^.vardat^.pos;
xytodeg(VAL(REAL,click.x), VAL(REAL,click.y), clickpos);
d0:=distance(clickpos, pf^.vardat^.pos);
--WrInt(trunc(d0*1000.0), 10); WrLn;
LOOP
pf:=pf^.next;
IF pf=NIL THEN EXIT END;
IF posvalid(pf^.vardat^.pos)
& ((pf^.vardat^.pos.lat<>oldpos.lat) OR (pf^.vardat^.pos.long<>oldpos.long)) THEN
d1:=distance(clickpos, pf^.vardat^.pos);
--WrInt(trunc(d1*1000.0), 15);WrInt(trunc(d0*1000.0), 15);WrLn;
IF d1d0 THEN EXIT END;
END;
END;
END;
END;
END nearwaypoint;
PROCEDURE clickdelwaypoint;
VAR s:ARRAY[0..100] OF CHAR;
BEGIN
nearwaypoint;
WITH click.table[0] DO
delwaypoint(opf, pff0);
Assign(s, opf^.call);
Append(s, " waypoint Deleted");
say(s, 4, "r");
END;
END clickdelwaypoint;
PROCEDURE savevideo420(img:pIMAGE; fn:ARRAY OF CHAR; format:CHAR; VAR bytecnt:REAL);
CONST LF=12C;
VAR x,y:INTEGER;
ww, rr, gg, bb:INTEGER;
pw, pr, pb:CARDINAL;
h,s:ARRAY[0..255] OF CHAR;
PROCEDURE flo(c:INT16):INTEGER;
BEGIN
IF c<=HIGH(gammatab) THEN RETURN ORD(gammatab[c]) ELSE RETURN 255 END;
END flo;
BEGIN
IF NOT FdValid(videofd) THEN
(*
videofd:=Create(fn);
*)
IF Exists(fn) THEN videofd:=OpenWrite(fn) ELSE videofd:=OpenWrite(fn) END;
IF NOT FdValid(videofd) THEN RETURN END;
IF format="M" THEN
h:="YUV4MPEG2 C420jpeg W";
IntToStr(xsize, 1, s); Append(h, s);
Append(h, " H");
IntToStr(ysize, 1, s); Append(h, s);
Append(h, " F25000000:1000000 Ip"+LF);
WrBin(videofd, h, Length(h));
END;
END;
IF vidbuf=NIL THEN
ALLOCATE(vidbuf, xsize*ysize*3 DIV 2); debugmem.req:=xsize*ysize*3 DIV 2; INC(debugmem.screens, debugmem.req);
IF vidbuf=NIL THEN Error("video buffer alloc") END;
END;
IF format="M" THEN
h:="FRAME"+LF;
WrBin(videofd, h, 6);
END;
pw:=0;
pb:=xsize*ysize;
pr:=pb+pb DIV 4;
FOR y:=ysize-1 TO 0 BY -1 DO
FOR x:=0 TO xsize-1 DO
WITH img^[x][y] DO
IF format="M" THEN
vidbuf^[pw]:=CHR(flo((VAL(CARDINAL,r)*76 + VAL(CARDINAL,g)*150 + VAL(CARDINAL,b)*29) DIV 256));
ELSE vidbuf^[pw]:=CHR(flo((VAL(CARDINAL,r)*76 + VAL(CARDINAL,g)*150 + VAL(CARDINAL,b)*29) DIV 256)*219 DIV 256 + 16); END;
INC(pw);
END;
IF ODD(y) & ODD(x) THEN
WITH img^[x-1][y] DO
rr:=r;
gg:=g;
bb:=b;
END;
WITH img^[x][y] DO
INC(rr,r);
INC(gg,g);
INC(bb,b);
END;
WITH img^[x-1][y-1] DO
INC(rr,r);
INC(gg,g);
INC(bb,b);
END;
WITH img^[x][y-1] DO
INC(rr,r);
INC(gg,g);
INC(bb,b);
END;
rr:=flo(rr DIV 4);
gg:=flo(gg DIV 4);
bb:=flo(bb DIV 4);
ww:=(rr*76 + gg*150 + bb*29) DIV 256;
rr:=(rr-ww)*145 DIV 256 + 128;
IF rr<0 THEN rr:=0 ELSIF rr>255 THEN rr:=255 END;
bb:=(bb-ww)*182 DIV 256 + 128;
IF bb<0 THEN bb:=0 ELSIF bb>255 THEN bb:=255 END;
IF format<>"M" THEN
vidbuf^[pr]:=CHR(bb);
vidbuf^[pb]:=CHR(rr);
ELSE
vidbuf^[pr]:=CHR(rr);
vidbuf^[pb]:=CHR(bb);
END;
INC(pr);
INC(pb);
END;
END;
END;
WrBin(videofd, vidbuf^, xsize*ysize*3 DIV 2);
bytecnt:=bytecnt+FLOAT(xsize*ysize*3 DIV 2);
END savevideo420;
(*
PROCEDURE savevideo444(img:pIMAGE; n:CARDINAL);
VAR x,y,p:INTEGER;
buf:ARRAY[0..65535] OF CHAR;
c, yy, rr, gg, bb:REAL;
PROCEDURE flo(c:CARD16):REAL;
BEGIN
IF c<=HIGH(gammatab) THEN RETURN FLOAT(ORD(gammatab[c])) ELSE RETURN 255.0 END;
END flo;
BEGIN
IF NOT FdValid(videofd) THEN RETURN END;
p:=0;
FOR y:=ysize-1 TO 0 BY -1 DO
FOR x:=0 TO xsize-1 DO
WITH img^[x+y*xsize] DO rr:=flo(r); gg:=flo(g); bb:=flo(b) END;
yy:=rr*0.299 + gg*0.587 +bb*0.114;
buf[p]:=CHR(TRUNC(yy*(219.0/255.0))+16);
INC(p); IF p>HIGH(buf) THEN WrBin(videofd, buf, p); p:=0 END;
c:=(bb-yy)*0.565+128.0;
IF c<0.0 THEN c:=0.0 ELSIF c>255.9 THEN c:=255.0 END;
buf[p]:=CHR(TRUNC(c));
INC(p); IF p>HIGH(buf) THEN WrBin(videofd, buf, p); p:=0 END;
c:=(rr-yy)*0.713+128.0;
IF c<0.0 THEN c:=0.0 ELSIF c>255.9 THEN c:=255.0 END;
buf[p]:=CHR(TRUNC(c));
INC(p); IF p>HIGH(buf) THEN WrBin(videofd, buf, p); p:=0 END;
END;
END;
IF p>0 THEN WrBin(videofd, buf, p) END;
END savevideo444;
*)
PROCEDURE wrvidsize(b:REAL);
VAR s:ARRAY[0..100] OF CHAR;
BEGIN
FixToStr(b/1000000.0, 2, s);
Append(s, " MBytes written");
say(s, 0, "b");
END wrvidsize;
PROCEDURE copy(VAR dest, src:IMAGE);
VAR x:CARDINAL;
BEGIN
FOR x:=0 TO HIGH(dest) DO
MOVE(ADR(src[x]), ADR(dest[x]), SIZE(dest[0]));
END;
END copy;
PROCEDURE cmpcol(c1, c2:COLTYP):BOOLEAN;
BEGIN RETURN (c1.r<>c2.r) OR (c1.g<>c2.g) OR (c1.b<>c2.b) END cmpcol;
PROCEDURE addradio; (* radiation visability map *)
VAR abort:BOOLEAN;
c1, c2:COLTYP;
BEGIN
IF posvalid(click.markpos) OR posvalid(click.measurepos) THEN
lums.rf:=0;
getgeocol(fCOLMARK1, geobri(), 100,0,0, c1);
getgeocol(fCOLMARK2, geobri(), 0,100,0, c2);
IF NOT radio.wasradio OR radio.wasaltimap OR (radio.markpos.lat<>click.markpos.lat)
OR (radio.markpos.long<>click.markpos.long)
OR (radio.measurepos.lat<>click.measurepos.lat)
OR (radio.measurepos.long<>click.measurepos.long)
OR (radio.mappos.lat<>mappos.lat) OR (radio.mappos.long<>mappos.long)
OR (radio.initzoom<>initzoom) OR (radio.finezoom<>finezoom)
OR (radio.ant1<>getant(fANT1)) OR (radio.ant2<>getant(fANT2))
OR (radio.ant3<>getant(fANT3)) OR (radio.bri<>geobri()) OR (radio.contr<>geocontr())
OR cmpcol(radio.c1, c1) OR cmpcol(radio.c2, c2) OR (radio.qual<>confflags(fSRTMCACHE, 0))
OR (radio.refrac<>getrefrac())
THEN
abort:=FALSE;
clr(rfimg);
IF posvalid(click.markpos) THEN
radioimage(rfimg, click.markpos, 0, abort);
END;
IF NOT abort & posvalid(click.measurepos) THEN
radioimage(rfimg, click.measurepos, ORD(posvalid(click.markpos)), abort);
END;
-- IF (lums.map>0) & posvalid(click.measurepos) & posvalid(click.markpos) THEN makebw(image) END;
radio.wasradio:=TRUE;
radio.wasaltimap:=FALSE;
radio.markpos:=click.markpos;
radio.measurepos:=click.measurepos;
radio.mappos:=mappos;
radio.initzoom:=initzoom;
radio.finezoom:=finezoom;
radio.ant1:=getant(fANT1);
radio.ant2:=getant(fANT2);
radio.ant3:=getant(fANT3);
radio.bri:=geobri();
radio.contr:=geocontr();
radio.c1:=c1;
radio.c2:=c2;
radio.qual:=confflags(fSRTMCACHE, 0);
radio.refrac:=getrefrac();
reliefcolors(rfimg, posvalid(click.measurepos) & posvalid(click.markpos));
IF abort THEN
textautosize(0, 0, 5, 2, "r", "radiorange aborted");
closeradio;
radio.wasradio:=FALSE;
sayonoff("Radiorange Map", click.withradio);
END;
END;
IF radio.wasradio THEN addmap(image, rfimg) END;
END;
END addradio;
PROCEDURE altitudemap; (* simple relieaf map layer *)
VAR abort:BOOLEAN;
c1, c2:COLTYP;
BEGIN
lums.rf:=0;
IF NOT radio.wasradio OR NOT radio.wasaltimap
OR (radio.mappos.lat<>mappos.lat) OR (radio.mappos.long<>mappos.long)
OR (radio.initzoom<>initzoom) OR (radio.finezoom<>finezoom) OR (radio.bri<>geobri()) THEN
clr(rfimg);
IF SimpleRelief(rfimg) THEN
radio.wasaltimap:=TRUE;
radio.wasradio:=TRUE;
radio.mappos:=mappos;
radio.initzoom:=initzoom;
radio.finezoom:=finezoom;
radio.bri:=geobri();
ELSE textautosize(0, 0, 3, 2, "r", "no altitude data found") END;
END;
IF radio.wasradio THEN addmap(image, rfimg) END;
END altitudemap;
PROCEDURE xytomark;
VAR pos:POSITION;
BEGIN
-- xytodeg(VAL(REAL,click.x), VAL(REAL,click.y), pos);
xytodeg(VAL(REAL, xmouse.x), VAL(REAL, VAL(INTEGER, mainys())-xmouse.y), pos);
setmark1(pos, TRUE, MAX(INTEGER), 0);
postoconfig(pos);
click.waysum:=0.0;
END xytomark;
PROCEDURE xytomark2;
VAR pos:POSITION;
BEGIN
xytodeg(VAL(REAL, xmouse.x), VAL(REAL, VAL(INTEGER, mainys())-xmouse.y), pos);
IF posvalid(pos) THEN
click.measurepos:=pos;
copypastepos(pos);
END;
END xytomark2;
PROCEDURE centermouse(shortcut:BOOLEAN);
VAR pos :POSITION;
x0,x1,y0,y1 :REAL;
BEGIN
posinval(pos);
IF shortcut THEN
xytodeg(VAL(REAL, xmouse.x), VAL(REAL, VAL(INTEGER, mainys())-xmouse.y), pos);
IF posvalid(click.bubblpos) & (mapxy(click.bubblpos, x0, y0)>=-1)
& posvalid(pos) & (mapxy(pos, x1, y1)>=-1) & (sqr(x0-x1) + sqr(y0-y1)<25.0)
THEN pos:=click.bubblpos END; (* POI is near mouse so use POI position to center *)
ELSIF (click.entries>0) & (click.table[click.selected].opf<>NIL)
& posvalid(click.table[click.selected].opf^.lastpos) THEN pos:=click.table[click.selected].opf^.lastpos;
ELSIF posvalid(click.clickpos) THEN pos:=click.clickpos END;
IF posvalid(pos) THEN
push(realzoom(initzoom, finezoom), TRUE);
centerpos(pos, mappos);
END;
END centermouse;
PROCEDURE clicktomark;
BEGIN
IF (click.entries>0) & (click.table[click.selected].opf<>NIL)
& posvalid(click.table[click.selected].opf^.lastpos)
THEN setmarkalti(click.table[click.selected].pff0, click.table[click.selected].opf, TRUE);
ELSE setmark1(click.clickpos, TRUE, MAX(INTEGER), 0) END;
END clicktomark;
PROCEDURE setmarklockpoi(marker2:BOOLEAN);
VAR pos:POSITION;
name,info:ARRAY[0..40] OF CHAR;
BEGIN
xytodeg(VAL(REAL, xmouse.x), VAL(REAL, VAL(INTEGER, mainys())-xmouse.y), pos);
POIname(pos, name,info);
IF name<>"" THEN
IF marker2 THEN
click.measurepos:=pos;
copypastepos(pos);
ELSE
setmark1(pos, TRUE, MAX(INTEGER), 0);
postoconfig(click.bubblpos);
END;
info:="Locked to "; Append(info, name);
say(info, 4, "b");
ELSE say("Not Locked", 4, "r") END;
END setmarklockpoi;
PROCEDURE slowupdate():TIME; (* add image update time on cpu intensiv options *)
VAR t:TIME;
BEGIN
t:=makeimagetime;
IF t>20 THEN t:=20 END;
RETURN t*2+updateintervall
END slowupdate;
PROCEDURE addrftracks(dryrun, tx:BOOLEAN);
VAR clr:BOOLEAN;
BEGIN
clr:=NOT dryrun; (* clr old image before draw *)
IF tx THEN mhtracks(click.mhop, clr) ELSE rftracks(click.mhop, clr) END;
IF NOT (dryrun OR clr) THEN (* not dryrun and something drawn *)
radio.wasradio:=FALSE; (* no radiolink data in rfimg now *)
shine(rfimg, lums.rfbri);
addmap(image, rfimg);
END;
END addrftracks;
PROCEDURE animate(singlecall-:MONCALL; step:TIME; tofile:ARRAY OF CHAR);
CONST QUICKMOV=10; (* faster if nothing visable moves *)
FASTDELAY=70; (* delay switching to fast *)
SLOWER=3; (* steps befor next move switch to slow *)
TRAILER=10; (* steps at end of move till video end *)
VAR op, singleop:pOPHIST;
pf, pf1:pFRAMEHIST;
efil:ERRSET;
nextmov, vtime, endtime, stime, showt, fractime:TIME;
fast, fastdelay:INTEGER;
skip, ii:CARDINAL;
x,y,nomove:REAL;
col:COLTYP;
textpos:INT8;
dir, mapok, blown,stop:BOOLEAN;
ipos:POSITION;
itime, iitime:REAL;
bytew:REAL;
s,s1:ARRAY[0..40] OF CHAR;
minalt:INTEGER;
dat, dat1:DAT;
hoverobj:CLICKOBJECT;
BEGIN
closeradio;
singleop:=oppo(singlecall);
IF NOT pandone THEN
findsize(newpos0, newpos1, click.mhop, "T");
mapzoom(newpos0, newpos1, conf2int(fDEFZOOM, 0, 1, MAXZOOM, MAXZOOMOBJ), TRUE, FALSE);
pandone:=TRUE;
mercator(mappos.long, mappos.lat, initzoom, inittilex, inittiley, shiftx, shifty);
END;
showt:=0;
bytew:=0.0;
click.dryrun:=FALSE;
vtime:=systime; (* last whole data time *)
endtime:=vtime-VAL(TIME,lums.firstdim+lums.maxdim); (* start time minimum *)
stime:=endtime;
nomove:=movest(500)*5.0; (* min km/s for a moving object *)
IF step=0 THEN step:=trunc(sqrt(nomove)*FLOAT(VIDEORATE*conf2int(fANIMSPEED, 0, 0, 10000, 400)))+1 END;
fastdelay:=-conf2int(fVIDEOFAST, 0, 0, 10000, 0);
markvisable(0C);
op:=ophist;
xytodeg(VAL(REAL,xsize), 0.0, ipos);
IF configon(fTRACKFILT) THEN efil:=ERRSET{eDIST} ELSE efil:=ERRSET{eDIST,eNODRAW,eSYMB} END;
minalt:=conf2int(fALTMIN, 0, -10000, 65535, -10000);
stop:=FALSE;
WHILE op<>NIL DO
WITH op^ DO
EXCL(drawhints, MOVES);
IF MARKED IN drawhints THEN
IF (distance(margin0, margin1)>nomove*400.0) & ((singleop=NIL) OR (op=singleop))
& (op^.sym.tab<>DELETSYM) THEN (* they will move *)
pf1:=NIL;
pf:=op^.frames;
WHILE pf<>NIL DO
IF (pf^.nodraw-efil=ERRSET{}) & posvalid(pf^.vardat^.pos) THEN
IF pf1<>NIL THEN
WITH pf1^.vardat^ DO
IF (pf1^.time>=stime) & posvalid(pos)
& (pos.long<=ipos.long) & (pos.lat>=ipos.lat)
& (pos.long>=mappos.long) & (pos.lat<=mappos.lat)
-- & (pf^.next<>NIL) & posvalid(pf^.next^.vardat^.pos)
& (distance(pos, pf^.vardat^.pos)>nomove*10.0) THEN (* moving *)
IF pf^.time>endtime THEN endtime:=pf^.time END; (* show till latest mover *)
IF pf1^.timeendtime THEN endtime:=lasttime END; (* show till latest mover *)
-- IF (frames<>NIL) & (frames^.time0 THEN
loadmap(image, inittilex, inittiley, initzoom, finezoom, shiftx, shifty, mapok, blown, configon(fALLOWEXP), FALSE);
ELSE clr(image) END;
IF lums.sym>0 THEN
IF lums.obj>0 THEN symbols(ophist, TRUE, hoverobj) END;
symbols(ophist, FALSE, hoverobj);
END;
IF lums.text>0 THEN
text(ophist, FALSE, FALSE, TRUE); (* first draw dimmed *)
text(ophist, TRUE, FALSE, TRUE); (* overdraw dimmed *)
END;
cc(image, vtime, endtime);
op:=ophist;
WHILE op<>NIL DO EXCL(op^.drawhints, MARKED); op:=op^.next; END; (* now use only mover(s) *)
lums.moving:=FALSE;
videofd:=InvalidFd;
IF vtime>stime THEN stime:=vtime END;
-- icnt:=0;
fast:=fastdelay;
skip:=0;
fractime:=0;
REPEAT
IF skip=0 THEN
(*
MOVE(image, rfimg, SIZE(PIX)*xsize*ysize);
*)
copy(rfimg^, image^);
IF lums.track>1 THEN tracks(rfimg, ophist, vtime) END;
END;
op:=ophist;
nextmov:=endtime;
WHILE op<>NIL DO
IF MOVES IN op^.drawhints THEN
pf:=NIL;
pf1:=op^.frames;
WHILE (pf1<>NIL) & (vtime>pf1^.time) DO
IF pf1^.nodraw-efil=ERRSET{} THEN pf:=pf1 END;
pf1:=pf1^.next;
END;
WHILE (pf1<>NIL) & (pf1^.nodraw-efil<>ERRSET{}) DO pf1:=pf1^.next END;
IF pf<>NIL THEN
IF (pf1<>NIL) & (pf1^.time>pf^.time) & (vtime>pf^.time) THEN (* interpolate waypoints *)
itime:=(FLOAT(vtime-pf^.time)+FLOAT(fractime)*(1.0/VIDEORATE))/FLOAT(pf1^.time-pf^.time);
-- IF itime>1.0 THEN itime:=1.0 ELSIF itime<0.0 THEN itime:=0.0 END;
iitime:=1.0-itime;
ipos.long:=pf^.vardat^.pos.long*iitime + pf1^.vardat^.pos.long*itime;
ipos.lat :=pf^.vardat^.pos.lat *iitime + pf1^.vardat^.pos.lat *itime;
dir:=pf^.vardat^.pos.long>pf1^.vardat^.pos.long; (* mirror symbol on long deg *)
ELSE (* end of track *)
ipos:=pf^.vardat^.pos;
dir:=MIRRORSYM IN op^.drawhints;
itime:=-1.0
END;
IF (mapxy(ipos, x, y)>=0) & vistime(pf^.time) THEN
IF skip=0 THEN
IF op^.poligon & (Decode(pf^.vardat^.raw, dat)>=0) THEN
IF (itime>0.0) & (Decode(pf1^.vardat^.raw, dat1)>=0)
& (dat.multiline.size=dat1.multiline.size) THEN (* interpolate poligon form *)
ii:=0;
WHILE ii0C) & (Decode(pf^.vardat^.raw, dat)>=0) THEN (* decode each frame if form changed *)
IF (itime>0.0) & (Decode(pf1^.vardat^.raw, dat1)>=0) THEN (* interpolate areasymbol form *)
WITH dat.areasymb.dpos DO
lat :=lat *iitime + dat1.areasymb.dpos.lat *itime;
long:=long*iitime + dat1.areasymb.dpos.long*itime;
END;
END;
drawareasym(rfimg, ipos, dat.areasymb, lums.obj DIV 4);
ELSE
drawsym(rfimg, op^.sym.tab, op^.sym.pic, dir, x, y, lums.sym DIV 4);
IF (op^.sym.pic="@") & (Decode(pf^.vardat^.raw, dat)>=0) THEN
IF (itime>0.0) & (Decode(pf1^.vardat^.raw, dat1)>=0) THEN (* interpolate storm areas *)
WITH dat.areasymb.dpos DO
lat :=lat *iitime + dat1.areasymb.dpos.lat *itime;
long:=long*iitime + dat1.areasymb.dpos.long*itime;
END;
stormcicle(rfimg, ipos, dat.wx.radiushurr*iitime + dat1.wx.radiushurr*itime,
dat.wx.radiusstorm*iitime + dat1.wx.radiusstorm*itime,
dat.wx.wholegale*iitime + dat1.wx.wholegale*itime,
lums.sym DIV 4);
END;
END;
END;
IF configon(fKMH) & (Decode(pf^.vardat^.raw, dat)>=0) THEN
s:="";
IF (dat.speed>0) & (dat.speed0C THEN
IntToStr(trunc(FLOAT(dat.speed)*KNOTS), 1, s);
Append(s, s1);
END;
END;
IF (dat.altitude=minalt) THEN
IF s[0]<>0C THEN Append(s, " ") END;
IntToStr(dat.altitude, 1, s1); Append(s, s1);
Append(s, "m");
END;
IF s[0]<>0C THEN
Colset(col, "Y");
textpos:=-8;
drawstr(rfimg, s, x+FLOAT(lums.symsize DIV 2-1), y-FLOAT(lums.fontysize+3),
lums.text, 0, col, textpos, 0, TRUE, click.dryrun);
END;
END;
Colset(col, "W");
textpos:=0;
drawstr(rfimg, op^.call, x+FLOAT(lums.symsize DIV 2-1),
y-FLOAT(lums.fontysize DIV 2), lums.text, 0, col,
textpos, 0, TRUE, click.dryrun);
END;
IF (pf1<>NIL)
& (distance(pf^.vardat^.pos, pf1^.vardat^.pos)/FLOAT(pf1^.time-pf^.time)>nomove)
& (pf1^.timeFASTDELAY*) );
IF endtime>stime THEN
col.r:=100; col.g:=800; col.b:=1000;
area(rfimg, 0,1, trunc(FLOAT(xsize)*FLOAT(vtime-stime)/FLOAT(endtime-stime)), 3, col, FALSE);
END;
IF tofile[0]<>0C THEN
savevideo420(rfimg, tofile, "M", bytew);
-- INC(icnt);
IF showt<>time() THEN
showt:=time();
wrvidsize(bytew);
redraw(rfimg);
END;
Eventloop(1);
ELSE
refresh:=TRUE;
LOOP (* while stop pressed *)
IF refresh THEN redraw(rfimg) END;
lums.actfps:=step; (* for faster/slower button *)
Eventloop(1000);
step:=lums.actfps;
IF click.cmd=" " THEN
IF stop THEN stop:=FALSE; click.cmd:="A";
ELSE stop:=TRUE; click.cmd:=CMDANIMATEMENU END;
ELSIF click.cmd<>CMDANIMATEMENU THEN stop:=FALSE END;
IF NOT stop & (click.cmd<>CMDANIMATEMENU) THEN EXIT END;
realtime:=time();
END;
END;
IF fast>250 THEN fast:=250 END;
IF fast>0 THEN skip:=fast DIV 25 ELSE skip:=0 END;
ELSE DEC(skip) END;
INC(fractime, step);
INC(vtime, fractime DIV VIDEORATE);
fractime:=fractime MOD VIDEORATE;
(*
IF fast>FASTDELAY THEN INC(vtime, step*STEPMUL) ELSE INC(vtime, step) END;
*)
realtime:=time();
UNTIL (vtime>endtime+step*TRAILER DIV VIDEORATE) OR (click.cmd<>"A")
& (click.cmd<>CMDANIMATE1) & (click.cmd<>CMDVIDEO) OR (newxsize>0);
IF FdValid(videofd) THEN
Close(videofd);
say(VIDEOFN+" Saved", 0, "b");
END;
IF vidbuf<>NIL THEN
DEC(debugmem.screens, xsize*ysize*3 DIV 2);
DEALLOCATE(vidbuf, xsize*ysize*3 DIV 2);
vidbuf:=NIL;
END;
END animate;
PROCEDURE makeimage(dryrun:BOOLEAN);
VAR mapok:BOOLEAN;
mpos:POSITION;
hoverobj:CLICKOBJECT;
testtime:TIME;
BEGIN
testtime:=time();
hoverobj.opf:=NIL;
markvisable(click.mhop);
IF (click.mhop[0]<>0C) & (mhtx=OPHEARD) THEN findsize(newpos0, newpos1, click.mhop, "H");
ELSIF (click.mhop[0]<>0C) & (mhtx=OPOBJ) THEN findsize(newpos0, newpos1, click.mhop, "O");
ELSIF lums.rf>1 THEN findsize(newpos0, newpos1, click.mhop, "R");
ELSE findsize(newpos0, newpos1, click.mhop, "T") END;
IF NOT pandone THEN
mapzoom(newpos0, newpos1, conf2int(fDEFZOOM, 0, 1, MAXZOOM, MAXZOOMOBJ), TRUE, TRUE);
pandone:=TRUE;
lums.moving:=FALSE;
END;
mercator(mappos.long, mappos.lat, initzoom, inittilex, inittiley, shiftx, shifty);
click.dryrun:=dryrun;
IF dryrun THEN
click.min:=lums.symsize DIV 2;
click.entries:=0;
click.pf0:=NIL;
ELSE
IF lums.map>0 THEN
loadmap(image, inittilex, inittiley, initzoom, finezoom, shiftx, shifty, mapok, isblown, configon(fALLOWEXP), FALSE);
-- IF maploadpid.runs & NOT mapok THEN
IF NOT mapok & configon(fGETMAPS) THEN
tooltips("B");
maptrys:=30;
ELSE maptrys:=0 END;
ELSE clr(image) END;
END;
IF (lums.wxcol="R") OR (lums.wxcol="W") THEN (* "w" is show wx stations only *)
IF NOT dryrun THEN
closeradio;
IF lums.map>0 THEN makebw(image) END;
clr(rfimg);
IF lums.wxcol="R" THEN
metercolor("R");
addmap(image, rfimg);
clr(rfimg);
metercolor("1");
ELSE metercolor("T") END;
addmap(image, rfimg);
END;
ELSIF (lums.rf>1) & (click.mhop[0]<>0C) & (mhtx=OPSENT) THEN addrftracks(dryrun, FALSE);
ELSIF (click.mhop[0]<>0C) & (mhtx=OPHEARD) THEN addrftracks(dryrun, TRUE);
END;
IF lums.moving THEN
text(ophist, FALSE, FALSE, TRUE);
IF lums.track>1 THEN tracks(image, ophist, MAX(TIME)) END;
symbols(ophist, TRUE, hoverobj);
IF lums.sym>0 THEN symbols(ophist, FALSE, hoverobj) END;
text(ophist, TRUE, FALSE, TRUE);
ELSE
IF lums.track>1 THEN tracks(image, ophist, MAX(TIME)) END;
IF lums.obj>0 THEN
symbols(ophist, TRUE, hoverobj);
text(ophist, TRUE, TRUE, TRUE);
END;
IF lums.sym>0 THEN symbols(ophist, FALSE, hoverobj) END;
IF NOT dryrun THEN drawpois(image) END;
IF (lums.text>0) OR (lums.wxcol<>0C) THEN text(ophist, FALSE, TRUE, TRUE) END;
END;
IF NOT dryrun THEN
IF (click.marktime=0) OR (click.marktime+MARKERTIME>realtime)
THEN setmark(image, click.markpos, click.marktime=0) END;
drawsquer(image, click.squerpos0, click.squerpos1,0,60,0);
drawsquer(image, click.squerspos0, click.squerspos1,0,0,140);
IF NOT click.withradio OR click.altimap THEN
mpos:=click.measurepos;
IF NOT posvalid(mpos) & (hoverobj.opf<>NIL) & configon(fGEOPROFIL)
THEN mpos:=hoverobj.opf^.lastpos END;
measureline(image, click.markpos, mpos, click.markalti);
END;
cc(image, time(), 0);
IF configon(fRULER) THEN ruler(image) END;
Stopticker;
drawzoomsquer(image);
IF click.withradio THEN
IF click.altimap THEN altitudemap ELSE addradio END;
ELSE radio.wasradio:=FALSE END;
ELSE
nearwaypoint;
click.dryrun:=FALSE;
END;
IF lums.wxcol="w" THEN say("Wx Stations (exit with ESC)", 10, "g");
ELSIF lums.wxcol="W" THEN say("Temperatue Map (exit with ESC)", 5, "g")
ELSIF lums.wxcol="R" THEN say("Rain Map (exit with ESC)", 5, "g") END;
IF hoverobj.opf<>NIL THEN hoverinfo(hoverobj); hoverobj.opf:=NIL END;
IF beaconediting & beaconed THEN drawpoliobj(image) END;
refresh:=TRUE;
realtime:=time();
lastxupdate:=realtime;
makeimagetime:=realtime-testtime;
END makeimage;
PROCEDURE MainEvent;
VAR ch:CHAR;
cfgs:ARRAY[0..20] OF CHAR;
raw, menu, void:BOOLEAN;
BEGIN
menu:=FALSE;
raw:=FALSE;
realtime:=time();
IF NOT lums.logmode THEN systime:=realtime END;
IF realtime1) & (click.entries
html;
<* END *>
IF click.entries>=1 THEN lums.errorstep:=FALSE END;
click.cmd:=0C;
IF Shift THEN click.cmd:="X"
ELSE
IF click.entries=1 THEN
IF (click.table[0].typf=tSYMBOL) OR (click.table[0].typf=tOBJECT) THEN
IF click.table[0].opf^.lastinftyp>=100 THEN (* wx symbol *)
confstr(fCLICKWXSYM, cfgs);
IF InStr(cfgs, CMD1USER)>=0 THEN click.cmd:=CMD1USER;
ELSIF InStr(cfgs, CMD1USERRF)>=0 THEN click.cmd:=CMD1USERRF;
ELSIF InStr(cfgs, CFGHEARD)>=0 THEN click.cmd:=CMDMH;
ELSIF InStr(cfgs, "C")>=0 THEN click.cmd:=CMDCENTERMOUSE;
END;
ELSE (* not wx symbol *)
confstr(fCLICKSYM, cfgs);
IF InStr(cfgs, CMD1USER)>=0 THEN click.cmd:=CMD1USER;
ELSIF InStr(cfgs, CMD1USERRF)>=0 THEN click.cmd:=CMD1USERRF;
ELSIF InStr(cfgs, CFGHEARD)>=0 THEN click.cmd:=CMDMH;
ELSIF InStr(cfgs, "C")>=0 THEN click.cmd:=CMDCENTERMOUSE;
ELSIF InStr(cfgs, "A")>=0 THEN click.cmd:=CMDANIMATE1;
ELSIF InStr(cfgs, "X")>=0 THEN click.cmd:="x";
ELSIF InStr(cfgs, "Y")>=0 THEN click.cmd:="y";
END;
END;
ELSIF click.table[0].typf=tTEXT THEN
confstr(fCLICKTEXT, cfgs);
IF InStr(cfgs, CMD1USER)>=0 THEN click.cmd:=CMD1USER;
ELSIF InStr(cfgs, CMD1USERRF)>=0 THEN click.cmd:=CMD1USERRF;
ELSIF InStr(cfgs, CFGHEARD)>=0 THEN click.cmd:=CMDMH;
ELSIF InStr(cfgs, "C")>=0 THEN click.cmd:=CMDCENTERMOUSE;
ELSIF InStr(cfgs, "A")>=0 THEN click.cmd:=CMDANIMATE1;
ELSIF InStr(cfgs, "X")>=0 THEN click.cmd:="x";
ELSIF InStr(cfgs, "Y")>=0 THEN click.cmd:="y";
END;
ELSIF click.table[0].typf=tTRACK THEN
confstr(fCLICKTRACK, cfgs);
IF (click.mhop[0]<>0C) & (click.mhop=click.table[0].opf^.call) THEN (* in single user mode and click same track *)
IF InStr(cfgs, CMDDELWAYPOINT)>=0 THEN click.cmd:=CMDDELWAYPOINT;
ELSIF InStr(cfgs, "A")>=0 THEN click.cmd:=CMDANIMATE1;
END;
ELSE
IF InStr(cfgs, CMD1USER)>=0 THEN click.cmd:=CMD1USER;
ELSIF InStr(cfgs, CMD1USERRF)>=0 THEN click.cmd:=CMD1USERRF;
ELSIF InStr(cfgs, "A")>=0 THEN click.cmd:=CMDANIMATE1;
ELSIF InStr(cfgs, CMDDELWAYPOINT)>=0 THEN click.cmd:=CMDDELWAYPOINT;
END;
END;
nearwaypoint; (* set marker on click to track *)
setmarkalti(click.table[click.selected].pff0, click.table[0].opf, TRUE);
click.marktime:=realtime;
END;
IF InStr(cfgs, CFGRAWDECODED)>=0 THEN raw:=TRUE; menu:=TRUE END;
IF click.cmd=0C THEN menu:=TRUE END; (* redraw image *)
IF click.marktime=0 THEN (* hard marker *)
measure(click.markpos, click.clickpos, mestxt, FALSE);
ELSE measure(click.markpos, click.measurepos, mestxt, FALSE) END;
-- importbeacon(click.table[click.selected].opf); (* copy to beacon editor *)
ELSE (* clicked empty map *)
IF (click.marktime=0) OR (click.marktime+MARKERTIME>=realtime)
THEN measure(click.markpos, click.clickpos, mestxt, TRUE) END;
menu:=TRUE;
END;
END;
confstr(fCLICKMAP, ch);
IF NOT Shift & (ch="2") THEN
IF posvalid(click.markpos) THEN ch:="Y" ELSE ch:="X" END;
END;
IF ch=CMDCENTERMOUSE THEN click.cmd:=CMDCENTERMOUSE;
ELSIF NOT Shift & (ch="X") OR Shift & (ch="Y") THEN click.cmd:="X";
ELSIF NOT Shift & (ch="Y") OR Shift & (ch="X") THEN
click.cmd:="Y";
measure(click.markpos, click.clickpos, mestxt, FALSE);
END;
IF (click.entries>0) & (click.table[click.selected].typf=tTEXT)
& (click.table[click.selected].opf<>NIL)
THEN copypaste(click.table[click.selected].opf^.call) END;
IF NOT Shift THEN (* not close menus on shift click to map *)
IF beaconediting & beaconed THEN
IF findmultiline(click.clickpos, click.markpos)
THEN click.marktime:=0; click.cmd:=" " END;
END;
IF NOT lums.headmenuy & ((click.entries=0) OR menu OR (click.mhop[0]<>0C))
OR lums.headmenuy & (click.entries>0) & (menu OR (click.mhop[0]<>0C))
THEN ch:=click.cmd; mainpop; click.cmd:=ch; ELSE killallmenus END;
-- THEN mainpop; click.cmd:=" "; ELSE killallmenus END;
END;
IF mestxt[0]<>0C THEN textautosize(DOCKX, 0, 6, 10, "b", mestxt) END;
END;
IF raw OR (click.cmd<>0C) THEN
--WrInt(ORD(click.cmd), 1); WrStrLn(click.cmd);
startmapdelay;
IF click.cmd=CURSDOWN THEN
mappos.lat:=mappos.lat-movest(ysize)*shiftfine();
limpos(mappos);
ELSIF click.cmd=CURSUP THEN
mappos.lat:=mappos.lat+movest(ysize)*shiftfine();
limpos(mappos);
ELSIF click.cmd=CURSLEFT THEN
mappos.long:=mappos.long-movest(xsize)*shiftfine();
limpos(mappos);
ELSIF click.cmd=CURSRIGHT THEN
mappos.long:=mappos.long+movest(xsize)*shiftfine();
limpos(mappos);
ELSIF click.cmd="T" THEN
IF posvalid(newpos0) & posvalid(newpos1)
THEN mapzoom(newpos0, newpos1, conf2int(fDEFZOOM, 0, 1, MAXZOOM, MAXZOOMOBJ), TRUE, FALSE) END;
ELSIF click.cmd="o" THEN
click.dryrun:=FALSE;
push(realzoom(initzoom, finezoom), FALSE);
objsender(click.table[click.selected].opf, click.mhop);
mhtx:=OPOBJ;
lums.obj:=10*conf2int(fLOBJ, 0, 0, 100, 100); (* switch on objects *)
pandone:=FALSE;
ELSIF click.cmd=CMDMH THEN
click.dryrun:=FALSE;
IF click.entries>0 THEN
push(realzoom(initzoom, finezoom), FALSE);
IF click.table[click.selected].opf<>NIL
THEN click.mhop:=click.table[click.selected].opf^.call END;
mhtx:=OPHEARD;
pandone:=FALSE;
(*
tracenew.call:=click.mhop; (* watch call for incoming data *)
*)
END;
ELSIF (click.cmd=CMD1USER) OR (click.cmd=CMD1USERRF) THEN
click.dryrun:=FALSE;
IF click.entries>0 THEN
push(realzoom(initzoom, finezoom), FALSE);
IF click.table[click.selected].opf<>NIL THEN
click.mhop:=click.table[click.selected].opf^.call;
-- IF beaconediting() THEN importbeacon(click.table[click.selected].opf) END; (* copy to beacon editor *)
END;
mhtx:=OPSENT;
pandone:=FALSE;
lums.errorstep:=FALSE;
IF click.cmd=CMD1USERRF THEN lums.rf:=conf2int(fLRF, 0, 0, 100, 30)*10 ELSE lums.rf:=0 END;
END;
ELSIF click.cmd=CMDANIMATE1 THEN
IF click.entries>0 THEN
push(realzoom(initzoom, finezoom), FALSE);
IF click.table[click.selected].opf<>NIL
THEN click.mhop:=click.table[click.selected].opf^.call END;
pandone:=FALSE;
END;
animate(click.mhop, lums.fps, "");
ELSIF click.cmd="0" THEN setshowall;
ELSIF (click.cmd="1") OR (click.cmd=CURSHOME) THEN View(0);
ELSIF click.cmd="2" THEN View(1);
ELSIF click.cmd="3" THEN View(2);
ELSIF click.cmd="4" THEN View(3);
ELSIF (click.cmd="b") OR (click.cmd=CURSBS) THEN pop;
-- mercator(mappos.long, mappos.lat, initzoom, inittilex, inittiley, shiftx, shifty);
ELSIF click.cmd=CMDRESETIMGPARMS THEN
push(realzoom(initzoom, finezoom), FALSE);
resetimgparms;
ELSIF click.cmd="+" THEN zoominoutpush(TRUE, Shift OR Ctrl, FALSE, FALSE);
ELSIF click.cmd="-" THEN zoominoutpush(FALSE, Shift OR Ctrl, FALSE, FALSE);
ELSIF click.cmd=CMDFZOOMIN THEN zoominoutpush(TRUE, TRUE, TRUE, TRUE);
ELSIF click.cmd=CMDFZOOMOUT THEN zoominoutpush(FALSE, TRUE, TRUE, TRUE);
ELSIF click.cmd=CMDDOWNLOAD THEN MapPackage;
ELSIF click.cmd=SCREENSHOT THEN
IF NOT WITHX11 THEN makeimage(FALSE) END;
screenshot;
ELSIF click.cmd="s" THEN rdonesymb(click.onesymbol.tab=0C, TRUE); (* toggle onesymbol *)
ELSIF click.cmd="E" THEN
lums.errorstep:=NOT lums.errorstep;
sayonoff("Show errors", lums.errorstep);
ELSIF click.cmd="f" THEN
configbool(fTRACKFILT, NOT configon(fTRACKFILT));
sayonoff("Trackfilter", configon(fTRACKFILT));
ELSIF click.cmd="m" THEN
lums.moving:=NOT lums.moving;
sayonoff("Dimm not Moving", lums.moving);
ELSIF click.cmd="R" THEN
IF lums.rf=0 THEN lums.rf:=300 ELSE lums.rf:=0 END;
ELSIF click.cmd=CMDRADIORANGE THEN
IF click.withradio & NOT click.altimap THEN closeradio
ELSE click.withradio:=TRUE; click.altimap:=FALSE END;
lums.wxcol:=0C;
IF click.withradio & NOT (posvalid(click.markpos) OR posvalid(click.measurepos))
THEN say("Radiorange Map On, Set 1 oder 2 Markers", 4, "b");
ELSE sayonoff("Radiorange Map", click.withradio) END;
ELSIF click.cmd="H" THEN
IF click.withradio & click.altimap THEN closeradio
ELSE click.withradio:=TRUE; click.altimap:=TRUE END;
lums.wxcol:=0C;
sayonoff("Altitude Map", click.withradio);
(*
ELSIF click.cmd="P" THEN
IF click.withradio THEN closeradio ELSE click.withradio:=TRUE; click.panorama:=TRUE END;
lums.wxcol:=0C;
sayonoff("Panorama", click.withradio);
*)
ELSIF click.cmd="O" THEN
IF lums.obj=0 THEN
lums.obj:=10*conf2int(fLOBJ, 0, 0, 100, 100);
IF lums.obj<30 THEN (* switch on objects but are too dark *)
AddConfLine(fLOBJ, 0, DEFAULTLUMOBJ); (* set to default brightness *)
lums.obj:=10*conf2int(fLOBJ, 0, 0, 100, 100);
END;
ELSE lums.obj:=0 END;
sayonoff("Show Items/Objects", lums.obj<>0);
ELSIF click.cmd="l" THEN
IF lums.text=0 THEN lums.text:=10*conf2int(fLTEXT, 0, 0, 100, 100) ELSE lums.text:=0 END;
sayonoff("Labels", lums.text<>0);
ELSIF click.cmd=CMDFOLLOW THEN
lums.followwhat:=CAST(BITSET, CAST(CARDINAL, lums.followwhat)+1);
lums.followwhat:=lums.followwhat*{0,1};
IF NOT anywatchfollow() THEN lums.followwhat:=lums.followwhat*{0} END;
int2cfg(fFOLLOW, VAL(CARDINAL,lums.followwhat));
IF lums.followwhat={} THEN say("Map Follow off", 4, "b");
ELSIF lums.followwhat={FOLLOWWATCH} THEN say("Map Follows Watchcall(s)", 4, "b");
ELSIF lums.followwhat={FOLLOWX} THEN say("Map Follows Clicked Symbol", 4, "b");
ELSE say("Map Follows Watchcall and Clicked Symbol", 4, "b") END;
ELSIF CAP(click.cmd)="W" THEN
IF Shift & (click.cmd="W") THEN click.cmd:="w" END;
(*
IF click.cmd="W" THEN
IF lums.wxcol<>"W" THEN lums.wxcol:="W" ELSE lums.wxcol:=0C END;
ELSIF lums.wxcol<>"R" THEN lums.wxcol:="R" ELSE lums.wxcol:=0C END;
sayonoff("Wx Colormap", lums.wxcol<>0C);
*)
IF click.cmd="W" THEN
IF lums.wxcol="W" THEN lums.wxcol:=0C
ELSIF lums.wxcol="w" THEN lums.wxcol:="W" ELSE lums.wxcol:="w" END;
ELSIF lums.wxcol<>"R" THEN lums.wxcol:="R" ELSE lums.wxcol:=0C END;
click.mhop[0]:=0C;
click.onesymbol.tab:=0C;
closeradio;
ELSIF click.cmd=CMDCENTER THEN centermouse(FALSE); (* center last leftclicked *)
ELSIF click.cmd=CMDCENTERMOUSE THEN centermouse(TRUE); (* center position *)
ELSIF (click.cmd=CMDLISTWINLINE) & posvalid(click.markpos) THEN (* click to listwin line *)
push(realzoom(initzoom, finezoom), TRUE);
centerpos(click.markpos, mappos);
click.marktime:=realtime;
IF click.mhop[0]<>0C THEN setshowall END;
ELSIF (click.cmd=CMDCLICKWATCH) & posvalid(clickwatchpos) THEN (* click to watchcall popup *)
click.markpos:=clickwatchpos;
push(realzoom(initzoom, finezoom), FALSE);
centerpos(click.markpos, mappos);
click.marktime:=realtime;
IF click.mhop[0]<>0C THEN setshowall END;
ELSIF click.cmd="X" THEN xytomark; (* set marker 1 to map pos *)
ELSIF click.cmd="x" THEN (* set marker 1 to object lastpos *)
clicktomark;
mainpop;
ELSIF click.cmd=CMDSETMARK1LOCK THEN setmarklockpoi(FALSE); (* set marker 1 to poi pos *)
ELSIF click.cmd="y" THEN (* set marker 2 to object lastpos *)
IF (click.entries>0) & (click.table[click.selected].opf<>NIL)
& posvalid(click.table[click.selected].opf^.lastpos)
THEN click.measurepos:=click.table[click.selected].opf^.lastpos;
ELSE click.measurepos:=click.clickpos END;
ELSIF click.cmd="Y" THEN xytomark2;
ELSIF click.cmd=CMDSETMARK2LOCK THEN setmarklockpoi(TRUE); (* set marker 2 to poi pos *)
ELSIF click.cmd=CMDDELWAYPOINT THEN clickdelwaypoint;
ELSIF click.cmd=CMDZOOMTOMARKS THEN zoomtomarks(click.markpos, click.measurepos);
ELSIF click.cmd=CMDZOOMSQUARE THEN zoomtosquare;
ELSIF click.cmd=":" THEN
posinval(click.markpos);
posinval(click.measurepos);
click.waysum:=0.0;
posinval(click.squerpos0);
posinval(click.squerspos0);
killallmenus;
sayonoff("Markers", FALSE);
ELSIF click.cmd="@" THEN
AddConfLine(fCLICKMAP, 0, "");
AddConfLine(fCLICKSYM, 0, "");
AddConfLine(fCLICKTRACK, 0, "");
AddConfLine(fCLICKTEXT, 0, "");
AddConfLine(fCLICKWXSYM, 0, "");
killallmenus;
say("'ON Next Click' Reset to Defaults", 10, "b");
ELSIF click.cmd="~" THEN changecolor(click.table[click.selected].opf);
ELSIF click.cmd="A" THEN animate(click.mhop, lums.fps, "");
ELSIF click.cmd=CMDVIDEO THEN
say("Saving "+VIDEOFN, 0, "b");
animate(click.mhop, lums.actfps, VIDEOFN);
ELSIF click.cmd=CMDINTERNSTAT THEN internstat;
ELSIF click.cmd=CMDFIND THEN
click.dryrun:=FALSE;
find(TRUE);
ELSIF click.cmd=CONFPOISYMFIND THEN
click.dryrun:=FALSE;
find(FALSE);
ELSIF click.cmd="\" THEN helptext(0, 0, 0, 0, "en-shortcuts");
ELSIF click.cmd="7" THEN Setmap(0);
ELSIF click.cmd="8" THEN Setmap(1);
ELSIF click.cmd="9" THEN Setmap(2);
ELSIF click.cmd="6" THEN Setmap(MAX(INTEGER));
ELSIF click.cmd="Q" THEN quit:=TRUE;
ELSIF click.cmd="e" THEN click.dryrun:=FALSE;
ELSIF (click.cmd=CMDRDLOG) & (click.cmdatt<>0C) THEN
importlog(click.cmdatt); click.cmdatt:=0C;
ELSIF click.cmd=11C THEN toggview;
ELSIF click.cmd="(" THEN mapbri(-5);
ELSIF click.cmd=")" THEN mapbri(5);
ELSIF click.cmd="[" THEN fullbritime(TRUE);
ELSIF click.cmd="]" THEN fullbritime(FALSE);
END;
IF WITHX11 THEN makeimage(FALSE) END;
click.cmd:=0C;
IF beaconediting & beaconed & ismultiline(TRUE) THEN poligonmenu END;
ELSIF (tracenew.call[0]<>0C) & (lastxupdate+slowupdate()<=realtime)
& NOT (click.withradio & (posvalid(click.markpos) OR posvalid(click.measurepos))) THEN
follow;
IF WITHX11 & (maptrys>0) THEN
IF click.watchlast THEN refrinfo END;
makeimage(FALSE);
END;
ELSIF (tracenew.winevent>1000) OR ((tracenew.winevent>0) OR poisactiv()) & (lastxupdate+2+slowupdate()<=realtime) THEN
tracenew.winevent:=0;
IF click.watchlast THEN refrinfo END;
IF NOT (click.withradio OR posvalid(click.markpos) & posvalid(click.measurepos))
THEN closesrtmfile END;
IF WITHX11 THEN makeimage(FALSE) END;
ELSIF newxsize>0 THEN (* window resize request *)
IF ODD(newxsize) THEN DEC(newxsize) END;
IF ODD(newysize) THEN DEC(newysize) END;
allocxbuf(newxsize, newysize);
allocimage(image, newxsize, newysize, FALSE);
allocimage(rfimg, newxsize, newysize, FALSE);
xsize:=newxsize;
ysize:=newysize;
IF NOT maximized THEN saveXYtocfg(fXYSIZE, xsize, ysize) END;
newxsize:=0;
newysize:=0;
radio.wasradio:=FALSE;
posinval(radio.mappos);
makeimage(FALSE);
ELSIF ((lasttcprx+60>realtime) OR (lastanyudprx+60>realtime)) & (laststatref+50) & (maptime<>realtime) THEN
maptime:=realtime;
DEC(maptrys);
IF WITHX11 & IsMapLoaded() THEN makeimage(FALSE)
ELSIF maptrys=20 THEN tooltips("m") END;
END;
IF (click.bubblstr[0]<>0C) & NOT pulling THEN
textbubble(click.bubblpos, click.bubblstr, click.lastpoi);
IF click.bubblinfo<>"" THEN
textautosize(DOCKX, 0, POIINFOWINID, MINPOIINFOTIME+Length(click.bubblinfo) DIV POIINFOREADSPEED, "w", click.bubblinfo);
ELSE killmenuid(POIINFOWINID) END;
click.bubblstr[0]:=0C;
click.bubblinfo[0]:=0C;
END;
IF refresh THEN redraw(image) END;
IF NOT logdone THEN bootreadlog; INC(tracenew.winevent) END;
IF NOT WITHX11 & shottrigg THEN
shottrigg:=FALSE;
makeimage(FALSE);
screenshot;
END;
IF realday<>realtime DIV (3600*24) THEN
realday:=realtime DIV (3600*24);
void:=deletelogfile(FALSE);
END;
END MainEvent;
PROCEDURE getinitview;
VAR z:REAL;
BEGIN
initzoom:=8;
finezoom:=1.0;
z:=0.0;
getview(fVIEW, 0, z, mappos);
IF z<>0.0 THEN
initzoom:=trunc(z);
finezoom:=1.0+z-FLOAT(initzoom);
END;
limpos(mappos);
IF parmzoom>0 THEN initzoom:=parmzoom; finezoom:=parmfinezoom; END;
IF initzoom<1 THEN initzoom:=1 ELSIF initzoom>MAXZOOM THEN initzoom:=MAXZOOM END;
END getinitview;
PROCEDURE batch; (* get key comands from file *)
VAR c:CHAR;
j,ctl:BOOLEAN;
BEGIN
ctl:=FALSE;
j:=FALSE;
REPEAT
LOOP
IF batchp>=batchlen THEN RETURN END;
c:=batchbuf[batchp];
INC(batchp);
IF c="#" THEN j:=TRUE;
ELSIF (c<" ") THEN j:=FALSE;
ELSIF NOT j THEN EXIT END;
END;
IF NOT ctl & (c="^") THEN ctl:=TRUE;
ELSE
IF ctl THEN
IF c>=CHR(96) THEN c:=CHR(ORD(c)-96); (* ^x for ctrl char *)
ELSIF c>=CHR(64) THEN c:=CHR(ORD(c)-64) END;
ctl:=FALSE;
END;
keychar(c, FALSE, FALSE);
END;
UNTIL NOT ctl;
END batch;
<* IF TARGET_FAMILY="UNIX" THEN *>
PROCEDURE dobatch;
VAR f:File;
ret:INTEGER;
BEGIN
f:=OpenRead("batch.txt");
IF FdValid(f) THEN
ret:=RdBin(f, batchbuf, SIZE(batchbuf));
IF ret>0 THEN
batchlen:=ret;
batchp:=0;
END;
Close(f);
ELSE shottrigg:=TRUE END;
END dobatch;
PROCEDURE ["C"] killsave(signum:INTEGER);
BEGIN
IF NOT quit & configon(fAUTOSAVE) THEN saveconfig END;
WrStr("exit "); WrInt(signum,0); WrStrLn("!");
HALT(signum)
END killsave;
PROCEDURE ["C"] makeshot(signum:INTEGER);
BEGIN
dobatch;
END makeshot;
<* END *>
BEGIN
FILL(ADR(debugmem), 0C, SIZE(debugmem));
clrconfig;
initparms;
posinval(click.markpos);
mountains:=NIL;
loadconfig(FALSE);
loadfont;
maximized:=FALSE;
getstartxysize(xsize, ysize);
IF initxsize>0 THEN xsize:=initxsize END;
IF initysize>0 THEN ysize:=initysize END;
mappos.long:=12.0*PI2/360.0; mappos.lat:=49.0*PI2/360.0;
getinitview;
mercator(mappos.long, mappos.lat, initzoom, inittilex, inittiley, shiftx, shifty);
centerpos(mappos, mappos);
makegammatab;
vidbuf:=NIL;
image:=NIL;
rfimg:=NIL;
allocimage(image, xsize, ysize, FALSE);
allocimage(rfimg, xsize, ysize, FALSE);
posinval(clickwatchpos);
tabview.stkpo:=0;
tabview.stktop:=0;
alttabview.stkpo:=0;
alttabview.stktop:=0;
maptrys:=0;
makeimagetime:=0;
FILL(ADR(serialpid), 0C, SIZE(serialpid));
FILL(ADR(serialpid2), 0C, SIZE(serialpid2));
click.mhop[0]:=0C;
click.onesymbol.tab:=0C;
click.zoomtox:=-1;
posinval(click.squerpos0);
posinval(click.squerspos0);
posinval(click.measurepos);
FILL(ADR(tracenew), 0C, SIZE(tracenew));
pandone:=TRUE;
newxsize:=0;
newysize:=0;
cycleorder:=0;
realday:=0;
onetipp:=FALSE;
logdone:=FALSE;
uptime:=time();
autoshottime:=0;
withx:=InitX("Aprsmap", "Aprsmap", xsize, ysize)>=0;
IF NOT withx THEN WrStrLn("cannot open xwindow, image generation only") END;
Gammatab(lums.gamma);
realtime:=time();
initmenus;
quit:=FALSE;
tracenew.winevent:=1;
posinval(newpos0);
posinval(newpos1);
<* IF TARGET_FAMILY="UNIX" THEN *>
signal(SIGTERM, killsave);
signal(SIGINT, killsave);
IF WITHX11 THEN
signal(SIGPIPE, killsave);
ELSE
signal(SIGPIPE, makeshot);
END;
<* END *>
IF withx THEN
realtime:=time();
rxidle:=0;
refresh:=TRUE;
lastlooped:=realtime;
WHILE NOT quit DO
MainEvent;
<* IF TARGET_FAMILY="UNIX" THEN *>
IF (autoshots>0) & Watchclock(autoshottime, autoshots) THEN dobatch END;
<* END *>
IF batchp op1.next > op2.next > NIL
op.frames > frame1.next > frame2.next > NIL
frame1 > vardat1.lastref > frame5
frame2 > vardat2.lastref > frame4
frame3 > vardat1.lastref > frame5
frame4 > vardat2.lastref > frame4
frame5 > vardat1.lastref > frame5
*)
END aprsmap.