Skip to content

Commit

Permalink
Merged ERB protocol output format
Browse files Browse the repository at this point in the history
  • Loading branch information
egorf committed Aug 10, 2016
2 parents 5e6213b + 8069c17 commit bae7dac
Show file tree
Hide file tree
Showing 9 changed files with 327 additions and 10 deletions.
5 changes: 4 additions & 1 deletion app/pos2kml/gcc/makefile
Expand Up @@ -5,12 +5,14 @@ SRC = ../../../src
CFLAGS = -Wall -O3 -ansi -pedantic -I$(SRC) -DTRACE
LDLIBS = -lm -lrt

pos2kml : pos2kml.o convkml.o convgpx.o solution.o geoid.o rtkcmn.o preceph.o
pos2kml : pos2kml.o convkml.o erb.o convgpx.o solution.o geoid.o rtkcmn.o preceph.o

pos2kml.o : ../pos2kml.c
$(CC) -c $(CFLAGS) ../pos2kml.c
convkml.o : $(SRC)/convkml.c
$(CC) -c $(CFLAGS) $(SRC)/convkml.c
erb.o : $(SRC)/erb.c
$(CC) -c $(CFLAGS) $(SRC)/erb.c
convgpx.o : $(SRC)/convgpx.c
$(CC) -c $(CFLAGS) $(SRC)/convgpx.c
solution.o : $(SRC)/solution.c
Expand All @@ -24,6 +26,7 @@ preceph.o : $(SRC)/preceph.c

pos2kml.o : $(SRC)/rtklib.h
convkml.o : $(SRC)/rtklib.h
erb.o : $(SRC)/rtklib.h
convgpx.o : $(SRC)/rtklib.h
solution.o : $(SRC)/rtklib.h
geoid.o : $(SRC)/rtklib.h
Expand Down
5 changes: 4 additions & 1 deletion app/rnx2rtkp/gcc/makefile
Expand Up @@ -24,7 +24,7 @@ LDLIBS = -lm -lrt
#LDLIBS = -L$(MKLDIR)/intel64 -lmkl_intel_lp64 -lmkl_core -lmkl_gnu_thread -lpthread -lgomp -lm -lrt

all : rnx2rtkp
rnx2rtkp : rnx2rtkp.o rtkcmn.o rinex.o rtkpos.o postpos.o solution.o
rnx2rtkp : rnx2rtkp.o rtkcmn.o rinex.o rtkpos.o postpos.o erb.o solution.o
rnx2rtkp : lambda.o geoid.o sbas.o preceph.o pntpos.o ephemeris.o options.o
rnx2rtkp : ppp.o ppp_ar.o ppp_corr.o rtcm.o rtcm2.o rtcm3.o rtcm3e.o ionex.o tides.o qzslex.o

Expand All @@ -38,6 +38,8 @@ rtkpos.o : $(SRC)/rtkpos.c
$(CC) -c $(CFLAGS) $(SRC)/rtkpos.c
postpos.o : $(SRC)/postpos.c
$(CC) -c $(CFLAGS) $(SRC)/postpos.c
erb.o : $(SRC)/erb.c
$(CC) -c $(CFLAGS) $(SRC)/erb.c
solution.o : $(SRC)/solution.c
$(CC) -c $(CFLAGS) $(SRC)/solution.c
lambda.o : $(SRC)/lambda.c
Expand Down Expand Up @@ -80,6 +82,7 @@ rtkcmn.o : $(SRC)/rtklib.h
rinex.o : $(SRC)/rtklib.h
rtkpos.o : $(SRC)/rtklib.h
postpos.o : $(SRC)/rtklib.h
erb.o : $(SRC)/rtklib.h
solution.o : $(SRC)/rtklib.h
lambda.o : $(SRC)/rtklib.h
geoid.o : $(SRC)/rtklib.h
Expand Down
5 changes: 4 additions & 1 deletion app/rtkrcv/gcc/makefile
Expand Up @@ -11,7 +11,7 @@ CFLAGS = -Wall -O3 -ansi -pedantic -Wno-unused-but-set-variable -I$(SRC) -I.. -D
LDLIBS = -lm -lrt -lpthread

