8std::unique_ptr<PGN128259> PGN128259::create(std::unique_ptr<Message2000> baseMessage) {
9 if (baseMessage->getCanFrameLength() != 8) {
10 std::string context =
"PGN128259::create()";
11 NMEALIB_RETURN_ERROR(InvalidCanFrameException(context,
"CAN frame must be 8 bytes for PGN128259"));
14 uint8_t sequenceId = baseMessage->getCanFrame()[0];
15 Speed speedWaterReferenced =
Speed::fromRaw(baseMessage->getCanFrame()[1] | (baseMessage->getCanFrame()[2] << 8));
16 Speed speedGroundReferenced =
Speed::fromRaw(baseMessage->getCanFrame()[3] | (baseMessage->getCanFrame()[4] << 8));
22 return std::unique_ptr<PGN128259>(
new PGN128259(std::move(*baseMessage),
25 speedGroundReferenced,
26 speedWaterReferencedType,
32PGN128259::PGN128259(Message2000 baseMessage,
34 Speed speedWaterReferenced,
35 Speed speedGroundReferenced,
36 Byte speedWaterReferencedType,
40 Message2000(std::move(baseMessage)),
41 sequenceId_(sequenceId),
42 speedWaterReferenced_(speedWaterReferenced),
43 speedGroundReferenced_(speedGroundReferenced),
44 speedWaterReferencedType_(speedWaterReferencedType),
45 speedDirection_(speedDirection),
46 reserved1_(reserved1),
47 reserved2_(reserved2) {}
49PGN128259::PGN128259(uint8_t sequenceId,
50 Speed speedWaterReferenced,
51 Speed speedGroundReferenced,
52 Byte speedWaterReferencedType,
58 speedGroundReferenced,
59 speedWaterReferencedType,
63 sequenceId_(sequenceId),
64 speedWaterReferenced_(speedWaterReferenced),
65 speedGroundReferenced_(speedGroundReferenced),
66 speedWaterReferencedType_(speedWaterReferencedType),
67 speedDirection_(speedDirection),
68 reserved1_(reserved1),
69 reserved2_(reserved2) {}
73 return std::unique_ptr<PGN128259>(
new PGN128259(*
this));
77 std::ostringstream oss;
80 oss << this->toString(
true);
83 oss <<
"\tSequence ID: " <<
static_cast<int>(sequenceId_) <<
"\n";
84 oss <<
"\tSpeed Water Referenced: " << speedWaterReferenced_.toString() <<
" m/s\n";
85 oss <<
"\tSpeed Ground Referenced: " << speedGroundReferenced_.toString() <<
" m/s\n";
86 oss <<
"\tSpeed Water Referenced Type: ";
87 switch (speedWaterReferencedType_.getValue()) {
88 case 0: oss <<
"Paddle";
break;
89 case 1: oss <<
"Pitot";
break;
90 case 2: oss <<
"Doppler";
break;
91 case 3: oss <<
"Correlation";
break;
92 case 4: oss <<
"EM";
break;
93 default: oss <<
"Unavailable/Reserved";
break;
96 oss <<
"\tSpeed Direction: ";
97 if (speedDirection_.getValue() == 0b00) oss <<
"Forward";
98 else if (speedDirection_.getValue() == 0b01) oss <<
"Reverse";
99 else oss <<
"Unavailable/Reserved";
102 oss << this->toString(
false);
103 oss <<
"SeqID=" <<
static_cast<int>(sequenceId_)
104 <<
" SpeedWater=" << speedWaterReferenced_.toString() <<
"m/s"
105 <<
" SpeedGround=" << speedGroundReferenced_.toString() <<
"m/s"
106 <<
" WaterRefType=" <<
static_cast<int>(speedWaterReferencedType_.getValue())
108 if (speedDirection_.getValue() == 0b00) oss <<
"F";
109 else if (speedDirection_.getValue() == 0b01) oss <<
"R";
115std::string PGN128259::rawPayload(uint8_t sequenceId,
116 Speed speedWaterReferenced,
117 Speed speedGroundReferenced,
118 Byte speedWaterReferencedType,
122 std::vector<uint8_t> canFrame(8, 0);
123 canFrame[0] = sequenceId;
124 canFrame[1] = speedWaterReferenced.
getRaw() & 0xFF;
125 canFrame[2] = (speedWaterReferenced.
getRaw() >> 8) & 0xFF;
126 canFrame[3] = speedGroundReferenced.
getRaw() & 0xFF;
127 canFrame[4] = (speedGroundReferenced.
getRaw() >> 8) & 0xFF;
128 canFrame[5] = speedWaterReferencedType.
getRaw();
130 canFrame[6] = (reserved2.
getRaw() << 4) | (speedDirection.
getRaw() & 0x0F);
132 canFrame[7] = reserved1.
getRaw();
136 const uint32_t canId = (128259U << 8U);
137 std::ostringstream oss;
138 oss << std::hex << std::uppercase << std::setfill(
'0');
139 oss << std::setw(8) << canId <<
":";
140 for (uint8_t b : canFrame) {
141 oss << std::setw(2) << static_cast<int>(b);
151 return speedWaterReferenced_;
155 return speedGroundReferenced_;
159 return speedWaterReferencedType_;
163 return speedDirection_;
176 sequenceId_ == other.sequenceId_ &&
177 speedWaterReferenced_ == other.speedWaterReferenced_ &&
178 speedGroundReferenced_ == other.speedGroundReferenced_ &&
179 speedWaterReferencedType_ == other.speedWaterReferencedType_ &&
180 speedDirection_ == other.speedDirection_ &&
181 reserved1_ == other.reserved1_ &&
182 reserved2_ == other.reserved2_;
RawType getRaw() const noexcept
Converts physical value to raw integer representation.
static constexpr DataType fromRaw(RawType raw) noexcept
Constructs from a raw value.
Represents a generic NMEA 2000 message encapsulating a CAN frame.
virtual bool operator==(const Message2000 &other) const noexcept
Strongly-typed class representing PGN 128259 - Speed, Water Referenced.
std::string getStringContent(bool verbose) const noexcept override
Returns a human-readable string representation of the message.
Speed getSpeedGroundReferenced() const noexcept
bool operator==(const PGN128259 &other) const noexcept
HalfByte getReserved2() const noexcept
uint8_t getSequenceId() const noexcept
Speed getSpeedWaterReferenced() const noexcept
std::unique_ptr< nmealib::Message > clone() const override
Creates a polymorphic deep copy of this Message2000.
PGN128259(uint8_t sequenceId, Speed speedWaterReferenced, Speed speedGroundReferenced, Byte speedWaterReferencedType, HalfByte speedDirection, Byte reserved1=Byte::fromValue(0U), HalfByte reserved2=HalfByte::fromValue(0U))
Byte getSpeedWaterReferencedType() const noexcept
Byte getReserved1() const noexcept
HalfByte getSpeedDirection() const noexcept
#define NMEALIB_RETURN_ERROR(exceptionExpr)
DataType< SpeedTraits > Speed
Custom type representing speeds in meters per second.
DataType< ByteTraits > Byte
Custom type representing 8 bits of data (0-255).
DataType< HalfByteTraits > HalfByte
Custom type representing 4 bits of data (0-15).