diff --git a/src/c3nav/site/static/site/css/c3nav.scss b/src/c3nav/site/static/site/css/c3nav.scss index 36141ff0..050f79f6 100644 --- a/src/c3nav/site/static/site/css/c3nav.scss +++ b/src/c3nav/site/static/site/css/c3nav.scss @@ -1999,3 +1999,21 @@ blink { } } } + + +.ap-name-bssid-result { + border-radius: 4px; + border: 1px solid gray; + padding: 4px 0; + box-shadow: inset 0px 0px 1px gray; + + thead { + border-bottom: 1px solid gray; + } + + td, th { + padding: 0 8px; + border: none; + font-size: 0.9em; + } +} \ No newline at end of file diff --git a/src/c3nav/site/static/site/js/c3nav.js b/src/c3nav/site/static/site/js/c3nav.js index 4a1b1512..47199afa 100644 --- a/src/c3nav/site/static/site/js/c3nav.js +++ b/src/c3nav/site/static/site/js/c3nav.js @@ -140,6 +140,17 @@ c3nav = { if (window.mobileclient) { $body.addClass('mobileclient'); c3nav._set_user_location(null); + + try { + c3nav._ap_name_mappings = JSON.parse(localStorageWrapper.getItem('c3nav.wifi-scanning.ap-names')); + } catch (e) { + // ignore + } + + if (c3nav._ap_name_mappings === null) { + c3nav._ap_name_mappings = {}; + } + } else { document.addEventListener('visibilitychange', c3nav.on_visibility_change, false); } @@ -1465,9 +1476,50 @@ c3nav = { .html((!no_close) ? '' : '') .append(content || '
'); if ($modal.find('[name=look_for_ap]').length) { + if (!window.mobileclient) { + alert('need app!') + } $modal.find('button').hide(); } }, + _ap_name_scan_result_update: function () { + const $modal = $('#modal'); + const $match_ap = $modal.find('[name=look_for_ap]'); + if ($match_ap.length) { + const $wifi_bssids = $('[name=wifi_bssids]'); + const ap_name = $match_ap.val(); + const found_bssids = {}; + let scan_complete = false; + if (ap_name in c3nav._ap_name_mappings) { + const mappings = c3nav._ap_name_mappings[ap_name]; + for (const mapping of mappings) { + scan_complete = true; + for (const bssid of mapping) { + found_bssids[bssid] = (found_bssids[bssid] ?? 0) + 1; + if (found_bssids[bssid] === 1) { + scan_complete = false; + } + } + } + } + + const $table = $('
BSSIDcount
') + + for (const [bssid, count] of Object.entries(found_bssids)) { + $table.append(`${bssid}${count}`); + } + + $modal.find('.ap-name-bssid-result').remove(); + + $modal.find('form').before($table); + + if (scan_complete) { + // todo only bssids that have count > 1 + $wifi_bssids.val(JSON.stringify(Object.keys(found_bssids))); + $('#modal button[type=submit]').show(); + } + } + }, _modal_click: function (e) { if (!c3nav.modal_noclose && (e.target.id === 'modal' || e.target.id === 'close-modal')) { history.back(); @@ -2118,14 +2170,24 @@ c3nav = { _last_wifi_peers: [], _last_ibeacon_peers: [], _no_scan_count: 0, + _ap_name_mappings: {}, + _enable_scan_debugging: false, + _scan_debugging_results: [], _wifi_scan_results: function (peers) { peers = JSON.parse(peers); + if (c3nav._enable_scan_debugging) { + c3nav._scan_debugging_results.push({ + timestamp: Date.now(), + peers: peers, + }); + } + if (c3nav.ssids) { peers = peers.filter(peer => c3nav.ssids.includes(peer.ssid)); } - let match_ap = $('[name=look_for_ap]').val(), - found_bssids = []; + + const ap_name_mappings = {}; for (const peer of peers) { if (peer.level !== undefined) { @@ -2137,26 +2199,21 @@ c3nav = { peer.distance_sd = peer.rtt.distance_std_dev_mm / 1000; delete peer.rtt; } - if (match_ap && peer.ap_name === match_ap) { - found_bssids.push(peer.bssid); + if (peer.ap_name) { + let mapping = ap_name_mappings[peer.ap_name] =(ap_name_mappings[peer.ap_name] ?? new Set()); + mapping.add(peer.bssid); } } - if (found_bssids.length) { - let $wifi_bssids = $('[name=wifi_bssids]'), - val = JSON.parse($wifi_bssids.val()), - added = 0; - for (let bssid of found_bssids) { - if (!val.includes(bssid)) { - val.push(bssid); - added++; - } - } - if (added) { - $wifi_bssids.val(JSON.stringify(val)); - } else { - $('#modal button[type=submit]').show(); - } + + for (const [name, mapping] of Object.entries(ap_name_mappings)) { + let mappings = c3nav._ap_name_mappings[name] = (c3nav._ap_name_mappings[name] ?? []); + mappings.push([...mapping]); } + + localStorageWrapper.setItem('c3nav.wifi-scanning.ap-names', JSON.stringify(c3nav._ap_name_mappings)); + + c3nav._ap_name_scan_result_update(); + c3nav._last_wifi_peers = peers; c3nav._after_scan_results(); },