示例#1
0
        private void HandlePinCountChanged(IDiffSpread <int> sender)
        {
            var count = Math.Max(1, CountIn[0]);

            ResizePinGroups(count, InputContainers, (i) => new InputAttribute(string.Format("Input {0}", i))
            {
                AutoValidate = false
            });
            ResizePinGroups(count, DefaultContainers, (i) => new InputAttribute(string.Format("Default {0}", i))
            {
                AutoValidate = false
            });
            ResizePinGroups(count, OutputContainers, (i) => new OutputAttribute(string.Format("Output {0}", i)));
            FBuffers.Resize(
                count,
                i => new Spread <T>(1),
                DisposeSpread
                );
        }
示例#2
0
 public void Evaluate(int spreadMax)
 {
     FCopyOperations.Resize(spreadMax, i => new CopyOperation(FromFilenameIn[i], ToFilenameIn[i]), DisposeAndLogExceptions);
     ProgressOut.SliceCount = spreadMax;
     for (int i = 0; i < spreadMax; i++)
     {
         var copyOperation = FCopyOperations[i];
         var from          = FromFilenameIn[i];
         var to            = ToFilenameIn[i];
         if (from != copyOperation.From || to != copyOperation.To || copyOperation.IsCompleted)
         {
             DisposeAndLogExceptions(copyOperation);
             copyOperation  = new CopyOperation(from, to);
             ProgressOut[i] = 0;
         }
         var doCopy = DoCopyIn[i];
         if (doCopy && !copyOperation.IsRunning)
         {
             copyOperation.Run(new Progress <float>(p => ProgressOut[i] = p));
         }
         FCopyOperations[i] = copyOperation;
     }
 }
示例#3
0
文件: Sync.cs 项目: vnmone/vvvv-sdk
        //called when data for any output pin is requested
        public void Evaluate(int SpreadMax)
        {
            var isClient = FIsLocalClient[0] || FHost.IsBoygroupClient;

            //set server and port
            if (FPort.IsChanged)
            {
                FServer.Resize(FPort.SliceCount, CreateServer, DeleteServer);

                for (int i = 0; i < FServer.SliceCount; i++)
                {
                    FServer[i].Port = isClient ? FPort[i] + 1 : FPort[i];
                }

                if (isClient) // store the time server
                {
                    FRemoteServer = new IPEndPoint(IPAddress.Parse(FIsLocalClient[0] ? FServerIP[0] : FHost.BoygroupServerIP), FPort[0]);
                }
            }

            //read stream time
            lock (FLock)
            {
                FStreamTime = FTime[0];
                FTimeStamp  = FHost.RealTime;
            }

            //do the evaluation for client or server
            if (isClient)
            {
                ClientEvaluate();
            }
            else
            {
                ServerEvaluate();
            }
        }
示例#4
0
        public void Evaluate(int spreadMax)
        {
            FEnumerators.Resize(
                spreadMax,
                slice =>
            {
                var keyboard = KeyboardIn[slice] ?? Keyboard.Empty;
                return(Subscribe(keyboard));
            },
                Unsubscribe
                );

            EventTypeOut.SliceCount = spreadMax;
            KeyCodeOut.SliceCount   = spreadMax;
            KeyCharOut.SliceCount   = spreadMax;

            for (int bin = 0; bin < spreadMax; bin++)
            {
                var keyboard = KeyboardIn[bin] ?? Keyboard.Empty;
                var tuple    = FEnumerators[bin];
                if (keyboard != tuple.Item1)
                {
                    Unsubscribe(tuple);
                    tuple = Subscribe(keyboard);
                }

                var enumerator    = tuple.Item2;
                var notifications = enumerator.MoveNext()
                    ? enumerator.Current
                    : FEmptyList;

                EventTypeOut[bin].SliceCount = notifications.Count;
                KeyCodeOut[bin].SliceCount   = notifications.Count;
                KeyCharOut[bin].SliceCount   = notifications.Count;

                for (int i = 0; i < notifications.Count; i++)
                {
                    var notification = notifications[i];
                    EventTypeOut[bin][i] = notification.Kind;
                    switch (notification.Kind)
                    {
                    case KeyNotificationKind.KeyDown:
                        var keyDown = notification as KeyDownNotification;
                        KeyCodeOut[bin][i] = (int)keyDown.KeyCode;
                        KeyCharOut[bin][i] = null;
                        break;

                    case KeyNotificationKind.KeyPress:
                        var keyPress = notification as KeyPressNotification;
                        KeyCodeOut[bin][i] = 0;
                        KeyCharOut[bin][i] = keyPress.KeyChar.ToString();
                        break;

                    case KeyNotificationKind.KeyUp:
                        var keyUp = notification as KeyUpNotification;
                        KeyCodeOut[bin][i] = (int)keyUp.KeyCode;
                        KeyCharOut[bin][i] = null;
                        break;

                    case KeyNotificationKind.DeviceLost:
                        KeyCodeOut[bin][i] = 0;
                        KeyCharOut[bin][i] = null;
                        break;

                    default:
                        throw new NotImplementedException();
                    }
                }

                FEnumerators[bin] = tuple;
            }
        }
