Problematique

Dependencies:   mbed mbed-rtos

Committer:
joGenie
Date:
Wed Feb 12 21:50:47 2014 +0000
Revision:
4:2af360b178d2
Parent:
3:65845faafbb1
ss;

Who changed what in which revision?

UserRevisionLine numberNew 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 };