Summary Files Commits Branches @commit @diff @stats
path: root / src / frame.cpp
blob: ab8a5f378d053f188e24a826768926d7ba777a80 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
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;
}