Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add GetAvailableSlots API #170

Draft
wants to merge 1 commit into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Added
- Added `SimulationFps` event that is fired every second and contains simulation fps information since the last event (i.e. for the past ~1sec).
- Added `GetSessionId` API
- Added `GetAvaliableSlots` API

## [0.6.0] - 2022-05-30

Expand Down
2 changes: 1 addition & 1 deletion STATUS.md
Original file line number Diff line number Diff line change
Expand Up @@ -270,7 +270,7 @@ should use their independent logging and tracing functions.
- [ ] `getRealTime`
- [ ] `getMissionOptions`
- [ ] `getAvailableCoalitions`
- [ ] `getAvailableSlots`
- [x] `getAvailableSlots`
- [ ] `getCurrentMission`
- [x] `getMissionName`
- [x] `getMissionDescription`
Expand Down
56 changes: 56 additions & 0 deletions lua/DCS-gRPC/methods/hook.lua
Original file line number Diff line number Diff line change
Expand Up @@ -118,3 +118,59 @@ GRPC.methods.getUnitType = function(params)

return GRPC.success({type = unit_type})
end

GRPC.methods.getAvailableSlotDetails = function()
local redForSlots = DCS.getAvailableSlots('red')
local blueForSlots = DCS.getAvailableSlots('blue')
local slots = {}

for _, gameSlot in ipairs(redForSlots) do
local exportSlot = {
unitId = gameSlot.unitId,
type = gameSlot.type,
role = gameSlot.role,
groupName = gameSlot.groupName,
groupSize = gameSlot.groupSize,
coalition = 1 + 1, -- Increment for non zero-indexed gRPC enum
task = gameSlot.task,
onboardNumber = gameSlot.onboard_num,
}

if gameSlot.airdromeId ~= nil then
exportSlot.airdromeId = gameSlot.airdromeId
end

if gameSlot.helipadUnitType ~= nil then
exportSlot.helipadUnitType = gameSlot.helipadUnitType
exportSlot.helipadName = gameSlot.helipadName
end

table.insert(slots, exportSlot)
end

for _, gameSlot in ipairs(blueForSlots) do
local exportSlot = {
unitId = gameSlot.unitId,
type = gameSlot.type,
role = gameSlot.role,
groupName = gameSlot.groupName,
groupSize = gameSlot.groupSize,
coalition = 2 + 1, -- Increment for non zero-indexed gRPC enum
task = gameSlot.task,
onboardNumber = gameSlot.onboard_num,
}

if gameSlot.airdromeId ~= nil then
exportSlot.airdromeId = gameSlot.airdromeId
end

if gameSlot.helipadUnitType ~= nil then
exportSlot.helipadUnitType = gameSlot.helipadUnitType
exportSlot.helipadName = gameSlot.helipadName
end

table.insert(slots, exportSlot)
end

return GRPC.success({slots = slots})
end
41 changes: 41 additions & 0 deletions protos/dcs/hook/v0/hook.proto
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
syntax = "proto3";
package dcs.hook.v0;
import "dcs/common/v0/common.proto";
option csharp_namespace = "RurouniJones.Dcs.Grpc.V0.Hook";
option go_package = "github.com/DCS-gRPC/go-bindings/dcs/v0/hook";

Expand Down Expand Up @@ -65,6 +66,10 @@ service HookService {

// https://wiki.hoggitworld.com/view/DCS_func_getUnitType
rpc GetUnitType(GetUnitTypeRequest) returns (GetUnitTypeResponse) {}

// Should only be called once per session until ED implement dynamic spawning
// https://wiki.hoggitworld.com/view/DCS_func_getAvailableSlots
rpc GetAvailableSlotDetails(GetAvailableSlotDetailsRequest) returns (GetAvailableSlotDetailsResponse) {}
}

message GetMissionNameRequest {
Expand Down Expand Up @@ -215,3 +220,39 @@ message GetUnitTypeResponse {
// Type of unit (e.g. "F-14B")
string type = 1;
}

message GetAvailableSlotDetailsRequest {
}

message GetAvailableSlotDetailsResponse {
repeated AvailableSlotDetails slots = 1;
}

message AvailableSlotDetails {
// the unitId of the slot. For multi-crew it is two strings
// joined by an underscore for non-pilot slots.
string unit_ud = 1;
// The aiframe type associated with the slot
string type = 2;
// The place number of the slot on an aircraft
string multicrew_place = 3;
// The role of the slot (Pilot, Radar Intercept Officer etc.)
string role = 4;
// The group name associated with the slot
string group_name = 6;
// The size of the group associated with the slot
string group_size = 7;
// The task of the slot (CAP, CAS, SEAD etc.)
string task = 8;
// Coalition associated with the slot
dcs.common.v0.Coalition coalition = 9;
// Visual Number of the aircaft (e.g. MODEX on US aircraft).
// String to preserve leading zeroes
string onboard_number = 10;
// The ID of the airdrome associated with the slot, if any.
optional int32 airdrome_id = 11;
// The type of the unit that owns the helipad associated with this slot, if any.
optional string helipad_unit_type = 12;
// The name of the unit that owns the helipad associated with this slot, if any.
optional string helipad_unit_name = 13;
}
8 changes: 8 additions & 0 deletions src/rpc/hook.rs
Original file line number Diff line number Diff line change
Expand Up @@ -144,4 +144,12 @@ impl HookService for HookRpc {
let res = self.request("getUnitType", request).await?;
Ok(Response::new(res))
}

async fn get_available_slot_details(
&self,
request: Request<hook::v0::GetAvailableSlotDetailsRequest>,
) -> Result<Response<hook::v0::GetAvailableSlotDetailsResponse>, Status> {
let res = self.request("getAvailableSlotDetails", request).await?;
Ok(Response::new(res))
}
}