TELECOMMAND MANAGER V1
Dependencies: mbed SLCD mbed-rtos
MNG_TC.h@4:f95195748a0c, 2015-06-24 (annotated)
- Committer:
- shreeshas95
- Date:
- Wed Jun 24 12:04:43 2015 +0000
- Revision:
- 4:f95195748a0c
- Parent:
- 3:eec1097c0dd6
- Child:
- 6:6e9ae3b44e60
Uplink tested
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
shreeshas95 | 2:994e741028c7 | 1 | //Jun 8 |
shreeshas95 | 2:994e741028c7 | 2 | |
shreeshas95 | 2:994e741028c7 | 3 | |
shreeshas95 | 2:994e741028c7 | 4 | //Jun 7 |
shreeshas95 | 2:994e741028c7 | 5 | //PROBLEM IN DELETING TC_string pointer not solved |
shreeshas95 | 2:994e741028c7 | 6 | |
shreeshas95 | 2:994e741028c7 | 7 | // Jun 6 |
shreeshas95 | 2:994e741028c7 | 8 | // WHAT IS TC exec code in L1 ack ? |
shreeshas95 | 2:994e741028c7 | 9 | // Removed class and introduced namespace |
shreeshas95 | 2:994e741028c7 | 10 | |
shreeshas95 | 0:b5b370873460 | 11 | // Apil 15 |
shreeshas95 | 0:b5b370873460 | 12 | //added back printf statements |
shreeshas95 | 0:b5b370873460 | 13 | //added back delete TC_string for debugging |
shreeshas95 | 0:b5b370873460 | 14 | |
shreeshas95 | 0:b5b370873460 | 15 | // add number of tm packets while calling snd |
shreeshas95 | 0:b5b370873460 | 16 | // function overloading z |
shreeshas95 | 0:b5b370873460 | 17 | |
shreeshas95 | 0:b5b370873460 | 18 | // starting value of packet sequence count at each pass |
shreeshas95 | 0:b5b370873460 | 19 | #define PSC_START_VALUE 1 |
shreeshas95 | 0:b5b370873460 | 20 | |
shreeshas95 | 0:b5b370873460 | 21 | // APID list |
shreeshas95 | 0:b5b370873460 | 22 | #define APID_CALLSIGN 0 |
shreeshas95 | 0:b5b370873460 | 23 | #define APID_BAE 1 |
shreeshas95 | 0:b5b370873460 | 24 | #define APID_CDMS 2 |
shreeshas95 | 0:b5b370873460 | 25 | #define APID_SPEED 3 |
shreeshas95 | 0:b5b370873460 | 26 | |
shreeshas95 | 0:b5b370873460 | 27 | // HIGH PRIORITY TC - priority list |
shreeshas95 | 0:b5b370873460 | 28 | // not correct values here |
shreeshas95 | 0:b5b370873460 | 29 | #define HPTC1 5 |
shreeshas95 | 0:b5b370873460 | 30 | #define HPTC2 6 |
shreeshas95 | 0:b5b370873460 | 31 | // Add more entries above |
shreeshas95 | 0:b5b370873460 | 32 | |
shreeshas95 | 2:994e741028c7 | 33 | // SIZE of tc in bytes |
shreeshas95 | 2:994e741028c7 | 34 | #define TC_SHORT_SIZE 11 |
shreeshas95 | 2:994e741028c7 | 35 | #define TC_LONG_SIZE 135 |
shreeshas95 | 2:994e741028c7 | 36 | |
shreeshas95 | 0:b5b370873460 | 37 | // TMID list |
shreeshas95 | 0:b5b370873460 | 38 | #define TMID_ACK_L1 10 |
shreeshas95 | 0:b5b370873460 | 39 | |
shreeshas95 | 2:994e741028c7 | 40 | namespace MNG_TC |
shreeshas95 | 0:b5b370873460 | 41 | { |
shreeshas95 | 0:b5b370873460 | 42 | |
shreeshas95 | 2:994e741028c7 | 43 | int total_valid_TC = 0; |
shreeshas95 | 0:b5b370873460 | 44 | TC_list *TC_list_header; |
shreeshas95 | 2:994e741028c7 | 45 | bool all_crc_pass = true; |
shreeshas95 | 2:994e741028c7 | 46 | bool no_missing_TC = true; |
shreeshas95 | 2:994e741028c7 | 47 | bool stop_after_current_TC = false; |
shreeshas95 | 2:994e741028c7 | 48 | bool execute_high_priority_TC = false; |
shreeshas95 | 2:994e741028c7 | 49 | |
shreeshas95 | 2:994e741028c7 | 50 | |
shreeshas95 | 2:994e741028c7 | 51 | //SECONDARY FUNCTIONS : [SHOULD NOT BE CALLED INDEPENDENTLY] |
shreeshas95 | 2:994e741028c7 | 52 | //USED BY MEMBER FUNCTIONS FOUND BELOW |
shreeshas95 | 2:994e741028c7 | 53 | |
shreeshas95 | 2:994e741028c7 | 54 | namespace MEMORY_MANAGEMENT{ |
shreeshas95 | 0:b5b370873460 | 55 | |
shreeshas95 | 2:994e741028c7 | 56 | //PROBLEM IN DELETING TC_string POINTER |
shreeshas95 | 2:994e741028c7 | 57 | void delete_TC(TC_list *tc_ptr, TC_list* previous_tc){ |
shreeshas95 | 2:994e741028c7 | 58 | // stitch the previous and next node |
shreeshas95 | 2:994e741028c7 | 59 | TC_list *temp_n = tc_ptr->next_TC; |
shreeshas95 | 2:994e741028c7 | 60 | |
shreeshas95 | 2:994e741028c7 | 61 | if( (previous_tc != NULL) && (temp_n != NULL) ){ |
shreeshas95 | 2:994e741028c7 | 62 | previous_tc->next_TC = temp_n; |
shreeshas95 | 2:994e741028c7 | 63 | } |
shreeshas95 | 2:994e741028c7 | 64 | else if( (previous_tc == NULL) && (temp_n != NULL) ){ |
shreeshas95 | 2:994e741028c7 | 65 | // delete head node HENCE UPDATE HEADER |
shreeshas95 | 2:994e741028c7 | 66 | TC_list_header = temp_n; |
shreeshas95 | 2:994e741028c7 | 67 | } |
shreeshas95 | 2:994e741028c7 | 68 | else if( (previous_tc != NULL) && (temp_n == NULL) ){ |
shreeshas95 | 2:994e741028c7 | 69 | // delete last node |
shreeshas95 | 2:994e741028c7 | 70 | previous_tc->next_TC = NULL; |
shreeshas95 | 2:994e741028c7 | 71 | } |
shreeshas95 | 2:994e741028c7 | 72 | else{ |
shreeshas95 | 2:994e741028c7 | 73 | // delete the only single node present |
shreeshas95 | 2:994e741028c7 | 74 | // in which case head is the only node |
shreeshas95 | 2:994e741028c7 | 75 | TC_list_header = NULL; |
shreeshas95 | 2:994e741028c7 | 76 | } |
shreeshas95 | 2:994e741028c7 | 77 | |
shreeshas95 | 2:994e741028c7 | 78 | // delete the node |
shreeshas95 | 2:994e741028c7 | 79 | delete tc_ptr; |
shreeshas95 | 2:994e741028c7 | 80 | } |
shreeshas95 | 2:994e741028c7 | 81 | } |
shreeshas95 | 2:994e741028c7 | 82 | |
shreeshas95 | 2:994e741028c7 | 83 | namespace ACK{ |
shreeshas95 | 2:994e741028c7 | 84 | |
shreeshas95 | 2:994e741028c7 | 85 | void generate_L1_ack_TM(TM_list *tm_ptr){ |
shreeshas95 | 2:994e741028c7 | 86 | tm_ptr->next_TM = NULL; |
shreeshas95 | 2:994e741028c7 | 87 | tm_ptr->TM_string = new unsigned char[TM_SHORT_SIZE]; |
shreeshas95 | 2:994e741028c7 | 88 | // TMID |
shreeshas95 | 2:994e741028c7 | 89 | tm_ptr->tmid = 0xA; |
shreeshas95 | 2:994e741028c7 | 90 | tm_ptr->TM_string[0] = 0xaf; |
shreeshas95 | 2:994e741028c7 | 91 | } |
shreeshas95 | 0:b5b370873460 | 92 | |
shreeshas95 | 2:994e741028c7 | 93 | void execode_crc(bool all_pass, TM_list *tm_ptr){ |
shreeshas95 | 2:994e741028c7 | 94 | |
shreeshas95 | 2:994e741028c7 | 95 | tm_ptr->TM_string[1] = ( all_crc_pass == true ) ? 0x01 : 0x00 ; |
shreeshas95 | 2:994e741028c7 | 96 | |
shreeshas95 | 2:994e741028c7 | 97 | uint16_t crc_checksum = CRC::crc16_gen(tm_ptr->TM_string, TM_SHORT_SIZE-2); |
shreeshas95 | 2:994e741028c7 | 98 | |
shreeshas95 | 2:994e741028c7 | 99 | tm_ptr->TM_string[TM_SHORT_SIZE-2] = (crc_checksum >> 8) & 0xff; |
shreeshas95 | 2:994e741028c7 | 100 | tm_ptr->TM_string[TM_SHORT_SIZE-1] = crc_checksum & 0xff; |
shreeshas95 | 0:b5b370873460 | 101 | } |
shreeshas95 | 2:994e741028c7 | 102 | } |
shreeshas95 | 2:994e741028c7 | 103 | |
shreeshas95 | 2:994e741028c7 | 104 | namespace EXECUTION{ |
shreeshas95 | 2:994e741028c7 | 105 | |
shreeshas95 | 2:994e741028c7 | 106 | TM_list* Manage_CDMS(TC_list *ptr_tc){ |
shreeshas95 | 2:994e741028c7 | 107 | |
shreeshas95 | 2:994e741028c7 | 108 | // DUMMY PROGRAM TO CREATE A SAMPLE TM |
shreeshas95 | 2:994e741028c7 | 109 | |
shreeshas95 | 2:994e741028c7 | 110 | // allocate memory for new tm list |
shreeshas95 | 2:994e741028c7 | 111 | TM_list *test_TM = new TM_list; |
shreeshas95 | 2:994e741028c7 | 112 | |
shreeshas95 | 2:994e741028c7 | 113 | test_TM->next_TM = NULL; |
shreeshas95 | 2:994e741028c7 | 114 | |
shreeshas95 | 2:994e741028c7 | 115 | // allocate memory for the tm string |
shreeshas95 | 2:994e741028c7 | 116 | unsigned char *str = new unsigned char[TM_TYPE1_SIZE]; |
shreeshas95 | 2:994e741028c7 | 117 | |
shreeshas95 | 2:994e741028c7 | 118 | |
shreeshas95 | 2:994e741028c7 | 119 | // frame type-1 is 0. [ (0 << 7) = 0 ] |
shreeshas95 | 2:994e741028c7 | 120 | str[0] = 0; |
shreeshas95 | 2:994e741028c7 | 121 | |
shreeshas95 | 2:994e741028c7 | 122 | // the tmid determines type-1, or 2 |
shreeshas95 | 2:994e741028c7 | 123 | // tmid : 0x1 belongs to type1 (dummy program) |
shreeshas95 | 2:994e741028c7 | 124 | test_TM->tmid = 0x1; |
shreeshas95 | 2:994e741028c7 | 125 | |
shreeshas95 | 2:994e741028c7 | 126 | // 4 bit TMID |
shreeshas95 | 2:994e741028c7 | 127 | str[0] += (0x1) << 3; |
shreeshas95 | 2:994e741028c7 | 128 | |
shreeshas95 | 2:994e741028c7 | 129 | // 20 bit seq. count |
shreeshas95 | 2:994e741028c7 | 130 | str[0] += 0x7; |
shreeshas95 | 2:994e741028c7 | 131 | str[1] = 0xff; |
shreeshas95 | 2:994e741028c7 | 132 | str[2] = 0xff; |
shreeshas95 | 2:994e741028c7 | 133 | |
shreeshas95 | 2:994e741028c7 | 134 | // random data |
shreeshas95 | 2:994e741028c7 | 135 | for(int i = 3 ; i < (TM_TYPE1_SIZE-2) ; ++i ){ |
shreeshas95 | 2:994e741028c7 | 136 | str[i] = 'a'; |
shreeshas95 | 2:994e741028c7 | 137 | } |
shreeshas95 | 2:994e741028c7 | 138 | |
shreeshas95 | 2:994e741028c7 | 139 | // APPEND CRC : ALL THE PROCESSES HAVE TO GENERATE AND APPEND CRC |
shreeshas95 | 2:994e741028c7 | 140 | uint16_t crc_checksum = CRC::crc16_gen(str, TM_TYPE1_SIZE-2); |
shreeshas95 | 2:994e741028c7 | 141 | str[TM_TYPE1_SIZE-2] = (crc_checksum >> 8) & 0xff; |
shreeshas95 | 2:994e741028c7 | 142 | str[TM_TYPE1_SIZE-1] = crc_checksum & 0xff; |
shreeshas95 | 2:994e741028c7 | 143 | |
shreeshas95 | 2:994e741028c7 | 144 | test_TM->TM_string = str; |
shreeshas95 | 2:994e741028c7 | 145 | |
shreeshas95 | 2:994e741028c7 | 146 | return test_TM; |
shreeshas95 | 0:b5b370873460 | 147 | } |
shreeshas95 | 2:994e741028c7 | 148 | |
shreeshas95 | 2:994e741028c7 | 149 | TM_list* RELAY(TC_list *tc_ptr){ |
shreeshas95 | 2:994e741028c7 | 150 | |
shreeshas95 | 2:994e741028c7 | 151 | // FIRST send long or short tc |
shreeshas95 | 2:994e741028c7 | 152 | unsigned char tc_len = ( tc_ptr->short_or_long ? TC_SHORT_SIZE : TC_LONG_SIZE ); |
shreeshas95 | 2:994e741028c7 | 153 | PC.putc( tc_len ); |
shreeshas95 | 2:994e741028c7 | 154 | // THE TARGET SHOULD READ 'n' MORE BYTES AS FOUND IN THE FIRST BYTE |
shreeshas95 | 2:994e741028c7 | 155 | |
shreeshas95 | 2:994e741028c7 | 156 | // SEND THE TC TO THE TARGET DEVICE [ALONG WITH CRC] |
shreeshas95 | 2:994e741028c7 | 157 | for(unsigned int i = 0 ; i < tc_len ; ++i){ |
shreeshas95 | 2:994e741028c7 | 158 | PC.putc( tc_ptr->TC_string[i] ); |
shreeshas95 | 2:994e741028c7 | 159 | } |
shreeshas95 | 2:994e741028c7 | 160 | |
shreeshas95 | 2:994e741028c7 | 161 | // WAIT FOR THE TM |
shreeshas95 | 2:994e741028c7 | 162 | TM_list* tm_head = new TM_list; |
shreeshas95 | 2:994e741028c7 | 163 | TM_list* tm_ptr = tm_head; |
shreeshas95 | 2:994e741028c7 | 164 | |
shreeshas95 | 2:994e741028c7 | 165 | // FIRST RECEIVE NUMBER OF TM'S TO BE RECEVIVED |
shreeshas95 | 2:994e741028c7 | 166 | unsigned char tm_num = PC.getc(); |
shreeshas95 | 2:994e741028c7 | 167 | for(unsigned int i = 0 ; i < tm_num ; ++i){ |
shreeshas95 | 2:994e741028c7 | 168 | |
shreeshas95 | 2:994e741028c7 | 169 | // THEN FOR EACH TM FIRST SEND TYPE-1 OR TYPE-2 i.e. NUMBER OF BYTES TO READ |
shreeshas95 | 2:994e741028c7 | 170 | unsigned char tm_len = PC.getc(); |
shreeshas95 | 2:994e741028c7 | 171 | tm_ptr->TM_string = new unsigned char[tm_len]; |
shreeshas95 | 2:994e741028c7 | 172 | for(unsigned int j = 0 ; j < tm_len ; ++j){ |
shreeshas95 | 2:994e741028c7 | 173 | tm_ptr->TM_string[j] = PC.getc(); |
shreeshas95 | 2:994e741028c7 | 174 | } |
shreeshas95 | 2:994e741028c7 | 175 | |
shreeshas95 | 2:994e741028c7 | 176 | // DECODE TMID FROM THE PACKET |
shreeshas95 | 2:994e741028c7 | 177 | if(tm_len == 134){ |
shreeshas95 | 2:994e741028c7 | 178 | unsigned char temp = tm_ptr->TM_string[0]; |
shreeshas95 | 2:994e741028c7 | 179 | tm_ptr->tmid = (temp >> 3) & 0xf; |
shreeshas95 | 2:994e741028c7 | 180 | } |
shreeshas95 | 2:994e741028c7 | 181 | else{ |
shreeshas95 | 2:994e741028c7 | 182 | unsigned char temp = tm_ptr->TM_string[4]; |
shreeshas95 | 2:994e741028c7 | 183 | tm_ptr->tmid = (temp >> 4) & 0xf; |
shreeshas95 | 2:994e741028c7 | 184 | } |
shreeshas95 | 2:994e741028c7 | 185 | |
shreeshas95 | 2:994e741028c7 | 186 | // ALLOCATE MEMORY FOR NEXT TM PACKET |
shreeshas95 | 2:994e741028c7 | 187 | if( i == tm_num-1 ){ |
shreeshas95 | 2:994e741028c7 | 188 | tm_ptr->next_TM = NULL; |
shreeshas95 | 2:994e741028c7 | 189 | } |
shreeshas95 | 2:994e741028c7 | 190 | else{ |
shreeshas95 | 2:994e741028c7 | 191 | tm_ptr->next_TM = new TM_list; |
shreeshas95 | 2:994e741028c7 | 192 | tm_ptr = tm_ptr->next_TM; |
shreeshas95 | 2:994e741028c7 | 193 | } |
shreeshas95 | 2:994e741028c7 | 194 | } |
shreeshas95 | 2:994e741028c7 | 195 | |
shreeshas95 | 2:994e741028c7 | 196 | // FILL IN THE tm_ptr AND RETURN |
shreeshas95 | 2:994e741028c7 | 197 | return tm_head; |
shreeshas95 | 2:994e741028c7 | 198 | } |
shreeshas95 | 2:994e741028c7 | 199 | |
shreeshas95 | 0:b5b370873460 | 200 | } |
shreeshas95 | 0:b5b370873460 | 201 | |
shreeshas95 | 2:994e741028c7 | 202 | // MEMBER FUNCTIONS |
shreeshas95 | 0:b5b370873460 | 203 | |
shreeshas95 | 2:994e741028c7 | 204 | /* |
shreeshas95 | 2:994e741028c7 | 205 | @brief: INITIALISE THE HEAD NODE AND RESET THE VARIABLES |
shreeshas95 | 2:994e741028c7 | 206 | @param: TC_list *head : head node pointer |
shreeshas95 | 2:994e741028c7 | 207 | @return: none |
shreeshas95 | 2:994e741028c7 | 208 | */ |
shreeshas95 | 2:994e741028c7 | 209 | void init(TC_list *head){ |
shreeshas95 | 4:f95195748a0c | 210 | // printf("inside init\r\n"); |
shreeshas95 | 0:b5b370873460 | 211 | total_valid_TC = 0; |
shreeshas95 | 0:b5b370873460 | 212 | TC_list_header = head; |
shreeshas95 | 0:b5b370873460 | 213 | all_crc_pass = true; |
shreeshas95 | 0:b5b370873460 | 214 | no_missing_TC = true; |
shreeshas95 | 0:b5b370873460 | 215 | stop_after_current_TC = false; |
shreeshas95 | 0:b5b370873460 | 216 | execute_high_priority_TC = false; |
shreeshas95 | 2:994e741028c7 | 217 | } |
shreeshas95 | 2:994e741028c7 | 218 | |
shreeshas95 | 0:b5b370873460 | 219 | |
shreeshas95 | 2:994e741028c7 | 220 | /* |
shreeshas95 | 2:994e741028c7 | 221 | @brief: DELETE THE CRC FAILED TC FROM THE LIST TO FREE-UP MEMORY AND UPDATE |
shreeshas95 | 2:994e741028c7 | 222 | THE TOTAL VALID TC AND GENERATE L1_ACK_TM |
shreeshas95 | 2:994e741028c7 | 223 | @param: none |
shreeshas95 | 2:994e741028c7 | 224 | @return: none |
shreeshas95 | 2:994e741028c7 | 225 | */ |
shreeshas95 | 2:994e741028c7 | 226 | int start_with(){ |
shreeshas95 | 4:f95195748a0c | 227 | // printf("inside start with\r\n"); |
shreeshas95 | 0:b5b370873460 | 228 | TC_list *current_TC = TC_list_header; |
shreeshas95 | 0:b5b370873460 | 229 | TC_list *previous_TC = NULL; |
shreeshas95 | 0:b5b370873460 | 230 | |
shreeshas95 | 0:b5b370873460 | 231 | total_valid_TC = 0; |
shreeshas95 | 0:b5b370873460 | 232 | all_crc_pass = true; |
shreeshas95 | 0:b5b370873460 | 233 | |
shreeshas95 | 0:b5b370873460 | 234 | TM_List *l1_ack = new TM_List; |
shreeshas95 | 0:b5b370873460 | 235 | TM_List *l1_ack_head = l1_ack; |
shreeshas95 | 2:994e741028c7 | 236 | ACK::generate_L1_ack_TM(l1_ack); |
shreeshas95 | 0:b5b370873460 | 237 | |
shreeshas95 | 0:b5b370873460 | 238 | int TC_count = 0; |
shreeshas95 | 1:df31097c8442 | 239 | |
shreeshas95 | 2:994e741028c7 | 240 | while(current_TC != NULL){ |
shreeshas95 | 2:994e741028c7 | 241 | |
shreeshas95 | 2:994e741028c7 | 242 | unsigned char temp = 0; |
shreeshas95 | 2:994e741028c7 | 243 | |
shreeshas95 | 2:994e741028c7 | 244 | // FILL PSC of the TC [ don't care whether crc pass or fail ] |
shreeshas95 | 2:994e741028c7 | 245 | // PSC starts from 4th byte |
shreeshas95 | 2:994e741028c7 | 246 | l1_ack->TM_string[3+TC_count] = current_TC->TC_string[0]; |
shreeshas95 | 0:b5b370873460 | 247 | |
shreeshas95 | 2:994e741028c7 | 248 | // IF CRC PASS |
shreeshas95 | 0:b5b370873460 | 249 | if( current_TC->crc_pass ){ |
shreeshas95 | 0:b5b370873460 | 250 | ++total_valid_TC; |
shreeshas95 | 0:b5b370873460 | 251 | |
shreeshas95 | 2:994e741028c7 | 252 | // set the crc pass field in TC_STATUS ??? |
shreeshas95 | 2:994e741028c7 | 253 | temp = l1_ack->TM_string[2]; |
shreeshas95 | 2:994e741028c7 | 254 | temp |= ( 1 << (7-TC_count) ); |
shreeshas95 | 2:994e741028c7 | 255 | l1_ack->TM_string[2] = temp; |
shreeshas95 | 0:b5b370873460 | 256 | |
shreeshas95 | 2:994e741028c7 | 257 | // advance to the next node |
shreeshas95 | 0:b5b370873460 | 258 | previous_TC = current_TC; |
shreeshas95 | 0:b5b370873460 | 259 | current_TC = current_TC->next_TC; |
shreeshas95 | 0:b5b370873460 | 260 | } |
shreeshas95 | 2:994e741028c7 | 261 | // if crc fail |
shreeshas95 | 0:b5b370873460 | 262 | else{ |
shreeshas95 | 2:994e741028c7 | 263 | // unset the crc pass field in TC_STATUS |
shreeshas95 | 2:994e741028c7 | 264 | temp = l1_ack->TM_string[2]; |
shreeshas95 | 2:994e741028c7 | 265 | temp &= ~( 1 << (7-TC_count) ); |
shreeshas95 | 2:994e741028c7 | 266 | l1_ack->TM_string[2] = temp; |
shreeshas95 | 0:b5b370873460 | 267 | |
shreeshas95 | 2:994e741028c7 | 268 | // delete and advance to the next node since CRC FAIL |
shreeshas95 | 0:b5b370873460 | 269 | TC_list *next = current_TC->next_TC; |
shreeshas95 | 2:994e741028c7 | 270 | MEMORY_MANAGEMENT::delete_TC(current_TC, previous_TC); |
shreeshas95 | 0:b5b370873460 | 271 | current_TC = next; |
shreeshas95 | 0:b5b370873460 | 272 | all_crc_pass = false; |
shreeshas95 | 0:b5b370873460 | 273 | } |
shreeshas95 | 0:b5b370873460 | 274 | ++TC_count; |
shreeshas95 | 0:b5b370873460 | 275 | |
shreeshas95 | 2:994e741028c7 | 276 | // extend the TM linked list if TC_count > 7 |
shreeshas95 | 2:994e741028c7 | 277 | if(TC_count > 7){ |
shreeshas95 | 2:994e741028c7 | 278 | TC_count = 0; |
shreeshas95 | 2:994e741028c7 | 279 | |
shreeshas95 | 2:994e741028c7 | 280 | l1_ack->next_TM = new TM_List; |
shreeshas95 | 2:994e741028c7 | 281 | l1_ack = l1_ack->next_TM; |
shreeshas95 | 2:994e741028c7 | 282 | ACK::generate_L1_ack_TM(l1_ack); |
shreeshas95 | 2:994e741028c7 | 283 | |
shreeshas95 | 2:994e741028c7 | 284 | // FILL TC_EXEC_CODE |
shreeshas95 | 2:994e741028c7 | 285 | // APPEND CRC TO THE TM |
shreeshas95 | 2:994e741028c7 | 286 | ACK::execode_crc( all_crc_pass, l1_ack ); |
shreeshas95 | 2:994e741028c7 | 287 | } |
shreeshas95 | 1:df31097c8442 | 288 | } |
shreeshas95 | 1:df31097c8442 | 289 | |
shreeshas95 | 2:994e741028c7 | 290 | // FILL UP THE REMAINING FIELDS WITH ZEROS |
shreeshas95 | 2:994e741028c7 | 291 | while(TC_count < 8){ |
shreeshas95 | 2:994e741028c7 | 292 | l1_ack->TM_string[2] &= ~( 1 << (7-TC_count) ); |
shreeshas95 | 2:994e741028c7 | 293 | l1_ack->TM_string[3+TC_count] = 0; |
shreeshas95 | 2:994e741028c7 | 294 | ++TC_count; |
shreeshas95 | 2:994e741028c7 | 295 | } |
shreeshas95 | 2:994e741028c7 | 296 | |
shreeshas95 | 2:994e741028c7 | 297 | // FILL TC_EXEC_CODE |
shreeshas95 | 2:994e741028c7 | 298 | // APPEND CRC TO THE TM |
shreeshas95 | 2:994e741028c7 | 299 | ACK::execode_crc(all_crc_pass, l1_ack); |
shreeshas95 | 2:994e741028c7 | 300 | |
shreeshas95 | 2:994e741028c7 | 301 | SND_TM(l1_ack); |
shreeshas95 | 2:994e741028c7 | 302 | |
shreeshas95 | 2:994e741028c7 | 303 | // delete the TM |
shreeshas95 | 2:994e741028c7 | 304 | l1_ack = l1_ack_head; |
shreeshas95 | 2:994e741028c7 | 305 | while(l1_ack != NULL){ |
shreeshas95 | 2:994e741028c7 | 306 | TM_List *temp = l1_ack->next_TM; |
shreeshas95 | 2:994e741028c7 | 307 | delete l1_ack; |
shreeshas95 | 2:994e741028c7 | 308 | l1_ack = temp; |
shreeshas95 | 0:b5b370873460 | 309 | } |
shreeshas95 | 0:b5b370873460 | 310 | |
shreeshas95 | 2:994e741028c7 | 311 | if(all_crc_pass == false){ |
shreeshas95 | 2:994e741028c7 | 312 | return 0; |
shreeshas95 | 2:994e741028c7 | 313 | } |
shreeshas95 | 0:b5b370873460 | 314 | |
shreeshas95 | 2:994e741028c7 | 315 | return 1; |
shreeshas95 | 0:b5b370873460 | 316 | } |
shreeshas95 | 0:b5b370873460 | 317 | |
shreeshas95 | 2:994e741028c7 | 318 | /* |
shreeshas95 | 2:994e741028c7 | 319 | AT THIS STAGE ALL NODES ARE CRC PASS |
shreeshas95 | 2:994e741028c7 | 320 | @brief: decode the TCs and fill in the values in the tc-node. |
shreeshas95 | 2:994e741028c7 | 321 | @param: none |
shreeshas95 | 2:994e741028c7 | 322 | @return: none |
shreeshas95 | 2:994e741028c7 | 323 | */ |
shreeshas95 | 0:b5b370873460 | 324 | void decode_TC(){ |
shreeshas95 | 0:b5b370873460 | 325 | TC_list *node_ptr = TC_list_header; |
shreeshas95 | 0:b5b370873460 | 326 | |
shreeshas95 | 0:b5b370873460 | 327 | while( node_ptr != NULL ){ |
shreeshas95 | 0:b5b370873460 | 328 | |
shreeshas95 | 0:b5b370873460 | 329 | unsigned char temp; |
shreeshas95 | 0:b5b370873460 | 330 | |
shreeshas95 | 0:b5b370873460 | 331 | // PSC |
shreeshas95 | 0:b5b370873460 | 332 | node_ptr->packet_seq_count = node_ptr->TC_string[0]; |
shreeshas95 | 0:b5b370873460 | 333 | // APID |
shreeshas95 | 0:b5b370873460 | 334 | temp = node_ptr->TC_string[1]; |
shreeshas95 | 0:b5b370873460 | 335 | node_ptr->apid = (temp >> 6) & 3; |
shreeshas95 | 0:b5b370873460 | 336 | // Abort On Nack |
shreeshas95 | 0:b5b370873460 | 337 | node_ptr->abort_on_nack = (temp >> 3) & 1; |
shreeshas95 | 0:b5b370873460 | 338 | // default values of enable and execution |
shreeshas95 | 0:b5b370873460 | 339 | node_ptr->enabled = true; |
shreeshas95 | 0:b5b370873460 | 340 | node_ptr->valid_execution = false; |
shreeshas95 | 0:b5b370873460 | 341 | |
shreeshas95 | 0:b5b370873460 | 342 | node_ptr = node_ptr->next_TC; |
shreeshas95 | 0:b5b370873460 | 343 | } |
shreeshas95 | 0:b5b370873460 | 344 | } |
shreeshas95 | 0:b5b370873460 | 345 | |
shreeshas95 | 2:994e741028c7 | 346 | int check_for_missing_TC(void){ |
shreeshas95 | 0:b5b370873460 | 347 | no_missing_TC = true; |
shreeshas95 | 2:994e741028c7 | 348 | |
shreeshas95 | 2:994e741028c7 | 349 | for(unsigned char psc = PSC_START_VALUE ; psc < (total_valid_TC + PSC_START_VALUE) ; ++psc){ |
shreeshas95 | 0:b5b370873460 | 350 | bool flag = false; |
shreeshas95 | 0:b5b370873460 | 351 | TC_list *node_ptr = TC_list_header; |
shreeshas95 | 2:994e741028c7 | 352 | |
shreeshas95 | 0:b5b370873460 | 353 | while(node_ptr != NULL){ |
shreeshas95 | 2:994e741028c7 | 354 | if(node_ptr->packet_seq_count == psc){ |
shreeshas95 | 0:b5b370873460 | 355 | flag = true; |
shreeshas95 | 0:b5b370873460 | 356 | break; |
shreeshas95 | 0:b5b370873460 | 357 | } |
shreeshas95 | 0:b5b370873460 | 358 | else{ |
shreeshas95 | 0:b5b370873460 | 359 | node_ptr = node_ptr->next_TC; |
shreeshas95 | 0:b5b370873460 | 360 | } |
shreeshas95 | 0:b5b370873460 | 361 | } |
shreeshas95 | 2:994e741028c7 | 362 | |
shreeshas95 | 2:994e741028c7 | 363 | if(flag == false){ |
shreeshas95 | 0:b5b370873460 | 364 | no_missing_TC = false; |
shreeshas95 | 2:994e741028c7 | 365 | break; |
shreeshas95 | 0:b5b370873460 | 366 | } |
shreeshas95 | 0:b5b370873460 | 367 | } |
shreeshas95 | 2:994e741028c7 | 368 | |
shreeshas95 | 2:994e741028c7 | 369 | if(no_missing_TC){ |
shreeshas95 | 2:994e741028c7 | 370 | return 1; |
shreeshas95 | 2:994e741028c7 | 371 | } |
shreeshas95 | 2:994e741028c7 | 372 | else{ |
shreeshas95 | 2:994e741028c7 | 373 | return 0; |
shreeshas95 | 2:994e741028c7 | 374 | } |
shreeshas95 | 0:b5b370873460 | 375 | } |
shreeshas95 | 0:b5b370873460 | 376 | |
shreeshas95 | 2:994e741028c7 | 377 | /* |
shreeshas95 | 2:994e741028c7 | 378 | RUN start_with() before running execute_TC() |
shreeshas95 | 2:994e741028c7 | 379 | V1.0 |
shreeshas95 | 2:994e741028c7 | 380 | @brief: EXECUTE THE LIST OF TCs, WITH A SEQUENCE BASED ON PSC |
shreeshas95 | 2:994e741028c7 | 381 | SEND THE TC TO THE TARGET AND WAIT FOR THE TM |
shreeshas95 | 2:994e741028c7 | 382 | THEN FORWARD IT TO GS |
shreeshas95 | 2:994e741028c7 | 383 | @param: none |
shreeshas95 | 2:994e741028c7 | 384 | @return: none |
shreeshas95 | 2:994e741028c7 | 385 | */ |
shreeshas95 | 0:b5b370873460 | 386 | void execute_TC(){ |
shreeshas95 | 0:b5b370873460 | 387 | unsigned char psc = PSC_START_VALUE; |
shreeshas95 | 2:994e741028c7 | 388 | |
shreeshas95 | 2:994e741028c7 | 389 | // EXECUTE ACCORDING TO THE PSC VALUE |
shreeshas95 | 0:b5b370873460 | 390 | while( psc < (total_valid_TC+PSC_START_VALUE) ){ |
shreeshas95 | 2:994e741028c7 | 391 | TC_list *tc_ptr = TC_list_header; |
shreeshas95 | 2:994e741028c7 | 392 | |
shreeshas95 | 2:994e741028c7 | 393 | // FIND THE TC CORRESPONDING TO THE PSC VALUE |
shreeshas95 | 2:994e741028c7 | 394 | while(tc_ptr != NULL){ |
shreeshas95 | 2:994e741028c7 | 395 | if( tc_ptr->packet_seq_count == psc ){ |
shreeshas95 | 2:994e741028c7 | 396 | // THE TC WITH THE REQUIRED PSC HAS BEEN FOUND, NOW EXECUTE |
shreeshas95 | 2:994e741028c7 | 397 | |
shreeshas95 | 2:994e741028c7 | 398 | TM_List *tm_ptr; |
shreeshas95 | 0:b5b370873460 | 399 | if( tc_ptr->apid == APID_CDMS ){ |
shreeshas95 | 2:994e741028c7 | 400 | // IF THE TC BELONGS TO THE CDMS uc CALL THE LOCAL FUNCTION Manage_CDMS() |
shreeshas95 | 2:994e741028c7 | 401 | tm_ptr = EXECUTION::Manage_CDMS(tc_ptr); |
shreeshas95 | 2:994e741028c7 | 402 | } |
shreeshas95 | 2:994e741028c7 | 403 | |
shreeshas95 | 2:994e741028c7 | 404 | else{ |
shreeshas95 | 2:994e741028c7 | 405 | // IF THE TC BELONGS TO OTHER MODULE, RELAY() IS CALLED WHICH ACTS AS A MESSENGER |
shreeshas95 | 2:994e741028c7 | 406 | tm_ptr = EXECUTION::RELAY(tc_ptr); |
shreeshas95 | 0:b5b370873460 | 407 | } |
shreeshas95 | 2:994e741028c7 | 408 | |
shreeshas95 | 2:994e741028c7 | 409 | // SEND DATA TO GS |
shreeshas95 | 2:994e741028c7 | 410 | SND_TM(tm_ptr); |
shreeshas95 | 2:994e741028c7 | 411 | |
shreeshas95 | 2:994e741028c7 | 412 | tc_ptr->valid_execution = true; |
shreeshas95 | 2:994e741028c7 | 413 | |
shreeshas95 | 2:994e741028c7 | 414 | // DELETE THE TM AFTER USE |
shreeshas95 | 2:994e741028c7 | 415 | delete tm_ptr; |
shreeshas95 | 2:994e741028c7 | 416 | |
shreeshas95 | 2:994e741028c7 | 417 | // THE TC WITH APPROPRIATE PSC IS EXECUTED, START OVER |
shreeshas95 | 2:994e741028c7 | 418 | break; |
shreeshas95 | 0:b5b370873460 | 419 | } |
shreeshas95 | 2:994e741028c7 | 420 | |
shreeshas95 | 2:994e741028c7 | 421 | tc_ptr = tc_ptr->next_TC; |
shreeshas95 | 0:b5b370873460 | 422 | } |
shreeshas95 | 2:994e741028c7 | 423 | } |
shreeshas95 | 0:b5b370873460 | 424 | } |
shreeshas95 | 3:eec1097c0dd6 | 425 | } |