1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
#[macro_use] extern crate serde_derive; use std::collections::BTreeMap; pub type Countries = BTreeMap<MCC, Country>; #[allow(non_camel_case_types)] pub type eNBId = u32; pub type LTECellGlobalId = u64; pub type LTECellId = u32; pub type LTECells = BTreeMap<LTECellGlobalId, LTECell>; pub type LTECellShortId = u8; pub type MCC = u16; pub type MNC = u16; pub type NetworkId = u32; pub type Networks = BTreeMap<NetworkId, Network>; /// Represents a country. #[derive(Serialize, Deserialize)] pub struct Country { /// The three-digit Mobile Country Code (MCC) representing the country. E.g. `530` for New /// Zealand. Note that it is possible for a country to have more than one MCC representing it. /// See the Wikipedia article about [Mobile Country Codes][1] for more information and a list of /// valid codes. /// [1]: https://en.wikipedia.org/wiki/Mobile_country_code pub mcc: MCC, /// The name of the country. E.g. `New Zealand`. pub name: String, } /// Represents a LTE cell. #[derive(Serialize, Deserialize)] pub struct LTECell { pub id: LTECellId, pub mcc: MCC, pub mnc: MNC, } /// Represents a network. #[derive(Serialize, Deserialize)] pub struct Network { /// The three-digit Mobile Country Code (MCC) representing the country this network is located /// in. See [wireless::Country.mcc](struct.Country.html#structfield.mcc) for more information. pub mcc: MCC, /// The three-digit Mobile Network Code (MNC) representing this network within its parent Mobile /// Country Code (MCC). E.g. `240` for 2degrees within the MCC `530` for New Zealand (usually /// formatted as `530-24` with a two-digit MNC omitting the third digit). See the Wikipedia /// article about [Mobile Country Codes][1] for more information and a list of valid codes. /// [1]: https://en.wikipedia.org/wiki/Mobile_country_code pub mnc: MNC, /// The name of the network. E.g. `2degrees`. pub name: String, } impl LTECell { pub fn short_cid(&self) -> LTECellShortId { (self.id & (2 ^ 8 - 1)) as LTECellShortId } pub fn global_id(&self) -> LTECellGlobalId { Network::generate_id(self.mcc, self.mnc) as LTECellGlobalId + self.id as LTECellGlobalId } pub fn enb_id(&self) -> eNBId { self.id >> 8 } } impl Network { /// Derive a 24-bit global identifier from the given Mobile Country Code (MCC) and Mobile /// Network Code (MNC). The MCC makes up the first 12 bits and the MNC makes up the last 12 /// bits. The identifier is useful as a key value in a key-value collection. pub fn generate_id(mcc: MCC, mnc: MNC) -> NetworkId { ((mcc as NetworkId) << 12) + (mnc as NetworkId) } /// Derive a global identifier for this network. See [generate_id()](#method.generate_id) for /// more information. pub fn id(&self) -> NetworkId { Network::generate_id(self.mcc, self.mnc) } }