Exemplo n.º 1
0
        private void ProcessOSCMessage(OSCMessage message)
        {
            if (message.Address == "/k/init")
            {
                FSaveTargets.Clear();

                FAutoIP     = IPAddress.Parse((string)message.Values[0]);
                FAutoPort   = (int)message.Values[1];
                FResolution = new Vector2D((int)message.Values[2], (int)message.Values[3]);

                InitNetwork();

                //get initial list of exposed ioboxes
                ReExposeIOBoxes();

                return;
            }
            else if (message.Address == "/k/save")
            {
                //save all savetargets to patch by sending a patchmessage
                //savetargets can be scattered over many patches so potentially this needs to send multiple patchmessages

                FPatchMessages.Clear();
                foreach (var target in FSaveTargets)
                {
                    var          patchClass = target.Key.Split('/');
                    PatchMessage pm;
                    if (FPatchMessages.ContainsKey(patchClass[0]))
                    {
                        pm = FPatchMessages[patchClass[0]];
                    }
                    else
                    {
                        pm = new PatchMessage(patchClass[0]);
                        pm.AddSaveMe();
                        FPatchMessages.Add(patchClass[0], pm);
                    }

                    var node = pm.AddNode(int.Parse(patchClass[1]));
                    var pin  = node.AddPin("Y Input Value");
                    pin.Spread = target.Value;
                }

                foreach (var pm in FPatchMessages)
                {
                    FHDEHost.SendXMLSnippet(pm.Key, pm.Value.ToString(), true);
                }
            }
            else if (message.Address == "/acceleration")
            {
                FAcceleration[0] = new Vector3D((float)message.Values[0], (float)message.Values[1], (float)message.Values[2]);
            }
            else if (message.Address == "/magnetism")
            {
                FMagnetism[0] = new Vector3D((float)message.Values[0], (float)message.Values[1], (float)message.Values[2]);
            }
            else if (message.Address == "/orientation")
            {
                FOrientation[0] = new Vector3D((float)message.Values[0], (float)message.Values[1], (float)message.Values[2]);
            }
            else if (message.Address == "/touches")
            {
                int touchCount = message.Values.Count / 4;
                int t          = 0;
                FTouchID.SliceCount       = touchCount;
                FTouchXY.SliceCount       = touchCount;
                FTouchPressure.SliceCount = touchCount;

                for (int i = 0; i < touchCount; i++)
                {
                    FTouchID[i]       = (int)message.Values[t];
                    FTouchXY[i]       = new Vector2D((float)message.Values[t + 1] / FResolution.x * 2 - 1, (float)message.Values[t + 2] / FResolution.y * -2 + 1);
                    FTouchPressure[i] = (float)message.Values[t + 3];
                    t += 4;
                }
            }
            else if (message.Address.StartsWith("/k/"))
            {
                FAllowUpdates = false;
                FTimer.Start();

                var address = "/" + message.Address.Trim('/', 'k');
                if (FTargets.ContainsKey(address))
                {
                    var pin = FTargets[address].Pin;

                    //var values = string.Join(",", message.Values.ToArray(typeof(string)));
                    var values = "";
                    foreach (var v in message.Values)
                    {
                        values += v.ToString().Replace(',', '.') + ",";
                    }
                    values = values.TrimEnd(',');

                    if (values == "bang")
                    {
                        values = "1";
                        //save pin for sending 0 next frame
                        FBangs.Add(pin);
                    }

                    //save last value sent per path (for optional later saving to patch)
                    if (FSaveTargets.ContainsKey(FTargets[address].SourceNodePath))
                    {
                        FSaveTargets[FTargets[address].SourceNodePath] = values;
                    }
                    else
                    if (!(FTargets[address].Type == "Bang"))
                    {
                        FSaveTargets.Add(FTargets[address].SourceNodePath, values);
                    }

                    pin.Spread = values;
                }
            }
        }