TELECOMMAND MANAGER V1
Dependencies: mbed SLCD mbed-rtos
COM_RCV_TC.h@6:6e9ae3b44e60, 2015-07-04 (annotated)
- Committer:
- shreeshas95
- Date:
- Sat Jul 04 13:22:07 2015 +0000
- Revision:
- 6:6e9ae3b44e60
- Parent:
- 4:f95195748a0c
- Child:
- 7:e71ecfe3a340
V1 with 30+2 snd_tm WORKING;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
shreeshas95 | 3:eec1097c0dd6 | 1 | #include "stdio.h" |
shreeshas95 | 3:eec1097c0dd6 | 2 | #include <cstdlib> |
shreeshas95 | 3:eec1097c0dd6 | 3 | //sample data source instead of buffer//remove while interfacing with RX1M..add the logic to add data in read_byte function |
shreeshas95 | 3:eec1097c0dd6 | 4 | //have kept this slightly higher than actual//donno why gives error |
shreeshas95 | 3:eec1097c0dd6 | 5 | |
shreeshas95 | 3:eec1097c0dd6 | 6 | |
shreeshas95 | 3:eec1097c0dd6 | 7 | namespace RCV_TC{ |
shreeshas95 | 3:eec1097c0dd6 | 8 | uint16_t x = 0;//counter for keeping count of data read |
shreeshas95 | 3:eec1097c0dd6 | 9 | |
shreeshas95 | 3:eec1097c0dd6 | 10 | //this just converts a binary number to store in int variable, I am using while creating sample telecommands |
shreeshas95 | 3:eec1097c0dd6 | 11 | #define B(x) S_to_binary_(#x) |
shreeshas95 | 3:eec1097c0dd6 | 12 | static inline unsigned long long S_to_binary_(const char *s) |
shreeshas95 | 3:eec1097c0dd6 | 13 | { |
shreeshas95 | 3:eec1097c0dd6 | 14 | unsigned long long i = 0; |
shreeshas95 | 3:eec1097c0dd6 | 15 | while (*s) { |
shreeshas95 | 3:eec1097c0dd6 | 16 | i <<= 1; |
shreeshas95 | 3:eec1097c0dd6 | 17 | i += *s++ - '0'; |
shreeshas95 | 3:eec1097c0dd6 | 18 | } |
shreeshas95 | 3:eec1097c0dd6 | 19 | return i; |
shreeshas95 | 3:eec1097c0dd6 | 20 | } |
shreeshas95 | 3:eec1097c0dd6 | 21 | |
shreeshas95 | 3:eec1097c0dd6 | 22 | unsigned char temp[135]; |
shreeshas95 | 3:eec1097c0dd6 | 23 | |
shreeshas95 | 3:eec1097c0dd6 | 24 | TC_list *t_frame; |
shreeshas95 | 3:eec1097c0dd6 | 25 | TC_list *prev_frame; |
shreeshas95 | 3:eec1097c0dd6 | 26 | |
shreeshas95 | 3:eec1097c0dd6 | 27 | bool crc_pass; |
shreeshas95 | 3:eec1097c0dd6 | 28 | |
shreeshas95 | 3:eec1097c0dd6 | 29 | void copy_bit(unsigned char* src_byte, unsigned char* dest_byte, unsigned char* count) |
shreeshas95 | 3:eec1097c0dd6 | 30 | { |
shreeshas95 | 3:eec1097c0dd6 | 31 | if (*src_byte & 0x80) |
shreeshas95 | 3:eec1097c0dd6 | 32 | { |
shreeshas95 | 3:eec1097c0dd6 | 33 | *dest_byte <<= 1; |
shreeshas95 | 3:eec1097c0dd6 | 34 | *dest_byte += 1; |
shreeshas95 | 3:eec1097c0dd6 | 35 | } |
shreeshas95 | 3:eec1097c0dd6 | 36 | else *dest_byte <<= 1; |
shreeshas95 | 3:eec1097c0dd6 | 37 | *src_byte <<= 1; |
shreeshas95 | 3:eec1097c0dd6 | 38 | (*count)++; |
shreeshas95 | 3:eec1097c0dd6 | 39 | } |
shreeshas95 | 3:eec1097c0dd6 | 40 | |
shreeshas95 | 3:eec1097c0dd6 | 41 | unsigned char read_byte(unsigned char* shift_in) |
shreeshas95 | 3:eec1097c0dd6 | 42 | { |
shreeshas95 | 3:eec1097c0dd6 | 43 | unsigned char byte; |
shreeshas95 | 6:6e9ae3b44e60 | 44 | byte = VAR_SPACE::data[x++]; |
shreeshas95 | 6:6e9ae3b44e60 | 45 | // byte = VAR_SPACE::data_node->val; |
shreeshas95 | 6:6e9ae3b44e60 | 46 | // VAR_SPACE::data_node = VAR_SPACE::data_node->next; |
shreeshas95 | 6:6e9ae3b44e60 | 47 | |
shreeshas95 | 6:6e9ae3b44e60 | 48 | // ++x; |
shreeshas95 | 6:6e9ae3b44e60 | 49 | |
shreeshas95 | 3:eec1097c0dd6 | 50 | *shift_in = 0; |
shreeshas95 | 3:eec1097c0dd6 | 51 | |
shreeshas95 | 3:eec1097c0dd6 | 52 | return byte; |
shreeshas95 | 3:eec1097c0dd6 | 53 | } |
shreeshas95 | 3:eec1097c0dd6 | 54 | |
shreeshas95 | 3:eec1097c0dd6 | 55 | void attach_byte(unsigned char* a_byte, unsigned char* count, unsigned char* byte_no) |
shreeshas95 | 3:eec1097c0dd6 | 56 | { |
shreeshas95 | 3:eec1097c0dd6 | 57 | temp[(*byte_no)++] = *a_byte; |
shreeshas95 | 3:eec1097c0dd6 | 58 | *count = 0; |
shreeshas95 | 3:eec1097c0dd6 | 59 | } |
shreeshas95 | 3:eec1097c0dd6 | 60 | |
shreeshas95 | 3:eec1097c0dd6 | 61 | void attach_frame(TC_list *t_frame, unsigned char* frame_no, unsigned char* byte_no) |
shreeshas95 | 3:eec1097c0dd6 | 62 | { |
shreeshas95 | 3:eec1097c0dd6 | 63 | t_frame = new TC_list; |
shreeshas95 | 3:eec1097c0dd6 | 64 | t_frame->next_TC = NULL; |
shreeshas95 | 3:eec1097c0dd6 | 65 | if(*frame_no == 0){ |
shreeshas95 | 3:eec1097c0dd6 | 66 | VAR_SPACE::Head_node = t_frame; |
shreeshas95 | 3:eec1097c0dd6 | 67 | prev_frame = VAR_SPACE::Head_node; |
shreeshas95 | 3:eec1097c0dd6 | 68 | } |
shreeshas95 | 3:eec1097c0dd6 | 69 | else{ |
shreeshas95 | 3:eec1097c0dd6 | 70 | prev_frame->next_TC = t_frame; |
shreeshas95 | 3:eec1097c0dd6 | 71 | prev_frame = t_frame; |
shreeshas95 | 3:eec1097c0dd6 | 72 | } |
shreeshas95 | 3:eec1097c0dd6 | 73 | prev_frame->TC_string = new unsigned char[*byte_no]; |
shreeshas95 | 3:eec1097c0dd6 | 74 | for(int i = 0 ; i < *byte_no ; ++i){ |
shreeshas95 | 3:eec1097c0dd6 | 75 | prev_frame->TC_string[i] = temp[i]; |
shreeshas95 | 3:eec1097c0dd6 | 76 | } |
shreeshas95 | 3:eec1097c0dd6 | 77 | if(*byte_no == 11) |
shreeshas95 | 3:eec1097c0dd6 | 78 | { |
shreeshas95 | 3:eec1097c0dd6 | 79 | prev_frame->short_or_long = true; |
shreeshas95 | 3:eec1097c0dd6 | 80 | } |
shreeshas95 | 3:eec1097c0dd6 | 81 | |
shreeshas95 | 3:eec1097c0dd6 | 82 | *byte_no = 0; |
shreeshas95 | 3:eec1097c0dd6 | 83 | ++(*frame_no); |
shreeshas95 | 3:eec1097c0dd6 | 84 | } |
shreeshas95 | 3:eec1097c0dd6 | 85 | |
shreeshas95 | 3:eec1097c0dd6 | 86 | void scan_dstuff(unsigned char* fifo_byte, unsigned char* test_byte, unsigned char* flag, unsigned char* shift_in, unsigned char* dstuff_count) |
shreeshas95 | 3:eec1097c0dd6 | 87 | { |
shreeshas95 | 3:eec1097c0dd6 | 88 | if (*test_byte == 0x7E)//scan for flag |
shreeshas95 | 3:eec1097c0dd6 | 89 | { |
shreeshas95 | 3:eec1097c0dd6 | 90 | *flag = 2; |
shreeshas95 | 3:eec1097c0dd6 | 91 | return; |
shreeshas95 | 3:eec1097c0dd6 | 92 | } |
shreeshas95 | 3:eec1097c0dd6 | 93 | if (((*test_byte) & 0xFC) == 0xF8)//destuff |
shreeshas95 | 3:eec1097c0dd6 | 94 | { |
shreeshas95 | 3:eec1097c0dd6 | 95 | if (*shift_in == 8) |
shreeshas95 | 3:eec1097c0dd6 | 96 | *fifo_byte = read_byte(shift_in); |
shreeshas95 | 3:eec1097c0dd6 | 97 | copy_bit(fifo_byte, test_byte, shift_in); |
shreeshas95 | 3:eec1097c0dd6 | 98 | *test_byte = *test_byte | 0xF8; |
shreeshas95 | 3:eec1097c0dd6 | 99 | *dstuff_count = 4; |
shreeshas95 | 3:eec1097c0dd6 | 100 | } |
shreeshas95 | 3:eec1097c0dd6 | 101 | |
shreeshas95 | 3:eec1097c0dd6 | 102 | |
shreeshas95 | 3:eec1097c0dd6 | 103 | } |
shreeshas95 | 3:eec1097c0dd6 | 104 | void post_flag(unsigned char* a_byte, unsigned char* b_byte, unsigned char *shift_in) |
shreeshas95 | 3:eec1097c0dd6 | 105 | { |
shreeshas95 | 3:eec1097c0dd6 | 106 | |
shreeshas95 | 3:eec1097c0dd6 | 107 | for (int i = 0; i < 8; i++) |
shreeshas95 | 3:eec1097c0dd6 | 108 | { |
shreeshas95 | 3:eec1097c0dd6 | 109 | if (*shift_in == 8) |
shreeshas95 | 3:eec1097c0dd6 | 110 | { |
shreeshas95 | 3:eec1097c0dd6 | 111 | *a_byte = read_byte(shift_in); |
shreeshas95 | 3:eec1097c0dd6 | 112 | } |
shreeshas95 | 3:eec1097c0dd6 | 113 | copy_bit(a_byte, b_byte, shift_in); |
shreeshas95 | 3:eec1097c0dd6 | 114 | } |
shreeshas95 | 3:eec1097c0dd6 | 115 | |
shreeshas95 | 3:eec1097c0dd6 | 116 | } |
shreeshas95 | 3:eec1097c0dd6 | 117 | void post_shift_out(unsigned char* fifo_byte, unsigned char* test_byte, unsigned char* shift_in) |
shreeshas95 | 3:eec1097c0dd6 | 118 | { |
shreeshas95 | 3:eec1097c0dd6 | 119 | if (*shift_in == 8) |
shreeshas95 | 3:eec1097c0dd6 | 120 | *fifo_byte = read_byte(shift_in); |
shreeshas95 | 3:eec1097c0dd6 | 121 | if (*fifo_byte & 0x80) |
shreeshas95 | 3:eec1097c0dd6 | 122 | *test_byte |= 0x01; |
shreeshas95 | 3:eec1097c0dd6 | 123 | (*shift_in)++; |
shreeshas95 | 3:eec1097c0dd6 | 124 | *fifo_byte <<= 1; |
shreeshas95 | 3:eec1097c0dd6 | 125 | } |
shreeshas95 | 3:eec1097c0dd6 | 126 | |
shreeshas95 | 3:eec1097c0dd6 | 127 | bool check_crc(unsigned char &byte_no) |
shreeshas95 | 3:eec1097c0dd6 | 128 | { |
shreeshas95 | 3:eec1097c0dd6 | 129 | uint16_t exp_crc = CRC::crc16_gen(temp, (byte_no - 2)); |
shreeshas95 | 3:eec1097c0dd6 | 130 | uint16_t cal_crc = (temp[byte_no - 2] << 8) | temp[byte_no - 1]; |
shreeshas95 | 3:eec1097c0dd6 | 131 | if (exp_crc == cal_crc) |
shreeshas95 | 3:eec1097c0dd6 | 132 | { |
shreeshas95 | 3:eec1097c0dd6 | 133 | return 1; |
shreeshas95 | 3:eec1097c0dd6 | 134 | } |
shreeshas95 | 3:eec1097c0dd6 | 135 | else |
shreeshas95 | 3:eec1097c0dd6 | 136 | return 0; |
shreeshas95 | 3:eec1097c0dd6 | 137 | } |
shreeshas95 | 3:eec1097c0dd6 | 138 | void check_last_frame(unsigned char* last_frame) |
shreeshas95 | 3:eec1097c0dd6 | 139 | { |
shreeshas95 | 3:eec1097c0dd6 | 140 | if (temp[1] & 0x20) |
shreeshas95 | 3:eec1097c0dd6 | 141 | { |
shreeshas95 | 3:eec1097c0dd6 | 142 | *last_frame = 1; |
shreeshas95 | 3:eec1097c0dd6 | 143 | }//considering 3rd bit of 2nd byte of packet as last bit flag |
shreeshas95 | 3:eec1097c0dd6 | 144 | } |
shreeshas95 | 3:eec1097c0dd6 | 145 | |
shreeshas95 | 3:eec1097c0dd6 | 146 | |
shreeshas95 | 3:eec1097c0dd6 | 147 | void RX_RCV_TC() |
shreeshas95 | 3:eec1097c0dd6 | 148 | { |
shreeshas95 | 3:eec1097c0dd6 | 149 | x = 0; |
shreeshas95 | 3:eec1097c0dd6 | 150 | int count_down = 0; |
shreeshas95 | 3:eec1097c0dd6 | 151 | unsigned char test_byte = 0; |
shreeshas95 | 3:eec1097c0dd6 | 152 | unsigned char flag = 0; |
shreeshas95 | 3:eec1097c0dd6 | 153 | //flag = 0 ... scanning for 0x7E/searching for start of new frame |
shreeshas95 | 3:eec1097c0dd6 | 154 | //flag = 1 ... after detecting 0x7E, now start dstuffing , scanning for 7E, filling the fifo_byte if empty, attach the dstuff_byte |
shreeshas95 | 3:eec1097c0dd6 | 155 | //flag = 2 ... detected 0x7E, check if the current t_frame is valid , then atttach the t_frame to p_frame |
shreeshas95 | 3:eec1097c0dd6 | 156 | unsigned char fifo_byte = 0; |
shreeshas95 | 3:eec1097c0dd6 | 157 | unsigned char dstuff_byte = 0; |
shreeshas95 | 3:eec1097c0dd6 | 158 | unsigned char byte_no = 0; |
shreeshas95 | 3:eec1097c0dd6 | 159 | unsigned char frame_no = 0; |
shreeshas95 | 3:eec1097c0dd6 | 160 | unsigned char shift_in = 0, shift_out = 0; // flag to keep count of bytes shifted in/out of test byte |
shreeshas95 | 3:eec1097c0dd6 | 161 | unsigned char dstuff_count = 0; |
shreeshas95 | 3:eec1097c0dd6 | 162 | unsigned char last_frame = 0; |
shreeshas95 | 3:eec1097c0dd6 | 163 | |
shreeshas95 | 3:eec1097c0dd6 | 164 | //Processing starts here |
shreeshas95 | 3:eec1097c0dd6 | 165 | while (!last_frame)//process till last frame |
shreeshas95 | 3:eec1097c0dd6 | 166 | { |
shreeshas95 | 4:f95195748a0c | 167 | // printf("inside last frame\r\n"); |
shreeshas95 | 3:eec1097c0dd6 | 168 | while (flag == 0) |
shreeshas95 | 3:eec1097c0dd6 | 169 | { |
shreeshas95 | 6:6e9ae3b44e60 | 170 | printf("entered flag 0\r\n"); |
shreeshas95 | 3:eec1097c0dd6 | 171 | if (fifo_byte != 0x7E)//check for initial 0x7E, else discard and take next byte //here I am checking byte wise instead of bitwise!!! |
shreeshas95 | 3:eec1097c0dd6 | 172 | { |
shreeshas95 | 3:eec1097c0dd6 | 173 | count_down++; |
shreeshas95 | 3:eec1097c0dd6 | 174 | |
shreeshas95 | 3:eec1097c0dd6 | 175 | fifo_byte = read_byte(&shift_in); |
shreeshas95 | 3:eec1097c0dd6 | 176 | continue; |
shreeshas95 | 3:eec1097c0dd6 | 177 | } |
shreeshas95 | 3:eec1097c0dd6 | 178 | else |
shreeshas95 | 3:eec1097c0dd6 | 179 | { |
shreeshas95 | 3:eec1097c0dd6 | 180 | count_down = 0; |
shreeshas95 | 3:eec1097c0dd6 | 181 | flag = 1; |
shreeshas95 | 3:eec1097c0dd6 | 182 | |
shreeshas95 | 3:eec1097c0dd6 | 183 | fifo_byte = read_byte(&shift_in); |
shreeshas95 | 3:eec1097c0dd6 | 184 | post_flag(&fifo_byte, &test_byte, &shift_in); |
shreeshas95 | 3:eec1097c0dd6 | 185 | } |
shreeshas95 | 3:eec1097c0dd6 | 186 | } |
shreeshas95 | 3:eec1097c0dd6 | 187 | if (flag == 1) |
shreeshas95 | 3:eec1097c0dd6 | 188 | { |
shreeshas95 | 3:eec1097c0dd6 | 189 | for (; shift_in < 8;)//loop till all bits are written in test_byte from fifo_byte |
shreeshas95 | 3:eec1097c0dd6 | 190 | { |
shreeshas95 | 3:eec1097c0dd6 | 191 | if (shift_out == 8)//if the bits written to dstuff_byte =8 |
shreeshas95 | 3:eec1097c0dd6 | 192 | { |
shreeshas95 | 3:eec1097c0dd6 | 193 | if (byte_no < 11)//if long frame-size hasn't reached, |
shreeshas95 | 3:eec1097c0dd6 | 194 | attach_byte(&dstuff_byte, &shift_out, &byte_no);//attach_byte to t_frame |
shreeshas95 | 3:eec1097c0dd6 | 195 | else//else attach frame to the p_frame array |
shreeshas95 | 3:eec1097c0dd6 | 196 | { |
shreeshas95 | 3:eec1097c0dd6 | 197 | attach_frame(t_frame, &frame_no, &byte_no); |
shreeshas95 | 3:eec1097c0dd6 | 198 | flag = 0; |
shreeshas95 | 3:eec1097c0dd6 | 199 | post_flag(&fifo_byte, &test_byte, &shift_in); |
shreeshas95 | 3:eec1097c0dd6 | 200 | dstuff_byte = 0; |
shreeshas95 | 3:eec1097c0dd6 | 201 | break; |
shreeshas95 | 3:eec1097c0dd6 | 202 | } |
shreeshas95 | 3:eec1097c0dd6 | 203 | } |
shreeshas95 | 3:eec1097c0dd6 | 204 | |
shreeshas95 | 3:eec1097c0dd6 | 205 | if (!(dstuff_count)) |
shreeshas95 | 3:eec1097c0dd6 | 206 | scan_dstuff(&fifo_byte, &test_byte, &flag, &shift_in, &dstuff_count); |
shreeshas95 | 3:eec1097c0dd6 | 207 | else |
shreeshas95 | 3:eec1097c0dd6 | 208 | dstuff_count--;//bcoz only 4th bit is being removed //don't destuff for next four loops |
shreeshas95 | 3:eec1097c0dd6 | 209 | if (flag == 2) |
shreeshas95 | 3:eec1097c0dd6 | 210 | break; |
shreeshas95 | 3:eec1097c0dd6 | 211 | copy_bit(&test_byte, &dstuff_byte, &shift_out);//shift_out |
shreeshas95 | 3:eec1097c0dd6 | 212 | post_shift_out(&fifo_byte, &test_byte, &shift_in);//updating last bit of test_byte |
shreeshas95 | 3:eec1097c0dd6 | 213 | } |
shreeshas95 | 3:eec1097c0dd6 | 214 | } |
shreeshas95 | 3:eec1097c0dd6 | 215 | |
shreeshas95 | 3:eec1097c0dd6 | 216 | if (flag == 0) |
shreeshas95 | 3:eec1097c0dd6 | 217 | continue; |
shreeshas95 | 3:eec1097c0dd6 | 218 | if (shift_in == 8) |
shreeshas95 | 3:eec1097c0dd6 | 219 | fifo_byte = read_byte(&shift_in); |
shreeshas95 | 3:eec1097c0dd6 | 220 | if (flag == 2) // detected next 0x7E |
shreeshas95 | 3:eec1097c0dd6 | 221 | { |
shreeshas95 | 3:eec1097c0dd6 | 222 | if (shift_out % 8 == 0)//check if the t_frame is multiple of 8 else discard |
shreeshas95 | 3:eec1097c0dd6 | 223 | { |
shreeshas95 | 3:eec1097c0dd6 | 224 | crc_pass = check_crc(byte_no); |
shreeshas95 | 3:eec1097c0dd6 | 225 | if (crc_pass) |
shreeshas95 | 3:eec1097c0dd6 | 226 | { |
shreeshas95 | 3:eec1097c0dd6 | 227 | check_last_frame(&last_frame); //check if the current frame is last frame then set the last_frame flag |
shreeshas95 | 3:eec1097c0dd6 | 228 | // b = byte_no; |
shreeshas95 | 3:eec1097c0dd6 | 229 | attach_frame(t_frame, &frame_no, &byte_no); //then attach the t_frame to p_frame array |
shreeshas95 | 3:eec1097c0dd6 | 230 | flag = 1; //start scanning new frame |
shreeshas95 | 3:eec1097c0dd6 | 231 | prev_frame->crc_pass=1; |
shreeshas95 | 3:eec1097c0dd6 | 232 | } |
shreeshas95 | 3:eec1097c0dd6 | 233 | else |
shreeshas95 | 3:eec1097c0dd6 | 234 | { |
shreeshas95 | 3:eec1097c0dd6 | 235 | check_last_frame(&last_frame); //need to put timer instead of this to avoid problems due to last_frame bit error |
shreeshas95 | 3:eec1097c0dd6 | 236 | // b = byte_no; |
shreeshas95 | 3:eec1097c0dd6 | 237 | attach_frame(t_frame, &frame_no, &byte_no); |
shreeshas95 | 3:eec1097c0dd6 | 238 | flag = 1; |
shreeshas95 | 3:eec1097c0dd6 | 239 | prev_frame->crc_pass = 0; |
shreeshas95 | 3:eec1097c0dd6 | 240 | shift_out = 0; |
shreeshas95 | 3:eec1097c0dd6 | 241 | } |
shreeshas95 | 3:eec1097c0dd6 | 242 | } |
shreeshas95 | 3:eec1097c0dd6 | 243 | post_flag(&fifo_byte, &test_byte, &shift_in); |
shreeshas95 | 3:eec1097c0dd6 | 244 | dstuff_byte = 0; |
shreeshas95 | 3:eec1097c0dd6 | 245 | } |
shreeshas95 | 3:eec1097c0dd6 | 246 | } |
shreeshas95 | 3:eec1097c0dd6 | 247 | //RX end |
shreeshas95 | 3:eec1097c0dd6 | 248 | } |
shreeshas95 | 3:eec1097c0dd6 | 249 | |
shreeshas95 | 3:eec1097c0dd6 | 250 | } |