1
0
Michael Redig 2 жил өмнө
parent
commit
834bcbfd71

+ 9 - 0
README.md

@@ -39,3 +39,12 @@ try serialPort.writeData(Data([1,2,3,4]))
 ```swift
 ```swift
 .package(url: "https://github.com/mredig/SwiftSerial", .upToNextMinor("1.0.0")
 .package(url: "https://github.com/mredig/SwiftSerial", .upToNextMinor("1.0.0")
 ```
 ```
+
+### What's New?
+* Modernized and Swiftier syntax
+* TABS!
+	* Modular indentation style, allowing for anyone to read the code however it reads best to them
+* Broke separate symbols into their own files
+* Monitoring output and delivering via AsyncStream for reading instead of the old polling, or dare I say, omniscience, 
+method, where you need to know exactly how many bytes or lines to read.
+* Thread safety

+ 13 - 1
Sources/SerialPort.swift

@@ -11,11 +11,15 @@ public class SerialPort {
 	private var readBytesStream: AsyncStream<UInt8>?
 	private var readBytesStream: AsyncStream<UInt8>?
 	private var readLinesStream: AsyncStream<String>?
 	private var readLinesStream: AsyncStream<String>?
 
 
+	private let lock = NSLock()
+
 	public init(path: String) {
 	public init(path: String) {
 		self.path = path
 		self.path = path
 	}
 	}
 
 
 	public func openPort(portMode: PortMode = .receiveAndTransmit) throws {
 	public func openPort(portMode: PortMode = .receiveAndTransmit) throws {
+		lock.lock()
+		defer { lock.unlock() }
 		guard !path.isEmpty else { throw PortError.invalidPath }
 		guard !path.isEmpty else { throw PortError.invalidPath }
 		guard isOpen == false else { throw PortError.instanceAlreadyOpen }
 		guard isOpen == false else { throw PortError.instanceAlreadyOpen }
 
 
@@ -47,7 +51,9 @@ public class SerialPort {
 		else { return }
 		else { return }
 		let pollSource = DispatchSource.makeReadSource(fileDescriptor: fileDescriptor, queue: .global(qos: .default))
 		let pollSource = DispatchSource.makeReadSource(fileDescriptor: fileDescriptor, queue: .global(qos: .default))
 		let stream = AsyncStream<Data> { continuation in
 		let stream = AsyncStream<Data> { continuation in
-			pollSource.setEventHandler {
+			pollSource.setEventHandler { [lock] in
+				lock.lock()
+				defer { lock.unlock() }
 
 
 				let bufferSize = 1024
 				let bufferSize = 1024
 				let buffer = UnsafeMutableRawPointer
 				let buffer = UnsafeMutableRawPointer
@@ -79,6 +85,8 @@ public class SerialPort {
 		useSoftwareFlowControl: Bool = false,
 		useSoftwareFlowControl: Bool = false,
 		processOutput: Bool = false
 		processOutput: Bool = false
 	) throws {
 	) throws {
+		lock.lock()
+		defer { lock.unlock() }
 		guard let fileDescriptor = fileDescriptor else {
 		guard let fileDescriptor = fileDescriptor else {
 			throw PortError.mustBeOpen
 			throw PortError.mustBeOpen
 		}
 		}
@@ -168,6 +176,8 @@ public class SerialPort {
 	}
 	}
 
 
 	public func closePort() {
 	public func closePort() {
+		lock.lock()
+		defer { lock.unlock() }
 		pollSource?.cancel()
 		pollSource?.cancel()
 		pollSource = nil
 		pollSource = nil
 
 
@@ -259,6 +269,8 @@ extension SerialPort {
 // MARK: Transmitting
 // MARK: Transmitting
 extension SerialPort {
 extension SerialPort {
 	public func writeBytes(from buffer: UnsafeMutablePointer<UInt8>, size: Int) throws -> Int {
 	public func writeBytes(from buffer: UnsafeMutablePointer<UInt8>, size: Int) throws -> Int {
+		lock.lock()
+		defer { lock.unlock() }
 		guard let fileDescriptor = fileDescriptor else {
 		guard let fileDescriptor = fileDescriptor else {
 			throw PortError.mustBeOpen
 			throw PortError.mustBeOpen
 		}
 		}