示例#5
0
                #pragma warning restore 649, 169
        #endregion fields & pins

        //called when data for any output pin is requested
        public void Evaluate(int spreadMax)
        {
            FContent.SliceCount = spreadMax;
            FEOS.SliceCount     = spreadMax;

            path.ResizeAndDismiss(spreadMax, () => string.Empty);
            lineWise.ResizeAndDismiss(spreadMax, (i) => FLineWise[i]);
            streamReader.Resize(spreadMax, (i) => new StreamReader(FInput[i]), (t) => t.Dispose());

            for (int i = 0; i < spreadMax; i++)
            {
                //check if encoding has changed
                bool encodingChanged     = false;
                System.Text.Encoding enc = System.Text.Encoding.Default;
                if (FEncoding.IsChanged)
                {
                    if (FEncoding[i].Index > 0)
                    {
                        enc = Encoding.GetEncoding(FEncoding[i].Name);
                    }
                    encodingChanged = !(streamReader[i].CurrentEncoding != enc);
                }

                //initialize stream reader
                bool update  = false;
                bool isValid = true;
                if (path[i] != FInput[i] || encodingChanged || FRead[i])
                {
                    try
                    {
                        streamReader[i].Dispose();
                        streamReader[i] = new StreamReader(FInput[i], enc);
                        path[i]         = FInput[i];
                        update          = true;
                    }
                    catch
                    {
                        FContent[i] = string.Empty;
                        FEOS[i]     = true;
                        isValid     = false;
                    }
                }

                //do the reading part
                if ((lineWise[i] != FLineWise[i] || FIndex.IsChanged || FCount.IsChanged || update) && isValid)
                {
                    streamReader[i].DiscardBufferedData();
                    if (FLineWise[i])
                    {
                        streamReader[i].BaseStream.Seek(0, SeekOrigin.Begin);
                        int incr = 0;
                        FContent[i] = string.Empty;
                        while (incr < FIndex[i] + FCount[i] && !streamReader[i].EndOfStream)
                        {
                            string line = streamReader[i].ReadLine();
                            if (incr >= FIndex[i])
                            {
                                FContent[i] += line + Environment.NewLine;
                            }

                            incr++;
                        }
                        if (incr > 0)                        //remove last \r\n
                        {
                            FContent[i] = FContent[i].Substring(0, FContent[i].Length - Environment.NewLine.Length);
                        }
                    }
                    else
                    {
                        streamReader[i].BaseStream.Seek(FIndex[i], SeekOrigin.Begin);

                        char[] buffer = new char[Math.Max(FCount[i], 0)];
                        int    read   = streamReader[i].ReadBlock(buffer, 0, buffer.Length);
                        FContent[i] = new string(buffer);
                    }
                    FEOS[i] = streamReader[i].EndOfStream;
                }
            }
        }
