Repository: aidotse/PASEOS (language: python)

Issue:
Creating communication handler
# Feature
## Desired Behavior / Functionality

We want to model the communication between two actors. Thus, the following should be considered:

* Limited communication windows (because of the line of sight)
* Limited communication bandwidth

## What Needs to Be Done
* Add bandwidth parameters to the actors.
* Implementing a function for the local actor to send data.
* Communication window is given only by the line of sight. Assuming unlimited radiation pattern (to be changed in the future)
* Handler function to check the amount of data that can be transmitted in a timestamp.

### Inputs 
* Bandwidth [kb/s]
* Actor 
* Epoch [pk.epoch]
* Amount of data to transmit [b]
### Outputs
* Number of transmitted bits [b]
* Remaining communication windows [s]

## How Can It Be Tested
We can start with two satellites in space.


Discussion / hints:

Fix patch:
diff --git a/README.md b/README.md
index b98c3306..f66e778b 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,24 @@
 # PASEOS
 PASEOS - PAseos Simulates the Environment for Operating multiple Spacecraft 
+
+This project is currently under development. Use at your own risk. :)
+
+## How PASEOS works
+
+<p align="center">
+  <a href="https://github.com/aidotse/PASEOS/">
+    <img src="resources/images/datastructure.svg" alt="Scheme"  width="910" height="459">
+  </a>
+  <p align="center">
+    Description of PASEOS data structure
+  </p>
+</p>
+
+<p align="center">
+  <a href="https://github.com/aidotse/PASEOS/">
+    <img src="resources/images/flowchart.svg" alt="Scheme"  width="910" height="459">
+  </a>
+  <p align="center">
+    Description of PASEOS workflow on an individual device
+  </p>
+</p>
\ No newline at end of file
diff --git a/paseos/__init__.py b/paseos/__init__.py
index 4196757d..68fe775f 100644
--- a/paseos/__init__.py
+++ b/paseos/__init__.py
@@ -1,5 +1,7 @@
 from loguru import logger
 
+from paseos.actors.base_actor import BaseActor
+
 from .utils.set_log_level import set_log_level
 from .paseos import PASEOS
 from .actors.spacecraft_actor import SpacecraftActor
@@ -10,9 +12,17 @@
 logger.debug("Loaded module.")
 
 
-def init_sim():
+def init_sim(local_actor: BaseActor):
+    """Initializes PASEOS
+
+    Args:
+        local_actor (BaseActor): The actor linked to the local device which is required to model anything.
+
+    Returns:
+        PASEOS: Instance of the simulation (only one can exist, singleton)
+    """
     logger.debug("Initializing simulation.")
-    sim = PASEOS()
+    sim = PASEOS(local_actor=local_actor)
     return sim
 
 
diff --git a/paseos/actors/base_actor.py b/paseos/actors/base_actor.py
index 91c0474f..5b7fd19c 100644
--- a/paseos/actors/base_actor.py
+++ b/paseos/actors/base_actor.py
@@ -5,6 +5,9 @@
 
 from abc import ABC
 
+from dotmap import DotMap
+from ..communication.get_communication_window import get_communication_window
+
 
 class BaseActor(ABC):
     """This (abstract) class is the baseline implementation of an actor
@@ -15,16 +18,23 @@ class BaseActor(ABC):
     # Actor name, has to be unique
     name = None
 
+    # Timestep this actor's info is at (excl. pos/vel)
+    _local_time = None
+
     # Orbital parameters of the actor, stored in a pykep planet object
     _orbital_parameters = None
 
-    # Constraint for max bandwidth used when comms are available
-    _max_bandwidth_kbps = None
-
     # Earth as a sphere (for now)
     # TODO replace this in the future depending on central body
+    # Note that this needs to be specified in solar reference frame for now
     _central_body_sphere = Sphere([0, 0, 0], 6371000)
 
+    # Central body this actor is orbiting
+    _central_body = None
+
+    # Communication links dictionary
+    _communication_links = DotMap(_dynamic=False)
+
     def __init__(
         self, name: str, position, velocity, epoch: pk.epoch, central_body: pk.planet
     ) -> None:
@@ -38,8 +48,11 @@ def __init__(
             central_body (pk.planet): pykep central body
         """
         logger.trace("Instantiating Actor.")
+        BaseActor._check_init_value_sensibility(position, velocity)
         super().__init__()
         self.name = name
