S5info_H14
/
APP3
Problematique
trame.hpp@4:2af360b178d2, 2014-02-12 (annotated)
- Committer:
- joGenie
- Date:
- Wed Feb 12 21:50:47 2014 +0000
- Revision:
- 4:2af360b178d2
- Parent:
- 3:65845faafbb1
ss;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
RufflesAllD | 2:db7c8378b324 | 1 | #include <bitset> |
RufflesAllD | 2:db7c8378b324 | 2 | #include "lib_crc.h" |
RufflesAllD | 2:db7c8378b324 | 3 | |
RufflesAllD | 2:db7c8378b324 | 4 | using namespace std; |
RufflesAllD | 2:db7c8378b324 | 5 | |
RufflesAllD | 2:db7c8378b324 | 6 | struct trame |
RufflesAllD | 2:db7c8378b324 | 7 | { |
RufflesAllD | 2:db7c8378b324 | 8 | int length; |
RufflesAllD | 2:db7c8378b324 | 9 | string text; |
RufflesAllD | 2:db7c8378b324 | 10 | |
RufflesAllD | 2:db7c8378b324 | 11 | bitset<8> preambule; |
RufflesAllD | 2:db7c8378b324 | 12 | bitset<8> start_end; |
RufflesAllD | 2:db7c8378b324 | 13 | bitset<8> type_flag; |
RufflesAllD | 2:db7c8378b324 | 14 | bitset<8> charge_utile; |
RufflesAllD | 2:db7c8378b324 | 15 | bitset<640> message; |
RufflesAllD | 2:db7c8378b324 | 16 | bitset<16> crc16; |
RufflesAllD | 2:db7c8378b324 | 17 | |
RufflesAllD | 2:db7c8378b324 | 18 | trame(string msg): |
RufflesAllD | 2:db7c8378b324 | 19 | length(msg.length()*8), |
RufflesAllD | 2:db7c8378b324 | 20 | preambule(0x55), |
RufflesAllD | 2:db7c8378b324 | 21 | start_end(0x7E), |
RufflesAllD | 2:db7c8378b324 | 22 | type_flag(0x0), |
RufflesAllD | 2:db7c8378b324 | 23 | charge_utile(msg.length()), |
RufflesAllD | 2:db7c8378b324 | 24 | crc16(calculate_crc16(const_cast<char*>(msg.c_str()), msg.length())) |
RufflesAllD | 2:db7c8378b324 | 25 | { |
RufflesAllD | 2:db7c8378b324 | 26 | string temp = ""; |
RufflesAllD | 2:db7c8378b324 | 27 | |
RufflesAllD | 2:db7c8378b324 | 28 | for (int i = 0; i < msg.length(); i++) |
RufflesAllD | 2:db7c8378b324 | 29 | { |
RufflesAllD | 2:db7c8378b324 | 30 | temp += bitset<8>(msg.c_str()[i]).to_string<char, string::traits_type, string::allocator_type>(); |
RufflesAllD | 2:db7c8378b324 | 31 | } |
RufflesAllD | 2:db7c8378b324 | 32 | message = bitset<640>(temp) << (640 - msg.length()*8); |
RufflesAllD | 2:db7c8378b324 | 33 | } |
RufflesAllD | 2:db7c8378b324 | 34 | |
RufflesAllD | 2:db7c8378b324 | 35 | trame(bitset<696> bit) |
RufflesAllD | 2:db7c8378b324 | 36 | { |
RufflesAllD | 2:db7c8378b324 | 37 | bool startFound = false; |
RufflesAllD | 2:db7c8378b324 | 38 | int count = 0; |
RufflesAllD | 2:db7c8378b324 | 39 | while (!startFound) |
RufflesAllD | 2:db7c8378b324 | 40 | { |
RufflesAllD | 2:db7c8378b324 | 41 | if (bit.test(695-count)) |
RufflesAllD | 2:db7c8378b324 | 42 | { |
RufflesAllD | 2:db7c8378b324 | 43 | startFound = true; |
RufflesAllD | 2:db7c8378b324 | 44 | } |
RufflesAllD | 2:db7c8378b324 | 45 | else |
RufflesAllD | 2:db7c8378b324 | 46 | { |
RufflesAllD | 2:db7c8378b324 | 47 | count++; |
RufflesAllD | 2:db7c8378b324 | 48 | } |
RufflesAllD | 2:db7c8378b324 | 49 | } |
RufflesAllD | 2:db7c8378b324 | 50 | bit = bit << count - 1; |
RufflesAllD | 2:db7c8378b324 | 51 | |
RufflesAllD | 3:65845faafbb1 | 52 | /*for (int a = 0; a < 8; a++) |
RufflesAllD | 2:db7c8378b324 | 53 | { |
RufflesAllD | 2:db7c8378b324 | 54 | preambule[a] = bit[688+a]; |
RufflesAllD | 2:db7c8378b324 | 55 | } |
RufflesAllD | 3:65845faafbb1 | 56 | bit = bit << 8;*/ |
RufflesAllD | 2:db7c8378b324 | 57 | |
RufflesAllD | 2:db7c8378b324 | 58 | for (int a = 0; a < 8; a++) |
RufflesAllD | 2:db7c8378b324 | 59 | { |
RufflesAllD | 2:db7c8378b324 | 60 | start_end[a] = bit[688+a]; |
RufflesAllD | 2:db7c8378b324 | 61 | } |
RufflesAllD | 2:db7c8378b324 | 62 | bit = bit << 8; |
RufflesAllD | 2:db7c8378b324 | 63 | |
RufflesAllD | 2:db7c8378b324 | 64 | for (int a = 0; a < 8; a++) |
RufflesAllD | 2:db7c8378b324 | 65 | { |
RufflesAllD | 2:db7c8378b324 | 66 | type_flag[a] = bit[688+a]; |
RufflesAllD | 2:db7c8378b324 | 67 | } |
RufflesAllD | 2:db7c8378b324 | 68 | bit = bit << 8; |
RufflesAllD | 2:db7c8378b324 | 69 | |
RufflesAllD | 2:db7c8378b324 | 70 | for (int a = 0; a < 8; a++) |
RufflesAllD | 2:db7c8378b324 | 71 | { |
RufflesAllD | 2:db7c8378b324 | 72 | charge_utile[a] = bit[688+a]; |
RufflesAllD | 2:db7c8378b324 | 73 | } |
RufflesAllD | 2:db7c8378b324 | 74 | length = static_cast<int>(charge_utile.to_ulong())*8; |
RufflesAllD | 2:db7c8378b324 | 75 | bit = bit << 8; |
RufflesAllD | 2:db7c8378b324 | 76 | |
RufflesAllD | 2:db7c8378b324 | 77 | for (int a = 0; a < length; a++) |
RufflesAllD | 2:db7c8378b324 | 78 | { |
RufflesAllD | 2:db7c8378b324 | 79 | message[a] = bit[696-length+a]; |
RufflesAllD | 2:db7c8378b324 | 80 | } |
RufflesAllD | 2:db7c8378b324 | 81 | bit = bit << length; |
RufflesAllD | 2:db7c8378b324 | 82 | |
RufflesAllD | 2:db7c8378b324 | 83 | for (int a = 0; a < 16; a++) |
RufflesAllD | 2:db7c8378b324 | 84 | { |
RufflesAllD | 2:db7c8378b324 | 85 | crc16[a] = bit[680+a]; |
RufflesAllD | 2:db7c8378b324 | 86 | } |
RufflesAllD | 2:db7c8378b324 | 87 | |
RufflesAllD | 2:db7c8378b324 | 88 | bitToLetter(); |
RufflesAllD | 2:db7c8378b324 | 89 | } |
RufflesAllD | 2:db7c8378b324 | 90 | |
RufflesAllD | 2:db7c8378b324 | 91 | string trameToString() |
RufflesAllD | 2:db7c8378b324 | 92 | { |
RufflesAllD | 2:db7c8378b324 | 93 | string res = preambule.to_string<char, string::traits_type, string::allocator_type>() + "\n\r"; |
RufflesAllD | 2:db7c8378b324 | 94 | res += start_end.to_string<char, string::traits_type, string::allocator_type>() + "\n\r"; |
RufflesAllD | 2:db7c8378b324 | 95 | res += type_flag.to_string<char, string::traits_type, string::allocator_type>() + "\n\r"; |
RufflesAllD | 2:db7c8378b324 | 96 | res += charge_utile.to_string<char, string::traits_type, string::allocator_type>() + "\n\r"; |
RufflesAllD | 2:db7c8378b324 | 97 | res += message.to_string<char, string::traits_type, string::allocator_type>() + "\n\r"; |
RufflesAllD | 2:db7c8378b324 | 98 | res += crc16.to_string<char, string::traits_type, string::allocator_type>() + "\n\r"; |
RufflesAllD | 2:db7c8378b324 | 99 | res += start_end.to_string<char, string::traits_type, string::allocator_type>() + "\n\r"; |
RufflesAllD | 2:db7c8378b324 | 100 | |
RufflesAllD | 2:db7c8378b324 | 101 | return res; |
RufflesAllD | 2:db7c8378b324 | 102 | } |
RufflesAllD | 2:db7c8378b324 | 103 | |
RufflesAllD | 2:db7c8378b324 | 104 | void bitToLetter() |
RufflesAllD | 2:db7c8378b324 | 105 | { |
RufflesAllD | 2:db7c8378b324 | 106 | text = ""; |
RufflesAllD | 2:db7c8378b324 | 107 | |
RufflesAllD | 2:db7c8378b324 | 108 | for (int a = length/8; a > 0; a--) |
RufflesAllD | 2:db7c8378b324 | 109 | { |
RufflesAllD | 2:db7c8378b324 | 110 | string temp = ""; |
RufflesAllD | 2:db7c8378b324 | 111 | |
RufflesAllD | 2:db7c8378b324 | 112 | for (int b = 1; b <= 8; b++) |
RufflesAllD | 2:db7c8378b324 | 113 | { |
RufflesAllD | 2:db7c8378b324 | 114 | if (message.test(a*8-b)) |
RufflesAllD | 2:db7c8378b324 | 115 | { |
RufflesAllD | 2:db7c8378b324 | 116 | temp += "1"; |
RufflesAllD | 2:db7c8378b324 | 117 | } |
RufflesAllD | 2:db7c8378b324 | 118 | else |
RufflesAllD | 2:db7c8378b324 | 119 | { |
RufflesAllD | 2:db7c8378b324 | 120 | temp += "0"; |
RufflesAllD | 2:db7c8378b324 | 121 | } |
RufflesAllD | 2:db7c8378b324 | 122 | } |
RufflesAllD | 2:db7c8378b324 | 123 | text += static_cast<unsigned char>(bitset<8>(temp).to_ulong()); |
RufflesAllD | 2:db7c8378b324 | 124 | } |
RufflesAllD | 2:db7c8378b324 | 125 | } |
RufflesAllD | 2:db7c8378b324 | 126 | |
RufflesAllD | 2:db7c8378b324 | 127 | bool checkCRC16() |
RufflesAllD | 2:db7c8378b324 | 128 | { |
RufflesAllD | 2:db7c8378b324 | 129 | if (calculate_crc16(const_cast<char*>(text.c_str()), length/8) == crc16.to_ulong()) |
RufflesAllD | 2:db7c8378b324 | 130 | { |
RufflesAllD | 2:db7c8378b324 | 131 | return true; |
RufflesAllD | 2:db7c8378b324 | 132 | } |
RufflesAllD | 2:db7c8378b324 | 133 | |
RufflesAllD | 2:db7c8378b324 | 134 | return false; |
RufflesAllD | 2:db7c8378b324 | 135 | } |
RufflesAllD | 2:db7c8378b324 | 136 | }; |