#include #include #include "cereal/messaging/messaging.h" #include "common/swaglog.h" #include "common/util.h" #include "system/ubloxd/ublox_msg.h" ExitHandler do_exit; using namespace ublox; int main() { LOGW("starting ubloxd"); AlignedBuffer aligned_buf; UbloxMsgParser parser; PubMaster pm({"ubloxGnss", "gpsLocationExternal"}); std::unique_ptr context(Context::create()); std::unique_ptr subscriber(SubSocket::create(context.get(), "ubloxRaw")); assert(subscriber != NULL); subscriber->setTimeout(100); while (!do_exit) { std::unique_ptr msg(subscriber->receive()); if (!msg) { if (errno == EINTR) { do_exit = true; } continue; } capnp::FlatArrayMessageReader cmsg(aligned_buf.align(msg.get())); cereal::Event::Reader event = cmsg.getRoot(); auto ubloxRaw = event.getUbloxRaw(); float log_time = 1e-9 * event.getLogMonoTime(); const uint8_t *data = ubloxRaw.begin(); size_t len = ubloxRaw.size(); size_t bytes_consumed = 0; while (bytes_consumed < len && !do_exit) { size_t bytes_consumed_this_time = 0U; if (parser.add_data(log_time, data + bytes_consumed, (uint32_t)(len - bytes_consumed), bytes_consumed_this_time)) { try { auto ublox_msg = parser.gen_msg(); if (ublox_msg.second.size() > 0) { auto bytes = ublox_msg.second.asBytes(); pm.send(ublox_msg.first.c_str(), bytes.begin(), bytes.size()); } } catch (const std::exception& e) { LOGE("Error parsing ublox message %s", e.what()); } parser.reset(); } bytes_consumed += bytes_consumed_this_time; } } return 0; }