#include #include #include unsigned char LFR_BP1_F0[ NB_BINS_COMPRESSED_SM_F0 * 9 ]; BP1_t data_BP1[ NB_BINS_COMPRESSED_SM_F0 ]; float averaged_spec_mat_f0[ TOTAL_SIZE_SM ]; char averaged_spec_mat_f0_char[ TOTAL_SIZE_SM * 2 ]; float compressed_spec_mat_f0[ TOTAL_SIZE_COMPRESSED_MATRIX_f0 ]; //*********************************************************** // Interrupt Service Routine for spectral matrices processing rtems_isr spectral_matrices_isr( rtems_vector_number vector ) { unsigned char status; unsigned char i; status = spectral_matrix_regs->status; //[f2 f1 f0_1 f0_0] for (i=0; i<4; i++) { if ( ( (status >> i) & 0x01) == 1) // (1) buffer rotation { switch(i) { case 0: if (spectral_matrix_regs->matrixF0_Address0 == (int) spec_mat_f0_0) { spectral_matrix_regs->matrixF0_Address0 = (int) spec_mat_f0_0_bis; } else { spectral_matrix_regs->matrixF0_Address0 = (int) spec_mat_f0_0; } spectral_matrix_regs->status = spectral_matrix_regs->status & 0xfffffffe; break; case 1: if (spectral_matrix_regs->matrixFO_Address1 == (int) spec_mat_f0_1) { spectral_matrix_regs->matrixFO_Address1 = (int) spec_mat_f0_1_bis; } else { spectral_matrix_regs->matrixFO_Address1 = (int) spec_mat_f0_1; } spectral_matrix_regs->status = spectral_matrix_regs->status & 0xfffffffd; break; case 2: if (spectral_matrix_regs->matrixF1_Address == (int) spec_mat_f1) { spectral_matrix_regs->matrixF1_Address = (int) spec_mat_f1_bis; } else { spectral_matrix_regs->matrixF1_Address = (int) spec_mat_f1; } spectral_matrix_regs->status = spectral_matrix_regs->status & 0xfffffffb; break; case 3: if (spectral_matrix_regs->matrixF2_Address == (int) spec_mat_f2) { spectral_matrix_regs->matrixF2_Address = (int) spec_mat_f2_bis; } else { spectral_matrix_regs->matrixF2_Address = (int) spec_mat_f2; } spectral_matrix_regs->status = spectral_matrix_regs->status & 0xfffffff7; break; default: break; } } } // reset error codes to 0 spectral_matrix_regs->status = spectral_matrix_regs->status & 0xffffffcf; // [1100 1111] if (rtems_event_send( Task_id[TASKID_SMIQ], RTEMS_EVENT_0 ) != RTEMS_SUCCESSFUL) { rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_4 ); } } rtems_isr spectral_matrices_isr_simu( rtems_vector_number vector ) { if (rtems_event_send( Task_id[TASKID_SMIQ], RTEMS_EVENT_0 ) != RTEMS_SUCCESSFUL) { rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_4 ); } } //************ // RTEMS TASKS rtems_task smiq_task(rtems_task_argument argument) // process the Spectral Matrices IRQ { rtems_event_set event_out; unsigned int nb_interrupt_f0 = 0; BOOT_PRINTF("in SMIQ *** \n") while(1){ rtems_event_receive(RTEMS_EVENT_0, RTEMS_WAIT, RTEMS_NO_TIMEOUT, &event_out); // wait for an RTEMS_EVENT0 nb_interrupt_f0 = nb_interrupt_f0 + 1; if (nb_interrupt_f0 == NB_SM_TO_RECEIVE_BEFORE_AVF0 ){ if (rtems_event_send( Task_id[TASKID_AVF0], RTEMS_EVENT_0 ) != RTEMS_SUCCESSFUL) { rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_3 ); } nb_interrupt_f0 = 0; } } } //rtems_task smiq_task(rtems_task_argument argument) // process the Spectral Matrices IRQ //{ // rtems_event_set event_out; // unsigned int nb_interrupt_f0 = 0; // PRINTF("in SMIQ *** \n") // while(1){ // rtems_event_receive(RTEMS_EVENT_0, RTEMS_WAIT, RTEMS_NO_TIMEOUT, &event_out); // wait for an RTEMS_EVENT0 // nb_interrupt_f0 = nb_interrupt_f0 + 1; // if (nb_interrupt_f0 == param_local.local_nb_interrupt_f0_MAX ){ // if (rtems_event_send( Task_id[TASKID_MATR], RTEMS_EVENT_0 ) != RTEMS_SUCCESSFUL) // { // rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_3 ); // } // nb_interrupt_f0 = 0; // } // } //} rtems_task spw_bppr_task(rtems_task_argument argument) { rtems_status_code status; rtems_event_set event_out; static int Nb_average_f0 = 0; //static int nb_average_f1 = 0; //static int nb_average_f2 = 0; BOOT_PRINTF("in BPPR ***\n"); while(true){ // wait for an event to begin with the processing status = rtems_event_receive(RTEMS_EVENT_0, RTEMS_WAIT, RTEMS_NO_TIMEOUT, &event_out); if (status == RTEMS_SUCCESSFUL) { if ((spectral_matrix_regs->status & 0x00000001)==1) { matrix_average(spec_mat_f0_0, averaged_spec_mat_f0); spectral_matrix_regs->status = spectral_matrix_regs->status & 0xfffffffe; //printf("f0_a\n"); Nb_average_f0++; } if (((spectral_matrix_regs->status>>1) & 0x00000001)==1) { matrix_average(spec_mat_f0_1, compressed_spec_mat_f0); spectral_matrix_regs->status = spectral_matrix_regs->status & 0xfffffffd; //printf("f0_b\n"); Nb_average_f0++; } if (Nb_average_f0 == NB_AVERAGE_NORMAL_f0) { matrix_compression(averaged_spec_mat_f0, 0, compressed_spec_mat_f0); //printf("f0 compressed\n"); Nb_average_f0 = 0; matrix_reset(averaged_spec_mat_f0); } } } } rtems_task avf0_task(rtems_task_argument argument) { int i; static int nb_average; rtems_event_set event_out; rtems_status_code status; nb_average = 0; BOOT_PRINTF("in AVFO *** \n") while(1){ rtems_event_receive(RTEMS_EVENT_0, RTEMS_WAIT, RTEMS_NO_TIMEOUT, &event_out); // wait for an RTEMS_EVENT0 for(i=0; i abs(sx_im) ) { LFR_BP1[(i*9) + 7] = LFR_BP1[(i*9) + 1] | (0x80); // extract the sector of sx } else { LFR_BP1[(i*9) + 7] = LFR_BP1[(i*9) + 1] & (0x7f); // extract the sector of sx } //====================================================================== // BP1 phase velocity estimator == PAR_LFR_SC_BP1_VPHI_F0 == 8 bits (7+1) ny = sin(Alpha_M)*NVEC_V1 + cos(Alpha_M)*NVEC_V2; nz = NVEC_V0; bx_bx_star = cos(Alpha_M) * cos(Alpha_M) * compressed_spec_mat[i*30+10] // re S22 + sin(Alpha_M) * sin(Alpha_M) * compressed_spec_mat[i*30+18] // re S33 - 2 * sin(Alpha_M) * cos(Alpha_M) * compressed_spec_mat[i*30+12]; // re S23 nebx_re = ny * (compressed_spec_mat[(i*30) + 14] * K24_ny_re +compressed_spec_mat[(i*30) + 16] * K25_ny_re +compressed_spec_mat[(i*30) + 20] * K34_ny_re +compressed_spec_mat[(i*30) + 22] * K35_ny_re) + nz * (compressed_spec_mat[(i*30) + 14] * K24_nz_re +compressed_spec_mat[(i*30) + 16] * K25_nz_re +compressed_spec_mat[(i*30) + 20] * K34_nz_re +compressed_spec_mat[(i*30) + 22] * K35_nz_re); nebx_im = ny * (compressed_spec_mat[(i*30) + 15]*K24_ny_re +compressed_spec_mat[(i*30) + 17] * K25_ny_re +compressed_spec_mat[(i*30) + 21] * K34_ny_re +compressed_spec_mat[(i*30) + 23] * K35_ny_re) + nz * (compressed_spec_mat[(i*30) + 15] * K24_nz_im +compressed_spec_mat[(i*30) + 17] * K25_nz_im +compressed_spec_mat[(i*30) + 21] * K34_nz_im +compressed_spec_mat[(i*30) + 23] * K35_nz_im); tmp = nebx_re / bx_bx_star; LFR_BP1[(i*9) + 8] = ((unsigned char) (tmp * 128)) & 0x7f; // cf DOC for the compression if ( abs(nebx_re) > abs(nebx_im) ) { LFR_BP1[(i*9) + 8] = LFR_BP1[(i*9) + 8] | (0x80); // extract the sector of nebx } else { LFR_BP1[(i*9) + 8] = LFR_BP1[(i*9) + 8] & (0x7f); // extract the sector of nebx } } } void BP2_set(float * compressed_spec_mat, unsigned char nb_bins_compressed_spec_mat){ // BP2 autocorrelation int i; int aux = 0; for(i = 0; itargetLogicalAddress = CCSDS_DESTINATION_ID; header->protocolIdentifier = CCSDS_PROTOCOLE_ID; header->reserved = 0x00; header->userApplication = CCSDS_USER_APP; header->packetID[0] = (unsigned char) (TM_PACKET_ID_SCIENCE_NORMAL_BURST >> 8); header->packetID[1] = (unsigned char) (TM_PACKET_ID_SCIENCE_NORMAL_BURST); header->packetSequenceControl[0] = 0xc0; header->packetSequenceControl[1] = 0x00; header->packetLength[0] = 0x00; header->packetLength[1] = 0x00; // DATA FIELD HEADER header->spare1_pusVersion_spare2 = 0x10; header->serviceType = TM_TYPE_LFR_SCIENCE; // service type header->serviceSubType = TM_SUBTYPE_LFR_SCIENCE; // service subtype header->destinationID = TM_DESTINATION_ID_GROUND; // AUXILIARY DATA HEADER header->sid = 0x00; header->biaStatusInfo = 0x00; header->cntASM = 0x00; header->nrASM = 0x00; header->time[0] = 0x00; header->time[0] = 0x00; header->time[0] = 0x00; header->time[0] = 0x00; header->time[0] = 0x00; header->time[0] = 0x00; header->blkNr[0] = 0x00; // BLK_NR MSB header->blkNr[1] = 0x00; // BLK_NR LSB } void send_spectral_matrix(Header_TM_LFR_SCIENCE_ASM_t *header, char *spectral_matrix, unsigned int sid, spw_ioctl_pkt_send *spw_ioctl_send, rtems_id queue_id) { unsigned int i; unsigned int length = 0; rtems_status_code status; header->sid = (unsigned char) sid; for (i=0; i<2; i++) { // BUILD THE DATA spw_ioctl_send->dlen = TOTAL_SIZE_SM; spw_ioctl_send->data = &spectral_matrix[ i * TOTAL_SIZE_SM]; spw_ioctl_send->hlen = HEADER_LENGTH_TM_LFR_SCIENCE_ASM + CCSDS_PROTOCOLE_EXTRA_BYTES; spw_ioctl_send->hdr = (char *) header; spw_ioctl_send->options = 0; // BUILD THE HEADER length = PACKET_LENGTH_TM_LFR_SCIENCE_ASM; header->packetLength[0] = (unsigned char) (length>>8); header->packetLength[1] = (unsigned char) (length); header->sid = (unsigned char) sid; // SID header->cntASM = 2; header->nrASM = (unsigned char) (i+1); header->blkNr[0] =(unsigned char) ( (NB_BINS_PER_SM/2) >> 8 ); // BLK_NR MSB header->blkNr[1] = (unsigned char) (NB_BINS_PER_SM/2); // BLK_NR LSB // SET PACKET TIME header->time[0] = (unsigned char) (time_management_regs->coarse_time>>24); header->time[1] = (unsigned char) (time_management_regs->coarse_time>>16); header->time[2] = (unsigned char) (time_management_regs->coarse_time>>8); header->time[3] = (unsigned char) (time_management_regs->coarse_time); header->time[4] = (unsigned char) (time_management_regs->fine_time>>8); header->time[5] = (unsigned char) (time_management_regs->fine_time); header->acquisitionTime[0] = (unsigned char) (time_management_regs->coarse_time>>24); header->acquisitionTime[1] = (unsigned char) (time_management_regs->coarse_time>>16); header->acquisitionTime[2] = (unsigned char) (time_management_regs->coarse_time>>8); header->acquisitionTime[3] = (unsigned char) (time_management_regs->coarse_time); header->acquisitionTime[4] = (unsigned char) (time_management_regs->fine_time>>8); header->acquisitionTime[5] = (unsigned char) (time_management_regs->fine_time); // SEND PACKET status = rtems_message_queue_send( queue_id, spw_ioctl_send, ACTION_MSG_PKTS_SIZE); if (status != RTEMS_SUCCESSFUL) { printf("in send_spectral_matrix *** ERR %d\n", (int) status); } } } void convert_averaged_spectral_matrix( volatile float *input_matrix, char *output_matrix) { unsigned int i; unsigned int j; char * pt_char_input; char * pt_char_output; pt_char_input = NULL; pt_char_output = NULL; for( i=0; imatrixF0_Address0 == (int) spec_mat_f0_0) averaged_spec_mat_f0[i] = (float) spec_mat_f0_0_bis[ SM_HEADER + i ]; else averaged_spec_mat_f0[i] = (float) spec_mat_f0_0[ SM_HEADER + i ]; } #endif } void reset_spectral_matrix_regs() { #ifdef GSA #else spectral_matrix_regs->matrixF0_Address0 = (int) spec_mat_f0_0; spectral_matrix_regs->matrixFO_Address1 = (int) spec_mat_f0_1; spectral_matrix_regs->matrixF1_Address = (int) spec_mat_f1; spectral_matrix_regs->matrixF2_Address = (int) spec_mat_f2; #endif } //****************** // general functions