event_input.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412
  1. #include "wheelchair_state_machine/event_input.hpp"
  2. #include <rclcpp/logging.hpp>
  3. #include <std_msgs/msg/bool.hpp>
  4. using namespace std::chrono_literals;
  5. EventInputHandler::EventInputHandler(rclcpp::Node* node)
  6. : node_(node)
  7. , battery_manager_(nullptr)
  8. , lidar_controller_(nullptr)
  9. , ipad_manager_(nullptr)
  10. , workflow_manager_(nullptr)
  11. , report_manager_(nullptr)
  12. {
  13. RCLCPP_INFO(node_->get_logger(), "事件输入处理器已初始化");
  14. }
  15. void EventInputHandler::initializeModules()
  16. {
  17. // 初始化电池管理器
  18. battery_manager_ = std::make_unique<BatteryManager>(node_, 20.0f, 10.0f);
  19. battery_manager_->initialize();
  20. // 初始化激光控制器
  21. lidar_controller_ = std::make_unique<LidarScanController>(node_);
  22. lidar_controller_->initialize();
  23. // 初始化iPad管理器
  24. ipad_manager_ = std::make_unique<IpadManager>(node_);
  25. // 初始化工作流管理器
  26. workflow_manager_ = std::make_unique<WorkflowManager>(node_);
  27. // 初始化报告管理器
  28. report_manager_ = std::make_unique<ReportManager>(node_);
  29. setupModuleCallbacks();
  30. setupSubscriptions();
  31. RCLCPP_INFO(node_->get_logger(), "所有模块初始化完成");
  32. }
  33. void EventInputHandler::setupModuleCallbacks()
  34. {
  35. // 1. 设置电池管理器回调
  36. battery_manager_->setBatteryStateCallback(
  37. [this](BatteryState state, float percentage) {
  38. // 报告电池状态
  39. report_manager_->reportBatteryStatus(state, percentage);
  40. // 触发电池状态事件
  41. if (state == BatteryState::CHARGING)
  42. {
  43. triggerEvent("battery_start_charging");
  44. }
  45. else if (state == BatteryState::FULL)
  46. {
  47. triggerEvent("battery_full");
  48. }
  49. });
  50. battery_manager_->setLowBatteryCallback(
  51. [this](BatteryState state, float percentage) {
  52. // 触发低电量事件
  53. triggerLowBattery(state, percentage);
  54. });
  55. // 2. 设置iPad管理器回调 - 只处理开始和结束
  56. ipad_manager_->setRechargeStartCallback(
  57. [this]() {
  58. RCLCPP_INFO(node_->get_logger(), "iPad启动回充");
  59. triggerEvent("ipad_phone_interface_start");
  60. });
  61. ipad_manager_->setRechargeCancelCallback(
  62. [this]() {
  63. RCLCPP_INFO(node_->get_logger(), "iPad取消回充");
  64. triggerEvent("ipad_phone_interface_cancel");
  65. });
  66. // 3. 设置工作流管理器回调
  67. workflow_manager_->setStateUpdateCallback(
  68. [this](const std::string& state_str, const std::string& message) {
  69. // 报告状态更新
  70. report_manager_->reportInfo(state_str + ": " + message);
  71. // 根据状态变化控制导航
  72. WheelchairState current_state = workflow_manager_->getCurrentWheelchairState();
  73. if (current_state == WheelchairState::SEARCHING)
  74. {
  75. startNavigationControl();
  76. }
  77. else if (current_state == WheelchairState::CHARGING)
  78. {
  79. lidar_controller_->stopMotion();
  80. lidar_controller_->setChargingVoltage(true);
  81. }
  82. else if (current_state == WheelchairState::READY)
  83. {
  84. stopNavigationControl();
  85. }
  86. });
  87. // 4. 设置事件处理器回调 - 所有事件都转发给工作流管理器
  88. registerEvent("ipad_phone_interface_start",
  89. [this](const std::string& data) {
  90. RCLCPP_INFO(node_->get_logger(), "处理iPad启动事件");
  91. workflow_manager_->handleEvent("ipad_phone_interface_start");
  92. });
  93. registerEvent("ipad_phone_interface_cancel",
  94. [this](const std::string& data) {
  95. RCLCPP_INFO(node_->get_logger(), "处理iPad取消事件");
  96. workflow_manager_->handleEvent("ipad_phone_interface_cancel");
  97. });
  98. registerEvent("low_battery_warning",
  99. [this](const std::string& data) {
  100. RCLCPP_INFO(node_->get_logger(), "处理低电量事件");
  101. workflow_manager_->handleEvent("low_battery_warning");
  102. });
  103. registerEvent("battery_start_charging",
  104. [this](const std::string& data) {
  105. RCLCPP_INFO(node_->get_logger(), "处理开始充电事件");
  106. workflow_manager_->handleEvent("battery_start_charging");
  107. });
  108. registerEvent("battery_stop_charging",
  109. [this](const std::string& data) {
  110. RCLCPP_INFO(node_->get_logger(), "处理停止充电事件");
  111. workflow_manager_->handleEvent("battery_stop_charging");
  112. });
  113. registerEvent("battery_full",
  114. [this](const std::string& data) {
  115. RCLCPP_INFO(node_->get_logger(), "处理电池充满事件");
  116. workflow_manager_->handleEvent("battery_full");
  117. });
  118. registerEvent("bluetooth_disconnected",
  119. [this](const std::string& data) {
  120. RCLCPP_INFO(node_->get_logger(), "处理蓝牙断开事件");
  121. workflow_manager_->handleEvent("bluetooth_disconnected");
  122. });
  123. registerEvent("bluetooth_connected",
  124. [this](const std::string& data) {
  125. RCLCPP_INFO(node_->get_logger(), "处理蓝牙连接事件");
  126. workflow_manager_->handleEvent("bluetooth_connected");
  127. });
  128. registerEvent("base_station_power_off",
  129. [this](const std::string& data) {
  130. RCLCPP_INFO(node_->get_logger(), "处理基站断电事件");
  131. workflow_manager_->handleEvent("base_station_power_off");
  132. });
  133. registerEvent("lock_vehicle",
  134. [this](const std::string& data) {
  135. RCLCPP_INFO(node_->get_logger(), "处理锁车事件");
  136. workflow_manager_->handleEvent("lock_vehicle");
  137. });
  138. registerEvent("unlock_vehicle",
  139. [this](const std::string& data) {
  140. RCLCPP_INFO(node_->get_logger(), "处理解锁事件");
  141. workflow_manager_->handleEvent("unlock_vehicle");
  142. });
  143. registerEvent("joystick_pull_back",
  144. [this](const std::string& data) {
  145. RCLCPP_INFO(node_->get_logger(), "处理摇杆后拉事件");
  146. workflow_manager_->handleEvent("joystick_pull_back");
  147. });
  148. registerEvent("joystick_stop",
  149. [this](const std::string& data) {
  150. RCLCPP_INFO(node_->get_logger(), "处理摇杆停止事件");
  151. workflow_manager_->handleEvent("joystick_stop");
  152. });
  153. registerEvent("push_start",
  154. [this](const std::string& data) {
  155. RCLCPP_INFO(node_->get_logger(), "处理推行启动事件");
  156. workflow_manager_->handleEvent("push_start");
  157. });
  158. registerEvent("push_stop",
  159. [this](const std::string& data) {
  160. RCLCPP_INFO(node_->get_logger(), "处理推行停止事件");
  161. workflow_manager_->handleEvent("push_stop");
  162. });
  163. registerEvent("error_code_handling",
  164. [this](const std::string& data) {
  165. RCLCPP_INFO(node_->get_logger(), "处理错误码事件");
  166. workflow_manager_->handleEvent("error_code_handling");
  167. });
  168. registerEvent("base_station_lost",
  169. [this](const std::string& data) {
  170. RCLCPP_INFO(node_->get_logger(), "处理基站丢失事件");
  171. workflow_manager_->handleEvent("base_station_lost");
  172. });
  173. registerEvent("search_30s_timeout",
  174. [this](const std::string& data) {
  175. RCLCPP_INFO(node_->get_logger(), "处理搜索超时事件");
  176. workflow_manager_->handleEvent("search_30s_timeout");
  177. });
  178. RCLCPP_INFO(node_->get_logger(), "模块回调设置完成");
  179. }
  180. void EventInputHandler::setupSubscriptions()
  181. {
  182. // 创建命令使能订阅者
  183. cmd_enable_sub_ = node_->create_subscription<std_msgs::msg::Bool>(
  184. "/recharge/cmd_enable", 10,
  185. [this](const std_msgs::msg::Bool::SharedPtr msg) {
  186. this->ipad_manager_->onCmdEnable(msg);
  187. });
  188. RCLCPP_INFO(node_->get_logger(), "订阅器设置完成");
  189. }
  190. void EventInputHandler::startNavigationControl()
  191. {
  192. if (!interface_active_)
  193. {
  194. lidar_controller_->startNavigation();
  195. interface_active_ = true;
  196. RCLCPP_INFO(node_->get_logger(), "启动导航控制");
  197. }
  198. }
  199. void EventInputHandler::stopNavigationControl()
  200. {
  201. if (interface_active_)
  202. {
  203. lidar_controller_->stopNavigation();
  204. lidar_controller_->stopMotion();
  205. interface_active_ = false;
  206. RCLCPP_INFO(node_->get_logger(), "停止导航控制");
  207. }
  208. }
  209. void EventInputHandler::registerEvent(const std::string& event_name, EventCallback callback)
  210. {
  211. event_callbacks_[event_name] = callback;
  212. RCLCPP_INFO(node_->get_logger(), "已注册事件: %s", event_name.c_str());
  213. }
  214. void EventInputHandler::triggerEvent(const std::string& event_name)
  215. {
  216. triggerEvent(event_name, "");
  217. }
  218. void EventInputHandler::triggerEvent(const std::string& event_name, const std::string& data)
  219. {
  220. logEvent(event_name, data);
  221. if (event_callbacks_.find(event_name) != event_callbacks_.end())
  222. {
  223. event_callbacks_[event_name](data);
  224. }
  225. else
  226. {
  227. RCLCPP_WARN(node_->get_logger(), "未注册的事件: %s", event_name.c_str());
  228. }
  229. }
  230. void EventInputHandler::triggerIpadStart()
  231. {
  232. triggerEvent("ipad_phone_interface_start", "iPad启动回充");
  233. }
  234. void EventInputHandler::triggerIpadCancel()
  235. {
  236. triggerEvent("ipad_phone_interface_cancel", "iPad取消回充");
  237. }
  238. void EventInputHandler::triggerBluetoothDisconnected()
  239. {
  240. triggerEvent("bluetooth_disconnected", "蓝牙断开连接");
  241. }
  242. void EventInputHandler::triggerBluetoothConnected()
  243. {
  244. triggerEvent("bluetooth_connected", "蓝牙已连接");
  245. }
  246. void EventInputHandler::triggerBaseStationPowerOff()
  247. {
  248. triggerEvent("base_station_power_off", "基站断电");
  249. }
  250. void EventInputHandler::triggerLowBattery(BatteryState state, float percentage)
  251. {
  252. std::string data = "低电量警告 - 状态: ";
  253. data += std::to_string(static_cast<int>(state));
  254. data += ", 电量: " + std::to_string(percentage) + "%";
  255. triggerEvent("low_battery_warning", data);
  256. }
  257. void EventInputHandler::triggerLockVehicle()
  258. {
  259. triggerEvent("lock_vehicle", "锁车操作");
  260. }
  261. void EventInputHandler::triggerUnlockVehicle()
  262. {
  263. triggerEvent("unlock_vehicle", "解锁操作");
  264. }
  265. void EventInputHandler::triggerJoystickPullBack()
  266. {
  267. triggerEvent("joystick_pull_back", "摇杆后拉");
  268. }
  269. void EventInputHandler::triggerJoystickStop()
  270. {
  271. triggerEvent("joystick_stop", "摇杆停止");
  272. }
  273. void EventInputHandler::triggerPushStart()
  274. {
  275. triggerEvent("push_start", "推行启动");
  276. }
  277. void EventInputHandler::triggerPushStop()
  278. {
  279. triggerEvent("push_stop", "推行停止");
  280. }
  281. void EventInputHandler::triggerBatteryStartCharging()
  282. {
  283. triggerEvent("battery_start_charging", "开始充电");
  284. }
  285. void EventInputHandler::triggerBatteryStopCharging()
  286. {
  287. triggerEvent("battery_stop_charging", "停止充电");
  288. }
  289. void EventInputHandler::triggerBatteryFull()
  290. {
  291. triggerEvent("battery_full", "电池充满");
  292. }
  293. void EventInputHandler::triggerErrorCode(int error_code)
  294. {
  295. std::string data = "错误码: " + std::to_string(error_code);
  296. triggerEvent("error_code_handling", data);
  297. }
  298. void EventInputHandler::triggerBaseStationLost()
  299. {
  300. triggerEvent("base_station_lost", "基站检测丢失");
  301. }
  302. void EventInputHandler::triggerSearchTimeout()
  303. {
  304. triggerEvent("search_30s_timeout", "搜索30秒超时");
  305. }
  306. void EventInputHandler::logEvent(const std::string& event_name, const std::string& details)
  307. {
  308. if (details.empty())
  309. {
  310. RCLCPP_INFO(node_->get_logger(), "触发事件: %s", event_name.c_str());
  311. }
  312. else
  313. {
  314. RCLCPP_INFO(node_->get_logger(), "触发事件: %s - %s",
  315. event_name.c_str(), details.c_str());
  316. }
  317. }
  318. std::string EventInputHandler::getCurrentState() const
  319. {
  320. if (workflow_manager_)
  321. return workflow_manager_->getCurrentState();
  322. return "未初始化";
  323. }
  324. bool EventInputHandler::isRechargeActive() const
  325. {
  326. return interface_active_;
  327. }
  328. void EventInputHandler::displaySystemStatus()
  329. {
  330. if (!workflow_manager_ || !battery_manager_ || !lidar_controller_ || !report_manager_)
  331. {
  332. RCLCPP_ERROR(node_->get_logger(), "系统未初始化");
  333. return;
  334. }
  335. std::string control_mode = interface_active_ ? "iPad控制" : "本地控制";
  336. report_manager_->reportSystemStatus(
  337. workflow_manager_->getCurrentWheelchairState(),
  338. battery_manager_->getBatteryState(),
  339. battery_manager_->getBatteryPercentage(),
  340. lidar_controller_->getChargingState(),
  341. lidar_controller_->getChargingVoltage(),
  342. isRechargeActive(),
  343. control_mode
  344. );
  345. }