13std::unique_ptr<HDG> HDG::create(std::unique_ptr<Message0183> baseMessage) {
14 std::string context =
"HDG::create";
15 if (baseMessage->getSentenceType() !=
"HDG") {
16 NMEALIB_RETURN_ERROR(NotHDGException(context,
"Expected sentence type 'HDG', got " + baseMessage->getSentenceType()));
19 std::string payload = baseMessage->getPayload();
20 std::istringstream ss(payload);
22 std::vector<std::string> fields;
24 while (std::getline(ss, token,
',')) {
25 fields.push_back(token);
28 if (!payload.empty() && payload.back() ==
',') {
32 if (!fields.empty()) {
33 fields.erase(fields.begin());
36 if (fields.size() != 5) {
37 NMEALIB_RETURN_ERROR(NotHDGException(context,
"Invalid fields in HDG payload: expected 5, got " + std::to_string(fields.size()) +
". Payload: " + payload));
40 double magneticHeading = 0.0;
41 double magneticDeviation = 0.0;
42 double magneticVariation = 0.0;
49 char deviationDirection = fields[2].empty() ?
'\0' : fields[2][0];
50 char variationDirection = fields[4].empty() ?
'\0' : fields[4][0];
52 return std::unique_ptr<HDG>(
new HDG(std::move(*baseMessage),
60HDG::HDG(Message0183 baseMessage,
61 double magneticHeading,
62 double magneticDeviation,
63 char deviationDirection,
64 double magneticVariation,
65 char variationDirection) noexcept
66 : Message0183(std::move(baseMessage)),
67 magneticHeading_(magneticHeading),
68 magneticDeviation_(magneticDeviation),
69 deviationDirection_(deviationDirection),
70 magneticVariation_(magneticVariation),
71 variationDirection_(variationDirection) {}
73HDG::HDG(std::string talkerId,
74 double magneticHeading,
75 double magneticDeviation,
76 char deviationDirection,
77 double magneticVariation,
78 char variationDirection)
84 variationDirection))),
85 magneticHeading_(magneticHeading),
86 magneticDeviation_(magneticDeviation),
87 deviationDirection_(deviationDirection),
88 magneticVariation_(magneticVariation),
89 variationDirection_(variationDirection) {}
92 return std::unique_ptr<HDG>(
new HDG(*
this));
96 std::ostringstream ss;
97 ss << this->toString(verbose);
98 ss << std::fixed << std::setprecision(1);
99 const char deviationDirection = (deviationDirection_ ==
'\0') ?
'-' : deviationDirection_;
100 const char variationDirection = (variationDirection_ ==
'\0') ?
'-' : variationDirection_;
103 ss <<
"\tMagnetic Heading: " << magneticHeading_ <<
"\n";
104 ss <<
"\tMagnetic Deviation: " << magneticDeviation_ <<
" " << deviationDirection <<
"\n";
105 ss <<
"\tMagnetic Variation: " << magneticVariation_ <<
" " << variationDirection <<
"\n";
107 ss <<
"HeadingM=" << magneticHeading_
108 <<
", Dev=" << magneticDeviation_ << deviationDirection
109 <<
", Var=" << magneticVariation_ << variationDirection;
115std::string HDG::composeRaw(
const std::string& talkerId,
116 double magneticHeading,
117 double magneticDeviation,
118 char deviationDirection,
119 double magneticVariation,
120 char variationDirection) {
121 std::ostringstream payloadStream;
122 payloadStream << talkerId <<
"HDG,";
123 payloadStream << std::fixed << std::setprecision(1) << magneticHeading <<
",";
124 payloadStream << std::fixed << std::setprecision(1) << magneticDeviation <<
",";
125 payloadStream << deviationDirection <<
",";
126 payloadStream << std::fixed << std::setprecision(1) << magneticVariation <<
",";
127 payloadStream << variationDirection;
129 std::string payload = payloadStream.str();
130 return "$" + payload +
"\r\n";
134 return magneticHeading_;
138 return magneticDeviation_;
142 return deviationDirection_;
146 return magneticVariation_;
150 return variationDirection_;
Represents a parsed NMEA 0183 HDG (Heading, Deviation & Variation) sentence.
bool operator==(const HDG &other) const noexcept
double getMagneticVariation() const noexcept
std::unique_ptr< nmealib::Message > clone() const override
Creates a polymorphic deep copy of this message.
std::string getStringContent(bool verbose) const noexcept override
Returns a human-readable string representation of the message content.
char getVariationDirection() const noexcept
double getMagneticDeviation() const noexcept
char getDeviationDirection() const noexcept
double getMagneticHeading() const noexcept
HDG(std::string talkerId, double magneticHeading, double magneticDeviation, char deviationDirection, double magneticVariation, char variationDirection)
Construct an HDG message from individual field values.
Represents an NMEA 0183 sentence.
bool operator==(const Message0183 &other) const noexcept
Compares two Message0183 objects for equality based on their content and timestamp.
#define NMEALIB_RETURN_ERROR(exceptionExpr)
bool parseOptionalDouble(const std::string &text, double &value) noexcept