reader_method_call.cpp 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. #include "reader_method_call.h"
  2. #include "reader_service.h"
  3. #include <flutter/method_channel.h>
  4. #include <flutter/plugin_registrar_windows.h>
  5. #include <flutter/standard_method_codec.h>
  6. #include <flutter/event_channel.h>
  7. #include <memory>
  8. #include <string>
  9. #include <vector>
  10. #include <functional>
  11. #include <map>
  12. // 全局变量存储事件发送器
  13. static std::unique_ptr<flutter::EventSink<flutter::EncodableValue>> event_sink = nullptr;
  14. void ReaderMethodCall::RegisterWindowsAPI(flutter::FlutterEngine *engine)
  15. {
  16. // 注册MethodChannel用于方法调用
  17. auto channel = std::make_unique<flutter::MethodChannel<flutter::EncodableValue>>(
  18. engine->messenger(), "com.vber.chicken_farm/win_reader",
  19. &flutter::StandardMethodCodec::GetInstance());
  20. channel->SetMethodCallHandler([](const auto &call, auto result)
  21. { HandleMethodCall(call, std::move(result)); });
  22. // 注册EventChannel用于数据回调
  23. auto event_channel = std::make_unique<flutter::EventChannel<flutter::EncodableValue>>(
  24. engine->messenger(), "com.vber.chicken_farm/win_reader_events",
  25. &flutter::StandardMethodCodec::GetInstance());
  26. event_channel->SetStreamHandler(std::make_unique<flutter::StreamHandler<flutter::EncodableValue>>(
  27. [engine](const flutter::EncodableValue* arguments,
  28. std::unique_ptr<flutter::EventSink<flutter::EncodableValue>>&& sink) -> std::unique_ptr<flutter::StreamHandlerError<flutter::EncodableValue>> {
  29. event_sink = std::move(sink);
  30. // 设置数据回调
  31. ReaderService::GetInstance()->SetDataCallback([](const std::string& data) {
  32. if (event_sink) {
  33. // 将数据发送到Flutter端
  34. event_sink->Success(flutter::EncodableValue(data));
  35. }
  36. });
  37. return nullptr;
  38. },
  39. [](const flutter::EncodableValue* arguments) -> std::unique_ptr<flutter::StreamHandlerError<flutter::EncodableValue>> {
  40. event_sink = nullptr;
  41. return nullptr;
  42. }));
  43. }
  44. void ReaderMethodCall::HandleMethodCall(
  45. const flutter::MethodCall<flutter::EncodableValue> &method_call,
  46. std::unique_ptr<flutter::MethodResult<flutter::EncodableValue>> result)
  47. {
  48. // 使用映射表来处理不同的方法调用
  49. static std::map<std::string, std::function<void(const flutter::MethodCall<flutter::EncodableValue>&, std::unique_ptr<flutter::MethodResult<flutter::EncodableValue>>)>> handlers = {
  50. {"scanUsb", [](const flutter::MethodCall<flutter::EncodableValue>& method_call, std::unique_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
  51. // 调用读取器服务的扫描USB方法
  52. std::vector<std::string> usb = ReaderService::GetInstance()->ScanUsb();
  53. // 创建列表以存储USB设备名称
  54. flutter::EncodableList device_list;
  55. for (const auto &device : usb)
  56. {
  57. device_list.push_back(flutter::EncodableValue(device));
  58. }
  59. // 将USB设备列表返回给Flutter(如果没有找到设备则为空)
  60. result->Success(flutter::EncodableValue(device_list));
  61. }},
  62. {"connect", [](const flutter::MethodCall<flutter::EncodableValue>& method_call, std::unique_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
  63. // 获取参数
  64. const auto *arguments = std::get_if<flutter::EncodableMap>(method_call.arguments());
  65. if (arguments) {
  66. auto device_index_it = arguments->find(flutter::EncodableValue("deviceIndex"));
  67. if (device_index_it != arguments->end()) {
  68. int device_index = device_index_it->second.LongValue();
  69. bool success = ReaderService::GetInstance()->Connect(device_index);
  70. result->Success(flutter::EncodableValue(success));
  71. return;
  72. }
  73. }
  74. result->Error("Invalid arguments", "Device index not provided");
  75. }},
  76. {"disconnect", [](const flutter::MethodCall<flutter::EncodableValue>& method_call, std::unique_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
  77. ReaderService::GetInstance()->Disconnect();
  78. result->Success();
  79. }},
  80. {"startRead", [](const flutter::MethodCall<flutter::EncodableValue>& method_call, std::unique_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
  81. bool success = ReaderService::GetInstance()->StartRead();
  82. result->Success(flutter::EncodableValue(success));
  83. }},
  84. {"stopRead", [](const flutter::MethodCall<flutter::EncodableValue>& method_call, std::unique_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
  85. ReaderService::GetInstance()->StopRead();
  86. result->Success();
  87. }},
  88. {"getDeviceInfo", [](const flutter::MethodCall<flutter::EncodableValue>& method_call, std::unique_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
  89. std::string deviceInfo = ReaderService::GetInstance()->GetDeviceInfo();
  90. result->Success(flutter::EncodableValue(deviceInfo));
  91. }},
  92. {"getPower", [](const flutter::MethodCall<flutter::EncodableValue>& method_call, std::unique_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
  93. unsigned char power = 0;
  94. bool success = ReaderService::GetInstance()->GetPower(power);
  95. if (success) {
  96. result->Success(flutter::EncodableValue(static_cast<int>(power)));
  97. } else {
  98. result->Success(flutter::EncodableValue());
  99. }
  100. }},
  101. {"setPower", [](const flutter::MethodCall<flutter::EncodableValue>& method_call, std::unique_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
  102. const auto *arguments = std::get_if<flutter::EncodableMap>(method_call.arguments());
  103. if (arguments) {
  104. auto power_it = arguments->find(flutter::EncodableValue("power"));
  105. if (power_it != arguments->end()) {
  106. int power = power_it->second.LongValue();
  107. bool success = ReaderService::GetInstance()->SetPower(static_cast<unsigned char>(power));
  108. result->Success(flutter::EncodableValue(success));
  109. return;
  110. }
  111. }
  112. result->Error("Invalid arguments", "Power value not provided");
  113. }}
  114. };
  115. // 查找并执行对应的方法处理器
  116. auto handler = handlers.find(method_call.method_name());
  117. if (handler != handlers.end()) {
  118. handler->second(method_call, std::move(result));
  119. } else {
  120. result->NotImplemented();
  121. }
  122. }