From 0d51c7851651fee3588bc56c6679702d31fc9d58 Mon Sep 17 00:00:00 2001 From: Andreas <6977712+AndreasK79@users.noreply.github.com> Date: Wed, 1 Feb 2023 13:57:50 +0100 Subject: [PATCH] [DXCC id] Improved DXCC identification --- application/controllers/Calltester.php | 491 +++++++++++++++++++++++++ application/models/Logbook_model.php | 78 +++- 2 files changed, 553 insertions(+), 16 deletions(-) create mode 100644 application/controllers/Calltester.php diff --git a/application/controllers/Calltester.php b/application/controllers/Calltester.php new file mode 100644 index 00000000..b8c99114 --- /dev/null +++ b/application/controllers/Calltester.php @@ -0,0 +1,491 @@ +load->model('logbook_model'); + + $sql = 'select distinct col_country, col_call, col_dxcc, date(col_time_on) date from ' . $this->config->item('table_name'); + $query = $this->db->query($sql); + + $callarray = $query->result(); + + $result = array(); + + $i = 0; + + foreach ($callarray as $call) { + $i++; + $dxcc = $this->logbook_model->dxcc_lookup($call->col_call, $call->date); + + $dxcc['adif'] = (isset($dxcc['adif'])) ? $dxcc['adif'] : 0; + $dxcc['entity'] = (isset($dxcc['entity'])) ? $dxcc['entity'] : 0; + + if ($call->col_dxcc != $dxcc['adif']) { + $result[] = array( + 'Callsign' => $call->col_call, + 'Expected country' => $call->col_country, + 'Expected adif' => $call->col_dxcc, + 'Result country' => ucwords(strtolower($dxcc['entity']), "- (/"), + 'Result adif' => $dxcc['adif'], + ); + } + } + + // End clock time in seconds + $end_time = microtime(true); + + // Calculate script execution time + $execution_time = ($end_time - $start_time); + + echo " Execution time of script = ".$execution_time." sec
"; + echo $i . " calls tested.
"; + $count = 0; + + if ($result) { + $this->array_to_table($result); + } + + } + + + function array_to_table($table) { + echo ' '; + + echo ''; + + // Table header + foreach ($table[0] as $key=>$value) { + echo ""; + } + + // Table body + foreach ($table as $value) { + echo ""; + foreach ($value as $val) { + echo ""; + } + echo ""; + } + echo "
".$key."
".$val."
"; + } + + function csv() { + set_time_limit(3600); + + // Starting clock time in seconds + $start_time = microtime(true); + + $this->load->model('logbook_model'); + + $file = 'uploads/calls.csv'; + $handle = fopen($file,"r"); + + $data = fgetcsv($handle,1000,","); // Skips firsts line, usually that is the header + $data = fgetcsv($handle,1000,","); + + $result = array(); + + $i = 0; + + do { + if ($data[0]) { + // COL_CALL,COL_DXCC,COL_TIME_ON + $i++; + + $dxcc = $this->logbook_model->dxcc_lookup($data[0], $data[2]); + + $dxcc['adif'] = (isset($dxcc['adif'])) ? $dxcc['adif'] : 0; + $dxcc['entity'] = (isset($dxcc['entity'])) ? $dxcc['entity'] : 0; + + $data[1] = $data[1] == "NULL" ? 0 : $data[1]; + + if ($data[1] != $dxcc['adif']) { + $result[] = array( + 'Callsign' => $data[0], + 'Expected country' => '', + 'Expected adif' => $data[1], + 'Result country' => ucwords(strtolower($dxcc['entity']), "- (/"), + 'Result adif' => $dxcc['adif'], + ); + } + } + } while ($data = fgetcsv($handle,1000,",")); + + // End clock time in seconds + $end_time = microtime(true); + + // Calculate script execution time + $execution_time = ($end_time - $start_time); + + echo " Execution time of script = ".$execution_time." sec
"; + echo $i . " calls tested.
"; + $count = 0; + + if ($result) { + $this->array_to_table($result); + } + } + + /* + * Uses check_dxcc_table - written to check if that function works + */ + function csv2() { + set_time_limit(3600); + + // Starting clock time in seconds + $start_time = microtime(true); + + $this->load->model('logbook_model'); + + $file = 'uploads/calls.csv'; + $handle = fopen($file,"r"); + + $data = fgetcsv($handle,1000,","); // Skips firsts line, usually that is the header + $data = fgetcsv($handle,1000,","); + + $result = array(); + + $i = 0; + + do { + if ($data[0]) { + // COL_CALL,COL_DXCC,COL_TIME_ON + $i++; + + $dxcc = $this->logbook_model->check_dxcc_table($data[0], $data[2]); + + $data[1] = $data[1] == "NULL" ? 0 : $data[1]; + + if ($data[1] != $dxcc[0]) { + $result[] = array( + 'Callsign' => $data[0], + 'Expected country' => '', + 'Expected adif' => $data[1], + 'Result country' => ucwords(strtolower($dxcc[1]), "- (/"), + 'Result adif' => $dxcc[0], + ); + } + } + } while ($data = fgetcsv($handle,1000,",")); + + // End clock time in seconds + $end_time = microtime(true); + + // Calculate script execution time + $execution_time = ($end_time - $start_time); + + echo " Execution time of script = ".$execution_time." sec
"; + echo $i . " calls tested.
"; + $count = 0; + + if ($result) { + $this->array_to_table($result); + } + } + + function call() { + $testarray = array(); + + $testarray[] = array( + 'Callsign' => 'VE3EY/VP9', + 'Country' => 'Bermuda', + 'Adif' => 64, + 'Date' => $date = date('Ymd', time()) + ); + + $testarray[] = array( + 'Callsign' => 'VP2MDG', + 'Country' => 'Montserrat', + 'Adif' => 96, + 'Date' => $date = date('Ymd', time()) + ); + + $testarray[] = array( + 'Callsign' => 'VP2EY', + 'Country' => 'Anguilla', + 'Adif' => 12, + 'Date' => $date = date('Ymd', time()) + ); + + $testarray[] = array( + 'Callsign' => 'VP2VI', + 'Country' => 'British Virgin Islands.', + 'Adif' => 65, + 'Date' => $date = date('Ymd', time()) + ); + + $testarray[] = array( + 'Callsign' => 'VP2V/AA7V', + 'Country' => 'British Virgin Islands', + 'Adif' => 65, + 'Date' => $date = date('Ymd', time()) + ); + + $testarray[] = array( + 'Callsign' => 'W8LR/R', + 'Country' => 'United States Of America', + 'Adif' => 291, + 'Date' => $date = date('Ymd', time()) + ); + + $testarray[] = array( + 'Callsign' => 'SO1FH', + 'Country' => 'Poland', + 'Adif' => 269, + 'Date' => $date = date('Ymd', time()) + ); + + $testarray[] = array( + 'Callsign' => 'KZ1H/PP', + 'Country' => 'Brazil', + 'Adif' => 108, + 'Date' => $date = date('Ymd', time()) + ); + + $testarray[] = array( + 'Callsign' => 'K1KW/AM', + 'Country' => 'None', + 'Adif' => 0, + 'Date' => $date = date('Ymd', time()) + ); + + $testarray[] = array( + 'Callsign' => 'K1KW/MM', + 'Country' => 'None', + 'Adif' => 0, + 'Date' => $date = date('Ymd', time()) + ); + + $testarray[] = array( + 'Callsign' => 'TF/DL2NWK/P', + 'Country' => 'Iceland', + 'Adif' => 242, + 'Date' => $date = date('Ymd', time()) + ); + + $testarray[] = array( + 'Callsign' => 'OZ1ALS/A', + 'Country' => 'Denmark', + 'Adif' => 221, + 'Date' => $date = date('Ymd', time()) + ); + + $testarray[] = array( + 'Callsign' => 'LA1K', + 'Country' => 'Norway', + 'Adif' => 266, + 'Date' => $date = date('Ymd', time()) + ); + + $testarray[] = array( + 'Callsign' => 'K1KW/M', + 'Country' => 'United States Of America', + 'Adif' => 291, + 'Date' => $date = date('Ymd', time()) + ); + + $testarray[] = array( + 'Callsign' => 'TF/DL2NWK/M', + 'Country' => 'Iceland', + 'Adif' => 242, + 'Date' => $date = date('Ymd', time()) + ); + + $testarray[] = array( + 'Callsign' => 'TF/DL2NWK/MM', + 'Country' => 'None', + 'Adif' => 0, + 'Date' => $date = date('Ymd', time()) + ); + + $testarray[] = array( + 'Callsign' => 'TF/DL2NWK/P', + 'Country' => 'Iceland', + 'Adif' => 242, + 'Date' => $date = date('Ymd', time()) + ); + + $testarray[] = array( + 'Callsign' => '2M0SQL/P', + 'Country' => 'Scotland', + 'Adif' => 279, + 'Date' => $date = date('Ymd', time()) + ); + + $testarray[] = array( + 'Callsign' => 'FT8WW', + 'Country' => 'Crozet Island', + 'Adif' => 41, + 'Date' => $date = date('Ymd', time()) + ); + + $testarray[] = array( + 'Callsign' => 'RV0AL/0/P', + 'Country' => 'Asiatic Russia', + 'Adif' => 15, + 'Date' => $date = date('Ymd', time()) + ); + + $testarray[] = array( + 'Callsign' => 'OH/DJ1YFK', + 'Country' => 'Finland', + 'Adif' => 224, + 'Date' => $date = date('Ymd', time()) + ); + + $testarray[] = array( + 'Callsign' => 'N6TR/7', + 'Country' => 'United States Of America', + 'Adif' => 291, + 'Date' => $date = date('Ymd', time()) + ); + + $testarray[] = array( + 'Callsign' => 'KH0CW', + 'Country' => 'United States Of America', + 'Adif' => 291, + 'Date' => $date = date('Ymd', time()) + ); + + $testarray[] = array( + 'Callsign' => 'R2FM/P', + 'Country' => 'kaliningrad', + 'Adif' => 126, + 'Date' => $date = date('Ymd', time()) + ); + + $testarray[] = array( + 'Callsign' => 'R2FM', + 'Country' => 'kaliningrad', + 'Adif' => 126, + 'Date' => $date = date('Ymd', time()) + ); + + $testarray[] = array( + 'Callsign' => 'FT5XO', + 'Country' => 'Kerguelen Island', + 'Adif' => 131, + 'Date' => 20050320 + ); + + $testarray[] = array( + 'Callsign' => 'VP8CTR', + 'Country' => 'Antarctica', + 'Adif' => 13, + 'Date' => 19970207 + ); + + $testarray[] = array( + 'Callsign' => 'FO0AAA', + 'Country' => 'Clipperton', + 'Adif' => 36, + 'Date' => '20000302' + ); + + $testarray[] = array( + 'Callsign' => 'CX/PR8KW', + 'Country' => 'Uruguay', + 'Adif' => 144, + 'Date' => $date = date('Ymd', time()) + ); + + $testarray[] = array( + 'Callsign' => 'IQ3MV/LH', + 'Country' => 'Italy', + 'Adif' => 248, + 'Date' => $date = date('Ymd', time()) + ); + + $testarray[] = array( + 'Callsign' => 'LA1K/QRP', + 'Country' => 'Norway', + 'Adif' => 266, + 'Date' => $date = date('Ymd', time()) + ); + + $testarray[] = array( + 'Callsign' => 'LA1K/LGT', + 'Country' => 'Norway', + 'Adif' => 266, + 'Date' => $date = date('Ymd', time()) + ); + + $testarray[] = array( + 'Callsign' => 'SM1K/LH', + 'Country' => 'Sweden', + 'Adif' => 284, + 'Date' => $date = date('Ymd', time()) + ); + + set_time_limit(3600); + + // Starting clock time in seconds + $start_time = microtime(true); + + $this->load->model('logbook_model'); + + $result = array(); + + $i = 0; + + foreach ($testarray as $call) { + $i++; + $dxcc = $this->logbook_model->dxcc_lookup($call['Callsign'], $call['Date']); + + $dxcc['adif'] = (isset($dxcc['adif'])) ? $dxcc['adif'] : 0; + $dxcc['entity'] = (isset($dxcc['entity'])) ? $dxcc['entity'] : 0; + + if ($call['Adif'] != $dxcc['adif']) { + $result[] = array( + 'Callsign' => $call['Callsign'], + 'Expected country' => $call['Country'], + 'Expected adif' => $call['Adif'], + 'Result country' => ucwords(strtolower($dxcc['entity']), "- (/"), + 'Result adif' => $dxcc['adif'], + ); + } + } + + // End clock time in seconds + $end_time = microtime(true); + + // Calculate script execution time + $execution_time = ($end_time - $start_time); + + echo " Execution time of script = ".$execution_time." sec
"; + echo $i . " calls tested.
"; + $count = 0; + + if ($result) { + $this->array_to_table($result); + } + } +} \ No newline at end of file diff --git a/application/models/Logbook_model.php b/application/models/Logbook_model.php index f6ae8ae8..258b8a12 100755 --- a/application/models/Logbook_model.php +++ b/application/models/Logbook_model.php @@ -2907,6 +2907,8 @@ class Logbook_model extends CI_Model { */ public function check_dxcc_table($call, $date){ + $csadditions = '/^P$|^R$|^A$|^M$/'; + $dxcc_exceptions = $this->db->select('`entity`, `adif`, `cqz`') ->where('call', $call) ->where('(start <= ', $date) @@ -2923,6 +2925,8 @@ class Logbook_model extends CI_Model { $call = "K"; } elseif (preg_match('/(^OH\/)|(\/OH[1-9]?$)/', $call)) { # non-Aland prefix! $call = "OH"; # make callsign OH = finland + } elseif (preg_match('/(^CX\/)|(\/CX[1-9]?$)/', $call)) { # non-Antarctica prefix! + $call = "CX"; # make callsign CX = Uruguay } elseif (preg_match('/(^3D2R)|(^3D2.+\/R)/', $call)) { # seems to be from Rotuma $call = "3D2/R"; # will match with Rotuma } elseif (preg_match('/^3D2C/', $call)) { # seems to be from Conway Reef @@ -2934,6 +2938,23 @@ class Logbook_model extends CI_Model { } elseif (preg_match('/(^KG4)[A-Z09]{1}/', $call)) { $call = "K"; } elseif (preg_match('/\w\/\w/', $call)) { + if (preg_match_all('/^((\d|[A-Z])+\/)?((\d|[A-Z]){3,})(\/(\d|[A-Z])+)?(\/(\d|[A-Z])+)?$/', $call, $matches)) { + $prefix = $matches[1][0]; + $callsign = $matches[3][0]; + $suffix = $matches[5][0]; + if ($prefix) { + $prefix = substr($prefix, 0, -1); # Remove the / at the end + } + if ($suffix) { + $suffix = substr($suffix, 1); # Remove the / at the beginning + }; + if (preg_match($csadditions, $suffix)) { + if ($prefix) { + $call = $prefix; + } else { + $call = $callsign; + } + } else { $result = $this->wpx($call, 1); # use the wpx prefix instead if ($result == '') { $row['adif'] = 0; @@ -2943,7 +2964,9 @@ class Logbook_model extends CI_Model { } else { $call = $result . "AA"; } + } } + } $len = strlen($call); @@ -2968,19 +2991,21 @@ class Logbook_model extends CI_Model { } return array("Not Found", "Not Found"); - } + + } public function dxcc_lookup($call, $date){ + $csadditions = '/^P$|^R$|^A$|^M$/'; + $dxcc_exceptions = $this->db->select('`entity`, `adif`, `cqz`') ->where('call', $call) - ->where('(start <= CURDATE()') + ->where('(start <= ', $date) ->or_where('start is null)', NULL, false) - ->where('(end >= CURDATE()') + ->where('(end >= ', $date) ->or_where('end is null)', NULL, false) ->get('dxcc_exceptions'); - if ($dxcc_exceptions->num_rows() > 0){ $row = $dxcc_exceptions->row_array(); return $row; @@ -2990,6 +3015,8 @@ class Logbook_model extends CI_Model { $call = "K"; } elseif (preg_match('/(^OH\/)|(\/OH[1-9]?$)/', $call)) { # non-Aland prefix! $call = "OH"; # make callsign OH = finland + } elseif (preg_match('/(^CX\/)|(\/CX[1-9]?$)/', $call)) { # non-Antarctica prefix! + $call = "CX"; # make callsign CX = Uruguay } elseif (preg_match('/(^3D2R)|(^3D2.+\/R)/', $call)) { # seems to be from Rotuma $call = "3D2/R"; # will match with Rotuma } elseif (preg_match('/^3D2C/', $call)) { # seems to be from Conway Reef @@ -3001,18 +3028,37 @@ class Logbook_model extends CI_Model { } elseif (preg_match('/(^KG4)[A-Z09]{1}/', $call)) { $call = "K"; } elseif (preg_match('/\w\/\w/', $call)) { - $result = $this->wpx($call, 1); # use the wpx prefix instead - if ($result == '') { - $row['adif'] = 0; - $row['entity'] = 'None'; - $row['cqz'] = 0; - $row['long'] = '0'; - $row['lat'] = '0'; - return $row; - } else { - $call = $result . "AA"; + if (preg_match_all('/^((\d|[A-Z])+\/)?((\d|[A-Z]){3,})(\/(\d|[A-Z])+)?(\/(\d|[A-Z])+)?$/', $call, $matches)) { + $prefix = $matches[1][0]; + $callsign = $matches[3][0]; + $suffix = $matches[5][0]; + if ($prefix) { + $prefix = substr($prefix, 0, -1); # Remove the / at the end } + if ($suffix) { + $suffix = substr($suffix, 1); # Remove the / at the beginning + }; + if (preg_match($csadditions, $suffix)) { + if ($prefix) { + $call = $prefix; + } else { + $call = $callsign; + } + } else { + $result = $this->wpx($call, 1); # use the wpx prefix instead + if ($result == '') { + $row['adif'] = 0; + $row['entity'] = 'None'; + $row['cqz'] = 0; + $row['long'] = '0'; + $row['lat'] = '0'; + return $row; + } else { + $call = $result . "AA"; + } + } } + } $len = strlen($call); @@ -3046,8 +3092,8 @@ class Logbook_model extends CI_Model { $b = ''; $c = ''; - $lidadditions = '/^QRP|^LGT/'; - $csadditions = '/^P$|^R$|^A$|^M$/'; + $lidadditions = '/^QRP$|^LGT$/'; + $csadditions = '/^P$|^R$|^A$|^M$|^LH$/'; $noneadditions = '/^MM$|^AM$/'; # First check if the call is in the proper format, A/B/C where A and C