From c3368ddd1938eb48db40d34f2e86c8f152e1b34b Mon Sep 17 00:00:00 2001 From: Serhiy Mytrovtsiy Date: Tue, 23 Jun 2020 00:03:00 +0200 Subject: [PATCH] init Sensors module --- ModuleKit/Widgets/Sensors.swift | 106 +++++++++++++++ ModuleKit/Widgets/popup.swift | 82 ++++++++++++ ModuleKit/widget.swift | 4 + Modules/Disk/popup.swift | 8 -- Modules/Net/readers.swift | 1 + Modules/Sensors/Info.plist | 24 ++++ Modules/Sensors/config.plist | 23 ++++ Modules/Sensors/main.swift | 54 ++++++++ Modules/Sensors/readers.swift | 54 ++++++++ Modules/Sensors/values.swift | 187 ++++++++++++++++++++++++++ Stats.xcodeproj/project.pbxproj | 228 +++++++++++++++++++++++++++++++- Stats/AppDelegate.swift | 3 +- StatsKit/SMC.swift | 37 +++++- StatsKit/extensions.swift | 17 +++ 14 files changed, 817 insertions(+), 11 deletions(-) create mode 100644 ModuleKit/Widgets/Sensors.swift create mode 100644 ModuleKit/Widgets/popup.swift create mode 100644 Modules/Sensors/Info.plist create mode 100644 Modules/Sensors/config.plist create mode 100644 Modules/Sensors/main.swift create mode 100644 Modules/Sensors/readers.swift create mode 100644 Modules/Sensors/values.swift diff --git a/ModuleKit/Widgets/Sensors.swift b/ModuleKit/Widgets/Sensors.swift new file mode 100644 index 00000000..33af1c2c --- /dev/null +++ b/ModuleKit/Widgets/Sensors.swift @@ -0,0 +1,106 @@ +// +// Sensors.swift +// ModuleKit +// +// 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 +import StatsKit + +public class SensorsWidget: Widget { + private var labelState: Bool = false + private let store: UnsafePointer? + + private var values: [String] = [] + + public init(preview: Bool, title: String, config: NSDictionary?, store: UnsafePointer?) { + self.store = store + if config != nil { + var configuration = config! + + if preview { + if let previewConfig = config!["Preview"] as? NSDictionary { + configuration = previewConfig + if let value = configuration["Values"] as? String { + self.values = value.split(separator: ",").map{ (String($0) ) } + } + } + } + + if let label = configuration["Label"] as? Bool { + self.labelState = label + } + } + super.init(frame: CGRect(x: 0, y: Constants.Widget.margin, width: Constants.Widget.width, height: Constants.Widget.height - (2*Constants.Widget.margin))) + self.title = title + self.type = .sensors + self.preview = preview + self.canDrawConcurrently = true + + if self.store != nil { + self.labelState = store!.pointee.bool(key: "\(self.title)_\(self.type.rawValue)_label", defaultValue: self.labelState) + } + + if self.preview { + self.labelState = false + } + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + public override func draw(_ dirtyRect: NSRect) { + super.draw(dirtyRect) + guard self.values.count != 0 else { + self.setWidth(1) + return + } + + let num: Int = Int(round(Double(self.values.count) / 2)) + let width: CGFloat = Constants.Widget.width * CGFloat(num) + + let rowWidth: CGFloat = Constants.Widget.width - (Constants.Widget.margin*2) + let rowHeight: CGFloat = self.frame.height / 2 + + let style = NSMutableParagraphStyle() + style.alignment = .right + let attributes = [ + NSAttributedString.Key.font: NSFont.systemFont(ofSize: 9, weight: .light), + NSAttributedString.Key.foregroundColor: NSColor.textColor, + NSAttributedString.Key.paragraphStyle: style + ] + + var x: CGFloat = Constants.Widget.margin + for i in 0.. { } self.reachability!.whenReachable = { _ in + self.usage.reset() self.readInformation() } self.reachability!.whenUnreachable = { _ in diff --git a/Modules/Sensors/Info.plist b/Modules/Sensors/Info.plist new file mode 100644 index 00000000..20202aa7 --- /dev/null +++ b/Modules/Sensors/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSHumanReadableCopyright + Copyright © 2020 Serhiy Mytrovtsiy. All rights reserved. + + diff --git a/Modules/Sensors/config.plist b/Modules/Sensors/config.plist new file mode 100644 index 00000000..9b0ea9a9 --- /dev/null +++ b/Modules/Sensors/config.plist @@ -0,0 +1,23 @@ + + + + + Name + Sensors + State + + Widgets + + sensors + + Default + + Preview + + Values + 38°,41° + + + + + diff --git a/Modules/Sensors/main.swift b/Modules/Sensors/main.swift new file mode 100644 index 00000000..df004fac --- /dev/null +++ b/Modules/Sensors/main.swift @@ -0,0 +1,54 @@ +// +// main.swift +// Stats +// +// 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 +import ModuleKit +import StatsKit + +public class Sensors: Module { + private var sensorsReader: SensorsReader + private let popupView: Popup = Popup() + + public init(_ store: UnsafePointer?, _ smc: UnsafePointer) { + self.sensorsReader = SensorsReader(smc) + super.init( + store: store, + popup: self.popupView, + settings: nil + ) + + self.popupView.setup(self.sensorsReader.list) + + self.sensorsReader.readyCallback = { [unowned self] in + self.readyHandler() + } + self.sensorsReader.callbackHandler = { [unowned self] value in + self.usageCallback(value) + } + + self.addReader(self.sensorsReader) + } + + private func usageCallback(_ value: [Sensor_t]?) { + if value == nil { + return + } + + self.popupView.usageCallback(value!) + + let value_1 = value?.first{ $0.key == "TC0F" } + let value_2 = value?.first{ $0.key == "TC0P" } + + if let widget = self.widget as? SensorsWidget { + widget.setValues([value_1!.formattedMiniValue, value_2!.formattedMiniValue]) + } + } +} diff --git a/Modules/Sensors/readers.swift b/Modules/Sensors/readers.swift new file mode 100644 index 00000000..cdaa569f --- /dev/null +++ b/Modules/Sensors/readers.swift @@ -0,0 +1,54 @@ +// +// readers.swift +// Stats +// +// 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 +import ModuleKit +import StatsKit + +internal class SensorsReader: Reader<[Sensor_t]> { + internal var list: [Sensor_t] = [] + private var smc: UnsafePointer + + init(_ smc: UnsafePointer) { + self.smc = smc + } + + public override func setup() { + var available: [String] = self.smc.pointee.getAllKeys() + + available = available.filter({ (key: String) -> Bool in + switch key.prefix(1) { + case "T", "V", "P": return SensorsDict[key] != nil + default: return false + } + }) + + available.forEach { (key: String) in + if var sensor = SensorsDict[key] { + sensor.value = self.smc.pointee.getValue(key) + if sensor.value != nil { + sensor.key = key + self.list.append(sensor) + } + } + } + } + + public override func read() { + for i in 0.. Measurement { + let locale = NSLocale.current as NSLocale + var unit = UnitTemperature.celsius + if let unitLocale = locale.object(forKey: NSLocale.Key(rawValue: "kCFLocaleTemperatureUnitKey")) { + unit = "\(unitLocale)" == "Celsius" ? UnitTemperature.celsius : UnitTemperature.fahrenheit + } + let measurement = Measurement(value: self, unit: unit) + + return measurement + } } public extension NSView { @@ -391,6 +402,12 @@ extension UInt32 { } } +extension UInt16 { + init(bytes: (UInt8, UInt8)) { + self = UInt16(bytes.0) << 8 | UInt16(bytes.1) + } +} + extension FourCharCode { init(fromString str: String) { precondition(str.count == 4)