Skip to content

Commit

Permalink
minor improvement 202009
Browse files Browse the repository at this point in the history
  • Loading branch information
schdt899 committed Sep 12, 2020
1 parent 67b5717 commit eacf93e
Show file tree
Hide file tree
Showing 5 changed files with 256 additions and 129 deletions.
4 changes: 4 additions & 0 deletions CPUTuneApp/CPUTuneApp.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
E8E1905724B275D60067C47C /* CPUTuneAppUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = E8E1905624B275D60067C47C /* CPUTuneAppUITests.swift */; };
F9791F8C24E214A9001BD7D2 /* Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9791F8B24E214A9001BD7D2 /* Utils.swift */; };
F9C6DA3224C61189005532FA /* SettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9C6DA3124C61189005532FA /* SettingsView.swift */; };
F9E5E987250C337000D454F4 /* SettingsEntity.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9E5E986250C337000D454F4 /* SettingsEntity.swift */; };
/* End PBXBuildFile section */

/* Begin PBXContainerItemProxy section */
Expand Down Expand Up @@ -52,6 +53,7 @@
E8E1905824B275D60067C47C /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
F9791F8B24E214A9001BD7D2 /* Utils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Utils.swift; sourceTree = "<group>"; };
F9C6DA3124C61189005532FA /* SettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsView.swift; sourceTree = "<group>"; };
F9E5E986250C337000D454F4 /* SettingsEntity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsEntity.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */

/* Begin PBXFrameworksBuildPhase section */
Expand Down Expand Up @@ -105,6 +107,7 @@
E8E1903524B275D50067C47C /* AppDelegate.swift */,
E8E1903724B275D50067C47C /* ContentView.swift */,
F9C6DA3124C61189005532FA /* SettingsView.swift */,
F9E5E986250C337000D454F4 /* SettingsEntity.swift */,
F9791F8B24E214A9001BD7D2 /* Utils.swift */,
E8E1903924B275D60067C47C /* Assets.xcassets */,
E8E1903E24B275D60067C47C /* Main.storyboard */,
Expand Down Expand Up @@ -272,6 +275,7 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
F9E5E987250C337000D454F4 /* SettingsEntity.swift in Sources */,
F9C6DA3224C61189005532FA /* SettingsView.swift in Sources */,
E8E1903824B275D50067C47C /* ContentView.swift in Sources */,
E8E1903624B275D50067C47C /* AppDelegate.swift in Sources */,
Expand Down
75 changes: 24 additions & 51 deletions CPUTuneApp/CPUTuneApp/AppDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import SwiftUI
@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
var viewDataStore: ViewDataStore!
var settingsEntity: SettingsEntity!

