From b80559044ffc627e897bba6df2c15c1b28d732de Mon Sep 17 00:00:00 2001 From: Erich Eckner Date: Tue, 17 Nov 2015 13:31:40 +0100 Subject: soweit lauffähig ToDo: Taskbaricon MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fhunit.pas | 583 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++- pegelunit.pas | 143 +++++++------- unit1.lfm | 1 + unit1.pas | 53 ++++-- wetter.konf | 2 +- wetter.lps | 164 ++++++++--------- 6 files changed, 766 insertions(+), 180 deletions(-) diff --git a/fhunit.pas b/fhunit.pas index 02c9d6d..fcfa1b6 100644 --- a/fhunit.pas +++ b/fhunit.pas @@ -5,19 +5,91 @@ unit fhunit; interface uses - Classes, SysUtils, Graphics; + CThreads, Classes, SysUtils, Graphics, ExtCtrls, Process, lowLevelUnit; type - tMessgroesze = (mgTemperatur,mgLuftfeuchte,mgWindgeschwindigkeit,mgWindrichtung, + tMessGroesze = (mgTemperatur,mgLuftfeuchte,mgWindgeschwindigkeit,mgWindrichtung, mgNiederschlag,mgGlobalstrahlung,mgLuftdruck); - tZeitgroesze = (zgJahr,zgMonat,zgTag,zgStunde,zgMin10); - tMesswerte = array[tMessgroesze] of extended; - tZeit = array[tZeitgroesze] of integer; - tMesspunkt = record - zeit: tZeit; - mW: tMesswerte; + tMessGroeszenSet = set of tMessGroesze; + tZeitGroesze = (zgJahr,zgMonat,zgTag,zgStunde,zgMin10); + tMessWerte = array[tMessGroesze] of extended; + tMessWerteExtPoints = array[tMessGroesze] of tExtPoint; + tZeit = array[tZeitGroesze] of word; + + tMessPunkte = class; + + tMessPunkt = class + private + _mZeit: tZeit; + _uZeit: extended; + _mW: tMessWerte; + procedure setzeUZeit; inline; + procedure setzeZeit; inline; + function rMW(mG: tMessGroesze): extended; inline; + public + constructor create; + destructor destroy; override; + function lade(s: string): boolean; + function schreibe: string; + property zeit: extended + read _uZeit; + property mW[mG: tMessGroesze]: extended + read rMW; + end; + + tMessPunkteListe = class + private + inhalt: tFPList; + function rItem(i: longint): tMessPunkt; + function bisekt(zeit: extended): longint; + public + constructor create; + destructor destroy; override; + function add(s: string): boolean; + function last: tMessPunkt; + function count: longint; + property items[i: longint]: tMessPunkt + read rItem; default; + function minMaxY(startZeit,stopZeit: extended): tMessWerteExtPoints; + end; + + tMessPunkteUpdateThread = class(tThread) + private + _besitzer: tMessPunkte; + antwort: string; + ladeProzess: tProcess; + beendet, + warGueltig: boolean; + nZeit: extended; + _tNum,_tAnz: longint; + procedure uebernehmen; + procedure nZeitNullen; inline; + public + beenden: boolean; + constructor create(besitzer: tMessPunkte; tNum,tAnz: longint); + destructor destroy; override; + procedure execute; override; + end; + + tMessPunkte = class + private + bild: tImage; + werte: tMessPunkteListe; + muts: array of tMessPunkteUpdateThread; + public + constructor create(zeichenFlaeche: tImage); + destructor destroy; override; + function einlesen(was: string): boolean; + procedure laden(von: string); + procedure speichern(nach: string); + procedure achsenZeichnen(zuZeichnen: tMessGroeszenSet; startZeit,stopZeit: extended); + procedure graphenZeichnen(zuZeichnen: tMessGroeszenSet; startZeit,stopZeit: extended); + procedure mutBeenden; end; +procedure uZeit2mZeit(uZ: extended; out mZ: tZeit); inline; +function strZuMZeit(s: string; out mZ: tZeit): boolean; + const messNamen: array[tMessgroesze] of string = ('Temperatur','Luftfeuchte','Windgeschwindigkeit','Windrichtung', @@ -25,12 +97,505 @@ const maszEinheit: array[tMessgroesze] of string = ('°C','%','m/s','°','mm','W/m²','mbar'); monatsNamen: array[1..12] of string = - ('Januar','Februar','März','April','Mai','Juni','Juli', + ('Januar','Februar','M'#$e4'rz','April','Mai','Juni','Juli', 'August','September','Oktober','November','Dezember'); farben: array[tMessgroesze] of tColor = ($0000DF,$CFAF7F,$007FFF,$FF00FF,$FFAF3F,$3FAFAF,$AFAFAF); implementation +uses unit1, math, systemUnit; + +// tMessPunkt ****************************************************************** + +constructor tMessPunkt.create; +var + zg: tZeitGroesze; + mg: tMessGroesze; +begin + inherited create; + for zg:=low(zg) to high(zg) do + _mZeit[zg]:=0; + _uZeit:=0; + for mg:=low(mg) to high(mg) do + _mW[mg]:=0; +end; + +destructor tMessPunkt.destroy; +begin + inherited destroy; +end; + +procedure tMessPunkt.setzeUZeit; +begin + _uZeit:= + encodeDate(_mZeit[zgJahr],_mZeit[zgMonat],_mZeit[zgTag])+ + encodeTime(_mZeit[zgStunde],_mZeit[zgMin10]*10,0,0) +end; + +procedure tMessPunkt.setzeZeit; +begin + uZeit2mZeit(_uZeit,_mZeit); +end; + +function tMessPunkt.rMW(mG: tMessGroesze): extended; +begin + result:=_mW[mG]; +end; + +function tMessPunkt.lade(s: string): boolean; +var + zG: tZeitGroesze; + mG: tMessGroesze; + t: string; + istZahl: boolean; + i: longint; +begin + result:=false; + if pos('',s)=0 then begin // Format wie in letztes_Wetter.txt + {$WARNINGS-} + if decimalSeparator<>',' then + while pos(',',s)>0 do + s[pos(',',s)]:=decimalSeparator; + {$WARNINGS+} + for zG:=low(zG) to high(zG) do + _mZeit[zG]:=strtoint(erstesArgument(s,#9)); + for mG:=high(mG) downto low(mG) do + _mW[mG]:=strtofloat(erstesArgument(s,#9)); + while _mZeit[zgStunde]>=24 do begin + _mZeit[zgStunde]:=_mZeit[zgStunde]-24; + inc(_mZeit[zgTag]); + if _mZeit[zgTag]>30+byte(_mZeit[zgMonat] in [1,3,5,7,8,10,12])-(2-byte(_mZeit[zgJahr] mod 4 = 0))*byte(_mZeit[zgMonat]=2) then begin + _mZeit[zgTag]:=1; + inc(_mZeit[zgMonat]); + if _mZeit[zgMonat]>12 then begin + _mZeit[zgMonat]:=1; + inc(_mZeit[zgJahr]); + end; + end; + end; + setzeUZeit; + end + else begin // Format wie im Netz + + delete(s,1,pos('',uppercase(s))); + delete(s,1,pos('
',uppercase(s))); + delete(s,1,pos('>',s)); + s:=trim(s); + t:=trim(leftStr(s,pos('<',s)-1)); + if not strZuMZeit(t,_mZeit) then + exit; + {$WARNINGS-} + if decimalSeparator<>'.' then + while pos('.',s)>0 do + s[pos('.',s)]:=decimalSeparator; + {$WARNINGS+} + for mG:=low(mG) to high(mG) do begin + delete(s,1,pos(uppercase(messNamen[mG]),uppercase(s))); + delete(s,1,pos('>',s)); + t:=trim(leftStr(s,pos('<',S)-1)); + istZahl:=t<>''; + for i:=1 to length(t) do + istZahl:=istZahl and (t[i] in ['0'..'9','.',',','-']); + if not istZahl then + exit; + _mW[mG]:=strtofloat(t); + end; + setzeUZeit; + end; + result:=true; +end; + +function tMessPunkt.schreibe: string; +var + zG: tZeitGroesze; + mG: tMessGroesze; +begin + result:=''; + for zG:=low(zG) to high(zG) do + result:=result+#9+inttostr(_mZeit[zG]); + for mG:=high(mG) downto low(mG) do + result:=result+#9+floattostr(mW[mG]); + result:=trim(result); +end; + +// tMessPunkteListe ************************************************************ + +constructor tMessPunkteListe.create; +begin + inherited create; + inhalt:=tFPList.create; +end; + +destructor tMessPunkteListe.destroy; +begin + inhalt.free; + inherited destroy; +end; + +function tMessPunkteListe.rItem(i: longint): tMessPunkt; +begin + result:=tMessPunkt(inhalt[i]); +end; + +function tMessPunkteListe.bisekt(zeit: extended): longint; +var + mi,ma,neu: longint; +begin + mi:=0; + neu:=mi; + ma:=count; + while mi=count) or (items[neu].zeitzeit then begin + ma:=neu; + continue; + end; + result:=neu; + exit; + end; + result:=neu; +end; + +function tMessPunkteListe.add(s: string): boolean; +var + nm: tMessPunkt; + i: longint; +begin + result:=false; + nm:=tMessPunkt.create; + if not nm.lade(s) then begin + nm.free; + exit; + end; + i:=bisekt(nm.zeit); + result:=true; + if (i>=count) or (items[i].zeit<>nm.zeit) then + inhalt.Insert(i,nm) + else + nm.free; +end; + +function tMessPunkteListe.last: tMessPunkt; +begin + result:=items[count-1]; +end; + +function tMessPunkteListe.count: longint; +begin + result:=inhalt.count; +end; + +function tMessPunkteListe.minMaxY(startZeit,stopZeit: extended): tMessWerteExtPoints; +var + i: longint; + mG: tMessGroesze; +begin + i:=bisekt(startZeit); + for mG:=low(mG) to high(mG) do begin + result[mG,'x']:=items[i].mW[mG]; + result[mG,'y']:=result[mG,'x']; + end; + while (i _tNum do + dec(lIch); + nZeit:=_besitzer.werte[lIch].zeit + _tAnz*1/24/6; +end; + +procedure tMessPunkteUpdateThread.execute; +var + bytesToRead,bytesRead,cnt: longint; + mZeit: tZeit; +begin + while not beenden do begin + ladeProzess:=tProcess.create(nil); + ladeProzess.options:=[poUsePipes]; + ladeProzess.executable:='/usr/bin/curl'; + ladeProzess.parameters.add('-o'); + ladeProzess.parameters.add('-'); + ladeProzess.parameters.add('--data'); + uZeit2mZeit(nZeit,mZeit); + ladeProzess.parameters.add( + 'tag='+inttostr(mZeit[zgTag])+'&'+ + 'monat='+Monatsnamen[mZeit[zgMonat]]+'&'+ + 'jahr='+inttostr(mZeit[zgJahr])+'&'+ + 'stunde='+inttostr(mZeit[zgStunde])+'&'+ + 'minute='+inttostr(10*mZeit[zgMin10])+'&'+ + 'submit=Abfrage starten'); + ladeProzess.parameters.add('http://wetter.mb.fh-jena.de/station/datenbank/php_alt/abfrage1.php'); + bytesRead:=0; + ladeProzess.execute; + ladeProzess.closeInput; + ladeProzess.closeStderr; + while (ladeProzess.running) or (ladeProzess.output.numBytesAvailable>0) do begin + if beenden then + ladeProzess.terminate(0); + bytesToRead:=ladeProzess.output.numBytesAvailable; + if bytesToRead>0 then begin + setlength(antwort,bytesRead + bufLengMin); + bytesRead:=bytesRead+ladeProzess.output.read(antwort[bytesRead+1],min(bytesToRead,length(antwort)-bytesRead)); + end + else + sleep(10); + end; + ladeProzess.closeOutput; + ladeProzess.free; + + if not beenden then begin + setlength(antwort,bytesRead); + + synchronize(@uebernehmen); + + if (nZeit<=now) or warGueltig then + nZeit:=nZeit + _tAnz*1/24/6 + else begin + synchronize(@nZeitNullen); + for cnt:=0 to 599 do begin + if beenden then + break; + sleep(100); + end; + end; + end; + end; + ladeProzess:=nil; + beendet:=true; +end; + +// tMessPunkte ***************************************************************** + +constructor tMessPunkte.create(zeichenFlaeche: tImage); +begin + inherited create; + bild:=zeichenFlaeche; + werte:=tMessPunkteListe.create; + fillchar(muts,sizeof(muts),#0); + setlength(muts,0); +end; + +destructor tMessPunkte.destroy; +var + i: longint; +begin + werte.free; + for i:=0 to length(muts)-1 do + muts[i].free; + setlength(muts,0); + inherited destroy; +end; + +function tMessPunkte.einlesen(was: string): boolean; +begin + result:=werte.add(was); +end; + +procedure tMessPunkte.laden(von: string); +var + f: textfile; + s: string; + i: longint; +begin + if not fileexists(von) then begin + writeln('Messwertedatei '''+von+''' existiert nicht!'); + raise exception.create('Messwertedatei '''+von+''' existiert nicht!'); + exit; + end; + assignfile(f,von); + reset(f); + while not eof(f) do begin + readln(f,s); + werte.add(s); + end; + closefile(f); + if length(muts)=0 then begin + setlength(muts,20); + for i:=0 to length(muts)-1 do + muts[i]:=tMessPunkteUpdateThread.create(self,i,length(muts)); + end; +end; + +procedure tMessPunkte.speichern(nach: string); +var + dateischonda: boolean; + f: textfile; + i: longint; +begin + dateischonda:=fileexists(nach); + if dateischonda then + assignfile(f,mkTemp(nach+'.XXXXXX')) + else + assignfile(f,nach); + rewrite(f); + for i:=0 to werte.count-1 do + writeln(f,werte[i].schreibe); + closefile(f); + if dateischonda then begin + deletefile(nach); + rename(f,nach); + end; +end; + +procedure tMessPunkte.achsenZeichnen(zuZeichnen: tMessGroeszenSet; startZeit,stopZeit: extended); +var + mG: tMessGroesze; + miMa: tMessWerteExtPoints; + dY,cY: extended; +begin + miMa:=werte.minMaxY(startZeit,stopZeit); + for mG:=high(mG) downto low(mG) do + if mG in zuZeichnen then begin + bild.canvas.pen.color:=farben[mG]; + dY:=power(10,ceil(ln(max(1e-9,miMa[mG,'y']-miMa[mG,'x']))/ln(10))); + repeat + if max(1e-9,miMa[mG,'y']-miMa[mG,'x'])/dY>=3 then continue; + dY:=dY/10*3; + if max(1e-9,miMa[mG,'y']-miMa[mG,'x'])/dY>=3 then continue; + dY:=dY/3; + until max(1e-9,miMa[mG,'y']-miMa[mG,'x'])/dY>=3; + cY:=ceil(miMa[mG,'x']/dY)*dY; + while cY<=miMa[mG,'y'] do begin + bild.canvas.moveTo(-10,wertZuY(cY,miMa[mG],bild.height)); + bild.canvas.lineTo(bild.width+10,wertZuY(cY,miMa[mG],bild.height)); + cY:=cY+dY; + end; + end; +end; + +procedure tMessPunkte.graphenZeichnen(zuZeichnen: tMessGroeszenSet; startZeit,stopZeit: extended); +var + mG: tMessGroesze; + miMa: tMessWerteExtPoints; + i: longint; +begin + miMa:=werte.minMaxY(startZeit,stopZeit); + for mG:=high(mG) downto low(mG) do + if mG in zuZeichnen then begin + bild.canvas.pen.color:=farben[mG]; + i:=werte.bisekt(startZeit); + bild.canvas.moveTo( + -10, + wertZuY(werte[i].mW[mG],miMa[mG],bild.height) + ); + while (it) do + inc(mZ[zgMonat]); + if mZ[zgMonat]>12 then + exit; + t:=erstesArgument(s); + if t='' then exit; + for i:=1 to length(t) do + if not (t[i] in ['0'..'9']) then exit; + mZ[zgJahr]:=strtoint(t); + t:=erstesArgument(s,':'); + if t='' then exit; + for i:=1 to length(t) do + if not (t[i] in ['0'..'9']) then exit; + mZ[zgStunde]:=strtoint(t); + t:=erstesArgument(s); + if t='' then exit; + for i:=1 to length(t) do + if not (t[i] in ['0'..'9']) then exit; + mZ[zgMin10]:=strtoint(t) div 10; + result:=(strtoint(t) mod 10) = 0; +end; + end. diff --git a/pegelunit.pas b/pegelunit.pas index 3fe1529..033ea3d 100644 --- a/pegelunit.pas +++ b/pegelunit.pas @@ -106,7 +106,6 @@ const (130,170,210,230),(200,230,260,290),(130,150,170,190),(0,0,0,0)); pegelFarben: array[tPegelstation] of tColor = ($000000,$000000,$000000,$FF0000,$7F0000,$000000,$000000,$000000,$000000,$000000,$000000,$000000); - bufLengMin = 1024*1024; // tPegelStand ***************************************************************** @@ -362,6 +361,76 @@ begin inherited destroy; end; +procedure tPegelStaende.einlesen(was: string); +var + t: string; + PS: TPegelstation; + psda,wsda,gefunden: boolean; + i: longint; +begin + while pos(#13,was)>0 do + delete(was,pos(#13,was),1); + psda:=false; + wsda:=false; + pS:=low(tPegelStation); + while was<>'' do begin + t:=myUtf8Encode(erstesArgument(was,#10)); + if length(t)=0 then continue; + if startetMit('Pegelname:',t) then begin + pS:=low(tPegelStation); + gefunden:=false; + while pS<=high(tPegelStation) do begin + for i:=0 to length(pegelStationsNamen[psBlankenstein])-1 do + gefunden:=gefunden or ((pegelStationsNamen[pS,i]<>'') and (pegelStationsNamen[pS,i]=t)); + if gefunden then break; + inc(pS); + end; + if not gefunden then begin + writeln('Unbekannter Pegelname: '''+t+'''!'); + for i:=1 to length(t) do + write(ord(t[i]),' '); + writeln; + for i:=1 to length(pegelStationsNamen[psSaalfeld,0]) do + write(ord(pegelStationsNamen[psSaalfeld,0][i]),' '); + writeln; + raise exception.create('Unbekannter Pegelname: '''+t+'''!'); + end; + psda:=true; + continue; + end; + if t='Durchfluss [m3/s]' then begin + wsda:=false; + continue; + end; + if t='Wasserstand [cm]' then begin + wsda:=true; + continue; + end; + if not (wsda and psda) then continue; + if pos('Fluss: ',t)=1 then continue; + if pos('Flusseinzugsgebiet: ',t)=1 then continue; + if startetMit('Stationsnummer: ',t) then begin + {$WARNINGS-} + if decimalSeparator<>'.' then + while pos('.',t)>0 do + t[pos('.',t)]:=decimalSeparator; + {$WARNINGS+} + if round(10*strtofloat(t))<>round(10*pegelStationsNummern[pS]) then begin + writeln( + 'erwartete Pegelstationsnummer ('+floattostr(pegelStationsNummern[pS])+ + ') für '+pegelStationsNamen[pS,0]+' ist verschieden von der angegebenen Nummer ('+t+')!'); + raise exception.create( + 'erwartete Pegelstationsnummer ('+floattostr(pegelStationsNummern[pS])+ + ') für '+pegelStationsNamen[pS,0]+' ist verschieden von der angegebenen Nummer ('+t+')!'); + end; + continue; + end; + if pos('Hinweise: ',t)=1 then continue; + if pos('keine Werte',t)>0 then continue; + werte[pS].add(t); + end; +end; + procedure tPegelStaende.laden(von: string); var f: textfile; @@ -426,7 +495,7 @@ begin for ps:=low(tPegelStation) to high(tPegelStation) do begin writeln(f,'Station: '+Pegelstationsnamen[ps,0]); for i:=0 to werte[ps].Count-1 do - writeln(f,tPegelStand(werte[ps][i]).schreibe); + writeln(f,werte[ps][i].schreibe); end; closefile(f); if dateischonda then begin @@ -474,76 +543,6 @@ begin end; end; -procedure tPegelStaende.einlesen(was: string); -var - t: string; - PS: TPegelstation; - psda,wsda,gefunden: boolean; - i: longint; -begin - while pos(#13,was)>0 do - delete(was,pos(#13,was),1); - psda:=false; - wsda:=false; - pS:=low(tPegelStation); - while was<>'' do begin - t:=myUtf8Encode(erstesArgument(was,#10)); - if length(t)=0 then continue; - if startetMit('Pegelname:',t) then begin - pS:=low(tPegelStation); - gefunden:=false; - while pS<=high(tPegelStation) do begin - for i:=0 to length(pegelStationsNamen[psBlankenstein])-1 do - gefunden:=gefunden or ((pegelStationsNamen[pS,i]<>'') and (pegelStationsNamen[pS,i]=t)); - if gefunden then break; - inc(pS); - end; - if not gefunden then begin - writeln('Unbekannter Pegelname: '''+t+'''!'); - for i:=1 to length(t) do - write(ord(t[i]),' '); - writeln; - for i:=1 to length(pegelStationsNamen[psSaalfeld,0]) do - write(ord(pegelStationsNamen[psSaalfeld,0][i]),' '); - writeln; - raise exception.create('Unbekannter Pegelname: '''+t+'''!'); - end; - psda:=true; - continue; - end; - if t='Durchfluss [m3/s]' then begin - wsda:=false; - continue; - end; - if t='Wasserstand [cm]' then begin - wsda:=true; - continue; - end; - if not (wsda and psda) then continue; - if pos('Fluss: ',t)=1 then continue; - if pos('Flusseinzugsgebiet: ',t)=1 then continue; - if startetMit('Stationsnummer: ',t) then begin - {$WARNINGS-} - if decimalSeparator<>'.' then - while pos('.',t)>0 do - t[pos('.',t)]:=decimalSeparator; - {$WARNINGS+} - if round(10*strtofloat(t))<>round(10*pegelStationsNummern[pS]) then begin - writeln( - 'erwartete Pegelstationsnummer ('+floattostr(pegelStationsNummern[pS])+ - ') für '+pegelStationsNamen[pS,0]+' ist verschieden von der angegebenen Nummer ('+t+')!'); - raise exception.create( - 'erwartete Pegelstationsnummer ('+floattostr(pegelStationsNummern[pS])+ - ') für '+pegelStationsNamen[pS,0]+' ist verschieden von der angegebenen Nummer ('+t+')!'); - end; - continue; - end; - if pos('Hinweise: ',t)=1 then continue; - if pos('keine Werte',t)>0 then continue; - werte[pS].add(t); - end; -end; - procedure tPegelStaende.putBeenden; begin put.beenden:=true; diff --git a/unit1.lfm b/unit1.lfm index 473c24c..8f439a6 100644 --- a/unit1.lfm +++ b/unit1.lfm @@ -3,6 +3,7 @@ object Form1: TForm1 Height = 204 Top = 256 Width = 713 + BorderStyle = bsNone Caption = 'Form1' ClientHeight = 204 ClientWidth = 713 diff --git a/unit1.pas b/unit1.pas index a86e19d..4790e65 100644 --- a/unit1.pas +++ b/unit1.pas @@ -3,7 +3,8 @@ unit Unit1; interface uses - Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls, pegelUnit; + Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls, + pegelUnit, fhUnit, lowLevelUnit; type @@ -17,9 +18,10 @@ type procedure FormDestroy(Sender: TObject); private { private declarations } - datenZeitRaum: extended; - pegel: tPegelStaende; - pegelDatei: string; + datenZeitRaum: extended; + pegel: tPegelStaende; + wetter: tMessPunkte; + pegelDatei,wetterDatei: string; public { public declarations } procedure zeichnen; @@ -31,10 +33,7 @@ var fehler: boolean; const - - DateiName = 'letztes_Wetter.txt'; - PegelDateiName = 'letzte_Pegel.txt'; - anzDaten = 7*24*6*4; + bufLengMin = 1024*1024; (* @@ -49,14 +48,16 @@ function letzterMonat(t: TDateTime): TPoint; // x=Monat, y=Jahr function MyIntToStr(I,Ziff: longint): string; *) -function wertZuX(w: extended; startZeit,stopZeit: extended; breite: longint): longint; -function wertZuY(w: extended; miMa: tPoint; hoehe: longint): longint; +function wertZuX(w: extended; startZeit,stopZeit: extended; breite: longint): longint; inline; +function wertZuY(w: extended; miMa: tPoint; hoehe: longint): longint; inline; overload; +function wertZuY(w: extended; miMa: tExtPoint; hoehe: longint): longint; inline; overload; +function wertZuY(w: extended; mi,ma: extended; hoehe: longint): longint; inline; overload; implementation {$R *.lfm} -uses process, myStringListUnit, lowLevelUnit, systemUnit, matheunit, math; +uses process, myStringListUnit, systemUnit, matheunit, math; { TForm1 } @@ -67,17 +68,18 @@ var fi: textfile; args: array of string; begin + fehler:=true; __ausgabenMaske:=1; pidDatei:=''; pegelDatei:=''; datenZeitRaum:=1; - fehler:=true; s:=extractfilepath(application.exename)+'wetter.konf'; t:=''; if not fileexists(s) then raise exception.create('Kann Konfigurationsdatei '''+s+''' nicht finden!'); pegel:=tPegelStaende.create(image1); + wetter:=tMessPunkte.create(image1); f:=tMyStringList.create; f.loadFromFile(s); f.unfoldMacros; @@ -118,6 +120,13 @@ begin pegel.laden(pegelDatei); continue; end; + if startetMit('wetterDatei:',s) then begin + wetterDatei:=s; + if pos('/',wetterDatei)=0 then + wetterDatei:=extractFilePath(application.exename)+wetterDatei; + wetter.laden(wetterDatei); + continue; + end; if startetMit('datenZeitRaum:',s) then begin datenZeitRaum:=exprtofloat(false,s,nil,nil); continue; @@ -136,6 +145,7 @@ end; procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction); begin pegel.putBeenden; + wetter.mutBeenden; end; procedure TForm1.FormDestroy(Sender: TObject); @@ -145,8 +155,11 @@ begin if not fehler then begin if pegelDatei<>'' then pegel.speichern(pegelDatei); + if wetterDatei<>'' then + wetter.speichern(wetterDatei); end; pegel.free; + wetter.free; end; procedure TForm1.zeichnen; @@ -160,6 +173,7 @@ begin startZeit:=stopZeit-datenZeitRaum; pegel.achsenZeichnen([psRudolstadt,psRothenstein],startZeit,stopZeit); + wetter.achsenZeichnen([mgTemperatur],startZeit,stopZeit); image1.canvas.pen.color:=$000000; tmp:=floor(startZeit); @@ -170,6 +184,7 @@ begin end; pegel.graphenZeichnen([psRudolstadt,psRothenstein],now-datenZeitRaum,now); + wetter.graphenZeichnen([mgTemperatur,mgLuftfeuchte,mgNiederschlag,mgGlobalstrahlung,mgLuftdruck],now-datenZeitRaum,now); fehler:=false; end; @@ -182,12 +197,22 @@ var tmp: extended; begin tmp:=(w-startZeit)/(stopZeit-startZeit); - result:=round(-breite*ln(1+tmp*(exp(-xScale)-1))/xScale); + result:=1+round(-(breite-2)*ln(1+tmp*(exp(-xScale)-1))/xScale); end; function wertZuY(w: extended; miMa: tPoint; hoehe: longint): longint; begin - result:=round((w-miMa.x)/(miMa.y-miMa.x)*hoehe); + result:=wertZuY(w,miMa.x,miMa.y,hoehe); +end; + +function wertZuY(w: extended; miMa: tExtPoint; hoehe: longint): longint; +begin + result:=wertZuY(w,miMa['x'],miMa['y'],hoehe); +end; + +function wertZuY(w: extended; mi,ma: extended; hoehe: longint): longint; +begin + result:=hoehe-1-round((w-mi)/(ma-mi)*(hoehe-2)); end; end. diff --git a/wetter.konf b/wetter.konf index 2f3e5cb..264a14e 100644 --- a/wetter.konf +++ b/wetter.konf @@ -1,4 +1,4 @@ pidDatei: /tmp/wetter.pid -#wetterDatei: letztes_Wetter.txt +wetterDatei: letztes_Wetter.txt pegelDatei: letzte_Pegel.txt datenZeitRaum: 7*4 diff --git a/wetter.lps b/wetter.lps index 82b47ab..b89aa0e 100644 --- a/wetter.lps +++ b/wetter.lps @@ -9,7 +9,7 @@ - + @@ -18,9 +18,10 @@ - - - + + + + @@ -28,31 +29,29 @@ - + - - + - - - + + + - - - - + + + @@ -60,13 +59,13 @@ - + - - + + @@ -75,7 +74,7 @@ - + @@ -83,150 +82,147 @@ - + - + - + - + - + - - + + - - + + - - + + - - + + - - + + - - + + - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - - - -- cgit v1.2.3-54-g00ecf