From 54d788586f21f52f833f9302d59f015532c54b12 Mon Sep 17 00:00:00 2001 From: Matteo Cypriani Date: Mon, 5 May 2008 11:59:55 +0000 Subject: [PATCH] Commit-sauvegarde de modifs sur server.cc MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit /!\ Cette révision est présente uniquement pour sauvegarde de modifications. Certains des changements apportés seront annulés à la prochaine révision. /!\ Bogue connu de cette révision : la lecture du fichier de pérégrination est faite grâce à la fonction makePointListFromFile(), donc tous les points vont dans la même entrée de la liste. Nécessité de créer une fonction adaptée. server.cc/hh : * Modifications pour lire un fichier de pérégrination et effectuer les calculs de position. * getkClosestInSs() : correction du sens de la comparaison pour récupérer la distance maximale. * makeReferencePointListFromFile(const string &filename) : remplacement par un appel à la nouvelle fonction générique : makePointListFromFile(vector &dest_point_list, const string &filename). * makePointListFromFile() : suppression de variables inutiles. printReferencePointList() : remplacement par un appel à la nouvelle fonction générique : printPointList(vector &point_list). git-svn-id: https://pif.pu-pm.univ-fcomte.fr/svn/loc@30 785a6c6c-259e-4ff1-8b91-dc31627914f0 --- GuiNuMo-server/server.cc | 109 +++++++++++++++++++++++++++------------ GuiNuMo-server/server.hh | 3 ++ 2 files changed, 78 insertions(+), 34 deletions(-) diff --git a/GuiNuMo-server/server.cc b/GuiNuMo-server/server.cc index 6b6f02e..38b5077 100644 --- a/GuiNuMo-server/server.cc +++ b/GuiNuMo-server/server.cc @@ -357,7 +357,7 @@ vector Server::getkClosestInSs(const vector &m, const unsign { distances_vector.push_back(tmp_distance); points_vector.push_back(reference_point_list[i].getCoordinates()); - dist_max = (dist_max > tmp_distance) ? tmp_distance : dist_max; + dist_max = (dist_max < tmp_distance) ? tmp_distance : dist_max; } else { @@ -405,6 +405,15 @@ vector Server::getkClosestInSs(const vector &m, const unsign } } +#ifdef DEBUG + cout << "getkClosestInSs() : Points sélectionnés :" << endl ; + if (distances_vector.size() != points_vector.size()) + cout << "Erreur ! distances_vector.size()=" << distances_vector.size() << " != points_vector.size()=" << points_vector.size() << endl ; + else + for (i = 0 ; i < distances_vector.size() - 1 ; i++) + cout << distances_vector[i] << " : " << points_vector[i] << endl ; +#endif + return points_vector; } @@ -606,17 +615,26 @@ Point Server::interlink(const vector &m, const int &client_idx)cons +/* FONCTION POUR RÉTRO-COMPATIBILITÉ. + * Crée la liste des points de référence dans la liste reference_point_list. */ void Server::makeReferencePointListFromFile(const string &filename) { - ifstream input_file; - char buffer[BUFFER_LENGTH]; - string lecture_fichier; + makePointListFromFile(reference_point_list, filename) ; +} + + + +/* Lit le fichier de mesures (CSV) nommé "filename", et place les informations dans la liste "dest_point_list". */ +void Server::makePointListFromFile(vector &dest_point_list, const string &filename) +{ + ifstream input_file ; // Flux d'entrée du fichier. + char buffer[BUFFER_LENGTH]; // Buffer lu dans le fichier. + string cpp_buffer ; // Buffer au format string. ReferencePoint rp; Point tmp_point; - float x, y, z ; // Coordonnées des points - unsigned int i, pt_idx; - string cpp_buffer, tmp_mes; - vector infos; + float x, y, z ; // Coordonnées des points. + unsigned int pt_idx ; // Position du point lu dans la liste. + vector infos ; // Liste des informations lues dans une ligne du fichier. input_file.open(filename.c_str()) ; @@ -667,9 +685,11 @@ void Server::makeReferencePointListFromFile(const string &filename) if (!pointExists(tmp_point)) { rp.setCoordinates(tmp_point); - reference_point_list.push_back(rp); -#ifdef DEBUG_2 + dest_point_list.push_back(rp); +#ifdef DEBUG npoints++ ; +#endif +#ifdef DEBUG_2 cout << tmp_point << " : ajouté." << endl ; } else @@ -681,18 +701,18 @@ void Server::makeReferencePointListFromFile(const string &filename) #ifdef FRED_CSV_FORMAT vector measures_vector = extractValues(infos[4]) ; - for (i = 0 ; i < measures_vector.size() ; i++) - reference_point_list[pt_idx].addMeasurement(infos[3], measures_vector[i]); + for (unsigned int i = 0 ; i < measures_vector.size() ; i++) + dest_point_list[pt_idx].addMeasurement(infos[3], measures_vector[i]); measures_vector.clear(); #else - for (i = 4 ; i < infos.size() ; i++) + for (unsigned int i = 4 ; i < infos.size() ; i++) { #ifdef DEBUG_2 cout << "Lecture de la valeur : " << infos[i] << "... " ; #endif if (i + 1 < infos.size()) { - reference_point_list[pt_idx].addMeasurement(infos[i], string2int(infos[i+1])) ; + dest_point_list[pt_idx].addMeasurement(infos[i], string2int(infos[i+1])) ; #ifdef DEBUG_2 cout << "Mesure ajoutée : AP = " << infos[i] << " | SS = " << string2int(infos[i+1]) << endl ; #endif @@ -769,21 +789,27 @@ void Server::makeApListFromFile(const string &filename) +/* FONCTION POUR RÉTRO-COMPATIBILITÉ + * Affiche la liste des points de référence (reference_point_list). */ void Server::printReferencePointList() { - unsigned int i; + printPointList(reference_point_list) ; +} - for (i = 0 ; i < reference_point_list.size() ; i++) - cout << reference_point_list[i] << endl; + + +/* Affiche une liste de points (point_list). */ +void Server::printPointList(vector &point_list) +{ + for (unsigned int i = 0 ; i < point_list.size() ; i++) + cout << point_list[i] << endl ; } void Server::printAccessPointList() { - unsigned int i; - - for (i = 0 ; i < access_point_list.size() ; i++) + for (unsigned int i = 0 ; i < access_point_list.size() ; i++) cout << access_point_list[i] << endl; } @@ -791,14 +817,13 @@ void Server::printAccessPointList() void Server::computeFriisFromRefList() { - unsigned int i, j; vector friis_idx_list; Point pt_coords, ap_coords; float ap_power, ap_gain, calib_gain = 2, const_term, mes_power, friis_sum; unsigned int ap_freq; string ap_mac; - for (i = 0 ; i < access_point_list.size() ; i++) + for (unsigned int i = 0 ; i < access_point_list.size() ; i++) { ap_power = access_point_list[i].getOutputPower(); ap_coords = access_point_list[i].getCoordinates(); @@ -812,18 +837,21 @@ void Server::computeFriisFromRefList() const_term += 20 * log10 (300000000.0 / ap_freq) + ap_power; /* Compute an index for each ref point. List stored in friis_idx_list */ - for (j = 0 ; j < reference_point_list.size() ; j++) + for (unsigned int j = 0 ; j < reference_point_list.size() ; j++) { pt_coords = reference_point_list[j].getCoordinates(); if (reference_point_list[i].getPowerForAp(ap_mac, &mes_power)) friis_idx_list.push_back((const_term - mes_power) / (10 * log10(ap_coords.distance(pt_coords)))); } + /* Now, compute avg value */ friis_sum = 0; - for (j = 0 ; j < friis_idx_list.size() ; j++) + for (unsigned int j = 0 ; j < friis_idx_list.size() ; j++) friis_sum += friis_idx_list[j]; access_point_list[i].setFriisIndex(friis_sum / friis_idx_list.size()); + cout << access_point_list[i].getApAddr() << " -> " << (friis_sum / friis_idx_list.size()) << endl; + friis_idx_list.clear(); } } @@ -844,6 +872,8 @@ void Server::fastViterbiLike(const unsigned short &N, const unsigned short &K, c vector &E_current = cl.getRef_viterbi_Ecurrent(), &E_previous = cl.getRef_viterbi_Eprevious() ; + vector peregrination_point_list ; + makePointListFromFile(peregrination_point_list, DEFAULT_TRACKING_FILE) ; #else float **V = client_list[id_client].get_viterbi_V() ; vector @@ -860,27 +890,35 @@ void Server::fastViterbiLike(const unsigned short &N, const unsigned short &K, c } #ifdef TEST - int pt = 0 ; -#ifdef DEBUG - cout << reference_point_list.size() << " points à traiter." << endl ; -#endif - while (pt < reference_point_list.size()) + unsigned int pt = 0 ; + #ifdef DEBUG + cout << reference_point_list.size() << " points de référence, " << peregrination_point_list.size() << " points de pérégrination." << endl ; + + cout << "***** Liste : *****" << endl ; + for (int c = 0 ; c < peregrination_point_list.size() ; c++) + cout << peregrination_point_list[c] << endl ; + cout << "*******************" << endl ; + #endif + + while (pt < peregrination_point_list.size()) #else while (true) #endif { vector vm ; - Point *ref_coords = NULL ; // Coordonnées de référence (à ignorer). #ifdef TEST /* Get point measurements */ - vm.clear(); - vm = reference_point_list[pt].getMeasurementList(); - // *ref_coords = reference_point_list[i].getCoordinates(); + //vm.clear(); + vm = peregrination_point_list[pt].getMeasurementList(); #endif E_previous = E_current ; - E_current = getkClosestInSs(vm, K, ref_coords) ; // Création de l'ensemble des K points les plus proches dans l'espace des puissances. + E_current = getkClosestInSs(vm, K) ; // Création de l'ensemble des K points les plus proches dans l'espace des puissances. + +#ifdef DEBUG + cout << "Point courant : " << peregrination_point_list[pt] ; +#endif if (i > 1) // Si on n'est plus à la première itération { @@ -923,7 +961,9 @@ void Server::fastViterbiLike(const unsigned short &N, const unsigned short &K, c } } +#ifdef DEBUG // cout << "(N=" << N << ") - 1 - (i=" << i << ") = " << N-1-i << endl ; + cout << "V :" << endl ; for (int n=0 ; n < N-1 ; n++) { for (int k=0 ; k < K ; k++) @@ -931,6 +971,7 @@ void Server::fastViterbiLike(const unsigned short &N, const unsigned short &K, c cout << endl ; } cout << "\n--------------------------" << endl ; +#endif if (i < N-1) i++ ; diff --git a/GuiNuMo-server/server.hh b/GuiNuMo-server/server.hh index ee30e3a..3821a6c 100644 --- a/GuiNuMo-server/server.hh +++ b/GuiNuMo-server/server.hh @@ -68,11 +68,14 @@ public: Point fbcm(const vector &m, const int &client_idx)const; Point interlink(const vector &m, const int &client_idx)const; void makeReferencePointListFromFile(const string &filename); + void makePointListFromFile(vector &dest_point_list, const string &filename) ; void makeApListFromFile(const string &filename); void printReferencePointList(); + void printPointList(vector &point_list) ; void printAccessPointList(); void computeFriisFromRefList(); unsigned int getNbReferencePoints()const { return reference_point_list.size(); }; + /* For experimentation purpose only ! */ void radar_exp();