reader_method_call.cpp 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. #include "reader_method_call.h"
  2. #include "reader_service.h"
  3. #include <flutter/flutter_engine.h>
  4. #include <flutter/method_channel.h>
  5. #include <flutter/standard_method_codec.h>
  6. #include <flutter/event_channel.h>
  7. #include <flutter/event_stream_handler_functions.h>
  8. #include <memory>
  9. #include <string>
  10. #include <vector>
  11. #include <functional>
  12. #include <map>
  13. static std::unique_ptr<flutter::EventChannel<flutter::EncodableValue>> g_event_channel = nullptr;
  14. static std::unique_ptr<flutter::StreamHandler<flutter::EncodableValue>> g_stream_handler = nullptr;
  15. void ReaderMethodCall::RegisterWindowsAPI(flutter::FlutterEngine *engine)
  16. {
  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. g_event_channel = std::make_unique<flutter::EventChannel<flutter::EncodableValue>>(
  23. engine->messenger(), "com.vber.chicken_farm/win_reader_events",
  24. &flutter::StandardMethodCodec::GetInstance());
  25. g_stream_handler =
  26. std::make_unique<flutter::StreamHandlerFunctions<flutter::EncodableValue>>(
  27. [](const flutter::EncodableValue *arguments,
  28. std::unique_ptr<flutter::EventSink<flutter::EncodableValue>> &&events)
  29. -> std::unique_ptr<flutter::StreamHandlerError<flutter::EncodableValue>>
  30. {
  31. // 使用shared_ptr包装,使其可拷贝
  32. auto events_ptr = std::shared_ptr<flutter::EventSink<flutter::EncodableValue>>(std::move(events));
  33. ReaderService::GetInstance()->SetDataCallback([events_ptr](const std::string &data)
  34. { events_ptr->Success(flutter::EncodableValue(data)); });
  35. return nullptr;
  36. },
  37. [](const flutter::EncodableValue *arguments)
  38. -> std::unique_ptr<flutter::StreamHandlerError<flutter::EncodableValue>>
  39. {
  40. ReaderService::GetInstance()->SetDataCallback(nullptr);
  41. return nullptr;
  42. });
  43. g_event_channel->SetStreamHandler(std::move(g_stream_handler));
  44. }
  45. void ReaderMethodCall::HandleMethodCall(
  46. const flutter::MethodCall<flutter::EncodableValue> &method_call,
  47. std::unique_ptr<flutter::MethodResult<flutter::EncodableValue>> result)
  48. {
  49. // Use a map to handle different method calls
  50. static std::map<std::string, std::function<void(const flutter::MethodCall<flutter::EncodableValue> &method_call, std::unique_ptr<flutter::MethodResult<flutter::EncodableValue>> result)>> handlers = {
  51. {"scanUsb", [](const flutter::MethodCall<flutter::EncodableValue> &method_call, std::unique_ptr<flutter::MethodResult<flutter::EncodableValue>> result)
  52. {
  53. // Call the scan USB method of the reader service
  54. std::vector<std::string> usb = ReaderService::GetInstance()->ScanUsb();
  55. // Create a list to store USB device names
  56. flutter::EncodableList device_list;
  57. for (const auto &device : usb)
  58. {
  59. device_list.push_back(flutter::EncodableValue(device));
  60. }
  61. // Return the list of USB devices to Flutter (empty if no devices found)
  62. result->Success(flutter::EncodableValue(device_list));
  63. }},
  64. {"connect", [](const flutter::MethodCall<flutter::EncodableValue> &method_call, std::unique_ptr<flutter::MethodResult<flutter::EncodableValue>> result)
  65. {
  66. const auto *args = std::get_if<flutter::EncodableMap>(method_call.arguments());
  67. if (args)
  68. {
  69. auto deviceIndexIt = args->find(flutter::EncodableValue("deviceIndex"));
  70. if (deviceIndexIt != args->end())
  71. {
  72. int deviceIndex = std::get<int>(deviceIndexIt->second);
  73. bool success = ReaderService::GetInstance()->Connect(deviceIndex);
  74. result->Success(flutter::EncodableValue(success));
  75. return;
  76. }
  77. }
  78. result->Success(flutter::EncodableValue(false));
  79. }},
  80. {"disconnect", [](const flutter::MethodCall<flutter::EncodableValue> &method_call, std::unique_ptr<flutter::MethodResult<flutter::EncodableValue>> result)
  81. {
  82. ReaderService::GetInstance()->Disconnect();
  83. result->Success();
  84. }},
  85. {"startRead", [](const flutter::MethodCall<flutter::EncodableValue> &method_call, std::unique_ptr<flutter::MethodResult<flutter::EncodableValue>> result)
  86. {
  87. bool success = ReaderService::GetInstance()->StartRead();
  88. result->Success(flutter::EncodableValue(success));
  89. }},
  90. {"stopRead", [](const flutter::MethodCall<flutter::EncodableValue> &method_call, std::unique_ptr<flutter::MethodResult<flutter::EncodableValue>> result)
  91. {
  92. ReaderService::GetInstance()->StopRead();
  93. result->Success();
  94. }},
  95. {"getDeviceInfo", [](const flutter::MethodCall<flutter::EncodableValue> &method_call, std::unique_ptr<flutter::MethodResult<flutter::EncodableValue>> result)
  96. {
  97. std::string deviceInfo = ReaderService::GetInstance()->GetDeviceInfo();
  98. result->Success(flutter::EncodableValue(deviceInfo));
  99. }},
  100. {"getPower", [](const flutter::MethodCall<flutter::EncodableValue> &method_call, std::unique_ptr<flutter::MethodResult<flutter::EncodableValue>> result)
  101. {
  102. unsigned char power = 0;
  103. bool success = ReaderService::GetInstance()->GetPower(power);
  104. if (success) {
  105. result->Success(flutter::EncodableValue(static_cast<int>(power)));
  106. } else {
  107. result->Success(flutter::EncodableValue());
  108. }
  109. }},
  110. {"setPower", [](const flutter::MethodCall<flutter::EncodableValue> &method_call, std::unique_ptr<flutter::MethodResult<flutter::EncodableValue>> result)
  111. {
  112. const auto *args = std::get_if<flutter::EncodableMap>(method_call.arguments());
  113. if (args)
  114. {
  115. auto powerIt = args->find(flutter::EncodableValue("power"));
  116. if (powerIt != args->end())
  117. {
  118. int power = std::get<int>(powerIt->second);
  119. bool success = ReaderService::GetInstance()->SetPower(static_cast<unsigned char>(power));
  120. result->Success(flutter::EncodableValue(success));
  121. return;
  122. }
  123. }
  124. result->Success(flutter::EncodableValue(false));
  125. }}
  126. // More method handlers can be added here
  127. // {"methodName", [](auto result) { /* Handle method */ }}
  128. };
  129. // Find and execute the corresponding method handler
  130. auto handler = handlers.find(method_call.method_name());
  131. if (handler != handlers.end())
  132. {
  133. handler->second(method_call, std::move(result));
  134. }
  135. else
  136. {
  137. result->NotImplemented();
  138. }
  139. }