You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
66 lines
1.7 KiB
66 lines
1.7 KiB
#include <kaitai/kaitaistream.h>
|
|
|
|
#include "cereal/messaging/messaging.h"
|
|
#include "selfdrive/common/swaglog.h"
|
|
#include "selfdrive/common/util.h"
|
|
#include "selfdrive/locationd/ublox_msg.h"
|
|
|
|
ExitHandler do_exit;
|
|
using namespace ublox;
|
|
|
|
int main() {
|
|
LOGW("starting ubloxd");
|
|
AlignedBuffer aligned_buf;
|
|
UbloxMsgParser parser;
|
|
|
|
PubMaster pm({"ubloxGnss", "gpsLocationExternal"});
|
|
|
|
Context * context = Context::create();
|
|
SubSocket * subscriber = SubSocket::create(context, "ubloxRaw");
|
|
assert(subscriber != NULL);
|
|
subscriber->setTimeout(100);
|
|
|
|
|
|
while (!do_exit) {
|
|
Message * msg = subscriber->receive();
|
|
if (!msg){
|
|
if (errno == EINTR) {
|
|
do_exit = true;
|
|
}
|
|
continue;
|
|
}
|
|
|
|
capnp::FlatArrayMessageReader cmsg(aligned_buf.align(msg));
|
|
cereal::Event::Reader event = cmsg.getRoot<cereal::Event>();
|
|
auto ubloxRaw = event.getUbloxRaw();
|
|
|
|
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(data + bytes_consumed, (uint32_t)(len - bytes_consumed), bytes_consumed_this_time)) {
|
|
|
|
try {
|
|
auto msg = parser.gen_msg();
|
|
if (msg.second.size() > 0) {
|
|
auto bytes = msg.second.asBytes();
|
|
pm.send(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;
|
|
}
|
|
delete msg;
|
|
}
|
|
|
|
delete subscriber;
|
|
delete context;
|
|
|
|
return 0;
|
|
}
|
|
|