create CFDP components
This commit is contained in:
parent
aca667248c
commit
0d9b6b7086
127
common.py
127
common.py
@ -11,17 +11,27 @@ from spacepackets.cfdp import (
|
|||||||
GenericPduPacket,
|
GenericPduPacket,
|
||||||
PduHolder,
|
PduHolder,
|
||||||
PduFactory,
|
PduFactory,
|
||||||
|
ChecksumTypes,
|
||||||
|
ConditionCode,
|
||||||
)
|
)
|
||||||
from tmtccmd.cfdp import (
|
from tmtccmd.cfdp import (
|
||||||
RemoteEntityCfgTable,
|
RemoteEntityCfgTable,
|
||||||
RemoteEntityCfg,
|
RemoteEntityCfg,
|
||||||
LocalEntityCfg,
|
LocalEntityCfg,
|
||||||
CfdpUserBase,
|
CfdpUserBase,
|
||||||
|
IndicationCfg,
|
||||||
|
TransactionId,
|
||||||
)
|
)
|
||||||
from spacepackets.util import UnsignedByteField
|
from spacepackets.util import UnsignedByteField
|
||||||
from tmtccmd.cfdp.defs import CfdpRequestType, CfdpStates
|
from tmtccmd.cfdp.defs import CfdpRequestType, CfdpStates
|
||||||
from tmtccmd.cfdp.handler import SourceHandler, DestHandler
|
from tmtccmd.cfdp.handler import SourceHandler, DestHandler
|
||||||
|
from tmtccmd.cfdp.mib import DefaultFaultHandlerBase
|
||||||
from tmtccmd.cfdp.request import PutRequest, PutRequestCfg
|
from tmtccmd.cfdp.request import PutRequest, PutRequestCfg
|
||||||
|
from tmtccmd.cfdp.user import (
|
||||||
|
FileSegmentRecvdParams,
|
||||||
|
MetadataRecvParams,
|
||||||
|
TransactionFinishedParams,
|
||||||
|
)
|
||||||
from tmtccmd.logging import get_current_time_string
|
from tmtccmd.logging import get_current_time_string
|
||||||
from tmtccmd.pus.pus_11_tc_sched import Subservices as Pus11Subservices
|
from tmtccmd.pus.pus_11_tc_sched import Subservices as Pus11Subservices
|
||||||
from tmtccmd.tc.queue import DefaultPusQueueHelper
|
from tmtccmd.tc.queue import DefaultPusQueueHelper
|
||||||
@ -51,7 +61,12 @@ from common_tmtc.pus_tc.service_20_parameters import pack_service20_commands_int
|
|||||||
from common_tmtc.pus_tc.service_2_raw_cmd import pack_service_2_commands_into
|
from common_tmtc.pus_tc.service_2_raw_cmd import pack_service_2_commands_into
|
||||||
from common_tmtc.pus_tc.service_3_housekeeping import pack_service_3_commands_into
|
from common_tmtc.pus_tc.service_3_housekeeping import pack_service_3_commands_into
|
||||||
from common_tmtc.pus_tc.service_8_func_cmd import pack_service_8_commands_into
|
from common_tmtc.pus_tc.service_8_func_cmd import pack_service_8_commands_into
|
||||||
from examples.tmtcc import EXAMPLE_PUS_APID, EXAMPLE_CFDP_APID
|
from examples.tmtcc import (
|
||||||
|
EXAMPLE_PUS_APID,
|
||||||
|
EXAMPLE_CFDP_APID,
|
||||||
|
CFDP_LOCAL_ENTITY_ID,
|
||||||
|
CFDP_REMOTE_ENTITY_ID,
|
||||||
|
)
|
||||||
from tmtccmd import TcHandlerBase, get_console_logger, TmTcCfgHookBase, BackendBase
|
from tmtccmd import TcHandlerBase, get_console_logger, TmTcCfgHookBase, BackendBase
|
||||||
from tmtccmd.pus import VerificationWrapper
|
from tmtccmd.pus import VerificationWrapper
|
||||||
from tmtccmd.tc import (
|
from tmtccmd.tc import (
|
||||||
@ -71,15 +86,56 @@ from common_tmtc.pus_tm.factory_hook import pus_factory_hook
|
|||||||
LOGGER = get_console_logger()
|
LOGGER = get_console_logger()
|
||||||
|
|
||||||
|
|
||||||
|
class ExampleCfdpUser(CfdpUserBase):
|
||||||
|
def transaction_indication(self, transaction_id: TransactionId):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def eof_sent_indication(self, transaction_id: TransactionId):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def transaction_finished_indication(self, params: TransactionFinishedParams):
|
||||||
|
pass
|
||||||
|
|
||||||
|
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 CfdpCcsdsWrapper(SpecificApidHandlerBase):
|
class CfdpCcsdsWrapper(SpecificApidHandlerBase):
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
cfg: LocalEntityCfg,
|
cfg: LocalEntityCfg,
|
||||||
user: CfdpUserBase,
|
user: CfdpUserBase,
|
||||||
cfdp_seq_cnt_provider: ProvidesSeqCount,
|
remote_cfgs: Sequence[RemoteEntityCfg],
|
||||||
remote_cfg: Sequence[RemoteEntityCfg],
|
|
||||||
ccsds_seq_cnt_provider: ProvidesSeqCount,
|
|
||||||
ccsds_apid: int,
|
ccsds_apid: int,
|
||||||
|
cfdp_seq_cnt_provider: ProvidesSeqCount,
|
||||||
|
ccsds_seq_cnt_provider: ProvidesSeqCount,
|
||||||
):
|
):
|
||||||
"""Wrapper helper type used to wrap PDU packets into CCSDS packets and to extract PDU
|
"""Wrapper helper type used to wrap PDU packets into CCSDS packets and to extract PDU
|
||||||
packets from CCSDS packets.
|
packets from CCSDS packets.
|
||||||
@ -89,7 +145,6 @@ class CfdpCcsdsWrapper(SpecificApidHandlerBase):
|
|||||||
virtual filestore implementation.
|
virtual filestore implementation.
|
||||||
:param cfdp_seq_cnt_provider: Every CFDP file transfer has a transaction sequence number.
|
:param cfdp_seq_cnt_provider: Every CFDP file transfer has a transaction sequence number.
|
||||||
This provider is used to retrieve that sequence number.
|
This provider is used to retrieve that sequence number.
|
||||||
:param remote_cfg:
|
|
||||||
:param ccsds_seq_cnt_provider: Each CFDP PDU is wrapped into a CCSDS space packet, and each
|
:param ccsds_seq_cnt_provider: Each CFDP PDU is wrapped into a CCSDS space packet, and each
|
||||||
space packet has a dedicated sequence count. This provider is used to retrieve the
|
space packet has a dedicated sequence count. This provider is used to retrieve the
|
||||||
sequence count.
|
sequence count.
|
||||||
@ -98,7 +153,7 @@ class CfdpCcsdsWrapper(SpecificApidHandlerBase):
|
|||||||
CFDP packets.
|
CFDP packets.
|
||||||
"""
|
"""
|
||||||
super().__init__(EXAMPLE_CFDP_APID, None)
|
super().__init__(EXAMPLE_CFDP_APID, None)
|
||||||
self.handler = CfdpHandler(cfg, user, cfdp_seq_cnt_provider, remote_cfg)
|
self.handler = CfdpHandler(cfg, user, cfdp_seq_cnt_provider, remote_cfgs)
|
||||||
self.ccsds_seq_cnt_provider = ccsds_seq_cnt_provider
|
self.ccsds_seq_cnt_provider = ccsds_seq_cnt_provider
|
||||||
self.ccsds_apid = ccsds_apid
|
self.ccsds_apid = ccsds_apid
|
||||||
|
|
||||||
@ -138,18 +193,15 @@ class CfdpHandler:
|
|||||||
cfg: LocalEntityCfg,
|
cfg: LocalEntityCfg,
|
||||||
user: CfdpUserBase,
|
user: CfdpUserBase,
|
||||||
seq_cnt_provider: ProvidesSeqCount,
|
seq_cnt_provider: ProvidesSeqCount,
|
||||||
remote_cfg: Sequence[RemoteEntityCfg],
|
remote_cfgs: Sequence[RemoteEntityCfg],
|
||||||
):
|
):
|
||||||
self.dest_id = UnsignedByteField(EXAMPLE_PUS_APID, 2)
|
self.dest_id = UnsignedByteField(EXAMPLE_PUS_APID, 2)
|
||||||
self.remote_cfg_table = RemoteEntityCfgTable()
|
self.remote_cfg_table = RemoteEntityCfgTable()
|
||||||
self.remote_cfg_table.add_configs(remote_cfg)
|
self.remote_cfg_table.add_configs(remote_cfgs)
|
||||||
self.dest_handler = DestHandler(cfg, user, self.remote_cfg_table)
|
self.dest_handler = DestHandler(cfg, user, self.remote_cfg_table)
|
||||||
self.source_handler = SourceHandler(cfg, seq_cnt_provider, user)
|
self.source_handler = SourceHandler(cfg, seq_cnt_provider, user)
|
||||||
|
|
||||||
def put_request(
|
def put_request(self, request: PutRequest):
|
||||||
self,
|
|
||||||
request: PutRequest
|
|
||||||
):
|
|
||||||
if self.remote_cfg_table.get_cfg(request.cfg.destination_id):
|
if self.remote_cfg_table.get_cfg(request.cfg.destination_id):
|
||||||
raise ValueError(
|
raise ValueError(
|
||||||
f"No remote CFDP config found for entity ID {request.cfg.destination_id}"
|
f"No remote CFDP config found for entity ID {request.cfg.destination_id}"
|
||||||
@ -284,7 +336,18 @@ class TcHandler(TcHandlerBase):
|
|||||||
cfdp_procedure = info.to_cfdp_procedure()
|
cfdp_procedure = info.to_cfdp_procedure()
|
||||||
if cfdp_procedure.cfdp_request_type == CfdpRequestType.PUT:
|
if cfdp_procedure.cfdp_request_type == CfdpRequestType.PUT:
|
||||||
if not self.cfdp_in_ccsds_wrapper.handler.put_request_pending():
|
if not self.cfdp_in_ccsds_wrapper.handler.put_request_pending():
|
||||||
put_req = cfdp_procedure.request_wrapper.to_put_request()
|
# put_req = cfdp_procedure.request_wrapper.to_put_request()
|
||||||
|
with open("/tmp/hello.txt") as of:
|
||||||
|
of.write("Hello first CFDP file")
|
||||||
|
# TODO: Replace hardcoded put request if the request works
|
||||||
|
put_request_cfg = PutRequestCfg(
|
||||||
|
destination_id=self.cfdp_in_ccsds_wrapper.handler.dest_id,
|
||||||
|
source_file=Path("/tmp/hello.txt"),
|
||||||
|
dest_file="/tmp/hello-created-by-dest.txt",
|
||||||
|
closure_requested=False,
|
||||||
|
trans_mode=TransmissionModes.UNACKNOWLEDGED,
|
||||||
|
)
|
||||||
|
put_req = PutRequest(put_request_cfg)
|
||||||
LOGGER.info(f"Starting put request {put_req}")
|
LOGGER.info(f"Starting put request {put_req}")
|
||||||
# TODO: Only start put request if there isn't one pending yet. The source handler
|
# TODO: Only start put request if there isn't one pending yet. The source handler
|
||||||
# state can probably be used for this.
|
# state can probably be used for this.
|
||||||
@ -345,10 +408,40 @@ def setup_params(hook_obj: TmTcCfgHookBase) -> SetupWrapper:
|
|||||||
def setup_tmtc_handlers(
|
def setup_tmtc_handlers(
|
||||||
verif_wrapper: VerificationWrapper,
|
verif_wrapper: VerificationWrapper,
|
||||||
printer: FsfwTmTcPrinter,
|
printer: FsfwTmTcPrinter,
|
||||||
cfdp_handler: CfdpCcsdsWrapper,
|
|
||||||
raw_logger: RawTmtcTimedLogWrapper,
|
raw_logger: RawTmtcTimedLogWrapper,
|
||||||
) -> (CcsdsTmHandler, TcHandler):
|
) -> (CcsdsTmHandler, TcHandler):
|
||||||
|
|
||||||
|
fh_base = DefaultFaultHandlerBase()
|
||||||
|
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=ChecksumTypes.CRC_32,
|
||||||
|
default_transmission_mode=TransmissionModes.UNACKNOWLEDGED,
|
||||||
|
)
|
||||||
|
cfdp_seq_count_provider = FileSeqCountProvider(
|
||||||
|
max_bit_width=16, file_name=Path("cfdp_transaction_cnt.txt")
|
||||||
|
)
|
||||||
|
cfdp_ccsds_seq_count_provider = PusFileSeqCountProvider(
|
||||||
|
file_name=Path("cfdp_ccsds_seqcnt.txt")
|
||||||
|
)
|
||||||
|
cfdp_user = ExampleCfdpUser()
|
||||||
|
cfdp_in_ccsds_handler = CfdpCcsdsWrapper(
|
||||||
|
cfg=cfdp_cfg,
|
||||||
|
remote_cfgs=[remote_cfg],
|
||||||
|
ccsds_apid=EXAMPLE_CFDP_APID,
|
||||||
|
ccsds_seq_cnt_provider=cfdp_ccsds_seq_count_provider,
|
||||||
|
cfdp_seq_cnt_provider=cfdp_seq_count_provider,
|
||||||
|
user=cfdp_user,
|
||||||
|
)
|
||||||
|
|
||||||
pus_handler = PusHandler(
|
pus_handler = PusHandler(
|
||||||
printer=printer, raw_logger=raw_logger, wrapper=verif_wrapper
|
printer=printer, raw_logger=raw_logger, wrapper=verif_wrapper
|
||||||
)
|
)
|
||||||
@ -358,8 +451,10 @@ def setup_tmtc_handlers(
|
|||||||
file_logger=printer.file_logger,
|
file_logger=printer.file_logger,
|
||||||
raw_logger=raw_logger,
|
raw_logger=raw_logger,
|
||||||
pus_verificator=verif_wrapper.pus_verificator,
|
pus_verificator=verif_wrapper.pus_verificator,
|
||||||
seq_count_provider=PusFileSeqCountProvider(),
|
seq_count_provider=PusFileSeqCountProvider(
|
||||||
cfdp_in_ccsds_wrapper=cfdp_handler,
|
file_name=Path("pus_ccsds_seqcnt.txt")
|
||||||
|
),
|
||||||
|
cfdp_in_ccsds_wrapper=cfdp_in_ccsds_handler,
|
||||||
)
|
)
|
||||||
return ccsds_handler, tc_handler
|
return ccsds_handler, tc_handler
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user