+        self._local_time = epoch
+        self._central_body = central_body
         self._orbital_parameters = pk.planet.keplerian(
             epoch,
             position,
@@ -50,10 +63,53 @@ def __init__(
             1.0,
             name,
         )
+        self._communication_links = DotMap(_dynamic=False)
+
+    @staticmethod
+    def _check_init_value_sensibility(
+        position,
+        velocity,
+    ):
+        """A function to check user inputs for sensibility
+
+        Args:
+            position (list of floats): [x,y,z]
+            velocity (list of floats): [vx,vy,vz]
+        """
+        logger.trace("Checking constructor values for sensibility.")
+        assert len(position) == 3, "Position has to have 3 elements (x,y,z)"
+        assert len(velocity) == 3, "Velocity has to have 3 elements (vx,vy,vz)"
 
     def __str__(self):
         return self._orbital_parameters.name
 
+    def set_time(self, t: pk.epoch):
+        """Updates the local time of the actor.
+
+        Args:
+            t (pk.epoch): Local time to set to.
+        """
+        self._local_time = t
+
+    def charge(self, t0: pk.epoch, t1: pk.epoch):
+        """Charges the actor during that period. Not implemented by default.
+
+        Args:
+            t0 (pk.epoch): Start of the charging interval
+            t1 (pk.epoch): End of the charging interval
+
+        """
+        pass
+
+    def discharge(self, consumption_rate_in_W: float, duration_in_s: float):
+        """Discharge battery depending on power consumption. Not implemented by default.
+
+        Args:
+            consumption_rate_in_W (float): Consumption rate of the activity in Watt
+            duration_in_s (float): How long the activity is performed in seconds
+        """
+        pass
+
     def get_position_velocity(self, epoch: pk.epoch):
         logger.trace(
             "Computing "
@@ -100,7 +156,6 @@ def is_in_line_of_sight(
                 other_actor_pos[2] - my_pos[2],
             ],
         )
-        print(line_between_actors)
         if plot:
             from skspatial.plotting import plot_3d
 
@@ -123,3 +178,50 @@ def is_in_line_of_sight(
                 )
             return True
         return False
+
+    def add_communication_links(self, name, bandwidth_in_kbps):
+        """Creates a communication link.
+
+        Args:
+            name (str): name of the communication link.
+            bandwidth_in_kbps (float): link bandwidth in kbps.
+        """
+        if name in self._communication_links:
+            raise ValueError(
+                "Trying to add already existing communication link with name: " + name
+            )
+
+        self._communication_links[name] = DotMap(bandwidth_in_kbps=bandwidth_in_kbps)
+
+    def get_communication_window(
+        self,
+        local_actor_communication_link_name,
+        target_actor,
+        dt: float,
+        t0: float,
+        data_to_send_in_b: int,
+        window_timeout_value_in_s=7200.0,
+    ):
+        """Returning the communication window and the data amount that can be transmitted from the local to the target actor.
+
+        Args:
+            local_actor_communication_link_name (base_actor):  name of the local_actor's communication link to use.
+            target_actor (base_actor): other actor.
+            dt (float): simulation timestep.
+            t0 (pk.epoch): current simulation time [s].
+            data_to_send_in_b (int): amount of data to transmit [b].
+            window_timeout_value_in_s (float, optional): timeout for estimating the communication window. Defaults to 7200.0.
+        Returns:
+            pk.epoch: communication window start time.
+            k.epoch: communication window end time.
+            int: data that can be transmitted in the communication window [b].
+        """
+        return get_communication_window(
+            self,
+            local_actor_communication_link_name,
+            target_actor,
+            dt,
+            t0,
+            data_to_send_in_b,
+            window_timeout_value_in_s,
+        )
diff --git a/paseos/actors/spacecraft_actor.py b/paseos/actors/spacecraft_actor.py
index c6e9df89..db3be7dc 100644
--- a/paseos/actors/spacecraft_actor.py
+++ b/paseos/actors/spacecraft_actor.py
@@ -2,18 +2,30 @@
 import pykep as pk
 
 from paseos.actors.base_actor import BaseActor
+from paseos.power import discharge_model
+from paseos.power import charge_model
+from paseos.power.is_in_eclipse import is_in_eclipse
 
 
 class SpacecraftActor(BaseActor):
     """This class models a spacecraft actor which in addition to pos,
     velocity also has additional constraints such as power/battery."""
 
-    # Power constraints
-    # TODO
-    _available_power = None
+    # Power-related properties
+    battery_level_in_Ws = None
+    _max_battery_level_in_Ws = None
+    _charging_rate_in_W = None
 
     def __init__(
-        self, name: str, position, velocity, epoch: pk.epoch, central_body: pk.planet
+        self,
+        name: str,
+        position,
+        velocity,
+        epoch: pk.epoch,
+        central_body: pk.planet,
+        battery_level_in_Ws: float,
+        max_battery_level_in_Ws: float,
+        charging_rate_in_W: float,
     ) -> None:
         """Constructor for a spacecraft actor
 
@@ -23,6 +35,73 @@ def __init__(
             velocity (list of floats): [vx,vy,vz]
             epoch (pykep.epoch): Epoch at this pos / velocity
             central_body (pk.planet): pykep central body
+            battery_level_in_Ws (float): Current battery level in Watt seconds / Joule
+            max_battery_level_in_Ws (float): Maximum battery level in Watt seconds / Joule
+            charging_rate_in_W (float): Charging rate of the battery in Watt
         """
         logger.trace("Instantiating SpacecraftActor.")
+        SpacecraftActor._check_init_value_sensibility(
+            battery_level_in_Ws,
+            max_battery_level_in_Ws,
+            charging_rate_in_W,
+        )
+        self.battery_level_in_Ws = battery_level_in_Ws
+        self._max_battery_level_in_Ws = max_battery_level_in_Ws
+        self._charging_rate_in_W = charging_rate_in_W
         super().__init__(name, position, velocity, epoch, central_body)
+
+    def _check_init_value_sensibility(
+        battery_level_in_Ws: float,
+        max_battery_level_in_Ws: float,
+        charging_rate_in_W: float,
+    ):
+        """A function to check user inputs for sensibility
+
+        Args:
+            battery_level_in_Ws (float): Current battery level in Watt seconds / Joule
+            max_battery_level_in_Ws (float): Maximum battery level in Watt seconds / Joule
+            charging_rate_in_W (float): Charging rate of the battery in Watt
+        """
+        logger.trace("Checking constructor values for sensibility.")
+        assert battery_level_in_Ws > 0, "Battery level must be non-negative"
+        assert max_battery_level_in_Ws > 0, "Battery level must be non-negative"
+        assert charging_rate_in_W > 0, "Battery level must be non-negative"
+
+    def discharge(self, consumption_rate_in_W: float, duration_in_s: float):
+        """Discharge battery depending on power consumption.
+
+        Args:
+            consumption_rate_in_W (float): Consumption rate of the activity in Watt
+            duration_in_s (float): How long the activity is performed in seconds
+        """
+        assert duration_in_s > 0, "Duration has to be positive"
+        assert consumption_rate_in_W > 0, "Power consumption rate has to be positive"
+
+        power_consumption = consumption_rate_in_W * duration_in_s
+        logger.debug(f"Discharging {power_consumption}")
+
+        self = discharge_model.discharge(self, power_consumption)
+
+    def charge(self, t0: pk.epoch, t1: pk.epoch):
+        """Charges the actor during that period. Note that it is only
+        verified the actor is neither at start nor end of the period in eclipse,
+        thus short periods are preferable.
+
+        Args:
+            t0 (pk.epoch): Start of the charging interval
+            t1 (pk.epoch): End of the charging interval
+
+        """
+        time_interval = (t1.mjd2000 - t0.mjd2000) * pk.DAY2SEC
+        logger.debug(f"Charging actor {self} for {time_interval}s.")
+        assert (
+            time_interval > 0
+        ), "Charging interval has to be positive but t1 was less or equal t0."
+
+        if is_in_eclipse(self, central_body=self._central_body, t=t0) or is_in_eclipse(
+            self, central_body=self._central_body, t=t1
+        ):
+            logger.debug("Actor is in eclipse, not charging.")
+        else:
+            self = charge_model.charge(self, time_interval)
+        logger.debug(f"New battery level is {self.battery_level_in_Ws}")
diff --git a/paseos/communication/get_communication_window.py b/paseos/communication/get_communication_window.py
new file mode 100644
index 00000000..4e7ebe16
--- /dev/null
+++ b/paseos/communication/get_communication_window.py
@@ -0,0 +1,65 @@
+"""This file contains models of the communication transmission through a channel"""
+
+import pykep as pk
+from loguru import logger
+
+
+def get_communication_window(
+    local_actor,
+    local_actor_communication_link_name,
+    target_actor,
+    dt: float,
+    t0: pk.epoch,
+    data_to_send_in_b: int,
+    window_timeout_value_in_s=7200,
+):
+    """Returning the communication window and the amount of data that can be transmitted from the local to the target actor.
+
+    Args:
+        local_actor (base_actor): local actor.
+        local_actor_communication_link_name (base_actor):  name of the local_actor's communication link to use.
+        target_actor (base_actor): other actor.
+        dt (float): simulation timestep [s].
+        t0 (pk.epoch): current simulation time.
+        data_to_send_in_b (int): amount of data to transmit [b].
+        window_timeout_value_in_s (float, optional): timeout for estimating the communication window. Defaults to 7200.0.
+    Returns:
+        pk.epoch: communication window start time.
+        pk.epoch: communication window end time.
+        int: data that can be transmitted in the communication window [b].
+    """
+
+    assert local_actor_communication_link_name in local_actor._communication_links, (
+        "Trying to use a not-existing communication link with the name: "
+        + local_actor._communication_links
+    )
+    local_actor_comm_link = local_actor._communication_links[
+        local_actor_communication_link_name
+    ]
+
+    assert local_actor_comm_link.bandwidth_in_kbps > 0, "Bandiwidth has to be positive."
+    assert dt > 0, "dt has to be positive."
+    assert data_to_send_in_b > 0, "data_to_send_in_b has to be positive."
+
+    # Getting t0 in s
+    t0_in_s = (t0.mjd2000 - pk.epoch(0).mjd2000) / pk.SEC2DAY
+    transmitted_data_in_b = 0
+    current_time_in_s = t0_in_s
+    while (
+        local_actor.is_in_line_of_sight(
+            target_actor, pk.epoch(current_time_in_s * pk.SEC2DAY)
+        )
+    ) and (current_time_in_s - t0_in_s < window_timeout_value_in_s):
+        current_time_in_s += dt
+        transmitted_data_in_b += int(
+            local_actor_comm_link.bandwidth_in_kbps * dt * 1000
+        )  # (This is the quantum of information that you can transmit)
+
+    if current_time_in_s - t0_in_s >= window_timeout_value_in_s:
+        logger.debug("Timeout reached for the estimation of the communication window.")
+
+    return (
+        t0,
+        pk.epoch(current_time_in_s * pk.SEC2DAY),
+        min(transmitted_data_in_b, data_to_send_in_b),
+    )
diff --git a/paseos/paseos.py b/paseos/paseos.py
index 7b754b61..9dbdcc7e 100644
--- a/paseos/paseos.py
+++ b/paseos/paseos.py
@@ -17,7 +17,17 @@ class PASEOS:
     # Stores the simulation state
     _state = None
 
-    def __new__(self):
+    # Storing actors we know as dictionary for easy access
+    # Does not include local actor.
+    _known_actors = None
+
+    # The actor of the device this is running on
+    _local_actor = None
+
+    # Stores registered activities
+    _activities = None
+
+    def __new__(self, local_actor: BaseActor):
         if not hasattr(self, "instance"):
             self.instance = super(PASEOS, self).__new__(self)
         else:
@@ -26,39 +36,144 @@ def __new__(self):
             )
         return self.instance
 
-    def __init__(self):
+    def __init__(self, local_actor: BaseActor):
         logger.trace("Initializing PASEOS")
         self._cfg = load_default_cfg()
         self._state = DotMap(_dynamic=False)
-        self._state.time = 0
-        self._state.actors = []
+        self._state.time = self._cfg.sim.start_time
+        self._known_actors = {}
+        self._local_actor = local_actor
+        self._activities = DotMap(_dynamic=False)
 
-    def advance_time(self, dt: float):
+    def advance_time(self, time_to_advance: float):
         """Advances the simulation by a specified amount of time
 
         Args:
-            dt (float): Time to advance in seconds
+            time_to_advance (float): Time to advance in seconds.
         """
-        logger.debug("Advancing time by " + str(dt) + " s.")
-        self._state.time += dt
+        logger.debug("Advancing time by " + str(time_to_advance) + " s.")
+        target_time = self._state.time + time_to_advance
+        dt = self._cfg.sim.dt
+
+        # Perform timesteps until target_time - dt reached,
+        # then final smaller or equal timestep to reach target_time
+        while self._state.time < target_time:
+            if self._state.time > target_time - dt:
+                # compute final timestep to catch up
+                dt = target_time - self._state.time
+            logger.trace(f"Time {self._state.time}, advancing {dt}")
+
+            # Perform updates for local actor (e.g. charging)
+            # Each actor only updates itself
+            # charge from current moment to time after timestep
+            self._local_actor.charge(
+                self._local_actor._local_time,
+                pk.epoch((self._state.time + dt) * pk.SEC2DAY),
+            )
+
+            self._state.time += dt
+            self._local_actor.set_time(pk.epoch(self._state.time * pk.SEC2DAY))
 
         logger.debug("New time is: " + str(self._state.time) + " s.")
 
