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
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