protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); SetContentView(Resource.Layout.TrainPosition); Window.SetStatusBarColor(new Android.Graphics.Color(Android.Support.V4.Content.ContextCompat.GetColor(this, Resource.Color.colorPrimary))); var line = Intent.GetStringExtra("Line"); jrhLine = JrhLineCreater.FromString(line); trainPostionLinearLayout = FindViewById <LinearLayout>(Resource.Id.TrainpositionLinearLayout); var backButton = FindViewById <ImageView>(Resource.Id.BackButton); favoriteButton = FindViewById <ImageView>(Resource.Id.FavoriteButton); var TitleTextView = FindViewById <TextView>(Resource.Id.ToolbarText); swipeRefreshLayout = FindViewById <SwipeRefreshLayout>(Resource.Id.swipe_refresh); GettedTimeTextView = FindViewById <TextView>(Resource.Id.GetedTimeTextView); favoriteButton.Click += FavoriteButton_Click; backButton.Click += BackButton_Click; TitleTextView.Text = jrhLine.GetName(); swipeRefreshLayout.Refresh += SwipeRefreshLayout_Refresh; IsFavorited = UserConfigManager.IsFavoriteLine(jrhLine); favoriteButton.SetImageResource(IsFavorited ? Resource.Drawable.FavoritedIcon : Resource.Drawable.AddFavoriteIcon); RenderData(jrhLine); }
/// <summary> /// <c>JrhLine</c>から路線名を表す文字列を取得します。 /// </summary> /// <param name="jrhLine"></param> /// <returns></returns> /// <exception cref="NotSupportedException">路線がサポートされない場合にスローされる例外。</exception> public static string GetName(this JrhLine jrhLine) { switch (jrhLine) { case JrhLine.Hakodate_Iwamizawa: return("函館本線岩見沢方面"); case JrhLine.Hakodate_Otaru: return("函館本線小樽方面"); case JrhLine.Chitose_Tomakomai: return("千歳線苫小牧方面"); case JrhLine.Sassyo: return("学園都市線"); case JrhLine.Sekisyo: return("石勝線"); case JrhLine.Nemuro_Furano: return("根室本線富良野方面"); case JrhLine.Nemuro_Obihiro: return("根室本線帯広方面"); case JrhLine.Muroran: return("室蘭本線"); default: throw new NotSupportedException("路線が存在しません"); } }
public static void DeletefavoriteLine(JrhLine jrhLine) { if (userConfigData.FavoriteLineString.Any(line => line == jrhLine.GetName())) { userConfigData.FavoriteLineString.Remove(jrhLine.GetName()); SaveUserConfig(); } }
/// <summary> /// 路線を指定して駅データをCSVに書き出します。 /// </summary> /// <param name="jrhLine"></param> /// <returns></returns> public static string ToCsvData(JrhLine jrhLine) { var stringBuilder = new StringBuilder(); foreach (var station in LineDataReader.GetStations(jrhLine)) { stringBuilder.Append($"{station.StationId},{station.Name},{station.HiraName},{station.KataName},{station.EnglishName},{station.IsEndStation},{station.StationArea},{jrhLine.GetName()},{station.Position[jrhLine]}\n"); } return(stringBuilder.ToString()); }
public static bool AddfavoriteLine(JrhLine jrhLine) { if (!userConfigData.FavoriteLineString.Any(line => line == jrhLine.GetName())) { userConfigData.FavoriteLineString.Add(jrhLine.GetName()); SaveUserConfig(); return(true); } else { return(false); } }
/// <summary> /// この路線区間の指定した路線上での順序を表す、0 始まりの整数を取得します。 /// 列車が位置提供範囲外の場合、-1を返します。 /// </summary> /// <returns></returns> public int GetPositionCode(JrhLine jrhLine) { if (StartPos.Position == null || EndPos.Position == null) { return(-1); } if (StartPos.Position.TryGetValue(jrhLine, out var start) && EndPos.Position.TryGetValue(jrhLine, out var end)) { return((start - 1) + (end - 1)); } else { return(-1); } }
/* * 函館線 岩見沢方面の位置計算 * ・札幌方面はすべて札幌駅到着データで計算可能 * ・岩見沢方面は江別止まりを考慮し、札幌-江別と江別-岩見沢で別に計算 * ・ただし特急列車は江別を通過するので岩見沢のデータを利用する */ private static async Task <(TrainPositionData, TrainPositionData)> GetIwamizawaData(JrhLine jrhLine, Dictionary <int, TrainDataFile> dataFile) { var sapporoDatas = GetPosition(dataFile[91].ArrivalTrainDatas[JrhDestType.Hakodate_Iwamizawa], jrhLine); var ebetsuDatas = GetPosition(dataFile[99].ArrivalTrainDatas[JrhDestType.Sapporo_Hakodate], jrhLine) .Where(tuple => tuple.position >= 0 && tuple.position <= 15); var iwamizawaDatas = GetPosition(dataFile[103].ArrivalTrainDatas[JrhDestType.Sapporo_Hakodate], jrhLine) .Where(tuple => (tuple.position >= 16 && tuple.position <= 24) || tuple.trainData.Name.TrainType == TrainData.TrainTypes.Ltd_Exp); var sapporoArrData = new TrainPositionData(jrhLine, sapporoDatas); var sapporoDepData = new TrainPositionData(jrhLine, ebetsuDatas, iwamizawaDatas); return(sapporoArrData, sapporoDepData); }
private static IEnumerable <(TrainData trainData, int position)> GetPosition(IEnumerable <TrainData> trainDatas, JrhLine jrhLine) { foreach (var trainData in trainDatas) { var pos = trainData.NowPosition?.GetPositionCode(jrhLine) ?? -1; if (pos == -1) { continue; } else { yield return(trainData, pos); } } }
private static async Task <(TrainPositionData, TrainPositionData)> GetSekisyoData(JrhLine jrhLine, Dictionary <int, TrainDataFile> dataFile) { var minamiChitoseData = GetPosition(dataFile[245].ArrivalTrainDatas[JrhDestType.Sekisyo_Oiwake_Obihiro], jrhLine); var oiwakeData = GetPosition(dataFile[220].ArrivalTrainDatas[JrhDestType.Sekisyo_MinamiChitose_Sapporo], jrhLine) .Where(tuple => tuple.trainData.Name.TrainType == TrainData.TrainTypes.Local); var shinyubariData = GetPosition(dataFile[288].ArrivalTrainDatas[JrhDestType.Sekisyo_Shiyubari], jrhLine) .Where(tuple => tuple.trainData.Name.TrainType == TrainData.TrainTypes.Local && tuple.position >= 6); var tomamuData = GetPosition(dataFile[297].ArrivalTrainDatas[JrhDestType.Sekisyo_Oiwake_Sapporo], jrhLine) .Where(tuple => tuple.trainData.Destination.StationId == 297); var shintokuData = GetPosition(dataFile[325].ArrivalTrainDatas[JrhDestType.Sekisyo_MinamiChitose_Sapporo], jrhLine); var arrData = new TrainPositionData(jrhLine, minamiChitoseData); var depData = new TrainPositionData(jrhLine, oiwakeData, shinyubariData, tomamuData, shintokuData); return(arrData, depData); }
/* * 札沼線の位置計算 * ・札幌到着はすべて反映。 * ・あいの里公園、石狩当別、医療大学の札幌方面からの列車は順番に反映。 * ・医療大-当別間の、月形方面からの列車を反映する為に当別到着のデータから月形方面のデータも反映。 */ private static async Task <(TrainPositionData, TrainPositionData)> GetSassyoData(JrhLine jrhLine, Dictionary <int, TrainDataFile> dataFile) { var sapporoData = GetPosition(dataFile[91].ArrivalTrainDatas[JrhDestType.Sassyo_IshikariTobetsu], jrhLine); var koenData = GetPosition(dataFile[259].ArrivalTrainDatas[JrhDestType.Sapporo_Sassyo], jrhLine) .Where(tuple => tuple.position >= 0 && tuple.position <= 19); var tobetsuData = GetPosition(dataFile[261].ArrivalTrainDatas[JrhDestType.Sapporo_Sassyo], jrhLine) .Where(tuple => tuple.position >= 20 && tuple.position <= 23); var tobetsuTsukigataData = GetPosition(dataFile[261].ArrivalTrainDatas[JrhDestType.Sassyo_Urausu], jrhLine); var iryodaiData = GetPosition(dataFile[262].ArrivalTrainDatas[JrhDestType.Sapporo_Sassyo], jrhLine) .Where(tuple => tuple.position >= 24); var sapporoArrData = new TrainPositionData(jrhLine, sapporoData, tobetsuTsukigataData); var sapporoDepData = new TrainPositionData(jrhLine, koenData, tobetsuData, iryodaiData); return(sapporoArrData, sapporoDepData); }
public static async Task <(TrainPositionData arrivalData, TrainPositionData departureTrainData)> GetTrainPosition(JrhLine jrhLine, Dictionary <int, TrainDataFile> dataFile = null) { switch (jrhLine) { case JrhLine.Hakodate_Iwamizawa: { dataFile = dataFile ?? await GetTrainDatas(91, 99, 103); return(await GetIwamizawaData(jrhLine, dataFile)); } case JrhLine.Hakodate_Otaru: { dataFile = dataFile ?? await GetTrainDatas(91, 85, 82, 76); return(await GetOtaruData(jrhLine, dataFile)); } case JrhLine.Chitose_Tomakomai: { dataFile = dataFile ?? await GetTrainDatas(91, 244, 245, 215); return(await GetChitoseData(jrhLine, dataFile)); } case JrhLine.Sassyo: { dataFile = dataFile ?? await GetTrainDatas(91, 259, 261, 262); return(await GetSassyoData(jrhLine, dataFile)); } case JrhLine.Sekisyo: { dataFile = dataFile ?? await GetTrainDatas(245, 220, 288, 297, 325); return(await GetSekisyoData(jrhLine, dataFile)); } default: throw new NotImplementedException(); } }
/* * 千歳線の位置計算 * ・札幌方面はすべて札幌到着データ利用。 * ・札幌-千歳間は特急以外反映。 * ・札幌-南千歳は全反映。札幌-南千歳の特急も反映。 * ・南千歳-苫小牧も全反映。 */ private static async Task <(TrainPositionData, TrainPositionData)> GetChitoseData(JrhLine jrhLine, Dictionary <int, TrainDataFile> dataFile) { var sapporoData = GetPosition(dataFile[91].ArrivalTrainDatas[JrhDestType.Chitose_Chitose], jrhLine); var sapporoRapidData = GetPosition(dataFile[91].ArrivalTrainDatas[JrhDestType.Chitose_Rapid_AP], jrhLine); var chitoseData = GetPosition(dataFile[244].ArrivalTrainDatas[JrhDestType.Sapporo_Chitose], jrhLine) .Where(tuple => tuple.position >= 0 && tuple.position <= 23 && tuple.trainData.Name.TrainType != TrainData.TrainTypes.Ltd_Exp); var minamiChitoseData = GetPosition(dataFile[245].ArrivalTrainDatas[JrhDestType.Chitose_LocalRapid_Sapporo], jrhLine) .Where(tuple => tuple.position >= 24 && tuple.position <= 25); var minamiChitoseExpData = GetPosition(dataFile[245].ArrivalTrainDatas[JrhDestType.Chitose_LimExp_Sapporo], jrhLine); var TomakomaiData = GetPosition(dataFile[215].ArrivalTrainDatas[JrhDestType.Sapporo_Chitose], jrhLine) .Where(tuple => tuple.position >= 26 && tuple.position <= 30); var sapporoArrData = new TrainPositionData(jrhLine, sapporoData, sapporoRapidData); var sapporoDepData = new TrainPositionData(jrhLine, chitoseData, minamiChitoseData, minamiChitoseExpData, TomakomaiData); return(sapporoArrData, sapporoDepData); }
/// <summary> /// <see cref="Station"/> クラスの新しいインスタンスを初期化します。 /// </summary> /// <param name="stationID"></param> /// <param name="name"></param> /// <param name="hiraName"></param> /// <param name="kataName"></param> /// <param name="englishName"></param> /// <param name="isEnd"></param> /// <param name="jrhLine"></param> /// <param name="position"></param> public Station(int stationID, string name, string hiraName, string kataName, string englishName, int stationArea, bool isEnd, JrhLine jrhLine, int position) { StationId = stationID; Name = name; HiraName = hiraName; KataName = kataName; EnglishName = englishName; StationArea = stationArea; Position = new Dictionary <JrhLine, int> { { jrhLine, position } }; IsEndStation = isEnd; }
/* * 函館線 小樽方面の位置計算 * ・札幌方面はすべて札幌到着データを利用。 * ・小樽方面のうち… * 札幌-手稲は手稲到着データ利用 * ほしみ到着データ(普通列車)のうち手稲-ほしみ間にある列車は反映 * 小樽到着データはほしみ-小樽間の列車及び、ほしみ通過の快速列車については手稲-小樽間で利用。 */ private static async Task <(TrainPositionData, TrainPositionData)> GetOtaruData(JrhLine jrhLine, Dictionary <int, TrainDataFile> dataFile) { var sapporoData = GetPosition(dataFile[91].ArrivalTrainDatas[JrhDestType.Hakodate_Otaru], jrhLine); var teineData = GetPosition(dataFile[85].ArrivalTrainDatas[JrhDestType.Sapporo_Hakodate], jrhLine) .Where(tuple => tuple.position >= 0 && tuple.position <= 11); var hoshimiData = GetPosition(dataFile[82].ArrivalTrainDatas[JrhDestType.Sapporo_Hakodate], jrhLine) .Where(tuple => tuple.position >= 12 && tuple.position <= 17); var otaruData = GetPosition(dataFile[76].ArrivalTrainDatas[JrhDestType.Sapporo_Hakodate], jrhLine) .Where(tuple => (tuple.position >= 18 && tuple.position <= 28) || (tuple.trainData.Name.GetTypesByStation(StationReader.GetStationByName("ほしみ")) == TrainData.TrainTypes.Rapid && tuple.position >= 12 && tuple.position <= 28)); var sapporoArrData = new TrainPositionData(jrhLine, new[] { sapporoData }); var sapporoDepData = new TrainPositionData(jrhLine, new[] { teineData, hoshimiData, otaruData }); return(sapporoArrData, sapporoDepData); }
/// <summary> /// 路線とその路線上での位置から駅を検索して返します。 /// </summary> /// <param name="jrhLine">検索対象の路線。</param> /// <param name="position">検索対象の駅の位置。</param> /// <returns>該当する駅。存在しない場合は<c>null</c></returns> public static Station GetStationByPosition(JrhLine jrhLine, int position) { return(LineDataReader.GetStations(jrhLine).FirstOrDefault(sta => sta.Position[jrhLine] == position)); }
/// <summary> /// 路線を指定してその路線上を走行するすべての列車データを取得します。 /// </summary> /// <param name="jrhLine"></param> /// <returns>走行中の列車データ。</returns> public static async Task <(TrainPositionData arrivalData, TrainPositionData departureData)> GetTrainPositionDataAsync(JrhLine jrhLine, Dictionary <int, TrainDataFile> dataFile) { return(await TrainPositionGeter.GetTrainPosition(jrhLine, dataFile)); }
/// <summary> /// 路線を指定してその路線上を走行するすべての列車データを取得します。 /// </summary> /// <param name="jrhLine"></param> /// <returns>走行中の列車データ。</returns> public static async Task <(TrainPositionData arrivalData, TrainPositionData departureData)> GetTrainPositionDataAsync(JrhLine jrhLine) { return(await TrainPositionGeter.GetTrainPosition(jrhLine, null)); }
private async void RenderData(JrhLine jrhLine) { trainPostionLinearLayout.RemoveAllViews(); var(arrivalData, departureData) = await TrainInfoReader.GetTrainPositionDataAsync(jrhLine); for (var i = 0; i < arrivalData.Count; i++) { var lineRangeLinearLayout = new LinearLayout(this) { Orientation = Orientation.Horizontal }; var stationAreaLayout = new LinearLayout(this) { Orientation = Orientation.Vertical }; var stationLayoutParams = new LinearLayout.LayoutParams(0, -1) { Weight = 2 }; if (arrivalData[i].Item1.IsStation) { lineRangeLinearLayout.SetBackgroundColor(Android.Graphics.Color.Argb(0xff, 0xea, 0xea, 0xea)); var textView = new TextView(this) { Text = arrivalData[i].Item1.StartPos.Name, TextSize = 16, }; textView.SetPadding(30, 20, 0, 0); textView.Typeface = Typeface.DefaultBold; stationAreaLayout.AddView(textView); } else { lineRangeLinearLayout.SetBackgroundColor(Android.Graphics.Color.Argb(0xff, 0xff, 0xff, 0xff)); } lineRangeLinearLayout.AddView(stationAreaLayout, stationLayoutParams); var arrLayoutParams = new LinearLayout.LayoutParams(0, -1) { Weight = 3 }; var arrTrainLinearLayout = new LinearLayout(this) { Orientation = Orientation.Vertical }; var depLayoutParams = new LinearLayout.LayoutParams(0, -1) { Weight = 3 }; var depTrainLinearLayout = new LinearLayout(this) { Orientation = Orientation.Vertical }; foreach (var arr in arrivalData[i].Item2) { var textView = new TextView(this) { Text = $"↑{arr.Name.TrainType.GetName()} {arr.Destination.Name}行", }; arrTrainLinearLayout.AddView(textView); } foreach (var dep in departureData[i].Item2) { var textView = new TextView(this) { Text = $"↓{dep.Name.TrainType.GetName()} {dep.Destination.Name}行", }; depTrainLinearLayout.AddView(textView); } lineRangeLinearLayout.AddView(arrTrainLinearLayout, arrLayoutParams); lineRangeLinearLayout.AddView(depTrainLinearLayout, depLayoutParams); trainPostionLinearLayout.AddView(lineRangeLinearLayout, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MatchParent, 250)); } GettedTimeTextView.Text = $"{ DateTime.Now.ToString()} 現在の情報"; }
/// <summary> /// 路線を指定してその路線にある全ての駅を取得します。 /// </summary> /// <param name="jrhLine">取得対象の路線。</param> /// <returns>該当する駅。札幌が起点です。</returns> /// <exception cref="NotSupportedException">路線が対応していない路線の場合にスローされる例外。</exception> public static Station[] GetStations(JrhLine jrhLine) { return(StationData.LineDataDictionary[jrhLine]); }
public static bool IsFavoriteLine(JrhLine jrhLine) { return(userConfigData.FavoriteLineString.Contains(jrhLine.GetName())); }