-    def add_actor(self, actor: BaseActor):
+    def add_known_actor(self, actor: BaseActor):
         """Adds an actor to the simulation.
 
         Args:
             actor (BaseActor): Actor to add
         """
         logger.debug("Adding actor:" + str(actor))
+        logger.debug("Current actors: " + str(self._known_actors.keys()))
         # Check for duplicate actors by name
-        for existing_actor in self._state.actors:
-            if existing_actor.name == actor.name:
-                raise ValueError(
-                    "Trying to add actor with already existing name: " + actor.name
-                )
+        if actor.name in self._known_actors.keys():
+            raise ValueError(
+                "Trying to add already existing actor with name: " + actor.name
+            )
         # Else add
-        self._state.actors.append(actor)
+        self._known_actors[actor.name] = actor
+
+    def emtpy_known_actors(self):
+        self._known_actors = {}
+
+    def register_activity(
+        self,
+        name: str,
+        requires_line_of_sight_to: list = None,
+        power_consumption_in_watt: float = None,
+    ):
+        """Registers an activity that can then be performed on the local actor.
+
+        Args:
+            name (str): Name of the activity
+            requires_line_of_sight_to (list): List of strings with names of actors which need to be visible for this activity.
+            power_consumption_in_watt (float, optional): Power consumption of performing
+            the activity (per second). Defaults to None.
+        """
+        if name in self._activities.keys():
+            raise ValueError(
+                "Trying to add already existing activity with name: "
+                + name
+                + ". Already have "
+                + str(self._activities[name])
+            )
+
+        self._activities[name] = DotMap(
+            requires_line_of_sight_to=requires_line_of_sight_to,
+            power_consumption_in_watt=power_consumption_in_watt,
+            _dynamic=False,
+        )
+
+        logger.debug(f"Registered activity {self._activities[name]}")
+
+    def perform_activity(
+        self,
+        name: str,
+        power_consumption_in_watt: float = None,
+        duration_in_s: float = 1.0,
+    ):
+        """Perform the activity and discharge battery accordingly
+
+        Args:
+            name (str): Name of the activity
+            power_consumption_in_watt (float, optional): Power consumption of the
+            activity in seconds if not specified. Defaults to None.
+            duration_in_s (float, optional): Time to perform this activity. Defaults to 1.0.
+
+        Returns:
+            bool: Whether the activity was performed successfully.
+        """
+        # Check if activity exists and if it already had consumption specified
+        assert name in self._activities.keys(), (
+            "Activity not found. Declared activities are" + self._activities.keys()
+        )
+        activity = self._activities[name]
+        logger.debug(f"Performing activity {activity}")
+
+        if power_consumption_in_watt is None:
+            power_consumption_in_watt = activity.power_consumption_in_watt
+
+        assert power_consumption_in_watt > 0, (
+            "Power consumption has to be positive but was either in activity or call specified as "
+            + str(power_consumption_in_watt)
+        )
+
+        assert duration_in_s > 0, "Duration has to be positive."
+
+        # TODO
+        # Check if line of sight requirement is fulfilled and if enough power available
+        assert (
+            activity.requires_line_of_sight_to is None
+        ), "Line of Sight for activities is not implemented"
+
+        # TODO
+        # Perform activity, maybe we allow the user pass a function to be executed?
+
+        # Discharge power for the activity
+        self._local_actor.discharge(power_consumption_in_watt, duration_in_s)
+
+        logger.trace(f"Activity {activity} completed.")
+
+        return True
 
     def set_central_body(self, planet: pk.planet):
         """Sets the central body of the simulation for the orbit simulation
diff --git a/paseos/power/charge_model.py b/paseos/power/charge_model.py
new file mode 100644
index 00000000..8e186e4b
--- /dev/null
+++ b/paseos/power/charge_model.py
@@ -0,0 +1,30 @@
+"""This file contains models of the battery charge via e.g. solar power"""
+from loguru import logger
+
+
+def charge(
+    actor,
+    charging_time_in_s: float,
+    model="simple",
+):
+    """Models the charging via solar panels or similar.
+
+    Args:
+        actor (SpacecraftActor): Actor to apply this to.
+        charging_time_in_s (float): Charging period in s.
+        model (str, optional): Model to use, amt only "simple". Defaults to "simple".
+
+    Returns:
+        SpacecraftActor: Modified actor after charging.
+    """
+    logger.trace("Charging actor" + str(actor) + " for " + str(charging_time_in_s) + " seconds using model " + model)
+    assert charging_time_in_s > 0, "Charging time has to be positive."
+
+    if model == "simple":
+        actor.battery_level_in_Ws += actor._charging_rate_in_W * charging_time_in_s
+        actor.battery_level_in_Ws = min(
+            actor.battery_level_in_Ws, actor._max_battery_level_in_Ws
+        )
+        return actor
+    else:
+        raise NotImplementedError("Unknown charging model " + model)
diff --git a/paseos/power/discharge_model.py b/paseos/power/discharge_model.py
new file mode 100644
index 00000000..0db20010
--- /dev/null
+++ b/paseos/power/discharge_model.py
@@ -0,0 +1,34 @@
+"""This file contains models of the battery discharge due to power consumption"""
+
+
+def discharge(
+    actor,
+    power_consumption_in_Ws: float,
+    battery_model="simple",
+):
+    """Models the reduction of battery energy on the actor
+
+    Args:
+        actor (SpacecraftActor): Actor to apply this
+        power_consumption_in_Ws (float): Consumed power in Ws
+        battery_model (str, optional): Defines which model to use, atm only "simple". Defaults to "simple".
+
+    Returns:
+        SpacecraftActor: Modified actor after power consumption.
+    """
+
+    if battery_model == "simple":
+        if actor.battery_level_in_Ws < power_consumption_in_Ws:
+            raise ValueError(
+                "Insufficient Battery. Actor "
+                + str(actor)
+                + " has battery level: "
+                + str(actor.battery_level_in_Ws)
+                + " - trying to discharge "
+                + str(power_consumption_in_Ws)
+            )
+        else:
+            actor.battery_level_in_Ws -= power_consumption_in_Ws
+            return actor
+    else:
+        raise NotImplementedError("Unknown battery model " + battery_model)
diff --git a/paseos/power/is_in_eclipse.py b/paseos/power/is_in_eclipse.py
new file mode 100644
index 00000000..1bfd9632
--- /dev/null
+++ b/paseos/power/is_in_eclipse.py
@@ -0,0 +1,86 @@
+"""This file provides method for computing whether an actor is currently in eclipse"""
+import pykep as pk
+import numpy as np
+from skspatial.objects import LineSegment, Line, Sphere
+from loguru import logger
+
+from paseos.actors.base_actor import BaseActor
+
+
+def is_in_eclipse(
+    actor: BaseActor, central_body: pk.planet, t: pk.epoch, plot=False
+) -> bool:
+    """Checks whether the actor is currently in eclipse of central body.
+
+    Args:
+        actor (BaseActor): Actor to check
+        central_body (pk.planet): Central body of the actor
+        t (pk.epoch): Current time to check at
+        plot (bool, optional): If true will plot visualization. Defaults to False.
+
+    Returns:
+        bool: True if actor is in eclipse
+    """
+    logger.debug(f"Checking whether {actor} is in eclipse at {t}.")
+
+    # Compute central body position in solar reference frame
+    r_central_body_heliocentric, _ = np.array(central_body.eph(t))
+    logger.trace("r_central_body_heliocentric is" + str(r_central_body_heliocentric))
+    central_body_sphere = Sphere(
+        r_central_body_heliocentric, actor._central_body_sphere.radius
+    )
+
+    # Compute satellite / actor position in solar reference frame
+    r_sat_central_body_frame = np.array(actor.get_position_velocity(t)[0])
+    logger.trace("r_sat_central_body_frame is" + str(r_sat_central_body_frame))
+    r_sat_heliocentric = r_central_body_heliocentric + r_sat_central_body_frame
+    logger.trace("r_sat_heliocentric is" + str(r_sat_heliocentric))
+
+    # Compute line between actor and sun
+    line_between_sun_and_actor = Line(
+        [0, 0, 0],
+        r_sat_heliocentric,
+    )
+
+    # Specify line segment to see if intersections are on this segment
+    linesegment_between_sun_and_actor = LineSegment(
+        [0, 0, 0],
+        r_sat_heliocentric,
+    )
+
+    if plot:
+        from skspatial.plotting import plot_3d
+        from skspatial.objects import Point
+
+    # Currently skspatial throws a ValueError if there is no intersection so we have to use this rather ugly way.
+    try:
+        p1, p2 = central_body_sphere.intersect_line(line_between_sun_and_actor)
+        logger.trace("Intersections observed at " + str(p1) + " and " + str(p2))
+        if plot:
+            sat_point = Point(r_sat_heliocentric)
+            plot_3d(
+                line_between_sun_and_actor.plotter(t_1=0, t_2=0.001, c="k"),
+                central_body_sphere.plotter(alpha=0.4),
+                sat_point.plotter(c="b", s=100),
+                p1.plotter(c="r", s=100),
+                p2.plotter(c="r", s=100),
+            )
+    except ValueError:
+        if plot:
+            sat_point = Point(r_sat_heliocentric)
+            plot_3d(
+                line_between_sun_and_actor.plotter(c="k"),
+                central_body_sphere.plotter(alpha=0.4),
+                sat_point.plotter(c="b", s=100),
+            )
+        # No intersection, no eclipse
+        return False
+    # Check that the computed intersection is actually on the linesegment not infinite line
+    if linesegment_between_sun_and_actor.contains_point(p1):
+        logger.trace(f"p1={p1} is on the line between Sun and actor.")
+        return True
+    elif linesegment_between_sun_and_actor.contains_point(p2):
+        logger.trace(f"p2={p2} is on the line between Sun and actor.")
+        return True
+    else:
+        return False
diff --git a/resources/default_cfg.toml b/resources/default_cfg.toml
index b8c9fa2a..27a7696a 100644
--- a/resources/default_cfg.toml
+++ b/resources/default_cfg.toml
@@ -1,5 +1,8 @@
 [sim]
-startDate = "0" # Start of the simulation, relevant for propagation with SGP4 / pykep, in MJD2000
+start_time = 0 # [s] Start time of the simulation in seconds after MJD2000
+dt = 1 # [s] Internal timestep used for computing charging, etc.
+
+[power]
 
 [comms]
 
diff --git a/resources/images/datastructure.svg b/resources/images/datastructure.svg
new file mode 100644
index 00000000..bd2f3e21
--- /dev/null
+++ b/resources/images/datastructure.svg
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Do not edit this file with editors other than diagrams.net -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="781px" height="531px" viewBox="-0.5 -0.5 781 531" content="&lt;mxfile host=&quot;app.diagrams.net&quot; modified=&quot;2022-10-18T09:36:25.873Z&quot; agent=&quot;5.0 (X11)&quot; etag=&quot;qcTpi39l8YdbhphEmIFw&quot; version=&quot;20.4.1&quot; type=&quot;device&quot;&gt;&lt;diagram id=&quot;PEr3S0dvoMAAJkyvMZ88&quot; name=&quot;Page-1&quot;&gt;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&lt;/diagram&gt;&lt;/mxfile&gt;"><defs/><g><path d="M 190 80.5 L 259.9 80.5" fill="none" stroke="#808080" stroke-width="3" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 266.65 80.5 L 257.65 85 L 259.9 80.5 L 257.65 76 Z" fill="#808080" stroke="#808080" stroke-width="3" stroke-miterlimit="10" pointer-events="all"/><rect x="80" y="38" width="110" height="85" rx="1" ry="1" fill="#000000" stroke="#000000" pointer-events="all" transform="translate(2,3)" opacity="0.25"/><rect x="80" y="38" width="110" height="85" rx="1" ry="1" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 108px; height: 1px; padding-top: 118px; margin-left: 81px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Satellite 1</div></div></div></foreignObject><text x="135" y="118" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Satellite 1</text></switch></g><path d="M 189.5 196 L 229.8 196 L 229.8 273 L 259.9 273" fill="none" stroke="#808080" stroke-width="3" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 266.65 273 L 257.65 277.5 L 259.9 273 L 257.65 268.5 Z" fill="#808080" stroke="#808080" stroke-width="3" stroke-miterlimit="10" pointer-events="all"/><rect x="79.5" y="153.5" width="110" height="85" rx="1" ry="1" fill="#000000" stroke="#000000" pointer-events="all" transform="translate(2,3)" opacity="0.25"/><rect x="79.5" y="153.5" width="110" height="85" rx="1" ry="1" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 108px; height: 1px; padding-top: 234px; margin-left: 81px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Satellite 2</div></div></div></foreignObject><text x="135" y="234" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Satellite 2</text></switch></g><path d="M 189.5 310.14 L 229.8 310.1 L 229.8 450.1 L 259.9 450.13" fill="none" stroke="#808080" stroke-width="3" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 266.65 450.14 L 257.64 454.63 L 259.9 450.13 L 257.65 445.63 Z" fill="#808080" stroke="#808080" stroke-width="3" stroke-miterlimit="10" pointer-events="all"/><rect x="79.5" y="267.64" width="110" height="85" rx="1" ry="1" fill="#000000" stroke="#000000" pointer-events="all" transform="translate(2,3)" opacity="0.25"/><rect x="79.5" y="267.64" width="110" height="85" rx="1" ry="1" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 108px; height: 1px; padding-top: 348px; margin-left: 81px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Ground Station 1</div></div></div></foreignObject><text x="135" y="348" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Ground Station 1</text></switch></g><image x="110.5" y="46.5" width="47" height="47" xlink:href="data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjQxMCIgd2lkdGg9IjQxMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNDEwIDQxMCI+PHBhdGggZD0ibSAzNTMuNSAzMDYuNzYgbCAtNDQuNzc4IDQ1LjUwMiIvPjxwYXRoIGQ9Im0gMzA5LjcyIDI2Mi45OCBsIC00Ni45NjYgNDYuMjQiLz48cGF0aCBkPSJtIDI2Ny4xMiAyMTguMDIgbCAxMzAuMTUgMTMwLjE1IGwgLTQ3LjM0IDQ3LjM0IGwgLTEzMC4xNSAtMTMwLjE1IHoiLz48cGF0aCBkPSJtIDI0NC42NCAyMzEuMDMgbCAtMTQuMiAxNC4yIi8+PHBhdGggZD0ibSAxNzguMzcgMTY0Ljc3IGwgLTE0LjIgMTQuMiIvPjxnIHN0cm9rZS13aWR0aD0iMTYiIHN0cm9rZT0iIzAwMCIgZmlsbD0ibm9uZSI+PHBhdGggZD0ibSAxMi43MjEgMjg1LjQ2IGMgOS44MTQgNjYuNTQgNTAuMjcgMTAwLjg4IDExMi40MSAxMTIuNDEiLz48cGF0aCBkPSJtIDYwLjA1IDI4NS40NiBjIDUuNDcyIDM4LjAzIDI1IDU5Ljk0OCA2NS4wOCA2NS4wOCIvPjxwYXRoIGQ9Im0gOTUuNTUgMjg1LjQ2IGMgNS42MzIgMjAuNjg3IDE2LjYwMSAyNy4zNyAyOS41ODEgMjkuNTgxIi8+PC9nPjxwYXRoIGQ9Im0gMTQ1LjI0IDI0MC40OSBsIC0xNy43NDkgNDEuNDEgbCA0MS40MSAtMTcuNzQ5Ii8+PHBhdGggZD0ibSAxOTcuNyAyOTAuMDUgYyAtOC4xNjkgOC4xNjkgLTMyLjAxIC0yLjQyNiAtNTMuMjUgLTIzLjY2NiAtMjEuMjQxIC0yMS4yNDEgLTMxLjgzNCAtNDUuMDggLTIzLjY2NiAtNTMuMjUgOC4xNjkgLTguMTY5IDMyLjAxIDIuNDI2IDUzLjI1IDIzLjY2NiAyMS4yNDEgMjEuMjQxIDMxLjgzNCA0NS4wOCAyMy42NjYgNTMuMjUgeiIvPjxwYXRoIGQ9Im0gMjA5LjE0IDE0My40NiBsIDEwLjczOCAxMC41NiBsIDUuODI5IC01LjgyOSBsIDM1LjQ5OCAzNS40OTggbCAtNS45MTcgNS45MTcgbCAxMS44MzIgMTEuODMyIGwgLTYzLjA3IDYyLjIxIGwgLTU4LjEzIC01OC4xMyB6Ii8+PHBhdGggZD0ibSAxNDcuNjEgMTAwLjg2IGwgLTQ1Ljg3IDQ1Ljg3Ii8+PHBhdGggZD0ibSAxMDMuODMgNTcuMDggbCAtNDUuNzcyIDQ1LjUwMiIvPjxwYXRoIGQ9Im0gNjEuMjMgMTIuMTIgbCAxMzAuMTUgMTMwLjE1IGwgLTQ3LjM0IDQ3LjM0IGwgLTEzMC4xNSAtMTMwLjE1IHoiLz48L3N2Zz4=" preserveAspectRatio="none"/><image x="110.5" y="163" width="47" height="47" xlink:href="data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjQxMCIgd2lkdGg9IjQxMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNDEwIDQxMCI+PHBhdGggZD0ibSAzNTMuNSAzMDYuNzYgbCAtNDQuNzc4IDQ1LjUwMiIvPjxwYXRoIGQ9Im0gMzA5LjcyIDI2Mi45OCBsIC00Ni45NjYgNDYuMjQiLz48cGF0aCBkPSJtIDI2Ny4xMiAyMTguMDIgbCAxMzAuMTUgMTMwLjE1IGwgLTQ3LjM0IDQ3LjM0IGwgLTEzMC4xNSAtMTMwLjE1IHoiLz48cGF0aCBkPSJtIDI0NC42NCAyMzEuMDMgbCAtMTQuMiAxNC4yIi8+PHBhdGggZD0ibSAxNzguMzcgMTY0Ljc3IGwgLTE0LjIgMTQuMiIvPjxnIHN0cm9rZS13aWR0aD0iMTYiIHN0cm9rZT0iIzAwMCIgZmlsbD0ibm9uZSI+PHBhdGggZD0ibSAxMi43MjEgMjg1LjQ2IGMgOS44MTQgNjYuNTQgNTAuMjcgMTAwLjg4IDExMi40MSAxMTIuNDEiLz48cGF0aCBkPSJtIDYwLjA1IDI4NS40NiBjIDUuNDcyIDM4LjAzIDI1IDU5Ljk0OCA2NS4wOCA2NS4wOCIvPjxwYXRoIGQ9Im0gOTUuNTUgMjg1LjQ2IGMgNS42MzIgMjAuNjg3IDE2LjYwMSAyNy4zNyAyOS41ODEgMjkuNTgxIi8+PC9nPjxwYXRoIGQ9Im0gMTQ1LjI0IDI0MC40OSBsIC0xNy43NDkgNDEuNDEgbCA0MS40MSAtMTcuNzQ5Ii8+PHBhdGggZD0ibSAxOTcuNyAyOTAuMDUgYyAtOC4xNjkgOC4xNjkgLTMyLjAxIC0yLjQyNiAtNTMuMjUgLTIzLjY2NiAtMjEuMjQxIC0yMS4yNDEgLTMxLjgzNCAtNDUuMDggLTIzLjY2NiAtNTMuMjUgOC4xNjkgLTguMTY5IDMyLjAxIDIuNDI2IDUzLjI1IDIzLjY2NiAyMS4yNDEgMjEuMjQxIDMxLjgzNCA0NS4wOCAyMy42NjYgNTMuMjUgeiIvPjxwYXRoIGQ9Im0gMjA5LjE0IDE0My40NiBsIDEwLjczOCAxMC41NiBsIDUuODI5IC01LjgyOSBsIDM1LjQ5OCAzNS40OTggbCAtNS45MTcgNS45MTcgbCAxMS44MzIgMTEuODMyIGwgLTYzLjA3IDYyLjIxIGwgLTU4LjEzIC01OC4xMyB6Ii8+PHBhdGggZD0ibSAxNDcuNjEgMTAwLjg2IGwgLTQ1Ljg3IDQ1Ljg3Ii8+PHBhdGggZD0ibSAxMDMuODMgNTcuMDggbCAtNDUuNzcyIDQ1LjUwMiIvPjxwYXRoIGQ9Im0gNjEuMjMgMTIuMTIgbCAxMzAuMTUgMTMwLjE1IGwgLTQ3LjM0IDQ3LjM0IGwgLTEzMC4xNSAtMTMwLjE1IHoiLz48L3N2Zz4=" preserveAspectRatio="none"/><image x="110.5" y="280" width="46" height="46" xlink:href="data:image/png;base64,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PjY/rfNcDrc+GCQriveS8Cc+LvDuB6AhL7GPdbi59gvrACQrivWGZ2tm0MDjNfPYgXXU50Uf97oknP34yDoEyYJi7WH9yDNdwVDWUZenlK4SoD6W+FKcPaxmzKCZx2sq2ZnZPMGJ1sEWhQK7MdE6CEm/4uxhXe6ZruA1vuE5pauElDDEOgTJgmLsYTVgBq09X3UhF9HHOtQiUkF3plgHIWlXjE9yDeYUz9eUsxc9rQMtKrVowTPWQUjaFV8Pqw6f08E6CKlCBT2YbB2EpFvx3cM6V+kqpUq53joESbti62HVYTKdrYOQalSyW5UL1oqsV2w9rPOVrlKslvpYUrPi6mHVYQqdrIOQGlSyO59aByHpVVw9rAuUrlKuFr+yDkHSrJh6WHWYSkfrIMRDgT0Ybx2EpFUx9bC+r3SVASXqY0n1iqeHpfFXWVFgL8ZaByHpVDw9rEFKVxmhPpZUy2vV47yo6ziBSQEobPz35v+vqp/pFVFut5J6rLE+ZCSNiuWSsBZNHE4kEREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREpTv8PadtbBe/plPcAAAAuelRYdGRhdGU6Y3JlYXRlAAAImTMyMDLUNTDWNTQNMbS0MjaxMjDRNjCwMjAAAEF6BQssuxMZAAAALnpUWHRkYXRlOm1vZGlmeQAACJkzMjC01DU01DWwDDEysjIysDIy1zYwsDIwAABB1QUOPYLqKgAAAABJRU5ErkJggg==" preserveAspectRatio="none"/><path d="M 500 80.5 L 540 80.5 L 540 38 L 569.9 38" fill="none" stroke="#808080" stroke-width="3" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 576.65 38 L 567.65 42.5 L 569.9 38 L 567.65 33.5 Z" fill="#808080" stroke="#808080" stroke-width="3" stroke-miterlimit="10" pointer-events="all"/><path d="M 500 80.5 L 540 80.5 L 540 128.5 L 569.9 128.5" fill="none" stroke="#808080" stroke-width="3" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 576.65 128.5 L 567.65 133 L 569.9 128.5 L 567.65 124 Z" fill="#808080" stroke="#808080" stroke-width="3" stroke-miterlimit="10" pointer-events="all"/><rect x="270" y="0.5" width="230" height="160" rx="24" ry="24" fill="#d5e8d4" stroke="#82b366" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 228px; height: 1px; padding-top: 81px; margin-left: 271px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><div><b>PASEOS Instance</b></div><div><br /></div><div align="left">Name = <i>"Satellite 1"</i></div><div align="left">Position = <i>[10000km,0,0]</i></div><div align="left">Velocity = <i>[0, 7km/s, 0]</i></div><div align="left">Battery Level = <i>10 Wh</i></div><div align="left">Comm Link 1 = <i>100 Kbps</i></div><div align="left">Current Charging Rate = <i>10W</i><br /></div></div></div></div></foreignObject><text x="385" y="84" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">PASEOS Instance...</text></switch></g><path d="M 500 273 L 540 273 L 540 240 L 569.9 240" fill="none" stroke="#808080" stroke-width="3" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 576.65 240 L 567.65 244.5 L 569.9 240 L 567.65 235.5 Z" fill="#808080" stroke="#808080" stroke-width="3" stroke-miterlimit="10" pointer-events="all"/><path d="M 500 273 L 540 273 L 540 340.5 L 569.9 340.5" fill="none" stroke="#808080" stroke-width="3" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 576.65 340.5 L 567.65 345 L 569.9 340.5 L 567.65 336 Z" fill="#808080" stroke="#808080" stroke-width="3" stroke-miterlimit="10" pointer-events="all"/><rect x="270" y="193" width="230" height="160" rx="24" ry="24" fill="#d5e8d4" stroke="#82b366" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 228px; height: 1px; padding-top: 273px; margin-left: 271px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><div><b>PASEOS Instance</b></div><div><br /></div><div align="left">Name = <i>"Satellite 2"</i></div><div align="left">Position = <i>[0,10000km,0]</i></div><div align="left">Velocity = <i>[0,0,7km/s]</i></div><div align="left">Battery Level = <i>12 Wh</i></div><div align="left">Comm Link 1 = <i>150 Kbps</i></div><div align="left">Current Charging Rate = <i>20W</i><br /></div></div></div></div></foreignObject><text x="385" y="277" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">PASEOS Instance...</text></switch></g><path d="M 500 450.14 L 540 450.1 L 569.9 449.76" fill="none" stroke="#808080" stroke-width="3" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 576.65 449.68 L 567.7 454.28 L 569.9 449.76 L 567.6 445.28 Z" fill="#808080" stroke="#808080" stroke-width="3" stroke-miterlimit="10" pointer-events="all"/><rect x="270" y="370.14" width="230" height="160" rx="24" ry="24" fill="#d5e8d4" stroke="#82b366" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 228px; height: 1px; padding-top: 450px; margin-left: 271px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><div><b>PASEOS Instance</b></div><div><br /></div><div align="left">Name = <i>"Ground Station 1"</i></div><div align="left">Position = <i>[6371km,0,0]</i></div><div align="left">Velocity = <i>[0, 3.6km/s, 0]</i></div><div align="left">Battery Level = N/A<br /></div><div align="left">Comm Link 1 = 100 Mbps</div><div align="left">Current Charging Rate = N/A<br /></div></div></div></div></foreignObject><text x="385" y="454" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">PASEOS Instance...</text></switch></g><rect x="580" y="7" width="200" height="62" fill="#e1d5e7" stroke="#9673a6" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 198px; height: 1px; padding-top: 38px; margin-left: 581px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><div><b>Known actors</b></div><div><b><br /></b></div><div>"Satellite 2": [Position, ...] <br /></div><div><br /></div></div></div></div></foreignObject><text x="680" y="42" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Known actors...</text></switch></g><rect x="580" y="74" width="200" height="109" fill="#e1d5e7" stroke="#9673a6" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 198px; height: 1px; padding-top: 129px; margin-left: 581px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><div><b>Activity<br /></b></div><div>Name: "Update Model"<br /></div><div>Requires line of sight to: "Satellite 2"</div><div>Power Consumption: 10W<br /></div></div></div></div></foreignObject><text x="680" y="132" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Activity...</text></switch></g><rect x="580" y="199" width="200" height="82" fill="#e1d5e7" stroke="#9673a6" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 198px; height: 1px; padding-top: 240px; margin-left: 581px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><div><b>Known actors</b></div><div><b><br /></b></div><div>"Satellite 1": [Position, ...]</div><div>"Ground Station 1": [Position, ...] <br /></div></div></div></div></foreignObject><text x="680" y="244" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Known actors...</text></switch></g><rect x="580" y="286" width="200" height="109" fill="#e1d5e7" stroke="#9673a6" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 198px; height: 1px; padding-top: 341px; margin-left: 581px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><div><b>Activity<br /></b></div><div>Name: "Update Model"<br /></div><div>Requires line of sight to: "Satellite 1"</div><div>Power Consumption: 10W<br /></div></div></div></div></foreignObject><text x="680" y="344" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Activity...</text></switch></g><rect x="580" y="408.64" width="200" height="82" fill="#e1d5e7" stroke="#9673a6" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 198px; height: 1px; padding-top: 450px; margin-left: 581px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><div><b>Known actors</b></div><div><b><br /></b></div><div>"Satellite 1": [Position, ...]</div></div></div></div></foreignObject><text x="680" y="453" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Known actors...</text></switch></g><rect x="0" y="390.14" width="210" height="24" rx="1" ry="1" fill="#000000" stroke="#000000" pointer-events="all" transform="translate(2,3)" opacity="0.25"/><rect x="0" y="390.14" width="210" height="24" rx="1" ry="1" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 208px; height: 1px; padding-top: 409px; margin-left: 1px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;">Devices</div></div></div></foreignObject><text x="105" y="409" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="14px" text-anchor="middle" font-weight="bold">Devices</text></switch></g><rect x="0" y="427.64" width="210" height="24" rx="1" ry="1" fill="#000000" stroke="#000000" pointer-events="all" transform="translate(2,3)" opacity="0.25"/><rect x="0" y="427.64" width="210" height="24" rx="1" ry="1" fill="#d5e8d4" stroke="#82b366" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 208px; height: 1px; padding-top: 447px; margin-left: 1px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;">PASEOS Instances</div></div></div></foreignObject><text x="105" y="447" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="14px" text-anchor="middle" font-weight="bold">PASEOS Instances</text></switch></g><rect x="0" y="463.64" width="210" height="24" rx="1" ry="1" fill="#000000" stroke="#000000" pointer-events="all" transform="translate(2,3)" opacity="0.25"/><rect x="0" y="463.64" width="210" height="24" rx="1" ry="1" fill="#e1d5e7" stroke="#9673a6" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 208px; height: 1px; padding-top: 483px; margin-left: 1px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;"><br /><div>Transient Data &amp; Activities<br /></div></div></div></div></foreignObject><text x="105" y="483" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="14px" text-anchor="middle" font-weight="bold">Transient Data &amp; Activities...</text></switch></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.diagrams.net/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg>
\ No newline at end of file
diff --git a/resources/images/flowchart.svg b/resources/images/flowchart.svg
new file mode 100644
index 00000000..79e31639
--- /dev/null
+++ b/resources/images/flowchart.svg
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Do not edit this file with editors other than diagrams.net -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="676px" height="429px" viewBox="-0.5 -0.5 676 429" content="&lt;mxfile host=&quot;app.diagrams.net&quot; modified=&quot;2022-10-18T09:40:46.009Z&quot; agent=&quot;5.0 (X11)&quot; etag=&quot;AXJOszbojfVTnti5c_xf&quot; version=&quot;20.4.1&quot; type=&quot;device&quot;&gt;&lt;diagram id=&quot;HDu4OinZYWVNkFEGhl4W&quot; name=&quot;Page-1&quot;&gt;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&lt;/diagram&gt;&lt;/mxfile&gt;"><defs/><g><rect x="425" y="21" width="250" height="407" rx="37.5" ry="37.5" fill="#d5e8d4" stroke="#82b366" stroke-dasharray="3 3" pointer-events="all"/><rect x="25" y="394" width="362.25" height="30" rx="4.5" ry="4.5" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 360px; height: 1px; padding-top: 409px; margin-left: 26px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Local PASEOS Instance - User-level</div></div></div></foreignObject><text x="206" y="413" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="14px" text-anchor="middle">Local PASEOS Instance - User-level</text></switch></g><path d="M 80 95 L 80 115 L 80 100 L 80 109.9" fill="none" stroke="#808080" stroke-width="3" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 80 116.65 L 75.5 107.65 L 80 109.9 L 84.5 107.65 Z" fill="#808080" stroke="#808080" stroke-width="3" stroke-miterlimit="10" pointer-events="all"/><path d="M 80 95 Q 80 115 80 107.5 Q 80 100 80 109.9" fill="none" stroke="#808080" stroke-width="3" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 80 116.65 L 75.5 107.65 L 80 109.9 L 84.5 107.65 Z" fill="#808080" stroke="#808080" stroke-width="3" stroke-miterlimit="10" pointer-events="all"/><ellipse cx="80" cy="70" rx="80" ry="25" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 70px; margin-left: 1px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><div>Initialize PASEOS</div><div>(start time)<br /></div></div></div></div></foreignObject><text x="80" y="74" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="14px" text-anchor="middle">Initialize PASEOS...</text></switch></g><path d="M 80 210 L 80 240.9" fill="none" stroke="#808080" stroke-width="3" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 80 247.65 L 75.5 238.65 L 80 240.9 L 84.5 238.65 Z" fill="#808080" stroke="#808080" stroke-width="3" stroke-miterlimit="10" pointer-events="all"/><path d="M 391 65 Q 428.2 65 428.2 71 Q 428.2 77 455.15 77" fill="none" stroke="#808080" stroke-width="3" stroke-miterlimit="10" stroke-dasharray="9 9" pointer-events="stroke"/><path d="M 461.9 77 L 452.9 81.5 L 455.15 77 L 452.9 72.5 Z" fill="#808080" stroke="#808080" stroke-width="3" stroke-miterlimit="10" pointer-events="all"/><path d="M 258.88 36.62 L 165 36.6 L 165 218 L 80 218 L 80 240.9" fill="none" stroke="#808080" stroke-width="3" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 80 247.65 L 75.5 238.65 L 80 240.9 L 84.5 238.65 Z" fill="#808080" stroke="#808080" stroke-width="3" stroke-miterlimit="10" pointer-events="all"/><ellipse cx="313.5" cy="65" rx="77.5" ry="40" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 153px; height: 1px; padding-top: 65px; margin-left: 237px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><div>Add Activity</div><div>(LoS, power consumption)<br /></div></div></div></div></foreignObject><text x="314" y="69" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="14px" text-anchor="middle">Add Activity...</text></switch></g><path d="M 391 152 Q 428.2 152 428.2 114.5 Q 428.2 77 455.15 77" fill="none" stroke="#808080" stroke-width="3" stroke-miterlimit="10" stroke-dasharray="9 9" pointer-events="stroke"/><path d="M 461.9 77 L 452.9 81.5 L 455.15 77 L 452.9 72.5 Z" fill="#808080" stroke="#808080" stroke-width="3" stroke-miterlimit="10" pointer-events="all"/><path d="M 391 152 Q 430 152 430 165 Q 430 178 458.9 178" fill="none" stroke="#808080" stroke-width="3" stroke-miterlimit="10" stroke-dasharray="9 9" pointer-events="stroke"/><path d="M 465.65 178 L 456.65 182.5 L 458.9 178 L 456.65 173.5 Z" fill="#808080" stroke="#808080" stroke-width="3" stroke-miterlimit="10" pointer-events="all"/><path d="M 258.88 180.38 L 258.9 218 L 80 218 L 80 240.9" fill="none" stroke="#808080" stroke-width="3" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 80 247.65 L 75.5 238.65 L 80 240.9 L 84.5 238.65 Z" fill="#808080" stroke="#808080" stroke-width="3" stroke-miterlimit="10" pointer-events="all"/><ellipse cx="313.5" cy="152" rx="77.5" ry="40" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 153px; height: 1px; padding-top: 152px; margin-left: 237px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><div>Perform Activity</div><div>(start time,</div><div>end time)<br /></div></div></div></div></foreignObject><text x="314" y="156" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="14px" text-anchor="middle">Perform Activity...</text></switch></g><path d="M 129.25 296 L 182.7 296 L 182.7 65 L 225.9 65" fill="none" stroke="#808080" stroke-width="3" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 232.65 65 L 223.65 69.5 L 225.9 65 L 223.65 60.5 Z" fill="#808080" stroke="#808080" stroke-width="3" stroke-miterlimit="10" pointer-events="all"/><path d="M 129.25 296 L 182.7 296 L 182.7 152 L 225.9 152" fill="none" stroke="#808080" stroke-width="3" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 232.65 152 L 223.65 156.5 L 225.9 152 L 223.65 147.5 Z" fill="#808080" stroke="#808080" stroke-width="3" stroke-miterlimit="10" pointer-events="all"/><path d="M 129.25 296 L 182.7 296 L 182.7 340 L 225.9 340" fill="none" stroke="#808080" stroke-width="3" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 232.65 340 L 223.65 344.5 L 225.9 340 L 223.65 335.5 Z" fill="#808080" stroke="#808080" stroke-width="3" stroke-miterlimit="10" pointer-events="all"/><path d="M 129.25 296 L 182.7 296 L 182.7 260 L 225.9 260" fill="none" stroke="#808080" stroke-width="3" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 232.65 260 L 223.65 264.5 L 225.9 260 L 223.65 255.5 Z" fill="#808080" stroke="#808080" stroke-width="3" stroke-miterlimit="10" pointer-events="all"/><path d="M 80 251 L 129.25 296 L 80 341 L 30.75 296 Z" fill="#dae8fc" stroke="#6c8ebf" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 97px; height: 1px; padding-top: 296px; margin-left: 32px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><div>Decide</div><div>on next <br /></div><div>step<br /></div></div></div></div></foreignObject><text x="80" y="300" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="14px" text-anchor="middle">Decide...</text></switch></g><path d="M 391 260 Q 391 258 398 258 Q 405 258 405 279 Q 405 300 455.15 300" fill="none" stroke="#808080" stroke-width="3" stroke-miterlimit="10" stroke-dasharray="9 9" pointer-events="stroke"/><path d="M 461.9 300 L 452.9 304.5 L 455.15 300 L 452.9 295.5 Z" fill="#808080" stroke="#808080" stroke-width="3" stroke-miterlimit="10" pointer-events="all"/><path d="M 258.88 231.62 L 258.9 218 L 80 218 L 80 240.9" fill="none" stroke="#808080" stroke-width="3" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 80 247.65 L 75.5 238.65 L 80 240.9 L 84.5 238.65 Z" fill="#808080" stroke="#808080" stroke-width="3" stroke-miterlimit="10" pointer-events="all"/><ellipse cx="313.5" cy="260" rx="77.5" ry="40" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 153px; height: 1px; padding-top: 260px; margin-left: 237px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><div>Update / Query Info</div><div>(e.g. known actors, line of sight)<br /></div></div></div></div></foreignObject><text x="314" y="264" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="14px" text-anchor="middle">Update / Query Info...</text></switch></g><path d="M 391 340 Q 391 337 403 337 Q 415 337 415 257.5 Q 415 178 458.9 178" fill="none" stroke="#808080" stroke-width="3" stroke-miterlimit="10" stroke-dasharray="9 9" pointer-events="stroke"/><path d="M 465.65 178 L 456.65 182.5 L 458.9 178 L 456.65 173.5 Z" fill="#808080" stroke="#808080" stroke-width="3" stroke-miterlimit="10" pointer-events="all"/><path d="M 258.88 368.38 L 258.9 365 L 80 365 L 80 351.1" fill="none" stroke="#808080" stroke-width="3" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 80 344.35 L 84.5 353.35 L 80 351.1 L 75.5 353.35 Z" fill="#808080" stroke="#808080" stroke-width="3" stroke-miterlimit="10" pointer-events="all"/><ellipse cx="313.5" cy="340" rx="77.5" ry="40" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 153px; height: 1px; padding-top: 340px; margin-left: 237px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><div>Advance local time</div><div>(end time)<br /></div></div></div></div></foreignObject><text x="314" y="344" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="14px" text-anchor="middle">Advance local time...</text></switch></g><rect x="444" y="394" width="228" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 226px; height: 1px; padding-top: 409px; margin-left: 446px;"><div style="box-sizing: border-box; font-size: 0px; text-align: left;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><div>Local PASEOS Instance - Internal</div></div></div></div></foreignObject><text x="446" y="413" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="14px">Local PASEOS Instance - Internal</text></switch></g><ellipse cx="559" cy="300" rx="93.75" ry="45" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 186px; height: 1px; padding-top: 300px; margin-left: 466px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><div>Run necessary models</div><div>(e.g. power consumption, battery, line of sight, ...<br /></div></div></div></div></foreignObject><text x="559" y="304" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="14px" text-anchor="middle">Run necessary models...</text></switch></g><path d="M 559 218 Q 559 218 559 248.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 559 253.88 L 555.5 246.88 L 559 248.63 L 562.5 246.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><ellipse cx="559" cy="178" rx="90" ry="40" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 178px; height: 1px; padding-top: 178px; margin-left: 470px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Update local time over several timesteps</div></div></div></foreignObject><text x="559" y="182" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="14px" text-anchor="middle">Update local time over sev...</text></switch></g><ellipse cx="559" cy="77" rx="93.75" ry="40" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 186px; height: 1px; padding-top: 77px; margin-left: 466px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Update instance level variables (known actors, activities)</div></div></div></foreignObject><text x="559" y="81" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="14px" text-anchor="middle">Update instance level varia...</text></switch></g><path d="M 80.5 20 Q 80.5 20 80.2 34.9" fill="none" stroke="#808080" stroke-width="3" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 80.07 41.65 L 75.75 32.56 L 80.2 34.9 L 84.75 32.74 Z" fill="#808080" stroke="#808080" stroke-width="3" stroke-miterlimit="10" pointer-events="all"/><ellipse cx="80.5" cy="10" rx="10" ry="10" fill="#808080" stroke="rgb(0, 0, 0)" pointer-events="all"/><ellipse cx="80" cy="165" rx="72.5" ry="45" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 143px; height: 1px; padding-top: 165px; margin-left: 9px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><div>Specify Local</div><div>Actor Parameters</div><div>(orbit, power, ...)<br /></div></div></div></div></foreignObject><text x="80" y="169" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="14px" text-anchor="middle">Specify Local...</text></switch></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.diagrams.net/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg>
\ No newline at end of file


Test patch:
diff --git a/paseos/tests/activity_test.py b/paseos/tests/activity_test.py
new file mode 100644
index 00000000..b3ff6971
--- /dev/null
+++ b/paseos/tests/activity_test.py
@@ -0,0 +1,23 @@
+"""Simple test of starting an activity"""
+from test_utils import get_default_instance
+
+
+def test_activity():
+    """Test if performing activity consumes power as expected"""
+    sim, sat1, earth = get_default_instance()
+
+    # Initial power is 500
+    assert sat1.battery_level_in_Ws == 500
+
+    # Register an activity that draws 10 watt per second
+    sim.register_activity("Testing", power_consumption_in_watt=10)
+
+    # Run the activity for 5 seconds
+    sim.perform_activity("Testing", duration_in_s=5)
+
+    # Check power was depleted as expected
+    assert sat1.battery_level_in_Ws == 450
+
+
+if __name__ == "__main__":
+    test_activity()
diff --git a/paseos/tests/check_communication_test.py b/paseos/tests/check_communication_test.py
new file mode 100644
index 00000000..162b898d
--- /dev/null
+++ b/paseos/tests/check_communication_test.py
@@ -0,0 +1,80 @@
+"""Test to check the communication function(s)"""
+import sys
+
+sys.path.append("../..")
+
+from paseos import SpacecraftActor
+
+import pykep as pk
+
+
+def from_epoch_to_s(epoch: pk.epoch):
+    return (epoch.mjd2000 - pk.epoch(0).mjd2000) / pk.SEC2DAY
+
+
+def test_communication_link():
+    # create satellites where sat1 and sat2 starts from the same point but move along different orbit.
+    # At t=1470s they will not be in line of sight anymore.
+    earth = pk.planet.jpl_lp("earth")
+    sat1 = SpacecraftActor(
+        "sat1",
+        position=[10000000, 1e-3, 1e-3],
+        velocity=[1e-3, 8000, 1e-3],
+        epoch=pk.epoch(0),
+        central_body=earth,
+        battery_level_in_Ws=1,
+        max_battery_level_in_Ws=1,
+        charging_rate_in_W=1,
+    )
+    sat2 = SpacecraftActor(
+        "sat2",
+        position=[10000000, 1e-3, 1e-3],
+        velocity=[1e-3, -8000, 1e-3],
+        epoch=pk.epoch(0),
+        central_body=earth,
+        battery_level_in_Ws=1,
+        max_battery_level_in_Ws=1,
+        charging_rate_in_W=1,
+    )
+
+    # Add communication link
+    sat1.add_communication_links(name="link1", bandwidth_in_kbps=1)
+
+    # Check communication link at == 0. Satellites shall be in line of sight
+    (
+        _,
+        communication_window_end_time,
+        transmitted_data_in_b,
+    ) = sat1.get_communication_window(
+        local_actor_communication_link_name="link1",
+        target_actor=sat2,
+        dt=10,
+        t0=pk.epoch(0),
+        data_to_send_in_b=10000,
+    )
+
+    assert (from_epoch_to_s(communication_window_end_time) >= 10) and (
+        transmitted_data_in_b == 10000
+    )
+
+    # Check again after communication_window_end_time
+    (
+        communication_window_start_time,
+        communication_window_end_time,
+        transmitted_data_in_b,
+    ) = sat1.get_communication_window(
+        local_actor_communication_link_name="link1",
+        target_actor=sat2,
+        dt=10,
+        t0=communication_window_end_time,
+        data_to_send_in_b=10000,
+    )
+
+    assert (transmitted_data_in_b == 0) and (
+        from_epoch_to_s(communication_window_end_time)
+        == from_epoch_to_s(communication_window_start_time)
+    )
+
+
+if __name__ == "__main__":
+    test_communication_link()
diff --git a/paseos/tests/eclipse_test.py b/paseos/tests/eclipse_test.py
new file mode 100644
index 00000000..63f913a3
--- /dev/null
+++ b/paseos/tests/eclipse_test.py
@@ -0,0 +1,22 @@
+"""Test to check the eclipse function(s)"""
+import sys
+
+sys.path.append("../..")
+
+from paseos.power.is_in_eclipse import is_in_eclipse
+
+import pykep as pk
+
+from test_utils import get_default_instance
+
+
+def test_eclipse():
+    """Get the default satellite and see if is in eclipse and getting out of it"""
+    sim, sat1, earth = get_default_instance()
+
+    assert not is_in_eclipse(sat1, earth, pk.epoch(0), plot=True)
+    assert is_in_eclipse(sat1, earth, pk.epoch(0.5), plot=True)
+
+
+if __name__ == "__main__":
+    test_eclipse()
diff --git a/paseos/tests/init_test.py b/paseos/tests/init_test.py
index 23ce0747..52ec4efb 100644
--- a/paseos/tests/init_test.py
+++ b/paseos/tests/init_test.py
@@ -4,27 +4,28 @@
 
 sys.path.append("../..")
 
-import paseos
 from paseos import SpacecraftActor
 import pykep as pk
 import numpy as np
 
+from test_utils import get_default_instance
+
 
 def test_init():
-    sim = paseos.init_sim()
+    sim, sat1, earth = get_default_instance()  # noqa
     cfg = sim.get_cfg()  # noqa
-    print(cfg)
 
 
 def test_adding_sat():
-    earth = pk.planet.jpl_lp("earth")
-    actor = SpacecraftActor("sat1", [1000000, 0, 0], [0, 8000.0, 0], pk.epoch(0), earth)
-    sim = paseos.init_sim()
-    sim.add_actor(actor)
+    sim, _, earth = get_default_instance()
+
+    sat1 = SpacecraftActor(
+        "sat1", [1000000, 0, 0], [0, 8000.0, 0], pk.epoch(0), earth, 1, 1, 1
+    )
 
     # check initial positions
     # r - position vector, v - velocity vector
-    r, v = actor.get_position_velocity(pk.epoch(0))
+    r, v = sat1.get_position_velocity(pk.epoch(0))
     assert np.isclose(r[0], 1000000)
     assert np.isclose(r[1], 0)
     assert np.isclose(r[2], 0)
@@ -33,7 +34,7 @@ def test_adding_sat():
     assert np.isclose(v[2], 0)
 
     # check positions one second later
-    r, v = actor.get_position_velocity(pk.epoch(1 * pk.SEC2DAY))
+    r, v = sat1.get_position_velocity(pk.epoch(1 * pk.SEC2DAY))
     assert np.isclose(r[0], 999800.6897266058)
     assert np.isclose(r[1], 7999.468463301808)
     assert np.isclose(r[2], 0.0)
diff --git a/paseos/tests/line_of_sight_test.py b/paseos/tests/line_of_sight_test.py
index f3ff135a..80063e86 100644
--- a/paseos/tests/line_of_sight_test.py
+++ b/paseos/tests/line_of_sight_test.py
@@ -3,27 +3,26 @@
 
 sys.path.append("../..")
 
-import paseos
 from paseos import SpacecraftActor
 
 import pykep as pk
 
+from test_utils import get_default_instance
+
 
 def test_los():
-    # init simulation
-    sim = paseos.init_sim()
-
-    # create satellites where sat1 and 2 are in sight of each other (as well as sat 1 and 3)
-    # but sat 2 and 3 are on opposite sides of the planet
-    earth = pk.planet.jpl_lp("earth")
-    sat1 = SpacecraftActor("sat1", [10000000, 0, 0], [0, 8000.0, 0], pk.epoch(0), earth)
-    sim.add_actor(sat1)
-    sat2 = SpacecraftActor("sat2", [0, 10000000, 0], [0, 0, 8000.0], pk.epoch(0), earth)
-    sim.add_actor(sat2)
+    """create satellites where sat1 and 2 are in sight of each other (as well as sat 1 and 3)
+    but sat 2 and 3 are on opposite sides of the planet"""
+    sim, sat1, earth = get_default_instance()
+
+    sat2 = SpacecraftActor(
+        "sat2", [0, 10000000, 0], [0, 0, 8000.0], pk.epoch(0), earth, 1, 1, 1
+    )
+    sim.add_known_actor(sat2)
     sat3 = SpacecraftActor(
-        "sat3", [0, -10000000, 0], [0, 0, -8000.0], pk.epoch(0), earth
+        "sat3", [0, -10000000, 0], [0, 0, -8000.0], pk.epoch(0), earth, 1, 1, 1
     )
-    sim.add_actor(sat3)
+    sim.add_known_actor(sat3)
 
     # check that LOS is correct
     assert sat1.is_in_line_of_sight(sat2, pk.epoch(0))
diff --git a/paseos/tests/power_test.py b/paseos/tests/power_test.py
new file mode 100644
index 00000000..e269f906
--- /dev/null
+++ b/paseos/tests/power_test.py
@@ -0,0 +1,19 @@
+"""This test checks whether power charging is performed correctly"""
+
+from test_utils import get_default_instance
+
+
+def test_power_charging():
+    """Checks whether we can charge an actor"""
+    sim, sat1, earth = get_default_instance()
+
+    # Initial power is 500m check charging works
+    assert sat1.battery_level_in_Ws == 500
+    sim.advance_time(42)
+    assert sat1.battery_level_in_Ws == 542
+
+    # TODO check charging doesn't work when in eclipse
+
+
+if __name__ == "__main__":
+    test_power_charging()
diff --git a/paseos/tests/test_utils.py b/paseos/tests/test_utils.py
new file mode 100644
index 00000000..4ad1095b
--- /dev/null
+++ b/paseos/tests/test_utils.py
@@ -0,0 +1,26 @@
+"""Utility for tests"""
+import sys
+
+sys.path.append("../..")
+
+import paseos
+from paseos import SpacecraftActor
+
+import pykep as pk
+
+
+def get_default_instance() -> (paseos.PASEOS, SpacecraftActor, pk.planet):
+    """Sets up a instance of paseos with a satellite in orbit around Earth"""
+
+    # Define central body
+    earth = pk.planet.jpl_lp("earth")
+
+    # Define local actor
+    sat1 = SpacecraftActor(
+        "sat1", [10000000, 0, 0], [0, 8000.0, 0], pk.epoch(0), earth, 500, 10000, 1
+    )
+
+    # init simulation
+    sim = paseos.init_sim(sat1)
+
+    return sim, sat1, earth