mower-ng/mower/solvers/infra/reload.py
zhbaor c86e7ac651
All checks were successful
ci/woodpecker/push/check_format Pipeline was successful
场景图导航改写为solver
2025-01-30 10:14:54 +08:00

75 lines
2.9 KiB
Python

from datetime import datetime, timedelta
from mower.solvers.infra.base_mixin import BaseMixin
from mower.solvers.infra.enter_room import EnterRoomSolver
from mower.utils import config
from mower.utils import typealias as tp
from mower.utils.email import send_message
from mower.utils.log import logger
from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
class ReloadSolver(BaseSolver, BaseMixin):
solver_name = "搓玉补货"
def run(self, room) -> None:
logger.info(f"开始补货:{room}")
self.room = room
self.success = False
self.wait_start()
super().run()
def timeout(self) -> bool:
return datetime.now() > self.start_time + timedelta(seconds=10)
def wait_start(self):
self.start_time = datetime.now()
def number(self, scope: tp.Scope, height: int, thres: int) -> int:
"数字识别"
return config.recog.num.number_int("riic_base", scope, height, thres)
def transition(self) -> bool:
if (
scene := self.scene()
) == Scene.INFRA_DETAILS and self.detect_room() == self.room:
self.wait_start()
self.ctap((200, 1000), 1)
elif scene == Scene.FACTORY_ROOMS and self.detect_room_inside() == self.room:
reload_num = 99 - self.number(((1306, 462), (1391, 521)), 50, 200)
if self.find("reload_check"):
self.ctap((1400, 850), 1)
self.success = True
elif self.timeout():
logger.warning(f"材料已耗尽:{self.room} 时间为:{datetime.now()}")
send_message(f"材料已耗尽:{self.room}", level="WARNING")
return True
elif not self.success:
if reload_num == 0:
logger.info(f"货已满:{self.room} 时间为:{datetime.now()}")
send_message(f"货已满:{self.room}")
return True
else:
self.last_num = reload_num
self.tap((1450, 300))
else:
if reload_num == 0:
logger.info(
f"补货成功:{self.room} 本次补货数量:{self.last_num} 时间:{datetime.now()}"
)
send_message(f"补货成功:{self.room} 本次补货数量:{self.last_num}")
return True
else:
logger.warning(
f"补货成功:{self.room} 剩余数量:{99 - reload_num} 剩余材料不足! 时间:{datetime.now()}"
)
send_message(
f"补货成功:{self.room} 剩余数量:{99 - reload_num} 剩余材料不足!",
level="WARNING",
)
return True
elif scene in self.waiting_scene:
self.waiting_solver()
else:
EnterRoomSolver().run(self.room, detail=False)