diff --git a/.run/CFDP Test File Large.run.xml b/.run/CFDP Test File Large.run.xml
index 8d2c4d2..786655d 100644
--- a/.run/CFDP Test File Large.run.xml
+++ b/.run/CFDP Test File Large.run.xml
@@ -13,7 +13,7 @@
-
+
diff --git a/.run/CFDP Test File Small Closure.run.xml b/.run/CFDP Test File Small Closure.run.xml
new file mode 100644
index 0000000..fb6afde
--- /dev/null
+++ b/.run/CFDP Test File Small Closure.run.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 343875d..f726426 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -15,15 +15,20 @@ list yields a list of all related PRs for each release.
- added ACS action cmds
- added new ACS hk values
-## Ficed
+## Fixed
+- Correction for ACS CTRL raw data requests HK type
- fixed diag related ACS hk cmds
+# [v2.16.1] 2023-02-24
+
+- Updated CSVs for new persistent TM store
+
# [v2.16.0] 2023-02-23
## Added
-- PDEC parameter commands to change size of positive and negative window of AD frames-
+- PDEC parameter commands to change size of positive and negative window of AD frames.
## Fixed
diff --git a/eive_tmtc/__init__.py b/eive_tmtc/__init__.py
index ef2c5df..c7f5f87 100644
--- a/eive_tmtc/__init__.py
+++ b/eive_tmtc/__init__.py
@@ -1,4 +1,4 @@
-__version__ = "2.16.0"
+__version__ = "2.16.1"
import logging
from pathlib import Path
@@ -6,7 +6,7 @@ from pathlib import Path
SW_NAME = "eive-tmtc"
VERSION_MAJOR = 2
VERSION_MINOR = 16
-VERSION_REVISION = 0
+VERSION_REVISION = 1
EIVE_TMTC_ROOT = Path(__file__).parent
PACKAGE_ROOT = EIVE_TMTC_ROOT.parent
diff --git a/eive_tmtc/config/events.csv b/eive_tmtc/config/events.csv
index 4542daa..6d26ed5 100644
--- a/eive_tmtc/config/events.csv
+++ b/eive_tmtc/config/events.csv
@@ -84,6 +84,8 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path
10800;0x2a30;STORE_ERROR;LOW;No description;fsfw/src/fsfw/cfdp/handler/defs.h
10801;0x2a31;MSG_QUEUE_ERROR;LOW;No description;fsfw/src/fsfw/cfdp/handler/defs.h
10802;0x2a32;SERIALIZATION_ERROR;LOW;No description;fsfw/src/fsfw/cfdp/handler/defs.h
+10803;0x2a33;FILESTORE_ERROR;LOW;No description;fsfw/src/fsfw/cfdp/handler/defs.h
+10804;0x2a34;FILENAME_TOO_LARGE_ERROR;LOW;P1: Transaction step ID, P2: 0 for source file name, 1 for dest file name;fsfw/src/fsfw/cfdp/handler/defs.h
11200;0x2bc0;SAFE_RATE_VIOLATION;MEDIUM;No description;mission/acsDefs.h
11201;0x2bc1;SAFE_RATE_RECOVERY;MEDIUM;No description;mission/acsDefs.h
11202;0x2bc2;MULTIPLE_RW_INVALID;HIGH;No description;mission/acsDefs.h
@@ -252,10 +254,11 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path
14004;0x36b4;NO_SD_CARD_ACTIVE;HIGH;No SD card was active. Core controller will attempt to re-initialize a SD card.;bsp_q7s/core/CoreController.h
14005;0x36b5;VERSION_INFO;INFO;P1: Byte 0: Major, Byte 1: Minor, Byte 2: Patch, Byte 3: Has Git Hash P2: First four letters of Git SHA is the last byte of P1 is set.;bsp_q7s/core/CoreController.h
14006;0x36b6;CURRENT_IMAGE_INFO;INFO;P1: Current Chip, P2: Current Copy;bsp_q7s/core/CoreController.h
-14100;0x3714;NO_VALID_SENSOR_TEMPERATURE;MEDIUM;No description;mission/controller/ThermalController.h
-14101;0x3715;NO_HEALTHY_HEATER_AVAILABLE;MEDIUM;No description;mission/controller/ThermalController.h
-14102;0x3716;SYRLINKS_OVERHEATING;HIGH;No description;mission/controller/ThermalController.h
-14103;0x3717;PLOC_OVERHEATING;HIGH;No description;mission/controller/ThermalController.h
-14104;0x3718;OBC_OVERHEATING;HIGH;No description;mission/controller/ThermalController.h
-14105;0x3719;HPA_OVERHEATING;HIGH;No description;mission/controller/ThermalController.h
-14106;0x371a;PLPCDU_OVERHEATING;HIGH;No description;mission/controller/ThermalController.h
+14100;0x3714;POSSIBLE_FILE_CORRUPTION;LOW;P1: Result code of TM packet parser. P2: Timestamp of possibly corrupt file as a unix timestamp.;mission/tmtc/PersistentTmStore.h
+14200;0x3778;NO_VALID_SENSOR_TEMPERATURE;MEDIUM;No description;mission/controller/ThermalController.h
+14201;0x3779;NO_HEALTHY_HEATER_AVAILABLE;MEDIUM;No description;mission/controller/ThermalController.h
+14202;0x377a;SYRLINKS_OVERHEATING;HIGH;No description;mission/controller/ThermalController.h
+14203;0x377b;PLOC_OVERHEATING;HIGH;No description;mission/controller/ThermalController.h
+14204;0x377c;OBC_OVERHEATING;HIGH;No description;mission/controller/ThermalController.h
+14205;0x377d;HPA_OVERHEATING;HIGH;No description;mission/controller/ThermalController.h
+14206;0x377e;PLPCDU_OVERHEATING;HIGH;No description;mission/controller/ThermalController.h
diff --git a/eive_tmtc/config/objects.csv b/eive_tmtc/config/objects.csv
index 91e3a50..2bc03e8 100644
--- a/eive_tmtc/config/objects.csv
+++ b/eive_tmtc/config/objects.csv
@@ -102,6 +102,7 @@
0x53000008;PUS_SERVICE_8_FUNCTION_MGMT
0x53000009;PUS_SERVICE_9_TIME_MGMT
0x53000011;PUS_SERVICE_11_TC_SCHEDULER
+0x53000015;PUS_SERVICE_15_TM_STORAGE
0x53000017;PUS_SERVICE_17_TEST
0x53000020;PUS_SERVICE_20_PARAMETERS
0x53000200;PUS_SERVICE_200_MODE_MGMT
@@ -148,6 +149,11 @@
0x73010002;PL_SUBSYSTEM
0x73010003;TCS_SUBSYSTEM
0x73010004;COM_SUBSYSTEM
+0x73020001;MISC_TM_STORE
+0x73020002;OK_TM_STORE
+0x73020003;NOT_OK_TM_STORE
+0x73020004;HK_TM_STORE
+0x73030000;CFDP_TM_STORE
0x73500000;CCSDS_IP_CORE_BRIDGE
0x90000003;THERMAL_TEMP_INSERTER
0xFFFFFFFF;NO_OBJECT
diff --git a/eive_tmtc/config/returnvalues.csv b/eive_tmtc/config/returnvalues.csv
index 6f215a9..4abc2ff 100644
--- a/eive_tmtc/config/returnvalues.csv
+++ b/eive_tmtc/config/returnvalues.csv
@@ -49,16 +49,17 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path
0x4fa4;HEATER_MainSwitchSetTimeout;No description;164;HEATER_HANDLER;mission/devices/HeaterHandler.h
0x4fa5;HEATER_CommandAlreadyWaiting;No description;165;HEATER_HANDLER;mission/devices/HeaterHandler.h
0x60a0;CCSDS_CommandNotImplemented;Received action message with unknown action id;160;CCSDS_HANDLER;mission/tmtc/CcsdsIpCoreHandler.h
-0x6a01;ACSSAF_SafectrlMekfInputInvalid;No description;1;ACS_SAFE;mission/controller/acs/control/SafeCtrl.h
-0x6b01;ACSPTG_PtgctrlMekfInputInvalid;No description;1;ACS_PTG;mission/controller/acs/control/PtgCtrl.h
-0x6c01;ACSDTB_DetumbleNoSensordata;No description;1;ACS_DETUMBLE;mission/controller/acs/control/Detumble.h
-0x6902;ACSKAL_KalmanUninitialized;No description;2;ACS_KALMAN;mission/controller/acs/MultiplicativeKalmanFilter.h
-0x6903;ACSKAL_KalmanNoGyrData;No description;3;ACS_KALMAN;mission/controller/acs/MultiplicativeKalmanFilter.h
-0x6904;ACSKAL_KalmanNoModelVectors;No description;4;ACS_KALMAN;mission/controller/acs/MultiplicativeKalmanFilter.h
-0x6905;ACSKAL_KalmanNoSusMgmStrData;No description;5;ACS_KALMAN;mission/controller/acs/MultiplicativeKalmanFilter.h
-0x6906;ACSKAL_KalmanCovarianceInversionFailed;No description;6;ACS_KALMAN;mission/controller/acs/MultiplicativeKalmanFilter.h
-0x6907;ACSKAL_KalmanInitialized;No description;7;ACS_KALMAN;mission/controller/acs/MultiplicativeKalmanFilter.h
-0x6908;ACSKAL_KalmanRunning;No description;8;ACS_KALMAN;mission/controller/acs/MultiplicativeKalmanFilter.h
+0x6b01;ACSSAF_SafectrlMekfInputInvalid;No description;1;ACS_SAFE;mission/controller/acs/control/SafeCtrl.h
+0x6c01;ACSPTG_PtgctrlMekfInputInvalid;No description;1;ACS_PTG;mission/controller/acs/control/PtgCtrl.h
+0x6d01;ACSDTB_DetumbleNoSensordata;No description;1;ACS_DETUMBLE;mission/controller/acs/control/Detumble.h
+0x6a02;ACSMEKF_MekfUninitialized;No description;2;ACS_MEKF;mission/controller/acs/MultiplicativeKalmanFilter.h
+0x6a03;ACSMEKF_MekfNoGyrData;No description;3;ACS_MEKF;mission/controller/acs/MultiplicativeKalmanFilter.h
+0x6a04;ACSMEKF_MekfNoModelVectors;No description;4;ACS_MEKF;mission/controller/acs/MultiplicativeKalmanFilter.h
+0x6a05;ACSMEKF_MekfNoSusMgmStrData;No description;5;ACS_MEKF;mission/controller/acs/MultiplicativeKalmanFilter.h
+0x6a06;ACSMEKF_MekfCovarianceInversionFailed;No description;6;ACS_MEKF;mission/controller/acs/MultiplicativeKalmanFilter.h
+0x6a07;ACSMEKF_MekfInitialized;No description;7;ACS_MEKF;mission/controller/acs/MultiplicativeKalmanFilter.h
+0x6a08;ACSMEKF_MekfRunning;No description;8;ACS_MEKF;mission/controller/acs/MultiplicativeKalmanFilter.h
+0x6900;ACSCTRL_FileDeletionFailed;No description;0;ACS_CTRL;mission/controller/AcsController.h
0x4500;HSPI_OpeningFileFailed;No description;0;HAL_SPI;fsfw/src/fsfw_hal/linux/spi/SpiComIF.h
0x4501;HSPI_FullDuplexTransferFailed;No description;1;HAL_SPI;fsfw/src/fsfw_hal/linux/spi/SpiComIF.h
0x4502;HSPI_HalfDuplexTransferFailed;No description;2;HAL_SPI;fsfw/src/fsfw_hal/linux/spi/SpiComIF.h
diff --git a/eive_tmtc/tmtc/acs/gyros.py b/eive_tmtc/tmtc/acs/gyros.py
index 9ac60e0..612b37b 100644
--- a/eive_tmtc/tmtc/acs/gyros.py
+++ b/eive_tmtc/tmtc/acs/gyros.py
@@ -5,6 +5,7 @@ import struct
from tmtccmd.tc import DefaultPusQueueHelper
import eive_tmtc.config.object_ids as obj_ids
+from tmtccmd.tc.pus_200_fsfw_mode import create_mode_command, Mode
from tmtccmd.tc.pus_3_fsfw_hk import create_request_one_hk_command, make_sid
from tmtccmd.config.tmtc import (
tmtc_definitions_provider,
@@ -25,6 +26,8 @@ from tmtccmd.util.tmtc_printer import FsfwTmTcPrinter
class OpCode:
+ NML = "normal"
+ OFF = "off"
CORE_HK = "core_hk"
CFG_HK = "cfg_hk"
@@ -66,7 +69,13 @@ def handle_gyr_cmd(q: DefaultPusQueueHelper, op_code: str):
core_hk_id = AdisGyroSetId.CORE_HK
else:
core_hk_id = L3gGyroSetId.CORE_HK
- if op_code == OpCode.CORE_HK:
+ if op_code == OpCode.NML:
+ q.add_log_cmd(f"Gyro {gyr_info[0]} NORMAL mode")
+ q.add_pus_tc(create_mode_command(gyr_obj_id, Mode.NORMAL, 0))
+ if op_code == OpCode.OFF:
+ q.add_log_cmd(f"Gyro {gyr_info[0]} OFF mode")
+ q.add_pus_tc(create_mode_command(gyr_obj_id, Mode.OFF, 0))
+ elif op_code == OpCode.CORE_HK:
q.add_log_cmd(f"Gyro {gyr_info[0]} Core HK")
q.add_pus_tc(create_request_one_hk_command(make_sid(gyr_obj_id, core_hk_id)))
elif op_code == OpCode.CFG_HK:
@@ -166,4 +175,6 @@ def add_gyr_cmd_defs(defs: TmtcDefinitionWrapper):
oce = OpCodeEntry()
oce.add(keys=OpCode.CORE_HK, info="Request Core HK")
oce.add(keys=OpCode.CFG_HK, info="Request CFG HK")
+ oce.add(keys=OpCode.NML, info="Normal Mode")
+ oce.add(keys=OpCode.OFF, info="Off Mode")
defs.add_service(CustomServiceList.GYRO, info="Gyro", op_code_entry=oce)
diff --git a/eive_tmtc/tmtc/tm_store.py b/eive_tmtc/tmtc/tm_store.py
index e58221a..c0ab6e4 100644
--- a/eive_tmtc/tmtc/tm_store.py
+++ b/eive_tmtc/tmtc/tm_store.py
@@ -45,15 +45,12 @@ def pack_tm_store_commands(p: ServiceProviderParams):
if o == OpCode.DELETE_UP_TO:
obj_id, store_string = store_select_prompt()
app_data = bytearray(obj_id.as_bytes)
- delete_up_to_time = time_prompt()
+ delete_up_to_time = time_prompt("Determining deletion end time")
end_stamp = int(math.floor(delete_up_to_time.timestamp()))
app_data.extend(struct.pack("!I", end_stamp))
q.add_log_cmd(Info.DELETE_UP_TO)
q.add_log_cmd(f"Selected Store: {obj_id}")
- q.add_log_cmd(
- f"Deletion up to time "
- f"{datetime.datetime.fromtimestamp(end_stamp, tz=datetime.timezone.utc)}"
- )
+ q.add_log_cmd(f"Deletion up to time {delete_up_to_time}")
q.add_pus_tc(
PusTelecommand(
service=15, subservice=Subservice.DELETE_UP_TO, app_data=app_data
@@ -61,7 +58,26 @@ def pack_tm_store_commands(p: ServiceProviderParams):
)
elif o == OpCode.RETRIEVAL_BY_TIME_RANGE:
q.add_log_cmd(Info.RETRIEVAL_BY_TIME_RANGE)
- pass
+ obj_id, store_string = store_select_prompt()
+ app_data = bytearray(obj_id.as_bytes)
+ start_of_dump_time = time_prompt("Determining retrieval start time")
+ start_stamp = int(math.floor(start_of_dump_time.timestamp()))
+ end_of_dump_time = time_prompt("Determining retrieval end time")
+ end_stamp = int(math.floor(end_of_dump_time.timestamp()))
+ app_data.extend(struct.pack("!I", start_stamp))
+ app_data.extend(struct.pack("!I", end_stamp))
+ q.add_log_cmd(Info.RETRIEVAL_BY_TIME_RANGE)
+ q.add_log_cmd(f"Selected Store: {obj_id}")
+ q.add_log_cmd(
+ f"Retrieval from time {start_of_dump_time} up to time {end_of_dump_time}"
+ )
+ q.add_pus_tc(
+ PusTelecommand(
+ service=15,
+ subservice=Subservice.RETRIEVAL_BY_TIME_RANGE,
+ app_data=app_data,
+ )
+ )
@tmtc_definitions_provider
@@ -100,8 +116,8 @@ TIME_INPUT_DICT = {
}
-def time_prompt() -> datetime.datetime:
- print("Available time input types: ")
+def time_prompt(info_str: str) -> datetime.datetime:
+ print(f"{info_str}. Available time input types: ")
for k, v in TIME_INPUT_DICT.items():
print(f" {k}: {v}")
while True:
@@ -146,7 +162,6 @@ def time_prompt_offset_from_now() -> datetime.datetime:
def store_select_prompt() -> (ObjectIdU32, str):
obj_id_dict = get_object_ids()
print("Available TM stores:")
- idx_to_obj_id = dict()
for k, v in STORE_DICT.items():
print(f" {k}: {v[1]}")
while True:
diff --git a/filetest/eive-sw-update.tar.xz b/filetest/eive-sw-update.tar.xz
new file mode 100644
index 0000000..6ca7542
Binary files /dev/null and b/filetest/eive-sw-update.tar.xz differ
diff --git a/tmtcc.py b/tmtcc.py
index 7cafaaf..8dc3019 100755
--- a/tmtcc.py
+++ b/tmtcc.py
@@ -371,7 +371,7 @@ def setup_cfdp_handler() -> CfdpInCcsdsWrapper:
remote_cfg = RemoteEntityCfg(
closure_requested=False,
entity_id=CFDP_REMOTE_ENTITY_ID,
- max_file_segment_len=1024,
+ max_file_segment_len=990,
check_limit=None,
crc_on_transmission=False,
crc_type=ChecksumType.CRC_32,