|  |  |  | #include <stdio.h>
 | 
					
						
							|  |  |  | #include <stdlib.h>
 | 
					
						
							|  |  |  | #include <string.h>
 | 
					
						
							|  |  |  | #include <signal.h>
 | 
					
						
							|  |  |  | #include <unistd.h>
 | 
					
						
							|  |  |  | #include <sched.h>
 | 
					
						
							|  |  |  | #include <sys/time.h>
 | 
					
						
							|  |  |  | #include <sys/cdefs.h>
 | 
					
						
							|  |  |  | #include <sys/types.h>
 | 
					
						
							|  |  |  | #include <assert.h>
 | 
					
						
							|  |  |  | #include <math.h>
 | 
					
						
							|  |  |  | #include <ctime>
 | 
					
						
							|  |  |  | #include <chrono>
 | 
					
						
							|  |  |  | #include <iostream>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "messaging.hpp"
 | 
					
						
							|  |  |  | #include "impl_zmq.hpp"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "common/params.h"
 | 
					
						
							|  |  |  | #include "common/swaglog.h"
 | 
					
						
							|  |  |  | #include "common/timing.h"
 | 
					
						
							|  |  |  | #include "common/util.h"
 | 
					
						
							|  |  |  | #include "ublox_msg.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | using namespace ublox;
 | 
					
						
							|  |  |  | extern volatile sig_atomic_t do_exit;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void write_file(std::string fpath, uint8_t *to_write, int length) {
 | 
					
						
							|  |  |  |   FILE* f = fopen(fpath.c_str(), "wb");
 | 
					
						
							|  |  |  |   if (!f) {
 | 
					
						
							|  |  |  |     std::cout << "Open " << fpath << " failed" << std::endl;
 | 
					
						
							|  |  |  |     return;
 | 
					
						
							|  |  |  |   }
 | 
					
						
							|  |  |  |   fwrite(to_write, length, 1, f);
 | 
					
						
							|  |  |  |   fclose(f);
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static size_t len = 0U;
 | 
					
						
							|  |  |  | static size_t consumed = 0U;
 | 
					
						
							|  |  |  | static uint8_t *data = NULL;
 | 
					
						
							|  |  |  | static int save_idx = 0;
 | 
					
						
							|  |  |  | static std::string prefix;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Message * poll_ubloxraw_msg(Poller * poller) {
 | 
					
						
							|  |  |  |   assert(poller);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   size_t consuming  = min(len - consumed, 128);
 | 
					
						
							|  |  |  |   if(consumed < len) {
 | 
					
						
							|  |  |  |     // create message
 | 
					
						
							|  |  |  |     MessageBuilder msg_builder;
 | 
					
						
							|  |  |  |     auto ublox_raw = msg_builder.initEvent().initUbloxRaw(consuming);
 | 
					
						
							|  |  |  |     memcpy(ublox_raw.begin(), (void *)(data + consumed), consuming);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     auto bytes = msg_builder.toBytes();
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Message * msg = new ZMQMessage();
 | 
					
						
							|  |  |  |     msg->init((char*)bytes.begin(), bytes.size());
 | 
					
						
							|  |  |  |     consumed += consuming;
 | 
					
						
							|  |  |  |     return msg;
 | 
					
						
							|  |  |  |   } else {
 | 
					
						
							|  |  |  |     do_exit = 1;
 | 
					
						
							|  |  |  |     return NULL;
 | 
					
						
							|  |  |  |   }
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int send_gps_event(PubSocket *s, const void *buf, size_t length) {
 | 
					
						
							|  |  |  |   assert(s);
 | 
					
						
							|  |  |  |   write_file(prefix + "/" + std::to_string(save_idx), (uint8_t *)buf, length);
 | 
					
						
							|  |  |  |   save_idx++;
 | 
					
						
							|  |  |  |   return length;
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int main(int argc, char** argv) {
 | 
					
						
							|  |  |  |   if(argc < 3) {
 | 
					
						
							|  |  |  |     printf("Format: ubloxd_test stream_file_path save_prefix\n");
 | 
					
						
							|  |  |  |     return 0;
 | 
					
						
							|  |  |  |   }
 | 
					
						
							|  |  |  |   // Parse 11360 msgs, generate 9452 events
 | 
					
						
							|  |  |  |   data = (uint8_t *)read_file(argv[1], &len);
 | 
					
						
							|  |  |  |   if(data == NULL) {
 | 
					
						
							|  |  |  |     LOGE("Read file %s failed\n", argv[1]);
 | 
					
						
							|  |  |  |     return -1;
 | 
					
						
							|  |  |  |   }
 | 
					
						
							|  |  |  |   prefix = argv[2];
 | 
					
						
							|  |  |  |   ubloxd_main(poll_ubloxraw_msg, send_gps_event);
 | 
					
						
							|  |  |  |   free(data);
 | 
					
						
							|  |  |  |   printf("Generated %d cereal events\n", save_idx);
 | 
					
						
							|  |  |  |   if(save_idx != 9452) {
 | 
					
						
							|  |  |  |     printf("Event count error: %d\n", save_idx);
 | 
					
						
							|  |  |  |     return -1;
 | 
					
						
							|  |  |  |   }
 | 
					
						
							|  |  |  |   return 0;
 | 
					
						
							|  |  |  | }
 |