#include "gps.hh" // this strips out spare bits + parity, and leaves 10 clean 24 bit words std::basic_string getCondensedGPSMessage(std::basic_string_view payload) { uint8_t buffer[10*24/8]; for(int w = 0 ; w < 10; ++w) { setbitu(buffer, 24*w, 24, getbitu(&payload[0], 2 + w*32, 24)); } return std::basic_string(buffer, 30); } // expects input as 24 bit read to to use messages, returns frame number int GPSState::parseGPSMessage(std::basic_string_view cond, uint8_t* pageptr) { using namespace std; int frame = getbitu(&cond[0], 24+19, 3); // 10 * 4 bytes in payload now tow = 1.5*(getbitu(&cond[0], 24, 17)*4); // cerr << "Preamble: "< 56 // page 25 -> 63 // 2-10 -> 25 -> 32 ?? } if(frame == 5 || frame==4) { // this is a caroussel frame gpsalma.dataid = getbitu(&cond[0], 2*24, 2); gpsalma.sv = getbitu(&cond[0], 2*24+2, 6); if(pageptr) *pageptr= gpsalma.sv; gpsalma.e = getbitu(&cond[0], 2*24 + 8, 16); gpsalma.t0a = getbitu(&cond[0], 3*24, 8); gpsalma.deltai = getbits(&cond[0], 3*24 +8 , 16); gpsalma.omegadot = getbits(&cond[0], 4*24, 16); gpsalma.health = getbitu(&cond[0], 4*24 +16, 8); gpsalma.sqrtA = getbitu(&cond[0], 5*24, 24); gpsalma.Omega0 = getbits(&cond[0], 6*24, 24); gpsalma.omega = getbits(&cond[0], 7*24, 24); gpsalma.M0 = getbits(&cond[0], 8*24, 24); gpsalma.af0 = (getbits(&cond[0], 9*24, 8) << 3) + getbits(&cond[0], 9*24 +19, 3); gpsalma.af1 = getbits(&cond[0], 9*24 + 8, 11); // cerr<<"Frame 5, SV: "<