From 378c3c4d5c5c9b51698ad4cd8fe6a3d60c26ff32 Mon Sep 17 00:00:00 2001 From: Gentile G Date: Tue, 29 Aug 2023 17:21:56 +0200 Subject: [PATCH] Implementing free timeslots finders/checker in scheduler --- maneuver_scheduler.py | 71 ++++++++++++++++++++++++++++++++----------- 1 file changed, 53 insertions(+), 18 deletions(-) diff --git a/maneuver_scheduler.py b/maneuver_scheduler.py index 9b88f9d..d029210 100644 --- a/maneuver_scheduler.py +++ b/maneuver_scheduler.py @@ -24,6 +24,7 @@ class ManeuverScheduler: # alarm_manager = get_connexion().space_center.alarm_manager alarm_manager = get_connexion().kerbal_alarm_clock node_offsets = 60. + default_duration = 5 * 60. @classmethod def get_last_alarm(cls): @@ -71,7 +72,7 @@ class ManeuverScheduler: @classmethod def book_timeslot(cls, ut, vessel, duration=None): if duration is None: - duration = 5 * 60 + duration = cls.default_duration if not cls.timeslot_is_free(ut, duration): raise @@ -94,26 +95,52 @@ class ManeuverScheduler: @classmethod - def create_reservation(cls, ut_start, duration, maneuver): + def book_timeslot_for_soi(cls, vessel, maneuver, duration=None): + if duration is None: + duration = cls.default_duration + + soi_change = vessel.orbit.time_to_soi_change + if math.isnan(soi_change): + raise + + ut_start = get_connexion().space_center.ut + soi_change if not cls.timeslot_is_free(ut_start, duration): raise - arg_dict = { - "title": "{}' Maneuver: {}".format(maneuver.vessel.name, maneuver.name), - "description": maneuver.dumps_json() + note = { + 'duration': duration, + 'vessel_name': vessel.name } - if maneuver.alarm_type == ManeuverAlarmType.ManeuverNode: - cls.alarm_manager.add_maneuver_node_alarm( - maneuver.vessel, - maneuver.vessel.control.nodes[0], - **arg_dict) - elif maneuver.alarm_type == ManeuverAlarmType.SOI: - cls.alarm_manager.add_soi_alarm( - maneuver.vessel, - **arg_dict) + + alarm = cls.alarm_manager.create_alarm( + cls.alarm_manager.AlarmType.soi_change, + "{}' SOI".format(vessel.name), + ut_start + ) + alarm.vessel = vessel + alarm.margin = cls.node_offsets + alarm.notes = json.dumps(note) + alarm.action = cls.alarm_manager.AlarmAction.kill_warp_only @classmethod def timeslot_is_free(cls, ut_start: int, duration: int) -> bool: + ut_end = ut_start + duration + for a in cls.get_ordered_alarms(): + try: + note = json.loads(a.note) + alarm_start = a.time + alarm_end = a.time + note['duration'] + if alarm_end < ut_start: + continue + elif alarm_start <= ut_start <= alarm_end: + return False + elif ut_start <= alarm_end <= ut_end: + return False + else: + return True + except json.JSONDecodeError: + continue + return True @classmethod @@ -121,9 +148,19 @@ class ManeuverScheduler: if from_ut is None: from_ut = get_connexion().space_center.ut if duration is None: - duration = 5 * 60 + duration = cls.default_duration - return from_ut + duration + if cls.timeslot_is_free(from_ut, duration): + return from_ut + + for a in cls.get_ordered_alarms(): + try: + note = json.loads(a.note) + alarm_end = a.time + int(note['duration']) + if cls.timeslot_is_free(alarm_end, duration): + return alarm_end + + raise EOFError('Excepted to find a free timeslot at the end alarm list') @classmethod def get_reservation(cls, ut_at) -> Timeslot: @@ -134,5 +171,3 @@ class ManeuverScheduler: reservation = cls.get_reservation(ut_at) if priority <= reservation.priority: raise - -