mirror of
https://github.com/gnss-sdr/gnss-sdr
synced 2024-12-14 12:10:34 +00:00
b849b20a8c
- Added a pre-compiled custom GN3S firmware. - Added a fully-compliant GNU Radio source block for GN3S USB dongle. It can be used also from GNU Radio companion and from Python applications. - Added a new GN3S_Signal_Source block. It is possible to disable the GN3S signal source compilation. See README. git-svn-id: https://svn.code.sf.net/p/gnss-sdr/code/trunk@217 64b25241-fba3-4117-9849-534c7e92360d
234 lines
6.2 KiB
C++
234 lines
6.2 KiB
C++
/*----------------------------------------------------------------------------------------------*/
|
|
/*! \file gps_source.cpp
|
|
//
|
|
// FILENAME: gps_source.cpp
|
|
//
|
|
// DESCRIPTION: Implements member functions of the GPS_Source class.
|
|
//
|
|
// DEVELOPERS: Gregory W. Heckler (2003-2009), Javier Arribas (2012)
|
|
//
|
|
// LICENSE TERMS: Copyright (c) Gregory W. Heckler 2009
|
|
//
|
|
// This file is part of the GPS Software Defined Radio (GPS-SDR)
|
|
//
|
|
// The GPS-SDR is free software; you can redistribute it and/or modify it under the terms of the
|
|
// GNU General Public License as published by the Free Software Foundation; either version 2 of
|
|
// the License, or (at your option) any later version. The GPS-SDR is distributed in the hope that
|
|
// it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
// more details.
|
|
//
|
|
// Note: Comments within this file follow a syntax that is compatible with
|
|
// DOXYGEN and are utilized for automated document extraction
|
|
//
|
|
// Reference:
|
|
*/
|
|
/*----------------------------------------------------------------------------------------------*/
|
|
|
|
|
|
#include "gn3s_source.h"
|
|
#include <time.h>
|
|
|
|
|
|
/*----------------------------------------------------------------------------------------------*/
|
|
gn3s_Source::gn3s_Source()
|
|
{
|
|
|
|
Open_GN3S();
|
|
|
|
overflw = soverflw = 0;
|
|
agc_scale = 1;
|
|
|
|
/* Assign to base */
|
|
ms_count = 0;
|
|
flag_first_read=true;
|
|
fprintf(stdout,"Creating GPS Source\n");
|
|
|
|
}
|
|
/*----------------------------------------------------------------------------------------------*/
|
|
|
|
|
|
/*----------------------------------------------------------------------------------------------*/
|
|
gn3s_Source::~gn3s_Source()
|
|
{
|
|
|
|
Close_GN3S();
|
|
fprintf(stdout,"Destructing GPS Source\n");
|
|
}
|
|
/*----------------------------------------------------------------------------------------------*/
|
|
|
|
|
|
/*----------------------------------------------------------------------------------------------*/
|
|
void gn3s_Source::Read(gn3s_ms_packet *_p,int n_samples)
|
|
{
|
|
|
|
Read_GN3S(_p,n_samples);
|
|
ms_count++;
|
|
|
|
}
|
|
/*----------------------------------------------------------------------------------------------*/
|
|
|
|
|
|
/*----------------------------------------------------------------------------------------------*/
|
|
void gn3s_Source::Open_GN3S()
|
|
{
|
|
|
|
|
|
/* Create the object */
|
|
gn3s_a = new gn3s(0);
|
|
|
|
|
|
/* Everything is super! */
|
|
//fprintf(stdout,"GN3S Start\n");
|
|
|
|
}
|
|
/*----------------------------------------------------------------------------------------------*/
|
|
|
|
|
|
/*----------------------------------------------------------------------------------------------*/
|
|
void gn3s_Source::Close_GN3S()
|
|
{
|
|
|
|
if(gn3s_a != NULL) delete gn3s_a;
|
|
//fprintf(stdout,"Destructing GN3S\n");
|
|
|
|
}
|
|
/*----------------------------------------------------------------------------------------------*/
|
|
|
|
|
|
|
|
/*----------------------------------------------------------------------------------------------*/
|
|
void gn3s_Source::Read_GN3S(gn3s_ms_packet *_p,int n_samples)
|
|
{
|
|
|
|
int bread;
|
|
int started=0;
|
|
int check;
|
|
bool overrun;
|
|
|
|
short int LUT4120[2] = {1,-1};
|
|
char shift = 0;
|
|
char endshift = 0;
|
|
|
|
short int *pbuff;
|
|
|
|
int BUFSIZE=n_samples*2;
|
|
|
|
if (flag_first_read==true)
|
|
{
|
|
/* Start transfer */
|
|
while(!started)
|
|
{
|
|
usleep(100);
|
|
started = gn3s_a->usrp_xfer(VRQ_XFER, 1);
|
|
}
|
|
fprintf(stdout,"started TX\n");
|
|
flag_first_read=false;
|
|
}
|
|
|
|
/* Check the overrun */
|
|
overrun = gn3s_a->check_rx_overrun();
|
|
if(overrun)
|
|
{
|
|
time(&rawtime);
|
|
timeinfo = localtime (&rawtime);
|
|
fprintf(stdout, "GN3S overflow at time %s\n", asctime(timeinfo));
|
|
fflush(stdout);
|
|
}
|
|
|
|
|
|
/* Read 5 ms */
|
|
bread = gn3s_a->read((void *)&gbuff[0], BUFSIZE);
|
|
// FUSB Read...
|
|
//ret = fx2c.d_ephandle->read (buf, bufsize);
|
|
|
|
if (bread != BUFSIZE) {
|
|
fprintf (stderr, "fusb_read: ret = %d (bufsize: %d) \n", bread, BUFSIZE);
|
|
fprintf (stderr, "%s\n", usb_strerror());
|
|
}
|
|
|
|
// Store IF data as 8bit signed values
|
|
pbuff = (short int *)&buff[0];
|
|
/* Make sure we are reading I0,Q0,I1,Q1,I2,Q2.... etc */
|
|
if ((gbuff[0] & 0x2) == 2) //if true, we don't have to shift data
|
|
{ shift = 0; }
|
|
else
|
|
{ shift = 1; }
|
|
|
|
if ((gbuff[BUFSIZE-1] & 0x02) == 0) //if true, we don't drop last data byte
|
|
{ endshift = 0; }
|
|
else
|
|
{ endshift = 1; }
|
|
|
|
for (int j=0;j<BUFSIZE;j++)
|
|
{
|
|
if (shift == 1)
|
|
{
|
|
if ((j == (BUFSIZE-1)) && (endshift == 0))
|
|
{ pbuff[j] = 0; }
|
|
else if ((j == (BUFSIZE-1)) && (endshift == 1))
|
|
{ pbuff[j-1] = 0; }
|
|
else
|
|
{
|
|
//printf("%i.",j);
|
|
pbuff[j] = LUT4120[gbuff[j+1] & 0x1];
|
|
}
|
|
} else if (shift == 0)
|
|
{
|
|
if ((j == (BUFSIZE-1)) && (endshift == 1))
|
|
{ pbuff[j] = 0; }
|
|
else
|
|
{ pbuff[j] = LUT4120[gbuff[j] & 0x1]; }
|
|
|
|
}
|
|
}
|
|
/* Copy to destination */
|
|
memcpy(_p->data, pbuff, n_samples*sizeof(GN3S_CPX));
|
|
|
|
}
|
|
|
|
// gregory way... with CUSTOM firmware!
|
|
//if (flag_first_read==true)
|
|
//{
|
|
// /* Start transfer */
|
|
// while(!started)
|
|
// {
|
|
// usleep(100);
|
|
// started = gn3s_a->usrp_xfer(VRQ_XFER, 1);
|
|
// }
|
|
// fprintf(stdout,"started TX\n");
|
|
// /* Make sure we are reading I0,Q0,I1,Q1,I2,Q2.... etc */
|
|
// bread = gn3s_a->read((void*)(&gbuff[0]),1);
|
|
// //fprintf(stdout,"R1\n");
|
|
// check = (gbuff[0] & 0x3); //0 or 1 -> I sample , 2 or 3 -> Q sample
|
|
// if(check < 2)
|
|
// {
|
|
// fprintf(stdout,"Shifted one sample");
|
|
// bread = gn3s_a->read((void*)(&gbuff[0]),1);
|
|
// }
|
|
// //fprintf(stdout,"R2\n");
|
|
// flag_first_read=false;
|
|
//}else{
|
|
//
|
|
// pbuff = (short int *)&buff[0];
|
|
//
|
|
// /* Read up to 5 ms */
|
|
// bread = gn3s_a->read((void *)&gbuff[0], n_samples*2);
|
|
//
|
|
// /* Convert to +-1 using Look Up Table*/
|
|
// for(lcv = 0; lcv < (n_samples*2); lcv++)
|
|
// pbuff[lcv] = LUT[gbuff[lcv] & 0x3];
|
|
//
|
|
// /* Check the overrun */
|
|
// overrun = gn3s_a->check_rx_overrun();
|
|
// if(overrun)
|
|
// {
|
|
// time(&rawtime);
|
|
// timeinfo = localtime (&rawtime);
|
|
// fprintf(stdout, "GN3S overflow at time %s\n", asctime(timeinfo));
|
|
// fflush(stdout);
|
|
// }
|
|
//}
|
|
///* Copy to destination */
|
|
//memcpy(_p->data, pbuff, n_samples*sizeof(GN3S_CPX));
|