import { listen } from "@tauri-apps/api/event"; import { invoke } from "@tauri-apps/api/core"; import type { ControllerInfo, RawInputEvent } from "@/types/controller"; import type { Profile } from "@/types/profile"; const INPUT_EVENT = "controller-input"; const READER_STATUS_EVENT = "controller-reader-status"; interface NativeInputEvent { timestamp: number; eventType: "button" | "axis"; code: string; rawValue: number; processedValue: number; } interface ReaderStatus { devicePath: string; connected: boolean; message: string | null; } function toRawInputEvent(event: NativeInputEvent): RawInputEvent { return { timestamp: event.timestamp, type: event.eventType, code: event.code, rawValue: event.rawValue, processedValue: event.processedValue, }; } export const tauriControllerService = { list: () => invoke("list_devices"), startReader: (devicePath: string) => invoke("start_device_reader", { devicePath }), applyRemappingProfile: (profile: Profile) => invoke("apply_remapping_profile", { profile }), setRemappingEnabled: (enabled: boolean) => invoke("set_remapping_enabled", { enabled }), virtualControllerActive: () => invoke("virtual_controller_active"), onInput: async (callback: (event: RawInputEvent) => void): Promise<() => void> => listen(INPUT_EVENT, (event) => callback(toRawInputEvent(event.payload))), onReaderStatus: async (callback: (status: ReaderStatus) => void): Promise<() => void> => listen(READER_STATUS_EVENT, (event) => callback(event.payload)), };