<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>matlab/matlab.mat</filename>
    </added>
    <added>
      <filename>matlab/rf_data_plot.m</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -171,40 +171,6 @@ void wipeoff_gen(MIX *_dest, double _f, double _fs, int32 _samps)
 
 
 /*----------------------------------------------------------------------------------------------*/
-/*!
- * resample, resample a vector where _samps is from _dest
- * */
-void resample(CPX *_dest, CPX *_source, double _fdest, double _fsource, int32 _samps)
-{
-//
-//	int32 lcv, k;
-//	float phase, phase_step;
-//
-//	uint32 phase_step;
-//	uint32 phase;
-//
-//	phase_step = 0xffffffff/_fsource;
-//	phase_step *= _fdest;
-//
-//	for(lcv = 0; lcv &lt; _samps; lcv++)
-//	{
-//		/* Take advantage of addition rollover */
-//		phase += phase_step;
-//
-//		if(phase &lt; lphase)
-//			_dest[k] = _source[lcv];
-//
-//
-//		k = (int32) floor(phase);
-//
-//		phase += phase_step;
-	//}
-
-}
-/*----------------------------------------------------------------------------------------------*/
-
-
-/*----------------------------------------------------------------------------------------------*/
 void downsample(CPX *_dest, CPX *_source, double _fdest, double _fsource, int32 _samps)
 {
 
@@ -257,30 +223,35 @@ int32 round_2(int32 _N)
 /*!
  * Gather statistics and run AGC
  * */
-int32 run_agc(CPX *_buff, int32 _samps, int32 bits, int32 scale)
+int32 run_agc(CPX *_buff, int32 _samps, int32 _bits, int32 _scale)
 {
 	int32 lcv, num;
 	int16 max, *p;
-	int16 lscale;
-	int16 shift;
 	int16 val;
 
 	p = (int16 *)&amp;_buff[0];
 
-	/* Get rid of the divide, replace with a multiply to scale to 2^15, then right shift to get
-	 * back into AGC_BITS of magnitude */
-//	lscale = (1 &lt;&lt; 14) / scale;
-//	shift = 14 - bits;
-	max = 1 &lt;&lt; bits;
+	val = (1 &lt;&lt; _scale - 1);
+	max = 1 &lt;&lt; _bits;
 	num = 0;
 
-//	x86_muls((int16 *)_buff, &amp;lscale, 2*_samps, shift);
-
-	for(lcv = 0; lcv &lt; 2*_samps; lcv++)
+	if(_scale)
+	{
+		for(lcv = 0; lcv &lt; 2*_samps; lcv++)
+		{
+			p[lcv] += val;
+			p[lcv] &gt;&gt;= _scale;
+			if(abs(p[lcv]) &gt; max)
+				num++;
+		}
+	}
+	else
 	{
-		p[lcv] &gt;&gt;= 7;
-		if(abs(p[lcv]) &gt; max)
-			num++;
+		for(lcv = 0; lcv &lt; 2*_samps; lcv++)
+		{
+			if(abs(p[lcv]) &gt; max)
+				num++;
+		}
 	}
 
 	return(num);</diff>
      <filename>accessories/misc.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -9,9 +9,9 @@ INCPATH	=	-I. \
 			-I../includes \
 			-I../objects
 
-WX_FLAGS = `wx-config --libs` 
+WX_FLAGS = `wx-config --libs`
 LDFLAGS	 = -lpthread
-CFLAGS   = -D_FORTIFY_SOURCE=0 `wx-config --cxxflags` -g3 $(INCPATH) 
+CFLAGS   = -D_FORTIFY_SOURCE=0 `wx-config --cxxflags` $(INCPATH) 
 
 SRC = $(wildcard src/*.cpp)
 SRC += gui_classes.cpp</diff>
      <filename>gse/Makefile</filename>
    </modified>
    <modified>
      <diff></diff>
      <filename>gse/gps-gse</filename>
    </modified>
    <modified>
      <diff>@@ -67,6 +67,7 @@ class GUI_Serial : public Threaded_Object
 		uint32					command_sent;				//!&lt; Flag to indicate command was transmitted
 		uint32					command_ack;				//!&lt; Flag to indicate command was executed
 		uint32					command_count;				//!&lt; Used to detect a command ack
+		uint8 					packet_body[2048];			//!&lt; Complete packet body
 
 		Message_Struct			messages;					//!&lt; Hold all the messages
 		Message_Union			message_body;				//!&lt; Union for messages</diff>
      <filename>gse/include/gui_serial.h</filename>
    </modified>
    <modified>
      <diff>@@ -94,7 +94,7 @@ void GUI_Channel::render(wxDC&amp; dc)
 
 		tChannel-&gt;SetDefaultStyle(style);
 
-		if(pchan-&gt;count &gt; 2000)
+		if(pchan-&gt;count &gt; 1000)
 		{
 
 			str2.Clear();</diff>
      <filename>gse/src/gui_channel.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -23,6 +23,34 @@ Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1
 #include &quot;gui_serial.h&quot;
 #define SWAP64(X) *((long long *)(&amp;X)) = (((*((long long *)(&amp;X)) &amp; (0x00000000ffffffffLLU)) &lt;&lt; 32) | ((*((long long *)(&amp;X)) &amp; (0xffffffff00000000LLU)) &gt;&gt; 32))
 
+/*----------------------------------------------------------------------------------------------*/
+#define MOD_ADLER 65521
+/* Data is input buffer, len is in bytes! */
+uint32 adler(uint8 *data, int32 len)
+{
+
+    uint32 a, b;
+    int32 tlen;
+
+    a = 1; b = 0;
+
+    if(len &lt; 5552)
+    {
+        do
+        {
+            a += *data++;
+            b += a;
+        } while (--len);
+
+        a %= MOD_ADLER;
+        b %= MOD_ADLER;
+    }
+
+    return (b &lt;&lt; 16) | a;
+
+}
+/*----------------------------------------------------------------------------------------------*/
+
 static uint32 SIZEOF_M[LAST_M_ID + 1] =
 {
 	0,
@@ -373,21 +401,30 @@ void endian_swap(void *_b, int32 _bytes, int32 _flag)
 int GUI_Serial::Read(void *_b, int32 _bytes)
 {
 
-	int32 nbytes, bread;
+	int32 nbytes, bread, k;
 	uint8 *buff;
 
-	nbytes = 0; bread = 0;
+	k = 0; nbytes = 0; bread = 0;
 	buff = (uint8 *)_b;
 
 	while((nbytes &lt; _bytes) &amp;&amp; grun &amp;&amp; npipe_open)
 	{
 		bread = read(npipe[READ], buff, _bytes - nbytes);
+
 		if(bread &gt; -1)
 		{
 			nbytes += bread;
 			buff += bread;
 		}
+
+		if(k++ &gt; 5000)
+		{
+			closePipe();
+			return(0);
+		}
+
 		usleep(100);
+
 	}
 
 	//endian_swap(_b, _bytes, _bytes &lt;= 6);
@@ -418,6 +455,7 @@ int GUI_Serial::Write(void *_b, int32 _bytes)
 /*----------------------------------------------------------------------------------------------*/
 void GUI_Serial::readGPS()
 {
+	uint32 checksumc, checksumr;
 	int32 nbytes, bread, k, chan;
 	uint8 v;
 
@@ -478,8 +516,24 @@ void GUI_Serial::readGPS()
 		/* Read in the message */
 		Read(src, decoded_packet.length);
 
+		/* Assemble into a complete packet for the checksum */
+		memcpy(&amp;packet_body[0], &amp;packet_header, 6);				//!&lt; CCSDS Header
+		memcpy(&amp;packet_body[6], src, decoded_packet.length);	//!&lt; Body
+		checksumc = adler(&amp;packet_body[0], 6 + decoded_packet.length);
+
+		/* Read in the checksum */
+		byte_count += Read(&amp;checksumr, sizeof(uint32));
+
+		/* Now verify the checksum */
+		if(checksumc != checksumr)
+		{
+			message_sync = 0;
+			packet_count[LAST_M_ID]++;
+			return;
+		}
+
 		/* Read in the postword */
-		Read(&amp;postword, sizeof(uint32));
+		byte_count += Read(&amp;postword, sizeof(uint32));
 
 		if(postword != 0xBBBBBBBB)
 		{
@@ -674,6 +728,7 @@ void GUI_Serial::readGPS()
 			if(CheckPacket(&amp;decoded_packet) == true)
 			{
 				Read(&amp;buff[0], decoded_packet.length);
+				Read(&amp;checksumr, sizeof(uint32));
 				Read(&amp;postword, sizeof(uint32));
 				if(postword != 0xBBBBBBBB)
 				{
@@ -699,13 +754,16 @@ void GUI_Serial::readGPS()
 bool GUI_Serial::CheckPacket(CCSDS_Decoded_Header *_p)
 {
 
-	bool val;
+	bool val = true;
 
-	/* Now copy in the body */
-	if(SIZEOF_M[_p-&gt;id] == _p-&gt;length)
-		val = true;
-	else
+	if((_p-&gt;id &gt;= LAST_M_ID) || (_p-&gt;id &lt;= FIRST_M_ID))
+	{
+		val = false;
+	}
+	else if(SIZEOF_M[_p-&gt;id] != _p-&gt;length)
+	{
 		val = false;
+	}
 
 	return(val);
 }
@@ -729,18 +787,29 @@ void GUI_Serial::FixDoubles(void *_b, int32 _num)
 void GUI_Serial::writeGPS()
 {
 
-	uint32 preamble = 0xAAAAAAAA;
+	uint8 *sbuff;
+	uint32 pre = 0xAAAAAAAA;
+	uint32 post = 0xBBBBBBBB;
+	uint32 checksum;
 
 	Lock();
 
 //	endian_swap(&amp;command_header, sizeof(CCSDS_Packet_Header), 1);
 //	endian_swap(&amp;command_body, decoded_command.length, 0);
 
+	sbuff = &amp;packet_body[0];
+
 	if(command_ready &amp;&amp; (command_sent == 0))
 	{
-		Write(&amp;preamble, sizeof(uint32));
-		Write(&amp;command_header, sizeof(CCSDS_Packet_Header));
-		Write(&amp;command_body, decoded_command.length);
+		/* Assemble into a complete packet */
+		memcpy(sbuff, &amp;pre, 4); 				sbuff += 4;		//!&lt; Prefix
+		memcpy(sbuff, &amp;command_header, 6); 		sbuff += 6;		//!&lt; CCSDS Header
+		memcpy(sbuff, &amp;command_body, decoded_command.length);	sbuff += decoded_command.length; //!&lt; Payload
+		checksum = adler(&amp;packet_body[4], 6 + decoded_command.length);
+		memcpy(sbuff, &amp;checksum, 4); 			sbuff += 4;		//!&lt; Checksum
+		memcpy(sbuff, &amp;post, 4); 				sbuff += 4;		//!&lt; Postfix
+
+		Write(&amp;packet_body[0], decoded_command.length + 18);
 		command_sent = 1;
 	}
 </diff>
      <filename>gse/src/gui_serial.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -47,16 +47,6 @@
 /*----------------------------------------------------------------------------------------------*/
 
 
-/* What stuff to log */
-/*----------------------------------------------------------------------------------------------*/
-#define CHANNEL_DEBUG			(1)			//!&lt; Log channel data to HD
-#define CHANNEL_INVESTIGATE		(0)			//!&lt; Try to figure out Nav bug
-#define LOG_PSEUDO				(0)			//!&lt; Pseudoranges
-#define LOG_SV					(0)			//!&lt; SV Navigation data
-#define LOG_NAV					(1)			//!&lt; Nav Output
-/*----------------------------------------------------------------------------------------------*/
-
-
 /* MISC GPS Constants */
 /*----------------------------------------------------------------------------------------------*/
 #define MAX_SV					(32)		//!&lt; Number of PRN codes
@@ -70,7 +60,7 @@
 /*----------------------------------------------------------------------------------------------*/
 #define MASK_ANGLE				(0)				//!&lt; Add this many degrees to altitude dependant mask
 #define ACQ_MODULO_WEAK			(8)				//!&lt; Do this many weak acqs per 32 PRN strong search
-#define MAX_ACQS_PER_PVT		(12)			//!&lt; Max # of acquisitions per PVT
+#define MAX_ACQS_PER_PVT		(1)				//!&lt; Max # of acquisitions per PVT
 #define MAX_DOPPLER_ABSOLUTE	(15000)			//!&lt; Limit any and all Dopplers the be within this range
 #define MAX_DOPPLER_STRONG		(15000)			//!&lt; Cold Doppler search space for strong signal
 #define MAX_DOPPLER_MEDIUM		(15000)			//!&lt; Cold Doppler search space for strong signal
@@ -87,11 +77,9 @@
 
 /* Correlator Defines */
 /*----------------------------------------------------------------------------------------------*/
-#define CORR_DELAYS				(1)			//!&lt; Number of delays to calculate (plus-minus)
-#define CORR_SPACING			(.5)		//!&lt; How far should the correlators be spaced (chips)
 #define FRAME_SIZE_PLUS_2		(12)		//!&lt; 10 words per frame, 12 = 10 + 2
-#define CODE_BINS				(20)		//!&lt; Partial code offset bins code resolution -&gt; 1 chip/X bins
-#define CARRIER_SPACING			(20)		//!&lt; Spacing of bins (Hz)
+#define CODE_BINS				(50)		//!&lt; Partial code offset bins code resolution -&gt; 1 chip/X bins
+#define CARRIER_SPACING			(10)		//!&lt; Spacing of bins (Hz)
 #define CARRIER_BINS			(MAX_DOPPLER_ABSOLUTE/CARRIER_SPACING) //!&lt; Number of pre-sampled carrier wipeoff bins
 /*----------------------------------------------------------------------------------------------*/
 
@@ -108,14 +96,13 @@
 /*----------------------------------------------------------------------------------------------*/
 
 
-/* Channel defines */
+/* AGC Control */
 /*----------------------------------------------------------------------------------------------*/
-#define CARRIER_AIDING			(1)			//!&lt; Carrier aid the DLL
-#define PLL_BN					(15)		//!&lt; PLL Bandwidth
-#define FLL_BN					(10)		//!&lt; FLL Bandwidth
 #define AGC_BITS				(6)			//!&lt; AGC to this bit depth
-#define OVERFLOW_LOW			(4)			//!&lt; Overflow low
-#define OVERFLOW_HIGH			(64)		//!&lt; Overflow high
+//#define OVERFLOW_LOW			(256)		//!&lt; Overflow low
+//#define OVERFLOW_HIGH			(1024)		//!&lt; Overflow high
+#define OVERFLOW_LOW			(64)			//!&lt; Overflow low
+#define OVERFLOW_HIGH			(256)		//!&lt; Overflow high
 /*----------------------------------------------------------------------------------------------*/
 
 </diff>
      <filename>includes/config.h</filename>
    </modified>
    <modified>
      <diff>@@ -142,6 +142,7 @@ typedef unsigned int		uint32;
 #ifndef SPEED_OF_LIGHT
 	#define SPEED_OF_LIGHT		(2.99792458e8)				//!&lt; Speed of light (m/s) as specified in IS-GPS-200D
 #endif
+#define INVERSE_L1				(6.347513678891978e-10)		//!&lt; 1/L1
 #define INVERSE_SPEED_OF_LIGHT	(3.33564095198152049576e-9)	//!&lt; Inverse speed of light
 #define CODE_RATE 				(1.023e6)					//!&lt; L1 C/A code chipping rate
 #define INVERSE_CODE_RATE		(9.775171065493646e-07)		//!&lt; 1/L1 C/A code chipping rate</diff>
      <filename>includes/defines.h</filename>
    </modified>
    <modified>
      <diff>@@ -49,7 +49,6 @@ int32 code_gen(CPX *_dest, int32 _prn);
 void sine_gen(CPX *_dest, double _f, double _fs, int32 _samps);
 void sine_gen(CPX *_dest, double _f, double _fs, int32 _samps, double _p);
 void wipeoff_gen(MIX *_dest, double _f, double _fs, int32 _samps);
-void resample(CPX *_dest, CPX *_source, double _fdest, double _fsource, int32 _samps);
 void downsample(CPX *_dest, CPX *_source, double _fdest, double _fsource, int32 _samps);
 void init_agc(CPX *_buff, int32 _samps, int32 bits, int32 *scale);
 int32 run_agc(CPX *_buff, int32 _samps, int32 bits, int32 scale);</diff>
      <filename>includes/protos.h</filename>
    </modified>
    <modified>
      <diff>@@ -109,7 +109,7 @@ void Parse_Arguments(int32 argc, char* argv[])
 	gopt.tlm_type		= TELEM_NAMED_PIPE;
 	gopt.mode 			= 0;		//!&lt; Single board L1 mode by default
 	gopt.decimate		= 16;		//!&lt; Default to work with both 65.536 and 64 MHz clocks
-	gopt.gr 			= 40; 		//!&lt; 40 dB of RF gain
+	gopt.gr 			= 30; 		//!&lt; 40 dB of RF gain
 	gopt.gi 			= 10; 		//!&lt; 10 dB of IF gain
 	gopt.f_lo_a 		= L1 - IF_FREQUENCY;	//!&lt; Board A L1 by default
 	gopt.f_ddc_a 		= 0;		//!&lt; no DDC correction</diff>
      <filename>main/init.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -6,9 +6,8 @@
 %   3: PLL and FLL lock indicators
 %   4: Raw Correlations &amp; CN0
 
-function [] = chan_peek(chan)
+function [A] = chan_peek(chan)
 
-close all; clc;
 A = get_chan(chan);
 
 % uint32 tic;		//!&lt; Corresponds to this receiver tic
@@ -34,18 +33,27 @@ A = get_chan(chan);
 % Q[0]
 % P_buff[0]
 
+
 figure
+hold all; grid on;
+plot((A(:,21).^2+A(:,24).^2),'.')
+plot((A(:,22).^2+A(:,25).^2),'r.')
+plot(A(:,13)./(A(:,6)),'k')
 
-subplot(211)
-plot(A(:,3)); ylabel('SV');
-grid on;
+figure
+cor = A(:,21)+i*A(:,24);
+plot(real(cor),'b.')
 
-subplot(212)
-plot(A(:,13),'k')
-hold on; grid on;
-ylabel('I^{2}+Q^{2}');
+figure
+hold all; grid on;
+plot(A(:,7))
+plot(A(:,9))
+plot(A(:,8)*0.5)
+
+bl = A(:,end-19:end);
 
 figure
+mesh(bl)
+shading interp;
+
 
-surf(A(:,end-19:end))
-shading interp
\ No newline at end of file</diff>
      <filename>matlab/plot_chan.m</filename>
    </modified>
    <modified>
      <diff>@@ -255,7 +255,7 @@ Acq_Command_S Acquisition::doAcqStrong(int32 _sv, int32 _doppmin, int32 _doppmax
 	for(lcv = (_doppmin/1000); lcv &lt;  (_doppmax/1000); lcv++)
 	{
 		/* Sweep through the doppler range */
-		for(lcv2 = 0; lcv2 &lt; 4; lcv2 += 2)
+		for(lcv2 = 0; lcv2 &lt; 4; lcv2 ++)
 		{
 
 			if(gopt.realtime)</diff>
      <filename>objects/acquisition.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -88,9 +88,8 @@ void Channel::Clear()
 	I_prev = Q_prev = 1;		//Important to prevent divide by zero
 	I_avg = 1;
 	Q_var = 1;
-	P_avg = 1e4;
+	P_avg = 8e4;
 	cn0 = 40.0;
-	NP = 10;
 
 	/* Bit lock stuff */
 	bit_lock = false;
@@ -142,24 +141,25 @@ void Channel::Start(int32 _sv, Acq_Command_S result, int32 _corr_len)
 	carrier_nco	= IF_FREQUENCY + result.doppler;
 
 	aDLL.x		= 2.0*result.doppler*CODE_RATE/L1;
+
+	aPLL.w		= 0;
 	aPLL.x 		= 2.0*result.doppler;
 	aPLL.z 		= result.doppler;
 
-	len 		= _corr_len;
-
-	switch(len)
+	switch(_corr_len)
 	{
 		case 1:
-			PLL_W(30.0);
-			break;
-		case 10:
-			PLL_W(25.0);
+			len = 1;
+			PLL_W(18.0);
 			break;
 		case 20:
-			PLL_W(20.0);
+			len = 20;
+			PLL_W(18.0);
 			break;
 		default:
-			PLL_W(30.0);
+			len = 1;
+			PLL_W(18.0);
+			break;
 	}
 
 	DLL_W(1.0);
@@ -182,12 +182,12 @@ Channel_M Channel::getPacket()
 void Channel::Accum(Correlation_S *corr, NCO_Command_S *_feedback)
 {
 
-	corr-&gt;I[0] &gt;&gt;= 3;
-	corr-&gt;I[1] &gt;&gt;= 3;
-	corr-&gt;I[2] &gt;&gt;= 3;
-	corr-&gt;Q[0] &gt;&gt;= 3;
-	corr-&gt;Q[1] &gt;&gt;= 3;
-	corr-&gt;Q[2] &gt;&gt;= 3;
+	corr-&gt;I[0] &gt;&gt;= 2;
+	corr-&gt;I[1] &gt;&gt;= 2;
+	corr-&gt;I[2] &gt;&gt;= 2;
+	corr-&gt;Q[0] &gt;&gt;= 2;
+	corr-&gt;Q[1] &gt;&gt;= 2;
+	corr-&gt;Q[2] &gt;&gt;= 2;
 
 	/* Integrate */
 	I[0] += corr-&gt;I[0];
@@ -201,12 +201,18 @@ void Channel::Accum(Correlation_S *corr, NCO_Command_S *_feedback)
 	I_sum20	+= corr-&gt;I[1] - I_buff[_1ms_epoch];
 	Q_sum20 += corr-&gt;Q[1] - Q_buff[_1ms_epoch];
 
+//	if((I_buff[_1ms_epoch] &gt; 0) !=  (corr-&gt;I[1] &gt; 0))
+//	{
+//		P_buff[_1ms_epoch]++;
+//	}
+
 	/* Buffer storing past 20 1ms accumulations */
 	I_buff[_1ms_epoch] = corr-&gt;I[1];
 	Q_buff[_1ms_epoch] = corr-&gt;Q[1];
 
 	/* Lowpass filter */
-	P_buff[_1ms_epoch] = (63 * P_buff[_1ms_epoch] + (I_sum20 &gt;&gt; 6) * (I_sum20 &gt;&gt; 6)	+ (Q_sum20 &gt;&gt; 6)*(Q_sum20 &gt;&gt; 6) + 32) &gt;&gt; 6;
+	//P_buff[_1ms_epoch] = (63 * P_buff[_1ms_epoch] + (I_sum20 &gt;&gt; 6) * (I_sum20 &gt;&gt; 6)	+ (Q_sum20 &gt;&gt; 6)*(Q_sum20 &gt;&gt; 6) + 32) &gt;&gt; 6;
+	P_buff[_1ms_epoch] = (63 * P_buff[_1ms_epoch] + (I_sum20 &gt;&gt; 6) * (I_sum20 &gt;&gt; 6)	+ 32) &gt;&gt; 6;
 
 	/* Dump accumulation and do tracking according to integration length */
 	if((_1ms_epoch % len) == 0)
@@ -276,14 +282,14 @@ void Channel::Accum(Correlation_S *corr, NCO_Command_S *_feedback)
 void Channel::DumpAccum()
 {
 	/* Compute the powers */
-	P[0] = I[0]*I[0]+Q[0]*Q[0];
-	P[1] = I[1]*I[1]+Q[1]*Q[1];
-	P[2] = I[2]*I[2]+Q[2]*Q[2];
+	P[0] = (I[0]) * (I[0]) + (Q[0]) * (Q[0]);
+	P[1] = (I[1]) * (I[1]) + (Q[1]) * (Q[1]);
+	P[2] = (I[2]) * (I[2]) + (Q[2]) * (Q[2]);
 
 	/* Lowpass filtered values here */
 	I_avg += (fabs((float)I[1]) - I_avg) * .02;
 	Q_var += ((float)Q[1]*(float)Q[1] - Q_var) * .02;
-	P_avg += ((float)P[1]/float(len) - P_avg) * .1;
+	P_avg += ((float)P[1]/len - P_avg) * .02;
 
 	/* First do estimate of frequency offset via FFT */
 	if(freq_lock == false)
@@ -293,9 +299,10 @@ void Channel::DumpAccum()
 	else
 	{
 		PLL();
-		DLL();
 	}
 
+	DLL();
+
 	/* Dump pertinent data */
 	Error();
 
@@ -315,15 +322,14 @@ void Channel::DumpAccum()
 void Channel::EstCN0()
 {
 	int32 lcv;
+	float NP;
 	float NBP;
 	float WBP;
+	float ncn0;
 
 	/* Try out new cn0 estimate, PG 393 of Global Positioning System, Theory and Applications */
 	if((_1ms_epoch == 19) &amp;&amp; bit_lock)
 	{
-		/* Old school cn0 */
-		CN0_old = 10*log10(I_avg*I_avg/(2*Q_var)) - 10*log10(aPLL.t);
-
 		NBP = I_sum20*I_sum20 + Q_sum20*Q_sum20;
 		WBP = 0;
 
@@ -331,10 +337,15 @@ void Channel::EstCN0()
 			WBP += I_buff[lcv]*I_buff[lcv] + Q_buff[lcv]*Q_buff[lcv];
 
 		if(WBP &gt; 0.0)
-			NP += (NBP/WBP - NP) * .02;
+			NP = NBP/WBP;
+
+		ncn0 = 10*log10((NP - 1.0)/(20.0 - NP)) + 30.0 + .25;
 
 		if((NP - 1.0)/(20.0 - NP) &gt; 0.0)
-			cn0 = 10*log10((NP - 1.0)/(20.0 - NP)) + 30.0 + .25;
+		{
+			ncn0 = 10*log10((NP - 1.0)/(20.0 - NP)) + 30.0 + .25;
+			cn0 += (ncn0 - cn0)*.02;
+		}
 
 		if(cn0 &lt; 15.0)
 		{
@@ -359,10 +370,12 @@ void Channel::FrequencyLock()
 	qt = Q[1] &gt;&gt; 3;
 
 	/* First frequency double to remove data bits */
-	fft_buff[freq_lock_ticks].i = (int16)(it*it - qt*qt);
-	fft_buff[freq_lock_ticks].q = (int16)(2*it*qt);
-
-	freq_lock_ticks++;
+	if(count &gt; 1000)
+	{
+		fft_buff[freq_lock_ticks].i = (int16)(it*it - qt*qt);
+		fft_buff[freq_lock_ticks].q = (int16)(2*it*qt);
+		freq_lock_ticks++;
+	}
 
 	if(freq_lock_ticks &gt;= FREQ_LOCK_POINTS)
 	{
@@ -412,19 +425,27 @@ void Channel::DLL()
 {
 
 	float code_err;
-	float ep, lp;
+	float ep, lp, sp;
 
 	ep = sqrt(float(P[0]));
 	lp = sqrt(float(P[2]));
+	sp = sqrt(float(P_avg));
 
-	code_err  = (ep - lp)/(ep + lp);
+	code_err  = (ep - lp) / sp;
 
 	/* Not working too well right now, debug some later */
 //	aDLL.x += aDLL.t*(code_err*aDLL.w02);
 //	aDLL.z = 0.5*aDLL.x + aDLL.a*aDLL.w02*code_err;
-//	code_nco = CODE_RATE + ((carrier_nco - IF_FREQUENCY)*CODE_RATE/L1) + aDLL.z;
-//
-	code_nco = CODE_RATE + ((carrier_nco - IF_FREQUENCY)*CODE_RATE/L1) + code_err;
+//	code_nco = CODE_RATE + (0.5*aPLL.x*CODE_RATE*INVERSE_L1) + aDLL.z;
+
+	if((count &lt; 1000) &amp;&amp; (P_avg &lt; 8e4))
+	{
+		code_nco = CODE_RATE + (0.5 * aPLL.x * CODE_RATE * INVERSE_L1) - 5.0;
+	}
+	else
+	{
+		code_nco = CODE_RATE + (0.5 * aPLL.x * CODE_RATE * INVERSE_L1) + code_err;
+	}
 }
 /*----------------------------------------------------------------------------------------------*/
 
@@ -441,31 +462,21 @@ void Channel::PLL()
 
 	df = dp = 0;
 
-	if(len != 1)
-	{
-		for(lcv = 0; lcv &lt; 10; lcv++)
-		{
-			I2 += I_buff[lcv];
-			Q2 += Q_buff[lcv];
-		}
-
-		for(lcv; lcv &lt; 20; lcv++)
-		{
-			I1 += I_buff[lcv];
-			Q1 += Q_buff[lcv];
-		}
-
-		/* FLL discriminator */
-		dot = 	  I2*I1 + Q2*Q1;
-		cross =  -I2*Q1 + Q2*I1;
-
-		/* No FLL for now */
-		if((dot != 0.0) &amp;&amp; (cross != 0.0))
-		{
-			df = atan2(cross, dot);
-			df /= TWO_PI;
-		}
-	}
+	//if(len == 20 || (_1ms_epoch &amp; 0x1))
+//	{
+//		/* FLL discriminator */
+//		dot = 	  I_prev*I[1] + Q_prev*Q[1];
+//		cross =  -I_prev*Q[1] + Q_prev*I[1];
+//
+//		/* No FLL for now */
+//		if((dot != 0.0) &amp;&amp; (cross != 0.0))
+//		{
+//			df = atan2(cross, dot);
+//			df /= (TWO_PI * aPLL.t);
+//		}
+//	}
+//
+//	df = 0;
 
 	/* PLL discriminator */
 	if(I[1] != 0)
@@ -521,9 +532,9 @@ void Channel::BitLock()
 	uint32 best_sum;
 
 	/* Set bitlock threshold */
-	thresh = 5000;
+	thresh = 1000;
 
-	if(_1ms_epoch == 19)
+	if(_1ms_epoch == 19 &amp;&amp; (bit_lock_ticks &gt;= thresh))
 	{
 		if(bit_lock == false)
 		{
@@ -911,8 +922,10 @@ void Channel::PLL_W(float _bwpll)
 	aPLL.t = .001*(float)len;
 
 }
+/*----------------------------------------------------------------------------------------------*/
 
 
+/*----------------------------------------------------------------------------------------------*/
 void Channel::DLL_W(float _bwdll)
 {
 
@@ -930,17 +943,16 @@ void Channel::DLL_W(float _bwdll)
 void Channel::Error()
 {
 
-	float mcn0;
-
-	mcn0 = cn0 &gt; CN0_old ? cn0 : CN0_old;
-
 	/* Monitor DLL */
-	if((P_avg &lt; 2e4) &amp;&amp; (count &gt; 1000))
+	if((P_avg &lt; 8e4) &amp;&amp; (count &gt; 1000))
 		Kill();
 
 	/* Monitor cn0 for false PLL lock */
-	if((count &gt; 10000) &amp;&amp; (mcn0 &lt; 17.0))
-		Kill();
+	if((count == 15000) &amp;&amp; (bit_lock == false) &amp;&amp; (freq_lock == true))
+	{
+		freq_lock_ticks = 0;
+		freq_lock = false;
+	}
 
 	/* If 30 seconds have passed and channel has not converged dump it */
 	if((count &gt; 30000) &amp;&amp; (converged == false))
@@ -953,23 +965,17 @@ void Channel::Error()
 	/* Adjust integration length based on cn0 */
 	if(bit_lock)
 	{
-//		if((mcn0 &gt; 39.0) &amp;&amp; (len != 1))
-//		{
-//			len = 1;
-//			PLL_W(18.0);
-//		}
+		if((cn0 &gt; 39.0) &amp;&amp; (len != 1))
+		{
+			len = 1;
+			PLL_W(18.0);
+		}
 
-//		if((mcn0 &lt; 37.0) &amp;&amp; (len != 20))
+		if((cn0 &lt; 37.0) &amp;&amp; (len != 20))
 		{
 			len = 20;
 			PLL_W(18.0);
 		}
-
-//		if((mcn0 &lt; 30.0) &amp;&amp; (len != 20))
-//		{
-//			len = 20;
-//			PLL_W(20.0);
-//		}
 	}
 
 }</diff>
      <filename>objects/channel.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -87,8 +87,6 @@ class Channel : public Threaded_Object
 		float Q_var;			//!&lt; Variance of Q
 		float P_avg;			//!&lt; Moving average of P
 		float cn0;				//!&lt; Current CN0 estimate
-		float CN0_old;			//!&lt; Old CN0 estimate (used to detect meta stable loop convergence)
-		float NP;				//!&lt; New CN0 estimate thing
 		/*----------------------------------------------------------------------------------------------*/
 
 		/* Bit lock stuff */</diff>
      <filename>objects/channel.h</filename>
    </modified>
    <modified>
      <diff>@@ -633,7 +633,7 @@ void Correlator::InitCorrelator(Correlator_State_S *s)
 
 	/* Convert delay in samples to chips */
 	code_phase = (double)result.code_phase * 1023.0 / 2048.0;
-	code_phase += (double)CODE_CHIPS + dt;
+	code_phase += (double)CODE_CHIPS - dt + 2.5;
 	code_phase = fmod(code_phase,(double) CODE_CHIPS);
 
 	s-&gt;sv					= result.sv;</diff>
      <filename>objects/correlator.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -100,6 +100,7 @@ void GPS_Source::Read(ms_packet *_p)
 {
 
 	double gain;
+	int32 shift;
 
 	switch(source_type)
 	{
@@ -117,32 +118,50 @@ void GPS_Source::Read(ms_packet *_p)
 			break;
 	}
 
-	/* Dont need to AGC the SOURCE_SIGE_GN3S */
-	if(source_type != SOURCE_SIGE_GN3S)
+	switch(source_type)
 	{
-		/* Add to the buff */
-		soverflw += run_agc(&amp;_p-&gt;data[0], SAMPS_MS, AGC_BITS, 1);
+		case SOURCE_USRP_V1:
 
-		/* Figure out the agc_scale value */
-		if((ms_count &amp; 0xF) == 0)
-		{
-			gain = dbs_rx_a-&gt;rf_gain();
+			/* Count the overflows and shift if needed */
+			soverflw += run_agc(&amp;_p-&gt;data[0], SAMPS_MS, AGC_BITS, 6);
 
-			if(soverflw &gt; OVERFLOW_HIGH)
-				gain -= 0.5;
+			/* Figure out the agc_scale value */
+			if((ms_count &amp; 0xFF) == 0)
+			{
+				gain = dbs_rx_a-&gt;rf_gain();
 
-			if(soverflw &lt; OVERFLOW_LOW)
-				gain += 0.5;
+				if(soverflw &gt; OVERFLOW_HIGH)
+					gain -= 0.5;
 
-			dbs_rx_a-&gt;rf_gain(gain);
+				if(soverflw &lt; OVERFLOW_LOW)
+					gain += 0.5;
 
-			overflw = soverflw;
-			soverflw = 0;
+				dbs_rx_a-&gt;rf_gain(gain);
 
-			agc_scale = (int32)floor(2.0*(dbs_rx_a-&gt;max_rf_gain() - gain));
-		}
+				agc_scale = (int32)floor(2.0*(dbs_rx_a-&gt;max_rf_gain() - gain));
+
+				overflw = soverflw;
+				soverflw = 0;
+			}
+
+			break;
+		case SOURCE_USRP_V2:
+
+//			Read_SOURCE_USRP_V2(_p);
+			break;
+
+		case SOURCE_SIGE_GN3S:
+
+			break;
+		default:
+			break;
 	}
 
+//	FILE *fp;
+//	fp = fopen(&quot;crap.dat&quot;,&quot;a&quot;);
+//	fwrite(&amp;_p-&gt;data[0], 1, SAMPS_MS*sizeof(CPX), fp);
+//	fclose(fp);
+
 	ms_count++;
 
 }
@@ -491,6 +510,7 @@ void GPS_Source::Read_GN3S(ms_packet *_p)
 		/* Start transfer */
 		while(!started)
 		{
+			usleep(100);
 			started = gn3s_a-&gt;usrp_xfer(VRQ_XFER, 1);
 		}
 
@@ -598,46 +618,66 @@ void GPS_Source::Resample_USRP_V1(CPX *_in, CPX *_out)
 void GPS_Source::Resample_GN3S(CPX *_in, CPX *_out)
 {
 	/* Runs specified filter on incoming signal. */
-	//static short filter[7] = {3,4,5,6,5,4,3}; 			Mike's Filter
-	//static short filter[7] = {-3,10,27,34,27,10,-3}; 		Greg's Filter
 	int32 lcv, ind;
+	int16 tmp;
 
 	/* Process the array */
 	for(lcv = 0; lcv &lt; 10240; lcv++)
 	{
 		ind = gdec[lcv];
 
-//		_out[lcv].i =	_in[ind + 6].i * -3 +
-//						_in[ind + 5].i * 10 +
-//						_in[ind + 4].i * 27 +
-//						_in[ind + 3].i * 34 +
-//						_in[ind + 2].i * 27 +
-//						_in[ind + 1].i * 10 +
-//						_in[ind + 0].i * -3;
+		tmp = 8;
+		tmp += _in[ind +  6].i *  3;
+		tmp += _in[ind +  5].i * 97;
+		tmp += _in[ind +  4].i * 77;
+		tmp += _in[ind +  3].i * 86;
+		tmp += _in[ind +  2].i * 77;
+		tmp += _in[ind +  1].i * 97;
+		tmp += _in[ind +  0].i *  3;
+		_out[lcv].i = tmp &gt;&gt; 4;
+
+		tmp = 8;
+		tmp += _in[ind +  6].q *  3;
+		tmp += _in[ind +  5].q * 97;
+		tmp += _in[ind +  4].q * 77;
+		tmp += _in[ind +  3].q * 86;
+		tmp += _in[ind +  2].q * 77;
+		tmp += _in[ind +  1].q * 97;
+		tmp += _in[ind +  0].q *  3;
+		_out[lcv].q = tmp &gt;&gt; 4;
+
+//		tmp = 4;
+//		tmp += _in[ind + 12].i *   3;
+//		tmp += _in[ind + 11].i *  -8;
+//		tmp += _in[ind + 10].i * -11;
+//		tmp += _in[ind +  9].i *   1;
+//		tmp += _in[ind +  8].i *  26;
+//		tmp += _in[ind +  7].i *  52;
+//		tmp += _in[ind +  6].i *  63;
+//		tmp += _in[ind +  5].i *  52;
+//		tmp += _in[ind +  4].i *  26;
+//		tmp += _in[ind +  3].i *  1;
+//		tmp += _in[ind +  2].i * -11;
+//		tmp += _in[ind +  1].i *  -8;
+//		tmp += _in[ind +  0].i *   3;
+//		_out[lcv].i = tmp &gt;&gt; 3;
 //
-//		_out[lcv].q =	_in[ind + 6].q * -3 +
-//						_in[ind + 5].q * 10 +
-//						_in[ind + 4].q * 27 +
-//						_in[ind + 3].q * 34 +
-//						_in[ind + 2].q * 27 +
-//						_in[ind + 1].q * 10 +
-//						_in[ind + 0].q * -3;
-
-		_out[lcv].i =	_in[ind + 6].i * 4 +
-						_in[ind + 5].i * 5 +
-						_in[ind + 4].i * 6 +
-						_in[ind + 3].i * 7 +
-						_in[ind + 2].i * 6 +
-						_in[ind + 1].i * 5 +
-						_in[ind + 0].i * 4;
-
-		_out[lcv].q =	_in[ind + 6].q * 4 +
-						_in[ind + 5].q * 5 +
-						_in[ind + 4].q * 6 +
-						_in[ind + 3].q * 7 +
-						_in[ind + 2].q * 6 +
-						_in[ind + 1].q * 5 +
-						_in[ind + 0].q * 4;
+//		tmp = 4;
+//		tmp += _in[ind + 12].q *   3;
+//		tmp += _in[ind + 11].q *  -8;
+//		tmp += _in[ind + 10].q * -11;
+//		tmp += _in[ind +  9].q *   1;
+//		tmp += _in[ind +  8].q *  26;
+//		tmp += _in[ind +  7].q *  52;
+//		tmp += _in[ind +  6].q *  63;
+//		tmp += _in[ind +  5].q *  52;
+//		tmp += _in[ind +  4].q *  26;
+//		tmp += _in[ind +  3].q *  1;
+//		tmp += _in[ind +  2].q * -11;
+//		tmp += _in[ind +  1].q *  -8;
+//		tmp += _in[ind +  0].q *   3;
+//		_out[lcv].q = tmp &gt;&gt; 3;
+
 	}
 
 	return;</diff>
      <filename>objects/gps_source.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -70,7 +70,7 @@ class GPS_Source
 
 		/* Data buffers */
 		int8 gbuff[40919*2]; 	//!&lt; Byte buffer for GN3S
-		CPX buff[40926]; 		//!&lt; Base buffer for GN3S/USRP
+		CPX buff[40932]; 		//!&lt; Base buffer for GN3S/USRP
 		CPX buff_out[10240]; 	//!&lt; Output buffer @ 2.048 Msps
 		CPX *buff_out_p; 		//!&lt; Pointer to a spot in buff_out
 		CPX dbuff[16384]; 		//!&lt; Buffer for double buffering</diff>
      <filename>objects/gps_source.h</filename>
    </modified>
    <modified>
      <diff>@@ -72,6 +72,7 @@ Telemetry::Telemetry():Threaded_Object(&quot;TLMTASK&quot;)
 	npipe[READ] = npipe[WRITE] = -1;
 	pheader = (uint8 *)&amp;command_header;
 	pcommand = (uint8 *)&amp;command_body;
+	pchecksumr = (uint8 *)&amp;checksumr;
 
 	signal(SIGPIPE, lost_gui_pipe);
 
@@ -375,6 +376,15 @@ void Telemetry::ImportSerial()
 
 					break;
 				}
+				case 3: /* Get the checksum */
+				{
+					pchecksumr[checksum_bytes] = abyte; checksum_bytes++;
+
+					if(checksum_bytes &gt;= sizeof(uint32))
+						StateThree();
+
+					break;
+				}
 				default:
 				{
 					syncstate = 0;
@@ -436,20 +446,42 @@ void Telemetry::StateOne()
 void Telemetry::StateTwo()
 {
 
-	/* Decode the header */
-	DecodeCCSDSPacketHeader(&amp;decoded_header, &amp;command_header);
+	/* Reset bytes */
+	command_bytes = 0;
+	command_bytes_2_read = 0;
 
-	/* Bent pipe data to Commando */
-	write(TLM_2_CMD_P[WRITE], &amp;command_header, sizeof(CCSDS_Packet_Header));
-	write(TLM_2_CMD_P[WRITE], &amp;command_body, decoded_header.length);
+	/* Next state */
+	syncstate = 3;
 
-	syncstate = 0;
+}
+/*----------------------------------------------------------------------------------------------*/
 
-	command_bytes = 0;
-	command_bytes_2_read = 0;
+
+/*----------------------------------------------------------------------------------------------*/
+void Telemetry::StateThree()
+{
+
+	uint32 checksumc;
+
+	/* Assemble into packet */
+	memcpy(&amp;packet_body[0], &amp;command_header, sizeof(CCSDS_Packet_Header));
+	memcpy(&amp;packet_body[sizeof(CCSDS_Packet_Header)], &amp;command_body, decoded_header.length);
+	checksumc = adler(&amp;packet_body[0], decoded_header.length + sizeof(CCSDS_Packet_Header));
+
+	if(checksumc == checksumr)
+	{
+		/* Bent pipe data to Commando */
+		write(TLM_2_CMD_P[WRITE], &amp;command_header, sizeof(CCSDS_Packet_Header));
+		write(TLM_2_CMD_P[WRITE], &amp;command_body, decoded_header.length);
+	}
+
+	checksum_bytes = 0;
+	syncstate = 0;
+	checksumr = 0;
 
 	memset(&amp;command_body, 0x0, sizeof(Command_Union));
 	memset(&amp;command_header, 0x0, sizeof(CCSDS_Packet_Header));
+
 }
 /*----------------------------------------------------------------------------------------------*/
 
@@ -909,34 +941,30 @@ void Telemetry::EmitCCSDSPacket(void *_buff, int32 _len)
 
 	int32 lcv;
 	uint8 *sbuff;
-	uint8 pre = 0xAA;
-	uint8 post = 0xBB;
+	uint32 pre = 0xAAAAAAAA;
+	uint32 post = 0xBBBBBBBB;
+	uint32 checksum;
+
+	sbuff = &amp;packet_body[0];
+
+	/* Assemble into a complete packet */
+	memcpy(sbuff, &amp;pre, 4); 				sbuff += 4;		//!&lt; Prefix
+	memcpy(sbuff, &amp;packet_header, 6); 		sbuff += 6;		//!&lt; CCSDS Header
+	memcpy(sbuff, _buff, _len); 			sbuff += _len;	//!&lt; Payload
+	checksum = adler(&amp;packet_body[4], 6 + _len);
+	memcpy(sbuff, &amp;checksum, 4); 			sbuff += 4;		//!&lt; Checksum
+	memcpy(sbuff, &amp;post, 4); 				sbuff += 4;		//!&lt; Postfix
 
 	/* Write the sync header to the UART */
 	if(npipe_open)
 	{
-		for(lcv = 0; lcv &lt; 4; lcv++)
-			write(npipe[WRITE], &amp;pre, sizeof(uint8));
-
-		/* Write the CCSDS header to the UART */
-		sbuff = (uint8 *)&amp;packet_header;
-		for(lcv = 0; lcv &lt; 6; lcv++)
-		{
-			write(npipe[WRITE], sbuff, sizeof(uint8));
-			sbuff++;
-		}
-
 		/* Now write the body to the UART */
-		sbuff = (uint8 *)_buff;
-		for(lcv = 0; lcv &lt; _len; lcv++)
+		sbuff = (uint8 *)&amp;packet_body[0];
+		for(lcv = 0; lcv &lt; _len + 18; lcv++)
 		{
 			write(npipe[WRITE], sbuff, sizeof(uint8));
 			sbuff++;
 		}
-
-		/* Write the sync postfix to the UART */
-		for(lcv = 0; lcv &lt; 4; lcv++)
-			write(npipe[WRITE], &amp;post, sizeof(uint8));
 	}
 
 }</diff>
      <filename>objects/telemetry.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -83,9 +83,15 @@ class Telemetry : public Threaded_Object
 		Message_Union message_body;					//!&lt; Body of a message
 		SV_Prediction_M sv_predictions[MAX_SV];		//!&lt; Buffer SV predictions
 
+		uint8 packet_body[2048];					//!&lt; Complete packet body
+
 		/* Variables for serial input */
 		uint32 syncstate;							//!&lt; Flag to indicate synchronization step 0 for nothing, 1 for preamble, 2 for CCSDS header, 3 for packet
 		uint32 syncword;							//!&lt; Synchronize to the 0xAAAAAAAA preamble
+		uint32 checksumr;							//!&lt; Received checksum
+
+		uint8 *pchecksumr;							//!&lt; Pointer to received checksum
+		uint32 checksum_bytes;						//!&lt; Bytes to read in checksum
 
 		uint8 *pheader;								//!&lt; Pointer to header
 		uint32 header_bytes;						//!&lt; Bytes left to read in header
@@ -122,6 +128,7 @@ class Telemetry : public Threaded_Object
 		void StateZero();							//!&lt; State zero, waiting for 0xAAAAAAAA preamble
 		void StateOne();							//!&lt; State one, collecting CCSDS header
 		void StateTwo();							//!&lt; State two, collecting body of command
+		void StateThree();							//!&lt; State three, verify packet and pass on to Commando
 
 		uint32 ReadSHU(uint32 _shu);				//!&lt; Read the status and health A/D
 </diff>
      <filename>objects/telemetry.h</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>51b78da0ea332fc4877f0e507c3e500194b1b576</id>
    </parent>
  </parents>
  <author>
    <name>gpssim</name>
    <email>gpssim@gpsdevc.(none)</email>
  </author>
  <url>http://github.com/gps-sdr/gps-sdr/commit/72a7faba1770aae88aa7d690d3cc99bef8df18f1</url>
  <id>72a7faba1770aae88aa7d690d3cc99bef8df18f1</id>
  <committed-date>2009-07-31T14:07:38-07:00</committed-date>
  <authored-date>2009-07-31T14:07:38-07:00</authored-date>
  <message>Whoa, lotsa changes. Normalized noise floors of GN3S and USRP. Code should work equally well with both devices. Played with the GN3S filter. Added a checksum (adler) to the communication with the GUI.</message>
  <tree>4d48ddab3cd2de2568835272e94619cd74a9a307</tree>
  <committer>
    <name>gpssim</name>
    <email>gpssim@gpsdevc.(none)</email>
  </committer>
</commit>
