Skip to content

Commit

Permalink
Merge branch 'develop' into handleRanging
Browse files Browse the repository at this point in the history
  • Loading branch information
abeltrano authored Mar 1, 2023
2 parents 6cf86a0 + 6616c95 commit 7264080
Show file tree
Hide file tree
Showing 6 changed files with 178 additions and 20 deletions.
7 changes: 7 additions & 0 deletions tests/unit/windows/TestUwbCxAdapterDdiLrpConversion.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,13 @@ TEST_CASE("ddi <-> neutral type conversions are stable", "[basic][conversion][wi
}
}

SECTION("UwbSessionType is stable")
{
for (const auto& uwbSessionType : magic_enum::enum_values<UwbSessionType>()) {
test::ValidateRoundtrip(uwbSessionType);
}
}

SECTION("UwbLineOfSightIndicator is stable")
{
for (const auto& uwbLineOfSightIndicator : magic_enum::enum_values<UwbLineOfSightIndicator>()) {
Expand Down
22 changes: 22 additions & 0 deletions windows/devices/uwb/UwbCxAdapterDdiLrp.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,17 @@ windows::devices::uwb::ddi::lrp::From(const UwbDeviceState &uwbDeviceState)
return DeviceStateMap.at(uwbDeviceState);
}

UWB_SESSION_TYPE
windows::devices::uwb::ddi::lrp::From(const ::uwb::protocol::fira::UwbSessionType &uwbSessionType)
{
static const std::unordered_map<UwbSessionType, UWB_SESSION_TYPE> SessionTypeMap{
{ UwbSessionType::RangingSession, UWB_SESSION_TYPE_RANGING_SESSION },
{ UwbSessionType::TestMode, UWB_SESSION_TYPE_DEVICE_TEST_MODE },
};

return SessionTypeMap.at(uwbSessionType);
}

UWB_LINE_OF_SIGHT_INDICATOR
windows::devices::uwb::ddi::lrp::From(const UwbLineOfSightIndicator &uwbLineOfSightIndicator)
{
Expand Down Expand Up @@ -746,6 +757,17 @@ windows::devices::uwb::ddi::lrp::To(const UWB_DEVICE_STATUS &deviceStatus)
};
}

UwbSessionType
windows::devices::uwb::ddi::lrp::To(const UWB_SESSION_TYPE &sessionType)
{
static const std::unordered_map<UWB_SESSION_TYPE, UwbSessionType> SessionTypeMap{
{ UWB_SESSION_TYPE_RANGING_SESSION, UwbSessionType::RangingSession },
{ UWB_SESSION_TYPE_DEVICE_TEST_MODE, UwbSessionType::TestMode },
};

return SessionTypeMap.at(sessionType);
}

UwbDeviceConfigurationParameterType
windows::devices::uwb::ddi::lrp::To(const UWB_DEVICE_CONFIG_PARAM_TYPE &deviceConfigurationParameterType)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,15 @@ From(const ::uwb::protocol::fira::UwbStatus &uwbStatus);
UWB_DEVICE_STATE
From(const ::uwb::protocol::fira::UwbDeviceState &uwbDeviceState);

/**
* @brief Converts UwbSessionType to UWB_SESSION_TYPE.
*
* @param uwbSessionType
* @return UWB_SESSION_TYPE
*/
UWB_SESSION_TYPE
From(const ::uwb::protocol::fira::UwbSessionType &uwbSessionType);

/**
* @brief Converts UwbLineOfSightIndicator to UWB_LINE_OF_SIGHT_INDICATOR.
*
Expand Down Expand Up @@ -286,6 +295,16 @@ To(const UWB_STATUS &status);
::uwb::protocol::fira::UwbDeviceState
To(const UWB_DEVICE_STATE &deviceState);


/**
* @brief Converts UWB_SESSION_TYPE to UwbSessionType.
*
* @param sessionType
* @return ::uwb::protocol::fira::UwbSessionType
*/
::uwb::protocol::fira::UwbSessionType
To(const UWB_SESSION_TYPE &sessionType);

