OSDN Git Service

WeekとTimeOfWeekプロパティを持つパケットにGpsTimeプロパティ追加
[yubeshi/yubeshi.git] / Yubeshi / YumaAlmanacReader.cs
1 /*\r
2  *      Yubeshi GPS Parser\r
3  *\r
4  *      This software is distributed under a zlib-style license.\r
5  *      See license.txt for more information.\r
6  */\r
7 \r
8 using System;\r
9 using System.Collections.Generic;\r
10 using System.Text;\r
11 using System.Text.RegularExpressions;\r
12 using System.IO;\r
13 \r
14 namespace Yubeshi\r
15 {\r
16     public class YumaAlmanacReader\r
17     {\r
18         #region type definitions\r
19         private delegate void AlmanacSetter(Almanac almanac, string value);\r
20         #endregion\r
21 \r
22         #region fields\r
23         private string filePath;\r
24         private static readonly Regex yuma = \r
25             new Regex(@"^([\w\s\(\)/]+):\s*([\d.E+-]+)$", \r
26                                                     RegexOptions.Compiled);\r
27         \r
28         private static readonly Dictionary<string, AlmanacSetter> setters;\r
29         #endregion\r
30 \r
31 \r
32         #region constructors\r
33         public YumaAlmanacReader(string filePath)\r
34         {\r
35             this.filePath = filePath;\r
36         }\r
37 \r
38         static YumaAlmanacReader()\r
39         {\r
40             setters = new Dictionary<string,AlmanacSetter>();\r
41             setters["ID"] = delegate(Almanac a, string v)\r
42                 {\r
43                     a.ID = Int32.Parse(v);  \r
44                 };\r
45             setters["Health"] = delegate(Almanac a, string v)\r
46                 {\r
47                     a.Health = (Almanac.HealthIndication)Int16.Parse(v);\r
48                 };\r
49             setters["Eccentricity"] = delegate(Almanac a, string v)\r
50                 {\r
51                     a.Eccentricity = Double.Parse(v);\r
52                 };\r
53             setters["Time of Applicability(s)"] = delegate(Almanac a, string v)\r
54                 {\r
55                     a.TimeOfApplicability = Decimal.Parse(v);\r
56                 };\r
57             setters["Orbital Inclination(rad)"] = delegate(Almanac a, string v)\r
58                 {\r
59                     a.OrbitalInclination = Degree.FromRadian(Double.Parse(v));\r
60                 };\r
61             setters["Rate of Right Ascen(r/s)"] = delegate(Almanac a, string v)\r
62                 {\r
63                     a.RateOfRightAscen = Double.Parse(v);\r
64                 };\r
65             setters["SQRT(A)  (m 1/2)"] = delegate(Almanac a, string v)\r
66                 {\r
67                     a.SqrtA = Double.Parse(v);\r
68                 };\r
69             setters["Right Ascen at Week(rad)"] = delegate(Almanac a, string v)\r
70                 {\r
71                     a.RightAscenAtWeek = Degree.FromRadian(Double.Parse(v));\r
72                 };\r
73             setters["Argument of Perigee(rad)"] = delegate(Almanac a, string v)\r
74                 {\r
75                     a.ArgumentOfPerigee = Degree.FromRadian(Double.Parse(v));\r
76                 };\r
77             setters["Mean Anom(rad)"] = delegate(Almanac a, string v)\r
78                 {\r
79                     a.MeanAnom = Degree.FromRadian(Double.Parse(v));\r
80                 };\r
81             setters["Af0(s)"] = delegate(Almanac a, string v)\r
82                 {\r
83                     a.Af0 = Double.Parse(v);\r
84                 };\r
85             setters["Af1(s/s)"] = delegate(Almanac a, string v)\r
86                 {\r
87                     a.Af1 = Double.Parse(v);\r
88                 };\r
89             setters["week"] = delegate(Almanac a, string v)\r
90             {\r
91                 a.Week = Int32.Parse(v);\r
92             };\r
93         }\r
94         #endregion\r
95 \r
96         public Almanac[] Read()\r
97         {\r
98             Almanac[] list = null;\r
99             try\r
100             {\r
101                 using (Stream s = new FileStream(filePath,\r
102                             FileMode.Open, FileAccess.Read, FileShare.Read))\r
103                 {\r
104                     using (StreamReader sr = new StreamReader(s))\r
105                     {\r
106                         list = Parse(sr);\r
107                     }\r
108                 }\r
109             }\r
110             catch\r
111             {\r
112                 throw;\r
113             }\r
114             return list;\r
115         }\r
116 \r
117         private Almanac[] Parse(StreamReader sr)\r
118         {\r
119             List<Almanac> list = new List<Almanac>();\r
120             string line = null;\r
121             Almanac a = null;\r
122             while ((line = sr.ReadLine()) != null)\r
123             {\r
124                 MatchCollection m = yuma.Matches(line);\r
125                 if (m.Count == 1)\r
126                 {\r
127                     string key = m[0].Groups[1].Value;\r
128                     if (setters.ContainsKey(key))\r
129                     {\r
130                         if (a == null)\r
131                         {\r
132                             a = new Almanac();\r
133                         }\r
134                         setters[key](a, m[0].Groups[2].Value);\r
135                     }\r
136                     else\r
137                     {\r
138                         a = null;\r
139                     }\r
140                 }\r
141                 else if(a != null)\r
142                 {\r
143                     list.Add(a);\r
144                     a = null;\r
145                 }\r
146 \r
147             }\r
148             if (a != null)\r
149             {\r
150                 list.Add(a);\r
151             }\r
152             return list.ToArray();\r
153         }\r
154 \r
155     }\r
156 }\r