diff --git a/FSW-rtems/FSW-rtems.cbp b/FSW-rtems/FSW-rtems.cbp
--- a/FSW-rtems/FSW-rtems.cbp
+++ b/FSW-rtems/FSW-rtems.cbp
@@ -12,6 +12,7 @@
+
@@ -34,9 +35,14 @@
+
+
+
+
+
diff --git a/FSW-rtems/FSW-rtems.depend b/FSW-rtems/FSW-rtems.depend
--- a/FSW-rtems/FSW-rtems.depend
+++ b/FSW-rtems/FSW-rtems.depend
@@ -41,16 +41,18 @@ 1354190602 source:e:\missions\solo\dev_p
1354190601 e:\missions\solo\dev_ple\header\fsw-rtems-processing.h
-1358144203 source:/opt/DEV_PLE/src/FSW-rtems-processing.c
+1359358276 source:/opt/DEV_PLE/src/FSW-rtems-processing.c
-1358144202 /opt/DEV_PLE/header/FSW-rtems-processing.h
+1359358276 /opt/DEV_PLE/header/FSW-rtems-processing.h
+
+
-1358441917 source:/opt/DEV_PLE/src/FSW-rtems.c
+1359382800 source:/opt/DEV_PLE/src/FSW-rtems.c
@@ -60,20 +62,30 @@ 1358441917 source:/opt/DEV_PLE/src/FSW-r
-
+
+
-1358144203 /opt/DEV_PLE/src/FSW-config.c
+1358847387 /opt/DEV_PLE/src/FSW-config.c
-1358441070 source:/opt/DEV_PLE/src/TC_handler.c
+1359379052 source:/opt/DEV_PLE/src/TC_handler.c
+
-1358435124 /opt/DEV_PLE/header/TC_handler.h
+1359377846 /opt/DEV_PLE/header/TC_handler.h
+
-1358440633 /opt/DEV_PLE/header/ccsds_types.h
+1359372295 /opt/DEV_PLE/header/ccsds_types.h
+
+1359365823 source:/opt/DEV_PLE/src/FSW-config.c
+
+1359371402 /opt/DEV_PLE/header/FSW-config.h
+
+1358858576 /opt/DEV_PLE/header/grlibregs.h
+
diff --git a/FSW-rtems/FSW-rtems.layout b/FSW-rtems/FSW-rtems.layout
--- a/FSW-rtems/FSW-rtems.layout
+++ b/FSW-rtems/FSW-rtems.layout
@@ -1,22 +1,31 @@
-
-
+
+
+
+
+
+
+
+
-
-
+
+
-
-
+
+
+
+
+
-
+
-
-
+
+
-
-
+
+
diff --git a/header/FSW-rtems-processing.h b/header/FSW-rtems-processing.h
--- a/header/FSW-rtems-processing.h
+++ b/header/FSW-rtems-processing.h
@@ -1,13 +1,9 @@
#ifndef FSW_RTEMS_PROCESSING_H_INCLUDED
#define FSW_RTEMS_PROCESSING_H_INCLUDED
-#include
-
-#define ADDRESS_APB_SPECTRAL_MATRICES 0x80000700
-#define LPP_SPECTRAL_MATRIX_CTRL 0x80000700
-#define LPP_SPECTRAL_MATRIX_1 0x80000704
-#define LPP_SPECTRAL_MATRIX_2 0x80000708
-#define IRQ_SPECTRAL_MATRICES 12
+#include
+#include
+#include
#define NB_BINS_SPECTRAL_MATRIX 128
#define NB_VALUES_PER_SPECTRAL_MATRIX 25
@@ -16,12 +12,29 @@
#define SIZE_COMPRESSED_SPECTRAL_MATRIX_f1 13
#define SIZE_COMPRESSED_SPECTRAL_MATRIX_f2 12
#define TOTAL_SIZE_COMPRESSED_MATRIX_f0 NB_BINS_COMPRESSED_MATRIX_f0 * NB_VALUES_PER_SPECTRAL_MATRIX
-#define NB_AVERAGE_NORMAL_f0 96*4
-
-rtems_isr spectral_matrices_isr( rtems_vector_number vector );
+#define NB_AVERAGE_NORMAL_f0 96*4
+#define NB_SM_TO_RECEIVE_BEFORE_AVF0 8
+
+
+struct BP1_str{
+ volatile unsigned char PE[2];
+ volatile unsigned char PB[2];
+ volatile unsigned char V0;
+ volatile unsigned char V1;
+ volatile unsigned char V2_ELLIP_DOP;
+ volatile unsigned char SZ;
+ volatile unsigned char VPHI;
+};
+typedef struct BP1_str BP1_t;
+
+// ISR
+rtems_isr spectral_matrices_isr( rtems_vector_number vector );
+// RTEMS TASKS
rtems_task spw_bppr_task(rtems_task_argument argument);
rtems_task spw_avf0_task(rtems_task_argument argument);
-rtems_task spw_bpf0_task(rtems_task_argument argument);
+rtems_task spw_bpf0_task(rtems_task_argument argument);
+rtems_task spw_smiq_task(rtems_task_argument argument); // added to test the spectral matrix simulator
+//
rtems_task spw_bppr_task_rate_monotonic(rtems_task_argument argument);
void matrix_average(volatile int *spectral_matrix, float *averaged_spectral_matrix);
void matrix_compression(float *averaged_spectral_matrix, unsigned char fChannel, float *compressed_spectral_matrix);
diff --git a/header/TC_handler.h b/header/TC_handler.h
--- a/header/TC_handler.h
+++ b/header/TC_handler.h
@@ -1,22 +1,25 @@
#ifndef TC_HANDLER_H_INCLUDED
#define TC_HANDLER_H_INCLUDED
-
-#include
+
+#include
+#include
unsigned char currentTC_LEN_RCV[2]; // SHALL be equal to the current TC packet estimated packet length field
unsigned char currentTC_COMPUTED_CRC[2];
unsigned int currentTC_LEN_RCV_AsUnsignedInt;
unsigned int currentTM_length;
-ccsdsTelemetryPacket_t currentTM;
-ccsdsTelecommandPacket_t currentTC;
unsigned char currentTC_processedFlag;
unsigned int lookUpTableForCRC[256];
void InitLookUpTableForCRC();
void GetCRCAsTwoBytes(unsigned char* data, unsigned char* crcAsTwoBytes, unsigned int sizeOfData);
-unsigned char TM_checker(ccsdsTelecommandPacket_t * TMPacket);
-unsigned char TM_acceptance_generator(ccsdsTelecommandPacket_t * TCPacket, unsigned int code, ccsdsTelemetryPacket_t * TMPacket);
-unsigned char TM_not_implemented_generator(ccsdsTelecommandPacket_t * TCPacket, ccsdsTelemetryPacket_t * TMPacket);
+unsigned char acceptTM(ccsdsTelecommandPacket_t * TMPacket, unsigned int TC_LEN_RCV);
+
+unsigned char TM_build_header( enum TM_TYPE tm_type, unsigned int SID, unsigned int packetLength,
+ unsigned int coarseTime, unsigned int fineTime, TMHeader_t *TMHeader);
+unsigned char TM_build_data(ccsdsTelecommandPacket_t *TC, char* data, unsigned int SID, unsigned char *computed_CRC);
+unsigned int TC_checker(ccsdsTelecommandPacket_t *TC, unsigned int TC_LEN_RCV,
+ TMHeader_t *TM_Header, unsigned int *hlen, char *data);
#endif // TC_HANDLER_H_INCLUDED
diff --git a/header/ccsds_types.h b/header/ccsds_types.h
--- a/header/ccsds_types.h
+++ b/header/ccsds_types.h
@@ -9,6 +9,8 @@
#define CCSDS_PROCESS_ID 76
#define CCSDS_PACKET_CATEGORY 12
#define CCSDS_DESTINATION_ID 0x21
+#define CCSDS_PROTOCOLE_ID 0x02
+#define CCSDS_USER_APP 0x00
#define SIZE_TM_LFR_TC_EXE_NOT_IMPLEMENTED 24
#define SIZE_TM_LFR_TC_EXE_CORRUPTED 32
@@ -28,11 +30,51 @@
#define FAIL_DETECTED 40003
#define NOT_ALLOWED 40004
#define CORRUPTED 40005
-//
-#define CCSDS_ERR_SRC 8
-#define CCSDS_ERR_CAT 9
-
-struct ccsdsTelemetryPacket_str
+//
+#define SID_TC_RESET 3
+#define SID_TC_LOAD_COMM 20
+#define SID_TC_LOAD_NORM 21
+#define SID_TC_LOAD_BURST 24
+#define SID_TC_LOAD_SBM1 27
+#define SID_TC_LOAD_SBM2 28
+#define SID_TC_DUMP 30
+#define SID_TC_ENTER 40
+#define SID_TC_UPDT_INFO 50
+#define SID_TC_EN_CAL 60
+#define SID_TC_DIS_CAL 61
+#define SID_TC_UPDT_TIME 129
+
+#define SID_DEFAULT 0
+#define SID_EXE_INC 5
+#define SID_NOT_EXE 40000
+#define SID_NOT_IMP 40002
+#define SID_EXE_ERR 40003
+#define SID_EXE_CORR 40005
+
+#define SID_NORM_SWF_F0 3
+#define SID_NORM_SWF_F1 4
+#define SID_NORM_SWF_F2 5
+#define SID_NORM_CWF_F3 1
+
+#define TM_LEN_EXE 20 - CCSDS_TC_TM_PACKET_OFFSET
+#define TM_LEN_NOT_EXE 26 - CCSDS_TC_TM_PACKET_OFFSET
+#define TM_LEN_NOT_IMP 24 - CCSDS_TC_TM_PACKET_OFFSET
+#define TM_LEN_EXE_ERR 24 - CCSDS_TC_TM_PACKET_OFFSET
+#define TM_LEN_EXE_CORR 32 - CCSDS_TC_TM_PACKET_OFFSET
+#define TM_HEADER_LEN 16
+#define TM_LEN_SCI_NORM_SWF_340 340 * 12 + 6 + 10 - 1
+#define TM_LEN_SCI_NORM_SWF_8 8 * 12 + 6 + 10 - 1
+
+enum TM_TYPE{
+ TM_LFR_TC_EXE_OK,
+ TM_LFR_TC_EXE_ERR,
+ TM_LFR_HK,
+ TM_LFR_SCI,
+ TM_LFR_SCI_SBM,
+ TM_LFR_PAR_DUMP
+};
+
+struct TMHeader_str
{
volatile unsigned char targetLogicalAddress;
volatile unsigned char protocolIdentifier;
@@ -41,14 +83,27 @@ struct ccsdsTelemetryPacket_str
volatile unsigned char packetID[2];
volatile unsigned char packetSequenceControl[2];
volatile unsigned char packetLength[2];
+ volatile unsigned char dataFieldHeader[10];
+};
+typedef struct TMHeader_str TMHeader_t;
+
+struct ExtendedTMHeader_str
+{
+ volatile unsigned char targetLogicalAddress;
+ volatile unsigned char protocolIdentifier;
+ volatile unsigned char reserved;
+ volatile unsigned char userApplication;
+ volatile unsigned char packetID[2];
+ volatile unsigned char packetSequenceControl[2];
+ volatile unsigned char packetLength[2];
volatile unsigned char dataFieldHeader[10];
- volatile unsigned char data[CCSDS_TM_PKT_MAX_SIZE-16];
+ volatile unsigned char auxiliaryHeader[6];
};
-typedef struct ccsdsTelemetryPacket_str ccsdsTelemetryPacket_t;
+typedef struct ExtendedTMHeader_str ExtendedTMHeader_t;
struct ccsdsTelecommandPacket_str
{
- //unsigned char targetLogicalAddress;
+ //unsigned char targetLogicalAddress; // removed by the grspw module
volatile unsigned char protocolIdentifier;
volatile unsigned char reserved;
volatile unsigned char userApplication;
diff --git a/src/FSW-config.c b/src/FSW-config.c
--- a/src/FSW-config.c
+++ b/src/FSW-config.c
@@ -4,8 +4,8 @@
struct drvmgr_key grlib_grspw_0n1_res[] = {
{"txBdCnt", KEY_TYPE_INT, {(unsigned int)10}},
{"rxBdCnt", KEY_TYPE_INT, {(unsigned int)10}},
- {"txDataSize", KEY_TYPE_INT, {(unsigned int)48+4}},
- {"txHdrSize", KEY_TYPE_INT, {(unsigned int)10}},
+ {"txDataSize", KEY_TYPE_INT, {(unsigned int)4096}},
+ {"txHdrSize", KEY_TYPE_INT, {(unsigned int)20+6}}, // 6 is for the auxiliary header, when needed
{"rxPktSize", KEY_TYPE_INT, {(unsigned int)248+4}},
KEY_EMPTY
};
diff --git a/src/FSW-rtems-processing.c b/src/FSW-rtems-processing.c
--- a/src/FSW-rtems-processing.c
+++ b/src/FSW-rtems-processing.c
@@ -41,23 +41,39 @@ volatile int spectral_matrix_f0_g[TOTAL_
volatile int spectral_matrix_f0_h[TOTAL_SIZE_SPECTRAL_MATRIX];
float averaged_spectral_matrix_f0[TOTAL_SIZE_SPECTRAL_MATRIX];
float compressed_spectral_matrix_f0[TOTAL_SIZE_COMPRESSED_MATRIX_f0];
-unsigned char LFR_BP1_F0[NB_BINS_COMPRESSED_MATRIX_f0*9];
+unsigned char LFR_BP1_F0[NB_BINS_COMPRESSED_MATRIX_f0*9];
+
+BP1_t data_BP1[NB_BINS_COMPRESSED_MATRIX_f0];
extern rtems_id Task_id[]; /* array of task ids */
-
-struct spectral_matrices_regs_str{
- volatile int ctrl;
- volatile int address0;
- volatile int address1;
-};
-struct spectral_matrices_regs_str *spectral_matrices_regs;
+
+spectral_matrices_regs_t *spectral_matrices_regs;
// Interrupt Service Routine for spectral matrices processing
rtems_isr spectral_matrices_isr( rtems_vector_number vector )
{
- if (rtems_event_send( Task_id[4], RTEMS_EVENT_0 ) != RTEMS_SUCCESSFUL)
- printf("In spectral_matrices_isr *** Error sending event to BPPR\n");
-}
+ if (rtems_event_send( Task_id[4], RTEMS_EVENT_0 ) != RTEMS_SUCCESSFUL)
+ printf("In spectral_matrices_isr *** Error sending event to AVF0\n");
+}
+
+rtems_task spw_smiq_task(rtems_task_argument argument) // process the Spectral Matrices IRQ
+{
+ rtems_event_set event_out;
+ gptimer_regs_t *gptimer_regs;
+ gptimer_regs = (gptimer_regs_t *) REGS_ADDRESS_GPTIMER;
+ unsigned char nb_interrupt_f0 = 0;
+
+ 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-1) ){
+ if (rtems_event_send( Task_id[6], RTEMS_EVENT_0 ) != RTEMS_SUCCESSFUL)
+ printf("In spw_smiq_task *** Error sending event to AVF0\n");
+ nb_interrupt_f0 = 0;
+ }
+ gptimer_regs->timer2_ctrl = gptimer_regs->timer2_ctrl | 0x00000010;
+ }
+}
rtems_task spw_bppr_task(rtems_task_argument argument)
{
@@ -69,7 +85,7 @@ rtems_task spw_bppr_task(rtems_task_argu
while(1)
- spectral_matrices_regs = (struct spectral_matrices_regs_str *) ADDRESS_APB_SPECTRAL_MATRICES;
+ spectral_matrices_regs = (struct spectral_matrices_regs_str *) REGS_ADDRESS_SPECTRAL_MATRICES;
spectral_matrices_regs->address0 = (volatile int) spectral_matrix_f0_a;
spectral_matrices_regs->address1 = (volatile int) spectral_matrix_f0_b;
@@ -313,8 +329,57 @@ void BP2_set(float * compressed_spectral
}
}
+rtems_task spw_avf0_task(rtems_task_argument argument){
+ int i;
+ static int nb_average;
+ rtems_event_set event_out;
+ rtems_status_code status;
+
+ spectral_matrices_regs = (struct spectral_matrices_regs_str *) REGS_ADDRESS_SPECTRAL_MATRICES;
+ spectral_matrices_regs->address0 = (volatile int) spectral_matrix_f0_a;
+ spectral_matrices_regs->address1 = (volatile int) spectral_matrix_f0_b;
+
+ 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; ictrl = spectral_matrices_regs->ctrl & 0xfffffffe; // reset the appropriate bit in the register
+ nb_average = nb_average + NB_SM_TO_RECEIVE_BEFORE_AVF0;
+ if (nb_average == NB_AVERAGE_NORMAL_f0) {
+ nb_average = 0;
+ status = rtems_event_send( Task_id[7], RTEMS_EVENT_0 ); // sending an event to the task 7, BPF0
+ if (status != RTEMS_SUCCESSFUL) printf("IN TASK AVF0 *** Error sending RTEMS_EVENT_0, code %d\n", status);
+ }
+ }
+}
+
+rtems_task spw_bpf0_task(rtems_task_argument argument){
+ rtems_event_set event_out;
+
+ while(1){
+ rtems_event_receive(RTEMS_EVENT_0, RTEMS_WAIT, RTEMS_NO_TIMEOUT, &event_out); // wait for an RTEMS_EVENT0
+ matrix_compression(averaged_spectral_matrix_f0, 0, compressed_spectral_matrix_f0);
+ BP1_set(compressed_spectral_matrix_f0, NB_BINS_COMPRESSED_MATRIX_f0, LFR_BP1_F0);
+ //PRINTF("IN TASK BPF0 *** Matrix compressed, parameters calculated\n")
+ }
+}
+
+//*******
+// UNUSED
rtems_task spw_bppr_task_rate_monotonic(rtems_task_argument argument)
-{
+{/*
rtems_status_code status;
//static int nb_average_f1 = 0;
//static int nb_average_f2 = 0;
@@ -328,7 +393,7 @@ rtems_task spw_bppr_task_rate_monotonic(
//exit( 1 );
}
- spectral_matrices_regs = (struct spectral_matrices_regs_str *) ADDRESS_APB_SPECTRAL_MATRICES;
+ spectral_matrices_regs = (struct spectral_matrices_regs_str *) REGS_ADDRESS_SPECTRAL_MATRICES;
spectral_matrices_regs->address0 = (volatile int) spectral_matrix_f0_a;
spectral_matrices_regs->address1 = (volatile int) spectral_matrix_f0_b;
@@ -348,50 +413,11 @@ rtems_task spw_bppr_task_rate_monotonic(
printf( "rtems_rate_monotonic_delete failed with status of %d.\n", status );
//exit( 1 );
}
- status = rtems_task_delete( RTEMS_SELF ); /* should not return */
+ status = rtems_task_delete( RTEMS_SELF ); // should not return
printf( "rtems_task_delete returned with status of %d.\n", status );
- //exit( 1 );
-}
-
-rtems_task spw_avf0_task(rtems_task_argument argument){
- int i;
- static int nb_average;
- rtems_event_set event_out;
- rtems_status_code status;
-
- nb_average = 0;
+ //exit( 1 );*/
+}
+
+
+
- while(1){
- rtems_event_receive(RTEMS_EVENT_0, RTEMS_WAIT, RTEMS_NO_TIMEOUT, &event_out); // wait for an RTEMS_EVENT0
- for(i=0; ictrl = spectral_matrices_regs->ctrl & 0xfffffffe; // reset the appropriate bit in the register
- nb_average = nb_average + 8;
- if (nb_average == NB_AVERAGE_NORMAL_f0) {
- nb_average = 0;
- status = rtems_event_send( Task_id[7], RTEMS_EVENT_0 ); // sending an event to the task 7, BPF0
- if (status != RTEMS_SUCCESSFUL) printf("IN TASK AVF0 *** Error sending RTEMS_EVENT_0, code %d\n", status);
- }
- }
-}
-
-rtems_task spw_bpf0_task(rtems_task_argument argument){
- rtems_event_set event_out;
-
- while(1){
- rtems_event_receive(RTEMS_EVENT_0, RTEMS_WAIT, RTEMS_NO_TIMEOUT, &event_out); // wait for an RTEMS_EVENT0
- matrix_compression(averaged_spectral_matrix_f0, 0, compressed_spectral_matrix_f0);
- BP1_set(compressed_spectral_matrix_f0, NB_BINS_COMPRESSED_MATRIX_f0, LFR_BP1_F0);
- printf("IN TASK BPF0 *** Matrix compressed, parameters calculated\n");
- }
-}
-
-
diff --git a/src/FSW-rtems.c b/src/FSW-rtems.c
--- a/src/FSW-rtems.c
+++ b/src/FSW-rtems.c
@@ -2,17 +2,6 @@
// GPL reminder to be added
//*************************
-//#define PRINT_MESSAGES_ON_CONSOLE // enable or disable the printf instructions
-#ifdef PRINT_MESSAGES_ON_CONSOLE
-#define PRINTF(x) printf(x);
-#define PRINTF1(x,y) printf(x,y);
-#define PRINTF2(x,y,z) printf(x,y,z);
-#else
-#define PRINTF(x) ;
-#define PRINTF1(x,y) ;
-#define PRINTF2(x,y,z) ;
-#endif
-
#define OFFSET_COARSE_TIME 4+10-1 // -1 => the receiver suppresses the target logical address
#define OFFSET_FINE_TIME OFFSET_COARSE_TIME+4
#define TC_FIFO_SIZE 5
@@ -67,32 +56,33 @@
#include
#include
-#include
+//#include
#include
#include
+#include
#include
-#include
+#include
+#include
-char *errorCCSDSMsg[8] = { "ILLEGAL_APID 0",
- "WRONG_LEN_PACKET 1",
- "INCOR_CHECKSUM 2",
- "ILL_TYPE 3",
- "ILL_SUBTYPE 4",
- "WRONG_APP_DATA 5",
- "WRONG_CMD_CODE 6",
- "CCSDS_TM_VALID 7"
-};
+/*char *tmGeneratorMsg[2] = { "NOTHING_TO_DO",
+ "TM_GENERATED"
+};*/
-char *tmGeneratorMsg[2] = { "NOTHING_TO_DO",
- "TM_GENERATED"
-};
-
+// RTEMS TASKS
rtems_task Init( rtems_task_argument argument); /* forward declaration needed */
rtems_task spw_recv_task(rtems_task_argument argument);
-rtems_task spw_tcck_task(rtems_task_argument argument);
rtems_task spw_spiq_task(rtems_task_argument argument);
-rtems_task spw_stat_task(rtems_task_argument argument);
-int configure_spw_link();
+rtems_task spw_stat_task(rtems_task_argument argument);
+rtems_task spw_wfrm_task(rtems_task_argument argument);
+// ISR
+rtems_isr waveforms_isr( rtems_vector_number vector );
+
+int send_console_outputs_on_serial_port();
+int create_all_tasks();
+int start_all_tasks();
+int configure_spw_link();
+int configure_timer_for_sm_simulation();
+int configure_timer_for_wf_simulation();
extern int rtems_cpu_usage_report();
extern int rtems_cpu_usage_reset();
@@ -109,45 +99,224 @@ char *lstates[6] = {"Error-reset",
"Run"
};
-struct tc_fifo_str{
- struct tc_fifo_str *next;
- unsigned char *tc_pkt;
- unsigned int tc_pktlength;
- unsigned char ready;
-};
-struct tc_fifo_str tc_fifo[TC_FIFO_SIZE];
-struct tc_fifo_str *tc_being_processed;
-struct tc_fifo_str *tc_pending_reception;
-
-struct apbuart_regs_str{
- volatile unsigned int data;
- volatile unsigned int status;
- volatile unsigned int ctrl;
- volatile unsigned int scaler;
- volatile unsigned int fifoDebug;
-};
-
int fdSPW;
int fdUART;
rtems_id Task_id[10]; /* array of task ids */
-rtems_name Task_name[10]; /* array of task names */
-rtems_name sem_tc_fifo_name;
-rtems_id sem_tc_fifo_id;
+rtems_name Task_name[10]; /* array of task names */
rtems_task Init( rtems_task_argument ignored ) {
rtems_status_code status;
- //struct apbuart_regs_str *apbuart_regs;
- rtems_isr_entry old_isr_handler;
+
+ send_console_outputs_on_serial_port();
+
+ create_all_tasks();
+ start_all_tasks();
+
+ configure_spw_link();
+ configure_timer_for_sm_simulation();
+ configure_timer_for_wf_simulation();
+
+ InitLookUpTableForCRC(); // in TC_handler.h
+
+ status = rtems_task_delete(RTEMS_SELF);
+}
+
+rtems_task spw_recv_task( rtems_task_argument unused ) {
+ rtems_status_code status;
+ int len = 0;
+ unsigned int i = 0;
+ unsigned int data_length = 0;
+ ccsdsTelecommandPacket_t currentTC;
+ spw_ioctl_pkt_send spw_ioctl_send;
+ TMHeader_t TM_header;
+ char data[100];
+
+ for(i=0; i<100; i++) data[i] = 0;
+
+ PRINTF("In RECV *** \n")
+
+ while(1){
+ len = read(fdSPW, (char*) ¤tTC, CCSDS_TC_PKT_MAX_SIZE); // the call to read is blocking
+ if (len == -1){ // error during the read call
+ PRINTF("In RECV *** last read call returned -1\n")
+ if (rtems_event_send( Task_id[3], SPW_LINKERR_EVENT ) != RTEMS_SUCCESSFUL)
+ PRINTF("IN RECV *** Error: rtems_event_send SPW_LINKERR_EVENT\n")
+ if (rtems_task_suspend(RTEMS_SELF) != RTEMS_SUCCESSFUL)
+ PRINTF("In RECV *** Error: rtems_task_suspend(RTEMS_SELF)\n")
+ }
+ else {
+ //PRINTF1("In RECV *** Got Message of length %d\n", len)
+ currentTC_LEN_RCV[0] = 0x00;
+ currentTC_LEN_RCV[1] = (unsigned char) len - CCSDS_TC_TM_PACKET_OFFSET - 3; // build the corresponding packet size field
+ currentTC_LEN_RCV_AsUnsignedInt = (unsigned int) len - CCSDS_TC_TM_PACKET_OFFSET - 3; // => -3 is for Prot ID, Reserved and User App bytes
+ // CHECK THE TC AND BUILD THE APPROPRIATE TM
+ data_length = TC_checker(¤tTC, currentTC_LEN_RCV_AsUnsignedInt,
+ &TM_header, &spw_ioctl_send.hlen, data);
+ spw_ioctl_send.hlen = TM_HEADER_LEN + 4; // + 4 is for the protocole extra header
+ spw_ioctl_send.hdr = (char*) &TM_header;
+ spw_ioctl_send.dlen = data_length;
+ spw_ioctl_send.data = data;
+ //printf("hlen %d, dlen %d\n", spw_ioctl_send.hlen, spw_ioctl_send.dlen);
+ // SEND PACKET
+ status = ioctl( fdSPW, SPACEWIRE_IOCTRL_SEND, &spw_ioctl_send );
+ if (status!=RTEMS_SUCCESSFUL) printf("In TC_checker *** Error SPACEWIRE_IOCTRL_SEND\n");
+ //PRINTF1("In TC_checker *** packet of size %d sent\n", spw_ioctl_send.sent)
+ }
+ }
+
+ close(fdSPW);
+}
+
+rtems_task spw_spiq_task(rtems_task_argument unused){
+ rtems_event_set event_out;
+ struct grspw_regs_str *grspw_regs;
+ grspw_regs = (struct grspw_regs_str *) ADDRESS_GRSPW_REGISTERS;
+
+ while(1){
+ PRINTF("In SPIQ *** Waiting for SPW_LINKERR_EVENT\n")
+ rtems_event_receive(SPW_LINKERR_EVENT, RTEMS_WAIT, RTEMS_NO_TIMEOUT, &event_out); // wait for an SPW_LINKERR_EVENT
+
+ if (rtems_task_suspend(Task_id[1])!=RTEMS_SUCCESSFUL) // suspend RECV task
+ PRINTF("In SPIQ *** Error suspending RECV Task\n")
+
+ configure_spw_link();
+ if (rtems_task_restart(Task_id[1], 1)!=RTEMS_SUCCESSFUL) // restart RECV task
+ PRINTF("In SPIQ *** Error resume RECV Task\n")
+ }
+}
+
+rtems_isr waveforms_isr( rtems_vector_number vector )
+{
+ if (rtems_event_send( Task_id[8], RTEMS_EVENT_0 ) != RTEMS_SUCCESSFUL)
+ printf("In spectral_matrices_isr *** Error sending event to WFRM\n");
+}
+
+rtems_task spw_wfrm_task(rtems_task_argument argument)
+{
+ unsigned int length;
+ unsigned int i = 0;
+ rtems_status_code status;
+ spw_ioctl_pkt_send spw_ioctl_send;
+ rtems_event_set event_out;
+ gptimer_regs_t *gptimer_regs;
+ gptimer_regs = (gptimer_regs_t *) REGS_ADDRESS_GPTIMER;
+ ExtendedTMHeader_t header;
+
+ header.targetLogicalAddress = CCSDS_DESTINATION_ID;
+ header.protocolIdentifier = CCSDS_PROTOCOLE_ID;
+ header.reserved = 0x00;
+ header.userApplication = CCSDS_USER_APP;
+ header.packetID[0] = 0x0c;
+ header.packetID[1] = 0xcc;
+ header.packetSequenceControl[0] = 0x00;
+ header.packetSequenceControl[1] = 0x00;
+ header.packetLength[0] = 0x00;
+ header.packetLength[1] = 0x00;
+ header.dataFieldHeader[0] = 0x10;
+ header.dataFieldHeader[1] = 0x15; // service type
+ header.dataFieldHeader[2] = 0x03; // service subtype
+ header.dataFieldHeader[3] = CCSDS_DESTINATION_ID;
+ header.dataFieldHeader[4] = 0xaa;
+ header.dataFieldHeader[5] = 0xbb;
+ header.dataFieldHeader[6] = 0xcc;
+ header.dataFieldHeader[7] = 0xdd;
+ header.dataFieldHeader[8] = 0xee;
+ header.dataFieldHeader[9] = 0xff;
+
+ header.auxiliaryHeader[0] = 0x00;
+ header.auxiliaryHeader[1] = 0x1f;
+ header.auxiliaryHeader[2] = 0x07; // PKT_CNT
+ header.auxiliaryHeader[3] = 0x00; // PKT_NR
+ header.auxiliaryHeader[4] = 0x00; // BLK_NR MSB
+ header.auxiliaryHeader[5] = 0x00; // BLK_NR LSB
+
+ // BUILD THE PACKET HEADER
+ spw_ioctl_send.hlen = TM_HEADER_LEN + 4 + 6; // + 4 is for the protocole extra header, + 6 is for the auxiliary header
+ spw_ioctl_send.hdr = (char*) &header;
+
+ while(1){
+ rtems_event_receive(RTEMS_EVENT_0, RTEMS_WAIT, RTEMS_NO_TIMEOUT, &event_out); // wait for an RTEMS_EVENT0
+ for (i=0; i<7; i++) // send F0
+ {
+ // BUILD THE DATA
+ if (i==6) {
+ spw_ioctl_send.dlen = 8 * NB_BYTES_SWF_BLK;
+ length = TM_LEN_SCI_NORM_SWF_340;
+ }
+ else {
+ spw_ioctl_send.dlen = 340 * NB_BYTES_SWF_BLK;
+ length = TM_LEN_SCI_NORM_SWF_8;
+ }
+ spw_ioctl_send.data = (char*) &waveform_snapshot_f0[i * 340 * NB_BYTES_SWF_BLK];
+ // BUILD THE HEADER
+ header.packetLength[0] = (unsigned char) (length>>8);
+ header.packetLength[1] = (unsigned char) (length);
+ header.auxiliaryHeader[0] = SID_NORM_SWF_F0; // SID
+ // SEND PACKET
+ status = ioctl( fdSPW, SPACEWIRE_IOCTRL_SEND, &spw_ioctl_send );
+ if (status!=RTEMS_SUCCESSFUL) printf("In WFRM *** Error SPACEWIRE_IOCTRL_SEND\n");
+ //sched_yield();
+ }
+ for (i=0; i<7; i++) // send F1
+ {
+ // BUILD THE DATA
+ if (i==6) {
+ spw_ioctl_send.dlen = 8 * NB_BYTES_SWF_BLK;
+ length = TM_LEN_SCI_NORM_SWF_340;
+ }
+ else {
+ spw_ioctl_send.dlen = 340 * NB_BYTES_SWF_BLK;
+ length = TM_LEN_SCI_NORM_SWF_8;
+ }
+ spw_ioctl_send.data = (char*) &waveform_snapshot_f1[i * 340 * NB_BYTES_SWF_BLK];
+ // BUILD THE HEADER
+ header.packetLength[0] = (unsigned char) (length>>8);
+ header.packetLength[1] = (unsigned char) (length);
+ header.auxiliaryHeader[0] = SID_NORM_SWF_F1; // SID
+ // SEND PACKET
+ status = ioctl( fdSPW, SPACEWIRE_IOCTRL_SEND, &spw_ioctl_send );
+ if (status!=RTEMS_SUCCESSFUL) printf("In WFRM *** Error SPACEWIRE_IOCTRL_SEND\n");
+ //sched_yield();
+ }
+ for (i=0; i<7; i++) // send F0
+ {
+ // BUILD THE DATA
+ if (i==6) {
+ spw_ioctl_send.dlen = 8 * NB_BYTES_SWF_BLK;
+ length = TM_LEN_SCI_NORM_SWF_340;
+ }
+ else {
+ spw_ioctl_send.dlen = 340 * NB_BYTES_SWF_BLK;
+ length = TM_LEN_SCI_NORM_SWF_8;
+ }
+ spw_ioctl_send.data = (char*) &waveform_snapshot_f2[i * 340 * NB_BYTES_SWF_BLK];
+ // BUILD THE HEADER
+ header.packetLength[0] = (unsigned char) (length>>8);
+ header.packetLength[1] = (unsigned char) (length);
+ header.auxiliaryHeader[0] = SID_NORM_SWF_F2; // SID
+ // SEND PACKET
+ status = ioctl( fdSPW, SPACEWIRE_IOCTRL_SEND, &spw_ioctl_send );
+ if (status!=RTEMS_SUCCESSFUL) printf("In WFRM *** Error SPACEWIRE_IOCTRL_SEND\n");
+ //sched_yield();
+ }
+ // irq processed, reset the related register of the timer unit
+ gptimer_regs->timer3_ctrl = gptimer_regs->timer3_ctrl | 0x00000010;
+ }
+}
+
+int create_all_tasks()
+{
+ rtems_status_code status;
+
Task_name[1] = rtems_build_name( 'R', 'E', 'C', 'V' );
- Task_name[2] = rtems_build_name( 'T', 'C', 'C', 'K' );
- Task_name[3] = rtems_build_name( 'S', 'P', 'I', 'Q' );
- Task_name[4] = rtems_build_name( 'B', 'P', 'P', 'R' );
+ Task_name[3] = rtems_build_name( 'S', 'P', 'I', 'Q' );
+ Task_name[4] = rtems_build_name( 'S', 'M', 'I', 'Q' );
Task_name[5] = rtems_build_name( 'S', 'T', 'A', 'T' );
Task_name[6] = rtems_build_name( 'A', 'V', 'F', '0' );
- Task_name[7] = rtems_build_name( 'B', 'P', 'F', '0' );
- sem_tc_fifo_name = rtems_build_name( 'S', 'E', 'M', '0' );
+ Task_name[7] = rtems_build_name( 'B', 'P', 'F', '0' );
+ Task_name[8] = rtems_build_name( 'W', 'F', 'R', 'M' );
// RECV
status = rtems_task_create(
@@ -155,19 +324,13 @@ rtems_task Init( rtems_task_argument ign
RTEMS_DEFAULT_MODES,
RTEMS_DEFAULT_ATTRIBUTES, &Task_id[1]
);
- // TCCK
- status = rtems_task_create(
- Task_name[2], 200, RTEMS_MINIMUM_STACK_SIZE * 2,
- RTEMS_DEFAULT_MODES,
- RTEMS_DEFAULT_ATTRIBUTES, &Task_id[2]
- );
// SPIQ
status = rtems_task_create(
Task_name[3], 50, RTEMS_MINIMUM_STACK_SIZE * 2,
RTEMS_DEFAULT_MODES,
RTEMS_DEFAULT_ATTRIBUTES, &Task_id[3]
);
- // BPPR
+ // SMIQ
status = rtems_task_create(
Task_name[4], 10, RTEMS_MINIMUM_STACK_SIZE * 2,
RTEMS_DEFAULT_MODES | RTEMS_NO_PREEMPT,
@@ -190,42 +353,30 @@ rtems_task Init( rtems_task_argument ign
Task_name[7], 50, RTEMS_MINIMUM_STACK_SIZE * 2,
RTEMS_DEFAULT_MODES,
RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT, &Task_id[7]
- );
-
- status = rtems_semaphore_create(
- sem_tc_fifo_name,
- 1,
- RTEMS_BINARY_SEMAPHORE,
- 1,
- &sem_tc_fifo_id
- );
-
- //********************************************
- // Send the console outputs on the serial port
- //apbuart_regs = (struct apbuart_regs_str *) ADDRESS_APBUART_REGISTERS;
- //apbuart_regs->ctrl = apbuart_regs->ctrl & APBUART_CTRL_REG_MASK_DB;
- //PRINTF("\n\n\n\n\nIn INIT *** Now the console is on port COM1\n")
- //
- //********************************************
-
- configure_spw_link();
-
- status = rtems_interrupt_catch( spectral_matrices_isr, 0x1c, &old_isr_handler) ; // 0x1c comes from sparcv8.pdf p.76
- if (status==RTEMS_SUCCESSFUL) PRINTF("In INIT *** rtems_interrupt_catch successfullly configured\n")
-
- LEON_Unmask_interrupt( IRQ_SPECTRAL_MATRICES );
-
- status = rtems_task_start( Task_id[2], spw_tcck_task, 1 );
- if (status!=RTEMS_SUCCESSFUL) PRINTF("In INIT *** Error starting TASK_TCCK\n")
-
+ );
+ // WFRM
+ status = rtems_task_create(
+ Task_name[8], 100, RTEMS_MINIMUM_STACK_SIZE * 2,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT, &Task_id[8]
+ );
+
+ return 0;
+}
+
+int start_all_tasks()
+{
+ rtems_status_code status;
+
status = rtems_task_start( Task_id[3], spw_spiq_task, 1 );
if (status!=RTEMS_SUCCESSFUL) PRINTF("In INIT *** Error starting TASK_SPIQ\n")
status = rtems_task_start( Task_id[1], spw_recv_task, 1 );
if (status!=RTEMS_SUCCESSFUL) PRINTF("In INIT *** Error starting TASK_RECV\n")
- //status = rtems_task_start( Task_id[4], spw_bppr_task_rate_monotonic, 1 );
- //if (status!=RTEMS_SUCCESSFUL) PRINTF("In INIT *** Error starting TASK_BPPR\n")
+ //status = rtems_task_start( Task_id[4], spw_bppr_task_rate_monotonic, 1 );
+ status = rtems_task_start( Task_id[4], spw_smiq_task, 1 );
+ if (status!=RTEMS_SUCCESSFUL) PRINTF("In INIT *** Error starting TASK_BPPR\n")
status = rtems_task_start( Task_id[5], spw_stat_task, 1 );
if (status!=RTEMS_SUCCESSFUL) PRINTF("In INIT *** Error starting TASK_STAT\n")
@@ -234,171 +385,25 @@ rtems_task Init( rtems_task_argument ign
if (status!=RTEMS_SUCCESSFUL) PRINTF("In INIT *** Error starting TASK_AVF0\n")
status = rtems_task_start( Task_id[7], spw_bpf0_task, 1 );
- if (status!=RTEMS_SUCCESSFUL) PRINTF("In INIT *** Error starting TASK_BPF0\n")
+ if (status!=RTEMS_SUCCESSFUL) PRINTF("In INIT *** Error starting TASK_BPF0\n")
- InitLookUpTableForCRC(); // in TC_handler.h
-
- status = rtems_task_delete(RTEMS_SELF);
-}
+ status = rtems_task_start( Task_id[8], spw_wfrm_task, 1 );
+ if (status!=RTEMS_SUCCESSFUL) PRINTF("In INIT *** Error starting TASK_WFRM\n")
-rtems_task spw_recv_task_old( rtems_task_argument unused ) {
- rtems_status_code status;
- int len = 0;
- unsigned int i;
-
- PRINTF("In RECV *** \n")
-
- status = rtems_semaphore_obtain( sem_tc_fifo_id, RTEMS_WAIT, RTEMS_NO_TIMEOUT );
- if (status!=RTEMS_SUCCESSFUL) PRINTF("In RECV *** Error: rtems_semaphore_obtain\n")
- for (i = 0; iready == 0){
- PRINTF("In RECV *** Just before read\n")
- len = read(fdSPW, tc_pending_reception->tc_pkt, CCSDS_TC_PKT_MAX_SIZE); // the call to read is blocking
- PRINTF("In RECV *** Just after read\n")
- if (len == -1) { // error during the read call
- PRINTF("In RECV *** last read call returned -1\n")
- if (rtems_event_send( Task_id[3], SPW_LINKERR_EVENT ) != RTEMS_SUCCESSFUL)
- PRINTF("IN RECV *** Error: rtems_event_send SPW_LINKERR_EVENT\n")
- if (rtems_task_suspend(RTEMS_SELF) != RTEMS_SUCCESSFUL)
- PRINTF("In RECV *** Error: rtems_task_suspend(RTEMS_SELF)\n")
- }
- else {
- tc_pending_reception->tc_pktlength = len;
- tc_pending_reception->ready = 1;
- PRINTF1("In RECV *** Got Message of length %d\n",tc_pending_reception->tc_pktlength)
- status = rtems_event_send( Task_id[2], RTEMS_EVENT_0 ); // sending an event to the task TCCK
- if (status == RTEMS_INVALID_ID) PRINTF("IN TASK RECV *** invalid task id when sending RTEMS_EVENT_0\n")
- tc_pending_reception = tc_pending_reception->next;
- sched_yield();
- }
- }
- else {
- status = rtems_event_send( Task_id[2], RTEMS_EVENT_0 ); // sending an event to the task TCCK
- if (status == RTEMS_INVALID_ID) PRINTF("IN TASK RECV *** invalid task id when sending RTEMS_EVENT_0\n")
- sched_yield(); // if not executed, the system blocks when the packets arrive faster than the processing
- // this call gives back the hand to the scheduler and allows TCCK to process the TC packets
- }
- }
-
- close(fdSPW);
+ return 0;
}
-
-rtems_task spw_recv_task( rtems_task_argument unused ) {
- rtems_status_code status;
- int len = 0;
-
- PRINTF("In RECV BIS *** \n")
- currentTC_processedFlag = 1; // reset the flag
+int send_console_outputs_on_serial_port() // Send the console outputs on the serial port
+{
+ struct apbuart_regs_str *apbuart_regs;
- while(1){
- while(currentTC_processedFlag == 0) sched_yield();
- len = read(fdSPW, (char*) ¤tTC, CCSDS_TC_PKT_MAX_SIZE); // the call to read is blocking
- if (len == -1){ // error during the read call
- PRINTF("In RECV *** last read call returned -1\n")
- if (rtems_event_send( Task_id[3], SPW_LINKERR_EVENT ) != RTEMS_SUCCESSFUL)
- PRINTF("IN RECV *** Error: rtems_event_send SPW_LINKERR_EVENT\n")
- if (rtems_task_suspend(RTEMS_SELF) != RTEMS_SUCCESSFUL)
- PRINTF("In RECV *** Error: rtems_task_suspend(RTEMS_SELF)\n")
- }
- else {
- currentTC_processedFlag = 0;
- PRINTF1("In RECV *** Got Message of length %d\n", len)
- currentTC_LEN_RCV[0] = 0x00;
- currentTC_LEN_RCV[1] = (unsigned char) len - CCSDS_TC_TM_PACKET_OFFSET - 3; // build the corresponding packet size field
- currentTC_LEN_RCV_AsUnsignedInt = (unsigned int) len - CCSDS_TC_TM_PACKET_OFFSET - 3; // => -3 is for Prot ID, Reserved and User App bytes
- status = rtems_event_send( Task_id[2], RTEMS_EVENT_0 ); // sending an event to the task TCCK
- if (status == RTEMS_INVALID_ID) PRINTF("IN TASK RECV *** invalid task id when sending RTEMS_EVENT_0\n")
- }
- }
-
- close(fdSPW);
-}
-
-rtems_task spw_tcck_task( rtems_task_argument unused ) {
- rtems_status_code status;
- rtems_event_set event_out;
- unsigned char result;
- unsigned int code;
-
- PRINTF("In TCCK ***\n")
- while(1){
- status = rtems_event_receive(RTEMS_EVENT_0, RTEMS_WAIT, RTEMS_NO_TIMEOUT, &event_out); // wait for an event to process a TC packet
- if (status == RTEMS_SUCCESSFUL)
- {
- GetCRCAsTwoBytes((unsigned char*)currentTC.packetID, currentTC_COMPUTED_CRC, currentTC_LEN_RCV_AsUnsignedInt + 5);
- code = TM_checker(¤tTC);
- PRINTF1(" %s\n", errorCCSDSMsg[code])
- if (code == 7){ // if the TC is valid, the TM_LFR_TC_EXE_NOT_IMPLEMENTED packet is sent
- result = TM_not_implemented_generator(¤tTC, ¤tTM);
- PRINTF1(" %s\n", tmGeneratorMsg[result])
- result = write( fdSPW, (char*)¤tTM, currentTM_length );
- if (result==-1) printf("IN TCCK *** error sending TM of size: %d\n", currentTM_length);
- }
- else{ // if the TC is not valid, the TM_LFR_TC_EXE_CORRUPTED is sent
- result = TM_acceptance_generator(¤tTC, code, ¤tTM);
- PRINTF1(" %s\n", tmGeneratorMsg[result])
- result = write( fdSPW, (char*)¤tTM, currentTM_length );
- if (result==-1) printf("IN TCCK *** error sending TM of size: %d\n", currentTM_length);
- }
+ apbuart_regs = (struct apbuart_regs_str *) ADDRESS_APBUART_REGISTERS;
+ apbuart_regs->ctrl = apbuart_regs->ctrl & APBUART_CTRL_REG_MASK_DB;
+ PRINTF("\n\n\n\n\nIn INIT *** Now the console is on port COM1\n")
- currentTC_processedFlag = 1;
- }
- }
-}
-
-rtems_task spw_spiq_task(rtems_task_argument unused){
- rtems_event_set event_out;
- struct grspw_regs_str *grspw_regs;
- grspw_regs = (struct grspw_regs_str *) ADDRESS_GRSPW_REGISTERS;
-
- while(1){
- PRINTF("In SPIQ *** Waiting for SPW_LINKERR_EVENT\n")
- rtems_event_receive(SPW_LINKERR_EVENT, RTEMS_WAIT, RTEMS_NO_TIMEOUT, &event_out); // wait for an SPW_LINKERR_EVENT
-
- if (rtems_task_suspend(Task_id[1])!=RTEMS_SUCCESSFUL) // suspend RECV task
- PRINTF("In SPIQ *** Error suspending RECV Task\n")
-
- configure_spw_link();
-
- if (rtems_task_restart(Task_id[1], 1)!=RTEMS_SUCCESSFUL) // restart RECV task
- PRINTF("In SPIQ *** Error resume RECV Task\n")
- }
-}
-
-char *link_status(int status){
- return lstates[status];
+ return 0;
}
-void print_statistics(spw_stats *stats)
-{
- //printf(" ******** STATISTICS ******** \n");
- printf("Transmit link errors: %i\n", stats->tx_link_err);
- printf("Receiver RMAP header CRC errors: %i\n", stats->rx_rmap_header_crc_err);
- printf("Receiver RMAP data CRC errors: %i\n", stats->rx_rmap_data_crc_err);
- printf("Receiver EEP errors: %i\n", stats->rx_eep_err);
- printf("Receiver truncation errors: %i\n", stats->rx_truncated);
- printf("Parity errors: %i\n", stats->parity_err);
- printf("Escape errors: %i\n", stats->escape_err);
- printf("Credit errors: %i\n", stats->credit_err);
- printf("Disconnect errors: %i\n", stats->disconnect_err);
- printf("Write synchronization errors: %i\n", stats->write_sync_err);
- printf("Early EOP/EEP: %i\n", stats->early_ep);
- printf("Invalid Node Address: %i\n", stats->invalid_address);
- printf("Packets transmitted: %i\n", stats->packets_sent);
- printf("Packets received: %i\n", stats->packets_received);
-}
-
int configure_spw_link()
{
rtems_status_code status;
@@ -431,14 +436,59 @@ int configure_spw_link()
//
status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_LINK_ERR_IRQ, 1); // sets the link-error interrupt bit
if (status!=RTEMS_SUCCESSFUL) PRINTF("In RECV *** Error SPACEWIRE_IOCTRL_SET_LINK_ERR_IRQ\n")
+
+ status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_TXBLOCK_ON_FULL, 1); // sets the link-error interrupt bit
+ if (status!=RTEMS_SUCCESSFUL) PRINTF("In RECV *** Error SPACEWIRE_IOCTRL_SET_LINK_ERR_IRQ\n")
//
- //status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_DESTKEY, CCSDS_DESTINATION_ID); // sets the destinatino key
+ //status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_DESTKEY, CCSDS_DESTINATION_ID); // sets the destination key
//if (status!=RTEMS_SUCCESSFUL) PRINTF("In RECV *** Error SPACEWIRE_IOCTRL_SET_LINK_ERR_IRQ\n")
//
PRINTF("In configure_spw_link *** "GRSPW_DEVICE_NAME" configured successfully\n")
return RTEMS_SUCCESSFUL;
}
+
+int configure_timer_for_sm_simulation() // configure the timer for the spectral matrices simulation
+{
+ rtems_status_code status;
+ rtems_isr_entry old_isr_handler;
+
+ status = rtems_interrupt_catch( spectral_matrices_isr, 0x19, &old_isr_handler) ; // 0x19 comes from sparcv8.pdf p.76 <=> interrupt_level_9
+ if (status==RTEMS_SUCCESSFUL) PRINTF("In configure_timer_for_sm_simulation *** rtems_interrupt_catch successfullly configured\n")
+
+ gptimer_regs_t *gptimer_regs;
+ gptimer_regs = (gptimer_regs_t *) REGS_ADDRESS_GPTIMER;
+ gptimer_regs->timer2_reload = 9999; // 10ms timer, base clock frequency is 1 MHz
+ gptimer_regs->timer2_ctrl = gptimer_regs->timer2_ctrl | 0x00000004; // LD load value from the reload register
+ gptimer_regs->timer2_ctrl = gptimer_regs->timer2_ctrl | 0x00000001; // EN enable the timer
+ gptimer_regs->timer2_ctrl = gptimer_regs->timer2_ctrl | 0x00000002; // RS restart
+ gptimer_regs->timer2_ctrl = gptimer_regs->timer2_ctrl | 0x00000008; // IE interrupt enable
+
+ LEON_Unmask_interrupt( IRQ_SPECTRAL_MATRICES );
+
+ return 1;
+}
+
+int configure_timer_for_wf_simulation() // configure the timer for the spectral matrices simulation
+{
+ rtems_status_code status;
+ rtems_isr_entry old_isr_handler;
+
+ status = rtems_interrupt_catch( waveforms_isr, 0x1a, &old_isr_handler) ; // 0x19 comes from sparcv8.pdf p.76 <=> interrupt_level_10
+ if (status==RTEMS_SUCCESSFUL) PRINTF("In configure_timer_for_wf_simulation *** rtems_interrupt_catch successfullly configured\n")
+
+ gptimer_regs_t *gptimer_regs;
+ gptimer_regs = (gptimer_regs_t *) REGS_ADDRESS_GPTIMER;
+ gptimer_regs->timer3_reload = 7999999; // 1s timer, base clock frequency is 1 MHz
+ gptimer_regs->timer3_ctrl = gptimer_regs->timer3_ctrl | 0x00000004; // LD load value from the reload register
+ gptimer_regs->timer3_ctrl = gptimer_regs->timer3_ctrl | 0x00000001; // EN enable the timer
+ gptimer_regs->timer3_ctrl = gptimer_regs->timer3_ctrl | 0x00000002; // RS restart
+ gptimer_regs->timer3_ctrl = gptimer_regs->timer3_ctrl | 0x00000008; // IE interrupt enable
+
+ LEON_Unmask_interrupt( IRQ_WAVEFORMS );
+
+ return 1;
+}
rtems_task spw_stat_task(rtems_task_argument argument){
int i;
@@ -456,5 +506,30 @@ rtems_task spw_stat_task(rtems_task_argu
}
}
+char *link_status(int status){
+ return lstates[status];
+}
+void print_statistics(spw_stats *stats)
+{
+ //printf(" ******** STATISTICS ******** \n");
+ printf("Transmit link errors: %i\n", stats->tx_link_err);
+ printf("Receiver RMAP header CRC errors: %i\n", stats->rx_rmap_header_crc_err);
+ printf("Receiver RMAP data CRC errors: %i\n", stats->rx_rmap_data_crc_err);
+ printf("Receiver EEP errors: %i\n", stats->rx_eep_err);
+ printf("Receiver truncation errors: %i\n", stats->rx_truncated);
+ printf("Parity errors: %i\n", stats->parity_err);
+ printf("Escape errors: %i\n", stats->escape_err);
+ printf("Credit errors: %i\n", stats->credit_err);
+ printf("Disconnect errors: %i\n", stats->disconnect_err);
+ printf("Write synchronization errors: %i\n", stats->write_sync_err);
+ printf("Early EOP/EEP: %i\n", stats->early_ep);
+ printf("Invalid Node Address: %i\n", stats->invalid_address);
+ printf("Packets transmitted: %i\n", stats->packets_sent);
+ printf("Packets received: %i\n", stats->packets_received);
+}
+
+
+
+
diff --git a/src/TC_handler.c b/src/TC_handler.c
--- a/src/TC_handler.c
+++ b/src/TC_handler.c
@@ -1,4 +1,15 @@
-#include
+#include
+#include
+
+char *errorCCSDSMsg[8] = { "ILLEGAL_APID 0",
+ "WRONG_LEN_PACKET 1",
+ "INCOR_CHECKSUM 2",
+ "ILL_TYPE 3",
+ "ILL_SUBTYPE 4",
+ "WRONG_APP_DATA 5",
+ "WRONG_CMD_CODE 6",
+ "CCSDS_TM_VALID 7"
+};
unsigned int Crc_opt( unsigned char D, unsigned int Chk)
{
@@ -23,7 +34,8 @@ void InitLookUpTableForCRC()
}
}
-void GetCRCAsTwoBytes(unsigned char* data, unsigned char* crcAsTwoBytes, unsigned int sizeOfData){
+void GetCRCAsTwoBytes(unsigned char* data, unsigned char* crcAsTwoBytes, unsigned int sizeOfData)
+{
unsigned int Chk;
int j;
Chk = 0xffff; // reset the syndrom to all ones
@@ -34,7 +46,46 @@ void GetCRCAsTwoBytes(unsigned char* dat
crcAsTwoBytes[1] = (unsigned char) (Chk & 0x00ff);
}
-unsigned char TM_checker(ccsdsTelecommandPacket_t * TMPacket)
+unsigned int TC_checker(ccsdsTelecommandPacket_t *TC, unsigned int TC_LEN_RCV,
+ TMHeader_t *TM_Header, unsigned int *hlen, char *data)
+{
+ unsigned int code = 0;
+ unsigned int data_length = 0;
+ unsigned char computed_CRC[2];
+ unsigned char subtype = 0;
+
+ subtype = TC->dataFieldHeader[2];
+ GetCRCAsTwoBytes( (unsigned char*) TC->packetID, computed_CRC, TC_LEN_RCV + 5 );
+ code = acceptTM( TC, TC_LEN_RCV ) ;
+ //PRINTF1("in TC_checker *** %s\n", errorCCSDSMsg[code]);
+ if ( (code == 0) | (code == 1) | (code == 2)
+ | (code == 3) | (code == 4) | (code == 5) )
+ { // generate TM_LFR_TC_EXE_CORRUPTED
+ // BUILD HEADER
+ TM_build_header( TM_LFR_TC_EXE_ERR, SID_EXE_CORR, TM_LEN_EXE_CORR, 0, 0, TM_Header);
+ // BUILD DATA
+ TM_build_data( TC, data, SID_EXE_CORR, computed_CRC);
+ data_length = TM_LEN_EXE_CORR + CCSDS_TC_TM_PACKET_OFFSET - TM_HEADER_LEN;
+ }
+ if (subtype == SID_TC_UPDT_TIME){
+ // BUILD HEADER
+ TM_build_header( TM_LFR_TC_EXE_OK, SID_DEFAULT, TM_LEN_EXE, 0, 0, TM_Header);
+ // BUILD DATA
+ TM_build_data( TC, data, SID_DEFAULT, computed_CRC);
+ data_length = TM_LEN_NOT_IMP + CCSDS_TC_TM_PACKET_OFFSET - TM_HEADER_LEN;
+ }
+ else { // TM_LFR_TC_EXE_NOT_IMPLEMENTED
+ // BUILD HEADER
+ TM_build_header( TM_LFR_TC_EXE_ERR, SID_NOT_IMP, TM_LEN_NOT_IMP, 0, 0, TM_Header);
+ // BUILD DATA
+ TM_build_data( TC, data, SID_NOT_IMP, computed_CRC);
+ data_length = TM_LEN_NOT_IMP + CCSDS_TC_TM_PACKET_OFFSET - TM_HEADER_LEN;
+ }
+
+ return data_length;
+}
+
+unsigned char acceptTM(ccsdsTelecommandPacket_t * TMPacket, unsigned int TC_LEN_RCV)
{
unsigned char pid = 0;
unsigned char category = 0;
@@ -51,7 +102,7 @@ unsigned char TM_checker(ccsdsTelecomman
// packet length check
length = TMPacket->packetLength[0] * 256 + TMPacket->packetLength[1];
- if (length != (currentTC_LEN_RCV[0] * 256 + currentTC_LEN_RCV[1]) ) return WRONG_LEN_PACKET; // LEN RCV != SIZE FIELD
+ if (length != TC_LEN_RCV ) return WRONG_LEN_PACKET; // LEN RCV != SIZE FIELD
if (length >= CCSDS_TC_PKT_MAX_SIZE) return WRONG_LEN_PACKET; // check that the packet does not exceed the MAX size
packetType = TMPacket->dataFieldHeader[1];
@@ -112,96 +163,114 @@ unsigned char TM_checker(ccsdsTelecomman
if (currentTC_COMPUTED_CRC[1] != CCSDSContent[length + CCSDS_TC_TM_PACKET_OFFSET -1]) return INCOR_CHECKSUM;
return CCSDS_TM_VALID;
-}
+}
-unsigned char TM_acceptance_generator(ccsdsTelecommandPacket_t * TCPacket, unsigned int code, ccsdsTelemetryPacket_t * TMPacket)
+unsigned char TM_build_header( enum TM_TYPE tm_type, unsigned int SID, unsigned int packetLength,
+ unsigned int coarseTime, unsigned int fineTime, TMHeader_t *TMHeader)
{
- unsigned int packetLength = 0;
- packetLength = TMPacket->packetLength[0] * 256 + TMPacket->packetLength[1];
- if ( (code == 0) | (code == 1) | (code == 2)
- | (code == 3) | (code == 4) | (code == 5) )
- { // generated TM_LFR_TC_EXE_CORRUPTED
- TMPacket->targetLogicalAddress = CCSDS_DESTINATION_ID;
- TMPacket->protocolIdentifier = 0x02;
- TMPacket->reserved = 0x00;
- TMPacket->userApplication = 0x00;
- //
- TMPacket->packetID[0] = 0x0c;
- TMPacket->packetID[1] = 0xc1;
- TMPacket->packetSequenceControl[0] = 0xc0;
- TMPacket->packetSequenceControl[1] = 0x00;
- TMPacket->packetLength[0] = 0x00;
- TMPacket->packetLength[1] = SIZE_TM_LFR_TC_EXE_CORRUPTED-CCSDS_TC_TM_PACKET_OFFSET;
- //
- TMPacket->dataFieldHeader[0] = 0x10;
- TMPacket->dataFieldHeader[1] = 0x01; // service type
- TMPacket->dataFieldHeader[2] = 0x08; // service subtype
- TMPacket->dataFieldHeader[3] = CCSDS_DESTINATION_ID;
- TMPacket->dataFieldHeader[4] = 0x00; // time
- TMPacket->dataFieldHeader[5] = 0x00; // time
- TMPacket->dataFieldHeader[6] = 0x00; // time
- TMPacket->dataFieldHeader[7] = 0x00; // time
- TMPacket->dataFieldHeader[8] = 0x00; // time
- TMPacket->dataFieldHeader[9] = 0x00; // time
- //
- TMPacket->data[0] = 0x9c; // failure code
- TMPacket->data[1] = 0x45; // failure code
- TMPacket->data[2] = TCPacket->packetID[0];
- TMPacket->data[3] = TCPacket->packetID[1];
- TMPacket->data[4] = TCPacket->packetSequenceControl[0];
- TMPacket->data[5] = TCPacket->packetSequenceControl[1];
- TMPacket->data[6] = TCPacket->dataFieldHeader[1]; // type
- TMPacket->data[7] = TCPacket->dataFieldHeader[2]; // subtype
- TMPacket->data[8] = currentTC_LEN_RCV[0];
- TMPacket->data[9] = currentTC_LEN_RCV[1];
- TMPacket->data[10] = TCPacket->packetLength[0];
- TMPacket->data[11] = TCPacket->packetLength[1];
- TMPacket->data[12] = TCPacket->dataAndCRC[packetLength];
- TMPacket->data[13] = TCPacket->dataAndCRC[packetLength+1];
- TMPacket->data[14] = currentTC_COMPUTED_CRC[0];
- TMPacket->data[15] = currentTC_COMPUTED_CRC[1];
- //
- currentTM_length = SIZE_TM_LFR_TC_EXE_CORRUPTED-CCSDS_TC_TM_PACKET_OFFSET;
- }
- else return 0;
+ TMHeader->targetLogicalAddress = CCSDS_DESTINATION_ID;
+ TMHeader->protocolIdentifier = 0x02;
+ TMHeader->reserved = 0x00;
+ TMHeader->userApplication = 0x00;
+ TMHeader->packetID[0] = 0x0c;
+ TMHeader->packetSequenceControl[0] = 0xc0;
+ TMHeader->packetSequenceControl[1] = 0x00;
+ TMHeader->packetLength[0] = (unsigned char) (packetLength>>8);
+ TMHeader->packetLength[1] = (unsigned char) packetLength;
+ TMHeader->dataFieldHeader[0] = 0x10;
+ TMHeader->dataFieldHeader[3] = CCSDS_DESTINATION_ID;
+ switch (tm_type){
+ case(TM_LFR_TC_EXE_OK):
+ TMHeader->packetID[1] = 0xc1;
+ TMHeader->dataFieldHeader[1] = 1; // type
+ TMHeader->dataFieldHeader[2] = 7; // subtype
+ break;
+ case(TM_LFR_TC_EXE_ERR):
+ TMHeader->packetID[1] = 0xc1;
+ TMHeader->dataFieldHeader[1] = 1; // type
+ TMHeader->dataFieldHeader[2] = 8; // subtype
+ break;
+ case(TM_LFR_HK):
+ TMHeader->packetID[1] = 0xc4;
+ TMHeader->dataFieldHeader[1] = 3; // type
+ TMHeader->dataFieldHeader[2] = 25; // subtype
+ break;
+ case(TM_LFR_SCI):
+ TMHeader->packetID[1] = 0xcc;
+ TMHeader->dataFieldHeader[1] = 21; // type
+ TMHeader->dataFieldHeader[2] = 3; // subtype
+ break;
+ case(TM_LFR_SCI_SBM):
+ TMHeader->packetID[1] = 0xfc;
+ TMHeader->dataFieldHeader[1] = 21; // type
+ TMHeader->dataFieldHeader[2] = 3; // subtype
+ break;
+ case(TM_LFR_PAR_DUMP):
+ TMHeader->packetID[1] = 0xc9;
+ TMHeader->dataFieldHeader[1] = 181; // type
+ TMHeader->dataFieldHeader[2] = 31; // subtype
+ break;
+ default:
+ return 0;
+ }
+ /*TMHeader->dataFieldHeader[4] = (unsigned char) (coarseTime>>24);
+ TMHeader->dataFieldHeader[5] = (unsigned char) (coarseTime>>16);
+ TMHeader->dataFieldHeader[6] = (unsigned char) (coarseTime>>8);
+ TMHeader->dataFieldHeader[7] = (unsigned char) (coarseTime);
+ TMHeader->dataFieldHeader[8] = (unsigned char) (fineTime>>8);
+ TMHeader->dataFieldHeader[9] = (unsigned char) (fineTime);*/
+ TMHeader->dataFieldHeader[4] = 0xaa;
+ TMHeader->dataFieldHeader[5] = 0xbb;
+ TMHeader->dataFieldHeader[6] = 0xcc;
+ TMHeader->dataFieldHeader[7] = 0xdd;
+ TMHeader->dataFieldHeader[8] = 0xee;
+ TMHeader->dataFieldHeader[9] = 0xff;
return 1;
}
-unsigned char TM_not_implemented_generator(ccsdsTelecommandPacket_t * TCPacket, ccsdsTelemetryPacket_t * TMPacket)
+unsigned char TM_build_data(ccsdsTelecommandPacket_t *TC, char* data, unsigned int SID, unsigned char *computed_CRC)
{
- TMPacket->targetLogicalAddress = CCSDS_DESTINATION_ID;
- TMPacket->protocolIdentifier = 0x02;
- TMPacket->reserved = 0x00;
- TMPacket->userApplication = 0x00;
- //
- TMPacket->packetID[0] = 0x0c;
- TMPacket->packetID[1] = 0xc1;
- TMPacket->packetSequenceControl[0] = 0xc0;
- TMPacket->packetSequenceControl[1] = 0x00;
- TMPacket->packetLength[0] = 0x00;
- TMPacket->packetLength[1] = SIZE_TM_LFR_TC_EXE_NOT_IMPLEMENTED-CCSDS_TC_TM_PACKET_OFFSET;
- //
- TMPacket->dataFieldHeader[0] = 0x10;
- TMPacket->dataFieldHeader[1] = 0x01; // service type
- TMPacket->dataFieldHeader[2] = 0x08; // service subtype
- TMPacket->dataFieldHeader[3] = CCSDS_DESTINATION_ID;
- TMPacket->dataFieldHeader[4] = 0x00; // time
- TMPacket->dataFieldHeader[5] = 0x00; // time
- TMPacket->dataFieldHeader[6] = 0x00; // time
- TMPacket->dataFieldHeader[7] = 0x00; // time
- TMPacket->dataFieldHeader[8] = 0x00; // time
- TMPacket->dataFieldHeader[9] = 0x00; // time
- //
- TMPacket->data[0] = 0x9c; // failure code
- TMPacket->data[1] = 0x42; // failure code
- TMPacket->data[2] = TCPacket->packetID[0];
- TMPacket->data[3] = TCPacket->packetID[1];
- TMPacket->data[4] = TCPacket->packetSequenceControl[0];
- TMPacket->data[5] = TCPacket->packetSequenceControl[1];
- TMPacket->data[6] = TCPacket->dataFieldHeader[1]; // type
- TMPacket->data[7] = TCPacket->dataFieldHeader[2]; // subtype
- //
- currentTM_length = SIZE_TM_LFR_TC_EXE_NOT_IMPLEMENTED-CCSDS_TC_TM_PACKET_OFFSET;
-
+ unsigned int packetLength;
+ packetLength = TC->packetLength[0] * 256 + TC->packetLength[1];
+ switch (SID){
+ case (SID_NOT_EXE):
+ break;
+ case (SID_NOT_IMP):
+ data[0] = 0x9c;
+ data[1] = 0x42;
+ data[2] = TC->packetID[0];
+ data[3] = TC->packetID[1];
+ data[4] = TC->packetSequenceControl[0];
+ data[5] = TC->packetSequenceControl[1];
+ data[6] = TC->dataFieldHeader[1]; // type
+ data[7] = TC->dataFieldHeader[2]; // subtype
+ break;
+ case (SID_EXE_ERR):
+ break;
+ case (SID_EXE_CORR):
+ data[0] = 0x9c;
+ data[1] = 0x45;
+ data[2] = TC->packetID[0];
+ data[3] = TC->packetID[1];
+ data[4] = TC->packetSequenceControl[0];
+ data[5] = TC->packetSequenceControl[1];
+ data[6] = TC->dataFieldHeader[1]; // type
+ data[7] = TC->dataFieldHeader[2]; // subtype
+ data[8] = currentTC_LEN_RCV[0];
+ data[9] = currentTC_LEN_RCV[1];
+ data[10] = TC->packetLength[0];
+ data[11] = TC->packetLength[1];
+ data[12] = TC->dataAndCRC[packetLength];
+ data[13] = TC->dataAndCRC[packetLength+1];
+ data[14] = computed_CRC[0];
+ data[15] = computed_CRC[1];
+ break;
+ default:
+ return 0;
+ }
return 1;
}
+
+
+
+