Commit 48f52161 by Corey Koval

Saves receivers in DB. Removes requirement for receivers file

parent a4e3ec8d
......@@ -13,15 +13,12 @@
- Create a single line file named ```accesstoken.txt```
- [Extended XML KerberosSDR Software](https://github.com/ckoval7/kerberossdr)
- This is available for both Qt4 (original version) and Qt5 (Ubuntu 20.04+). Just check out the appropriate branch.
![Screenshot](https://github.com/ckoval7/df-aggregator/raw/master/screenshots/Screenshot%20from%202020-11-15%2009-31-22.png)
## Usage: df-aggregator.py [options]
### Required inputs:
- -r FILE, --receivers=FILE
- List of receiver URLs
- Do not include quotes. Each receiver should be on a new line.
- -d FILE, --database=FILE
- Name of new or existing database to store intersect information.
......@@ -29,6 +26,10 @@
- Post processing math is done against the entire database.
### Optional Inputs:
- -r FILE, --receivers=FILE
- List of receiver URLs
- Do not include quotes. Each receiver should be on a new line.
- -g FILE, --geofile=FILE
- GeoJSON Output File
- Conventional file extension: .geojson
......
......@@ -7,6 +7,7 @@ import time
import sqlite3
import threading
import signal
import hashlib
from colorsys import hsv_to_rgb
from optparse import OptionParser
from os import system, name, kill, getpid
......@@ -20,6 +21,7 @@ import json
from bottle import route, run, request, get, post, put, response, redirect, template, static_file
d = 40000 #meters
receivers = []
class math_settings:
def __init__(self, eps, min_samp, conf, power):
......@@ -34,6 +36,8 @@ class receiver:
def __init__(self, station_url):
self.station_url = station_url
self.isAuto = True
# hashed_url = hashlib.md5(station_url.encode('utf-8')).hexdigest()
# self.uid = hashed_url[:5] + hashed_url[-5:]
try:
self.update()
except:
......@@ -153,15 +157,15 @@ def process_data(database_name, outfile):
intersect_list = []
try:
c.execute("SELECT COUNT(*) FROM intersects")
n_intersects = int(c.fetchone()[0])
# c.execute("SELECT COUNT(*) FROM intersects")
# n_intersects = int(c.fetchone()[0])
c.execute("SELECT longitude, latitude, time FROM intersects")
intersect_array = np.array(c.fetchall())
except sqlite3.OperationalError:
n_intersects = 0
intersect_array = np.array([])
likely_location = []
weighted_location = []
# weighted_location = []
ellipsedata = []
n_std=3.0
......@@ -264,11 +268,6 @@ def write_czml(best_point, all_the_points, ellipsedata):
}
}
rx_properties = {
# "image":
# {
# "uri": "/static/tower.svg"
# },
# "rotation": "Cesium.Math.PI_OVER_FOUR",
"verticalOrigin": "BOTTOM",
"scale": 0.75,
"heightReference":"RELATIVE_TO_GROUND",
......@@ -358,6 +357,7 @@ def finish():
clear(debugging)
print("Processing, please wait.")
ms.receiving = False
update_rx_table()
if geofile != None:
write_geojson(*process_data(database_name, geofile)[:2])
kill(getpid(), signal.SIGTERM)
......@@ -375,9 +375,6 @@ def clear(debugging):
else:
_ = system('clear')
with open('accesstoken.txt', "r") as tokenfile:
access_token = tokenfile.read().replace('\n', '')
@route('/static/<filepath:path>', name='static')
def server_static(filepath):
return static_file(filepath, root='./static')
......@@ -386,6 +383,8 @@ def server_static(filepath):
@get('/index')
@get('/cesium')
def cesium():
with open('accesstoken.txt', "r") as tokenfile:
access_token = tokenfile.read().replace('\n', '')
write_czml(*process_data(database_name, geofile))
return template('cesium.tpl',
{'access_token':access_token,
......@@ -429,20 +428,23 @@ def rx_params():
response.headers['Content-Type'] = 'application/json'
return json.dumps(all_rx)
@put('/rx_params/<uid>')
def update_rx(uid):
@put('/rx_params/<action>')
def update_rx(action):
data = json.load(request.body)
if uid == "new":
receivers.append(receiver(data['station_url'].replace('\n', '')))
print("Created new DF Station at " + data['station_url'])
elif uid == "del":
del receivers[int(data['uid'])]
if action == "new":
receiver_url = data['station_url'].replace('\n', '')
add_receiver(receiver_url)
elif action == "del":
index = int(data['uid'])
del_receiver(receivers[index].station_id)
del receivers[index]
else:
uid = int(uid)
action = int(action)
try:
receivers[uid].isMobile = data['mobile']
receivers[uid].station_url = data['station_url']
receivers[uid].update()
receivers[action].isMobile = data['mobile']
receivers[action].station_url = data['station_url']
receivers[action].update()
update_rx_table()
except IndexError:
print("I got some bad data. Doing nothing out of spite.")
return redirect('/rx_params')
......@@ -458,6 +460,7 @@ def run_receiver(receivers):
c = conn.cursor()
c.execute("CREATE TABLE IF NOT EXISTS intersects (time INTEGER, latitude REAL, longitude REAL, num_parents INTEGER)")
while ms.receiving:
if not debugging:
print("Receiving" + dots*'.')
......@@ -508,11 +511,75 @@ def run_receiver(receivers):
conn.close()
def add_receiver(receiver_url):
conn = sqlite3.connect(database_name)
c = conn.cursor()
c.execute('''CREATE TABLE IF NOT EXISTS receivers (
station_id TEXT UNIQUE,
station_url TEXT,
isAuto INTEGER,
isMobile INTEGER,
latitude REAL,
longitude REAL)
''')
try:
if any(x.station_url == receiver_url for x in receivers):
print("Duplicate receiver, ignoring.")
else:
receivers.append(receiver(receiver_url))
new_rx = receivers[-1].receiver_dict()
to_table = [new_rx['station_id'], new_rx['station_url'], new_rx['auto'],
new_rx['mobile'], new_rx['latitude'], new_rx['longitude']]
c.execute("INSERT OR IGNORE INTO receivers VALUES (?,?,?,?,?,?)", to_table)
conn.commit()
mobile = c.execute("SELECT isMobile FROM receivers WHERE station_id = ?",
[new_rx['station_id']]).fetchone()[0]
receivers[-1].isMobile = bool(mobile)
print("Created new DF Station at " + receiver_url)
except IOError:
ms.receiving = False
conn.close()
def read_rx_table():
conn = sqlite3.connect(database_name)
c = conn.cursor()
try:
c.execute("SELECT station_url FROM receivers")
rx_list = c.fetchall()
for x in rx_list:
receiver_url = x[0].replace('\n', '')
add_receiver(receiver_url)
except sqlite3.OperationalError:
rx_list = []
conn.close()
def update_rx_table():
conn = sqlite3.connect(database_name)
c = conn.cursor()
for item in receivers:
rx = item.receiver_dict()
to_table = [rx['auto'], rx['mobile'], rx['latitude'], rx['longitude'], rx['station_id']]
c.execute('''UPDATE receivers SET
isAuto=?,
isMobile=?,
latitude=?,
longitude=?
WHERE station_id = ?''', to_table)
conn.commit()
conn.close()
def del_receiver(del_rx):
conn = sqlite3.connect(database_name)
c = conn.cursor()
c.execute("DELETE FROM receivers WHERE station_id=?", [del_rx])
conn.commit()
conn.close()
if __name__ == '__main__':
usage = "usage: %prog -r FILE -d FILE [options]"
usage = "usage: %prog -d FILE [options]"
parser = OptionParser(usage=usage)
parser.add_option("-r", "--receivers", dest="rx_file", help="REQUIRED List of receiver URLs", metavar="FILE")
parser.add_option("-d", "--database", dest="database_name", help="REQUIRED Database File", metavar="FILE")
parser.add_option("-r", "--receivers", dest="rx_file", help="List of receiver URLs", metavar="FILE")
parser.add_option("-g", "--geofile", dest="geofile", help="GeoJSON Output File", metavar="FILE")
parser.add_option("-e", "--epsilon", dest="eps", help="Max Clustering Distance, Default 0.2. 0 to disable clustering.",
metavar="NUMBER", type="float", default=0.2)
......@@ -534,7 +601,7 @@ if __name__ == '__main__':
action="store_true")
(options, args) = parser.parse_args()
mandatories = ['rx_file', 'database_name']
mandatories = ['database_name']
for m in mandatories:
if options.__dict__[m] is None:
print("You forgot an arguement")
......@@ -557,15 +624,14 @@ if __name__ == '__main__':
web.start()
try:
receivers = []
with open(rx_file, "r") as file2:
receiver_list = file2.readlines()
for x in receiver_list:
try:
receivers.append(receiver(x.replace('\n', '')))
except IOError:
ms.receiving = False
read_rx_table()
if rx_file:
print("I got a file!")
with open(rx_file, "r") as file2:
receiver_list = file2.readlines()
for x in receiver_list:
receiver_url = x.replace('\n', '')
add_receiver(receiver_url)
while True:
if ms.receiving:
......
......@@ -2,196 +2,196 @@
// * Gets Rx data from backend
// *************************************************
function updateRx(callBack, id) {
fetch("/rx_params")
.then(data=>{return data.json()})
.then(res=>{callBack(res, id)})
fetch("/rx_params")
.then(data => { return data.json() })
.then(res => { callBack(res, id) })
}
// ******************************************************
// * Makes Changes to Receiver, Saves, & Refreshes Cards
// ******************************************************
function editReceivers(rx_json, id) {
const receivers = rx_json['receivers'];
var stationUrlHtml =
"<input type=\"hidden\" id=\"url_" + id + "\"/>";
var stationIDhtml =
"Station ID: <a href=\"" + receivers[id].station_url + "\" target=\"_blank\">" + receivers[id].station_id + "</a>";
var manualInfo =
"<input type=\"hidden\" id=\"manual_toggle_" + receivers[id].uid + "\"/>";
var locationHtml =
"Location: " + receivers[id].latitude + "&#176;, " + receivers[id].longitude + "&#176;";
var heading =
"Heading: " + receivers[id].heading + "&#176;";
var freqHtml =
"Tuned to " + receivers[id].frequency + " MHz";
var edit_stationUrlHtml =
"Station URL:<input style=\"width: 300px;\" type=\"text\" value=\"" + receivers[id].station_url + "\" name=\"station_url_" + id + "\" />";
var edit_stationIDhtml =
"Station ID:<input style=\"width: 105px;\" type=\"text\" value=\"" + receivers[id].station_id + "\" name=\"station_id_" + id + "\" />";
var edit_manualInfo =
"Manually input receiver info: <input id=\"manual_toggle_" + id + "\" type=\"checkbox\" />";
var edit_locationHtml =
"Latitude:<input style=\"width: 105px;\" type=\"text\" value=\"" + receivers[id].latitude + "\" name=\"station_lat_" + id + "\" />"
+ " Longitude:<input style=\"width: 105px;\" type=\"text\" value=\"" + receivers[id].longitude + "\" name=\"station_lon_" + id + "\" />";
var edit_heading =
"Heading:<input style=\"width: 105px;\" type=\"text\" value=\"" + receivers[id].heading + "\" name=\"station_heading_" + id + "\" />";
var edit_freqHtml =
"Frequency:<input style=\"width: 105px;\" type=\"text\" value=\"" + receivers[id].frequency + "\" name=\"frequency_" + id + "\" />";
var mobile = id + "-mobile";
var editButton = document.getElementById(id + "-edit");
var isMobileCheck = document.getElementById("mobilerx_toggle_" + id);
if (editButton.checked) {
let isMobile = "";
if (receivers[id].mobile) isMobile = "checked";
document.getElementById(id + "-editicon").innerHTML = "save";
document.getElementById(mobile).innerHTML =
"Mobile Receiver: <input " + isMobile + " id=\"mobilerx_toggle_" + id + "\" type=\"checkbox\" />";
document.getElementById(id + "-manual").innerHTML = edit_manualInfo;
document.getElementById(id + "-url").innerHTML = edit_stationUrlHtml;
document.getElementById("manual_toggle_" + id).onchange = function() {
if (document.getElementById("manual_toggle_" + id).checked) {
document.getElementById(id + "-id").innerHTML = edit_stationIDhtml;
document.getElementById(id + "-location").innerHTML = edit_locationHtml;
document.getElementById(id + "-heading").innerHTML = edit_heading;
document.getElementById(id + "-freq").innerHTML = edit_freqHtml;
} else {
document.getElementById(id + "-id").innerHTML = stationIDhtml;
document.getElementById(id + "-location").innerHTML = locationHtml;
document.getElementById(id + "-heading").innerHTML = heading;
document.getElementById(id + "-freq").innerHTML = freqHtml;
}
}
} else {
isMobileCheck = document.getElementById("mobilerx_toggle_" + id);
if (isMobileCheck.checked) {
receivers[id].mobile = true;
const receivers = rx_json['receivers'];
var stationUrlHtml =
"<input type=\"hidden\" id=\"url_" + id + "\"/>";
var stationIDhtml =
"Station ID: <a href=\"" + receivers[id].station_url + "\" target=\"_blank\">" + receivers[id].station_id + "</a>";
var manualInfo =
"<input type=\"hidden\" id=\"manual_toggle_" + receivers[id].uid + "\"/>";
var locationHtml =
"Location: " + receivers[id].latitude + "&#176;, " + receivers[id].longitude + "&#176;";
var heading =
"Heading: " + receivers[id].heading + "&#176;";
var freqHtml =
"Tuned to " + receivers[id].frequency + " MHz";
var edit_stationUrlHtml =
"Station URL:<input style=\"width: 300px;\" type=\"text\" value=\"" + receivers[id].station_url + "\" name=\"station_url_" + id + "\" />";
var edit_stationIDhtml =
"Station ID:<input style=\"width: 105px;\" type=\"text\" value=\"" + receivers[id].station_id + "\" name=\"station_id_" + id + "\" />";
var edit_manualInfo =
"Manually input receiver info: <input id=\"manual_toggle_" + id + "\" type=\"checkbox\" />";
var edit_locationHtml =
"Latitude:<input style=\"width: 105px;\" type=\"text\" value=\"" + receivers[id].latitude + "\" name=\"station_lat_" + id + "\" />" +
" Longitude:<input style=\"width: 105px;\" type=\"text\" value=\"" + receivers[id].longitude + "\" name=\"station_lon_" + id + "\" />";
var edit_heading =
"Heading:<input style=\"width: 105px;\" type=\"text\" value=\"" + receivers[id].heading + "\" name=\"station_heading_" + id + "\" />";
var edit_freqHtml =
"Frequency:<input style=\"width: 105px;\" type=\"text\" value=\"" + receivers[id].frequency + "\" name=\"frequency_" + id + "\" />";
var mobile = id + "-mobile";
var editButton = document.getElementById(id + "-edit");
var isMobileCheck = document.getElementById("mobilerx_toggle_" + id);
if (editButton.checked) {
let isMobile = "";
if (receivers[id].mobile) isMobile = "checked";
document.getElementById(id + "-editicon").innerHTML = "save";
document.getElementById(mobile).innerHTML =
"Mobile Receiver: <input " + isMobile + " id=\"mobilerx_toggle_" + id + "\" type=\"checkbox\" />";
document.getElementById(id + "-manual").innerHTML = edit_manualInfo;
document.getElementById(id + "-url").innerHTML = edit_stationUrlHtml;
document.getElementById("manual_toggle_" + id).onchange = function() {
if (document.getElementById("manual_toggle_" + id).checked) {
document.getElementById(id + "-id").innerHTML = edit_stationIDhtml;
document.getElementById(id + "-location").innerHTML = edit_locationHtml;
document.getElementById(id + "-heading").innerHTML = edit_heading;
document.getElementById(id + "-freq").innerHTML = edit_freqHtml;
} else {
document.getElementById(id + "-id").innerHTML = stationIDhtml;
document.getElementById(id + "-location").innerHTML = locationHtml;
document.getElementById(id + "-heading").innerHTML = heading;
document.getElementById(id + "-freq").innerHTML = freqHtml;
}
}
} else {
receivers[id].mobile = false;
isMobileCheck = document.getElementById("mobilerx_toggle_" + id);
if (isMobileCheck.checked) {
receivers[id].mobile = true;
} else {
receivers[id].mobile = false;
}
const otherParams = {
headers: {
"content-type": "application/json"
},
body: JSON.stringify(receivers[id]),
method: "PUT"
};
clearOld();
fetch("/rx_params/" + id, otherParams)
.then(data => { return data.json() })
.then(res => { updateRx(showReceivers, id) })
.then(res => { loadCzml() })
//.catch(error=>{console.log(error)})
// updateRx(showReceivers, id);
// loadCzml();
}
const otherParams = {
headers:{
"content-type":"application/json"
},
body: JSON.stringify(receivers[id]),
method: "PUT"
};
clearOld();
fetch("/rx_params/" + id, otherParams)
.then(data=>{return data.json()})
.then(res=>{updateRx(showReceivers, id)})
.then(res=>{loadCzml()})
//.catch(error=>{console.log(error)})
// updateRx(showReceivers, id);
// loadCzml();
}
}
// ****************************************************
// * Sends Rx station URL to backend and refreshes map
// ****************************************************
function makeNewRx(url) {
const new_rx = {"station_url":url};
// console.log(new_rx);
const otherParams = {
headers:{
"content-type":"application/json"
},
body: JSON.stringify(new_rx),
method: "PUT"
};
clearOld();
fetch("/rx_params/new", otherParams)
.then(data=>{return data.json()})
.then(res=>{updateRx(createReceivers, true)})
.then(res=>{loadCzml()})
//.catch(error=>{console.log(error)})
//.then(updateRx(createReceivers, true));
// loadCzml();
const new_rx = { "station_url": url };
// console.log(new_rx);
const otherParams = {
headers: {
"content-type": "application/json"
},
body: JSON.stringify(new_rx),
method: "PUT"
};
clearOld();
fetch("/rx_params/new", otherParams)
.then(data => { return data.json() })
.then(res => { updateRx(createReceivers, true) })
.then(res => { loadCzml() })
//.catch(error=>{console.log(error)})
//.then(updateRx(createReceivers, true));
// loadCzml();
}
// *****************************************
// * Removes the Rx UI Card
// *****************************************
function removerx(uid) {
const rxcard = document.getElementById("rx-" + uid);
rxcard.remove();
const rxcard = document.getElementById("rx-" + uid);
rxcard.remove();
}
// *******************************************
// * Removes Rx from Backend and Reloads Map
// *******************************************
function deleteReceiver(uid) {
const del_rx = {"uid":uid};
// console.log(new_rx);
const otherParams = {
headers:{
"content-type":"application/json"
},
body: JSON.stringify(del_rx),
method: "PUT"
};
clearOld();
fetch("/rx_params/del", otherParams)
.then(data=>{return data.json()})
.then(res=>{removerx(uid)})
.then(res=>{loadCzml()})
//.catch(error=>{console.log(error)})
//.then(updateRx(createReceivers, true));
// loadCzml();
const del_rx = { "uid": uid };
// console.log(new_rx);
const otherParams = {
headers: {
"content-type": "application/json"
},
body: JSON.stringify(del_rx),
method: "PUT"
};
clearOld();
fetch("/rx_params/del", otherParams)
.then(data => { return data.json() })
.then(res => { removerx(uid) })
.then(res => { loadCzml() })
//.catch(error=>{console.log(error)})
//.then(updateRx(createReceivers, true));
// loadCzml();
}
// *******************************************
// * Fills in Rx UI cards with Rx info
// *******************************************
function showReceivers(rx_json, id) {
const receivers = rx_json['receivers'];
const receivers = rx_json['receivers'];
var stationUrlHtml =
"<input type=\"hidden\" id=\"url_" + id + "\"/>";
var stationUrlHtml =
"<input type=\"hidden\" id=\"url_" + id + "\"/>";
var stationIDhtml =
"Station ID: <a href=\"" + receivers[id].station_url + "\" target=\"_blank\">" + receivers[id].station_id + "</a>";
var stationIDhtml =
"Station ID: <a href=\"" + receivers[id].station_url + "\" target=\"_blank\">" + receivers[id].station_id + "</a>";
var manualInfo =
"<input type=\"hidden\" id=\"manual_toggle_" + receivers[id].uid + "\"/>";
var manualInfo =
"<input type=\"hidden\" id=\"manual_toggle_" + receivers[id].uid + "\"/>";
var locationHtml =
"Location: " + receivers[id].latitude + "&#176;, " + receivers[id].longitude + "&#176;";
var locationHtml =
"Location: " + receivers[id].latitude + "&#176;, " + receivers[id].longitude + "&#176;";
var heading =
"Heading: " + receivers[id].heading + "&#176;";
var heading =
"Heading: " + receivers[id].heading + "&#176;";
var freqHtml =
"Tuned to " + receivers[id].frequency + " MHz";
var freqHtml =
"Tuned to " + receivers[id].frequency + " MHz";
const urlspan = document.getElementById(id + "-url");
const mobilespan = document.getElementById(id + "-mobile");
const manualspan = document.getElementById(id + "-manual");
const idspan = document.getElementById(id + "-id");
const locationspan =document.getElementById(id + "-location");
const headingspan = document.getElementById(id + "-heading");
const freqspan = document.getElementById(id + "-freq");
const urlspan = document.getElementById(id + "-url");
const mobilespan = document.getElementById(id + "-mobile");
const manualspan = document.getElementById(id + "-manual");
const idspan = document.getElementById(id + "-id");
const locationspan = document.getElementById(id + "-location");
const headingspan = document.getElementById(id + "-heading");
const freqspan = document.getElementById(id + "-freq");
document.getElementById(id + "-mobile").innerHTML = "";
document.getElementById(id + "-editicon").innerHTML = "edit";
document.getElementById(id + "-manual").innerHTML = manualInfo;
document.getElementById(id + "-url").innerHTML = stationUrlHtml;
document.getElementById(id + "-id").innerHTML = stationIDhtml;
document.getElementById(id + "-location").innerHTML = locationHtml;
document.getElementById(id + "-heading").innerHTML = heading;
document.getElementById(id + "-freq").innerHTML = freqHtml;
document.getElementById(id + "-mobile").innerHTML = "";
document.getElementById(id + "-editicon").innerHTML = "edit";
document.getElementById(id + "-manual").innerHTML = manualInfo;
document.getElementById(id + "-url").innerHTML = stationUrlHtml;
document.getElementById(id + "-id").innerHTML = stationIDhtml;
document.getElementById(id + "-location").innerHTML = locationHtml;
document.getElementById(id + "-heading").innerHTML = heading;
document.getElementById(id + "-freq").innerHTML = freqHtml;
}
......@@ -200,87 +200,87 @@ function showReceivers(rx_json, id) {
// * Iterates through Rx objects on page load/Rx add.
// ****************************************************
function createReceivers(rx_json, id) {
var receivers
if (id == true) {
receivers = [rx_json['receivers'][Object.keys(rx_json['receivers']).length - 1]];
} else {
receivers = rx_json['receivers'];
}
console.log(receivers);
for (let i = 0; i < Object.keys(receivers).length; i++) {
const rxcard = document.createElement('div');
rxcard.className = "receiver";
rxcard.id = "rx-" + receivers[i].uid;
const urlspan = document.createElement('span');
const mobilespan = document.createElement('span');
const manualspan = document.createElement('span');
const idspan = document.createElement('span');
const locationspan =document.createElement('span');
const headingspan = document.createElement('span');
const freqspan = document.createElement('span');
const editiconspan = document.createElement('span');
editiconspan.classList.add("material-icons", "edit-icon", "no-select");
editiconspan.innerHTML = "edit";
const editcheck = document.createElement('input');
editcheck.classList.add("edit-checkbox", "edit-icon");
editcheck.type = 'checkbox';
editcheck.id = receivers[i].uid + "-edit";
editcheck.setAttribute('onclick',"updateRx(editReceivers, " + receivers[i].uid + ")");
const deleteiconspan = document.createElement('span');
deleteiconspan.classList.add("material-icons", "delete-icon", "no-select");
deleteiconspan.innerHTML = "delete";
const deletecheck = document.createElement('input');
deletecheck.classList.add("edit-checkbox", "delete-icon");
deletecheck.type = 'checkbox';
deletecheck.id = receivers[i].uid + "-delete";
deletecheck.setAttribute('onclick',"deleteReceiver(" + receivers[i].uid + ")");
urlspan.id = receivers[i].uid + "-url";
mobilespan.id = receivers[i].uid + "-mobile";
manualspan.id = receivers[i].uid + "-manual";
idspan.id = receivers[i].uid + "-id";
locationspan.id = receivers[i].uid + "-location";
headingspan.id = receivers[i].uid + "-heading";
freqspan.id = receivers[i].uid + "-freq";
editiconspan.id = receivers[i].uid + "-editicon";
document.getElementById("menu").insertBefore(rxcard, document.getElementById("add_station"));
rxcard.appendChild(urlspan);
rxcard.appendChild(mobilespan);
rxcard.appendChild(manualspan);
rxcard.appendChild(idspan);
rxcard.appendChild(locationspan);
rxcard.appendChild(headingspan);
rxcard.appendChild(freqspan);
rxcard.appendChild(editiconspan);
rxcard.appendChild(deleteiconspan);
rxcard.appendChild(editcheck);
rxcard.appendChild(deletecheck);
showReceivers(rx_json, receivers[i].uid);
}
var receivers
if (id == true) {
receivers = [rx_json['receivers'][Object.keys(rx_json['receivers']).length - 1]];
} else {
receivers = rx_json['receivers'];
}
console.log(receivers);
for (let i = 0; i < Object.keys(receivers).length; i++) {
const rxcard = document.createElement('div');
rxcard.className = "receiver";
rxcard.id = "rx-" + receivers[i].uid;
const urlspan = document.createElement('span');
const mobilespan = document.createElement('span');
const manualspan = document.createElement('span');
const idspan = document.createElement('span');
const locationspan = document.createElement('span');
const headingspan = document.createElement('span');
const freqspan = document.createElement('span');
const editiconspan = document.createElement('span');
editiconspan.classList.add("material-icons", "edit-icon", "no-select");
editiconspan.innerHTML = "edit";
const editcheck = document.createElement('input');
editcheck.classList.add("edit-checkbox", "edit-icon");
editcheck.type = 'checkbox';
editcheck.id = receivers[i].uid + "-edit";
editcheck.setAttribute('onclick', "updateRx(editReceivers, " + receivers[i].uid + ")");
const deleteiconspan = document.createElement('span');
deleteiconspan.classList.add("material-icons", "delete-icon", "no-select");
deleteiconspan.innerHTML = "delete";
const deletecheck = document.createElement('input');
deletecheck.classList.add("edit-checkbox", "delete-icon");
deletecheck.type = 'checkbox';
deletecheck.id = receivers[i].uid + "-delete";
deletecheck.setAttribute('onclick', "deleteReceiver(" + receivers[i].uid + ")");
urlspan.id = receivers[i].uid + "-url";
mobilespan.id = receivers[i].uid + "-mobile";
manualspan.id = receivers[i].uid + "-manual";
idspan.id = receivers[i].uid + "-id";
locationspan.id = receivers[i].uid + "-location";
headingspan.id = receivers[i].uid + "-heading";
freqspan.id = receivers[i].uid + "-freq";
editiconspan.id = receivers[i].uid + "-editicon";
document.getElementById("menu").insertBefore(rxcard, document.getElementById("add_station"));
rxcard.appendChild(urlspan);
rxcard.appendChild(mobilespan);
rxcard.appendChild(manualspan);
rxcard.appendChild(idspan);
rxcard.appendChild(locationspan);
rxcard.appendChild(headingspan);
rxcard.appendChild(freqspan);
rxcard.appendChild(editiconspan);
rxcard.appendChild(deleteiconspan);
rxcard.appendChild(editcheck);
rxcard.appendChild(deletecheck);
showReceivers(rx_json, i);
}
}
// ****************************************************
// * Refreshes info on Rx UI Cards (Refresh button)
// ****************************************************
function refreshRx(rx_json, id) {
const receivers = rx_json['receivers'];
for (let i = 0; i < Object.keys(receivers).length; i++) {
showReceivers(rx_json, receivers[i].uid);
}
const receivers = rx_json['receivers'];
for (let i = 0; i < Object.keys(receivers).length; i++) {
showReceivers(rx_json, receivers[i].uid);
}
}
// ****************************************************
// * Main function - Loads all Receivers
// ****************************************************
function loadRx(action) {
updateRx(action, null);
}
updateRx(action, null);
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment