2020-06-23 00:03:00 +02:00
|
|
|
//
|
|
|
|
|
// main.swift
|
2020-07-06 15:52:57 +02:00
|
|
|
// Sensors
|
2020-06-23 00:03:00 +02:00
|
|
|
//
|
|
|
|
|
// Created by Serhiy Mytrovtsiy on 17/06/2020.
|
|
|
|
|
// Using Swift 5.0.
|
|
|
|
|
// Running on macOS 10.15.
|
|
|
|
|
//
|
|
|
|
|
// Copyright © 2020 Serhiy Mytrovtsiy. All rights reserved.
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
import Cocoa
|
2021-06-04 19:37:29 +02:00
|
|
|
import Kit
|
2020-06-23 00:03:00 +02:00
|
|
|
|
|
|
|
|
public class Sensors: Module {
|
2024-02-10 17:03:47 +01:00
|
|
|
private var sensorsReader: SensorsReader?
|
2023-03-18 19:23:51 +01:00
|
|
|
private let popupView: Popup
|
2023-12-15 17:20:14 +01:00
|
|
|
private let settingsView: Settings
|
2024-01-19 21:05:48 +01:00
|
|
|
private let portalView: Portal
|
2023-12-15 17:20:14 +01:00
|
|
|
private let notificationsView: Notifications
|
2020-06-23 00:03:00 +02:00
|
|
|
|
2022-12-21 19:47:17 +01:00
|
|
|
private var fanValueState: FanValue {
|
|
|
|
|
FanValue(rawValue: Store.shared.string(key: "\(self.config.name)_fanValue", defaultValue: "percentage")) ?? .percentage
|
|
|
|
|
}
|
|
|
|
|
|
2024-08-23 20:34:10 +02:00
|
|
|
private var selectedSensor: String
|
|
|
|
|
|
2021-03-25 22:14:20 +01:00
|
|
|
public init() {
|
2024-02-10 17:03:47 +01:00
|
|
|
self.settingsView = Settings(.sensors)
|
2023-03-18 19:23:51 +01:00
|
|
|
self.popupView = Popup()
|
2024-01-19 21:05:48 +01:00
|
|
|
self.portalView = Portal(.sensors)
|
2023-12-15 17:20:14 +01:00
|
|
|
self.notificationsView = Notifications(.sensors)
|
2024-08-23 20:34:10 +02:00
|
|
|
self.selectedSensor = Store.shared.string(key: "\(ModuleType.sensors.rawValue)_sensor", defaultValue: "Average System Total")
|
2020-06-24 00:23:06 +02:00
|
|
|
|
2020-06-23 00:03:00 +02:00
|
|
|
super.init(
|
2024-12-13 12:49:30 +01:00
|
|
|
moduleType: .sensors,
|
2020-06-23 00:03:00 +02:00
|
|
|
popup: self.popupView,
|
2023-12-15 17:20:14 +01:00
|
|
|
settings: self.settingsView,
|
2024-01-19 21:05:48 +01:00
|
|
|
portal: self.portalView,
|
2023-12-15 17:20:14 +01:00
|
|
|
notifications: self.notificationsView
|
2020-06-23 00:03:00 +02:00
|
|
|
)
|
2020-07-06 19:25:41 +02:00
|
|
|
guard self.available else { return }
|
2020-07-11 20:25:03 +02:00
|
|
|
|
2024-02-10 17:03:47 +01:00
|
|
|
self.sensorsReader = SensorsReader { [weak self] value in
|
|
|
|
|
self?.usageCallback(value)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
self.settingsView.setList(self.sensorsReader?.list.sensors)
|
|
|
|
|
self.popupView.setup(self.sensorsReader?.list.sensors)
|
|
|
|
|
self.portalView.setup(self.sensorsReader?.list.sensors)
|
|
|
|
|
self.notificationsView.setup(self.sensorsReader?.list.sensors)
|
2020-06-23 00:03:00 +02:00
|
|
|
|
2023-08-13 13:15:27 +02:00
|
|
|
self.settingsView.callback = { [weak self] in
|
2024-02-10 17:03:47 +01:00
|
|
|
self?.sensorsReader?.read()
|
2020-06-24 00:23:06 +02:00
|
|
|
}
|
2023-08-13 13:15:27 +02:00
|
|
|
self.settingsView.setInterval = { [weak self] value in
|
2024-02-10 17:03:47 +01:00
|
|
|
self?.sensorsReader?.setInterval(value)
|
2020-07-10 22:56:47 +02:00
|
|
|
}
|
2023-08-13 13:15:27 +02:00
|
|
|
self.settingsView.HIDcallback = { [weak self] in
|
2022-11-21 17:15:57 +01:00
|
|
|
DispatchQueue.global(qos: .background).async {
|
2024-02-10 17:03:47 +01:00
|
|
|
self?.sensorsReader?.HIDCallback()
|
2022-11-21 17:15:57 +01:00
|
|
|
DispatchQueue.main.async {
|
2024-02-10 17:03:47 +01:00
|
|
|
self?.popupView.setup(self?.sensorsReader?.list.sensors)
|
|
|
|
|
self?.portalView.setup(self?.sensorsReader?.list.sensors)
|
|
|
|
|
self?.settingsView.setList(self?.sensorsReader?.list.sensors)
|
|
|
|
|
self?.notificationsView.setup(self?.sensorsReader?.list.sensors)
|
2022-11-21 17:15:57 +01:00
|
|
|
}
|
|
|
|
|
}
|
2022-01-14 20:34:39 +01:00
|
|
|
}
|
2023-08-13 13:15:27 +02:00
|
|
|
self.settingsView.unknownCallback = { [weak self] in
|
2022-11-21 17:15:57 +01:00
|
|
|
DispatchQueue.global(qos: .background).async {
|
2024-02-10 17:03:47 +01:00
|
|
|
self?.sensorsReader?.unknownCallback()
|
2022-11-21 17:15:57 +01:00
|
|
|
DispatchQueue.main.async {
|
2024-02-10 17:03:47 +01:00
|
|
|
self?.popupView.setup(self?.sensorsReader?.list.sensors)
|
|
|
|
|
self?.portalView.setup(self?.sensorsReader?.list.sensors)
|
|
|
|
|
self?.settingsView.setList(self?.sensorsReader?.list.sensors)
|
|
|
|
|
self?.notificationsView.setup(self?.sensorsReader?.list.sensors)
|
2022-11-21 17:15:57 +01:00
|
|
|
}
|
|
|
|
|
}
|
2022-11-11 14:27:31 +01:00
|
|
|
}
|
2024-08-23 20:34:10 +02:00
|
|
|
self.selectedSensor = Store.shared.string(key: "\(ModuleType.sensors.rawValue)_sensor", defaultValue: self.selectedSensor)
|
|
|
|
|
self.settingsView.selectedHandler = { [weak self] value in
|
|
|
|
|
self?.selectedSensor = value
|
|
|
|
|
self?.sensorsReader?.read()
|
|
|
|
|
}
|
2020-06-24 00:23:06 +02:00
|
|
|
|
2024-02-10 17:03:47 +01:00
|
|
|
self.setReaders([self.sensorsReader])
|
2020-06-23 00:03:00 +02:00
|
|
|
}
|
|
|
|
|
|
2022-04-21 19:44:08 +02:00
|
|
|
public override func willTerminate() {
|
2024-02-10 17:03:47 +01:00
|
|
|
guard SMCHelper.shared.isActive(), let reader = self.sensorsReader else { return }
|
2022-04-26 07:36:31 +02:00
|
|
|
|
2024-02-10 17:03:47 +01:00
|
|
|
reader.list.sensors.filter({ $0 is Fan }).forEach { (s: Sensor_p) in
|
2022-04-26 07:36:31 +02:00
|
|
|
if let f = s as? Fan, let mode = f.customMode {
|
|
|
|
|
if mode != .automatic {
|
|
|
|
|
SMCHelper.shared.setFanMode(f.id, mode: FanMode.automatic.rawValue)
|
|
|
|
|
}
|
2022-04-21 19:44:08 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-06-27 17:09:38 +02:00
|
|
|
private func usageCallback(_ raw: Sensors_List?) {
|
2023-08-13 13:15:27 +02:00
|
|
|
guard let value = raw, self.enabled else { return }
|
2020-06-23 00:03:00 +02:00
|
|
|
|
2023-06-27 17:09:38 +02:00
|
|
|
self.popupView.usageCallback(value.sensors)
|
2024-01-19 21:05:48 +01:00
|
|
|
self.portalView.usageCallback(value.sensors)
|
2023-12-15 17:20:14 +01:00
|
|
|
self.notificationsView.usageCallback(value.sensors)
|
2021-02-13 16:39:11 +01:00
|
|
|
|
2024-07-04 19:52:52 +02:00
|
|
|
self.menuBar.widgets.filter{ $0.isActive }.forEach { (w: SWidget) in
|
2021-02-13 16:39:11 +01:00
|
|
|
switch w.item {
|
2024-08-23 20:34:10 +02:00
|
|
|
case let widget as Mini:
|
|
|
|
|
if let active = value.sensors.first(where: { $0.key == self.selectedSensor }) {
|
2024-09-03 18:29:04 +02:00
|
|
|
var value: Double = active.localValue/100
|
2024-08-23 20:34:10 +02:00
|
|
|
var unit: String = active.miniUnit
|
|
|
|
|
if let fan = active as? Fan, self.fanValueState == .percentage {
|
|
|
|
|
value = Double(fan.percentage)/100
|
|
|
|
|
unit = "%"
|
|
|
|
|
}
|
|
|
|
|
if value > 999 {
|
|
|
|
|
unit = ""
|
|
|
|
|
}
|
|
|
|
|
widget.setValue(value)
|
|
|
|
|
widget.setSuffix(unit)
|
|
|
|
|
}
|
|
|
|
|
case let widget as StackWidget:
|
|
|
|
|
var list: [Stack_t] = []
|
|
|
|
|
|
|
|
|
|
value.sensors.forEach { (s: Sensor_p) in
|
|
|
|
|
if s.state {
|
|
|
|
|
var value = s.formattedMiniValue
|
|
|
|
|
if let f = s as? Fan {
|
|
|
|
|
if self.fanValueState == .percentage {
|
|
|
|
|
value = "\(f.percentage)%"
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
list.append(Stack_t(key: s.key, value: value))
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
widget.setValues(list)
|
|
|
|
|
case let widget as BarChart:
|
|
|
|
|
var flatList: [[ColorValue]] = []
|
|
|
|
|
value.sensors.filter{ $0 is Fan }.forEach { (s: Sensor_p) in
|
|
|
|
|
if s.state, let f = s as? Fan {
|
|
|
|
|
flatList.append([ColorValue(((f.value*100)/f.maxSpeed)/100)])
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
widget.setValue(flatList)
|
2021-02-13 16:39:11 +01:00
|
|
|
default: break
|
|
|
|
|
}
|
2020-06-23 00:03:00 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|