Skip to content

Commit

Permalink
Merge pull request #416 from dronecore/implement-mission-backend
Browse files Browse the repository at this point in the history
Implement mission backend
  • Loading branch information
julianoes authored Jun 1, 2018
2 parents ecc20cf + 80dda0d commit cac9515
Show file tree
Hide file tree
Showing 3 changed files with 495 additions and 141 deletions.
158 changes: 145 additions & 13 deletions backend/src/plugins/mission/mission_service_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,31 @@ class MissionServiceImpl final : public dronecore::rpc::mission::MissionService:
return grpc::Status::OK;
}

grpc::Status DownloadMission(grpc::ServerContext * /* context */,
const rpc::mission::DownloadMissionRequest * /* request */,
rpc::mission::DownloadMissionResponse *response) override
{
_mission.download_mission_async(
[this, response](const dronecore::Mission::Result result,
const std::vector<std::shared_ptr<MissionItem>> mission_items) {
if (response != nullptr) {
auto rpc_mission_result = generateRPCMissionResult(result);
response->set_allocated_mission_result(rpc_mission_result);

auto rpc_mission = new rpc::mission::Mission();

for (const auto mission_item : mission_items) {
auto rpc_mission_item = rpc_mission->add_mission_item();
translateMissionItem(mission_item, rpc_mission_item);
}

response->set_allocated_mission(rpc_mission);
}
});

return grpc::Status::OK;
}

grpc::Status StartMission(grpc::ServerContext * /* context */,
const rpc::mission::StartMissionRequest * /* request */,
rpc::mission::StartMissionResponse *response) override
Expand Down Expand Up @@ -83,23 +108,92 @@ class MissionServiceImpl final : public dronecore::rpc::mission::MissionService:
return grpc::Status::OK;
}

