that should do the job
This commit is contained in:
parent
2b5ad32fdd
commit
912728474a
@ -41,6 +41,7 @@ class SetId(enum.IntEnum):
|
|||||||
CTRL_VAL_DATA = 8
|
CTRL_VAL_DATA = 8
|
||||||
ACTUATOR_CMD_DATA = 9
|
ACTUATOR_CMD_DATA = 9
|
||||||
|
|
||||||
|
|
||||||
class Submode(enum.IntEnum):
|
class Submode(enum.IntEnum):
|
||||||
SAFE = 2
|
SAFE = 2
|
||||||
DETUMBLE = 3
|
DETUMBLE = 3
|
||||||
|
@ -9,12 +9,13 @@ import struct
|
|||||||
|
|
||||||
from eive_tmtc.config.definitions import CustomServiceList
|
from eive_tmtc.config.definitions import CustomServiceList
|
||||||
from eive_tmtc.config.object_ids import SOLAR_ARRAY_DEPLOYMENT_ID
|
from eive_tmtc.config.object_ids import SOLAR_ARRAY_DEPLOYMENT_ID
|
||||||
|
from spacepackets.ecss import PusTelecommand
|
||||||
from tmtccmd.config.tmtc import (
|
from tmtccmd.config.tmtc import (
|
||||||
tmtc_definitions_provider,
|
tmtc_definitions_provider,
|
||||||
TmtcDefinitionWrapper,
|
TmtcDefinitionWrapper,
|
||||||
OpCodeEntry,
|
OpCodeEntry,
|
||||||
)
|
)
|
||||||
from tmtccmd.tc import service_provider
|
from tmtccmd.tc import service_provider, DefaultPusQueueHelper
|
||||||
from tmtccmd.pus.s8_fsfw_funccmd import create_action_cmd
|
from tmtccmd.pus.s8_fsfw_funccmd import create_action_cmd
|
||||||
from tmtccmd.tc.decorator import ServiceProviderParams
|
from tmtccmd.tc.decorator import ServiceProviderParams
|
||||||
from tmtccmd import get_console_logger
|
from tmtccmd import get_console_logger
|
||||||
@ -24,10 +25,14 @@ LOGGER = get_console_logger()
|
|||||||
|
|
||||||
class OpCode:
|
class OpCode:
|
||||||
MANUAL_DEPLOYMENT = "man_depl"
|
MANUAL_DEPLOYMENT = "man_depl"
|
||||||
|
BURN_SA_0_ONLY = "burn_sa_0"
|
||||||
|
BURN_SA_1_ONLY = "burn_sa_1"
|
||||||
|
|
||||||
|
|
||||||
class Info:
|
class Info:
|
||||||
MANUAL_DEPLOYMENT = "Manual Solar Array Deployment"
|
MANUAL_DEPLOYMENT = "Manual Solar Array Deployment"
|
||||||
|
BURN_SA_0_ONLY = "Only burn SA0"
|
||||||
|
BURN_SA_1_ONLY = "Only burn SA1"
|
||||||
|
|
||||||
|
|
||||||
class ActionId:
|
class ActionId:
|
||||||
@ -48,31 +53,102 @@ def add_sa_depl_cmds(defs: TmtcDefinitionWrapper):
|
|||||||
@service_provider(CustomServiceList.SA_DEPLYOMENT)
|
@service_provider(CustomServiceList.SA_DEPLYOMENT)
|
||||||
def pack_solar_array_deployment_test_into(p: ServiceProviderParams):
|
def pack_solar_array_deployment_test_into(p: ServiceProviderParams):
|
||||||
q = p.queue_helper
|
q = p.queue_helper
|
||||||
user_data = bytearray()
|
op_code = p.op_code
|
||||||
while True:
|
switch_interval_ms = 0
|
||||||
burn_time = int(input("Please specify burn time in seconds [0-120 secs]: "))
|
if op_code == OpCode.MANUAL_DEPLOYMENT:
|
||||||
if burn_time < 0 or burn_time > 120:
|
while True:
|
||||||
LOGGER.warning(f"Invalid burn time {burn_time}")
|
burn_time_secs = prompt_burn_time()
|
||||||
continue
|
if burn_time_secs < 0:
|
||||||
user_data.extend(struct.pack("!I", burn_time))
|
continue
|
||||||
break
|
# Default configuration: Burn each side for half of the burn time.
|
||||||
while True:
|
switch_interval_ms = int(round(burn_time_secs * 0.5 * 1000))
|
||||||
dry_run = input("Dry run? [y/n]: ")
|
break
|
||||||
if dry_run in ["yes", "y", "1"]:
|
while True:
|
||||||
dry_run = 1
|
dry_run = prompt_dry_run()
|
||||||
elif dry_run in ["no", "n", "0"]:
|
if dry_run < 0:
|
||||||
dry_run = 0
|
continue
|
||||||
|
dry_run = bool(dry_run)
|
||||||
|
break
|
||||||
|
if dry_run:
|
||||||
|
dry_run_str = " as dry run"
|
||||||
else:
|
else:
|
||||||
LOGGER.warning("Invalid input for dry run parameter")
|
dry_run_str = ""
|
||||||
|
q.add_log_cmd(
|
||||||
|
f"Testing S/A Deployment with burn time {burn_time_secs}{dry_run_str}"
|
||||||
|
)
|
||||||
|
q.add_pus_tc(
|
||||||
|
pack_manual_array_depl_cmd(burn_time_secs, switch_interval_ms, dry_run)
|
||||||
|
)
|
||||||
|
elif op_code in OpCode.BURN_SA_0_ONLY:
|
||||||
|
burn_one_channel_only(q, 0)
|
||||||
|
elif op_code in OpCode.BURN_SA_1_ONLY:
|
||||||
|
burn_one_channel_only(q, 1)
|
||||||
|
|
||||||
|
|
||||||
|
def prompt_burn_time() -> int:
|
||||||
|
burn_time = int(input("Please specify burn time in seconds [0-120 secs]: "))
|
||||||
|
if burn_time < 0 or burn_time > 120:
|
||||||
|
LOGGER.warning(f"Invalid burn time {burn_time}")
|
||||||
|
return -1
|
||||||
|
return burn_time
|
||||||
|
|
||||||
|
|
||||||
|
def prompt_dry_run() -> int:
|
||||||
|
dry_run = input("Dry run? [y/n]: ")
|
||||||
|
if dry_run in ["yes", "y", "1"]:
|
||||||
|
return 1
|
||||||
|
elif dry_run in ["no", "n", "0"]:
|
||||||
|
return 0
|
||||||
|
else:
|
||||||
|
LOGGER.warning("Invalid input for dry run parameter")
|
||||||
|
return -1
|
||||||
|
|
||||||
|
|
||||||
|
def burn_one_channel_only(q: DefaultPusQueueHelper, channel: int):
|
||||||
|
while True:
|
||||||
|
burn_time_secs = prompt_burn_time()
|
||||||
|
if burn_time_secs < 0:
|
||||||
continue
|
continue
|
||||||
user_data.append(dry_run)
|
|
||||||
break
|
break
|
||||||
if dry_run == 1:
|
while True:
|
||||||
|
dry_run = prompt_dry_run()
|
||||||
|
if dry_run < 0:
|
||||||
|
continue
|
||||||
|
dry_run = bool(dry_run)
|
||||||
|
break
|
||||||
|
if dry_run:
|
||||||
dry_run_str = " as dry run"
|
dry_run_str = " as dry run"
|
||||||
else:
|
else:
|
||||||
dry_run_str = ""
|
dry_run_str = ""
|
||||||
q.add_log_cmd(f"Testing S/A Deployment with burn time {burn_time}{dry_run_str}")
|
q.add_log_cmd(
|
||||||
command = create_action_cmd(
|
f"Testing S/A Deployment Channel {channel} only with "
|
||||||
|
f"burn time {burn_time_secs}{dry_run_str}"
|
||||||
|
)
|
||||||
|
q.add_pus_tc(pack_one_channel_only_cmd(burn_time_secs, channel, dry_run))
|
||||||
|
|
||||||
|
|
||||||
|
def pack_one_channel_only_cmd(
|
||||||
|
burn_time_seconds: int, channel: int, dry_run: bool
|
||||||
|
) -> PusTelecommand:
|
||||||
|
user_data = bytearray()
|
||||||
|
user_data.extend(struct.pack("!I", burn_time_seconds))
|
||||||
|
# Burn channel for the entire time
|
||||||
|
user_data.extend(struct.pack("!I", round(int((burn_time_seconds + 1) * 1000))))
|
||||||
|
user_data.append(channel)
|
||||||
|
user_data.append(dry_run)
|
||||||
|
return create_action_cmd(
|
||||||
|
SOLAR_ARRAY_DEPLOYMENT_ID, ActionId.MANUAL_DEPLOYMENT, user_data
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def pack_manual_array_depl_cmd(
|
||||||
|
burn_time_seconds: int, channel_switch_interval_ms: int, dry_run: bool
|
||||||
|
) -> PusTelecommand:
|
||||||
|
user_data = bytearray()
|
||||||
|
user_data.extend(struct.pack("!I", burn_time_seconds))
|
||||||
|
user_data.extend(struct.pack("!I", channel_switch_interval_ms))
|
||||||
|
user_data.append(0)
|
||||||
|
user_data.append(dry_run)
|
||||||
|
return create_action_cmd(
|
||||||
SOLAR_ARRAY_DEPLOYMENT_ID, ActionId.MANUAL_DEPLOYMENT, user_data
|
SOLAR_ARRAY_DEPLOYMENT_ID, ActionId.MANUAL_DEPLOYMENT, user_data
|
||||||
)
|
)
|
||||||
q.add_pus_tc(command)
|
|
||||||
|
Loading…
Reference in New Issue
Block a user