Beispiel #1
0
        private void recogThread_Task()
        {
            Camera camera = Camera.GetInstance();

            camera.Start();
            MotorControler mc = MotorControler.GetInstance(parameterManager);

            surfaces[0] = UpTop;
            surfaces[1] = UpBottom;
            surfaces[2] = LowTop;
            surfaces[3] = LowBottom;

            // 現在位置が,前回の表面認識結果に基づいて下ゲル以下にいる場合は下ゲル下部から上方向に順に表面認識を行う.
            // 一方,ベース及び上ゲル以上にいる場合は上ゲル上部から下方向に順に表面認識を行う.
            // そのためにforループの条件式を設定する
            GelLayer layerNow = getWhichLayerNow();
            int      i, end;
            Action   fomula;

            if (layerNow == GelLayer.Under || layerNow == GelLayer.UnderOut)
            {
                i      = surfaces.Length;
                end    = 0;
                fomula = (() => -- i);
            }
            else
            {
                i      = 0;
                end    = surfaces.Length;
                fomula = (() => ++ i);
            }

            for (i = 0; i < end; fomula())
            {
                mc.MovePointZ(surfaces[i]);
                mc.Join();
                bool   presentResult = false, previousResult = IsInGel();
                bool[] votes   = new bool[parent.NumOfVoting];
                int    counter = 1;
                while (presentResult == previousResult)
                {
                    previousResult = presentResult;
                    mc.MovePointZ(surfaces[i] + everyRange * counter);
                    while (mc.Moving)
                    {
                        for (int j = 0; j < votes.Length; ++j)
                        {
                            votes[i] = IsInGel();
                            Thread.Sleep(parent.DelayTime);
                        }
                        presentResult = Surface.Vote(votes);
                        if (presentResult != previousResult)
                        {
                            mc.AbortMoving();
                        }
                    }
                    counter *= -1;
                    counter += (counter > 0 ? 1 : 0);
                    if (Math.Abs(everyRange * counter) > searchRange)
                    {
                        throw new SurfaceFailedException("Distance limit out.");
                    }
                }
                surfaces[i] = mc.GetPoint().Z;
                // 境界面認識時のイベントを発生させる.
                ActivityEventArgs eventArgs = new ActivityEventArgs();
                eventArgs.ZValue = surfaces[i];
                switch (i)
                {
                case 3:
                    if (LowBottomRecognized != null)
                    {
                        LowBottomRecognized(this, eventArgs);
                    }
                    break;

                case 2:
                    if (LowTopRecognized != null)
                    {
                        LowTopRecognized(this, eventArgs);
                    }
                    break;

                case 1:
                    if (UpBottomRecognized != null)
                    {
                        UpBottomRecognized(this, eventArgs);
                    }
                    break;

                case 0:
                    if (UpTopRecognized != null)
                    {
                        UpTopRecognized(this, eventArgs);
                    }
                    break;
                }
            }
            dateTime = DateTime.Now;
        }