mirror of
https://github.com/kiddin9/op-packages.git
synced 2026-11-01 03:25:13 +08:00
🌴 Sync 2026-03-05 23:51:42
This commit is contained in:
1 parent
97c049ed0a
commit
0acff03804
14253 files changed
+3893239
No files matched your search
@@ -0,0 +1,11 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=luci-app-cellled
|
||||
LUCI_DEPENDS:=+cellled
|
||||
PKG_VERSION:=0.1.0
|
||||
PKG_RELEASE:=1
|
||||
LUCI_TITLE:=LuCI application for showing cellular RSSI LED
|
||||
|
||||
include $(TOPDIR)/feeds/luci/luci.mk
|
||||
|
||||
# call BuildPackage - OpenWrt buildroot signature
|
||||
@@ -0,0 +1,232 @@
|
||||
'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();
|
||||
}
|
||||
});
|
||||
@@ -0,0 +1,56 @@
|
||||
"Language: ru\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Last-Translator: Konstantine Shevlyakov <shevlakov@132lan.ru>\n"
|
||||
|
||||
msgid "Application for showing cellular RSSI LEDs"
|
||||
msgstr "Отображение сигнала сотовой сети RSSI"
|
||||
|
||||
msgid "Select Data service'"
|
||||
msgstr "Выберите тип данных"
|
||||
|
||||
msgid "Select Data port"
|
||||
msgstr "Выберите порт данных"
|
||||
|
||||
msgid "Timeout interval data(sec)"
|
||||
msgstr "Интервал обновления данных (сек)"
|
||||
|
||||
msgid "Use RGB Led"
|
||||
msgstr "Используется RGB Led"
|
||||
|
||||
msgid "Enable if Support PWM LED"
|
||||
msgstr "Включить ШИМ, если доступно"
|
||||
|
||||
msgid "Red LED"
|
||||
msgstr "Красный"
|
||||
|
||||
msgid "Greed LED"
|
||||
msgstr "Зеленый"
|
||||
|
||||
msgid "Blue LED"
|
||||
msgstr "Синий"
|
||||
|
||||
msgid "Signal strength values"
|
||||
msgstr "Значения силы сигнала"
|
||||
|
||||
msgid "Min.value %"
|
||||
msgstr "Мин.значение %"
|
||||
|
||||
msgid "Max.value %"
|
||||
msgstr "Макс.значение %"
|
||||
|
||||
msgid "Quality"
|
||||
msgstr "Качество"
|
||||
|
||||
msgid "Poor"
|
||||
msgstr "Ничтожное"
|
||||
|
||||
msgid "Bad"
|
||||
msgstr "Плохое"
|
||||
|
||||
msgid "Fair"
|
||||
msgstr "Среднее"
|
||||
|
||||
msgid "Good"
|
||||
msgstr "Хорошее"
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"admin/modem": {
|
||||
"title": "Modem",
|
||||
"order": 45,
|
||||
"action": {
|
||||
"type": "firstchild",
|
||||
"rescue": "true"
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
"admin/modem/cellled": {
|
||||
"title": "CellLED",
|
||||
"order": "61",
|
||||
"action": {
|
||||
"type": "view",
|
||||
"path": "cellled"
|
||||
},
|
||||
"depends": {
|
||||
"uci": { "cellled": true }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"luci-app-cellled": {
|
||||
"description": "Grant UCI access for luci-app-cellled",
|
||||
"read": {
|
||||
"file": {
|
||||
"/usr/bin/mmcli": [ "exec" ]
|
||||
},
|
||||
"uci": [ "cellled" ]
|
||||
},
|
||||
"write": {
|
||||
"uci": [ "cellled" ]
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user