Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
159 changes: 159 additions & 0 deletions bootcamp_main.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,21 @@
# ↓ BOOTCAMPERS MODIFY BELOW THIS COMMENT ↓
# =================================================================================================
# Set queue max sizes (<= 0 for infinity)
HEARTBEAT_RECEIVER_QUEUE_MAX_SIZE = 5
TELEMETRY_QUEUE_MAX_SIZE = 5
COMMAND_QUEUE_MAX_SIZE = 5

# Set worker counts
HEARTBEAT_SENDER_WORKER_COUNT = 1
HEARTBEAT_RECEIVER_WORKER_COUNT = 1
TELEMETRY_WORKER_COUNT = 1
COMMAND_WORKER_COUNT = 1

# Any other constants
# Target position for the drone to face and match altitude
TARGET = command.Position(10, 20, 30)
# Run duration in seconds
RUN_DURATION = 100

# =================================================================================================
# ↑ BOOTCAMPERS MODIFY ABOVE THIS COMMENT ↑
Expand Down Expand Up @@ -74,43 +85,191 @@ def main() -> int:
# ↓ BOOTCAMPERS MODIFY BELOW THIS COMMENT ↓
# =============================================================================================
# Create a worker controller
controller = worker_controller.WorkerController()

# Create a multiprocess manager for synchronized queues
mp_manager = mp.Manager()

# Create queues
# Heartbeat receiver outputs connection status to main
heartbeat_receiver_queue = queue_proxy_wrapper.QueueProxyWrapper(
mp_manager,
HEARTBEAT_RECEIVER_QUEUE_MAX_SIZE,
)
# Telemetry outputs TelemetryData to Command worker
telemetry_to_command_queue = queue_proxy_wrapper.QueueProxyWrapper(
mp_manager,
TELEMETRY_QUEUE_MAX_SIZE,
)
# Command outputs command status strings to main
command_queue = queue_proxy_wrapper.QueueProxyWrapper(
mp_manager,
COMMAND_QUEUE_MAX_SIZE,
)

# Create worker properties for each worker type (what inputs it takes, how many workers)
# Heartbeat sender
result, heartbeat_sender_properties = worker_manager.WorkerProperties.create(
count=HEARTBEAT_SENDER_WORKER_COUNT,
target=heartbeat_sender_worker.heartbeat_sender_worker,
work_arguments=(connection,),
input_queues=[],
output_queues=[],
controller=controller,
local_logger=main_logger,
)
if not result:
main_logger.error("Failed to create arguments for Heartbeat Sender")
return -1

assert heartbeat_sender_properties is not None

# Heartbeat receiver
result, heartbeat_receiver_properties = worker_manager.WorkerProperties.create(
count=HEARTBEAT_RECEIVER_WORKER_COUNT,
target=heartbeat_receiver_worker.heartbeat_receiver_worker,
work_arguments=(connection,),
input_queues=[],
output_queues=[heartbeat_receiver_queue],
controller=controller,
local_logger=main_logger,
)
if not result:
main_logger.error("Failed to create arguments for Heartbeat Receiver")
return -1

assert heartbeat_receiver_properties is not None

# Telemetry
result, telemetry_properties = worker_manager.WorkerProperties.create(
count=TELEMETRY_WORKER_COUNT,
target=telemetry_worker.telemetry_worker,
work_arguments=(connection,),
input_queues=[],
output_queues=[telemetry_to_command_queue],
controller=controller,
local_logger=main_logger,
)
if not result:
main_logger.error("Failed to create arguments for Telemetry")
return -1

assert telemetry_properties is not None

# Command
result, command_properties = worker_manager.WorkerProperties.create(
count=COMMAND_WORKER_COUNT,
target=command_worker.command_worker,
work_arguments=(connection, TARGET),
input_queues=[telemetry_to_command_queue],
output_queues=[command_queue],
controller=controller,
local_logger=main_logger,
)
if not result:
main_logger.error("Failed to create arguments for Command")
return -1

assert command_properties is not None

# Create the workers (processes) and obtain their managers
worker_managers: list[worker_manager.WorkerManager] = []

result, heartbeat_sender_manager = worker_manager.WorkerManager.create(
worker_properties=heartbeat_sender_properties,
local_logger=main_logger,
)
if not result:
main_logger.error("Failed to create manager for Heartbeat Sender")
return -1

assert heartbeat_sender_manager is not None
worker_managers.append(heartbeat_sender_manager)

result, heartbeat_receiver_manager = worker_manager.WorkerManager.create(
worker_properties=heartbeat_receiver_properties,
local_logger=main_logger,
)
if not result:
main_logger.error("Failed to create manager for Heartbeat Receiver")
return -1

assert heartbeat_receiver_manager is not None
worker_managers.append(heartbeat_receiver_manager)

result, telemetry_manager = worker_manager.WorkerManager.create(
worker_properties=telemetry_properties,
local_logger=main_logger,
)
if not result:
main_logger.error("Failed to create manager for Telemetry")
return -1

assert telemetry_manager is not None
worker_managers.append(telemetry_manager)

result, command_manager = worker_manager.WorkerManager.create(
worker_properties=command_properties,
local_logger=main_logger,
)
if not result:
main_logger.error("Failed to create manager for Command")
return -1

assert command_manager is not None
worker_managers.append(command_manager)

# Start worker processes
for manager in worker_managers:
manager.start_workers()

main_logger.info("Started")

# Main's work: read from all queues that output to main, and log any commands that we make
# Continue running for 100 seconds or until the drone disconnects
start_time = time.time()
is_connected = True

while (time.time() - start_time) < RUN_DURATION and is_connected:
# Read connection status from heartbeat receiver
try:
status = heartbeat_receiver_queue.queue.get(timeout=0.1)
if status is not None:
main_logger.info(f"Connection status: {status}")
if status == "disconnected":
is_connected = False
except queue.Empty:
pass

# Read command status from command worker
try:
command_status = command_queue.queue.get(timeout=0.1)
if command_status is not None:
main_logger.info(f"Command: {command_status}")
except queue.Empty:
pass

# Stop the processes
controller.request_exit()

main_logger.info("Requested exit")

# Fill and drain queues from END TO START
command_queue.fill_and_drain_queue()
telemetry_to_command_queue.fill_and_drain_queue()
heartbeat_receiver_queue.fill_and_drain_queue()

main_logger.info("Queues cleared")

# Clean up worker processes
for manager in worker_managers:
manager.join_workers()

main_logger.info("Stopped")

# We can reset controller in case we want to reuse it
# Alternatively, create a new WorkerController instance
controller.clear_exit()

