From c42d9c90f212cf3a23844421b07a77154f604e7f Mon Sep 17 00:00:00 2001 From: Erich Eckner Date: Wed, 18 Nov 2015 14:56:44 +0100 Subject: pegelunit.pas schreibt jetzt auch binär MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pegelunit.pas | 212 ++++++++++++++++++++++++++++++++++++++++++++++------------ wetter.konf | 2 +- wetter.lps | 167 ++++++++++++++++++++++++--------------------- 3 files changed, 260 insertions(+), 121 deletions(-) diff --git a/pegelunit.pas b/pegelunit.pas index e63a799..d5fd5a5 100644 --- a/pegelunit.pas +++ b/pegelunit.pas @@ -31,6 +31,9 @@ type procedure lade(s: string); property zeit: extended read _uzeit; property hoehe: longint read _hoehe; + procedure dump(p: pointer); + procedure pmud(p: pointer); + function size: longint; end; tPegelListe = class @@ -47,6 +50,9 @@ type property items[i: longint]: tPegelStand read rItem; default; function minMaxY(startZeit,stopZeit: extended): tPoint; + procedure dump(p: pointer); + procedure pmud(p: pointer; version,len: longint); + function size: longint; end; tPegelUpdateThread = class(tThread) @@ -83,7 +89,7 @@ type implementation -uses math, unit1, myStringListUnit; +uses math, unit1, myStringListUnit, fileUnit; const pegelStationsNamen: array[tPegelstation] of array[0..1] of string = @@ -172,6 +178,24 @@ begin end; end; +procedure tPegelStand.dump(p: pointer); +begin + pExtended(p)^:=_uZeit; + pLongint(p+sizeof(extended))^:=_hoehe; +end; + +procedure tPegelStand.pmud(p: pointer); +begin + _uZeit:=pExtended(p)^; + _hoehe:=pLongint(p+sizeof(extended))^; + setzeZeit; +end; + +function tPegelStand.size: longint; +begin + result:=sizeof(extended)+sizeof(longint); +end; + // tPegelListe ***************************************************************** constructor tPegelListe.create; @@ -252,6 +276,60 @@ begin end; end; +procedure tPegelListe.dump(p: pointer); +var + i,siz: longint; +begin + if count=0 then exit; + siz:=items[0].size; + for i:=0 to count-1 do begin + items[i].dump(p); + p:=p+siz; + end; +end; + +procedure tPegelListe.pmud(p: pointer; version,len: longint); +var + i,siz: longint; + np: tPegelStand; +begin + case version of + 0: begin + inhalt.clear; + + np:=tPegelStand.create; + siz:=np.size; + + if len mod siz <> 0 then begin + writeln('Datenlänge ('+inttostr(len)+' Byte) ist kein Vielfaches der Länge eines Datums ('+inttostr(siz)+' Byte)!'); + raise exception.create('Datenlänge ('+inttostr(len)+' Byte) ist kein Vielfaches der Länge eines Datums ('+inttostr(siz)+' Byte)!'); + end; + + np.pmud(p); + p:=p+siz; + inhalt.add(np); + + for i:=1 to (len div siz)-1 do begin + np:=tPegelStand.create; + np.pmud(p); + p:=p+siz; + inhalt.add(np); + end; + end; + else begin + writeln('Zu neue Dateiversion: Ich verstehe nur bis Version 0, es liegt aber Version '+inttostr(version)+' vor!'); + raise exception.create('Zu neue Dateiversion: Ich verstehe nur bis Version 0, es liegt aber Version '+inttostr(version)+' vor!'); + end; + end{of case}; +end; + +function tPegelListe.size: longint; +begin + result:=count; + if result>0 then + result:=result*items[0].size; +end; + // tPegelUpdateThread ********************************************************** constructor tPegelUpdateThread.create(besitzer: tPegelStaende); @@ -434,72 +512,118 @@ end; procedure tPegelStaende.laden(von: string); var - f: tMyStringList; + sl: tMyStringList; s: string; ps: tPegelstation; psda,gefunden: boolean; - i: longint; + i,len: longint; + pt: pointer; begin if not fileexists(von) then begin writeln('Pegeldatei '''+von+''' existiert nicht!'); raise exception.create('Pegeldatei '''+von+''' existiert nicht!'); exit; end; - f:=tMyStringList.create; + if rightStr(von,3)='.gz' then - f.loadFromGz(von) + loadFromGz(von,pt,len) else - f.loadFromFile(von); - psda:=false; - ps:=low(TPegelstation); - while f.readln(s) do begin - if pos('Station: ',s)=1 then begin - delete(s,1,pos(' ',s)); - 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]=s)); - if gefunden then break; - inc(ps); + loadFromFile(von,pt,len); + + if pLongint(pt)^ <> 314159265 then begin // magische Zahl nicht gefunden -> Rückfallebene: Text! + sl:=tMyStringList.create; + setlength(s,len); + move(pt^,s[1],length(s)); + sl.text:=s; + + psda:=false; + ps:=low(TPegelstation); + while sl.readln(s) do begin + if pos('Station: ',s)=1 then begin + delete(s,1,pos(' ',s)); + 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]=s)); + if gefunden then break; + inc(ps); + end; + if not gefunden then begin + sl.free; + writeln('Pegelstation '''+s+''' nicht gefunden '''+Pegelstationsnamen[psSaalfeld,0]+'''!'); + raise exception.create('Pegelstation '''+s+''' nicht gefunden '''+Pegelstationsnamen[psSaalfeld,0]+'''!'); + end; + psda:=true; + continue; end; - if not gefunden then begin - f.free; - writeln('Pegelstation '''+s+''' nicht gefunden '''+Pegelstationsnamen[psSaalfeld,0]+'''!'); - raise exception.create('Pegelstation '''+s+''' nicht gefunden '''+Pegelstationsnamen[psSaalfeld,0]+'''!'); + if not psda then begin + sl.free; + writeln('Es wurde noch keine Pegelstation erwähnt!'); + raise exception.create('Es wurde noch keine Pegelstation erwähnt!'); end; - psda:=true; - continue; - end; - if not psda then begin - f.free; - writeln('Es wurde noch keine Pegelstation erwähnt!'); - raise exception.create('Es wurde noch keine Pegelstation erwähnt!'); + werte[ps].add(s); end; - werte[ps].add(s); + sl.free; + end + else begin + case (pLongint(pt)+1)^ of + 0: begin + i:=2*sizeof(longint); + for ps:=low(tPegelStation) to high(tPegelStation) do begin + werte[ps].pmud(pt+i+sizeof(longint),(pLongint(pt)+1)^,pLongint(pt+i)^); + i:=i+werte[ps].size+sizeof(longint); + end; + end; + else begin + writeln('Zu neue Dateiversion: Ich verstehe nur bis Version 0, es liegt aber Version '+inttostr((pLongint(pt)+1)^)+' vor!'); + raise exception.create('Zu neue Dateiversion: Ich verstehe nur bis Version 0, es liegt aber Version '+inttostr((pLongint(pt)+1)^)+' vor!'); + end; + end{of case}; end; - f.free; + freemem(pt); + if not assigned(put) then put:=tPegelUpdateThread.create(self); end; procedure tPegelStaende.speichern(nach: string); var - f: tMyStringList; - ps: tPegelStation; - i: longint; + sl: tMyStringList; + ps: tPegelStation; + pt: pointer; + i,len: longint; begin - f:=tMyStringList.create; - for ps:=low(tPegelStation) to high(tPegelStation) do begin - f.add('Station: '+Pegelstationsnamen[ps,0]); - for i:=0 to werte[ps].Count-1 do - f.add(werte[ps][i].schreibe); + if rightStr(nach,4)='.txt' then begin // Rückfallebene: Text + sl:=tMyStringList.create; + for ps:=low(tPegelStation) to high(tPegelStation) do begin + sl.add('Station: '+Pegelstationsnamen[ps,0]); + for i:=0 to werte[ps].Count-1 do + sl.add(werte[ps][i].schreibe); + end; + sl.saveToFile(nach); + sl.free; + end + else begin + len:=2*sizeof(longint); + for ps:=low(tPegelStation) to high(tPegelStation) do + len:=len+werte[ps].size+sizeof(longint); + getmem(pt,len); + pLongint(pt)^:=314159265; // magische Zahl + (pLongint(pt)+1)^:=0; // Version + i:=2*sizeof(longint); + for ps:=low(tPegelStation) to high(tPegelStation) do begin + pLongint(pt+i)^:=werte[ps].size; + i:=i+sizeof(longint); + werte[ps].dump(pt+i); + i:=i+werte[ps].size; + end; + if rightStr(nach,3)='.gz' then + saveToGz(nach,pt,len) + else + saveToFile(nach,pt,len); + freemem(pt); end; - if rightStr(nach,3)='.gz' then - f.saveToGz(nach) - else - f.saveToFile(nach); - f.free; end; procedure tPegelStaende.achsenZeichnen(zuZeichnen: tPegelStationsSet; startZeit,stopZeit: extended); diff --git a/wetter.konf b/wetter.konf index dd0e27a..4a6d73a 100644 --- a/wetter.konf +++ b/wetter.konf @@ -1,4 +1,4 @@ pidDatei: /tmp/wetter.pid wetterDatei: letztes_Wetter.dat.gz -pegelDatei: letzte_Pegel.txt.gz +pegelDatei: letzte_Pegel.dat.gz datenZeitRaum: 7*4 diff --git a/wetter.lps b/wetter.lps index 7a0d7ad..cd04c8e 100644 --- a/wetter.lps +++ b/wetter.lps @@ -3,13 +3,13 @@ - + - + @@ -18,9 +18,9 @@ - - - + + + @@ -28,212 +28,227 @@ - + - - - + + + + + + + + + + + - - + + - - - + + + - - + + - - + + - - + + - - + + - - + + - - - - - - - + + + + + + + - - + + - - + + - + + + + + + + + - + - + - + - + - + - + - + - + - + - - + - + - + - + - + - + - + - + - - + + - - + + - - + + - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + -- cgit v1.2.3-54-g00ecf