fixed some potential issues with MAC addresses

added corresponding test-cases
switched to newer version of tinyxml due to some issues
adjusted affected code-parts accordingly
for better re-use, moved ceiling-calculation to a new class
some minor fixes
new helper methods
worked on wifi-opt
This commit is contained in:
2017-03-20 11:19:57 +01:00
parent d065015f7d
commit 06e0e0a5aa
20 changed files with 1486 additions and 676 deletions

View File

@@ -0,0 +1,85 @@
#ifdef WITH_TESTS
#include "../Tests.h"
#include "../../floorplan/v2/FloorplanCeilings.h"
#include <cstdlib>
TEST(FloorplanCeilings, numCeilings) {
// dummy floorplan
Floorplan::Floor* f0 = new Floorplan::Floor(); f0->atHeight = 0;
Floorplan::Floor* f1 = new Floorplan::Floor(); f1->atHeight = 3;
Floorplan::Floor* f2 = new Floorplan::Floor(); f2->atHeight = 7;
Floorplan::IndoorMap map;
map.floors.push_back(f0);
map.floors.push_back(f1);
map.floors.push_back(f2);
Floorplan::Ceilings model(&map);
ASSERT_EQ(0, model.numCeilingsBetween(Point3(0,0,-1), Point3(0,0,0)) );
ASSERT_EQ(0, model.numCeilingsBetween(Point3(0,0,0), Point3(0,0,-1)) );
ASSERT_EQ(0, model.numCeilingsBetween(Point3(0,0,0), Point3(0,0,1)) );
ASSERT_EQ(0, model.numCeilingsBetween(Point3(0,0,1), Point3(0,0,0)) );
ASSERT_EQ(1, model.numCeilingsBetween(Point3(0,0,-0.01), Point3(0,0,+0.01)) );
ASSERT_EQ(1, model.numCeilingsBetween(Point3(0,0,+0.01), Point3(0,0,-0.01)) );
ASSERT_EQ(1, model.numCeilingsBetween(Point3(0,0,2.99), Point3(0,0,3.01)) );
ASSERT_EQ(1, model.numCeilingsBetween(Point3(0,0,3.01), Point3(0,0,2.99)) );
ASSERT_EQ(1, model.numCeilingsBetween(Point3(0,0,6.99), Point3(0,0,7.01)) );
ASSERT_EQ(1, model.numCeilingsBetween(Point3(0,0,7.01), Point3(0,0,6.99)) );
ASSERT_EQ(0, model.numCeilingsBetween(Point3(0,0,7.00), Point3(0,0,99)) );
ASSERT_EQ(1, model.numCeilingsBetween(Point3(0,0,0), Point3(0,0,7)) );
ASSERT_EQ(3, model.numCeilingsBetween(Point3(0,0,-1), Point3(0,0,8)) );
}
TEST(FloorplanCeilings, numCeilingsFloat) {
// dummy floorplan
Floorplan::Floor* f0 = new Floorplan::Floor(); f0->atHeight = 0;
Floorplan::Floor* f1 = new Floorplan::Floor(); f1->atHeight = 3;
Floorplan::Floor* f2 = new Floorplan::Floor(); f2->atHeight = 7;
Floorplan::IndoorMap map;
map.floors.push_back(f0);
map.floors.push_back(f1);
map.floors.push_back(f2);
Floorplan::Ceilings model(&map);
const float d = 0.01;
ASSERT_NEAR(0, model.numCeilingsBetweenFloat(Point3(0,0,-1), Point3(0,0,0)), d );
ASSERT_NEAR(0, model.numCeilingsBetweenFloat(Point3(0,0,0), Point3(0,0,-1)), d );
ASSERT_NEAR(0, model.numCeilingsBetweenFloat(Point3(0,0,0), Point3(0,0,1)), d );
ASSERT_NEAR(0, model.numCeilingsBetweenFloat(Point3(0,0,1), Point3(0,0,0)), d );
ASSERT_NEAR(0.5, model.numCeilingsBetweenFloat(Point3(0,0,-0.01), Point3(0,0,+0.50)), d );
ASSERT_NEAR(0.5, model.numCeilingsBetweenFloat(Point3(0,0,+0.50), Point3(0,0,-0.01)), d );
ASSERT_NEAR(0.2, model.numCeilingsBetweenFloat(Point3(0,0,2.99), Point3(0,0,3.20)), d );
ASSERT_NEAR(0.2, model.numCeilingsBetweenFloat(Point3(0,0,3.20), Point3(0,0,2.99)), d );
ASSERT_NEAR(1.0, model.numCeilingsBetweenFloat(Point3(0,0,6.99), Point3(0,0,8.33)), d );
ASSERT_NEAR(1.0, model.numCeilingsBetweenFloat(Point3(0,0,8.33), Point3(0,0,6.99)), d );
ASSERT_NEAR(2.0, model.numCeilingsBetweenFloat(Point3(0,0,0.00), Point3(0,0,8.33)), d );
ASSERT_NEAR(2.0, model.numCeilingsBetweenFloat(Point3(0,0,8.33), Point3(0,0,0.00)), d );
ASSERT_NEAR(0, model.numCeilingsBetweenFloat(Point3(0,0,7.00), Point3(0,0,99)), d );
ASSERT_NEAR(1, model.numCeilingsBetweenFloat(Point3(0,0,0), Point3(0,0,7)), d );
ASSERT_NEAR(3, model.numCeilingsBetweenFloat(Point3(0,0,-1), Point3(0,0,8)), d );
}
#endif

