24 #include <boost/date_time.hpp>
26 #include "ccl_compatibility.h"
28 #include "dccl/codec.h"
37 FieldCodecManager::add<dccl::legacyccl::IdentifierCodec>(
"dccl.ccl.id");
39 if(
dccl->get_id_codec() !=
"dccl.ccl.id")
40 dccl->set_id_codec(
"dccl.ccl.id");
42 FieldCodecManager::add<LatLonCompressedCodec>(
"_ccl_latloncompressed");
43 FieldCodecManager::add<FixAgeCodec>(
"_ccl_fix_age");
44 FieldCodecManager::add<TimeDateCodec>(
"_ccl_time_date");
45 FieldCodecManager::add<HeadingCodec>(
"_ccl_heading");
46 FieldCodecManager::add<DepthCodec>(
"_ccl_depth");
47 FieldCodecManager::add<VelocityCodec>(
"_ccl_velocity");
48 FieldCodecManager::add<WattsCodec>(
"_ccl_watts");
49 FieldCodecManager::add<GFIPitchOilCodec>(
"_ccl_gfi_pitch_oil");
50 FieldCodecManager::add<SpeedCodec>(
"_ccl_speed");
51 FieldCodecManager::add<HiResAltitudeCodec>(
"_ccl_hires_altitude");
52 FieldCodecManager::add<TemperatureCodec>(
"_ccl_temperature");
53 FieldCodecManager::add<SalinityCodec>(
"_ccl_salinity");
54 FieldCodecManager::add<SoundSpeedCodec>(
"_ccl_sound_speed");
78 FieldCodecManager::remove<dccl::legacyccl::IdentifierCodec>(
"dccl.ccl.id");
79 FieldCodecManager::remove<LatLonCompressedCodec>(
"_ccl_latloncompressed");
80 FieldCodecManager::remove<FixAgeCodec>(
"_ccl_fix_age");
81 FieldCodecManager::remove<TimeDateCodec>(
"_ccl_time_date");
82 FieldCodecManager::remove<HeadingCodec>(
"_ccl_heading");
83 FieldCodecManager::remove<DepthCodec>(
"_ccl_depth");
84 FieldCodecManager::remove<VelocityCodec>(
"_ccl_velocity");
85 FieldCodecManager::remove<WattsCodec>(
"_ccl_watts");
86 FieldCodecManager::remove<GFIPitchOilCodec>(
"_ccl_gfi_pitch_oil");
87 FieldCodecManager::remove<SpeedCodec>(
"_ccl_speed");
88 FieldCodecManager::remove<HiResAltitudeCodec>(
"_ccl_hires_altitude");
89 FieldCodecManager::remove<TemperatureCodec>(
"_ccl_temperature");
90 FieldCodecManager::remove<SalinityCodec>(
"_ccl_salinity");
91 FieldCodecManager::remove<SoundSpeedCodec>(
"_ccl_sound_speed");
101 dccl::Bitset dccl::legacyccl::LatLonCompressedCodec::encode()
106 dccl::Bitset dccl::legacyccl::LatLonCompressedCodec::encode(
const double& wire_value)
110 encoded.as_compressed = Encode_latlon(wire_value);
111 return dccl::Bitset(size(),
static_cast<unsigned long>(encoded.as_long));
114 double dccl::legacyccl::LatLonCompressedCodec::decode(
Bitset* bits)
117 decoded.as_long =
static_cast<long>(bits->
to_ulong());
118 return Decode_latlon(decoded.as_compressed);
121 unsigned dccl::legacyccl::LatLonCompressedCodec::size()
123 return LATLON_COMPRESSED_BYTE_SIZE * BITS_IN_BYTE;
139 encoded.as_time_date = Encode_time_date(wire_value / MICROSECONDS_IN_SECOND);
140 return dccl::Bitset(size(),
static_cast<unsigned long>(encoded.as_long));
147 short mon, day, hour, min, sec;
148 Decode_time_date(decoded.as_time_date,
149 &mon, &day, &hour, &min, &sec);
153 int year = boost::gregorian::day_clock::universal_day().year();
155 boost::posix_time::ptime time_date(
156 boost::gregorian::date(year, mon, day),
157 boost::posix_time::time_duration(hour,min,sec));
159 return to_uint64_time(time_date);
162 dccl::uint64 dccl::legacyccl::TimeDateCodec::to_uint64_time(
const boost::posix_time::ptime& time_date)
165 using namespace boost::posix_time;
166 using namespace boost::gregorian;
168 if (time_date == not_a_date_time)
169 return std::numeric_limits<uint64>::max();
172 const int MICROSEC_IN_SEC = 1000000;
174 date_duration date_diff = time_date.date() - date(1970,1,1);
175 time_duration time_diff = time_date.time_of_day();
178 static_cast<uint64>(date_diff.days())*24*3600*MICROSEC_IN_SEC +
179 static_cast<uint64>(time_diff.total_seconds())*MICROSEC_IN_SEC +
180 static_cast<uint64>(time_diff.fractional_seconds()) /
181 (time_duration::ticks_per_second() / MICROSEC_IN_SEC);
186 unsigned dccl::legacyccl::TimeDateCodec::size()
188 return TIME_DATE_COMPRESSED_BYTE_SIZE * BITS_IN_BYTE;
195 dccl::Bitset dccl::legacyccl::HeadingCodec::encode(
const float& wire_value)
196 {
return dccl::Bitset(size(), Encode_heading(wire_value)); }
198 float dccl::legacyccl::HeadingCodec::decode(
Bitset* bits)
199 {
return Decode_heading(bits->
to_ulong()); }
205 dccl::Bitset dccl::legacyccl::DepthCodec::encode(
const float& wire_value)
206 {
return dccl::Bitset(size(), Encode_depth(wire_value)); }
208 float dccl::legacyccl::DepthCodec::decode(
Bitset* bits)
209 {
return Decode_depth(bits->
to_ulong()); }
214 dccl::Bitset dccl::legacyccl::VelocityCodec::encode(
const float& wire_value)
216 return dccl::Bitset(size(), Encode_est_velocity(wire_value));
219 float dccl::legacyccl::VelocityCodec::decode(
Bitset* bits)
220 {
return Decode_est_velocity(bits->
to_ulong()); }
226 dccl::Bitset dccl::legacyccl::SpeedCodec::encode(
const float& wire_value)
229 const google::protobuf::FieldDescriptor* thrust_mode_field_desc =
230 root->GetDescriptor()->FindFieldByNumber(
233 switch(root->GetReflection()->GetEnum(*root, thrust_mode_field_desc)->number())
236 case protobuf::CCLMDATRedirect::RPM:
237 return dccl::Bitset(size(), Encode_speed(SPEED_MODE_RPM, wire_value));
239 case protobuf::CCLMDATRedirect::METERS_PER_SECOND:
240 return dccl::Bitset(size(), Encode_speed(SPEED_MODE_MSEC, wire_value));
244 float dccl::legacyccl::SpeedCodec::decode(
Bitset* bits)
247 const google::protobuf::FieldDescriptor* thrust_mode_field_desc =
248 root->GetDescriptor()->FindFieldByNumber(
251 switch(root->GetReflection()->GetEnum(*root, thrust_mode_field_desc)->number())
254 case protobuf::CCLMDATRedirect::RPM:
255 return Decode_speed(SPEED_MODE_RPM, bits->
to_ulong());
257 case protobuf::CCLMDATRedirect::METERS_PER_SECOND:
258 return Decode_speed(SPEED_MODE_MSEC, bits->
to_ulong());
267 dccl::Bitset dccl::legacyccl::WattsCodec::encode(
const float& wire_value)
268 {
return dccl::Bitset(size(), Encode_watts(wire_value, 1)); }
270 float dccl::legacyccl::WattsCodec::decode(
Bitset* bits)
271 {
return Decode_watts(bits->
to_ulong()); }
278 return dccl::Bitset(size(), Encode_gfi_pitch_oil(wire_value.gfi(), wire_value.pitch(), wire_value.oil()));
283 float gfi, pitch, oil;
284 Decode_gfi_pitch_oil(bits->
to_ulong(), &gfi, &pitch, &oil);
286 decoded.set_gfi(gfi);
287 decoded.set_pitch(pitch);
288 decoded.set_oil(oil);
295 dccl::Bitset dccl::legacyccl::HiResAltitudeCodec::encode(
const float& wire_value)
296 {
return dccl::Bitset(size(), Encode_hires_altitude(wire_value)); }
298 float dccl::legacyccl::HiResAltitudeCodec::decode(
Bitset* bits)
299 {
return Decode_hires_altitude(bits->
to_ulong()); }
304 dccl::Bitset dccl::legacyccl::SalinityCodec::encode(
const float& wire_value)
305 {
return dccl::Bitset(size(), Encode_salinity(wire_value)); }
307 float dccl::legacyccl::SalinityCodec::decode(
Bitset* bits)
308 {
return Decode_salinity(bits->
to_ulong()); }
313 dccl::Bitset dccl::legacyccl::TemperatureCodec::encode(
const float& wire_value)
314 {
return dccl::Bitset(size(), Encode_temperature(wire_value)); }
316 float dccl::legacyccl::TemperatureCodec::decode(
Bitset* bits)
317 {
return Decode_temperature(bits->
to_ulong()); }
322 dccl::Bitset dccl::legacyccl::SoundSpeedCodec::encode(
const float& wire_value)
323 {
return dccl::Bitset(size(), Encode_sound_speed(wire_value)); }
325 float dccl::legacyccl::SoundSpeedCodec::decode(
Bitset* bits)
326 {
return Decode_sound_speed(bits->
to_ulong()); }