From 98452b73046064a1acd4e0c3028766872e969c38 Mon Sep 17 00:00:00 2001 From: int2001 Date: Tue, 25 Mar 2025 16:01:22 +0000 Subject: [PATCH 01/12] Added handler for starting/stopping autofill --- assets/js/sections/qso.js | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/assets/js/sections/qso.js b/assets/js/sections/qso.js index 387a11dad..5598430ac 100644 --- a/assets/js/sections/qso.js +++ b/assets/js/sections/qso.js @@ -324,9 +324,40 @@ $("#sat_name").on('change', function () { if (sat == "") { $("#sat_mode").val(""); $("#selectPropagation").val(""); + stop_az_ele_ticker(); + } else { + get_tles(); } }); +function stop_az_ele_ticker() { + console.log('Stop filling Az/Ele here'); +} + +function start_az_ele_ticker(tle) { + console.log('Start filling Az/Ele here'); + console.log(tle); +} + +function get_tles() { + stop_az_ele_ticker(); + $.ajax({ + url: base_url + 'index.php/satellite/get_tle', + type: 'post', + data: { + sat: $("#sat_name").val(), + }, + success: function (data) { + if (data !== null) { + start_az_ele_ticker(data); + } + }, + error: function (data) { + console.log('Something went wrong while trying to fetch TLE for sat: '+$("#sat_name")); + }, + }); +} + $('#stateDropdown').on('change', function () { var state = $("#stateDropdown option:selected").text(); if (state != "") { @@ -516,6 +547,7 @@ function reset_to_default() { $("#sat_mode").val(""); $("#ant_az").val(""); $("#ant_el").val(""); + stop_az_ele_ticker(); } /* Function: reset_fields is used to reset the fields on the QSO page */ From aaa4b31de8dbda980d6b8122eb7840e97b203456 Mon Sep 17 00:00:00 2001 From: int2001 Date: Tue, 25 Mar 2025 16:05:37 +0000 Subject: [PATCH 02/12] Only fill if live-qso --- assets/js/sections/qso.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/assets/js/sections/qso.js b/assets/js/sections/qso.js index 5598430ac..9d91c9135 100644 --- a/assets/js/sections/qso.js +++ b/assets/js/sections/qso.js @@ -326,7 +326,9 @@ $("#sat_name").on('change', function () { $("#selectPropagation").val(""); stop_az_ele_ticker(); } else { - get_tles(); + if (qso_manual != 1) { + get_tles(); + } } }); From aa180a6928ef841e86668ca1bebf7b7b6b41a36e Mon Sep 17 00:00:00 2001 From: int2001 Date: Tue, 25 Mar 2025 17:28:19 +0000 Subject: [PATCH 03/12] Basicfunctions for calculating Az/Ele --- application/views/interface_assets/footer.php | 1 + assets/js/sections/qso.js | 26 +++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/application/views/interface_assets/footer.php b/application/views/interface_assets/footer.php index 20275b161..db31b4ca5 100644 --- a/application/views/interface_assets/footer.php +++ b/application/views/interface_assets/footer.php @@ -1060,6 +1060,7 @@ $($('#callsign')).on('keypress',function(e) { uri->segment(1) == "qso") { ?> + session->userdata('isWinkeyEnabled')) { ?> diff --git a/assets/js/sections/qso.js b/assets/js/sections/qso.js index 9d91c9135..8fe25c137 100644 --- a/assets/js/sections/qso.js +++ b/assets/js/sections/qso.js @@ -332,13 +332,39 @@ $("#sat_name").on('change', function () { } }); + +var satupdater; + function stop_az_ele_ticker() { console.log('Stop filling Az/Ele here'); + clearInterval(satupdater); } function start_az_ele_ticker(tle) { console.log('Start filling Az/Ele here'); console.log(tle); + const lines = tle.tle.trim().split('\n'); + + // Initialize a satellite record + var satrec = satellite.twoline2satrec(lines[0], lines[1]); + + // Define the observer's location in radians + var observerGd = { + longitude: satellite.degreesToRadians(0), + latitude: satellite.degreesToRadians(0), + height: 0.370 + }; + + function updateAzEl() { + var time = new Date(); + var positionAndVelocity = satellite.propagate(satrec, time); + var gmst = satellite.gstime(time); + var positionEcf = satellite.eciToEcf(positionAndVelocity.position, gmst); + var observerEcf = satellite.geodeticToEcf(observerGd); + var lookAngles = satellite.ecfToLookAngles(observerGd, positionEcf); + console.log(lookAngles); + } + satupdater=setInterval(updateAzEl, 1000); } function get_tles() { From 95fa3810d49c7a3063c1d613abf9c31eb25e7ce1 Mon Sep 17 00:00:00 2001 From: int2001 Date: Tue, 25 Mar 2025 17:56:24 +0000 Subject: [PATCH 04/12] Autofill Az/Ele --- assets/js/sections/qso.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/assets/js/sections/qso.js b/assets/js/sections/qso.js index 8fe25c137..16e5b9458 100644 --- a/assets/js/sections/qso.js +++ b/assets/js/sections/qso.js @@ -337,7 +337,11 @@ var satupdater; function stop_az_ele_ticker() { console.log('Stop filling Az/Ele here'); - clearInterval(satupdater); + if (satupdater) { + clearInterval(satupdater); + } + $("#ant_az").val(''); + $("#ant_el").val(''); } function start_az_ele_ticker(tle) { @@ -362,7 +366,10 @@ function start_az_ele_ticker(tle) { var positionEcf = satellite.eciToEcf(positionAndVelocity.position, gmst); var observerEcf = satellite.geodeticToEcf(observerGd); var lookAngles = satellite.ecfToLookAngles(observerGd, positionEcf); - console.log(lookAngles); + let az=(satellite.radiansToDegrees(lookAngles.azimuth).toFixed(2)); + let el=(satellite.radiansToDegrees(lookAngles.elevation).toFixed(2)); + $("#ant_az").val(az); + $("#ant_el").val(el); } satupdater=setInterval(updateAzEl, 1000); } From 923328388a6aa014603e51c8d0b45f646d28c936 Mon Sep 17 00:00:00 2001 From: int2001 Date: Wed, 26 Mar 2025 14:36:34 +0000 Subject: [PATCH 05/12] Take care of lat/lng of QTH (depends on station_location) --- application/controllers/Qso.php | 4 ++++ application/views/qso/index.php | 1 + application/views/qso/log_qso.php | 2 +- assets/js/sections/qso.js | 5 +++-- 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/application/controllers/Qso.php b/application/controllers/Qso.php index d4cf3a345..548094313 100644 --- a/application/controllers/Qso.php +++ b/application/controllers/Qso.php @@ -13,6 +13,7 @@ class QSO extends CI_Controller { public function index() { $this->load->model('cat'); + $this->load->library('qra'); $this->load->model('stations'); $this->load->model('logbook_model'); $this->load->model('user_model'); @@ -41,6 +42,7 @@ class QSO extends CI_Controller { $data['iota'] = $this->logbook_model->fetchIota(); $data['modes'] = $this->modes->active(); $data['bands'] = $this->bands->get_user_bands_for_qso_entry(); + [$data['lat'], $data['lng']] = $this->qra->qra2latlong($this->stations->gridsquare_from_station($this->stations->find_active())); $data['user_default_band'] = $this->session->userdata('user_default_band'); $data['sat_active'] = array_search("SAT", $this->bands->get_user_bands(), true); @@ -607,8 +609,10 @@ class QSO extends CI_Controller { public function get_station_power() { $this->load->model('stations'); + $this->load->library('qra'); $stationProfile = $this->input->post('stationProfile', TRUE); $data = array('station_power' => $this->stations->get_station_power($stationProfile)); + [$data['lat'], $data['lng']] = $this->qra->qra2latlong($this->stations->gridsquare_from_station($stationProfile)); header('Content-Type: application/json'); echo json_encode($data); diff --git a/application/views/qso/index.php b/application/views/qso/index.php index ce2700421..1bab76550 100644 --- a/application/views/qso/index.php +++ b/application/views/qso/index.php @@ -8,6 +8,7 @@ var lang_dxccsummary_for = ""; var lang_lotw_upload_day_ago = ""; var lang_lotw_upload_days_ago = ""; // due to the way the string is built (PHP to JS), %x is replaced with the number of days + var latlng=[];
diff --git a/application/views/qso/log_qso.php b/application/views/qso/log_qso.php index 43779f727..90387e0c1 100644 --- a/application/views/qso/log_qso.php +++ b/application/views/qso/log_qso.php @@ -75,4 +75,4 @@ $('#redirect_message').html(''); window.close(); } - \ No newline at end of file + diff --git a/assets/js/sections/qso.js b/assets/js/sections/qso.js index 16e5b9458..3e1d08ba2 100644 --- a/assets/js/sections/qso.js +++ b/assets/js/sections/qso.js @@ -39,6 +39,7 @@ $('#stationProfile').on('change', function () { data: { 'stationProfile': stationProfile }, success: function (res) { $('#transmit_power').val(res.station_power); + latlng=[res.lat,res.lng]; }, error: function () { $('#transmit_power').val(''); @@ -354,8 +355,8 @@ function start_az_ele_ticker(tle) { // Define the observer's location in radians var observerGd = { - longitude: satellite.degreesToRadians(0), - latitude: satellite.degreesToRadians(0), + longitude: satellite.degreesToRadians(latlng[0]), + latitude: satellite.degreesToRadians(latlng[1]), height: 0.370 }; From e1cc109db5a515a982307c97b7cee7b8edf45805 Mon Sep 17 00:00:00 2001 From: int2001 Date: Wed, 26 Mar 2025 17:23:38 +0000 Subject: [PATCH 06/12] ReCalc on Fav-Recall and Location-Change --- assets/js/sections/qso.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/assets/js/sections/qso.js b/assets/js/sections/qso.js index 3e1d08ba2..d101719f8 100644 --- a/assets/js/sections/qso.js +++ b/assets/js/sections/qso.js @@ -40,6 +40,7 @@ $('#stationProfile').on('change', function () { success: function (res) { $('#transmit_power').val(res.station_power); latlng=[res.lat,res.lng]; + $("#sat_name").change(); }, error: function () { $('#transmit_power').val(''); @@ -218,6 +219,9 @@ $(document).on("click", "#fav_del", function (event) { $(document).on("click", "#fav_recall", function (event) { $('#sat_name').val(favs[this.innerText].sat_name); + if (favs[this.innerText].sat_name) { + $("#sat_name").change(); + } $('#sat_mode').val(favs[this.innerText].sat_mode); $('#band_rx').val(favs[this.innerText].band_rx); $('#band').val(favs[this.innerText].band); @@ -346,8 +350,6 @@ function stop_az_ele_ticker() { } function start_az_ele_ticker(tle) { - console.log('Start filling Az/Ele here'); - console.log(tle); const lines = tle.tle.trim().split('\n'); // Initialize a satellite record From 962e80bcb7cb88455e6c2c7ad0649d92bf7410fc Mon Sep 17 00:00:00 2001 From: int2001 Date: Wed, 26 Mar 2025 17:36:27 +0000 Subject: [PATCH 07/12] Reduce precision --- assets/js/sections/qso.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/assets/js/sections/qso.js b/assets/js/sections/qso.js index d101719f8..33f5464b1 100644 --- a/assets/js/sections/qso.js +++ b/assets/js/sections/qso.js @@ -371,8 +371,8 @@ function start_az_ele_ticker(tle) { var lookAngles = satellite.ecfToLookAngles(observerGd, positionEcf); let az=(satellite.radiansToDegrees(lookAngles.azimuth).toFixed(2)); let el=(satellite.radiansToDegrees(lookAngles.elevation).toFixed(2)); - $("#ant_az").val(az); - $("#ant_el").val(el); + $("#ant_az").val(parseFloat(az).toFixed(1)); + $("#ant_el").val(parseFloat(el).toFixed(1)); } satupdater=setInterval(updateAzEl, 1000); } From ecb38c2ee43801058a03222ad3f96eb5b0be96fb Mon Sep 17 00:00:00 2001 From: int2001 Date: Wed, 26 Mar 2025 17:50:38 +0000 Subject: [PATCH 08/12] Swap lat/lon --- assets/js/sections/qso.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/assets/js/sections/qso.js b/assets/js/sections/qso.js index 33f5464b1..9d3198e46 100644 --- a/assets/js/sections/qso.js +++ b/assets/js/sections/qso.js @@ -357,8 +357,8 @@ function start_az_ele_ticker(tle) { // Define the observer's location in radians var observerGd = { - longitude: satellite.degreesToRadians(latlng[0]), - latitude: satellite.degreesToRadians(latlng[1]), + longitude: satellite.degreesToRadians(latlng[1]), + latitude: satellite.degreesToRadians(latlng[0]), height: 0.370 }; From 2a5452d6049a85204de293179077f697312eb96c Mon Sep 17 00:00:00 2001 From: int2001 Date: Wed, 26 Mar 2025 17:55:53 +0000 Subject: [PATCH 09/12] Allow some negative Elevation (wink wink, @phl0) --- application/views/qso/index.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/application/views/qso/index.php b/application/views/qso/index.php index 1bab76550..4a19d5e70 100644 --- a/application/views/qso/index.php +++ b/application/views/qso/index.php @@ -602,7 +602,7 @@
- +
From c127df5aa55af24fa360c5ce170808cb0bc362af Mon Sep 17 00:00:00 2001 From: int2001 Date: Thu, 27 Mar 2025 05:54:45 +0000 Subject: [PATCH 10/12] Stop Az/Ele on bandchange, start if SAT is prefilled (from session) --- assets/js/sections/qso.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/assets/js/sections/qso.js b/assets/js/sections/qso.js index 9d3198e46..57a73f234 100644 --- a/assets/js/sections/qso.js +++ b/assets/js/sections/qso.js @@ -396,6 +396,10 @@ function get_tles() { }); } +if ($("#sat_name").val() !== '') { + get_tles(); +} + $('#stateDropdown').on('change', function () { var state = $("#stateDropdown option:selected").text(); if (state != "") { @@ -1009,6 +1013,7 @@ $('#band').on('change', function () { $("#sat_mode").val(""); set_qrg(); $("#callsign").blur(); + stop_az_ele_ticker(); }); /* On Key up Calculate Bearing and Distance */ From aabe9fd9a06be9d8dedf521a0abd23655a087a2b Mon Sep 17 00:00:00 2001 From: int2001 Date: Thu, 27 Mar 2025 07:21:53 +0000 Subject: [PATCH 11/12] Take time from input-field and enable calcs for post-qso --- assets/js/sections/qso.js | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/assets/js/sections/qso.js b/assets/js/sections/qso.js index 57a73f234..a79f5824c 100644 --- a/assets/js/sections/qso.js +++ b/assets/js/sections/qso.js @@ -331,9 +331,7 @@ $("#sat_name").on('change', function () { $("#selectPropagation").val(""); stop_az_ele_ticker(); } else { - if (qso_manual != 1) { - get_tles(); - } + get_tles(); } }); @@ -341,7 +339,6 @@ $("#sat_name").on('change', function () { var satupdater; function stop_az_ele_ticker() { - console.log('Stop filling Az/Ele here'); if (satupdater) { clearInterval(satupdater); } @@ -363,7 +360,16 @@ function start_az_ele_ticker(tle) { }; function updateAzEl() { - var time = new Date(); + let dateParts=$('#start_date').val().split("-"); + let timeParts=$("#start_time").val().split(":"); + if ((dateParts.length == 3) && (timeParts.length >= 2)) { + var time = new Date(Date.UTC( + parseInt(dateParts[2]),parseInt(dateParts[1])-1,parseInt(dateParts[0]), + parseInt(timeParts[0]),parseInt(timeParts[1]),(parseInt(timeParts[2] ?? 0)) + )); + } else { + var time = new Date(); + } var positionAndVelocity = satellite.propagate(satrec, time); var gmst = satellite.gstime(time); var positionEcf = satellite.eciToEcf(positionAndVelocity.position, gmst); From 6cb5eaf56c60f703c81ff908134148d7ade28eb9 Mon Sep 17 00:00:00 2001 From: int2001 Date: Thu, 27 Mar 2025 07:40:33 +0000 Subject: [PATCH 12/12] Check if date is entered correct / otherwise no Az/Ele --- assets/js/sections/qso.js | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/assets/js/sections/qso.js b/assets/js/sections/qso.js index a79f5824c..a76398da4 100644 --- a/assets/js/sections/qso.js +++ b/assets/js/sections/qso.js @@ -347,7 +347,7 @@ function stop_az_ele_ticker() { } function start_az_ele_ticker(tle) { - const lines = tle.tle.trim().split('\n'); + const lines = tle.tle.trim().split('\n'); // Initialize a satellite record var satrec = satellite.twoline2satrec(lines[0], lines[1]); @@ -362,23 +362,27 @@ function start_az_ele_ticker(tle) { function updateAzEl() { let dateParts=$('#start_date').val().split("-"); let timeParts=$("#start_time").val().split(":"); - if ((dateParts.length == 3) && (timeParts.length >= 2)) { + try { var time = new Date(Date.UTC( parseInt(dateParts[2]),parseInt(dateParts[1])-1,parseInt(dateParts[0]), parseInt(timeParts[0]),parseInt(timeParts[1]),(parseInt(timeParts[2] ?? 0)) )); - } else { - var time = new Date(); - } - var positionAndVelocity = satellite.propagate(satrec, time); - var gmst = satellite.gstime(time); - var positionEcf = satellite.eciToEcf(positionAndVelocity.position, gmst); - var observerEcf = satellite.geodeticToEcf(observerGd); - var lookAngles = satellite.ecfToLookAngles(observerGd, positionEcf); - let az=(satellite.radiansToDegrees(lookAngles.azimuth).toFixed(2)); - let el=(satellite.radiansToDegrees(lookAngles.elevation).toFixed(2)); - $("#ant_az").val(parseFloat(az).toFixed(1)); - $("#ant_el").val(parseFloat(el).toFixed(1)); + if (isNaN(time.getTime())) { + throw new Error("Invalid date"); + } + var positionAndVelocity = satellite.propagate(satrec, time); + var gmst = satellite.gstime(time); + var positionEcf = satellite.eciToEcf(positionAndVelocity.position, gmst); + var observerEcf = satellite.geodeticToEcf(observerGd); + var lookAngles = satellite.ecfToLookAngles(observerGd, positionEcf); + let az=(satellite.radiansToDegrees(lookAngles.azimuth).toFixed(2)); + let el=(satellite.radiansToDegrees(lookAngles.elevation).toFixed(2)); + $("#ant_az").val(parseFloat(az).toFixed(1)); + $("#ant_el").val(parseFloat(el).toFixed(1)); + } catch(e) { + $("#ant_az").val(''); + $("#ant_el").val(''); + } } satupdater=setInterval(updateAzEl, 1000); }