diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs
index 71d0c51cf..40a1ab2e8 100644
--- a/.git-blame-ignore-revs
+++ b/.git-blame-ignore-revs
@@ -5,8 +5,4 @@ e6f499ad9c78eff87c57ded6ea620fccb255d691
e12cd15478ef4dd7cc2a391ae74d877f33acee97
# Ensure unix portability of uri launcher
-a949f77d92437690840a24857f421c0f47161d43
-
-# Move arduino package into separate repository
-1804cdb10530babc3146f9c07bc7d23a877a93f5
-1a60ab3cd625cb89e29531895efdd96936c2c271
\ No newline at end of file
+a949f77d92437690840a24857f421c0f47161d43
\ No newline at end of file
diff --git a/Bonsai.Arduino/AnalogInput.cs b/Bonsai.Arduino/AnalogInput.cs
deleted file mode 100644
index ff770492d..000000000
--- a/Bonsai.Arduino/AnalogInput.cs
+++ /dev/null
@@ -1,39 +0,0 @@
-using System;
-using System.ComponentModel;
-
-namespace Bonsai.Arduino
-{
- ///
- /// Represents an operator that generates a sequence of digitized analog readings
- /// from the specified Arduino input pin.
- ///
- [DefaultProperty(nameof(Pin))]
- [Description("Generates a sequence of digitized analog readings from the specified Arduino input pin.")]
- public class AnalogInput : Source
- {
- ///
- /// Gets or sets the name of the serial port used to communicate with the Arduino.
- ///
- [TypeConverter(typeof(PortNameConverter))]
- [Description("The name of the serial port used to communicate with the Arduino.")]
- public string PortName { get; set; }
-
- ///
- /// Gets or sets the analog input pin number from which to take readings.
- ///
- [Description("The analog input pin number from which to take readings.")]
- public int Pin { get; set; }
-
- ///
- /// Generates an observable sequence of digitized analog values.
- ///
- ///
- /// A sequence of values that report the digitized analog
- /// readings from the specified Arduino analog input pin.
- ///
- public override IObservable Generate()
- {
- return ObservableArduino.AnalogInput(PortName, Pin);
- }
- }
-}
diff --git a/Bonsai.Arduino/AnalogInputReceivedEventArgs.cs b/Bonsai.Arduino/AnalogInputReceivedEventArgs.cs
deleted file mode 100644
index 85ddcc1c3..000000000
--- a/Bonsai.Arduino/AnalogInputReceivedEventArgs.cs
+++ /dev/null
@@ -1,32 +0,0 @@
-using System;
-
-namespace Bonsai.Arduino
-{
- ///
- /// Provides data for the event.
- ///
- public class AnalogInputReceivedEventArgs : EventArgs
- {
- ///
- /// Initializes a new instance of the
- /// class using the pin number and analog value received in the analog input message.
- ///
- /// The pin number from which the analog value was sampled.
- /// The digitized analog value.
- public AnalogInputReceivedEventArgs(int pin, int value)
- {
- Pin = pin;
- Value = value;
- }
-
- ///
- /// Gets the pin number from which the analog value was sampled.
- ///
- public int Pin { get; private set; }
-
- ///
- /// Gets the digitized analog value.
- ///
- public int Value { get; private set; }
- }
-}
diff --git a/Bonsai.Arduino/AnalogOutput.cs b/Bonsai.Arduino/AnalogOutput.cs
deleted file mode 100644
index 9245d8fb5..000000000
--- a/Bonsai.Arduino/AnalogOutput.cs
+++ /dev/null
@@ -1,61 +0,0 @@
-using System;
-using System.ComponentModel;
-using System.Reactive.Linq;
-using System.Threading.Tasks;
-
-namespace Bonsai.Arduino
-{
- ///
- /// Represents an operator that writes the sequence of numerical values to the
- /// specified Arduino output pin using PWM.
- ///
- [DefaultProperty(nameof(Pin))]
- [Description("Writes the sequence of numerical values to the specified Arduino output pin using PWM.")]
- public class AnalogOutput : Sink
- {
- ///
- /// Gets or sets the name of the serial port used to communicate with the Arduino.
- ///
- [TypeConverter(typeof(PortNameConverter))]
- [Description("The name of the serial port used to communicate with the Arduino.")]
- public string PortName { get; set; }
-
- ///
- /// Gets or sets the digital output (PWM) pin number on which to write values.
- ///
- [Description("The digital output (PWM) pin number on which to write values.")]
- public int Pin { get; set; }
-
- ///
- /// Writes a sequence of values to the specified Arduino output pin using PWM.
- ///
- ///
- /// A sequence of values to write into the specified Arduino output pin.
- ///
- ///
- /// A sequence of the values which have been written into the Arduino
- /// output pin.
- ///
- ///
- /// This operator only subscribes to the sequence after initializing
- /// the connection to the Arduino and configuring the output pin mode to PWM.
- ///
- public override IObservable Process(IObservable source)
- {
- return Observable.Using(
- cancellationToken => ArduinoManager.ReserveConnectionAsync(PortName),
- (connection, cancellationToken) =>
- {
- var pin = Pin;
- connection.Arduino.PinMode(pin, PinMode.Pwm);
- return Task.FromResult(source.Do(value =>
- {
- lock (connection.Arduino)
- {
- connection.Arduino.AnalogWrite(pin, value);
- }
- }));
- });
- }
- }
-}
diff --git a/Bonsai.Arduino/Arduino.cs b/Bonsai.Arduino/Arduino.cs
deleted file mode 100644
index 28f75d27d..000000000
--- a/Bonsai.Arduino/Arduino.cs
+++ /dev/null
@@ -1,640 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.IO.Ports;
-using System.Threading;
-using System.Threading.Tasks;
-
-namespace Bonsai.Arduino
-{
- ///
- /// Represents an Arduino board communicating with the host computer using
- /// the Firmata protocol.
- ///
- public sealed class Arduino : IDisposable
- {
- #region Constants
-
- ///
- /// Represents the default serial baud rate used to communicate with the Arduino.
- ///
- public const int DefaultBaudRate = 57600;
-
- ///
- /// Represents the default sampling interval for analog pins.
- ///
- public const int DefaultSamplingInterval = 19;
-
- const int MaxDataBytes = 32;
- const int ConnectionDelay = 2000;
-
- const byte DIGITAL_MESSAGE = 0x90; // send data for a digital port
- const byte ANALOG_MESSAGE = 0xE0; // send data for an analog pin (or PWM)
- const byte REPORT_ANALOG = 0xC0; // enable analog input by pin #
- const byte REPORT_DIGITAL = 0xD0; // enable digital input by port
- const byte SET_PIN_MODE = 0xF4; // set a pin to INPUT/OUTPUT/PWM/etc
- const byte REPORT_VERSION = 0xF9; // report firmware version
- const byte SYSTEM_RESET = 0xFF; // reset from MIDI
- const byte START_SYSEX = 0xF0; // start a MIDI SysEx message
- const byte END_SYSEX = 0xF7; // end a MIDI SysEx message
-
- const byte I2C_REQUEST = 0x76; // send an I2C request message
- const byte I2C_REPLY = 0x77; // receive an I2C reply message
- const byte I2C_CONFIG = 0x78; // set an I2C config message
- const byte SAMPLING_INTERVAL = 0x7A; // set the sampling interval
-
- #endregion
-
- bool disposed;
- bool parsingSysex;
- int dataToReceive;
- int multiByteCommand;
- int multiByteChannel;
- int sysexBytesRead;
- readonly Dictionary pinModes;
- readonly SerialPort serialPort;
- readonly byte[] responseBuffer;
- readonly byte[] commandBuffer;
- readonly byte[] sysexBuffer;
- readonly byte[] readBuffer;
- int[] reportAnalog;
- int[] reportDigital;
- int[] analogInput;
- byte[] digitalInput;
- byte[] digitalOutput;
-
- ///
- /// Initializes a new instance of the class using the
- /// specified port name.
- ///
- /// The port to use (for example, COM1).
- public Arduino(string portName)
- : this(portName, DefaultBaudRate)
- {
- }
-
- ///
- /// Initializes a new instance of the class using the
- /// specified port name and baud rate.
- ///
- /// The port to use (for example, COM1).
- /// The serial baud rate.
- public Arduino(string portName, int baudRate)
- {
- serialPort = new SerialPort(portName);
- serialPort.DtrEnable = true;
- serialPort.BaudRate = baudRate;
- serialPort.Parity = Parity.None;
- serialPort.StopBits = StopBits.One;
-
- pinModes = new Dictionary();
- responseBuffer = new byte[2];
- commandBuffer = new byte[MaxDataBytes];
- sysexBuffer = new byte[MaxDataBytes];
- readBuffer = new byte[serialPort.ReadBufferSize];
- }
-
- ///
- /// Occurs when the object receives a new analog input event.
- ///
- public event EventHandler AnalogInputReceived;
-
- ///
- /// Occurs when the object receives a new digital input event.
- ///
- public event EventHandler DigitalInputReceived;
-
- ///
- /// Occurs when the object receives a new MIDI SysEx message.
- ///
- public event EventHandler SysexReceived;
-
- ///
- /// Gets the major version of the Firmata firmware reported by the board on initialization.
- ///
- public int MajorVersion { get; private set; }
-
- ///
- /// Gets the minor version of the Firmata firmware reported by the board on initialization.
- ///
- public int MinorVersion { get; private set; }
-
- ///
- /// Gets a value indicating the open or closed status of the object.
- ///
- public bool IsOpen
- {
- get { return serialPort.IsOpen; }
- }
-
- void OnAnalogInputReceived(AnalogInputReceivedEventArgs e)
- {
- AnalogInputReceived?.Invoke(this, e);
- }
-
- void OnDigitalInputReceived(DigitalInputReceivedEventArgs e)
- {
- DigitalInputReceived?.Invoke(this, e);
- }
-
- void OnSysexReceived(SysexReceivedEventArgs e)
- {
- SysexReceived?.Invoke(this, e);
- }
-
- Task RunAsync(CancellationToken cancellationToken)
- {
- serialPort.Open();
- Thread.Sleep(ConnectionDelay);
- serialPort.ReadExisting();
- return Task.Factory.StartNew(() =>
- {
- using var cancellation = cancellationToken.Register(serialPort.Dispose);
- while (!cancellationToken.IsCancellationRequested)
- {
- try
- {
- var bytesToRead = serialPort.BytesToRead;
- if (bytesToRead == 0)
- {
- var nextByte = serialPort.ReadByte();
- if (nextByte < 0) break;
- ProcessInput((byte)nextByte);
- }
- else
- {
- while (bytesToRead > 0)
- {
- var bytesRead = serialPort.Read(readBuffer, 0, Math.Min(bytesToRead, readBuffer.Length));
- for (int i = 0; i < bytesRead; i++)
- {
- ProcessInput(readBuffer[i]);
- }
- bytesToRead -= bytesRead;
- }
- }
- }
- catch (Exception)
- {
- if (!cancellationToken.IsCancellationRequested)
- {
- throw;
- }
- break;
- }
- }
- },
- cancellationToken,
- TaskCreationOptions.LongRunning,
- TaskScheduler.Default);
- }
-
- ///
- /// Opens a new serial port connection to the Arduino board.
- ///
- ///
- /// A which can be used to cancel the operation.
- ///
- public void Open(CancellationToken cancellationToken = default)
- {
- RunAsync(cancellationToken);
- }
-
- void ReportInput(ref int[] reportInput, byte command, int index, bool state)
- {
- EnsureCapacity(ref reportInput, index);
- if (!state && reportInput[index] > 0) reportInput[index]--;
-
- if (reportInput[index] == 0)
- {
- commandBuffer[0] = (byte)(command | index);
- commandBuffer[1] = (byte)(state ? 1 : 0);
- serialPort.Write(commandBuffer, 0, 2);
- }
-
- if (state) reportInput[index]++;
- }
-
- ///
- /// Enables or disables reporting of analog pin values for
- /// the specified pin number.
- ///
- /// The number of the pin to configure.
- ///
- /// if analog reporting for the pin should be enabled;
- /// otherwise.
- ///
- public void ReportAnalog(int pin, bool state)
- {
- ReportInput(ref reportAnalog, REPORT_ANALOG, pin, state);
- }
-
- ///
- /// Enables or disables reporting of digital pin changes for
- /// the specified digital port in the Arduino.
- ///
- /// The digital port to configure.
- ///
- /// if reporting of digital pin changes on the
- /// specified port should be enabled; otherwise.
- ///
- public void ReportDigital(int port, bool state)
- {
- ReportInput(ref reportDigital, REPORT_DIGITAL, port, state);
- }
-
- ///
- /// Sets the mode of an individual Arduino pin.
- ///
- /// The number of the pin to configure.
- /// The pin mode.
- public void PinMode(int pin, PinMode mode)
- {
- if (!pinModes.TryGetValue(pin, out PinMode previousMode) || previousMode != mode)
- {
- commandBuffer[0] = SET_PIN_MODE;
- commandBuffer[1] = (byte)pin;
- commandBuffer[2] = (byte)mode;
- serialPort.Write(commandBuffer, 0, 3);
- pinModes[pin] = mode;
- }
- }
-
- ///
- /// Reads the current state of the specified digital input pin.
- ///
- /// The number of the digital pin to read.
- ///
- /// if the pin is HIGH; if the pin is LOW.
- ///
- public bool DigitalRead(int pin)
- {
- var port = GetPortNumber(pin);
- EnsureCapacity(ref digitalInput, port);
- return ((digitalInput[port] >> (pin & 0x07)) & 0x01) != 0;
- }
-
- ///
- /// Sets the state of the specified digital output pin.
- ///
- /// The number of the digital pin to write.
- ///
- /// to set the pin HIGH; to set the pin LOW.
- ///
- public void DigitalWrite(int pin, bool value)
- {
- var port = GetPortNumber(pin);
- EnsureCapacity(ref digitalOutput, port);
- if (value) digitalOutput[port] |= (byte)(1 << (pin & 0x07));
- else digitalOutput[port] &= (byte)~(1 << (pin & 0x07));
- WritePort(port, digitalOutput[port]);
- }
-
- ///
- /// Reads the current state of all the digital pins in the specified port.
- ///
- /// The number of the digital port (i.e. collection of 8 pins) to read.
- ///
- /// A value where each bit represents the state of one pin in the digital port.
- ///
- public byte DigitalPortRead(int port)
- {
- EnsureCapacity(ref digitalInput, port);
- return digitalInput[port];
- }
-
- ///
- /// Sets the state of all the digital output pins in the specified
- /// port simultaneously.
- ///
- /// The number of the digital port (i.e. collection of 8 pins) to write.
- ///
- /// A value where each bit will be used to set the state of one pin in the digital port.
- ///
- public void DigitalPortWrite(int port, byte value)
- {
- EnsureCapacity(ref digitalOutput, port);
- digitalOutput[port] = value;
- WritePort(port, digitalOutput[port]);
- }
-
- void WritePort(int port, byte value)
- {
- commandBuffer[0] = (byte)(DIGITAL_MESSAGE | port);
- commandBuffer[1] = (byte)(value & 0x7F);
- commandBuffer[2] = (byte)(value >> 7);
- serialPort.Write(commandBuffer, 0, 3);
- }
-
- ///
- /// Returns the current value of the specified analog pin.
- ///
- /// The number of the analog pin to read.
- /// A value representing a digitized analog measurement.
- public int AnalogRead(int pin)
- {
- EnsureCapacity(ref analogInput, pin);
- return analogInput[pin];
- }
-
- ///
- /// Writes an analog value as a PWM wave to the specified digital output pin.
- ///
- /// The number of the digital pin to write.
- /// A value used to update the PWM signal.
- public void AnalogWrite(int pin, int value)
- {
- commandBuffer[0] = (byte)(ANALOG_MESSAGE | (pin & 0x0F));
- commandBuffer[1] = (byte)(value & 0x7F);
- commandBuffer[2] = (byte)(value >> 7);
- serialPort.Write(commandBuffer, 0, 3);
- }
-
- ///
- /// Sets the sampling rate for reporting analog and I2C data in the main firmware loop.
- ///
- ///
- /// The sampling interval, in milliseconds, between analog and I2C measurements.
- ///
- public void SamplingInterval(int milliseconds)
- {
- commandBuffer[0] = START_SYSEX;
- commandBuffer[1] = SAMPLING_INTERVAL;
- commandBuffer[2] = (byte)(milliseconds & 0x7F);
- commandBuffer[3] = (byte)(milliseconds >> 7);
- commandBuffer[4] = END_SYSEX;
- serialPort.Write(commandBuffer, 0, 5);
- }
-
- ///
- /// Sends the specified MIDI SysEx command using the specified arguments.
- ///
- /// A value indicating the SysEx command ID.
- /// The optional extended payload sent to configure the SysEx command.
- public void SendSysex(byte command, params byte[] args)
- {
- commandBuffer[0] = START_SYSEX;
- commandBuffer[1] = command;
- Array.Copy(args, 0, commandBuffer, 2, args.Length);
- commandBuffer[args.Length + 2] = END_SYSEX;
- serialPort.Write(commandBuffer, 0, args.Length + 3);
- }
-
- ///
- /// Configures I2C settings such as delay time and power pins.
- ///
- ///
- /// The I2C configuration arguments. The first two bytes are used
- /// to configure the optional delay time, in microseconds, between
- /// writing to the I2C register, and reading the data from the device.
- ///
- public void I2CConfig(params byte[] args)
- {
- SendSysex(I2C_CONFIG, args);
- }
-
- ///
- /// Writes a data payload to the I2C device with the specified address.
- ///
- /// The address of the slave device in the I2C bus.
- /// The data payload to write to the device.
- public void I2CWrite(int address, params byte[] data)
- {
- I2CRequest(address, I2CRequestMode.Write, data);
- }
-
- ///
- /// Sends a request to the I2C device with the specified address.
- ///
- /// The address of the slave device in the I2C bus.
- /// The read/write mode of the request.
- /// The data payload for the I2C request.
- public void I2CRequest(int address, I2CRequestMode mode, params byte[] data)
- {
- const byte ExtendedAddressBit = 0x1 << 5;
- var extendedMode = address > 127 ? ExtendedAddressBit : 0;
- commandBuffer[0] = START_SYSEX;
- commandBuffer[1] = I2C_REQUEST;
- commandBuffer[2] = (byte)(address & 0x7F);
- commandBuffer[3] = (byte)((address >> 7) & 0x7 | (byte)mode << 3 | extendedMode);
- Array.Copy(data, 0, commandBuffer, 4, data.Length);
- commandBuffer[data.Length + 4] = END_SYSEX;
- serialPort.Write(commandBuffer, 0, data.Length + 5);
- }
-
- static void EnsureCapacity(ref TElement[] array, int index)
- {
- if (array == null || index >= array.Length)
- {
- Array.Resize(ref array, index + 1);
- }
- }
-
- ///
- /// Gets the digital port number for the specified pin.
- ///
- /// The pin number for which to retrieve the digital port.
- /// A identifier for the digital port containing the specified pin.
- public static int GetPortNumber(int pin)
- {
- return (pin >> 3) & 0x0F;
- }
-
- void SetDigitalInput(int port, byte data)
- {
- EnsureCapacity(ref digitalInput, port);
- digitalInput[port] = data;
- OnDigitalInputReceived(new DigitalInputReceivedEventArgs(port, data));
- }
-
- void SetAnalogInput(int pin, int value)
- {
- EnsureCapacity(ref analogInput, pin);
- analogInput[pin] = value;
- OnAnalogInputReceived(new AnalogInputReceivedEventArgs(pin, value));
- }
-
- void SetVersion(int majorVersion, int minorVersion)
- {
- MajorVersion = majorVersion;
- MinorVersion = minorVersion;
- }
-
- void ProcessInput(byte inputData)
- {
- if (parsingSysex)
- {
- if (inputData == END_SYSEX)
- {
- parsingSysex = false;
- var feature = sysexBuffer[0];
- var args = new byte[sysexBytesRead - 1];
- Array.Copy(sysexBuffer, 1, args, 0, args.Length);
- OnSysexReceived(new SysexReceivedEventArgs(feature, args));
- }
- else if (sysexBytesRead < sysexBuffer.Length)
- {
- sysexBuffer[sysexBytesRead++] = inputData;
- }
- else parsingSysex = false;
- }
- else if (dataToReceive > 0 && inputData < 128)
- {
- dataToReceive--;
- responseBuffer[dataToReceive] = inputData;
-
- if (multiByteCommand != 0 && dataToReceive == 0)
- {
- switch (multiByteCommand)
- {
- case DIGITAL_MESSAGE: SetDigitalInput(multiByteChannel, (byte)((responseBuffer[0] << 7) + responseBuffer[1])); break;
- case ANALOG_MESSAGE: SetAnalogInput(multiByteChannel, (responseBuffer[0] << 7) + responseBuffer[1]); break;
- case REPORT_VERSION: SetVersion(responseBuffer[1], responseBuffer[0]); break;
- }
- }
- }
- else
- {
- int command;
- if (inputData < 0xF0)
- {
- command = inputData & 0xF0;
- multiByteChannel = inputData & 0x0F;
- }
- else command = inputData;
-
- switch (command)
- {
- case DIGITAL_MESSAGE:
- case ANALOG_MESSAGE:
- case REPORT_VERSION:
- dataToReceive = 2;
- multiByteCommand = command;
- break;
- case START_SYSEX:
- parsingSysex = true;
- sysexBytesRead = 0;
- break;
- }
- }
- }
-
- ///
- /// Closes the port connection, sets the
- /// property to and disposes of the
- /// internal object.
- ///
- public void Close()
- {
- Dispose(true);
- }
-
- private void Dispose(bool disposing)
- {
- if (!disposed)
- {
- if (disposing)
- {
- serialPort.Close();
- disposed = true;
- }
- }
- }
-
- void IDisposable.Dispose()
- {
- Close();
- }
- }
-
- ///
- /// Specifies the mode of an individual Arduino pin.
- ///
- public enum PinMode : byte
- {
- ///
- /// The digital pin is configured as INPUT.
- ///
- Input = 0x00,
-
- ///
- /// The digital pin is configured as OUTPUT.
- ///
- Output = 0x01,
-
- ///
- /// The analog pin is configured in analog input mode.
- ///
- Analog = 0x02,
-
- ///
- /// The digital pin is configured in PWM output mode.
- ///
- Pwm = 0x03,
-
- ///
- /// The digital pin is configured in Servo output mode.
- ///
- Servo = 0x04,
-
- ///
- /// The pin is configured as a data pin in shiftOut/shiftIn mode.
- ///
- Shift = 0x05,
-
- ///
- /// The pin is configured to access I2C devices.
- ///
- I2C = 0x06,
-
- ///
- /// The pin is configured as a 1-wire bus master.
- ///
- OneWire = 0x07,
-
- ///
- /// The pin is configured for stepper motor control.
- ///
- Stepper = 0x08,
-
- ///
- /// The pin is configured for a rotary encoder.
- ///
- Encoder = 0x09,
-
- ///
- /// The pin is configured for serial communication.
- ///
- Serial = 0x0A,
-
- ///
- /// The digital pin is configured as INPUT_PULLUP.
- ///
- InputPullUp = 0x0B
- }
-
- ///
- /// Specifies the read/write mode for I2C requests.
- ///
- public enum I2CRequestMode : byte
- {
- ///
- /// A request to write data to the device.
- ///
- Write = 0x0,
-
- ///
- /// A request to read one data sample from the device.
- ///
- ReadOnce = 0x1,
-
- ///
- /// A request to read and report data continuously from the device.
- ///
- ReadContinuously = 0x2,
-
- ///
- /// A request to stop reading data from the device.
- ///
- StopReading = 0x3
- }
-}
diff --git a/Bonsai.Arduino/ArduinoConfiguration.cs b/Bonsai.Arduino/ArduinoConfiguration.cs
deleted file mode 100644
index bb015b7e7..000000000
--- a/Bonsai.Arduino/ArduinoConfiguration.cs
+++ /dev/null
@@ -1,42 +0,0 @@
-using System.ComponentModel;
-using Bonsai.IO.Ports;
-
-namespace Bonsai.Arduino
-{
- ///
- /// Represents configuration settings used to initialize a Firmata serial connection.
- ///
- public class ArduinoConfiguration
- {
- internal static readonly ArduinoConfiguration Default = new ArduinoConfiguration();
-
- ///
- /// Initializes a new instance of the class.
- ///
- public ArduinoConfiguration()
- {
- BaudRate = Arduino.DefaultBaudRate;
- SamplingInterval = Arduino.DefaultSamplingInterval;
- }
-
- ///
- /// Gets or sets the name of the serial port.
- ///
- [TypeConverter(typeof(SerialPortNameConverter))]
- [Description("The name of the serial port.")]
- public string PortName { get; set; }
-
- ///
- /// Gets or sets the serial baud rate.
- ///
- [TypeConverter(typeof(BaudRateConverter))]
- [Description("The serial baud rate.")]
- public int BaudRate { get; set; }
-
- ///
- /// Gets or sets the sampling interval, in milliseconds, between analog and I2C measurements.
- ///
- [Description("The sampling interval, in milliseconds, between analog and I2C measurements.")]
- public int SamplingInterval { get; set; }
- }
-}
diff --git a/Bonsai.Arduino/ArduinoConfigurationCollection.cs b/Bonsai.Arduino/ArduinoConfigurationCollection.cs
deleted file mode 100644
index 7c3e51c1f..000000000
--- a/Bonsai.Arduino/ArduinoConfigurationCollection.cs
+++ /dev/null
@@ -1,20 +0,0 @@
-using System;
-using System.Collections.ObjectModel;
-using System.Xml.Serialization;
-
-namespace Bonsai.Arduino
-{
- ///
- /// Represents a collection of Firmata configuration settings, indexed by port name.
- ///
- [Obsolete]
- [XmlRoot("ArduinoConfigurationSettings")]
- public class ArduinoConfigurationCollection : KeyedCollection
- {
- ///
- protected override string GetKeyForItem(ArduinoConfiguration item)
- {
- return item.PortName;
- }
- }
-}
diff --git a/Bonsai.Arduino/ArduinoDisposable.cs b/Bonsai.Arduino/ArduinoDisposable.cs
deleted file mode 100644
index e636d8450..000000000
--- a/Bonsai.Arduino/ArduinoDisposable.cs
+++ /dev/null
@@ -1,36 +0,0 @@
-using System;
-using System.Threading;
-using System.Reactive.Disposables;
-
-namespace Bonsai.Arduino
-{
- internal sealed class ArduinoDisposable : ICancelable, IDisposable
- {
- IDisposable resource;
-
- public ArduinoDisposable(Arduino arduino, IDisposable disposable)
- {
- Arduino = arduino ?? throw new ArgumentNullException(nameof(arduino));
- resource = disposable ?? throw new ArgumentNullException(nameof(disposable));
- }
-
- public Arduino Arduino { get; private set; }
-
- public bool IsDisposed
- {
- get { return resource == null; }
- }
-
- public void Dispose()
- {
- var disposable = Interlocked.Exchange(ref resource, null);
- if (disposable != null)
- {
- lock (ArduinoManager.SyncRoot)
- {
- disposable.Dispose();
- }
- }
- }
- }
-}
diff --git a/Bonsai.Arduino/ArduinoManager.cs b/Bonsai.Arduino/ArduinoManager.cs
deleted file mode 100644
index f2cfec576..000000000
--- a/Bonsai.Arduino/ArduinoManager.cs
+++ /dev/null
@@ -1,87 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Xml.Serialization;
-using System.Xml;
-using System.IO;
-using System.Reactive.Disposables;
-using System.Threading.Tasks;
-using System.Threading;
-
-namespace Bonsai.Arduino
-{
- internal static class ArduinoManager
- {
- public const string DefaultConfigurationFile = "Arduino.config";
- static readonly Dictionary> openConnections = new();
- internal static readonly object SyncRoot = new();
-
- public static ArduinoDisposable ReserveConnection(string portName)
- {
- return ReserveConnection(portName, ArduinoConfiguration.Default);
- }
-
- public static async Task ReserveConnectionAsync(string portName)
- {
- return await Task.Run(() => ReserveConnection(portName, ArduinoConfiguration.Default));
- }
-
- internal static ArduinoDisposable ReserveConnection(string portName, ArduinoConfiguration arduinoConfiguration)
- {
- Tuple connection = default;
- lock (SyncRoot)
- {
- if (string.IsNullOrEmpty(portName))
- {
- if (!string.IsNullOrEmpty(arduinoConfiguration.PortName)) portName = arduinoConfiguration.PortName;
- else if (openConnections.Count == 1) connection = openConnections.Values.Single();
- else throw new ArgumentException("An alias or serial port name must be specified.", nameof(portName));
- }
-
- if (connection == null && !openConnections.TryGetValue(portName, out connection))
- {
- var serialPortName = arduinoConfiguration.PortName;
- if (string.IsNullOrEmpty(serialPortName)) serialPortName = portName;
-
-#pragma warning disable CS0612 // Type or member is obsolete
- var configuration = LoadConfiguration();
- if (configuration.Contains(serialPortName))
- {
- arduinoConfiguration = configuration[serialPortName];
- }
-#pragma warning restore CS0612 // Type or member is obsolete
-
- var cancellation = new CancellationTokenSource();
- var arduino = new Arduino(serialPortName, arduinoConfiguration.BaudRate);
- arduino.Open(cancellation.Token);
- arduino.SamplingInterval(arduinoConfiguration.SamplingInterval);
- var dispose = Disposable.Create(() =>
- {
- cancellation.Cancel();
- openConnections.Remove(portName);
- });
-
- var refCount = new RefCountDisposable(dispose);
- connection = Tuple.Create(arduino, refCount);
- openConnections.Add(portName, connection);
- return new ArduinoDisposable(arduino, refCount);
- }
-
- return new ArduinoDisposable(connection.Item1, connection.Item2.GetDisposable());
- }
- }
-
- [Obsolete]
- public static ArduinoConfigurationCollection LoadConfiguration()
- {
- if (!File.Exists(DefaultConfigurationFile))
- {
- return new ArduinoConfigurationCollection();
- }
-
- var serializer = new XmlSerializer(typeof(ArduinoConfigurationCollection));
- using var reader = XmlReader.Create(DefaultConfigurationFile);
- return (ArduinoConfigurationCollection)serializer.Deserialize(reader);
- }
- }
-}
diff --git a/Bonsai.Arduino/Bonsai.Arduino.csproj b/Bonsai.Arduino/Bonsai.Arduino.csproj
deleted file mode 100644
index 604480af6..000000000
--- a/Bonsai.Arduino/Bonsai.Arduino.csproj
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
- Bonsai - Arduino Library
- Bonsai Library containing reactive infrastructure to probe and control the state of Arduino microcontrollers.
- Bonsai Rx Arduino
- net462;netstandard2.0
- 2.8.0
-
-
-
-
-
\ No newline at end of file
diff --git a/Bonsai.Arduino/CreateArduino.cs b/Bonsai.Arduino/CreateArduino.cs
deleted file mode 100644
index 20c0949d9..000000000
--- a/Bonsai.Arduino/CreateArduino.cs
+++ /dev/null
@@ -1,75 +0,0 @@
-using System;
-using System.ComponentModel;
-using System.Linq;
-using System.Reactive.Linq;
-using Bonsai.IO.Ports;
-
-namespace Bonsai.Arduino
-{
- ///
- /// Represents an operator that creates a connection to an Arduino board
- /// using the Firmata protocol.
- ///
- [DefaultProperty(nameof(Name))]
- [Description("Creates a connection to an Arduino board using the Firmata protocol.")]
- public class CreateArduino : Source, INamedElement
- {
- readonly ArduinoConfiguration configuration = new ArduinoConfiguration();
-
- ///
- /// Gets or sets the optional alias for the Arduino board.
- ///
- [Description("The optional alias for the Arduino board.")]
- public string Name { get; set; }
-
- ///
- /// Gets or sets the name of the serial port used to communicate with the Arduino.
- ///
- [TypeConverter(typeof(SerialPortNameConverter))]
- [Description("The name of the serial port used to communicate with the Arduino.")]
- public string PortName
- {
- get { return configuration.PortName; }
- set { configuration.PortName = value; }
- }
-
- ///
- /// Gets or sets the serial baud rate.
- ///
- [TypeConverter(typeof(BaudRateConverter))]
- [Description("The serial baud rate.")]
- public int BaudRate
- {
- get { return configuration.BaudRate; }
- set { configuration.BaudRate = value; }
- }
-
- ///
- /// Gets or sets the sampling interval, in milliseconds, between analog and I2C measurements.
- ///
- [Description("The sampling interval, in milliseconds, between analog and I2C measurements.")]
- public int SamplingInterval
- {
- get { return configuration.SamplingInterval; }
- set { configuration.SamplingInterval = value; }
- }
-
- ///
- /// Generates an observable sequence that contains the Firmata connection object.
- ///
- ///
- /// A sequence containing a single instance of the class
- /// representing the Firmata connection.
- ///
- public override IObservable Generate()
- {
- return Observable.Using(
- () => ArduinoManager.ReserveConnection(Name, configuration),
- resource =>
- {
- return Observable.Return(resource.Arduino)
- .Concat(Observable.Never(resource.Arduino));
- });
- }
- }
-}
diff --git a/Bonsai.Arduino/DigitalInput.cs b/Bonsai.Arduino/DigitalInput.cs
deleted file mode 100644
index bfd637ca7..000000000
--- a/Bonsai.Arduino/DigitalInput.cs
+++ /dev/null
@@ -1,41 +0,0 @@
-using System;
-using System.ComponentModel;
-
-namespace Bonsai.Arduino
-{
- ///
- /// Represents an operator that generates a sequence of digital state
- /// transitions from the specified Arduino input pin.
- ///
- [DefaultProperty(nameof(Pin))]
- [Description("Generates a sequence of digital state transitions from the specified Arduino input pin.")]
- public class DigitalInput : Source
- {
- ///
- /// Gets or sets the name of the serial port used to communicate with the Arduino.
- ///
- [TypeConverter(typeof(PortNameConverter))]
- [Description("The name of the serial port used to communicate with the Arduino.")]
- public string PortName { get; set; }
-
- ///
- /// Gets or sets the digital input pin number from which to take readings.
- ///
- [Description("The digital input pin number from which to take readings.")]
- public int Pin { get; set; }
-
- ///
- /// Configures the digital pin as INPUT and generates an observable
- /// sequence of all its state transitions.
- ///
- ///
- /// A sequence of values that report the binary state
- /// transitions of the specified Arduino input pin:
- /// if the pin is now HIGH; if the pin is now LOW.
- ///
- public override IObservable Generate()
- {
- return ObservableArduino.DigitalInput(PortName, Pin);
- }
- }
-}
diff --git a/Bonsai.Arduino/DigitalInputReceivedEventArgs.cs b/Bonsai.Arduino/DigitalInputReceivedEventArgs.cs
deleted file mode 100644
index 225b47414..000000000
--- a/Bonsai.Arduino/DigitalInputReceivedEventArgs.cs
+++ /dev/null
@@ -1,39 +0,0 @@
-using System;
-
-namespace Bonsai.Arduino
-{
- ///
- /// Provides data for the event.
- ///
- public class DigitalInputReceivedEventArgs : EventArgs
- {
- ///
- /// Initializes a new instance of the
- /// class using the port number and port pin state received in the digital input message.
- ///
- ///
- /// The number identifying the digital port (i.e. collection of 8 pins) from which
- /// the state transition event originated.
- ///
- ///
- /// The state of all the digital input pins in the specified port at the time the
- /// transition occurred.
- ///
- public DigitalInputReceivedEventArgs(int port, byte state)
- {
- Port = port;
- State = state;
- }
-
- ///
- /// Gets the number identifying the digital port from which the event originated.
- ///
- public int Port { get; private set; }
-
- ///
- /// Gets the state of all the digital input pins in the specified port at the time
- /// the transition occurred.
- ///
- public byte State { get; private set; }
- }
-}
diff --git a/Bonsai.Arduino/DigitalOutput.cs b/Bonsai.Arduino/DigitalOutput.cs
deleted file mode 100644
index 14b9830dc..000000000
--- a/Bonsai.Arduino/DigitalOutput.cs
+++ /dev/null
@@ -1,64 +0,0 @@
-using System;
-using System.ComponentModel;
-using System.Reactive.Linq;
-using System.Threading.Tasks;
-
-namespace Bonsai.Arduino
-{
- ///
- /// Represents an operator that writes the sequence of digital state transitions
- /// to the specified Arduino output pin.
- ///
- [DefaultProperty(nameof(Pin))]
- [Description("Writes the sequence of digital state transitions to the specified Arduino output pin.")]
- public class DigitalOutput : Sink
- {
- ///
- /// Gets or sets the name of the serial port used to communicate with the Arduino.
- ///
- [TypeConverter(typeof(PortNameConverter))]
- [Description("The name of the serial port used to communicate with the Arduino.")]
- public string PortName { get; set; }
-
- ///
- /// Gets or sets the digital output pin number on which to write the state values.
- ///
- [Description("The digital output pin number on which to write the state values.")]
- public int Pin { get; set; }
-
- ///
- /// Writes a sequence of binary states to the specified Arduino digital output pin.
- ///
- ///
- /// A sequence of values used to update the state of the specified
- /// Arduino output pin. If a value in the sequence is , the pin
- /// will be set to HIGH; otherwise, the pin will be set to LOW.
- ///
- ///
- /// A sequence of the values which have been written into the Arduino
- /// output pin.
- ///
- ///
- /// This operator only subscribes to the sequence after
- /// initializing the connection to the Arduino and configuring the digital pin mode
- /// to OUTPUT.
- ///
- public override IObservable Process(IObservable source)
- {
- return Observable.Using(
- cancellationToken => ArduinoManager.ReserveConnectionAsync(PortName),
- (connection, cancellationToken) =>
- {
- var pin = Pin;
- connection.Arduino.PinMode(pin, PinMode.Output);
- return Task.FromResult(source.Do(value =>
- {
- lock (connection.Arduino)
- {
- connection.Arduino.DigitalWrite(pin, value);
- }
- }));
- });
- }
- }
-}
diff --git a/Bonsai.Arduino/InputPullUp.cs b/Bonsai.Arduino/InputPullUp.cs
deleted file mode 100644
index 0e720f543..000000000
--- a/Bonsai.Arduino/InputPullUp.cs
+++ /dev/null
@@ -1,41 +0,0 @@
-using System;
-using System.ComponentModel;
-
-namespace Bonsai.Arduino
-{
- ///
- /// Represents an operator that generates a sequence of digital state transitions
- /// from the specified Arduino input pin in pull-up mode.
- ///
- [DefaultProperty(nameof(Pin))]
- [Description("Generates a sequence of digital state transitions from the specified Arduino input pin in pull-up mode.")]
- public class InputPullUp : Source
- {
- ///
- /// Gets or sets the name of the serial port used to communicate with the Arduino.
- ///
- [TypeConverter(typeof(PortNameConverter))]
- [Description("The name of the serial port used to communicate with the Arduino.")]
- public string PortName { get; set; }
-
- ///
- /// Gets or sets the digital input pin number from which to take readings.
- ///
- [Description("The digital input pin number from which to take readings.")]
- public int Pin { get; set; }
-
- ///
- /// Configures the digital pin as INPUT_PULLUP and generates an observable
- /// sequence of all its state transitions.
- ///
- ///
- /// A sequence of values that report the binary state
- /// transitions of the specified Arduino input pin:
- /// if the pin is now HIGH; if the pin is now LOW.
- ///
- public override IObservable Generate()
- {
- return ObservableArduino.DigitalInput(PortName, Pin, PinMode.InputPullUp);
- }
- }
-}
diff --git a/Bonsai.Arduino/ObservableArduino.cs b/Bonsai.Arduino/ObservableArduino.cs
deleted file mode 100644
index 33301ac6b..000000000
--- a/Bonsai.Arduino/ObservableArduino.cs
+++ /dev/null
@@ -1,66 +0,0 @@
-using System;
-using System.Reactive.Linq;
-using System.Reactive.Disposables;
-
-namespace Bonsai.Arduino
-{
- static class ObservableArduino
- {
- public static IObservable AnalogInput(string portName, int pin)
- {
- return Observable.Create(async observer =>
- {
- var connection = await ArduinoManager.ReserveConnectionAsync(portName);
- EventHandler inputReceived;
- inputReceived = (sender, e) =>
- {
- if (e.Pin == pin)
- {
- observer.OnNext(e.Value);
- }
- };
-
- connection.Arduino.ReportAnalog(pin, true);
- connection.Arduino.AnalogInputReceived += inputReceived;
- return Disposable.Create(() =>
- {
- connection.Arduino.AnalogInputReceived -= inputReceived;
- connection.Arduino.ReportAnalog(pin, false);
- connection.Dispose();
- });
- });
- }
-
- public static IObservable DigitalInput(string portName, int pin)
- {
- return DigitalInput(portName, pin, PinMode.Input);
- }
-
- public static IObservable DigitalInput(string portName, int pin, PinMode pinMode)
- {
- return Observable.Create(async observer =>
- {
- var connection = await ArduinoManager.ReserveConnectionAsync(portName);
- connection.Arduino.PinMode(pin, pinMode);
- var port = Arduino.GetPortNumber(pin);
- EventHandler inputReceived;
- inputReceived = (sender, e) =>
- {
- if (e.Port == port)
- {
- observer.OnNext(connection.Arduino.DigitalRead(pin));
- }
- };
-
- connection.Arduino.ReportDigital(port, true);
- connection.Arduino.DigitalInputReceived += inputReceived;
- return Disposable.Create(() =>
- {
- connection.Arduino.DigitalInputReceived -= inputReceived;
- connection.Arduino.ReportDigital(port, false);
- connection.Dispose();
- });
- });
- }
- }
-}
diff --git a/Bonsai.Arduino/PortNameConverter.cs b/Bonsai.Arduino/PortNameConverter.cs
deleted file mode 100644
index 94bad4fa5..000000000
--- a/Bonsai.Arduino/PortNameConverter.cs
+++ /dev/null
@@ -1,39 +0,0 @@
-using Bonsai.Expressions;
-using System.ComponentModel;
-using System.IO.Ports;
-using System.Linq;
-
-namespace Bonsai.Arduino
-{
- class PortNameConverter : StringConverter
- {
- public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
- {
- return true;
- }
-
- public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
- {
- if (context != null)
- {
- var workflowBuilder = (WorkflowBuilder)context.GetService(typeof(WorkflowBuilder));
- if (workflowBuilder != null)
- {
- var portNames = (from builder in workflowBuilder.Workflow.Descendants()
- where builder is not DisableBuilder
- let createPort = ExpressionBuilder.GetWorkflowElement(builder) as CreateArduino
- where createPort != null && !string.IsNullOrEmpty(createPort.PortName)
- select !string.IsNullOrEmpty(createPort.Name) ? createPort.Name : createPort.PortName)
- .Distinct()
- .ToList();
- if (portNames.Count > 0)
- {
- return new StandardValuesCollection(portNames);
- }
- }
- }
-
- return new StandardValuesCollection(SerialPort.GetPortNames());
- }
- }
-}
diff --git a/Bonsai.Arduino/Properties/AssemblyInfo.cs b/Bonsai.Arduino/Properties/AssemblyInfo.cs
deleted file mode 100644
index 85c6f21fe..000000000
--- a/Bonsai.Arduino/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,7 +0,0 @@
-using Bonsai;
-
-// General Information about an assembly is controlled through the following
-// set of attributes. Change these attribute values to modify the information
-// associated with an assembly.
-[assembly: XmlNamespacePrefix("clr-namespace:Bonsai.Arduino", "ard")]
-[assembly: WorkflowNamespaceIcon("Bonsai:ElementIcon.Daq")]
diff --git a/Bonsai.Arduino/Properties/launchSettings.json b/Bonsai.Arduino/Properties/launchSettings.json
deleted file mode 100644
index ddd052fdd..000000000
--- a/Bonsai.Arduino/Properties/launchSettings.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "profiles": {
- "Bonsai": {
- "commandName": "Executable",
- "executablePath": "$(SolutionDir)Bonsai/bin/$(Configuration)/net472/Bonsai.exe",
- "commandLineArgs": "--lib:$(TargetDir)."
- }
- }
-}
\ No newline at end of file
diff --git a/Bonsai.Arduino/ReceiveSysex.cs b/Bonsai.Arduino/ReceiveSysex.cs
deleted file mode 100644
index 1d91c9748..000000000
--- a/Bonsai.Arduino/ReceiveSysex.cs
+++ /dev/null
@@ -1,60 +0,0 @@
-using System;
-using System.ComponentModel;
-using System.Reactive.Disposables;
-using System.Reactive.Linq;
-
-namespace Bonsai.Arduino
-{
- ///
- /// Represents an operator that generates a sequence of system exclusive messages
- /// received from the specified Arduino.
- ///
- [DefaultProperty(nameof(Feature))]
- [Description("Generates a sequence of system exclusive messages received from the specified Arduino.")]
- public class ReceiveSysex : Source
- {
- ///
- /// Gets or sets the name of the serial port used to communicate with the Arduino.
- ///
- [TypeConverter(typeof(PortNameConverter))]
- [Description("The name of the serial port used to communicate with the Arduino.")]
- public string PortName { get; set; }
-
- ///
- /// Gets or sets the feature ID used to identify the system exclusive message payload.
- ///
- [Description("The feature ID used to identify the system exclusive message payload.")]
- public int Feature { get; set; }
-
- ///
- /// Generates an observable sequence of all the system exclusive messages with the
- /// specified feature ID received from the Arduino.
- ///
- ///
- /// A sequence of arrays containing the payload data which was
- /// included with each system exclusive message received from the Arduino.
- ///
- public override IObservable Generate()
- {
- return Observable.Create(async observer =>
- {
- var connection = await ArduinoManager.ReserveConnectionAsync(PortName);
- EventHandler sysexReceived;
- sysexReceived = (sender, e) =>
- {
- if (e.Feature == Feature)
- {
- observer.OnNext(e.Args);
- }
- };
-
- connection.Arduino.SysexReceived += sysexReceived;
- return Disposable.Create(() =>
- {
- connection.Arduino.SysexReceived -= sysexReceived;
- connection.Dispose();
- });
- });
- }
- }
-}
diff --git a/Bonsai.Arduino/SendSysex.cs b/Bonsai.Arduino/SendSysex.cs
deleted file mode 100644
index 3aba5e27a..000000000
--- a/Bonsai.Arduino/SendSysex.cs
+++ /dev/null
@@ -1,57 +0,0 @@
-using System;
-using System.ComponentModel;
-using System.Reactive.Linq;
-using System.Threading.Tasks;
-
-namespace Bonsai.Arduino
-{
- ///
- /// Represents an operator that sends a sequence of system exclusive messages to the specified Arduino.
- ///
- [DefaultProperty(nameof(Feature))]
- [Description("Sends a sequence of system exclusive messages to the specified Arduino.")]
- public class SendSysex : Sink
- {
- ///
- /// Gets or sets the name of the serial port used to communicate with the Arduino.
- ///
- [TypeConverter(typeof(PortNameConverter))]
- [Description("The name of the serial port used to communicate with the Arduino.")]
- public string PortName { get; set; }
-
- ///
- /// Gets or sets the feature ID used to identify the system exclusive message payload.
- ///
- [Description("The feature ID used to identify the system exclusive message payload.")]
- public int Feature { get; set; }
-
- ///
- /// Writes a sequence of system exclusive messages to the specified Arduino.
- ///
- ///
- /// A sequence of arrays specifying the payload data to include in each
- /// of the system exclusive messages sent to the Arduino. The specified feature ID will
- /// be used to identify each message.
- ///
- ///
- /// A sequence of arrays containing the payload data which was
- /// included with each system exclusive message sent to the Arduino.
- ///
- ///
- /// This operator only subscribes to the sequence after
- /// initializing the connection to the Arduino.
- ///
- public override IObservable Process(IObservable source)
- {
- return Observable.Using(
- cancellationToken => ArduinoManager.ReserveConnectionAsync(PortName),
- (connection, cancellationToken) => Task.FromResult(source.Do(value =>
- {
- lock (connection.Arduino)
- {
- connection.Arduino.SendSysex((byte)Feature, value);
- }
- })));
- }
- }
-}
diff --git a/Bonsai.Arduino/ServoOutput.cs b/Bonsai.Arduino/ServoOutput.cs
deleted file mode 100644
index eecee8790..000000000
--- a/Bonsai.Arduino/ServoOutput.cs
+++ /dev/null
@@ -1,63 +0,0 @@
-using System;
-using System.ComponentModel;
-using System.Reactive.Linq;
-using System.Threading.Tasks;
-
-namespace Bonsai.Arduino
-{
- ///
- /// Represents an operator that writes a sequence of angular positions to control
- /// a servomotor connected to an Arduino output pin.
- ///
- [DefaultProperty(nameof(Pin))]
- [Description("Writes a sequence of angular positions to control a servomotor connected to an Arduino output pin.")]
- public class ServoOutput : Sink
- {
- ///
- /// Gets or sets the name of the serial port used to communicate with the Arduino.
- ///
- [TypeConverter(typeof(PortNameConverter))]
- [Description("The name of the serial port used to communicate with the Arduino.")]
- public string PortName { get; set; }
-
- ///
- /// Gets or sets the digital output pin number to which the servo is connected.
- ///
- [Description("The digital output pin number to which the servo is connected.")]
- public int Pin { get; set; }
-
- ///
- /// Writes a sequence of angular position values to control a servomotor connected to the
- /// specified Arduino output pin.
- ///
- ///
- /// A sequence of values specifying angular positions, in degrees from
- /// 0 to 180, used to control the servomotor connected to the specified Arduino output pin.
- ///
- ///
- /// A sequence of values containing the angular positions which have been
- /// used to control the servomotor connected to the specified Arduino output pin.
- ///
- ///
- /// This operator only subscribes to the sequence after initializing
- /// the connection to the Arduino and configuring the digital pin as a Servo output.
- ///
- public override IObservable Process(IObservable source)
- {
- return Observable.Using(
- cancellationToken => ArduinoManager.ReserveConnectionAsync(PortName),
- (connection, cancellationToken) =>
- {
- var pin = Pin;
- connection.Arduino.PinMode(pin, PinMode.Servo);
- return Task.FromResult(source.Do(value =>
- {
- lock (connection.Arduino)
- {
- connection.Arduino.AnalogWrite(pin, value);
- }
- }));
- });
- }
- }
-}
diff --git a/Bonsai.Arduino/SysexReceivedEventArgs.cs b/Bonsai.Arduino/SysexReceivedEventArgs.cs
deleted file mode 100644
index 0d7afe8b6..000000000
--- a/Bonsai.Arduino/SysexReceivedEventArgs.cs
+++ /dev/null
@@ -1,38 +0,0 @@
-using System;
-
-namespace Bonsai.Arduino
-{
- ///
- /// Provides data for the event.
- ///
- public class SysexReceivedEventArgs : EventArgs
- {
- ///
- /// Initializes a new instance of the
- /// class using the specified feature ID and optional data payload.
- ///
- ///
- /// The identifier of the system exclusive (SysEx) feature received in
- /// the message event.
- ///
- ///
- /// The data payload received together with the SysEx message.
- ///
- public SysexReceivedEventArgs(byte feature, byte[] args)
- {
- Feature = feature;
- Args = args;
- }
-
- ///
- /// Gets the identifier of the system exclusive (SysEx) feature received in
- /// the message event.
- ///
- public byte Feature { get; private set; }
-
- ///
- /// Gets the data payload received together with the SysEx message.
- ///
- public byte[] Args { get; private set; }
- }
-}
diff --git a/Bonsai.StarterPack/Bonsai.StarterPack.csproj b/Bonsai.StarterPack/Bonsai.StarterPack.csproj
index 1eda53d19..465f3e344 100644
--- a/Bonsai.StarterPack/Bonsai.StarterPack.csproj
+++ b/Bonsai.StarterPack/Bonsai.StarterPack.csproj
@@ -10,7 +10,7 @@
2.8.0
-
+
diff --git a/Bonsai.sln b/Bonsai.sln
index f351593a1..befac605c 100644
--- a/Bonsai.sln
+++ b/Bonsai.sln
@@ -2,69 +2,67 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.1.32319.34
MinimumVisualStudioVersion = 10.0.40219.1
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bonsai", "Bonsai\Bonsai.csproj", "{F44C66DD-913A-4DF0-B617-F8C458533C50}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bonsai", "Bonsai\Bonsai.csproj", "{F44C66DD-913A-4DF0-B617-F8C458533C50}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bonsai.Editor", "Bonsai.Editor\Bonsai.Editor.csproj", "{C7FDC11D-066A-4B2B-9A52-27A5E793BEFB}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bonsai.Editor", "Bonsai.Editor\Bonsai.Editor.csproj", "{C7FDC11D-066A-4B2B-9A52-27A5E793BEFB}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bonsai.Editor.Tests", "Bonsai.Editor.Tests\Bonsai.Editor.Tests.csproj", "{AA001CB8-FB7C-4D4A-8710-47363CA39016}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bonsai.Editor.Tests", "Bonsai.Editor.Tests\Bonsai.Editor.Tests.csproj", "{AA001CB8-FB7C-4D4A-8710-47363CA39016}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bonsai.Vision", "Bonsai.Vision\Bonsai.Vision.csproj", "{C226E461-6A82-49A7-9CAF-0CF872A1C91B}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bonsai.Vision", "Bonsai.Vision\Bonsai.Vision.csproj", "{C226E461-6A82-49A7-9CAF-0CF872A1C91B}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bonsai.Design", "Bonsai.Design\Bonsai.Design.csproj", "{765D928A-B147-46FF-8A59-BDE73F88A844}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bonsai.Design", "Bonsai.Design\Bonsai.Design.csproj", "{765D928A-B147-46FF-8A59-BDE73F88A844}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bonsai.Core", "Bonsai.Core\Bonsai.Core.csproj", "{E4D03BA3-54A2-4FF8-9DC6-52BA4CC14FED}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bonsai.Core", "Bonsai.Core\Bonsai.Core.csproj", "{E4D03BA3-54A2-4FF8-9DC6-52BA4CC14FED}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bonsai.Vision.Design", "Bonsai.Vision.Design\Bonsai.Vision.Design.csproj", "{0004026F-D014-451D-859F-93DCEC59B2A2}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bonsai.Vision.Design", "Bonsai.Vision.Design\Bonsai.Vision.Design.csproj", "{0004026F-D014-451D-859F-93DCEC59B2A2}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bonsai.System", "Bonsai.System\Bonsai.System.csproj", "{B783D74F-CB2D-4419-B438-266CD15774FB}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bonsai.System", "Bonsai.System\Bonsai.System.csproj", "{B783D74F-CB2D-4419-B438-266CD15774FB}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bonsai.Arduino", "Bonsai.Arduino\Bonsai.Arduino.csproj", "{CFED93E8-2AE9-471D-81D6-C89BB0356EF3}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bonsai.Scripting", "Bonsai.Scripting\Bonsai.Scripting.csproj", "{A341A5A1-45A6-4B35-9AB1-FE42C622F738}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bonsai.Scripting", "Bonsai.Scripting\Bonsai.Scripting.csproj", "{A341A5A1-45A6-4B35-9AB1-FE42C622F738}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bonsai.Scripting.Expressions", "Bonsai.Scripting.Expressions\Bonsai.Scripting.Expressions.csproj", "{6DAA7012-22BF-4E0B-A7DB-B7A8B2A95F0A}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bonsai.Scripting.Expressions", "Bonsai.Scripting.Expressions\Bonsai.Scripting.Expressions.csproj", "{6DAA7012-22BF-4E0B-A7DB-B7A8B2A95F0A}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bonsai.Scripting.Expressions.Design", "Bonsai.Scripting.Expressions.Design\Bonsai.Scripting.Expressions.Design.csproj", "{B9456E54-9249-4178-951A-166A6F54A206}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bonsai.Scripting.Expressions.Design", "Bonsai.Scripting.Expressions.Design\Bonsai.Scripting.Expressions.Design.csproj", "{B9456E54-9249-4178-951A-166A6F54A206}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bonsai.Scripting.IronPython", "Bonsai.Scripting.IronPython\Bonsai.Scripting.IronPython.csproj", "{D487E501-77E3-4A1C-943E-F4F2534E3BC8}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bonsai.Scripting.IronPython", "Bonsai.Scripting.IronPython\Bonsai.Scripting.IronPython.csproj", "{D487E501-77E3-4A1C-943E-F4F2534E3BC8}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bonsai.Scripting.IronPython.Design", "Bonsai.Scripting.IronPython.Design\Bonsai.Scripting.IronPython.Design.csproj", "{18A71178-6045-49A6-810B-1F5E50DD621F}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bonsai.Scripting.IronPython.Design", "Bonsai.Scripting.IronPython.Design\Bonsai.Scripting.IronPython.Design.csproj", "{18A71178-6045-49A6-810B-1F5E50DD621F}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bonsai.Player", "Bonsai.Player\Bonsai.Player.csproj", "{156452CC-3847-4706-AC65-4FA3BECA88EF}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bonsai.Player", "Bonsai.Player\Bonsai.Player.csproj", "{156452CC-3847-4706-AC65-4FA3BECA88EF}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bonsai.Audio", "Bonsai.Audio\Bonsai.Audio.csproj", "{BFAFD84F-6D1A-4D98-B91D-BBFCEA0FACF9}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bonsai.Audio", "Bonsai.Audio\Bonsai.Audio.csproj", "{BFAFD84F-6D1A-4D98-B91D-BBFCEA0FACF9}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bonsai.Dsp.Design", "Bonsai.Dsp.Design\Bonsai.Dsp.Design.csproj", "{6CD26D96-DAEB-4C46-AC34-1F673413C9E5}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bonsai.Dsp.Design", "Bonsai.Dsp.Design\Bonsai.Dsp.Design.csproj", "{6CD26D96-DAEB-4C46-AC34-1F673413C9E5}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bonsai.Dsp", "Bonsai.Dsp\Bonsai.Dsp.csproj", "{9C5BE065-0175-4C6F-A3A3-44F78CA7370E}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bonsai.Dsp", "Bonsai.Dsp\Bonsai.Dsp.csproj", "{9C5BE065-0175-4C6F-A3A3-44F78CA7370E}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bonsai.System.Design", "Bonsai.System.Design\Bonsai.System.Design.csproj", "{8005E3ED-424B-4CF8-94CF-9A4F6EED32B5}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bonsai.System.Design", "Bonsai.System.Design\Bonsai.System.Design.csproj", "{8005E3ED-424B-4CF8-94CF-9A4F6EED32B5}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bonsai.Design.Visualizers", "Bonsai.Design.Visualizers\Bonsai.Design.Visualizers.csproj", "{2DB4F295-AB4C-4642-BEB4-16E9D751B16A}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bonsai.Design.Visualizers", "Bonsai.Design.Visualizers\Bonsai.Design.Visualizers.csproj", "{2DB4F295-AB4C-4642-BEB4-16E9D751B16A}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bonsai.NuGet", "Bonsai.NuGet\Bonsai.NuGet.csproj", "{73701CE6-B60F-4137-B277-EADCCD5AD1C3}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bonsai.NuGet", "Bonsai.NuGet\Bonsai.NuGet.csproj", "{73701CE6-B60F-4137-B277-EADCCD5AD1C3}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bonsai.NuGet.Design", "Bonsai.NuGet.Design\Bonsai.NuGet.Design.csproj", "{577B477B-44C4-4A85-B96A-3401AADC838B}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bonsai.NuGet.Design", "Bonsai.NuGet.Design\Bonsai.NuGet.Design.csproj", "{577B477B-44C4-4A85-B96A-3401AADC838B}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bonsai.Configuration", "Bonsai.Configuration\Bonsai.Configuration.csproj", "{4FFCE61A-E4D7-4DDA-A276-4807E8F74635}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bonsai.Configuration", "Bonsai.Configuration\Bonsai.Configuration.csproj", "{4FFCE61A-E4D7-4DDA-A276-4807E8F74635}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bonsai32", "Bonsai32\Bonsai32.csproj", "{8794CB93-EB69-4B98-84F9-F50ABB350E14}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bonsai32", "Bonsai32\Bonsai32.csproj", "{8794CB93-EB69-4B98-84F9-F50ABB350E14}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bonsai.Windows.Input", "Bonsai.Windows.Input\Bonsai.Windows.Input.csproj", "{082F80A4-B096-45A3-ABB7-E8BFBF450CCD}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bonsai.Windows.Input", "Bonsai.Windows.Input\Bonsai.Windows.Input.csproj", "{082F80A4-B096-45A3-ABB7-E8BFBF450CCD}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bonsai.Osc", "Bonsai.Osc\Bonsai.Osc.csproj", "{BAA06D47-70E5-43BB-ABB9-A72F14196E92}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bonsai.Osc", "Bonsai.Osc\Bonsai.Osc.csproj", "{BAA06D47-70E5-43BB-ABB9-A72F14196E92}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bonsai.Core.Tests", "Bonsai.Core.Tests\Bonsai.Core.Tests.csproj", "{E1144727-1CFB-46A6-83B0-68592894D64C}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bonsai.Core.Tests", "Bonsai.Core.Tests\Bonsai.Core.Tests.csproj", "{E1144727-1CFB-46A6-83B0-68592894D64C}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bonsai.StarterPack", "Bonsai.StarterPack\Bonsai.StarterPack.csproj", "{B75681B2-B881-4179-9F2A-ACB89CE513EE}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bonsai.StarterPack", "Bonsai.StarterPack\Bonsai.StarterPack.csproj", "{B75681B2-B881-4179-9F2A-ACB89CE513EE}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bonsai.Shaders", "Bonsai.Shaders\Bonsai.Shaders.csproj", "{4D325C30-E014-4151-BC69-064D9B272641}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bonsai.Shaders", "Bonsai.Shaders\Bonsai.Shaders.csproj", "{4D325C30-E014-4151-BC69-064D9B272641}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bonsai.Shaders.Design", "Bonsai.Shaders.Design\Bonsai.Shaders.Design.csproj", "{851B4D3C-D8BA-433E-B4E8-CBA186F10C0C}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bonsai.Shaders.Design", "Bonsai.Shaders.Design\Bonsai.Shaders.Design.csproj", "{851B4D3C-D8BA-433E-B4E8-CBA186F10C0C}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bonsai.Shaders.Rendering", "Bonsai.Shaders.Rendering\Bonsai.Shaders.Rendering.csproj", "{EB2EC6F2-C34B-4C7B-A761-E12C853DABF9}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bonsai.Shaders.Rendering", "Bonsai.Shaders.Rendering\Bonsai.Shaders.Rendering.csproj", "{EB2EC6F2-C34B-4C7B-A761-E12C853DABF9}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bonsai.System.Tests", "Bonsai.System.Tests\Bonsai.System.Tests.csproj", "{FC54C35D-120F-49DC-9430-63447E550E39}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bonsai.System.Tests", "Bonsai.System.Tests\Bonsai.System.Tests.csproj", "{FC54C35D-120F-49DC-9430-63447E550E39}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{B4486E9B-95F2-482C-9190-59F76D2C859C}"
ProjectSection(SolutionItems) = preProject
@@ -166,16 +164,6 @@ Global
{B783D74F-CB2D-4419-B438-266CD15774FB}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{B783D74F-CB2D-4419-B438-266CD15774FB}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{B783D74F-CB2D-4419-B438-266CD15774FB}.Release|x64.ActiveCfg = Release|Any CPU
- {CFED93E8-2AE9-471D-81D6-C89BB0356EF3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {CFED93E8-2AE9-471D-81D6-C89BB0356EF3}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {CFED93E8-2AE9-471D-81D6-C89BB0356EF3}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
- {CFED93E8-2AE9-471D-81D6-C89BB0356EF3}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
- {CFED93E8-2AE9-471D-81D6-C89BB0356EF3}.Debug|x64.ActiveCfg = Debug|Any CPU
- {CFED93E8-2AE9-471D-81D6-C89BB0356EF3}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {CFED93E8-2AE9-471D-81D6-C89BB0356EF3}.Release|Any CPU.Build.0 = Release|Any CPU
- {CFED93E8-2AE9-471D-81D6-C89BB0356EF3}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
- {CFED93E8-2AE9-471D-81D6-C89BB0356EF3}.Release|Mixed Platforms.Build.0 = Release|Any CPU
- {CFED93E8-2AE9-471D-81D6-C89BB0356EF3}.Release|x64.ActiveCfg = Release|Any CPU
{A341A5A1-45A6-4B35-9AB1-FE42C622F738}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A341A5A1-45A6-4B35-9AB1-FE42C622F738}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A341A5A1-45A6-4B35-9AB1-FE42C622F738}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
@@ -186,6 +174,54 @@ Global
{A341A5A1-45A6-4B35-9AB1-FE42C622F738}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{A341A5A1-45A6-4B35-9AB1-FE42C622F738}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{A341A5A1-45A6-4B35-9AB1-FE42C622F738}.Release|x64.ActiveCfg = Release|Any CPU
+ {6DAA7012-22BF-4E0B-A7DB-B7A8B2A95F0A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {6DAA7012-22BF-4E0B-A7DB-B7A8B2A95F0A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {6DAA7012-22BF-4E0B-A7DB-B7A8B2A95F0A}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {6DAA7012-22BF-4E0B-A7DB-B7A8B2A95F0A}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {6DAA7012-22BF-4E0B-A7DB-B7A8B2A95F0A}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {6DAA7012-22BF-4E0B-A7DB-B7A8B2A95F0A}.Debug|x64.Build.0 = Debug|Any CPU
+ {6DAA7012-22BF-4E0B-A7DB-B7A8B2A95F0A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {6DAA7012-22BF-4E0B-A7DB-B7A8B2A95F0A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {6DAA7012-22BF-4E0B-A7DB-B7A8B2A95F0A}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {6DAA7012-22BF-4E0B-A7DB-B7A8B2A95F0A}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {6DAA7012-22BF-4E0B-A7DB-B7A8B2A95F0A}.Release|x64.ActiveCfg = Release|Any CPU
+ {6DAA7012-22BF-4E0B-A7DB-B7A8B2A95F0A}.Release|x64.Build.0 = Release|Any CPU
+ {B9456E54-9249-4178-951A-166A6F54A206}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {B9456E54-9249-4178-951A-166A6F54A206}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B9456E54-9249-4178-951A-166A6F54A206}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {B9456E54-9249-4178-951A-166A6F54A206}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {B9456E54-9249-4178-951A-166A6F54A206}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {B9456E54-9249-4178-951A-166A6F54A206}.Debug|x64.Build.0 = Debug|Any CPU
+ {B9456E54-9249-4178-951A-166A6F54A206}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {B9456E54-9249-4178-951A-166A6F54A206}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B9456E54-9249-4178-951A-166A6F54A206}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {B9456E54-9249-4178-951A-166A6F54A206}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {B9456E54-9249-4178-951A-166A6F54A206}.Release|x64.ActiveCfg = Release|Any CPU
+ {B9456E54-9249-4178-951A-166A6F54A206}.Release|x64.Build.0 = Release|Any CPU
+ {D487E501-77E3-4A1C-943E-F4F2534E3BC8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {D487E501-77E3-4A1C-943E-F4F2534E3BC8}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D487E501-77E3-4A1C-943E-F4F2534E3BC8}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {D487E501-77E3-4A1C-943E-F4F2534E3BC8}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {D487E501-77E3-4A1C-943E-F4F2534E3BC8}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {D487E501-77E3-4A1C-943E-F4F2534E3BC8}.Debug|x64.Build.0 = Debug|Any CPU
+ {D487E501-77E3-4A1C-943E-F4F2534E3BC8}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {D487E501-77E3-4A1C-943E-F4F2534E3BC8}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D487E501-77E3-4A1C-943E-F4F2534E3BC8}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {D487E501-77E3-4A1C-943E-F4F2534E3BC8}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {D487E501-77E3-4A1C-943E-F4F2534E3BC8}.Release|x64.ActiveCfg = Release|Any CPU
+ {D487E501-77E3-4A1C-943E-F4F2534E3BC8}.Release|x64.Build.0 = Release|Any CPU
+ {18A71178-6045-49A6-810B-1F5E50DD621F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {18A71178-6045-49A6-810B-1F5E50DD621F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {18A71178-6045-49A6-810B-1F5E50DD621F}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {18A71178-6045-49A6-810B-1F5E50DD621F}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {18A71178-6045-49A6-810B-1F5E50DD621F}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {18A71178-6045-49A6-810B-1F5E50DD621F}.Debug|x64.Build.0 = Debug|Any CPU
+ {18A71178-6045-49A6-810B-1F5E50DD621F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {18A71178-6045-49A6-810B-1F5E50DD621F}.Release|Any CPU.Build.0 = Release|Any CPU
+ {18A71178-6045-49A6-810B-1F5E50DD621F}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {18A71178-6045-49A6-810B-1F5E50DD621F}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {18A71178-6045-49A6-810B-1F5E50DD621F}.Release|x64.ActiveCfg = Release|Any CPU
+ {18A71178-6045-49A6-810B-1F5E50DD621F}.Release|x64.Build.0 = Release|Any CPU
{156452CC-3847-4706-AC65-4FA3BECA88EF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{156452CC-3847-4706-AC65-4FA3BECA88EF}.Debug|Any CPU.Build.0 = Debug|Any CPU
{156452CC-3847-4706-AC65-4FA3BECA88EF}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
@@ -348,64 +384,6 @@ Global
{851B4D3C-D8BA-433E-B4E8-CBA186F10C0C}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{851B4D3C-D8BA-433E-B4E8-CBA186F10C0C}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{851B4D3C-D8BA-433E-B4E8-CBA186F10C0C}.Release|x64.ActiveCfg = Release|Any CPU
- {FC54C35D-120F-49DC-9430-63447E550E39}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {FC54C35D-120F-49DC-9430-63447E550E39}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {FC54C35D-120F-49DC-9430-63447E550E39}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
- {FC54C35D-120F-49DC-9430-63447E550E39}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
- {FC54C35D-120F-49DC-9430-63447E550E39}.Debug|x64.ActiveCfg = Debug|Any CPU
- {FC54C35D-120F-49DC-9430-63447E550E39}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {FC54C35D-120F-49DC-9430-63447E550E39}.Release|Any CPU.Build.0 = Release|Any CPU
- {FC54C35D-120F-49DC-9430-63447E550E39}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
- {FC54C35D-120F-49DC-9430-63447E550E39}.Release|Mixed Platforms.Build.0 = Release|Any CPU
- {FC54C35D-120F-49DC-9430-63447E550E39}.Release|x64.ActiveCfg = Release|Any CPU
- {6DAA7012-22BF-4E0B-A7DB-B7A8B2A95F0A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {6DAA7012-22BF-4E0B-A7DB-B7A8B2A95F0A}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {6DAA7012-22BF-4E0B-A7DB-B7A8B2A95F0A}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
- {6DAA7012-22BF-4E0B-A7DB-B7A8B2A95F0A}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
- {6DAA7012-22BF-4E0B-A7DB-B7A8B2A95F0A}.Debug|x64.ActiveCfg = Debug|Any CPU
- {6DAA7012-22BF-4E0B-A7DB-B7A8B2A95F0A}.Debug|x64.Build.0 = Debug|Any CPU
- {6DAA7012-22BF-4E0B-A7DB-B7A8B2A95F0A}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {6DAA7012-22BF-4E0B-A7DB-B7A8B2A95F0A}.Release|Any CPU.Build.0 = Release|Any CPU
- {6DAA7012-22BF-4E0B-A7DB-B7A8B2A95F0A}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
- {6DAA7012-22BF-4E0B-A7DB-B7A8B2A95F0A}.Release|Mixed Platforms.Build.0 = Release|Any CPU
- {6DAA7012-22BF-4E0B-A7DB-B7A8B2A95F0A}.Release|x64.ActiveCfg = Release|Any CPU
- {6DAA7012-22BF-4E0B-A7DB-B7A8B2A95F0A}.Release|x64.Build.0 = Release|Any CPU
- {B9456E54-9249-4178-951A-166A6F54A206}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {B9456E54-9249-4178-951A-166A6F54A206}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {B9456E54-9249-4178-951A-166A6F54A206}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
- {B9456E54-9249-4178-951A-166A6F54A206}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
- {B9456E54-9249-4178-951A-166A6F54A206}.Debug|x64.ActiveCfg = Debug|Any CPU
- {B9456E54-9249-4178-951A-166A6F54A206}.Debug|x64.Build.0 = Debug|Any CPU
- {B9456E54-9249-4178-951A-166A6F54A206}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {B9456E54-9249-4178-951A-166A6F54A206}.Release|Any CPU.Build.0 = Release|Any CPU
- {B9456E54-9249-4178-951A-166A6F54A206}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
- {B9456E54-9249-4178-951A-166A6F54A206}.Release|Mixed Platforms.Build.0 = Release|Any CPU
- {B9456E54-9249-4178-951A-166A6F54A206}.Release|x64.ActiveCfg = Release|Any CPU
- {B9456E54-9249-4178-951A-166A6F54A206}.Release|x64.Build.0 = Release|Any CPU
- {D487E501-77E3-4A1C-943E-F4F2534E3BC8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {D487E501-77E3-4A1C-943E-F4F2534E3BC8}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {D487E501-77E3-4A1C-943E-F4F2534E3BC8}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
- {D487E501-77E3-4A1C-943E-F4F2534E3BC8}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
- {D487E501-77E3-4A1C-943E-F4F2534E3BC8}.Debug|x64.ActiveCfg = Debug|Any CPU
- {D487E501-77E3-4A1C-943E-F4F2534E3BC8}.Debug|x64.Build.0 = Debug|Any CPU
- {D487E501-77E3-4A1C-943E-F4F2534E3BC8}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {D487E501-77E3-4A1C-943E-F4F2534E3BC8}.Release|Any CPU.Build.0 = Release|Any CPU
- {D487E501-77E3-4A1C-943E-F4F2534E3BC8}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
- {D487E501-77E3-4A1C-943E-F4F2534E3BC8}.Release|Mixed Platforms.Build.0 = Release|Any CPU
- {D487E501-77E3-4A1C-943E-F4F2534E3BC8}.Release|x64.ActiveCfg = Release|Any CPU
- {D487E501-77E3-4A1C-943E-F4F2534E3BC8}.Release|x64.Build.0 = Release|Any CPU
- {18A71178-6045-49A6-810B-1F5E50DD621F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {18A71178-6045-49A6-810B-1F5E50DD621F}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {18A71178-6045-49A6-810B-1F5E50DD621F}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
- {18A71178-6045-49A6-810B-1F5E50DD621F}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
- {18A71178-6045-49A6-810B-1F5E50DD621F}.Debug|x64.ActiveCfg = Debug|Any CPU
- {18A71178-6045-49A6-810B-1F5E50DD621F}.Debug|x64.Build.0 = Debug|Any CPU
- {18A71178-6045-49A6-810B-1F5E50DD621F}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {18A71178-6045-49A6-810B-1F5E50DD621F}.Release|Any CPU.Build.0 = Release|Any CPU
- {18A71178-6045-49A6-810B-1F5E50DD621F}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
- {18A71178-6045-49A6-810B-1F5E50DD621F}.Release|Mixed Platforms.Build.0 = Release|Any CPU
- {18A71178-6045-49A6-810B-1F5E50DD621F}.Release|x64.ActiveCfg = Release|Any CPU
- {18A71178-6045-49A6-810B-1F5E50DD621F}.Release|x64.Build.0 = Release|Any CPU
{EB2EC6F2-C34B-4C7B-A761-E12C853DABF9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{EB2EC6F2-C34B-4C7B-A761-E12C853DABF9}.Debug|Any CPU.Build.0 = Debug|Any CPU
{EB2EC6F2-C34B-4C7B-A761-E12C853DABF9}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
@@ -418,6 +396,16 @@ Global
{EB2EC6F2-C34B-4C7B-A761-E12C853DABF9}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{EB2EC6F2-C34B-4C7B-A761-E12C853DABF9}.Release|x64.ActiveCfg = Release|Any CPU
{EB2EC6F2-C34B-4C7B-A761-E12C853DABF9}.Release|x64.Build.0 = Release|Any CPU
+ {FC54C35D-120F-49DC-9430-63447E550E39}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {FC54C35D-120F-49DC-9430-63447E550E39}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {FC54C35D-120F-49DC-9430-63447E550E39}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {FC54C35D-120F-49DC-9430-63447E550E39}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {FC54C35D-120F-49DC-9430-63447E550E39}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {FC54C35D-120F-49DC-9430-63447E550E39}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {FC54C35D-120F-49DC-9430-63447E550E39}.Release|Any CPU.Build.0 = Release|Any CPU
+ {FC54C35D-120F-49DC-9430-63447E550E39}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {FC54C35D-120F-49DC-9430-63447E550E39}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {FC54C35D-120F-49DC-9430-63447E550E39}.Release|x64.ActiveCfg = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE