Files
openbts/GSM/GSMRadioResource.h
2014-07-16 23:57:22 +02:00

116 lines
3.3 KiB
C++

/*
* Copyright 2014, Range Networks, Inc.
*
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.
* This software is distributed under multiple licenses;
* see the COPYING file in the main directory for licensing
* information for this specific distribution.
*
* This use of this software may be subject to additional restrictions.
* See the LEGAL file in the main directory for details.
*/
#ifndef GSMRadioResource_H
#define GSMRadioResource_H 1
#include "Defines.h"
#include "GSMCommon.h"
#include "MemoryLeak.h"
namespace GSM {
class L2LogicalChannel;
struct RadData {
bool mValid;
float mRSSI;
float mTimingError;
RadData() { mValid = false; }
RadData(float wRSSI, float wTimingError) : mValid(true),mRSSI(wRSSI),mTimingError(wTimingError) {}
};
struct RachInfo {
unsigned mRA;
const GSM::Time mWhen;
RadData mRadData;
unsigned mTN;
// We now pre-allocate channels for RACHes for TCH/SDCCH services, then wait until the mReadyTime
// has passed before servicing them by sending an ImmediateAssignment.
L2LogicalChannel *mChan;
GSM::Time mReadyTime; // When the SACCH is known to have started transmiting correctly.
int initialTA() const { return mRadData.mTimingError; }
float RSSI() const { return mRadData.mRSSI; }
// Gotta love this language.
RachInfo(unsigned wRA, const GSM::Time &wWhen, RadData wRD, unsigned wTN=0)
: mRA(wRA), mWhen(wWhen), mRadData(wRD), mTN(wTN), mChan(NULL)
{ RN_MEMCHKNEW(RachInfo) }
~RachInfo() { RN_MEMCHKDEL(RachInfo) }
#if 0
// (pat) This is used when a RachInfo is placed in a priority_queue.
// Return true if rach1 should appear before rach2 in the priority_queue,
// meaning that rach1 will be serviced before rach2.
bool operator>(const RachInfo *rach1, const RachInfo *rach2) {
if (rach1->mChan) {
assert(rach2->mChan);
return rach1->mReadyTime < rach2->mreadyTime;
}
return rach1->mWhen < rach2-mWhen;
}
#endif
};
std::ostream& operator<<(std::ostream& os, const RachInfo &rach);
std::ostream& operator<<(std::ostream& os, const RachInfo *rach);
#if unused
/** This record carries all of the parameters associated with a RACH burst. */
class ChannelRequestRecord {
private:
unsigned mRA; ///< request reference
GSM::Time mFrame; ///< receive timestamp
float mRSSI; ///< dB wrt full scale
float mTimingError; ///< correlator timing error in symbol periods
public:
ChannelRequestRecord(
unsigned wRA, const GSM::Time& wFrame,
float wRSSI, float wTimingError)
:mRA(wRA), mFrame(wFrame),
mRSSI(wRSSI), mTimingError(wTimingError)
{ }
unsigned RA() const { return mRA; }
const GSM::Time& frame() const { return mFrame; }
float RSSI() const { return mRSSI; }
float timingError() const { return mTimingError; }
};
#endif
// Enum used to create fake RACHes for testing purposes.
enum FakeRachType {
FakeRachTCH,
FakeRachSDCCH,
FakeRachLUR,
FakeRachGPRS,
FakeRachAnswerToPaging
};
FakeRachType fakeRachTypeTranslate(const char *name);
extern void createFakeRach(FakeRachType rachtype);
extern void AccessGrantResponder(unsigned RA, const GSM::Time& when, float RSSI, float timingError, int TN);
extern ChannelType decodeChannelNeeded(unsigned RA);
extern bool requestingLUR(unsigned RA);
};
#endif