示例#6
0
        public void Evaluate(int spreadMax)
        {
            FEnumerators.Resize(
                spreadMax,
                slice =>
            {
                var mouse = MouseIn[slice] ?? Mouse.Empty;
                return(Subscribe(mouse));
            },
                Unsubscribe
                );

            EventTypeOut.SliceCount       = spreadMax;
            PositionOut.SliceCount        = spreadMax;
            MouseWheelDeltaOut.SliceCount = spreadMax;
            ClickCountOut.SliceCount      = spreadMax;
            LeftButtonOut.SliceCount      = spreadMax;
            MiddleButtonOut.SliceCount    = spreadMax;
            RightButtonOut.SliceCount     = spreadMax;
            X1ButtonOut.SliceCount        = spreadMax;
            X2ButtonOut.SliceCount        = spreadMax;

            for (int bin = 0; bin < spreadMax; bin++)
            {
                var mouse = MouseIn[bin] ?? Mouse.Empty;
                var tuple = FEnumerators[bin];
                if (mouse != tuple.Item1)
                {
                    Unsubscribe(tuple);
                    tuple = Subscribe(mouse);
                }

                var enumerator    = tuple.Item2;
                var notifications = enumerator.MoveNext()
                    ? enumerator.Current
                    : FEmptyList;

                EventTypeOut[bin].SliceCount       = notifications.Count;
                PositionOut[bin].SliceCount        = notifications.Count;
                MouseWheelDeltaOut[bin].SliceCount = notifications.Count;
                ClickCountOut[bin].SliceCount      = notifications.Count;
                LeftButtonOut[bin].SliceCount      = notifications.Count;
                MiddleButtonOut[bin].SliceCount    = notifications.Count;
                RightButtonOut[bin].SliceCount     = notifications.Count;
                X1ButtonOut[bin].SliceCount        = notifications.Count;
                X2ButtonOut[bin].SliceCount        = notifications.Count;

                for (int i = 0; i < notifications.Count; i++)
                {
                    var n = notifications[i];
                    EventTypeOut[bin][i] = n.Kind;
                    PositionOut[bin][i]  = n.Position.FromMousePoint(n.ClientArea);
                    switch (n.Kind)
                    {
                    case MouseNotificationKind.MouseDown:
                    case MouseNotificationKind.MouseUp:
                        var mouseButton = n as MouseButtonNotification;
                        MouseWheelDeltaOut[bin][i] = 0;
                        ClickCountOut[bin][i]      = 0;
                        LeftButtonOut[bin][i]      = (mouseButton.Buttons & MouseButtons.Left) > 0;
                        MiddleButtonOut[bin][i]    = (mouseButton.Buttons & MouseButtons.Middle) > 0;
                        RightButtonOut[bin][i]     = (mouseButton.Buttons & MouseButtons.Right) > 0;
                        X1ButtonOut[bin][i]        = (mouseButton.Buttons & MouseButtons.XButton1) > 0;
                        X2ButtonOut[bin][i]        = (mouseButton.Buttons & MouseButtons.XButton2) > 0;
                        break;

                    case MouseNotificationKind.MouseMove:
                        MouseWheelDeltaOut[bin][i] = 0;
                        ClickCountOut[bin][i]      = 0;
                        LeftButtonOut[bin][i]      = false;
                        MiddleButtonOut[bin][i]    = false;
                        RightButtonOut[bin][i]     = false;
                        X1ButtonOut[bin][i]        = false;
                        X2ButtonOut[bin][i]        = false;
                        break;

                    case MouseNotificationKind.MouseWheel:
                        var mouseWheel = n as MouseWheelNotification;
                        MouseWheelDeltaOut[bin][i] = mouseWheel.WheelDelta;
                        ClickCountOut[bin][i]      = 0;
                        LeftButtonOut[bin][i]      = false;
                        MiddleButtonOut[bin][i]    = false;
                        RightButtonOut[bin][i]     = false;
                        X1ButtonOut[bin][i]        = false;
                        X2ButtonOut[bin][i]        = false;
                        break;

                    case MouseNotificationKind.MouseClick:
                        var mouseClick = n as MouseClickNotification;
                        MouseWheelDeltaOut[bin][i] = 0;
                        ClickCountOut[bin][i]      = mouseClick.ClickCount;
                        LeftButtonOut[bin][i]      = (mouseClick.Buttons & MouseButtons.Left) > 0;
                        MiddleButtonOut[bin][i]    = (mouseClick.Buttons & MouseButtons.Middle) > 0;
                        RightButtonOut[bin][i]     = (mouseClick.Buttons & MouseButtons.Right) > 0;
                        X1ButtonOut[bin][i]        = (mouseClick.Buttons & MouseButtons.XButton1) > 0;
                        X2ButtonOut[bin][i]        = (mouseClick.Buttons & MouseButtons.XButton2) > 0;
                        break;

                    default:
                        throw new NotImplementedException();
                    }
                }

                FEnumerators[bin] = tuple;
            }
        }
