# HG changeset patch
# User paul@pc-solar1.lab-lpp.local
# Date 2013-01-28 14:34:53
# Node ID a7739b90c9719511777099116b084c500cb69b11
# Parent a683a5ce5797b4b5ffaf119b9869c00e7fda46bf
Several bugs corrected on the TC handler (related TMs are now compliant)
Spectral Matrices simulator implemented with the timer unit as an IRQ generator
Waveforms simulator implemented with the timer unit as an IRQ generator
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;
}
+
+
+
+