Add tests for PrinterRequestManager , remove singleton implementation in favor of view constructor arguments

This commit is contained in:
Madeline
2023-03-20 19:58:40 -04:00
parent ff551c9a5f
commit 6341b0464d
9 changed files with 98 additions and 40 deletions

View File

@@ -9,7 +9,7 @@ import SwiftUI
import Network
struct PrinterConfigView: View {
@ObservedObject var printerManager = PrinterRequestManager.shared
@ObservedObject var printerManager: PrinterRequestManager
var body: some View {
VStack {
@@ -52,8 +52,10 @@ struct PrinterConfigView: View {
}
struct PrinterConfigView_Previews: PreviewProvider {
@State static var printerManager = PrinterRequestManager()
static var previews: some View {
PrinterConfigView()
PrinterConfigView(printerManager: printerManager)
}
}

View File

@@ -7,6 +7,7 @@
import Foundation
import Network
import AppKit
import Starscream
// MARK: Bonjour Protocol
@@ -17,13 +18,22 @@ protocol NetworkDiscoveryEngine {
func setStateUpdateHandler(_ handler: @escaping ((NWBrowser.State) -> Void))
}
//protocol NDEResult {
// var endpoint: NWEndpoint { get }
// var interface: [NWInterface] { get }
// var metadata: NWBrowser.Result.Metadata { get }
//}
extension NWBrowser: NetworkDiscoveryEngine {
//class NDEngine: NetworkDiscoveryEngine,
func startScan(queue: DispatchQueue) {
start(queue: queue)
}
func setBrowseResultsChangedHandler(_ handler: @escaping ((Set<NWBrowser.Result>, Set<NWBrowser.Result.Change>) -> Void)) {
self.browseResultsChangedHandler = handler
}
func setStateUpdateHandler(_ handler: @escaping ((State) -> Void)) {
self.stateUpdateHandler = handler
}
@@ -50,8 +60,6 @@ struct JsonRpcRequest: Codable {
class PrinterRequestManager: ObservableObject, WebSocketDelegate {
let WEBSOCKET_TIMEOUT_INTERVAL: TimeInterval = 60.0
static let shared = PrinterRequestManager()
// Debug stuff
let startDate = Date()
let startDateString: String
@@ -96,8 +104,6 @@ class PrinterRequestManager: ObservableObject, WebSocketDelegate {
var socket: WebSocket?
var lastPingDate = Date()
// TODO: Set this up to actually reconnect
// Parse a JSON-RPC query-response message
func parse_response(_ response: jsonRpcResponse) {
state = response.result.status.print_stats?.state ?? ""
@@ -124,7 +130,7 @@ class PrinterRequestManager: ObservableObject, WebSocketDelegate {
}
}
private init(browser: NetworkDiscoveryEngine = NWBrowser(for: .bonjourWithTXTRecord(type: "_moonraker._tcp", domain: "local."), using: .tcp)) {
init(browser: NetworkDiscoveryEngine = NWBrowser(for: .bonjourWithTXTRecord(type: "_moonraker._tcp", domain: "local."), using: .tcp)) {
state = ""
progress = 0.0
extruderTemperature = 0.0
@@ -167,6 +173,38 @@ class PrinterRequestManager: ObservableObject, WebSocketDelegate {
})
// Start up the bonjour browser, get results and process them in the update handler
nwBrowser.startScan(queue: DispatchQueue.main)
// Screen sleep functionality
// NSWorkspace.shared.notificationCenter.addObserver(self, selector: #selector(screenDidSleep(_:)), name: NSWorkspace.screensDidSleepNotification, object: nil)
// NSWorkspace.shared.notificationCenter.addObserver(self, selector: #selector(screenDidWake(_:)), name: NSWorkspace.screensDidWakeNotification, object: nil)
let center = NSWorkspace.shared.notificationCenter;
let mainQueue = OperationQueue.main
center.addObserver(forName: NSWorkspace.screensDidWakeNotification, object: nil, queue: mainQueue) { notification in
self.screenChangedSleepState(notification)
}
center.addObserver(forName: NSWorkspace.screensDidSleepNotification, object: nil, queue: mainQueue) { notification in
self.screenChangedSleepState(notification)
}
}
func screenChangedSleepState(_ notification: Notification) {
switch(notification.name) {
case NSWorkspace.screensDidSleepNotification:
socket?.disconnect()
case NSWorkspace.screensDidWakeNotification:
self.openWebsocket()
default:
return
}
}
func screenDidWake(_ notification: Notification) {
print("Screen woke: \(notification.name)")
if socket != nil {
self.openWebsocket()
}
}
// Called from the UI with an endpoint.

View File

@@ -13,6 +13,8 @@ struct SoyuzApp: App {
@State var currentIcon = "move.3d"
@ObservedObject var printerManager = PrinterRequestManager()
var body: some Scene {
// WindowGroup(id: "floating-stats") {
// KlipperMonMenuBarExtraView(currentMenuBarIcon: $currentIcon)
@@ -20,13 +22,13 @@ struct SoyuzApp: App {
// }
WindowGroup("Configuration", id: "soyuz_cfg", content: {
PrinterConfigView()
PrinterConfigView(printerManager: printerManager)
//.frame(minWidth: 300, maxWidth: 600, minHeight: 60, maxHeight: 100)
})
.windowResizability(.contentSize)
MenuBarExtra("Soyuz", systemImage: currentIcon) {
SoyuzMenuBarExtraView(currentMenuBarIcon: $currentIcon)
SoyuzMenuBarExtraView(printerManager: printerManager, currentMenuBarIcon: $currentIcon)
.padding([.top, .leading, .trailing], 8)
.padding([.bottom], 6)
}

View File

@@ -15,7 +15,7 @@ struct SoyuzMenuBarExtraView: View {
@Environment(\.openWindow) var openWindow
@ObservedObject var printerManager = PrinterRequestManager.shared
@ObservedObject var printerManager: PrinterRequestManager
@State var printPercentage: Double = 0
@@ -100,8 +100,10 @@ struct SoyuzMenuBarExtraView: View {
struct KlipperMonMenuBarExtraView_Previews: PreviewProvider {
@State static var currentMenuBarIcon = "move.3d"
@State static var printerManager = PrinterRequestManager()
static var previews: some View {
SoyuzMenuBarExtraView(currentMenuBarIcon: $currentMenuBarIcon)
SoyuzMenuBarExtraView(printerManager: printerManager, currentMenuBarIcon: $currentMenuBarIcon)
}
}