TELECOMMAND MANAGER V1
Dependencies: mbed SLCD mbed-rtos
MNG_TC.h@7:e71ecfe3a340, 2015-07-06 (annotated)
- 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?
User | Revision | Line number | New 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 | } |