Get rid of the SS - 0x100 problems

In the listener & aggregator, the signal strength is stored as an
unsigned byte. To display the actual (negative) value, one must
substract 256 (0x100) to the unsigned value.
This commit changes several things:
 - Use the decimal (256) instead of the hexadecimal value (0x100).
 - Don't substract 256 when copying the value to another unsigned byte
   (aggregator).
 - Be careful with the type length. In the positioning server, a SS
   could be copied to a signed byte, while (theoretically) the negative
   value can exceed the capacity of the signed byte. measurement.hh now
   defines a type ss_t to store a signal strength value with the good
   size (it is currently an int_fast16_t).
This commit is contained in:
Matteo Cypriani 2011-12-30 18:27:30 +01:00
parent 5bef966d14
commit 4dc45acff7
6 changed files with 27 additions and 26 deletions

View File

@ -514,7 +514,7 @@ int read_loop(int sockfd)
mobile_ip_str,
request_time_str,
capture_time_str,
request.ss_dbm - 0x100,
request.ss_dbm - 256,
request.x_position,
request.y_position,
request.z_position,
@ -664,8 +664,7 @@ void* monitor_requests(void *NULL_value)
memcpy(info.ap_mac_addr_bytes,
request_info_ptr->ap_mac_addr_bytes,
ETHER_ADDR_LEN) ;
info.ss_dbm =
request_info_ptr->ss_dbm - 0x100 ;
info.ss_dbm = request_info_ptr->ss_dbm ;
sendto(sockfd, &info, sizeof(info),
0, (struct sockaddr *)&serv, serv_len) ;
@ -675,7 +674,7 @@ void* monitor_requests(void *NULL_value)
mac_str) ;
fprintf(fd, ";%s;%d",
mac_str,
request_info_ptr->ss_dbm - 0x100) ;
request_info_ptr->ss_dbm - 256) ;
// Delete request
request_info_ptr = request_info_ptr->next ;
@ -1297,7 +1296,7 @@ void print_request_info(request_info_list *info)
"\tAP MAC: %s\n"
"\tSignal strength: %d dBm\n",
ap_mac_str,
info->ss_dbm - 0x100
info->ss_dbm - 256
) ;
}
#endif // NDEBUG

View File

