5fd1b3a11f
The dongle beacon carries a pairing flag in the Microsoft OUI IE; with it clear, controllers ignore the beacon. Port xone_dongle_toggle_pairing: xone_set_pairing() rewrites the beacon with the flag set and blinks the LED, the GUI button triggers it, EVT_BUTTON (dongle button) does too, and the LED follows upstream state (blink while pairing, on when a controller is connected, off otherwise). The CLI gains a pair command. Log every inbound frame (info word + first 16 bytes) so the RX path can be traced against hardware. Co-Authored-By: qwen3.8-27b@q2_k_xl: pairing mode and RX logging
81 lines
3.0 KiB
C
81 lines
3.0 KiB
C
#pragma once
|
|
|
|
// ==============================================================================
|
|
// C ABI bridge between the C++ protocol stack and the Swift app layer
|
|
// ==============================================================================
|
|
// This header is imported into Swift via -import-objc-header, so it must stay
|
|
// pure C (no C++ types). The C++ modules implement these entry points.
|
|
// ==============================================================================
|
|
|
|
#include <stdbool.h>
|
|
#include <stdint.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
// Human-readable version string of the protocol stack.
|
|
const char *xone_version(void);
|
|
|
|
// TRUE if an Xbox Wireless Dongle is connected, FALSE otherwise.
|
|
bool xone_dongle_present(void);
|
|
|
|
// Opaque handle to an open dongle session. Create with xone_open(); only one
|
|
// session may be open at a time. The getters are safe to call from any thread.
|
|
typedef struct xone_dongle xone_dongle;
|
|
|
|
// Session states reported by xone_state().
|
|
enum {
|
|
XONE_STATE_IDLE = 0, // Probed; no firmware loaded yet
|
|
XONE_STATE_STARTING, // Firmware load + radio init in progress
|
|
XONE_STATE_READY, // Radio initialized
|
|
XONE_STATE_ERROR // Last operation failed (see xone_error)
|
|
};
|
|
|
|
// Open a dongle session: probe and USB reset. Fast; returns NULL if no dongle
|
|
// is present or opening fails. The EFUSE getters (xone_pid/xone_chip_id/
|
|
// xone_mac_address) are valid immediately after this.
|
|
xone_dongle *xone_open(void);
|
|
|
|
// Kick off firmware load + radio init on a background thread. Non-blocking:
|
|
// returns 0 once started, -1 if the session is busy or already ready. If
|
|
// firmware_path is NULL, the image is selected per product ID
|
|
// (firmware/xone_dongle_<pid>.bin).
|
|
int xone_start(xone_dongle *d, const char *firmware_path);
|
|
|
|
// Close the session and release the dongle. Waits for any in-progress start.
|
|
void xone_close(xone_dongle *d);
|
|
|
|
// Current session state (XONE_STATE_*).
|
|
int xone_state(const xone_dongle *d);
|
|
|
|
// Human-readable error from the last failed operation. Empty string if none.
|
|
const char *xone_error(const xone_dongle *d);
|
|
|
|
// Product ID of the connected dongle (e.g. 0x02E6).
|
|
uint16_t xone_pid(const xone_dongle *d);
|
|
|
|
// Chip ID from EFUSE (e.g. 0x7612 for MT7612). 0 if unknown.
|
|
uint16_t xone_chip_id(const xone_dongle *d);
|
|
|
|
// MAC address from EFUSE as "xx:xx:xx:xx:xx:xx". Valid until xone_close().
|
|
const char *xone_mac_address(const xone_dongle *d);
|
|
|
|
// Build string of the loaded firmware image (e.g. "201703281033____").
|
|
// Empty string if the firmware was not loaded. Valid until xone_close().
|
|
const char *xone_firmware_build(const xone_dongle *d);
|
|
|
|
// Number of connected controllers.
|
|
int xone_controller_count(xone_dongle const *d);
|
|
|
|
// Copy the controller at index into buf as "xx:xx:xx:xx:xx:xx". Returns 0 on
|
|
// success, -1 if index is out of range.
|
|
int xone_controller_mac(xone_dongle const *d, int index, char *buf, int len);
|
|
|
|
// Enter or leave pairing mode (beacon pairing flag + LED blink).
|
|
void xone_set_pairing(xone_dongle *d, bool enable);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|