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 = $('')
+
+ 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();
},