⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ogsinout.c

📁 OpenGPSSim是一个gps模拟程序
💻 C
字号:
/* ************************************************************************ 
   *                                                                      *
   *                          GPS Simulation                              *
   *                                                                      *
   * -------------------------------------------------------------------- *
   *                                                                      *
   *    Module:   ogsinout.cpp                                            *
   *                                                                      *
   *   Version:   0.1                                                     *
   *                                                                      *
   *      Date:   17.02.02                                                *
   *                                                                      *
   *    Author:   G. Beyerle                                              *
   *                                                                      *
   * -------------------------------------------------------------------- *
   *                                                                      *
   * Copyright (C) 2002  Georg Beyerle                                    *
   *                                                                      *
   * This program 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.                                  *
   *                                                                      *
   * This program 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.                         *
   *                                                                      *
   * You should have received a copy of the GNU General Public License    *
   * along with this program; if not, write to the Free Software          *
   * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.            *
   *                                                                      *
   * -------------------------------------------------------------------- *
   *                                                                      *
   * The files 'gpsfuncs.cpp', 'gpsrcvr.cpp' are modified versions of     *
   * the files with the same name from Clifford Kelley's OpenSourceGPS    *
   * distribution. The unmodified files can be obtained from              *
   *   http://www.home.earthlink.net/~cwkelley                            *
   *                                                                      *
   * -------------------------------------------------------------------- *
   *                                                                      *
   *                         I/O - Procedures                             *
   *                                                                      *
   ************************************************************************ */

/* ******************************* changes ********************************

   dd.mm.yy -

   ************************************************************************ */

/* ------------------------------- includes ------------------------------- */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <time.h>
#include <assert.h>

#include "ogsdefine.h"
#include "ogsstructs.h"
#include "ogsextern.h"
#include "ogsprototypes.h"
#include "ogslibrary.h"

/* ------------------------------- defines -------------------------------- */

#define OUTPUTBUFLEN      500
#define DATABUFLEN   5000000L    // 10 MB, size input data buffer

/* ------------------------------- globals -------------------------------- */

// output buffers and pointers
static long *OutputBufIQ[NOFSAT+1];
static int   OutputBufIQPos[NOFSAT+1];

static long *OutputBufCF[NOFSAT+1];
static int   OutputBufCFPos[NOFSAT+1];

// 32 file pointers for output files
FILE *FpIQ[NOFSAT+1],
     *FpCF[NOFSAT+1];
static FILE *FpNav[12];
FILE *FpIn;        // input file

extern char *InputFileName;
extern int OverWrite;

char *Buffer;      // data input buffer
long BufEnd;       // last position in data input buffer 


/* -------------------------- prototypen (global) ------------------------- */

/* ------------------------------ procedures ------------------------------ */

//
//  open output files
//
static void open_iq_outfile( int prn)
{
  char FileFmt[] = "iq-out-%02d";
  char File[sizeof( FileFmt)];      // d <= 2 digits!
  char *buf;

  assert( prn <= NOFSAT && prn >= 0);

  sprintf( File, FileFmt, prn);

  buf = conmalloc( strlen( OGSDataDir) + strlen( File) + 1);
  strcpy( buf, OGSDataDir);
  strcat( buf, File);

  if ( !OverWrite)
  {
    FpIQ[prn] = fopen( buf, "rb");
    if ( FpIQ[prn])
    {
      printf( "File '%s' already exists.\n", buf);
      exit(0);
    }
  }

  FpIQ[prn] = fopen( buf, "wb");
  if ( !FpIQ[prn])
  {
    printf( "Error opening file '%s'.\n", buf);
    exit(-1);
  }

  printf( "Opened file '%s'.\n", buf);
  return;
}

static void open_carfrq_outfile( int prn)
{
  char FileFmt[] = "carfrq-out-%02d";
  char File[sizeof( FileFmt)];      // d <= 2 digits!
  char *buf;

  assert( prn <= NOFSAT && prn >= 0);

  sprintf( File, FileFmt, prn);

  buf = conmalloc( strlen( OGSDataDir) + strlen( File) + 1);
  strcpy( buf, OGSDataDir);
  strcat( buf, File);

  if ( !OverWrite)
  {
    FpCF[prn] = fopen( buf, "rb");
    if ( FpCF[prn])
    {
      printf( "File '%s' already exists.\n", buf);
      exit(0);
    }
  }

  FpCF[prn] = fopen( buf, "wb");
  if ( !FpCF[prn])
  {
    printf( "Error opening file '%s'.\n", buf);
    exit(-1);
  }

  printf( "Opened file '%s'.\n", buf);
  return;
}

//
//
//
void close_open_files( void)
{
  int i;
  
  for (i=1; i<=NOFSAT; i++)
  {
    if ( FpIQ[i]) 
      fclose( FpIQ[i]);
    if ( FpCF[i]) 
      fclose( FpCF[i]);
  }

  for ( i=0; i<12; i++)
    if ( FpNav[i])
      fclose( FpNav[i]);

  return;
}