all : rtkrcv
rtkrcv : rtkrcv.o vt.o rtkcmn.o rtksvr.o rtkpos.o geoid.o solution.o lambda.o
rtkrcv : rtkrcv.o vt.o rtkcmn.o rtksvr.o rtkpos.o geoid.o erb.o solution.o lambda.o
rtkrcv : sbas.o stream.o rcvraw.o rtcm.o preceph.o options.o pntpos.o ppp.o ppp_ar.o
rtkrcv : novatel.o ublox.o ss2.o crescent.o skytraq.o gw10.o javad.o nvs.o binex.o
rtkrcv : rt17.o ephemeris.o rinex.o ionex.o rtcm2.o rtcm3.o rtcm3e.o qzslex.o
Expand All @@ -29,6 +29,8 @@ rtkpos.o : $(SRC)/rtkpos.c
$(CC) -c $(CFLAGS) $(SRC)/rtkpos.c
geoid.o : $(SRC)/geoid.c
$(CC) -c $(CFLAGS) $(SRC)/geoid.c
erb.o : $(SRC)/erb.c
$(CC) -c $(CFLAGS) $(SRC)/erb.c
solution.o : $(SRC)/solution.c
$(CC) -c $(CFLAGS) $(SRC)/solution.c
lambda.o : $(SRC)/lambda.c
Expand Down Expand Up @@ -99,6 +101,7 @@ rtkcmn.o : $(SRC)/rtklib.h
rtksvr.o : $(SRC)/rtklib.h
rtkpos.o : $(SRC)/rtklib.h
geoid.o : $(SRC)/rtklib.h
erb.o : $(SRC)/rtklib.h
solution.o : $(SRC)/rtklib.h
lambda.o : $(SRC)/rtklib.h
sbas.o : $(SRC)/rtklib.h
Expand Down
2 changes: 1 addition & 1 deletion app/rtkrcv/rtkrcv.c
Expand Up @@ -143,7 +143,7 @@ static const char *pathopts[]={ /* path options help */
#define OSTOPT "0:off,1:serial,2:file,3:tcpsvr,4:tcpcli,6:ntripsvr"
#define FMTOPT "0:rtcm2,1:rtcm3,2:oem4,3:oem3,4:ubx,5:ss2,6:hemis,7:skytraq,8:gw10,9:javad,10:nvs,11:binex,12:rt17,13:sbf,14:cmr,17:sp3"
#define NMEOPT "0:off,1:latlon,2:single"
#define SOLOPT "0:llh,1:xyz,2:enu,3:nmea,4:stat"
#define SOLOPT "0:llh,1:xyz,2:enu,3:nmea,4:stat,6:erb"
#define MSGOPT "0:all,1:rover,2:base,3:corr"

static opt_t rcvopts[]={
Expand Down
5 changes: 4 additions & 1 deletion app/str2str/gcc/makefile
Expand Up @@ -12,7 +12,7 @@ CFLAGS = -Wall -O3 -ansi -pedantic -Wno-unused-but-set-variable -I$(SRC) $(OPTIO
LDLIBS = -lm -lrt -lpthread

all : str2str
str2str : str2str.o stream.o rtkcmn.o solution.o sbas.o geoid.o
str2str : str2str.o stream.o rtkcmn.o erb.o solution.o sbas.o geoid.o
str2str : rcvraw.o novatel.o ublox.o ss2.o crescent.o skytraq.o gw10.o javad.o
str2str : nvs.o binex.o rt17.o rtcm.o rtcm2.o rtcm3.o rtcm3e.o preceph.o streamsvr.o
str2str : septentrio.o cmr.o
Expand All @@ -25,6 +25,8 @@ streamsvr.o: $(SRC)/streamsvr.c
$(CC) -c $(CFLAGS) $(SRC)/streamsvr.c
rtkcmn.o : $(SRC)/rtkcmn.c
$(CC) -c $(CFLAGS) $(SRC)/rtkcmn.c
erb.o : $(SRC)/erb.c
$(CC) -c $(CFLAGS) $(SRC)/erb.c
solution.o : $(SRC)/solution.c
$(CC) -c $(CFLAGS) $(SRC)/solution.c
sbas.o : $(SRC)/sbas.c
Expand Down Expand Up @@ -72,6 +74,7 @@ str2str.o : $(SRC)/rtklib.h
stream.o : $(SRC)/rtklib.h
streamsvr.o: $(SRC)/rtklib.h
rtkcmn.o : $(SRC)/rtklib.h
erb.o : $(SRC)/rtklib.h
solution.o : $(SRC)/rtklib.h
sbas.o : $(SRC)/rtklib.h
geoid.o : $(SRC)/rtklib.h
Expand Down
261 changes: 261 additions & 0 deletions src/erb.c
@@ -0,0 +1,261 @@
/*------------------------------------------------------------------------------
* erb.c : output solution in the form of ERB protocol
*-----------------------------------------------------------------------------*/
#include <stdint.h>
#include "rtklib.h"

/* math ----------------------------------------------------------------------*/
#define SQRT(x) ((x) < 0.0 ? 0.0 : sqrt(x))

/* definitions for ERB protocol ----------------------------------------------*/
#define ERB_SYNC_CHAR1 0x45 /* erb message sync code 1 */
#define ERB_SYNC_CHAR2 0x52 /* erb message sync code 2 */
#define ID_VER 0x01 /* message id ERB-VER */
#define ID_POS 0x02 /* message id ERB-POS */
#define ID_STAT 0x03 /* message id ERB-STAT */
#define ID_DOPS 0x04 /* message id ERB-DOPS */
#define ID_VEL 0x05 /* message id ERB-VEL */
#define ID_SVI 0x06 /* message id ERB-SVI */
#define LENGTH_VER 7 /* length of payload ERB-VER message */
#define LENGTH_POS 28 /* length of payload ERB-POS message */
#define LENGTH_STAT 9 /* length of payload ERB-STAT message */
#define LENGTH_DOPS 12 /* length of payload ERB-DOPS message */
#define LENGTH_VEL 28 /* length of payload ERB-VEL message */
#define LENGTH_SVI_HEAD 5 /* length of head of payload ERB-SVI message */
#define LENGTH_SVI_SV 20 /* length of 1 SV information in ERB-SVI message */
#define VERSION_HIGH 0 /* High level of version */
#define VERSION_MEDIUM 1 /* Medium level of version */
#define VERSION_LOW 0 /* Low level of version */

/* structures for ERB protocol -----------------------------------------------*/
struct erb_ver {
uint32_t timeGPS;
uint8_t verH;
uint8_t verM;
uint8_t verL;
} __attribute__((packed));
struct erb_pos {
uint32_t timeGPS;
int32_t lng;
int32_t lat;
int32_t altEl;
int32_t altMsl;
uint32_t accHor;
uint32_t accVer;
} __attribute__((packed));
struct erb_stat {
uint32_t timeGPS;
uint16_t weekGPS;
uint8_t fixType;
uint8_t fixStatus;
uint8_t numSV;
} __attribute__((packed));
struct erb_dops {
uint32_t timeGPS;
uint16_t dopGeo;
uint16_t dopPos;
uint16_t dopVer;
uint16_t dopHor;
} __attribute__((packed));
struct erb_vel {
uint32_t timeGPS;
int32_t velN;
int32_t velE;
int32_t velD;
uint32_t speed;
int32_t heading;
uint32_t accS;
} __attribute__((packed));
struct erb_svi_head {
uint32_t timeGPS;
uint8_t nSV;
} __attribute__((packed));
struct erb_svi_sat {
uint8_t idSV;
uint8_t typeSV;
int32_t carPh;
int32_t psRan;
int32_t freqD;
uint16_t snr;
uint16_t azim;
uint16_t elev;
} __attribute__((packed));

/* calculate checksum for ERB protocol ---------------------------------------*/
static void calculatesum(const char *buff, int len, unsigned char *cka,
unsigned char *ckb)
{
int i;
*cka=0;
*ckb=0;
for (i=2;i<len;i++) {
*cka += buff[i];
*ckb += *cka;
}
}
/* build ERB-VER -------------------------------------------------------------*/
static void buildver(char *payload, struct erb_ver version, const uint32_t time,
const uint8_t verH, const uint8_t verM, const uint8_t verL)
{
version.timeGPS = time;
version.verH = verH;
version.verM = verM;
version.verL = verL;
memcpy(payload, &version, LENGTH_VER);
}
/* build ERB-POS -------------------------------------------------------------*/
static void buildpos(char *payload, struct erb_pos position, const uint32_t time,
const sol_t *sol)
{
float stdX,stdY,stdZ;
double pos[3];

ecef2pos(sol->rr, pos);
/* if fix or float, then get std X/Y/Z */
stdX = (sol->stat == SOLQ_FIX || sol->stat == SOLQ_FLOAT) ? SQRT(sol->qr[0]) : 0;
stdY = (sol->stat == SOLQ_FIX || sol->stat == SOLQ_FLOAT) ? SQRT(sol->qr[1]) : 0;
stdZ = (sol->stat == SOLQ_FIX || sol->stat == SOLQ_FLOAT) ? SQRT(sol->qr[2]) : 0;

position.timeGPS = time;
position.lng = pos[1] * R2D * 1e7;
position.lat = pos[0] * R2D * 1e7;
position.altEl = pos[2] * 1e3;
position.altMsl = position.altEl;
position.accHor = 1000 * SQRT(stdX * stdX + stdY * stdY);
position.accVer = 1000 * stdZ;
memcpy(payload, &position, LENGTH_POS);
}
/* build ERB-STAT message ----------------------------------------------------*/
static void buildstat(char *payload, struct erb_stat status, const uint32_t time,
const uint16_t week, const sol_t *sol)
{
uint8_t fixStatus,fixType;

if (sol->stat == SOLQ_SINGLE) {
fixStatus = 0x01;
fixType = 0x01;
} else if (sol->stat == SOLQ_FLOAT) {
fixStatus = 0x01;
fixType = 0x02;
} else if (sol->stat == SOLQ_FIX) {
fixStatus = 0x01;
fixType = 0x03;
} else {
fixStatus = 0x00;
fixType = 0x00;
}

status.timeGPS = time;
status.weekGPS = week;
status.fixType = fixType;
status.fixStatus = fixStatus;
status.numSV = sol->ns;
memcpy(payload, &status, LENGTH_STAT);
}
/* build ERB-DOPS message ----------------------------------------------------*/
static void builddops(char *payload, struct erb_dops dops, const uint32_t time,
const sol_t *sol)
{
dops.timeGPS = time;
dops.dopGeo = 100 * sol->dop[0];
dops.dopPos = 100 * sol->dop[1];
dops.dopVer = 100 * sol->dop[2];
dops.dopHor = 100 * sol->dop[3];
memcpy(payload, &dops, LENGTH_DOPS);
}
/* build ERB-VEL message -----------------------------------------------------*/
static void buildvel(char *payload, struct erb_vel velocity, const uint32_t time,
const sol_t *sol)
{
double pos[3],vel[3];

ecef2pos(sol->rr, pos);
ecef2enu(pos, sol->rr+3, vel);

velocity.timeGPS = time;
velocity.velN = 100 * vel[1];
velocity.velE = 100 * vel[0];
velocity.velD = 100 * -vel[2];
velocity.speed = 100 * SQRT(vel[0] * vel[0] + vel[1] * vel[1]);
velocity.heading = atan2(vel[1],vel[0]) * R2D * 1e5;
velocity.accS = 0x00;
memcpy(payload, &velocity, LENGTH_VEL);
}
/* build ERB-SVI message -----------------------------------------------------*/
static int buildsvi(char *payload, struct erb_svi_head sviHead, struct erb_svi_sat *sviSat,
const uint32_t time, const sol_t *sol)
{
int i=0,nSV=sol->nSV;

sviHead.timeGPS = time;
sviHead.nSV = nSV;
memcpy(payload, &sviHead, LENGTH_SVI_HEAD);

for (i=0;i<nSV;i++) {
sviSat[i].idSV = sol->idSV[i];
sviSat[i].typeSV = sol->typeSV[i];
sviSat[i].carPh = sol->carPh[i] * 1e2;
sviSat[i].psRan = sol->psRan[i];
sviSat[i].freqD = sol->freqD[i] * 1e3;
sviSat[i].snr = sol->snr[i];
sviSat[i].azim = sol->azim[i] * 1e1;
sviSat[i].elev = sol->elev[i] * 1e1;
}
memcpy(payload+LENGTH_SVI_HEAD, &sviSat, nSV*LENGTH_SVI_SV);

return (LENGTH_SVI_HEAD + nSV * LENGTH_SVI_SV);
}
/* append message ------------------------------------------------------------*/
static void appendmessage(char **p, const char mesID, const char *payload, const int length)
{
unsigned char cka=0,ckb=0;
*p += sprintf(*p, "%c%c", ERB_SYNC_CHAR1, ERB_SYNC_CHAR2);
*p += sprintf(*p, "%c", mesID);
*p += sprintf(*p, "%c%c", length, 0x00);
memcpy(*p, payload, length);
*p += length;
calculatesum(*p-(length+5), length+5, &cka, &ckb);
*p += sprintf(*p, "%c%c", cka, ckb);
}
/* output solution in the form of ERB protocol -------------------------------*/
extern int outerb(unsigned char *buff, const sol_t *sol)
{
gtime_t time;
char *p=(char *)buff;
char payload[256];
struct erb_ver version;
struct erb_pos position;
struct erb_stat status;
struct erb_dops dops;
struct erb_vel velocity;
struct erb_svi_head sviHead;
struct erb_svi_sat sviSat[32];
uint32_t gpst;
int week, lengthSvi;

trace(3,"outerb:\n");

time = sol->time;
gpst = time2gpst(time, &week);

/*-------------- ERB-VER -----------------------*/
buildver(payload, version, gpst, VERSION_HIGH, VERSION_MEDIUM, VERSION_LOW);
appendmessage(&p, ID_VER, payload, LENGTH_VER);
/*-------------- ERB-POS -----------------------*/
buildpos(payload, position, gpst, sol);
appendmessage(&p, ID_POS, payload, LENGTH_POS);
/*------------ ERB-STAT ----------------------*/
buildstat(payload, status, gpst, week, sol);
appendmessage(&p, ID_STAT, payload, LENGTH_STAT);
/*------------ ERB-DOPS ------------------------*/
builddops(payload, dops, gpst, sol);
appendmessage(&p, ID_DOPS, payload, LENGTH_DOPS);
/*------------ ERB-VEL --------------------*/
buildvel(payload, velocity, gpst, sol);
appendmessage(&p, ID_VEL, payload, LENGTH_VEL);
/*------------ ERB-SVI --------------------*/
lengthSvi = buildsvi(payload, sviHead, sviSat, gpst, sol);
appendmessage(&p, ID_SVI, payload, lengthSvi);

return p - (char *)buff;
}

0 comments on commit bae7dac

Please sign in to comment.