@@ -20,7 +20,7 SWVERSION=-1-0 | |||||
20 | DEFINES += SW_VERSION_N1=3 # major |
|
20 | DEFINES += SW_VERSION_N1=3 # major | |
21 | DEFINES += SW_VERSION_N2=0 # minor |
|
21 | DEFINES += SW_VERSION_N2=0 # minor | |
22 | DEFINES += SW_VERSION_N3=0 # patch |
|
22 | DEFINES += SW_VERSION_N3=0 # patch | |
23 |
DEFINES += SW_VERSION_N4=1 |
|
23 | DEFINES += SW_VERSION_N4=19 # internal | |
24 |
|
24 | |||
25 | # <GCOV> |
|
25 | # <GCOV> | |
26 | #QMAKE_CFLAGS_RELEASE += -fprofile-arcs -ftest-coverage |
|
26 | #QMAKE_CFLAGS_RELEASE += -fprofile-arcs -ftest-coverage |
@@ -16,6 +16,7 | |||||
16 | extern spw_stats grspw_stats; |
|
16 | extern spw_stats grspw_stats; | |
17 | extern rtems_name timecode_timer_name; |
|
17 | extern rtems_name timecode_timer_name; | |
18 | extern rtems_id timecode_timer_id; |
|
18 | extern rtems_id timecode_timer_id; | |
|
19 | extern unsigned char oneTcLfrUpdateTimeReceived; | |||
19 |
|
20 | |||
20 | // RTEMS TASK |
|
21 | // RTEMS TASK | |
21 | rtems_task spiq_task( rtems_task_argument argument ); |
|
22 | rtems_task spiq_task( rtems_task_argument argument ); | |
@@ -47,10 +48,10 void spw_send_asm_f1( ring_node *ring_no | |||||
47 | void spw_send_asm_f2( ring_node *ring_node_to_send, Header_TM_LFR_SCIENCE_ASM_t *header ); |
|
48 | void spw_send_asm_f2( ring_node *ring_node_to_send, Header_TM_LFR_SCIENCE_ASM_t *header ); | |
48 | void spw_send_k_dump( ring_node *ring_node_to_send ); |
|
49 | void spw_send_k_dump( ring_node *ring_node_to_send ); | |
49 |
|
50 | |||
50 | rtems_timer_service_routine timecode_timer_routine( rtems_id timer_id, void *user_data ); |
|
|||
51 | unsigned int check_timecode_and_previous_timecode_coherency(unsigned char currentTimecodeCtr); |
|
51 | unsigned int check_timecode_and_previous_timecode_coherency(unsigned char currentTimecodeCtr); | |
52 | unsigned int check_timecode_and_internal_time_coherency(unsigned char timecode, unsigned char internalTime); |
|
52 | unsigned int check_timecode_and_internal_time_coherency(unsigned char timecode, unsigned char internalTime); | |
53 | void timecode_irq_handler( void *pDev, void *regs, int minor, unsigned int tc ); |
|
53 | void timecode_irq_handler( void *pDev, void *regs, int minor, unsigned int tc ); | |
|
54 | rtems_timer_service_routine timecode_timer_routine( rtems_id timer_id, void *user_data ); | |||
54 |
|
55 | |||
55 | void (*grspw_timecode_callback) ( void *pDev, void *regs, int minor, unsigned int tc ); |
|
56 | void (*grspw_timecode_callback) ( void *pDev, void *regs, int minor, unsigned int tc ); | |
56 |
|
57 |
@@ -13,6 +13,7 | |||||
13 | #include "lfr_cpu_usage_report.h" |
|
13 | #include "lfr_cpu_usage_report.h" | |
14 |
|
14 | |||
15 | extern unsigned int lastValidEnterModeTime; |
|
15 | extern unsigned int lastValidEnterModeTime; | |
|
16 | extern unsigned char oneTcLfrUpdateTimeReceived; | |||
16 |
|
17 | |||
17 | //**** |
|
18 | //**** | |
18 | // ISR |
|
19 | // ISR |
@@ -33,6 +33,7 int fdUART = 0; | |||||
33 | unsigned char lfrCurrentMode; |
|
33 | unsigned char lfrCurrentMode; | |
34 | unsigned char pa_bia_status_info; |
|
34 | unsigned char pa_bia_status_info; | |
35 | unsigned char thisIsAnASMRestart = 0; |
|
35 | unsigned char thisIsAnASMRestart = 0; | |
|
36 | unsigned char oneTcLfrUpdateTimeReceived = 0; | |||
36 |
|
37 | |||
37 | // WAVEFORMS GLOBAL VARIABLES // 2048 * 3 * 4 + 2 * 4 = 24576 + 8 bytes = 24584 |
|
38 | // WAVEFORMS GLOBAL VARIABLES // 2048 * 3 * 4 + 2 * 4 = 24576 + 8 bytes = 24584 | |
38 | // 97 * 256 = 24832 => delta = 248 bytes = 62 words |
|
39 | // 97 * 256 = 24832 => delta = 248 bytes = 62 words |
@@ -813,51 +813,6 void increase_unsigned_char_counter( uns | |||||
813 | } |
|
813 | } | |
814 | } |
|
814 | } | |
815 |
|
815 | |||
816 | rtems_timer_service_routine timecode_timer_routine( rtems_id timer_id, void *user_data ) |
|
|||
817 | { |
|
|||
818 | static unsigned char initStep = 1; |
|
|||
819 |
|
||||
820 | unsigned char currentTimecodeCtr; |
|
|||
821 |
|
||||
822 | currentTimecodeCtr = (unsigned char) (grspwPtr[0] & TIMECODE_MASK); |
|
|||
823 |
|
||||
824 | if (initStep == 1) |
|
|||
825 | { |
|
|||
826 | if (currentTimecodeCtr == previousTimecodeCtr) |
|
|||
827 | { |
|
|||
828 | //************************ |
|
|||
829 | // HK_LFR_TIMECODE_MISSING |
|
|||
830 | // the timecode value has not changed, no valid timecode has been received, the timecode is MISSING |
|
|||
831 | increase_unsigned_char_counter( &housekeeping_packet.hk_lfr_timecode_missing ); |
|
|||
832 | update_hk_lfr_last_er_fields( RID_LE_LFR_TIMEC, CODE_MISSING ); |
|
|||
833 | } |
|
|||
834 | else if (currentTimecodeCtr == (previousTimecodeCtr+1)) |
|
|||
835 | { |
|
|||
836 | // the timecode value has changed and the value is valid, this is unexpected because |
|
|||
837 | // the timer should not have fired, the timecode_irq_handler should have been raised |
|
|||
838 | } |
|
|||
839 | else |
|
|||
840 | { |
|
|||
841 | //************************ |
|
|||
842 | // HK_LFR_TIMECODE_INVALID |
|
|||
843 | // the timecode value has changed and the value is not valid, no tickout has been generated |
|
|||
844 | // this is why the timer has fired |
|
|||
845 | increase_unsigned_char_counter( &housekeeping_packet.hk_lfr_timecode_invalid ); |
|
|||
846 | update_hk_lfr_last_er_fields( RID_LE_LFR_TIMEC, CODE_INVALID ); |
|
|||
847 | } |
|
|||
848 | } |
|
|||
849 | else |
|
|||
850 | { |
|
|||
851 | initStep = 1; |
|
|||
852 | //************************ |
|
|||
853 | // HK_LFR_TIMECODE_MISSING |
|
|||
854 | increase_unsigned_char_counter( &housekeeping_packet.hk_lfr_timecode_missing ); |
|
|||
855 | update_hk_lfr_last_er_fields( RID_LE_LFR_TIMEC, CODE_MISSING ); |
|
|||
856 | } |
|
|||
857 |
|
||||
858 | rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_13 ); |
|
|||
859 | } |
|
|||
860 |
|
||||
861 | unsigned int check_timecode_and_previous_timecode_coherency(unsigned char currentTimecodeCtr) |
|
816 | unsigned int check_timecode_and_previous_timecode_coherency(unsigned char currentTimecodeCtr) | |
862 | { |
|
817 | { | |
863 | /** This function checks the coherency between the incoming timecode and the last valid timecode. |
|
818 | /** This function checks the coherency between the incoming timecode and the last valid timecode. | |
@@ -967,10 +922,13 void timecode_irq_handler( void *pDev, v | |||||
967 | //******************** |
|
922 | //******************** | |
968 | // HK_LFR_TIMECODE_CTR |
|
923 | // HK_LFR_TIMECODE_CTR | |
969 | // check the value of the timecode with respect to the last TC_LFR_UPDATE_TIME => SSS-CP-FS-370 |
|
924 | // check the value of the timecode with respect to the last TC_LFR_UPDATE_TIME => SSS-CP-FS-370 | |
970 | if (incomingTimecode != updateTime) |
|
925 | if (oneTcLfrUpdateTimeReceived == 1) | |
971 | { |
|
926 | { | |
972 | increase_unsigned_char_counter( &housekeeping_packet.hk_lfr_time_timecode_ctr ); |
|
927 | if ( incomingTimecode != updateTime ) | |
973 | update_hk_lfr_last_er_fields( RID_LE_LFR_TIME, CODE_TIMECODE_CTR ); |
|
928 | { | |
|
929 | increase_unsigned_char_counter( &housekeeping_packet.hk_lfr_time_timecode_ctr ); | |||
|
930 | update_hk_lfr_last_er_fields( RID_LE_LFR_TIME, CODE_TIMECODE_CTR ); | |||
|
931 | } | |||
974 | } |
|
932 | } | |
975 |
|
933 | |||
976 | // launch the timecode timer to detect missing or invalid timecodes |
|
934 | // launch the timecode timer to detect missing or invalid timecodes | |
@@ -982,6 +940,51 void timecode_irq_handler( void *pDev, v | |||||
982 | } |
|
940 | } | |
983 | } |
|
941 | } | |
984 |
|
942 | |||
|
943 | rtems_timer_service_routine timecode_timer_routine( rtems_id timer_id, void *user_data ) | |||
|
944 | { | |||
|
945 | static unsigned char initStep = 1; | |||
|
946 | ||||
|
947 | unsigned char currentTimecodeCtr; | |||
|
948 | ||||
|
949 | currentTimecodeCtr = (unsigned char) (grspwPtr[0] & TIMECODE_MASK); | |||
|
950 | ||||
|
951 | if (initStep == 1) | |||
|
952 | { | |||
|
953 | if (currentTimecodeCtr == previousTimecodeCtr) | |||
|
954 | { | |||
|
955 | //************************ | |||
|
956 | // HK_LFR_TIMECODE_MISSING | |||
|
957 | // the timecode value has not changed, no valid timecode has been received, the timecode is MISSING | |||
|
958 | increase_unsigned_char_counter( &housekeeping_packet.hk_lfr_timecode_missing ); | |||
|
959 | update_hk_lfr_last_er_fields( RID_LE_LFR_TIMEC, CODE_MISSING ); | |||
|
960 | } | |||
|
961 | else if (currentTimecodeCtr == (previousTimecodeCtr+1)) | |||
|
962 | { | |||
|
963 | // the timecode value has changed and the value is valid, this is unexpected because | |||
|
964 | // the timer should not have fired, the timecode_irq_handler should have been raised | |||
|
965 | } | |||
|
966 | else | |||
|
967 | { | |||
|
968 | //************************ | |||
|
969 | // HK_LFR_TIMECODE_INVALID | |||
|
970 | // the timecode value has changed and the value is not valid, no tickout has been generated | |||
|
971 | // this is why the timer has fired | |||
|
972 | increase_unsigned_char_counter( &housekeeping_packet.hk_lfr_timecode_invalid ); | |||
|
973 | update_hk_lfr_last_er_fields( RID_LE_LFR_TIMEC, CODE_INVALID ); | |||
|
974 | } | |||
|
975 | } | |||
|
976 | else | |||
|
977 | { | |||
|
978 | initStep = 1; | |||
|
979 | //************************ | |||
|
980 | // HK_LFR_TIMECODE_MISSING | |||
|
981 | increase_unsigned_char_counter( &housekeeping_packet.hk_lfr_timecode_missing ); | |||
|
982 | update_hk_lfr_last_er_fields( RID_LE_LFR_TIMEC, CODE_MISSING ); | |||
|
983 | } | |||
|
984 | ||||
|
985 | rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_13 ); | |||
|
986 | } | |||
|
987 | ||||
985 | void init_header_cwf( Header_TM_LFR_SCIENCE_CWF_t *header ) |
|
988 | void init_header_cwf( Header_TM_LFR_SCIENCE_CWF_t *header ) | |
986 | { |
|
989 | { | |
987 | header->targetLogicalAddress = CCSDS_DESTINATION_ID; |
|
990 | header->targetLogicalAddress = CCSDS_DESTINATION_ID; |
@@ -206,8 +206,6 int action_enter_mode(ccsdsTelecommandPa | |||||
206 | { |
|
206 | { | |
207 | PRINTF1("OK *** in action_enter_mode *** enter mode %d\n", requestedMode); |
|
207 | PRINTF1("OK *** in action_enter_mode *** enter mode %d\n", requestedMode); | |
208 |
|
208 | |||
209 | update_last_valid_transition_date( transitionCoarseTime ); |
|
|||
210 |
|
||||
211 | switch(requestedMode) |
|
209 | switch(requestedMode) | |
212 | { |
|
210 | { | |
213 | case LFR_MODE_STANDBY: |
|
211 | case LFR_MODE_STANDBY: | |
@@ -361,6 +359,8 int action_update_time(ccsdsTelecommandP | |||||
361 | housekeeping_packet.hk_lfr_update_time_tc_cnt[0] = (unsigned char) (val >> 8); |
|
359 | housekeeping_packet.hk_lfr_update_time_tc_cnt[0] = (unsigned char) (val >> 8); | |
362 | housekeeping_packet.hk_lfr_update_time_tc_cnt[1] = (unsigned char) (val); |
|
360 | housekeeping_packet.hk_lfr_update_time_tc_cnt[1] = (unsigned char) (val); | |
363 |
|
361 | |||
|
362 | oneTcLfrUpdateTimeReceived = 1; | |||
|
363 | ||||
364 | return LFR_SUCCESSFUL; |
|
364 | return LFR_SUCCESSFUL; | |
365 | } |
|
365 | } | |
366 |
|
366 | |||
@@ -454,7 +454,7 void update_last_valid_transition_date( | |||||
454 | if (transitionCoarseTime == 0) |
|
454 | if (transitionCoarseTime == 0) | |
455 | { |
|
455 | { | |
456 | lastValidEnterModeTime = time_management_regs->coarse_time + 1; |
|
456 | lastValidEnterModeTime = time_management_regs->coarse_time + 1; | |
457 |
PRINTF1("lastValidEnterModeTime = 0x%x (transitionCoarseTime = 0 => coarse_time+1)\n", |
|
457 | PRINTF1("lastValidEnterModeTime = 0x%x (transitionCoarseTime = 0 => coarse_time+1)\n", lastValidEnterModeTime); | |
458 | } |
|
458 | } | |
459 | else |
|
459 | else | |
460 | { |
|
460 | { | |
@@ -681,12 +681,14 int enter_mode_normal( unsigned int tran | |||||
681 | } |
|
681 | } | |
682 | break; |
|
682 | break; | |
683 | case LFR_MODE_SBM1: |
|
683 | case LFR_MODE_SBM1: | |
684 | restart_asm_activities( LFR_MODE_NORMAL ); // this is necessary to restart ASM tasks to update the parameters |
|
684 | status = restart_asm_activities( LFR_MODE_NORMAL ); // this is necessary to restart ASM tasks to update the parameters | |
685 | status = LFR_SUCCESSFUL; // lfrCurrentMode will be updated after the execution of close_action |
|
685 | status = LFR_SUCCESSFUL; // lfrCurrentMode will be updated after the execution of close_action | |
|
686 | update_last_valid_transition_date( transitionCoarseTime ); | |||
686 | break; |
|
687 | break; | |
687 | case LFR_MODE_SBM2: |
|
688 | case LFR_MODE_SBM2: | |
688 | restart_asm_activities( LFR_MODE_NORMAL ); // this is necessary to restart ASM tasks to update the parameters |
|
689 | status = restart_asm_activities( LFR_MODE_NORMAL ); // this is necessary to restart ASM tasks to update the parameters | |
689 | status = LFR_SUCCESSFUL; // lfrCurrentMode will be updated after the execution of close_action |
|
690 | status = LFR_SUCCESSFUL; // lfrCurrentMode will be updated after the execution of close_action | |
|
691 | update_last_valid_transition_date( transitionCoarseTime ); | |||
690 | break; |
|
692 | break; | |
691 | default: |
|
693 | default: | |
692 | break; |
|
694 | break; | |
@@ -778,8 +780,9 int enter_mode_sbm1( unsigned int transi | |||||
778 | } |
|
780 | } | |
779 | break; |
|
781 | break; | |
780 | case LFR_MODE_NORMAL: // lfrCurrentMode will be updated after the execution of close_action |
|
782 | case LFR_MODE_NORMAL: // lfrCurrentMode will be updated after the execution of close_action | |
781 | restart_asm_activities( LFR_MODE_SBM1 ); |
|
783 | status = restart_asm_activities( LFR_MODE_SBM1 ); | |
782 | status = LFR_SUCCESSFUL; |
|
784 | status = LFR_SUCCESSFUL; | |
|
785 | update_last_valid_transition_date( transitionCoarseTime ); | |||
783 | break; |
|
786 | break; | |
784 | case LFR_MODE_BURST: |
|
787 | case LFR_MODE_BURST: | |
785 | status = stop_current_mode(); // stop the current mode |
|
788 | status = stop_current_mode(); // stop the current mode | |
@@ -791,8 +794,9 int enter_mode_sbm1( unsigned int transi | |||||
791 | } |
|
794 | } | |
792 | break; |
|
795 | break; | |
793 | case LFR_MODE_SBM2: |
|
796 | case LFR_MODE_SBM2: | |
794 | restart_asm_activities( LFR_MODE_SBM1 ); |
|
797 | status = restart_asm_activities( LFR_MODE_SBM1 ); | |
795 | status = LFR_SUCCESSFUL; // lfrCurrentMode will be updated after the execution of close_action |
|
798 | status = LFR_SUCCESSFUL; // lfrCurrentMode will be updated after the execution of close_action | |
|
799 | update_last_valid_transition_date( transitionCoarseTime ); | |||
796 | break; |
|
800 | break; | |
797 | default: |
|
801 | default: | |
798 | break; |
|
802 | break; | |
@@ -844,8 +848,9 int enter_mode_sbm2( unsigned int transi | |||||
844 | } |
|
848 | } | |
845 | break; |
|
849 | break; | |
846 | case LFR_MODE_NORMAL: |
|
850 | case LFR_MODE_NORMAL: | |
847 | restart_asm_activities( LFR_MODE_SBM2 ); |
|
851 | status = restart_asm_activities( LFR_MODE_SBM2 ); | |
848 | status = LFR_SUCCESSFUL; // lfrCurrentMode will be updated after the execution of close_action |
|
852 | status = LFR_SUCCESSFUL; // lfrCurrentMode will be updated after the execution of close_action | |
|
853 | update_last_valid_transition_date( transitionCoarseTime ); | |||
849 | break; |
|
854 | break; | |
850 | case LFR_MODE_BURST: |
|
855 | case LFR_MODE_BURST: | |
851 | status = stop_current_mode(); // stop the current mode |
|
856 | status = stop_current_mode(); // stop the current mode | |
@@ -857,8 +862,9 int enter_mode_sbm2( unsigned int transi | |||||
857 | } |
|
862 | } | |
858 | break; |
|
863 | break; | |
859 | case LFR_MODE_SBM1: |
|
864 | case LFR_MODE_SBM1: | |
860 | restart_asm_activities( LFR_MODE_SBM2 ); |
|
865 | status = restart_asm_activities( LFR_MODE_SBM2 ); | |
861 | status = LFR_SUCCESSFUL; // lfrCurrentMode will be updated after the execution of close_action |
|
866 | status = LFR_SUCCESSFUL; // lfrCurrentMode will be updated after the execution of close_action | |
|
867 | update_last_valid_transition_date( transitionCoarseTime ); | |||
862 | break; |
|
868 | break; | |
863 | default: |
|
869 | default: | |
864 | break; |
|
870 | break; | |
@@ -1273,7 +1279,7 void launch_waveform_picker( unsigned ch | |||||
1273 | if (transitionCoarseTime == 0) |
|
1279 | if (transitionCoarseTime == 0) | |
1274 | { |
|
1280 | { | |
1275 | // instant transition means transition on the next valid date |
|
1281 | // instant transition means transition on the next valid date | |
1276 | // this is mandatory to have a good snapshot period a a good correction of the snapshot period |
|
1282 | // this is mandatory to have a good snapshot period and a good correction of the snapshot period | |
1277 | waveform_picker_regs->start_date = time_management_regs->coarse_time + 1; |
|
1283 | waveform_picker_regs->start_date = time_management_regs->coarse_time + 1; | |
1278 | } |
|
1284 | } | |
1279 | else |
|
1285 | else |
@@ -964,6 +964,7 void snapshot_resynchronization( unsigne | |||||
964 |
|
964 | |||
965 | static double correction = 0.; |
|
965 | static double correction = 0.; | |
966 | static resynchro_state state = MEASURE; |
|
966 | static resynchro_state state = MEASURE; | |
|
967 | static unsigned int nbSnapshots = 0; | |||
967 |
|
968 | |||
968 | int correctionInt; |
|
969 | int correctionInt; | |
969 |
|
970 | |||
@@ -974,7 +975,7 void snapshot_resynchronization( unsigne | |||||
974 |
|
975 | |||
975 | case MEASURE: |
|
976 | case MEASURE: | |
976 | // ******** |
|
977 | // ******** | |
977 | PRINTF("MEASURE ===\n"); |
|
978 | PRINTF1("MEASURE === %d\n", nbSnapshots); | |
978 | state = CORRECTION; |
|
979 | state = CORRECTION; | |
979 | correction = computeCorrection( timePtr ); |
|
980 | correction = computeCorrection( timePtr ); | |
980 | PRINTF1("MEASURE === correction = %.2f\n", correction ); |
|
981 | PRINTF1("MEASURE === correction = %.2f\n", correction ); | |
@@ -985,7 +986,7 void snapshot_resynchronization( unsigne | |||||
985 |
|
986 | |||
986 | case CORRECTION: |
|
987 | case CORRECTION: | |
987 | //************ |
|
988 | //************ | |
988 | PRINTF("CORRECTION ===\n"); |
|
989 | PRINTF1("CORRECTION === %d\n", nbSnapshots); | |
989 | state = MEASURE; |
|
990 | state = MEASURE; | |
990 | computeCorrection( timePtr ); |
|
991 | computeCorrection( timePtr ); | |
991 | correction = -correction; |
|
992 | correction = -correction; | |
@@ -999,6 +1000,8 void snapshot_resynchronization( unsigne | |||||
999 | break; |
|
1000 | break; | |
1000 |
|
1001 | |||
1001 | } |
|
1002 | } | |
|
1003 | ||||
|
1004 | nbSnapshots++; | |||
1002 | } |
|
1005 | } | |
1003 |
|
1006 | |||
1004 | //************** |
|
1007 | //************** |
General Comments 0
You need to be logged in to leave comments.
Login now