diff --git a/.gitignore b/.gitignore index 9e397a4..0133303 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,4 @@ log /scex_conf.json /tmtc_conf.json -/seqcnt.txt +/seqcnt*.txt diff --git a/.run/CFDP Help.run.xml b/.run/CFDP Help.run.xml new file mode 100644 index 0000000..bedf213 --- /dev/null +++ b/.run/CFDP Help.run.xml @@ -0,0 +1,24 @@ + + + + + \ No newline at end of file diff --git a/.run/CFDP Test File Large.run.xml b/.run/CFDP Test File Large.run.xml new file mode 100644 index 0000000..8d2c4d2 --- /dev/null +++ b/.run/CFDP Test File Large.run.xml @@ -0,0 +1,24 @@ + + + + + \ No newline at end of file diff --git a/.run/CFDP Test File Small.run.xml b/.run/CFDP Test File Small.run.xml new file mode 100644 index 0000000..a3d3079 --- /dev/null +++ b/.run/CFDP Test File Small.run.xml @@ -0,0 +1,24 @@ + + + + + \ No newline at end of file diff --git a/.run/OBSW Switch to Both SDs.run.xml b/.run/OBSW Switch to Both SDs.run.xml new file mode 100644 index 0000000..4ea5335 --- /dev/null +++ b/.run/OBSW Switch to Both SDs.run.xml @@ -0,0 +1,24 @@ + + + + + \ No newline at end of file diff --git a/.run/OBSW Switch to SD 0.run.xml b/.run/OBSW Switch to SD 0.run.xml new file mode 100644 index 0000000..9a05d45 --- /dev/null +++ b/.run/OBSW Switch to SD 0.run.xml @@ -0,0 +1,24 @@ + + + + + \ No newline at end of file diff --git a/.run/OBSW Switch to SD 1.run.xml b/.run/OBSW Switch to SD 1.run.xml new file mode 100644 index 0000000..6fb2e13 --- /dev/null +++ b/.run/OBSW Switch to SD 1.run.xml @@ -0,0 +1,24 @@ + + + + + \ No newline at end of file diff --git a/.run/OBSW Update from SD 0.run.xml b/.run/OBSW Update from SD 0.run.xml new file mode 100644 index 0000000..ec2cf39 --- /dev/null +++ b/.run/OBSW Update from SD 0.run.xml @@ -0,0 +1,24 @@ + + + + + \ No newline at end of file diff --git a/.run/OBSW Update from SD 1.run.xml b/.run/OBSW Update from SD 1.run.xml new file mode 100644 index 0000000..4392ea7 --- /dev/null +++ b/.run/OBSW Update from SD 1.run.xml @@ -0,0 +1,24 @@ + + + + + \ No newline at end of file diff --git a/.run/OBSW Update from tmp.run.xml b/.run/OBSW Update from tmp.run.xml new file mode 100644 index 0000000..744b032 --- /dev/null +++ b/.run/OBSW Update from tmp.run.xml @@ -0,0 +1,24 @@ + + + + + \ No newline at end of file diff --git a/.run/Transfer OBSW CFDP.run.xml b/.run/Transfer OBSW CFDP.run.xml new file mode 100644 index 0000000..f9ee452 --- /dev/null +++ b/.run/Transfer OBSW CFDP.run.xml @@ -0,0 +1,24 @@ + + + + + \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index a6bc0e4..26e4fbb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,8 @@ list yields a list of all related PRs for each release. # [v1.13.0] +- CFDP integration + PR: https://egit.irs.uni-stuttgart.de/eive/eive-tmtc/pulls/113 - Major Update for `tmtccmd` and `spacepackets` dependencies which improves user API significantly. PR: https://egit.irs.uni-stuttgart.de/eive/eive-tmtc/pulls/102 - Add commands to request MGM HK or enable/disable periodic HK for it diff --git a/config/definitions.py b/config/definitions.py index 8e2c76e..4cec9cf 100644 --- a/config/definitions.py +++ b/config/definitions.py @@ -6,9 +6,14 @@ import enum +from spacepackets.util import UnsignedByteField PUS_APID = 0x65 SPACE_PACKET_IDS = (0x08 << 8 | PUS_APID,) +CFDP_APID = 0x66 + +CFDP_LOCAL_ENTITY_ID = UnsignedByteField(byte_len=2, val=1) +CFDP_REMOTE_ENTITY_ID = UnsignedByteField(byte_len=2, val=CFDP_APID) class CustomServiceList(str, enum.Enum): diff --git a/config/events.csv b/config/events.csv index a38aa4e..17361eb 100644 --- a/config/events.csv +++ b/config/events.csv @@ -69,6 +69,7 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path 7510;0x1d56;TRYING_RECOVERY;MEDIUM;;fsfw/src/fsfw/health/HasHealthIF.h 7511;0x1d57;RECOVERY_STEP;MEDIUM;;fsfw/src/fsfw/health/HasHealthIF.h 7512;0x1d58;RECOVERY_DONE;MEDIUM;;fsfw/src/fsfw/health/HasHealthIF.h +7600;0x1db0;HANDLE_PACKET_FAILED;LOW;;fsfw/src/fsfw/tcdistribution/definitions.h 7900;0x1edc;RF_AVAILABLE;INFO;A RF available signal was detected. P1: raw RFA state, P2: 0;fsfw/src/fsfw/datalinklayer/DataLinkLayer.h 7901;0x1edd;RF_LOST;INFO;A previously found RF available signal was lost. P1: raw RFA state, P2: 0;fsfw/src/fsfw/datalinklayer/DataLinkLayer.h 7902;0x1ede;BIT_LOCK;INFO;A Bit Lock signal. Was detected. P1: raw BLO state, P2: 0;fsfw/src/fsfw/datalinklayer/DataLinkLayer.h @@ -119,8 +120,8 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path 12003;0x2ee3;SUPV_EXE_FAILURE;LOW;PLOC received execution failure report P1: ID of command for which the execution failed P2: Status code sent by the supervisor handler;linux/devices/ploc/PlocSupervisorHandler.h 12004;0x2ee4;SUPV_CRC_FAILURE_EVENT;LOW;PLOC supervisor reply has invalid crc;linux/devices/ploc/PlocSupervisorHandler.h 12005;0x2ee5;SUPV_MPSOC_SHUWDOWN_BUILD_FAILED;LOW;Failed to build the command to shutdown the MPSoC;linux/devices/ploc/PlocSupervisorHandler.h -12100;0x2f44;SANITIZATION_FAILED;LOW;;bsp_q7s/memory/SdCardManager.h -12101;0x2f45;MOUNTED_SD_CARD;INFO;;bsp_q7s/memory/SdCardManager.h +12100;0x2f44;SANITIZATION_FAILED;LOW;;bsp_q7s/fs/SdCardManager.h +12101;0x2f45;MOUNTED_SD_CARD;INFO;;bsp_q7s/fs/SdCardManager.h 12300;0x300c;SEND_MRAM_DUMP_FAILED;LOW;Failed to send mram dump command to supervisor handler P1: Return value of commandAction function P2: Start address of MRAM to dump with this command;linux/devices/ploc/PlocMemoryDumper.h 12301;0x300d;MRAM_DUMP_FAILED;LOW;Received completion failure report form PLOC supervisor handler P1: MRAM start address of failing dump command;linux/devices/ploc/PlocMemoryDumper.h 12302;0x300e;MRAM_DUMP_FINISHED;LOW;MRAM dump finished successfully;linux/devices/ploc/PlocMemoryDumper.h @@ -215,6 +216,3 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path 13701;0x3585;REBOOT_SW;MEDIUM; Software reboot occurred. Can also be a systemd reboot. P1: Current Chip, P2: Current Copy;bsp_q7s/core/CoreController.h 13702;0x3586;REBOOT_MECHANISM_TRIGGERED;MEDIUM;The reboot mechanism was triggered. P1: First 16 bits: Last Chip, Last 16 bits: Last Copy, P2: Each byte is the respective reboot count for the slots;bsp_q7s/core/CoreController.h 13703;0x3587;REBOOT_HW;MEDIUM;;bsp_q7s/core/CoreController.h -13800;0x35e8;MISSING_PACKET;LOW;;mission/devices/devicedefinitions/ScexDefinitions.h -13801;0x35e9;EXPERIMENT_TIMEDOUT;LOW;;mission/devices/devicedefinitions/ScexDefinitions.h -13802;0x35ea;MULTI_PACKET_COMMAND_DONE;INFO;;mission/devices/devicedefinitions/ScexDefinitions.h diff --git a/config/hook.py b/config/hook.py index ca16430..1e73b2a 100644 --- a/config/hook.py +++ b/config/hook.py @@ -25,7 +25,7 @@ class EiveHookObject(TmTcCfgHookBase): cfg = create_com_interface_cfg_default( com_if_key=com_if_key, - json_cfg_path=self.json_cfg_path, + json_cfg_path=self.cfg_path, space_packet_ids=SPACE_PACKET_IDS, ) return create_com_interface_default(cfg) diff --git a/config/objects.csv b/config/objects.csv index 04f3910..924ae0a 100644 --- a/config/objects.csv +++ b/config/objects.csv @@ -46,7 +46,6 @@ 0x44330015;PLOC_MPSOC_HANDLER 0x44330016;PLOC_SUPERVISOR_HANDLER 0x44330017;PLOC_SUPERVISOR_HELPER -0x44330032;SCEX 0x444100A2;SOLAR_ARRAY_DEPL_HANDLER 0x444100A4;HEATER_HANDLER 0x44420004;TMP1075_HANDLER_1 @@ -70,7 +69,6 @@ 0x445300A3;SYRLINKS_HK_HANDLER 0x49000000;ARDUINO_COM_IF 0x49010005;GPIO_IF -0x49010006;SCEX_UART_READER 0x49020004;SPI_MAIN_COM_IF 0x49020005;SPI_RW_COM_IF 0x49020006;SPI_RTD_COM_IF @@ -130,6 +128,8 @@ 0x73000002;SUS_BOARD_ASS 0x73000003;TCS_BOARD_ASS 0x73000004;RW_ASS +0x73000005;CFDP_HANDLER +0x73000006;CFDP_DISTRIBUTOR 0x73000100;TM_FUNNEL 0x73500000;CCSDS_IP_CORE_BRIDGE 0xFFFFFFFF;NO_OBJECT diff --git a/config/returnvalues.csv b/config/returnvalues.csv index 7a1e52f..f464a43 100644 --- a/config/returnvalues.csv +++ b/config/returnvalues.csv @@ -89,17 +89,6 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path 0x06e2;PP_InvalidContent;;226;HAS_MEMORY_IF;fsfw/src/fsfw/memory/HasMemoryIF.h 0x06e3;PP_UnalignedAccess;;227;HAS_MEMORY_IF;fsfw/src/fsfw/memory/HasMemoryIF.h 0x06e4;PP_WriteProtected;;228;HAS_MEMORY_IF;fsfw/src/fsfw/memory/HasMemoryIF.h -0x4300;FILS_GenericFileError;;0;FILE_SYSTEM;fsfw/src/fsfw/memory/HasFileSystemIF.h -0x4301;FILS_IsBusy;;1;FILE_SYSTEM;fsfw/src/fsfw/memory/HasFileSystemIF.h -0x4302;FILS_InvalidParameters;;2;FILE_SYSTEM;fsfw/src/fsfw/memory/HasFileSystemIF.h -0x4305;FILS_FileDoesNotExist;;5;FILE_SYSTEM;fsfw/src/fsfw/memory/HasFileSystemIF.h -0x4306;FILS_FileAlreadyExists;;6;FILE_SYSTEM;fsfw/src/fsfw/memory/HasFileSystemIF.h -0x4307;FILS_FileLocked;;7;FILE_SYSTEM;fsfw/src/fsfw/memory/HasFileSystemIF.h -0x430a;FILS_DirectoryDoesNotExist;;10;FILE_SYSTEM;fsfw/src/fsfw/memory/HasFileSystemIF.h -0x430b;FILS_DirectoryAlreadyExists;;11;FILE_SYSTEM;fsfw/src/fsfw/memory/HasFileSystemIF.h -0x430c;FILS_DirectoryNotEmpty;;12;FILE_SYSTEM;fsfw/src/fsfw/memory/HasFileSystemIF.h -0x430f;FILS_SequencePacketMissingWrite;;15;FILE_SYSTEM;fsfw/src/fsfw/memory/HasFileSystemIF.h -0x4310;FILS_SequencePacketMissingRead;;16;FILE_SYSTEM;fsfw/src/fsfw/memory/HasFileSystemIF.h 0x13e0;MH_UnknownCmd;;224;MEMORY_HELPER;fsfw/src/fsfw/memory/MemoryHelper.h 0x13e1;MH_InvalidAddress;;225;MEMORY_HELPER;fsfw/src/fsfw/memory/MemoryHelper.h 0x13e2;MH_InvalidSize;;226;MEMORY_HELPER;fsfw/src/fsfw/memory/MemoryHelper.h @@ -215,19 +204,20 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path 0x0804;DPS_DataSetUninitialised;;4;DATA_SET_CLASS;fsfw/src/fsfw/datapool/DataSetIF.h 0x0805;DPS_DataSetFull;;5;DATA_SET_CLASS;fsfw/src/fsfw/datapool/DataSetIF.h 0x0806;DPS_PoolVarNull;;6;DATA_SET_CLASS;fsfw/src/fsfw/datapool/DataSetIF.h -0x1c01;TCD_PacketLost;;1;PACKET_DISTRIBUTION;fsfw/src/fsfw/tcdistribution/TcDistributor.h -0x1c02;TCD_DestinationNotFound;;2;PACKET_DISTRIBUTION;fsfw/src/fsfw/tcdistribution/TcDistributor.h -0x1c03;TCD_ServiceIdAlreadyExists;;3;PACKET_DISTRIBUTION;fsfw/src/fsfw/tcdistribution/TcDistributor.h -0x1b00;TCC_InvalidCcsdsVersion;;0;PACKET_CHECK;fsfw/src/fsfw/tcdistribution/definitions.h -0x1b01;TCC_InvalidApid;;1;PACKET_CHECK;fsfw/src/fsfw/tcdistribution/definitions.h -0x1b02;TCC_InvalidPacketType;;2;PACKET_CHECK;fsfw/src/fsfw/tcdistribution/definitions.h -0x1b03;TCC_InvalidSecHeaderField;;3;PACKET_CHECK;fsfw/src/fsfw/tcdistribution/definitions.h -0x1b04;TCC_IncorrectPrimaryHeader;;4;PACKET_CHECK;fsfw/src/fsfw/tcdistribution/definitions.h -0x1b05;TCC_IncompletePacket;;5;PACKET_CHECK;fsfw/src/fsfw/tcdistribution/definitions.h -0x1b06;TCC_InvalidPusVersion;;6;PACKET_CHECK;fsfw/src/fsfw/tcdistribution/definitions.h -0x1b07;TCC_IncorrectChecksum;;7;PACKET_CHECK;fsfw/src/fsfw/tcdistribution/definitions.h -0x1b08;TCC_IllegalPacketSubtype;;8;PACKET_CHECK;fsfw/src/fsfw/tcdistribution/definitions.h -0x1b09;TCC_IncorrectSecondaryHeader;;9;PACKET_CHECK;fsfw/src/fsfw/tcdistribution/definitions.h +0x1c01;TCD_PacketLost;;1;PACKET_DISTRIBUTION;fsfw/src/fsfw/tcdistribution/TcDistributorBase.h +0x1c02;TCD_DestinationNotFound;;2;PACKET_DISTRIBUTION;fsfw/src/fsfw/tcdistribution/TcDistributorBase.h +0x1c03;TCD_ServiceIdAlreadyExists;;3;PACKET_DISTRIBUTION;fsfw/src/fsfw/tcdistribution/TcDistributorBase.h +0x1b00;TCC_NoDestinationFound;;0;TMTC_DISTRIBUTION;fsfw/src/fsfw/tcdistribution/definitions.h +0x1b01;TCC_InvalidCcsdsVersion;;1;TMTC_DISTRIBUTION;fsfw/src/fsfw/tcdistribution/definitions.h +0x1b02;TCC_InvalidApid;;2;TMTC_DISTRIBUTION;fsfw/src/fsfw/tcdistribution/definitions.h +0x1b03;TCC_InvalidPacketType;;3;TMTC_DISTRIBUTION;fsfw/src/fsfw/tcdistribution/definitions.h +0x1b04;TCC_InvalidSecHeaderField;;4;TMTC_DISTRIBUTION;fsfw/src/fsfw/tcdistribution/definitions.h +0x1b05;TCC_IncorrectPrimaryHeader;;5;TMTC_DISTRIBUTION;fsfw/src/fsfw/tcdistribution/definitions.h +0x1b07;TCC_IncompletePacket;;7;TMTC_DISTRIBUTION;fsfw/src/fsfw/tcdistribution/definitions.h +0x1b08;TCC_InvalidPusVersion;;8;TMTC_DISTRIBUTION;fsfw/src/fsfw/tcdistribution/definitions.h +0x1b09;TCC_IncorrectChecksum;;9;TMTC_DISTRIBUTION;fsfw/src/fsfw/tcdistribution/definitions.h +0x1b0a;TCC_IllegalPacketSubtype;;10;TMTC_DISTRIBUTION;fsfw/src/fsfw/tcdistribution/definitions.h +0x1b0b;TCC_IncorrectSecondaryHeader;;11;TMTC_DISTRIBUTION;fsfw/src/fsfw/tcdistribution/definitions.h 0x3001;POS_InPowerTransition;;1;POWER_SWITCHER;fsfw/src/fsfw/power/PowerSwitcher.h 0x3002;POS_SwitchStateMismatch;;2;POWER_SWITCHER;fsfw/src/fsfw/power/PowerSwitcher.h 0x0501;PS_SwitchOn;;1;POWER_SWITCH_IF;fsfw/src/fsfw/power/PowerSwitchIF.h @@ -324,13 +314,31 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path 0x31e3;LIM_WrongLimitId;;227;LIMITS_IF;fsfw/src/fsfw/monitoring/MonitoringIF.h 0x31ee;LIM_MonitorNotFound;;238;LIMITS_IF;fsfw/src/fsfw/monitoring/MonitoringIF.h 0x3601;CFDP_InvalidTlvType;;1;CFDP;fsfw/src/fsfw/cfdp/definitions.h -0x3602;CFDP_InvalidDirectiveFields;;2;CFDP;fsfw/src/fsfw/cfdp/definitions.h +0x3602;CFDP_InvalidDirectiveField;;2;CFDP;fsfw/src/fsfw/cfdp/definitions.h 0x3603;CFDP_InvalidPduDatafieldLen;;3;CFDP;fsfw/src/fsfw/cfdp/definitions.h 0x3604;CFDP_InvalidAckDirectiveFields;;4;CFDP;fsfw/src/fsfw/cfdp/definitions.h 0x3605;CFDP_MetadataCantParseOptions;;5;CFDP;fsfw/src/fsfw/cfdp/definitions.h -0x3606;CFDP_FinishedCantParseFsResponses;;6;CFDP;fsfw/src/fsfw/cfdp/definitions.h +0x3606;CFDP_NakCantParseOptions;;6;CFDP;fsfw/src/fsfw/cfdp/definitions.h +0x3607;CFDP_FinishedCantParseFsResponses;;7;CFDP;fsfw/src/fsfw/cfdp/definitions.h 0x3608;CFDP_FilestoreRequiresSecondFile;;8;CFDP;fsfw/src/fsfw/cfdp/definitions.h 0x3609;CFDP_FilestoreResponseCantParseFsMessage;;9;CFDP;fsfw/src/fsfw/cfdp/definitions.h +0x360a;CFDP_InvalidPduFormat;;10;CFDP;fsfw/src/fsfw/cfdp/definitions.h +0x4300;FILS_GenericFileError;;0;FILE_SYSTEM;fsfw/src/fsfw/filesystem/HasFileSystemIF.h +0x4301;FILS_GenericDirError;;1;FILE_SYSTEM;fsfw/src/fsfw/filesystem/HasFileSystemIF.h +0x4303;FILS_GenericRenameError;;3;FILE_SYSTEM;fsfw/src/fsfw/filesystem/HasFileSystemIF.h +0x4304;FILS_IsBusy;;4;FILE_SYSTEM;fsfw/src/fsfw/filesystem/HasFileSystemIF.h +0x4305;FILS_InvalidParameters;;5;FILE_SYSTEM;fsfw/src/fsfw/filesystem/HasFileSystemIF.h +0x430a;FILS_FileDoesNotExist;;10;FILE_SYSTEM;fsfw/src/fsfw/filesystem/HasFileSystemIF.h +0x430b;FILS_FileAlreadyExists;;11;FILE_SYSTEM;fsfw/src/fsfw/filesystem/HasFileSystemIF.h +0x430c;FILS_NotAFile;;12;FILE_SYSTEM;fsfw/src/fsfw/filesystem/HasFileSystemIF.h +0x430d;FILS_FileLocked;;13;FILE_SYSTEM;fsfw/src/fsfw/filesystem/HasFileSystemIF.h +0x430e;FILS_PermissionDenied;;14;FILE_SYSTEM;fsfw/src/fsfw/filesystem/HasFileSystemIF.h +0x4315;FILS_DirectoryDoesNotExist;;21;FILE_SYSTEM;fsfw/src/fsfw/filesystem/HasFileSystemIF.h +0x4316;FILS_DirectoryAlreadyExists;;22;FILE_SYSTEM;fsfw/src/fsfw/filesystem/HasFileSystemIF.h +0x4317;FILS_NotADirectory;;23;FILE_SYSTEM;fsfw/src/fsfw/filesystem/HasFileSystemIF.h +0x4318;FILS_DirectoryNotEmpty;;24;FILE_SYSTEM;fsfw/src/fsfw/filesystem/HasFileSystemIF.h +0x431e;FILS_SequencePacketMissingWrite;;30;FILE_SYSTEM;fsfw/src/fsfw/filesystem/HasFileSystemIF.h +0x431f;FILS_SequencePacketMissingRead;;31;FILE_SYSTEM;fsfw/src/fsfw/filesystem/HasFileSystemIF.h 0x2c01;CCS_BcIsSetVrCommand;;1;CCSDS_HANDLER_IF;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h 0x2c02;CCS_BcIsUnlockCommand;;2;CCSDS_HANDLER_IF;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h 0x2cb0;CCS_BcIllegalCommand;;176;CCSDS_HANDLER_IF;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h @@ -458,15 +466,15 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path 0x1d04;ATC_SendTmFailed;;4;ACCEPTS_TELECOMMANDS_IF;fsfw/src/fsfw/tmtcservices/AcceptsTelecommandsIF.h 0x1d05;ATC_Timeout;;5;ACCEPTS_TELECOMMANDS_IF;fsfw/src/fsfw/tmtcservices/AcceptsTelecommandsIF.h 0x6b00;SCBU_KeyNotFound;;0;SCRATCH_BUFFER;bsp_q7s/memory/scratchApi.h -0x64a0;FSHLP_SdNotMounted;SD card specified with path string not mounted;160;FILE_SYSTEM_HELPER;bsp_q7s/memory/FilesystemHelper.h -0x64a1;FSHLP_FileNotExists;Specified file does not exist on filesystem;161;FILE_SYSTEM_HELPER;bsp_q7s/memory/FilesystemHelper.h -0x6a00;SDMA_OpOngoing;;0;SD_CARD_MANAGER;bsp_q7s/memory/SdCardManager.h -0x6a01;SDMA_AlreadyOn;;1;SD_CARD_MANAGER;bsp_q7s/memory/SdCardManager.h -0x6a02;SDMA_AlreadyMounted;;2;SD_CARD_MANAGER;bsp_q7s/memory/SdCardManager.h -0x6a03;SDMA_AlreadyOff;;3;SD_CARD_MANAGER;bsp_q7s/memory/SdCardManager.h -0x6a0a;SDMA_StatusFileNexists;;10;SD_CARD_MANAGER;bsp_q7s/memory/SdCardManager.h -0x6a0b;SDMA_StatusFileFormatInvalid;;11;SD_CARD_MANAGER;bsp_q7s/memory/SdCardManager.h -0x6a0c;SDMA_MountError;;12;SD_CARD_MANAGER;bsp_q7s/memory/SdCardManager.h -0x6a0d;SDMA_UnmountError;;13;SD_CARD_MANAGER;bsp_q7s/memory/SdCardManager.h -0x6a0e;SDMA_SystemCallError;;14;SD_CARD_MANAGER;bsp_q7s/memory/SdCardManager.h -0x6a0f;SDMA_PopenCallError;;15;SD_CARD_MANAGER;bsp_q7s/memory/SdCardManager.h +0x64a0;FSHLP_SdNotMounted;SD card specified with path string not mounted;160;FILE_SYSTEM_HELPER;bsp_q7s/fs/FilesystemHelper.h +0x64a1;FSHLP_FileNotExists;Specified file does not exist on filesystem;161;FILE_SYSTEM_HELPER;bsp_q7s/fs/FilesystemHelper.h +0x6a00;SDMA_OpOngoing;;0;SD_CARD_MANAGER;bsp_q7s/fs/SdCardManager.h +0x6a01;SDMA_AlreadyOn;;1;SD_CARD_MANAGER;bsp_q7s/fs/SdCardManager.h +0x6a02;SDMA_AlreadyMounted;;2;SD_CARD_MANAGER;bsp_q7s/fs/SdCardManager.h +0x6a03;SDMA_AlreadyOff;;3;SD_CARD_MANAGER;bsp_q7s/fs/SdCardManager.h +0x6a0a;SDMA_StatusFileNexists;;10;SD_CARD_MANAGER;bsp_q7s/fs/SdCardManager.h +0x6a0b;SDMA_StatusFileFormatInvalid;;11;SD_CARD_MANAGER;bsp_q7s/fs/SdCardManager.h +0x6a0c;SDMA_MountError;;12;SD_CARD_MANAGER;bsp_q7s/fs/SdCardManager.h +0x6a0d;SDMA_UnmountError;;13;SD_CARD_MANAGER;bsp_q7s/fs/SdCardManager.h +0x6a0e;SDMA_SystemCallError;;14;SD_CARD_MANAGER;bsp_q7s/fs/SdCardManager.h +0x6a0f;SDMA_PopenCallError;;15;SD_CARD_MANAGER;bsp_q7s/fs/SdCardManager.h diff --git a/deps/spacepackets b/deps/spacepackets index da28596..84f1af2 160000 --- a/deps/spacepackets +++ b/deps/spacepackets @@ -1 +1 @@ -Subproject commit da2859688bc36ac258f0d75edbc2768761f34f31 +Subproject commit 84f1af27d4b15dde47b9944e0e533dff6fd8b1a4 diff --git a/deps/tmtccmd b/deps/tmtccmd index 5583005..96ca55b 160000 --- a/deps/tmtccmd +++ b/deps/tmtccmd @@ -1 +1 @@ -Subproject commit 5583005cd57fce94ac718fd5ad35f639623fcac6 +Subproject commit 96ca55b17a823ce10307e8aa6d8cd906323d1ae5 diff --git a/filetest/cfdp_test.txt b/filetest/cfdp_test.txt new file mode 100644 index 0000000..3b18e51 --- /dev/null +++ b/filetest/cfdp_test.txt @@ -0,0 +1 @@ +hello world diff --git a/filetest/obsw_update.bin b/filetest/obsw_update.bin new file mode 100644 index 0000000..5df991f Binary files /dev/null and b/filetest/obsw_update.bin differ diff --git a/pus_tc/system/core.py b/pus_tc/system/core.py index a7a2e92..e1b685d 100644 --- a/pus_tc/system/core.py +++ b/pus_tc/system/core.py @@ -1,6 +1,7 @@ import enum from config.definitions import CustomServiceList +from spacepackets.ecss import PusTelecommand from tmtccmd.config import TmtcDefinitionWrapper from tmtccmd.tc import DefaultPusQueueHelper @@ -17,12 +18,15 @@ LOGGER = get_console_logger() class ActionIds(enum.IntEnum): LIST_DIR_INTO_FILE = 0 SWITCH_REBOOT_FILE_HANDLING = 5 - RESET_ALL_REBOOT_COUNTERS = 6 - RESET_REBOOT_COUNTER_00 = 7 - RESET_REBOOT_COUNTER_01 = 8 - RESET_REBOOT_COUNTER_10 = 9 - RESET_REBOOT_COUNTER_11 = 10 - SET_MAX_REBOOT_CNT = 11 + RESET_REBOOT_COUNTER = 6 + SWITCH_IMG_LOCK = 7 + SET_MAX_REBOOT_CNT = 8 + UPDATE_OBSW_FROM_SD_0 = 10 + UPDATE_OBSW_FROM_SD_1 = 11 + UPDATE_OBSW_FROM_TMP = 12 + SWITCH_TO_SD_0 = 16 + SWITCH_TO_SD_1 = 17 + SWITCH_TO_BOTH_SD_CARDS = 18 XSC_REBOOT = 32 FULL_REBOOT = 34 @@ -40,6 +44,12 @@ class OpCodes: XSC_REBOOT_1_1 = ["5", "reboot_11"] REBOOT_FULL = ["6", "reboot_regular"] GET_HK = ["7", "get_hk"] + OBSW_UPDATE_FROM_SD_0 = ["obsw_update_sd0"] + OBSW_UPDATE_FROM_SD_1 = ["obsw_update_sd1"] + OBSW_UPDATE_FROM_TMP = ["obsw_update_tmp"] + SWITCH_TO_SD_0 = ["switch_to_sd_0"] + SWITCH_TO_SD_1 = ["switch_to_sd_1"] + SWITCH_TO_BOTH_SD_CARDS = ["switch_to_both_sd_cards"] ENABLE_REBOOT_FILE_HANDLING = ["32", "rbh_off"] DISABLE_REBOOT_FILE_HANDLING = ["33", "rbh_on"] RESET_ALL_REBOOT_COUNTERS = ["34", "rbh_reset_a"] @@ -53,6 +63,12 @@ class OpCodes: class Info: REBOOT_XSC = "XSC reboot with prompt" REBOOT_FULL = "Full regular reboot" + OBSW_UPDATE_FROM_SD_0 = "Update OBSW from SD Card 0" + OBSW_UPDATE_FROM_SD_1 = "Update OBSW from SD Card 1" + OBSW_UPDATE_FROM_TMP = "Update OBSW from tmp folder" + SWITCH_TO_SD_0 = "Switch to SD card 0" + SWITCH_TO_SD_1 = "Switch to SD card 1" + SWITCH_TO_BOTH_SD_CARDS = "Switch to both SD cards with specified active card" class Chip(enum.IntEnum): @@ -110,6 +126,12 @@ def add_core_controller_definitions(defs: TmtcDefinitionWrapper): keys=OpCodes.RESET_REBOOT_COUNTER_11, info="Reset reboot counter 1 1", ) + oce.add(keys=OpCodes.OBSW_UPDATE_FROM_SD_0, info=Info.OBSW_UPDATE_FROM_SD_0) + oce.add(keys=OpCodes.OBSW_UPDATE_FROM_SD_1, info=Info.OBSW_UPDATE_FROM_SD_1) + oce.add(keys=OpCodes.OBSW_UPDATE_FROM_TMP, info=Info.OBSW_UPDATE_FROM_TMP) + oce.add(keys=OpCodes.SWITCH_TO_SD_0, info=Info.SWITCH_TO_SD_0) + oce.add(keys=OpCodes.SWITCH_TO_SD_1, info=Info.SWITCH_TO_SD_1) + oce.add(keys=OpCodes.SWITCH_TO_BOTH_SD_CARDS, info=Info.SWITCH_TO_BOTH_SD_CARDS) defs.add_service(CustomServiceList.CORE.value, "Core Controller", oce) @@ -155,44 +177,76 @@ def pack_core_commands(q: DefaultPusQueueHelper, op_code: str): ) if op_code in OpCodes.DISABLE_REBOOT_FILE_HANDLING: q.add_log_cmd("Disabling reboot file handling") - app_data = bytearray([0]) - make_fsfw_action_cmd( - object_id=CORE_CONTROLLER_ID, - action_id=ActionIds.SWITCH_REBOOT_FILE_HANDLING, - user_data=app_data, + user_data = bytearray([0]) + q.add_pus_tc( + make_fsfw_action_cmd( + object_id=CORE_CONTROLLER_ID, + action_id=ActionIds.SWITCH_REBOOT_FILE_HANDLING, + user_data=user_data, + ) ) if op_code in OpCodes.ENABLE_REBOOT_FILE_HANDLING: q.add_log_cmd("Enabling reboot file handling") - app_data = bytearray([1]) - make_fsfw_action_cmd( - object_id=CORE_CONTROLLER_ID, - action_id=ActionIds.SWITCH_REBOOT_FILE_HANDLING, - user_data=app_data, + user_data = bytearray([1]) + q.add_pus_tc( + make_fsfw_action_cmd( + object_id=CORE_CONTROLLER_ID, + action_id=ActionIds.SWITCH_REBOOT_FILE_HANDLING, + user_data=user_data, + ) ) if op_code in OpCodes.RESET_ALL_REBOOT_COUNTERS: q.add_log_cmd("Resetting all reboot counters") - make_fsfw_action_cmd( - object_id=CORE_CONTROLLER_ID, action_id=ActionIds.RESET_ALL_REBOOT_COUNTERS + q.add_pus_tc( + make_fsfw_action_cmd( + object_id=CORE_CONTROLLER_ID, + action_id=ActionIds.RESET_REBOOT_COUNTER, + ) ) if op_code in OpCodes.RESET_REBOOT_COUNTER_00: - q.add_log_cmd("Resetting reboot counter 0 0") - make_fsfw_action_cmd( - object_id=CORE_CONTROLLER_ID, action_id=ActionIds.RESET_REBOOT_COUNTER_00 - ) + reset_specific_boot_counter(q, 0, 0) if op_code in OpCodes.RESET_REBOOT_COUNTER_01: - q.add_log_cmd("Resetting reboot counter 0 1") - make_fsfw_action_cmd( - object_id=CORE_CONTROLLER_ID, action_id=ActionIds.RESET_REBOOT_COUNTER_01 - ) + reset_specific_boot_counter(q, 0, 1) if op_code in OpCodes.RESET_REBOOT_COUNTER_10: - q.add_log_cmd("Resetting reboot counter 1 0") - make_fsfw_action_cmd( - object_id=CORE_CONTROLLER_ID, action_id=ActionIds.RESET_REBOOT_COUNTER_10 - ) + reset_specific_boot_counter(q, 1, 0) if op_code in OpCodes.RESET_REBOOT_COUNTER_11: - q.add_log_cmd("Resetting reboot counter 1 1") - make_fsfw_action_cmd( - object_id=CORE_CONTROLLER_ID, action_id=ActionIds.RESET_REBOOT_COUNTER_11 + reset_specific_boot_counter(q, 1, 1) + if op_code in OpCodes.OBSW_UPDATE_FROM_SD_0: + q.add_log_cmd(Info.OBSW_UPDATE_FROM_SD_0) + q.add_pus_tc(pack_obsw_update_cmd(ActionIds.UPDATE_OBSW_FROM_SD_0)) + if op_code in OpCodes.OBSW_UPDATE_FROM_SD_1: + q.add_log_cmd(Info.OBSW_UPDATE_FROM_SD_1) + q.add_pus_tc(pack_obsw_update_cmd(ActionIds.UPDATE_OBSW_FROM_SD_1)) + if op_code in OpCodes.OBSW_UPDATE_FROM_TMP: + q.add_log_cmd(Info.OBSW_UPDATE_FROM_TMP) + q.add_pus_tc(pack_obsw_update_cmd(ActionIds.UPDATE_OBSW_FROM_TMP)) + if op_code in OpCodes.SWITCH_TO_SD_0: + q.add_log_cmd(Info.SWITCH_TO_SD_0) + q.add_pus_tc( + make_fsfw_action_cmd( + object_id=CORE_CONTROLLER_ID, action_id=ActionIds.SWITCH_TO_SD_0 + ) + ) + if op_code in OpCodes.SWITCH_TO_SD_1: + q.add_log_cmd(Info.SWITCH_TO_SD_1) + q.add_pus_tc( + make_fsfw_action_cmd( + object_id=CORE_CONTROLLER_ID, action_id=ActionIds.SWITCH_TO_SD_1 + ) + ) + if op_code in OpCodes.SWITCH_TO_BOTH_SD_CARDS: + while True: + active_sd_card = int(input("Please specify active SD cqrd [0/1]: ")) + if active_sd_card not in [0, 1]: + LOGGER.warning("Invalid SD card specified. Try again") + break + q.add_log_cmd(Info.SWITCH_TO_BOTH_SD_CARDS) + q.add_pus_tc( + make_fsfw_action_cmd( + object_id=CORE_CONTROLLER_ID, + action_id=ActionIds.SWITCH_TO_BOTH_SD_CARDS, + user_data=bytes([active_sd_card]), + ) ) if op_code in OpCodes.GET_HK: q.add_log_cmd("Requesting housekeeping set") @@ -200,6 +254,17 @@ def pack_core_commands(q: DefaultPusQueueHelper, op_code: str): q.add_pus_tc(generate_one_hk_command(sid)) +def reset_specific_boot_counter(q: DefaultPusQueueHelper, chip: int, copy: int): + q.add_log_cmd(f"Resetting boot counter {chip} {copy}") + q.add_pus_tc( + make_fsfw_action_cmd( + object_id=CORE_CONTROLLER_ID, + action_id=ActionIds.RESET_REBOOT_COUNTER, + user_data=bytes([chip, copy]), + ) + ) + + def determine_reboot_params() -> (bool, Chip, Copy): chip_select = -1 copy_select = -1 @@ -208,6 +273,10 @@ def determine_reboot_params() -> (bool, Chip, Copy): LOGGER.info("Rebooting currently running image") return True, chip_select, copy_select LOGGER.info("Rebooting image specified by chip and copy") + return False, determine_chip_and_copy() + + +def determine_chip_and_copy() -> (int, int): while True: chip_select = input("Chip select [0/1]: ") if chip_select in ["0", "1"]: @@ -228,7 +297,15 @@ def determine_reboot_params() -> (bool, Chip, Copy): break else: LOGGER.warning("Invalid copy select value. Try again") - return False, chip_select, copy_select + return chip_select, copy_select + + +def pack_obsw_update_cmd(action_id: int) -> PusTelecommand: + chip, copy = determine_chip_and_copy() + user_data = bytes([chip, copy]) + return make_fsfw_action_cmd( + object_id=CORE_CONTROLLER_ID, action_id=action_id, user_data=user_data + ) def perform_reboot_cmd( diff --git a/tmtcc.py b/tmtcc.py index e74171f..de0e789 100755 --- a/tmtcc.py +++ b/tmtcc.py @@ -3,7 +3,31 @@ import logging import sys import time import traceback +from pathlib import Path +from typing import cast +from spacepackets import SpacePacketHeader, SpacePacket +from spacepackets.cfdp import ( + ConditionCode, + ChecksumType, + TransmissionMode, + PduHolder, + DirectiveType, +) +from tmtccmd.cfdp import CfdpUserBase, TransactionId +from tmtccmd.cfdp.defs import CfdpRequestType +from tmtccmd.cfdp.handler import CfdpInCcsdsHandler +from tmtccmd.cfdp.mib import ( + DefaultFaultHandlerBase, + LocalEntityCfg, + IndicationCfg, + RemoteEntityCfg, +) +from tmtccmd.cfdp.user import ( + TransactionFinishedParams, + MetadataRecvParams, + FileSegmentRecvdParams, +) from tmtccmd.tc.handler import SendCbParams try: @@ -41,16 +65,29 @@ from tmtccmd.tm import SpecificApidHandlerBase, GenericApidHandlerBase, CcsdsTmH from tmtccmd.core import BackendRequest from tmtccmd.logging import get_current_time_string from tmtccmd.tc import ( - ProcedureHelper, + ProcedureWrapper, FeedWrapper, TcProcedureType, TcQueueEntryType, DefaultPusQueueHelper, ) -from tmtccmd.config import default_json_path, SetupWrapper -from tmtccmd.config.args import SetupParams, ArgParserWrapper +from tmtccmd.config import ( + default_json_path, + SetupWrapper, + params_to_procedure_conversion, +) +from tmtccmd.config.args import ( + SetupParams, + PreArgsParsingWrapper, + ProcedureParamsWrapper, +) from config import __version__ -from config.definitions import PUS_APID +from config.definitions import ( + PUS_APID, + CFDP_APID, + CFDP_LOCAL_ENTITY_ID, + CFDP_REMOTE_ENTITY_ID, +) from config.hook import EiveHookObject from pus_tm.factory_hook import pus_factory_hook from pus_tc.procedure_packer import handle_default_procedure @@ -63,6 +100,61 @@ ROTATING_TIMED_LOGGER_INTERVAL_WHEN = TimedLogWhen.PER_MINUTE ROTATING_TIMED_LOGGER_INTERVAL = 30 +class EiveCfdpFaultHandler(DefaultFaultHandlerBase): + def notice_of_suspension_cb(self, cond: ConditionCode): + pass + + def notice_of_cancellation_cb(self, cond: ConditionCode): + pass + + def abandoned_cb(self, cond: ConditionCode): + pass + + def ignore_cb(self, cond: ConditionCode): + pass + + +class EiveCfdpUser(CfdpUserBase): + def transaction_indication(self, transaction_id: TransactionId): + LOGGER.info(f"CFDP User: Start of File {transaction_id}") + + def eof_sent_indication(self, transaction_id: TransactionId): + LOGGER.info(f"CFDP User: EOF sent for {transaction_id}") + + def transaction_finished_indication(self, params: TransactionFinishedParams): + LOGGER.info(f"CFDP User: {params.transaction_id} finished") + + def metadata_recv_indication(self, params: MetadataRecvParams): + pass + + def file_segment_recv_indication(self, params: FileSegmentRecvdParams): + pass + + def report_indication(self, transaction_id: TransactionId, status_report: any): + pass + + def suspended_indication( + self, transaction_id: TransactionId, cond_code: ConditionCode + ): + pass + + def resumed_indication(self, transaction_id: TransactionId, progress: int): + pass + + def fault_indication( + self, transaction_id: TransactionId, cond_code: ConditionCode, progress: int + ): + pass + + def abandoned_indication( + self, transaction_id: TransactionId, cond_code: ConditionCode, progress: int + ): + pass + + def eof_recv_indication(self, transaction_id: TransactionId): + pass + + class PusHandler(SpecificApidHandlerBase): def __init__( self, @@ -84,32 +176,52 @@ class UnknownApidHandler(GenericApidHandlerBase): LOGGER.warning(f"Packet with unknwon APID {apid} detected") +class CfdpInCcsdsWrapper(SpecificApidHandlerBase): + def __init__(self, cfdp_in_ccsds_handler: CfdpInCcsdsHandler): + super().__init__(CFDP_APID, None) + self.handler = cfdp_in_ccsds_handler + + def handle_tm(self, packet: bytes, _user_args: any): + ccsds_header_raw = packet[0:6] + sp_header = SpacePacketHeader.unpack(ccsds_header_raw) + pdu = packet[6:] + sp = SpacePacket(sp_header, sec_header=None, user_data=pdu) + self.handler.pass_packet(sp) + + class TcHandler(TcHandlerBase): def __init__( self, seq_count_provider: FileSeqCountProvider, + cfdp_in_ccsds_wrapper: CfdpInCcsdsWrapper, pus_verificator: PusVerificator, file_logger: logging.Logger, raw_logger: RawTmtcTimedLogWrapper, gui: bool, ): super().__init__() + self.cfdp_handler_started = False + self.cfdp_dest_id = CFDP_REMOTE_ENTITY_ID self.seq_count_provider = seq_count_provider self.pus_verificator = pus_verificator self.file_logger = file_logger self.raw_logger = raw_logger self.gui = gui + self.cfdp_done = False self.queue_helper = DefaultPusQueueHelper( queue_wrapper=None, pus_apid=PUS_APID, seq_cnt_provider=seq_count_provider, pus_verificator=pus_verificator, ) + self.cfdp_in_ccsds_wrapper = cfdp_in_ccsds_wrapper - def feed_cb(self, info: ProcedureHelper, wrapper: FeedWrapper): + def feed_cb(self, info: ProcedureWrapper, wrapper: FeedWrapper): self.queue_helper.queue_wrapper = wrapper.queue_wrapper if info.proc_type == TcProcedureType.DEFAULT: handle_default_procedure(self, info.to_def_procedure(), self.queue_helper) + elif info.proc_type == TcProcedureType.CFDP: + self.handle_cfdp_procedure(info) def send_cb(self, send_params: SendCbParams): entry_helper = send_params.entry @@ -130,17 +242,63 @@ class TcHandler(TcHandlerBase): f"{get_current_time_string(True)}: {tc_info_string}" ) send_params.com_if.send(raw_tc) + elif entry_helper.entry_type == TcQueueEntryType.CCSDS_TC: + cfdp_packet_in_ccsds = entry_helper.to_space_packet_entry() + send_params.com_if.send(cfdp_packet_in_ccsds.space_packet.pack()) elif entry_helper.entry_type == TcQueueEntryType.LOG: log_entry = entry_helper.to_log_entry() LOGGER.info(log_entry.log_str) self.file_logger.info(log_entry.log_str) - def queue_finished_cb(self, info: ProcedureHelper): - if info is not None and info.proc_type == TcQueueEntryType.PUS_TC: - def_proc = info.to_def_procedure() - LOGGER.info( - f"Finished queue for service {def_proc.service} and op code {def_proc.op_code}" - ) + def handle_cfdp_procedure(self, info: ProcedureWrapper): + cfdp_procedure = info.to_cfdp_procedure() + if cfdp_procedure.cfdp_request_type == CfdpRequestType.PUT: + if ( + not self.cfdp_in_ccsds_wrapper.handler.put_request_pending() + and not self.cfdp_handler_started + ): + put_req = cfdp_procedure.request_wrapper.to_put_request() + put_req.cfg.destination_id = self.cfdp_dest_id + LOGGER.info( + f"CFDP: Starting file put request with parameters:\n{put_req}" + ) + self.cfdp_in_ccsds_wrapper.handler.cfdp_handler.put_request(put_req) + self.cfdp_handler_started = True + + for source_pair, dest_pair in self.cfdp_in_ccsds_wrapper.handler: + pdu, sp = source_pair + pdu = cast(PduHolder, pdu) + if pdu.is_file_directive: + if pdu.pdu_directive_type == DirectiveType.METADATA_PDU: + metadata = pdu.to_metadata_pdu() + self.queue_helper.add_log_cmd( + f"CFDP Source: Sending Metadata PDU for file with size " + f"{metadata.file_size}" + ) + elif pdu.pdu_directive_type == DirectiveType.EOF_PDU: + self.queue_helper.add_log_cmd( + f"CFDP Source: Sending EOF PDU" + ) + else: + fd_pdu = pdu.to_file_data_pdu() + self.queue_helper.add_log_cmd( + f"CFDP Source: Sending File Data PDU for segment at offset " + f"{fd_pdu.offset} with length {len(fd_pdu.file_data)}" + ) + self.queue_helper.add_ccsds_tc(sp) + self.cfdp_in_ccsds_wrapper.handler.confirm_source_packet_sent() + self.cfdp_in_ccsds_wrapper.handler.source_handler.state_machine() + + def queue_finished_cb(self, info: ProcedureWrapper): + if info is not None: + if info.proc_type == TcQueueEntryType.PUS_TC: + def_proc = info.to_def_procedure() + LOGGER.info( + f"Finished queue for service {def_proc.service} and op code {def_proc.op_code}" + ) + elif info.proc_type == TcProcedureType.CFDP: + LOGGER.info(f"Finished CFDP queue") + self.cfdp_done = True def setup_params() -> SetupWrapper: @@ -148,28 +306,71 @@ def setup_params() -> SetupWrapper: print(f"-- spacepackets v{spacepackets.__version__} --") hook_obj = EiveHookObject(default_json_path()) params = SetupParams() - parser_wrapper = ArgParserWrapper(hook_obj) + parser_wrapper = PreArgsParsingWrapper() parser_wrapper.create_default_parent_parser() parser_wrapper.create_default_parser() parser_wrapper.add_def_proc_and_cfdp_as_subparsers() - parser_wrapper.parse() - tmtccmd.init_printout(parser_wrapper.use_gui) - parser_wrapper.set_params(params) + post_arg_parsing_wrapper = parser_wrapper.parse(hook_obj) + tmtccmd.init_printout(post_arg_parsing_wrapper.use_gui) + use_prompts = not post_arg_parsing_wrapper.use_gui + proc_param_wrapper = ProcedureParamsWrapper() + if use_prompts: + post_arg_parsing_wrapper.set_params_with_prompts(params, proc_param_wrapper) + else: + post_arg_parsing_wrapper.set_params_without_prompts(params, proc_param_wrapper) params.apid = PUS_APID - setup_wrapper = SetupWrapper(hook_obj=hook_obj, setup_params=params) + setup_wrapper = SetupWrapper( + hook_obj=hook_obj, setup_params=params, proc_param_wrapper=proc_param_wrapper + ) return setup_wrapper -def setup_tmtc( +def setup_cfdp_handler() -> CfdpInCcsdsWrapper: + fh_base = EiveCfdpFaultHandler() + cfdp_cfg = LocalEntityCfg( + local_entity_id=CFDP_LOCAL_ENTITY_ID, + indication_cfg=IndicationCfg(), + default_fault_handlers=fh_base, + ) + remote_cfg = RemoteEntityCfg( + closure_requested=False, + entity_id=CFDP_REMOTE_ENTITY_ID, + max_file_segment_len=1024, + check_limit=None, + crc_on_transmission=False, + crc_type=ChecksumType.CRC_32, + default_transmission_mode=TransmissionMode.UNACKNOWLEDGED, + ) + cfdp_seq_count_provider = FileSeqCountProvider( + max_bit_width=16, file_name=Path("seqcnt_cfdp_transaction.txt") + ) + cfdp_ccsds_seq_count_provider = PusFileSeqCountProvider( + file_name=Path("seqcnt_cfdp_ccsds_.txt") + ) + cfdp_user = EiveCfdpUser() + cfdp_in_ccsds_handler = CfdpInCcsdsHandler( + cfg=cfdp_cfg, + remote_cfgs=[remote_cfg], + ccsds_apid=CFDP_APID, + ccsds_seq_cnt_provider=cfdp_ccsds_seq_count_provider, + cfdp_seq_cnt_provider=cfdp_seq_count_provider, + user=cfdp_user, + ) + return CfdpInCcsdsWrapper(cfdp_in_ccsds_handler) + + +def setup_tmtc_handlers( verificator: PusVerificator, printer: FsfwTmTcPrinter, raw_logger: RawTmtcTimedLogWrapper, gui: bool, ) -> (CcsdsTmHandler, TcHandler): + cfdp_in_ccsds_wrapper = setup_cfdp_handler() verification_wrapper = VerificationWrapper(verificator, LOGGER, printer.file_logger) pus_handler = PusHandler(verification_wrapper, printer, raw_logger) ccsds_handler = CcsdsTmHandler(generic_handler=UnknownApidHandler(None)) ccsds_handler.add_apid_handler(pus_handler) + ccsds_handler.add_apid_handler(cfdp_in_ccsds_wrapper) seq_count_provider = PusFileSeqCountProvider() tc_handler = TcHandler( seq_count_provider=seq_count_provider, @@ -177,6 +378,7 @@ def setup_tmtc( file_logger=printer.file_logger, raw_logger=raw_logger, gui=gui, + cfdp_in_ccsds_wrapper=cfdp_in_ccsds_wrapper, ) return ccsds_handler, tc_handler @@ -186,8 +388,12 @@ def setup_backend( tc_handler: TcHandler, ccsds_handler: CcsdsTmHandler, ) -> BackendBase: + init_proc = params_to_procedure_conversion(setup_wrapper.proc_param_wrapper) tmtc_backend = tmtccmd.create_default_tmtc_backend( - setup_wrapper=setup_wrapper, tm_handler=ccsds_handler, tc_handler=tc_handler + setup_wrapper=setup_wrapper, + tm_handler=ccsds_handler, + tc_handler=tc_handler, + init_procedure=init_proc, ) tmtccmd.start(tmtc_backend=tmtc_backend, hook_obj=setup_wrapper.hook_obj) return tmtc_backend @@ -206,7 +412,7 @@ def main(): interval=ROTATING_TIMED_LOGGER_INTERVAL, ) pus_verificator = PusVerificator() - ccsds_handler, tc_handler = setup_tmtc( + ccsds_handler, tc_handler = setup_tmtc_handlers( pus_verificator, printer, raw_logger, setup_wrapper.params.use_gui )