/**
* @brief Converts UWB_LINE_OF_SIGHT_INDICATOR to UwbLineOfSightIndicator.
*
Expand Down
1 change: 1 addition & 0 deletions windows/drivers/uwb/simulator/IUwbSimulatorSession.hxx
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ struct IUwbSimulatorSession
UwbSessionType Type{ UwbSessionType::RangingSession };
UwbSessionState State{ UwbSessionState::Deinitialized };
uint32_t Sequence{ 0 };
uint32_t RangingCount{ 0 };
std::unordered_set<::uwb::UwbMacAddress> Controlees;
std::vector<std::shared_ptr<IUwbAppConfigurationParameter>> ApplicationConfigurationParameters;
};
Expand Down
16 changes: 12 additions & 4 deletions windows/drivers/uwb/simulator/UwbSimulatorDdiCallbacks.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -136,8 +136,6 @@ UwbSimulatorDdiCallbacks::SessionDeninitialize(uint32_t sessionId)
auto &session = nodeHandle.mapped();
SessionUpdateState(session, UwbSessionState::Deinitialized);

// TODO: do whatever else is needed for deinitialization

return UwbStatusOk;
}

Expand Down Expand Up @@ -210,7 +208,7 @@ UwbSimulatorDdiCallbacks::SessionStartRanging(uint32_t sessionId)
}

auto &[_, session] = *sessionIt;
session.Sequence++;
session.RangingCount++;
return UwbStatusOk;
}

Expand All @@ -229,8 +227,17 @@ UwbSimulatorDdiCallbacks::SessionStopRanging(uint32_t sessionId)
}

UwbStatus
UwbSimulatorDdiCallbacks::SessionGetRangingCount(uint32_t /* sessionId */, uint32_t & /* rangingCount */)
UwbSimulatorDdiCallbacks::SessionGetRangingCount(uint32_t sessionId, uint32_t &rangingCount)
{
std::unique_lock sessionsWriteLock{ m_sessionsGate };
auto sessionIt = m_sessions.find(sessionId);
if (sessionIt == std::cend(m_sessions)) {
return UwbStatusSession::NotExist;
}

auto &[_, session] = *sessionIt;
rangingCount = session.RangingCount;

return UwbStatusOk;
}