示例#7
0
        public void Evaluate(int spreadMax)
        {
            DcdStateOut.SliceCount   = spreadMax;
            CtsStateOut.SliceCount   = spreadMax;
            DsrStateOut.SliceCount   = spreadMax;
            RiStateOut.SliceCount    = spreadMax;
            BreakStateOut.SliceCount = spreadMax;

            if (UpdatePortListIn.IsChanged && UpdatePortListIn[0])
            {
                GlobalEnumManager.UpdatePortList();
            }

            FPorts.Resize(spreadMax, CreatePort, DestroyPort);
            DataOut.ResizeAndDispose(spreadMax, () => new MemoryStream());

            for (int i = 0; i < spreadMax; i++)
            {
                var port = FPorts[i];
                // Get the in and output streams
                var dataIn  = DataIn[i];
                var dataOut = DataOut[i];
                // Set stream positions back to the beginning
                dataIn.Seek(0, SeekOrigin.Begin);
                dataOut.Seek(0, SeekOrigin.Begin);

                try
                {
                    if (EnabledIn[i])
                    {
                        // Try to configure the port
                        TryConfigurePort(port, i);

                        // Open the port
                        if (!port.IsOpen)
                        {
                            port.Open();
                            SetStates(i);
                        }

                        // Can only be set if port is open
                        try
                        {
                            TrySetBreakState(port, BreakStateIn[i]);
                        }
                        catch (Exception e)
                        {
                            FLogger.Log(e);
                        }

                        // Write data to the port
                        var totalBytesToWrite = dataIn.Length;
                        if (totalBytesToWrite > 0 && DoSendIn[i])
                        {
                            var buffer = new byte[1024];
                            while (totalBytesToWrite > 0)
                            {
                                var bytesToWrite = (int)Math.Min(buffer.Length, totalBytesToWrite);
                                var bytesRead    = dataIn.Read(buffer, 0, bytesToWrite);
                                port.Write(buffer, 0, bytesRead);
                                totalBytesToWrite -= bytesRead;
                            }
                        }

                        // Read data from the port
                        var totalBytesToRead = port.BytesToRead;
                        if (totalBytesToRead > 0)
                        {
                            dataOut.SetLength(totalBytesToRead);
                            var buffer = new byte[1024];
                            while (totalBytesToRead > 0)
                            {
                                var bytesToRead = Math.Min(buffer.Length, totalBytesToRead);
                                var bytesRead   = port.Read(buffer, 0, bytesToRead);
                                dataOut.Write(buffer, 0, bytesRead);
                                totalBytesToRead -= bytesRead;
                            }
                            // Marks the pin as changed
                            DataOut[i] = dataOut;
                            // Set the OnData flag
                            OnDataOut[i] = true;
                        }
                        else
                        {
                            // Clear output
                            if (dataOut.Length > 0)
                            {
                                dataOut.SetLength(0);
                                // Marks the pin as changed
                                DataOut[i] = dataOut;
                                // Reset the OnData flag
                                OnDataOut[i] = false;
                            }
                        }
                    }
                    else
                    {
                        // Close the port
                        if (port.IsOpen)
                        {
                            port.Close();
                            UnsetStates(i);
                        }
                        // Clear output
                        if (dataOut.Length > 0)
                        {
                            dataOut.SetLength(0);
                            // Marks the pin as changed
                            DataOut[i] = dataOut;
                            // Reset the OnData flag
                            OnDataOut[i] = false;
                        }
                    }

                    // Read connection state
                    ConnectedOut[i] = port.IsOpen;
                }
                catch (IOException e)
                {
                    // Reset outputs
                    DataOut[i].SetLength(0);
                    UnsetStates(i);
                    ConnectedOut[i] = false;
                    // Log the exception
                    FLogger.Log(e);
                }
            }
        }
