18 #ifndef LOCATION_SERVICE_COM_LOMIRI_LOCATION_CODEC_H_
19 #define LOCATION_SERVICE_COM_LOMIRI_LOCATION_CODEC_H_
34 #include <core/dbus/codec.h>
49 return ArgumentType::string;
63 static const std::string s = TypeMapper<std::string>::signature();
74 std::stringstream ss; ss << in;
auto s = ss.str();
75 writer.push_stringn(s.c_str(), s.size());
80 auto s = reader.pop_string();
81 std::stringstream ss{s}; ss >> in;
91 return ArgumentType::floating_point;
105 static const std::string s = TypeMapper<double>::signature();
117 Codec<bool>::encode_argument(writer, has_value);
119 Codec<typename com::lomiri::location::Optional<T>::value_type>::encode_argument(writer, *in);
124 bool has_value{
false};
125 Codec<bool>::decode_argument(reader, has_value);
129 Codec<typename com::lomiri::location::Optional<T>::value_type>::decode_argument(reader, value);
143 Codec<typename com::lomiri::location::units::Quantity<T>::value_type>::encode_argument(writer, in.value());
149 Codec<typename com::lomiri::location::units::Quantity<T>::value_type>::decode_argument(reader, value);
154 template<
typename T,
typename U>
155 struct Codec<
com::lomiri::location::wgs84::Coordinate<T,U>>
159 Codec<com::lomiri::location::units::Quantity<U>>::encode_argument(writer, in.
value);
164 Codec<com::lomiri::location::units::Quantity<U>>::decode_argument(reader, in.
value);
169 struct Codec<
com::lomiri::location::Position>
176 Codec<com::lomiri::location::wgs84::Latitude>::encode_argument(writer, in.
latitude);
177 Codec<com::lomiri::location::wgs84::Longitude>::encode_argument(writer, in.
longitude);
178 Codec<com::lomiri::location::Optional<com::lomiri::location::wgs84::Altitude>>::encode_argument(writer, in.
altitude);
180 Codec<com::lomiri::location::Optional<HorizontalAccuracy>>::encode_argument(writer, in.
accuracy.
horizontal);
181 Codec<com::lomiri::location::Optional<VerticalAccuracy>>::encode_argument(writer, in.
accuracy.
vertical);
186 Codec<com::lomiri::location::wgs84::Latitude>::decode_argument(reader, in.
latitude);
187 Codec<com::lomiri::location::wgs84::Longitude>::decode_argument(reader, in.
longitude);
188 Codec<com::lomiri::location::Optional<com::lomiri::location::wgs84::Altitude>>::decode_argument(reader, in.
altitude);
190 Codec<com::lomiri::location::Optional<HorizontalAccuracy>>::decode_argument(reader, in.
accuracy.
horizontal);
191 Codec<com::lomiri::location::Optional<VerticalAccuracy>>::decode_argument(reader, in.
accuracy.
vertical);
199 struct TypeMapper<
com::lomiri::location::SpaceVehicle::Key>
203 return ArgumentType::structure;
216 static const std::string s =
217 helper::TypeMapper<std::uint32_t>::signature() +
218 helper::TypeMapper<std::uint32_t>::signature();
223 struct TypeMapper<
com::lomiri::location::SpaceVehicle>
227 return ArgumentType::structure;
241 DBUS_STRUCT_BEGIN_CHAR_AS_STRING +
243 helper::TypeMapper<float>::signature() +
244 helper::TypeMapper<bool>::signature() +
245 helper::TypeMapper<bool>::signature() +
246 helper::TypeMapper<bool>::signature() +
247 helper::TypeMapper<com::lomiri::location::units::Quantity<com::lomiri::location::units::PlaneAngle>>::signature() +
248 helper::TypeMapper<com::lomiri::location::units::Quantity<com::lomiri::location::units::PlaneAngle>>::signature() +
249 DBUS_STRUCT_END_CHAR_AS_STRING;
256 struct Codec<
com::lomiri::location::SpaceVehicle::Key>
260 writer.push_uint32(
static_cast<std::uint32_t
>(in.
type));
261 writer.push_uint32(in.
id);
267 in.
id = reader.pop_uint32();
272 struct Codec<
com::lomiri::location::SpaceVehicle>
276 auto sub = writer.open_structure();
279 sub.push_floating_point(in.
snr);
283 Codec<com::lomiri::location::units::Quantity<com::lomiri::location::units::PlaneAngle>>::encode_argument(sub, in.
azimuth);
284 Codec<com::lomiri::location::units::Quantity<com::lomiri::location::units::PlaneAngle>>::encode_argument(sub, in.
elevation);
286 writer.close_structure(std::move(sub));
291 auto sub = reader.pop_structure();
294 in.
snr = sub.pop_floating_point();
298 Codec<com::lomiri::location::units::Quantity<com::lomiri::location::units::PlaneAngle>>::decode_argument(sub, in.
azimuth);
299 Codec<com::lomiri::location::units::Quantity<com::lomiri::location::units::PlaneAngle>>::decode_argument(sub, in.
elevation);
306 struct TypeMapper<std::map<com::lomiri::location::SpaceVehicle::Key, com::lomiri::location::SpaceVehicle>>
310 return ArgumentType::array;
329 struct Codec<std::map<com::lomiri::location::SpaceVehicle::Key, com::lomiri::location::SpaceVehicle>>
331 inline static void encode_argument(Message::Writer& writer,
const std::map<com::lomiri::location::SpaceVehicle::Key, com::lomiri::location::SpaceVehicle>& arg)
334 auto sub = writer.open_array(signature);
336 for(
const auto& element : arg)
341 writer.close_array(std::move(sub));
344 inline static void decode_argument(Message::Reader& reader, std::map<com::lomiri::location::SpaceVehicle::Key, com::lomiri::location::SpaceVehicle>& out)
346 auto sub = reader.pop_array();
347 while (sub.type() != ArgumentType::invalid)
351 out.insert(std::make_pair(sv.
key, sv));
357 struct Codec<
com::lomiri::location::Criteria>
372 Codec<com::lomiri::location::Optional<VerticalAccuracy>>::encode_argument(writer, in.
accuracy.
vertical);
373 Codec<com::lomiri::location::Optional<VelocityAccuracy>>::encode_argument(writer, in.
accuracy.
velocity);
374 Codec<com::lomiri::location::Optional<HeadingAccuracy>>::encode_argument(writer, in.
accuracy.
heading);
385 Codec<com::lomiri::location::Optional<VerticalAccuracy>>::decode_argument(reader, in.
accuracy.
vertical);
386 Codec<com::lomiri::location::Optional<VelocityAccuracy>>::decode_argument(reader, in.
accuracy.
velocity);
387 Codec<com::lomiri::location::Optional<HeadingAccuracy>>::decode_argument(reader, in.
accuracy.
heading);
392 struct Codec<
com::lomiri::location::Provider::Features>
396 writer.push_int32(
static_cast<std::int32_t
>(in));
406 struct Codec<
com::lomiri::location::Provider::Requirements>
410 writer.push_int32(
static_cast<std::int32_t
>(in));
424 writer.push_int32(
static_cast<std::int32_t
>(in));
436 struct TypeMapper<
com::lomiri::location::Update<T>>
440 return ArgumentType::structure;
453 static const std::string s =
454 helper::TypeMapper<T>::signature() +
455 helper::TypeMapper<uint64_t>::signature();
462 struct Codec<
com::lomiri::location::Update<T>>
466 Codec<T>::encode_argument(writer, in.
value);
467 Codec<int64_t>::encode_argument(writer, in.
when.time_since_epoch().count());
472 Codec<T>::decode_argument(reader, in.
value);
479 #endif // LOCATION_SERVICE_COM_LOMIRI_LOCATION_CODEC_H_