oem7_ros_messages.cpp
Go to the documentation of this file.
1 //
3 // Copyright (c) 2020 NovAtel Inc.
4 //
5 // Permission is hereby granted, free of charge, to any person obtaining a copy
6 // of this software and associated documentation files (the "Software"), to deal
7 // in the Software without restriction, including without limitation the rights
8 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 // copies of the Software, and to permit persons to whom the Software is
10 // furnished to do so, subject to the following conditions:
11 //
12 // The above copyright notice and this permission notice shall be included in all
13 // copies or substantial portions of the Software.
14 //
15 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 // SOFTWARE.
22 //
24 //
25 // The names of messages are ROS messages, not Oem7 messages. These may be identical, but not necessarily.
26 // More than one Oem7 message may be used to generate the same ROS message
27 //
28 
30 
34 
35 
36 #include "novatel_oem7_msgs/HEADING2.h"
37 #include "novatel_oem7_msgs/BESTGNSSPOS.h"
38 #include "novatel_oem7_msgs/BESTPOS.h"
39 #include "novatel_oem7_msgs/BESTVEL.h"
40 #include "novatel_oem7_msgs/BESTUTM.h"
41 #include "novatel_oem7_msgs/PPPPOS.h"
42 #include "novatel_oem7_msgs/TERRASTARINFO.h"
43 #include "novatel_oem7_msgs/TERRASTARSTATUS.h"
44 #include "novatel_oem7_msgs/INSPVA.h"
45 #include "novatel_oem7_msgs/INSPVAX.h"
46 #include "novatel_oem7_msgs/INSCONFIG.h"
47 #include "novatel_oem7_msgs/INSSTDEV.h"
48 #include "novatel_oem7_msgs/CORRIMU.h"
49 #include "novatel_oem7_msgs/RXSTATUS.h"
50 #include "novatel_oem7_msgs/TIME.h"
51 
52 
53 
54 #define arr_size(_arr_) (sizeof(_arr_) / sizeof(_arr_[0]))
55 
56 namespace novatel_oem7_driver
57 {
58 
64 {
65  static uint32_t sequence_number = 0;
66 
67  return ++sequence_number;
68 }
69 
70 /*
71  * Populates Oem7header from raw message
72  */
73 void
75  const Oem7RawMessageIf::ConstPtr& msg,
76  const std::string& name,
77  novatel_oem7_msgs::Oem7Header::Type& oem7_hdr
78  )
79 {
80  getOem7Header(msg, oem7_hdr);
81  oem7_hdr.message_name = name;
82 }
83 
84 /*
85  * Populates Oem7header from a 'short' raw message
86  */
87 void
89  const Oem7RawMessageIf::ConstPtr& msg,
90  const std::string& name,
91  novatel_oem7_msgs::Oem7Header::Type& oem7_hdr
92  )
93 {
94  getOem7ShortHeader(msg, oem7_hdr);
95  oem7_hdr.message_name = name;
96 }
97 
98 // Template specializations from specific messages
99 
100 template<>
101 void
102 MakeROSMessage<novatel_oem7_msgs::HEADING2>(
103  const Oem7RawMessageIf::ConstPtr& msg,
105 {
106  assert(msg->getMessageId() == HEADING2_OEM7_MSGID);
107 
108  const HEADING2Mem* mem = reinterpret_cast<const HEADING2Mem*>(msg->getMessageData(OEM7_BINARY_MSG_HDR_LEN));
109  heading2.reset(new novatel_oem7_msgs::HEADING2);
110 
111  heading2->sol_status.status = mem->sol_status;
112  heading2->pos_type.type = mem->pos_type;
113  heading2->length = mem->length;
114  heading2->heading = mem->heading;
115  heading2->pitch = mem->pitch;
116  heading2->reserved = mem->reserved;
117  heading2->heading_stdev = mem->heading_stdev;
118  heading2->pitch_stdev = mem->pitch_stdev;
119  heading2->rover_stn_id.assign( mem->rover_stn_id, arr_size(mem->rover_stn_id));
120  heading2->master_stn_id.assign(mem->master_stn_id, arr_size(mem->rover_stn_id));
121  heading2->num_sv_tracked = mem->num_sv_tracked;
122  heading2->num_sv_in_sol = mem->num_sv_in_sol;
123  heading2->num_sv_obs = mem->num_sv_obs;
124  heading2->num_sv_multi = mem->num_sv_multi;
125  heading2->sol_source.source = mem->sol_source;
126  heading2->ext_sol_status.status = mem->ext_sol_status;
127  heading2->galileo_beidou_sig_mask = mem->galileo_beidou_sig_mask;
128  heading2->gps_glonass_sig_mask = mem->gps_glonass_sig_mask;
129 
130  static const std::string name = "HEADING2";
131  SetOem7Header(msg, name, heading2->nov_header);
132 }
133 
134 template<>
135 void
136 MakeROSMessage<novatel_oem7_msgs::BESTGNSSPOS>(
137  const Oem7RawMessageIf::ConstPtr& msg,
139 {
140  assert(msg->getMessageId() == BESTGNSSPOS_OEM7_MSGID);
141 
142  const BESTGNSSPOSMem* bgp = reinterpret_cast<const BESTGNSSPOSMem*>(msg->getMessageData(OEM7_BINARY_MSG_HDR_LEN));
143  bestgnsspos.reset(new novatel_oem7_msgs::BESTGNSSPOS);
144 
145  bestgnsspos->sol_status.status = bgp->sol_stat;
146  bestgnsspos->pos_type.type = bgp->pos_type;
147  bestgnsspos->lat = bgp->lat;
148  bestgnsspos->lon = bgp->lon;
149  bestgnsspos->hgt = bgp->hgt;
150  bestgnsspos->undulation = bgp->undulation;
151  bestgnsspos->datum_id = bgp->datum_id;
152  bestgnsspos->lat_stdev = bgp->lat_stdev;
153  bestgnsspos->lon_stdev = bgp->lon_stdev;
154  bestgnsspos->hgt_stdev = bgp->hgt_stdev;
155  bestgnsspos->stn_id.assign( bgp->stn_id, arr_size(bgp->stn_id));
156  bestgnsspos->diff_age = bgp->diff_age;
157  bestgnsspos->sol_age = bgp->sol_age;
158  bestgnsspos->num_svs = bgp->num_svs;
159  bestgnsspos->num_sol_svs = bgp->num_sol_svs;
160  bestgnsspos->num_sol_l1_svs = bgp->num_sol_l1_svs;
161  bestgnsspos->num_sol_multi_svs = bgp->num_sol_multi_svs;
162  bestgnsspos->reserved = bgp->reserved;
163  bestgnsspos->ext_sol_stat.status = bgp->ext_sol_stat;
164  bestgnsspos->galileo_beidou_sig_mask= bgp->galileo_beidou_sig_mask;
165  bestgnsspos->gps_glonass_sig_mask = bgp->gps_glonass_sig_mask;
166 
167  static const std::string name = "BESTGNSSPOS";
168  SetOem7Header(msg, name, bestgnsspos->nov_header);
169 }
170 
171 template<>
172 void
173 MakeROSMessage<novatel_oem7_msgs::BESTPOS>(
174  const Oem7RawMessageIf::ConstPtr& msg,
176 {
177  assert(msg->getMessageId() == BESTPOS_OEM7_MSGID);
178 
179  const BESTPOSMem* bp = reinterpret_cast<const BESTPOSMem*>(msg->getMessageData(OEM7_BINARY_MSG_HDR_LEN));
180  bestpos.reset(new novatel_oem7_msgs::BESTPOS);
181 
182  bestpos->sol_status.status = bp->sol_stat;
183  bestpos->pos_type.type = bp->pos_type;
184  bestpos->lat = bp->lat;
185  bestpos->lon = bp->lon;
186  bestpos->hgt = bp->hgt;
187  bestpos->undulation = bp->undulation;
188  bestpos->datum_id = bp->datum_id;
189  bestpos->lat_stdev = bp->lat_stdev;
190  bestpos->lon_stdev = bp->lon_stdev;
191  bestpos->hgt_stdev = bp->hgt_stdev;
192  bestpos->stn_id.assign( bp->stn_id, arr_size(bp->stn_id));
193  bestpos->diff_age = bp->diff_age;
194  bestpos->sol_age = bp->sol_age;
195  bestpos->num_svs = bp->num_svs;
196  bestpos->num_sol_svs = bp->num_sol_svs;
197  bestpos->num_sol_l1_svs = bp->num_sol_l1_svs;
198  bestpos->num_sol_multi_svs = bp->num_sol_multi_svs;
199  bestpos->reserved = bp->reserved;
200  bestpos->ext_sol_stat.status = bp->ext_sol_stat;
201  bestpos->galileo_beidou_sig_mask= bp->galileo_beidou_sig_mask;
202  bestpos->gps_glonass_sig_mask = bp->gps_glonass_sig_mask;
203 
204  static const std::string name = "BESTPOS";
205  SetOem7Header(msg, name, bestpos->nov_header);
206 }
207 
208 template<>
209 void
210 MakeROSMessage<novatel_oem7_msgs::BESTVEL>(
211  const Oem7RawMessageIf::ConstPtr& msg,
213 {
214  assert(msg->getMessageId() == BESTVEL_OEM7_MSGID);
215 
216  const BESTVELMem* bv = reinterpret_cast<const BESTVELMem*>(msg->getMessageData(OEM7_BINARY_MSG_HDR_LEN));
217  bestvel.reset(new novatel_oem7_msgs::BESTVEL);
218 
219  bestvel->sol_status.status = bv->sol_stat;
220  bestvel->vel_type.type = bv->vel_type;
221  bestvel->latency = bv->latency;
222  bestvel->diff_age = bv->diff_age;
223  bestvel->hor_speed = bv->hor_speed;
224  bestvel->trk_gnd = bv->track_gnd;
225  bestvel->ver_speed = bv->ver_speed;
226  bestvel->reserved = bv->reserved;
227 
228  static const std::string name = "BESTVEL";
229  SetOem7Header(msg, name, bestvel->nov_header);
230 }
231 
232 template<>
233 void
234 MakeROSMessage<novatel_oem7_msgs::BESTUTM>(
235  const Oem7RawMessageIf::ConstPtr& msg,
237 {
238  assert(msg->getMessageId() == BESTUTM_OEM7_MSGID);
239 
240  const BESTUTMMem* mem = reinterpret_cast<const BESTUTMMem*>(msg->getMessageData(OEM7_BINARY_MSG_HDR_LEN));
241  bestutm.reset(new novatel_oem7_msgs::BESTUTM);
242 
243  bestutm->pos_type.type = mem->pos_type;;
244  bestutm->lon_zone_number = mem->lon_zone_number;
245  bestutm->lat_zone_letter = mem->lat_zone_letter;
246  bestutm->northing = mem->northing;
247  bestutm->easting = mem->easting;
248  bestutm->height = mem->height;
249  bestutm->undulation = mem->undulation;
250  bestutm->datum_id = mem->datum_id;
251  bestutm->northing_stddev = mem->northing_stddev;
252  bestutm->easting_stddev = mem->easting_stddev;
253  bestutm->height_stddev = mem->height_stddev;
254  bestutm->stn_id.assign( mem->stn_id, arr_size(mem->stn_id));
255  bestutm->diff_age = mem->diff_age;
256  bestutm->sol_age = mem->sol_age;
257  bestutm->num_svs = mem->num_svs;
258  bestutm->num_sol_svs = mem->num_sol_svs;
259  bestutm->num_sol_ggl1_svs = mem->num_sol_ggl1_svs;
260  bestutm->num_sol_multi_svs = mem->num_sol_multi_svs;
261  bestutm->reserved = mem->reserved;
262  bestutm->ext_sol_stat.status = mem->ext_sol_stat;
263  bestutm->galileo_beidou_sig_mask= mem->galileo_beidou_sig_mask;
264  bestutm->gps_glonass_sig_mask = mem->gps_glonass_sig_mask;
265 
266  static const std::string name = "BESTUTM";
267  SetOem7Header(msg, name, bestutm->nov_header);
268  }
269 
270 template<>
271 void
272 MakeROSMessage<novatel_oem7_msgs::PPPPOS>(
273  const Oem7RawMessageIf::ConstPtr& msg,
275 {
276  assert(msg->getMessageId() == PPPPOS_OEM7_MSGID);
277 
278  const PPPPOSMem* pp = reinterpret_cast<const PPPPOSMem*>(msg->getMessageData(OEM7_BINARY_MSG_HDR_LEN));
279  ppppos.reset(new novatel_oem7_msgs::PPPPOS);
280 
281  ppppos->sol_status.status = pp->sol_stat;
282  ppppos->pos_type.type = pp->pos_type;
283  ppppos->lat = pp->lat;
284  ppppos->lon = pp->lon;
285  ppppos->hgt = pp->hgt;
286  ppppos->undulation = pp->undulation;
287  ppppos->datum_id = pp->datum_id;
288  ppppos->lat_stdev = pp->lat_stdev;
289  ppppos->lon_stdev = pp->lon_stdev;
290  ppppos->hgt_stdev = pp->hgt_stdev;
291  ppppos->stn_id.assign( pp->stn_id, arr_size(pp->stn_id));
292  ppppos->diff_age = pp->diff_age;
293  ppppos->sol_age = pp->sol_age;
294  ppppos->num_svs = pp->num_svs;
295  ppppos->num_sol_svs = pp->num_sol_svs;
296  ppppos->num_sol_l1_svs = pp->num_sol_l1_svs;
297  ppppos->num_sol_multi_svs = pp->num_sol_multi_svs;
298  ppppos->reserved = pp->reserved;
299  ppppos->ext_sol_stat.status = pp->ext_sol_stat;
300  ppppos->reserved2 = pp->reserved2;
301  ppppos->gps_glonass_sig_mask = pp->gps_glonass_sig_mask;
302 
303  static const std::string name = "PPPPOS";
304  SetOem7Header(msg, name, ppppos->nov_header);
305 }
306 
307 template<>
308 void
309 MakeROSMessage<novatel_oem7_msgs::TERRASTARINFO>(
310  const Oem7RawMessageIf::ConstPtr& msg,
312 {
313  assert(msg->getMessageId() == TERRASTARINFO_OEM7_MSGID);
314 
315  const TERRASTARINFOMem* tsi = reinterpret_cast<const TERRASTARINFOMem*>(msg->getMessageData(OEM7_BINARY_MSG_HDR_LEN));
316  terrastarinfo.reset(new novatel_oem7_msgs::TERRASTARINFO);
317 
318  terrastarinfo->product_activation_code = tsi->product_activation_code;
319  terrastarinfo->sub_type.type = tsi->sub_type;
320  terrastarinfo->sub_permission.permission = tsi->sub_permission;
321  terrastarinfo->service_end_day_of_year = tsi->service_end_day_of_year;
322  terrastarinfo->service_end_year = tsi->service_end_year;
323  terrastarinfo->reserved = tsi->reserved;
324  terrastarinfo->region_restriction.restriction = tsi->region_restriction;
325  terrastarinfo->center_point_latitude = tsi->center_point_latitude;
326  terrastarinfo->center_point_longitude = tsi->center_point_longitude;
327  terrastarinfo->radius = tsi->radius;
328 
329  static const std::string name = "TERRASTARINFO";
330  SetOem7Header(msg, name, terrastarinfo->nov_header);
331 }
332 
333 template<>
334 void
335 MakeROSMessage<novatel_oem7_msgs::TERRASTARSTATUS>(
336  const Oem7RawMessageIf::ConstPtr& msg,
338 {
339  assert(msg->getMessageId() == TERRASTARSTATUS_OEM7_MSGID);
340 
341  const TERRASTARSTATUSMem* tss = reinterpret_cast<const TERRASTARSTATUSMem*>(msg->getMessageData(OEM7_BINARY_MSG_HDR_LEN));
342  terrastarstatus.reset(new novatel_oem7_msgs::TERRASTARSTATUS);
343 
344  terrastarstatus->access_status.status = tss->access_status;
345  terrastarstatus->sync_state.state = tss->sync_state;
346  terrastarstatus->reserved = tss->reserved;
347  terrastarstatus->local_area_status.status = tss->local_area_status;
348  terrastarstatus->geo_status.status = tss->geo_status;
349 
350  static const std::string name = "TERRASTARSTATUS";
351  SetOem7Header(msg, name, terrastarstatus->nov_header);
352 }
353 
354 template<>
355 void
356 MakeROSMessage<novatel_oem7_msgs::INSPVA>(
357  const Oem7RawMessageIf::ConstPtr& msg,
359 {
360  assert(msg->getMessageId() == INSPVAS_OEM7_MSGID);
361 
362  const INSPVASmem* pvamem = reinterpret_cast<const INSPVASmem*>(msg->getMessageData(OEM7_BINARY_MSG_SHORT_HDR_LEN));
363  pva.reset(new novatel_oem7_msgs::INSPVA);
364 
365  pva->latitude = pvamem->latitude;
366  pva->longitude = pvamem->longitude;
367  pva->height = pvamem->height;
368  pva->north_velocity = pvamem->north_velocity;
369  pva->east_velocity = pvamem->east_velocity;
370  pva->up_velocity = pvamem->up_velocity;
371  pva->roll = pvamem->roll;
372  pva->pitch = pvamem->pitch;
373  pva->azimuth = pvamem->azimuth;
374  pva->status.status = pvamem->status;
375 
376  static const std::string name = "INSPVA";
377  SetOem7ShortHeader(msg, name, pva->nov_header);
378 }
379 
380 
381 template<>
382 void
383 MakeROSMessage<novatel_oem7_msgs::INSCONFIG>(
384  const Oem7RawMessageIf::ConstPtr& msg,
386 {
387  assert(msg->getMessageId()== INSCONFIG_OEM7_MSGID);
388 
389  const INSCONFIG_FixedMem* insconfigmem =
390  reinterpret_cast<const INSCONFIG_FixedMem*>(msg->getMessageData(OEM7_BINARY_MSG_HDR_LEN));
391  insconfig.reset(new novatel_oem7_msgs::INSCONFIG);
392 
393  insconfig->imu_type = insconfigmem->imu_type;
394  insconfig->mapping = insconfigmem->mapping;
395  insconfig->initial_alignment_velocity = insconfigmem->initial_alignment_velocity;
396  insconfig->heave_window = insconfigmem->heave_window;
397  insconfig->profile = insconfigmem->profile;
398 
399  std::copy(
400  insconfigmem->enabled_updates,
401  insconfigmem->enabled_updates + arr_size(insconfigmem->enabled_updates),
402  insconfig->enabled_updates.begin());
403 
404  insconfig->alignment_mode.mode = insconfigmem->alignment_mode;
405  insconfig->relative_ins_output_frame.frame = insconfigmem->relative_ins_output_frame;
406  insconfig->relative_ins_output_direction = insconfigmem->relative_ins_output_direction;
407 
408  std::copy(
409  insconfigmem->ins_receiver_status,
410  insconfigmem->ins_receiver_status + arr_size(insconfigmem->ins_receiver_status),
411  insconfig->ins_receiver_status.status.begin());
412 
413  insconfig->ins_seed_enabled = insconfigmem->ins_seed_enabled;
414  insconfig->ins_seed_validation = insconfigmem->ins_seed_validation;
415  insconfig->reserved_1 = insconfigmem->reserved_1;
416  insconfig->reserved_2 = insconfigmem->reserved_2;
417  insconfig->reserved_3 = insconfigmem->reserved_3;
418  insconfig->reserved_4 = insconfigmem->reserved_4;
419  insconfig->reserved_5 = insconfigmem->reserved_5;
420  insconfig->reserved_6 = insconfigmem->reserved_6;
421  insconfig->reserved_7 = insconfigmem->reserved_7;
422 
423  insconfig->translations.reserve(Get_INSCONFIG_NumTranslations(insconfigmem));
424  for(size_t idx = 0;
425  idx < Get_INSCONFIG_NumTranslations(insconfigmem);
426  idx++)
427  {
428  const INSCONFIG_TranslationMem* trmem = Get_INSCONFIG_Translation(insconfigmem, idx);
429  novatel_oem7_msgs::Translation& tr = insconfig->translations[idx];
430 
431  tr.translation.type = trmem->translation;
432  tr.frame.frame = trmem->frame;
433  tr.x_offset = trmem->x_offset;
434  tr.y_offset = trmem->y_offset;
435  tr.z_offset = trmem->z_offset;
436  tr.x_uncertainty = trmem->x_uncertainty;
437  tr.y_uncertainty = trmem->y_uncertainty;
438  tr.z_uncertainty = trmem->z_uncertainty;
439  tr.translation_source.status = trmem->translation_source;
440  }
441 
442  insconfig->rotations.reserve(Get_INSCONFIG_NumRotations(insconfigmem));
443  for(size_t idx = 0;
444  idx < Get_INSCONFIG_NumRotations(insconfigmem);
445  idx++)
446  {
447  const INSCONFIG_RotationMem* rtmem = Get_INSCONFIG_Rotation(insconfigmem, idx);
448  novatel_oem7_msgs::Rotation& rt = insconfig->rotations[idx];
449  rt.rotation.offset = rtmem->rotation;
450  rt.frame.frame = rtmem->frame;
451  rt.x_rotation = rtmem->x_rotation;
452  rt.y_rotation = rtmem->y_rotation;
453  rt.z_rotation = rtmem->z_rotation;
454  rt.x_rotation_stdev = rtmem->x_rotation_stdev;
455  rt.y_rotation_stdev = rtmem->y_rotation_stdev;
456  rt.z_rotation_stdev = rtmem->z_rotation_stdev;
457  rt.rotation_source.status = rtmem->rotation_source;
458  }
459 
460  static const std::string name = "INSCONFIG";
461  SetOem7Header(msg, name, insconfig->nov_header);
462 }
463 
464 
465 template<>
466 void
467 MakeROSMessage<novatel_oem7_msgs::INSPVAX>(
468  const Oem7RawMessageIf::ConstPtr& msg,
470 {
471  assert(msg->getMessageId() == INSPVAX_OEM7_MSGID);
472 
473  const INSPVAXMem* mem = reinterpret_cast<const INSPVAXMem*>(msg->getMessageData(OEM7_BINARY_MSG_HDR_LEN));
474  inspvax.reset(new novatel_oem7_msgs::INSPVAX);
475 
476  inspvax->ins_status.status = mem->ins_status;
477  inspvax->pos_type.type = mem->pos_type;
478  inspvax->latitude = mem->latitude;
479  inspvax->longitude = mem->longitude;
480  inspvax->height = mem->height;
481  inspvax->undulation = mem->undulation;
482  inspvax->north_velocity = mem->north_velocity;
483  inspvax->east_velocity = mem->east_velocity;
484  inspvax->up_velocity = mem->up_velocity;
485  inspvax->roll = mem->roll;
486  inspvax->pitch = mem->pitch;
487  inspvax->azimuth = mem->azimuth;
488  inspvax->latitude_stdev = mem->latitude_stdev;
489  inspvax->longitude_stdev = mem->longitude_stdev;
490  inspvax->height_stdev = mem->height_stdev;
491  inspvax->north_velocity_stdev = mem->north_velocity_stdev;
492  inspvax->east_velocity_stdev = mem->east_velocity_stdev;
493  inspvax->up_velocity_stdev = mem->up_velocity_stdev;
494  inspvax->roll_stdev = mem->roll_stdev;
495  inspvax->pitch_stdev = mem->pitch_stdev;
496  inspvax->azimuth_stdev = mem->azimuth_stdev;
497  inspvax->ext_sol_status.status = mem->extended_status;
498 
499  static const std::string name = "INSPVAX";
500  SetOem7Header(msg, name, inspvax->nov_header);
501 }
502 
503 
504 
505 template<>
506 void
507 MakeROSMessage<novatel_oem7_msgs::INSSTDEV>(
508  const Oem7RawMessageIf::ConstPtr& msg,
510 {
511  assert(msg->getMessageId() == INSSTDEV_OEM7_MSGID);
512 
513  const INSSTDEVMem* raw = reinterpret_cast<const INSSTDEVMem*>(msg->getMessageData(OEM7_BINARY_MSG_HDR_LEN));
514  insstdev.reset(new novatel_oem7_msgs::INSSTDEV);
515 
516  insstdev->latitude_stdev = raw->latitude_stdev;
517  insstdev->longitude_stdev = raw->longitude_stdev;
518  insstdev->height_stdev = raw->height_stdev;
519  insstdev->north_velocity_stdev = raw->north_velocity_stdev;
520  insstdev->east_velocity_stdev = raw->east_velocity_stdev;
521  insstdev->up_velocity_stdev = raw->up_velocity_stdev;
522  insstdev->roll_stdev = raw->roll_stdev;
523  insstdev->pitch_stdev = raw->pitch_stdev;
524  insstdev->azimuth_stdev = raw->azimuth_stdev;
525  insstdev->ext_sol_status.status = raw->ext_sol_status;
526  insstdev->time_since_last_update = raw->time_since_last_update;
527  insstdev->reserved1 = raw->reserved1;
528  insstdev->reserved2 = raw->reserved2;
529  insstdev->reserved3 = raw->reserved3;
530 
531  static const std::string name = "INSSTDEV";
532  SetOem7Header(msg, name, insstdev->nov_header);
533 }
534 
535 template<>
536 void
537 MakeROSMessage<novatel_oem7_msgs::CORRIMU>(
538  const Oem7RawMessageIf::ConstPtr& msg,
540 {
541  corrimu.reset(new novatel_oem7_msgs::CORRIMU);
542 
543  if(msg->getMessageId() == CORRIMUS_OEM7_MSGID)
544  {
545  const CORRIMUSMem* raw = reinterpret_cast<const CORRIMUSMem*>(msg->getMessageData(OEM7_BINARY_MSG_SHORT_HDR_LEN));
546  corrimu->imu_data_count = raw->imu_data_count;
547  corrimu->pitch_rate = raw->pitch_rate;
548  corrimu->roll_rate = raw->roll_rate;
549  corrimu->yaw_rate = raw->yaw_rate;
550  corrimu->lateral_acc = raw->lateral_acc;
551  corrimu->longitudinal_acc = raw->longitudinal_acc;
552  corrimu->vertical_acc = raw->vertical_acc;
553  }
554  else if(msg->getMessageId() == IMURATECORRIMUS_OEM7_MSGID)
555  {
556  const IMURATECORRIMUSMem* raw =
557  reinterpret_cast<const IMURATECORRIMUSMem*>(msg->getMessageData(OEM7_BINARY_MSG_SHORT_HDR_LEN));
558  corrimu->imu_data_count = 1;
559  corrimu->pitch_rate = raw->pitch_rate;
560  corrimu->roll_rate = raw->roll_rate;
561  corrimu->yaw_rate = raw->yaw_rate;
562  corrimu->lateral_acc = raw->lateral_acc;
563  corrimu->longitudinal_acc = raw->longitudinal_acc;
564  corrimu->vertical_acc = raw->vertical_acc;
565  }
566  else
567  {
568  assert(false);
569  }
570 
571  static const std::string name = "CORRIMU";
572  SetOem7ShortHeader(msg, name, corrimu->nov_header);
573 }
574 
575 template<>
576 void
577 MakeROSMessage<novatel_oem7_msgs::TIME>(
578  const Oem7RawMessageIf::ConstPtr& msg,
580 {
581  assert(msg->getMessageId()== TIME_OEM7_MSGID);
582 
583  const TIMEMem* mem = reinterpret_cast<const TIMEMem*>(msg->getMessageData(OEM7_BINARY_MSG_HDR_LEN));
584  time.reset(new novatel_oem7_msgs::TIME);
585 
586  time->clock_status = mem->clock_status;
587  time->offset = mem->offset;
588  time->offset_std = mem->offset_std;
589  time->utc_offset = mem->utc_offset;
590  time->utc_year = mem->utc_year;
591  time->utc_month = mem->utc_month;
592  time->utc_day = mem->utc_day;
593  time->utc_hour = mem->utc_hour;
594  time->utc_min = mem->utc_min;
595  time->utc_msec = mem->utc_msec;
596  time->utc_status = mem->utc_status;
597 
598  static const std::string name = "TIME";
599  SetOem7Header(msg, name, time->nov_header);
600 }
601 
602 template<>
603 void
604 MakeROSMessage<novatel_oem7_msgs::RXSTATUS>(
605  const Oem7RawMessageIf::ConstPtr& msg,
607 {
608  assert(msg->getMessageId() == RXSTATUS_OEM7_MSGID);
609 
610  const RXSTATUSMem* mem = reinterpret_cast<const RXSTATUSMem*>(msg->getMessageData(OEM7_BINARY_MSG_HDR_LEN));
611  rxstatus.reset(new novatel_oem7_msgs::RXSTATUS);
612 
613  rxstatus->error = mem->error;
614  rxstatus->num_status_codes = mem->num_status_codes;
615  rxstatus->rxstat = mem->rxstat;
616  rxstatus->rxstat_pri_mask = mem->rxstat_pri_mask;
617  rxstatus->rxstat_set_mask = mem->rxstat_set_mask;
618  rxstatus->rxstat_clr_mask = mem->rxstat_clr_mask;
619  rxstatus->aux1_stat = mem->aux1_stat;
620  rxstatus->aux1_stat_pri = mem->aux1_stat_pri;
621  rxstatus->aux1_stat_set = mem->aux1_stat_set;
622  rxstatus->aux1_stat_clr = mem->aux1_stat_clr;
623  rxstatus->aux2_stat = mem->aux2_stat;
624  rxstatus->aux2_stat_pri = mem->aux2_stat_pri;
625  rxstatus->aux2_stat_set = mem->aux2_stat_set;
626  rxstatus->aux2_stat_clr = mem->aux2_stat_clr;
627  rxstatus->aux3_stat = mem->aux3_stat;
628  rxstatus->aux3_stat_pri = mem->aux3_stat_pri;
629  rxstatus->aux3_stat_set = mem->aux3_stat_set;
630  rxstatus->aux3_stat_clr = mem->aux3_stat_clr;
631  rxstatus->aux4_stat = mem->aux4_stat;
632  rxstatus->aux4_stat_pri = mem->aux4_stat_pri;
633  rxstatus->aux4_stat_set = mem->aux4_stat_set;
634  rxstatus->aux4_stat_clr = mem->aux4_stat_clr;
635 
636 
637  static const std::string name = "RXSTATUS";
638  SetOem7Header(msg, name, rxstatus->nov_header);
639 };
640 
641 
642 template
643 void
644 MakeROSMessage(const Oem7RawMessageIf::ConstPtr&, boost::shared_ptr<novatel_oem7_msgs::BESTGNSSPOS>&);
645 
646 template
647 void
648 MakeROSMessage(const Oem7RawMessageIf::ConstPtr&, boost::shared_ptr<novatel_oem7_msgs::BESTPOS>&);
649 
650 template
651 void
652 MakeROSMessage(const Oem7RawMessageIf::ConstPtr&, boost::shared_ptr<novatel_oem7_msgs::BESTVEL>&);
653 
654 
655 template
656 void
657 MakeROSMessage(const Oem7RawMessageIf::ConstPtr&, boost::shared_ptr<novatel_oem7_msgs::BESTUTM>&);
658 
659 template
660 void
661 MakeROSMessage(const Oem7RawMessageIf::ConstPtr&, boost::shared_ptr<novatel_oem7_msgs::PPPPOS>&);
662 
663 template
664 void
665 MakeROSMessage(const Oem7RawMessageIf::ConstPtr&, boost::shared_ptr<novatel_oem7_msgs::TERRASTARINFO>&);
666 
667 template
668 void
669 MakeROSMessage(const Oem7RawMessageIf::ConstPtr&, boost::shared_ptr<novatel_oem7_msgs::TERRASTARSTATUS>&);
670 
671 template
672 void
673 MakeROSMessage(const Oem7RawMessageIf::ConstPtr&, boost::shared_ptr<novatel_oem7_msgs::INSPVA>&);
674 
675 template
676 void
677 MakeROSMessage(const Oem7RawMessageIf::ConstPtr&, boost::shared_ptr<novatel_oem7_msgs::INSPVAX>&);
678 
679 template
680 void
681 MakeROSMessage(const Oem7RawMessageIf::ConstPtr&, boost::shared_ptr<novatel_oem7_msgs::INSCONFIG>&);
682 
683 template
684 void
685 MakeROSMessage(const Oem7RawMessageIf::ConstPtr&, boost::shared_ptr<novatel_oem7_msgs::INSSTDEV>&);
686 
687 template
688 void
689 MakeROSMessage(const Oem7RawMessageIf::ConstPtr&, boost::shared_ptr<novatel_oem7_msgs::CORRIMU>&);
690 
691 template
692 void
693 MakeROSMessage(const Oem7RawMessageIf::ConstPtr&, boost::shared_ptr<novatel_oem7_msgs::TIME>&);
694 
695 template
696 void
697 MakeROSMessage(const Oem7RawMessageIf::ConstPtr&, boost::shared_ptr<novatel_oem7_msgs::RXSTATUS>&);
698 
699 
700 //---------------------------------------------------------------------------------------------------------------
701 /***
702  * Obtains DOP values from Oem7 PSRDOP2 message
703  */
704 void
706  const Oem7RawMessageIf::ConstPtr& msg,
707  uint32_t system_to_use,
708  double& gdop,
709  double& pdop,
710  double& hdop,
711  double& vdop,
712  double& tdop)
713 {
714  const PSRDOP2_FixedMem* mem = reinterpret_cast<const PSRDOP2_FixedMem*>(msg->getMessageData(OEM7_BINARY_MSG_HDR_LEN));
715 
716  gdop = mem->gdop;
717  pdop = mem->pdop;
718  hdop = mem->hdop;
719  vdop = mem->vdop;
720 
721  const size_t num_sys = Get_PSRDOP2_NumSystems(mem);
722 
723  for(int i = 0;
724  i < num_sys;
725  i++)
726  {
727  const PSRDOP2_SystemMem* sys = Get_PSRDOP2_System(mem, i);
728  if(sys->system == system_to_use)
729  {
730  tdop = sys->tdop;
731  break;
732  }
733  }
734 }
735 
736 
737 
738 
739 
740 }
const int BESTUTM_OEM7_MSGID
const int RXSTATUS_OEM7_MSGID
const std::size_t OEM7_BINARY_MSG_SHORT_HDR_LEN
void SetOem7Header(const Oem7RawMessageIf::ConstPtr &msg, const std::string &name, novatel_oem7_msgs::Oem7Header::Type &oem7_hdr)
const int BESTPOS_OEM7_MSGID
const int BESTVEL_OEM7_MSGID
const int INSCONFIG_OEM7_MSGID
const PSRDOP2_SystemMem * Get_PSRDOP2_System(const PSRDOP2_FixedMem *psrdop2, size_t idx)
const int TERRASTARSTATUS_OEM7_MSGID
size_t Get_INSCONFIG_NumTranslations(const INSCONFIG_FixedMem *insconfig)
const int HEADING2_OEM7_MSGID
const int INSPVAX_OEM7_MSGID
const INSCONFIG_TranslationMem * Get_INSCONFIG_Translation(const INSCONFIG_FixedMem *insconfig, size_t idx)
#define arr_size(_arr_)
const std::size_t OEM7_BINARY_MSG_HDR_LEN
size_t Get_PSRDOP2_NumSystems(const PSRDOP2_FixedMem *psrdop2)
const int INSPVAS_OEM7_MSGID
void SetOem7ShortHeader(const Oem7RawMessageIf::ConstPtr &msg, const std::string &name, novatel_oem7_msgs::Oem7Header::Type &oem7_hdr)
void getOem7ShortHeader(const Oem7RawMessageIf::ConstPtr &raw_msg, novatel_oem7_msgs::Oem7Header::Type &hdr)
size_t Get_INSCONFIG_NumRotations(const INSCONFIG_FixedMem *insconfig)
const int IMURATECORRIMUS_OEM7_MSGID
void getOem7Header(const Oem7RawMessageIf::ConstPtr &raw_msg, novatel_oem7_msgs::Oem7Header::Type &hdr)
void MakeROSMessage(const Oem7RawMessageIf::ConstPtr &msg, boost::shared_ptr< T > &rosmsg)
const int INSSTDEV_OEM7_MSGID
const int BESTGNSSPOS_OEM7_MSGID
const int CORRIMUS_OEM7_MSGID
void GetDOPFromPSRDOP2(const Oem7RawMessageIf::ConstPtr &msg, uint32_t system_to_use, double &gdop, double &pdop, double &hdop, double &vdop, double &tdop)
const INSCONFIG_RotationMem * Get_INSCONFIG_Rotation(const INSCONFIG_FixedMem *insconfig, size_t idx)
const int TERRASTARINFO_OEM7_MSGID
uint32_t GetNextMsgSequenceNumber()


novatel_oem7_driver
Author(s):
autogenerated on Sun Mar 19 2023 02:17:37