mirror of
https://github.com/RangeNetworks/openbts.git
synced 2025-10-22 23:32:00 +00:00
116 lines
3.3 KiB
C++
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
|