示例#8
0
        public void Evaluate(int spreadMax)
        {
            FEnumerators.Resize(
                spreadMax,
                slice =>
            {
                var mouse = MouseIn[slice] ?? Mouse.Empty;
                return(Subscribe(mouse));
            },
                Unsubscribe
                );

            EventTypeOut.SliceCount       = spreadMax;
            PositionOut.SliceCount        = spreadMax;
            MouseWheelDeltaOut.SliceCount = spreadMax;
            LeftButtonOut.SliceCount      = spreadMax;
            MiddleButtonOut.SliceCount    = spreadMax;
            RightButtonOut.SliceCount     = spreadMax;
            X1ButtonOut.SliceCount        = spreadMax;
            X2ButtonOut.SliceCount        = spreadMax;

            for (int bin = 0; bin < spreadMax; bin++)
            {
                var mouse = MouseIn[bin] ?? Mouse.Empty;
                var tuple = FEnumerators[bin];
                if (mouse != tuple.Item1)
                {
                    Unsubscribe(tuple);
                    tuple = Subscribe(mouse);
                }

                var enumerator    = tuple.Item2;
                var notifications = enumerator.MoveNext()
                    ? enumerator.Current
                    : FEmptyList;

                EventTypeOut[bin].SliceCount       = notifications.Count;
                PositionOut[bin].SliceCount        = notifications.Count;
                MouseWheelDeltaOut[bin].SliceCount = notifications.Count;
                LeftButtonOut[bin].SliceCount      = notifications.Count;
                MiddleButtonOut[bin].SliceCount    = notifications.Count;
                RightButtonOut[bin].SliceCount     = notifications.Count;
                X1ButtonOut[bin].SliceCount        = notifications.Count;
                X2ButtonOut[bin].SliceCount        = notifications.Count;

                for (int i = 0; i < notifications.Count; i++)
                {
                    var n = notifications[i];
                    EventTypeOut[bin][i] = n.Kind;
                    var position   = new Vector2D(n.Position.X, n.Position.Y);
                    var clientArea = new Vector2D(n.ClientArea.Width - 1, n.ClientArea.Height - 1);
                    PositionOut[bin][i] = VMath.Map(position, Vector2D.Zero, clientArea, new Vector2D(-1, 1), new Vector2D(1, -1), TMapMode.Float);
                    switch (n.Kind)
                    {
                    case MouseNotificationKind.MouseDown:
                    case MouseNotificationKind.MouseUp:
                        var mouseButton = n as MouseButtonNotification;
                        MouseWheelDeltaOut[bin][i] = 0;
                        LeftButtonOut[bin][i]      = (mouseButton.Buttons & MouseButtons.Left) > 0;
                        MiddleButtonOut[bin][i]    = (mouseButton.Buttons & MouseButtons.Middle) > 0;
                        RightButtonOut[bin][i]     = (mouseButton.Buttons & MouseButtons.Right) > 0;
                        X1ButtonOut[bin][i]        = (mouseButton.Buttons & MouseButtons.XButton1) > 0;
                        X2ButtonOut[bin][i]        = (mouseButton.Buttons & MouseButtons.XButton2) > 0;
                        break;

                    case MouseNotificationKind.MouseMove:
                        MouseWheelDeltaOut[bin][i] = 0;
                        LeftButtonOut[bin][i]      = false;
                        MiddleButtonOut[bin][i]    = false;
                        RightButtonOut[bin][i]     = false;
                        X1ButtonOut[bin][i]        = false;
                        X2ButtonOut[bin][i]        = false;
                        break;

                    case MouseNotificationKind.MouseWheel:
                        var mouseWheel = n as MouseWheelNotification;
                        MouseWheelDeltaOut[bin][i] = mouseWheel.WheelDelta;
                        LeftButtonOut[bin][i]      = false;
                        MiddleButtonOut[bin][i]    = false;
                        RightButtonOut[bin][i]     = false;
                        X1ButtonOut[bin][i]        = false;
                        X2ButtonOut[bin][i]        = false;
                        break;

                    default:
                        throw new NotImplementedException();
                    }
                }

                FEnumerators[bin] = tuple;
            }
        }
