Dummy program to demonstrate problems: working code

Dependencies:   SLCD mbed-rtos mbed

Fork of MNG_TC by Shreesha S

Committer:
shreeshas95
Date:
Thu Sep 17 14:15:00 2015 +0000
Revision:
17:2b04e53f3b1d
Parent:
14:a4c259ca0325
DUMMP program to demonstrate the problems : working

Who changed what in which revision?

UserRevisionLine numberNew contents of line
shreeshas95 8:cb93c1d3209a 1 // 8 Jul
shreeshas95 8:cb93c1d3209a 2 // did flowchart of states
shreeshas95 7:e71ecfe3a340 3
shreeshas95 8:cb93c1d3209a 4 // 7 Jul
shreeshas95 8:cb93c1d3209a 5 // done :decode should run once not every time tc received handle this
shreeshas95 8:cb93c1d3209a 6 // handle sd card with cdms team
shreeshas95 8:cb93c1d3209a 7
shreeshas95 8:cb93c1d3209a 8 // done :replace tc_list header with VAR_SPACE HEAD
shreeshas95 8:cb93c1d3209a 9 // done :delete data in rcv_tc
shreeshas95 8:cb93c1d3209a 10 // done :handle last tc in mbg and rcv_tc
shreeshas95 8:cb93c1d3209a 11 // done :delete all tc after pass
shreeshas95 8:cb93c1d3209a 12
shreeshas95 2:994e741028c7 13
shreeshas95 2:994e741028c7 14 //Jun 7
shreeshas95 2:994e741028c7 15 //PROBLEM IN DELETING TC_string pointer not solved
shreeshas95 2:994e741028c7 16
shreeshas95 2:994e741028c7 17 // Jun 6
shreeshas95 2:994e741028c7 18 // WHAT IS TC exec code in L1 ack ?
shreeshas95 2:994e741028c7 19 // Removed class and introduced namespace
shreeshas95 2:994e741028c7 20
shreeshas95 0:b5b370873460 21 // Apil 15
shreeshas95 0:b5b370873460 22 //added back printf statements
shreeshas95 0:b5b370873460 23 //added back delete TC_string for debugging
shreeshas95 0:b5b370873460 24
shreeshas95 0:b5b370873460 25 // add number of tm packets while calling snd
shreeshas95 0:b5b370873460 26 // function overloading z
shreeshas95 0:b5b370873460 27
shreeshas95 0:b5b370873460 28 // starting value of packet sequence count at each pass
shreeshas95 0:b5b370873460 29 #define PSC_START_VALUE 1
shreeshas95 0:b5b370873460 30
shreeshas95 0:b5b370873460 31 // APID list
shreeshas95 0:b5b370873460 32 #define APID_CALLSIGN 0
shreeshas95 0:b5b370873460 33 #define APID_BAE 1
shreeshas95 0:b5b370873460 34 #define APID_CDMS 2
shreeshas95 0:b5b370873460 35 #define APID_SPEED 3
shreeshas95 0:b5b370873460 36
shreeshas95 0:b5b370873460 37 // HIGH PRIORITY TC - priority list
shreeshas95 0:b5b370873460 38 // not correct values here
shreeshas95 0:b5b370873460 39 #define HPTC1 5
shreeshas95 0:b5b370873460 40 #define HPTC2 6
shreeshas95 0:b5b370873460 41 // Add more entries above
shreeshas95 0:b5b370873460 42
shreeshas95 2:994e741028c7 43 // SIZE of tc in bytes
shreeshas95 2:994e741028c7 44 #define TC_SHORT_SIZE 11
shreeshas95 2:994e741028c7 45 #define TC_LONG_SIZE 135
shreeshas95 2:994e741028c7 46
shreeshas95 0:b5b370873460 47 // TMID list
shreeshas95 0:b5b370873460 48 #define TMID_ACK_L1 10
shreeshas95 13:7b27a8e9cbb4 49 #define TM_SHORT_SIZE 13
shreeshas95 13:7b27a8e9cbb4 50 #define TM_TYPE1_SIZE 134
shreeshas95 0:b5b370873460 51
shreeshas95 8:cb93c1d3209a 52 namespace MNG_TC
shreeshas95 0:b5b370873460 53 {
shreeshas95 8:cb93c1d3209a 54 unsigned char psc = PSC_START_VALUE;
shreeshas95 8:cb93c1d3209a 55 unsigned int total_valid_TC = 0;
shreeshas95 8:cb93c1d3209a 56 bool all_crc_pass = true;
shreeshas95 8:cb93c1d3209a 57 bool no_missing_TC = true;
shreeshas95 8:cb93c1d3209a 58 unsigned int exec_count = 0;
shreeshas95 2:994e741028c7 59
shreeshas95 2:994e741028c7 60 //SECONDARY FUNCTIONS : [SHOULD NOT BE CALLED INDEPENDENTLY]
shreeshas95 2:994e741028c7 61 //USED BY MEMBER FUNCTIONS FOUND BELOW
shreeshas95 2:994e741028c7 62
shreeshas95 8:cb93c1d3209a 63 namespace L1_ACK{
shreeshas95 8:cb93c1d3209a 64
shreeshas95 8:cb93c1d3209a 65 void generate_L1_ack_TM(TM_list *tm_ptr){
shreeshas95 8:cb93c1d3209a 66 tm_ptr->next_TM = NULL;
shreeshas95 8:cb93c1d3209a 67 tm_ptr->TM_string = new unsigned char[TM_SHORT_SIZE];
shreeshas95 8:cb93c1d3209a 68 // TMID
shreeshas95 8:cb93c1d3209a 69 tm_ptr->tmid = 0xA;
shreeshas95 8:cb93c1d3209a 70 tm_ptr->TM_string[0] = 0xaf;
shreeshas95 7:e71ecfe3a340 71 }
shreeshas95 8:cb93c1d3209a 72
shreeshas95 8:cb93c1d3209a 73 void execode_crc(bool all_pass, TM_list *tm_ptr){
shreeshas95 8:cb93c1d3209a 74
shreeshas95 8:cb93c1d3209a 75 tm_ptr->TM_string[1] = ( all_crc_pass == true ) ? 0x01 : 0x00 ;
shreeshas95 8:cb93c1d3209a 76
shreeshas95 8:cb93c1d3209a 77 uint16_t crc_checksum = CRC::crc16_gen(tm_ptr->TM_string, TM_SHORT_SIZE-2);
shreeshas95 2:994e741028c7 78
shreeshas95 8:cb93c1d3209a 79 tm_ptr->TM_string[TM_SHORT_SIZE-2] = (crc_checksum >> 8) & 0xff;
shreeshas95 8:cb93c1d3209a 80 tm_ptr->TM_string[TM_SHORT_SIZE-1] = crc_checksum & 0xff;
shreeshas95 8:cb93c1d3209a 81 }
shreeshas95 2:994e741028c7 82 }
shreeshas95 2:994e741028c7 83
shreeshas95 8:cb93c1d3209a 84 namespace EXECUTION{
shreeshas95 2:994e741028c7 85
shreeshas95 8:cb93c1d3209a 86 TM_list* Manage_CDMS(TC_list *ptr_tc){
shreeshas95 8:cb93c1d3209a 87
shreeshas95 2:994e741028c7 88 // DUMMY PROGRAM TO CREATE A SAMPLE TM
shreeshas95 2:994e741028c7 89
shreeshas95 2:994e741028c7 90 // allocate memory for new tm list
shreeshas95 8:cb93c1d3209a 91 TM_list *test_TM = new TM_list;
shreeshas95 8:cb93c1d3209a 92
shreeshas95 8:cb93c1d3209a 93 test_TM->next_TM = NULL;
shreeshas95 8:cb93c1d3209a 94
shreeshas95 2:994e741028c7 95 // allocate memory for the tm string
shreeshas95 8:cb93c1d3209a 96 unsigned char *str = new unsigned char[TM_TYPE1_SIZE];
shreeshas95 8:cb93c1d3209a 97
shreeshas95 8:cb93c1d3209a 98
shreeshas95 2:994e741028c7 99 // frame type-1 is 0. [ (0 << 7) = 0 ]
shreeshas95 8:cb93c1d3209a 100 str[0] = 0;
shreeshas95 8:cb93c1d3209a 101
shreeshas95 2:994e741028c7 102 // the tmid determines type-1, or 2
shreeshas95 2:994e741028c7 103 // tmid : 0x1 belongs to type1 (dummy program)
shreeshas95 8:cb93c1d3209a 104 test_TM->tmid = 0x1;
shreeshas95 7:e71ecfe3a340 105
shreeshas95 8:cb93c1d3209a 106 // 4 bit TMID
shreeshas95 8:cb93c1d3209a 107 str[0] += (0x1) << 3;
shreeshas95 8:cb93c1d3209a 108
shreeshas95 8:cb93c1d3209a 109 // 20 bit seq. count
shreeshas95 8:cb93c1d3209a 110 str[0] += 0x7;
shreeshas95 8:cb93c1d3209a 111 str[1] = 0xff;
shreeshas95 8:cb93c1d3209a 112 str[2] = 0xff;
shreeshas95 2:994e741028c7 113
shreeshas95 8:cb93c1d3209a 114 // random data
shreeshas95 8:cb93c1d3209a 115 for(int i = 3 ; i < (TM_TYPE1_SIZE-2) ; ++i ){
shreeshas95 8:cb93c1d3209a 116 str[i] = 'a';
shreeshas95 8:cb93c1d3209a 117 }
shreeshas95 8:cb93c1d3209a 118
shreeshas95 7:e71ecfe3a340 119 // APPEND CRC : ALL THE PROCESSES HAVE TO GENERATE AND APPEND CRC
shreeshas95 8:cb93c1d3209a 120 uint16_t crc_checksum = CRC::crc16_gen(str, TM_TYPE1_SIZE-2);
shreeshas95 8:cb93c1d3209a 121 str[TM_TYPE1_SIZE-2] = (crc_checksum >> 8) & 0xff;
shreeshas95 8:cb93c1d3209a 122 str[TM_TYPE1_SIZE-1] = crc_checksum & 0xff;
shreeshas95 2:994e741028c7 123
shreeshas95 8:cb93c1d3209a 124 test_TM->TM_string = str;
shreeshas95 8:cb93c1d3209a 125
shreeshas95 8:cb93c1d3209a 126 return test_TM;
shreeshas95 7:e71ecfe3a340 127 }
shreeshas95 7:e71ecfe3a340 128
shreeshas95 8:cb93c1d3209a 129 // TM_list* RELAY(TC_list *tc_ptr){
shreeshas95 8:cb93c1d3209a 130 //
shreeshas95 8:cb93c1d3209a 131 //// FIRST send long or short tc
shreeshas95 8:cb93c1d3209a 132 // unsigned char tc_len = ( tc_ptr->short_or_long ? TC_SHORT_SIZE : TC_LONG_SIZE );
shreeshas95 8:cb93c1d3209a 133 // PC.putc( tc_len );
shreeshas95 8:cb93c1d3209a 134 //// THE TARGET SHOULD READ 'n' MORE BYTES AS FOUND IN THE FIRST BYTE
shreeshas95 8:cb93c1d3209a 135 //
shreeshas95 8:cb93c1d3209a 136 //// SEND THE TC TO THE TARGET DEVICE [ALONG WITH CRC]
shreeshas95 8:cb93c1d3209a 137 // for(unsigned int i = 0 ; i < tc_len ; ++i){
shreeshas95 8:cb93c1d3209a 138 // PC.putc( tc_ptr->TC_string[i] );
shreeshas95 8:cb93c1d3209a 139 // }
shreeshas95 8:cb93c1d3209a 140 //
shreeshas95 8:cb93c1d3209a 141 //// WAIT FOR THE TM
shreeshas95 8:cb93c1d3209a 142 // TM_list* tm_head = new TM_list;
shreeshas95 8:cb93c1d3209a 143 // TM_list* tm_ptr = tm_head;
shreeshas95 8:cb93c1d3209a 144 //
shreeshas95 8:cb93c1d3209a 145 //// FIRST RECEIVE NUMBER OF TM'S TO BE RECEVIVED
shreeshas95 8:cb93c1d3209a 146 // unsigned char tm_num = PC.getc();
shreeshas95 8:cb93c1d3209a 147 // for(unsigned int i = 0 ; i < tm_num ; ++i){
shreeshas95 8:cb93c1d3209a 148 //
shreeshas95 8:cb93c1d3209a 149 //// THEN FOR EACH TM FIRST SEND TYPE-1 OR TYPE-2 i.e. NUMBER OF BYTES TO READ
shreeshas95 8:cb93c1d3209a 150 // unsigned char tm_len = PC.getc();
shreeshas95 8:cb93c1d3209a 151 // tm_ptr->TM_string = new unsigned char[tm_len];
shreeshas95 8:cb93c1d3209a 152 // for(unsigned int j = 0 ; j < tm_len ; ++j){
shreeshas95 8:cb93c1d3209a 153 // tm_ptr->TM_string[j] = PC.getc();
shreeshas95 8:cb93c1d3209a 154 // }
shreeshas95 8:cb93c1d3209a 155 //
shreeshas95 8:cb93c1d3209a 156 //// DECODE TMID FROM THE PACKET
shreeshas95 8:cb93c1d3209a 157 // if(tm_len == 134){
shreeshas95 8:cb93c1d3209a 158 // unsigned char temp = tm_ptr->TM_string[0];
shreeshas95 8:cb93c1d3209a 159 // tm_ptr->tmid = (temp >> 3) & 0xf;
shreeshas95 8:cb93c1d3209a 160 // }
shreeshas95 8:cb93c1d3209a 161 // else{
shreeshas95 8:cb93c1d3209a 162 // unsigned char temp = tm_ptr->TM_string[4];
shreeshas95 8:cb93c1d3209a 163 // tm_ptr->tmid = (temp >> 4) & 0xf;
shreeshas95 8:cb93c1d3209a 164 // }
shreeshas95 8:cb93c1d3209a 165 //
shreeshas95 8:cb93c1d3209a 166 //// ALLOCATE MEMORY FOR NEXT TM PACKET
shreeshas95 8:cb93c1d3209a 167 // if( i == tm_num-1 ){
shreeshas95 8:cb93c1d3209a 168 // tm_ptr->next_TM = NULL;
shreeshas95 8:cb93c1d3209a 169 // }
shreeshas95 8:cb93c1d3209a 170 // else{
shreeshas95 8:cb93c1d3209a 171 // tm_ptr->next_TM = new TM_list;
shreeshas95 8:cb93c1d3209a 172 // tm_ptr = tm_ptr->next_TM;
shreeshas95 8:cb93c1d3209a 173 // }
shreeshas95 8:cb93c1d3209a 174 // }
shreeshas95 8:cb93c1d3209a 175 //
shreeshas95 8:cb93c1d3209a 176 //// FILL IN THE tm_ptr AND RETURN
shreeshas95 8:cb93c1d3209a 177 // return tm_head;
shreeshas95 8:cb93c1d3209a 178 // }
shreeshas95 2:994e741028c7 179
shreeshas95 8:cb93c1d3209a 180 bool detect_ack(TM_list *tm_ptr){
shreeshas95 8:cb93c1d3209a 181 // printf("inside detect ack : ");
shreeshas95 8:cb93c1d3209a 182 if( tm_ptr != NULL ){
shreeshas95 8:cb93c1d3209a 183 unsigned char tm_ack = tm_ptr->TM_string[3];
shreeshas95 8:cb93c1d3209a 184 tm_ack &= 0xFF;//Ack or Nack can be decided just by checking [5:6] bits
shreeshas95 8:cb93c1d3209a 185 if( (tm_ack == 0xE0) || (tm_ack == 0xA0) || (tm_ack == 0xC0) ){
shreeshas95 8:cb93c1d3209a 186 // printf("ack found\r\n");
shreeshas95 8:cb93c1d3209a 187 return true;
shreeshas95 8:cb93c1d3209a 188 }
shreeshas95 8:cb93c1d3209a 189 else{
shreeshas95 8:cb93c1d3209a 190 // printf("nack found\r\n");
shreeshas95 8:cb93c1d3209a 191 return false;
shreeshas95 8:cb93c1d3209a 192 }
shreeshas95 7:e71ecfe3a340 193 }
shreeshas95 7:e71ecfe3a340 194 else{
shreeshas95 8:cb93c1d3209a 195 // printf("nack null\r\n");
shreeshas95 7:e71ecfe3a340 196 return false;
shreeshas95 7:e71ecfe3a340 197 }
shreeshas95 2:994e741028c7 198 }
shreeshas95 8:cb93c1d3209a 199
shreeshas95 8:cb93c1d3209a 200 bool obosc_tc(TC_list *tc_ptr){
shreeshas95 8:cb93c1d3209a 201 bool OBOSC = false;
shreeshas95 8:cb93c1d3209a 202 // check apid
shreeshas95 8:cb93c1d3209a 203 if(tc_ptr->apid == 2){
shreeshas95 8:cb93c1d3209a 204 // check service type
shreeshas95 8:cb93c1d3209a 205 if( (tc_ptr->TC_string[2]) >> 4 == 0xB ){
shreeshas95 8:cb93c1d3209a 206 // check service subtype
shreeshas95 8:cb93c1d3209a 207 switch( (tc_ptr->TC_string[2]) & 0xf ){
shreeshas95 8:cb93c1d3209a 208 case 1:
shreeshas95 8:cb93c1d3209a 209 case 2:
shreeshas95 8:cb93c1d3209a 210 case 5:
shreeshas95 8:cb93c1d3209a 211 case 6:
shreeshas95 8:cb93c1d3209a 212 case 15:
shreeshas95 8:cb93c1d3209a 213 OBOSC = true;
shreeshas95 8:cb93c1d3209a 214 // printf("found obosc\r\n");
shreeshas95 8:cb93c1d3209a 215 }
shreeshas95 8:cb93c1d3209a 216 }
shreeshas95 8:cb93c1d3209a 217 }
shreeshas95 8:cb93c1d3209a 218
shreeshas95 8:cb93c1d3209a 219 return OBOSC;
shreeshas95 8:cb93c1d3209a 220 }
shreeshas95 8:cb93c1d3209a 221
shreeshas95 8:cb93c1d3209a 222 TM_list* execute_obosc(TC_list *tc_ptr){
shreeshas95 8:cb93c1d3209a 223 // printf("inside execute obosc\r\n");
shreeshas95 8:cb93c1d3209a 224 unsigned char service_subtype = (tc_ptr->TC_string[2]) & 0x0F;
shreeshas95 8:cb93c1d3209a 225 unsigned char num = 0;
shreeshas95 8:cb93c1d3209a 226 unsigned char psc = 0x00;
shreeshas95 8:cb93c1d3209a 227 switch( service_subtype ){
shreeshas95 8:cb93c1d3209a 228 case 0x01:
shreeshas95 8:cb93c1d3209a 229 // disable tc
shreeshas95 8:cb93c1d3209a 230 num = tc_ptr->TC_string[4];
shreeshas95 8:cb93c1d3209a 231 psc = tc_ptr->TC_string[3];
shreeshas95 8:cb93c1d3209a 232
shreeshas95 8:cb93c1d3209a 233 for(int i = 0 ; i < num ; ++i){
shreeshas95 8:cb93c1d3209a 234 TC_list *tcp = VAR_SPACE::Head_node;
shreeshas95 8:cb93c1d3209a 235 while( tcp != NULL ){
shreeshas95 8:cb93c1d3209a 236 if(tcp->packet_seq_count == psc){
shreeshas95 8:cb93c1d3209a 237 tcp->enabled = false;
shreeshas95 8:cb93c1d3209a 238 ++psc;
shreeshas95 8:cb93c1d3209a 239 break;
shreeshas95 8:cb93c1d3209a 240 }
shreeshas95 8:cb93c1d3209a 241 }
shreeshas95 8:cb93c1d3209a 242 }
shreeshas95 8:cb93c1d3209a 243 break;
shreeshas95 8:cb93c1d3209a 244 case 0x02:
shreeshas95 8:cb93c1d3209a 245 // enable tc
shreeshas95 8:cb93c1d3209a 246 num = tc_ptr->TC_string[4];
shreeshas95 8:cb93c1d3209a 247 psc = tc_ptr->TC_string[3];
shreeshas95 8:cb93c1d3209a 248
shreeshas95 8:cb93c1d3209a 249 for(int i = 0 ; i < num ; ++i){
shreeshas95 8:cb93c1d3209a 250 TC_list *tcp = VAR_SPACE::Head_node;
shreeshas95 8:cb93c1d3209a 251 while( tcp != NULL ){
shreeshas95 8:cb93c1d3209a 252 if(tcp->packet_seq_count == psc){
shreeshas95 8:cb93c1d3209a 253 tcp->enabled = true;
shreeshas95 8:cb93c1d3209a 254 ++psc;
shreeshas95 8:cb93c1d3209a 255 break;
shreeshas95 8:cb93c1d3209a 256 }
shreeshas95 8:cb93c1d3209a 257 }
shreeshas95 8:cb93c1d3209a 258 }
shreeshas95 8:cb93c1d3209a 259 break;
shreeshas95 8:cb93c1d3209a 260 case 0x05:
shreeshas95 8:cb93c1d3209a 261 // retry executin of tc
shreeshas95 8:cb93c1d3209a 262 psc = tc_ptr->TC_string[3];
shreeshas95 8:cb93c1d3209a 263
shreeshas95 8:cb93c1d3209a 264 break;
shreeshas95 8:cb93c1d3209a 265 }
shreeshas95 8:cb93c1d3209a 266 // generate ackL234
shreeshas95 8:cb93c1d3209a 267 return NULL;
shreeshas95 8:cb93c1d3209a 268 }
shreeshas95 8:cb93c1d3209a 269
shreeshas95 8:cb93c1d3209a 270 bool sdCardOp(TC_list* tc_ptr){
shreeshas95 8:cb93c1d3209a 271 bool readSD = false;
shreeshas95 8:cb93c1d3209a 272
shreeshas95 8:cb93c1d3209a 273 if(tc_ptr->apid == 2){
shreeshas95 8:cb93c1d3209a 274 if( ( (tc_ptr->TC_string[2]) >> 4) == 0xF ){
shreeshas95 8:cb93c1d3209a 275 switch( (tc_ptr->TC_string[2]) & 0xf ){
shreeshas95 8:cb93c1d3209a 276 case 0:
shreeshas95 8:cb93c1d3209a 277 case 1:
shreeshas95 8:cb93c1d3209a 278 case 2:
shreeshas95 8:cb93c1d3209a 279 case 3:
shreeshas95 8:cb93c1d3209a 280 case 4:
shreeshas95 8:cb93c1d3209a 281 readSD = true;
shreeshas95 8:cb93c1d3209a 282 // printf("found sdcard op\r\n");
shreeshas95 8:cb93c1d3209a 283 }
shreeshas95 8:cb93c1d3209a 284 }
shreeshas95 8:cb93c1d3209a 285 }
shreeshas95 8:cb93c1d3209a 286 return readSD;
shreeshas95 8:cb93c1d3209a 287 }
shreeshas95 8:cb93c1d3209a 288
shreeshas95 8:cb93c1d3209a 289 TM_list* CDMS_RLY_TMTC(TC_list* tc_ptr){
shreeshas95 8:cb93c1d3209a 290 return NULL;
shreeshas95 8:cb93c1d3209a 291 }
shreeshas95 8:cb93c1d3209a 292
shreeshas95 13:7b27a8e9cbb4 293 bool execute_core(TC_list *tc_ptr){
shreeshas95 8:cb93c1d3209a 294 printf("executing core psc = %u\r\n", psc);
shreeshas95 8:cb93c1d3209a 295
shreeshas95 8:cb93c1d3209a 296 if( !EXECUTION::sdCardOp(tc_ptr) ){
shreeshas95 8:cb93c1d3209a 297 // printf("not sd card op\r\n");
shreeshas95 8:cb93c1d3209a 298 TM_List *tm_ptr;
shreeshas95 8:cb93c1d3209a 299
shreeshas95 8:cb93c1d3209a 300 // call relay here
shreeshas95 8:cb93c1d3209a 301 tm_ptr = EXECUTION::CDMS_RLY_TMTC(tc_ptr);
shreeshas95 8:cb93c1d3209a 302
shreeshas95 8:cb93c1d3209a 303 // SEND DATA TO GS
shreeshas95 14:a4c259ca0325 304 // snd_tm.head_pointer(tm_ptr);
shreeshas95 13:7b27a8e9cbb4 305
shreeshas95 8:cb93c1d3209a 306 // for rolling buffer :
shreeshas95 8:cb93c1d3209a 307 // send EoS only if TM to next tc has not arrived yet
shreeshas95 8:cb93c1d3209a 308 // else put the next TM itself.
shreeshas95 8:cb93c1d3209a 309
shreeshas95 8:cb93c1d3209a 310 if( EXECUTION::detect_ack(tm_ptr) ){
shreeshas95 8:cb93c1d3209a 311 tc_ptr->exec_status = 1;
shreeshas95 8:cb93c1d3209a 312 }
shreeshas95 8:cb93c1d3209a 313 else{
shreeshas95 8:cb93c1d3209a 314 tc_ptr->exec_status = 2;
shreeshas95 8:cb93c1d3209a 315 tc_ptr->enabled = false;
shreeshas95 8:cb93c1d3209a 316 if( tc_ptr->abort_on_nack ){
shreeshas95 8:cb93c1d3209a 317 return false;
shreeshas95 8:cb93c1d3209a 318 }
shreeshas95 8:cb93c1d3209a 319 }
shreeshas95 8:cb93c1d3209a 320
shreeshas95 8:cb93c1d3209a 321 // DELETE THE TM AFTER USE
shreeshas95 8:cb93c1d3209a 322 while(tm_ptr != NULL){
shreeshas95 8:cb93c1d3209a 323 TM_list *temp = tm_ptr->next_TM;
shreeshas95 8:cb93c1d3209a 324 delete tm_ptr;
shreeshas95 8:cb93c1d3209a 325 tm_ptr = temp;
shreeshas95 8:cb93c1d3209a 326 }
shreeshas95 8:cb93c1d3209a 327 }
shreeshas95 8:cb93c1d3209a 328 else{
shreeshas95 8:cb93c1d3209a 329 // write sd card code
shreeshas95 13:7b27a8e9cbb4 330 read_TC(tc_ptr);
shreeshas95 8:cb93c1d3209a 331 }
shreeshas95 8:cb93c1d3209a 332 return true;
shreeshas95 7:e71ecfe3a340 333 }
shreeshas95 0:b5b370873460 334 }
shreeshas95 8:cb93c1d3209a 335
shreeshas95 8:cb93c1d3209a 336 // MEMBER FUNCTIONS
shreeshas95 8:cb93c1d3209a 337
shreeshas95 2:994e741028c7 338 /*
shreeshas95 2:994e741028c7 339 @brief: INITIALISE THE HEAD NODE AND RESET THE VARIABLES
shreeshas95 2:994e741028c7 340 @param: TC_list *head : head node pointer
shreeshas95 2:994e741028c7 341 @return: none
shreeshas95 2:994e741028c7 342 */
shreeshas95 8:cb93c1d3209a 343 void init(){
shreeshas95 4:f95195748a0c 344 // printf("inside init\r\n");
shreeshas95 0:b5b370873460 345 total_valid_TC = 0;
shreeshas95 0:b5b370873460 346 all_crc_pass = true;
shreeshas95 0:b5b370873460 347 no_missing_TC = true;
shreeshas95 8:cb93c1d3209a 348 psc = PSC_START_VALUE;
shreeshas95 8:cb93c1d3209a 349 exec_count = 0;
shreeshas95 2:994e741028c7 350 }
shreeshas95 2:994e741028c7 351
shreeshas95 8:cb93c1d3209a 352
shreeshas95 2:994e741028c7 353 /*
shreeshas95 2:994e741028c7 354 @brief: DELETE THE CRC FAILED TC FROM THE LIST TO FREE-UP MEMORY AND UPDATE
shreeshas95 2:994e741028c7 355 THE TOTAL VALID TC AND GENERATE L1_ACK_TM
shreeshas95 2:994e741028c7 356 @param: none
shreeshas95 8:cb93c1d3209a 357 @return: none
shreeshas95 2:994e741028c7 358 */
shreeshas95 8:cb93c1d3209a 359 void start_with(){
shreeshas95 8:cb93c1d3209a 360 printf("inside start with\r\n");
shreeshas95 8:cb93c1d3209a 361 TC_list *current_TC = VAR_SPACE::Head_node;
shreeshas95 0:b5b370873460 362
shreeshas95 0:b5b370873460 363 total_valid_TC = 0;
shreeshas95 0:b5b370873460 364 all_crc_pass = true;
shreeshas95 0:b5b370873460 365
shreeshas95 8:cb93c1d3209a 366 TM_List *l1_ack = new TM_List;
shreeshas95 8:cb93c1d3209a 367 TM_List *l1_ack_head = l1_ack;
shreeshas95 8:cb93c1d3209a 368 L1_ACK::generate_L1_ack_TM(l1_ack);
shreeshas95 0:b5b370873460 369
shreeshas95 0:b5b370873460 370 int TC_count = 0;
shreeshas95 8:cb93c1d3209a 371 // printf("outside while in start with\r\n");
shreeshas95 8:cb93c1d3209a 372 // TC_list *zing = VAR_SPACE::Head_node;
shreeshas95 8:cb93c1d3209a 373 // while(zing != NULL){
shreeshas95 8:cb93c1d3209a 374 //// printf("packet seq count = %u\r\n", zing->packet_seq_count);
shreeshas95 8:cb93c1d3209a 375 // zing = zing->next_TC;
shreeshas95 8:cb93c1d3209a 376 // }
shreeshas95 2:994e741028c7 377 while(current_TC != NULL){
shreeshas95 2:994e741028c7 378
shreeshas95 2:994e741028c7 379 unsigned char temp = 0;
shreeshas95 2:994e741028c7 380
shreeshas95 2:994e741028c7 381 // FILL PSC of the TC [ don't care whether crc pass or fail ]
shreeshas95 2:994e741028c7 382 // PSC starts from 4th byte
shreeshas95 2:994e741028c7 383 l1_ack->TM_string[3+TC_count] = current_TC->TC_string[0];
shreeshas95 0:b5b370873460 384
shreeshas95 2:994e741028c7 385 // IF CRC PASS
shreeshas95 0:b5b370873460 386 if( current_TC->crc_pass ){
shreeshas95 0:b5b370873460 387 ++total_valid_TC;
shreeshas95 8:cb93c1d3209a 388 printf("correct start with: psc = %u, short = %u\r\n", current_TC->packet_seq_count, (current_TC->short_or_long) ? 1 : 0 );
shreeshas95 0:b5b370873460 389
shreeshas95 2:994e741028c7 390 // set the crc pass field in TC_STATUS ???
shreeshas95 2:994e741028c7 391 temp = l1_ack->TM_string[2];
shreeshas95 2:994e741028c7 392 temp |= ( 1 << (7-TC_count) );
shreeshas95 2:994e741028c7 393 l1_ack->TM_string[2] = temp;
shreeshas95 0:b5b370873460 394
shreeshas95 2:994e741028c7 395 // advance to the next node
shreeshas95 0:b5b370873460 396 current_TC = current_TC->next_TC;
shreeshas95 0:b5b370873460 397 }
shreeshas95 2:994e741028c7 398 // if crc fail
shreeshas95 0:b5b370873460 399 else{
shreeshas95 8:cb93c1d3209a 400 printf("crc fail start with: psc = %u\r\n", current_TC->packet_seq_count);
shreeshas95 2:994e741028c7 401 // unset the crc pass field in TC_STATUS
shreeshas95 2:994e741028c7 402 temp = l1_ack->TM_string[2];
shreeshas95 2:994e741028c7 403 temp &= ~( 1 << (7-TC_count) );
shreeshas95 2:994e741028c7 404 l1_ack->TM_string[2] = temp;
shreeshas95 0:b5b370873460 405
shreeshas95 7:e71ecfe3a340 406 current_TC = current_TC->next_TC;
shreeshas95 0:b5b370873460 407 all_crc_pass = false;
shreeshas95 0:b5b370873460 408 }
shreeshas95 0:b5b370873460 409 ++TC_count;
shreeshas95 0:b5b370873460 410
shreeshas95 2:994e741028c7 411 // extend the TM linked list if TC_count > 7
shreeshas95 2:994e741028c7 412 if(TC_count > 7){
shreeshas95 2:994e741028c7 413 TC_count = 0;
shreeshas95 2:994e741028c7 414
shreeshas95 8:cb93c1d3209a 415 l1_ack->next_TM = new TM_List;
shreeshas95 2:994e741028c7 416 l1_ack = l1_ack->next_TM;
shreeshas95 8:cb93c1d3209a 417 L1_ACK::generate_L1_ack_TM(l1_ack);
shreeshas95 2:994e741028c7 418
shreeshas95 2:994e741028c7 419 // FILL TC_EXEC_CODE
shreeshas95 2:994e741028c7 420 // APPEND CRC TO THE TM
shreeshas95 8:cb93c1d3209a 421 L1_ACK::execode_crc( all_crc_pass, l1_ack );
shreeshas95 2:994e741028c7 422 }
shreeshas95 1:df31097c8442 423 }
shreeshas95 1:df31097c8442 424
shreeshas95 8:cb93c1d3209a 425 // FILL UP THE REMAINING FIELDS WITH ZEROS
shreeshas95 2:994e741028c7 426 while(TC_count < 8){
shreeshas95 2:994e741028c7 427 l1_ack->TM_string[2] &= ~( 1 << (7-TC_count) );
shreeshas95 8:cb93c1d3209a 428 // l1_ack->TM_string[3+TC_count] = 0;
shreeshas95 8:cb93c1d3209a 429 l1_ack->TM_string[3+TC_count] = 0x01;
shreeshas95 2:994e741028c7 430 ++TC_count;
shreeshas95 2:994e741028c7 431 }
shreeshas95 2:994e741028c7 432
shreeshas95 2:994e741028c7 433 // FILL TC_EXEC_CODE
shreeshas95 2:994e741028c7 434 // APPEND CRC TO THE TM
shreeshas95 14:a4c259ca0325 435 L1_ACK::execode_crc(all_crc_pass, l1_ack);
shreeshas95 2:994e741028c7 436
shreeshas95 14:a4c259ca0325 437 printf("Sending\r\n");
shreeshas95 14:a4c259ca0325 438 snd_tm.head_pointer(l1_ack_head);
shreeshas95 14:a4c259ca0325 439 printf("Sent\r\n");
shreeshas95 2:994e741028c7 440
shreeshas95 2:994e741028c7 441 // delete the TM
shreeshas95 2:994e741028c7 442 l1_ack = l1_ack_head;
shreeshas95 2:994e741028c7 443 while(l1_ack != NULL){
shreeshas95 8:cb93c1d3209a 444 TM_List *temp = l1_ack->next_TM;
shreeshas95 14:a4c259ca0325 445
shreeshas95 14:a4c259ca0325 446 // print
shreeshas95 14:a4c259ca0325 447 for(int i = 0 ; i < 13 ; ++i){
shreeshas95 14:a4c259ca0325 448 std::bitset<8> b = l1_ack->TM_string[i];
shreeshas95 14:a4c259ca0325 449 cout << b << " ";
shreeshas95 14:a4c259ca0325 450 }
shreeshas95 14:a4c259ca0325 451 cout << ENDL;
shreeshas95 14:a4c259ca0325 452
shreeshas95 2:994e741028c7 453 delete l1_ack;
shreeshas95 2:994e741028c7 454 l1_ack = temp;
shreeshas95 0:b5b370873460 455 }
shreeshas95 8:cb93c1d3209a 456 printf("finished start_with()\r\n");
shreeshas95 7:e71ecfe3a340 457 }
shreeshas95 0:b5b370873460 458
shreeshas95 2:994e741028c7 459 /*
shreeshas95 8:cb93c1d3209a 460 @brief: check for missing tc, also check crc, i.e.
shreeshas95 8:cb93c1d3209a 461 if true execution can be started else have to wait
shreeshas95 2:994e741028c7 462 @param: none
shreeshas95 8:cb93c1d3209a 463 @return: bool indicating whether there are missing tc
shreeshas95 2:994e741028c7 464 */
shreeshas95 8:cb93c1d3209a 465 bool check_for_missing_TC(void){
shreeshas95 8:cb93c1d3209a 466 printf("checking for missing tc\r\n");
shreeshas95 0:b5b370873460 467 no_missing_TC = true;
shreeshas95 2:994e741028c7 468
shreeshas95 8:cb93c1d3209a 469 // printf("total valid = %u\r\n", total_valid_TC);
shreeshas95 8:cb93c1d3209a 470
shreeshas95 8:cb93c1d3209a 471 for(unsigned char p = PSC_START_VALUE ; p < (total_valid_TC + PSC_START_VALUE) ; ++p){
shreeshas95 0:b5b370873460 472 bool flag = false;
shreeshas95 8:cb93c1d3209a 473 TC_list *node_ptr = VAR_SPACE::Head_node;
shreeshas95 8:cb93c1d3209a 474 // printf("checking for psc = %u\r\n", p);
shreeshas95 2:994e741028c7 475
shreeshas95 0:b5b370873460 476 while(node_ptr != NULL){
shreeshas95 8:cb93c1d3209a 477 // printf("packet seq count = %u\t", node_ptr->packet_seq_count);
shreeshas95 8:cb93c1d3209a 478 if( (node_ptr->packet_seq_count == p) && (node_ptr->crc_pass) ){
shreeshas95 0:b5b370873460 479 flag = true;
shreeshas95 0:b5b370873460 480 break;
shreeshas95 0:b5b370873460 481 }
shreeshas95 0:b5b370873460 482 else{
shreeshas95 0:b5b370873460 483 node_ptr = node_ptr->next_TC;
shreeshas95 0:b5b370873460 484 }
shreeshas95 0:b5b370873460 485 }
shreeshas95 8:cb93c1d3209a 486 // printf("\r\n");
shreeshas95 2:994e741028c7 487 if(flag == false){
shreeshas95 0:b5b370873460 488 no_missing_TC = false;
shreeshas95 2:994e741028c7 489 break;
shreeshas95 0:b5b370873460 490 }
shreeshas95 0:b5b370873460 491 }
shreeshas95 2:994e741028c7 492
shreeshas95 8:cb93c1d3209a 493 printf("returning from check for missing tc : %u\r\n", no_missing_TC ? 1 : 0);
shreeshas95 2:994e741028c7 494 if(no_missing_TC){
shreeshas95 8:cb93c1d3209a 495 return true;
shreeshas95 2:994e741028c7 496 }
shreeshas95 2:994e741028c7 497 else{
shreeshas95 8:cb93c1d3209a 498 return false;
shreeshas95 2:994e741028c7 499 }
shreeshas95 0:b5b370873460 500 }
shreeshas95 0:b5b370873460 501
shreeshas95 8:cb93c1d3209a 502
shreeshas95 8:cb93c1d3209a 503
shreeshas95 2:994e741028c7 504 /*
shreeshas95 2:994e741028c7 505 RUN start_with() before running execute_TC()
shreeshas95 2:994e741028c7 506 V1.0
shreeshas95 2:994e741028c7 507 @brief: EXECUTE THE LIST OF TCs, WITH A SEQUENCE BASED ON PSC
shreeshas95 2:994e741028c7 508 SEND THE TC TO THE TARGET AND WAIT FOR THE TM
shreeshas95 2:994e741028c7 509 THEN FORWARD IT TO GS
shreeshas95 2:994e741028c7 510 @param: none
shreeshas95 2:994e741028c7 511 @return: none
shreeshas95 2:994e741028c7 512 */
shreeshas95 8:cb93c1d3209a 513 TC_list *Second_head = NULL;
shreeshas95 0:b5b370873460 514 void execute_TC(){
shreeshas95 2:994e741028c7 515 // EXECUTE ACCORDING TO THE PSC VALUE
shreeshas95 8:cb93c1d3209a 516 printf("inside execute tc : total valid tc = %u, psc = %u\r\n", total_valid_TC, psc);
shreeshas95 0:b5b370873460 517 while( psc < (total_valid_TC+PSC_START_VALUE) ){
shreeshas95 8:cb93c1d3209a 518 // printf("Iterating : psc = %u\r\n", psc);
shreeshas95 8:cb93c1d3209a 519 // check for new tc received
shreeshas95 8:cb93c1d3209a 520 bool exec_flag_local = false;
shreeshas95 8:cb93c1d3209a 521 if( VAR_SPACE::new_tc_received ){
shreeshas95 8:cb93c1d3209a 522 printf("inaside new tc rx in obosc\r\n");
shreeshas95 8:cb93c1d3209a 523 VAR_SPACE::new_tc_received = false;
shreeshas95 8:cb93c1d3209a 524
shreeshas95 8:cb93c1d3209a 525 VAR_SPACE::data_node = VAR_SPACE::head_data;
shreeshas95 8:cb93c1d3209a 526 Second_head = VAR_SPACE::last_node;
shreeshas95 8:cb93c1d3209a 527 COM_RCV_TC::rx_rcv_tc();
shreeshas95 8:cb93c1d3209a 528 Second_head = Second_head->next_TC;
shreeshas95 8:cb93c1d3209a 529 exec_flag_local = true;
shreeshas95 8:cb93c1d3209a 530 }
shreeshas95 8:cb93c1d3209a 531 else if( VAR_SPACE::execute_obosc ){
shreeshas95 8:cb93c1d3209a 532 printf("execute obosc flag found\r\n");
shreeshas95 8:cb93c1d3209a 533 exec_flag_local = true;
shreeshas95 8:cb93c1d3209a 534 }
shreeshas95 8:cb93c1d3209a 535 if( exec_flag_local ){
shreeshas95 8:cb93c1d3209a 536 exec_flag_local = false;
shreeshas95 8:cb93c1d3209a 537
shreeshas95 8:cb93c1d3209a 538 start_with();
shreeshas95 8:cb93c1d3209a 539
shreeshas95 8:cb93c1d3209a 540 if( !check_for_missing_TC() ){
shreeshas95 8:cb93c1d3209a 541 VAR_SPACE::rx_state = 3;
shreeshas95 8:cb93c1d3209a 542 printf("exiting from obosc\r\n");
shreeshas95 8:cb93c1d3209a 543 return;
shreeshas95 8:cb93c1d3209a 544 }
shreeshas95 8:cb93c1d3209a 545 else{
shreeshas95 8:cb93c1d3209a 546 printf("executing obosc\r\n");
shreeshas95 8:cb93c1d3209a 547 // no missing tc : execute urgent
shreeshas95 8:cb93c1d3209a 548 TC_list *tcp = Second_head;
shreeshas95 8:cb93c1d3209a 549 while( tcp != NULL ){
shreeshas95 8:cb93c1d3209a 550 if( EXECUTION::obosc_tc(tcp) ){
shreeshas95 8:cb93c1d3209a 551 TM_list *tm_ptr = EXECUTION::execute_obosc(tcp);
shreeshas95 14:a4c259ca0325 552 // snd_tm.head_pointer(tm_ptr);
shreeshas95 8:cb93c1d3209a 553 if( EXECUTION::detect_ack(tm_ptr) ){
shreeshas95 8:cb93c1d3209a 554 tcp->exec_status = 1;
shreeshas95 8:cb93c1d3209a 555 }
shreeshas95 8:cb93c1d3209a 556 else{
shreeshas95 8:cb93c1d3209a 557 tcp->exec_status = 2;
shreeshas95 8:cb93c1d3209a 558 if( tcp->abort_on_nack ){
shreeshas95 8:cb93c1d3209a 559 tcp->enabled = false;
shreeshas95 8:cb93c1d3209a 560 VAR_SPACE::rx_state = 0;
shreeshas95 8:cb93c1d3209a 561 printf("exiting from obosc due to abort on nack\r\n");
shreeshas95 8:cb93c1d3209a 562 VAR_SPACE::rx_state = 0;
shreeshas95 8:cb93c1d3209a 563 return;
shreeshas95 8:cb93c1d3209a 564 }
shreeshas95 8:cb93c1d3209a 565 }
shreeshas95 8:cb93c1d3209a 566 }
shreeshas95 8:cb93c1d3209a 567 tcp = tcp->next_TC;
shreeshas95 8:cb93c1d3209a 568 }
shreeshas95 8:cb93c1d3209a 569 }
shreeshas95 8:cb93c1d3209a 570 VAR_SPACE::execute_obosc = false;
shreeshas95 8:cb93c1d3209a 571 VAR_SPACE::rx_state = 2;
shreeshas95 8:cb93c1d3209a 572 }
shreeshas95 7:e71ecfe3a340 573
shreeshas95 8:cb93c1d3209a 574 TC_list *tc_ptr = VAR_SPACE::Head_node;
shreeshas95 2:994e741028c7 575 // FIND THE TC CORRESPONDING TO THE PSC VALUE
shreeshas95 2:994e741028c7 576 while(tc_ptr != NULL){
shreeshas95 8:cb93c1d3209a 577 // printf("in while : psc = %u\r\n", psc);
shreeshas95 8:cb93c1d3209a 578 if( (tc_ptr->packet_seq_count == psc) && (tc_ptr->crc_pass)){
shreeshas95 2:994e741028c7 579 // THE TC WITH THE REQUIRED PSC HAS BEEN FOUND, NOW EXECUTE
shreeshas95 7:e71ecfe3a340 580
shreeshas95 8:cb93c1d3209a 581 if( (tc_ptr->exec_status == 0) || ((tc_ptr->exec_status == 2) && (tc_ptr->enabled)) ){
shreeshas95 8:cb93c1d3209a 582 // execute tc
shreeshas95 7:e71ecfe3a340 583
shreeshas95 8:cb93c1d3209a 584 ++exec_count;
shreeshas95 8:cb93c1d3209a 585 if( EXECUTION::execute_core(tc_ptr) ){
shreeshas95 8:cb93c1d3209a 586 // THE TC WITH APPROPRIATE PSC IS EXECUTED, START OVER
shreeshas95 8:cb93c1d3209a 587 break;
shreeshas95 7:e71ecfe3a340 588 }
shreeshas95 7:e71ecfe3a340 589 else{
shreeshas95 8:cb93c1d3209a 590 printf("returning due to abort on nack\r\n");
shreeshas95 8:cb93c1d3209a 591 // do something for the unexecuted telecommands
shreeshas95 8:cb93c1d3209a 592 VAR_SPACE::rx_state = 0;
shreeshas95 8:cb93c1d3209a 593 return;
shreeshas95 7:e71ecfe3a340 594 }
shreeshas95 0:b5b370873460 595 }
shreeshas95 2:994e741028c7 596
shreeshas95 8:cb93c1d3209a 597 else{
shreeshas95 8:cb93c1d3209a 598 // either (execution failed and disabled) or (successful executed) hence break
shreeshas95 8:cb93c1d3209a 599 break;
shreeshas95 8:cb93c1d3209a 600 }
shreeshas95 0:b5b370873460 601 }
shreeshas95 2:994e741028c7 602 tc_ptr = tc_ptr->next_TC;
shreeshas95 0:b5b370873460 603 }
shreeshas95 8:cb93c1d3209a 604 ++psc;
shreeshas95 7:e71ecfe3a340 605 }
shreeshas95 8:cb93c1d3209a 606 VAR_SPACE::rx_state = 0;
shreeshas95 8:cb93c1d3209a 607 printf("exiting after successfully executing tc, total executed = %u\r\n", exec_count);
shreeshas95 7:e71ecfe3a340 608 }
shreeshas95 8:cb93c1d3209a 609 }