@@ -1,2 +1,2 | |||||
1 | 3081d1f9bb20b2b64a192585337a292a9804e0c5 LFR_basic-parameters |
|
1 | 3081d1f9bb20b2b64a192585337a292a9804e0c5 LFR_basic-parameters | |
2 | 80d727bb9d808ae67c801c4c6101811d68b94af6 header/lfr_common_headers |
|
2 | 4ffa7549495b4d1e5ddbda520569468a5e3b8779 header/lfr_common_headers |
@@ -61,6 +61,8 void compute_acquisition_time(unsigned i | |||||
61 | unsigned int sid, unsigned char pa_lfr_pkt_nr, unsigned char *acquisitionTime ); |
|
61 | unsigned int sid, unsigned char pa_lfr_pkt_nr, unsigned char *acquisitionTime ); | |
62 | void build_snapshot_from_ring(ring_node *ring_node_to_send, unsigned char frequencyChannel , |
|
62 | void build_snapshot_from_ring(ring_node *ring_node_to_send, unsigned char frequencyChannel , | |
63 | unsigned long long acquisitionTimeF0_asLong, ring_node *ring_node_swf_extracted, int *swf_extracted); |
|
63 | unsigned long long acquisitionTimeF0_asLong, ring_node *ring_node_swf_extracted, int *swf_extracted); | |
|
64 | double computeCorrection( unsigned char *timePtr ); | |||
|
65 | void applyCorrection( double correction ); | |||
64 | void snapshot_resynchronization( unsigned char *timePtr ); |
|
66 | void snapshot_resynchronization( unsigned char *timePtr ); | |
65 | // |
|
67 | // | |
66 | rtems_id get_pkts_queue_id( void ); |
|
68 | rtems_id get_pkts_queue_id( void ); |
@@ -268,6 +268,9 rtems_task Init( rtems_task_argument ign | |||||
268 |
|
268 | |||
269 | set_hk_lfr_sc_potential_flag( true ); |
|
269 | set_hk_lfr_sc_potential_flag( true ); | |
270 |
|
270 | |||
|
271 | // start the timer used for the detection of missing parameters (started also by the timecode_irq_handler ISR) | |||
|
272 | status = rtems_timer_fire_after( timecode_timer_id, TIMECODE_TIMER_TIMEOUT, timecode_timer_routine, NULL ); | |||
|
273 | ||||
271 | status = rtems_task_delete(RTEMS_SELF); |
|
274 | status = rtems_task_delete(RTEMS_SELF); | |
272 |
|
275 | |||
273 | } |
|
276 | } |
@@ -444,8 +444,16 int check_mode_transition( unsigned char | |||||
444 |
|
444 | |||
445 | void update_last_valid_transition_date( unsigned int transitionCoarseTime ) |
|
445 | void update_last_valid_transition_date( unsigned int transitionCoarseTime ) | |
446 | { |
|
446 | { | |
447 |
|
|
447 | if (transitionCoarseTime == 0) | |
448 | PRINTF1("lastValidEnterModeTime = 0x%x\n", transitionCoarseTime); |
|
448 | { | |
|
449 | lastValidEnterModeTime = time_management_regs->coarse_time + 1; | |||
|
450 | PRINTF1("lastValidEnterModeTime = 0x%x (transitionCoarseTime = 0 => coarse_time+1)\n", transitionCoarseTime); | |||
|
451 | } | |||
|
452 | else | |||
|
453 | { | |||
|
454 | lastValidEnterModeTime = transitionCoarseTime; | |||
|
455 | PRINTF1("lastValidEnterModeTime = 0x%x\n", transitionCoarseTime); | |||
|
456 | } | |||
449 | } |
|
457 | } | |
450 |
|
458 | |||
451 | int check_transition_date( unsigned int transitionCoarseTime ) |
|
459 | int check_transition_date( unsigned int transitionCoarseTime ) | |
@@ -1243,6 +1251,7 int suspend_asm_tasks( void ) | |||||
1243 |
|
1251 | |||
1244 | void launch_waveform_picker( unsigned char mode, unsigned int transitionCoarseTime ) |
|
1252 | void launch_waveform_picker( unsigned char mode, unsigned int transitionCoarseTime ) | |
1245 | { |
|
1253 | { | |
|
1254 | ||||
1246 | WFP_reset_current_ring_nodes(); |
|
1255 | WFP_reset_current_ring_nodes(); | |
1247 |
|
1256 | |||
1248 | reset_waveform_picker_regs(); |
|
1257 | reset_waveform_picker_regs(); | |
@@ -1263,6 +1272,8 void launch_waveform_picker( unsigned ch | |||||
1263 | waveform_picker_regs->start_date = transitionCoarseTime; |
|
1272 | waveform_picker_regs->start_date = transitionCoarseTime; | |
1264 | } |
|
1273 | } | |
1265 |
|
1274 | |||
|
1275 | update_last_valid_transition_date(waveform_picker_regs->start_date); | |||
|
1276 | ||||
1266 | } |
|
1277 | } | |
1267 |
|
1278 | |||
1268 | void launch_spectral_matrix( void ) |
|
1279 | void launch_spectral_matrix( void ) |
@@ -45,9 +45,10 ring_node ring_node_swf2_extracted; | |||||
45 |
|
45 | |||
46 | typedef enum resynchro_state_t |
|
46 | typedef enum resynchro_state_t | |
47 | { |
|
47 | { | |
48 | IDLE, |
|
48 | MEASURE_0, | |
49 |
MEASURE_ |
|
49 | MEASURE_1, | |
50 | MEASURE_K_PLUS_1, |
|
50 | CORRECTION_0, | |
|
51 | CORRECTION_1 | |||
51 | } resynchro_state; |
|
52 | } resynchro_state; | |
52 |
|
53 | |||
53 | //********************* |
|
54 | //********************* | |
@@ -868,7 +869,7 void build_snapshot_from_ring( ring_node | |||||
868 | } |
|
869 | } | |
869 | } |
|
870 | } | |
870 |
|
871 | |||
871 |
|
|
872 | double computeCorrection( unsigned char *timePtr ) | |
872 | { |
|
873 | { | |
873 | unsigned long long int acquisitionTime; |
|
874 | unsigned long long int acquisitionTime; | |
874 | unsigned long long int centerTime; |
|
875 | unsigned long long int centerTime; | |
@@ -876,63 +877,110 void snapshot_resynchronization( unsigne | |||||
876 | unsigned long long int nextTick; |
|
877 | unsigned long long int nextTick; | |
877 | unsigned long long int deltaPreviousTick; |
|
878 | unsigned long long int deltaPreviousTick; | |
878 | unsigned long long int deltaNextTick; |
|
879 | unsigned long long int deltaNextTick; | |
879 | int deltaTickInF2; |
|
|||
880 | double deltaPrevious_ms; |
|
880 | double deltaPrevious_ms; | |
881 | double deltaNext_ms; |
|
881 | double deltaNext_ms; | |
882 | double correctionInF2; |
|
882 | double correctionInF2; | |
883 | double center_k = 0.; |
|
883 | ||
884 | double cnter_k_plus_1 = 0.; |
|
884 | // get acquisition time in fine time ticks | |
885 | static resynchro_state state = IDLE; |
|
885 | acquisitionTime = get_acquisition_time( timePtr ); | |
886 | static unsigned char resynchroEngaged = 0; |
|
|||
887 |
|
886 | |||
888 | if (resynchroEngaged == 0) |
|
887 | // compute center time | |
889 | { |
|
888 | centerTime = acquisitionTime + 2731; // (2048. / 24576. / 2.) * 65536. = 2730.667; | |
890 | resynchroEngaged = 1; |
|
889 | previousTick = centerTime - (centerTime & 0xffff); | |
891 | // get acquisition time in fine time ticks |
|
890 | nextTick = previousTick + 65536; | |
892 | acquisitionTime = get_acquisition_time( timePtr ); |
|
|||
893 |
|
891 | |||
894 | // compute center time |
|
892 | deltaPreviousTick = centerTime - previousTick; | |
895 | centerTime = acquisitionTime + 2731; // (2048. / 24576. / 2.) * 65536. = 2730.667; |
|
893 | deltaNextTick = nextTick - centerTime; | |
896 | previousTick = centerTime - (centerTime & 0xffff); |
|
|||
897 | nextTick = previousTick + 65536; |
|
|||
898 |
|
894 | |||
899 | deltaPreviousTick = centerTime - previousTick; |
|
895 | deltaPrevious_ms = ((double) deltaPreviousTick) / 65536. * 1000.; | |
900 | deltaNextTick = nextTick - centerTime; |
|
896 | deltaNext_ms = ((double) deltaNextTick) / 65536. * 1000.; | |
901 |
|
897 | |||
902 | deltaPrevious_ms = ((double) deltaPreviousTick) / 65536. * 1000.; |
|
898 | PRINTF2(" delta previous = %.3f ms, delta next = %.2f ms\n", deltaPrevious_ms, deltaNext_ms); | |
903 | deltaNext_ms = ((double) deltaNextTick) / 65536. * 1000.; |
|
899 | // PRINTF2(" delta previous = %llu fine time ticks, delta next = %llu fine time ticks\n", | |
|
900 | // deltaPreviousTick, deltaNextTick); | |||
904 |
|
901 | |||
905 | PRINTF2("delta previous = %f ms, delta next = %f ms\n", deltaPrevious_ms, deltaNext_ms); |
|
902 | // which tick is the closest? | |
906 | PRINTF2("delta previous = %llu fine time ticks, delta next = %llu fine time ticks\n", deltaPreviousTick, deltaNextTick); |
|
903 | if (deltaPreviousTick > deltaNextTick) | |
|
904 | { | |||
|
905 | // the snapshot center is just before the second => increase delta_snapshot | |||
|
906 | correctionInF2 = + (deltaNext_ms * 256. / 1000. ); | |||
|
907 | } | |||
|
908 | else | |||
|
909 | { | |||
|
910 | // the snapshot center is just after the second => decrease delta_snapshot | |||
|
911 | correctionInF2 = - (deltaPrevious_ms * 256. / 1000. ); | |||
|
912 | } | |||
907 |
|
913 | |||
908 | // which tick is the closest? |
|
914 | PRINTF1(" correctionInF2 = %.2f\n", correctionInF2); | |
909 | if (deltaPreviousTick > deltaNextTick) |
|
915 | ||
910 | { |
|
916 | return correctionInF2; | |
911 | // the snapshot center is just before the second => increase delta_snapshot |
|
917 | } | |
912 | correctionInF2 = + (deltaNext_ms * 256. / 1000. ); |
|
|||
913 | } |
|
|||
914 | else |
|
|||
915 | { |
|
|||
916 | // the snapshot center is just after the second => decrease delta_snapshot |
|
|||
917 | correctionInF2 = - (deltaPrevious_ms * 256. / 1000. ); |
|
|||
918 | } |
|
|||
919 |
|
918 | |||
920 | if (correctionInF2 >=0 ) |
|
919 | void applyCorrection( double correction ) | |
921 | { |
|
920 | { | |
922 | deltaTickInF2 = ceil( correctionInF2 ); |
|
921 | int correctionInt; | |
923 | } |
|
922 | ||
924 | else |
|
923 | if (correction>=0) | |
925 |
|
|
924 | { | |
926 | deltaTickInF2 = floor( correctionInF2 ); |
|
925 | correctionInt = floor(correction); | |
927 | } |
|
|||
928 | waveform_picker_regs->delta_snapshot = waveform_picker_regs->delta_snapshot + deltaTickInF2; |
|
|||
929 | set_wfp_delta_f0_f0_2(); // this is necessary to reset the value of delta_f0 as delta_snapshot has been changed |
|
|||
930 | PRINTF2("Correction of = %d, delta_snapshot = %d\n\n", deltaTickInF2, waveform_picker_regs->delta_snapshot); |
|
|||
931 | } |
|
926 | } | |
932 | else |
|
927 | else | |
933 | { |
|
928 | { | |
934 | PRINTF1("No resynchro, delta_snapshot = %d\n\n", waveform_picker_regs->delta_snapshot); |
|
929 | correctionInt = ceil(correction); | |
935 | resynchroEngaged = 0; |
|
930 | } | |
|
931 | waveform_picker_regs->delta_snapshot = waveform_picker_regs->delta_snapshot + correctionInt; | |||
|
932 | //set_wfp_delta_f0_f0_2(); | |||
|
933 | } | |||
|
934 | ||||
|
935 | void snapshot_resynchronization( unsigned char *timePtr ) | |||
|
936 | { | |||
|
937 | static double correction = 0.; | |||
|
938 | static double delay_0 = 0.; | |||
|
939 | static resynchro_state state = MEASURE_0; | |||
|
940 | ||||
|
941 | int correctionInt; | |||
|
942 | ||||
|
943 | correctionInt = 0; | |||
|
944 | ||||
|
945 | switch (state) | |||
|
946 | { | |||
|
947 | ||||
|
948 | case MEASURE_0: | |||
|
949 | // ******** | |||
|
950 | PRINTF("MEASURE_0 ===\n"); | |||
|
951 | state = CORRECTION_0; | |||
|
952 | delay_0 = computeCorrection( timePtr ); | |||
|
953 | correction = delay_0; | |||
|
954 | PRINTF1("MEASURE_0 === correction = %.2f\n", correction ); | |||
|
955 | applyCorrection( correction ); | |||
|
956 | PRINTF1("MEASURE_0 === delta_snapshot = %d\n", waveform_picker_regs->delta_snapshot); | |||
|
957 | //**** | |||
|
958 | break; | |||
|
959 | ||||
|
960 | case CORRECTION_0: | |||
|
961 | //************ | |||
|
962 | PRINTF("CORRECTION_0 ===\n"); | |||
|
963 | state = CORRECTION_1; | |||
|
964 | computeCorrection( timePtr ); | |||
|
965 | correction = -correction; | |||
|
966 | PRINTF1("CORRECTION_0 === correction = %.2f\n", correction ); | |||
|
967 | applyCorrection( correction ); | |||
|
968 | PRINTF1("CORRECTION_0 === delta_snapshot = %d\n", waveform_picker_regs->delta_snapshot); | |||
|
969 | //**** | |||
|
970 | break; | |||
|
971 | ||||
|
972 | case CORRECTION_1: | |||
|
973 | //************ | |||
|
974 | PRINTF("CORRECTION_1 ===\n"); | |||
|
975 | state = MEASURE_0; | |||
|
976 | computeCorrection( timePtr ); | |||
|
977 | PRINTF1("CORRECTION_1 === delta_snapshot = %d\n", waveform_picker_regs->delta_snapshot); | |||
|
978 | //**** | |||
|
979 | break; | |||
|
980 | ||||
|
981 | default: | |||
|
982 | break; | |||
|
983 | ||||
936 | } |
|
984 | } | |
937 | } |
|
985 | } | |
938 |
|
986 |
General Comments 0
You need to be logged in to leave comments.
Login now