private:
std::vector<std::shared_ptr<MissionItem>>
extractMissionItems(const rpc::mission::UploadMissionRequest *request) const
grpc::Status
SetCurrentMissionItemIndex(grpc::ServerContext * /* context */,
const rpc::mission::SetCurrentMissionItemIndexRequest *request,
rpc::mission::SetCurrentMissionItemIndexResponse *response) override
{
std::vector<std::shared_ptr<MissionItem>> mission_items;
if (request == nullptr) {
return grpc::Status::OK;
}

if (request != nullptr) {
for (auto rpc_mission_item : request->mission().mission_item()) {
mission_items.push_back(translateRPCMissionItem(rpc_mission_item));
}
std::promise<void> result_promise;
const auto result_future = result_promise.get_future();

_mission.set_current_mission_item_async(
request->index(),
[this, response, &result_promise](const dronecore::Mission::Result result) {
if (response != nullptr) {
auto rpc_mission_result = generateRPCMissionResult(result);
response->set_allocated_mission_result(rpc_mission_result);
}

result_promise.set_value();
});

result_future.wait();
return grpc::Status::OK;
}

grpc::Status GetCurrentMissionItemIndex(
grpc::ServerContext * /* context */,
const rpc::mission::GetCurrentMissionItemIndexRequest * /* request */,
rpc::mission::GetCurrentMissionItemIndexResponse *response) override
{
if (response != nullptr) {
response->set_index(_mission.current_mission_item());
}

return mission_items;
return grpc::Status::OK;
}

grpc::Status GetMissionCount(grpc::ServerContext * /* context */,
const rpc::mission::GetMissionCountRequest * /* request */,
rpc::mission::GetMissionCountResponse *response) override
{
if (response != nullptr) {
response->set_count(_mission.total_mission_items());
}

return grpc::Status::OK;
}

static void translateMissionItem(const std::shared_ptr<MissionItem> mission_item,
rpc::mission::MissionItem *rpc_mission_item)
{
rpc_mission_item->set_latitude_deg(mission_item->get_latitude_deg());
rpc_mission_item->set_longitude_deg(mission_item->get_longitude_deg());
rpc_mission_item->set_relative_altitude_m(mission_item->get_relative_altitude_m());
rpc_mission_item->set_speed_m_s(mission_item->get_speed_m_s());
rpc_mission_item->set_is_fly_through(mission_item->get_fly_through());
rpc_mission_item->set_gimbal_pitch_deg(mission_item->get_gimbal_pitch_deg());
rpc_mission_item->set_gimbal_yaw_deg(mission_item->get_gimbal_yaw_deg());
rpc_mission_item->set_camera_action(
translateCameraAction(mission_item->get_camera_action()));
}

static rpc::mission::MissionItem::CameraAction
translateCameraAction(const MissionItem::CameraAction camera_action)
{
switch (camera_action) {
case MissionItem::CameraAction::TAKE_PHOTO:
return rpc::mission::MissionItem_CameraAction_TAKE_PHOTO;
case MissionItem::CameraAction::START_PHOTO_INTERVAL:
return rpc::mission::MissionItem_CameraAction_START_PHOTO_INTERVAL;
case MissionItem::CameraAction::STOP_PHOTO_INTERVAL:
return rpc::mission::MissionItem_CameraAction_STOP_PHOTO_INTERVAL;
case MissionItem::CameraAction::START_VIDEO:
return rpc::mission::MissionItem_CameraAction_START_VIDEO;
case MissionItem::CameraAction::STOP_VIDEO:
return rpc::mission::MissionItem_CameraAction_STOP_VIDEO;
case MissionItem::CameraAction::NONE:
default:
return rpc::mission::MissionItem_CameraAction_NONE;
}
}

std::shared_ptr<MissionItem>
translateRPCMissionItem(const rpc::mission::MissionItem &rpc_mission_item) const
static std::shared_ptr<MissionItem>
translateRPCMissionItem(const rpc::mission::MissionItem &rpc_mission_item)
{
auto mission_item = std::make_shared<MissionItem>();
mission_item->set_position(rpc_mission_item.latitude_deg(),
Expand All @@ -114,8 +208,8 @@ class MissionServiceImpl final : public dronecore::rpc::mission::MissionService:
return mission_item;
}

MissionItem::CameraAction
translateRPCCameraAction(const rpc::mission::MissionItem::CameraAction rpc_camera_action) const
static MissionItem::CameraAction
translateRPCCameraAction(const rpc::mission::MissionItem::CameraAction rpc_camera_action)
{
switch (rpc_camera_action) {
case rpc::mission::MissionItem::CameraAction::MissionItem_CameraAction_TAKE_PHOTO:
Expand All @@ -136,6 +230,21 @@ class MissionServiceImpl final : public dronecore::rpc::mission::MissionService:
}
}

private:
std::vector<std::shared_ptr<MissionItem>>
extractMissionItems(const rpc::mission::UploadMissionRequest *request) const
{
std::vector<std::shared_ptr<MissionItem>> mission_items;

if (request != nullptr) {
for (auto rpc_mission_item : request->mission().mission_item()) {
mission_items.push_back(translateRPCMissionItem(rpc_mission_item));
}
}

return mission_items;
}

void uploadMissionItems(const std::vector<std::shared_ptr<MissionItem>> &mission_items,
rpc::mission::UploadMissionResponse *response,
std::promise<void> &result_promise) const
Expand Down Expand Up @@ -164,6 +273,29 @@ class MissionServiceImpl final : public dronecore::rpc::mission::MissionService:
return rpc_mission_result;
}

grpc::Status SubscribeMissionProgress(
grpc::ServerContext * /* context */,
const dronecore::rpc::mission::SubscribeMissionProgressRequest * /* request */,
grpc::ServerWriter<rpc::mission::MissionProgressResponse> *writer) override
{
std::promise<void> mission_finished_promise;
auto mission_finished_future = mission_finished_promise.get_future();

_mission.subscribe_progress([&writer, &mission_finished_promise](int current, int total) {
dronecore::rpc::mission::MissionProgressResponse rpc_mission_progress_response;
rpc_mission_progress_response.set_current_item_index(current);
rpc_mission_progress_response.set_mission_count(total);
writer->Write(rpc_mission_progress_response);

if (current == total - 1) {
mission_finished_promise.set_value();
}
});

mission_finished_future.wait();
return grpc::Status::OK;
}

Mission &_mission;
};

Expand Down
Loading

0 comments on commit cac9515

Please sign in to comment.