• Willkommen im Geoclub - dem größten deutschsprachigen Geocaching-Forum. Registriere dich kostenlos, um alle Inhalte zu sehen und neue Beiträge zu erstellen.

NMEA-Log Aufzeichnung

maierkurt

Geowizard
Benutze CW-Version: r1326
Ich habe immer noch ein Problem mit der Aufzeichnung des NMEA-Logs, es wird nur der GPGSV-Datensatz in der log-Datei abgespeichert. Pfeffer meinte dass eventuell etwas mit den Prüfsummen der Datensätze nicht stimmt. Ich habe mir dann die Datensätze aus dem GPS-Testfenster vom CW herauskopiert: die Prüfsummen stimmen.
Habe mir dann die CWGPSPoint.java vorgenommen und folgenden Codeschnipsel entdeckt:
Code:
public boolean examine(String NMEA){ 
		boolean interpreted = false;
		try {
			int i, start, end;
			String latDeg="0", latMin="0", latNS="N"; 
			String lonDeg="0", lonMin="0", lonEW="E";
			String currToken;
			end = 0;
			lastStrExamined = NMEA;
			//Vm.debug(NMEA);
/*			if (writeLog && (logFlag & LOGRAW) > 0){ 
				try {
					logFile.write(NMEA);
					writeLog = false;
				} catch (IOException e) {}
			}
*/			while(true){
				start = NMEA.indexOf("$GP", end);  
				if (start == -1) return interpreted;  
				end = NMEA.indexOf("*", start);  
				if ((end == -1)||(end+3 > NMEA.length())) return interpreted;  


				//Vm.debug(NMEA.substring(start,end+3));
				if ((end - start) < 15 || !checkSumOK(NMEA.substring(start,end+3))){
					//Vm.debug("checksum wrong");
					continue;
				}
				// Write log after finding valid NMEA sequence 
				if (writeLog && (logFlag & LOGRAW) > 0){ 
					try {
						logFile.write(NMEA.substring(start,end+3)+"\n");
						writeLog = false;
					} catch (IOException e) {}
				}
[........]
hiernach werden die einzelnen GP-Datensätze geparst.

Jetzt meine Frage: Die Navigation funktioniert. Sollte die Checksum nicht korrekt sein, so dürfte das Programm doch gar nicht über die Zeilen
Code:
if ((end - start) < 15 || !checkSumOK(NMEA.substring(start,end+3))){
					//Vm.debug("checksum wrong");
					continue;
hinwegkommen, und somit sollte die ganze Navigation auch nicht funktionieren.
Warum werden dann aber anschließend in
Code:
if (writeLog && (logFlag & LOGRAW) > 0){ 
					try {
						logFile.write(NMEA.substring(start,end+3)+"\n");
						writeLog = false;
					} catch (IOException e) {}
				}
nicht alle Datensätze (nur der GPGSV) abgespeichert?


Gruß, maierkurt
 

pfeffer

Geowizard
hmm - also bei mir werden auch alle gespeichert.

Was noch sein kann: was für ein Log-intervall hast Du in den Präferenzen eingestellt?

Gruß,
Pfeffer.
 
OP
M

maierkurt

Geowizard
So, habe mich jetzt länger nicht gemeldet, war mit der Einrichtung des SDK beschäftigt.
Scheint zu laufen, DANK an pfeffer für http://www.geoclub.de/viewtopic.php?f=40&t=23210

Was noch sein kann: was für ein Log-intervall hast Du in den Präferenzen eingestellt?
Alles von 0 bis 20.


Gruß, maierkurt
 

pfeffer

Geowizard
hhmmm - das ist ja sehr seltsam.

dann teste doch mal folgendes:

1. Wenn Du unter Windows arbeitest: lade Dir netcat runter http://www.vulnwatch.org/netcat/nc111nt.zip (in linux ist es meist schon dabei, evtl. abgekürzt als nc).
2. starte netcat als Server auf Port 21? 23? (weiß ich grad nicht genau): netcat -p 23 -l
2a. Merke Dir die ip von dem Rechner, auf dem Du es startest <server-ip>.

3. Stelle eine Netzwerkverbindung her zwischen dem Gerät, auf dem CacheWolf läuft und dem Server

4. Stelle in den Präferenzen ein: Forwart GPS-Data to Host und trage dort die <server-ip> ein.

Wenn Du nun das GPS startest, dann sollten auf dem Server alle Daten vom GPS angezeigt werden.

Gruß,
Pfeffer.
 

MiK

Geoguru
Alternativ kannst Du ja mal an den entscheidenden Stellen Breakpoints setzen und schauen, warum die anderen Datensätze nicht herausgeschrieben werden.
 
OP
M

maierkurt

Geowizard
Habe rumprobiert!
Zum simulieren des seriellen Ports habe ich "HW Virtual Serial Port" benutzt.

Ausschnitt von CWGPSPoint.java:
Code:
			while(true){
				start = NMEA.indexOf("$GP", end);  
				if (start == -1) return interpreted;  
				end = NMEA.indexOf("*", start);  
				if ((end == -1)||(end+3 > NMEA.length())) return interpreted;  


				//Vm.debug(NMEA.substring(start,end+3));
				if ((end - start) < 15 || !checkSumOK(NMEA.substring(start,end+3))){
					//Vm.debug("checksum wrong");
					continue;
				}
				// Write log after finding valid NMEA sequence 
				if (writeLog && (logFlag & LOGRAW) > 0){ 
					try {


ZEILE 205 				logFile.write(NMEA.substring(start,end+3)+"\n");


						writeLog = false;
					} catch (IOException e) {}

In Programmzeile 205 wird der NMEA-String in die Datei gespeichert. Variable "end" kann aber immer nur die Länge der ersten Datensatzzeile enthalten. Bei gültigem Datensatz wird "end" doch in den ersten vier Zeilen nach while(true)... gesetzt.


Gruß, maierkurt
 

MiK

Geoguru
Ich kann Dir noch nicht ganz folgen, wo bei Dir das Problem ist? Werden bei Dir relevante Teile weggelassen, weil end zu kurz ist? Oder trifft bei Dir ein der Abbruchbedingungen zu, bevor der Datensatz in die Datei geschrieben wird?
 
OP
M

maierkurt

Geowizard
Ich kann Dir noch nicht ganz folgen, wo bei Dir das Problem ist? Werden bei Dir relevante Teile weggelassen, weil end zu kurz ist?
Genau so sieht es aus. In "NMEA" steht ja der komplette Datensatz drin, $GPGSV, $GPRMC usw...
Code:
$GPGSV,3,1,10,18,11,322,,19,07,025,,08,29,068,19,10,23,191,14*71
$GPGSV,3,2,10,15,54,293,,21,09,299,,24,07,261,,26,68,300,*71
$GPGSV,3,3,10,27,15,070,,28,59,088,15*7C
$GPGGA,185428.0,gelöscht,N,gelöscht,E,1,02,25.5,474.0,M,,,,*3E
$GPRMC,185428.0,A,gelöscht,N,gelöscht,E,1.9,295.8,070408,,,A*6D
$GPGSA,A,3,08,255,,,,,,,,,,,25.5,25.5,25.5*3A
$GPVTG,295.8,T,,M,1.9,N,3.5,K*68
Die Variable 'end' zeigt aber immer nur auf das Ende der ersten Datensatzzeile, der Rest wird nicht in die Datei geschrieben.

Gruß, maierkurt
 

MiK

Geoguru
Die weiteren Zeilen des Datensatzes werden aber in den nächsten Durchläufen der Schleife abgearbeitet. Bei Dir nicht? Wodurch wird die Schleife bei Dir abgebrochen?
 
OP
M

maierkurt

Geowizard
Die weiteren Zeilen des Datensatzes werden aber in den nächsten Durchläufen der Schleife abgearbeitet. Bei Dir nicht?
Ja, das ist richtig. Die Schleife wird nicht vorzeitig abgebrochen.
Aber: Nachdem die erste Zeile als gültig (checkSumOK(NMEA.substring(start,end+3)) akzeptiert wurde, wird die Zeile auch in die Datei geschrieben.
Code:
// Write log after finding valid NMEA sequence 
				if (writeLog && (logFlag & LOGRAW) > 0){ 
					try {
						logFile.write(NMEA.substring(start,end+3)+"\n");
						writeLog = false;
					} catch (IOException e) {}
				}
Alle weiteren Zeilen werden zwar bearbeitet, aber nicht gespeichert da in Zeile 206 "writeLog = false;" gesetzt wird. Müsste dies nicht erst nach Beendigung der Schleife geschehen?

Gruß, maierkurt
 

MiK

Geoguru
Wenn man es einfach ans Ende der Schleife setzt, weiß man nicht, ob wirklich etwas in das Log geschrieben werden konnte und verpasst so den nächsten Datensatz zu schreiben. Außerdem gibt es da ein paar unschöne returns in der Schleife.

Man könnte natürlich einfach an der Stelle den kompletten String schreiben. Aber dann wäre er nicht auf Gültigkeit überprüft.

Man muss das wohl ein klein wenig umbauen. Ich schau es mir mal an.
 
OP
M

maierkurt

Geowizard
Ich schau es mir mal an.
Vielen Dank!

Ich habe den Code jetzt so verändert, hoffentlich nicht verschlimmbessert.
Die CheckSum-Prüfung bleibt erhalten, wenn sie nicht stimmt wird ja mit continue die Schleife neu gestartet.

Code:
while(true){
				start = NMEA.indexOf("$GP", end);  
				if (start == -1){ 
									writeLog = false;	// von mir
									return interpreted;
								}
				end = NMEA.indexOf("*", start);  
				if ((end == -1)||(end+3 > NMEA.length())){
									writeLog = false;	// von mir
									return interpreted;  
														}

				//Vm.debug(NMEA.substring(start,end+3));
				if ((end - start) < 15 || !checkSumOK(NMEA.substring(start,end+3))){
					//Vm.debug("checksum wrong");
					continue;
				}
				// Write log after finding valid NMEA sequence 
				if (writeLog && (logFlag & LOGRAW) > 0){ 
					try {
						logFile.write(NMEA.substring(start,end+3)+"\n");
						//writeLog = false;            // von mir rausgenommen
					} catch (IOException e) {}
				}

Gruß, maierkurt
 

MiK

Geoguru
Bei Deiner Lösung wird aber nicht sichergestellt, dass writeLog nur auf false gesetzt wird, wenn auch wirklich etwas ins Log geschrieben wurde. Außerdem gefällt mir Code mit mehreren returns in einer Schleife grundsätzlich nicht.

Ich habe mittlerweile eine andere Lösung gefunden und auch commitet. Bitte testet, ob damit noch alles so wie vorher (oder besser) funktioniert.

@Dev: Bitte schaut mal kurz über meine Änderungen im Code drüber.
 
OP
M

maierkurt

Geowizard
Außerdem gefällt mir Code mit mehreren returns in einer Schleife grundsätzlich nicht.
Die returns waren nicht von mir :oops:

Ich habe mittlerweile eine andere Lösung gefunden und auch commitet. Bitte testet, ob damit noch alles so wie vorher (oder besser) funktioniert.

Sehr schön, Danke! Jetzt kann ich meine Tracks auch aufzeichnen.

Vielen Dank, maierkurt
 
Oben