View File

@@ -20,11 +20,59 @@ TEST(MAC, caseInsensitive) {
}
TEST(MAC, invalidLength) {
ASSERT_THROW(MACAddress("12:34:56:78:9A:B"), Exception);
ASSERT_THROW(MACAddress("2:34:56:78:9A:BC"), Exception);
ASSERT_THROW(MACAddress("12:34:56:78:9A:"), Exception);
ASSERT_THROW(MACAddress("12:34:56:78:9A"), Exception);
ASSERT_THROW(MACAddress("12:34:56:78:9A:11:"), Exception);
ASSERT_THROW(MACAddress("12:34:56:78:9A:11:11"), Exception);
}
TEST(MAC, invalidChars) {
ASSERT_THROW(MACAddress("g2:34:56:78:9A:BC"), Exception);
ASSERT_THROW(MACAddress("a2:34:56:78:9A:BG"), Exception);
ASSERT_THROW(MACAddress("a2:34:5!:78:9A:BC"), Exception);
ASSERT_THROW(MACAddress("a2:34:51:78:?A:BC"), Exception);
}
TEST(MAC, ends) {
MACAddress mac1("12:34:56:78:9A:BC");
MACAddress mac2("12:34:56:78:9a:bc");
MACAddress mac3("12:34:56:78:9a:bd");
MACAddress mac4("02:34:56:78:9a:bc");
MACAddress mac5("13:34:56:78:9a:bc");
MACAddress mac6("12:34:56:78:9a:cc");
ASSERT_EQ(mac1, mac2); ASSERT_EQ(mac1.asString(), mac2.asString());
ASSERT_NE(mac1, mac3); ASSERT_NE(mac1.asString(), mac3.asString());
ASSERT_NE(mac2, mac3); ASSERT_NE(mac2.asString(), mac3.asString());
ASSERT_NE(mac1, mac4); ASSERT_NE(mac1.asString(), mac4.asString());
ASSERT_NE(mac2, mac4); ASSERT_NE(mac2.asString(), mac4.asString());
ASSERT_NE(mac1, mac5); ASSERT_NE(mac1.asString(), mac5.asString());
ASSERT_NE(mac2, mac5); ASSERT_NE(mac2.asString(), mac5.asString());
ASSERT_NE(mac1, mac6); ASSERT_NE(mac1.asString(), mac6.asString());
ASSERT_NE(mac2, mac6); ASSERT_NE(mac2.asString(), mac6.asString());
}
TEST(MAC, convertLong) {
MACAddress mac1("12:34:56:78:9A:BC");
MACAddress mac2 = MACAddress( mac1.asLong() );
ASSERT_EQ(mac1, mac2);
ASSERT_EQ(mac1.asString(), mac2.asString());
}

View File

@@ -41,81 +41,6 @@ TEST(LogDistanceCeilingModel, calc) {
}
TEST(LogDistanceCeilingModel, numCeilings) {
// dummy floorplan
Floorplan::Floor* f0 = new Floorplan::Floor(); f0->atHeight = 0;
Floorplan::Floor* f1 = new Floorplan::Floor(); f1->atHeight = 3;
Floorplan::Floor* f2 = new Floorplan::Floor(); f2->atHeight = 7;
Floorplan::IndoorMap map;
map.floors.push_back(f0);
map.floors.push_back(f1);
map.floors.push_back(f2);
WiFiModelLogDistCeiling model(&map);
ASSERT_EQ(0, model.numCeilingsBetween(Point3(0,0,-1), Point3(0,0,0)) );
ASSERT_EQ(0, model.numCeilingsBetween(Point3(0,0,0), Point3(0,0,-1)) );
ASSERT_EQ(0, model.numCeilingsBetween(Point3(0,0,0), Point3(0,0,1)) );
ASSERT_EQ(0, model.numCeilingsBetween(Point3(0,0,1), Point3(0,0,0)) );
ASSERT_EQ(1, model.numCeilingsBetween(Point3(0,0,-0.01), Point3(0,0,+0.01)) );
ASSERT_EQ(1, model.numCeilingsBetween(Point3(0,0,+0.01), Point3(0,0,-0.01)) );
ASSERT_EQ(1, model.numCeilingsBetween(Point3(0,0,2.99), Point3(0,0,3.01)) );
ASSERT_EQ(1, model.numCeilingsBetween(Point3(0,0,3.01), Point3(0,0,2.99)) );
ASSERT_EQ(1, model.numCeilingsBetween(Point3(0,0,6.99), Point3(0,0,7.01)) );
ASSERT_EQ(1, model.numCeilingsBetween(Point3(0,0,7.01), Point3(0,0,6.99)) );
ASSERT_EQ(0, model.numCeilingsBetween(Point3(0,0,7.00), Point3(0,0,99)) );
ASSERT_EQ(1, model.numCeilingsBetween(Point3(0,0,0), Point3(0,0,7)) );
ASSERT_EQ(3, model.numCeilingsBetween(Point3(0,0,-1), Point3(0,0,8)) );
}
TEST(LogDistanceCeilingModel, numCeilingsFloat) {
// dummy floorplan
Floorplan::Floor* f0 = new Floorplan::Floor(); f0->atHeight = 0;
Floorplan::Floor* f1 = new Floorplan::Floor(); f1->atHeight = 3;
Floorplan::Floor* f2 = new Floorplan::Floor(); f2->atHeight = 7;
Floorplan::IndoorMap map;
map.floors.push_back(f0);
map.floors.push_back(f1);
map.floors.push_back(f2);
WiFiModelLogDistCeiling model(&map);
const float d = 0.01;
ASSERT_NEAR(0, model.numCeilingsBetweenFloat(Point3(0,0,-1), Point3(0,0,0)), d );
ASSERT_NEAR(0, model.numCeilingsBetweenFloat(Point3(0,0,0), Point3(0,0,-1)), d );
ASSERT_NEAR(0, model.numCeilingsBetweenFloat(Point3(0,0,0), Point3(0,0,1)), d );
ASSERT_NEAR(0, model.numCeilingsBetweenFloat(Point3(0,0,1), Point3(0,0,0)), d );
ASSERT_NEAR(0.5, model.numCeilingsBetweenFloat(Point3(0,0,-0.01), Point3(0,0,+0.50)), d );
ASSERT_NEAR(0.5, model.numCeilingsBetweenFloat(Point3(0,0,+0.50), Point3(0,0,-0.01)), d );
ASSERT_NEAR(0.2, model.numCeilingsBetweenFloat(Point3(0,0,2.99), Point3(0,0,3.20)), d );
ASSERT_NEAR(0.2, model.numCeilingsBetweenFloat(Point3(0,0,3.20), Point3(0,0,2.99)), d );
ASSERT_NEAR(1.0, model.numCeilingsBetweenFloat(Point3(0,0,6.99), Point3(0,0,8.33)), d );
ASSERT_NEAR(1.0, model.numCeilingsBetweenFloat(Point3(0,0,8.33), Point3(0,0,6.99)), d );
ASSERT_NEAR(2.0, model.numCeilingsBetweenFloat(Point3(0,0,0.00), Point3(0,0,8.33)), d );
ASSERT_NEAR(2.0, model.numCeilingsBetweenFloat(Point3(0,0,8.33), Point3(0,0,0.00)), d );
ASSERT_NEAR(0, model.numCeilingsBetweenFloat(Point3(0,0,7.00), Point3(0,0,99)), d );
ASSERT_NEAR(1, model.numCeilingsBetweenFloat(Point3(0,0,0), Point3(0,0,7)), d );
ASSERT_NEAR(3, model.numCeilingsBetweenFloat(Point3(0,0,-1), Point3(0,0,8)), d );
}
#endif

View File

@@ -1,7 +1,7 @@
#ifdef WITH_TESTS
#include "../../Tests.h"
#include "../../../sensors/radio/setup/WiFiOptimizer.h"
#include "../../../sensors/radio/setup/WiFiOptimizerLogDistCeiling.h"
#include "../../../sensors/radio/setup/WiFiFingerprint.h"
#include "../../../misc/Debug.h"
@@ -55,23 +55,23 @@ TEST(WiFiOptimizer, optimize) {
}
WiFiOptimizer opt(&map, vg);
WiFiOptimizer::LogDistCeiling opt(&map, vg);
for (const WiFiFingerprint& fp : fingerprints) {
opt.addFingerprint(fp);
}
ASSERT_EQ(2, opt.getAllMACs().size());
float errRes;
WiFiOptimizer::LogDistCeiling::Stats errRes;
const WiFiOptimizer::APParams params1 = opt.optimize(mac1, errRes);
ASSERT_TRUE(errRes < 0.1);
const WiFiOptimizer::LogDistCeiling::APParams params1 = opt.optimize(mac1, errRes);
ASSERT_TRUE(errRes.error_db < 0.1);
ASSERT_NEAR(0, pos1.getDistance(params1.getPos()), 0.4); // apx position estimation
ASSERT_NEAR(-40, params1.txp, 1.0);
ASSERT_NEAR(2, params1.exp, 0.1);
ASSERT_NEAR(-4, params1.waf, 0.5);
const WiFiOptimizer::APParams params2 = opt.optimize(mac2, errRes);
ASSERT_TRUE(errRes < 0.1);
const WiFiOptimizer::LogDistCeiling::APParams params2 = opt.optimize(mac2, errRes);
ASSERT_TRUE(errRes.error_db < 0.1);
ASSERT_NEAR(0, pos2.getDistance(params2.getPos()), 0.4); // apx position estimation
ASSERT_NEAR(-40, params1.txp, 1.0);
ASSERT_NEAR(2, params2.exp, 0.1);