private void createWiimoteValuesUserControl()
        {
            // must run in the form's thread
            wiimoteValuesUserControl = new WiimoteValuesUserControl();

            wiimoteValuesUserControl.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top
                                                                                     | System.Windows.Forms.AnchorStyles.Left)
                                                                                    | System.Windows.Forms.AnchorStyles.Right)));
            wiimoteValuesUserControl.Location = new System.Drawing.Point(20, 25 * (wiiValuesControls.Count + 1));
            wiimoteValuesUserControl.Size     = new System.Drawing.Size(526, 30);
            oscGroupBox.Controls.Add(wiimoteValuesUserControl);
        }
        private void oscListenerLoop()
        {
            OSCReceiver oscReceiver    = null;
            OSCMessage  oscWiimoteData = null;

            oscStopNow = false;

            double[] beams = new double[200];

            beams[0] = 0.0d;
            beams[1] = 0.0d;
            beams[2] = 0.0d;

            double accel     = 0.0d;
            double accelBase = 0.0d;
            double speed     = 0.0d;
            double dist      = 0.0d;
            double dT        = 0.0d;
            double par4      = 0.0d;

            long currTick;
            long prevTick;

            currTick = prevTick = DateTime.Now.Ticks;

            try
            {
                int oscPort = Convert.ToInt32(oscPortTextBox.Text);

                oscReceiver = new OSCReceiver(oscPort);

                oscReceiver.Connect();

                Tracer.Trace("OSC connected and listening on port " + oscPort);

                while (!oscStopNow && (oscWiimoteData = (OSCMessage)oscReceiver.Receive()) != null)
                {
                    string addr = oscWiimoteData.Address;

                    if (wiiValuesControls.ContainsKey(addr))
                    {
                        wiimoteValuesUserControl = (WiimoteValuesUserControl)wiiValuesControls[addr];
                    }
                    else
                    {
                        this.Invoke(new MethodInvoker(createWiimoteValuesUserControl));
                        wiiValuesControls.Add(addr, wiimoteValuesUserControl);
                    }

                    wiimoteValuesUserControl.values = oscWiimoteData;


                    switch (addr)
                    {
                    case "/wiimote-g":

                        currTick = DateTime.Now.Ticks;

                        dT = (double)(currTick - prevTick) / 10000000.0d;                                       // sec

                        //   string str = DateTime.Now.ToLongTimeString() + "  OSC packet: " + oscWiimoteData.Address + "   ";

                        int i = 0;

                        foreach (object obj in oscWiimoteData.Values)
                        {
                            //                        str += obj.ToString() + "   ";
                            if (i == 0)
                            {
                                try
                                {
                                    beams[i] = Convert.ToDouble((float)obj);
                                }
                                catch
                                {
                                    beams[i] = 0.0d;
                                }
                                accel = beams[i];                                          //  m/c2
                            }
                            if (i == 4)
                            {
                                try
                                {
                                    beams[i] = Convert.ToDouble((float)obj);
                                }
                                catch
                                {
                                    beams[i] = 0.0d;
                                }
                                par4 = beams[i];
                            }
                            i++;
                        }


                        if (par4 > 0.0d)
                        {
                            accelBase = accel;
                            speed     = 0.0d;
                            dist      = 0.0d;
                        }
                        else
                        {
                            accel -= accelBase;
                            speed += accel * dT;
                            dist  += speed * dT;
                        }

                        // oscilloscope.AddData(beams[0], beams[1], beams[2]);

                        oscilloscope.AddData(accel, speed * 100.0d, dist * 100.0d);


                        //                    Tracer.Trace(str.Trim());

                        prevTick = currTick;
                        break;
                    }
                }
            }
            catch (Exception exc)
            {
                Tracer.Error(exc.ToString());
            }
            finally
            {
                if (oscReceiver != null)
                {
                    oscReceiver.Close();
                }
                Tracer.Trace("OSC finished and closed");
            }
        }