示例#9
0
        public void Evaluate(int spreadMax)
        {
            DcdStateOut.SliceCount   = spreadMax;
            CtsStateOut.SliceCount   = spreadMax;
            DsrStateOut.SliceCount   = spreadMax;
            RiStateOut.SliceCount    = spreadMax;
            BreakStateOut.SliceCount = spreadMax;

            if (UpdatePortListIn.IsChanged && UpdatePortListIn[0])
            {
                UpdatePortList();
            }

            FPorts.Resize(spreadMax, CreatePort, DestroyPort);
            DataOut.ResizeAndDispose(spreadMax, () => new MemoryStream());

            for (int i = 0; i < spreadMax; i++)
            {
                var port = FPorts[i];
                // Configure the port
                var portName = ComPortIn[i].Name;
                if (port.PortName != portName)
                {
                    port.PortName = portName;
                }
                if (port.BaudRate != BaudRateIn[i])
                {
                    port.BaudRate = BaudRateIn[i];
                }
                if (port.DataBits != DataBitsIn[i])
                {
                    port.DataBits = DataBitsIn[i];
                }
                if (port.StopBits != StopBitsIn[i])
                {
                    port.StopBits = StopBitsIn[i];
                }
                if (port.Parity != ParityIn[i])
                {
                    port.Parity = ParityIn[i];
                }
                if (port.Handshake != HandshakeIn[i])
                {
                    port.Handshake = HandshakeIn[i];
                }
                if (port.DtrEnable != DtrEnableIn[i])
                {
                    port.DtrEnable = DtrEnableIn[i];
                }
                if (port.RtsEnable != RtsEnableIn[i])
                {
                    port.RtsEnable = RtsEnableIn[i];
                }

                // Get the in and output streams
                var dataIn  = DataIn[i];
                var dataOut = DataOut[i];
                // Set stream positions back to the beginning
                dataIn.Seek(0, SeekOrigin.Begin);
                dataOut.Seek(0, SeekOrigin.Begin);

                if (EnabledIn[i])
                {
                    // Open the port
                    if (!port.IsOpen)
                    {
                        port.Open();
                        SetStates(i);
                    }
                    // Set the break state
                    port.BreakState = BreakStateIn[i];

                    // Write data to the port
                    var totalBytesToWrite = dataIn.Length;
                    if (totalBytesToWrite > 0 && DoSendIn[i])
                    {
                        var buffer = new byte[1024];
                        while (totalBytesToWrite > 0)
                        {
                            var bytesToWrite = (int)Math.Min(buffer.Length, totalBytesToWrite);
                            var bytesRead    = dataIn.Read(buffer, 0, bytesToWrite);
                            port.Write(buffer, 0, bytesRead);
                            totalBytesToWrite -= bytesRead;
                        }
                    }

                    // Read data from the port
                    var totalBytesToRead = port.BytesToRead;
                    if (totalBytesToRead > 0)
                    {
                        dataOut.SetLength(totalBytesToRead);
                        var buffer = new byte[1024];
                        while (totalBytesToRead > 0)
                        {
                            var bytesToRead = Math.Min(buffer.Length, totalBytesToRead);
                            var bytesRead   = port.Read(buffer, 0, bytesToRead);
                            dataOut.Write(buffer, 0, bytesRead);
                            totalBytesToRead -= bytesRead;
                        }
                        // Marks the pin as changed
                        DataOut[i] = dataOut;
                        // Set the OnData flag
                        OnDataOut[i] = true;
                    }
                    else
                    {
                        // Clear output
                        if (dataOut.Length > 0)
                        {
                            dataOut.SetLength(0);
                            // Marks the pin as changed
                            DataOut[i] = dataOut;
                            // Reset the OnData flag
                            OnDataOut[i] = false;
                        }
                    }
                }
                else
                {
                    // Close the port
                    if (port.IsOpen)
                    {
                        port.Close();
                        UnsetStates(i);
                    }
                    // Clear output
                    if (dataOut.Length > 0)
                    {
                        dataOut.SetLength(0);
                        // Marks the pin as changed
                        DataOut[i] = dataOut;
                        // Reset the OnData flag
                        OnDataOut[i] = false;
                    }
                }

                // Read connection state
                ConnectedOut[i] = port.IsOpen;
            }
        }