public void Test_Navigation_Data()
    {
        Report.TestCaseDescription("Check propagation of navigation data from Backend endpoint to Dashboard endpoint");


        Tuple <string, uint>[] destinations = { Tuple.Create("Weilimdorf",  10U),
                                                Tuple.Create("Muenchen",   200U),
                                                Tuple.Create("Dortmund",   400U),
                                                Tuple.Create("Hannover",   500U),
                                                Tuple.Create("Berlin", 700U) };

        Tuple <string, uint>[] pois = { Tuple.Create("Roadworks",   1U),
                                        Tuple.Create("Restaurant",  2U),
                                        Tuple.Create("Traffic Jam", 1U),
                                        Tuple.Create("Gas Station", 2U),
                                        Tuple.Create("Detour", 1U) };


        foreach (var destination in destinations)
        {
            Navigation_Info navigation_info = new Navigation_Info();
            navigation_info.Destination        = destination.Item1;
            navigation_info.Distance.ImplValue = destination.Item2;
            navigation_info.POIs.Length        = 3;
            Random random = new Random();

            for (int j = 0; j < navigation_info.POIs.Length; j++)
            {
                uint poi_index = (uint)random.Next(pois.Length);
                navigation_info.POIs[j].Distance.ImplValue = ((uint)j * 10U) + poi_index;
                navigation_info.POIs[j].Message            = pois[poi_index].Item1;
                navigation_info.POIs[j].Category.ImplValue = pois[poi_index].Item2;
            }

            Report.TestStep("Propagate navigation info", "Destination: " + navigation_info.Destination.ToString() + ", Distance: " + navigation_info.Distance.ImplValue.ToString());

            // Wait for call from Drive_Master to Backend
            var wait_result_backend = Navigation.Get_Navigation_Info.WaitForNextCall(2000);
            // Set method call out parameter
            wait_result_backend.Call.navigation_info = navigation_info;
            // Wait for setter call from Drive_Master to Dashboard
            var wait_result_dashboard = Passenger_Information.Navigation_Info.Set.WaitForNextCall(2000);

            // Check for expected distance value (further checks omitted in this example)
            if (wait_result_dashboard.Call.newValue.Distance.ImplValue != navigation_info.Distance.ImplValue)
            {
                Report.TestStepFail("Check distance", "Unexpected value received: " + wait_result_dashboard.Call.newValue.Distance.ImplValue.ToString());
            }
            else
            {
                Report.TestStepPass("Check distance", "Expected value received: " + wait_result_dashboard.Call.newValue.Distance.ImplValue.ToString());
            }
        }
    }
Exemple #2
0
    public void OnNavigationTimer()
    {
        Navigation.Get_Navigation_Info.CallAsync("", 0.0, 0.0, result =>
        {
            Navigation_Info navigation_info    = new Navigation_Info();
            navigation_info.Destination        = result.Destination + ": " + result.Distance.ImplValue.ToString() + "km";
            navigation_info.Distance.ImplValue = result.Distance.ImplValue;
            navigation_info.POIs.Length        = result.POIs.Length;

            for (int i = 0; i < navigation_info.POIs.Length; i++)
            {
                navigation_info.POIs[i].Category.ImplValue = result.POIs[i].Category.ImplValue;
                if (result.POIs[i].Category.ImplValue > 0)
                {
                    navigation_info.POIs[i].Message = result.POIs[i].Message + ": " + result.POIs[i].Distance.ImplValue.ToString() + "km";
                }
                else
                {
                    navigation_info.POIs[i].Message = "";
                }
            }
            Passenger_Information.Navigation_Info.Set.CallAsync(navigation_info);
        });
    }
