Compare commits

...

7 Commits

Author SHA1 Message Date
gullradriel e2620f1a33 Merge pull request #822 from heurist1/fix-tuning-radio-when-opening-app-with-settings
Fix  the initialisation of frquency when apps are launched
2023-03-05 20:57:54 +01:00
heurist1 f6a4cc26ee Move where on_change for the frequency field is setup, so that the frequency is correctly initialised when the app is launched and settings are being used 2023-03-05 19:50:56 +00:00
gullradriel 3d248647c9 Set usable persistent memory defaults for Recon (#820)
* Set usable defaults for Recon when PortaPack is not having a valid button battery installed

* fixed indentation

* fixed indentation

---------

Co-authored-by: GullCode <gullradriel@hotmail.com>
2023-03-04 22:04:53 +01:00
gullradriel 3c13161273 Merge pull request #818 from Brumi-2021/ADSB_squawk_investigation
Correct squawk id in ADSB TX
2023-03-04 08:10:43 +01:00
gullradriel f0b4914186 Merge pull request #819 from Brumi-2021/revert_new_spectrum_colour_scheme
Revert "New spectrum color scheme"
2023-03-04 08:09:44 +01:00
Brumi-2021 037fc098ef Revert "New spectrum color scheme"
This reverts commit f59437cf71.
2023-03-04 00:47:40 +01:00
Brumi-2021 988404df9c Correct squawk id in ADSB TX 2023-03-03 23:10:58 +01:00
10 changed files with 388 additions and 304 deletions
@@ -129,6 +129,11 @@ AnalogAudioView::AnalogAudioView(
&waterfall
});
// Set on_change before initialising the field
field_frequency.on_change = [this](rf::Frequency f) {
this->on_tuning_frequency_changed(f);
};
// load app settings
auto rc = settings.load("rx_audio", &app_settings);
if(rc == SETTINGS_OK) {
@@ -144,9 +149,6 @@ AnalogAudioView::AnalogAudioView(
record_view.set_filename_date_frequency(true);
field_frequency.set_step(receiver_model.frequency_step());
field_frequency.on_change = [this](rf::Frequency f) {
this->on_tuning_frequency_changed(f);
};
field_frequency.on_edit = [this, &nav]() {
// TODO: Provide separate modal method/scheme?
auto new_view = nav.push<FrequencyKeypadView>(receiver_model.tuning_frequency());
+4 -3
View File
@@ -57,6 +57,10 @@ AnalogTvView::AnalogTvView(
&tv
});
// Set on_change before initialising the field
field_frequency.on_change = [this](rf::Frequency f) {
this->on_tuning_frequency_changed(f);
};
// load app settings
auto rc = settings.load("rx_tv", &app_settings);
@@ -70,9 +74,6 @@ AnalogTvView::AnalogTvView(
field_frequency.set_step(receiver_model.frequency_step());
field_frequency.on_change = [this](rf::Frequency f) {
this->on_tuning_frequency_changed(f);
};
field_frequency.on_edit = [this, &nav]() {
// TODO: Provide separate modal method/scheme?
auto new_view = nav.push<FrequencyKeypadView>(receiver_model.tuning_frequency());
+5 -3
View File
@@ -77,6 +77,11 @@ POCSAGAppView::POCSAGAppView(NavigationView& nav) {
&console
});
// Set on_change before initialising the field
field_frequency.on_change = [this](rf::Frequency f) {
update_freq(f);
};
// load app settings
auto rc = settings.load("rx_pocsag", &app_settings);
if(rc == SETTINGS_OK) {
@@ -94,9 +99,6 @@ POCSAGAppView::POCSAGAppView(NavigationView& nav) {
receiver_model.enable();
field_frequency.set_step(receiver_model.frequency_step());
field_frequency.on_change = [this](rf::Frequency f) {
update_freq(f);
};
field_frequency.on_edit = [this, &nav]() {
// TODO: Provide separate modal method/scheme?
auto new_view = nav.push<FrequencyKeypadView>(receiver_model.tuning_frequency());
+1 -1
View File
@@ -207,7 +207,7 @@ void ADSBSquawkView::collect_frames(const uint32_t ICAO_address, std::vector<ADS
ADSBFrame temp_frame;
(void)ICAO_address;
encode_frame_squawk(temp_frame, field_squawk.value_dec_u32());
encode_frame_squawk(temp_frame, field_squawk.concatenate_4_octal_u16());
frame_list.emplace_back(temp_frame);
}
+256 -256
View File
@@ -281,262 +281,262 @@ const std::array<ui::Color, 256> spectrum_rgb2_lut { {
} };
const std::array<ui::Color, 256> spectrum_rgb3_lut { {
{ 0x00, 0x00, 0x02 },
{ 0x00, 0x00, 0x04 },
{ 0x00, 0x00, 0x05 },
{ 0x00, 0x00, 0x07 },
{ 0x00, 0x00, 0x0a },
{ 0x00, 0x00, 0x0c },
{ 0x00, 0x00, 0x0e },
{ 0x00, 0x00, 0x10 },
{ 0x00, 0x00, 0x13 },
{ 0x00, 0x00, 0x15 },
{ 0x00, 0x00, 0x17 },
{ 0x00, 0x00, 0x19 },
{ 0x00, 0x00, 0x1b },
{ 0x00, 0x00, 0x1d },
{ 0x00, 0x00, 0x1f },
{ 0x00, 0x00, 0x21 },
{ 0x00, 0x00, 0x24 },
{ 0x00, 0x00, 0x25 },
{ 0x00, 0x00, 0x28 },
{ 0x00, 0x00, 0x29 },
{ 0x00, 0x00, 0x2c },
{ 0x00, 0x00, 0x2e },
{ 0x00, 0x00, 0x30 },
{ 0x00, 0x00, 0x33 },
{ 0x00, 0x00, 0x35 },
{ 0x00, 0x00, 0x37 },
{ 0x00, 0x00, 0x39 },
{ 0x00, 0x00, 0x3b },
{ 0x00, 0x00, 0x3d },
{ 0x00, 0x00, 0x3f },
{ 0x00, 0x00, 0x41 },
{ 0x00, 0x00, 0x43 },
{ 0x00, 0x00, 0x46 },
{ 0x00, 0x00, 0x48 },
{ 0x00, 0x00, 0x4a },
{ 0x00, 0x00, 0x4c },
{ 0x00, 0x00, 0x4e },
{ 0x00, 0x00, 0x50 },
{ 0x00, 0x00, 0x53 },
{ 0x00, 0x00, 0x55 },
{ 0x00, 0x00, 0x56 },
{ 0x00, 0x00, 0x59 },
{ 0x00, 0x00, 0x5b },
{ 0x00, 0x00, 0x5d },
{ 0x00, 0x00, 0x5f },
{ 0x00, 0x00, 0x62 },
{ 0x00, 0x00, 0x63 },
{ 0x00, 0x00, 0x66 },
{ 0x00, 0x00, 0x68 },
{ 0x00, 0x00, 0x6a },
{ 0x00, 0x00, 0x6c },
{ 0x00, 0x00, 0x6e },
{ 0x00, 0x00, 0x70 },
{ 0x00, 0x00, 0x73 },
{ 0x00, 0x00, 0x75 },
{ 0x00, 0x00, 0x77 },
{ 0x00, 0x00, 0x79 },
{ 0x00, 0x00, 0x7b },
{ 0x00, 0x00, 0x7d },
{ 0x00, 0x00, 0x7f },
{ 0x00, 0x00, 0x82 },
{ 0x00, 0x00, 0x84 },
{ 0x00, 0x00, 0x86 },
{ 0x00, 0x00, 0x88 },
{ 0x00, 0x00, 0x8a },
{ 0x00, 0x00, 0x8c },
{ 0x00, 0x00, 0x8e },
{ 0x00, 0x00, 0x91 },
{ 0x00, 0x00, 0x93 },
{ 0x00, 0x00, 0x95 },
{ 0x00, 0x00, 0x97 },
{ 0x00, 0x00, 0x99 },
{ 0x00, 0x00, 0x9b },
{ 0x00, 0x00, 0x9d },
{ 0x00, 0x00, 0x9f },
{ 0x00, 0x00, 0xa2 },
{ 0x00, 0x00, 0xa4 },
{ 0x00, 0x00, 0xa6 },
{ 0x00, 0x00, 0xa8 },
{ 0x00, 0x00, 0xaa },
{ 0x00, 0x00, 0xac },
{ 0x00, 0x00, 0xae },
{ 0x00, 0x00, 0xb1 },
{ 0x00, 0x00, 0xb3 },
{ 0x00, 0x00, 0xb5 },
{ 0x00, 0x00, 0xb7 },
{ 0x00, 0x00, 0xb9 },
{ 0x00, 0x00, 0xbb },
{ 0x00, 0x00, 0xbd },
{ 0x00, 0x00, 0xbf },
{ 0x00, 0x00, 0xc2 },
{ 0x00, 0x00, 0xc4 },
{ 0x00, 0x00, 0xc6 },
{ 0x00, 0x00, 0xc8 },
{ 0x00, 0x00, 0xca },
{ 0x00, 0x00, 0xcc },
{ 0x00, 0x00, 0xce },
{ 0x00, 0x00, 0xd1 },
{ 0x00, 0x00, 0xd3 },
{ 0x00, 0x00, 0xd5 },
{ 0x00, 0x00, 0xd7 },
{ 0x00, 0x00, 0xd9 },
{ 0x00, 0x00, 0xdb },
{ 0x00, 0x00, 0xdd },
{ 0x00, 0x00, 0xdf },
{ 0x00, 0x00, 0xe2 },
{ 0x00, 0x00, 0xe4 },
{ 0x00, 0x00, 0xe6 },
{ 0x00, 0x00, 0xe8 },
{ 0x00, 0x00, 0xea },
{ 0x00, 0x00, 0xec },
{ 0x00, 0x00, 0xee },
{ 0x00, 0x00, 0xf1 },
{ 0x00, 0x00, 0xf3 },
{ 0x00, 0x00, 0xf5 },
{ 0x00, 0x00, 0xf7 },
{ 0x00, 0x00, 0xf9 },
{ 0x00, 0x00, 0xfb },
{ 0x00, 0x00, 0xfd },
{ 0x01, 0x00, 0xfe },
{ 0x05, 0x00, 0xfa },
{ 0x09, 0x00, 0xf6 },
{ 0x0e, 0x00, 0xf2 },
{ 0x12, 0x00, 0xed },
{ 0x16, 0x00, 0xe9 },
{ 0x1b, 0x00, 0xe4 },
{ 0x1f, 0x00, 0xe0 },
{ 0x24, 0x00, 0xdc },
{ 0x27, 0x00, 0xd8 },
{ 0x2c, 0x00, 0xd3 },
{ 0x30, 0x00, 0xcf },
{ 0x35, 0x00, 0xcb },
{ 0x39, 0x00, 0xc6 },
{ 0x3d, 0x00, 0xc2 },
{ 0x42, 0x00, 0xbd },
{ 0x46, 0x00, 0xb9 },
{ 0x4b, 0x00, 0xb5 },
{ 0x4f, 0x00, 0xb0 },
{ 0x53, 0x00, 0xac },
{ 0x58, 0x00, 0xa7 },
{ 0x5c, 0x00, 0xa3 },
{ 0x61, 0x00, 0x9f },
{ 0x65, 0x00, 0x9a },
{ 0x69, 0x00, 0x96 },
{ 0x6e, 0x00, 0x91 },
{ 0x72, 0x00, 0x8d },
{ 0x77, 0x00, 0x89 },
{ 0x7b, 0x00, 0x84 },
{ 0x7f, 0x00, 0x80 },
{ 0x84, 0x00, 0x7b },
{ 0x88, 0x00, 0x77 },
{ 0x8d, 0x00, 0x73 },
{ 0x91, 0x00, 0x6e },
{ 0x95, 0x00, 0x6a },
{ 0x9a, 0x00, 0x65 },
{ 0x9e, 0x00, 0x61 },
{ 0xa3, 0x00, 0x5d },
{ 0xa7, 0x00, 0x58 },
{ 0xab, 0x00, 0x54 },
{ 0xb0, 0x00, 0x4f },
{ 0xb4, 0x00, 0x4b },
{ 0xb9, 0x00, 0x47 },
{ 0xbd, 0x00, 0x42 },
{ 0xc1, 0x00, 0x3e },
{ 0xc6, 0x00, 0x39 },
{ 0xca, 0x00, 0x35 },
{ 0xcf, 0x00, 0x31 },
{ 0xd3, 0x00, 0x2c },
{ 0xd7, 0x00, 0x28 },
{ 0xdc, 0x00, 0x23 },
{ 0xe0, 0x00, 0x1f },
{ 0xe5, 0x00, 0x1b },
{ 0xe9, 0x00, 0x16 },
{ 0xed, 0x00, 0x12 },
{ 0xf2, 0x00, 0x0d },
{ 0xf6, 0x00, 0x09 },
{ 0xfb, 0x00, 0x05 },
{ 0xfe, 0x01, 0x01 },
{ 0xff, 0x06, 0x00 },
{ 0xff, 0x0d, 0x00 },
{ 0xff, 0x13, 0x00 },
{ 0xff, 0x1a, 0x00 },
{ 0xff, 0x20, 0x00 },
{ 0xff, 0x26, 0x00 },
{ 0xff, 0x2d, 0x00 },
{ 0xff, 0x33, 0x00 },
{ 0xff, 0x3a, 0x00 },
{ 0xff, 0x40, 0x00 },
{ 0xff, 0x46, 0x00 },
{ 0xff, 0x4d, 0x00 },
{ 0xff, 0x53, 0x00 },
{ 0xff, 0x59, 0x00 },
{ 0xff, 0x60, 0x00 },
{ 0xff, 0x66, 0x00 },
{ 0xff, 0x6c, 0x00 },
{ 0xff, 0x73, 0x00 },
{ 0xff, 0x79, 0x00 },
{ 0xff, 0x80, 0x00 },
{ 0xff, 0x86, 0x00 },
{ 0xff, 0x8c, 0x00 },
{ 0xff, 0x93, 0x00 },
{ 0xff, 0x99, 0x00 },
{ 0xff, 0x9f, 0x00 },
{ 0xff, 0xa6, 0x00 },
{ 0xff, 0xac, 0x00 },
{ 0xff, 0xb3, 0x00 },
{ 0xff, 0xb9, 0x00 },
{ 0xff, 0xbf, 0x00 },
{ 0xff, 0xc6, 0x00 },
{ 0xff, 0xcc, 0x00 },
{ 0xff, 0xd2, 0x00 },
{ 0xff, 0xd9, 0x00 },
{ 0xff, 0xdf, 0x00 },
{ 0xff, 0xe6, 0x00 },
{ 0xff, 0xec, 0x00 },
{ 0xff, 0xf2, 0x00 },
{ 0xff, 0xf9, 0x00 },
{ 0xff, 0xfe, 0x01 },
{ 0xff, 0xff, 0x06 },
{ 0xff, 0xff, 0x0d },
{ 0xff, 0xff, 0x14 },
{ 0xff, 0xff, 0x1b },
{ 0xff, 0xff, 0x21 },
{ 0xff, 0xff, 0x28 },
{ 0xff, 0xff, 0x2f },
{ 0xff, 0xff, 0x35 },
{ 0xff, 0xff, 0x3c },
{ 0xff, 0xff, 0x42 },
{ 0xff, 0xff, 0x49 },
{ 0xff, 0xff, 0x4f },
{ 0xff, 0xff, 0x56 },
{ 0xff, 0xff, 0x5d },
{ 0xff, 0xff, 0x63 },
{ 0xff, 0xff, 0x6a },
{ 0xff, 0xff, 0x71 },
{ 0xff, 0xff, 0x77 },
{ 0xff, 0xff, 0x7e },
{ 0xff, 0xff, 0x84 },
{ 0xff, 0xff, 0x8b },
{ 0xff, 0xff, 0x92 },
{ 0xff, 0xff, 0x98 },
{ 0xff, 0xff, 0x9f },
{ 0xff, 0xff, 0xa6 },
{ 0xff, 0xff, 0xac },
{ 0xff, 0xff, 0xb3 },
{ 0xff, 0xff, 0xb9 },
{ 0xff, 0xff, 0xc0 },
{ 0xff, 0xff, 0xc7 },
{ 0xff, 0xff, 0xcd },
{ 0xff, 0xff, 0xd4 },
{ 0xff, 0xff, 0xdb },
{ 0xff, 0xff, 0xe1 },
{ 0xff, 0xff, 0xe8 },
{ 0xff, 0xff, 0xee },
{ 0xff, 0xff, 0xf5 },
{ 0xff, 0xff, 0xfb }
{ 0, 0, 0 },
{ 0, 0, 3 },
{ 0, 0, 6 },
{ 0, 0, 9 },
{ 0, 0, 12 },
{ 0, 0, 15 },
{ 0, 0, 18 },
{ 0, 0, 21 },
{ 0, 0, 24 },
{ 0, 0, 27 },
{ 0, 0, 30 },
{ 0, 0, 33 },
{ 0, 0, 36 },
{ 0, 0, 39 },
{ 0, 0, 42 },
{ 0, 0, 45 },
{ 0, 0, 48 },
{ 0, 0, 51 },
{ 0, 0, 54 },
{ 0, 0, 57 },
{ 0, 0, 60 },
{ 0, 0, 63 },
{ 0, 0, 66 },
{ 0, 0, 69 },
{ 0, 0, 72 },
{ 0, 0, 75 },
{ 0, 0, 78 },
{ 0, 0, 81 },
{ 0, 0, 84 },
{ 0, 0, 87 },
{ 0, 0, 90 },
{ 0, 0, 93 },
{ 0, 0, 96 },
{ 0, 0, 99 },
{ 0, 0, 102 },
{ 0, 0, 105 },
{ 0, 0, 108 },
{ 0, 0, 111 },
{ 0, 0, 114 },
{ 0, 0, 117 },
{ 0, 0, 120 },
{ 0, 0, 123 },
{ 0, 0, 126 },
{ 0, 0, 129 },
{ 0, 0, 132 },
{ 0, 0, 135 },
{ 0, 0, 138 },
{ 0, 0, 141 },
{ 0, 0, 144 },
{ 0, 0, 147 },
{ 0, 0, 150 },
{ 0, 0, 153 },
{ 0, 0, 156 },
{ 0, 0, 159 },
{ 0, 0, 162 },
{ 0, 0, 165 },
{ 0, 0, 168 },
{ 0, 0, 171 },
{ 0, 0, 174 },
{ 0, 0, 177 },
{ 0, 0, 180 },
{ 0, 0, 183 },
{ 0, 0, 186 },
{ 0, 0, 189 },
{ 0, 0, 192 },
{ 0, 0, 195 },
{ 0, 0, 198 },
{ 0, 0, 201 },
{ 0, 0, 204 },
{ 0, 0, 207 },
{ 0, 0, 210 },
{ 0, 0, 213 },
{ 0, 0, 216 },
{ 0, 0, 219 },
{ 0, 0, 222 },
{ 0, 0, 225 },
{ 0, 0, 228 },
{ 0, 0, 231 },
{ 0, 0, 234 },
{ 0, 0, 237 },
{ 0, 0, 240 },
{ 0, 0, 243 },
{ 0, 0, 246 },
{ 0, 0, 249 },
{ 0, 0, 252 },
{ 0, 0, 255 },
{ 0, 3, 252 },
{ 0, 6, 249 },
{ 0, 9, 246 },
{ 0, 12, 243 },
{ 0, 15, 240 },
{ 0, 18, 237 },
{ 0, 21, 234 },
{ 0, 24, 231 },
{ 0, 27, 228 },
{ 0, 30, 225 },
{ 0, 33, 222 },
{ 0, 36, 219 },
{ 0, 39, 216 },
{ 0, 42, 213 },
{ 0, 45, 210 },
{ 0, 48, 207 },
{ 0, 51, 204 },
{ 0, 54, 201 },
{ 0, 57, 198 },
{ 0, 60, 195 },
{ 0, 63, 192 },
{ 0, 66, 189 },
{ 0, 69, 186 },
{ 0, 72, 183 },
{ 0, 75, 180 },
{ 0, 78, 177 },
{ 0, 81, 174 },
{ 0, 84, 171 },
{ 0, 87, 168 },
{ 0, 90, 165 },
{ 0, 93, 162 },
{ 0, 96, 159 },
{ 0, 99, 156 },
{ 0, 102, 153 },
{ 0, 105, 150 },
{ 0, 108, 147 },
{ 0, 111, 144 },
{ 0, 114, 141 },
{ 0, 117, 138 },
{ 0, 120, 135 },
{ 0, 123, 132 },
{ 0, 126, 129 },
{ 0, 129, 126 },
{ 0, 132, 123 },
{ 0, 135, 120 },
{ 0, 138, 117 },
{ 0, 141, 114 },
{ 0, 144, 111 },
{ 0, 147, 108 },
{ 0, 150, 105 },
{ 0, 153, 102 },
{ 0, 156, 99 },
{ 0, 159, 96 },
{ 0, 162, 93 },
{ 0, 165, 90 },
{ 0, 168, 87 },
{ 0, 171, 84 },
{ 0, 174, 81 },
{ 0, 177, 78 },
{ 0, 180, 75 },
{ 0, 183, 72 },
{ 0, 186, 69 },
{ 0, 189, 66 },
{ 0, 192, 63 },
{ 0, 195, 60 },
{ 0, 198, 57 },
{ 0, 201, 54 },
{ 0, 204, 51 },
{ 0, 207, 48 },
{ 0, 210, 45 },
{ 0, 213, 42 },
{ 0, 216, 39 },
{ 0, 219, 36 },
{ 0, 222, 33 },
{ 0, 225, 30 },
{ 0, 228, 27 },
{ 0, 231, 24 },
{ 0, 234, 21 },
{ 0, 237, 18 },
{ 0, 240, 15 },
{ 0, 243, 12 },
{ 0, 246, 9 },
{ 0, 249, 6 },
{ 0, 252, 3 },
{ 0, 255, 0 },
{ 3, 252, 0 },
{ 6, 249, 0 },
{ 9, 246, 0 },
{ 12, 243, 0 },
{ 15, 240, 0 },
{ 18, 237, 0 },
{ 21, 234, 0 },
{ 24, 231, 0 },
{ 27, 228, 0 },
{ 30, 225, 0 },
{ 33, 222, 0 },
{ 36, 219, 0 },
{ 39, 216, 0 },
{ 42, 213, 0 },
{ 45, 210, 0 },
{ 48, 207, 0 },
{ 51, 204, 0 },
{ 54, 201, 0 },
{ 57, 198, 0 },
{ 60, 195, 0 },
{ 63, 192, 0 },
{ 66, 189, 0 },
{ 69, 186, 0 },
{ 72, 183, 0 },
{ 75, 180, 0 },
{ 78, 177, 0 },
{ 81, 174, 0 },
{ 84, 171, 0 },
{ 87, 168, 0 },
{ 90, 165, 0 },
{ 93, 162, 0 },
{ 96, 159, 0 },
{ 99, 156, 0 },
{ 102, 153, 0 },
{ 105, 150, 0 },
{ 108, 147, 0 },
{ 111, 144, 0 },
{ 114, 141, 0 },
{ 117, 138, 0 },
{ 120, 135, 0 },
{ 123, 132, 0 },
{ 126, 129, 0 },
{ 129, 126, 0 },
{ 132, 123, 0 },
{ 135, 120, 0 },
{ 138, 117, 0 },
{ 141, 114, 0 },
{ 144, 111, 0 },
{ 147, 108, 0 },
{ 150, 105, 0 },
{ 153, 102, 0 },
{ 156, 99, 0 },
{ 159, 96, 0 },
{ 162, 93, 0 },
{ 165, 90, 0 },
{ 168, 87, 0 },
{ 171, 84, 0 },
{ 174, 81, 0 },
{ 177, 78, 0 },
{ 180, 75, 0 },
{ 183, 72, 0 },
{ 186, 69, 0 },
{ 189, 66, 0 },
{ 192, 63, 0 },
{ 195, 60, 0 },
{ 198, 57, 0 },
{ 201, 54, 0 },
{ 204, 51, 0 },
{ 207, 48, 0 },
{ 210, 45, 0 },
{ 213, 42, 0 },
{ 216, 39, 0 },
{ 219, 36, 0 },
{ 222, 33, 0 },
{ 225, 30, 0 },
{ 228, 27, 0 },
{ 231, 24, 0 },
{ 234, 21, 0 },
{ 237, 18, 0 },
{ 240, 15, 0 },
{ 243, 12, 0 },
{ 246, 9, 0 },
{ 249, 6, 0 },
{ 252, 3, 0 },
{ 255, 0, 0 },
} };
const std::array<ui::Color, 256> spectrum_rgb4_lut { {
+88 -36
View File
@@ -30,21 +30,28 @@ namespace adsb {
void make_frame_adsb(ADSBFrame& frame, const uint32_t ICAO_address) {
frame.clear();
frame.push_byte((DF_ADSB << 3) | 5); // DF and CA
frame.push_byte((DF_ADSB << 3) | 5); // DF=17 and CA
frame.push_byte(ICAO_address >> 16);
frame.push_byte(ICAO_address >> 8);
frame.push_byte(ICAO_address & 0xFF);
}
// Civil aircraft ADS-B message type starts with Dowlink Format (DF=17) and frame is 112 bits long.
// All known DF's >=16 are long (112 bits). All known DF's <=15 are short (56 bits).(In this case 112 bits)
// Msg structure consists of five main parts :|DF=17 (5 bits)|CA (3 bits)|ICAO (24 bits)|ME (56 bits)|CRC (24 bits)
// Aircraft identification and category message structure, the ME (56 bits) = TC,5 bits | CA,3 bits | C1,6 bits | C2,6 bits | C3,6 | C4,6 | C5,6 | C6,6 | C7,6 | C8,6
// TC : (1..4) : Aircraft identification Type Code . // TC : 9 to 18: Airbone postion // TC : 19 Airbone velocity .
// In this encode_frame_identification function we are using DF = 17 (112 bits long) and TC=4)
void encode_frame_id(ADSBFrame& frame, const uint32_t ICAO_address, const std::string& callsign) {
std::string callsign_formatted(8, '_');
uint64_t callsign_coded = 0;
uint32_t c, s;
char ch;
make_frame_adsb(frame, ICAO_address);
make_frame_adsb(frame, ICAO_address); // Header DF=17 Downlink Format = ADS-B message (frame 112 bits)
frame.push_byte(TC_IDENT << 3); // No aircraft category
frame.push_byte(TC_IDENT << 3); // 5 top bits ME = TC = we use fix 4 , # Type aircraft Identification Category = TC_IDENT = 4,
// Translate and encode callsign
for (c = 0; c < 8; c++) {
@@ -101,42 +108,77 @@ std::string decode_frame_id(ADSBFrame& frame) {
frame.make_CRC();
}*/
void encode_frame_squawk(ADSBFrame& frame, const uint32_t squawk) {
uint32_t squawk_coded;
// Mode S services. (Mode Select Beacon System). There are two types of Mode S interrogations: The short (56 bits) . and the long (112 bits )
// All known DF's >=16 are long frame msg (112 bits). All known DF's <=15 are short frame msgs (56 bits).(In this case 112 bits)
// Identity squawk replies can be DF=5 (Surveillance Identity reply)(56 bits) / DF 21 (Comm-B with Identity reply) (112 bits)
// DF 21: Comm-B with identity reply structure = |DF=21(5 bits)|FS (3 bits)|DR (5 bits)|UM (6 bits) |Identity squawk code (13 bits) |MB (56 bits) |CRC (24 bits) (total 112 bits)
// Comm-B messages count for a large portion of the Mode S selective interrogation responses.(means, only transmitted information upon selective request)
// Comm-B messages protocol supports many different types of msg's (up to 255).The three more popular ones are the following ones:
// (a) Mode S ELementary Surveillance (ELS) / (b) Mode S EnHanced Surveillance (EHS) / (c) Meteorological information
// Comm-B Data Selector (BDS) is an 8-bit code that determines which information to be included in the MB fields
void encode_frame_squawk(ADSBFrame& frame, const uint16_t squawk) {
uint16_t squawk_coded;
uint8_t UM_field=0b111101, FS=0b010, DR=0b00001 ;
// To be sent those fields, (56 bits). We should store byte by byte into the frame , and It will be transmitted byte to byte same FIFO order.
// DF 5 bits 5 DF=21 (5 top bits) Downlink Format
// FS 3 bits 0b000, FS (3 bottom bits) (Flight status ) = 000 : no alert, no SPI, aircraft is airborne
// DR 5 bits 0b00001 DR (Downlink request) (5 top bits) = 00000 : no downlink request (In surveillance replies, only values 0, 1, 4, and 5 are used.)
// UM 6 bits 0b000010 UM (Utility message)= 000000, Utility message (UM): 6 bits, contains transponder communication status information.(IIS + IDS)
// Identity_code 13 bits squawk id_code in special interleaved format.
// MB 56 bits
// CRC partity 24 bits parity checksum , cyclic redundancy chek.
frame.clear();
frame.push_byte( ( DF_EHS_SQUAWK << 3 ) | FS ); // DF=21 (5bits) + FS (3bits, 010 : alert, NO SPI, aircraft is airborne)
frame.push_byte(( DR <<3 ) | ( UM_field>>3) ); // DR (5bits, 00001 : downlink request + 3 top bits of UM , let's use 0b111000
frame.push_byte(DF_EHS_SQUAWK << 3); // DF
frame.push_byte(0);
// 12 11 10 9 8 7 6 5 4 3 2 1 0
// 31 30 29 28 27 26 25 24 23 22 21 20 19
// D4 B4 D2 B2 D1 B1 __ A4 C4 A2 C2 A1 C1
// 12 11 10 9 8 7 6 5 4 3 2 1 0 (Original notes) bit weight position----------------------
// 32 31 30 29 28 27 26 25 24 23 22 21 20 (it was wrong , now corrected) bit order inside frame msg
// D4 B4 D2 B2 D1 B1 __ A4 C4 A2 C2 A1 C1 standard spec order of the 13 bits, to be sent , each octal digit = 3 bits , (example A=7 binary A4 A2 A0 = 111
// ABCD = code (octal, 0000~7777)
// FEDCBA9876543210
// xAAAxBBBxCCCxDDD
// x421x421x421x421
squawk_coded = ((squawk << 10) & 0x1000) | // D4
((squawk << 1) & 0x0800) | // B4
((squawk << 9) & 0x0400) | // D2
((squawk << 0) & 0x0200) | // B2
((squawk << 8) & 0x0100) | // D1
((squawk >> 1) & 0x0080) | // B1
((squawk >> 9) & 0x0020) | // A4
((squawk >> 2) & 0x0010) | // C4
((squawk >> 10) & 0x0008) | // A2
((squawk >> 3) & 0x0004) | // C2
((squawk >> 11) & 0x0002) | // A1
((squawk >> 4) & 0x0001); // C1
frame.push_byte(squawk_coded >> 5);
frame.push_byte(squawk_coded << 3);
// FEDCBA9876543210
// xAAAxBBBxCCCxDDD 4 x 3 bits (each octal digit)
// x421x421x421x421 binary weight of each binary position, example AAA = 7 = 111 -------------------------
// Additional , expanded notes -------------------------------
// Identity squawk code ABCD = code (octal, 0000~7777) , input concatenated squawk : 4 octal digits ,A4 A2 A1-B4 B2 B1-C4 C2 C1-D4 D2 D1.
// 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 bit position of the frame msg, (Squawk id is bit 20-32, from C1..D4).
// UM4 UM2 UM1 C1 A1 C2 A2 C4 A4 X B1 D1 B2 D2 B4 D4 3 lower bit UM4,UM2,UM1 of the UM (6bits), and we should re-order the 13 bits ABCD changing 12 bit poistion based on std.
// 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 Two bytes , bit position to be send.
squawk_coded = ( (( UM_field & (0b111)) <<13) | ((squawk << 9) & 0x1000) ) | // C1 It also leaves in the top 3 lower bottom bitd part of UM field.
((squawk << 2) & 0x0800) | // A1
((squawk << 6) & 0x0400) | // C2
((squawk >> 1) & 0x0200) | // A2
((squawk << 3) & 0x0100) | // C4
((squawk >> 4) & 0x0080) | // A4
((squawk >> 1) & 0x0020) | // B1
((squawk << 4) & 0x0010) | // D1
((squawk >> 4) & 0x0008) | // B2
((squawk << 1) & 0x0004) | // D2
((squawk >> 7) & 0x0002) | // B4
((squawk >> 2) & 0x0001); // D4
frame.push_byte(squawk_coded>>8); // UM4 UM2 UM1 C1 A1 C2 A2 C4 that is the correct order, confirmed with dump1090
frame.push_byte(squawk_coded); // A4 X(1) B1 D1 B2 D2 B4 D4 that is the correct order, confirmed with dupm1090
// DF 21 messages , has 56 bits more after 13 bits of squawk, we should add MB (56 bits)
// In this example, we are adding fixed MB = Track and turn report (BDS 5,0) decoding MB example = "F9363D3BBF9CE9" (56 bits)
// # -9.7, roll angle (deg)
// # 140.273, track angle (deg)
// # -0.406, track angle rate (deg/s)
// # 476, ground speed (kt)
// # 466, TAS (kt)
frame.push_byte(0xF9);frame.push_byte(0x36);frame.push_byte(0x3D);frame.push_byte(0x3B); // If we deltele those two lines, to send this fixed MB (56 bits),
frame.push_byte(0xBF);frame.push_byte(0x9C);frame.push_byte(0xE9); // current fw is padding with 56 x 0's to complete 112 bits msg.
frame.make_CRC();
}
}
float cpr_mod(float a, float b) {
return a - (b * floor(a / b));
@@ -183,6 +225,13 @@ float cpr_Dlon(float lat, int is_odd) {
return 360.0 / cpr_N(lat, is_odd);
}
// An ADS-B frame Civil aircraft message type starts with Dowlink Format (DF=17) and frame is 112 bits long.
// All known DF's >=16 are long (112 bits). All known DF's <=15 are short (56 bits). (In this case 112 bits)
// Msg structure consists of five main parts :|DF=17 (5 bits)|CA (3 bits)|ICAO (24 bits)|ME (56 bits)|CRC (24 bits)
// Airborne position msg struct, the ME (56 bits) = |TC,5 bits| SS, 2 bits | SAF, 1 | ALT, 12 | T, 1 | F, 1 | LAT-CPR, 17 | LON-CPR, 17
// TC : (1..4) : Aircraft identification Type Code. // TC : 9 to 18: Airbone postion and altitude // TC : 19 Airbone velocity .
// Airborne position message is used to broadcast the position and altitude of the aircraft. It has the Type Code 918 and 2022. (here , we use TC=11)
void encode_frame_pos(ADSBFrame& frame, const uint32_t ICAO_address, const int32_t altitude,
const float latitude, const float longitude, const uint32_t time_parity) {
@@ -190,7 +239,7 @@ void encode_frame_pos(ADSBFrame& frame, const uint32_t ICAO_address, const int32
uint32_t lat, lon;
float delta_lat, yz, rlat, delta_lon, xz;
make_frame_adsb(frame, ICAO_address);
make_frame_adsb(frame, ICAO_address); // Header DF=17 (long frame 112 bits)
frame.push_byte(TC_AIRBORNE_POS << 3); // Bits 2~1: Surveillance Status, bit 0: NICsb
@@ -303,8 +352,11 @@ adsb_pos decode_frame_pos(ADSBFrame& frame_even, ADSBFrame& frame_odd) {
return position;
}
// speed is in knots
// vertical rate is in ft/min
// An ADS-B frame is 112 bits long. Civil aircraft ADS-B message starts with the Downlink Format ,DF=17.
// Msg structure consists of five main parts :|DF=17 (5 bits)|CA (3 bits)|ICAO (24 bits)|ME (56 bits)|CRC (24 bits)
// Airborne velocities are all transmitted with Type Code 19 ( TC=19 ) inside ME (56 bits)
// [units] : speed is in knots, vertical rate climb / descend is in ft/min
void encode_frame_velo(ADSBFrame& frame, const uint32_t ICAO_address, const uint32_t speed,
const float angle, const int32_t v_rate) {
@@ -320,7 +372,7 @@ void encode_frame_velo(ADSBFrame& frame, const uint32_t ICAO_address, const uint
velo_ew_abs = abs(velo_ew) + 1; // encoding Velo speed EW , when sign Direction is 0 (+): West->East, (-) 1: East->West
velo_ns_abs = abs(velo_ns) + 1; // encoding Velo speed NS , when sign Direction is 0 (+): South->North , (-) 1: North->South
make_frame_adsb(frame, ICAO_address);
make_frame_adsb(frame, ICAO_address); // Header DF=17 (long frame 112 bits)
// Airborne velocities are all transmitted with Type Code 19 ( TC=19, using 5 bits ,TC=19 [Binary: 10011]), the following 3 bits are Subt-type Code ,SC= 1,2,3,4
// SC Subtypes code 1 and 2 are used to report ground speeds of aircraft. (SC 3,4 to used to report true airspeed. SC 2,4 are for supersonic aircraft (not used in commercial airline).
+3 -2
View File
@@ -33,7 +33,8 @@ namespace adsb {
enum downlink_format {
DF_ADSB = 17,
DF_EHS_SQUAWK = 21
DF_EHS_SQUAWK = 21, // DF 21: Comm-B with identity reply . Mode S enhanced surveillance of squawk + (MB_field = Track and turn report (BDS 5,0)).
// Confirmed that it is Detected correctly by dump1090. and sdrangel.
};
enum type_code {
@@ -104,7 +105,7 @@ adsb_vel decode_frame_velo(ADSBFrame& frame);
//void encode_frame_emergency(ADSBFrame& frame, const uint32_t ICAO_address, const uint8_t code);
void encode_frame_squawk(ADSBFrame& frame, const uint32_t squawk);
void encode_frame_squawk(ADSBFrame& frame, const uint16_t squawk);
} /* namespace adsb */
@@ -399,6 +399,17 @@ namespace cache {
void defaults() {
cached_backup_ram = backup_ram_t();
// defaults values for recon app
set_recon_autosave_freqs( false );
set_recon_autostart_recon( true );
set_recon_continuous( true );
set_recon_clear_output( false );
set_recon_load_freqs( true );
set_recon_load_ranges( true );
set_recon_update_ranges_when_recon( true );
set_recon_load_hamradios( true );
set_recon_match_mode( 0 );
}
void init() {
+14
View File
@@ -1662,6 +1662,20 @@ SymField::SymField(
set_focusable(true);
}
uint16_t SymField::concatenate_4_octal_u16() {
// input array 4 octal digits , return 12 bits, same order, trippled A4-A2-A1|B4-B2-B1|C4-C2-C1|D4-D2-D1
uint32_t mul = 1; uint16_t v = 0;
if (type_ == SYMFIELD_OCT ) {
for (uint32_t c = 0; c < length_; c++) {
v += values_[(length_ - 1 - c)] * mul;
mul *= 8; // shift 3 bits to the right every new octal squawk digit
}
return v;
} else
return 0;
}
uint32_t SymField::value_dec_u32() {
uint32_t mul = 1, v = 0;
+1
View File
@@ -676,6 +676,7 @@ public:
void set_sym(const uint32_t index, const uint32_t new_value);
void set_length(const uint32_t new_length);
void set_symbol_list(const uint32_t index, const std::string symbol_list);
uint16_t concatenate_4_octal_u16();
uint32_t value_dec_u32();
uint64_t value_hex_u64();
std::string value_string();