Skip to content

Commit

Permalink
phihag#51 Admin: Edit tournament: Display battery charge levels for t…
Browse files Browse the repository at this point in the history
…he tablets
  • Loading branch information
tengmel committed Oct 14, 2024
1 parent 7253d79 commit e2cff0e
Show file tree
Hide file tree
Showing 9 changed files with 241 additions and 13 deletions.
61 changes: 56 additions & 5 deletions bts/bupws.js
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,45 @@ async function handle_persist_display_settings(app, ws, msg) {
}
}

async function handle_device_info(app, ws, msg) {
const tournament_key = msg.tournament_key;
const device_info = msg.device;
if (device_info) {
device_info.client_ip = ws._socket.remoteAddress;
update_device_info(app, tournament_key, device_info);
}
}
async function update_device_info(app, tournament_key, device_info) {
app.db.tournaments.findOne({ key: tournament_key }, async (err, tournament) => {
if (!err || !tournament) {
err = { message: 'No tournament ' + default_tournament_key };
}
const client_id = determine_client_id_from_ip(device_info.client_ip);
const panel = fetch_panel(client_id);
if (panel != null) {
const hostname = "N/N";
var display_court_displaysetting = await get_display_court_displaysettings(app, client_id);
if (display_court_displaysetting == null) {
display_court_displaysetting = create_display_court_displaysettings(client_id, hostname, null, generate_default_displaysettings_id(tournament));
}
panel.battery = device_info.battery
display_court_displaysetting.battery = device_info.battery
display_court_displaysetting.online = true;
admin.notify_change(app, default_tournament_key, 'display_status_changed', { 'display_court_displaysetting': display_court_displaysetting });
}
});
}

function fetch_panel(client_id) {
for (const panel_ws of all_panels) {
if (client_id == panel_ws.client_id) {
return panel_ws;
}
}
return null;
}


