Dummy program to demonstrate problems: working code
Dependencies: SLCD mbed-rtos mbed
Fork of MNG_TC by
COM_RCV_TC.h@16:de2224dd9a0d, 2015-09-17 (annotated)
- Committer:
- shreeshas95
- Date:
- Thu Sep 17 13:54:08 2015 +0000
- Revision:
- 16:de2224dd9a0d
- Parent:
- 8:cb93c1d3209a
DUMMY program to demostrate the problems
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
shreeshas95 | 8:cb93c1d3209a | 1 | namespace COM_RCV_TC{ |
shreeshas95 | 8:cb93c1d3209a | 2 | unsigned int bytes_read = 0; |
shreeshas95 | 8:cb93c1d3209a | 3 | unsigned int tc_frames = 0; |
shreeshas95 | 8:cb93c1d3209a | 4 | unsigned char tempString[136]; |
shreeshas95 | 8:cb93c1d3209a | 5 | TC_list *return_this = NULL; |
shreeshas95 | 7:e71ecfe3a340 | 6 | |
shreeshas95 | 16:de2224dd9a0d | 7 | void attach_frame(unsigned int length){ |
shreeshas95 | 8:cb93c1d3209a | 8 | // allocate new node |
shreeshas95 | 8:cb93c1d3209a | 9 | // handle Head node |
shreeshas95 | 8:cb93c1d3209a | 10 | if( tc_frames == 0 ){ |
shreeshas95 | 8:cb93c1d3209a | 11 | VAR_SPACE::Head_node = new TC_list; |
shreeshas95 | 8:cb93c1d3209a | 12 | VAR_SPACE::Head_node->next_TC = NULL; |
shreeshas95 | 8:cb93c1d3209a | 13 | VAR_SPACE::last_node = VAR_SPACE::Head_node; |
shreeshas95 | 3:eec1097c0dd6 | 14 | } |
shreeshas95 | 8:cb93c1d3209a | 15 | else{ |
shreeshas95 | 8:cb93c1d3209a | 16 | VAR_SPACE::last_node->next_TC = new TC_list; |
shreeshas95 | 8:cb93c1d3209a | 17 | VAR_SPACE::last_node = VAR_SPACE::last_node->next_TC; |
shreeshas95 | 8:cb93c1d3209a | 18 | VAR_SPACE::last_node->next_TC = NULL; |
shreeshas95 | 8:cb93c1d3209a | 19 | } |
shreeshas95 | 8:cb93c1d3209a | 20 | |
shreeshas95 | 8:cb93c1d3209a | 21 | // allocate memory for string |
shreeshas95 | 8:cb93c1d3209a | 22 | VAR_SPACE::last_node->TC_string = new unsigned char[length]; |
shreeshas95 | 8:cb93c1d3209a | 23 | for(int i = 0 ; i < length ; ++i){ |
shreeshas95 | 8:cb93c1d3209a | 24 | VAR_SPACE::last_node->TC_string[i] = tempString[i]; |
shreeshas95 | 3:eec1097c0dd6 | 25 | } |
shreeshas95 | 8:cb93c1d3209a | 26 | |
shreeshas95 | 8:cb93c1d3209a | 27 | // short or long |
shreeshas95 | 8:cb93c1d3209a | 28 | VAR_SPACE::last_node->short_or_long = (length == 11) ? true : false; |
shreeshas95 | 8:cb93c1d3209a | 29 | |
shreeshas95 | 8:cb93c1d3209a | 30 | // crc pass or fail |
shreeshas95 | 8:cb93c1d3209a | 31 | uint16_t crc_checksum = CRC::crc16_gen(tempString, length-2); |
shreeshas95 | 8:cb93c1d3209a | 32 | if( ( (crc_checksum & 0xFF) == tempString[length-1]) && ( ((crc_checksum >> 8) & 0xFF) == tempString[length-2] ) ){ |
shreeshas95 | 8:cb93c1d3209a | 33 | VAR_SPACE::last_node->crc_pass = true; |
shreeshas95 | 8:cb93c1d3209a | 34 | } |
shreeshas95 | 8:cb93c1d3209a | 35 | else{ |
shreeshas95 | 8:cb93c1d3209a | 36 | VAR_SPACE::last_node->crc_pass = false; |
shreeshas95 | 7:e71ecfe3a340 | 37 | } |
shreeshas95 | 6:6e9ae3b44e60 | 38 | |
shreeshas95 | 8:cb93c1d3209a | 39 | // PSC |
shreeshas95 | 8:cb93c1d3209a | 40 | VAR_SPACE::last_node->packet_seq_count = VAR_SPACE::last_node->TC_string[0]; |
shreeshas95 | 8:cb93c1d3209a | 41 | |
shreeshas95 | 8:cb93c1d3209a | 42 | // apid |
shreeshas95 | 8:cb93c1d3209a | 43 | unsigned char tempChar = VAR_SPACE::last_node->TC_string[1]; |
shreeshas95 | 8:cb93c1d3209a | 44 | VAR_SPACE::last_node->apid = (tempChar >> 6) & 3; |
shreeshas95 | 8:cb93c1d3209a | 45 | |
shreeshas95 | 8:cb93c1d3209a | 46 | // abort on nack |
shreeshas95 | 8:cb93c1d3209a | 47 | VAR_SPACE::last_node->abort_on_nack = (((tempChar >> 3) & 1) == 1) ? true : false; |
shreeshas95 | 8:cb93c1d3209a | 48 | |
shreeshas95 | 8:cb93c1d3209a | 49 | // default values of enable and execution status |
shreeshas95 | 8:cb93c1d3209a | 50 | VAR_SPACE::last_node->enabled = true; |
shreeshas95 | 8:cb93c1d3209a | 51 | VAR_SPACE::last_node->exec_status = 0; |
shreeshas95 | 3:eec1097c0dd6 | 52 | |
shreeshas95 | 8:cb93c1d3209a | 53 | // printf("inside attach frame : frame num = %u\r\n", tc_frames); |
shreeshas95 | 8:cb93c1d3209a | 54 | |
shreeshas95 | 8:cb93c1d3209a | 55 | // for(int i = 0 ; i < length ; ++i){ |
shreeshas95 | 8:cb93c1d3209a | 56 | // std::bitset<8> b = VAR_SPACE::last_node->TC_string[i]; |
shreeshas95 | 8:cb93c1d3209a | 57 | // cout << b << " "; |
shreeshas95 | 8:cb93c1d3209a | 58 | // } |
shreeshas95 | 8:cb93c1d3209a | 59 | // cout << ENDL; |
shreeshas95 | 8:cb93c1d3209a | 60 | // for( int i = 0 ; i < length ; ++i){ |
shreeshas95 | 8:cb93c1d3209a | 61 | // std::bitset<8> b = tempString[i]; |
shreeshas95 | 8:cb93c1d3209a | 62 | // cout << b << " "; |
shreeshas95 | 8:cb93c1d3209a | 63 | // } |
shreeshas95 | 8:cb93c1d3209a | 64 | // cout << ENDL; |
shreeshas95 | 8:cb93c1d3209a | 65 | |
shreeshas95 | 8:cb93c1d3209a | 66 | ++tc_frames; |
shreeshas95 | 3:eec1097c0dd6 | 67 | } |
shreeshas95 | 8:cb93c1d3209a | 68 | |
shreeshas95 | 8:cb93c1d3209a | 69 | void flushData(const unsigned int& bytes, const unsigned char& outState){ |
shreeshas95 | 8:cb93c1d3209a | 70 | if( (bytes == 11) && (outState == 7) ){ |
shreeshas95 | 8:cb93c1d3209a | 71 | attach_frame(11); |
shreeshas95 | 3:eec1097c0dd6 | 72 | } |
shreeshas95 | 8:cb93c1d3209a | 73 | else if( (bytes == 135) && (outState == 7) ){ |
shreeshas95 | 8:cb93c1d3209a | 74 | attach_frame(135); |
shreeshas95 | 3:eec1097c0dd6 | 75 | } |
shreeshas95 | 3:eec1097c0dd6 | 76 | } |
shreeshas95 | 3:eec1097c0dd6 | 77 | |
shreeshas95 | 8:cb93c1d3209a | 78 | void rx_rcv_tc(void){ |
shreeshas95 | 8:cb93c1d3209a | 79 | bool frame_started = false; |
shreeshas95 | 8:cb93c1d3209a | 80 | bytes_read = 0; |
shreeshas95 | 8:cb93c1d3209a | 81 | unsigned char state7e = 0; |
shreeshas95 | 8:cb93c1d3209a | 82 | unsigned char outState = 0; |
shreeshas95 | 8:cb93c1d3209a | 83 | unsigned int outByte = 0; |
shreeshas95 | 8:cb93c1d3209a | 84 | bool chain_started = false; |
shreeshas95 | 8:cb93c1d3209a | 85 | unsigned int byteCount = 0; |
shreeshas95 | 8:cb93c1d3209a | 86 | |
shreeshas95 | 8:cb93c1d3209a | 87 | // read byte by byte |
shreeshas95 | 8:cb93c1d3209a | 88 | while( VAR_SPACE::data_node != NULL ){ |
shreeshas95 | 8:cb93c1d3209a | 89 | |
shreeshas95 | 8:cb93c1d3209a | 90 | unsigned char test_this = VAR_SPACE::data_node->val; |
shreeshas95 | 8:cb93c1d3209a | 91 | ++bytes_read; |
shreeshas95 | 8:cb93c1d3209a | 92 | |
shreeshas95 | 8:cb93c1d3209a | 93 | struct data_list *temp = VAR_SPACE::data_node->next; |
shreeshas95 | 8:cb93c1d3209a | 94 | delete VAR_SPACE::data_node; |
shreeshas95 | 8:cb93c1d3209a | 95 | VAR_SPACE::data_node = temp; |
shreeshas95 | 8:cb93c1d3209a | 96 | if( bytes_read == 1 ){ |
shreeshas95 | 8:cb93c1d3209a | 97 | VAR_SPACE::head_data = new struct data_list; |
shreeshas95 | 8:cb93c1d3209a | 98 | VAR_SPACE::head_data->next = NULL; |
shreeshas95 | 8:cb93c1d3209a | 99 | VAR_SPACE::rx_new_node = VAR_SPACE::head_data; |
shreeshas95 | 8:cb93c1d3209a | 100 | } |
shreeshas95 | 8:cb93c1d3209a | 101 | |
shreeshas95 | 8:cb93c1d3209a | 102 | // read bit by bit |
shreeshas95 | 8:cb93c1d3209a | 103 | for(int i = 7 ; i >= 0 ; --i){ |
shreeshas95 | 8:cb93c1d3209a | 104 | unsigned char tempBit = (test_this >> i) & 1; |
shreeshas95 | 8:cb93c1d3209a | 105 | bool skipIteration = false; |
shreeshas95 | 8:cb93c1d3209a | 106 | |
shreeshas95 | 8:cb93c1d3209a | 107 | if( tempBit == 1 ){ |
shreeshas95 | 8:cb93c1d3209a | 108 | switch( state7e ){ |
shreeshas95 | 8:cb93c1d3209a | 109 | case 0: |
shreeshas95 | 8:cb93c1d3209a | 110 | state7e = 0; |
shreeshas95 | 8:cb93c1d3209a | 111 | break; |
shreeshas95 | 8:cb93c1d3209a | 112 | case 1: |
shreeshas95 | 8:cb93c1d3209a | 113 | state7e = 2; |
shreeshas95 | 8:cb93c1d3209a | 114 | break; |
shreeshas95 | 8:cb93c1d3209a | 115 | case 2: |
shreeshas95 | 8:cb93c1d3209a | 116 | state7e = 3; |
shreeshas95 | 8:cb93c1d3209a | 117 | break; |
shreeshas95 | 8:cb93c1d3209a | 118 | case 3: |
shreeshas95 | 8:cb93c1d3209a | 119 | state7e = 4; |
shreeshas95 | 8:cb93c1d3209a | 120 | break; |
shreeshas95 | 8:cb93c1d3209a | 121 | case 4: |
shreeshas95 | 8:cb93c1d3209a | 122 | state7e = 5; |
shreeshas95 | 8:cb93c1d3209a | 123 | break; |
shreeshas95 | 8:cb93c1d3209a | 124 | case 5: |
shreeshas95 | 8:cb93c1d3209a | 125 | state7e = 6; |
shreeshas95 | 8:cb93c1d3209a | 126 | break; |
shreeshas95 | 8:cb93c1d3209a | 127 | case 6: |
shreeshas95 | 8:cb93c1d3209a | 128 | state7e = 7; |
shreeshas95 | 8:cb93c1d3209a | 129 | break; |
shreeshas95 | 8:cb93c1d3209a | 130 | case 7: |
shreeshas95 | 8:cb93c1d3209a | 131 | // error reset |
shreeshas95 | 8:cb93c1d3209a | 132 | state7e = 0; |
shreeshas95 | 8:cb93c1d3209a | 133 | chain_started = false; |
shreeshas95 | 8:cb93c1d3209a | 134 | frame_started = false; |
shreeshas95 | 8:cb93c1d3209a | 135 | byteCount = 0; |
shreeshas95 | 8:cb93c1d3209a | 136 | outByte = 0; |
shreeshas95 | 8:cb93c1d3209a | 137 | outState = 0; |
shreeshas95 | 8:cb93c1d3209a | 138 | skipIteration = true; |
shreeshas95 | 8:cb93c1d3209a | 139 | break; |
shreeshas95 | 8:cb93c1d3209a | 140 | } |
shreeshas95 | 3:eec1097c0dd6 | 141 | } |
shreeshas95 | 8:cb93c1d3209a | 142 | else{ |
shreeshas95 | 8:cb93c1d3209a | 143 | switch( state7e ){ |
shreeshas95 | 8:cb93c1d3209a | 144 | case 0: |
shreeshas95 | 8:cb93c1d3209a | 145 | case 1: |
shreeshas95 | 8:cb93c1d3209a | 146 | case 2: |
shreeshas95 | 8:cb93c1d3209a | 147 | case 3: |
shreeshas95 | 8:cb93c1d3209a | 148 | case 4: |
shreeshas95 | 8:cb93c1d3209a | 149 | case 5: |
shreeshas95 | 8:cb93c1d3209a | 150 | state7e = 1; |
shreeshas95 | 8:cb93c1d3209a | 151 | break; |
shreeshas95 | 8:cb93c1d3209a | 152 | case 6: |
shreeshas95 | 8:cb93c1d3209a | 153 | state7e = 1; |
shreeshas95 | 8:cb93c1d3209a | 154 | skipIteration = true; |
shreeshas95 | 8:cb93c1d3209a | 155 | break; |
shreeshas95 | 8:cb93c1d3209a | 156 | case 7: |
shreeshas95 | 8:cb93c1d3209a | 157 | state7e = 0; |
shreeshas95 | 8:cb93c1d3209a | 158 | // detected 7e |
shreeshas95 | 8:cb93c1d3209a | 159 | // printf("detected 7e : chain start : %u, frame_start : %u\r\n", (chain_started ? 1 : 0), (frame_started ? 1 : 0) ); |
shreeshas95 | 8:cb93c1d3209a | 160 | if( !chain_started ){ |
shreeshas95 | 8:cb93c1d3209a | 161 | chain_started = true; |
shreeshas95 | 8:cb93c1d3209a | 162 | frame_started = true; |
shreeshas95 | 8:cb93c1d3209a | 163 | byteCount = 0; |
shreeshas95 | 8:cb93c1d3209a | 164 | outByte = 0; |
shreeshas95 | 8:cb93c1d3209a | 165 | outState = 0; |
shreeshas95 | 8:cb93c1d3209a | 166 | skipIteration = true; |
shreeshas95 | 8:cb93c1d3209a | 167 | } |
shreeshas95 | 8:cb93c1d3209a | 168 | else{ |
shreeshas95 | 8:cb93c1d3209a | 169 | flushData(byteCount, outState); |
shreeshas95 | 8:cb93c1d3209a | 170 | byteCount = 0; |
shreeshas95 | 8:cb93c1d3209a | 171 | outState = 0; |
shreeshas95 | 8:cb93c1d3209a | 172 | outByte = 0; |
shreeshas95 | 8:cb93c1d3209a | 173 | skipIteration = true; |
shreeshas95 | 8:cb93c1d3209a | 174 | } |
shreeshas95 | 8:cb93c1d3209a | 175 | break; |
shreeshas95 | 8:cb93c1d3209a | 176 | } |
shreeshas95 | 8:cb93c1d3209a | 177 | } |
shreeshas95 | 8:cb93c1d3209a | 178 | if( (!skipIteration) && (frame_started) ){ |
shreeshas95 | 8:cb93c1d3209a | 179 | // write bit to output |
shreeshas95 | 8:cb93c1d3209a | 180 | switch( outState ){ |
shreeshas95 | 8:cb93c1d3209a | 181 | case 0: |
shreeshas95 | 8:cb93c1d3209a | 182 | outState = 1; |
shreeshas95 | 8:cb93c1d3209a | 183 | tempString[outByte] = tempBit << 7; |
shreeshas95 | 8:cb93c1d3209a | 184 | break; |
shreeshas95 | 8:cb93c1d3209a | 185 | case 1: |
shreeshas95 | 8:cb93c1d3209a | 186 | outState = 2; |
shreeshas95 | 8:cb93c1d3209a | 187 | tempString[outByte] += tempBit << 6; |
shreeshas95 | 8:cb93c1d3209a | 188 | break; |
shreeshas95 | 8:cb93c1d3209a | 189 | case 2: |
shreeshas95 | 8:cb93c1d3209a | 190 | outState = 3; |
shreeshas95 | 8:cb93c1d3209a | 191 | tempString[outByte] += tempBit << 5; |
shreeshas95 | 8:cb93c1d3209a | 192 | break; |
shreeshas95 | 8:cb93c1d3209a | 193 | case 3: |
shreeshas95 | 8:cb93c1d3209a | 194 | outState = 4; |
shreeshas95 | 8:cb93c1d3209a | 195 | tempString[outByte] += tempBit << 4; |
shreeshas95 | 8:cb93c1d3209a | 196 | break; |
shreeshas95 | 8:cb93c1d3209a | 197 | case 4: |
shreeshas95 | 8:cb93c1d3209a | 198 | outState = 5; |
shreeshas95 | 8:cb93c1d3209a | 199 | tempString[outByte] += tempBit << 3; |
shreeshas95 | 8:cb93c1d3209a | 200 | break; |
shreeshas95 | 8:cb93c1d3209a | 201 | case 5: |
shreeshas95 | 8:cb93c1d3209a | 202 | outState = 6; |
shreeshas95 | 8:cb93c1d3209a | 203 | tempString[outByte] += tempBit << 2; |
shreeshas95 | 8:cb93c1d3209a | 204 | break; |
shreeshas95 | 8:cb93c1d3209a | 205 | case 6: |
shreeshas95 | 8:cb93c1d3209a | 206 | outState = 7; |
shreeshas95 | 8:cb93c1d3209a | 207 | tempString[outByte] += tempBit << 1; |
shreeshas95 | 8:cb93c1d3209a | 208 | break; |
shreeshas95 | 8:cb93c1d3209a | 209 | case 7: |
shreeshas95 | 8:cb93c1d3209a | 210 | // printf("wrote a byte in tempString\r\n"); |
shreeshas95 | 8:cb93c1d3209a | 211 | outState = 0; |
shreeshas95 | 8:cb93c1d3209a | 212 | tempString[outByte] += tempBit; |
shreeshas95 | 8:cb93c1d3209a | 213 | ++outByte; |
shreeshas95 | 8:cb93c1d3209a | 214 | // exceeded tc length discard |
shreeshas95 | 8:cb93c1d3209a | 215 | if(outByte > 135){ |
shreeshas95 | 8:cb93c1d3209a | 216 | outByte = 0; |
shreeshas95 | 8:cb93c1d3209a | 217 | } |
shreeshas95 | 8:cb93c1d3209a | 218 | ++byteCount; |
shreeshas95 | 8:cb93c1d3209a | 219 | break; |
shreeshas95 | 8:cb93c1d3209a | 220 | } |
shreeshas95 | 3:eec1097c0dd6 | 221 | } |
shreeshas95 | 3:eec1097c0dd6 | 222 | } |
shreeshas95 | 7:e71ecfe3a340 | 223 | } |
shreeshas95 | 3:eec1097c0dd6 | 224 | } |
shreeshas95 | 8:cb93c1d3209a | 225 | } |