// // GraphView.swift // Docsis Toolkit // // Created by Kilian Hofmann on 20.06.17. // Copyright © 2017 Kilian Hofmann. All rights reserved. // import Cocoa class FrequencyGraph: NSView { let opQueue: OperationQueue = OperationQueue() // Constants static let graphSizeWithSeparator: Int = 109 static let graphSize: Int = 108 static let maxGraphSize: Int = 17300 let zeroOffset: Double = 37 // Path related var path: NSBezierPath = NSBezierPath.init() var threshold: NSBezierPath = NSBezierPath.init() var upstream: Bool = false var lastTime: Int = 0 var lastTimeThreshold: Int = 0 var timePaths: [NSBezierPath] = [] var lossPaths: [NSBezierPath] = [] var offset: Int = 0 // Popover let popover: NSPopover = NSPopover() // Data var data: [String] = [] var dataLoss: [String] = [] var frequency: Double = 0.0 // Cursor var cursor: NSBezierPath = NSBezierPath.init() // Superview var content: FlippedView! // Indicator var indicator: NSProgressIndicator! init(upstream: Bool, frame: CGRect, superview: FlippedView, indicator: NSProgressIndicator) { super.init(frame: frame) self.upstream = upstream self.indicator = indicator let tracking: NSTrackingArea = NSTrackingArea(rect: self.bounds, options: [.mouseEnteredAndExited, .mouseMoved, .activeInActiveApp, .inVisibleRect], owner: self, userInfo: nil) self.addTrackingArea(tracking) popover.contentViewController = GraphDetailsController() self.content = superview } required init?(coder: NSCoder) { super.init(coder: coder) } override func draw(_ dirtyRect: NSRect) { NSColor.white.setFill() __NSRectFill(dirtyRect) threshold.lineWidth = 0.5 if upstream { NSColor.red.set() threshold.stroke() } else { NSColor.blue.set() threshold.stroke() } NSColor.black.set() path.lineWidth = 1 path.stroke() NSColor(red: 0, green: 0, blue: 0, alpha: 0.3).set() cursor.lineWidth = 2 cursor.stroke() for index in 0..= 0 { (popover.contentViewController! as! GraphDetailsController).freq_str = "\(roundToPlaces(1, input: frequency)) MHz" (popover.contentViewController! as! GraphDetailsController).time_str = "\(data[(x-10) / 2 - offset / 2].components(separatedBy: ";")[0])" (popover.contentViewController! as! GraphDetailsController).power_str = "\(data[(x-10) / 2 - offset / 2].components(separatedBy: ";")[1]) dBmV" if upstream { (popover.contentViewController! as! GraphDetailsController).snr_str = "\(data[(x-10) / 2 - offset / 2].components(separatedBy: ";")[2]) dBmV" (popover.contentViewController! as! GraphDetailsController).ranging_str = "\(data[(x-10) / 2 - offset / 2].components(separatedBy: ";")[3])" } else { (popover.contentViewController! as! GraphDetailsController).snr_str = "\(data[(x-10) / 2 - offset / 2].components(separatedBy: ";")[2]) dB" } popover.show(relativeTo: NSMakeRect(CGFloat(x), 0, 2, CGFloat(FrequencyGraph.graphSize)), of: self, preferredEdge: .minY) } } override func scrollWheel(with event: NSEvent) { super.scrollWheel(with: event) cursor.removeAllPoints() popover.performClose(self) setNeedsDisplay(self.bounds) } // MARK: - Helper func roundToPlaces(_ places:Int, input: Double) -> Double { let divisor = pow(10.0, Double(places)) return round(input * divisor) / divisor } }