cultivation_rack.py 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. from pathlib import Path
  2. from PFAL_SysControl.Controller.light import LightSystem
  3. from PFAL_SysControl.Controller.camera import CameraSystem
  4. from PFAL_SysControl.Utils.database import DatabaseManager
  5. from PFAL_SysControl.Utils.light_sampler import LightSampler
  6. class CultivationRack:
  7. """
  8. 代表一个完整的栽培架,封装了所有硬件控制器。
  9. 它可以通过依赖注入的方式,获得数据库和采样器等服务,以执行复杂任务。
  10. """
  11. def __init__(self, name: str, config: dict, db_manager: DatabaseManager = None, light_sampler: LightSampler = None):
  12. self.name = name
  13. self.config = config
  14. try:
  15. light_conf = self.config['lights'][name]
  16. camera_conf_list = self.config['cameras'][name]
  17. except KeyError as e:
  18. raise ValueError(f"在配置中找不到控制器 '{name}' 的硬件信息: {e}")
  19. # 1. 实例化硬件控制器
  20. self.light_system = LightSystem(name, light_conf)
  21. # 2. 实例化相机控制器,并传入所有依赖(包括从外部注入的服务)
  22. self.camera_system = CameraSystem(
  23. camera_configs=camera_conf_list,
  24. light_controller=self.light_system,
  25. db_manager=db_manager,
  26. light_sampler=light_sampler
  27. )
  28. # --- Camera Facade Methods ---
  29. def capture_all_photos(self, task_name: str):
  30. """提供一个高级接口来执行并发拍照任务。"""
  31. if not self.camera_system.db_manager or not self.camera_system.light_sampler:
  32. raise RuntimeError("数据库或光照采样器未被注入,无法执行此复杂任务。")
  33. base_path = Path(self.config['cameras']['settings']['download_path'])
  34. return self.camera_system.capture_all_with_lighting(base_path, task_name)
  35. def capture_photo_by_name(self, camera_name: str):
  36. """提供一个高级接口来对单个摄像头拍照。"""
  37. base_path = Path(self.config['cameras']['settings']['download_path'])
  38. return self.camera_system.capture_single_by_name(camera_name, base_path)
  39. # --- Light Facade Methods ---
  40. def set_layer_intensity(self, layer_id: int, intensity: float):
  41. """设置指定层所有灯光的亮度。"""
  42. with self.light_system as ls:
  43. ls.set_layer_intensity(layer_id, intensity)
  44. def turn_on_all(self):
  45. """打开此栽培架上的所有灯光。"""
  46. with self.light_system as ls:
  47. ls.turn_on_all()
  48. def turn_off_all(self):
  49. """关闭此栽培架上的所有灯光。"""
  50. with self.light_system as ls:
  51. ls.turn_off_all()
  52. def set_light_by_name(self, name: str, intensity: float):
  53. """按名称设置单个灯光的亮度。"""
  54. with self.light_system as ls:
  55. ls.set_light_by_name(name, intensity)
  56. def set_light_by_id(self, light_id: int, intensity: float):
  57. """按ID设置单个灯光的亮度。"""
  58. with self.light_system as ls:
  59. ls.set_light_by_id(light_id, intensity)
  60. def turn_on_layer(self, layer_id: int):
  61. """打开指定层的所有灯光。"""
  62. with self.light_system as ls:
  63. ls.turn_on_layer(layer_id)
  64. def turn_off_layer(self, layer_id: int):
  65. """关闭指定层的所有灯光。"""
  66. with self.light_system as ls:
  67. ls.turn_off_layer(layer_id)