GPSandSun
GPSandSun folder an application doing the following:
lib directory under GPSandSun.
| Bulk data, from the serial port | Reformatted, before parsing |
|---|---|
$GPGGA,233900.000,3744.9279,N,12230.4340,W,1,5,1.47,145.2,M,-25.5,M,,*6F
$GPGSA,A,3,16,
20,23,13,07,,,,,,,,1.77,1.47,0.99*00
$GPGSV,4,1,13,23,72,021,14,16,53,094,31,13,50,314,24,20,48,181,22*
73
$GPGSV,4,2,13,07,31,248,16,10,20,316,16,32,20,153,23,04,14,283,*7C
$GPGSV,4,3,13,06,07,109,,03,06,1
35,,08,04,237,,27,03,118,*73
$GPGSV,4,4,13,43,,,*7C
$GPRMC,233900.000,A,3744.9279,N,12230.4340,W,0.31,
3.88,190214,,,A*79
$GPVTG,3.88,T,,M,0.31,N,0.58,K,A*31
$GPGGA,233901.000,3744.9279,N,12230.4340,W,1,5,1
.47,145.2,M,-25.5,M,,*6E
$GPGSA,A,3,16,20,23,13,07,,,,,,,,1.77,1.47,0.99*00
$GPRMC,233901.000,
A,3744.9279,N,12230.4340,W,0.35,3.88,190214,,,A*7C
$GPVTG,3.88,T,,M,0.35,N,0.64,K,A*3A
$GPGGA,233902.000,3744.9278,N,12230.4339,W,1,5,1.47,145.
2,M,-25.5,M,,*62
$GPGSA,A,3,16,20,23,13,07,,,,,,,,1.77,1.47,0.99*00
$GPRMC,233902.000,A,3744.9278,N,12
230.4339,W,0.54,3.88,190214,,,A*77
$GPVTG,3.88,T,,M,0.54,N,1.01,K,A*3F
$GPGGA,233903.000,3744.9276,N,12230.4337,W,1,6,1.29,145.2,M,-25.5,M,,*68
$GPGSA,A,3,16,20,23,13
,07,32,,,,,,,1.61,1.29,0.95*02
$GPRMC,233903.000,A,3744.9276,N,12230.4337,W,0.74,161.99,190214,,,A*71
$GPVTG,161.99,T,,M,0.74,N,1.37,K,A*3D
$GPGGA,233904.000,3744.9
168,N,12230.4334,W,1,6,1.29,144.3,M,-25.5,M,,*60
$GPGSA,A,3,16,20,23,13,07,32,,,,,,,1.61,1.29,0.95*02
$GPRMC,233904.000,A,3744.9168,N,12230.4334,W,0.69,177.30,190214,,,A*71
$GPVTG,177.30,T,,M,0.69,N,1.28,K
,A*3B
$GPGGA,233905.000,3744.9171,N,12230.4344,W,1,6,1.30,144.
0,M,-25.5,M,,*65
$GPGSA,A,3,16,20,23,13,07,32,,,,,,,1.61,1.30,0.96*09
$GPGSV,4,1,13,23,72,021,15,16,53
,094,32,13,50,314,25,20,48,181,22*70
$GPGSV,4,2,13,07,31,248,16,32,20,153,24,10,20,316,16,04,14,283,*7B
$GPGSV,4,3,13,06,07,109,,03,07,135,,08,04,237,,27,03,118,*72
$GPGSV,4,4,13,43,,,*7C
$GPRMC,233905.00
0,A,3744.9171,N,12230.4344,W,0.69,174.44,190214,,,A*7F
$GPVTG,174.44,T,,M,0.69,N,1.28,K,A*3B
$GPGGA,233906.000,3744.9140,N,12230.4337,W,1,6,1.29,143.3,M,-25.5,M,,*6C
$GPGSA,A,3,16,
20,23,13,07,32,,,,,,,1.61,1.29,0.95*02
$GPRMC,233906.000,A,3744.9140,N,12230.4337,W,1.16,169.31
,190214,,,A*7D
$GPVTG,169.31,T,,M,1.16,N,2.14,K,A*30
$GPGGA,233907.000,3744.9108,N,12230.4327,W,1,6,1.29,142.3,M,-25.5,M,,*61
$GPGSA,A,3,16,20,23,13
,07,32,,,,,,,1.61,1.29,0.96*01
$GPRMC,233907.000,A,3744.9108,N,12230.4327,W,1.58,114.60,190214,,,A*75
$GPVTG,114.60,T,,M,1.58,N,2.93,K,A*3B
$GPGGA,2
33908.000,3744.9090,N,12230.4322,W,1,6,1.29,141.5,M,-25.5,M,,*6E
$GPGSA,A,3,16,20,23,13,07,32,,,,,,,1.6
1,1.29,0.95*02
$GPRMC,233908.000,A,3744.9090,N,12230.4322,W,2.07,109.78,190214,,,A*73
$GPVTG,1
09.78,T,,M,2.07,N,3.84,K,A*30
|
$GPGGA,233900.000,3744.9279,N,12230.4340,W,1,5,1.47,145.2,M,-25.5,M,,*6F
$GPGSA,A,3,16,20,23,13,07,,,,,,,,1.77,1.47,0.99*00
$GPGSV,4,1,13,23,72,021,14,16,53,094,31,13,50,314,24,20,48,181,22*73
$GPGSV,4,2,13,07,31,248,16,10,20,316,16,32,20,153,23,04,14,283,*7C
$GPGSV,4,3,13,06,07,109,,03,06,135,,08,04,237,,27,03,118,*73
$GPGSV,4,4,13,43,,,*7C
$GPRMC,233900.000,A,3744.9279,N,12230.4340,W,0.31,3.88,190214,,,A*79
$GPVTG,3.88,T,,M,0.31,N,0.58,K,A*31
$GPGGA,233901.000,3744.9279,N,12230.4340,W,1,5,1.47,145.2,M,-25.5,M,,*6E
$GPGSA,A,3,16,20,23,13,07,,,,,,,,1.77,1.47,0.99*00
$GPRMC,233901.000,A,3744.9279,N,12230.4340,W,0.35,3.88,190214,,,A*7C
$GPVTG,3.88,T,,M,0.35,N,0.64,K,A*3A
$GPGGA,233902.000,3744.9278,N,12230.4339,W,1,5,1.47,145.2,M,-25.5,M,,*62
$GPGSA,A,3,16,20,23,13,07,,,,,,,,1.77,1.47,0.99*00
$GPRMC,233902.000,A,3744.9278,N,12230.4339,W,0.54,3.88,190214,,,A*77
$GPVTG,3.88,T,,M,0.54,N,1.01,K,A*3F
$GPGGA,233903.000,3744.9276,N,12230.4337,W,1,6,1.29,145.2,M,-25.5,M,,*68
$GPGSA,A,3,16,20,23,13,07,32,,,,,,,1.61,1.29,0.95*02
$GPRMC,233903.000,A,3744.9276,N,12230.4337,W,0.74,161.99,190214,,,A*71
$GPVTG,161.99,T,,M,0.74,N,1.37,K,A*3D
$GPGGA,233904.000,3744.9168,N,12230.4334,W,1,6,1.29,144.3,M,-25.5,M,,*60
$GPGSA,A,3,16,20,23,13,07,32,,,,,,,1.61,1.29,0.95*02
$GPRMC,233904.000,A,3744.9168,N,12230.4334,W,0.69,177.30,190214,,,A*71
$GPVTG,177.30,T,,M,0.69,N,1.28,K,A*3B
$GPGGA,233905.000,3744.9171,N,12230.4344,W,1,6,1.30,144.0,M,-25.5,M,,*65
$GPGSA,A,3,16,20,23,13,07,32,,,,,,,1.61,1.30,0.96*09
$GPGSV,4,1,13,23,72,021,15,16,53,094,32,13,50,314,25,20,48,181,22*70
$GPGSV,4,2,13,07,31,248,16,32,20,153,24,10,20,316,16,04,14,283,*7B
$GPGSV,4,3,13,06,07,109,,03,07,135,,08,04,237,,27,03,118,*72
$GPGSV,4,4,13,43,,,*7C
$GPRMC,233905.000,A,3744.9171,N,12230.4344,W,0.69,174.44,190214,,,A*7F
$GPVTG,174.44,T,,M,0.69,N,1.28,K,A*3B
$GPGGA,233906.000,3744.9140,N,12230.4337,W,1,6,1.29,143.3,M,-25.5,M,,*6C
$GPGSA,A,3,16,20,23,13,07,32,,,,,,,1.61,1.29,0.95*02
$GPRMC,233906.000,A,3744.9140,N,12230.4337,W,1.16,169.31,190214,,,A*7D
$GPVTG,169.31,T,,M,1.16,N,2.14,K,A*30
$GPGGA,233907.000,3744.9108,N,12230.4327,W,1,6,1.29,142.3,M,-25.5,M,,*61
$GPGSA,A,3,16,20,23,13,07,32,,,,,,,1.61,1.29,0.96*01
$GPRMC,233907.000,A,3744.9108,N,12230.4327,W,1.58,114.60,190214,,,A*75
$GPVTG,114.60,T,,M,1.58,N,2.93,K,A*3B
$GPGGA,233908.000,3744.9090,N,12230.4322,W,1,6,1.29,141.5,M,-25.5,M,,*6E
$GPGSA,A,3,16,20,23,13,07,32,,,,,,,1.61,1.29,0.95*02
$GPRMC,233908.000,A,3744.9090,N,12230.4322,W,2.07,109.78,190214,,,A*73
$GPVTG,109.78,T,,M,2.07,N,3.84,K,A*30
|
1 2 3 4 5 6 7 8 9 10 11
$xxRMC,123519,A,4807.038,N,01131.000,E,022.4,084.4,230394,003.1,W*6A
| | | | | | | | | | |
| | | | | | | | | | Variation sign
| | | | | | | | | Variation value
| | | | | | | | Date DDMMYY
| | | | | | | COG
| | | | | | SOG
| | | | | Longitude Sign
| | | | Longitude Value
| | | Latitude Sign
| | Latitude value
| Active or Void
UTC HHMMSS
The position can be contained in a GeoPos object, dates and times in a Date object,
Speed Over Ground (SOG) in a double, Course Over Ground (COG) as an int, etc.
nmea.CustomNMEASerialReader.javaocss.nmea.api.NMEAReadernmea.CustomNMEAReader.javaocss.nmea.api.NMEAClientocss.nmea.api.NMEAListener. Implements the application's logicmain method is in nmea.CustomNMEAReader.
nmea.CustomNMEASerialReader
1 package nmea;
2
3 import com.pi4j.io.serial.Serial;
4 import com.pi4j.io.serial.SerialDataEvent;
5 import com.pi4j.io.serial.SerialDataListener;
6 import com.pi4j.io.serial.SerialFactory;
7
8 import java.util.List;
9
10 import ocss.nmea.api.NMEAEvent;
11 import ocss.nmea.api.NMEAListener;
12 import ocss.nmea.api.NMEAReader;
13
14 public class CustomNMEASerialReader
15 extends NMEAReader
16 {
17 private int baudRate = 4800;
18 private CustomNMEASerialReader instance = this;
19
20 public CustomNMEASerialReader(List<NMEAListener> al, int br)
21 {
22 super(al);
23 baudRate = br;
24 }
25
26 @Override
27 public void read()
28 {
29 if (System.getProperty("verbose", "false").equals("true"))
30 System.out.println("From " + this.getClass().getName() + " Reading Serial Port.");
31
32 super.enableReading();
33
34 // Opening Serial port
35 try
36 {
37 final Serial serial = SerialFactory.createInstance();
38
39 // create and register the serial data listener
40 serial.addListener(new SerialDataListener()
41 {
42 @Override
43 public void dataReceived(SerialDataEvent event)
44 {
45 // System.out.print(/*"Read:\n" + */ event.getData());
46 instance.fireDataRead(new NMEAEvent(this, event.getData()));
47 }
48 });
49 System.out.println("Opening port [" + Serial.DEFAULT_COM_PORT + "]");
50 serial.open(Serial.DEFAULT_COM_PORT, baudRate);
51 }
52 catch (Exception ex)
53 {
54 ex.printStackTrace();
55 }
56 // Reading on Serial Port
57 System.out.println("Port is open...");
58 }
59 }
instance.fireDataRead(new NMEAEvent(this, event.getData())); is invoked, line 46.
nmea.CustomNMEAReader
1 package nmea;
2
3 import calculation.AstroComputer;
4 import calculation.SightReductionUtil;
5
6 import java.text.DecimalFormat;
7
8 import java.util.Calendar;
9 import java.util.TimeZone;
10
11 import ocss.nmea.api.NMEAClient;
12 import ocss.nmea.api.NMEAEvent;
13 import ocss.nmea.api.NMEAListener;
14 import ocss.nmea.parser.GeoPos;
15 import ocss.nmea.parser.RMC;
16 import ocss.nmea.parser.StringParsers;
17
18 public class CustomNMEAReader extends NMEAClient
19 {
20 private final static DecimalFormat DFH = new DecimalFormat("#0.00'\272'");
21 private final static DecimalFormat DFZ = new DecimalFormat("##0.00'\272'");
22
23 private static GeoPos prevPosition = null;
24 private static long prevDateTime = -1L;
25
26 public CustomNMEAReader()
27 {
28 super();
29 }
30
31 @Override
32 public void dataDetectedEvent(NMEAEvent e)
33 {
34 // System.out.println("Received:" + e.getContent());
35 manageData(e.getContent().trim());
36 }
37
38 private static CustomNMEAReader customClient = null;
39
40 private static void manageData(String sentence)
41 {
42 boolean valid = StringParsers.validCheckSum(sentence);
43 if (valid)
44 {
45 String id = sentence.substring(3, 6);
46 if ("RMC".equals(id))
47 {
48 // System.out.println(line);
49 RMC rmc = StringParsers.parseRMC(sentence);
50 // System.out.println(rmc.toString());
51 if (rmc != null && rmc.getRmcDate() != null && rmc.getGp() != null)
52 {
53 if ((prevDateTime == -1L || prevPosition == null) ||
54 (prevDateTime != (rmc.getRmcDate().getTime() / 1000) || !rmc.getGp().equals(prevPosition)))
55 {
56 Calendar current = Calendar.getInstance(TimeZone.getTimeZone("etc/UTC"));
57 current.setTime(rmc.getRmcDate());
58 AstroComputer.setDateTime(current.get(Calendar.YEAR),
59 current.get(Calendar.MONTH) + 1,
60 current.get(Calendar.DAY_OF_MONTH),
61 current.get(Calendar.HOUR_OF_DAY),
62 current.get(Calendar.MINUTE),
63 current.get(Calendar.SECOND));
64 AstroComputer.calculate();
65 SightReductionUtil sru = new SightReductionUtil(AstroComputer.getSunGHA(),
66 AstroComputer.getSunDecl(),
67 rmc.getGp().lat,
68 rmc.getGp().lng);
69 sru.calculate();
70 Double he = sru.getHe();
71 Double z = sru.getZ();
72 System.out.println(current.getTime().toString() + ", He:" + DFH.format(he)+ ", Z:" + DFZ.format(z) + " (" + rmc.getGp().toString() + ")");
73 }
74 prevPosition = rmc.getGp();
75 prevDateTime = (rmc.getRmcDate().getTime() / 1000);
76 }
77 else
78 {
79 if (rmc == null)
80 System.out.println("... no RMC data in [" + sentence + "]");
81 else
82 {
83 String errMess = "";
84 if (rmc.getRmcDate() == null)
85 errMess += ("no Date ");
86 if (rmc.getGp() == null)
87 errMess += ("no Pos ");
88 System.out.println(errMess + "in [" + sentence + "]");
89 }
90 }
91 }
92 }
93 else
94 System.out.println("Invalid data [" + sentence + "]");
95 }
96
97 public static void main(String[] args)
98 {
99 System.setProperty("deltaT", System.getProperty("deltaT", "67.2810")); // 2014-Jan-01
100
101 int br = 4800;
102 System.out.println("CustomNMEAReader invoked with " + args.length + " Parameter(s).");
103 for (String s : args)
104 {
105 System.out.println("CustomNMEAReader prm:" + s);
106 try { br = Integer.parseInt(s); } catch (NumberFormatException nfe) {}
107 }
108
109 customClient = new CustomNMEAReader();
110
111 Runtime.getRuntime().addShutdownHook(new Thread()
112 {
113 public void run()
114 {
115 System.out.println ("Shutting down nicely.");
116 customClient.stopDataRead();
117 }
118 });
119 customClient.initClient();
120 customClient.setReader(new CustomNMEASerialReader(customClient.getListeners(), br));
121 customClient.startWorking(); // Feignasse!
122 }
123
124 private void stopDataRead()
125 {
126 if (customClient != null)
127 {
128 for (NMEAListener l : customClient.getListeners())
129 l.stopReading(new NMEAEvent(this));
130 }
131 }
132 }
dataDetectedEvent method is overridden (line 32)manageData methodmanageData, invoking the AstroComputer and SightReductionUtil utilities to compute and display the Altitude and Azimuth of the Sun (lines 40 and after)RMC object (line 49)
#!/bin/bash
JAVAC_OPTIONS="-sourcepath ./src"
JAVAC_OPTIONS="$JAVAC_OPTIONS -d ./classes"
CP=./classes
PI4J_HOME=/home/pi/pi4j/pi4j-distribution/target/distro-contents
CP=$CP:$PI4J_HOME/lib/pi4j-core.jar
CP=$CP:./lib/almanactools.jar
CP=$CP:./lib/geomutil.jar
CP=$CP:./lib/nauticalalmanac.jar
CP=$CP:./lib/nmeaparser.jar
# -verbose can be removed
JAVAC_OPTIONS="-verbose $JAVAC_OPTIONS -cp $CP"
COMMAND="javac $JAVAC_OPTIONS ./src/nmea/*.java"
echo Compiling: $COMMAND
$COMMAND
echo Done
A run script would be like:
#!/bin/bash
CP=./classes
PI4J_HOME=/home/pi/pi4j/pi4j-distribution/target/distro-contents
CP=$CP:$PI4J_HOME/lib/pi4j-core.jar
CP=$CP:./lib/almanactools.jar
CP=$CP:./lib/geomutil.jar
CP=$CP:./lib/nauticalalmanac.jar
CP=$CP:./lib/nmeaparser.jar
sudo java -cp $CP nmea.CustomNMEAReader $*
If the script is named run, you would start it like this (after a chmod +x run)
./run 9600
You should end up with the output we've seen before: