Skip to content
Open
177 changes: 154 additions & 23 deletions bootcamp_main.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,15 @@
# =================================================================================================
# ↓ BOOTCAMPERS MODIFY BELOW THIS COMMENT ↓
# =================================================================================================
# Set queue max sizes (<= 0 for infinity)

# Set worker counts

# Any other constants
HEARTBEAT_MAX = 10
TELEMETRY_MAX = 10
REPORT_MAX = 10
HEARTBEAT_SEND_WORKER = 1
HEARTBEAT_REC_WORKER = 1
TELEMETRY_WORKER = 1
COMMAND_WORKER = 1
TARGET = command.Position(1.0, 1.0, 1.0)
RUNTIME = 100

# =================================================================================================
# ↑ BOOTCAMPERS MODIFY ABOVE THIS COMMENT ↑
Expand Down Expand Up @@ -73,44 +77,171 @@ def main() -> int:
# =============================================================================================
# ↓ BOOTCAMPERS MODIFY BELOW THIS COMMENT ↓
# =============================================================================================
# Create a worker controller
# 1) Controller
controller = (
worker_controller.WorkerController()
) # or WorkerController(main_logger) if required

# 2) MP manager
mp_manager = mp.Manager()

# 3) Queues (QueueProxyWrapper)
heartbeat_queue = queue_proxy_wrapper.QueueProxyWrapper(mp_manager, HEARTBEAT_MAX)
telemetry_queue = queue_proxy_wrapper.QueueProxyWrapper(mp_manager, TELEMETRY_MAX)
report_queue = queue_proxy_wrapper.QueueProxyWrapper(mp_manager, REPORT_MAX)

# 4) WorkerProperties.create(...) for each worker

ok, hb_sender_props = worker_manager.WorkerProperties.create(
controller=controller,
count=HEARTBEAT_SEND_WORKER,
target=heartbeat_sender_worker.heartbeat_sender_worker,
work_arguments={
"connection": connection,
"controller": controller,
},
input_queues=[],
output_queues=[],
local_logger=main_logger,
)
if not ok:
main_logger.error("Failed to create HeartbeatSender properties")
return -1

# Create a multiprocess manager for synchronized queues
ok, hb_recv_props = worker_manager.WorkerProperties.create(
controller=controller,
count=HEARTBEAT_REC_WORKER,
target=heartbeat_receiver_worker.heartbeat_receiver_worker,
work_arguments={
"connection": connection,
"heartbeat_queue": heartbeat_queue,
"controller": controller,
},
input_queues=[],
output_queues=[heartbeat_queue],
local_logger=main_logger,
)
if not ok:
main_logger.error("Failed to create HeartbeatReceiver properties")
return -1

# Create queues
ok, telem_props = worker_manager.WorkerProperties.create(
controller=controller,
count=TELEMETRY_WORKER,
target=telemetry_worker.telemetry_worker,
work_arguments={
"connection": connection,
"telemetry_queue": telemetry_queue,
"controller": controller,
},
input_queues=[],
output_queues=[telemetry_queue],
local_logger=main_logger,
)
if not ok:
main_logger.error("Failed to create Telemetry properties")
return -1

# Create worker properties for each worker type (what inputs it takes, how many workers)
# Heartbeat sender
ok, cmd_props = worker_manager.WorkerProperties.create(
controller=controller,
count=COMMAND_WORKER,
target=command_worker.command_worker,
work_arguments={
"connection": connection,
"target": TARGET,
"telemetry_queue": telemetry_queue,
"report_queue": report_queue,
"controller": controller,
},
input_queues=[telemetry_queue],
output_queues=[report_queue],
local_logger=main_logger,
)
if not ok:
main_logger.error("Failed to create Command properties")
return -1

# Heartbeat receiver
# 5) WorkerManager.create(...) for each
ok, hb_sender_mgr = worker_manager.WorkerManager.create(
worker_properties=hb_sender_props, local_logger=main_logger
)
if not ok:
main_logger.error("Failed to create HeartbeatSender manager")
return -1

# Telemetry
ok, hb_recv_mgr = worker_manager.WorkerManager.create(
worker_properties=hb_recv_props, local_logger=main_logger
)
if not ok:
main_logger.error("Failed to create HeartbeatReceiver manager")
return -1

# Command
ok, telem_mgr = worker_manager.WorkerManager.create(
worker_properties=telem_props, local_logger=main_logger
)
if not ok:
main_logger.error("Failed to create Telemetry manager")
return -1

# Create the workers (processes) and obtain their managers
ok, cmd_mgr = worker_manager.WorkerManager.create(
worker_properties=cmd_props, local_logger=main_logger
)
if not ok:
main_logger.error("Failed to create Command manager")
return -1

# Start worker processes
# 6) start workers
hb_sender_mgr.start_workers()
hb_recv_mgr.start_workers()
telem_mgr.start_workers()
cmd_mgr.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
# 7) Main loop: read outputs
start_time = time.time()
last_status = None
while (time.time() - start_time) < RUNTIME:

# Stop the processes
try:
hb = heartbeat_queue.queue.get_nowait()
status_str = "Connected" if hb["connected"] else "Disconnected"

main_logger.info("Requested exit")
if status_str != last_status:
last_status = status_str
main_logger.info(f"Heartbeat status: {status_str}", True)

if not hb["connected"]:
main_logger.warning("Drone disconnected, exiting", True)
break
report = report_queue.queue.get_nowait()
main_logger.info(f"Command report: {report}", True)

# Fill and drain queues from END TO START
except queue.Empty:
pass

time.sleep(0.1)

# 8) Stop
controller.request_exit()
main_logger.info("Requested exit")

# 9) Fill & drain queues
report_queue.fill_and_drain_queue()
telemetry_queue.fill_and_drain_queue()
heartbeat_queue.fill_and_drain_queue()
main_logger.info("Queues cleared")

# Clean up worker processes
# 10) Join workers (either direction is usually ok after drain+exit)
cmd_mgr.join_workers()
telem_mgr.join_workers()
hb_recv_mgr.join_workers()
hb_sender_mgr.join_workers()

main_logger.info("Stopped")

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

