Dummy program to demonstrate problems: working code

Dependencies:   SLCD mbed-rtos mbed

Fork of MNG_TC by Shreesha S

Committer:
shreeshas95
Date:
Mon Jul 13 10:21:45 2015 +0000
Revision:
8:cb93c1d3209a
Parent:
7:e71ecfe3a340
Child:
9:934fdce72b3d
Child:
11:109f16cc35d7
Child:
13:7b27a8e9cbb4
everything except snd_tm working : update snd tm

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 // printf("inside execute obosc\r\n");
shreeshas95 8:cb93c1d3209a 222 unsigned char service_subtype = (tc_ptr->TC_string[2]) & 0x0F;
shreeshas95 8:cb93c1d3209a 223 unsigned char num = 0;
shreeshas95 8:cb93c1d3209a 224 unsigned char psc = 0x00;
shreeshas95 8:cb93c1d3209a 225 switch( service_subtype ){
shreeshas95 8:cb93c1d3209a 226 case 0x01:
shreeshas95 8:cb93c1d3209a 227 // disable tc
shreeshas95 8:cb93c1d3209a 228 num = tc_ptr->TC_string[4];
shreeshas95 8:cb93c1d3209a 229 psc = tc_ptr->TC_string[3];
shreeshas95 8:cb93c1d3209a 230
shreeshas95 8:cb93c1d3209a 231 for(int i = 0 ; i < num ; ++i){
shreeshas95 8:cb93c1d3209a 232 TC_list *tcp = VAR_SPACE::Head_node;
shreeshas95 8:cb93c1d3209a 233 while( tcp != NULL ){
shreeshas95 8:cb93c1d3209a 234 if(tcp->packet_seq_count == psc){
shreeshas95 8:cb93c1d3209a 235 tcp->enabled = false;
shreeshas95 8:cb93c1d3209a 236 ++psc;
shreeshas95 8:cb93c1d3209a 237 break;
shreeshas95 8:cb93c1d3209a 238 }
shreeshas95 8:cb93c1d3209a 239 }
shreeshas95 8:cb93c1d3209a 240 }
shreeshas95 8:cb93c1d3209a 241 break;
shreeshas95 8:cb93c1d3209a 242 case 0x02:
shreeshas95 8:cb93c1d3209a 243 // enable tc
shreeshas95 8:cb93c1d3209a 244 num = tc_ptr->TC_string[4];
shreeshas95 8:cb93c1d3209a 245 psc = tc_ptr->TC_string[3];
shreeshas95 8:cb93c1d3209a 246
shreeshas95 8:cb93c1d3209a 247 for(int i = 0 ; i < num ; ++i){
shreeshas95 8:cb93c1d3209a 248 TC_list *tcp = VAR_SPACE::Head_node;
shreeshas95 8:cb93c1d3209a 249 while( tcp != NULL ){
shreeshas95 8:cb93c1d3209a 250 if(tcp->packet_seq_count == psc){
shreeshas95 8:cb93c1d3209a 251 tcp->enabled = true;
shreeshas95 8:cb93c1d3209a 252 ++psc;
shreeshas95 8:cb93c1d3209a 253 break;
shreeshas95 8:cb93c1d3209a 254 }
shreeshas95 8:cb93c1d3209a 255 }
shreeshas95 8:cb93c1d3209a 256 }
shreeshas95 8:cb93c1d3209a 257 break;
shreeshas95 8:cb93c1d3209a 258 case 0x05:
shreeshas95 8:cb93c1d3209a 259 // retry executin of tc
shreeshas95 8:cb93c1d3209a 260 psc = tc_ptr->TC_string[3];
shreeshas95 8:cb93c1d3209a 261
shreeshas95 8:cb93c1d3209a 262 break;
shreeshas95 8:cb93c1d3209a 263 }
shreeshas95 8:cb93c1d3209a 264 // generate ackL234
shreeshas95 8:cb93c1d3209a 265 return NULL;
shreeshas95 8:cb93c1d3209a 266 }
shreeshas95 8:cb93c1d3209a 267
shreeshas95 8:cb93c1d3209a 268 bool sdCardOp(TC_list* tc_ptr){
shreeshas95 8:cb93c1d3209a 269 bool readSD = false;
shreeshas95 8:cb93c1d3209a 270
shreeshas95 8:cb93c1d3209a 271 if(tc_ptr->apid == 2){
shreeshas95 8:cb93c1d3209a 272 if( ( (tc_ptr->TC_string[2]) >> 4) == 0xF ){
shreeshas95 8:cb93c1d3209a 273 switch( (tc_ptr->TC_string[2]) & 0xf ){
shreeshas95 8:cb93c1d3209a 274 case 0:
shreeshas95 8:cb93c1d3209a 275 case 1:
shreeshas95 8:cb93c1d3209a 276 case 2:
shreeshas95 8:cb93c1d3209a 277 case 3:
shreeshas95 8:cb93c1d3209a 278 case 4:
shreeshas95 8:cb93c1d3209a 279 readSD = true;
shreeshas95 8:cb93c1d3209a 280 // printf("found sdcard op\r\n");
shreeshas95 8:cb93c1d3209a 281 }
shreeshas95 8:cb93c1d3209a 282 }
shreeshas95 8:cb93c1d3209a 283 }
shreeshas95 8:cb93c1d3209a 284 return readSD;
shreeshas95 8:cb93c1d3209a 285 }
shreeshas95 8:cb93c1d3209a 286
shreeshas95 8:cb93c1d3209a 287 TM_list* CDMS_RLY_TMTC(TC_list* tc_ptr){
shreeshas95 8:cb93c1d3209a 288 return NULL;
shreeshas95 8:cb93c1d3209a 289 }
shreeshas95 8:cb93c1d3209a 290
shreeshas95 8:cb93c1d3209a 291 bool inline execute_core(TC_list *tc_ptr){
shreeshas95 8:cb93c1d3209a 292 printf("executing core psc = %u\r\n", psc);
shreeshas95 8:cb93c1d3209a 293
shreeshas95 8:cb93c1d3209a 294 if( !EXECUTION::sdCardOp(tc_ptr) ){
shreeshas95 8:cb93c1d3209a 295 // printf("not sd card op\r\n");
shreeshas95 8:cb93c1d3209a 296 TM_List *tm_ptr;
shreeshas95 8:cb93c1d3209a 297
shreeshas95 8:cb93c1d3209a 298 // call relay here
shreeshas95 8:cb93c1d3209a 299 tm_ptr = EXECUTION::CDMS_RLY_TMTC(tc_ptr);
shreeshas95 8:cb93c1d3209a 300
shreeshas95 8:cb93c1d3209a 301 // SEND DATA TO GS
shreeshas95 8:cb93c1d3209a 302 // SND_TM(tm_ptr);
shreeshas95 8:cb93c1d3209a 303 // for rolling buffer :
shreeshas95 8:cb93c1d3209a 304 // send EoS only if TM to next tc has not arrived yet
shreeshas95 8:cb93c1d3209a 305 // else put the next TM itself.
shreeshas95 8:cb93c1d3209a 306
shreeshas95 8:cb93c1d3209a 307 if( EXECUTION::detect_ack(tm_ptr) ){
shreeshas95 8:cb93c1d3209a 308 tc_ptr->exec_status = 1;
shreeshas95 8:cb93c1d3209a 309 }
shreeshas95 8:cb93c1d3209a 310 else{
shreeshas95 8:cb93c1d3209a 311 tc_ptr->exec_status = 2;
shreeshas95 8:cb93c1d3209a 312 tc_ptr->enabled = false;
shreeshas95 8:cb93c1d3209a 313 if( tc_ptr->abort_on_nack ){
shreeshas95 8:cb93c1d3209a 314 return false;
shreeshas95 8:cb93c1d3209a 315 }
shreeshas95 8:cb93c1d3209a 316 }
shreeshas95 8:cb93c1d3209a 317
shreeshas95 8:cb93c1d3209a 318 // DELETE THE TM AFTER USE
shreeshas95 8:cb93c1d3209a 319 while(tm_ptr != NULL){
shreeshas95 8:cb93c1d3209a 320 TM_list *temp = tm_ptr->next_TM;
shreeshas95 8:cb93c1d3209a 321 delete tm_ptr;
shreeshas95 8:cb93c1d3209a 322 tm_ptr = temp;
shreeshas95 8:cb93c1d3209a 323 }
shreeshas95 8:cb93c1d3209a 324 }
shreeshas95 8:cb93c1d3209a 325 else{
shreeshas95 8:cb93c1d3209a 326 // write sd card code
shreeshas95 8:cb93c1d3209a 327 }
shreeshas95 8:cb93c1d3209a 328 return true;
shreeshas95 7:e71ecfe3a340 329 }
shreeshas95 0:b5b370873460 330 }
shreeshas95 8:cb93c1d3209a 331
shreeshas95 8:cb93c1d3209a 332 // MEMBER FUNCTIONS
shreeshas95 8:cb93c1d3209a 333
shreeshas95 2:994e741028c7 334 /*
shreeshas95 2:994e741028c7 335 @brief: INITIALISE THE HEAD NODE AND RESET THE VARIABLES
shreeshas95 2:994e741028c7 336 @param: TC_list *head : head node pointer
shreeshas95 2:994e741028c7 337 @return: none
shreeshas95 2:994e741028c7 338 */
shreeshas95 8:cb93c1d3209a 339 void init(){
shreeshas95 4:f95195748a0c 340 // printf("inside init\r\n");
shreeshas95 0:b5b370873460 341 total_valid_TC = 0;
shreeshas95 0:b5b370873460 342 all_crc_pass = true;
shreeshas95 0:b5b370873460 343 no_missing_TC = true;
shreeshas95 8:cb93c1d3209a 344 psc = PSC_START_VALUE;
shreeshas95 8:cb93c1d3209a 345 exec_count = 0;
shreeshas95 2:994e741028c7 346 }
shreeshas95 2:994e741028c7 347
shreeshas95 8:cb93c1d3209a 348
shreeshas95 2:994e741028c7 349 /*
shreeshas95 2:994e741028c7 350 @brief: DELETE THE CRC FAILED TC FROM THE LIST TO FREE-UP MEMORY AND UPDATE
shreeshas95 2:994e741028c7 351 THE TOTAL VALID TC AND GENERATE L1_ACK_TM
shreeshas95 2:994e741028c7 352 @param: none
shreeshas95 8:cb93c1d3209a 353 @return: none
shreeshas95 2:994e741028c7 354 */
shreeshas95 8:cb93c1d3209a 355 void start_with(){
shreeshas95 8:cb93c1d3209a 356 printf("inside start with\r\n");
shreeshas95 8:cb93c1d3209a 357 TC_list *current_TC = VAR_SPACE::Head_node;
shreeshas95 0:b5b370873460 358
shreeshas95 0:b5b370873460 359 total_valid_TC = 0;
shreeshas95 0:b5b370873460 360 all_crc_pass = true;
shreeshas95 0:b5b370873460 361
shreeshas95 8:cb93c1d3209a 362 TM_List *l1_ack = new TM_List;
shreeshas95 8:cb93c1d3209a 363 TM_List *l1_ack_head = l1_ack;
shreeshas95 8:cb93c1d3209a 364 L1_ACK::generate_L1_ack_TM(l1_ack);
shreeshas95 0:b5b370873460 365
shreeshas95 0:b5b370873460 366 int TC_count = 0;
shreeshas95 8:cb93c1d3209a 367 // printf("outside while in start with\r\n");
shreeshas95 8:cb93c1d3209a 368 // TC_list *zing = VAR_SPACE::Head_node;
shreeshas95 8:cb93c1d3209a 369 // while(zing != NULL){
shreeshas95 8:cb93c1d3209a 370 //// printf("packet seq count = %u\r\n", zing->packet_seq_count);
shreeshas95 8:cb93c1d3209a 371 // zing = zing->next_TC;
shreeshas95 8:cb93c1d3209a 372 // }
shreeshas95 2:994e741028c7 373 while(current_TC != NULL){
shreeshas95 2:994e741028c7 374
shreeshas95 2:994e741028c7 375 unsigned char temp = 0;
shreeshas95 2:994e741028c7 376
shreeshas95 2:994e741028c7 377 // FILL PSC of the TC [ don't care whether crc pass or fail ]
shreeshas95 2:994e741028c7 378 // PSC starts from 4th byte
shreeshas95 2:994e741028c7 379 l1_ack->TM_string[3+TC_count] = current_TC->TC_string[0];
shreeshas95 0:b5b370873460 380
shreeshas95 2:994e741028c7 381 // IF CRC PASS
shreeshas95 0:b5b370873460 382 if( current_TC->crc_pass ){
shreeshas95 0:b5b370873460 383 ++total_valid_TC;
shreeshas95 8:cb93c1d3209a 384 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 385
shreeshas95 2:994e741028c7 386 // set the crc pass field in TC_STATUS ???
shreeshas95 2:994e741028c7 387 temp = l1_ack->TM_string[2];
shreeshas95 2:994e741028c7 388 temp |= ( 1 << (7-TC_count) );
shreeshas95 2:994e741028c7 389 l1_ack->TM_string[2] = temp;
shreeshas95 0:b5b370873460 390
shreeshas95 2:994e741028c7 391 // advance to the next node
shreeshas95 0:b5b370873460 392 current_TC = current_TC->next_TC;
shreeshas95 0:b5b370873460 393 }
shreeshas95 2:994e741028c7 394 // if crc fail
shreeshas95 0:b5b370873460 395 else{
shreeshas95 8:cb93c1d3209a 396 printf("crc fail start with: psc = %u\r\n", current_TC->packet_seq_count);
shreeshas95 2:994e741028c7 397 // unset the crc pass field in TC_STATUS
shreeshas95 2:994e741028c7 398 temp = l1_ack->TM_string[2];
shreeshas95 2:994e741028c7 399 temp &= ~( 1 << (7-TC_count) );
shreeshas95 2:994e741028c7 400 l1_ack->TM_string[2] = temp;
shreeshas95 0:b5b370873460 401
shreeshas95 7:e71ecfe3a340 402 current_TC = current_TC->next_TC;
shreeshas95 0:b5b370873460 403 all_crc_pass = false;
shreeshas95 0:b5b370873460 404 }
shreeshas95 0:b5b370873460 405 ++TC_count;
shreeshas95 0:b5b370873460 406
shreeshas95 2:994e741028c7 407 // extend the TM linked list if TC_count > 7
shreeshas95 2:994e741028c7 408 if(TC_count > 7){
shreeshas95 2:994e741028c7 409 TC_count = 0;
shreeshas95 2:994e741028c7 410
shreeshas95 8:cb93c1d3209a 411 l1_ack->next_TM = new TM_List;
shreeshas95 2:994e741028c7 412 l1_ack = l1_ack->next_TM;
shreeshas95 8:cb93c1d3209a 413 L1_ACK::generate_L1_ack_TM(l1_ack);
shreeshas95 2:994e741028c7 414
shreeshas95 2:994e741028c7 415 // FILL TC_EXEC_CODE
shreeshas95 2:994e741028c7 416 // APPEND CRC TO THE TM
shreeshas95 8:cb93c1d3209a 417 L1_ACK::execode_crc( all_crc_pass, l1_ack );
shreeshas95 2:994e741028c7 418 }
shreeshas95 1:df31097c8442 419 }
shreeshas95 1:df31097c8442 420
shreeshas95 8:cb93c1d3209a 421 // FILL UP THE REMAINING FIELDS WITH ZEROS
shreeshas95 2:994e741028c7 422 while(TC_count < 8){
shreeshas95 2:994e741028c7 423 l1_ack->TM_string[2] &= ~( 1 << (7-TC_count) );
shreeshas95 8:cb93c1d3209a 424 // l1_ack->TM_string[3+TC_count] = 0;
shreeshas95 8:cb93c1d3209a 425 l1_ack->TM_string[3+TC_count] = 0x01;
shreeshas95 2:994e741028c7 426 ++TC_count;
shreeshas95 2:994e741028c7 427 }
shreeshas95 2:994e741028c7 428
shreeshas95 2:994e741028c7 429 // FILL TC_EXEC_CODE
shreeshas95 2:994e741028c7 430 // APPEND CRC TO THE TM
shreeshas95 8:cb93c1d3209a 431 L1_ACK::execode_crc(all_crc_pass, l1_ack);
shreeshas95 2:994e741028c7 432
shreeshas95 8:cb93c1d3209a 433 // SND_TM(l1_ack);
shreeshas95 2:994e741028c7 434
shreeshas95 2:994e741028c7 435 // delete the TM
shreeshas95 2:994e741028c7 436 l1_ack = l1_ack_head;
shreeshas95 2:994e741028c7 437 while(l1_ack != NULL){
shreeshas95 8:cb93c1d3209a 438 TM_List *temp = l1_ack->next_TM;
shreeshas95 2:994e741028c7 439 delete l1_ack;
shreeshas95 2:994e741028c7 440 l1_ack = temp;
shreeshas95 0:b5b370873460 441 }
shreeshas95 8:cb93c1d3209a 442 printf("finished start_with()\r\n");
shreeshas95 7:e71ecfe3a340 443 }
shreeshas95 0:b5b370873460 444
shreeshas95 2:994e741028c7 445 /*
shreeshas95 8:cb93c1d3209a 446 @brief: check for missing tc, also check crc, i.e.
shreeshas95 8:cb93c1d3209a 447 if true execution can be started else have to wait
shreeshas95 2:994e741028c7 448 @param: none
shreeshas95 8:cb93c1d3209a 449 @return: bool indicating whether there are missing tc
shreeshas95 2:994e741028c7 450 */
shreeshas95 8:cb93c1d3209a 451 bool check_for_missing_TC(void){
shreeshas95 8:cb93c1d3209a 452 printf("checking for missing tc\r\n");
shreeshas95 0:b5b370873460 453 no_missing_TC = true;
shreeshas95 2:994e741028c7 454
shreeshas95 8:cb93c1d3209a 455 // printf("total valid = %u\r\n", total_valid_TC);
shreeshas95 8:cb93c1d3209a 456
shreeshas95 8:cb93c1d3209a 457 for(unsigned char p = PSC_START_VALUE ; p < (total_valid_TC + PSC_START_VALUE) ; ++p){
shreeshas95 0:b5b370873460 458 bool flag = false;
shreeshas95 8:cb93c1d3209a 459 TC_list *node_ptr = VAR_SPACE::Head_node;
shreeshas95 8:cb93c1d3209a 460 // printf("checking for psc = %u\r\n", p);
shreeshas95 2:994e741028c7 461
shreeshas95 0:b5b370873460 462 while(node_ptr != NULL){
shreeshas95 8:cb93c1d3209a 463 // printf("packet seq count = %u\t", node_ptr->packet_seq_count);
shreeshas95 8:cb93c1d3209a 464 if( (node_ptr->packet_seq_count == p) && (node_ptr->crc_pass) ){
shreeshas95 0:b5b370873460 465 flag = true;
shreeshas95 0:b5b370873460 466 break;
shreeshas95 0:b5b370873460 467 }
shreeshas95 0:b5b370873460 468 else{
shreeshas95 0:b5b370873460 469 node_ptr = node_ptr->next_TC;
shreeshas95 0:b5b370873460 470 }
shreeshas95 0:b5b370873460 471 }
shreeshas95 8:cb93c1d3209a 472 // printf("\r\n");
shreeshas95 2:994e741028c7 473 if(flag == false){
shreeshas95 0:b5b370873460 474 no_missing_TC = false;
shreeshas95 2:994e741028c7 475 break;
shreeshas95 0:b5b370873460 476 }
shreeshas95 0:b5b370873460 477 }
shreeshas95 2:994e741028c7 478
shreeshas95 8:cb93c1d3209a 479 printf("returning from check for missing tc : %u\r\n", no_missing_TC ? 1 : 0);
shreeshas95 2:994e741028c7 480 if(no_missing_TC){
shreeshas95 8:cb93c1d3209a 481 return true;
shreeshas95 2:994e741028c7 482 }
shreeshas95 2:994e741028c7 483 else{
shreeshas95 8:cb93c1d3209a 484 return false;
shreeshas95 2:994e741028c7 485 }
shreeshas95 0:b5b370873460 486 }
shreeshas95 0:b5b370873460 487
shreeshas95 8:cb93c1d3209a 488
shreeshas95 8:cb93c1d3209a 489
shreeshas95 2:994e741028c7 490 /*
shreeshas95 2:994e741028c7 491 RUN start_with() before running execute_TC()
shreeshas95 2:994e741028c7 492 V1.0
shreeshas95 2:994e741028c7 493 @brief: EXECUTE THE LIST OF TCs, WITH A SEQUENCE BASED ON PSC
shreeshas95 2:994e741028c7 494 SEND THE TC TO THE TARGET AND WAIT FOR THE TM
shreeshas95 2:994e741028c7 495 THEN FORWARD IT TO GS
shreeshas95 2:994e741028c7 496 @param: none
shreeshas95 2:994e741028c7 497 @return: none
shreeshas95 2:994e741028c7 498 */
shreeshas95 8:cb93c1d3209a 499 TC_list *Second_head = NULL;
shreeshas95 0:b5b370873460 500 void execute_TC(){
shreeshas95 2:994e741028c7 501 // EXECUTE ACCORDING TO THE PSC VALUE
shreeshas95 8:cb93c1d3209a 502 printf("inside execute tc : total valid tc = %u, psc = %u\r\n", total_valid_TC, psc);
shreeshas95 0:b5b370873460 503 while( psc < (total_valid_TC+PSC_START_VALUE) ){
shreeshas95 8:cb93c1d3209a 504 // printf("Iterating : psc = %u\r\n", psc);
shreeshas95 8:cb93c1d3209a 505 // check for new tc received
shreeshas95 8:cb93c1d3209a 506 bool exec_flag_local = false;
shreeshas95 8:cb93c1d3209a 507 if( VAR_SPACE::new_tc_received ){
shreeshas95 8:cb93c1d3209a 508 printf("inaside new tc rx in obosc\r\n");
shreeshas95 8:cb93c1d3209a 509 VAR_SPACE::new_tc_received = false;
shreeshas95 8:cb93c1d3209a 510
shreeshas95 8:cb93c1d3209a 511 VAR_SPACE::data_node = VAR_SPACE::head_data;
shreeshas95 8:cb93c1d3209a 512 Second_head = VAR_SPACE::last_node;
shreeshas95 8:cb93c1d3209a 513 COM_RCV_TC::rx_rcv_tc();
shreeshas95 8:cb93c1d3209a 514 Second_head = Second_head->next_TC;
shreeshas95 8:cb93c1d3209a 515 exec_flag_local = true;
shreeshas95 8:cb93c1d3209a 516 }
shreeshas95 8:cb93c1d3209a 517 else if( VAR_SPACE::execute_obosc ){
shreeshas95 8:cb93c1d3209a 518 printf("execute obosc flag found\r\n");
shreeshas95 8:cb93c1d3209a 519 exec_flag_local = true;
shreeshas95 8:cb93c1d3209a 520 }
shreeshas95 8:cb93c1d3209a 521 if( exec_flag_local ){
shreeshas95 8:cb93c1d3209a 522 exec_flag_local = false;
shreeshas95 8:cb93c1d3209a 523
shreeshas95 8:cb93c1d3209a 524 start_with();
shreeshas95 8:cb93c1d3209a 525
shreeshas95 8:cb93c1d3209a 526 if( !check_for_missing_TC() ){
shreeshas95 8:cb93c1d3209a 527 VAR_SPACE::rx_state = 3;
shreeshas95 8:cb93c1d3209a 528 printf("exiting from obosc\r\n");
shreeshas95 8:cb93c1d3209a 529 return;
shreeshas95 8:cb93c1d3209a 530 }
shreeshas95 8:cb93c1d3209a 531 else{
shreeshas95 8:cb93c1d3209a 532 printf("executing obosc\r\n");
shreeshas95 8:cb93c1d3209a 533 // no missing tc : execute urgent
shreeshas95 8:cb93c1d3209a 534 TC_list *tcp = Second_head;
shreeshas95 8:cb93c1d3209a 535 while( tcp != NULL ){
shreeshas95 8:cb93c1d3209a 536 if( EXECUTION::obosc_tc(tcp) ){
shreeshas95 8:cb93c1d3209a 537 TM_list *tm_ptr = EXECUTION::execute_obosc(tcp);
shreeshas95 8:cb93c1d3209a 538 // SND_TM(tm_ptr);
shreeshas95 8:cb93c1d3209a 539 if( EXECUTION::detect_ack(tm_ptr) ){
shreeshas95 8:cb93c1d3209a 540 tcp->exec_status = 1;
shreeshas95 8:cb93c1d3209a 541 }
shreeshas95 8:cb93c1d3209a 542 else{
shreeshas95 8:cb93c1d3209a 543 tcp->exec_status = 2;
shreeshas95 8:cb93c1d3209a 544 if( tcp->abort_on_nack ){
shreeshas95 8:cb93c1d3209a 545 tcp->enabled = false;
shreeshas95 8:cb93c1d3209a 546 VAR_SPACE::rx_state = 0;
shreeshas95 8:cb93c1d3209a 547 printf("exiting from obosc due to abort on nack\r\n");
shreeshas95 8:cb93c1d3209a 548 VAR_SPACE::rx_state = 0;
shreeshas95 8:cb93c1d3209a 549 return;
shreeshas95 8:cb93c1d3209a 550 }
shreeshas95 8:cb93c1d3209a 551 }
shreeshas95 8:cb93c1d3209a 552 }
shreeshas95 8:cb93c1d3209a 553 tcp = tcp->next_TC;
shreeshas95 8:cb93c1d3209a 554 }
shreeshas95 8:cb93c1d3209a 555 }
shreeshas95 8:cb93c1d3209a 556 VAR_SPACE::execute_obosc = false;
shreeshas95 8:cb93c1d3209a 557 VAR_SPACE::rx_state = 2;
shreeshas95 8:cb93c1d3209a 558 }
shreeshas95 7:e71ecfe3a340 559
shreeshas95 8:cb93c1d3209a 560 TC_list *tc_ptr = VAR_SPACE::Head_node;
shreeshas95 2:994e741028c7 561 // FIND THE TC CORRESPONDING TO THE PSC VALUE
shreeshas95 2:994e741028c7 562 while(tc_ptr != NULL){
shreeshas95 8:cb93c1d3209a 563 // printf("in while : psc = %u\r\n", psc);
shreeshas95 8:cb93c1d3209a 564 if( (tc_ptr->packet_seq_count == psc) && (tc_ptr->crc_pass)){
shreeshas95 2:994e741028c7 565 // THE TC WITH THE REQUIRED PSC HAS BEEN FOUND, NOW EXECUTE
shreeshas95 7:e71ecfe3a340 566
shreeshas95 8:cb93c1d3209a 567 if( (tc_ptr->exec_status == 0) || ((tc_ptr->exec_status == 2) && (tc_ptr->enabled)) ){
shreeshas95 8:cb93c1d3209a 568 // execute tc
shreeshas95 7:e71ecfe3a340 569
shreeshas95 8:cb93c1d3209a 570 ++exec_count;
shreeshas95 8:cb93c1d3209a 571 if( EXECUTION::execute_core(tc_ptr) ){
shreeshas95 8:cb93c1d3209a 572 // THE TC WITH APPROPRIATE PSC IS EXECUTED, START OVER
shreeshas95 8:cb93c1d3209a 573 break;
shreeshas95 7:e71ecfe3a340 574 }
shreeshas95 7:e71ecfe3a340 575 else{
shreeshas95 8:cb93c1d3209a 576 printf("returning due to abort on nack\r\n");
shreeshas95 8:cb93c1d3209a 577 // do something for the unexecuted telecommands
shreeshas95 8:cb93c1d3209a 578 VAR_SPACE::rx_state = 0;
shreeshas95 8:cb93c1d3209a 579 return;
shreeshas95 7:e71ecfe3a340 580 }
shreeshas95 0:b5b370873460 581 }
shreeshas95 2:994e741028c7 582
shreeshas95 8:cb93c1d3209a 583 else{
shreeshas95 8:cb93c1d3209a 584 // either (execution failed and disabled) or (successful executed) hence break
shreeshas95 8:cb93c1d3209a 585 break;
shreeshas95 8:cb93c1d3209a 586 }
shreeshas95 0:b5b370873460 587 }
shreeshas95 2:994e741028c7 588 tc_ptr = tc_ptr->next_TC;
shreeshas95 0:b5b370873460 589 }
shreeshas95 8:cb93c1d3209a 590 ++psc;
shreeshas95 7:e71ecfe3a340 591 }
shreeshas95 8:cb93c1d3209a 592 VAR_SPACE::rx_state = 0;
shreeshas95 8:cb93c1d3209a 593 printf("exiting after successfully executing tc, total executed = %u\r\n", exec_count);
shreeshas95 7:e71ecfe3a340 594 }
shreeshas95 8:cb93c1d3209a 595 }