From b99bb2e2264de3104519ae66b41d0d8d590dc03f Mon Sep 17 00:00:00 2001 From: FrankE Date: Fri, 10 Mar 2017 15:12:27 +0100 Subject: [PATCH] added support for adding fingerprint-locations with meta information --- floorplan/v2/Floorplan.h | 13 ++++++++++++- floorplan/v2/FloorplanReader.h | 23 +++++++++++++++++++++++ floorplan/v2/FloorplanWriter.h | 13 +++++++++++++ 3 files changed, 48 insertions(+), 1 deletion(-) diff --git a/floorplan/v2/Floorplan.h b/floorplan/v2/Floorplan.h index ea88b50..f58f749 100644 --- a/floorplan/v2/Floorplan.h +++ b/floorplan/v2/Floorplan.h @@ -179,6 +179,7 @@ namespace Floorplan { struct FloorObstacle; struct AccessPoint; struct Beacon; + struct FingerprintLocation; struct FloorRegion; struct UnderlayImage; struct POI; @@ -189,6 +190,7 @@ namespace Floorplan { using FloorObstacles = std::vector; using FloorAccessPoints = std::vector; using FloorBeacons = std::vector; + using FloorFingerprintLocations = std::vector; using FloorRegions = std::vector; using FloorUnderlays = std::vector; using FloorPOIs = std::vector; @@ -206,6 +208,7 @@ namespace Floorplan { FloorRegions regions; // all regions within the floor (rooms, ...) FloorAccessPoints accesspoints; FloorBeacons beacons; + FloorFingerprintLocations fpLocations; // potential fingerprint locations FloorUnderlays underlays; // underlay images (used for map-building) FloorPOIs pois; // POIs within the floor FloorStairs stairs; // all stairs within one floor @@ -222,7 +225,15 @@ namespace Floorplan { }; - + /** location for fingerprint measurements */ + struct FingerprintLocation : public HasMeta { + std::string name; + Point2 posOnFloor; + float heightAboveFloor = 0; + FingerprintLocation() {;} + FingerprintLocation(const std::string& name, const Point2 posOnFloor, const float heightAboveFloor) : name(name), posOnFloor(posOnFloor), heightAboveFloor(heightAboveFloor) {;} + Point3 getPosition(const Floor& floor) const {return Point3(posOnFloor.x, posOnFloor.y, floor.atHeight + heightAboveFloor);} + }; /** a POI located somewhere on a floor */ struct POI { diff --git a/floorplan/v2/FloorplanReader.h b/floorplan/v2/FloorplanReader.h index 8522091..e9dee39 100644 --- a/floorplan/v2/FloorplanReader.h +++ b/floorplan/v2/FloorplanReader.h @@ -105,6 +105,7 @@ namespace Floorplan { if (std::string("obstacles") == n->Name()) {floor->obstacles = parseFloorObstacles(n);} if (std::string("accesspoints") == n->Name()) {floor->accesspoints = parseFloorAccessPoints(n);} if (std::string("beacons") == n->Name()) {floor->beacons = parseFloorBeacons(n);} + if (std::string("fingerprints") == n->Name()) {floor->fpLocations = parseFingerprintLocations(n);} if (std::string("regions") == n->Name()) {floor->regions = parseFloorRegions(n);} if (std::string("underlays") == n->Name()) {floor->underlays = parseFloorUnderlays(n);} if (std::string("pois") == n->Name()) {floor->pois = parseFloorPOIs(n);} @@ -291,6 +292,28 @@ namespace Floorplan { return b; } + /** parse s */ + static std::vector parseFingerprintLocations(const XMLElem* el) { + assertNode("fingerprints", el); + std::vector vec; + FOREACH_NODE(n, el) { + if (std::string("location") == n->Name()) { vec.push_back(parseFingerprintLocation(n)); } + } + return vec; + } + + /** parse one fingerprint */ + static FingerprintLocation* parseFingerprintLocation(const XMLElem* n) { + assertNode("location", n); + FingerprintLocation* fpl = new FingerprintLocation(); + fpl->name = n->Attribute("name"); + fpl->posOnFloor.x = n->FloatAttribute("x"); + fpl->posOnFloor.y = n->FloatAttribute("y"); + fpl->heightAboveFloor = n->FloatAttribute("dz"); + const XMLElem* meta = n->FirstChildElement("meta"); + if (meta) {fpl->setMeta(parseMetaElement(meta));} + return fpl; + } static std::vector parseFloorRegions(const XMLElem* el) { std::vector vec; diff --git a/floorplan/v2/FloorplanWriter.h b/floorplan/v2/FloorplanWriter.h index 00c672c..51a3954 100644 --- a/floorplan/v2/FloorplanWriter.h +++ b/floorplan/v2/FloorplanWriter.h @@ -131,6 +131,7 @@ namespace Floorplan { } + /** add all sorts of POI to the floor */ static void addFloorPOI(XMLDoc& doc, XMLElem* floor, const Floor* mf) { @@ -180,6 +181,18 @@ namespace Floorplan { floor->InsertEndChild(beacons); + XMLElem* fingerprints = doc.NewElement("fingerprints"); + for (const FingerprintLocation* fpl : mf->fpLocations) { + XMLElem* efpl = doc.NewElement("location"); + efpl->SetAttribute("name", fpl->name.c_str()); + efpl->SetAttribute("x", fpl->posOnFloor.x); + efpl->SetAttribute("y", fpl->posOnFloor.y); + efpl->SetAttribute("dz", fpl->heightAboveFloor); + addMetaElement(doc, efpl, fpl->getMeta()); + fingerprints->InsertEndChild(efpl); + } + floor->InsertEndChild(fingerprints); + } static void addFloorOutline(XMLDoc& doc, XMLElem* floor, const Floor* mf) {