reader_method_call.cpp 6.7 KB

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