op-packages/luci-app-cellled/htdocs/luci-static/resources/view/cellled.js
github-actions[bot] 32600acc60 🌴 Sync 2026-03-05 23:51:42
2026-03-05 23:51:42 +08:00

233 lines
6.1 KiB
JavaScript

'use strict';
'require form';
'require view';
'require uci';
'require rpc';
'require fs';
'require tools.widgets as widgets';
function getModemList() {
return fs.exec_direct('/usr/bin/mmcli', [ '-L' ]).then(function(res) {
var lines = (res || '').split(/\n/),
tasks = [];
for (var i = 0; i < lines.length; i++) {
var m = lines[i].match(/\/Modem\/(\d+)/);
if (m)
tasks.push(fs.exec_direct('/usr/bin/mmcli', [ '-m', m[1] ]));
}
return Promise.all(tasks).then(function(res) {
var modems = [];
for (var i = 0; i < res.length; i++) {
var man = res[i].match(/manufacturer: ([^\n]+)/),
mod = res[i].match(/model: ([^\n]+)/),
dev = res[i].match(/device: ([^\n]+)/);
if (dev) {
modems.push({
device: dev[1].trim(),
manufacturer: (man ? man[1].trim() : '') || '?',
model: (mod ? mod[1].trim() : '') || dev[1].trim()
});
}
}
return modems;
});
});
}
var callSerialPort = rpc.declare({
object: 'file',
method: 'list',
params: [ 'path' ],
expect: { entries: [] },
filter: function(list, params) {
var rv = [];
for (var i = 0; i < list.length; i++)
if (list[i].name.match(/^ttyACM/) || list[i].name.match(/^ttyUSB/))
rv.push(params.path + list[i].name);
return rv.sort();
}
});
var callQMIPort = rpc.declare({
object: 'file',
method: 'list',
params: [ 'path' ],
expect: { entries: [] },
filter: function(list, params) {
var rv = [];
for (var i = 0; i < list.length; i++)
if (list[i].name.match(/^cdc-wdm/))
rv.push(params.path + list[i].name);
return rv.sort();
}
});
var callLEDs = rpc.declare({
object: 'luci',
method: 'getLEDs',
expect: { '': {} }
});
return view.extend({
load: function() {
return Promise.all([
callLEDs(),
L.resolveDefault(fs.list('/www' + L.resource('view/system/led-trigger')), []),
]).then(function(data) {
var plugins = data[1];
var tasks = [];
for (var i = 0; i < plugins.length; i++) {
var m = plugins[i].name.match(/^(.+)\.js$/);
if (plugins[i].type != 'file' || m == null)
continue;
tasks.push(L.require('view.system.led-trigger.' + m[1]).then(L.bind(function(name){
return L.resolveDefault(L.require('view.system.led-trigger.' + name)).then(function(form) {
return {
name: name,
form: form,
};
});
}, this, m[1])));
}
return Promise.all(tasks).then(function(plugins) {
var value = {};
value[0] = data[0];
value[1] = plugins;
return value;
});
});
},
render: function(data) {
var m, s, o, triggers = [];
var leds = data[0];
var plugins = data[1];
for (var k in leds)
for (var i = 0; i < leds[k].triggers.length; i++)
triggers[i] = leds[k].triggers[i];
m = new form.Map('cellled', _('CellLED'));
m.description = _('Application for showing cellular RSSI LEDs');
s = m.section(form.TypedSection, 'device', _('General setup'));
s.anonymous = true;
s.rmempty = true;
o = s.option(form.ListValue, 'data_type', _('Select Data service'));
o.value('qmi', 'libQMI');
o.value('uqmi', 'uQMI');
o.value('mm', 'Modem Manager');
o.value('serial', 'Serial Port');
o = s.option(form.ListValue, 'device', _('Select Data port'));
o.load = function(section_id) {
return callSerialPort('/dev/').then(L.bind(function(devices) {
for (var i = 0; i < devices.length; i++)
this.value(devices[i]);
return form.Value.prototype.load.apply(this, [section_id]);
}, this));
};
o.rmempty = true;
o.depends('data_type', 'serial');
o = s.option(form.ListValue, 'device_qmi', _('Select Data port'));
o.load = function(section_id) {
return callQMIPort('/dev/').then(L.bind(function(devices) {
for (var i = 0; i < devices.length; i++)
this.value(devices[i]);
return form.Value.prototype.load.apply(this, [section_id]);
}, this));
};
o.rmempty = true;
o.depends('data_type', 'qmi');
o.depends('data_type', 'uqmi');
o = s.option(form.ListValue, 'device_mm', _('Select Data port'));
o.load = function(section_id) {
return getModemList().then(L.bind(function(devices) {
for (var i = 0; i < devices.length; i++)
this.value(devices[i].device,
'%s - %s'.format(devices[i].manufacturer, devices[i].model));
return form.Value.prototype.load.apply(this, [section_id]);
}, this));
};
o.rmempty = true;
o.depends('data_type', 'mm');
o = s.option(form.Value, 'timeout', _('Timeout interval data(sec)'));
o.datatype = 'and(uinteger,min(5))';
o = s.option(form.Flag, 'rgb_led', _('RGB LED'), _('Use RGB Led'));
o = s.option(form.Flag, 'use_pwm', _('Use PWM'), _('Enable if Support PWM LED'));
o.depends('rgb_led', '1');
o = s.option(form.ListValue, 'red_led', _('Red LED'));
Object.keys(leds).sort().forEach(function(name) {
o.value(name);
});
o.rmempty = true;
o.depends('rgb_led', '1');
o = s.option(form.ListValue, 'green_led', _('Greed LED'));
Object.keys(leds).sort().forEach(function(name) {
o.value(name);
});
o.rmempty = true;
o.depends('rgb_led', '1');
o = s.option(form.ListValue, 'blue_led', _('Blue LED'));
Object.keys(leds).sort().forEach(function(name) {
o.value(name);
});
o.rmempty = true;
o.depends('rgb_led', '1');
s = m.section(form.GridSection, 'rssi_led', _('Signal strength values'));
s.addremove = true;
s.anonymous = true;
s.nodescriptions = true;
o = s.option(form.Flag, 'rgb', _('RGB Led'));
o = s.option(form.ListValue, 'led', _('LED'));
Object.keys(leds).sort().forEach(function(name) {
o.value(name);
});
o.rmempty = true;
o.depends('rgb', '0');
o = s.option(form.ListValue, 'type', _('Quality'));
o.value('poor',_('Poor'));
o.value('bad',_('Bad'));
o.value('fair',_('Fair'));
o.value('good',_('Good'));
o.depends('rgb', '1');
o = s.option(form.Value, 'rssi_min', _('Min.value %'));
o.datatype = 'and(uinteger,min(0),max(100))';
o.rmempty = true;
o = s.option(form.Value, 'rssi_max', _('Max.value %'));
o.datatype = 'and(uinteger,min(0),max(100))';
o.rmempty = true;
return m.render();
}
});