function create_display_court_displaysettings(client_id, hostname, court_id, displaysetting_id) {
return {
client_id: client_id,
Expand Down Expand Up @@ -196,13 +235,20 @@ async function determine_client_hostname(ws) {

function determine_client_id(ws) {
if (!ws.client_id) {
const remote_adress_seqments = ws._socket.remoteAddress.split('.');
ws.client_id = remote_adress_seqments[remote_adress_seqments.length - 1];

ws.client_id = determine_client_id_from_ip (ws._socket.remoteAddress);
}
return ws.client_id;
}

function determine_client_id_from_ip(ip_adress) {
if (ip_adress) {
const remote_adress_seqments = ip_adress.split('.');
return remote_adress_seqments[remote_adress_seqments.length - 1];
} else {
return "UNDEFINED";
}
}

function persist_client_court_displaysetting(app, client_court_displaysetting) {
return new Promise((resolve, reject) => {
app.db.display_court_displaysettings.insert(client_court_displaysetting, function (err, inserted_t) {
Expand Down Expand Up @@ -560,13 +606,14 @@ function reinitialize_panel(app, tournament_key, client_id, new_court_id, displa
return false;;
}

async function add_display_status(app, tournament, displays) {
async function add_display_status(app, tournament, displays, callback) {
for (const d of displays) {
d.online = false;
for (const panel_ws of all_panels) {
const ws_client_id = determine_client_id(panel_ws);
if (d.client_id == ws_client_id) {
d.online = true;
d.battery = panel_ws.battery;
}
}
}
Expand All @@ -575,17 +622,19 @@ async function add_display_status(app, tournament, displays) {
const ws_client_id = determine_client_id(panel_ws);
const ws_hostname = await determine_client_hostname(panel_ws);
for (const d of displays) {

if (d.client_id == ws_client_id) {
found = true;
}
}
if (!found) {
const client_court_displaysetting = create_display_court_displaysettings(ws_client_id, ws_hostname, panel_ws.court_id, generate_default_displaysettings_id(tournament));
client_court_displaysetting.online = true;
client_court_displaysetting.battery = panel_ws.battery;
displays[displays.length] = client_court_displaysetting;

}
}
return callback(displays);
}

module.exports = {
Expand All @@ -596,6 +645,8 @@ module.exports = {
handle_score_change,
handle_persist_display_settings,
handle_reset_display_settings,
handle_device_info,
update_device_info,
restart_panel,
change_display_mode,
change_default_display_mode,
Expand Down
14 changes: 14 additions & 0 deletions bts/http_api.js
Original file line number Diff line number Diff line change
Expand Up @@ -269,6 +269,13 @@ async function score_handler(req, res) {
'setup.now_on_court': true,
};

const device_info = req.body.device;
if (device_info) {
const client_ip = req.socket.remoteAddress
device_info.client_ip = client_ip;
}


const finish_confirmed = req.body.finish_confirmed ? req.body.finish_confirmed : false;
if (finish_confirmed) {
update.team1_won = req.body.team1_won,
Expand Down Expand Up @@ -370,6 +377,13 @@ async function score_handler(req, res) {
}
return cb(null, match, changed_court);
},
(match, changed_court, cb) => {
if (!device_info) {
return cb(null, match, changed_court);
}
bupws.update_device_info(req.app, tournament_key, device_info);
return cb(null, match, changed_court);
},
], function (err) {
if (err) {
res.json({
Expand Down
7 changes: 4 additions & 3 deletions bts/stournament.js
Original file line number Diff line number Diff line change
Expand Up @@ -48,9 +48,10 @@ function get_displays(app, tournament, callback) {
});

const bupws = require('./bupws');
bupws.add_display_status(app, tournament, display_court_displaysettings);
display_court_displaysettings = display_court_displaysettings.sort(utils.cmp_key('client_id'));
return callback(err, display_court_displaysettings);
bupws.add_display_status(app, tournament, display_court_displaysettings, function (display_court_displaysettings) {
display_court_displaysettings = display_court_displaysettings.sort(utils.cmp_key('client_id'));
return callback(err, display_court_displaysettings);
});
});
}

Expand Down
26 changes: 24 additions & 2 deletions static/css/admin.css
Original file line number Diff line number Diff line change
@@ -1,5 +1,27 @@
html,
body {
td.battery-status-green {
background: linear-gradient(90deg, hsl(92, 89%, 46%) 15%, hsl(92, 90%, 68%) 100%);
}
td.battery-status-yellow {
background: linear-gradient(90deg, hsl(54, 89%, 46%) 15%, hsl(92, 90%, 45%) 100%);
}
td.battery-status-orange {
background: linear-gradient(90deg, hsl(22, 89%, 46%) 15%, hsl(54, 90%, 45%) 100%);
color: white;
}
td.battery-status-red {
background: linear-gradient(90deg, hsl(7, 89%, 46%) 15%, hsl(11, 93%, 68%) 100%);
color: white;
}

td.battery-status-charging {
background-image: url(../icons/charging.svg);
background-repeat: no-repeat;
background-position: center center;
background-color: forestgreen;
color: white;
font-weight: bold;
}
html, body {
margin: 0;
padding: 0;
font-size: 20px;
Expand Down
101 changes: 101 additions & 0 deletions static/icons/charging.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions static/js/change.js
Original file line number Diff line number Diff line change
Expand Up @@ -208,6 +208,7 @@ function default_handler(rerender, special_funcs) {
d.court_id = display_setting.court_id;
d.displaysetting_id = display_setting.displaysetting_id;
d.online = display_setting.online;
d.battery = display_setting.battery;
}
if (laststatus != d.online) {
cerror.silent('Display ' + display_setting.client_id + ' is ' + (display_setting.online ? 'online' : 'offline'));
Expand Down
3 changes: 3 additions & 0 deletions static/js/ci18n_de.js
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,9 @@ var ci18n_de = {
'tournament:edit:ticker_password': 'Ticker-Passwort:',
'tournament:edit:displays': 'Anzeigen administrieren:',
'tournament:edit:displays:hostname': 'Hostname',
'tournament:edit:displays:batterylevel': 'Akku',
'tournament:edit:displays:battery_charging_time': 'Lädt: {battery_charging_time} Minuten Ladzeit.',
'tournament:edit:displays:battery_duscharging_time': '{battery_discharging_time} Minuten Restlaufzeit.',
'tournament:edit:displays:num': 'Monitor',
'tournament:edit:displays:court': 'Feld',
'tournament:edit:displays:setting': 'Einstellung',
Expand Down
3 changes: 3 additions & 0 deletions static/js/ci18n_en.js
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,9 @@ var ci18n_en = {
'tournament:edit:normalizations:language': 'Language',
'tournament:edit:displays': 'Manage Displays:',
'tournament:edit:displays:hostname': 'Hostname',
'tournament:edit:displays:batterylevel': 'Battery',
'tournament:edit:displays:battery_charging_time': 'Charging: {battery_charging_time} minutes remaining.',
'tournament:edit:displays:battery_duscharging_time': '{battery_discharging_time} minutes left.',
'tournament:edit:displays:num': 'Displaynumber',
'tournament:edit:displays:court': 'Ar Court',
'tournament:edit:displays:setting': 'Setting',
Expand Down
38 changes: 35 additions & 3 deletions static/js/ctournament.js
Original file line number Diff line number Diff line change
Expand Up @@ -1045,6 +1045,34 @@ var ctournament = (function() {
}
}

function set_battery_state(battery, node) {
if (battery && battery != null) {
node.removeAttribute("class");
let level = Math.floor(battery.level * 100);
node.innerHTML = level + '%';
if (battery.charging) {
node.classList.add('battery-status-charging');

node.title = ci18n('tournament:edit:displays:battery_charging_time', {
battery_charging_time : Math.floor(battery.chargingTime / 60)
});
} else {
node.title = ci18n('tournament:edit:displays:battery_duscharging_time', {
battery_discharging_time: Math.floor(battery.dischargingTime / 60)
});

if (level <= 10) {
node.classList.add('battery-status-red');
} else if (level <= 20) {
node.classList.add('battery-status-orange');
} else if (level <= 40) {
node.classList.add('battery-status-yellow');
} else {
node.classList.add('battery-status-green');
}
}
}
}

function render_displaysettings(main) {
uiu.el(main, 'h2', {}, ci18n('tournament:edit:displays'));
Expand All @@ -1054,14 +1082,18 @@ var ctournament = (function() {
const tr = uiu.el(display_tbody, 'tr');
uiu.el(tr, 'th', {}, ci18n('tournament:edit:displays:num'));
uiu.el(tr, 'th', {}, ci18n('tournament:edit:displays:hostname'));
uiu.el(tr, 'td', {}, ci18n('tournament:edit:displays:court'));
uiu.el(tr, 'td', {}, ci18n('tournament:edit:displays:setting'));
uiu.el(tr, 'td', {}, ci18n('tournament:edit:displays:onlinestatus'));
uiu.el(tr, 'th', {}, ci18n('tournament:edit:displays:batterylevel'));
uiu.el(tr, 'th', {}, ci18n('tournament:edit:displays:court'));
uiu.el(tr, 'th', {}, ci18n('tournament:edit:displays:setting'));
uiu.el(tr, 'th', {}, ci18n('tournament:edit:displays:onlinestatus'));


for (const c of curt.displays) {
const tr = uiu.el(display_tbody, 'tr');
uiu.el(tr, 'th', {}, c.client_id);
uiu.el(tr, 'th', {}, c.hostname);
var battery_node = uiu.el(tr, 'td', {}, 'N/N"');
set_battery_state(c.battery, battery_node);
createCourtSelectBox(uiu.el(tr, 'td', {}, ''), c.client_id, c.court_id);
createDisplaySettingsSelectBox(uiu.el(tr, 'td', {}, ''), c.client_id, c.displaysetting_id);
uiu.el(tr, 'td', {}, (!c.online) ? 'offline' : 'online');
Expand Down

0 comments on commit e2cff0e

Please sign in to comment.