Files
kttd/maneuvers/__init__.py

75 lines
2.4 KiB
Python

import math
from enum import Enum
from maneuver_scheduler import ManeuverScheduler
class ManeuverAlarmType(Enum):
ManeuverNode = 1,
SOI = 2
class Maneuver:
def __init__(self, conn, mission_control):
self.mission_control = mission_control
self.vessel = mission_control.vessel
self.conn = conn
def plan_next_maneuver(self):
pass
class NodeManeuver(Maneuver):
alarm_type = ManeuverAlarmType.ManeuverNode
def __init__(self, conn, mission_control):
super().__init__(conn, mission_control)
self.mech_jeb = conn.mech_jeb
self.node_executor = self.mech_jeb.node_executor
def execute(self) -> bool:
sc = self.conn.space_center
if sc.active_vessel.name != self.vessel.name:
sc.active_vessel = self.vessel
while self.vessel.control.nodes:
self._execute_node()
return self.plan_next_maneuver()
def _execute_node(self):
self.node_executor.execute_all_nodes()
with self.conn.stream(getattr, self.node_executor, "enabled") as enabled:
enabled.rate = 1
with enabled.condition:
while enabled():
enabled.wait()
def book_timeslot_for_node(self, node, maneuver, duration=None):
if node.time_to < 0:
node.remove()
planning_duration = 60
ut = ManeuverScheduler.next_free_timeslot(self.conn.space_center.ut + planning_duration, planning_duration)
ManeuverScheduler.book_timeslot(ut, self.vessel, duration=planning_duration)
time_required = (node.delta_v * self.vessel.mass) / self.vessel.available_thrust
duration = math.floor(2 * ManeuverScheduler.node_offsets + time_required)
alarm_start = node.ut - (duration / 2 + ManeuverScheduler.node_offsets)
if ManeuverScheduler.timeslot_is_free(alarm_start, duration):
ManeuverScheduler.book_timeslot_for_node(self.vessel, node, self, alarm_start=alarm_start, duration=duration)
else:
node.remove()
planning_duration = 60
ut = ManeuverScheduler.next_free_timeslot(alarm_start, planning_duration)
ManeuverScheduler.book_timeslot(ut, self.vessel, duration=planning_duration)
class MechJebManeuver(NodeManeuver):
def __init__(self, conn, mission_control):
super().__init__(conn, mission_control)
self.maneuver_planner = self.mech_jeb.maneuver_planner