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