//
//  write data to files
//
void write_to_file_carfrq( long car_frq, int prn)
{
  int pos;
  
  if ( !OutputBufCF[prn])
  {
    OutputBufCF[prn] = (long*) conmalloc( sizeof( long)*OUTPUTBUFLEN);
    open_carfrq_outfile( prn);
  }  

  if ( OutputBufCFPos[prn] >= OUTPUTBUFLEN)
  {
    assert( FpCF[prn]);
    fwrite( OutputBufCF[prn], sizeof( long), OUTPUTBUFLEN, FpCF[prn]);
    OutputBufCFPos[prn] = 0;
  }

  pos = OutputBufCFPos[prn];

  assert( pos < OUTPUTBUFLEN);

  OutputBufCF[prn][pos]   = car_frq;
  OutputBufCFPos[prn] += 1;

  return;
}

void write_to_file_IQ( long Ip, long Qp, int prn)
{
  int pos;
  
  assert( prn <= NOFSAT && prn >= 0);
  
  if ( !OutputBufIQ[prn])
  {
    OutputBufIQ[prn] = (long*) conmalloc( 2*sizeof( long)*OUTPUTBUFLEN);
    open_iq_outfile( prn);
  }  

  if ( OutputBufIQPos[prn] >= 2*OUTPUTBUFLEN)
  {
    assert( FpIQ[prn]);
    fwrite( OutputBufIQ[prn], sizeof( long), 2*OUTPUTBUFLEN, FpIQ[prn]);
    OutputBufIQPos[prn] = 0;
  }

  pos = OutputBufIQPos[prn];
  
  assert( pos+1 < 2*OUTPUTBUFLEN);
  
  OutputBufIQ[prn][pos]   = Ip;
  OutputBufIQ[prn][pos+1] = Qp;
  OutputBufIQPos[prn] += 2;

  return;
}

//
// read GPS raw data from file
//
void update_readbuffer( void)
{
  assert( FpIn);

  BufEnd = fread( Buffer, sizeof( char), DATABUFLEN, FpIn);
  if ( BufEnd < DATABUFLEN)
  {
    fclose( FpIn);
    FpIn = NULL;
  }
  return;
}

//
// read GPS raw data from file
//
void init_inputbuffer( void)
{
  long Len;
  char infile[] = "ogsraw.dat";
  char *tmpstr, *ptr;

  if ( InputFileName)
    ptr = InputFileName;
  else  
    ptr = infile;

  tmpstr = conmalloc( strlen( OGSDataDir) + strlen( ptr) + 1);
  strcpy( tmpstr, OGSDataDir);
  strcat( tmpstr, ptr);
  
//  printf( "raw file = %s\n", ptr);
//  getchar();

//
//  read GPS raw data from file (file written by OGSXMIT)
//
  FpIn = fopen( tmpstr, "rb");
  if ( !FpIn)
  {
    printf( "Error opening data file '%s'.\n", tmpstr);
    exit(-1);
  }

  fseek( FpIn, 0L, SEEK_END);

  Len = ftell( FpIn);  

  fseek( FpIn, 0L, SEEK_SET);

  printf( "Reading %d bytes from data file\n '%s'.\n", 
    Len, tmpstr);

//  if ( Verbose)
//  {
//    printf( "... may take a while... press ENTER\n");
//    getchar();  
//  }
//  else
//  {
//    printf( "... may take a while...\n");
//  }  

  Buffer = conmalloc( DATABUFLEN * sizeof( char));

//  fread( Buffer, sizeof( char), BufferLen, Fp);
  BufEnd = fread( Buffer, sizeof( char), DATABUFLEN, FpIn);

//  fclose( Fp);
//  printf( "Read %d bytes from data file '%s'.\n", Len, tmpstr);

  if ( tmpstr)
    free( tmpstr);

  return;
}

//
//  write nav data to file
//
void write_to_file_navbit( int ch)
{
  int nof, ofs, one = 1, eno = -1;
  char NavFileFmt[] = "nav-out-%02d";
  char NavFile[sizeof( NavFileFmt)];      // d <= 2 digits!
  char *buf = NULL;

  if ( !FpNav[ch])
  {
    sprintf( NavFile, NavFileFmt, chan[ch].prn);
    buf = conmalloc( strlen( OGSDataDir) + strlen( NavFile) + 1);
    strcpy( buf, OGSDataDir);
    strcat( buf, NavFile);

    if ( !OverWrite)
    {
      FpNav[ch] = fopen( buf, "rb");
      if ( FpNav[ch])
      {
        printf( "File '%s' already exists.\n", buf);
        exit( 0);
      }
    }

    FpNav[ch] = fopen( buf, "wb");
    if ( !FpNav)
    {
      printf( "Error opening file '%s'.\n", buf);
      exit(-1);
    }
    printf( "Opened file '%s'.\n", buf);
    if ( buf)
      free( buf);
  }

  fwrite( ((chan[ch].bit==1)?&one:&eno), sizeof( char), 1, FpNav[ch]);
    
  return;
}

/* ------------------------------ end of file ----------------------------- */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -