Fixed the mixing of aircraft coordinates in the details view, by

checking if the ICAO address of the frame and the current item
in the details view match. Slight refactor by placing the decimal
to string conversion function into the string_format module.

Added fix in the scope of issue #365

FrequencyStepView field in TransmitterView class

FrequencyStepView field in TransmitterView class

Update ui_transmitter.hpp

Update credits

Fixed left padding of the decimal part of the numbers.
This commit is contained in:
teixeluis 2021-06-23 23:52:15 +01:00
parent 97349b06ef
commit fe806b7bdc
12 changed files with 77 additions and 55 deletions

View File

@ -31,8 +31,9 @@ namespace ui
console.writeln("N0vaPixel,klockee,GullCode"); console.writeln("N0vaPixel,klockee,GullCode");
console.writeln("jamesshao8,ITAxReal,rascafr"); console.writeln("jamesshao8,ITAxReal,rascafr");
console.writeln("mcules,dqs105,strijar"); console.writeln("mcules,dqs105,strijar");
console.writeln("zhang00963,RedFox-Fr"); console.writeln("zhang00963,RedFox-Fr,aldude999");
console.writeln("East2West,fossum,ArjanOnwezen"); console.writeln("East2West,fossum,ArjanOnwezen");
console.writeln("vXxOinvizioNxX,teixeluis");
console.writeln(""); console.writeln("");
break; break;

View File

@ -20,6 +20,7 @@
* Boston, MA 02110-1301, USA. * Boston, MA 02110-1301, USA.
*/ */
#include <strings.h>
#include "ui_adsb_rx.hpp" #include "ui_adsb_rx.hpp"
#include "ui_alphanum.hpp" #include "ui_alphanum.hpp"
@ -234,49 +235,38 @@ void ADSBRxView::on_frame(const ADSBFrameMessage * message) {
entry.set_frame_pos(frame, raw_data[6] & 4); entry.set_frame_pos(frame, raw_data[6] & 4);
if (entry.pos.valid) { if (entry.pos.valid) {
std::string latitude_str(8, '\0');
std::string longitude_str(8, '\0');
int written = std::snprintf(&latitude_str[0], latitude_str.size(), "%.2f", entry.pos.latitude);
latitude_str.resize(written);
written = std::snprintf(&longitude_str[0], longitude_str.size(), "%.2f", entry.pos.longitude);
longitude_str.resize(written);
str_info = "Alt:" + to_string_dec_int(entry.pos.altitude) + str_info = "Alt:" + to_string_dec_int(entry.pos.altitude) +
" Lat:" + latitude_str + " Lat:" + to_string_decimal(entry.pos.latitude, 2) +
" Lon:" + longitude_str; " Lon:" + to_string_decimal(entry.pos.longitude, 2);
// printing the coordinates in the log file with more // printing the coordinates in the log file with more
// resolution, as we are not constrained by screen // resolution, as we are not constrained by screen
// real estate there: // real estate there:
latitude_str.resize(13, '\0');
longitude_str.resize(13, '\0');
written = std::snprintf(&latitude_str[0], latitude_str.size(), "%.7f", entry.pos.latitude);
latitude_str.resize(written);
written = std::snprintf(&longitude_str[0], longitude_str.size(), "%.7f", entry.pos.longitude);
longitude_str.resize(written);
std::string log_info = "Alt:" + to_string_dec_int(entry.pos.altitude) + std::string log_info = "Alt:" + to_string_dec_int(entry.pos.altitude) +
" Lat:" + latitude_str + " Lat:" + to_string_decimal(entry.pos.latitude, 7) +
" Lon:" + longitude_str; " Lon:" + to_string_decimal(entry.pos.longitude, 7);
entry.set_info_string(str_info); entry.set_info_string(str_info);
logentry+=log_info + " "; logentry+=log_info + " ";
if (send_updates) // we only want to update the details view if the frame
// we received has the same ICAO address, i.e. belongs to
// the same aircraft:
if(send_updates && details_view->get_current_entry().ICAO_address == ICAO_address) {
details_view->update(entry); details_view->update(entry);
}
} }
} else if(msg_type == AIRBORNE_VEL && msg_sub >= VEL_GND_SUBSONIC && msg_sub <= VEL_AIR_SUPERSONIC){ } else if(msg_type == AIRBORNE_VEL && msg_sub >= VEL_GND_SUBSONIC && msg_sub <= VEL_AIR_SUPERSONIC){
entry.set_frame_velo(frame); entry.set_frame_velo(frame);
logentry += "Type:" + to_string_dec_uint(msg_sub) + logentry += "Type:" + to_string_dec_uint(msg_sub) +
" Hdg:" + to_string_dec_uint(entry.velo.heading) + " Hdg:" + to_string_dec_uint(entry.velo.heading) +
" Spd: "+ to_string_dec_int(entry.velo.speed); " Spd: "+ to_string_dec_int(entry.velo.speed);
if (send_updates)
// same here:
if (send_updates && details_view->get_current_entry().ICAO_address == ICAO_address) {
details_view->update(entry); details_view->update(entry);
}
} }
} }
recent_entries_view.set_dirty(); recent_entries_view.set_dirty();

