public class SentenceParser extends Object implements Sentence
Base class for all NMEA 0183 sentence parsers. Contains generic methods such as data field setters and getters, data formatting, validation etc.
NMEA 0183 data is transmitted in form of ASCII Strings that are called
sentences. Each sentence starts with a '$', a two letter
talker ID, a three letter sentence ID, followed by a number
of comma separated data fields, optional checksum and a
carriage return/line feed terminator (CR/LF
). Sentence may
contain up to 82 characters including the CR/LF
. If data for
certain field is not available, the field value is simply omitted, but the
commas that would delimit it are still sent, with no space between them.
Sentence structure:
$<id>,<field #0>,<field #1>,...,<field #n>*<checksum>(CR/LF)
For more details, see NMEA Revealed by Eric S. Raymond.
This class can also be used to implement and integrate parsers not provided
by in the library. See SentenceFactory
for more instructions.
ALTERNATIVE_BEGIN_CHAR, BEGIN_CHAR, CHECKSUM_DELIMITER, FIELD_DELIMITER, MAX_LENGTH, TERMINATOR
Modifier | Constructor and Description |
---|---|
protected |
SentenceParser(char begin,
TalkerId tid,
SentenceId sid,
int size)
Creates a new empty sentence with specified begin char, talker id,
sentence id and number of fields.
|
protected |
SentenceParser(char begin,
TalkerId talker,
String type,
int size)
Creates a new empty sentence with specified begin char, talker id,
sentence id and number of fields.
|
|
SentenceParser(String nmea)
Creates a new instance of SentenceParser.
|
protected |
SentenceParser(String nmea,
String type)
Creates a new instance of SentenceParser.
|
protected |
SentenceParser(TalkerId talker,
String type,
int size)
Creates a new empty sentence with specified talker and sentence IDs.
|
Modifier and Type | Method and Description |
---|---|
boolean |
equals(Object obj) |
char |
getBeginChar()
Get the sentence begin character.
|
protected char |
getCharValue(int index)
Parse a single character from the specified sentence field.
|
protected double |
getDoubleValue(int index)
Parse double value from the specified sentence field.
|
int |
getFieldCount()
Returns the current number of data fields in sentence, excluding ID field
and checksum.
|
protected int |
getIntValue(int index)
Parse integer value from the specified sentence field.
|
String |
getSentenceId()
Get the sentence ID that specifies the sentence type and data it holds.
|
protected String |
getStringValue(int index)
Get contents of a data field as a String.
|
TalkerId |
getTalkerId()
Gets the talker ID of the sentence.
|
int |
hashCode() |
protected boolean |
hasValue(int index)
Tells is if the field specified by the given index contains a value.
|
boolean |
isAISSentence()
Tells if this is an AIS sentence.
|
boolean |
isProprietary()
Tells if the sentence is of proprietary format.
|
boolean |
isValid()
Tells if the sentence formatting matches NMEA 0183 format.
|
void |
reset()
Resets the sentence contents, i.e. removes all existing values from data
fields.
|
void |
setBeginChar(char ch)
Set the sentence begin character.
|
protected void |
setCharValue(int index,
char value)
Set a character in specified field.
|
protected void |
setDegreesValue(int index,
double deg)
Set degrees value, e.g. course or heading.
|
protected void |
setDoubleValue(int index,
double value)
Set double value in specified field.
|
protected void |
setDoubleValue(int index,
double value,
int leading,
int decimals)
Set double value in specified field, with given number of digits before
and after the decimal separator ('.').
|
protected void |
setFieldCount(int size)
Sets the number of sentence data fields.
|
protected void |
setIntValue(int index,
int value)
Set integer value in specified field.
|
protected void |
setIntValue(int index,
int value,
int leading)
Set integer value in specified field, with specified minimum number of
digits.
|
protected void |
setStringValue(int index,
String value)
Set String value in specified data field.
|
protected void |
setStringValues(int first,
String[] newFields)
Replace multiple fields with given String array, starting at the
specified index.
|
void |
setTalkerId(TalkerId id)
Set the talker ID of the sentence.
|
String |
toSentence()
Formats and validates the String representation of sentence.
|
String |
toSentence(int maxLength)
Formats and validates the sentence like
Sentence.toSentence() , but checks
also that resulting String does not exceed specified length. |
String |
toString()
Returns the String representation of the sentence, without line
terminator
CR/LR . |
public SentenceParser(String nmea)
nmea
- A valid NMEA 0183 sentenceIllegalArgumentException
- If the specified sentence is invalid or
if sentence type is not supported.protected SentenceParser(char begin, TalkerId tid, SentenceId sid, int size)
begin
- Begin char, $ or !tid
- TalkerId to setsid
- SentenceId to setsize
- Number of sentence data fieldsprotected SentenceParser(char begin, TalkerId talker, String type, int size)
begin
- The begin character, e.g. '$' or '!'talker
- TalkerId to settype
- Sentence id as String, e.g. "GGA or "GLL".size
- Number of sentence data fieldsprotected SentenceParser(String nmea, String type)
nmea
contains a valid NMEA 0183 sentence of the
specified type
.
For example, GGA sentence parser should specify "GGA" as the type.
nmea
- NMEA 0183 sentence Stringtype
- Expected type of the sentence in nmea
parameterIllegalArgumentException
- If the specified sentence is not a valid
or is not of expected type.public final char getBeginChar()
Sentence
getBeginChar
in interface Sentence
public final int getFieldCount()
Sentence
getFieldCount
in interface Sentence
public final String getSentenceId()
Sentence
$GPGGA
the method returns SentenceId.GGA
.getSentenceId
in interface Sentence
SentenceId
public final TalkerId getTalkerId()
Sentence
$
in sentence address field. For example, in case of
$GPGGA
, the method returns TalkerId.GP
.getTalkerId
in interface Sentence
public boolean isAISSentence()
Sentence
isAISSentence
in interface Sentence
public boolean isProprietary()
Sentence
isProprietary
in interface Sentence
public boolean isValid()
Sentence
public final void reset()
Sentence
public void setBeginChar(char ch)
Sentence
setBeginChar
in interface Sentence
ch
- Sentence begin char to set ('$' or '!')Sentence.BEGIN_CHAR
,
Sentence.ALTERNATIVE_BEGIN_CHAR
public final void setTalkerId(TalkerId id)
Sentence
setTalkerId
in interface Sentence
id
- TalkerId to setpublic final String toSentence()
Sentence
SentenceValidator
, notice
that resulting sentence length is not checked. To also validate the
length, use Sentence.toSentence(int)
.toSentence
in interface Sentence
toString()
.Sentence.toString()
public final String toSentence(int maxLength)
Sentence
Sentence.toSentence()
, but checks
also that resulting String does not exceed specified length.toSentence
in interface Sentence
toString()
.Sentence.toSentence()
,
Sentence.MAX_LENGTH
public String toString()
Sentence
CR/LR
. Checksum is calculated and appended at the
end of the sentence, but no validation is done. Use Sentence.toSentence()
to also validate the result.protected final char getCharValue(int index)
index
- Data field index in sentenceParseException
- If field contains more
than one characterprotected final double getDoubleValue(int index)
index
- Data field index in sentenceDouble.parseDouble(String)
protected final int getIntValue(int index)
index
- Field index in sentenceInteger.parseInt(String)
protected final String getStringValue(int index)
$GPGGA
) and checksum at the end are
not considered as a data fields and cannot therefore be fetched with this
method.
Field indexing, let i = 1:
$<id>,<i>,<i+1>,<i+2>,...,<i+n>*<checksum>
index
- Field indexDataNotAvailableException
- If the field is
emptyprotected final boolean hasValue(int index)
index
- Field indexprotected final void setCharValue(int index, char value)
index
- Field indexvalue
- Value to setprotected final void setDegreesValue(int index, double deg)
index
- Field index where to insert valuedeg
- The degrees value to setIllegalArgumentException
- If degrees value out of range [0..360]protected final void setDoubleValue(int index, double value)
index
- Field indexvalue
- Value to setsetDoubleValue(int, double, int, int)
protected final void setDoubleValue(int index, double value, int leading, int decimals)
index
- Field indexvalue
- Value to setleading
- Number of digits before decimal separatordecimals
- Maximum number of digits after decimal separatorsetDoubleValue(int, double)
protected final void setFieldCount(int size)
getFieldCount()
.size
- Number of data fields, must be greater than zero.protected final void setIntValue(int index, int value)
index
- Field indexvalue
- Value to setprotected final void setIntValue(int index, int value, int leading)
index
- Field indexvalue
- Value to setleading
- Number of digits to use.protected final void setStringValue(int index, String value)
index
- Field indexvalue
- String to set, null
converts to empty String.protected final void setStringValues(int first, String[] newFields)
first
is zero, all sentence
fields are replaced.
If the length of newFields
does not fit in the sentence
field count or it contains less values, fields are removed or added
accordingly. As the result, total number of fields may increase or
decrease. Thus, if the sentence field count must not change, you may need
to add empty Strings to newFields
in order to preserve the
original number of fields. Also, all existing values after
first
are lost.
first
- Index of first field to setnewFields
- Array of Strings to setCopyright (C) 2010-2017 Java Marine API authors. All Rights Reserved.