diff --git a/nx/include/switch/runtime/ringcon.h b/nx/include/switch/runtime/ringcon.h index 062b5ebd..ccf1b8d8 100644 --- a/nx/include/switch/runtime/ringcon.h +++ b/nx/include/switch/runtime/ringcon.h @@ -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; diff --git a/nx/include/switch/services/hidbus.h b/nx/include/switch/services/hidbus.h index 8fe8e277..42c0e6c2 100644 --- a/nx/include/switch/services/hidbus.h +++ b/nx/include/switch/services/hidbus.h @@ -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; diff --git a/nx/source/runtime/ringcon.c b/nx/source/runtime/ringcon.c index bf2c2ed5..36bba588 100644 --- a/nx/source/runtime/ringcon.c +++ b/nx/source/runtime/ringcon.c @@ -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; istatus != 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; } } diff --git a/nx/source/services/hidbus.c b/nx/source/services/hidbus.c index 6d171df2..d8b9170a 100644 --- a/nx/source/services/hidbus.c +++ b/nx/source/services/hidbus.c @@ -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; ientries[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; } }