View File

@ -161,6 +161,8 @@ public:
void update(const AircraftRecentEntry& entry); void update(const AircraftRecentEntry& entry);
std::string title() const override { return "Details"; }; std::string title() const override { return "Details"; };
AircraftRecentEntry get_current_entry() { return entry_copy; }
private: private:
AircraftRecentEntry entry_copy { 0 }; AircraftRecentEntry entry_copy { 0 };

View File

@ -111,14 +111,12 @@ void set_direction(const rf::Direction new_direction) {
// Hack to fix the CPLD (clocking ?) bug: toggle CPLD SRAM overlay depending on new direction // Hack to fix the CPLD (clocking ?) bug: toggle CPLD SRAM overlay depending on new direction
// Use CPLD's EEPROM config when transmitting // Use CPLD's EEPROM config when transmitting
// Use the SRAM overlay when receiving // Use the SRAM overlay when receiving
if (direction != new_direction) {
if (new_direction == rf::Direction::Transmit) { // teixeluis: undone "Hack to fix the CPLD (clocking ?) bug".
hackrf::cpld::init_from_eeprom(); // Apparently with current CPLD code from the hackrf repo,
} else { // toggling CPLD overlay should no longer be necessary:
if( !hackrf::cpld::load_sram() ) { if (direction != new_direction && new_direction == rf::Direction::Transmit) {
chSysHalt(); hackrf::cpld::init_from_eeprom();
}
}
} }
direction = new_direction; direction = new_direction;

View File

@ -171,7 +171,11 @@ void ReceiverModel::enable() {
update_baseband_bandwidth(); update_baseband_bandwidth();
update_sampling_rate(); update_sampling_rate();
update_modulation(); update_modulation();
// TODO: would challenge if this should belong to the
// receiver_model namespace:
update_headphone_volume(); update_headphone_volume();
led_rx.on(); led_rx.on();
} }
@ -182,6 +186,10 @@ void ReceiverModel::disable() {
// TODO: Responsibility for enabling/disabling the radio is muddy. // TODO: Responsibility for enabling/disabling the radio is muddy.
// Some happens in ReceiverModel, some inside radio namespace. // Some happens in ReceiverModel, some inside radio namespace.
radio::disable(); radio::disable();
// TODO: we are doing this repeatedly in different levels of the
// call stack. Keeping it for now, but there seem to be too many
// redundant calls:
led_rx.off(); led_rx.off();
} }

View File

