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