TELECOMMAND MANAGER V1

Dependencies:   mbed SLCD mbed-rtos

Committer:
shreeshas95
Date:
Thu Sep 17 13:54:08 2015 +0000
Revision:
16:de2224dd9a0d
Parent:
13:7b27a8e9cbb4
Child:
14:a4c259ca0325
DUMMY program to demostrate the problems

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 13:7b27a8e9cbb4 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 8:cb93c1d3209a 435 L1_ACK::execode_crc(all_crc_pass, l1_ack);
shreeshas95 2:994e741028c7 436
shreeshas95 13:7b27a8e9cbb4 437 snd_tm.head_pointer(l1_ack);
shreeshas95 2:994e741028c7 438
shreeshas95 2:994e741028c7 439 // delete the TM
shreeshas95 2:994e741028c7 440 l1_ack = l1_ack_head;
shreeshas95 2:994e741028c7 441 while(l1_ack != NULL){
shreeshas95 8:cb93c1d3209a 442 TM_List *temp = l1_ack->next_TM;
shreeshas95 2:994e741028c7 443 delete l1_ack;
shreeshas95 2:994e741028c7 444 l1_ack = temp;
shreeshas95 0:b5b370873460 445 }
shreeshas95 8:cb93c1d3209a 446 printf("finished start_with()\r\n");
shreeshas95 7:e71ecfe3a340 447 }
shreeshas95 0:b5b370873460 448
shreeshas95 2:994e741028c7 449 /*
shreeshas95 8:cb93c1d3209a 450 @brief: check for missing tc, also check crc, i.e.
shreeshas95 8:cb93c1d3209a 451 if true execution can be started else have to wait
shreeshas95 2:994e741028c7 452 @param: none
shreeshas95 8:cb93c1d3209a 453 @return: bool indicating whether there are missing tc
shreeshas95 2:994e741028c7 454 */
shreeshas95 8:cb93c1d3209a 455 bool check_for_missing_TC(void){
shreeshas95 8:cb93c1d3209a 456 printf("checking for missing tc\r\n");
shreeshas95 0:b5b370873460 457 no_missing_TC = true;
shreeshas95 2:994e741028c7 458
shreeshas95 8:cb93c1d3209a 459 // printf("total valid = %u\r\n", total_valid_TC);
shreeshas95 8:cb93c1d3209a 460
shreeshas95 8:cb93c1d3209a 461 for(unsigned char p = PSC_START_VALUE ; p < (total_valid_TC + PSC_START_VALUE) ; ++p){
shreeshas95 0:b5b370873460 462 bool flag = false;
shreeshas95 8:cb93c1d3209a 463 TC_list *node_ptr = VAR_SPACE::Head_node;
shreeshas95 8:cb93c1d3209a 464 // printf("checking for psc = %u\r\n", p);
shreeshas95 2:994e741028c7 465
shreeshas95 0:b5b370873460 466 while(node_ptr != NULL){
shreeshas95 8:cb93c1d3209a 467 // printf("packet seq count = %u\t", node_ptr->packet_seq_count);
shreeshas95 8:cb93c1d3209a 468 if( (node_ptr->packet_seq_count == p) && (node_ptr->crc_pass) ){
shreeshas95 0:b5b370873460 469 flag = true;
shreeshas95 0:b5b370873460 470 break;
shreeshas95 0:b5b370873460 471 }
shreeshas95 0:b5b370873460 472 else{
shreeshas95 0:b5b370873460 473 node_ptr = node_ptr->next_TC;
shreeshas95 0:b5b370873460 474 }
shreeshas95 0:b5b370873460 475 }
shreeshas95 8:cb93c1d3209a 476 // printf("\r\n");
shreeshas95 2:994e741028c7 477 if(flag == false){
shreeshas95 0:b5b370873460 478 no_missing_TC = false;
shreeshas95 2:994e741028c7 479 break;
shreeshas95 0:b5b370873460 480 }
shreeshas95 0:b5b370873460 481 }
shreeshas95 2:994e741028c7 482
shreeshas95 8:cb93c1d3209a 483 printf("returning from check for missing tc : %u\r\n", no_missing_TC ? 1 : 0);
shreeshas95 2:994e741028c7 484 if(no_missing_TC){
shreeshas95 8:cb93c1d3209a 485 return true;
shreeshas95 2:994e741028c7 486 }
shreeshas95 2:994e741028c7 487 else{
shreeshas95 8:cb93c1d3209a 488 return false;
shreeshas95 2:994e741028c7 489 }
shreeshas95 0:b5b370873460 490 }
shreeshas95 0:b5b370873460 491
shreeshas95 8:cb93c1d3209a 492
shreeshas95 8:cb93c1d3209a 493
shreeshas95 2:994e741028c7 494 /*
shreeshas95 2:994e741028c7 495 RUN start_with() before running execute_TC()
shreeshas95 2:994e741028c7 496 V1.0
shreeshas95 2:994e741028c7 497 @brief: EXECUTE THE LIST OF TCs, WITH A SEQUENCE BASED ON PSC
shreeshas95 2:994e741028c7 498 SEND THE TC TO THE TARGET AND WAIT FOR THE TM
shreeshas95 2:994e741028c7 499 THEN FORWARD IT TO GS
shreeshas95 2:994e741028c7 500 @param: none
shreeshas95 2:994e741028c7 501 @return: none
shreeshas95 2:994e741028c7 502 */
shreeshas95 8:cb93c1d3209a 503 TC_list *Second_head = NULL;
shreeshas95 0:b5b370873460 504 void execute_TC(){
shreeshas95 2:994e741028c7 505 // EXECUTE ACCORDING TO THE PSC VALUE
shreeshas95 8:cb93c1d3209a 506 printf("inside execute tc : total valid tc = %u, psc = %u\r\n", total_valid_TC, psc);
shreeshas95 0:b5b370873460 507 while( psc < (total_valid_TC+PSC_START_VALUE) ){
shreeshas95 8:cb93c1d3209a 508 // printf("Iterating : psc = %u\r\n", psc);
shreeshas95 8:cb93c1d3209a 509 // check for new tc received
shreeshas95 8:cb93c1d3209a 510 bool exec_flag_local = false;
shreeshas95 8:cb93c1d3209a 511 if( VAR_SPACE::new_tc_received ){
shreeshas95 8:cb93c1d3209a 512 printf("inaside new tc rx in obosc\r\n");
shreeshas95 8:cb93c1d3209a 513 VAR_SPACE::new_tc_received = false;
shreeshas95 8:cb93c1d3209a 514
shreeshas95 8:cb93c1d3209a 515 VAR_SPACE::data_node = VAR_SPACE::head_data;
shreeshas95 8:cb93c1d3209a 516 Second_head = VAR_SPACE::last_node;
shreeshas95 8:cb93c1d3209a 517 COM_RCV_TC::rx_rcv_tc();
shreeshas95 8:cb93c1d3209a 518 Second_head = Second_head->next_TC;
shreeshas95 8:cb93c1d3209a 519 exec_flag_local = true;
shreeshas95 8:cb93c1d3209a 520 }
shreeshas95 8:cb93c1d3209a 521 else if( VAR_SPACE::execute_obosc ){
shreeshas95 8:cb93c1d3209a 522 printf("execute obosc flag found\r\n");
shreeshas95 8:cb93c1d3209a 523 exec_flag_local = true;
shreeshas95 8:cb93c1d3209a 524 }
shreeshas95 8:cb93c1d3209a 525 if( exec_flag_local ){
shreeshas95 8:cb93c1d3209a 526 exec_flag_local = false;
shreeshas95 8:cb93c1d3209a 527
shreeshas95 8:cb93c1d3209a 528 start_with();
shreeshas95 8:cb93c1d3209a 529
shreeshas95 8:cb93c1d3209a 530 if( !check_for_missing_TC() ){
shreeshas95 8:cb93c1d3209a 531 VAR_SPACE::rx_state = 3;
shreeshas95 8:cb93c1d3209a 532 printf("exiting from obosc\r\n");
shreeshas95 8:cb93c1d3209a 533 return;
shreeshas95 8:cb93c1d3209a 534 }
shreeshas95 8:cb93c1d3209a 535 else{
shreeshas95 8:cb93c1d3209a 536 printf("executing obosc\r\n");
shreeshas95 8:cb93c1d3209a 537 // no missing tc : execute urgent
shreeshas95 8:cb93c1d3209a 538 TC_list *tcp = Second_head;
shreeshas95 8:cb93c1d3209a 539 while( tcp != NULL ){
shreeshas95 8:cb93c1d3209a 540 if( EXECUTION::obosc_tc(tcp) ){
shreeshas95 8:cb93c1d3209a 541 TM_list *tm_ptr = EXECUTION::execute_obosc(tcp);
shreeshas95 13:7b27a8e9cbb4 542 snd_tm.head_pointer(tm_ptr);
shreeshas95 8:cb93c1d3209a 543 if( EXECUTION::detect_ack(tm_ptr) ){
shreeshas95 8:cb93c1d3209a 544 tcp->exec_status = 1;
shreeshas95 8:cb93c1d3209a 545 }
shreeshas95 8:cb93c1d3209a 546 else{
shreeshas95 8:cb93c1d3209a 547 tcp->exec_status = 2;
shreeshas95 8:cb93c1d3209a 548 if( tcp->abort_on_nack ){
shreeshas95 8:cb93c1d3209a 549 tcp->enabled = false;
shreeshas95 8:cb93c1d3209a 550 VAR_SPACE::rx_state = 0;
shreeshas95 8:cb93c1d3209a 551 printf("exiting from obosc due to abort on nack\r\n");
shreeshas95 8:cb93c1d3209a 552 VAR_SPACE::rx_state = 0;
shreeshas95 8:cb93c1d3209a 553 return;
shreeshas95 8:cb93c1d3209a 554 }
shreeshas95 8:cb93c1d3209a 555 }
shreeshas95 8:cb93c1d3209a 556 }
shreeshas95 8:cb93c1d3209a 557 tcp = tcp->next_TC;
shreeshas95 8:cb93c1d3209a 558 }
shreeshas95 8:cb93c1d3209a 559 }
shreeshas95 8:cb93c1d3209a 560 VAR_SPACE::execute_obosc = false;
shreeshas95 8:cb93c1d3209a 561 VAR_SPACE::rx_state = 2;
shreeshas95 8:cb93c1d3209a 562 }
shreeshas95 7:e71ecfe3a340 563
shreeshas95 8:cb93c1d3209a 564 TC_list *tc_ptr = VAR_SPACE::Head_node;
shreeshas95 2:994e741028c7 565 // FIND THE TC CORRESPONDING TO THE PSC VALUE
shreeshas95 2:994e741028c7 566 while(tc_ptr != NULL){
shreeshas95 8:cb93c1d3209a 567 // printf("in while : psc = %u\r\n", psc);
shreeshas95 8:cb93c1d3209a 568 if( (tc_ptr->packet_seq_count == psc) && (tc_ptr->crc_pass)){
shreeshas95 2:994e741028c7 569 // THE TC WITH THE REQUIRED PSC HAS BEEN FOUND, NOW EXECUTE
shreeshas95 7:e71ecfe3a340 570
shreeshas95 8:cb93c1d3209a 571 if( (tc_ptr->exec_status == 0) || ((tc_ptr->exec_status == 2) && (tc_ptr->enabled)) ){
shreeshas95 8:cb93c1d3209a 572 // execute tc
shreeshas95 7:e71ecfe3a340 573
shreeshas95 8:cb93c1d3209a 574 ++exec_count;
shreeshas95 8:cb93c1d3209a 575 if( EXECUTION::execute_core(tc_ptr) ){
shreeshas95 8:cb93c1d3209a 576 // THE TC WITH APPROPRIATE PSC IS EXECUTED, START OVER
shreeshas95 8:cb93c1d3209a 577 break;
shreeshas95 7:e71ecfe3a340 578 }
shreeshas95 7:e71ecfe3a340 579 else{
shreeshas95 8:cb93c1d3209a 580 printf("returning due to abort on nack\r\n");
shreeshas95 8:cb93c1d3209a 581 // do something for the unexecuted telecommands
shreeshas95 8:cb93c1d3209a 582 VAR_SPACE::rx_state = 0;
shreeshas95 8:cb93c1d3209a 583 return;
shreeshas95 7:e71ecfe3a340 584 }
shreeshas95 0:b5b370873460 585 }
shreeshas95 2:994e741028c7 586
shreeshas95 8:cb93c1d3209a 587 else{
shreeshas95 8:cb93c1d3209a 588 // either (execution failed and disabled) or (successful executed) hence break
shreeshas95 8:cb93c1d3209a 589 break;
shreeshas95 8:cb93c1d3209a 590 }
shreeshas95 0:b5b370873460 591 }
shreeshas95 2:994e741028c7 592 tc_ptr = tc_ptr->next_TC;
shreeshas95 0:b5b370873460 593 }
shreeshas95 8:cb93c1d3209a 594 ++psc;
shreeshas95 7:e71ecfe3a340 595 }
shreeshas95 8:cb93c1d3209a 596 VAR_SPACE::rx_state = 0;
shreeshas95 8:cb93c1d3209a 597 printf("exiting after successfully executing tc, total executed = %u\r\n", exec_count);
shreeshas95 7:e71ecfe3a340 598 }
shreeshas95 8:cb93c1d3209a 599 }