@ -112,6 +112,23 @@ std::string to_string_dec_int(
return q; return q;
} }
std::string to_string_decimal(float decimal, int8_t precision) {
double integer_part;
double fractional_part;
std::string result;
fractional_part = modf(decimal, &integer_part) * pow(10, precision);
if (fractional_part < 0) {
fractional_part = -fractional_part;
}
result = to_string_dec_int(integer_part) + "." + to_string_dec_uint(fractional_part, precision, '0');
return result;
}
std::string to_string_short_freq(const uint64_t f) { std::string to_string_short_freq(const uint64_t f) {
auto final_str = to_string_dec_int(f / 1000000,4) + "." + to_string_dec_int((f / 100) % 10000, 4, '0'); auto final_str = to_string_dec_int(f / 1000000,4) + "." + to_string_dec_int((f / 100) % 10000, 4, '0');
return final_str; return final_str;

View File

@ -43,6 +43,8 @@ const char unit_prefix[7] { 'n', 'u', 'm', 0, 'k', 'M', 'G' };
std::string to_string_bin(const uint32_t n, const uint8_t l = 0); std::string to_string_bin(const uint32_t n, const uint8_t l = 0);
std::string to_string_dec_uint(const uint32_t n, const int32_t l = 0, const char fill = ' '); std::string to_string_dec_uint(const uint32_t n, const int32_t l = 0, const char fill = ' ');
std::string to_string_dec_int(const int32_t n, const int32_t l = 0, const char fill = 0); std::string to_string_dec_int(const int32_t n, const int32_t l = 0, const char fill = 0);
std::string to_string_decimal(float decimal, int8_t precision);
std::string to_string_hex(const uint64_t n, const int32_t l = 0); std::string to_string_hex(const uint64_t n, const int32_t l = 0);
std::string to_string_hex_array(uint8_t * const array, const int32_t l = 0); std::string to_string_hex_array(uint8_t * const array, const int32_t l = 0);

View File

@ -63,17 +63,9 @@ GeoPos::GeoPos(
const auto changed_fn = [this](int32_t) { const auto changed_fn = [this](int32_t) {
float lat_value = lat(); float lat_value = lat();
float lon_value = lon(); float lon_value = lon();
double integer_part;
double fractional_part; text_lat_decimal.set(to_string_decimal(lat_value, 5));
text_lon_decimal.set(to_string_decimal(lon_value, 5));
fractional_part = modf(lat_value, &integer_part) * 100000;
if (fractional_part < 0)
fractional_part = -fractional_part;
text_lat_decimal.set(to_string_dec_int(integer_part) + "." + to_string_dec_uint(fractional_part, 5));
fractional_part = modf(lon_value, &integer_part) * 100000;
if (fractional_part < 0)
fractional_part = -fractional_part;
text_lon_decimal.set(to_string_dec_int(integer_part) + "." + to_string_dec_uint(fractional_part, 5));
if (on_change && report_change) if (on_change && report_change)
on_change(altitude(), lat_value, lon_value); on_change(altitude(), lat_value, lon_value);

View File

@ -103,6 +103,7 @@ void TransmitterView::set_transmitting(const bool transmitting) {
void TransmitterView::on_show() { void TransmitterView::on_show() {
field_frequency.set_value(transmitter_model.tuning_frequency()); field_frequency.set_value(transmitter_model.tuning_frequency());
field_frequency_step.set_by_value(receiver_model.frequency_step());
field_gain.set_value(transmitter_model.tx_gain()); field_gain.set_value(transmitter_model.tx_gain());
field_amp.set_value(transmitter_model.rf_amp() ? 14 : 0); field_amp.set_value(transmitter_model.rf_amp() ? 14 : 0);
@ -122,6 +123,7 @@ TransmitterView::TransmitterView(
add_children({ add_children({
&field_frequency, &field_frequency,
&field_frequency_step,
&text_gain, &text_gain,
&field_gain, &field_gain,
&button_start, &button_start,
@ -157,6 +159,10 @@ TransmitterView::TransmitterView(
if (on_edit_frequency) if (on_edit_frequency)
on_edit_frequency(); on_edit_frequency();
}; };
field_frequency_step.on_change = [this](size_t, OptionsField::value_t v) {
this->field_frequency.set_step(v);
};
field_gain.on_change = [this](uint32_t tx_gain) { field_gain.on_change = [this](uint32_t tx_gain) {
on_tx_gain_changed(tx_gain); on_tx_gain_changed(tx_gain);

View File

@ -124,11 +124,11 @@ private:
}; };
Text text_bw { Text text_bw {
{ 11 * 8, 1 * 8, 9 * 8, 1 * 16 }, { 18 * 8, 1 * 8, 3 * 8, 1 * 16 },
"BW: kHz" "kHz"
}; };
NumberField field_bw { NumberField field_bw {
{ 14 * 8, 1 * 8 }, { 15 * 8, 1 * 8 },
3, 3,
{ 1, 150 }, { 1, 150 },
1, 1,
@ -152,6 +152,10 @@ private:
{ 21 * 8, 1 * 8, 9 * 8, 32 }, { 21 * 8, 1 * 8, 9 * 8, 32 },
"START" "START"
}; };
FrequencyStepView field_frequency_step {
{ 10 * 8 - 4, 1 * 8 },
};
void on_tuning_frequency_changed(rf::Frequency f); void on_tuning_frequency_changed(rf::Frequency f);
void on_channel_bandwidth_changed(uint32_t channel_bandwidth); void on_channel_bandwidth_changed(uint32_t channel_bandwidth);

View File

@ -160,7 +160,9 @@ int cpr_NL_approx(float lat) {
int cpr_NL(float lat) { int cpr_NL(float lat) {
// TODO prove that the approximate function is good // TODO prove that the approximate function is good
// enough for the precision we need. Uncomment if // enough for the precision we need. Uncomment if
// that is true: // that is true. No performance penalty was noticed
// from testing, but if you find it might be an issue,
// switch to cpr_NL_approx() instead:
//return cpr_NL_approx(lat); //return cpr_NL_approx(lat);
@ -199,18 +201,18 @@ void encode_frame_pos(ADSBFrame& frame, const uint32_t ICAO_address, const int32
// CPR encoding // CPR encoding
// Info from: http://antena.fe.uni-lj.si/literatura/Razno/Avionika/modes/CPRencoding.pdf // Info from: http://antena.fe.uni-lj.si/literatura/Razno/Avionika/modes/CPRencoding.pdf
delta_lat = 360.0 / ((4.0 * 15.0) - time_parity); // NZ = 15 delta_lat = 360.0 / ((4.0 * NZ) - time_parity); // NZ = 15
yz = floor(131072.0 * (cpr_mod(latitude, delta_lat) / delta_lat) + 0.5); yz = floor(CPR_MAX_VALUE * (cpr_mod(latitude, delta_lat) / delta_lat) + 0.5);
rlat = delta_lat * ((yz / 131072.0) + floor(latitude / delta_lat)); rlat = delta_lat * ((yz / CPR_MAX_VALUE) + floor(latitude / delta_lat));
if ((cpr_NL(rlat) - time_parity) > 0) if ((cpr_NL(rlat) - time_parity) > 0)
delta_lon = 360.0 / cpr_N(rlat, time_parity); delta_lon = 360.0 / cpr_N(rlat, time_parity);
else else
delta_lon = 360.0; delta_lon = 360.0;
xz = floor(131072.0 * (cpr_mod(longitude, delta_lon) / delta_lon) + 0.5); xz = floor(CPR_MAX_VALUE * (cpr_mod(longitude, delta_lon) / delta_lon) + 0.5);
lat = cpr_mod(yz, 131072.0); lat = cpr_mod(yz, CPR_MAX_VALUE);
lon = cpr_mod(xz, 131072.0); lon = cpr_mod(xz, CPR_MAX_VALUE);
frame.push_byte((altitude_coded << 4) | ((uint32_t)time_parity << 2) | (lat >> 15)); // T = 0 frame.push_byte((altitude_coded << 4) | ((uint32_t)time_parity << 2) | (lat >> 15)); // T = 0
frame.push_byte(lat >> 7); frame.push_byte(lat >> 7);

View File

@ -85,7 +85,7 @@ const float adsb_lat_lut[58] = {
const float PI = 3.14159265358979323846; const float PI = 3.14159265358979323846;
const float NZ = 15; const float NZ = 15.0;
void make_frame_adsb(ADSBFrame& frame, const uint32_t ICAO_address); void make_frame_adsb(ADSBFrame& frame, const uint32_t ICAO_address);