# =============================================================================================
# ↑ BOOTCAMPERS MODIFY ABOVE THIS COMMENT ↑
Expand Down
28 changes: 28 additions & 0 deletions logs/command_log/command_drone_29508.log
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
14:16:23: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\tests\integration\mock_drones\command_drone.py | main | 45] Logger initialized
14:16:24: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\tests\integration\mock_drones\command_drone.py | main | 76] Received a valid command
14:16:24: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\tests\integration\mock_drones\command_drone.py | main | 76] Received a valid command
14:16:27: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\tests\integration\mock_drones\command_drone.py | main | 76] Received a valid command
14:16:28: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\tests\integration\mock_drones\command_drone.py | main | 76] Received a valid command
14:16:28: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\tests\integration\mock_drones\command_drone.py | main | 76] Received a valid command
14:16:29: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\tests\integration\mock_drones\command_drone.py | main | 76] Received a valid command
14:16:29: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\tests\integration\mock_drones\command_drone.py | main | 76] Received a valid command
14:16:30: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\tests\integration\mock_drones\command_drone.py | main | 76] Received a valid command
14:16:30: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\tests\integration\mock_drones\command_drone.py | main | 76] Received a valid command
14:16:31: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\tests\integration\mock_drones\command_drone.py | main | 76] Received a valid command
14:16:31: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\tests\integration\mock_drones\command_drone.py | main | 76] Received a valid command
14:16:32: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\tests\integration\mock_drones\command_drone.py | main | 76] Received a valid command
14:16:32: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\tests\integration\mock_drones\command_drone.py | main | 76] Received a valid command
14:16:33: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\tests\integration\mock_drones\command_drone.py | main | 76] Received a valid command
14:16:33: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\tests\integration\mock_drones\command_drone.py | main | 76] Received a valid command
14:16:34: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\tests\integration\mock_drones\command_drone.py | main | 76] Received a valid command
14:16:34: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\tests\integration\mock_drones\command_drone.py | main | 76] Received a valid command
14:16:35: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\tests\integration\mock_drones\command_drone.py | main | 76] Received a valid command
14:16:35: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\tests\integration\mock_drones\command_drone.py | main | 76] Received a valid command
14:16:36: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\tests\integration\mock_drones\command_drone.py | main | 76] Received a valid command
14:16:36: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\tests\integration\mock_drones\command_drone.py | main | 76] Received a valid command
14:16:37: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\tests\integration\mock_drones\command_drone.py | main | 76] Received a valid command
14:16:37: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\tests\integration\mock_drones\command_drone.py | main | 76] Received a valid command
14:16:38: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\tests\integration\mock_drones\command_drone.py | main | 76] Received a valid command
14:16:38: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\tests\integration\mock_drones\command_drone.py | main | 76] Received a valid command
14:16:39: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\tests\integration\mock_drones\command_drone.py | main | 76] Received a valid command
14:16:42: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\tests\integration\mock_drones\command_drone.py | main | 83] Passed!
32 changes: 32 additions & 0 deletions logs/command_log/command_worker_31860.log
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
14:16:24: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\modules\command\command_worker.py | command_worker | 47] Logger initialized
14:16:24: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\modules\command\command.py | run | 102] Average velocity so far: (0.00, 0.00, 4.00)
14:16:24: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\modules\command\command.py | run | 102] Average velocity so far: (0.00, 0.00, 1.00)
14:16:25: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\modules\command\command.py | run | 102] Average velocity so far: (0.00, 0.00, 0.67)
14:16:25: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\modules\command\command.py | run | 102] Average velocity so far: (0.00, 0.00, 0.50)
14:16:26: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\modules\command\command.py | run | 102] Average velocity so far: (0.00, 0.00, 0.40)
14:16:26: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\modules\command\command.py | run | 102] Average velocity so far: (0.00, 0.00, 0.33)
14:16:27: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\modules\command\command.py | run | 102] Average velocity so far: (0.00, 0.00, 0.29)
14:16:27: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\modules\command\command.py | run | 102] Average velocity so far: (0.00, 2.50, 0.25)
14:16:28: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\modules\command\command.py | run | 102] Average velocity so far: (0.00, 4.44, 0.22)
14:16:28: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\modules\command\command.py | run | 102] Average velocity so far: (0.00, 6.00, 0.20)
14:16:29: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\modules\command\command.py | run | 102] Average velocity so far: (1.82, 5.45, 0.18)
14:16:29: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\modules\command\command.py | run | 102] Average velocity so far: (3.33, 5.00, 0.17)
14:16:30: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\modules\command\command.py | run | 102] Average velocity so far: (4.62, 4.62, 0.15)
14:16:30: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\modules\command\command.py | run | 102] Average velocity so far: (4.29, 2.86, 0.14)
14:16:31: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\modules\command\command.py | run | 102] Average velocity so far: (4.00, 1.33, 0.13)
14:16:31: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\modules\command\command.py | run | 102] Average velocity so far: (3.75, 0.00, 0.12)
14:16:32: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\modules\command\command.py | run | 102] Average velocity so far: (2.35, 0.00, 0.12)
14:16:32: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\modules\command\command.py | run | 102] Average velocity so far: (1.11, 0.00, 0.11)
14:16:33: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\modules\command\command.py | run | 102] Average velocity so far: (0.00, 0.00, 0.11)
14:16:33: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\modules\command\command.py | run | 102] Average velocity so far: (0.00, 1.00, 0.10)
14:16:34: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\modules\command\command.py | run | 102] Average velocity so far: (0.00, 1.90, 0.10)
14:16:34: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\modules\command\command.py | run | 102] Average velocity so far: (0.00, 2.73, 0.09)
14:16:35: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\modules\command\command.py | run | 102] Average velocity so far: (0.87, 2.61, 0.09)
14:16:35: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\modules\command\command.py | run | 102] Average velocity so far: (1.67, 2.50, 0.08)
14:16:36: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\modules\command\command.py | run | 102] Average velocity so far: (2.40, 2.40, 0.08)
14:16:36: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\modules\command\command.py | run | 102] Average velocity so far: (2.31, 1.54, 0.08)
14:16:37: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\modules\command\command.py | run | 102] Average velocity so far: (2.22, 0.74, 0.07)
14:16:37: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\modules\command\command.py | run | 102] Average velocity so far: (2.14, 0.00, 0.07)
14:16:38: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\modules\command\command.py | run | 102] Average velocity so far: (1.38, 0.00, 0.07)
14:16:38: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\modules\command\command.py | run | 102] Average velocity so far: (0.67, 0.00, 0.07)
14:16:39: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\modules\command\command.py | run | 102] Average velocity so far: (0.00, 0.00, 0.06)
Loading