#include "reader_method_call.h" #include "reader_service.h" #include #include #include #include #include #include #include #include #include #include static std::unique_ptr> g_event_channel = nullptr; static std::unique_ptr> g_stream_handler = nullptr; void ReaderMethodCall::RegisterWindowsAPI(flutter::FlutterEngine *engine) { auto channel = std::make_unique>( engine->messenger(), "com.vber.chicken_farm/win_reader", &flutter::StandardMethodCodec::GetInstance()); channel->SetMethodCallHandler([](const auto &call, auto result) { HandleMethodCall(call, std::move(result)); }); g_event_channel = std::make_unique>( engine->messenger(), "com.vber.chicken_farm/win_reader_events", &flutter::StandardMethodCodec::GetInstance()); g_stream_handler = std::make_unique>( [](const flutter::EncodableValue *arguments, std::unique_ptr> &&events) -> std::unique_ptr> { auto events_ptr = std::shared_ptr>(std::move(events)); ReaderService::GetInstance()->SetDataCallback([events_ptr](const std::string &data) { events_ptr->Success(flutter::EncodableValue(data)); }); return nullptr; }, [](const flutter::EncodableValue *arguments) -> std::unique_ptr> { ReaderService::GetInstance()->SetDataCallback(nullptr); return nullptr; }); g_event_channel->SetStreamHandler(std::move(g_stream_handler)); } void ReaderMethodCall::HandleMethodCall( const flutter::MethodCall &method_call, std::unique_ptr> result) { // Use a map to handle different method calls static std::map &method_call, std::unique_ptr> result)>> handlers = { {"scanUsb", [](const flutter::MethodCall &method_call, std::unique_ptr> result) { // Call the scan USB method of the reader service std::vector usb = ReaderService::GetInstance()->ScanUsb(); // Create a list to store USB device names flutter::EncodableList device_list; for (const auto &device : usb) { device_list.push_back(flutter::EncodableValue(device)); } // Return the list of USB devices to Flutter (empty if no devices found) result->Success(flutter::EncodableValue(device_list)); }}, {"connect", [](const flutter::MethodCall &method_call, std::unique_ptr> result) { const auto *args = std::get_if(method_call.arguments()); if (args) { auto deviceIndexIt = args->find(flutter::EncodableValue("deviceIndex")); if (deviceIndexIt != args->end()) { int deviceIndex = std::get(deviceIndexIt->second); bool success = ReaderService::GetInstance()->Connect(deviceIndex); result->Success(flutter::EncodableValue(success)); return; } } result->Success(flutter::EncodableValue(false)); }}, {"disconnect", [](const flutter::MethodCall &method_call, std::unique_ptr> result) { ReaderService::GetInstance()->Disconnect(); result->Success(); }}, {"startRead", [](const flutter::MethodCall &method_call, std::unique_ptr> result) { bool success = ReaderService::GetInstance()->StartRead(); result->Success(flutter::EncodableValue(success)); }}, {"stopRead", [](const flutter::MethodCall &method_call, std::unique_ptr> result) { ReaderService::GetInstance()->StopRead(); result->Success(); }}, {"getDeviceInfo", [](const flutter::MethodCall &method_call, std::unique_ptr> result) { std::string deviceInfo = ReaderService::GetInstance()->GetDeviceInfo(); result->Success(flutter::EncodableValue(deviceInfo)); }}, {"getPower", [](const flutter::MethodCall &method_call, std::unique_ptr> result) { unsigned char power = 0; bool success = ReaderService::GetInstance()->GetPower(power); if (success) { result->Success(flutter::EncodableValue(static_cast(power))); } else { result->Success(flutter::EncodableValue()); } }}, {"setPower", [](const flutter::MethodCall &method_call, std::unique_ptr> result) { const auto *args = std::get_if(method_call.arguments()); if (args) { auto powerIt = args->find(flutter::EncodableValue("power")); if (powerIt != args->end()) { int power = std::get(powerIt->second); bool success = ReaderService::GetInstance()->SetPower(static_cast(power)); result->Success(flutter::EncodableValue(success)); return; } } result->Success(flutter::EncodableValue(false)); }} // More method handlers can be added here // {"methodName", [](auto result) { /* Handle method */ }} }; // Find and execute the corresponding method handler auto handler = handlers.find(method_call.method_name()); if (handler != handlers.end()) { handler->second(method_call, std::move(result)); } else { result->NotImplemented(); } }