activity_sdk_lifetime_runtime.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. #include "activity_sdk_lifetime_runtime.h"
  2. #include "../../middleware/bap/activity_message/sensor_auth_update.h"
  3. #include "../bap/runtime.h"
  4. #include "host_runtime.h"
  5. namespace sunrise::server::activity::activity_sdk_lifetime {
  6. namespace {
  7. namespace sdk = state::activity_sdk;
  8. /** Preflights one lifetime change and keeps the link fields the queue call needs. */
  9. [[nodiscard]] Status prepare(const sdk::BoundView& view,
  10. std::uint8_t lifetimeState,
  11. server::bap::ActivityLinkView& link) noexcept {
  12. link = {};
  13. // Above the highest jump-table entry the client's spawn gate jumps out of its image.
  14. if (lifetimeState
  15. > middleware::bap::activity_message::sensor_auth_update::kMaximumLifetimeState) {
  16. return Status::invalidValue;
  17. }
  18. const Status live = activity_sdk_devices::live_binding_status(view, link);
  19. if (live != Status::ready) {
  20. return live;
  21. }
  22. return Status::ready;
  23. }
  24. } // namespace
  25. Status availability(const sdk::BoundView& view, std::uint8_t lifetimeState) noexcept {
  26. server::bap::ActivityLinkView link{};
  27. return prepare(view, lifetimeState, link);
  28. }
  29. /** Sets the lifetime state for an operator action, which owns no Mission revision. */
  30. Status set(const sdk::BoundView& view, std::uint8_t lifetimeState) noexcept {
  31. server::bap::ActivityLinkView link{};
  32. const Status status = prepare(view, lifetimeState, link);
  33. if (status != Status::ready) {
  34. return status;
  35. }
  36. if (server::bap::request_activity_lifetime_override(
  37. view.binding, lifetimeState, link.effectiveRegion, link.activityClientGeneration)) {
  38. return Status::queued;
  39. }
  40. host::InstanceSnapshot instance{};
  41. const bool busy = host::instance_snapshot(view.binding, instance) && instance.outputPending;
  42. return busy ? Status::outputBusy : Status::refused;
  43. }
  44. /**
  45. * Queues one lifetime change through an already owned Host revision.
  46. * @param view Pinned SDK view naming the exact activity generation.
  47. * @param lifetimeState Activity lifetime state to report.
  48. * @param reservation Unarmed Host revision the durable Mission head already owns.
  49. * @return queued on success, or the refusal that stopped it.
  50. */
  51. Status set_reserved(const sdk::BoundView& view,
  52. std::uint8_t lifetimeState,
  53. const host::ScriptableOutputReservation& reservation) noexcept {
  54. server::bap::ActivityLinkView link{};
  55. const Status status = prepare(view, lifetimeState, link);
  56. if (status != Status::ready) {
  57. return status;
  58. }
  59. const bool queued =
  60. server::bap::request_activity_lifetime_override(view.binding,
  61. lifetimeState,
  62. link.effectiveRegion,
  63. link.activityClientGeneration,
  64. &reservation);
  65. if (queued) {
  66. return Status::queued;
  67. }
  68. host::InstanceSnapshot instance{};
  69. const bool busy = host::instance_snapshot(view.binding, instance) && instance.outputPending;
  70. return busy ? Status::outputBusy : Status::refused;
  71. }
  72. } // namespace sunrise::server::activity::activity_sdk_lifetime