nmealib 0.0.4
NMEA 0183/NMEA 2000 parsing library
Loading...
Searching...
No Matches
PGN128001.cpp
Go to the documentation of this file.
2
4
5namespace nmealib {
6namespace nmea2000 {
7
8std::unique_ptr<PGN128001> PGN128001::create(std::unique_ptr<Message2000> baseMessage) {
9 if (baseMessage->getCanFrameLength() != 8) {
10 std::string context = "PGN128001::create()";
11 NMEALIB_RETURN_ERROR(InvalidCanFrameException(context, "CAN frame must be 8 bytes for PGN128001"));
12 }
13
14 const uint8_t sequenceId = baseMessage->getCanFrame()[0];
15 const Acceleration longitudinalAcceleration =
16 Acceleration::fromRaw(static_cast<int16_t>(static_cast<uint16_t>(baseMessage->getCanFrame()[1]) |
17 (static_cast<uint16_t>(baseMessage->getCanFrame()[2]) << 8)));
18 const Acceleration transverseAcceleration =
19 Acceleration::fromRaw(static_cast<int16_t>(static_cast<uint16_t>(baseMessage->getCanFrame()[3]) |
20 (static_cast<uint16_t>(baseMessage->getCanFrame()[4]) << 8)));
21 const Acceleration verticalAcceleration =
22 Acceleration::fromRaw(static_cast<int16_t>(static_cast<uint16_t>(baseMessage->getCanFrame()[5]) |
23 (static_cast<uint16_t>(baseMessage->getCanFrame()[6]) << 8)));
24 const Byte reserved = Byte::fromRaw(baseMessage->getCanFrame()[7]);
25
26 return std::unique_ptr<PGN128001>(new PGN128001(std::move(*baseMessage),
27 sequenceId,
28 longitudinalAcceleration,
29 transverseAcceleration,
30 verticalAcceleration,
31 reserved));
32}
33
34PGN128001::PGN128001(Message2000 baseMessage,
35 uint8_t sequenceId,
36 Acceleration longitudinalAcceleration,
37 Acceleration transverseAcceleration,
38 Acceleration verticalAcceleration,
39 Byte reserved) noexcept :
40 Message2000(std::move(baseMessage)),
41 sequenceId_(sequenceId),
42 longitudinalAcceleration_(longitudinalAcceleration),
43 transverseAcceleration_(transverseAcceleration),
44 verticalAcceleration_(verticalAcceleration),
45 reserved_(reserved) {}
46
47PGN128001::PGN128001(uint8_t sequenceId,
48 Acceleration longitudinalAcceleration,
49 Acceleration transverseAcceleration,
50 Acceleration verticalAcceleration,
51 Byte reserved) noexcept :
52 Message2000(*Message2000::create(rawPayload(sequenceId,
53 longitudinalAcceleration,
54 transverseAcceleration,
55 verticalAcceleration,
56 reserved))),
57 sequenceId_(sequenceId),
58 longitudinalAcceleration_(longitudinalAcceleration),
59 transverseAcceleration_(transverseAcceleration),
60 verticalAcceleration_(verticalAcceleration),
61 reserved_(reserved) {}
62
63std::unique_ptr<Message> PGN128001::clone() const {
64 return std::unique_ptr<PGN128001>(new PGN128001(*this));
65}
66
67std::string PGN128001::getStringContent(bool verbose) const noexcept {
68 std::ostringstream oss;
69
70 if (verbose) {
71 oss << this->toString(true);
72 oss << "\n";
73 oss << "Fields:\n";
74 oss << "\tSequence ID: " << static_cast<int>(sequenceId_) << "\n";
75 oss << "\tLongitudinal Acceleration: " << longitudinalAcceleration_.toString() << " m/s^2"
76 << " (" << getLongitudinalAccelerationG() << " g)\n";
77 oss << "\tTransverse Acceleration: " << transverseAcceleration_.toString() << " m/s^2"
78 << " (" << getTransverseAccelerationG() << " g)\n";
79 oss << "\tVertical Acceleration: " << verticalAcceleration_.toString() << " m/s^2"
80 << " (" << getVerticalAccelerationG() << " g)\n";
81 oss << "\tReserved: " << static_cast<int>(reserved_.getValue()) << "\n";
82 } else {
83 oss << this->toString(false);
84 oss << "SeqID=" << static_cast<int>(sequenceId_)
85 << " Long=" << longitudinalAcceleration_.toString() << "m/s^2"
86 << " Trans=" << transverseAcceleration_.toString() << "m/s^2"
87 << " Vert=" << verticalAcceleration_.toString() << "m/s^2";
88 }
89
90 return oss.str();
91}
92
93std::string PGN128001::rawPayload(uint8_t sequenceId,
94 Acceleration longitudinalAcceleration,
95 Acceleration transverseAcceleration,
96 Acceleration verticalAcceleration,
97 Byte reserved) {
98 std::vector<uint8_t> canFrame(8, 0);
99 canFrame[0] = sequenceId;
100
101 const uint16_t rawLongitudinal = static_cast<uint16_t>(longitudinalAcceleration.getRaw());
102 const uint16_t rawTransverse = static_cast<uint16_t>(transverseAcceleration.getRaw());
103 const uint16_t rawVertical = static_cast<uint16_t>(verticalAcceleration.getRaw());
104
105 canFrame[1] = static_cast<uint8_t>(rawLongitudinal & 0xFFU);
106 canFrame[2] = static_cast<uint8_t>((rawLongitudinal >> 8) & 0xFFU);
107 canFrame[3] = static_cast<uint8_t>(rawTransverse & 0xFFU);
108 canFrame[4] = static_cast<uint8_t>((rawTransverse >> 8) & 0xFFU);
109 canFrame[5] = static_cast<uint8_t>(rawVertical & 0xFFU);
110 canFrame[6] = static_cast<uint8_t>((rawVertical >> 8) & 0xFFU);
111 canFrame[7] = reserved.getRaw();
112
113 const uint32_t canId = (128001U << 8U);
114 std::ostringstream oss;
115 oss << std::hex << std::uppercase << std::setfill('0');
116 oss << std::setw(8) << canId << ":";
117 for (uint8_t b : canFrame) {
118 oss << std::setw(2) << static_cast<int>(b);
119 }
120 return oss.str();
121}
122
123uint8_t PGN128001::getSequenceId() const noexcept {
124 return sequenceId_;
125}
126
128 return longitudinalAcceleration_;
129}
130
132 return transverseAcceleration_;
133}
134
136 return verticalAcceleration_;
137}
138
140 return longitudinalAcceleration_.getValue() / 9.80665f;
141}
142
144 return transverseAcceleration_.getValue() / 9.80665f;
145}
146
148 return verticalAcceleration_.getValue() / 9.80665f;
149}
150
151bool PGN128001::operator==(const PGN128001& other) const noexcept {
152 return Message2000::operator==(other) &&
153 sequenceId_ == other.sequenceId_ &&
154 longitudinalAcceleration_ == other.longitudinalAcceleration_ &&
155 transverseAcceleration_ == other.transverseAcceleration_ &&
156 verticalAcceleration_ == other.verticalAcceleration_ &&
157 reserved_ == other.reserved_;
158}
159
160} // namespace nmea2000
161} // namespace nmealib
RawType getRaw() const noexcept
Converts physical value to raw integer representation.
Definition dataTypes.h:128
static constexpr DataType fromRaw(RawType raw) noexcept
Constructs from a raw value.
Definition dataTypes.h:97
constexpr TargetType getValue() const noexcept
Returns the normalized physical value.
Definition dataTypes.h:113
Represents a generic NMEA 2000 message encapsulating a CAN frame.
Definition nmea2000.h:62
static std::unique_ptr< Message2000 > create(std::string raw, TimePoint ts=std::chrono::system_clock::now())
Protected factory — parses "CANID:data" (and variant formats) into a Message2000.
Definition nmea2000.cpp:109
virtual bool operator==(const Message2000 &other) const noexcept
Definition nmea2000.cpp:401
Strongly-typed class representing PGN 128001 - Vessel Acceleration.
Definition PGN128001.h:26
Acceleration getLongitudinalAcceleration() const noexcept
std::string getStringContent(bool verbose) const noexcept override
Returns a human-readable string representation of the message.
Definition PGN128001.cpp:67
float getTransverseAccelerationG() const noexcept
bool operator==(const PGN128001 &other) const noexcept
float getLongitudinalAccelerationG() const noexcept
Acceleration getTransverseAcceleration() const noexcept
Acceleration getVerticalAcceleration() const noexcept
uint8_t getSequenceId() const noexcept
std::unique_ptr< nmealib::Message > clone() const override
Creates a polymorphic deep copy of this Message2000.
Definition PGN128001.cpp:63
float getVerticalAccelerationG() const noexcept
PGN128001(uint8_t sequenceId, Acceleration longitudinalAcceleration, Acceleration transverseAcceleration, Acceleration verticalAcceleration, Byte reserved=Byte::fromRaw(255)) noexcept
Definition PGN128001.cpp:47
#define NMEALIB_RETURN_ERROR(exceptionExpr)
DataType< AccelerationTraits > Acceleration
Custom type representing accelerations in meters per second squared.
Definition dataTypes.h:408
DataType< ByteTraits > Byte
Custom type representing 8 bits of data (0-255).
Definition dataTypes.h:330