Checking in build system for the Transceiver.
diff --git a/GSM/GSMCommon.h b/GSM/GSMCommon.h
new file mode 100644
index 0000000..80c5608
--- /dev/null
+++ b/GSM/GSMCommon.h
@@ -0,0 +1,248 @@
+/**@file Common-use GSM declarations, most from the GSM 04.xx and 05.xx series. */
+/*
+* Copyright 2008-2011 Free Software Foundation, Inc.
+*
+* This software is distributed under the terms of the GNU Affero Public License.
+* See the COPYING file in the main directory for details.
+*
+* This use of this software may be subject to additional restrictions.
+* See the LEGAL file in the main directory for details.
+
+	This program is free software: you can redistribute it and/or modify
+	it under the terms of the GNU Affero General Public License as published by
+	the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+
+	You should have received a copy of the GNU Affero General Public License
+	along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+*/
+
+
+
+#ifndef GSMCOMMON_H
+#define GSMCOMMON_H
+
+#include <stdlib.h>
+#include <sys/time.h>
+#include <ostream>
+#include <vector>
+
+#include <Threads.h>
+#include <Timeval.h>
+#include <BitVector.h>
+
+
+
+
+namespace GSM {
+
+/**@namespace GSM This namespace covers L1 FEC, L2 and L3 message translation. */
+
+/** GSM Training sequences from GSM 05.02 5.2.3. */
+extern const BitVector gTrainingSequence[];
+
+/** C0T0 filler burst, GSM 05.02, 5.2.6 */
+extern const BitVector gDummyBurst;
+
+/** Random access burst synch. sequence */
+extern const BitVector gRACHSynchSequence;
+
+
+/**@name Modulus operations for frame numbers. */
+//@{
+/** The GSM hyperframe is largest time period in the GSM system, GSM 05.02 4.3.3. */
+const uint32_t gHyperframe = 2048UL * 26UL * 51UL;
+
+/** Get a clock difference, within the modulus, v1-v2. */
+int32_t FNDelta(int32_t v1, int32_t v2);
+
+/**
+       Compare two frame clock values.
+       @return 1 if v1>v2, -1 if v1<v2, 0 if v1==v2
+*/
+int FNCompare(int32_t v1, int32_t v2);
+
+
+//@}
+
+
+/**
+	GSM frame clock value. GSM 05.02 4.3
+	No internal thread sync.
+*/
+class Time {
+
+	private:
+
+	int mFN;				///< frame number in the hyperframe
+	int mTN;			///< timeslot number
+
+	public:
+
+	Time(int wFN=0, int wTN=0)
+		:mFN(wFN),mTN(wTN)
+	{ }
+
+
+	/** Move the time forward to a given position in a given modulus. */
+	void rollForward(unsigned wFN, unsigned modulus)
+	{
+		assert(modulus<gHyperframe);
+		while ((mFN % modulus) != wFN) mFN=(mFN+1)%gHyperframe;
+	 }
+
+	/**@name Accessors. */
+	//@{
+	int FN() const { return mFN; }
+	void FN(unsigned wFN) { mFN = wFN; }
+	unsigned TN() const { return mTN; }
+	void TN(unsigned wTN) { mTN=wTN; }
+	//@}
+
+	/**@name Arithmetic. */
+	//@{
+
+	Time& operator++()
+	{
+		mFN = (mFN+1) % gHyperframe;
+		return *this;
+	}
+
+    Time& decTN(unsigned step=1)
+    {
+		assert(step<=8);
+		mTN -= step;
+		if (mTN<0) {
+			mTN+=8;
+			mFN-=1;
+			if (mFN<0) mFN+=gHyperframe;
+		}
+        return *this;
+    }
+
+	Time& incTN(unsigned step=1)
+	{
+		assert(step<=8);
+		mTN += step;
+		if (mTN>7) {
+			mTN-=8;
+			mFN = (mFN+1) % gHyperframe;
+		}
+		return *this;
+	}
+
+	Time& operator+=(int step)
+	{
+		// Remember the step might be negative.
+		mFN += step;
+		if (mFN<0) mFN+=gHyperframe;
+		mFN = mFN % gHyperframe;
+		return *this;
+	}
+
+	Time operator-(int step) const
+		{ return operator+(-step); }
+
+	Time operator+(int step) const
+	{
+		Time newVal = *this;
+		newVal += step;
+		return newVal;
+	}
+
+	Time operator+(const Time& other) const
+    {
+        unsigned newTN = (mTN + other.mTN) % 8;
+		uint64_t newFN = (mFN+other.mFN + (mTN + other.mTN)/8) % gHyperframe;
+        return Time(newFN,newTN);
+    } 
+
+	int operator-(const Time& other) const
+	{
+		return FNDelta(mFN,other.mFN);
+	}
+
+	//@}
+
+
+	/**@name Comparisons. */
+	//@{
+
+	bool operator<(const Time& other) const
+	{
+		if (mFN==other.mFN) return (mTN<other.mTN);
+		return FNCompare(mFN,other.mFN)<0;
+	}
+
+	bool operator>(const Time& other) const
+	{
+		if (mFN==other.mFN) return (mTN>other.mTN);
+		return FNCompare(mFN,other.mFN)>0;
+	}
+
+	bool operator<=(const Time& other) const
+	{
+		if (mFN==other.mFN) return (mTN<=other.mTN);
+		return FNCompare(mFN,other.mFN)<=0;
+	}
+
+	bool operator>=(const Time& other) const
+	{
+		if (mFN==other.mFN) return (mTN>=other.mTN);
+		return FNCompare(mFN,other.mFN)>=0;
+	}
+
+	bool operator==(const Time& other) const
+	{
+		return (mFN == other.mFN) && (mTN==other.mTN);
+	}
+
+	//@}
+
+
+
+	/**@name Standard derivations. */
+	//@{
+
+	/** GSM 05.02 3.3.2.2.1 */
+	unsigned SFN() const { return mFN / (26*51); }
+
+	/** GSM 05.02 3.3.2.2.1 */
+	unsigned T1() const { return SFN() % 2048; }
+
+	/** GSM 05.02 3.3.2.2.1 */
+	unsigned T2() const { return mFN % 26; }
+
+	/** GSM 05.02 3.3.2.2.1 */
+	unsigned T3() const { return mFN % 51; }
+
+	/** GSM 05.02 3.3.2.2.1. */
+	unsigned T3p() const { return (T3()-1)/10; }
+
+	/** GSM 05.02 6.3.1.3. */
+	unsigned TC() const { return (FN()/51) % 8; }
+
+	/** GSM 04.08 10.5.2.30. */
+	unsigned T1p() const { return SFN() % 32; }
+
+	/** GSM 05.02 6.2.3 */
+	unsigned T1R() const { return T1() % 64; }
+
+	//@}
+};
+
+
+std::ostream& operator<<(std::ostream& os, const Time& ts);
+
+}; 	// namespace GSM
+
+
+#endif
+
+// vim: ts=4 sw=4