2008-04-11 10:11:29 +02:00
|
|
|
#ifndef _SERVER_HH_
|
|
|
|
#define _SERVER_HH_
|
|
|
|
|
|
|
|
#include <iostream>
|
|
|
|
#include <vector>
|
2008-05-29 10:48:05 +02:00
|
|
|
#include <map>
|
GuiNuMo : gestion topologie
server.{hh,cc} :
* Utilisation d'une map plutôt que d'une multimap pour stocker la liste
des pièces. Conséquence : les noms des zones doivent être uniques, il
faut donc numéroter les zones des pièces composites (par exemple
« Couloir N1 A » et « Couloir N1 B »).
* Ajout de la fonction inWhichAreas() qui permet d'obtenir la liste des
zones auxquelles appartient un point.
* Modification de la fonction makeWaypointDistancesFromFile() (renommée
makeWaypointListFromFile()) de manière à ce qu'elle calcule la matrice
des distances entre points de passage (lecture d'une liste de points).
Abandon du format décrivant les points en visibilité (voir le fichier
cfg/distances.csv, supprimé à cette révision), puisque nous nous
servons des points de passage et de la description des zones pour
calculer les liens entre points. RESTE À FAIRE : prise en comppte de
la topologie dans le calcul de distance.
* Ajout de deux fonctions areaConnection() qui permettent de récupérer
la liste des points de passage d'une zone, ou faisant l'intersection
entre deux zones.
* Ajout de la fonction distanceTopology, qui calcule la distance entre
deux points en tenant compte de la topologie (zones et points de
passage entre elles).
* Ajout de la fonction makeReferencePointDistances(), qui calcule les
distances entre points de référence, en tenant compte de la
topologie.
* Ajout de la fonction point_vector_idx(), semblable à point_tab_idx()
mais pour un vector<Point>.
referencepoint.{hh,cc} :
* Ajout de l'operator de cast en Point (operator Point()).
area.{hh,cc} :
* Ajout de l'operator==(Area).
cfg/distances.csv
* Suppression de ce fichier obsolète.
git-svn-id: https://pif.pu-pm.univ-fcomte.fr/svn/loc@47 785a6c6c-259e-4ff1-8b91-dc31627914f0
2008-06-25 16:19:07 +02:00
|
|
|
#include <set>
|
2008-04-11 10:11:29 +02:00
|
|
|
#include <string>
|
|
|
|
#include <fstream>
|
|
|
|
#include <sstream>
|
|
|
|
#include <sys/types.h>
|
|
|
|
#include <sys/socket.h>
|
|
|
|
#include <netinet/in.h>
|
|
|
|
#include <arpa/inet.h>
|
2008-07-03 15:04:30 +02:00
|
|
|
#include <cstring>
|
|
|
|
#include <cmath>
|
|
|
|
#include <cstdio>
|
2008-06-11 17:04:50 +02:00
|
|
|
|
|
|
|
#include "guinumo.hh"
|
2008-04-11 10:11:29 +02:00
|
|
|
#include "clientinfo.hh"
|
|
|
|
#include "referencepoint.hh"
|
|
|
|
#include "accesspoint.hh"
|
|
|
|
#include "point.hh"
|
|
|
|
#include "measurement.hh"
|
2008-05-29 10:48:05 +02:00
|
|
|
#include "area.hh"
|
2008-04-11 10:11:29 +02:00
|
|
|
|
|
|
|
using namespace std;
|
2008-06-11 17:04:50 +02:00
|
|
|
|
|
|
|
typedef ClientInfo::float_array float_array ;
|
|
|
|
typedef ClientInfo::float_index float_index ;
|
|
|
|
|
2008-04-11 10:11:29 +02:00
|
|
|
|
2008-04-30 11:36:55 +02:00
|
|
|
#define DEFAULT_LOGFILE "log/radar_exp.csv" // Fichier de sortie
|
2008-08-07 15:44:54 +02:00
|
|
|
#define DEFAULT_REF_POINT_FILE "csv/agreg/1m/toutes.csv" // Fichier des points de référence
|
2008-07-23 18:11:43 +02:00
|
|
|
#define DEFAULT_REF_POINT_FILE_1M "csv/agreg/1m/toutes.csv" // Fichier contenant tous les points de référence (maillage à 1m)
|
2008-04-30 11:36:55 +02:00
|
|
|
#define DEFAULT_AP_FILE "cfg/minipc.cfg" // Fichier de configuration des AP
|
2008-07-23 18:11:43 +02:00
|
|
|
#define DEFAULT_TRACKING_FILE "csv/agreg/divagation/divagation9_interpolé.csv" // Fichier de prérégrination
|
2008-05-29 10:48:05 +02:00
|
|
|
#define DEFAULT_TOPOLOGY_FILE "cfg/topo.csv"
|
GuiNuMo : gestion topologie
server.{hh,cc} :
* Utilisation d'une map plutôt que d'une multimap pour stocker la liste
des pièces. Conséquence : les noms des zones doivent être uniques, il
faut donc numéroter les zones des pièces composites (par exemple
« Couloir N1 A » et « Couloir N1 B »).
* Ajout de la fonction inWhichAreas() qui permet d'obtenir la liste des
zones auxquelles appartient un point.
* Modification de la fonction makeWaypointDistancesFromFile() (renommée
makeWaypointListFromFile()) de manière à ce qu'elle calcule la matrice
des distances entre points de passage (lecture d'une liste de points).
Abandon du format décrivant les points en visibilité (voir le fichier
cfg/distances.csv, supprimé à cette révision), puisque nous nous
servons des points de passage et de la description des zones pour
calculer les liens entre points. RESTE À FAIRE : prise en comppte de
la topologie dans le calcul de distance.
* Ajout de deux fonctions areaConnection() qui permettent de récupérer
la liste des points de passage d'une zone, ou faisant l'intersection
entre deux zones.
* Ajout de la fonction distanceTopology, qui calcule la distance entre
deux points en tenant compte de la topologie (zones et points de
passage entre elles).
* Ajout de la fonction makeReferencePointDistances(), qui calcule les
distances entre points de référence, en tenant compte de la
topologie.
* Ajout de la fonction point_vector_idx(), semblable à point_tab_idx()
mais pour un vector<Point>.
referencepoint.{hh,cc} :
* Ajout de l'operator de cast en Point (operator Point()).
area.{hh,cc} :
* Ajout de l'operator==(Area).
cfg/distances.csv
* Suppression de ce fichier obsolète.
git-svn-id: https://pif.pu-pm.univ-fcomte.fr/svn/loc@47 785a6c6c-259e-4ff1-8b91-dc31627914f0
2008-06-25 16:19:07 +02:00
|
|
|
#define DEFAULT_WAYPOINT_FILE "cfg/waypoints.csv"
|
2008-04-11 10:11:29 +02:00
|
|
|
#define DEFAULT_IP "127.0.0.1"
|
|
|
|
#define DEFAULT_LISTEN_PORT 7777
|
|
|
|
#define LIGHT_SPEED 300000000
|
|
|
|
#define MINMAX_STEP 0.5
|
2008-07-22 15:17:53 +02:00
|
|
|
#define MINMAX_X_START 0.5
|
|
|
|
#define MINMAX_Y_START 0.5
|
2008-07-15 18:16:22 +02:00
|
|
|
#define MINMAX_Z_START 0
|
2008-07-22 15:17:53 +02:00
|
|
|
#define MINMAX_X_STOP 10
|
|
|
|
#define MINMAX_Y_STOP 31.5
|
2008-07-17 16:58:53 +02:00
|
|
|
#define MINMAX_Z_STOP 6
|
2008-04-30 11:36:55 +02:00
|
|
|
#define BUFFER_LENGTH 5000
|
2008-05-07 16:36:04 +02:00
|
|
|
//#define DEFAULT_Z 3 // Décommenter pour utiliser des fichiers d'entrée avec des coordonnées dans un seul plan (X, Y).
|
|
|
|
//#define FRED_CSV_FORMAT // Décommenter pour utiliser les fichiers CSV au « format Fred » (plusieurs lignes par mesure, avec un AP par ligne).
|
2008-04-30 11:36:55 +02:00
|
|
|
|
2008-07-09 10:27:39 +02:00
|
|
|
typedef enum { ALGO_VLI = 1, ALGO_BASIC_FRBHM, ALGO_CONTINU_FRBHM } ALGORITHM ;
|
2008-06-18 13:51:09 +02:00
|
|
|
|
2008-04-11 10:11:29 +02:00
|
|
|
|
|
|
|
class Server
|
|
|
|
{
|
2008-07-04 11:27:51 +02:00
|
|
|
public :
|
|
|
|
typedef boost::multi_array<float, 2> float_array ; // On utilise boost::multi_array pour les matrices de distances temporaires.
|
|
|
|
typedef float_array::index float_index ;
|
|
|
|
|
2008-04-11 10:11:29 +02:00
|
|
|
protected:
|
GuiNuMo : gestion topologie
server.{hh,cc} :
* Utilisation d'une map plutôt que d'une multimap pour stocker la liste
des pièces. Conséquence : les noms des zones doivent être uniques, il
faut donc numéroter les zones des pièces composites (par exemple
« Couloir N1 A » et « Couloir N1 B »).
* Ajout de la fonction inWhichAreas() qui permet d'obtenir la liste des
zones auxquelles appartient un point.
* Modification de la fonction makeWaypointDistancesFromFile() (renommée
makeWaypointListFromFile()) de manière à ce qu'elle calcule la matrice
des distances entre points de passage (lecture d'une liste de points).
Abandon du format décrivant les points en visibilité (voir le fichier
cfg/distances.csv, supprimé à cette révision), puisque nous nous
servons des points de passage et de la description des zones pour
calculer les liens entre points. RESTE À FAIRE : prise en comppte de
la topologie dans le calcul de distance.
* Ajout de deux fonctions areaConnection() qui permettent de récupérer
la liste des points de passage d'une zone, ou faisant l'intersection
entre deux zones.
* Ajout de la fonction distanceTopology, qui calcule la distance entre
deux points en tenant compte de la topologie (zones et points de
passage entre elles).
* Ajout de la fonction makeReferencePointDistances(), qui calcule les
distances entre points de référence, en tenant compte de la
topologie.
* Ajout de la fonction point_vector_idx(), semblable à point_tab_idx()
mais pour un vector<Point>.
referencepoint.{hh,cc} :
* Ajout de l'operator de cast en Point (operator Point()).
area.{hh,cc} :
* Ajout de l'operator==(Area).
cfg/distances.csv
* Suppression de ce fichier obsolète.
git-svn-id: https://pif.pu-pm.univ-fcomte.fr/svn/loc@47 785a6c6c-259e-4ff1-8b91-dc31627914f0
2008-06-25 16:19:07 +02:00
|
|
|
vector<ClientInfo> client_list ; // Liste des clients connus.
|
|
|
|
map<string, Area> area_list ; // Liste des zones homogènes (pièces).
|
|
|
|
vector<ReferencePoint> reference_point_list ; // Liste des points de référence (calibration).
|
|
|
|
vector<AccessPoint> access_point_list ; // Liste des AP connus.
|
|
|
|
float **reference_point_matrix ; // Matrice des distances entre les points de référence.
|
|
|
|
vector<Point> waypoint_list ; // Liste des points de passage entre les zones.
|
|
|
|
float **waypoint_matrix ; // Matrice des distances entre les points de passage.
|
2008-04-11 10:11:29 +02:00
|
|
|
struct sockaddr_in server_addr;
|
|
|
|
int sockListen;
|
|
|
|
int sockSend;
|
2008-04-15 12:19:15 +02:00
|
|
|
|
2008-04-11 10:11:29 +02:00
|
|
|
public:
|
2008-08-07 15:44:54 +02:00
|
|
|
Server(const string &ap_file = DEFAULT_AP_FILE, const string &ref_pt_file = DEFAULT_REF_POINT_FILE, const string &ip_addr = DEFAULT_IP, const int &listen_port = DEFAULT_LISTEN_PORT);
|
2008-04-11 10:11:29 +02:00
|
|
|
~Server();
|
2008-05-07 10:59:06 +02:00
|
|
|
|
2008-04-30 11:36:55 +02:00
|
|
|
void send_to_client(const int &cl);
|
2008-04-11 10:11:29 +02:00
|
|
|
int receive_data();
|
2008-05-07 10:59:06 +02:00
|
|
|
|
2008-06-11 17:04:50 +02:00
|
|
|
ClientInfo& createClient() ;
|
|
|
|
|
GuiNuMo : gestion topologie
server.{hh,cc} :
* Utilisation d'une map plutôt que d'une multimap pour stocker la liste
des pièces. Conséquence : les noms des zones doivent être uniques, il
faut donc numéroter les zones des pièces composites (par exemple
« Couloir N1 A » et « Couloir N1 B »).
* Ajout de la fonction inWhichAreas() qui permet d'obtenir la liste des
zones auxquelles appartient un point.
* Modification de la fonction makeWaypointDistancesFromFile() (renommée
makeWaypointListFromFile()) de manière à ce qu'elle calcule la matrice
des distances entre points de passage (lecture d'une liste de points).
Abandon du format décrivant les points en visibilité (voir le fichier
cfg/distances.csv, supprimé à cette révision), puisque nous nous
servons des points de passage et de la description des zones pour
calculer les liens entre points. RESTE À FAIRE : prise en comppte de
la topologie dans le calcul de distance.
* Ajout de deux fonctions areaConnection() qui permettent de récupérer
la liste des points de passage d'une zone, ou faisant l'intersection
entre deux zones.
* Ajout de la fonction distanceTopology, qui calcule la distance entre
deux points en tenant compte de la topologie (zones et points de
passage entre elles).
* Ajout de la fonction makeReferencePointDistances(), qui calcule les
distances entre points de référence, en tenant compte de la
topologie.
* Ajout de la fonction point_vector_idx(), semblable à point_tab_idx()
mais pour un vector<Point>.
referencepoint.{hh,cc} :
* Ajout de l'operator de cast en Point (operator Point()).
area.{hh,cc} :
* Ajout de l'operator==(Area).
cfg/distances.csv
* Suppression de ce fichier obsolète.
git-svn-id: https://pif.pu-pm.univ-fcomte.fr/svn/loc@47 785a6c6c-259e-4ff1-8b91-dc31627914f0
2008-06-25 16:19:07 +02:00
|
|
|
map<string, Area> inWhichAreas(const Point &p) ;
|
2008-07-03 15:04:30 +02:00
|
|
|
bool inTheSameArea(const Point &p1, const Point &p2) ;
|
GuiNuMo : gestion topologie
server.{hh,cc} :
* Utilisation d'une map plutôt que d'une multimap pour stocker la liste
des pièces. Conséquence : les noms des zones doivent être uniques, il
faut donc numéroter les zones des pièces composites (par exemple
« Couloir N1 A » et « Couloir N1 B »).
* Ajout de la fonction inWhichAreas() qui permet d'obtenir la liste des
zones auxquelles appartient un point.
* Modification de la fonction makeWaypointDistancesFromFile() (renommée
makeWaypointListFromFile()) de manière à ce qu'elle calcule la matrice
des distances entre points de passage (lecture d'une liste de points).
Abandon du format décrivant les points en visibilité (voir le fichier
cfg/distances.csv, supprimé à cette révision), puisque nous nous
servons des points de passage et de la description des zones pour
calculer les liens entre points. RESTE À FAIRE : prise en comppte de
la topologie dans le calcul de distance.
* Ajout de deux fonctions areaConnection() qui permettent de récupérer
la liste des points de passage d'une zone, ou faisant l'intersection
entre deux zones.
* Ajout de la fonction distanceTopology, qui calcule la distance entre
deux points en tenant compte de la topologie (zones et points de
passage entre elles).
* Ajout de la fonction makeReferencePointDistances(), qui calcule les
distances entre points de référence, en tenant compte de la
topologie.
* Ajout de la fonction point_vector_idx(), semblable à point_tab_idx()
mais pour un vector<Point>.
referencepoint.{hh,cc} :
* Ajout de l'operator de cast en Point (operator Point()).
area.{hh,cc} :
* Ajout de l'operator==(Area).
cfg/distances.csv
* Suppression de ce fichier obsolète.
git-svn-id: https://pif.pu-pm.univ-fcomte.fr/svn/loc@47 785a6c6c-259e-4ff1-8b91-dc31627914f0
2008-06-25 16:19:07 +02:00
|
|
|
vector<Point> areaConnection(const Area &z1, const Area &z2) ;
|
|
|
|
vector<Point> areaConnection(const Area &z) ;
|
|
|
|
float distanceTopology(const Point &p1, const Point &p2) ;
|
|
|
|
|
2008-04-30 11:36:55 +02:00
|
|
|
bool pointExists(const float &x, const float &y, const float &z)const;
|
|
|
|
bool pointExists(const Point &p)const;
|
2008-05-07 10:59:06 +02:00
|
|
|
bool pointExists(const vector<ReferencePoint> &point_list, const float &x, const float &y, const float &z) const ;
|
|
|
|
bool pointExists(const vector<ReferencePoint> &point_list, const Point &p) const ;
|
|
|
|
|
2008-07-03 15:04:30 +02:00
|
|
|
int pointIndex(const float &x, const float &y, const float &z) const;
|
|
|
|
int pointIndex(const Point &p) const;
|
|
|
|
int pointIndex(const vector<ReferencePoint> &point_list, const float &x, const float &y, const float &z) const ;
|
|
|
|
int pointIndex(const vector<ReferencePoint> &point_list, const Point &p) const ;
|
|
|
|
int pointIndex(const Point *tab, unsigned int &size, const Point &p) const ;
|
|
|
|
int pointIndex(const vector<Point> &point_list, const Point &p) const ;
|
2008-05-07 10:59:06 +02:00
|
|
|
|
2008-04-30 11:36:55 +02:00
|
|
|
bool apExists(const string &ap_addr)const;
|
|
|
|
unsigned int apIndex(const string &ap_addr)const;
|
2008-05-07 10:59:06 +02:00
|
|
|
|
2008-04-30 11:36:55 +02:00
|
|
|
vector<Point> getkClosestInSs(const vector<Measurement> &m, const unsigned int &k)const ;
|
|
|
|
vector<Point> getkClosestInSs(const vector<Measurement> &m, const unsigned int &k, const Point *point_ignored)const ;
|
2008-05-07 10:59:06 +02:00
|
|
|
|
2008-04-30 11:36:55 +02:00
|
|
|
Point getkWeightedInSs(const vector<Measurement> &m, const unsigned int &k)const ;
|
|
|
|
Point getkWeightedInSs(const vector<Measurement> &m, const unsigned int &k, const Point *point_ignored)const ;
|
2008-05-07 10:59:06 +02:00
|
|
|
|
2008-04-30 11:36:55 +02:00
|
|
|
Point kPointsAverage(const vector<Point> &vp)const;
|
|
|
|
Point fbcm(const vector<Measurement> &m, const int &client_idx)const;
|
2008-07-17 10:19:15 +02:00
|
|
|
Point fbcm_friis( const vector<Measurement> &m, const vector<float> friis_idx_list, const float &z)const;
|
2008-04-30 11:36:55 +02:00
|
|
|
Point interlink(const vector<Measurement> &m, const int &client_idx)const;
|
2008-05-07 10:59:06 +02:00
|
|
|
|
2008-04-30 11:36:55 +02:00
|
|
|
void makeReferencePointListFromFile(const string &filename);
|
2008-05-05 13:59:55 +02:00
|
|
|
void makePointListFromFile(vector<ReferencePoint> &dest_point_list, const string &filename) ;
|
2008-05-07 10:59:06 +02:00
|
|
|
void makePointListFromFile(vector<ReferencePoint> &dest_point_list, const string &filename, const bool uniq_point) ;
|
2008-04-30 11:36:55 +02:00
|
|
|
void makeApListFromFile(const string &filename);
|
2008-05-29 10:48:05 +02:00
|
|
|
void makeTopologyFromFile(const string &filename) ;
|
GuiNuMo : gestion topologie
server.{hh,cc} :
* Utilisation d'une map plutôt que d'une multimap pour stocker la liste
des pièces. Conséquence : les noms des zones doivent être uniques, il
faut donc numéroter les zones des pièces composites (par exemple
« Couloir N1 A » et « Couloir N1 B »).
* Ajout de la fonction inWhichAreas() qui permet d'obtenir la liste des
zones auxquelles appartient un point.
* Modification de la fonction makeWaypointDistancesFromFile() (renommée
makeWaypointListFromFile()) de manière à ce qu'elle calcule la matrice
des distances entre points de passage (lecture d'une liste de points).
Abandon du format décrivant les points en visibilité (voir le fichier
cfg/distances.csv, supprimé à cette révision), puisque nous nous
servons des points de passage et de la description des zones pour
calculer les liens entre points. RESTE À FAIRE : prise en comppte de
la topologie dans le calcul de distance.
* Ajout de deux fonctions areaConnection() qui permettent de récupérer
la liste des points de passage d'une zone, ou faisant l'intersection
entre deux zones.
* Ajout de la fonction distanceTopology, qui calcule la distance entre
deux points en tenant compte de la topologie (zones et points de
passage entre elles).
* Ajout de la fonction makeReferencePointDistances(), qui calcule les
distances entre points de référence, en tenant compte de la
topologie.
* Ajout de la fonction point_vector_idx(), semblable à point_tab_idx()
mais pour un vector<Point>.
referencepoint.{hh,cc} :
* Ajout de l'operator de cast en Point (operator Point()).
area.{hh,cc} :
* Ajout de l'operator==(Area).
cfg/distances.csv
* Suppression de ce fichier obsolète.
git-svn-id: https://pif.pu-pm.univ-fcomte.fr/svn/loc@47 785a6c6c-259e-4ff1-8b91-dc31627914f0
2008-06-25 16:19:07 +02:00
|
|
|
void makeWaypointListFromFile(const string &filename) ;
|
|
|
|
void makeReferencePointDistances() ;
|
2008-05-07 10:59:06 +02:00
|
|
|
|
2008-07-03 15:04:30 +02:00
|
|
|
bool checkTopology() ;
|
|
|
|
|
2008-07-04 11:27:51 +02:00
|
|
|
void selectDistances(float_array *matrix, const vector<Point> &l1, const vector<Point> &l2) const ;
|
|
|
|
void computeEuclideanDistances(float_array *matrix, const vector<Point> &l1, const vector<Point> &l2) const ;
|
2008-07-09 10:27:39 +02:00
|
|
|
void computeTopologyDistances(float_array *matrix, const vector<Point> &l1, const vector<Point> &l2) ;
|
2008-07-04 11:27:51 +02:00
|
|
|
|
|
|
|
void printReferencePointList() ;
|
2008-05-05 13:59:55 +02:00
|
|
|
void printPointList(vector<ReferencePoint> &point_list) ;
|
2008-07-04 11:27:51 +02:00
|
|
|
void printAccessPointList() const ;
|
2008-05-07 10:59:06 +02:00
|
|
|
|
2008-04-11 10:11:29 +02:00
|
|
|
void computeFriisFromRefList();
|
2008-06-17 11:08:26 +02:00
|
|
|
vector<float> computeFriisFromRefList(const Point &p, const vector<Measurement> &m);
|
2008-05-07 10:59:06 +02:00
|
|
|
|
2008-04-11 10:11:29 +02:00
|
|
|
unsigned int getNbReferencePoints()const { return reference_point_list.size(); };
|
2008-05-05 13:59:55 +02:00
|
|
|
|
2008-06-20 12:37:25 +02:00
|
|
|
void monitorClient(const unsigned int &client_id, const ALGORITHM &algo) ;
|
2008-07-04 11:27:51 +02:00
|
|
|
Point fastViterbiLike(const unsigned int &id_client, const float_array &distance_matrix) ;
|
2008-05-07 10:59:06 +02:00
|
|
|
|
2008-04-11 10:11:29 +02:00
|
|
|
/* For experimentation purpose only ! */
|
2008-08-07 15:44:54 +02:00
|
|
|
void radar_exp(const string &outfile = DEFAULT_LOGFILE, const string &testfile = DEFAULT_REF_POINT_FILE_1M);
|
2008-04-11 10:11:29 +02:00
|
|
|
};
|
|
|
|
|
2008-05-29 10:48:05 +02:00
|
|
|
#endif // _SERVER_HH_
|