/** * Internal helper method to aid in the subclass architecture. Overwrites the superclass method * and calls it internally. * * @param header * @param s */ protected void sentenceChooser(String header, String s) { if (header.equals(RMCSentence.HEADER)) { rmcSentence.setSentence(s); notifyListeners(this.rmcSentence); } else if (header.equals(GSVSentence.HEADER)) { // TODO: I wonder what happens if say 2 of 4 are received and parse is called? // Because 2 would be new data, 2 would be old data. // Can't happen because parse() only called when not null. // BUT what if it is in the middle of parsing and new data comes in? // Solution: Sync GSVSentence.parse()? checkRefresh() is already synced though. // 0. Get StringTokenizer to read info from NMEASentence: StringTokenizer st = new StringTokenizer(s, ","); st.nextToken(); // Skip header $GPGSV // 1.1 Find out how many sentences in sequence. gsvSentenceTotal = Integer.parseInt(st.nextToken()); // 1.2 Find out which sentence this is. gsvSentenceNumber = Integer.parseInt(st.nextToken()); // 2. Assign sentence to GSVSentence in order. gsvSentence.setSentence(s, gsvSentenceNumber, gsvSentenceTotal); // 3. If last sentence: if (gsvSentenceTotal == gsvSentenceNumber) { // 3a. setSentence() to last one so it is not null gsvSentence.setSentence(s); // 3b. Notify GPSListener notifyListeners(this.gsvSentence); } } else super.sentenceChooser(header, s); // Check superclass sentences. }
/** Update Date values */ private void updateDate() { int dateStamp = rmcSentence.getDate(); if (dateStamp > 0) { String rd = Integer.toString(dateStamp); int dd = Integer.parseInt(rd.substring(0, rd.length() - 4)); int mm = Integer.parseInt(rd.substring(rd.length() - 4, rd.length() - 2)); int yy = Integer.parseInt(rd.substring(rd.length() - 2, rd.length())); date.setDay(dd); date.setMonth(mm); date.setYear(yy); } }
/** * Return Compass Degrees in a range: 0.0-359.9 * * @return the compass degrees */ public float getCompassDegrees() { return rmcSentence.getCompassDegrees(); }