@ -1056,7 +1056,7 @@ void read_packet(u_char *args, const struct pcap_pkthdr *header,
request_time_str,
capture_time_str,
rtap_fields[RTAP_ANTENNASIGNALDBM] ?
request.ss_dbm - 0x100 : 0,
request.ss_dbm - 256 : 0,
owl_ntohf(request.x_position),
owl_ntohf(request.y_position),
owl_ntohf(request.z_position),
@ -1152,7 +1152,7 @@ void extract_radiotap_data(const u_char *packet,
rtap_fields[RTAP_ANTENNASIGNALDBM] = owl_true;
if (VERBOSE_INFO)
printf("Antenna signal: %d dBm\n",
request->ss_dbm - 0x100);
request->ss_dbm - 256);
rtap_position += RTAP_L_ANTENNASIGNALDBM ;
break ;
case RTAP_ANTENNANOISEDBM:

View File

@ -42,11 +42,11 @@ const string InputLogCSV::request_to_csv(const Request &request) const
for (unordered_map<string, Measurement>::const_iterator i
= measurements.begin() ; i != measurements.end() ; ++i)
{
const vector<int> &ss_list = i->second.get_ss_list() ;
const vector<ss_t> &ss_list = i->second.get_ss_list() ;
const string &ap_mac = i->second.get_ap() != NULL
? i->second.get_ap()->get_mac_addr()
: "" ;
for (vector<int>::const_iterator i = ss_list.begin() ;
for (vector<ss_t>::const_iterator i = ss_list.begin() ;
i != ss_list.end() ; ++i)
{
csv_line << ';' << ap_mac ;

View File

@ -167,14 +167,14 @@ bool InputUDPSocket::fill_current_request()
// Substracting 256 is not mandatory here since it is done
// automatically when casting from unsigned to signed, but
// I write it anyway for the sake of clarity.
int_fast8_t ss = request_info.ss_dbm - 0x100 ;
ss_t ss = request_info.ss_dbm - 256 ;
if (Configuration::is_configured("verbose"))
cout
<< "\t* Packet received from the aggregator:"
<< "\n\t\tAP MAC: " << mac_ap
<< "\n\t\tSignal: "
<< static_cast<int_fast16_t>(ss) << " dBm"
<< ss << " dBm"
<< '\n' ;
if (! Configuration::bool_value("positioning.accept-new-aps") &&

View File

@ -16,7 +16,7 @@ Measurement::Measurement(const AccessPoint *_ap):
Measurement::Measurement(const AccessPoint *_ap,
const vector<int> &_ss_list):
const vector<ss_t> &_ss_list):
ap(const_cast<AccessPoint*>(_ap)), ss_list(_ss_list)
{
ss_list.reserve(10) ;
@ -41,7 +41,7 @@ Measurement::~Measurement()
/**
* @param ss_dbm The signal strength to add to #ss_list (in dBm).
*/
void Measurement::add_ss(const int &ss_dbm)
void Measurement::add_ss(const ss_t &ss_dbm)
{
double total_ss_mwatts =
pow(10, static_cast<double>(ss_dbm) / 10.0) + // New SS in mW
@ -54,14 +54,14 @@ void Measurement::add_ss(const int &ss_dbm)
}
void Measurement::set_ss_list(const std::vector<int> &_ss_list)
void Measurement::set_ss_list(const std::vector<ss_t> &_ss_list)
{
ss_list = _ss_list ;
update_average_ss() ;
}
void Measurement::add_ss_list(const std::vector<int> &_ss_list)
void Measurement::add_ss_list(const std::vector<ss_t> &_ss_list)
{
ss_list.insert(ss_list.end(), _ss_list.begin(), _ss_list.end()) ;
update_average_ss() ;
@ -69,8 +69,8 @@ void Measurement::add_ss_list(const std::vector<int> &_ss_list)
/**
* Merge consists of adding the SS values of \em source to #ss_list. It is
* possible only if the #ap of the two Measurement are identical.
* Merge consists of adding the SS values of \em source to #ss_list. It
* is possible only if the #ap of the two Measurement are identical.
* @throw cannot_merge if the AP of the two Measurement are different.
*/
void Measurement::merge(const Measurement &source)
@ -110,7 +110,7 @@ void Measurement::update_average_ss()
double total_ss_mwatts = 0 ;
for (vector<int>::const_iterator i = ss_list.begin() ;
for (vector<ss_t>::const_iterator i = ss_list.begin() ;
i != ss_list.end() ; ++i)
// Add the current value in mW to the total
total_ss_mwatts += pow(10, static_cast<double>(*i) / 10.0) ;
@ -161,7 +161,7 @@ ostream &operator<<(ostream &os, const Measurement &m)
if (m.ss_list.empty())
os << "No values" ;
else
for (vector<int>::const_iterator i = m.ss_list.begin() ;
for (vector<ss_t>::const_iterator i = m.ss_list.begin() ;
i != m.ss_list.end() ; ++i)
{
os << *i ;

View File

@ -7,6 +7,8 @@
#include <ostream>
#include <cmath>
typedef int_fast16_t ss_t ;
/// Represents a list of signal strengths captured by one AccessPoint
class Measurement
{
@ -14,7 +16,7 @@ protected:
/// The AccessPoint that performed the measurement
AccessPoint *ap ;
/// List of signal strengths captured (in dBm)
std::vector<int> ss_list ;
std::vector<ss_t> ss_list ;
/// Average of all signal strength captured (dBm)
double average_ss ;
@ -29,7 +31,7 @@ public:
Measurement(const AccessPoint *_ap = NULL) ;
Measurement(const AccessPoint *_ap,
const std::vector<int> &_ss_list) ;
const std::vector<ss_t> &_ss_list) ;
Measurement(const Measurement &source):
ap(source.ap), ss_list(source.ss_list),
@ -40,7 +42,7 @@ public:
/** @name Read accessors */
//@{
AccessPoint* get_ap() const ;
const std::vector<int>& get_ss_list() const ;
const std::vector<ss_t>& get_ss_list() const ;
double get_average_ss() const ;
int get_ss_list_size() const ;
//@}
@ -48,11 +50,11 @@ public:
/** @name Write accessors */
//@{
void set_ap(const AccessPoint *_ap) ;
void set_ss_list(const std::vector<int> &_ss_list) ;
void set_ss_list(const std::vector<ss_t> &_ss_list) ;
/// Adds a signal strength to #ss_list
void add_ss(const int &ss_dbm) ;
void add_ss(const ss_t &ss_dbm) ;
/// Adds several signal strengths to #ss_list
void add_ss_list(const std::vector<int> &_ss_list) ;
void add_ss_list(const std::vector<ss_t> &_ss_list) ;
/// Merges a given Measurement into the current Measurement
void merge(const Measurement &source) ;
void clear(void) ;
@ -89,7 +91,7 @@ inline AccessPoint* Measurement::get_ap() const
}
inline const std::vector<int>& Measurement::get_ss_list() const
inline const std::vector<ss_t>& Measurement::get_ss_list() const
{
return ss_list ;
}