4 * This software is distributed under a zlib-style license.
\r
5 * See license.txt for more information.
\r
9 using System.Collections.Generic;
\r
11 using System.Text.RegularExpressions;
\r
16 public class YumaAlmanacReader
\r
18 #region type definitions
\r
19 private delegate void AlmanacSetter(Almanac almanac, string value);
\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
28 private static readonly Dictionary<string, AlmanacSetter> setters;
\r
32 #region constructors
\r
33 public YumaAlmanacReader(string filePath)
\r
35 this.filePath = filePath;
\r
38 static YumaAlmanacReader()
\r
40 setters = new Dictionary<string,AlmanacSetter>();
\r
41 setters["ID"] = delegate(Almanac a, string v)
\r
43 a.ID = Int32.Parse(v);
\r
45 setters["Health"] = delegate(Almanac a, string v)
\r
47 a.Health = (Almanac.HealthIndication)Int16.Parse(v);
\r
49 setters["Eccentricity"] = delegate(Almanac a, string v)
\r
51 a.Eccentricity = Double.Parse(v);
\r
53 setters["Time of Applicability(s)"] = delegate(Almanac a, string v)
\r
55 a.TimeOfApplicability = Decimal.Parse(v);
\r
57 setters["Orbital Inclination(rad)"] = delegate(Almanac a, string v)
\r
59 a.OrbitalInclination = Degree.FromRadian(Double.Parse(v));
\r
61 setters["Rate of Right Ascen(r/s)"] = delegate(Almanac a, string v)
\r
63 a.RateOfRightAscen = Double.Parse(v);
\r
65 setters["SQRT(A) (m 1/2)"] = delegate(Almanac a, string v)
\r
67 a.SqrtA = Double.Parse(v);
\r
69 setters["Right Ascen at Week(rad)"] = delegate(Almanac a, string v)
\r
71 a.RightAscenAtWeek = Degree.FromRadian(Double.Parse(v));
\r
73 setters["Argument of Perigee(rad)"] = delegate(Almanac a, string v)
\r
75 a.ArgumentOfPerigee = Degree.FromRadian(Double.Parse(v));
\r
77 setters["Mean Anom(rad)"] = delegate(Almanac a, string v)
\r
79 a.MeanAnom = Degree.FromRadian(Double.Parse(v));
\r
81 setters["Af0(s)"] = delegate(Almanac a, string v)
\r
83 a.Af0 = Double.Parse(v);
\r
85 setters["Af1(s/s)"] = delegate(Almanac a, string v)
\r
87 a.Af1 = Double.Parse(v);
\r
89 setters["week"] = delegate(Almanac a, string v)
\r
91 a.Week = Int32.Parse(v);
\r
96 public Almanac[] Read()
\r
98 Almanac[] list = null;
\r
101 using (Stream s = new FileStream(filePath,
\r
102 FileMode.Open, FileAccess.Read, FileShare.Read))
\r
104 using (StreamReader sr = new StreamReader(s))
\r
117 private Almanac[] Parse(StreamReader sr)
\r
119 List<Almanac> list = new List<Almanac>();
\r
120 string line = null;
\r
122 while ((line = sr.ReadLine()) != null)
\r
124 MatchCollection m = yuma.Matches(line);
\r
127 string key = m[0].Groups[1].Value;
\r
128 if (setters.ContainsKey(key))
\r
134 setters[key](a, m[0].Groups[2].Value);
\r
152 return list.ToArray();
\r