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()); } } }
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); }); }
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); }