# =============================================================================================
# ↑ BOOTCAMPERS MODIFY ABOVE THIS COMMENT ↑
Expand Down
10 changes: 10 additions & 0 deletions logs/2026-01-14_23-24-01/heartbeat_sender_drone_26060.log
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
23:41:06: [INFO] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\tests\integration\mock_drones\heartbeat_sender_drone.py | main | 40] Logger initialized
23:41:55: [INFO] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\tests\integration\mock_drones\heartbeat_sender_drone.py | main | 71] Drone: Recieved heartbeat!
23:41:56: [INFO] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\tests\integration\mock_drones\heartbeat_sender_drone.py | main | 71] Drone: Recieved heartbeat!
23:41:57: [INFO] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\tests\integration\mock_drones\heartbeat_sender_drone.py | main | 71] Drone: Recieved heartbeat!
23:41:58: [INFO] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\tests\integration\mock_drones\heartbeat_sender_drone.py | main | 71] Drone: Recieved heartbeat!
23:41:59: [INFO] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\tests\integration\mock_drones\heartbeat_sender_drone.py | main | 71] Drone: Recieved heartbeat!
23:42:00: [INFO] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\tests\integration\mock_drones\heartbeat_sender_drone.py | main | 71] Drone: Recieved heartbeat!
23:42:01: [INFO] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\tests\integration\mock_drones\heartbeat_sender_drone.py | main | 71] Drone: Recieved heartbeat!
23:42:02: [INFO] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\tests\integration\mock_drones\heartbeat_sender_drone.py | main | 71] Drone: Recieved heartbeat!
23:42:03: [ERROR] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\tests\integration\mock_drones\heartbeat_sender_drone.py | main | 56] Drone: Sent incorrect message type or didn't recieve a message in time: None
1 change: 1 addition & 0 deletions logs/2026-01-14_23-24-01/main.log
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
23:24:01: [INFO] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\modules\common\modules\logger\logger_main_setup.py | setup_main_logger | 62] main logger initialized
5 changes: 5 additions & 0 deletions logs/2026-01-14_23-41-54/heartbeat_sender_drone_26244.log
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
23:43:51: [INFO] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\tests\integration\mock_drones\heartbeat_sender_drone.py | main | 40] Logger initialized
23:44:03: [INFO] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\tests\integration\mock_drones\heartbeat_sender_drone.py | main | 71] Drone: Recieved heartbeat!
23:44:04: [INFO] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\tests\integration\mock_drones\heartbeat_sender_drone.py | main | 71] Drone: Recieved heartbeat!
23:44:05: [INFO] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\tests\integration\mock_drones\heartbeat_sender_drone.py | main | 71] Drone: Recieved heartbeat!
23:44:06: [ERROR] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\tests\integration\mock_drones\heartbeat_sender_drone.py | main | 61] Drone: Most likely sent heartbeats too fast: measured period was 0.9728507995605469s
14 changes: 14 additions & 0 deletions logs/2026-01-14_23-41-54/heartbeat_sender_worker_31068.log
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
23:41:54: [INFO] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\modules\heartbeat\heartbeat_sender_worker.py | heartbeat_sender_worker | 49] Logger initialized
23:41:54: [INFO] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\modules\heartbeat\heartbeat_sender_worker.py | heartbeat_sender_worker | 63] HeartbeatSender created successfully
23:41:54: [INFO] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\modules\heartbeat\heartbeat_sender_worker.py | heartbeat_sender_worker | 73] Heartbeat sent
23:41:55: [INFO] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\modules\heartbeat\heartbeat_sender_worker.py | heartbeat_sender_worker | 73] Heartbeat sent
23:41:56: [INFO] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\modules\heartbeat\heartbeat_sender_worker.py | heartbeat_sender_worker | 73] Heartbeat sent
23:41:57: [INFO] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\modules\heartbeat\heartbeat_sender_worker.py | heartbeat_sender_worker | 73] Heartbeat sent
23:41:58: [INFO] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\modules\heartbeat\heartbeat_sender_worker.py | heartbeat_sender_worker | 73] Heartbeat sent
23:41:59: [INFO] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\modules\heartbeat\heartbeat_sender_worker.py | heartbeat_sender_worker | 73] Heartbeat sent
23:42:00: [INFO] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\modules\heartbeat\heartbeat_sender_worker.py | heartbeat_sender_worker | 73] Heartbeat sent
23:42:01: [INFO] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\modules\heartbeat\heartbeat_sender_worker.py | heartbeat_sender_worker | 73] Heartbeat sent
23:42:02: [INFO] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\modules\heartbeat\heartbeat_sender_worker.py | heartbeat_sender_worker | 73] Heartbeat sent
23:42:03: [INFO] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\modules\heartbeat\heartbeat_sender_worker.py | heartbeat_sender_worker | 73] Heartbeat sent
23:42:04: [INFO] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\modules\heartbeat\heartbeat_sender_worker.py | heartbeat_sender_worker | 73] Heartbeat sent
23:42:05: [INFO] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\modules\heartbeat\heartbeat_sender_worker.py | heartbeat_sender_worker | 80] Heartbeat sender worker exiting
2 changes: 2 additions & 0 deletions logs/2026-01-14_23-41-54/main.log
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
23:41:54: [INFO] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\modules\common\modules\logger\logger_main_setup.py | setup_main_logger | 62] main logger initialized
23:41:54: [INFO] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\tests\integration\test_heartbeat_sender.py | main | 91] Connected!
15 changes: 15 additions & 0 deletions logs/2026-01-14_23-44-02/heartbeat_sender_worker_1000.log
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
23:44:02: [INFO] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\modules\heartbeat\heartbeat_sender_worker.py | heartbeat_sender_worker | 49] Logger initialized
23:44:02: [INFO] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\modules\heartbeat\heartbeat_sender_worker.py | heartbeat_sender_worker | 63] HeartbeatSender created successfully
23:44:02: [INFO] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\modules\heartbeat\heartbeat_sender_worker.py | heartbeat_sender_worker | 73] Heartbeat sent
23:44:03: [INFO] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\modules\heartbeat\heartbeat_sender_worker.py | heartbeat_sender_worker | 73] Heartbeat sent
23:44:04: [INFO] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\modules\heartbeat\heartbeat_sender_worker.py | heartbeat_sender_worker | 73] Heartbeat sent
23:44:05: [INFO] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\modules\heartbeat\heartbeat_sender_worker.py | heartbeat_sender_worker | 73] Heartbeat sent
23:44:06: [INFO] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\modules\heartbeat\heartbeat_sender_worker.py | heartbeat_sender_worker | 73] Heartbeat sent
23:44:07: [INFO] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\modules\heartbeat\heartbeat_sender_worker.py | heartbeat_sender_worker | 73] Heartbeat sent
23:44:08: [INFO] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\modules\heartbeat\heartbeat_sender_worker.py | heartbeat_sender_worker | 73] Heartbeat sent
23:44:09: [INFO] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\modules\heartbeat\heartbeat_sender_worker.py | heartbeat_sender_worker | 73] Heartbeat sent
23:44:10: [INFO] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\modules\heartbeat\heartbeat_sender_worker.py | heartbeat_sender_worker | 73] Heartbeat sent
23:44:11: [INFO] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\modules\heartbeat\heartbeat_sender_worker.py | heartbeat_sender_worker | 73] Heartbeat sent
23:44:12: [INFO] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\modules\heartbeat\heartbeat_sender_worker.py | heartbeat_sender_worker | 73] Heartbeat sent
23:44:13: [INFO] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\modules\heartbeat\heartbeat_sender_worker.py | heartbeat_sender_worker | 73] Heartbeat sent
23:44:14: [INFO] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\modules\heartbeat\heartbeat_sender_worker.py | heartbeat_sender_worker | 80] Heartbeat sender worker exiting
2 changes: 2 additions & 0 deletions logs/2026-01-14_23-44-02/main.log
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
23:44:02: [INFO] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\modules\common\modules\logger\logger_main_setup.py | setup_main_logger | 62] main logger initialized
23:44:02: [INFO] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\tests\integration\test_heartbeat_sender.py | main | 91] Connected!
4 changes: 4 additions & 0 deletions logs/2026-01-18_10-53-02/heartbeat_sender_drone_36704.log
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
10:53:04: [INFO] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\tests\integration\mock_drones\heartbeat_sender_drone.py | main | 40] Logger initialized
10:53:06: [INFO] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\tests\integration\mock_drones\heartbeat_sender_drone.py | main | 71] Drone: Recieved heartbeat!
10:53:07: [INFO] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\tests\integration\mock_drones\heartbeat_sender_drone.py | main | 71] Drone: Recieved heartbeat!
10:53:08: [ERROR] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\tests\integration\mock_drones\heartbeat_sender_drone.py | main | 56] Drone: Sent incorrect message type or didn't recieve a message in time: None
15 changes: 15 additions & 0 deletions logs/2026-01-18_10-53-02/heartbeat_sender_worker_35588.log
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
10:53:05: [INFO] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\modules\heartbeat\heartbeat_sender_worker.py | heartbeat_sender_worker | 49] Logger initialized
10:53:05: [INFO] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\modules\heartbeat\heartbeat_sender_worker.py | heartbeat_sender_worker | 63] HeartbeatSender created successfully
10:53:05: [INFO] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\modules\heartbeat\heartbeat_sender_worker.py | heartbeat_sender_worker | 75] Heartbeat sent
10:53:06: [INFO] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\modules\heartbeat\heartbeat_sender_worker.py | heartbeat_sender_worker | 75] Heartbeat sent
10:53:07: [INFO] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\modules\heartbeat\heartbeat_sender_worker.py | heartbeat_sender_worker | 75] Heartbeat sent
10:53:08: [INFO] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\modules\heartbeat\heartbeat_sender_worker.py | heartbeat_sender_worker | 75] Heartbeat sent
10:53:09: [INFO] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\modules\heartbeat\heartbeat_sender_worker.py | heartbeat_sender_worker | 75] Heartbeat sent
10:53:10: [INFO] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\modules\heartbeat\heartbeat_sender_worker.py | heartbeat_sender_worker | 75] Heartbeat sent
10:53:11: [INFO] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\modules\heartbeat\heartbeat_sender_worker.py | heartbeat_sender_worker | 75] Heartbeat sent
10:53:12: [INFO] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\modules\heartbeat\heartbeat_sender_worker.py | heartbeat_sender_worker | 75] Heartbeat sent
10:53:13: [INFO] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\modules\heartbeat\heartbeat_sender_worker.py | heartbeat_sender_worker | 75] Heartbeat sent
10:53:14: [INFO] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\modules\heartbeat\heartbeat_sender_worker.py | heartbeat_sender_worker | 75] Heartbeat sent
10:53:15: [INFO] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\modules\heartbeat\heartbeat_sender_worker.py | heartbeat_sender_worker | 75] Heartbeat sent
10:53:16: [INFO] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\modules\heartbeat\heartbeat_sender_worker.py | heartbeat_sender_worker | 75] Heartbeat sent
10:53:17: [INFO] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\modules\heartbeat\heartbeat_sender_worker.py | heartbeat_sender_worker | 85] Heartbeat sender worker exiting
2 changes: 2 additions & 0 deletions logs/2026-01-18_10-53-02/main.log
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
10:53:02: [INFO] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\modules\common\modules\logger\logger_main_setup.py | setup_main_logger | 62] main logger initialized
10:53:04: [INFO] [C:\Users\Mark\Desktop\WARG\autonomy-bootcamp-2026-p2\tests\integration\test_heartbeat_sender.py | main | 91] Connected!
Loading