var window: NSWindow!
var settingsWindow: NSWindow!
Expand All @@ -37,29 +38,16 @@ class AppDelegate: NSObject, NSApplicationDelegate {
private func initViewDataStore() {
self.viewDataStore = ViewDataStore()

let settingValues = getSettings()

self.viewDataStore.enableTurboBoost = settingValues.0
self.viewDataStore.hwpRequestValue = settingValues.1
self.viewDataStore.enableProcHot = settingValues.3
let strTurboRatioLimits = settingValues.2

let cpuCount = getPhysicalCPUCount()

var trlList = Array(
repeating: TRLItem(id: 0, value: ""),
count: cpuCount
)

for i in 0..<cpuCount {
var limitValue: String = ""
if strTurboRatioLimits.count > i * 2 {
limitValue = subString(strTurboRatioLimits, i * 2, i * 2 + 2)
limitValue = String(UInt(limitValue, radix: 16) ?? 0)
}
trlList[i] = TRLItem(id: i, value: limitValue)
self.settingsEntity = SettingsEntity()
do {
try self.settingsEntity.load()
mapSettingsEntityToDataStore(self.settingsEntity, self.viewDataStore, cpuCount)
} catch {
self.viewDataStore.showErrorForSettings = true
self.viewDataStore.errorMsgForSettings = error.localizedDescription
}
self.viewDataStore.turboRatioLimits = trlList
}

private func initStateBarMenu() {
Expand Down Expand Up @@ -92,42 +80,27 @@ class AppDelegate: NSObject, NSApplicationDelegate {
self.settingsWindow.orderOut(nil)
}
self.viewDataStore.settingsConfirm = {
self.settingsWindow.orderOut(nil)
self.saveSettings()
do {
try self.saveSettings()
self.settingsWindow.orderOut(nil)
} catch {
self.viewDataStore.showErrorForSettings = true
self.viewDataStore.errorMsgForSettings = error.localizedDescription
}
}
self.viewDataStore.settingsApply = {
self.saveSettings()
do {
try self.saveSettings()
} catch {
self.viewDataStore.showErrorForSettings = true
self.viewDataStore.errorMsgForSettings = error.localizedDescription
}
}
}

private func saveSettings() {
let strTurboRatioLimits: String = self.viewDataStore.turboRatioLimits.map {v in
String(format: "%0.2x", UInt(v.value) ?? 0)
}.joined()
private func saveSettings() throws {
mapDataStoreToSettingsEntity(self.viewDataStore, self.settingsEntity)

persistSettings(
self.viewDataStore.enableTurboBoost,
self.viewDataStore.hwpRequestValue,
strTurboRatioLimits,
self.viewDataStore.enableProcHot
)
try self.settingsEntity.persist()
}
}

final class ViewDataStore: ObservableObject {
@Published var running: Bool = false

@Published var enableTurboBoost: Bool = false
@Published var enableProcHot: Bool = false
@Published var hwpRequestValue: String = ""
@Published var turboRatioLimits: [TRLItem] = []

var settingsCancel: () -> () = {}
var settingsConfirm: () -> () = {}
var settingsApply: () -> () = {}
}

struct TRLItem: Identifiable {
let id: Int
var value: String
}
161 changes: 161 additions & 0 deletions CPUTuneApp/CPUTuneApp/SettingsEntity.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,161 @@
//
// SettingsEntity.swift
// CPUTuneApp
//

import Foundation

let pathCPUTuneTurboBoostRT: String = "/tmp/CPUTuneTurboBoostRT.conf"
let pathHWPRequest: String = "/tmp/HWPRequest.conf"
let pathTurboRatioLimit: String = "/tmp/TurboRatioLimit.conf"
let pathCPUTuneProcHotRT: String = "/tmp/CPUTuneProcHotRT.conf"

class SettingsEntity {
private var _turboBoost: Bool = false
private var _hwpRequest: String = ""
private var _turboRatioLimit: String = ""
private var _procHot: Bool = false

var turboBoost: Bool {
get {
return self._turboBoost;
}
set {
self._turboBoost = newValue;
}
}

var hwpRequest: String {
get {
return self._hwpRequest;
}
set {
if newValue.count > 8 {
self._hwpRequest = subString(newValue, 0, 8);
} else {
self._hwpRequest = newValue;
}
}
}

var procHot: Bool {
get {
return self._procHot;
}
set {
self._procHot = newValue;
}
}

func getTurboRatioLimitAsArray() -> Array<UInt> {
if self._turboRatioLimit.count < 1 {
return []
}
let n = self._turboRatioLimit.count / 2
var values = Array<UInt>(repeating: 0, count: n)
for i in 0..<n {
let limitValue = subString(self._turboRatioLimit, i * 2, i * 2 + 2)
values[i] = UInt(limitValue, radix: 16) ?? 0
}
return values
}

func setTurboRatioLimitByArray(_ values: Array<UInt>) {
self._turboRatioLimit = values.map {v in
String(format: "%0.2x", min(v, 255))
}.joined()
}

func load() throws {
var turboBoost: String = "0"
var hwpRequest: String = ""
var turboRatioLimit: String = ""
var procHot: String = "0"

var errorMessages: Array<String> = []

do {
turboBoost = try String(contentsOfFile: pathCPUTuneTurboBoostRT, encoding: .ascii)
} catch {
errorMessages.append(error.localizedDescription)
}

do {
hwpRequest = try String(contentsOfFile: pathHWPRequest, encoding: .ascii)
} catch {
errorMessages.append(error.localizedDescription)
}

do {
turboRatioLimit = try String(contentsOfFile: pathTurboRatioLimit, encoding: .ascii)
} catch {
errorMessages.append(error.localizedDescription)
}

do {
procHot = try String(contentsOfFile: pathCPUTuneProcHotRT, encoding: .ascii)
} catch {
errorMessages.append(error.localizedDescription)
}

if errorMessages.count > 0 {
throw ErrorWithMessage(errorMessages.joined(separator: "\n"))
}

self._turboBoost = turboBoost == "1"
self._hwpRequest = subString(hwpRequest, 2)
self._turboRatioLimit = subString(turboRatioLimit, 2)
self._procHot = procHot == "1"
}

func persist() throws {
var errorMessages: Array<String> = []

do {
let stringContent = self._turboBoost ? "1" : "0"
try stringContent.write(
toFile: pathCPUTuneTurboBoostRT,
atomically: false,
encoding: .ascii
)
} catch {
errorMessages.append(error.localizedDescription)
}

do {
try "0x\(self._hwpRequest)".write(
toFile: pathHWPRequest,
atomically: false,
encoding: .ascii
)
} catch {
errorMessages.append(error.localizedDescription)
}

do {

try "0x\(self._turboRatioLimit)".write(
toFile: pathTurboRatioLimit,
atomically: false,
encoding: .ascii
)
} catch {
errorMessages.append(error.localizedDescription)
}

do {
let stringContent = self._procHot ? "1" : "0"
try stringContent.write(
toFile: pathCPUTuneProcHotRT,
atomically: false,
encoding: .ascii
)
} catch {
errorMessages.append(error.localizedDescription)
}

if errorMessages.count > 0 {
throw ErrorWithMessage(errorMessages.joined(separator: "\n"))
}
}
}
8 changes: 7 additions & 1 deletion CPUTuneApp/CPUTuneApp/SettingsView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,13 @@ struct SettingsView: View {
Text(LocalizedStringKey("Apply"))
}
}.padding()
}.padding().frame(minWidth: 550)
}.padding().frame(minWidth: 550).alert(isPresented: self.$dataStore.showErrorForSettings) {
Alert(
title: Text("Error"),
message: Text(self.dataStore.errorMsgForSettings),
dismissButton: .default(Text("Confirm"))
)
}
}
}

Expand Down
Loading

0 comments on commit eacf93e

Please sign in to comment.