#ifndef WIFIMODELLOGDISTCEILING_H #define WIFIMODELLOGDISTCEILING_H #include "../../../floorplan/v2/Floorplan.h" #include "WiFiModel.h" #include "LogDistanceModel.h" /** * signal-strength estimation using log-distance model * including ceilings between AP and position */ class WiFiModelLogDistCeiling : public WiFiModel { private: float txp; // sending power (-40) float exp; // path-loss-exponent (~2.0 - 4.0) float waf; // attenuation per ceiling/floor (~-8.0) /** position (height) of all ceilings (in meter) */ std::vector ceilingsAtHeight_m; public: /** ctor */ WiFiModelLogDistCeiling(const float txp, const float exp, const float waf, const Floorplan::IndoorMap* map) : txp(txp), exp(exp), waf(waf) { Assert::isTrue(waf <= 0, "WAF must be a negative number!"); // position of all ceilings for (Floorplan::Floor* f : map->floors) { ceilingsAtHeight_m.push_back(f->atHeight); } } /** get the given access-point's RSSI at the provided location */ float getRSSI(const LocatedAccessPoint& ap, const Point3 p) override { const int numCeilings = numCeilingsBetween(ap.z, p.z); const float rssi = LogDistanceModel::distanceToRssi(txp, exp, ap.getDistance(p)); return rssi + (numCeilings * waf); } private: /** get the number of ceilings between z1 and z2 */ int numCeilingsBetween(const float z1, const float z2) const { int cnt = 0; const float zMin = std::min(z1, z2); const float zMax = std::max(z1, z2); for (float z : ceilingsAtHeight_m) { if (zMin < z && zMax > z) {++cnt;} } return cnt; } }; #endif // WIFIMODELLOGDISTCEILING_H