hidbus: Updated structs/enums.

This commit is contained in:
yellows8 2020-11-30 12:10:46 -05:00 committed by fincs
parent 5aa8986505
commit 3a11e1d309
No known key found for this signature in database
GPG Key ID: 62C7609ADA219C60
4 changed files with 71 additions and 71 deletions

View File

@ -49,7 +49,7 @@ typedef struct {
/// Polling data extracted from \ref HidbusJoyPollingReceivedData.
typedef struct {
s16 data; ///< Sensor state data.
u64 timestamp; ///< Sample timestamp.
u64 sampling_number; ///< SamplingNumber
} RingConPollingData;
/// Ring-Con state object.
@ -58,7 +58,7 @@ typedef struct {
HidbusBusHandle handle;
void* workbuf;
size_t workbuf_size;
u64 polling_last_timestamp;
u64 polling_last_sampling_number;
u32 error_flags;
u64 id_l, id_h;

View File

@ -12,9 +12,9 @@
/// BusType
typedef enum {
HidbusBusType_JoyLeftRail = 0, ///< JoyLeftRail
HidbusBusType_JoyRightRail = 1, ///< JoyRightRail
HidbusBusType_LarkRightRail = 2, ///< [6.0.0+] LarkRightRail (for microphone).
HidbusBusType_LeftJoyRail = 0, ///< LeftJoyRail
HidbusBusType_RightJoyRail = 1, ///< RightJoyRail
HidbusBusType_RightLarkRail = 2, ///< [6.0.0+] RightLarkRail (for microphone).
} HidbusBusType;
/// JoyPollingMode
@ -36,8 +36,8 @@ typedef struct {
/// JoyPollingReceivedData
typedef struct {
u8 data[0x30]; ///< Data.
u64 size; ///< Size of data.
u64 timestamp; ///< Timestamp.
u64 out_size; ///< Size of data.
u64 sampling_number; ///< SamplingNumber
} HidbusJoyPollingReceivedData;
/// HidbusDataAccessorHeader
@ -52,42 +52,42 @@ typedef struct {
/// HidbusJoyDisableSixAxisPollingDataAccessorEntryData
typedef struct {
u8 data[0x26]; ///< Data.
u8 size; ///< Size of data.
u8 out_size; ///< Size of data.
u8 pad; ///< Padding.
u64 timestamp; ///< Timestamp.
u64 sampling_number; ///< SamplingNumber
} HidbusJoyDisableSixAxisPollingDataAccessorEntryData;
/// HidbusJoyDisableSixAxisPollingDataAccessorEntry
typedef struct {
u64 timestamp; ///< Timestamp.
u64 sampling_number; ///< SamplingNumber
HidbusJoyDisableSixAxisPollingDataAccessorEntryData data; ///< \ref HidbusJoyDisableSixAxisPollingDataAccessorEntryData
} HidbusJoyDisableSixAxisPollingDataAccessorEntry;
/// HidbusJoyEnableSixAxisPollingDataAccessorEntryData
typedef struct {
u8 data[0x8]; ///< Data.
u8 size; ///< Size of data.
u8 out_size; ///< Size of data.
u8 pad[7]; ///< Padding.
u64 timestamp; ///< Timestamp.
u64 sampling_number; ///< SamplingNumber
} HidbusJoyEnableSixAxisPollingDataAccessorEntryData;
/// HidbusJoyEnableSixAxisPollingDataAccessorEntry
typedef struct {
u64 timestamp; ///< Timestamp.
u64 sampling_number; ///< SamplingNumber
HidbusJoyEnableSixAxisPollingDataAccessorEntryData data; ///< \ref HidbusJoyEnableSixAxisPollingDataAccessorEntryData
} HidbusJoyEnableSixAxisPollingDataAccessorEntry;
/// HidbusJoyButtonOnlyPollingDataAccessorEntryData
typedef struct {
u8 data[0x2c]; ///< Data.
u8 size; ///< Size of data.
u8 out_size; ///< Size of data.
u8 pad[3]; ///< Padding.
u64 timestamp; ///< Timestamp.
u64 sampling_number; ///< SamplingNumber
} HidbusJoyButtonOnlyPollingDataAccessorEntryData;
/// HidbusJoyButtonOnlyPollingDataAccessorEntry
typedef struct {
u64 timestamp; ///< Timestamp.
u64 sampling_number; ///< SamplingNumber
HidbusJoyButtonOnlyPollingDataAccessorEntryData data; ///< \ref HidbusJoyEnableSixAxisPollingDataAccessorEntryData
} HidbusJoyButtonOnlyPollingDataAccessorEntry;
@ -111,13 +111,13 @@ typedef struct {
/// Common data for HidbusStatusManagerEntry*.
typedef struct {
u8 flag_x0; ///< Flag.
u8 is_connected; ///< IsConnected
u8 pad[3]; ///< Padding.
Result res; ///< Result.
u8 device_enabled; ///< Flag indicating whether a device is enabled (\ref hidbusEnableExternalDevice).
u8 is_valid; ///< Flag indicating whether this entry is valid.
u8 polling_enabled; ///< Flag indicating whether polling is enabled (\ref hidbusEnableJoyPollingReceiveMode).
u8 unk_xb; ///< Unknown / padding?
Result is_connected_result; ///< IsConnectedResult
u8 is_enabled; ///< Flag indicating whether a device is enabled (\ref hidbusEnableExternalDevice).
u8 is_in_focus; ///< Flag indicating whether this entry is valid.
u8 is_polling_mode; ///< Flag indicating whether polling is enabled (\ref hidbusEnableJoyPollingReceiveMode).
u8 reserved; ///< Reserved
u32 polling_mode; ///< \ref HidbusJoyPollingMode
} HidbusStatusManagerEntryCommon;

View File

@ -70,9 +70,9 @@ Result ringconCreate(RingCon *c, HidNpadIdType id) {
if (R_SUCCEEDED(rc)) {
if (style_set & HidNpadStyleTag_NpadJoyLeft)
bus_type = HidbusBusType_JoyLeftRail;
bus_type = HidbusBusType_LeftJoyRail;
else if (style_set & (HidNpadStyleTag_NpadJoyRight | HidNpadStyleTag_NpadJoyDual))
bus_type = HidbusBusType_JoyRightRail;
bus_type = HidbusBusType_RightJoyRail;
else
rc = MAKERESULT(Module_Libnx, LibnxError_BadInput);
}
@ -265,10 +265,10 @@ Result ringconGetPollingData(RingCon *c, RingConPollingData *out, s32 count, s32
rc = hidbusGetJoyPollingReceivedData(c->handle, recv_data, 0x9);
if (R_SUCCEEDED(rc)) {
u64 tmp = recv_data[0].timestamp - c->polling_last_timestamp;
u64 tmp = recv_data[0].sampling_number - c->polling_last_sampling_number;
if (tmp > 0x9) tmp = 0x9;
if (count > tmp) count = tmp;
c->polling_last_timestamp = recv_data[0].timestamp;
c->polling_last_sampling_number = recv_data[0].sampling_number;
for (s32 i=0; i<count; i++) {
struct {
@ -278,10 +278,10 @@ Result ringconGetPollingData(RingCon *c, RingConPollingData *out, s32 count, s32
u8 pad2[0x2];
} *reply = (void*)recv_data[i].data;
if (recv_data[i].size != sizeof(*reply) || reply->status != 0) return MAKERESULT(218, 7);
if (recv_data[i].out_size != sizeof(*reply) || reply->status != 0) return MAKERESULT(218, 7);
out[i].data = reply->data;
out[i].timestamp = recv_data[i].timestamp;
out[i].sampling_number = recv_data[i].sampling_number;
}
}

View File

@ -180,24 +180,24 @@ static HidbusStatusManagerEntryCommon* _hidbusGetStatusManagerEntryCommon(u8 int
return &((HidbusStatusManager*)hidbusGetSharedmemAddr())->entries[internal_index].common;
}
static bool _hidbusGetStatusManagerEntryFlag_x0(u8 internal_index) {
return atomic_load_explicit(&_hidbusGetStatusManagerEntryCommon(internal_index)->flag_x0, memory_order_acquire) & 1;
static bool _hidbusGetStatusManagerEntryIsConnected(u8 internal_index) {
return atomic_load_explicit(&_hidbusGetStatusManagerEntryCommon(internal_index)->is_connected, memory_order_acquire) & 1;
}
static Result _hidbusGetStatusManagerEntryRes(u8 internal_index) {
return _hidbusGetStatusManagerEntryCommon(internal_index)->res;
static Result _hidbusGetStatusManagerEntryIsConnectedResult(u8 internal_index) {
return _hidbusGetStatusManagerEntryCommon(internal_index)->is_connected_result;
}
static bool _hidbusGetStatusManagerEntryDeviceEnabled(u8 internal_index) {
return atomic_load_explicit(&_hidbusGetStatusManagerEntryCommon(internal_index)->device_enabled, memory_order_acquire) & 1;
static bool _hidbusGetStatusManagerEntryDeviceIsEnabled(u8 internal_index) {
return atomic_load_explicit(&_hidbusGetStatusManagerEntryCommon(internal_index)->is_enabled, memory_order_acquire) & 1;
}
static bool _hidbusGetStatusManagerEntryIsValid(u8 internal_index) {
return atomic_load_explicit(&_hidbusGetStatusManagerEntryCommon(internal_index)->is_valid, memory_order_acquire) & 1;
static bool _hidbusGetStatusManagerEntryIsInFocus(u8 internal_index) {
return atomic_load_explicit(&_hidbusGetStatusManagerEntryCommon(internal_index)->is_in_focus, memory_order_acquire) & 1;
}
static bool _hidbusGetStatusManagerEntryPollingEnabled(u8 internal_index) {
return atomic_load_explicit(&_hidbusGetStatusManagerEntryCommon(internal_index)->polling_enabled, memory_order_acquire) & 1;
static bool _hidbusGetStatusManagerEntryIsPollingMode(u8 internal_index) {
return atomic_load_explicit(&_hidbusGetStatusManagerEntryCommon(internal_index)->is_polling_mode, memory_order_acquire) & 1;
}
static HidbusJoyPollingMode _hidbusGetStatusManagerEntryPollingMode(u8 internal_index) {
@ -299,10 +299,10 @@ Result hidbusEnableExternalDevice(HidbusBusHandle handle, bool flag, u32 device_
mutexLock(&entry->mutex);
if (memcmp(&entry->handle, &handle, sizeof(handle))!=0) rc = MAKERESULT(218, 4);
if (R_SUCCEEDED(rc) && !_hidbusGetStatusManagerEntryIsValid(index)) rc = MAKERESULT(218, 2);
if (R_SUCCEEDED(rc)) rc = _hidbusGetStatusManagerEntryRes(index);
if (R_SUCCEEDED(rc) && !_hidbusGetStatusManagerEntryIsInFocus(index)) rc = MAKERESULT(218, 2);
if (R_SUCCEEDED(rc)) rc = _hidbusGetStatusManagerEntryIsConnectedResult(index);
if (R_SUCCEEDED(rc)) {
if (!_hidbusGetStatusManagerEntryFlag_x0(index) && !flag) rc = MAKERESULT(218, 5);
if (!_hidbusGetStatusManagerEntryIsConnected(index) && !flag) rc = MAKERESULT(218, 5);
}
if (R_SUCCEEDED(rc)) rc = hidbusGetServiceSession(&srv);
@ -357,7 +357,7 @@ Result hidbusSendAndReceive(HidbusBusHandle handle, const void* inbuf, size_t in
mutexLock(&entry->mutex);
if (memcmp(&entry->handle, &handle, sizeof(handle))!=0) rc = MAKERESULT(218, 4);
if (R_SUCCEEDED(rc) && !_hidbusGetStatusManagerEntryDeviceEnabled(index)) rc = MAKERESULT(218, 8);
if (R_SUCCEEDED(rc) && !_hidbusGetStatusManagerEntryDeviceIsEnabled(index)) rc = MAKERESULT(218, 8);
if (R_SUCCEEDED(rc)) rc = hidbusGetServiceSession(&srv);
@ -388,9 +388,9 @@ Result hidbusEnableJoyPollingReceiveMode(HidbusBusHandle handle, const void* inb
mutexLock(&entry->mutex);
if (memcmp(&entry->handle, &handle, sizeof(handle))!=0) rc = MAKERESULT(218, 4);
if (R_SUCCEEDED(rc) && !_hidbusGetStatusManagerEntryDeviceEnabled(index)) rc = MAKERESULT(218, 8);
if (R_SUCCEEDED(rc) && !_hidbusGetStatusManagerEntryDeviceIsEnabled(index)) rc = MAKERESULT(218, 8);
if (R_SUCCEEDED(rc) && !_hidbusGetStatusManagerEntryPollingEnabled(index)) {
if (R_SUCCEEDED(rc) && !_hidbusGetStatusManagerEntryIsPollingMode(index)) {
rc = hidbusGetServiceSession(&srv);
if (R_SUCCEEDED(rc)) {
@ -416,7 +416,7 @@ Result hidbusDisableJoyPollingReceiveMode(HidbusBusHandle handle) {
mutexLock(&entry->mutex);
if (memcmp(&entry->handle, &handle, sizeof(handle))!=0) rc = MAKERESULT(218, 4);
if (R_SUCCEEDED(rc) && !_hidbusGetStatusManagerEntryDeviceEnabled(index)) rc = MAKERESULT(218, 8);
if (R_SUCCEEDED(rc) && !_hidbusGetStatusManagerEntryDeviceIsEnabled(index)) rc = MAKERESULT(218, 8);
if (R_SUCCEEDED(rc)) rc = hidbusGetServiceSession(&srv);
@ -434,13 +434,13 @@ Result hidbusGetJoyPollingReceivedData(HidbusBusHandle handle, HidbusJoyPollingR
HidBusDeviceEntry *entry = &g_hidbusDevices[index];
if (memcmp(&entry->handle, &handle, sizeof(handle))!=0) rc = MAKERESULT(218, 4);
if (R_SUCCEEDED(rc) && !_hidbusGetStatusManagerEntryDeviceEnabled(index)) rc = MAKERESULT(218, 8);
if (R_SUCCEEDED(rc) && !_hidbusGetStatusManagerEntryDeviceIsEnabled(index)) rc = MAKERESULT(218, 8);
if (R_SUCCEEDED(rc)) rc = _hidbusGetStatusManagerEntryRes(index);
if (R_SUCCEEDED(rc) && !_hidbusGetStatusManagerEntryFlag_x0(index)) rc = MAKERESULT(218, 8);
if (R_SUCCEEDED(rc)) rc = _hidbusGetStatusManagerEntryIsConnectedResult(index);
if (R_SUCCEEDED(rc) && !_hidbusGetStatusManagerEntryIsConnected(index)) rc = MAKERESULT(218, 8);
if (R_SUCCEEDED(rc) && count >= 1) memset(recv_data, 0, sizeof(HidbusJoyPollingReceivedData)*count);
if (R_SUCCEEDED(rc) && !_hidbusGetStatusManagerEntryPollingEnabled(index)) {
if (R_SUCCEEDED(rc) && !_hidbusGetStatusManagerEntryIsPollingMode(index)) {
return 0;
}
if (R_FAILED(rc)) return rc;
@ -490,30 +490,30 @@ Result hidbusGetJoyPollingReceivedData(HidbusBusHandle handle, HidbusJoyPollingR
for (s32 i=0; i<newcount; i++) {
s32 entrypos = (((latest_entry + 0xc) - newcount) + i) % 0xb;
u64 timestamp0=0, timestamp1=0;
u64 sampling_number0=0, sampling_number1=0;
bool retry=false;
if (polling_mode == HidbusJoyPollingMode_SixAxisSensorDisable) {
timestamp0 = atomic_load_explicit(&joydisable_accessor->entries[entrypos].timestamp, memory_order_acquire);
sampling_number0 = atomic_load_explicit(&joydisable_accessor->entries[entrypos].sampling_number, memory_order_acquire);
memcpy(&tmp_entries.joydisable[newcount-i-1], &joydisable_accessor->entries[entrypos].data, sizeof(HidbusJoyDisableSixAxisPollingDataAccessorEntryData));
timestamp1 = atomic_load_explicit(&joydisable_accessor->entries[entrypos].timestamp, memory_order_acquire);
sampling_number1 = atomic_load_explicit(&joydisable_accessor->entries[entrypos].sampling_number, memory_order_acquire);
if (timestamp0 != timestamp1 || (i>0 && joydisable_accessor->entries[entrypos].data.timestamp - tmp_entries.joydisable[newcount-i].timestamp != 1))
if (sampling_number0 != sampling_number1 || (i>0 && joydisable_accessor->entries[entrypos].data.sampling_number - tmp_entries.joydisable[newcount-i].sampling_number != 1))
retry=true;
}
else if (polling_mode == HidbusJoyPollingMode_SixAxisSensorEnable) {
timestamp0 = atomic_load_explicit(&joyenable_accessor->entries[entrypos].timestamp, memory_order_acquire);
sampling_number0 = atomic_load_explicit(&joyenable_accessor->entries[entrypos].sampling_number, memory_order_acquire);
memcpy(&tmp_entries.joyenable[newcount-i-1], &joyenable_accessor->entries[entrypos].data, sizeof(HidbusJoyEnableSixAxisPollingDataAccessorEntryData));
timestamp1 = atomic_load_explicit(&joyenable_accessor->entries[entrypos].timestamp, memory_order_acquire);
sampling_number1 = atomic_load_explicit(&joyenable_accessor->entries[entrypos].sampling_number, memory_order_acquire);
if (timestamp0 != timestamp1 || (i>0 && joyenable_accessor->entries[entrypos].data.timestamp - tmp_entries.joyenable[newcount-i].timestamp != 1))
if (sampling_number0 != sampling_number1 || (i>0 && joyenable_accessor->entries[entrypos].data.sampling_number - tmp_entries.joyenable[newcount-i].sampling_number != 1))
retry=true;
}
else if (hosversionAtLeast(6,0,0) && polling_mode == HidbusJoyPollingMode_ButtonOnly) {
timestamp0 = atomic_load_explicit(&joybutton_accessor->entries[entrypos].timestamp, memory_order_acquire);
sampling_number0 = atomic_load_explicit(&joybutton_accessor->entries[entrypos].sampling_number, memory_order_acquire);
memcpy(&tmp_entries.joybutton[newcount-i-1], &joybutton_accessor->entries[entrypos].data, sizeof(HidbusJoyButtonOnlyPollingDataAccessorEntryData));
timestamp1 = atomic_load_explicit(&joybutton_accessor->entries[entrypos].timestamp, memory_order_acquire);
sampling_number1 = atomic_load_explicit(&joybutton_accessor->entries[entrypos].sampling_number, memory_order_acquire);
if (timestamp0 != timestamp1 || (i>0 && joybutton_accessor->entries[entrypos].data.timestamp - tmp_entries.joybutton[newcount-i].timestamp != 1))
if (sampling_number0 != sampling_number1 || (i>0 && joybutton_accessor->entries[entrypos].data.sampling_number - tmp_entries.joybutton[newcount-i].sampling_number != 1))
retry=true;
}
@ -529,13 +529,13 @@ Result hidbusGetJoyPollingReceivedData(HidbusBusHandle handle, HidbusJoyPollingR
bool dataready=false;
if (polling_mode == HidbusJoyPollingMode_SixAxisSensorDisable) {
dataready = tmp_entries.joydisable[count-1].timestamp != 0;
dataready = tmp_entries.joydisable[count-1].sampling_number != 0;
}
else if (polling_mode == HidbusJoyPollingMode_SixAxisSensorEnable) {
dataready = tmp_entries.joyenable[count-1].timestamp != 0;
dataready = tmp_entries.joyenable[count-1].sampling_number != 0;
}
else if (hosversionAtLeast(6,0,0) && polling_mode == HidbusJoyPollingMode_ButtonOnly) {
dataready = tmp_entries.joybutton[count-1].timestamp != 0;
dataready = tmp_entries.joybutton[count-1].sampling_number != 0;
}
if (!dataready) rc = MAKERESULT(218, 7);
if (R_SUCCEEDED(rc)) rc = accessor_header->res;
@ -545,25 +545,25 @@ Result hidbusGetJoyPollingReceivedData(HidbusBusHandle handle, HidbusJoyPollingR
u8 size=0;
if (polling_mode == HidbusJoyPollingMode_SixAxisSensorDisable) {
size = tmp_entries.joydisable[i].size;
size = tmp_entries.joydisable[i].out_size;
if (size > sizeof(tmp_entries.joydisable[i].data)) return MAKERESULT(Module_Libnx, LibnxError_ShouldNotHappen);
memcpy(recv_data[i].data, tmp_entries.joydisable[i].data, size);
recv_data[i].size = size;
recv_data[i].timestamp = tmp_entries.joydisable[i].timestamp;
recv_data[i].out_size = size;
recv_data[i].sampling_number = tmp_entries.joydisable[i].sampling_number;
}
else if (polling_mode == HidbusJoyPollingMode_SixAxisSensorEnable) {
size = tmp_entries.joyenable[i].size;
size = tmp_entries.joyenable[i].out_size;
if (size > sizeof(tmp_entries.joyenable[i].data)) return MAKERESULT(Module_Libnx, LibnxError_ShouldNotHappen);
memcpy(recv_data[i].data, tmp_entries.joyenable[i].data, size);
recv_data[i].size = size;
recv_data[i].timestamp = tmp_entries.joyenable[i].timestamp;
recv_data[i].out_size = size;
recv_data[i].sampling_number = tmp_entries.joyenable[i].sampling_number;
}
else if (hosversionAtLeast(6,0,0) && polling_mode == HidbusJoyPollingMode_ButtonOnly) {
size = tmp_entries.joybutton[i].size;
size = tmp_entries.joybutton[i].out_size;
if (size > sizeof(tmp_entries.joybutton[i].data)) return MAKERESULT(Module_Libnx, LibnxError_ShouldNotHappen);
memcpy(recv_data[i].data, tmp_entries.joybutton[i].data, size);
recv_data[i].size = size;
recv_data[i].timestamp = tmp_entries.joybutton[i].timestamp;
recv_data[i].out_size = size;
recv_data[i].sampling_number = tmp_entries.joybutton[i].sampling_number;
}
}