Dummy program to demonstrate problems: working code

Dependencies:   SLCD mbed-rtos mbed

Fork of MNG_TC by Shreesha S

Committer:
shreeshas95
Date:
Thu Jul 16 06:53:38 2015 +0000
Revision:
9:934fdce72b3d
Parent:
8:cb93c1d3209a
thread testing

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