AVRSack/AVRsack/ASSerialWin.swift

111 lines
3.4 KiB
Swift

//
// ASSerialWin.swift
// AVRsack
//
// Created by Matthias Neeracher on 27/12/14.
// Copyright (c) 2014 Aere Perennius. All rights reserved.
//
import Cocoa
private var serialInstances = [String : ASSerialWin]()
class ASSerialWin: NSWindowController {
@IBOutlet weak var portPopUp : NSPopUpButton!
@IBOutlet weak var inputLine : NSTextField!
@IBOutlet weak var logView : ACEView!
var baudRate : Int32 = 9600 {
didSet(oldRate) {
if portHandle != nil {
connect(self) // Disconnect existing
connect(self) // Reconnect
}
}
}
var sendCR = false
var sendLF = true
var port = ""
var serialData = ""
var serialObserver : AnyObject!
dynamic var portHandle : NSFileHandle?
class func showWindowWithPort(port: String) {
if let existing = serialInstances[port] {
existing.showWindow(self)
} else {
let newInstance = ASSerialWin(port:port)
serialInstances[port] = newInstance
newInstance.showWindow(self)
}
}
convenience init(port: String) {
self.init(windowNibName:"ASSerialWin")
self.port = port
var nc = NSNotificationCenter.defaultCenter()
serialObserver = nc.addObserverForName(kASSerialPortsChanged, object: nil, queue: nil, usingBlock: { (NSNotification) in
self.rebuildPortMenu()
})
}
override func finalize() {
NSNotificationCenter.defaultCenter().removeObserver(serialObserver)
serialInstances.removeValueForKey(port)
}
override func windowDidLoad() {
logView.setReadOnly(true)
logView.setShowPrintMargin(false)
rebuildPortMenu()
window?.title = port
connect(self)
super.windowDidLoad()
}
func rebuildPortMenu() {
portPopUp.removeAllItems()
portPopUp.addItemsWithTitles(ASSerial.ports())
portPopUp.selectItemWithTitle(port)
}
@IBAction func selectPort(item: AnyObject) {
port = (item as NSPopUpButton).titleOfSelectedItem!
window?.title = port
}
@IBAction func sendInput(AnyObject) {
}
@IBAction func connect(AnyObject) {
if portHandle != nil {
ASSerial.restorePort(portHandle!.fileDescriptor)
portHandle!.closeFile()
portHandle = nil
} else {
portHandle = ASSerial.openPort(port, withSpeed: baudRate)
if portHandle != nil {
serialData = ""
logView.setString(serialData)
portHandle!.readabilityHandler = {(handle) in
let newData = handle.availableData
let newString = NSString(data: newData, encoding: NSASCIIStringEncoding)!
self.serialData += newString
dispatch_async(dispatch_get_main_queue(), { () -> Void in
self.logView.setString(self.serialData)
})
}
}
}
}
var connectButtonTitle : String {
get {
return (portHandle != nil) ? "Disconnect" : "Connect"
}
}
class func keyPathsForValuesAffectingConnectButtonTitle() -> NSSet {
return NSSet(object: "portHandle")
}
}