diff --git a/extension.js b/extension.js index de33e4e..70e5681 100644 --- a/extension.js +++ b/extension.js @@ -298,6 +298,9 @@ var VitalsMenuButton = GObject.registerClass({ // item must match the index on the combo box this._sensorsIconPathPrefix = ['/icons/original/', '/icons/gnome/']; + // mapping of hwmon devices to labels + this._sensorsLabels = new Map(); + this._warnings = []; this._isDestroyed = false; this._sensorMenuItems = {}; @@ -310,7 +313,7 @@ var VitalsMenuButton = GObject.registerClass({ this._newGpuDetectedCount = 0; this._last_query = new Date().getTime(); - this._sensors = new Sensors.Sensors(this._settings, this._sensorIcons); + this._sensors = new Sensors.Sensors(this._settings, this._sensorIcons, this._sensorsLabels); this._values = new Values.Values(this._settings, this._sensorIcons); this._menuLayout = new St.BoxLayout({ vertical: false, @@ -333,10 +336,64 @@ var VitalsMenuButton = GObject.registerClass({ // start off with fresh sensors this._querySensors(); + // associate sensors with labels + this._parseSensorsLabelMap(); + // start monitoring sensors this._initializeTimer(); } + // parse the user mapping for sensor labels and + // returns a map of maps. first level keys contain + // hwmon device and second level keys contain feature ids, + // second level values contain user defined labels + _parseSensorsLabelMap() { + let proc; + try { + const launcher = new Gio.SubprocessLauncher({ + flags: Gio.SubprocessFlags.STDOUT_PIPE | Gio.SubprocessFlags.STDERR_PIPE + }); + launcher.setenv("LD_LIBRARY_PATH", "/data/projects/experiments/lm-sensors/lib", false); + proc = launcher.spawnv(["/data/projects/experiments/lm-sensors/prog/sensors/sensors", "--label-map"]); + } catch (e) { + console.error("Failed to get sensors mapping from 'sensors --label-map'"); + throw(e); + } + let success, stdout; + try { + [success, stdout] = proc.communicate_utf8(null, null); + } catch (e) { + console.error("Failed to get sensors mapping from 'sensors --label-map'"); + throw(e); + } + + const chip_re = /^\s*chip\s+"(.*)"\s+\#\s+\/sys\/class\/hwmon\/hwmon(\d+)/; + const label_re = /^\s*label\s+(\w+)\s+(?:"(.*)"|(.*))/; + const ignore_re = /^\s*ignore\s+(\w+)/; + + let key = null; + for (const line of stdout.split(/\r?\n/)) { + const chip_match = line.match(chip_re); + if (chip_match) { + const current_chip = chip_match[1]; + const hwmon_device = `hwmon${chip_match[2]}`; + key = hwmon_device; + if (!this._sensorsLabels.has(key)) + this._sensorsLabels.set(key, new Map()); + continue; + } + const label_match = line.match(label_re); + if (label_match && key) { + this._sensorsLabels.get(key).set(label_match[1], label_match[2] ?? label_match[3]); + continue; + } + const ignore_match = line.match(ignore_re); + if (ignore_match && key) { + this._sensorsLabels.get(key).set(ignore_match[1], ""); + } + } + } + _connectSettingsSignals() { this._settings.connectObject( 'changed::update-time', this._updateTimeSettingChanged.bind(this), diff --git a/sensors.js b/sensors.js index 9355af1..234bcb9 100644 --- a/sensors.js +++ b/sensors.js @@ -42,9 +42,10 @@ try { export const Sensors = GObject.registerClass({ GTypeName: 'Sensors', }, class Sensors extends GObject.Object { - _init(settings, sensorIcons) { + _init(settings, sensorIcons, sensorsLabels) { this._settings = settings; this._sensorIcons = sensorIcons; + this._sensorsLabels = sensorsLabels; this.resetHistory(); @@ -1013,15 +1014,16 @@ export const Sensors = GObject.registerClass({ continue; new FileModule.File(obj['input']).read().then(value => { - let extra = (obj['label'].indexOf('_label')==-1) ? ' ' + obj['input'].substr(obj['input'].lastIndexOf('/')+1).split('_')[0] : ''; + let feature = obj['input'].substr(obj['input'].lastIndexOf('/')+1).split('_')[0]; + let extra = (obj['label'].indexOf('_label')==-1) ? ' ' + feature : ''; if (value > 0 || !this._settings.get_boolean('hide-zeros') || obj['type'] == 'fan') { new FileModule.File(obj['label']).read().then(label => { - this._addTempVoltFan(callback, obj, name, label, extra, value); + this._addTempVoltFan(callback, obj, file, feature, name, label, extra, value); }).catch(err => { let tmpFile = obj['label'].substr(0, obj['label'].lastIndexOf('/')) + '/name'; new FileModule.File(tmpFile).read().then(label => { - this._addTempVoltFan(callback, obj, name, label, extra, value); + this._addTempVoltFan(callback, obj, file, feature, name, label, extra, value); }).catch(err => { }); }); } @@ -1030,22 +1032,28 @@ export const Sensors = GObject.registerClass({ }).catch(err => { }); } - _addTempVoltFan(callback, obj, name, label, extra, value) { - // prepend module that provided sensor data - if (name != label) label = name + ' ' + label; + _addTempVoltFan(callback, obj, file, feature, name, label, extra, value) { + // // prepend module that provided sensor data + // if (name != label) label = name + ' ' + label; - //if (label == 'nvme Composite') label = 'NVMe'; - //if (label == 'nouveau') label = 'Nvidia'; + // //if (label == 'nvme Composite') label = 'NVMe'; + // //if (label == 'nouveau') label = 'Nvidia'; - label = label + extra; + // label = label + extra; - // in the future we will read /etc/sensors3.conf - if (label == 'acpitz temp1') label = 'ACPI Thermal Zone'; - if (label == 'pch_cannonlake temp1') label = 'Platform Controller Hub'; - if (label == 'iwlwifi_1 temp1') label = 'Wireless Adapter'; - if (label == 'Package id 0') label = 'Processor 0'; - if (label == 'Package id 1') label = 'Processor 1'; - label = label.replace('Package id', 'CPU'); + // // in the future we will read /etc/sensors3.conf + // if (label == 'acpitz temp1') label = 'ACPI Thermal Zone'; + // if (label == 'pch_cannonlake temp1') label = 'Platform Controller Hub'; + // if (label == 'iwlwifi_1 temp1') label = 'Wireless Adapter'; + // if (label == 'Package id 0') label = 'Processor 0'; + // if (label == 'Package id 1') label = 'Processor 1'; + // label = label.replace('Package id', 'CPU'); + + if (this._sensorsLabels.has(file) && this._sensorsLabels.get(file).has(feature)) { + label = this._sensorsLabels.get(file).get(feature); + if (label.length == 0) + return; + } let types = [ 'temperature', 'voltage', 'fan' ]; for (let type of types) {