##// END OF EJS Templates
SOLVED: compatibility of fsw-gsa with the WF simulator interruption
paul -
r30:f599a59313eb default
parent child
Show More
@@ -1,6 +1,6
1 1 #############################################################################
2 2 # Makefile for building: bin/fsw
3 # Generated by qmake (2.01a) (Qt 4.8.4) on: Tue Jul 16 13:03:12 2013
3 # Generated by qmake (2.01a) (Qt 4.8.4) on: Fri Jul 19 08:56:46 2013
4 4 # Project: fsw-qt.pro
5 5 # Template: app
6 6 # Command: /usr/bin/qmake-qt4 -spec /usr/lib64/qt4/mkspecs/linux-g++ -o Makefile fsw-qt.pro
@@ -10,7 +10,7
10 10
11 11 CC = sparc-rtems-gcc
12 12 CXX = sparc-rtems-g++
13 DEFINES = -DSW_VERSION_N1=0 -DSW_VERSION_N2=0 -DSW_VERSION_N3=0 -DSW_VERSION_N4=8 -DPRINT_MESSAGES_ON_CONSOLE
13 DEFINES = -DSW_VERSION_N1=0 -DSW_VERSION_N2=0 -DSW_VERSION_N3=0 -DSW_VERSION_N4=9 -DPRINT_MESSAGES_ON_CONSOLE
14 14 CFLAGS = -pipe -O3 -Wall $(DEFINES)
15 15 CXXFLAGS = -pipe -O3 -Wall $(DEFINES)
16 16 INCPATH = -I/usr/lib64/qt4/mkspecs/linux-g++ -I. -I../src -I../header
1 NO CONTENT: modified file, binary diff hidden
1 NO CONTENT: modified file, binary diff hidden
@@ -7,11 +7,11 CONFIG -= qt
7 7 include(./sparc.pri)
8 8
9 9 # flight software version
10 SWVERSION=-0-8
10 SWVERSION=-0-9
11 11 DEFINES += SW_VERSION_N1=0
12 12 DEFINES += SW_VERSION_N2=0
13 13 DEFINES += SW_VERSION_N3=0
14 DEFINES += SW_VERSION_N4=8
14 DEFINES += SW_VERSION_N4=9
15 15
16 16 contains( CONFIG, verbose ) {
17 17 DEFINES += PRINT_MESSAGES_ON_CONSOLE
@@ -1,6 +1,6
1 1 <?xml version="1.0" encoding="UTF-8"?>
2 2 <!DOCTYPE QtCreatorProject>
3 <!-- Written by QtCreator 2.7.0, 2013-07-16T11:27:54. -->
3 <!-- Written by QtCreator 2.7.0, 2013-07-19T08:53:16. -->
4 4 <qtcreator>
5 5 <data>
6 6 <variable>ProjectExplorer.Project.ActiveTarget</variable>
@@ -88,9 +88,10 rtems_task Init( rtems_task_argument ign
88 88
89 89 //**********
90 90 // WAVEFORMS
91 // simulator
92 91
93 92 #ifdef GSA
93 // simulator
94 PRINTF("GSA is defined *** fsw-gsa is running \n")
94 95 configure_timer((gptimer_regs_t*) REGS_ADDR_GPTIMER, TIMER_WF_SIMULATOR, CLKDIV_WF_SIMULATOR,
95 96 IRQ_SPARC_WF, waveforms_simulator_isr );
96 97 #else
@@ -125,61 +126,17 rtems_task Init( rtems_task_argument ign
125 126 LEON_Unmask_interrupt( IRQ_TIME2 );
126 127
127 128 #ifdef GSA
128 //if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_0 ) != RTEMS_SUCCESSFUL) {
129 // printf("in INIT *** Error sending event to WFRM\n");
130 //}
129 if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_NORMAL ) != RTEMS_SUCCESSFUL) {
130 PRINTF("in INIT *** Error sending event to WFRM\n")
131 }
131 132 #endif
132 133
134 LEON_Force_interrupt(IRQ_WF);
135
133 136 status = rtems_task_delete(RTEMS_SELF);
134 137
135 138 }
136 139
137 rtems_task spiq_task(rtems_task_argument unused)
138 {
139 rtems_event_set event_out;
140 rtems_status_code status;
141 unsigned char lfrMode;
142
143 while(true){
144 PRINTF("in SPIQ *** Waiting for SPW_LINKERR_EVENT\n")
145 rtems_event_receive(SPW_LINKERR_EVENT, RTEMS_WAIT, RTEMS_NO_TIMEOUT, &event_out); // wait for an SPW_LINKERR_EVENT
146
147 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4; // get the current mode
148
149 status = spacewire_wait_for_link();
150
151 if (status != RTEMS_SUCCESSFUL)
152 {
153 //****************
154 // STOP THE SYSTEM
155 spacewire_compute_stats_offsets();
156 stop_current_mode();
157 if (rtems_task_suspend(Task_id[TASKID_RECV])!=RTEMS_SUCCESSFUL) { // suspend RECV task
158 PRINTF("in SPIQ *** Error suspending RECV Task\n")
159 }
160 if (rtems_task_suspend(Task_id[TASKID_HOUS])!=RTEMS_SUCCESSFUL) { // suspend HOUS task
161 PRINTF("in SPIQ *** Error suspending HOUS Task\n")
162 }
163
164 //***************************
165 // RESTART THE SPACEWIRE LINK
166 spacewire_configure_link();
167
168 //*******************
169 // RESTART THE SYSTEM
170 //ioctl(fdSPW, SPACEWIRE_IOCTRL_CLR_STATISTICS); // clear statistics
171 status = rtems_task_restart( Task_id[TASKID_HOUS], 1 );
172 if (status != RTEMS_SUCCESSFUL) {
173 PRINTF1("in SPIQ *** Error restarting HOUS Task *** code %d\n", status)
174 }
175 if (rtems_task_restart(Task_id[TASKID_RECV], 1) != RTEMS_SUCCESSFUL) { // restart RECV task
176 PRINTF("in SPIQ *** Error restarting RECV Task\n")
177 }
178 //enter_mode(lfrMode, NULL); // enter the mode that was running before the SpaceWire interruption
179 }
180 }
181 }
182
183 140 void init_parameter_dump(void)
184 141 {
185 142 parameter_dump_packet.targetLogicalAddress = CCSDS_DESTINATION_ID;
@@ -436,6 +393,54 int start_all_tasks( void )
436 393 return 0;
437 394 }
438 395
396 // SPACEWIRE
397
398 rtems_task spiq_task(rtems_task_argument unused)
399 {
400 rtems_event_set event_out;
401 rtems_status_code status;
402 unsigned char lfrMode;
403
404 while(true){
405 PRINTF("in SPIQ *** Waiting for SPW_LINKERR_EVENT\n")
406 rtems_event_receive(SPW_LINKERR_EVENT, RTEMS_WAIT, RTEMS_NO_TIMEOUT, &event_out); // wait for an SPW_LINKERR_EVENT
407
408 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4; // get the current mode
409
410 status = spacewire_wait_for_link();
411
412 if (status != RTEMS_SUCCESSFUL)
413 {
414 //****************
415 // STOP THE SYSTEM
416 spacewire_compute_stats_offsets();
417 stop_current_mode();
418 if (rtems_task_suspend(Task_id[TASKID_RECV])!=RTEMS_SUCCESSFUL) { // suspend RECV task
419 PRINTF("in SPIQ *** Error suspending RECV Task\n")
420 }
421 if (rtems_task_suspend(Task_id[TASKID_HOUS])!=RTEMS_SUCCESSFUL) { // suspend HOUS task
422 PRINTF("in SPIQ *** Error suspending HOUS Task\n")
423 }
424
425 //***************************
426 // RESTART THE SPACEWIRE LINK
427 spacewire_configure_link();
428
429 //*******************
430 // RESTART THE SYSTEM
431 //ioctl(fdSPW, SPACEWIRE_IOCTRL_CLR_STATISTICS); // clear statistics
432 status = rtems_task_restart( Task_id[TASKID_HOUS], 1 );
433 if (status != RTEMS_SUCCESSFUL) {
434 PRINTF1("in SPIQ *** Error restarting HOUS Task *** code %d\n", status)
435 }
436 if (rtems_task_restart(Task_id[TASKID_RECV], 1) != RTEMS_SUCCESSFUL) { // restart RECV task
437 PRINTF("in SPIQ *** Error restarting RECV Task\n")
438 }
439 //enter_mode(lfrMode, NULL); // enter the mode that was running before the SpaceWire interruption
440 }
441 }
442 }
443
439 444 int spacewire_configure_link( void )
440 445 {
441 446 rtems_status_code status;
@@ -466,13 +471,13 int spacewire_configure_link( void )
466 471 status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_RXBLOCK, 1); // sets the blocking mode for reception
467 472 if (status!=RTEMS_SUCCESSFUL) PRINTF("in SPIQ *** Error SPACEWIRE_IOCTRL_SET_RXBLOCK\n")
468 473 //
469 //status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_EVENT_ID, Task_id[TASKID_SPIQ]); // sets the task ID to which an event is sent when a
470 //if (status!=RTEMS_SUCCESSFUL) PRINTF("in SPIQ *** Error SPACEWIRE_IOCTRL_SET_EVENT_ID\n") // link-error interrupt occurs
474 status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_EVENT_ID, Task_id[TASKID_SPIQ]); // sets the task ID to which an event is sent when a
475 if (status!=RTEMS_SUCCESSFUL) PRINTF("in SPIQ *** Error SPACEWIRE_IOCTRL_SET_EVENT_ID\n") // link-error interrupt occurs
471 476 //
472 477 status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_DISABLE_ERR, 0); // automatic link-disabling due to link-error interrupts
473 478 if (status!=RTEMS_SUCCESSFUL) PRINTF("in SPIQ *** Error SPACEWIRE_IOCTRL_SET_DISABLE_ERR\n")
474 479 //
475 status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_LINK_ERR_IRQ, 0); // sets the link-error interrupt bit
480 status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_LINK_ERR_IRQ, 1); // sets the link-error interrupt bit
476 481 if (status!=RTEMS_SUCCESSFUL) PRINTF("in SPIQ *** Error SPACEWIRE_IOCTRL_SET_LINK_ERR_IRQ\n")
477 482 //
478 483 status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_TXBLOCK, 0); // transmission blocks
@@ -1,11 +1,12
1 1 #include <tc_handler.h>
2 2 #include <fsw_params.h>
3 3
4 char *DumbMessages[5] = {"in DUMB *** default", // RTEMS_EVENT_0
4 char *DumbMessages[6] = {"in DUMB *** default", // RTEMS_EVENT_0
5 5 "in DUMB *** timecode_irq_handler", // RTEMS_EVENT_1
6 6 "in DUMB *** waveforms_isr", // RTEMS_EVENT_2
7 7 "in DUMB *** in SMIQ *** Error sending event to AVF0", // RTEMS_EVENT_3
8 "in DUMB *** spectral_matrices_isr *** Error sending event to SMIQ" // RTEMS_EVENT_4
8 "in DUMB *** spectral_matrices_isr *** Error sending event to SMIQ", // RTEMS_EVENT_4
9 "in DUMB *** waveforms_simulator_isr" // RTEMS_EVENT_5
9 10 };
10 11
11 12 unsigned char currentTC_LEN_RCV[2]; // SHALL be equal to the current TC packet estimated packet length field
@@ -526,10 +527,9 rtems_task dumb_task( rtems_task_argumen
526 527 PRINTF("in DUMB *** \n")
527 528
528 529 while(1){
529 rtems_event_receive(RTEMS_EVENT_0 | RTEMS_EVENT_1 | RTEMS_EVENT_2 | RTEMS_EVENT_3 | RTEMS_EVENT_4,
530 rtems_event_receive(RTEMS_EVENT_0 | RTEMS_EVENT_1 | RTEMS_EVENT_2 | RTEMS_EVENT_3 | RTEMS_EVENT_4 | RTEMS_EVENT_5,
530 531 RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out); // wait for an RTEMS_EVENT
531 532 intEventOut = (unsigned int) event_out;
532 PRINTF1("in DUMB *** event_out %x\n", (int) event_out)
533 533 for ( i=0; i<32; i++)
534 534 {
535 535 if ( ((intEventOut >> i) & 0x0001) != 0)
@@ -823,7 +823,7 int transition_validation(unsigned char
823 823 switch (requestedMode)
824 824 {
825 825 case LFR_MODE_STANDBY:
826 if ( (lfrMode == LFR_MODE_STANDBY) ) {
826 if ( lfrMode == LFR_MODE_STANDBY ) {
827 827 status = LFR_DEFAULT;
828 828 }
829 829 else
@@ -832,7 +832,7 int transition_validation(unsigned char
832 832 }
833 833 break;
834 834 case LFR_MODE_NORMAL:
835 if ( (lfrMode == LFR_MODE_NORMAL) ) {
835 if ( lfrMode == LFR_MODE_NORMAL ) {
836 836 status = LFR_DEFAULT;
837 837 }
838 838 else {
@@ -840,8 +840,7 int transition_validation(unsigned char
840 840 }
841 841 break;
842 842 case LFR_MODE_BURST:
843 if ( (lfrMode == LFR_MODE_STANDBY) | (lfrMode == LFR_MODE_BURST)
844 | (lfrMode == LFR_MODE_SBM2) ) {
843 if ( lfrMode == LFR_MODE_STANDBY ) {
845 844 status = LFR_DEFAULT;
846 845 }
847 846 else {
@@ -849,7 +848,7 int transition_validation(unsigned char
849 848 }
850 849 break;
851 850 case LFR_MODE_SBM1:
852 if ( (lfrMode == LFR_MODE_STANDBY) | (lfrMode == LFR_MODE_SBM1) ) {
851 if ( lfrMode == LFR_MODE_SBM1 ) {
853 852 status = LFR_DEFAULT;
854 853 }
855 854 else {
@@ -857,8 +856,7 int transition_validation(unsigned char
857 856 }
858 857 break;
859 858 case LFR_MODE_SBM2:
860 if ( (lfrMode == LFR_MODE_STANDBY) | (lfrMode == LFR_MODE_NORMAL)
861 | (lfrMode == LFR_MODE_BURST) | (lfrMode == LFR_MODE_SBM2) ) {
859 if ( lfrMode == LFR_MODE_SBM2 ) {
862 860 status = LFR_DEFAULT;
863 861 }
864 862 else {
@@ -964,15 +962,16 int enter_normal_mode( ccsdsTelecommandP
964 962 }
965 963
966 964 #ifdef GSA
967 LEON_Unmask_interrupt( IRQ_WF );
965 LEON_Clear_interrupt( IRQ_WF );
966 LEON_Unmask_interrupt( IRQ_WF );
968 967 #else
969 LEON_Clear_interrupt( IRQ_WAVEFORM_PICKER );
970 LEON_Unmask_interrupt( IRQ_WAVEFORM_PICKER );
971 waveform_picker_regs->burst_enable = 0x07;
972 waveform_picker_regs->addr_data_f1 = (int) wf_snap_f1;
973 waveform_picker_regs->status = 0x00;
968 LEON_Clear_interrupt( IRQ_WAVEFORM_PICKER );
969 LEON_Unmask_interrupt( IRQ_WAVEFORM_PICKER );
970 waveform_picker_regs->burst_enable = 0x07;
971 waveform_picker_regs->addr_data_f1 = (int) wf_snap_f1;
972 waveform_picker_regs->status = 0x00;
974 973 #endif
975 LEON_Unmask_interrupt( IRQ_SM );
974 LEON_Unmask_interrupt( IRQ_SM );
976 975
977 976 return status;
978 977 }
@@ -139,13 +139,15 rtems_isr waveforms_simulator_isr( rtems
139 139 //********
140 140 // STANDBY
141 141 case(LFR_MODE_STANDBY):
142 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_5 );
142 143 break;
143 144
144 145 //******
145 146 // NORMAL
146 147 case(LFR_MODE_NORMAL):
148 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_5 );
147 149 if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_NORMAL ) != RTEMS_SUCCESSFUL) {
148 PRINTF("ERR *** in waveforms_isr *** error sending event to WFRM\n")
150 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_5 );
149 151 }
150 152 break;
151 153
@@ -549,7 +551,9 void send_waveform_norm(Header_TM_LFR_SC
549 551 send_waveform_SWF( header, wf_snap_f2, SID_NORM_SWF_F2, spw_ioctl_send);
550 552 #ifdef GSA
551 553 // irq processed, reset the related register of the timer unit
552 gptimer_regs->timer[2].ctrl = gptimer_regs->timer[2].ctrl | 0x00000010;
554 gptimer_regs->timer[TIMER_WF_SIMULATOR].ctrl = gptimer_regs->timer[TIMER_WF_SIMULATOR].ctrl | 0x00000010;
555 // clear the interruption
556 LEON_Clear_interrupt(IRQ_WF);
553 557 #else
554 558 // irq processed, reset the related register of the waveform picker
555 559 if (lfrMode == LFR_MODE_SBM1) {
General Comments 0
You need to be logged in to leave comments. Login now