2019-08-11 02:43:29 -06:00
|
|
|
#include "storage.hh"
|
|
|
|
#include "fmt/format.h"
|
|
|
|
#include "fmt/printf.h"
|
|
|
|
#include <unistd.h>
|
|
|
|
#include <sys/stat.h>
|
|
|
|
#include <sys/types.h>
|
2019-08-12 07:54:16 -06:00
|
|
|
#include <arpa/inet.h>
|
2020-07-03 13:52:57 -06:00
|
|
|
#include <iostream>
|
2019-08-11 02:43:29 -06:00
|
|
|
using namespace std;
|
|
|
|
|
|
|
|
|
|
|
|
std::string getPath(std::string_view root, time_t s, uint64_t sourceid, bool create)
|
|
|
|
{
|
|
|
|
auto comps = getPathComponents(root, s, sourceid);
|
|
|
|
std::string path;
|
|
|
|
for(unsigned int pos = 0; pos < comps.size() - 1 ; ++pos) {
|
|
|
|
path += comps[pos] +"/";
|
|
|
|
if(create)
|
|
|
|
mkdir(path.c_str(), 0770);
|
|
|
|
}
|
|
|
|
path += comps[comps.size()-1]+".gnss";
|
|
|
|
return path;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
vector<string> getPathComponents(std::string_view root, time_t s, uint64_t sourceid)
|
|
|
|
{
|
|
|
|
// path: source/year/month/day/hour.pb
|
|
|
|
vector<string> ret;
|
|
|
|
ret.push_back((string)root);
|
|
|
|
ret.push_back(fmt::sprintf("%08x", sourceid));
|
|
|
|
|
|
|
|
struct tm tm;
|
|
|
|
gmtime_r(&s, &tm);
|
|
|
|
|
|
|
|
ret.push_back(to_string(tm.tm_year+1900));
|
|
|
|
ret.push_back(to_string(tm.tm_mon+1));
|
2019-08-30 09:56:41 -06:00
|
|
|
ret.push_back(to_string(tm.tm_mday));
|
2019-08-11 02:43:29 -06:00
|
|
|
ret.push_back(to_string(tm.tm_hour)+".pb");
|
|
|
|
return ret;
|
|
|
|
}
|
2019-08-12 07:54:16 -06:00
|
|
|
|
|
|
|
bool getNMM(int fd, NavMonMessage& nmm, uint32_t& offset)
|
|
|
|
{
|
|
|
|
char bert[4];
|
|
|
|
if(read(fd, bert, 4) != 4 || bert[0]!='b' || bert[1]!='e' || bert[2] !='r' || bert[3]!='t') {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
uint16_t len;
|
|
|
|
if(read(fd, &len, 2) != 2)
|
|
|
|
return false;
|
|
|
|
len = htons(len);
|
|
|
|
char buffer[len];
|
|
|
|
if(read(fd, buffer, len) != len)
|
|
|
|
return false;
|
|
|
|
|
|
|
|
nmm.ParseFromString(string(buffer, len));
|
|
|
|
offset += 4 + 2 + len;
|
|
|
|
return true;
|
|
|
|
}
|
2020-01-09 05:30:57 -07:00
|
|
|
|
|
|
|
bool getNMM(FILE* fp, NavMonMessage& nmm, uint32_t& offset)
|
|
|
|
{
|
|
|
|
char bert[4];
|
|
|
|
if(fread(bert, 1, 4, fp) != 4 || bert[0]!='b' || bert[1]!='e' || bert[2] !='r' || bert[3]!='t') {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
uint16_t len;
|
|
|
|
if(fread(&len, 1, 2, fp) != 2)
|
|
|
|
return false;
|
|
|
|
len = htons(len);
|
|
|
|
char buffer[len];
|
|
|
|
if(fread(buffer, 1, len, fp) != len)
|
|
|
|
return false;
|
|
|
|
|
|
|
|
nmm.ParseFromString(string(buffer, len));
|
|
|
|
offset += 4 + 2 + len;
|
|
|
|
return true;
|
|
|
|
}
|
2020-01-12 14:49:08 -07:00
|
|
|
|
2020-01-12 15:17:36 -07:00
|
|
|
bool getRawNMM(int fd, timespec& t, string& raw, uint32_t& offset)
|
|
|
|
{
|
|
|
|
char bert[4];
|
2020-07-03 13:52:57 -06:00
|
|
|
int res;
|
|
|
|
if((res=read(fd, bert, 4)) != 4 || bert[0]!='b' || bert[1]!='e' || bert[2] !='r' || bert[3]!='t') {
|
|
|
|
if(res != 4)
|
|
|
|
return false;
|
|
|
|
|
|
|
|
for(int s=0;; ++s ) {
|
|
|
|
cerr<<"Skipping character hunting for good magic.. "<<s<<endl;
|
|
|
|
bert[0] = bert[1];
|
|
|
|
bert[1] = bert[2];
|
|
|
|
bert[2] = bert[3];
|
|
|
|
res = read(fd, bert + 3, 1);
|
|
|
|
if(res != 1)
|
|
|
|
return false;
|
|
|
|
if(bert[0]=='b' && bert[1]=='e' && bert[2] =='r' && bert[3]=='t')
|
|
|
|
break;
|
|
|
|
}
|
2020-01-12 15:17:36 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
uint16_t len;
|
|
|
|
if(read(fd, &len, 2) != 2)
|
|
|
|
return false;
|
|
|
|
len = htons(len);
|
|
|
|
char buffer[len];
|
|
|
|
if(read(fd, buffer, len) != len)
|
|
|
|
return false;
|
|
|
|
|
|
|
|
NavMonMessage nmm;
|
|
|
|
raw.assign(buffer, len);
|
|
|
|
nmm.ParseFromString(raw);
|
|
|
|
t.tv_sec = nmm.localutcseconds();
|
|
|
|
t.tv_nsec = nmm.localutcnanoseconds();
|
|
|
|
offset += 4 + 2 + len;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2020-01-12 14:49:08 -07:00
|
|
|
|
|
|
|
bool getRawNMM(FILE* fp, timespec& t, string& raw, uint32_t& offset)
|
|
|
|
{
|
|
|
|
char bert[4];
|
2020-07-03 13:52:57 -06:00
|
|
|
int res;
|
|
|
|
if((res=fread(bert, 1, 4, fp)) != 4 || bert[0]!='b' || bert[1]!='e' || bert[2] !='r' || bert[3]!='t') {
|
|
|
|
if(res != 4) {
|
|
|
|
// cerr<<"EOF"<<endl;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
for(int s=0;; ++s ) {
|
|
|
|
cerr<<"Skipping character hunting for good magic.. "<<s<<endl;
|
|
|
|
bert[0] = bert[1];
|
|
|
|
bert[1] = bert[2];
|
|
|
|
bert[2] = bert[3];
|
|
|
|
res = fread(bert+3, 1,1, fp);
|
|
|
|
if(res != 1)
|
|
|
|
return false;
|
|
|
|
if(bert[0]=='b' && bert[1]=='e' && bert[2] =='r' && bert[3]=='t') {
|
|
|
|
cerr<<"Resync!"<<endl;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2020-01-12 14:49:08 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
uint16_t len;
|
|
|
|
if(fread(&len, 1, 2, fp) != 2)
|
|
|
|
return false;
|
|
|
|
len = htons(len);
|
|
|
|
char buffer[len];
|
|
|
|
if(fread(buffer, 1, len, fp) != len)
|
|
|
|
return false;
|
|
|
|
NavMonMessage nmm;
|
|
|
|
raw.assign(buffer, len);
|
|
|
|
nmm.ParseFromString(raw);
|
|
|
|
t.tv_sec = nmm.localutcseconds();
|
|
|
|
t.tv_nsec = nmm.localutcnanoseconds();
|
|
|
|
offset += 4 + 2 + len;
|
|
|
|
return true;
|
|
|
|
}
|