|
@@ -1,6 +1,6 @@
|
|
|
from dataclasses import dataclass
|
|
from dataclasses import dataclass
|
|
|
from enum import Enum
|
|
from enum import Enum
|
|
|
-from typing import List, Tuple
|
|
|
|
|
|
|
+from typing import List, Tuple, Optional
|
|
|
from robot_control.src.utils.config import RobotConfig, SlotConfig, DeviceConfig, DropoffGradeConfig
|
|
from robot_control.src.utils.config import RobotConfig, SlotConfig, DeviceConfig, DropoffGradeConfig
|
|
|
from robot_control.src.robot.movement import RobotMovement
|
|
from robot_control.src.robot.movement import RobotMovement
|
|
|
import logging
|
|
import logging
|
|
@@ -20,12 +20,12 @@ class CellStatus(Enum):
|
|
|
class Cell:
|
|
class Cell:
|
|
|
id: int
|
|
id: int
|
|
|
status: CellStatus = CellStatus.WAITING
|
|
status: CellStatus = CellStatus.WAITING
|
|
|
- capacity: float = None
|
|
|
|
|
|
|
+ capacity: float = 0
|
|
|
|
|
|
|
|
class RobotController:
|
|
class RobotController:
|
|
|
def __init__(self, config: RobotConfig, gpio_handler: GPIOInterface):
|
|
def __init__(self, config: RobotConfig, gpio_handler: GPIOInterface):
|
|
|
self.config = config
|
|
self.config = config
|
|
|
- self.cells: dict[Cell] = {}
|
|
|
|
|
|
|
+ self.cells: dict[int, Cell] = {}
|
|
|
self.devices = self.config.measurement_devices
|
|
self.devices = self.config.measurement_devices
|
|
|
self.feeder = self.config.feeder
|
|
self.feeder = self.config.feeder
|
|
|
self.dropoff_grades = self.config.dropoff_grades
|
|
self.dropoff_grades = self.config.dropoff_grades
|
|
@@ -104,30 +104,31 @@ class RobotController:
|
|
|
await self.grbl_handler.close()
|
|
await self.grbl_handler.close()
|
|
|
self.mqtt_handler.cleanup()
|
|
self.mqtt_handler.cleanup()
|
|
|
|
|
|
|
|
- def add_cell(self, cell_id: str):
|
|
|
|
|
|
|
+ def add_cell(self, cell_id: int) -> Cell:
|
|
|
self.cells[cell_id] = Cell(cell_id)
|
|
self.cells[cell_id] = Cell(cell_id)
|
|
|
return self.cells[cell_id]
|
|
return self.cells[cell_id]
|
|
|
|
|
|
|
|
- def get_cell_by_id(self, cell_id: str) -> Cell:
|
|
|
|
|
|
|
+ def get_cell_by_id(self, cell_id: int) -> Optional[Cell]:
|
|
|
return self.cells.get(cell_id, None)
|
|
return self.cells.get(cell_id, None)
|
|
|
|
|
|
|
|
- def get_device_by_id(self, device_id: str) -> DeviceConfig:
|
|
|
|
|
|
|
+ def get_device_by_id(self, device_id: str) -> Optional[DeviceConfig]:
|
|
|
for device in self.devices:
|
|
for device in self.devices:
|
|
|
if device.id == device_id:
|
|
if device.id == device_id:
|
|
|
return device
|
|
return device
|
|
|
logger.error(f"Device {device_id} not found")
|
|
logger.error(f"Device {device_id} not found")
|
|
|
return None
|
|
return None
|
|
|
|
|
|
|
|
- def get_slot_by_id(self, device_id: str, slot_id: int) -> Cell:
|
|
|
|
|
|
|
+ def get_slot_by_id(self, device_id: str, slot_id: int) -> Optional[SlotConfig]:
|
|
|
try:
|
|
try:
|
|
|
- return self.get_device_by_id(device_id).slots[slot_id]
|
|
|
|
|
- except AttributeError as e:
|
|
|
|
|
- return None
|
|
|
|
|
|
|
+ device = self.get_device_by_id(device_id)
|
|
|
|
|
+ if not device:
|
|
|
|
|
+ return None
|
|
|
|
|
+ device.slots[slot_id]
|
|
|
except IndexError as e:
|
|
except IndexError as e:
|
|
|
logger.error(f"Slot {slot_id} not found in device {device_id}")
|
|
logger.error(f"Slot {slot_id} not found in device {device_id}")
|
|
|
return None
|
|
return None
|
|
|
|
|
|
|
|
- def get_next_free_slot(self) -> SlotConfig:
|
|
|
|
|
|
|
+ def get_next_free_slot(self) -> Optional[SlotConfig]:
|
|
|
for device in self.devices:
|
|
for device in self.devices:
|
|
|
for slot in device.slots:
|
|
for slot in device.slots:
|
|
|
if not slot.occupied:
|
|
if not slot.occupied:
|
|
@@ -221,9 +222,11 @@ class RobotController:
|
|
|
raise RuntimeError("Gripper not occupied")
|
|
raise RuntimeError("Gripper not occupied")
|
|
|
|
|
|
|
|
# Move to slot position
|
|
# Move to slot position
|
|
|
|
|
+ if not slot.device_id:
|
|
|
|
|
+ raise RuntimeError(f"Device id not set!")
|
|
|
slot_device = self.get_device_by_id(slot.device_id)
|
|
slot_device = self.get_device_by_id(slot.device_id)
|
|
|
if not slot_device:
|
|
if not slot_device:
|
|
|
- raise RuntimeError(f"Device {slot.device_id} not found")
|
|
|
|
|
|
|
+ raise RuntimeError(f"Device {slot.device_id} not found!")
|
|
|
pos = [sum(el) for el in zip(slot.position, slot_device.position)]
|
|
pos = [sum(el) for el in zip(slot.position, slot_device.position)]
|
|
|
safe_pos = (pos[0], pos[1], self.config.movement.safe_height)
|
|
safe_pos = (pos[0], pos[1], self.config.movement.safe_height)
|
|
|
logger.info(f"Moving to slot position (safe) {safe_pos}...")
|
|
logger.info(f"Moving to slot position (safe) {safe_pos}...")
|
|
@@ -257,6 +260,8 @@ class RobotController:
|
|
|
logger.error("Gripper already occupied")
|
|
logger.error("Gripper already occupied")
|
|
|
return None
|
|
return None
|
|
|
|
|
|
|
|
|
|
+ if not slot.device_id:
|
|
|
|
|
+ raise RuntimeError(f"Device id not set!")
|
|
|
slot_device = self.get_device_by_id(slot.device_id)
|
|
slot_device = self.get_device_by_id(slot.device_id)
|
|
|
if not slot_device:
|
|
if not slot_device:
|
|
|
raise RuntimeError(f"Device {slot.device_id} not found")
|
|
raise RuntimeError(f"Device {slot.device_id} not found")
|