Summary Files Commits Branches @commit @diff @stats
path: root / src / frame.cpp
diff options
context:
space:
mode:
Commitb3ec912b0594fbcfe9a33b0372884219862aef1b (patch)
Author
 Syndamia <kamen@syndamia.com>
2025-07-03 14:34:11 +0300
Committer
 Syndamia <kamen@syndamia.com>
2025-07-03 14:34:11 +0300
Files34cac8ae9eb4d812d88603c208a45b85770264a3 /src/frame.cpp
iso-tp-parser-carista-b3ec912b0594fbcfe9a33b0372884219862aef1b.tar
iso-tp-parser-carista-b3ec912b0594fbcfe9a33b0372884219862aef1b.tar.gz
iso-tp-parser-carista-b3ec912b0594fbcfe9a33b0372884219862aef1b.zip
Parent9d5eda5b08aef00ebe1698609a51ffe249f0a88e (diff)
feat(frame): Implemented frame class
Recieves a hex string, containing all frame data and stores it as something more useful
1 files changed, 65 insertions, 0 deletions
-rw-r--r--src/frame.cpp65
diff --git a/src/frame.cpp b/src/frame.cpp
new file mode 100644
index 0000000..ab8a5f3
--- /dev/null
+++ b/src/frame.cpp
@@ -0,0 +1,65 @@
+#include "frame.h"
+
+unsigned char hex_byte_to_byte(unsigned char byte) {
+ if (byte >= 'a' && byte <= 'f') return byte - 'a' + 10;
+ if (byte >= 'A' && byte <= 'F') return byte - 'A' + 10;
+ if (byte >= '0' && byte <= '9') return byte - '0';
+ throw std::invalid_argument("Character isn't a hex value!");
+}
+
+unsigned char hex_value_to_byte(const unsigned char* hex) {
+ return (hex_byte_to_byte(hex[0]) << 4) | hex_byte_to_byte(hex[1]);
+}
+
+unsigned char next_hex_byte(const unsigned char*& iso_tp_frame) {
+ if (*iso_tp_frame == '\0')
+ throw "Bad";
+
+ char byte = hex_value_to_byte(iso_tp_frame);
+ iso_tp_frame += 2;
+ return byte;
+}
+
+// b0 b1 b2 b3 b4 b5 b6 b7
+// 02 10 C0 00 00 00 00 00
+void Frame::parse_frame_str(const unsigned char* iso_tp_frame) {
+ unsigned char byte0 = next_hex_byte(iso_tp_frame);
+
+ this->type = (FrameType)((byte0 & 0b11110000) >> 4);
+ this->size = byte0 & 0b00001111;
+
+ switch (this->type) {
+ // Single frame
+ case SF: this->data_size = size;
+ break;
+
+ // First frame
+ case FF: {
+ unsigned char byte1 = next_hex_byte(iso_tp_frame);
+ this->size = (this->size << 8) | byte1;
+ this->data_size = 6;
+ }
+ break;
+
+ // Consecutive frame
+ case CF: this->data_size = 7;
+ break;
+
+ // Flow control frame (ignore)
+ case FC: this->data_size = 0;
+ this->size = 0;
+ break;
+ }
+
+ this->data = (unsigned char*)malloc(sizeof(unsigned char) * this->data_size);
+ for (int i = 0; i < this->data_size; ++i) {
+ this->data[i] = next_hex_byte(iso_tp_frame);
+ }
+}
+
+std::ostream& operator<<(std::ostream& os, const Frame& f) {
+ for (int i = 0; i < f.data_size; ++i) {
+ os << (unsigned)f.data[i];
+ }
+ return os;
+}