Expand Down Expand Up @@ -320,5 +327,6 @@ UwbSimulatorDdiCallbacks::SessionRandomMeasurementGenerationConfigure(uint32_t s
session.RandomRangingMeasurementGenerationStart([&](UwbRangingData rangingData) {
RaiseUwbNotification(std::move(rangingData));
});
break;
}
}
133 changes: 117 additions & 16 deletions windows/drivers/uwb/simulator/UwbSimulatorDdiHandlerLrp.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@ UwbSimulatorDdiHandler::OnUwbGetApplicationConfigurationParameters(WDFREQUEST re
NTSTATUS status = STATUS_SUCCESS;

// Convert DDI input type to neutral type.
auto &applicationConfigurationParametersIn [[maybe_unused]] = *reinterpret_cast<UWB_SET_APP_CONFIG_PARAMS *>(std::data(inputBuffer));
auto &applicationConfigurationParametersIn = *reinterpret_cast<UWB_SET_APP_CONFIG_PARAMS *>(std::data(inputBuffer));
std::vector<std::shared_ptr<IUwbAppConfigurationParameter>> applicationConfigurationParameters{};
std::vector<std::tuple<UwbApplicationConfigurationParameterType, UwbStatus, std::shared_ptr<IUwbAppConfigurationParameter>>> applicationConfigurationParameterResults;

Expand All @@ -171,14 +171,14 @@ UwbSimulatorDdiHandler::OnUwbSetApplicationConfigurationParameters(WDFREQUEST re
NTSTATUS status = STATUS_SUCCESS;

// Convert DDI input type to neutral type.
auto &applicationConfigurationParametersIn [[maybe_unused]] = *reinterpret_cast<UWB_SET_APP_CONFIG_PARAMS *>(std::data(inputBuffer));
auto &applicationConfigurationParametersIn = *reinterpret_cast<UWB_SET_APP_CONFIG_PARAMS *>(std::data(inputBuffer));
std::vector<std::shared_ptr<IUwbAppConfigurationParameter>> applicationConfigurationParameters{};
std::vector<std::tuple<UwbApplicationConfigurationParameterType, UwbStatus, std::shared_ptr<IUwbAppConfigurationParameter>>> applicationConfigurationParameterResults;

// Invoke callback.
auto statusUwb = m_callbacks->SetApplicationConfigurationParameters(applicationConfigurationParametersIn.sessionId, applicationConfigurationParameters, applicationConfigurationParameterResults);

// Convert neutral types to DDI types.
// Convert neutral type to DDI output type.
auto &outputValue = *reinterpret_cast<UWB_SET_APP_CONFIG_PARAMS_STATUS *>(std::data(outputBuffer));
outputValue.size = sizeof outputValue;
outputValue.status = UwbCxDdi::From(statusUwb);
Expand All @@ -191,23 +191,70 @@ UwbSimulatorDdiHandler::OnUwbSetApplicationConfigurationParameters(WDFREQUEST re

// IOCTL_UWB_GET_SESSION_COUNT
NTSTATUS
UwbSimulatorDdiHandler::OnUwbGetSessionCount(WDFREQUEST /*request*/, std::span<uint8_t> /*inputBuffer*/, std::span<uint8_t> /*outputBuffer*/)
UwbSimulatorDdiHandler::OnUwbGetSessionCount(WDFREQUEST request, std::span<uint8_t> /*inputBuffer*/, std::span<uint8_t> outputBuffer)
{
return STATUS_NOT_IMPLEMENTED;
NTSTATUS status = STATUS_SUCCESS;

// Invoke callback.
uint32_t sessionCount = 0;
auto statusUwb = m_callbacks->GetSessionCount(sessionCount);

// Convert neutral type to DDI output type.
auto &outputValue = *reinterpret_cast<UWB_GET_SESSION_COUNT *>(std::data(outputBuffer));
outputValue.size = sizeof outputValue;
outputValue.status = UwbCxDdi::From(statusUwb);
outputValue.sessionCount = sessionCount;

// Complete the request.
WdfRequestCompleteWithInformation(request, status, outputValue.size);

return status;
}

// IOCTL_UWB_SESSION_INIT
NTSTATUS
UwbSimulatorDdiHandler::OnUwbSessionInitialize(WDFREQUEST /*request*/, std::span<uint8_t> /*inputBuffer*/, std::span<uint8_t> /*outputBuffer*/)
UwbSimulatorDdiHandler::OnUwbSessionInitialize(WDFREQUEST request, std::span<uint8_t> inputBuffer, std::span<uint8_t> outputBuffer)
{
return STATUS_NOT_IMPLEMENTED;
NTSTATUS status = STATUS_SUCCESS;

// Convert DDI input type to neutral type.
auto &sessionInitIn = *reinterpret_cast<UWB_SESSION_INIT *>(std::data(inputBuffer));
auto sessionType = UwbCxDdi::To(sessionInitIn.sessionType);
auto sessionId = sessionInitIn.sessionId;

// Invoke callback.
auto statusUwb = m_callbacks->SessionInitialize(sessionId, sessionType);

// Convert neutral type to DDI output type.
auto &outputValue = *reinterpret_cast<UWB_STATUS *>(std::data(outputBuffer));
outputValue = UwbCxDdi::From(statusUwb);

WdfRequestCompleteWithInformation(request, status, sizeof outputValue);

return status;
}

// IOCTL_UWB_SESSION_DEINIT
NTSTATUS
UwbSimulatorDdiHandler::OnUwbSessionDeinitialize(WDFREQUEST /*request*/, std::span<uint8_t> /*inputBuffer*/, std::span<uint8_t> /*outputBuffer*/)
UwbSimulatorDdiHandler::OnUwbSessionDeinitialize(WDFREQUEST request, std::span<uint8_t> inputBuffer, std::span<uint8_t> outputBuffer)
{
return STATUS_NOT_IMPLEMENTED;
NTSTATUS status = STATUS_SUCCESS;

// Convert DDI input type to neutral type.
auto &sessionDeinitIn = *reinterpret_cast<UWB_SESSION_DEINIT *>(std::data(inputBuffer));
uint32_t sessionId = sessionDeinitIn.sessionId;

// Invoke callback.
auto statusUwb = m_callbacks->SessionDeninitialize(sessionId);

// Convert neutral type to DDI output type.
auto &outputValue = *reinterpret_cast<UWB_STATUS *>(std::data(outputBuffer));
outputValue = UwbCxDdi::From(statusUwb);

// Complete request.
WdfRequestCompleteWithInformation(request, status, sizeof outputValue);

return status;
}

// IOCTL_UWB_GET_SESSION_STATE
Expand All @@ -218,8 +265,11 @@ UwbSimulatorDdiHandler::OnUwbGetSessionState(WDFREQUEST request, std::span<uint8

// Convert DDI input type to neutral type.
auto &sessionStateIn = *reinterpret_cast<UWB_GET_SESSION_STATE *>(std::data(inputBuffer));
auto sessionId = sessionStateIn.sessionId;

// Invoke callback.
UwbSessionState sessionStateResult{};
auto statusUwb = m_callbacks->SessionGetState(sessionStateIn.sessionId, sessionStateResult);
auto statusUwb = m_callbacks->SessionGetState(sessionId, sessionStateResult);

// Convert neutral types to DDI types.
auto &outputValue = *reinterpret_cast<UWB_SESSION_STATE_STATUS *>(std::data(outputBuffer));
Expand All @@ -242,23 +292,74 @@ UwbSimulatorDdiHandler::OnUwbSessionUpdateControllerMulticastList(WDFREQUEST /*r

// IOCTL_UWB_START_RANGING_SESSION
NTSTATUS
UwbSimulatorDdiHandler::OnUwbSessionStartRanging(WDFREQUEST /*request*/, std::span<uint8_t> /*inputBuffer*/, std::span<uint8_t> /*outputBuffer*/)
UwbSimulatorDdiHandler::OnUwbSessionStartRanging(WDFREQUEST request, std::span<uint8_t> inputBuffer, std::span<uint8_t> outputBuffer)
{
return STATUS_NOT_IMPLEMENTED;
NTSTATUS status = STATUS_SUCCESS;

// Convert DDI input type to neutral type.
auto &startRangingSessionIn = *reinterpret_cast<UWB_START_RANGING_SESSION *>(std::data(inputBuffer));
auto sessionId = startRangingSessionIn.sessionId;

// Invoke callback.
auto statusUwb = m_callbacks->SessionStartRanging(sessionId);

// Convert neutral types to DDI types.
auto &outputValue = *reinterpret_cast<UWB_STATUS *>(std::data(outputBuffer));
outputValue = UwbCxDdi::From(statusUwb);

// Complete the request.
WdfRequestCompleteWithInformation(request, status, sizeof outputValue);

return status;
}

// IOCTL_UWB_STOP_RANGING_SESSION
NTSTATUS
UwbSimulatorDdiHandler::OnUwbSessionStopRanging(WDFREQUEST /*request*/, std::span<uint8_t> /*inputBuffer*/, std::span<uint8_t> /*outputBuffer*/)
UwbSimulatorDdiHandler::OnUwbSessionStopRanging(WDFREQUEST request, std::span<uint8_t> inputBuffer, std::span<uint8_t> outputBuffer)
{
return STATUS_NOT_IMPLEMENTED;
NTSTATUS status = STATUS_SUCCESS;

// Convert DDI input type to neutral type.
auto &stopRangingSessionIn = *reinterpret_cast<UWB_STOP_RANGING_SESSION *>(std::data(inputBuffer));
auto sessionId = stopRangingSessionIn.sessionId;

// Invoke callback.
auto statusUwb = m_callbacks->SessionStopRanging(sessionId);

// Convert neutral types to DDI types.
auto &outputValue = *reinterpret_cast<UWB_STATUS *>(std::data(outputBuffer));
outputValue = UwbCxDdi::From(statusUwb);

// Complete the request.
WdfRequestCompleteWithInformation(request, status, sizeof outputValue);

return status;
}

// IOCTL_UWB_GET_RANGING_COUNT
NTSTATUS
UwbSimulatorDdiHandler::OnUwbSessionGetRangingCount(WDFREQUEST /*request*/, std::span<uint8_t> /*inputBuffer*/, std::span<uint8_t> /*outputBuffer*/)
UwbSimulatorDdiHandler::OnUwbSessionGetRangingCount(WDFREQUEST request, std::span<uint8_t> inputBuffer, std::span<uint8_t> outputBuffer)
{
return STATUS_NOT_IMPLEMENTED;
NTSTATUS status = STATUS_SUCCESS;

// Convert DDI input type to neutral type.
auto &getRangingCountIn = *reinterpret_cast<UWB_GET_RANGING_COUNT *>(std::data(inputBuffer));
auto sessionId = getRangingCountIn.sessionId;

// Invoke callback.
uint32_t rangingCount = 0;
auto statusUwb = m_callbacks->SessionGetRangingCount(sessionId, rangingCount);

// Convert neutral types to DDI types.
auto &outputValue = *reinterpret_cast<UWB_RANGING_COUNT *>(std::data(outputBuffer));
outputValue.size = sizeof outputValue;
outputValue.status = UwbCxDdi::From(statusUwb);
outputValue.count = rangingCount;

// Complete the request.
WdfRequestCompleteWithInformation(request, status, outputValue.size);

return status;
}

// IOCTL_UWB_NOTIFICATION
Expand Down

0 comments on commit 7264080

Please sign in to comment.