diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
new file mode 100644
index 00000000..25b42f98
--- /dev/null
+++ b/.github/workflows/build.yml
@@ -0,0 +1,48 @@
+name: Build
+
+on:
+ push:
+ pull_request:
+
+jobs:
+ fsw:
+ runs-on: ubuntu-latest
+ container:
+ image: ivvitc/nos3-64:20240618
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ submodules: recursive
+ - name: Update
+ run: apt-get update
+ - name: Install dependencies
+ run: apt-get install -y python3 docker docker.io
+ - name: prep
+ run: make prep
+ - name: config
+ run: make config
+ - name: build directory
+ run: mkdir ./fsw/build
+ - name: build
+ run: make build-fsw
+
+ sim:
+ runs-on: ubuntu-latest
+ container:
+ image: ivvitc/nos3-64:20240618
+ steps:
+ - uses: actions/checkout@v2
+ with:
+ submodules: recursive
+ - name: Update
+ run: apt-get update
+ - name: Install dependencies
+ run: apt-get install -y python3 docker docker.io
+ - name: prep
+ run: make prep
+ - name: config
+ run: make config
+ - name: build directory
+ run: mkdir ./sims/build
+ - name: build
+ run: make build-sim
diff --git a/.gitignore b/.gitignore
index 0f32a7a8..f0f562f0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -12,3 +12,6 @@ build
support/nos3_install.log
tmp
core.*
+.cdskeyfile
+.reservedkeyfile
+.resetkeyfile
diff --git a/.gitmodules b/.gitmodules
index 43f560b9..c2767ffd 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -136,3 +136,6 @@
path = gsw/ttc-command
url = https://github.com/sphinxdefense/ttc-command
branch = main
+[submodule "components/generic_thruster"]
+ path = components/generic_thruster
+ url = https://github.com/nasa-itc/generic_thruster.git
diff --git a/Makefile b/Makefile
index 95ea8b5b..b7c8c3bf 100644
--- a/Makefile
+++ b/Makefile
@@ -61,6 +61,11 @@ build-sim:
cd $(SIMBUILDDIR) && cmake -DCMAKE_INSTALL_PREFIX=$(SIMBUILDDIR) ..
$(MAKE) --no-print-directory -C $(SIMBUILDDIR) install
+build-test:
+ mkdir -p $(FSWBUILDDIR)
+ cd $(FSWBUILDDIR) && cmake $(PREP_OPTS) -DENABLE_UNIT_TESTS=true ../cfe
+ $(MAKE) --no-print-directory -C $(FSWBUILDDIR) mission-install
+
checkout:
./scripts/docker_checkout.sh
@@ -118,5 +123,8 @@ stop:
stop-gsw:
./scripts/stop_gsw.sh
+test-fsw:
+ cd $(FSWBUILDDIR)/amd64-posix/default_cpu1 && ctest -O ctest.log
+
igniter:
./scripts/igniter_launch.sh
diff --git a/cfg/InOut/Inp_IPC.txt b/cfg/InOut/Inp_IPC.txt
index 1e2bc0d8..d0644602 100644
--- a/cfg/InOut/Inp_IPC.txt
+++ b/cfg/InOut/Inp_IPC.txt
@@ -70,6 +70,16 @@ FALSE ! Allow Blocking (i.e. wait on RX)
FALSE ! Echo to stdout
1 ! Number of TX prefixes
"SC" ! Prefix 0
+********************************** Thruster IPC ****************************
+RX ! IPC Mode (OFF,TX,RX,TXRX,ACS,WRITEFILE,READFILE)
+1 ! AC.ID for ACS mode
+"Thruster.Rx" ! File name for WRITE or READ
+SERVER ! Socket Role (SERVER,CLIENT,GMSEC_CLIENT)
+fortytwo 4280 ! Server Host Name, Port
+FALSE ! Allow Blocking (i.e. wait on RX)
+FALSE ! Echo to stdout
+1 ! Number of TX prefixes
+"SC" ! Prefix 0
********************************** GPS IPC *****************************
TX ! IPC Mode (OFF,TX,RX,TXRX,ACS,WRITEFILE,READFILE)
0 ! AC.ID for ACS mode
diff --git a/cfg/InOut/Nodes_Simple.txt b/cfg/InOut/Nodes_Simple.txt
new file mode 100644
index 00000000..038e50d4
--- /dev/null
+++ b/cfg/InOut/Nodes_Simple.txt
@@ -0,0 +1,8 @@
+<<<<<<<<<<<<<<<< Body Node Inputs for 42 >>>>>>>>>>>>>>>>>>>>>
+Simple Nodes ! Description
+4 ! Number of Nodes
+******************* Node Location, Comment *********************
+ 0.1 -0.4 0.25 "Thrusters"
+ 0.1 -0.1 0.25 "Thrusters"
+ 0.1 -0.4 0.15 "Thrusters"
+ 0.1 -0.1 0.15 "Thrusters"
diff --git a/cfg/InOut/SC_NOS3.txt b/cfg/InOut/SC_NOS3.txt
index 442e8e95..9338b4b7 100644
--- a/cfg/InOut/SC_NOS3.txt
+++ b/cfg/InOut/SC_NOS3.txt
@@ -11,7 +11,7 @@ CM ! Pos of CM or ORIGIN, wrt F
0.0 0.0 0.0 ! Vel wrt Formation (m/s), expressed in F
*************************** Initial Attitude ***************************
NAN ! Ang Vel wrt [NL], Att [QA] wrt [NLF]
-0.3 0.4 0.5 ! Ang Vel (deg/sec)
+0.0 0.0 0.0 ! Ang Vel (deg/sec)
0.0 0.0 0.0 1.0 ! Quaternion
60.0 40.0 20.0 213 ! Angles (deg) & Euler Sequence
*************************** Dynamics Flags ***************************
@@ -34,7 +34,7 @@ NONE ! Shaker File Name
0.0 0.0 0.0 ! Constant Embedded Momentum (Nms)
0.0 0.0 0.0 ! Constant Embedded Magnetic Dipole (A-m^2)
stf1_red.obj ! Geometry Input File Name
-NONE ! Node File Name
+Nodes_Simple.txt ! Node File Name
NONE ! Flex File Name
************************************************************************
*************************** Joint Parameters ***************************
@@ -99,13 +99,31 @@ NONE ! Drag/Jitter Input File Name
0.0 0.0 1.0 ! MTB Axis Components, [X, Y, Z]
0 ! Flex Node Index
************************* Thruster Parameters **************************
-0 ! Number of Thrusters
+4 ! Number of Thrusters
============================== Thr 0 =================================
-PULSED ! Mode (PULSED or PROPORTIONAL)
- 1.0 ! Thrust Force (N)
--1.0 0.0 0.0 ! Thrust Axis
+PROPORTIONAL ! Mode (PULSED or PROPORTIONAL)
+0.01 ! Thrust Force (N)
+1.0 0.0 0.0 ! Thrust Axis
0 ! Body
0 ! Node
+============================== Thr 1 =================================
+PROPORTIONAL ! Mode (PULSED or PROPORTIONAL)
+0.01 ! Thrust Force (N)
+1.0 0.0 0.0 ! Thrust Axis
+0 ! Body
+1 ! Node
+============================== Thr 2 =================================
+PROPORTIONAL ! Mode (PULSED or PROPORTIONAL)
+0.01 ! Thrust Force (N)
+1.0 0.0 0.0 ! Thrust Axis
+0 ! Body
+2 ! Node
+============================== Thr 3 =================================
+PROPORTIONAL ! Mode (PULSED or PROPORTIONAL)
+0.01 ! Thrust Force (N)
+1.0 0.0 0.0 ! Thrust Axis
+0 ! Body
+3 ! Node
******************************* Gyro ************************************
3 ! Number of Gyro Axes
============================== Axis 0 ===================================
diff --git a/cfg/gui/cfg_gui_main.py b/cfg/gui/cfg_gui_main.py
index 232bfacb..0e49b8f3 100644
--- a/cfg/gui/cfg_gui_main.py
+++ b/cfg/gui/cfg_gui_main.py
@@ -90,7 +90,7 @@ def saveText(self, layout:QLayout, config_value:int):
# TODO: change to dynamically pull apps/components from xml file or directory, but how?
applications = ['cf', 'ds', 'fm', 'lc', 'sc']
- components = ['adcs', 'cam', 'css', 'eps', 'fss', 'gps', 'imu', 'mag', 'radio', 'rw', 'sample', 'st', 'syn', 'torquer']
+ components = ['adcs', 'cam', 'css', 'eps', 'fss', 'gps', 'imu', 'mag', 'radio', 'rw', 'sample', 'st', 'syn', 'torquer', 'thruster']
i = 0
while layout.itemAt(i) != None:
diff --git a/cfg/nos3_defs/cpu1_cfe_es_startup.scr b/cfg/nos3_defs/cpu1_cfe_es_startup.scr
index 7a21cddb..db551d53 100644
--- a/cfg/nos3_defs/cpu1_cfe_es_startup.scr
+++ b/cfg/nos3_defs/cpu1_cfe_es_startup.scr
@@ -32,6 +32,7 @@ CFE_APP, novatel_oem615, NOVATEL_AppMain, NAV,
CFE_APP, sample, SAMPLE_AppMain, SAMPLE, 71, 32768, 0x0, 0;
CFE_APP, generic_st, ST_AppMain, ST, 71, 32768, 0x0, 0;
CFE_APP, syn, SYN_AppMain, SYN, 72, 32768, 0x0, 0;
+CFE_APP, generic_thruster, GENERIC_THR_AppMain, THRUSTER, 73, 32768, 0x0, 0;
CFE_LIB, cfs_lib, CFS_LibInit, CFS_LIB, 0, 0, 0x0, 0;
CFE_APP, cs, CS_AppMain, CS, 55, 16384, 0x0, 0;
diff --git a/cfg/nos3_defs/tables/sc_rts001.c b/cfg/nos3_defs/tables/sc_rts001.c
index 0614580a..9276f816 100644
--- a/cfg/nos3_defs/tables/sc_rts001.c
+++ b/cfg/nos3_defs/tables/sc_rts001.c
@@ -23,18 +23,21 @@
/* Custom table structure, modify as needed to add desired commands */
typedef struct
{
+ /* 1 - Enable DS */
SC_RtsEntryHeader_t hdr1;
DS_AppStateCmd_t cmd1;
+ /* 2 - Enable Debug */
SC_RtsEntryHeader_t hdr2;
TO_LAB_EnableOutputCmd_t cmd2;
+ /* 3 - Enable RTS 3-64 */
SC_RtsEntryHeader_t hdr3;
SC_RtsGrpCmd_t cmd3;
+ /* 4 - Enable LC */
SC_RtsEntryHeader_t hdr4;
- SAMPLE_NoArgs_cmd_t cmd4;
+ LC_SetLCState_t cmd4;
+ /* 5 - Start RTS 3 (Safe Mode) */
SC_RtsEntryHeader_t hdr5;
- SAMPLE_NoArgs_cmd_t cmd5;
- SC_RtsEntryHeader_t hdr6;
- LC_SetLCState_t cmd6;
+ SC_RtsCmd_t cmd5;
} SC_RtsStruct001_t;
/* Define the union to size the table correctly */
@@ -67,21 +70,18 @@ SC_RtsTable001_t SC_Rts001 = {
.cmd3.FirstRtsId = 3,
.cmd3.LastRtsId = 64,
- /* 4 - Sample NOOP */
+ /* 4 - Enable LC */
.hdr4.TimeTag = 1,
- .cmd4.CmdHeader = CFE_MSG_CMD_HDR_INIT(SAMPLE_CMD_MID, SC_MEMBER_SIZE(cmd4), SAMPLE_NOOP_CC, 0x00),
+ .cmd4.CmdHeader = CFE_MSG_CMD_HDR_INIT(LC_CMD_MID, SC_MEMBER_SIZE(cmd4), LC_SET_LC_STATE_CC, 0x00),
+ .cmd4.NewLCState = LC_STATE_ACTIVE,
+ .cmd4.Padding = 0x0000,
- /* 5 - Sample Enable */
+ /* 5 - Start RTS 3 (Safe Mode) */
.hdr5.TimeTag = 1,
- .cmd5.CmdHeader = CFE_MSG_CMD_HDR_INIT(SAMPLE_CMD_MID, SC_MEMBER_SIZE(cmd5), SAMPLE_ENABLE_CC, 0x00),
-
- /* 6 - Enable LC */
- .hdr6.TimeTag = 1,
- .cmd6.CmdHeader = CFE_MSG_CMD_HDR_INIT(LC_CMD_MID, SC_MEMBER_SIZE(cmd6), LC_SET_LC_STATE_CC, 0x00),
- .cmd6.NewLCState = LC_STATE_ACTIVE,
- .cmd6.Padding = 0x0000,
+ .cmd5.CmdHeader = CFE_MSG_CMD_HDR_INIT(SC_CMD_MID, SC_MEMBER_SIZE(cmd5), SC_START_RTS_CC, 0x00),
+ .cmd5.RtsId = 3,
}
};
/* Macro for table structure */
-CFE_TBL_FILEDEF(SC_Rts001, SC.RTS_TBL001, SC Example RTS_TBL001, sc_rts001.tbl)
+CFE_TBL_FILEDEF(SC_Rts001, SC.RTS_TBL001, POR RTS001, sc_rts001.tbl)
diff --git a/cfg/nos3_defs/tables/sc_rts003.c b/cfg/nos3_defs/tables/sc_rts003.c
new file mode 100644
index 00000000..5080fa49
--- /dev/null
+++ b/cfg/nos3_defs/tables/sc_rts003.c
@@ -0,0 +1,98 @@
+#include "cfe.h"
+#include "cfe_tbl_filedef.h"
+
+#include "sc_tbldefs.h" /* defines SC table headers */
+#include "sc_platform_cfg.h" /* defines table buffer size */
+#include "sc_msgdefs.h" /* defines SC command code values */
+#include "sc_msgids.h" /* defines SC packet msg ID's */
+#include "sc_msg.h" /* defines SC message structures */
+
+/* Command Includes */
+#include "generic_css_msg.h"
+#include "generic_css_msgids.h"
+#include "generic_fss_msg.h"
+#include "generic_fss_msgids.h"
+#include "generic_imu_msg.h"
+#include "generic_imu_msgids.h"
+#include "generic_mag_msg.h"
+#include "generic_mag_msgids.h"
+#include "generic_torquer_msg.h"
+#include "generic_torquer_msgids.h"
+#include "novatel_oem615_msg.h"
+#include "novatel_oem615_msgids.h"
+#include "generic_adcs_msg.h"
+#include "generic_adcs_msgids.h"
+#include "generic_adcs_adac.h"
+
+/* Custom table structure, modify as needed to add desired commands */
+typedef struct
+{
+ /* 1 - Enable CSS */
+ SC_RtsEntryHeader_t hdr1;
+ GENERIC_CSS_NoArgs_cmd_t cmd1;
+ /* 2 - Enable FSS */
+ SC_RtsEntryHeader_t hdr2;
+ GENERIC_FSS_NoArgs_cmd_t cmd2;
+ /* 3 - Enable IMU */
+ SC_RtsEntryHeader_t hdr3;
+ GENERIC_IMU_NoArgs_cmd_t cmd3;
+ /* 4 - Enable MAG */
+ SC_RtsEntryHeader_t hdr4;
+ GENERIC_MAG_NoArgs_cmd_t cmd4;
+ /* 5 - Enable torquers */
+ SC_RtsEntryHeader_t hdr5;
+ GENERIC_TORQUER_NoArgs_cmd_t cmd5;
+ /* 6 - Enable GPS */
+ SC_RtsEntryHeader_t hdr6;
+ NOVATEL_OEM615_NoArgs_cmd_t cmd6;
+ /* 7 - Set ADCS to SUNSAFE_MODE */
+ SC_RtsEntryHeader_t hdr7;
+ Generic_ADCS_Mode_cmd_t cmd7;
+} SC_RtsStruct003_t;
+
+/* Define the union to size the table correctly */
+typedef union
+{
+ SC_RtsStruct003_t rts;
+ uint16 buf[SC_RTS_BUFF_SIZE];
+} SC_RtsTable003_t;
+
+/* Helper macro to get size of structure elements */
+#define SC_MEMBER_SIZE(member) (sizeof(((SC_RtsStruct003_t *)0)->member))
+
+/* Used designated intializers to be verbose, modify as needed/desired */
+SC_RtsTable003_t SC_Rts003 = {
+.rts = {
+ /* 1 - Enable CSS */
+ .hdr1.TimeTag = 1,
+ .cmd1.CmdHeader = CFE_MSG_CMD_HDR_INIT(GENERIC_CSS_CMD_MID, SC_MEMBER_SIZE(cmd1), GENERIC_CSS_ENABLE_CC, 0x00),
+
+ /* 2 - Enable FSS */
+ .hdr2.TimeTag = 1,
+ .cmd2.CmdHeader = CFE_MSG_CMD_HDR_INIT(GENERIC_FSS_CMD_MID, SC_MEMBER_SIZE(cmd2), GENERIC_FSS_ENABLE_CC, 0x00),
+
+ /* 3 - Enable IMU */
+ .hdr3.TimeTag = 1,
+ .cmd3.CmdHeader = CFE_MSG_CMD_HDR_INIT(GENERIC_IMU_CMD_MID, SC_MEMBER_SIZE(cmd3), GENERIC_IMU_ENABLE_CC, 0x00),
+
+ /* 4 - Enable MAG */
+ .hdr4.TimeTag = 1,
+ .cmd4.CmdHeader = CFE_MSG_CMD_HDR_INIT(GENERIC_MAG_CMD_MID, SC_MEMBER_SIZE(cmd4), GENERIC_MAG_ENABLE_CC, 0x00),
+
+ /* 5 - Enable torquers */
+ .hdr5.TimeTag = 1,
+ .cmd5.CmdHeader = CFE_MSG_CMD_HDR_INIT(GENERIC_TORQUER_CMD_MID, SC_MEMBER_SIZE(cmd5), GENERIC_TORQUER_ENABLE_CC, 0x00),
+
+ /* 6 - Enable GPS */
+ .hdr6.TimeTag = 1,
+ .cmd6.CmdHeader = CFE_MSG_CMD_HDR_INIT(NOVATEL_OEM615_CMD_MID, SC_MEMBER_SIZE(cmd6), NOVATEL_OEM615_ENABLE_CC, 0x00),
+
+ /* 7 - Set ADCS to SUNSAFE_MODE */
+ .hdr7.TimeTag = 5,
+ .cmd7.CmdHeader = CFE_MSG_CMD_HDR_INIT(GENERIC_ADCS_CMD_MID, SC_MEMBER_SIZE(cmd7), GENERIC_ADCS_SET_MODE_CC, 0x00),
+ .cmd7.Mode = SUNSAFE_MODE,
+ }
+};
+
+/* Macro for table structure */
+CFE_TBL_FILEDEF(SC_Rts003, SC.RTS_TBL003, Safe Mode RTS003, sc_rts003.tbl)
diff --git a/cfg/nos3_defs/tables/sch_def_msgtbl.c b/cfg/nos3_defs/tables/sch_def_msgtbl.c
index b542284d..90266f3f 100644
--- a/cfg/nos3_defs/tables/sch_def_msgtbl.c
+++ b/cfg/nos3_defs/tables/sch_def_msgtbl.c
@@ -47,6 +47,7 @@
** Component Include Files
*/
#include "cam_msgids.h"
+#include "generic_adcs_msgids.h"
#include "generic_css_msgids.h"
#include "generic_eps_msgids.h"
#include "generic_fss_msgids.h"
@@ -54,12 +55,11 @@
#include "generic_mag_msgids.h"
#include "generic_radio_msgids.h"
#include "generic_reaction_wheel_msgids.h"
+#include "generic_star_tracker_msgids.h"
+#include "generic_thruster_msgids.h"
#include "generic_torquer_msgids.h"
#include "novatel_oem615_msgids.h"
#include "sample_msgids.h"
-#include "generic_adcs_msgids.h"
-#include "generic_star_tracker_msgids.h"
-
#include "syn_msgids.h"
/*
@@ -326,8 +326,8 @@ SCH_MessageEntry_t SCH_DefaultMessageTable[SCH_MAX_MESSAGES] =
{ { CFE_MAKE_BIG16(SCH_UNUSED_MID) } },
/* command ID #104 */
{ { CFE_MAKE_BIG16(SCH_UNUSED_MID) } },
- /* command ID #105 */
- { { CFE_MAKE_BIG16(SCH_UNUSED_MID) } },
+ /* command ID #105 - Thruster HK */
+ { { CFE_MAKE_BIG16(GENERIC_THRUSTER_REQ_HK_MID), CFE_MAKE_BIG16(0xC000), CFE_MAKE_BIG16(0x0001), CFE_MAKE_BIG16(0x0000) } },
/* command ID #106 */
{ { CFE_MAKE_BIG16(SCH_UNUSED_MID) } },
/* command ID #107 */
diff --git a/cfg/nos3_defs/tables/sch_def_schtbl.c b/cfg/nos3_defs/tables/sch_def_schtbl.c
index c54407d4..b9f161d1 100644
--- a/cfg/nos3_defs/tables/sch_def_schtbl.c
+++ b/cfg/nos3_defs/tables/sch_def_schtbl.c
@@ -114,9 +114,9 @@ SCH_ScheduleEntry_t SCH_DefaultScheduleTable[SCH_TABLE_ENTRIES] =
/* slot #3 */
{ SCH_ENABLED, SCH_ACTIVITY_SEND_MSG, 4, 3, 2, SCH_GROUP_CFE_HK }, /* EVS HK Request */
{ SCH_ENABLED, SCH_ACTIVITY_SEND_MSG, 1, 0,101, SCH_GROUP_NONE }, /* ST Data Request */
- { SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE},
- { SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE},
- { SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE},
+ { SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE},
+ { SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE},
+ { SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE},
/* slot #4 */
/*{ SCH_DISABLED, SCH_ACTIVITY_SEND_MSG, 4, 1, 6, SCH_GROUP_CFS_HK }, */ /* CS HK Request */
@@ -187,7 +187,7 @@ SCH_ScheduleEntry_t SCH_DefaultScheduleTable[SCH_TABLE_ENTRIES] =
/* slot #13 */
{ SCH_ENABLED, SCH_ACTIVITY_SEND_MSG, 4, 3, 3, SCH_GROUP_CFE_HK }, /* SB HK Request */
{ SCH_ENABLED, SCH_ACTIVITY_SEND_MSG, 1, 0,101, SCH_GROUP_NONE }, /* ST Data Request */
- { SCH_ENABLED, SCH_ACTIVITY_SEND_MSG, 1, 0,100, SCH_GROUP_NONE }, /* ST Data Request */
+ { SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE},
{ SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE},
{ SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE},
@@ -201,7 +201,7 @@ SCH_ScheduleEntry_t SCH_DefaultScheduleTable[SCH_TABLE_ENTRIES] =
/* slot #15 - Component HK */
/*{ SCH_DISABLED, SCH_ACTIVITY_SEND_MSG, 1, 0, 24, SCH_GROUP_MD_WAKEUP }, */ /* MD Wakeup */
{ SCH_ENABLED, SCH_ACTIVITY_SEND_MSG, 1, 0, 45, SCH_GROUP_NONE }, /* RW HK Request */
- { SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE},
+ { SCH_ENABLED, SCH_ACTIVITY_SEND_MSG, 1, 0,100, SCH_GROUP_NONE }, /* ST HK Request */
{ SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE},
{ SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE},
{ SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE},
@@ -261,7 +261,7 @@ SCH_ScheduleEntry_t SCH_DefaultScheduleTable[SCH_TABLE_ENTRIES] =
/* slot #23 */
{ SCH_ENABLED, SCH_ACTIVITY_SEND_MSG, 4, 3, 4, SCH_GROUP_CFE_HK }, /* TIME HK Request */
{ SCH_ENABLED, SCH_ACTIVITY_SEND_MSG, 1, 0,101, SCH_GROUP_NONE }, /* ST Data Request */
- { SCH_ENABLED, SCH_ACTIVITY_SEND_MSG, 1, 0,100, SCH_GROUP_NONE }, /* ST Data Request */
+ { SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE},
{ SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE},
{ SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE},
@@ -287,7 +287,6 @@ SCH_ScheduleEntry_t SCH_DefaultScheduleTable[SCH_TABLE_ENTRIES] =
{ SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE},
{ SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE},
{ SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE},
- { SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE},
/* slot #27 */
{ SCH_ENABLED, SCH_ACTIVITY_SEND_MSG, 1, 0, 90, SCH_GROUP_NONE }, /* ADCS ADAC Request */
@@ -335,7 +334,7 @@ SCH_ScheduleEntry_t SCH_DefaultScheduleTable[SCH_TABLE_ENTRIES] =
/* slot #33 */
{ SCH_ENABLED, SCH_ACTIVITY_SEND_MSG, 4, 3, 5, SCH_GROUP_CFE_HK }, /* TBL HK Request */
{ SCH_ENABLED, SCH_ACTIVITY_SEND_MSG, 1, 0,101, SCH_GROUP_NONE }, /* ST Data Request */
- { SCH_ENABLED, SCH_ACTIVITY_SEND_MSG, 1, 0,100, SCH_GROUP_NONE }, /* ST Data Request */
+ { SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE},
{ SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE},
{ SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE},
@@ -361,7 +360,6 @@ SCH_ScheduleEntry_t SCH_DefaultScheduleTable[SCH_TABLE_ENTRIES] =
{ SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE},
{ SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE},
{ SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE},
- { SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE},
/* slot #37 */
{ SCH_ENABLED, SCH_ACTIVITY_SEND_MSG, 1, 0, 90, SCH_GROUP_NONE }, /* ADCS ADAC Request */
@@ -410,7 +408,7 @@ SCH_ScheduleEntry_t SCH_DefaultScheduleTable[SCH_TABLE_ENTRIES] =
/* slot #43 */
{ SCH_ENABLED, SCH_ACTIVITY_SEND_MSG, 4, 3, 1, SCH_GROUP_CFE_HK }, /* ES HK Request */
{ SCH_ENABLED, SCH_ACTIVITY_SEND_MSG, 1, 0,101, SCH_GROUP_NONE }, /* ST Data Request */
- { SCH_ENABLED, SCH_ACTIVITY_SEND_MSG, 1, 0,100, SCH_GROUP_NONE }, /* ST Data Request */
+ { SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE},
{ SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE},
{ SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE},
@@ -424,7 +422,7 @@ SCH_ScheduleEntry_t SCH_DefaultScheduleTable[SCH_TABLE_ENTRIES] =
/* slot #45 - Component HK */
/*{ SCH_DISABLED, SCH_ACTIVITY_SEND_MSG, 1, 0, 24, SCH_GROUP_MD_WAKEUP }, */ /* MD Wakeup */
{ SCH_ENABLED, SCH_ACTIVITY_SEND_MSG, 5, 1, 60, SCH_GROUP_CFS_HK }, /* FSS HK Request */
- { SCH_ENABLED, SCH_ACTIVITY_SEND_MSG, 1, 0, 61, SCH_GROUP_CFS_HK }, /* FSS Data Request */
+ { SCH_ENABLED, SCH_ACTIVITY_SEND_MSG, 1, 0,105, SCH_GROUP_NONE }, /* Thruster HK Request */
{ SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE},
{ SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE},
{ SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE},
@@ -483,7 +481,7 @@ SCH_ScheduleEntry_t SCH_DefaultScheduleTable[SCH_TABLE_ENTRIES] =
/* slot #53 */
{ SCH_ENABLED, SCH_ACTIVITY_SEND_MSG, 1, 0,101, SCH_GROUP_NONE }, /* ST Data Request */
- { SCH_ENABLED, SCH_ACTIVITY_SEND_MSG, 1, 0,100, SCH_GROUP_NONE }, /* ST Data Request */
+ { SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE},
{ SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE},
{ SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE},
{ SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE},
@@ -555,7 +553,7 @@ SCH_ScheduleEntry_t SCH_DefaultScheduleTable[SCH_TABLE_ENTRIES] =
/* slot #63 */
{ SCH_ENABLED, SCH_ACTIVITY_SEND_MSG, 1, 0,101, SCH_GROUP_NONE }, /* ST Data Request */
- { SCH_ENABLED, SCH_ACTIVITY_SEND_MSG, 1, 0,100, SCH_GROUP_NONE }, /* ST Data Request */
+ { SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE},
{ SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE},
{ SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE},
{ SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE},
@@ -627,7 +625,7 @@ SCH_ScheduleEntry_t SCH_DefaultScheduleTable[SCH_TABLE_ENTRIES] =
/* slot #73 */
{ SCH_ENABLED, SCH_ACTIVITY_SEND_MSG, 1, 0,101, SCH_GROUP_NONE }, /* ST Data Request */
- { SCH_ENABLED, SCH_ACTIVITY_SEND_MSG, 1, 0,100, SCH_GROUP_NONE }, /* ST Data Request */
+ { SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE},
{ SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE},
{ SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE},
{ SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE},
@@ -699,7 +697,7 @@ SCH_ScheduleEntry_t SCH_DefaultScheduleTable[SCH_TABLE_ENTRIES] =
/* slot #83 */
{ SCH_ENABLED, SCH_ACTIVITY_SEND_MSG, 1, 0,101, SCH_GROUP_NONE }, /* ST Data Request */
- { SCH_ENABLED, SCH_ACTIVITY_SEND_MSG, 1, 0,100, SCH_GROUP_NONE }, /* ST Data Request */
+ { SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE},
{ SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE},
{ SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE},
{ SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE},
@@ -775,7 +773,7 @@ SCH_ScheduleEntry_t SCH_DefaultScheduleTable[SCH_TABLE_ENTRIES] =
/* slot #93 */
{ SCH_ENABLED, SCH_ACTIVITY_SEND_MSG, 1, 0,101, SCH_GROUP_NONE }, /* ST Data Request */
- { SCH_ENABLED, SCH_ACTIVITY_SEND_MSG, 1, 0,100, SCH_GROUP_NONE }, /* ST Data Request */
+ { SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE},
{ SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE},
{ SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE},
{ SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE},
@@ -820,8 +818,8 @@ SCH_ScheduleEntry_t SCH_DefaultScheduleTable[SCH_TABLE_ENTRIES] =
{ SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE},
{ SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE},
{ SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE},
- //{ SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE},
- //{ SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE}
+ { SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE},
+ { SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE}
};
/*
diff --git a/cfg/nos3_defs/tables/to_config.c b/cfg/nos3_defs/tables/to_config.c
index af9cd704..e2f1b863 100644
--- a/cfg/nos3_defs/tables/to_config.c
+++ b/cfg/nos3_defs/tables/to_config.c
@@ -69,6 +69,7 @@ extern "C" {
#include "generic_mag_msgids.h"
#include "generic_radio_msgids.h"
#include "generic_reaction_wheel_msgids.h"
+#include "generic_thruster_msgids.h"
#include "generic_torquer_msgids.h"
#include "novatel_oem615_msgids.h"
#include "sample_msgids.h"
@@ -150,7 +151,7 @@ TO_ConfigTable_t to_ConfigTable =
{CFE_SB_MSGID_WRAP_VALUE(GENERIC_ADCS_HK_TLM_MID), {0,0}, 32, 0xffff, TO_GROUP_APP | TO_MGROUP_ONE, 0,1},
{CFE_SB_MSGID_WRAP_VALUE(GENERIC_STAR_TRACKER_HK_TLM_MID),{0,0}, 32, 0xffff, TO_GROUP_APP | TO_MGROUP_ONE, 0,1},
{CFE_SB_MSGID_WRAP_VALUE(GENERIC_STAR_TRACKER_DEVICE_TLM_MID),{0,0}, 32, 0xffff, TO_GROUP_APP | TO_MGROUP_ONE, 0,1},
- {CFE_SB_MSGID_WRAP_VALUE(TO_UNUSED_ENTRY), {0,0}, 0, 0x0000, TO_GROUP_NONE, 0,0},
+ {CFE_SB_MSGID_WRAP_VALUE(GENERIC_THRUSTER_HK_TLM_MID), {0,0}, 32, 0xffff, TO_GROUP_APP | TO_MGROUP_ONE, 0,1},
{CFE_SB_MSGID_WRAP_VALUE(TO_UNUSED_ENTRY), {0,0}, 0, 0x0000, TO_GROUP_NONE, 0,0},
// Commented out to limited ADCS messages sent via radio
diff --git a/cfg/nos3_defs/tables/to_lab_sub.c b/cfg/nos3_defs/tables/to_lab_sub.c
index 9c082dc7..11327d2f 100644
--- a/cfg/nos3_defs/tables/to_lab_sub.c
+++ b/cfg/nos3_defs/tables/to_lab_sub.c
@@ -58,6 +58,7 @@
#include "generic_radio_msgids.h"
#include "generic_reaction_wheel_msgids.h"
#include "generic_torquer_msgids.h"
+#include "generic_thruster_msgids.h"
#include "novatel_oem615_msgids.h"
#include "sample_msgids.h"
#include "generic_adcs_msgids.h"
@@ -127,6 +128,7 @@ TO_LAB_Subs_t TO_LAB_Subs =
{CFE_SB_MSGID_WRAP_VALUE(GENERIC_ADCS_DO_MID), {0,0}, 32},
{CFE_SB_MSGID_WRAP_VALUE(GENERIC_STAR_TRACKER_HK_TLM_MID),{0,0}, 32},
{CFE_SB_MSGID_WRAP_VALUE(GENERIC_STAR_TRACKER_DEVICE_TLM_MID),{0,0}, 32},
+ {CFE_SB_MSGID_WRAP_VALUE(GENERIC_THRUSTER_HK_TLM_MID), {0,0}, 32},
{CFE_SB_MSGID_WRAP_VALUE(SYN_HK_TLM_MID), {0,0}, 32},
diff --git a/cfg/nos3_defs/targets.cmake b/cfg/nos3_defs/targets.cmake
index b670344d..5d431828 100644
--- a/cfg/nos3_defs/targets.cmake
+++ b/cfg/nos3_defs/targets.cmake
@@ -113,6 +113,7 @@ list(APPEND MISSION_GLOBAL_APPLIST
generic_reaction_wheel/fsw
generic_radio/fsw
generic_star_tracker/fsw
+ generic_thruster/fsw
generic_torquer/fsw
novatel_oem615/fsw
sample/fsw
@@ -145,7 +146,11 @@ SET(MISSION_CPUNAMES cpu1)
SET(cpu1_PROCESSORID 1)
SET(cpu1_APPLIST) # Note: Using all ${MISSION_GLOBAL_APPLIST} automatically
SET(cpu1_FILELIST cfe_es_startup.scr)
-SET(cpu1_SYSTEM amd64-linux-gnu)
+if (ENABLE_UNIT_TESTS)
+ SET(cpu1_SYSTEM amd64-posix)
+else()
+ SET(cpu1_SYSTEM amd64-nos3)
+endif()
# USER Supplied
#SET(cpu2_PROCESSORID 2)
diff --git a/cfg/nos3_defs/toolchain-amd64-linux-gnu.cmake b/cfg/nos3_defs/toolchain-amd64-nos3.cmake
similarity index 100%
rename from cfg/nos3_defs/toolchain-amd64-linux-gnu.cmake
rename to cfg/nos3_defs/toolchain-amd64-nos3.cmake
diff --git a/cfg/nos3_defs/toolchain-amd64-posix.cmake b/cfg/nos3_defs/toolchain-amd64-posix.cmake
new file mode 100644
index 00000000..d5356637
--- /dev/null
+++ b/cfg/nos3_defs/toolchain-amd64-posix.cmake
@@ -0,0 +1,34 @@
+# This example toolchain file describes the cross compiler to use for
+# the target architecture indicated in the configuration file.
+
+# Basic cross system configuration
+SET(CMAKE_SYSTEM_NAME Linux)
+SET(CMAKE_SYSTEM_VERSION 1)
+SET(CMAKE_SYSTEM_PROCESSOR amd64)
+
+# Specify the cross compiler executables
+# Typically these would be installed in a home directory or somewhere
+# in /opt. However in this example the system compiler is used.
+SET(CMAKE_C_COMPILER "/usr/bin/gcc")
+SET(CMAKE_CXX_COMPILER "/usr/bin/g++")
+
+# Configure the find commands
+SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
+SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER)
+SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER)
+
+# These variable settings are specific to cFE/OSAL and determines which
+# abstraction layers are built when using this toolchain
+SET(CFE_SYSTEM_PSPNAME "pc-linux")
+SET(OSAL_SYSTEM_OSTYPE "posix")
+
+#SET(CMAKE_C_FLAGS_INIT "" CACHE STRING "C Flags required by platform")
+#SET(CMAKE_SHARED_LINKER_FLAGS "-pg")
+
+# Build Specific
+add_definitions(-DBYTE_ORDER_LE)
+add_definitions(-D_LINUX_OS_)
+set(CMAKE_POSITION_INDEPENDENT_CODE ON)
+
+set(CI_TRANSPORT udp_tf)
+set(TO_TRANSPORT udp) # Note udp_tf used for Transfer Frames required for CryptoLib
diff --git a/cfg/sc-full-config.xml b/cfg/sc-full-config.xml
index c2213c53..67a2917e 100644
--- a/cfg/sc-full-config.xml
+++ b/cfg/sc-full-config.xml
@@ -59,6 +59,9 @@
true
+
+ true
+
true
diff --git a/cfg/sc-minimal-config.xml b/cfg/sc-minimal-config.xml
index 07b9d3ab..1e8a0d56 100644
--- a/cfg/sc-minimal-config.xml
+++ b/cfg/sc-minimal-config.xml
@@ -59,9 +59,12 @@
false
+
+ false
+
- true
+ false
0.1
diff --git a/cfg/sims/nos3-simulator.xml b/cfg/sims/nos3-simulator.xml
index 69461bce..f6587b44 100644
--- a/cfg/sims/nos3-simulator.xml
+++ b/cfg/sims/nos3-simulator.xml
@@ -422,6 +422,33 @@
+
+ generic_thruster_sim
+ true
+ libgeneric_thruster_sim.so
+
+ GENERIC_THRUSTER
+
+
+ command
+ command
+ thruster-command
+
+ usart
+ usart_29
+ 29
+
+
+
+ GENERIC_THRUSTER_42_PROVIDER
+ fortytwo
+ 4280
+ 0
+ 1
+
+
+
+
truth42sim
true
diff --git a/components/generic_thruster b/components/generic_thruster
new file mode 160000
index 00000000..feb2d655
--- /dev/null
+++ b/components/generic_thruster
@@ -0,0 +1 @@
+Subproject commit feb2d6555fb09e0f1b33a3993819799ad42ce0d5
diff --git a/scripts/configure.py b/scripts/configure.py
index 54b4d053..016cc5d3 100755
--- a/scripts/configure.py
+++ b/scripts/configure.py
@@ -84,6 +84,7 @@
sc_st_en = sc_root.find('components/st/enable').text
sc_syn_en = sc_root.find('components/syn/enable').text
sc_torquer_en = sc_root.find('components/torquer/enable').text
+ sc_thruster_en = sc_root.find('components/thruster/enable').text
sc_gui_en = sc_root.find('gui/enable').text
sc_orbit_tipoff_x = sc_root.find('orbit/tipoff_x').text
@@ -119,6 +120,7 @@
st_line = ""
syn_line = ""
torquer_line = ""
+ thruster_line = ""
# Parse lines
for line in lines:
@@ -182,10 +184,14 @@
if line.find('TORQUER,') != -1:
if (sc_torquer_en == 'true'):
torquer_line = line
+ if line.find('THRUSTER,') != -1:
+ if (sc_thruster_en == 'true'):
+ thruster_line = line
# Modify startup script per spacecraft configuration
lines.insert(sc_startup_eof, "\n")
lines.insert(sc_startup_eof, torquer_line)
+ lines.insert(sc_startup_eof, thruster_line)
lines.insert(sc_startup_eof, syn_line)
lines.insert(sc_startup_eof, st_line)
lines.insert(sc_startup_eof, sample_line)
@@ -268,9 +274,10 @@
rw1_from_index = 999
rw2_to_index = 999
rw2_from_index = 999
- sample_index = 999
+ #sample_index = 999
st_index = 999
torquer_index = 999
+ thruster_index = 999
with open('./cfg/InOut/Inp_IPC.txt', 'r') as fp:
lines = fp.readlines()
@@ -308,15 +315,18 @@
if line.find('RW 2 from 42') != -1:
if (lines.index(line)) < rw2_from_index:
rw2_from_index = lines.index(line) + 1
- if line.find('Sample IPC') != -1:
- if (lines.index(line)) < sample_index:
- sample_index = lines.index(line) + 1
+ #if line.find('Sample IPC') != -1:
+ # if (lines.index(line)) < sample_index:
+ # sample_index = lines.index(line) + 1
if line.find('Star Tracker IPC') != -1:
if (lines.index(line)) < st_index:
st_index = lines.index(line) + 1
if line.find('Torquer IPC') != -1:
if (lines.index(line)) < torquer_index:
torquer_index = lines.index(line) + 1
+ if line.find('Thruster IPC') != -1:
+ if (lines.index(line)) < thruster_index:
+ thruster_index = lines.index(line) + 1
ipc_off = 'OFF ! IPC Mode (OFF,TX,RX,TXRX,ACS,WRITEFILE,READFILE)\n'
if (sc_css_en != 'true'):
@@ -336,12 +346,14 @@
lines[rw1_from_index] = ipc_off
lines[rw2_to_index] = ipc_off
lines[rw2_from_index] = ipc_off
- if (sc_sample_en != 'true'):
- lines[sample_index] = ipc_off
+ #if (sc_sample_en != 'true'):
+ # lines[sample_index] = ipc_off
if (sc_st_en != 'true'):
lines[st_index] = ipc_off
if (sc_torquer_en != 'true'):
lines[torquer_index] = ipc_off
+ if (sc_thruster_en != 'true'):
+ lines[thruster_index] = ipc_off
with open('./cfg/build/InOut/Inp_IPC.txt', 'w') as fp:
lines = "".join(lines)
@@ -364,6 +376,7 @@
sample_index = 999
st_index = 999
torquer_index = 999
+ thruster_index = 999
with open('./cfg/build/sims/nos3-simulator.xml', 'r') as fp:
lines = fp.readlines()
@@ -410,6 +423,9 @@
if line.find('generic_torquer_sim') != -1:
if (lines.index(line)) < torquer_index:
torquer_index = lines.index(line) + 1
+ if line.find('generic_thruster_sim') != -1:
+ if (lines.index(line)) < thruster_index:
+ thruster_index = lines.index(line) + 1
sim_disabled = ' false\n'
if (sc_cam_en != 'true'):
@@ -438,6 +454,8 @@
lines[st_index] = sim_disabled
if (sc_torquer_en != 'true'):
lines[torquer_index] = sim_disabled
+ if (sc_thruster_en != 'true'):
+ lines[thruster_index] = sim_disabled
with open('./cfg/build/sims/nos3-simulator.xml', 'w') as fp:
lines = "".join(lines)
diff --git a/scripts/docker_debug.sh b/scripts/docker_debug.sh
index 87c541a7..05f479db 100755
--- a/scripts/docker_debug.sh
+++ b/scripts/docker_debug.sh
@@ -9,4 +9,4 @@ SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
source $SCRIPT_DIR/env.sh
mkdir -p $BASE_DIR/fsw/build
-$DFLAGS_CPUS -v $BASE_DIR:$BASE_DIR -v $USER_NOS3_DIR:$USER_NOS3_DIR -w $BASE_DIR --name "nos3_debug" $DBOX bash
+$DFLAGS_CPUS -v $BASE_DIR:$BASE_DIR -v $USER_NOS3_DIR:$USER_NOS3_DIR -w $BASE_DIR --sysctl fs.mqueue.msg_max=10000 --ulimit rtprio=99 --cap-add=sys_nice --name "nos3_debug" $DBOX bash
diff --git a/scripts/docker_launch.sh b/scripts/docker_launch.sh
index e8f44de2..ae11afd9 100755
--- a/scripts/docker_launch.sh
+++ b/scripts/docker_launch.sh
@@ -140,6 +140,7 @@ do
gnome-terminal --tab --title=$SC_NUM" - Sample Sim" -- $DFLAGS -v $SIM_DIR:$SIM_DIR --name $SC_NUM"_sample_sim" --network=$SC_NETNAME -w $SIM_BIN $DBOX ./nos3-single-simulator $SC_CFG_FILE sample_sim
gnome-terminal --tab --title=$SC_NUM" - StarTrk Sim" -- $DFLAGS -v $SIM_DIR:$SIM_DIR --name $SC_NUM"_startrk_sim" --network=$SC_NETNAME -w $SIM_BIN $DBOX ./nos3-single-simulator $SC_CFG_FILE generic_star_tracker_sim
gnome-terminal --tab --title=$SC_NUM" - Torquer Sim" -- $DFLAGS -v $SIM_DIR:$SIM_DIR --name $SC_NUM"_torquer_sim" --network=$SC_NETNAME -w $SIM_BIN $DBOX ./nos3-single-simulator $SC_CFG_FILE generic_torquer_sim
+ gnome-terminal --tab --title=$SC_NUM" - Thruster Sim" -- $DFLAGS -v $SIM_DIR:$SIM_DIR --name $SC_NUM"_thruster_sim" --network=$SC_NETNAME -w $SIM_BIN $DBOX ./nos3-single-simulator $SC_CFG_FILE generic_thruster_sim
echo ""
done
diff --git a/scripts/env.sh b/scripts/env.sh
index 9a86e587..c7e59e71 100755
--- a/scripts/env.sh
+++ b/scripts/env.sh
@@ -44,7 +44,7 @@ INFLUXDB_ADMIN_PASSWORD=admin_password
DNETWORK="docker network"
#fi
-DBOX="ivvitc/nos3-64:20240430"
+DBOX="ivvitc/nos3-64:20240618"
# Debugging
#echo "Script directory = " $SCRIPT_DIR
diff --git a/scripts/launch.sh b/scripts/launch.sh
index 662056ac..b55e6efd 100755
--- a/scripts/launch.sh
+++ b/scripts/launch.sh
@@ -50,6 +50,7 @@ gnome-terminal --tab --title='RW 1 Sim' -- $SIM_BIN/nos3-single-simula
gnome-terminal --tab --title='RW 2 Sim' -- $SIM_BIN/nos3-single-simulator generic-reactionwheel-sim2
gnome-terminal --tab --title='Sample Sim' -- $SIM_BIN/nos3-single-simulator sample_sim
gnome-terminal --tab --title='Torquer Sim' -- $SIM_BIN/nos3-single-simulator generic_torquer_sim
+gnome-terminal --tab --title='Thruster Sim' -- $SIM_BIN/nos3-single-simulator generic_thruster_sim
gnome-terminal --tab --title="NOS Time Driver" -- $SIM_BIN/nos3-single-simulator time
gnome-terminal --tab --title="SYNOPSIS Sim" -- $SIM_BIN/nos3-single-simulator synopsis
diff --git a/scripts/prepare.sh b/scripts/prepare.sh
index 9356464c..49b30ee3 100755
--- a/scripts/prepare.sh
+++ b/scripts/prepare.sh
@@ -49,9 +49,26 @@ $DFLAGS_CPUS -v $BASE_DIR:$BASE_DIR -v $USER_NOS3_DIR:$USER_NOS3_DIR -w $USER_NO
echo ""
echo ""
-echo "Prepare Igniter..."
+echo "NOS3 required preparations complete!"
+echo "Proceeding to optional additions."
+echo ""
+echo ""
+
+echo "Prepare Igniter (optional)..."
pip3 install pyside6 xmltodict
cd $BASE_DIR
python3 $BASE_DIR/cfg/gui/cfg_gui_main.py &
echo ""
echo ""
+
+sleep 3
+echo ""
+echo ""
+
+echo "NOS3 prep script complete:"
+echo " Some above optional installations may have failed, that's ok. You just may not have those extra features."
+echo " You can choose to use the Igniter GUI or close it in favor of the command line."
+echo " To launch igniter again simply run the following in the terminal:"
+echo " make igniter"
+echo ""
+echo ""