TELECOMMAND MANAGER V1

Dependencies:   mbed SLCD mbed-rtos

Committer:
shreeshas95
Date:
Mon Jul 06 05:00:29 2015 +0000
Revision:
7:e71ecfe3a340
Parent:
6:6e9ae3b44e60
Child:
8:cb93c1d3209a
TRYING THREAD, TESTING, TO BE IMPROVED

Who changed what in which revision?

UserRevisionLine numberNew contents of line
shreeshas95 7:e71ecfe3a340 1 // 3 July
shreeshas95 7:e71ecfe3a340 2 // Dheeraj detect_nack()
shreeshas95 7:e71ecfe3a340 3 // Sukhdeep SND_TM
shreeshas95 7:e71ecfe3a340 4
shreeshas95 2:994e741028c7 5 //Jun 8
shreeshas95 2:994e741028c7 6
shreeshas95 2:994e741028c7 7 //Jun 7
shreeshas95 2:994e741028c7 8 //PROBLEM IN DELETING TC_string pointer not solved
shreeshas95 2:994e741028c7 9
shreeshas95 2:994e741028c7 10 // Jun 6
shreeshas95 2:994e741028c7 11 // WHAT IS TC exec code in L1 ack ?
shreeshas95 2:994e741028c7 12 // Removed class and introduced namespace
shreeshas95 2:994e741028c7 13
shreeshas95 0:b5b370873460 14 // Apil 15
shreeshas95 0:b5b370873460 15 //added back printf statements
shreeshas95 0:b5b370873460 16 //added back delete TC_string for debugging
shreeshas95 0:b5b370873460 17
shreeshas95 0:b5b370873460 18 // add number of tm packets while calling snd
shreeshas95 0:b5b370873460 19 // function overloading z
shreeshas95 0:b5b370873460 20
shreeshas95 0:b5b370873460 21 // starting value of packet sequence count at each pass
shreeshas95 0:b5b370873460 22 #define PSC_START_VALUE 1
shreeshas95 0:b5b370873460 23
shreeshas95 0:b5b370873460 24 // APID list
shreeshas95 0:b5b370873460 25 #define APID_CALLSIGN 0
shreeshas95 0:b5b370873460 26 #define APID_BAE 1
shreeshas95 0:b5b370873460 27 #define APID_CDMS 2
shreeshas95 0:b5b370873460 28 #define APID_SPEED 3
shreeshas95 0:b5b370873460 29
shreeshas95 0:b5b370873460 30 // HIGH PRIORITY TC - priority list
shreeshas95 0:b5b370873460 31 // not correct values here
shreeshas95 0:b5b370873460 32 #define HPTC1 5
shreeshas95 0:b5b370873460 33 #define HPTC2 6
shreeshas95 0:b5b370873460 34 // Add more entries above
shreeshas95 0:b5b370873460 35
shreeshas95 2:994e741028c7 36 // SIZE of tc in bytes
shreeshas95 2:994e741028c7 37 #define TC_SHORT_SIZE 11
shreeshas95 2:994e741028c7 38 #define TC_LONG_SIZE 135
shreeshas95 2:994e741028c7 39
shreeshas95 0:b5b370873460 40 // TMID list
shreeshas95 0:b5b370873460 41 #define TMID_ACK_L1 10
shreeshas95 0:b5b370873460 42
shreeshas95 7:e71ecfe3a340 43 class MNG_TC
shreeshas95 0:b5b370873460 44 {
shreeshas95 7:e71ecfe3a340 45 private:
shreeshas95 7:e71ecfe3a340 46 int total_valid_TC;
shreeshas95 7:e71ecfe3a340 47 bool all_crc_pass;
shreeshas95 7:e71ecfe3a340 48 bool no_missing_TC;
shreeshas95 7:e71ecfe3a340 49 bool stop_after_current_TC;
shreeshas95 7:e71ecfe3a340 50 bool execute_high_priority_TC;
shreeshas95 7:e71ecfe3a340 51 TC_list *Head_TC;
shreeshas95 2:994e741028c7 52
shreeshas95 2:994e741028c7 53
shreeshas95 2:994e741028c7 54 //SECONDARY FUNCTIONS : [SHOULD NOT BE CALLED INDEPENDENTLY]
shreeshas95 2:994e741028c7 55 //USED BY MEMBER FUNCTIONS FOUND BELOW
shreeshas95 2:994e741028c7 56
shreeshas95 7:e71ecfe3a340 57 //PROBLEM IN DELETING TC_string POINTER
shreeshas95 7:e71ecfe3a340 58 void delete_TC(TC_list *tc_ptr, TC_list* previous_tc){
shreeshas95 7:e71ecfe3a340 59 // stitch the previous and next node
shreeshas95 7:e71ecfe3a340 60 TC_list *temp_n = tc_ptr->next_TC;
shreeshas95 7:e71ecfe3a340 61
shreeshas95 7:e71ecfe3a340 62 if( (previous_tc != NULL) && (temp_n != NULL) ){
shreeshas95 7:e71ecfe3a340 63 previous_tc->next_TC = temp_n;
shreeshas95 7:e71ecfe3a340 64 }
shreeshas95 7:e71ecfe3a340 65 else if( (previous_tc == NULL) && (temp_n != NULL) ){
shreeshas95 7:e71ecfe3a340 66 // delete head node HENCE UPDATE HEADER
shreeshas95 7:e71ecfe3a340 67 Head_TC = temp_n;
shreeshas95 7:e71ecfe3a340 68 }
shreeshas95 7:e71ecfe3a340 69 else if( (previous_tc != NULL) && (temp_n == NULL) ){
shreeshas95 7:e71ecfe3a340 70 // delete last node
shreeshas95 7:e71ecfe3a340 71 previous_tc->next_TC = NULL;
shreeshas95 7:e71ecfe3a340 72 }
shreeshas95 7:e71ecfe3a340 73 else{
shreeshas95 7:e71ecfe3a340 74 // delete the only single node present
shreeshas95 7:e71ecfe3a340 75 // in which case head is the only node
shreeshas95 7:e71ecfe3a340 76 Head_TC = NULL;
shreeshas95 7:e71ecfe3a340 77 }
shreeshas95 2:994e741028c7 78
shreeshas95 2:994e741028c7 79 // delete the node
shreeshas95 7:e71ecfe3a340 80 delete tc_ptr;
shreeshas95 7:e71ecfe3a340 81 }
shreeshas95 7:e71ecfe3a340 82
shreeshas95 7:e71ecfe3a340 83 void generate_L1_ack_TM(TM_list *tm_ptr){
shreeshas95 7:e71ecfe3a340 84 tm_ptr->next_TM = NULL;
shreeshas95 7:e71ecfe3a340 85 tm_ptr->TM_string = new unsigned char[TM_SHORT_SIZE];
shreeshas95 7:e71ecfe3a340 86 // TMID
shreeshas95 7:e71ecfe3a340 87 tm_ptr->tmid = 0xA;
shreeshas95 7:e71ecfe3a340 88 tm_ptr->TM_string[0] = 0xaf;
shreeshas95 2:994e741028c7 89 }
shreeshas95 2:994e741028c7 90
shreeshas95 7:e71ecfe3a340 91 void execode_crc(bool all_pass, TM_list *tm_ptr){
shreeshas95 7:e71ecfe3a340 92
shreeshas95 7:e71ecfe3a340 93 tm_ptr->TM_string[1] = ( all_crc_pass == true ) ? 0x01 : 0x00 ;
shreeshas95 0:b5b370873460 94
shreeshas95 7:e71ecfe3a340 95 uint16_t crc_checksum = CRC::crc16_gen(tm_ptr->TM_string, TM_SHORT_SIZE-2);
shreeshas95 2:994e741028c7 96
shreeshas95 7:e71ecfe3a340 97 tm_ptr->TM_string[TM_SHORT_SIZE-2] = (crc_checksum >> 8) & 0xff;
shreeshas95 7:e71ecfe3a340 98 tm_ptr->TM_string[TM_SHORT_SIZE-1] = crc_checksum & 0xff;
shreeshas95 2:994e741028c7 99 }
shreeshas95 2:994e741028c7 100
shreeshas95 7:e71ecfe3a340 101 TM_list* respond_CDMS(TC_list *ptr_tc){
shreeshas95 7:e71ecfe3a340 102
shreeshas95 2:994e741028c7 103 // DUMMY PROGRAM TO CREATE A SAMPLE TM
shreeshas95 2:994e741028c7 104
shreeshas95 2:994e741028c7 105 // allocate memory for new tm list
shreeshas95 7:e71ecfe3a340 106 TM_list *test_TM = new TM_list;
shreeshas95 7:e71ecfe3a340 107
shreeshas95 7:e71ecfe3a340 108 test_TM->next_TM = NULL;
shreeshas95 7:e71ecfe3a340 109
shreeshas95 2:994e741028c7 110 // allocate memory for the tm string
shreeshas95 7:e71ecfe3a340 111 unsigned char *str = new unsigned char[TM_TYPE1_SIZE];
shreeshas95 7:e71ecfe3a340 112
shreeshas95 7:e71ecfe3a340 113
shreeshas95 2:994e741028c7 114 // frame type-1 is 0. [ (0 << 7) = 0 ]
shreeshas95 7:e71ecfe3a340 115 str[0] = 0;
shreeshas95 7:e71ecfe3a340 116
shreeshas95 2:994e741028c7 117 // the tmid determines type-1, or 2
shreeshas95 2:994e741028c7 118 // tmid : 0x1 belongs to type1 (dummy program)
shreeshas95 7:e71ecfe3a340 119 test_TM->tmid = 0x1;
shreeshas95 7:e71ecfe3a340 120
shreeshas95 7:e71ecfe3a340 121 // 4 bit TMID
shreeshas95 7:e71ecfe3a340 122 str[0] += (0x1) << 3;
shreeshas95 7:e71ecfe3a340 123
shreeshas95 7:e71ecfe3a340 124 // 20 bit seq. count
shreeshas95 7:e71ecfe3a340 125 str[0] += 0x7;
shreeshas95 7:e71ecfe3a340 126 str[1] = 0xff;
shreeshas95 7:e71ecfe3a340 127 str[2] = 0xff;
shreeshas95 2:994e741028c7 128
shreeshas95 7:e71ecfe3a340 129 // random data
shreeshas95 7:e71ecfe3a340 130 for(int i = 3 ; i < (TM_TYPE1_SIZE-2) ; ++i ){
shreeshas95 7:e71ecfe3a340 131 str[i] = 'a';
shreeshas95 7:e71ecfe3a340 132 }
shreeshas95 7:e71ecfe3a340 133
shreeshas95 7:e71ecfe3a340 134 // APPEND CRC : ALL THE PROCESSES HAVE TO GENERATE AND APPEND CRC
shreeshas95 7:e71ecfe3a340 135 uint16_t crc_checksum = CRC::crc16_gen(str, TM_TYPE1_SIZE-2);
shreeshas95 7:e71ecfe3a340 136 str[TM_TYPE1_SIZE-2] = (crc_checksum >> 8) & 0xff;
shreeshas95 7:e71ecfe3a340 137 str[TM_TYPE1_SIZE-1] = crc_checksum & 0xff;
shreeshas95 7:e71ecfe3a340 138
shreeshas95 7:e71ecfe3a340 139 test_TM->TM_string = str;
shreeshas95 2:994e741028c7 140
shreeshas95 7:e71ecfe3a340 141 return test_TM;
shreeshas95 7:e71ecfe3a340 142 }
shreeshas95 7:e71ecfe3a340 143
shreeshas95 7:e71ecfe3a340 144 TM_list* RELAY(TC_list *tc_ptr){
shreeshas95 7:e71ecfe3a340 145
shreeshas95 7:e71ecfe3a340 146 // FIRST send long or short tc
shreeshas95 7:e71ecfe3a340 147 unsigned char tc_len = ( tc_ptr->short_or_long ? TC_SHORT_SIZE : TC_LONG_SIZE );
shreeshas95 7:e71ecfe3a340 148
shreeshas95 7:e71ecfe3a340 149 if( tc_ptr->apid == 0x01 ){
shreeshas95 7:e71ecfe3a340 150 // send TC to BAE microcontroler
shreeshas95 2:994e741028c7 151
shreeshas95 7:e71ecfe3a340 152 }
shreeshas95 7:e71ecfe3a340 153 else{
shreeshas95 7:e71ecfe3a340 154 // send TC to SPEED microcontroller
shreeshas95 7:e71ecfe3a340 155
shreeshas95 7:e71ecfe3a340 156 }
shreeshas95 7:e71ecfe3a340 157
shreeshas95 7:e71ecfe3a340 158 PC.putc( tc_len );
shreeshas95 7:e71ecfe3a340 159 // THE TARGET SHOULD READ 'n' MORE BYTES AS FOUND IN THE FIRST BYTE
shreeshas95 7:e71ecfe3a340 160
shreeshas95 7:e71ecfe3a340 161 // SEND THE TC TO THE TARGET DEVICE [ALONG WITH CRC]
shreeshas95 7:e71ecfe3a340 162 for(unsigned int i = 0 ; i < tc_len ; ++i){
shreeshas95 7:e71ecfe3a340 163 PC.putc( tc_ptr->TC_string[i] );
shreeshas95 0:b5b370873460 164 }
shreeshas95 2:994e741028c7 165
shreeshas95 7:e71ecfe3a340 166 // WAIT FOR THE TM
shreeshas95 7:e71ecfe3a340 167 TM_list* tm_head = new TM_list;
shreeshas95 7:e71ecfe3a340 168 TM_list* tm_ptr = tm_head;
shreeshas95 2:994e741028c7 169
shreeshas95 7:e71ecfe3a340 170 // FIRST RECEIVE NUMBER OF TM'S TO BE RECEVIVED
shreeshas95 7:e71ecfe3a340 171 unsigned char tm_num = PC.getc();
shreeshas95 7:e71ecfe3a340 172 for(unsigned int i = 0 ; i < tm_num ; ++i){
shreeshas95 2:994e741028c7 173
shreeshas95 7:e71ecfe3a340 174 // THEN FOR EACH TM FIRST SEND TYPE-1 OR TYPE-2 i.e. NUMBER OF BYTES TO READ
shreeshas95 7:e71ecfe3a340 175 unsigned char tm_len = PC.getc();
shreeshas95 7:e71ecfe3a340 176 tm_ptr->TM_string = new unsigned char[tm_len];
shreeshas95 7:e71ecfe3a340 177 for(unsigned int j = 0 ; j < tm_len ; ++j){
shreeshas95 7:e71ecfe3a340 178 tm_ptr->TM_string[j] = PC.getc();
shreeshas95 7:e71ecfe3a340 179 }
shreeshas95 7:e71ecfe3a340 180
shreeshas95 7:e71ecfe3a340 181 // DECODE TMID FROM THE PACKET
shreeshas95 7:e71ecfe3a340 182 if(tm_len == 134){
shreeshas95 7:e71ecfe3a340 183 unsigned char temp = tm_ptr->TM_string[0];
shreeshas95 7:e71ecfe3a340 184 tm_ptr->tmid = (temp >> 3) & 0xf;
shreeshas95 7:e71ecfe3a340 185 }
shreeshas95 7:e71ecfe3a340 186 else{
shreeshas95 7:e71ecfe3a340 187 unsigned char temp = tm_ptr->TM_string[4];
shreeshas95 7:e71ecfe3a340 188 tm_ptr->tmid = (temp >> 4) & 0xf;
shreeshas95 2:994e741028c7 189 }
shreeshas95 2:994e741028c7 190
shreeshas95 7:e71ecfe3a340 191 // ALLOCATE MEMORY FOR NEXT TM PACKET
shreeshas95 7:e71ecfe3a340 192 if( i == tm_num-1 ){
shreeshas95 7:e71ecfe3a340 193 tm_ptr->next_TM = NULL;
shreeshas95 7:e71ecfe3a340 194 }
shreeshas95 7:e71ecfe3a340 195 else{
shreeshas95 7:e71ecfe3a340 196 tm_ptr->next_TM = new TM_list;
shreeshas95 7:e71ecfe3a340 197 tm_ptr = tm_ptr->next_TM;
shreeshas95 7:e71ecfe3a340 198 }
shreeshas95 7:e71ecfe3a340 199 }
shreeshas95 7:e71ecfe3a340 200
shreeshas95 7:e71ecfe3a340 201 // FILL IN THE tm_ptr AND RETURN
shreeshas95 7:e71ecfe3a340 202 return tm_head;
shreeshas95 7:e71ecfe3a340 203 }
shreeshas95 7:e71ecfe3a340 204
shreeshas95 7:e71ecfe3a340 205
shreeshas95 7:e71ecfe3a340 206 /*
shreeshas95 7:e71ecfe3a340 207 @brief: detect ack_l234 : first tm for any tc will be the ack_l234
shreeshas95 7:e71ecfe3a340 208 @param: tm_ptr : pointer to the telemetry head
shreeshas95 7:e71ecfe3a340 209 @return: true : ack
shreeshas95 7:e71ecfe3a340 210 false : nack
shreeshas95 7:e71ecfe3a340 211 */
shreeshas95 7:e71ecfe3a340 212 bool detect_ackl234(TM_list *tm_ptr){
shreeshas95 7:e71ecfe3a340 213 char temp = tm_ptr->TM_string[0];
shreeshas95 7:e71ecfe3a340 214
shreeshas95 7:e71ecfe3a340 215 //
shreeshas95 7:e71ecfe3a340 216 if( (temp & 0xF0) == 0xB0 ){
shreeshas95 7:e71ecfe3a340 217 temp = tm_ptr->TM_string[3];
shreeshas95 2:994e741028c7 218
shreeshas95 7:e71ecfe3a340 219 // the nack and ack code
shreeshas95 7:e71ecfe3a340 220 if(temp != 0x00){
shreeshas95 7:e71ecfe3a340 221 return true;
shreeshas95 7:e71ecfe3a340 222 }
shreeshas95 7:e71ecfe3a340 223 else{
shreeshas95 7:e71ecfe3a340 224 return false;
shreeshas95 7:e71ecfe3a340 225 }
shreeshas95 2:994e741028c7 226 }
shreeshas95 7:e71ecfe3a340 227 else{
shreeshas95 7:e71ecfe3a340 228 return false;
shreeshas95 7:e71ecfe3a340 229 }
shreeshas95 0:b5b370873460 230 }
shreeshas95 7:e71ecfe3a340 231
shreeshas95 7:e71ecfe3a340 232 bool sdCardOp(TC_list *tc_ptr){
shreeshas95 7:e71ecfe3a340 233 return false;
shreeshas95 7:e71ecfe3a340 234 }
shreeshas95 7:e71ecfe3a340 235
shreeshas95 7:e71ecfe3a340 236 public:
shreeshas95 7:e71ecfe3a340 237
shreeshas95 7:e71ecfe3a340 238 // Constructor
shreeshas95 2:994e741028c7 239 /*
shreeshas95 2:994e741028c7 240 @brief: INITIALISE THE HEAD NODE AND RESET THE VARIABLES
shreeshas95 2:994e741028c7 241 @param: TC_list *head : head node pointer
shreeshas95 2:994e741028c7 242 @return: none
shreeshas95 2:994e741028c7 243 */
shreeshas95 7:e71ecfe3a340 244 MNG_TC( TC_list *HEAD ){
shreeshas95 4:f95195748a0c 245 // printf("inside init\r\n");
shreeshas95 0:b5b370873460 246 total_valid_TC = 0;
shreeshas95 0:b5b370873460 247 all_crc_pass = true;
shreeshas95 0:b5b370873460 248 no_missing_TC = true;
shreeshas95 0:b5b370873460 249 stop_after_current_TC = false;
shreeshas95 0:b5b370873460 250 execute_high_priority_TC = false;
shreeshas95 7:e71ecfe3a340 251 Head_TC = HEAD;
shreeshas95 2:994e741028c7 252 }
shreeshas95 2:994e741028c7 253
shreeshas95 2:994e741028c7 254 /*
shreeshas95 2:994e741028c7 255 @brief: DELETE THE CRC FAILED TC FROM THE LIST TO FREE-UP MEMORY AND UPDATE
shreeshas95 2:994e741028c7 256 THE TOTAL VALID TC AND GENERATE L1_ACK_TM
shreeshas95 2:994e741028c7 257 @param: none
shreeshas95 7:e71ecfe3a340 258 @return: 1 if all tc are crc pass
shreeshas95 7:e71ecfe3a340 259 0 if atleast one crc fail
shreeshas95 2:994e741028c7 260 */
shreeshas95 2:994e741028c7 261 int start_with(){
shreeshas95 4:f95195748a0c 262 // printf("inside start with\r\n");
shreeshas95 7:e71ecfe3a340 263 TC_list *current_TC = Head_TC;
shreeshas95 0:b5b370873460 264
shreeshas95 0:b5b370873460 265 total_valid_TC = 0;
shreeshas95 0:b5b370873460 266 all_crc_pass = true;
shreeshas95 0:b5b370873460 267
shreeshas95 7:e71ecfe3a340 268 TM_list *l1_ack = new TM_list;
shreeshas95 7:e71ecfe3a340 269 TM_list *l1_ack_head = l1_ack;
shreeshas95 7:e71ecfe3a340 270 generate_L1_ack_TM(l1_ack);
shreeshas95 0:b5b370873460 271
shreeshas95 0:b5b370873460 272 int TC_count = 0;
shreeshas95 1:df31097c8442 273
shreeshas95 2:994e741028c7 274 while(current_TC != NULL){
shreeshas95 2:994e741028c7 275
shreeshas95 2:994e741028c7 276 unsigned char temp = 0;
shreeshas95 2:994e741028c7 277
shreeshas95 2:994e741028c7 278 // FILL PSC of the TC [ don't care whether crc pass or fail ]
shreeshas95 2:994e741028c7 279 // PSC starts from 4th byte
shreeshas95 2:994e741028c7 280 l1_ack->TM_string[3+TC_count] = current_TC->TC_string[0];
shreeshas95 0:b5b370873460 281
shreeshas95 2:994e741028c7 282 // IF CRC PASS
shreeshas95 0:b5b370873460 283 if( current_TC->crc_pass ){
shreeshas95 0:b5b370873460 284 ++total_valid_TC;
shreeshas95 0:b5b370873460 285
shreeshas95 2:994e741028c7 286 // set the crc pass field in TC_STATUS ???
shreeshas95 2:994e741028c7 287 temp = l1_ack->TM_string[2];
shreeshas95 2:994e741028c7 288 temp |= ( 1 << (7-TC_count) );
shreeshas95 2:994e741028c7 289 l1_ack->TM_string[2] = temp;
shreeshas95 0:b5b370873460 290
shreeshas95 2:994e741028c7 291 // advance to the next node
shreeshas95 0:b5b370873460 292 current_TC = current_TC->next_TC;
shreeshas95 0:b5b370873460 293 }
shreeshas95 2:994e741028c7 294 // if crc fail
shreeshas95 0:b5b370873460 295 else{
shreeshas95 2:994e741028c7 296 // unset the crc pass field in TC_STATUS
shreeshas95 2:994e741028c7 297 temp = l1_ack->TM_string[2];
shreeshas95 2:994e741028c7 298 temp &= ~( 1 << (7-TC_count) );
shreeshas95 2:994e741028c7 299 l1_ack->TM_string[2] = temp;
shreeshas95 0:b5b370873460 300
shreeshas95 7:e71ecfe3a340 301 current_TC = current_TC->next_TC;
shreeshas95 0:b5b370873460 302 all_crc_pass = false;
shreeshas95 0:b5b370873460 303 }
shreeshas95 7:e71ecfe3a340 304
shreeshas95 0:b5b370873460 305 ++TC_count;
shreeshas95 0:b5b370873460 306
shreeshas95 2:994e741028c7 307 // extend the TM linked list if TC_count > 7
shreeshas95 2:994e741028c7 308 if(TC_count > 7){
shreeshas95 2:994e741028c7 309 TC_count = 0;
shreeshas95 2:994e741028c7 310
shreeshas95 7:e71ecfe3a340 311 l1_ack->next_TM = new TM_list;
shreeshas95 2:994e741028c7 312 l1_ack = l1_ack->next_TM;
shreeshas95 7:e71ecfe3a340 313 generate_L1_ack_TM(l1_ack);
shreeshas95 2:994e741028c7 314
shreeshas95 2:994e741028c7 315 // FILL TC_EXEC_CODE
shreeshas95 2:994e741028c7 316 // APPEND CRC TO THE TM
shreeshas95 7:e71ecfe3a340 317 execode_crc( all_crc_pass, l1_ack );
shreeshas95 2:994e741028c7 318 }
shreeshas95 1:df31097c8442 319 }
shreeshas95 1:df31097c8442 320
shreeshas95 7:e71ecfe3a340 321 // FILL UP THE REMAINING FIELDS WITH 0xFF since 0x00 causes problems with GS software
shreeshas95 2:994e741028c7 322 while(TC_count < 8){
shreeshas95 2:994e741028c7 323 l1_ack->TM_string[2] &= ~( 1 << (7-TC_count) );
shreeshas95 7:e71ecfe3a340 324 l1_ack->TM_string[3+TC_count] = 0xFF;
shreeshas95 2:994e741028c7 325 ++TC_count;
shreeshas95 2:994e741028c7 326 }
shreeshas95 2:994e741028c7 327
shreeshas95 2:994e741028c7 328 // FILL TC_EXEC_CODE
shreeshas95 2:994e741028c7 329 // APPEND CRC TO THE TM
shreeshas95 7:e71ecfe3a340 330 execode_crc(all_crc_pass, l1_ack);
shreeshas95 2:994e741028c7 331
shreeshas95 7:e71ecfe3a340 332 SND_TM(l1_ack_head);
shreeshas95 2:994e741028c7 333
shreeshas95 2:994e741028c7 334 // delete the TM
shreeshas95 2:994e741028c7 335 l1_ack = l1_ack_head;
shreeshas95 2:994e741028c7 336 while(l1_ack != NULL){
shreeshas95 7:e71ecfe3a340 337 TM_list *temp = l1_ack->next_TM;
shreeshas95 2:994e741028c7 338 delete l1_ack;
shreeshas95 2:994e741028c7 339 l1_ack = temp;
shreeshas95 0:b5b370873460 340 }
shreeshas95 0:b5b370873460 341
shreeshas95 2:994e741028c7 342 if(all_crc_pass == false){
shreeshas95 2:994e741028c7 343 return 0;
shreeshas95 2:994e741028c7 344 }
shreeshas95 0:b5b370873460 345
shreeshas95 2:994e741028c7 346 return 1;
shreeshas95 0:b5b370873460 347 }
shreeshas95 7:e71ecfe3a340 348
shreeshas95 7:e71ecfe3a340 349 /*
shreeshas95 7:e71ecfe3a340 350 @brief: Run either start_with() or update_valid_tc()
shreeshas95 7:e71ecfe3a340 351 @param: none
shreeshas95 7:e71ecfe3a340 352 @return: int 1 for all crc pass
shreeshas95 7:e71ecfe3a340 353 int 0 if atleast one crc fail
shreeshas95 7:e71ecfe3a340 354 */
shreeshas95 7:e71ecfe3a340 355 void update_valid_TC(){
shreeshas95 7:e71ecfe3a340 356 TC_list *current_TC = Head_TC;
shreeshas95 7:e71ecfe3a340 357
shreeshas95 7:e71ecfe3a340 358 total_valid_TC = 0;
shreeshas95 7:e71ecfe3a340 359 all_crc_pass = true;
shreeshas95 7:e71ecfe3a340 360
shreeshas95 7:e71ecfe3a340 361 while(current_TC != NULL){
shreeshas95 7:e71ecfe3a340 362 if( current_TC->crc_pass ){
shreeshas95 7:e71ecfe3a340 363 ++total_valid_TC;
shreeshas95 7:e71ecfe3a340 364 }
shreeshas95 7:e71ecfe3a340 365 else{
shreeshas95 7:e71ecfe3a340 366 all_crc_pass = false;
shreeshas95 7:e71ecfe3a340 367 }
shreeshas95 7:e71ecfe3a340 368 current_TC = current_TC->next_TC;
shreeshas95 7:e71ecfe3a340 369 }
shreeshas95 7:e71ecfe3a340 370 }
shreeshas95 0:b5b370873460 371
shreeshas95 2:994e741028c7 372 /*
shreeshas95 2:994e741028c7 373 @brief: decode the TCs and fill in the values in the tc-node.
shreeshas95 2:994e741028c7 374 @param: none
shreeshas95 2:994e741028c7 375 @return: none
shreeshas95 2:994e741028c7 376 */
shreeshas95 0:b5b370873460 377 void decode_TC(){
shreeshas95 7:e71ecfe3a340 378 TC_list *node_ptr = Head_TC;
shreeshas95 0:b5b370873460 379
shreeshas95 0:b5b370873460 380 while( node_ptr != NULL ){
shreeshas95 0:b5b370873460 381
shreeshas95 0:b5b370873460 382 unsigned char temp;
shreeshas95 0:b5b370873460 383
shreeshas95 0:b5b370873460 384 // PSC
shreeshas95 0:b5b370873460 385 node_ptr->packet_seq_count = node_ptr->TC_string[0];
shreeshas95 0:b5b370873460 386 // APID
shreeshas95 0:b5b370873460 387 temp = node_ptr->TC_string[1];
shreeshas95 0:b5b370873460 388 node_ptr->apid = (temp >> 6) & 3;
shreeshas95 0:b5b370873460 389 // Abort On Nack
shreeshas95 0:b5b370873460 390 node_ptr->abort_on_nack = (temp >> 3) & 1;
shreeshas95 0:b5b370873460 391 // default values of enable and execution
shreeshas95 0:b5b370873460 392 node_ptr->enabled = true;
shreeshas95 0:b5b370873460 393 node_ptr->valid_execution = false;
shreeshas95 0:b5b370873460 394
shreeshas95 0:b5b370873460 395 node_ptr = node_ptr->next_TC;
shreeshas95 0:b5b370873460 396 }
shreeshas95 0:b5b370873460 397 }
shreeshas95 0:b5b370873460 398
shreeshas95 7:e71ecfe3a340 399 /*
shreeshas95 7:e71ecfe3a340 400 @brief: check for missing tc, run start_with() or update_valid_tc() before
shreeshas95 7:e71ecfe3a340 401 @param: none
shreeshas95 7:e71ecfe3a340 402 @return: int 1 no missing tc
shreeshas95 7:e71ecfe3a340 403 int 0 missing tc
shreeshas95 7:e71ecfe3a340 404 */
shreeshas95 7:e71ecfe3a340 405
shreeshas95 7:e71ecfe3a340 406 int check_for_missing_TC(){
shreeshas95 0:b5b370873460 407 no_missing_TC = true;
shreeshas95 2:994e741028c7 408
shreeshas95 2:994e741028c7 409 for(unsigned char psc = PSC_START_VALUE ; psc < (total_valid_TC + PSC_START_VALUE) ; ++psc){
shreeshas95 0:b5b370873460 410 bool flag = false;
shreeshas95 7:e71ecfe3a340 411 TC_list *node_ptr = Head_TC;
shreeshas95 2:994e741028c7 412
shreeshas95 0:b5b370873460 413 while(node_ptr != NULL){
shreeshas95 2:994e741028c7 414 if(node_ptr->packet_seq_count == psc){
shreeshas95 0:b5b370873460 415 flag = true;
shreeshas95 0:b5b370873460 416 break;
shreeshas95 0:b5b370873460 417 }
shreeshas95 0:b5b370873460 418 else{
shreeshas95 0:b5b370873460 419 node_ptr = node_ptr->next_TC;
shreeshas95 0:b5b370873460 420 }
shreeshas95 0:b5b370873460 421 }
shreeshas95 2:994e741028c7 422
shreeshas95 2:994e741028c7 423 if(flag == false){
shreeshas95 0:b5b370873460 424 no_missing_TC = false;
shreeshas95 2:994e741028c7 425 break;
shreeshas95 0:b5b370873460 426 }
shreeshas95 0:b5b370873460 427 }
shreeshas95 2:994e741028c7 428
shreeshas95 2:994e741028c7 429 if(no_missing_TC){
shreeshas95 2:994e741028c7 430 return 1;
shreeshas95 2:994e741028c7 431 }
shreeshas95 2:994e741028c7 432 else{
shreeshas95 2:994e741028c7 433 return 0;
shreeshas95 2:994e741028c7 434 }
shreeshas95 0:b5b370873460 435 }
shreeshas95 0:b5b370873460 436
shreeshas95 2:994e741028c7 437 /*
shreeshas95 2:994e741028c7 438 RUN start_with() before running execute_TC()
shreeshas95 2:994e741028c7 439 V1.0
shreeshas95 2:994e741028c7 440 @brief: EXECUTE THE LIST OF TCs, WITH A SEQUENCE BASED ON PSC
shreeshas95 2:994e741028c7 441 SEND THE TC TO THE TARGET AND WAIT FOR THE TM
shreeshas95 2:994e741028c7 442 THEN FORWARD IT TO GS
shreeshas95 2:994e741028c7 443 @param: none
shreeshas95 2:994e741028c7 444 @return: none
shreeshas95 2:994e741028c7 445 */
shreeshas95 0:b5b370873460 446 void execute_TC(){
shreeshas95 0:b5b370873460 447 unsigned char psc = PSC_START_VALUE;
shreeshas95 2:994e741028c7 448
shreeshas95 2:994e741028c7 449 // EXECUTE ACCORDING TO THE PSC VALUE
shreeshas95 0:b5b370873460 450 while( psc < (total_valid_TC+PSC_START_VALUE) ){
shreeshas95 7:e71ecfe3a340 451
shreeshas95 7:e71ecfe3a340 452 TC_list *tc_ptr = Head_TC;
shreeshas95 2:994e741028c7 453
shreeshas95 2:994e741028c7 454 // FIND THE TC CORRESPONDING TO THE PSC VALUE
shreeshas95 2:994e741028c7 455 while(tc_ptr != NULL){
shreeshas95 7:e71ecfe3a340 456 if( (tc_ptr->packet_seq_count == psc) && (tc_ptr->crc_pass) ){
shreeshas95 2:994e741028c7 457 // THE TC WITH THE REQUIRED PSC HAS BEEN FOUND, NOW EXECUTE
shreeshas95 7:e71ecfe3a340 458
shreeshas95 7:e71ecfe3a340 459 if( !sdCardOp(tc_ptr) ){
shreeshas95 7:e71ecfe3a340 460 TM_list *tm_ptr;
shreeshas95 7:e71ecfe3a340 461 if( tc_ptr->apid == APID_CDMS ){
shreeshas95 7:e71ecfe3a340 462 // IF THE TC BELONGS TO THE CDMS uc CALL THE LOCAL FUNCTION Manage_CDMS()
shreeshas95 7:e71ecfe3a340 463 tm_ptr = respond_CDMS(tc_ptr);
shreeshas95 7:e71ecfe3a340 464 }
shreeshas95 7:e71ecfe3a340 465 else{
shreeshas95 7:e71ecfe3a340 466 // IF THE TC BELONGS TO OTHER MODULE, RELAY() IS CALLED WHICH ACTS AS A MESSENGER
shreeshas95 7:e71ecfe3a340 467 tm_ptr = RELAY(tc_ptr);
shreeshas95 7:e71ecfe3a340 468 }
shreeshas95 7:e71ecfe3a340 469
shreeshas95 7:e71ecfe3a340 470 // detect nack
shreeshas95 7:e71ecfe3a340 471 if( detect_ackl234(tm_ptr) ){
shreeshas95 7:e71ecfe3a340 472 tc_ptr->valid_execution = true;
shreeshas95 7:e71ecfe3a340 473 }
shreeshas95 7:e71ecfe3a340 474 else if( tc_ptr->abort_on_nack ){
shreeshas95 7:e71ecfe3a340 475 tc_ptr->valid_execution = false;
shreeshas95 7:e71ecfe3a340 476 // abort on nack is true and nack received : end thread
shreeshas95 7:e71ecfe3a340 477 Thread::wait(osWaitForever);
shreeshas95 7:e71ecfe3a340 478 }
shreeshas95 7:e71ecfe3a340 479 else{
shreeshas95 7:e71ecfe3a340 480 tc_ptr->valid_execution = false;
shreeshas95 7:e71ecfe3a340 481 }
shreeshas95 7:e71ecfe3a340 482
shreeshas95 7:e71ecfe3a340 483 // SEND DATA TO GS
shreeshas95 7:e71ecfe3a340 484 SND_TM(tm_ptr);
shreeshas95 7:e71ecfe3a340 485
shreeshas95 7:e71ecfe3a340 486 // DELETE THE TM AFTER USE
shreeshas95 7:e71ecfe3a340 487 while(tm_ptr != NULL){
shreeshas95 7:e71ecfe3a340 488 TM_list *temp = tm_ptr->next_TM;
shreeshas95 7:e71ecfe3a340 489 delete tm_ptr;
shreeshas95 7:e71ecfe3a340 490 tm_ptr = temp;
shreeshas95 7:e71ecfe3a340 491 }
shreeshas95 7:e71ecfe3a340 492
shreeshas95 2:994e741028c7 493 }
shreeshas95 2:994e741028c7 494 else{
shreeshas95 7:e71ecfe3a340 495 /*DO SD CARD OPERATION*/
shreeshas95 0:b5b370873460 496 }
shreeshas95 2:994e741028c7 497
shreeshas95 2:994e741028c7 498 // THE TC WITH APPROPRIATE PSC IS EXECUTED, START OVER
shreeshas95 2:994e741028c7 499 break;
shreeshas95 0:b5b370873460 500 }
shreeshas95 2:994e741028c7 501
shreeshas95 2:994e741028c7 502 tc_ptr = tc_ptr->next_TC;
shreeshas95 0:b5b370873460 503 }
shreeshas95 7:e71ecfe3a340 504 }
shreeshas95 7:e71ecfe3a340 505
shreeshas95 7:e71ecfe3a340 506 // executed every tc : delete all
shreeshas95 7:e71ecfe3a340 507 TC_list *tc_ptr = Head_TC;
shreeshas95 7:e71ecfe3a340 508 while(tc_ptr != NULL){
shreeshas95 7:e71ecfe3a340 509 TC_list *temp = tc_ptr->next_TC;
shreeshas95 7:e71ecfe3a340 510 delete tc_ptr;
shreeshas95 7:e71ecfe3a340 511 tc_ptr = temp;
shreeshas95 7:e71ecfe3a340 512 }
shreeshas95 0:b5b370873460 513 }
shreeshas95 7:e71ecfe3a340 514
shreeshas95 7:e71ecfe3a340 515 void execute_urgent(){
shreeshas95 7:e71ecfe3a340 516
shreeshas95 7:e71ecfe3a340 517 TC_list *tc_ptr = Head_TC;
shreeshas95 7:e71ecfe3a340 518 while( tc_ptr != NULL ){
shreeshas95 7:e71ecfe3a340 519
shreeshas95 7:e71ecfe3a340 520 }
shreeshas95 7:e71ecfe3a340 521
shreeshas95 7:e71ecfe3a340 522 // executed every tc : delete all
shreeshas95 7:e71ecfe3a340 523 tc_ptr = Head_TC;
shreeshas95 7:e71ecfe3a340 524 while(tc_ptr != NULL){
shreeshas95 7:e71ecfe3a340 525 TC_list *temp = tc_ptr->next_TC;
shreeshas95 7:e71ecfe3a340 526 delete tc_ptr;
shreeshas95 7:e71ecfe3a340 527 tc_ptr = temp;
shreeshas95 7:e71ecfe3a340 528 }
shreeshas95 7:e71ecfe3a340 529 }
shreeshas95 7:e71ecfe3a340 530 };
shreeshas95 7:e71ecfe3a340 531
shreeshas95 7:e71ecfe3a340 532 void MNG_MAIN(void const *args){
shreeshas95 7:e71ecfe3a340 533
shreeshas95 7:e71ecfe3a340 534 RCV_TC RcvClass( VAR_SPACE::Head_node1 );
shreeshas95 7:e71ecfe3a340 535 MNG_TC manager( VAR_SPACE::Head_node1 );
shreeshas95 7:e71ecfe3a340 536
shreeshas95 7:e71ecfe3a340 537 if( manager.start_with() ){
shreeshas95 7:e71ecfe3a340 538 manager.decode_TC();
shreeshas95 7:e71ecfe3a340 539 if( manager.check_for_missing_TC() ){
shreeshas95 7:e71ecfe3a340 540 manager.execute_TC();
shreeshas95 7:e71ecfe3a340 541 }
shreeshas95 7:e71ecfe3a340 542 }
shreeshas95 7:e71ecfe3a340 543
shreeshas95 7:e71ecfe3a340 544 Thread::wait(osWaitForever);
shreeshas95 7:e71ecfe3a340 545 }