mirror of
https://github.com/RangeNetworks/openbts.git
synced 2025-10-23 07:42:01 +00:00
202 lines
4.3 KiB
C++
202 lines
4.3 KiB
C++
/**@file Classes for managing BCCH channel scanning and related database tables. */
|
|
/*
|
|
* Copyright 2011, 2014 Range Networks, Inc.
|
|
*
|
|
* 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.
|
|
|
|
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.
|
|
|
|
*/
|
|
|
|
#ifndef SCANNING_H
|
|
#define SCANNING_H
|
|
|
|
|
|
#include <list>
|
|
#include <GSMCommon.h>
|
|
|
|
struct sqlite3;
|
|
|
|
namespace GSM {
|
|
class L3SystemInformationType1;
|
|
class L3SystemInformationType2;
|
|
class L3SystemInformationType3;
|
|
}
|
|
|
|
|
|
typedef std::list<unsigned> ARFCNList;
|
|
|
|
|
|
/** A C++ API to the SPECTRUM_MAP database table. */
|
|
class SpectrumMap {
|
|
|
|
private:
|
|
|
|
sqlite3 *mDB; ///< database connection
|
|
|
|
|
|
public:
|
|
|
|
class LinkDirection {
|
|
public:
|
|
static const int Up;
|
|
static const int Down;
|
|
|
|
LinkDirection() {
|
|
mDir = Up;
|
|
}
|
|
LinkDirection(const LinkDirection &that) {
|
|
mDir = that.mDir;
|
|
}
|
|
LinkDirection(const int that) {
|
|
mDir = that;
|
|
}
|
|
|
|
bool operator==(LinkDirection& that) const {
|
|
return mDir == that.mDir;
|
|
}
|
|
bool operator==(int that) const {
|
|
return mDir == that;
|
|
}
|
|
void operator=(int dir) {
|
|
if (dir == Up || dir == Down) {
|
|
mDir = dir;
|
|
}
|
|
}
|
|
const char *string() const {
|
|
if (mDir == Up) {
|
|
return "up";
|
|
} else if (mDir == Down) {
|
|
return "down";
|
|
}
|
|
return "";
|
|
}
|
|
|
|
private:
|
|
int mDir;
|
|
};
|
|
|
|
/** The constructor connects to the database and inits the table. */
|
|
SpectrumMap(const char* path);
|
|
|
|
/** The destructor closes the database connection. */
|
|
~SpectrumMap();
|
|
|
|
/** Clear the map. */
|
|
void clear();
|
|
|
|
/** Mark a given ARFCN as having a given power level. */
|
|
void power(GSM::GSMBand band, unsigned ARFCN, float freq, LinkDirection& linkDir, float dBm);
|
|
|
|
/** Mark a given ARFCN as having a given power level. */
|
|
void power(GSM::GSMBand band, unsigned ARFCN, LinkDirection& linkDir, float dBm);
|
|
|
|
/** Mark a given ARFCN as having a given power level. */
|
|
//void power(GSM::GSMBand band, unsigned ARFCN, float freq, float dBm);
|
|
|
|
/** Return a list of up to count of the most powerful ARFCNs in a given band. */
|
|
ARFCNList topPower(GSM::GSMBand band, unsigned count) const;
|
|
|
|
/** Return a list of up to count of the least powerful ARFCNs in a given band. */
|
|
ARFCNList minimumPower(GSM::GSMBand band, unsigned count) const;
|
|
|
|
};
|
|
|
|
|
|
#if 0
|
|
class BTSRecord {
|
|
|
|
private:
|
|
|
|
GSM::GSMBand mBand;
|
|
unsigned mC0;
|
|
unsigned mMCC;
|
|
unsigned mMNC;
|
|
unsigned mLAC;
|
|
unsigned mCI;
|
|
unsigned mBSIC;
|
|
float mFreqOffset;
|
|
ARFCNList mNeighbors;
|
|
ARFCNList mCA;
|
|
|
|
public:
|
|
|
|
BTSRecord(
|
|
GSM::GSMBand wBand,
|
|
unsigned wC0,
|
|
unsigned wMCC, unsigned wMNC, unsigned wLAC,
|
|
unsigned wCI,
|
|
unsigned wBSIC,
|
|
float wFreqOffset)
|
|
:mBand(wBand),mC0(wC0),
|
|
mMCC(wMCC),mMNC(wMNC),mLAC(wLAC),
|
|
mCI(wCI),
|
|
mBSIC(wBSIC),
|
|
mFreqOffset(wFreqOffset)
|
|
{ }
|
|
|
|
void neighbors(const ARFCNList& wNeighbors)
|
|
{ mNeighbors = wNeighbors; }
|
|
|
|
void CA(const ARFCNList& wCA)
|
|
{ mCA = wCA; }
|
|
|
|
/** Return a key string based on MCC:MNC:LAC:CI that is unique for this BTS. */
|
|
std::string keyString() const;
|
|
|
|
};
|
|
#endif
|
|
|
|
|
|
/** A list of ARFCNs waiting to be scanned. */
|
|
class ScanList {
|
|
|
|
private:
|
|
|
|
ARFCNList mNewARFCNs; ///< ARFCNs that still need to be scanned.
|
|
ARFCNList mOldARFCNs; ///< ARFCNs that have already been scanned.
|
|
|
|
public:
|
|
|
|
size_t size() const { return mNewARFCNs.size(); }
|
|
|
|
/** Add ARFCNs to the mNewARFCNs if it is not already scanned or pending for scanning. */
|
|
void add(const ARFCNList& moreARFCNs);
|
|
|
|
void add(const std::vector<unsigned>& moreARFCNs);
|
|
|
|
/** Add an ARFCN to the mNewARFCNs if it is not already scanned or pending for scanning. */
|
|
void add(unsigned ARFCN);
|
|
|
|
int front() const { return mNewARFCNs.front(); }
|
|
|
|
/** Pop and return the next ARFCN or -1 if the list is empty. */
|
|
int next();
|
|
|
|
/** Return true if the scan is complete. */
|
|
bool allDone() const { return mNewARFCNs.size()==0; }
|
|
|
|
/** Clear both lists; reset the object. */
|
|
void clear();
|
|
|
|
private:
|
|
|
|
/** Return true if a given ARFCN is already in mNewARFCNs or mOldARFCNs. */
|
|
bool alreadyListed(unsigned ARFCN) const;
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
#endif
|
|
|
|
// vim: ts=4 sw=4
|