VSM C++ SDK
Vehicle Specific Modules SDK
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
vehicle_request.h
Go to the documentation of this file.
1 // Copyright (c) 2018, Smart Projects Holdings Ltd
2 // All rights reserved.
3 // See LICENSE file for license details.
4 
9 #ifndef _UGCS_VSM_VEHICLE_REQUEST_H_
10 #define _UGCS_VSM_VEHICLE_REQUEST_H_
11 
14 #include <ugcs/vsm/debug.h>
15 
16 namespace ugcs {
17 namespace vsm {
18 
21 class Vehicle_request: public std::enable_shared_from_this<Vehicle_request> {
23 
24 public:
26  enum class Result {
28  OK,
30  NOK
31  };
32 
38  class Handle {
39  public:
41  Handle();
42 
46 
52  explicit operator bool() const;
53 
54  void
55  Fail(const char *format = nullptr, ...) __FORMAT(printf, 2, 3);
56 
57  void
58  Fail_v(const char *format, va_list fmt_args) __FORMAT(printf, 2, 0);
59 
60  void
61  Fail(const std::string& reason);
62 
63  void
64  Succeed();
65 
66  protected:
68  void
69  Assign_result(Result result, const std::string& status_text = std::string());
70 
73  };
74 
77 
79  Vehicle_request(Completion_handler completion_handler,
80  Request_completion_context::Ptr completion_ctx);
81 
83  virtual
85 
90  void
91  Set_completion_result(Result result, const std::string&);
92 
95  void
96  Complete();
97 
101  void
102  Abort();
103 
105  Result
107 
109  bool
110  Is_completed() const;
111 
113  void
114  Add_ref();
115 
119  void
120  Release_ref();
121 
122 private:
124  Request::Ptr request;
125 
127  Completion_handler completion_handler;
128 
130  std::atomic_int ref_count = { 0 };
131 
132  friend class Vehicle;
133 };
134 
136 template <class Payload>
139 
140 public:
145  template<typename... Args>
147  Request_completion_context::Ptr completion_ctx,
148  Args &&... args):
149  Vehicle_request(completion_handler, completion_ctx),
150  payload(std::forward<Args>(args)...)
151  {}
152 
157  public:
159 
161  Payload*
163  {
164  return &static_cast<Vehicle_request_spec&>(*vehicle_request).payload;
165  }
166 
168  const Payload*
169  operator ->() const
170  {
171  return &static_cast<Vehicle_request_spec&>(*vehicle_request).payload;
172  }
173 
175  Payload&
177  {
178  return static_cast<Vehicle_request_spec&>(*vehicle_request).payload;
179  }
180 
181  const Payload&
182  operator *() const
183  {
184  return static_cast<Vehicle_request_spec&>(*vehicle_request).payload;
185  }
186  };
187 
189  Payload payload;
190 };
191 
193 template<>
196 public:
198  template<typename... Args>
199  Vehicle_request_spec(Args &&... args):
200  Vehicle_request(std::forward<Args>(args)...)
201  {}
202 };
203 
204 } /* namespace vsm */
205 } /* namespace ugcs */
206 
207 #endif /* _UGCS_VSM_VEHICLE_REQUEST_H_ */
Payload payload
Specific payload of the request.
Definition: vehicle_request.h:189
void Assign_result(Result result, const std::string &status_text=std::string())
Assignment operator implementation.
Result Get_completion_result()
Get current completion result.
Debugging and troubleshooting helpers.
void Add_ref()
Add reference from user handle.
Vehicle_request(Completion_handler completion_handler, Request_completion_context::Ptr completion_ctx)
Construct base request instance.
Reference_guard< Vehicle_request::Ptr > vehicle_request
Managed vehicle request.
Definition: vehicle_request.h:72
Reference guard class definition.
std::shared_ptr< Vehicle_request > Ptr
Pointer type.
Definition: vehicle_request.h:22
std::shared_ptr< Request > Ptr
Pointer type.
Definition: request_container.h:38
Operation completed successfully.
Request execution context.
Request execution context.
Definition: request_context.h:24
#define __FORMAT(type, fmt_idx, arg_idx)
Specify that a function has format arguments (like printf or scanf).
Definition: defs.h:24
Result
Request completion result.
Definition: vehicle_request.h:26
virtual ~Vehicle_request()
Make sure class is polymorphic.
Payload & operator*()
Access payload using dereference semantics.
Definition: vehicle_request.h:176
Handle of a specific vehicle request.
Definition: vehicle_request.h:156
void Complete()
Should be called when vehicle request is completed by the user.
bool Is_completed() const
Check if the request was completed.
void Set_completion_result(Result result, const std::string &)
Set completion result to be used when Complete method is called.
Base class of a generic request for a vehicle.
Definition: vehicle_request.h:21
void Abort()
Abort the request.
std::shared_ptr< Request_context > Ptr
Pointer type.
Definition: request_context.h:25
Callback_proxy< void, Result, std::string > Completion_handler
Completion handler type of the request.
Definition: vehicle_request.h:76
#define DEFINE_COMMON_CLASS(__class_name,...)
Use this macro to define some common attributes for a class.
Definition: utils.h:25
Vehicle request with specific payload.
Definition: vehicle_request.h:137
Handle()
Construct initially invalid handle.
Reference guard objects keep references for managed objects.
Definition: reference_guard.h:31
Payload * operator->()
Access payload using pointer semantics.
Definition: vehicle_request.h:162
Handle of the request passed to the SDK user.
Definition: vehicle_request.h:38
void Release_ref()
Release reference from user handle.
Base class for user-defined vehicles.
Definition: vehicle.h:39