public override IObservable <TSource> Process <TSource>(IObservable <TSource> source) { var newLine = ObservableSerialPort.Unescape(NewLine); return(Observable.Using( () => SerialPortManager.ReserveConnection(PortName), connection => source.Do(value => { lock (connection.SerialPort) { connection.SerialPort.Write(value.ToString()); connection.SerialPort.Write(newLine); } }))); }
public static IObservable <string> ReadLine(string portName, string newLine) { return(Observable.Create <string>(observer => { var data = string.Empty; var connection = SerialPortManager.ReserveConnection(portName); SerialDataReceivedEventHandler dataReceivedHandler; var serialPort = connection.SerialPort; dataReceivedHandler = (sender, e) => { switch (e.EventType) { case SerialData.Eof: observer.OnCompleted(); break; case SerialData.Chars: default: if (serialPort.IsOpen && serialPort.BytesToRead > 0) { data += serialPort.ReadExisting(); var lines = data.Split(new[] { newLine }, StringSplitOptions.None); for (int i = 0; i < lines.Length; i++) { if (i == lines.Length - 1) { data = lines[i]; } else { observer.OnNext(lines[i]); } } } break; } }; connection.SerialPort.DataReceived += dataReceivedHandler; return Disposable.Create(() => { connection.SerialPort.DataReceived -= dataReceivedHandler; connection.Dispose(); }); })); }
public override IObservable <SerialPort> Generate() { return(Observable.Using( () => SerialPortManager.ReserveConnection(Name, configuration), connection => Observable.Return(connection.SerialPort).Concat(Observable.Never(connection.SerialPort)))); }