Example #1
0
        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);
        }
Example #2
0
        /// <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("路線が存在しません");
            }
        }
Example #3
0
 public static void DeletefavoriteLine(JrhLine jrhLine)
 {
     if (userConfigData.FavoriteLineString.Any(line => line == jrhLine.GetName()))
     {
         userConfigData.FavoriteLineString.Remove(jrhLine.GetName());
         SaveUserConfig();
     }
 }
Example #4
0
        /// <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());
        }
Example #5
0
 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);
     }
 }
Example #6
0
        /// <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);
            }
        }
Example #7
0
        /*
         * 函館線 岩見沢方面の位置計算
         * ・札幌方面はすべて札幌駅到着データで計算可能
         * ・岩見沢方面は江別止まりを考慮し、札幌-江別と江別-岩見沢で別に計算
         * ・ただし特急列車は江別を通過するので岩見沢のデータを利用する
         */
        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);
        }
Example #8
0
 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);
         }
     }
 }
Example #9
0
        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);
        }
Example #10
0
        /*
         * 札沼線の位置計算
         * ・札幌到着はすべて反映。
         * ・あいの里公園、石狩当別、医療大学の札幌方面からの列車は順番に反映。
         * ・医療大-当別間の、月形方面からの列車を反映する為に当別到着のデータから月形方面のデータも反映。
         */
        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);
        }
Example #11
0
        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();
            }
        }
Example #12
0
        /*
         * 千歳線の位置計算
         * ・札幌方面はすべて札幌到着データ利用。
         * ・札幌-千歳間は特急以外反映。
         * ・札幌-南千歳は全反映。札幌-南千歳の特急も反映。
         * ・南千歳-苫小牧も全反映。
         */
        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);
        }
Example #13
0
        /// <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;
        }
Example #14
0
        /*
         * 函館線 小樽方面の位置計算
         * ・札幌方面はすべて札幌到着データを利用。
         * ・小樽方面のうち…
         *   札幌-手稲は手稲到着データ利用
         *   ほしみ到着データ(普通列車)のうち手稲-ほしみ間にある列車は反映
         *    小樽到着データはほしみ-小樽間の列車及び、ほしみ通過の快速列車については手稲-小樽間で利用。
         */
        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);
        }
Example #15
0
 /// <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));
 }
Example #16
0
 /// <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));
 }
Example #17
0
 /// <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));
 }
Example #18
0
        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()} 現在の情報";
        }
Example #19
0
 /// <summary>
 /// 路線を指定してその路線にある全ての駅を取得します。
 /// </summary>
 /// <param name="jrhLine">取得対象の路線。</param>
 /// <returns>該当する駅。札幌が起点です。</returns>
 /// <exception cref="NotSupportedException">路線が対応していない路線の場合にスローされる例外。</exception>
 public static Station[] GetStations(JrhLine jrhLine)
 {
     return(StationData.LineDataDictionary[jrhLine]);
 }
Example #20
0
 public static bool IsFavoriteLine(JrhLine jrhLine)
 {
     return(userConfigData.FavoriteLineString.Contains(jrhLine.GetName()));
 }