TELECOMMAND MANAGER V1

Dependencies:   mbed SLCD mbed-rtos

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?

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