Exemple #3
0
        public bool Navigate(int User, ref Navigation_Info _navigation, bool Anchor)
        {
            if (_navigation.Move < _navigation.Point)
            {
                if (Form1.UsingProcess[User].Place == 0x4)
                {
                    #region 海上導航
                    if (!Form1.UsingProcess[User].Coordinate.IsEmpty)
                    {
                        while (Math.Sqrt(Math.Pow(_navigation.Route[_navigation.Move].X - Form1.UsingProcess[User].Coordinate.X / 4, 2)) >= Math.Sqrt(Math.Pow(_navigation.Route[_navigation.Move].X + 4096 - Form1.UsingProcess[User].Coordinate.X / 4, 2)))
                        {
                            _navigation.Route[_navigation.Move].X += 4096;
                        }
                        while (Math.Sqrt(Math.Pow(_navigation.Route[_navigation.Move].X - Form1.UsingProcess[User].Coordinate.X / 4, 2)) > Math.Sqrt(Math.Pow(_navigation.Route[_navigation.Move].X - 4096 - Form1.UsingProcess[User].Coordinate.X / 4, 2)))
                        {
                            _navigation.Route[_navigation.Move].X -= 4096;
                        }

                        float Check_X = _navigation.Route[_navigation.Move].X * 4 - Form1.UsingProcess[User].Coordinate.X, Check_Y = _navigation.Route[_navigation.Move].Y * 4 - Form1.UsingProcess[User].Coordinate.Y;
                        //座標點到目標點的距離
                        float Distance = (float)Math.Sqrt(Math.Pow(Check_X, 2) + Math.Pow(Check_Y, 2));
                        //座標點到目標點的COS、SIN角度
                        float TCos = Check_X / Distance - Form1.UsingProcess[User].Cos;
                        float TSin = Check_Y / Distance - Form1.UsingProcess[User].Sin;

                        //暴風雨&雪
                        if (Anchor && Call.GetBadWeather(Form1.UsingProcess[User].hWnd))
                        {
                            Tempest(Form1.UsingProcess[User].hWnd);
                        }
                        else
                        {
                            if (!string.IsNullOrWhiteSpace(_navigation.Route[_navigation.Move].CityName) && _navigation.Route[_navigation.Move].CityID == 0)
                            {
                                for (int i = 0; i < Form1.UsingProcess[User]._Regular.Length; i++)
                                {
                                    if (Call.Distance(new PointF(_navigation.Route[_navigation.Move].X * 4, _navigation.Route[_navigation.Move].Y * 4), Form1.UsingProcess[User]._Regular[i].Coordinate) < 20)
                                    {
                                        _navigation.Route[_navigation.Move].CityID = Form1.UsingProcess[User]._Regular[i].ID;
                                    }
                                }
                            }

                            if (Distance < 25 && _navigation.Route[_navigation.Move].CityName != null && _navigation.Route[_navigation.Move].CityID != 0)
                            {
                                Call.IntoScene(Form1.UsingProcess[User].hWnd, _navigation.Route[_navigation.Move].CityID);
                            }
                            else if (Distance < 10 && Call.GetSailStatus(Form1.UsingProcess[User].hWnd) > 0)
                            {
                                _navigation.Route[_navigation.Move++].Done = true;

                                if (_navigation.Move < _navigation.Point && !_navigation.Route[_navigation.Move].Done)
                                {
                                    Call.Turn(Form1.UsingProcess[User].hWnd, _navigation.Route[_navigation.Move].X * 4, _navigation.Route[_navigation.Move].Y * 4);
                                }
                                else
                                {
                                    if (Call.GetSailStatus(Form1.UsingProcess[User].hWnd) != 0)
                                    {
                                        Call.ChangeSailStatus(Form1.UsingProcess[User].hWnd, 0);
                                    }
                                }
                            }
                            else
                            {
                                if (Call.GetSailStatus(Form1.UsingProcess[User].hWnd) > 0 && (TCos >= 0.085 || TCos <= -0.085 || TSin >= 0.085 || TSin <= -0.085))
                                {
                                    #region 航向錯誤
                                    ++Form1.UsingProcess[User].TurnCount;
                                    if (Form1.UsingProcess[User].TurnCount >= 5)
                                    {
                                        Console.WriteLine("轉向[" + _navigation.Move + "] TX = " + _navigation.Route[_navigation.Move].X * 4 + " TY = " + _navigation.Route[_navigation.Move].Y * 4);
                                        Call.Turn(Form1.UsingProcess[User].hWnd, _navigation.Route[_navigation.Move].X * 4, _navigation.Route[_navigation.Move].Y * 4);
                                        Form1.UsingProcess[User].TurnCount = -15;
                                    }
                                    #endregion
                                }
                                else
                                {
                                    if (Distance < 30)
                                    {
                                        Form1.UsingProcess[User].TurnCount = 1;
                                    }
                                    else
                                    {
                                        Form1.UsingProcess[User].TurnCount = 0;
                                    }
                                }

                                #region 調整帆位
                                if (Call.GetSailStatus(Form1.UsingProcess[User].hWnd) != 4)
                                {
                                    if (Form1.UsingProcess[User].TimeCount >= 10)
                                    {
                                        Call.ChangeSailStatus(Form1.UsingProcess[User].hWnd, 4);
                                        Form1.UsingProcess[User].TimeCount = 0;
                                        Form1.UsingProcess[User].TurnCount = 0;
                                    }
                                }
                                #endregion
                            }
                        }
                    }
                    #endregion
                }
                else
                {
                    if (!string.IsNullOrWhiteSpace(Form1.UsingProcess[User].PlaceName) && !Form1.UsingProcess[User].PlaceName.Contains("海域"))
                    {
                        if (!string.IsNullOrWhiteSpace(_navigation.Route[_navigation.Move].CityName) && Form1.UsingProcess[User].PlaceName.Contains(_navigation.Route[_navigation.Move].CityName))
                        {
                            _navigation.Route[_navigation.Move++].Done = true;
                            return(true);
                        }
                        else
                        {
                            new CityCall().ToSailing(User);
                        }
                    }
                }
            }
            else
            {
                //到達終點
                _navigation       = new Navigation_Info();
                _navigation.Route = new Navigator.Navigation_Info.Route_Info[512];
                return(true);
            }
            return(false);
        }