#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 ) { 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; unsigned int nb_interrupt_f0_MAX = 0; nb_interrupt_f0_MAX = ( (parameter_dump_packet.sy_lfr_n_asm_p[0]) * 256 + parameter_dump_packet.sy_lfr_n_asm_p[1] ) * 100; 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_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; 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_a, 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_b, 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; 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 >> 8); header->packetID[1] = (unsigned char) (TM_PACKET_ID_SCIENCE_NORMAL); 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) { 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 = write_spw(spw_ioctl_send); if (status != RTEMS_SUCCESSFUL) { while (true) { if (status != RTEMS_SUCCESSFUL) { status = write_spw(spw_ioctl_send); //PRINTF1("%d", i) sched_yield(); } else { //PRINTF("\n") break; } } } } } 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; i