public string Write(Guid listGuid) { string kml = string.Empty; Serializer serializer = new Serializer(); Kml _kml = new Kml(); Folder folder = new Folder(); UseWeb(spWeb => { SPList list = spWeb.Lists.GetList(listGuid, true); SPField field = list.GetGeoField(); if (field != null) { foreach (SPListItem item in list.Items) { string wkt = item[field.Id] as string; SimpleWKTReader wktReader = new SimpleWKTReader(); var simpleGeometry = wktReader.Parse(wkt); if (simpleGeometry.GeometryType == GeometryTypes.Point) { var _point = (OpenSMIL.Server.SimpleFeature.GeomtryTypes.Point)simpleGeometry; SharpKml.Dom.Point point = new SharpKml.Dom.Point(); point.Coordinate = new Vector(_point.Lat, _point.Lon); Placemark placemark = CreatePlaceMark(item.Title, point); folder.AddFeature(placemark); } else if (simpleGeometry.GeometryType == GeometryTypes.LineString) { var _lineString = (OpenSMIL.Server.SimpleFeature.GeomtryTypes.LineString)simpleGeometry; SharpKml.Dom.LineString line = new SharpKml.Dom.LineString(); line.Coordinates = CreateCoordinateCollection(_lineString.Points); Placemark placeMark = CreatePlaceMark(item.Title, line); folder.AddFeature(placeMark); } else if (simpleGeometry.GeometryType == GeometryTypes.Polygon) { var _polygon = (OpenSMIL.Server.SimpleFeature.GeomtryTypes.Polygon)simpleGeometry; OuterBoundary outerBoundary = new OuterBoundary(); outerBoundary.LinearRing = new LinearRing(); outerBoundary.LinearRing.Coordinates = CreateCoordinateCollection(_polygon.Points); SharpKml.Dom.Polygon polygon = new SharpKml.Dom.Polygon(); polygon.OuterBoundary = outerBoundary; polygon.Extrude = true; Placemark placeMark = CreatePlaceMark(item.Title, polygon); folder.AddFeature(placeMark); } } _kml.Feature = folder; } }); serializer.Serialize(_kml); return serializer.Xml; }
private void writeKML(string filename) { Color[] colours = { Color.Red, Color.Orange, Color.Yellow, Color.Green, Color.Blue, Color.Indigo, Color.Violet, Color.Pink }; Document kml = new Document(); Tour tour = new Tour(); tour.Name = "First Person View"; Playlist tourplaylist = new Playlist(); AddNamespace(kml, "gx", "http://www.google.com/kml/ext/2.2"); Style style = new Style(); style.Id = "yellowLineGreenPoly"; style.Line = new LineStyle(new Color32(HexStringToColor("7f00ffff")), 4); PolygonStyle pstyle = new PolygonStyle(); pstyle.Color = new Color32(HexStringToColor("7f00ff00")); style.Polygon = pstyle; kml.AddStyle(style); // create sub folders Folder planes = new Folder(); planes.Name = "Planes"; kml.AddFeature(planes); // coords for line string CoordinateCollection coords = new CoordinateCollection(); int a = 1; int c = -1; DateTime lasttime = DateTime.MaxValue; DateTime starttime = DateTime.MinValue; Color stylecolor = Color.AliceBlue; string mode = ""; if (flightdata.Count > 0) { mode = flightdata[0].mode; } foreach (CurrentState cs in flightdata) { progressBar1.Value = 50 + (int)((float)a / (float)flightdata.Count * 100.0f / 2.0f); progressBar1.Refresh(); if (starttime == DateTime.MinValue) { starttime = cs.datetime; lasttime = cs.datetime; } if (mode != cs.mode || flightdata.Count == a) { c++; LineString ls = new LineString(); ls.AltitudeMode = SharpKml.Dom.AltitudeMode.Absolute; ls.Extrude = true; ls.Coordinates = coords; Placemark pm = new Placemark(); pm.Name = c + " Flight Path " + mode; pm.StyleUrl = new Uri("#yellowLineGreenPoly", UriKind.Relative); pm.Geometry = ls; SharpKml.Dom.TimeSpan ts = new SharpKml.Dom.TimeSpan(); ts.Begin = starttime; ts.End = cs.datetime; pm.Time = ts; // setup for next line mode = cs.mode; starttime = cs.datetime; stylecolor = colours[c % (colours.Length - 1)]; Style style2 = new Style(); style2.Line = new LineStyle(new Color32(stylecolor), 4); pm.StyleSelector = style2; kml.AddFeature(pm); coords = new CoordinateCollection(); } coords.Add(new Vector(cs.lat, cs.lng, cs.alt)); SharpKml.Dom.Timestamp tstamp = new SharpKml.Dom.Timestamp(); tstamp.When = cs.datetime; FlyTo flyto = new FlyTo(); flyto.Duration = (cs.datetime - lasttime).TotalMilliseconds / 1000.0; flyto.Mode = FlyToMode.Smooth; SharpKml.Dom.Camera cam = new SharpKml.Dom.Camera(); cam.AltitudeMode = SharpKml.Dom.AltitudeMode.Absolute; cam.Latitude = cs.lat; cam.Longitude = cs.lng; cam.Altitude = cs.alt; cam.Heading = cs.yaw; cam.Roll = -cs.roll; cam.Tilt = (90 - (cs.pitch * -1)); cam.GXTimePrimitive = tstamp; flyto.View = cam; //if (Math.Abs(flyto.Duration.Value) > 0.1) { tourplaylist.AddTourPrimitive(flyto); lasttime = cs.datetime; } Placemark pmplane = new Placemark(); pmplane.Name = "Plane " + a; pmplane.Time = tstamp; pmplane.Visibility = false; SharpKml.Dom.Location loc = new SharpKml.Dom.Location(); loc.Latitude = cs.lat; loc.Longitude = cs.lng; loc.Altitude = cs.alt; SharpKml.Dom.Orientation ori = new SharpKml.Dom.Orientation(); ori.Heading = cs.yaw; ori.Roll = -cs.roll; ori.Tilt = -cs.pitch; SharpKml.Dom.Scale sca = new SharpKml.Dom.Scale(); sca.X = 2; sca.Y = 2; sca.Z = 2; Model model = new Model(); model.Location = loc; model.Orientation = ori; model.AltitudeMode = SharpKml.Dom.AltitudeMode.Absolute; model.Scale = sca; try { Description desc = new Description(); desc.Text = @"<![CDATA[ <table> <tr><td>Roll: " + model.Orientation.Roll + @" </td></tr> <tr><td>Pitch: " + model.Orientation.Tilt + @" </td></tr> <tr><td>Yaw: " + model.Orientation.Heading + @" </td></tr> </table> ]]>"; pmplane.Description = desc; } catch { } Link link = new Link(); link.Href = new Uri("block_plane_0.dae", UriKind.Relative); model.Link = link; pmplane.Geometry = model; planes.AddFeature(pmplane); a++; } tour.Playlist = tourplaylist; kml.AddFeature(tour); Serializer serializer = new Serializer(); serializer.Serialize(kml); //Console.WriteLine(serializer.Xml); StreamWriter sw = new StreamWriter(filename); sw.Write(serializer.Xml); sw.Close(); // create kmz - aka zip file FileStream fs = File.Open(filename.Replace(Path.GetExtension(filename), ".kmz"), FileMode.Create); ZipOutputStream zipStream = new ZipOutputStream(fs); zipStream.SetLevel(9); //0-9, 9 being the highest level of compression zipStream.UseZip64 = UseZip64.Off; // older zipfile // entry 1 string entryName = ZipEntry.CleanName(Path.GetFileName(filename)); // Removes drive from name and fixes slash direction ZipEntry newEntry = new ZipEntry(entryName); newEntry.DateTime = DateTime.Now; zipStream.PutNextEntry(newEntry); // Zip the file in buffered chunks // the "using" will close the stream even if an exception occurs byte[] buffer = new byte[4096]; using (FileStream streamReader = File.Open(filename,FileMode.Open,FileAccess.Read,FileShare.ReadWrite)) { StreamUtils.Copy(streamReader, zipStream, buffer); } zipStream.CloseEntry(); filename = Path.GetDirectoryName(Application.ExecutablePath) + Path.DirectorySeparatorChar + "block_plane_0.dae"; // entry 2 entryName = ZipEntry.CleanName(Path.GetFileName(filename)); // Removes drive from name and fixes slash direction newEntry = new ZipEntry(entryName); newEntry.DateTime = DateTime.Now; zipStream.PutNextEntry(newEntry); // Zip the file in buffered chunks // the "using" will close the stream even if an exception occurs buffer = new byte[4096]; using (FileStream streamReader = File.OpenRead(filename)) { StreamUtils.Copy(streamReader, zipStream, buffer); } zipStream.CloseEntry(); zipStream.IsStreamOwner = true; // Makes the Close also Close the underlying stream zipStream.Close(); File.Delete(filename); flightdata.Clear(); }
public void TestAttributes() { // Try the attributes first TestElement element = new TestElement(); element.Attribute = "attribute"; element.EnumAtt = ColorMode.Random; Serializer serializer = new Serializer(); serializer.Serialize(element); Assert.True(FindNode(serializer.Xml, "TestElementS", r => { Assert.That(r.GetAttribute("Attribute"), Is.EqualTo("attribute")); Assert.That(r.GetAttribute("EnumAtt"), Is.EqualTo("random")); })); // Try optional elements = make sure they're only serialized if they have a value element.Int = 42; serializer.Serialize(element); Assert.True(FindNode(serializer.Xml, "Int", r => Assert.That(r.ReadElementContentAsInt(), Is.EqualTo(42)))); Assert.False(FindNode(serializer.Xml, "OptionalInt", null)); element.OptionalInt = 0; serializer.Serialize(element); Assert.True(FindNode(serializer.Xml, "OptionalInt", r => Assert.That(r.ReadElementContentAsInt(), Is.EqualTo(0)))); }
public void TestSerialize() { const string Expected = "<kml xmlns:atom=\"http://www.w3.org/2005/Atom\" xmlns=\"http://www.opengis.net/kml/2.2\">" + "<Document>" + "<atom:author>" + "<atom:name>Name</atom:name>" + "</atom:author>" + "<atom:link href=\"http://www.example.com/\" />" + "</Document>" + "</kml>"; Document document = new Document(); document.AtomAuthor = new Author { Name = "Name" }; document.AtomLink = new SharpKml.Dom.Atom.Link { Href = new Uri("http://www.example.com") }; Kml root = new Kml(); root.AddNamespacePrefix(KmlNamespaces.AtomPrefix, KmlNamespaces.AtomNamespace); root.Feature = document; Serializer serializer = new Serializer(); serializer.SerializeRaw(root); Assert.That(serializer.Xml, Is.EqualTo(Expected)); }
public static void Run() { // Create the style first var style = new Style(); style.Id = "randomColorIcon"; style.Icon = new IconStyle(); style.Icon.Color = new Color32(255, 0, 255, 0); style.Icon.ColorMode = ColorMode.Random; style.Icon.Icon = new IconStyle.IconLink(new Uri("http://maps.google.com/mapfiles/kml/pal3/icon21.png")); style.Icon.Scale = 1.1; // Now create the object to apply the style to var placemark = new Placemark(); placemark.Name = "IconStyle.kml"; placemark.StyleUrl = new Uri("#randomColorIcon", UriKind.Relative); placemark.Geometry = new Point { Coordinate = new Vector(37.831145, -122.36868) }; // Package it all together... var document = new Document(); document.AddFeature(placemark); document.AddStyle(style); // And display the result var serializer = new Serializer(); serializer.Serialize(document); Console.WriteLine(serializer.Xml); }
public static void Run() { KmlFile file = Program.OpenFile("Enter a file to show the styles of:"); if (file == null) { return; } Console.WriteLine("Style names:"); // We're going to extend the first style later StyleSelector firstStyle = null; foreach (var style in file.Styles.OrderBy(s => s.Id)) // Use the Linq extension to order them by Id { if (firstStyle == null) { firstStyle = style; } Console.WriteLine(style.Id); } // If there was a style display it's Xml if (firstStyle != null) { Console.WriteLine("\nExpanding '{0}':", firstStyle.Id); Serializer serializer = new Serializer(); serializer.Serialize(firstStyle); Console.WriteLine(serializer.Xml); } }
public void TestSerialize() { ItemIcon item = new ItemIcon(); Serializer serializer = new Serializer(); // This shouldn't not produce a "state" element item.State = ItemIconStates.None; serializer.SerializeRaw(item); string xml = @"<ItemIcon xmlns=""http://www.opengis.net/kml/2.2"" />"; Assert.That(serializer.Xml, Is.EqualTo(xml)); // Try with more than one value item.State = ItemIconStates.Open | ItemIconStates.Error; serializer.SerializeRaw(item); xml = @"<ItemIcon xmlns=""http://www.opengis.net/kml/2.2""><state>open error</state></ItemIcon>"; Assert.That(serializer.Xml, Is.EqualTo(xml)); // Try with an invalid value item.State = (ItemIconStates)0x80; serializer.SerializeRaw(item); xml = @"<ItemIcon xmlns=""http://www.opengis.net/kml/2.2""><state /></ItemIcon>"; Assert.That(serializer.Xml, Is.EqualTo(xml)); }
public static void Run() { Console.WriteLine("Creating a point at 37.42052549 latitude and -122.0816695 longitude.\n"); // This will be used for the placemark Point point = new Point(); point.Coordinate = new Vector(37.42052549, -122.0816695); Placemark placemark = new Placemark(); placemark.Name = "Cool Statue"; placemark.Geometry = point; // This is the root element of the file Kml kml = new Kml(); kml.Feature = placemark; Serializer serializer = new Serializer(); serializer.Serialize(kml); Console.WriteLine(serializer.Xml); Console.WriteLine("\nReading Xml..."); Parser parser = new Parser(); parser.ParseString(serializer.Xml, true); kml = (Kml)parser.Root; placemark = (Placemark)kml.Feature; point = (Point)placemark.Geometry; Console.WriteLine("Latitude:{0} Longitude:{1}", point.Coordinate.Latitude, point.Coordinate.Longitude); }
public void SerializeShouldNotOutputAltitudeIfItIsNotSpecified() { var coords = new CoordinateCollection(new[] { new Vector(1, 2) }); var serializer = new Serializer(); serializer.SerializeRaw(coords); var expected = string.Format(CultureInfo.InvariantCulture, XmlFormat, "2,1"); Assert.That(serializer.Xml, Is.EqualTo(expected)); }
public static void CompareElements(Element expected, Element actual) { // To compare the Elements we're going to serialize them both // and compare the generated Xml. Serializer serializer = new Serializer(); serializer.Serialize(expected); string expectedXml = serializer.Xml; serializer.Serialize(actual); Assert.That(serializer.Xml, Is.EqualTo(expectedXml)); }
public void TestChild() { TestElement element = new TestElement(); element.Child = new ChildElement(); element.Child.Counter = 1; Serializer serializer = new Serializer(); serializer.Serialize(element); Assert.True(FindNode(serializer.Xml, "counter", r => Assert.That(r.ReadElementContentAsInt(), Is.EqualTo(1)))); }
public void TestSerialize() { TestClass element = new TestClass(); element.Att = "value"; element.Text = "<root><><x:child /></root>"; Serializer serializer = new Serializer(); serializer.SerializeRaw(element); const string xml = "<file att=\"value\" xmlns=\"http://example.com\"><![CDATA[<root><><x:child /></root>]]></file>"; Assert.That(serializer.Xml, Is.EqualTo(xml)); }
public void SerializeShouldCheckForNullArguments() { var serializer = new Serializer(); Assert.That(() => serializer.Serialize(null), Throws.InstanceOf<ArgumentNullException>()); Assert.That(() => serializer.Serialize(null, new MemoryStream()), Throws.InstanceOf<ArgumentNullException>()); Assert.That(() => serializer.Serialize(new Kml(), null), Throws.InstanceOf<ArgumentNullException>()); }
public static void Run() { KmlFile file = Program.OpenFile("Enter a file to inline the styles:"); if (file == null) { return; } var inlined = StyleResolver.InlineStyles(file.Root); var serializer = new Serializer(); serializer.Serialize(inlined); Console.WriteLine(serializer.Xml); }
public void TestCData() { var balloon = new BalloonStyle(); balloon.Text = "<![CDATA[$[description]]]>"; var serializer = new Serializer(); serializer.SerializeRaw(balloon); string expected = "<BalloonStyle xmlns=\"http://www.opengis.net/kml/2.2\">" + "<text>" + balloon.Text + "</text>" + "</BalloonStyle>"; Assert.That(serializer.Xml, Is.EqualTo(expected)); }
public void SerializeShouldUseTheDelimiterToSeparatePoints() { var coords = new CoordinateCollection(new [] { new Vector(1, 2, 3), new Vector(2, 1, 3) }); var serializer = new Serializer(); CoordinateCollection.Delimiter = " "; serializer.SerializeRaw(coords); CoordinateCollection.Delimiter = "\n"; // Reset to prove it worked during the call to serialize var expected = string.Format(CultureInfo.InvariantCulture, XmlFormat, "2,1,3 1,2,3"); Assert.That(serializer.Xml, Is.EqualTo(expected)); }
public static void Run() { // Create our Kml var folder = new Folder(); folder.Id = "f0"; folder.Name = "Folder 0"; var placemark = new Placemark(); placemark.Id = "pm0"; placemark.Name = "Placemark 0"; folder.AddFeature(placemark); placemark = new Placemark(); placemark.Id = "pm1"; placemark.Name = "Placemark 1"; folder.AddFeature(placemark); var kml = new Kml(); kml.Feature = folder; // Display to the user var serializer = new Serializer(); serializer.Serialize(kml); Console.WriteLine("Original Kml:\n" + serializer.Xml); // This is what we're going to change to placemark = new Placemark(); placemark.Geometry = new Point { Coordinate = new Vector(38, -120) }; placemark.Name = "new name"; placemark.TargetId = "pm0"; var update = new Update(); update.AddUpdate(new ChangeCollection() { placemark }); serializer.Serialize(update); Console.WriteLine("\nUpdate:\n" + serializer.Xml); // Run the update var file = KmlFile.Create(kml, false); update.Process(file); serializer.Serialize(kml); Console.WriteLine("\nUpdated Kml:\n" + serializer.Xml); }
/// <summary> /// Gerador de Kml /// </summary> /// <param name="pLinhaDados"></param> /// <param name="pTipoDados"></param> /// <param name="pNome"></param> /// <param name="pNumOcorrencia"></param> public void GerarKml(string pLinhaDados, eTipoDadoGeografico pTipoDados, string pNome, int pNumOcorrencia) { Placemark placemark = new Placemark(); placemark.Name = pNome; string sCor = ""; if (pNumOcorrencia >= 20) sCor = "ff0000ff"; else if (pNumOcorrencia >= 10) sCor = "ff8080ff"; else if (pNumOcorrencia >= 5) sCor = "ffc0c0ff"; else if (pNumOcorrencia >= 0) sCor = "ffffffff"; StringBuilder sbStilo = new StringBuilder(); sbStilo.AppendLine("<color>"); sbStilo.AppendLine(sCor); sbStilo.AppendLine("</color>"); string sXml = ""; // This is the root element of the file Kml kml = new Kml(); kml.Feature = placemark; Serializer serializer = new Serializer(); serializer.Serialize(kml); int iIndiceStilo = serializer.Xml.LastIndexOf("<Placemark>") + 11; sXml = serializer.Xml.Insert(iIndiceStilo, sbStilo.ToString()); int iIndiceInicial = sXml.LastIndexOf("</name>") + 8; sXml = sXml.Insert(iIndiceInicial, pLinhaDados); string caminho = @"C:\Users\" + Environment.UserName + @"\Desktop\ArquivoKml" + DateTime.Now.ToString().Replace("/", "-").Replace(":", ".") + ".kml"; StreamWriter arquivo = new StreamWriter(caminho); arquivo.WriteLine(sXml); arquivo.Close(); //MessageBox.Show("Arquivo Gravado em " + caminho + " com sucesso"); }
public void TestSerialize() { // This needs to be in this order const string TestKml = "<LatLonAltBox xmlns=\"http://www.opengis.net/kml/2.2\">" + "<north>2.5</north>" + "<west>0</west>" + "<minAltitude>101.101</minAltitude>" + "<altitudeMode>absolute</altitudeMode>" + "</LatLonAltBox>"; Parser parser = new Parser(); parser.ParseString(TestKml, true); Assert.That(parser.Root, Is.Not.Null); LatLonAltBox box = parser.Root as LatLonAltBox; Assert.That(box, Is.Not.Null); // Check it was parsed ok Assert.That(box.North, Is.EqualTo(2.5)); Assert.That(box.South, Is.Null); Assert.That(box.East, Is.Null); Assert.That(box.West, Is.EqualTo(0)); Assert.That(box.MinimumAltitude, Is.EqualTo(101.101)); Assert.That(box.MaximumAltitude, Is.Null); Assert.That(box.GXAltitudeMode, Is.Null); Assert.That(box.AltitudeMode, Is.EqualTo(AltitudeMode.Absolute)); Serializer serializer = new Serializer(); serializer.SerializeRaw(box); Assert.That(serializer.Xml, Is.EqualTo(TestKml)); }
static void exportKml(string filename, string outputFile) { Document kml = new Document(); FileChannel ch = new FileChannel(filename); UAVObjectManager mgr = new UAVObjectManager(); UAVObjectsInitialize.register(mgr); UavTalk.UavTalkProto tlk = new UavTalkProto(ch, mgr); mgr.getObject<GPSPositionSensor>().onUpdated += new EventHandler(GpsPositionReceived); mgr.getObject<PositionState>().onUpdated += new EventHandler(GpsPositionReceived); ch.open(); while (ch.isRunning) Thread.Sleep(50); LineString ls = new LineString(); ls.AltitudeMode = SharpKml.Dom.AltitudeMode.Absolute; ls.Extrude = true; ls.Coordinates = coords; Placemark pm = new Placemark(); pm.Name = "Flight Path "; //pm.StyleUrl = new Uri("#yellowLineGreenPoly", UriKind.Relative); pm.Geometry = ls; kml.AddFeature(pm); Serializer serializer = new Serializer(); serializer.Serialize(kml); StreamWriter sw = new StreamWriter(outputFile); sw.Write(serializer.Xml); sw.Close(); }
public void dowork(string logFile, string dirWithImages, float offsetseconds, bool dooffset) { DateTime localmin = DateTime.MaxValue; DateTime localmax = DateTime.MinValue; DateTime startTime = DateTime.MinValue; photocoords = new Hashtable(); timecoordcache = new Hashtable(); imagetotime = new Hashtable(); //logFile = @"C:\Users\hog\Pictures\farm 1-10-2011\100SSCAM\2011-10-01 11-48 1.log"; TXT_outputlog.AppendText("Read Log\n"); List<string[]> list = readLog(logFile); TXT_outputlog.AppendText("Log Read\n"); //dirWithImages = @"C:\Users\hog\Pictures\farm 1-10-2011\100SSCAM"; TXT_outputlog.AppendText("Read images\n"); string[] files = Directory.GetFiles(dirWithImages); TXT_outputlog.AppendText("images read\n"); Document kml = new Document(); using (StreamWriter swlogloccsv = new StreamWriter(dirWithImages + Path.DirectorySeparatorChar + "loglocation.csv")) using (StreamWriter swlockml = new StreamWriter(dirWithImages + Path.DirectorySeparatorChar + "location.kml")) using (StreamWriter swloctxt = new StreamWriter(dirWithImages + Path.DirectorySeparatorChar + "location.txt")) using (StreamWriter swloctel = new StreamWriter(dirWithImages + Path.DirectorySeparatorChar + "location.tel")) { swloctel.WriteLine("version=1"); swloctel.WriteLine("#seconds offset - " + TXT_offsetseconds.Text); swloctel.WriteLine("#longitude and latitude - in degrees"); swloctel.WriteLine("#name utc longitude latitude height"); swloctxt.WriteLine("#name longitude/X latitude/Y height/Z yaw pitch roll"); swloctxt.WriteLine("#seconds_offset: " + TXT_offsetseconds.Text); int first = 0; int matchs = 0; int lastmatchindex = 0; TXT_outputlog.AppendText("start Processing\n"); foreach (string filename in files) { if (filename.ToLower().EndsWith(".jpg") && !filename.ToLower().Contains("_geotag")) { DateTime photodt = getPhotoTime(filename); // get log min and max time if (startTime == DateTime.MinValue) { startTime = new DateTime(photodt.Year, photodt.Month, photodt.Day, 0, 0, 0, 0, DateTimeKind.Utc).ToLocalTime(); foreach (string[] arr in list) { DateTime crap = startTime.AddMilliseconds(int.Parse(arr[timepos])).AddSeconds(offsetseconds); if (localmin > crap) localmin = crap; if (localmax < crap) localmax = crap; } log.InfoFormat("min " + localmin + " max " + localmax); TXT_outputlog.AppendText("Log min " + localmin + " max " + localmax + "\r\n"); } TXT_outputlog.AppendText("Photo " + Path.GetFileNameWithoutExtension(filename) + " time " + photodt + "\r\n"); //Application.DoEvents(); int a = 0; foreach (string[] arr in list) { a++; if (lastmatchindex > (a)) continue; if (a % 1000 == 0) Application.DoEvents(); DateTime logdt = startTime.AddMilliseconds(int.Parse(arr[timepos])).AddSeconds(offsetseconds); if (first == 0) { TXT_outputlog.AppendText("Photo " + Path.GetFileNameWithoutExtension(filename) + " " + photodt + " vs Log " + logdt + "\r\n"); TXT_outputlog.AppendText("offset should be about " + (photodt - logdt).TotalSeconds + "\r\n"); if (dooffset) { swlockml.Close(); swloctel.Close(); swloctxt.Close(); swlogloccsv.Close(); return; } first++; } // time has past, logs are in time order if (photodt < logdt.AddSeconds(-1)) { lastmatchindex = a; break; } //Console.Write("ph " + dt + " log " + crap + " \r"); timecoordcache[(long)(logdt.AddSeconds(-offsetseconds) - DateTime.MinValue).TotalSeconds] = new double[] { double.Parse(arr[latpos]), double.Parse(arr[lngpos]), double.Parse(arr[altpos]) }; swlogloccsv.WriteLine("ph " + filename + " " + photodt + " log " + logdt); if (photodt.ToString("yyyy-MM-ddTHH:mm:ss") == logdt.ToString("yyyy-MM-ddTHH:mm:ss")) { lastmatchindex = a; TXT_outputlog.AppendText("MATCH Photo " + Path.GetFileNameWithoutExtension(filename) + " " + photodt + "\r\n"); matchs++; // int fixme; // if (matchs > 50) // break; ; SharpKml.Dom.Timestamp tstamp = new SharpKml.Dom.Timestamp(); tstamp.When = photodt; kml.AddFeature( new Placemark() { Time = tstamp, Name = Path.GetFileNameWithoutExtension(filename), Geometry = new SharpKml.Dom.Point() { Coordinate = new Vector(double.Parse(arr[latpos]), double.Parse(arr[lngpos]), double.Parse(arr[altpos])) }, Description = new Description() { Text = "<table><tr><td><img src=\"" + Path.GetFileName(filename).ToLower() + "\" width=500 /></td></tr></table>" }, StyleSelector = new Style() { Balloon = new BalloonStyle() { Text = "$[name]<br>$[description]" } } } ); double lat = double.Parse(arr[latpos]); double lng = double.Parse(arr[lngpos]); double alpha = 0; if (arr.Length > yawATT) { alpha = ((double.Parse(arr[yawATT]) / 100.0) + 180) + (double)num_camerarotation.Value; } else { alpha = double.Parse(arr[cogpos]) + (double)num_camerarotation.Value; } RectangleF rect = getboundingbox(lat, lng, alpha, (double)num_hfov.Value, (double)num_vfov.Value); Console.WriteLine(rect); //http://en.wikipedia.org/wiki/World_file /* using (StreamWriter swjpw = new StreamWriter(dirWithImages + Path.DirectorySeparatorChar + Path.GetFileNameWithoutExtension(filename) + ".jgw")) { swjpw.WriteLine((rect.Height / 2448.0).ToString("0.00000000000000000")); swjpw.WriteLine((0).ToString("0.00000000000000000")); // swjpw.WriteLine((0).ToString("0.00000000000000000")); // swjpw.WriteLine((rect.Width / -3264.0).ToString("0.00000000000000000")); // distance per pixel swjpw.WriteLine((rect.Left).ToString("0.00000000000000000")); swjpw.WriteLine((rect.Top).ToString("0.00000000000000000")); swjpw.Close(); }*/ kml.AddFeature( new GroundOverlay() { Name = Path.GetFileNameWithoutExtension(filename), Visibility = false, Time = tstamp, AltitudeMode = AltitudeMode.ClampToGround, Bounds = new LatLonBox() { Rotation = -alpha % 360, North = rect.Bottom, East = rect.Right, West = rect.Left, South = rect.Top, }, Icon = new SharpKml.Dom.Icon() { Href = new Uri(Path.GetFileName(filename).ToLower(), UriKind.Relative), }, } ); photocoords[filename] = new double[] { double.Parse(arr[latpos]), double.Parse(arr[lngpos]), double.Parse(arr[altpos]), double.Parse(arr[cogpos]) }; imagetotime[filename] = (long)(logdt.AddSeconds(-offsetseconds) - DateTime.MinValue).TotalSeconds; if (arr.Length > yawATT) { swloctxt.WriteLine(Path.GetFileName(filename) + " " + arr[lngpos] + " " + arr[latpos] + " " + arr[altpos] + " " + ((double.Parse(arr[yawATT]) / 100.0) + 180) % 360 + " " + ((double.Parse(arr[pitchATT]) / 100.0)) + " " + (-double.Parse(arr[rollATT]) / 100.0)); } else { swloctxt.WriteLine(Path.GetFileName(filename) + " " + arr[lngpos] + " " + arr[latpos] + " " + arr[altpos]); } swloctel.WriteLine(Path.GetFileName(filename) + "\t" + logdt.ToString("yyyy:MM:dd HH:mm:ss") + "\t" + arr[lngpos] + "\t" + arr[latpos] + "\t" + arr[altpos]); swloctel.Flush(); swloctxt.Flush(); log.InfoFormat(Path.GetFileName(filename) + " " + arr[lngpos] + " " + arr[latpos] + " " + arr[altpos] + " "); break; } //Console.WriteLine(crap); } } } Serializer serializer = new Serializer(); serializer.Serialize(kml); swlockml.Write(serializer.Xml); swlockml.Close(); Utilities.httpserver.georefkml = serializer.Xml; Utilities.httpserver.georefimagepath = dirWithImages + Path.DirectorySeparatorChar; writeGPX(dirWithImages + Path.DirectorySeparatorChar + "location.gpx"); swlogloccsv.Close(); swloctxt.Close(); swloctel.Close(); TXT_outputlog.AppendText("Done " + matchs + " matchs"); } }
public void dowork(string logFile, string dirWithImages, float offsetseconds, bool dooffset) { timepos = (int)NUM_time.Value; latpos = (int)NUM_latpos.Value; lngpos = (int)NUM_lngpos.Value; altpos = (int)NUM_altpos.Value; cogpos = (int)NUM_headingpos.Value; DateTime localmin = DateTime.MaxValue; DateTime localmax = DateTime.MinValue; DateTime startTime = DateTime.MinValue; recordno = 10; photostnrecord = new List<int>(); photocoords = new Hashtable(); timecoordcache = new Hashtable(); imagetotime = new Hashtable(); //logFile = @"C:\Users\hog\Pictures\farm 1-10-2011\100SSCAM\2011-10-01 11-48 1.log"; TXT_outputlog.AppendText("Read Log\n"); List<string[]> list = readLog(logFile); TXT_outputlog.AppendText("Log Read\n"); //dirWithImages = @"C:\Users\hog\Pictures\farm 1-10-2011\100SSCAM"; TXT_outputlog.AppendText("Read images\n"); string[] files = Directory.GetFiles(dirWithImages); TXT_outputlog.AppendText("images read\n"); Document kml = new Document(); using (StreamWriter swlogloccsv = new StreamWriter(dirWithImages + Path.DirectorySeparatorChar + "loglocation.csv")) using (StreamWriter swlockml = new StreamWriter(dirWithImages + Path.DirectorySeparatorChar + "location.kml")) using (StreamWriter swloctxt = new StreamWriter(dirWithImages + Path.DirectorySeparatorChar + "location.txt")) using (StreamWriter swloctel = new StreamWriter(dirWithImages + Path.DirectorySeparatorChar + "location.tel")) using (XmlTextWriter swloctrim = new XmlTextWriter(dirWithImages + Path.DirectorySeparatorChar + "location.jxl",Encoding.ASCII)) { swloctrim.Formatting = Formatting.Indented; swloctrim.WriteStartDocument(false); swloctrim.WriteStartElement("JOBFile"); swloctrim.WriteAttributeString("jobName", "MPGeoRef"); swloctrim.WriteAttributeString("product", "Gatewing"); swloctrim.WriteAttributeString("productVersion", "1.0"); swloctrim.WriteAttributeString("version", "5.6"); // enviro swloctrim.WriteStartElement("Environment"); swloctrim.WriteStartElement("CoordinateSystem"); swloctrim.WriteElementString("SystemName", "Default"); swloctrim.WriteElementString("ZoneName", "Default"); swloctrim.WriteElementString("DatumName", "WGS 1984"); swloctrim.WriteStartElement("Ellipsoid"); swloctrim.WriteElementString("EarthRadius", "6378137"); swloctrim.WriteElementString("Flattening", "0.00335281067183"); swloctrim.WriteEndElement(); swloctrim.WriteStartElement("Projection"); swloctrim.WriteElementString("Type", "NoProjection"); swloctrim.WriteElementString("Scale", "1"); swloctrim.WriteElementString("GridOrientation", "IncreasingNorthEast"); swloctrim.WriteElementString("SouthAzimuth", "false"); swloctrim.WriteElementString("ApplySeaLevelCorrection", "true"); swloctrim.WriteEndElement(); swloctrim.WriteStartElement("LocalSite"); swloctrim.WriteElementString("Type", "Grid"); swloctrim.WriteElementString("ProjectLocationLatitude", ""); swloctrim.WriteElementString("ProjectLocationLongitude", ""); swloctrim.WriteElementString("ProjectLocationHeight", ""); swloctrim.WriteEndElement(); swloctrim.WriteStartElement("Datum"); swloctrim.WriteElementString("Type", "ThreeParameter"); swloctrim.WriteElementString("GridName", "WGS 1984"); swloctrim.WriteElementString("Direction", "WGS84ToLocal"); swloctrim.WriteElementString("EarthRadius", "6378137"); swloctrim.WriteElementString("Flattening", "0.00335281067183"); swloctrim.WriteElementString("TranslationX", "0"); swloctrim.WriteElementString("TranslationY", "0"); swloctrim.WriteElementString("TranslationZ", "0"); swloctrim.WriteEndElement(); swloctrim.WriteStartElement("HorizontalAdjustment"); swloctrim.WriteElementString("Type", "NoAdjustment"); swloctrim.WriteEndElement(); swloctrim.WriteStartElement("VerticalAdjustment"); swloctrim.WriteElementString("Type", "NoAdjustment"); swloctrim.WriteEndElement(); swloctrim.WriteStartElement("CombinedScaleFactor"); swloctrim.WriteStartElement("Location"); swloctrim.WriteElementString("Latitude", ""); swloctrim.WriteElementString("Longitude", ""); swloctrim.WriteElementString("Height", ""); swloctrim.WriteEndElement(); swloctrim.WriteElementString("Scale", ""); swloctrim.WriteEndElement(); swloctrim.WriteEndElement(); swloctrim.WriteEndElement(); // fieldbook swloctrim.WriteStartElement("FieldBook"); swloctrim.WriteRaw(@" <CameraDesignRecord ID='00000001'> <Type>GoPro </Type> <HeightPixels>2400</HeightPixels> <WidthPixels>3200</WidthPixels> <PixelSize>0.0000022</PixelSize> <LensModel>Rectilinear</LensModel> <NominalFocalLength>0.002</NominalFocalLength> </CameraDesignRecord> <CameraRecord2 ID='00000002'> <CameraDesignID>00000001</CameraDesignID> <CameraPosition>01</CameraPosition> <Optics> <IdealAngularMagnification>1.0</IdealAngularMagnification> <AngleSymmetricDistortion> <Order3>-0.35</Order3> <Order5>0.15</Order5> <Order7>-0.033</Order7> <Order9> 0</Order9> </AngleSymmetricDistortion> <AngleDecenteringDistortion> <Column>0</Column> <Row>0</Row> </AngleDecenteringDistortion> </Optics> <Geometry> <PerspectiveCenterPixels> <PrincipalPointColumn>-1615.5</PrincipalPointColumn> <PrincipalPointRow>-1187.5</PrincipalPointRow> <PrincipalDistance>-2102</PrincipalDistance> </PerspectiveCenterPixels> <VectorOffset> <X>0</X> <Y>0</Y> <Z>0</Z> </VectorOffset> <BiVectorAngle> <XX>0</XX> <YY>0</YY> <ZZ>-1.5707963268</ZZ> </BiVectorAngle> </Geometry> </CameraRecord2>"); // 2mm fl // res 2400 * 3200 = 7,680,000 // sensor size = 1/2.5" - 5.70 × 4.28 mm // 2.2 μm // fl in pixels = fl in mm * res / sensor size swloctrim.WriteStartElement("PhotoInstrumentRecord"); swloctrim.WriteAttributeString("ID", "0000000E"); swloctrim.WriteElementString("Type", "Aerial"); swloctrim.WriteElementString("Model", "X100"); swloctrim.WriteElementString("Serial", "000-000"); swloctrim.WriteElementString("FirmwareVersion", "v0.0"); swloctrim.WriteElementString("UserDefinedName", "Prototype"); swloctrim.WriteEndElement(); swloctrim.WriteStartElement("AtmosphereRecord"); swloctrim.WriteAttributeString("ID", "0000000F"); swloctrim.WriteElementString("Pressure", ""); swloctrim.WriteElementString("Temperature", ""); swloctrim.WriteElementString("PPM", ""); swloctrim.WriteElementString("ApplyEarthCurvatureCorrection", "false"); swloctrim.WriteElementString("ApplyRefractionCorrection", "false"); swloctrim.WriteElementString("RefractionCoefficient", "0"); swloctrim.WriteElementString("PressureInputMethod", "ReadFromInstrument"); swloctrim.WriteEndElement(); swloctel.WriteLine("version=1"); swloctel.WriteLine("#seconds offset - " + TXT_offsetseconds.Text); swloctel.WriteLine("#longitude and latitude - in degrees"); swloctel.WriteLine("#name utc longitude latitude height"); swloctxt.WriteLine("#name longitude/X latitude/Y height/Z yaw pitch roll"); swloctxt.WriteLine("#seconds_offset: " + TXT_offsetseconds.Text); int first = 0; int matchs = 0; int lastmatchindex = 0; TXT_outputlog.AppendText("start Processing\n"); foreach (string filename in files) { if (filename.ToLower().EndsWith(".jpg") && !filename.ToLower().Contains("_geotag")) { DateTime photodt = getPhotoTime(filename); // get log min and max time if (startTime == DateTime.MinValue) { startTime = new DateTime(photodt.Year, photodt.Month, photodt.Day, 0, 0, 0, 0, DateTimeKind.Utc).ToLocalTime(); foreach (string[] arr in list) { DateTime crap = startTime.AddMilliseconds(int.Parse(arr[timepos])).AddSeconds(offsetseconds); if (localmin > crap) localmin = crap; if (localmax < crap) localmax = crap; } log.InfoFormat("min " + localmin + " max " + localmax); TXT_outputlog.AppendText("Log min " + localmin + " max " + localmax + "\r\n"); } TXT_outputlog.AppendText("Photo " + Path.GetFileNameWithoutExtension(filename) + " time " + photodt + "\r\n"); //Application.DoEvents(); int a = 0; foreach (string[] arr in list) { a++; if (lastmatchindex > (a)) continue; if (a % 1000 == 0) Application.DoEvents(); DateTime logdt = startTime.AddMilliseconds(int.Parse(arr[timepos])).AddSeconds(offsetseconds); if (first == 0) { TXT_outputlog.AppendText("Photo " + Path.GetFileNameWithoutExtension(filename) + " " + photodt + " vs Log " + logdt + "\r\n"); TXT_outputlog.AppendText("offset should be about " + (photodt - logdt).TotalSeconds + "\r\n"); if (dooffset) { return; } first++; } // time has past, logs are in time order if (photodt < logdt.AddSeconds(-1)) { lastmatchindex = a; break; } //Console.Write("ph " + dt + " log " + crap + " \r"); timecoordcache[(long)(logdt.AddSeconds(-offsetseconds) - DateTime.MinValue).TotalSeconds] = new double[] { double.Parse(arr[latpos]), double.Parse(arr[lngpos]), double.Parse(arr[altpos]) }; swlogloccsv.WriteLine("ph " + filename + " " + photodt + " log " + logdt); if (photodt.ToString("yyyy-MM-ddTHH:mm:ss") == logdt.ToString("yyyy-MM-ddTHH:mm:ss")) { lastmatchindex = a; TXT_outputlog.AppendText("MATCH Photo " + Path.GetFileNameWithoutExtension(filename) + " " + photodt + "\r\n"); matchs++; // int fixme; // if (matchs < 150 || matchs > 170) // break; ; SharpKml.Dom.Timestamp tstamp = new SharpKml.Dom.Timestamp(); tstamp.When = photodt; kml.AddFeature( new Placemark() { Time = tstamp, Name = Path.GetFileNameWithoutExtension(filename), Geometry = new SharpKml.Dom.Point() { Coordinate = new Vector(double.Parse(arr[latpos]), double.Parse(arr[lngpos]), double.Parse(arr[altpos])) }, Description = new Description() { Text = "<table><tr><td><img src=\"" + Path.GetFileName(filename).ToLower() + "\" width=500 /></td></tr></table>" }, StyleSelector = new Style() { Balloon = new BalloonStyle() { Text = "$[name]<br>$[description]" } } } ); double lat = double.Parse(arr[latpos]); double lng = double.Parse(arr[lngpos]); double alpha = 0; if (arr.Length > yawATT) { alpha = ((double.Parse(arr[yawATT]) / 100.0) + 180) + (double)num_camerarotation.Value; } else { alpha = double.Parse(arr[cogpos]) + (double)num_camerarotation.Value; } RectangleF rect = getboundingbox(lat, lng, alpha, (double)num_hfov.Value, (double)num_vfov.Value); Console.WriteLine(rect); //http://en.wikipedia.org/wiki/World_file /* using (StreamWriter swjpw = new StreamWriter(dirWithImages + Path.DirectorySeparatorChar + Path.GetFileNameWithoutExtension(filename) + ".jgw")) { swjpw.WriteLine((rect.Height / 2448.0).ToString("0.00000000000000000")); swjpw.WriteLine((0).ToString("0.00000000000000000")); // swjpw.WriteLine((0).ToString("0.00000000000000000")); // swjpw.WriteLine((rect.Width / -3264.0).ToString("0.00000000000000000")); // distance per pixel swjpw.WriteLine((rect.Left).ToString("0.00000000000000000")); swjpw.WriteLine((rect.Top).ToString("0.00000000000000000")); swjpw.Close(); }*/ kml.AddFeature( new GroundOverlay() { Name = Path.GetFileNameWithoutExtension(filename), Visibility = false, Time = tstamp, AltitudeMode = AltitudeMode.ClampToGround, Bounds = new LatLonBox() { Rotation = -alpha % 360, North = rect.Bottom, East = rect.Right, West = rect.Left, South = rect.Top, }, Icon = new SharpKml.Dom.Icon() { Href = new Uri(Path.GetFileName(filename).ToLower(), UriKind.Relative), }, } ); photocoords[filename] = new double[] { double.Parse(arr[latpos]), double.Parse(arr[lngpos]), double.Parse(arr[altpos]), double.Parse(arr[cogpos]) }; imagetotime[filename] = (long)(logdt.AddSeconds(-offsetseconds) - DateTime.MinValue).TotalSeconds; if (arr.Length > yawATT) { swloctxt.WriteLine(Path.GetFileName(filename) + " " + arr[lngpos] + " " + arr[latpos] + " " + arr[altpos] + " " + ((double.Parse(arr[yawATT]) / 100.0) + 180) % 360 + " " + ((double.Parse(arr[pitchATT]) / 100.0)) + " " + (-double.Parse(arr[rollATT]) / 100.0)); } else { swloctxt.WriteLine(Path.GetFileName(filename) + " " + arr[lngpos] + " " + arr[latpos] + " " + arr[altpos]); } swloctel.WriteLine(Path.GetFileName(filename) + "\t" + logdt.ToString("yyyy:MM:dd HH:mm:ss") + "\t" + arr[lngpos] + "\t" + arr[latpos] + "\t" + arr[altpos]); swloctel.Flush(); swloctxt.Flush(); GenPhotoStationRecord(swloctrim, filename, double.Parse(arr[latpos]), double.Parse(arr[lngpos]), double.Parse(arr[altpos]), 0, 0, double.Parse(arr[cogpos]), 3200, 2400); log.InfoFormat(Path.GetFileName(filename) + " " + arr[lngpos] + " " + arr[latpos] + " " + arr[altpos] + " "); break; } //Console.WriteLine(crap); } } } Serializer serializer = new Serializer(); serializer.Serialize(kml); swlockml.Write(serializer.Xml); Utilities.httpserver.georefkml = serializer.Xml; Utilities.httpserver.georefimagepath = dirWithImages + Path.DirectorySeparatorChar; writeGPX(dirWithImages + Path.DirectorySeparatorChar + "location.gpx"); // flightmission GenFlightMission(swloctrim); swloctrim.WriteEndElement(); // fieldbook swloctrim.WriteEndElement(); // job swloctrim.WriteEndDocument(); TXT_outputlog.AppendText("Done " + matchs + " matchs"); } }
public string GetKml() { var matchId = _currentMatchProvider.GetMatchId(); SharpKml.Dom.Kml kml = new SharpKml.Dom.Kml(); var document = new Document(); kml.Feature = document; var c = System.Drawing.ColorTranslator.FromHtml("#33FF33"); var postStyle = new Style(); postStyle.Id = "post_vanlig"; postStyle.Icon = new IconStyle { Color = new Color32(c.A, c.R, c.G, c.B), Icon = new IconStyle.IconLink(new Uri("http://maps.google.com/mapfiles/kml/paddle/wht-blank.png")), Scale = 0.5 }; document.AddStyle(postStyle); var lagFolder = new Folder { Name = "Lag" }; var postFolder = new Folder { Name = "Poster" }; document.AddFeature(lagFolder); document.AddFeature(postFolder); using (var context = _dataContextFactory.Create()) { var match = context.Matcher.Single(x => x.MatchId == matchId); var maxLat = match.GeoboxNWLatitude.GetValueOrDefault(); var minLat = match.GeoboxSELatitude.GetValueOrDefault(); var minLon = match.GeoboxNWLongitude.GetValueOrDefault(); var maxLon = match.GeoboxSELongitude.GetValueOrDefault(); var poster = (from pim in context.PosterIMatch where pim.Match.MatchId == matchId select new { pim.SynligFraTid, pim.SynligTilTid, pim.Post.Navn, pim.Post.Latitude, pim.Post.Longitude }).ToList(); foreach (var p in poster) { var placemark = new Placemark(); placemark.StyleUrl = new Uri("#post_vanlig", UriKind.Relative); placemark.Time = new TimeSpan { Begin = p.SynligFraTid, End = p.SynligTilTid }; placemark.Name = p.Navn; placemark.Geometry = new Point { Coordinate = new Vector(p.Latitude, p.Longitude) }; postFolder.AddFeature(placemark); } var lag = context.Lag.ToList(); var lagDictionary = new Dictionary<string, Folder>(); foreach (var lag1 in lag) { var color = System.Drawing.ColorTranslator.FromHtml("#" + lag1.Farge); var style = new Style(); style.Id = LagStyleKey(lag1.LagId); style.Icon = new IconStyle { Color = new Color32(color.A, color.R, color.G, color.B), Icon = new IconStyle.IconLink(new Uri("http://maps.google.com/mapfiles/kml/paddle/wht-blank-lv.png")), Scale = 0.3 }; document.AddStyle(style); var folder = new Folder { Name = lag1.Navn }; lagDictionary.Add(lag1.LagId, folder); lagFolder.AddFeature(folder); } var førsteRegistering = (from r in context.PostRegisteringer select r.RegistertTidspunkt).Min().AddMinutes(-5); var avsluttet = (from r in poster select r.SynligTilTid).Min().AddMinutes(5); var deltakerPosisjoner = (from p in context.DeltakerPosisjoner join d in context.Deltakere on p.DeltakerId equals d.DeltakerId where førsteRegistering < p.Tidspunkt && p.Tidspunkt < avsluttet select new { p.Latitude, p.Longitude, p.DeltakerId, d.Navn, d.Lag.Farge, d.Lag.LagId, p.Tidspunkt }).GroupBy(x => x.DeltakerId).ToDictionary(x => x.Key, y => y); foreach (var deltaker in deltakerPosisjoner) { //if (deltaker.Key != "MS_3-2") // continue; var førstePosisjon = deltaker.Value.FirstOrDefault(); var placemark = new Placemark(); placemark.StyleUrl = new Uri("#" + LagStyleKey(førstePosisjon.LagId), UriKind.Relative); placemark.Name = førstePosisjon.Navn; var posisjoner = deltaker.Value.OrderBy(x => x.Tidspunkt).ToList(); var track = new Track(); var forrigePosisjon = førstePosisjon; foreach (var pos in posisjoner) { // Utafor boksen if (pos.Latitude > maxLat || pos.Latitude < minLat || pos.Longitude > maxLon || pos.Longitude < minLon) { continue; } var meter = DistanseKalkulator.MeterMellom(forrigePosisjon.Latitude, forrigePosisjon.Longitude, pos.Latitude, pos.Longitude); var sekunder = pos.Tidspunkt.Subtract(forrigePosisjon.Tidspunkt).TotalSeconds; if (sekunder > 0) { var fart = meter / sekunder; if (fart > 8.333) // raskere enn 12 blank på 100m { continue; } } track.AddWhen(pos.Tidspunkt); track.AddCoordinate(new Vector(pos.Latitude, pos.Longitude)); forrigePosisjon = pos; } placemark.Geometry = track; lagDictionary[førstePosisjon.LagId].AddFeature(placemark); } } Serializer serializer = new Serializer(); serializer.Serialize(kml); return serializer.Xml; }
public void DoAcceptTcpClientCallback(IAsyncResult ar) { // Get the listener that handles the client request. TcpListener listener = (TcpListener) ar.AsyncState; // End the operation and display the received data on // the console. using ( TcpClient client = listener.EndAcceptTcpClient(ar)) { // Signal the calling thread to continue. tcpClientConnected.Set(); try { // Get a stream object for reading and writing log.Info("Accepted Client " + client.Client.RemoteEndPoint.ToString()); //client.SendBufferSize = 100 * 1024; // 100kb //client.LingerState.Enabled = true; //client.NoDelay = true; // makesure we have valid image GCSViews.FlightData.myhud.streamjpgenable = true; NetworkStream stream = client.GetStream(); // 5 seconds - default for httpd 2.2+ stream.ReadTimeout = 5000; goto skipagain; again: log.Info("doing Again"); skipagain: var asciiEncoding = new ASCIIEncoding(); var request = new byte[1024*4]; int len = 0; // handle header try { len = stream.Read(request, 0, request.Length); } catch { return; } string head = System.Text.Encoding.ASCII.GetString(request, 0, len); log.Info(head); int index = head.IndexOf('\n'); string url = head.Substring(0, index - 1); //url = url.Replace("\r", ""); //url = url.Replace("GET ",""); //url = url.Replace(" HTTP/1.0", ""); //url = url.Replace(" HTTP/1.1", ""); Tracking.AddEvent("HTTPServer", "Get", url, ""); ///////////////////////////////////////////////////////////////// if (url.Contains("websocket")) { using (var writer = new StreamWriter(stream, Encoding.Default)) { writer.WriteLine("HTTP/1.1 101 WebSocket Protocol Handshake"); writer.WriteLine("Upgrade: WebSocket"); writer.WriteLine("Connection: Upgrade"); writer.WriteLine("WebSocket-Location: ws://localhost:56781/websocket/server"); int start = head.IndexOf("Sec-WebSocket-Key:") + 19; int end = head.IndexOf('\r', start); if (end == -1) end = head.IndexOf('\n', start); string accept = ComputeWebSocketHandshakeSecurityHash09(head.Substring(start, end - start)); writer.WriteLine("Sec-WebSocket-Accept: " + accept); writer.WriteLine("Server: Mission Planner"); writer.WriteLine(""); writer.Flush(); while (client.Connected) { Thread.Sleep(200); log.Debug(stream.DataAvailable + " " + client.Available); while (client.Available > 0) { Console.Write(stream.ReadByte()); } byte[] packet = new byte[1024]; string sendme = MainV2.comPort.MAV.cs.roll + "," + MainV2.comPort.MAV.cs.pitch + "," + MainV2.comPort.MAV.cs.yaw + "," + MainV2.comPort.MAV.cs.lat + "," + MainV2.comPort.MAV.cs.lng + "," + MainV2.comPort.MAV.cs.alt; packet[0] = 0x81; // fin - binary packet[1] = (byte) sendme.Length; int i = 2; foreach (char ch in sendme) { packet[i++] = (byte) ch; } stream.Write(packet, 0, i); //break; } } } ///////////////////////////////////////////////////////////////// else if (url.Contains("georefnetwork.kml")) { byte[] buffer = Encoding.ASCII.GetBytes(georefkml); string header = "HTTP/1.1 200 OK\r\nServer: here\r\nKeep-Alive: timeout=15, max=100\r\nConnection: Keep-Alive\r\nCache-Control: no-cache\r\nContent-Type: application/vnd.google-earth.kml+xml\r\nX-Pad: avoid browser bug\r\nContent-Length: " + buffer.Length + "\r\n\r\n"; byte[] temp = asciiEncoding.GetBytes(header); stream.Write(temp, 0, temp.Length); stream.Write(buffer, 0, buffer.Length); goto again; //stream.Close(); } ///////////////////////////////////////////////////////////////// else if (url.Contains("network.kml")) { SharpKml.Dom.Document kml = new SharpKml.Dom.Document(); SharpKml.Dom.Placemark pmplane = new SharpKml.Dom.Placemark(); pmplane.Name = "P/Q " + MainV2.comPort.MAV.cs.altasl; pmplane.Visibility = true; SharpKml.Dom.Location loc = new SharpKml.Dom.Location(); loc.Latitude = MainV2.comPort.MAV.cs.lat; loc.Longitude = MainV2.comPort.MAV.cs.lng; loc.Altitude = MainV2.comPort.MAV.cs.altasl; if (loc.Altitude < 0) loc.Altitude = 0.01; SharpKml.Dom.Orientation ori = new SharpKml.Dom.Orientation(); ori.Heading = MainV2.comPort.MAV.cs.yaw; ori.Roll = -MainV2.comPort.MAV.cs.roll; ori.Tilt = -MainV2.comPort.MAV.cs.pitch; SharpKml.Dom.Scale sca = new SharpKml.Dom.Scale(); sca.X = 2; sca.Y = 2; sca.Z = 2; SharpKml.Dom.Model model = new SharpKml.Dom.Model(); model.Location = loc; model.Orientation = ori; model.AltitudeMode = SharpKml.Dom.AltitudeMode.Absolute; model.Scale = sca; SharpKml.Dom.Link link = new SharpKml.Dom.Link(); link.Href = new Uri("block_plane_0.dae", UriKind.Relative); model.Link = link; pmplane.Geometry = model; SharpKml.Dom.LookAt la = new SharpKml.Dom.LookAt() { Altitude = loc.Altitude.Value, Latitude = loc.Latitude.Value, Longitude = loc.Longitude.Value, Tilt = 80, Heading = MainV2.comPort.MAV.cs.yaw, AltitudeMode = SharpKml.Dom.AltitudeMode.Absolute, Range = 50 }; if (loc.Latitude.Value != 0 && loc.Longitude.Value != 0) { kml.Viewpoint = la; kml.AddFeature(pmplane); } SharpKml.Dom.CoordinateCollection coords = new SharpKml.Dom.CoordinateCollection(); //if (loc.Latitude.Value != 0 && loc.Longitude.Value != 0) { //foreach (var point in MainV2.comPort.MAV.wps.Values) { // coords.Add(new SharpKml.Base.Vector(point.x, point.y, point.z)); } } //else { PointLatLngAlt home = null; // draw track try { foreach (var point in GCSViews.FlightPlanner.instance.fullpointlist) { if (point.Tag.ToLower().Contains("home")) home = point; if (point != null) coords.Add(new SharpKml.Base.Vector(point.Lat, point.Lng, point.Alt)); } } catch { } foreach (var point in GCSViews.FlightPlanner.instance.fullpointlist) { if (point == null) continue; SharpKml.Dom.Placemark wp = new SharpKml.Dom.Placemark(); wp.Name = "WP " + point.Tag + " Alt: " + point.Alt; SharpKml.Dom.Point wppoint = new SharpKml.Dom.Point(); var altmode = SharpKml.Dom.AltitudeMode.RelativeToGround; wppoint.AltitudeMode = altmode; wppoint.Coordinate = new Vector() { Latitude = point.Lat, Longitude = point.Lng, Altitude = point.Alt }; wp.Geometry = wppoint; kml.AddFeature(wp); } } SharpKml.Dom.LineString ls = new SharpKml.Dom.LineString(); ls.AltitudeMode = SharpKml.Dom.AltitudeMode.RelativeToGround; ls.Coordinates = coords; ls.Extrude = false; ls.Tessellate = true; Style style = new Style(); style.Id = "yellowLineGreenPoly"; style.Line = new LineStyle(new Color32(HexStringToColor("ff00ffff")), 4); Style style2 = new Style(); style2.Id = "yellowLineGreenPoly"; style2.Line = new LineStyle(new Color32(HexStringToColor("7f00ffff")), 4); // above ground SharpKml.Dom.Placemark pm = new SharpKml.Dom.Placemark() { Geometry = ls, Name = "WPs", StyleSelector = style }; kml.AddFeature(pm); // on ground SharpKml.Dom.LineString ls2 = new SharpKml.Dom.LineString(); ls2.Coordinates = coords; ls2.Extrude = false; ls2.Tessellate = true; ls2.AltitudeMode = SharpKml.Dom.AltitudeMode.ClampToGround; SharpKml.Dom.Placemark pm2 = new SharpKml.Dom.Placemark() { Geometry = ls2, Name = "onground", StyleSelector = style2 }; kml.AddFeature(pm2); SharpKml.Base.Serializer serializer = new SharpKml.Base.Serializer(); serializer.Serialize(kml); byte[] buffer = Encoding.ASCII.GetBytes(serializer.Xml); string header = "HTTP/1.1 200 OK\r\nContent-Type: application/vnd.google-earth.kml+xml\r\nContent-Length: " + buffer.Length + "\r\n\r\n"; byte[] temp = asciiEncoding.GetBytes(header); stream.Write(temp, 0, temp.Length); stream.Write(buffer, 0, buffer.Length); goto again; //stream.Close(); } ///////////////////////////////////////////////////////////////// else if (url.Contains("block_plane_0.dae")) { string header = "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\n\r\n"; byte[] temp = asciiEncoding.GetBytes(header); stream.Write(temp, 0, temp.Length); BinaryReader file = new BinaryReader(File.Open("block_plane_0.dae", FileMode.Open, FileAccess.Read, FileShare.Read)); byte[] buffer = new byte[1024]; while (file.PeekChar() != -1) { int leng = file.Read(buffer, 0, buffer.Length); stream.Write(buffer, 0, leng); } file.Close(); stream.Close(); } ///////////////////////////////////////////////////////////////// else if (url.Contains("hud.html")) { string header = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n"; byte[] temp = asciiEncoding.GetBytes(header); stream.Write(temp, 0, temp.Length); BinaryReader file = new BinaryReader(File.Open("hud.html", FileMode.Open, FileAccess.Read, FileShare.Read)); byte[] buffer = new byte[1024]; while (file.PeekChar() != -1) { int leng = file.Read(buffer, 0, buffer.Length); stream.Write(buffer, 0, leng); } file.Close(); stream.Close(); } ///////////////////////////////////////////////////////////////// else if (url.ToLower().Contains("hud.jpg") || url.ToLower().Contains("map.jpg") || url.ToLower().Contains("both.jpg")) { refreshmap(); string header = "HTTP/1.1 200 OK\r\nContent-Type: multipart/x-mixed-replace;boundary=PLANNER\r\n\r\n--PLANNER\r\n"; byte[] temp = asciiEncoding.GetBytes(header); stream.Write(temp, 0, temp.Length); while (client.Connected) { System.Threading.Thread.Sleep(200); // 5hz byte[] data = null; if (url.ToLower().Contains("hud")) { GCSViews.FlightData.myhud.streamjpgenable = true; data = GCSViews.FlightData.myhud.streamjpg.ToArray(); } else if (url.ToLower().Contains("map")) { data = GetControlJpegRaw(GCSViews.FlightData.mymap); } else { GCSViews.FlightData.myhud.streamjpgenable = true; Image img1 = Image.FromStream(GCSViews.FlightData.myhud.streamjpg); Image img2 = GetControlJpeg(GCSViews.FlightData.mymap); int bigger = img1.Height > img2.Height ? img1.Height : img2.Height; Image imgout = new Bitmap(img1.Width + img2.Width, bigger); Graphics grap = Graphics.FromImage(imgout); grap.DrawImageUnscaled(img1, 0, 0); grap.DrawImageUnscaled(img2, img1.Width, 0); MemoryStream streamjpg = new MemoryStream(); imgout.Save(streamjpg, System.Drawing.Imaging.ImageFormat.Jpeg); data = streamjpg.ToArray(); } header = "Content-Type: image/jpeg\r\nContent-Length: " + data.Length + "\r\n\r\n"; temp = asciiEncoding.GetBytes(header); stream.Write(temp, 0, temp.Length); stream.Write(data, 0, data.Length); header = "\r\n--PLANNER\r\n"; temp = asciiEncoding.GetBytes(header); stream.Write(temp, 0, temp.Length); } GCSViews.FlightData.myhud.streamjpgenable = false; stream.Close(); } ///////////////////////////////////////////////////////////////// else if (url.Contains("/guided?")) { //http://127.0.0.1:56781/guided?lat=-34&lng=117.8&alt=30 Regex rex = new Regex(@"lat=([\-\.0-9]+)&lng=([\-\.0-9]+)&alt=([\.0-9]+)", RegexOptions.IgnoreCase); Match match = rex.Match(url); if (match.Success) { Locationwp gwp = new Locationwp() { lat = double.Parse(match.Groups[1].Value), lng = double.Parse(match.Groups[2].Value), alt = float.Parse(match.Groups[3].Value) }; try { MainV2.comPort.setGuidedModeWP(gwp); } catch { } string header = "HTTP/1.1 200 OK\r\n\r\nSent Guide Mode Wp"; byte[] temp = asciiEncoding.GetBytes(header); stream.Write(temp, 0, temp.Length); } else { string header = "HTTP/1.1 200 OK\r\n\r\nFailed Guide Mode Wp"; byte[] temp = asciiEncoding.GetBytes(header); stream.Write(temp, 0, temp.Length); } stream.Close(); } ///////////////////////////////////////////////////////////////// else if (url.ToLower().Contains(".jpg")) { Regex rex = new Regex(@"([^\s]+)\s(.+)\sHTTP/1", RegexOptions.IgnoreCase); Match match = rex.Match(url); if (match.Success) { string fileurl = match.Groups[2].Value; using (Image orig = Image.FromFile(georefimagepath + fileurl)) using (Image resi = ResizeImage(orig, new Size(640, 480))) using (MemoryStream memstream = new MemoryStream()) { resi.Save(memstream, System.Drawing.Imaging.ImageFormat.Jpeg); memstream.Position = 0; string header = "HTTP/1.1 200 OK\r\nServer: here\r\nKeep-Alive: timeout=15, max=100\r\nConnection: Keep-Alive\r\nContent-Type: image/jpg\r\nX-Pad: avoid browser bug\r\nContent-Length: " + memstream.Length + "\r\n\r\n"; byte[] temp = asciiEncoding.GetBytes(header); stream.Write(temp, 0, temp.Length); using (BinaryReader file = new BinaryReader(memstream)) { byte[] buffer = new byte[1024]; while (file.BaseStream.Position < file.BaseStream.Length) { int leng = file.Read(buffer, 0, buffer.Length); stream.Write(buffer, 0, leng); } } } goto again; //stream.Close(); } ///////////////////////////////////////////////////////////////// else { string header = "HTTP/1.1 404 not found\r\nContent-Type: image/jpg\r\n\r\n"; byte[] temp = asciiEncoding.GetBytes(header); stream.Write(temp, 0, temp.Length); } stream.Close(); } ///////////////////////////////////////////////////////////////// else if (url.ToLower().Contains("post /guide")) { Regex rex = new Regex(@"lat"":([\-\.0-9]+),""lon"":([\-\.0-9]+),""alt"":([\.0-9]+)", RegexOptions.IgnoreCase); Match match = rex.Match(head); if (match.Success) { Locationwp gwp = new Locationwp() { lat = double.Parse(match.Groups[1].Value), lng = double.Parse(match.Groups[2].Value), alt = float.Parse(match.Groups[3].Value) }; try { MainV2.comPort.setGuidedModeWP(gwp); } catch { } string header = "HTTP/1.1 200 OK\r\n\r\nSent Guide Mode Wp"; byte[] temp = asciiEncoding.GetBytes(header); stream.Write(temp, 0, temp.Length); } else { string header = "HTTP/1.1 200 OK\r\n\r\nFailed Guide Mode Wp"; byte[] temp = asciiEncoding.GetBytes(header); stream.Write(temp, 0, temp.Length); } stream.Close(); } ///////////////////////////////////////////////////////////////// else if (url.ToLower().Contains("/command_long")) { string header = "HTTP/1.1 404 not found\r\nContent-Type: image/jpg\r\n\r\n"; byte[] temp = asciiEncoding.GetBytes(header); stream.Write(temp, 0, temp.Length); stream.Close(); } ///////////////////////////////////////////////////////////////// else if (url.ToLower().Contains("/rcoverride")) { string header = "HTTP/1.1 404 not found\r\nContent-Type: image/jpg\r\n\r\n"; byte[] temp = asciiEncoding.GetBytes(header); stream.Write(temp, 0, temp.Length); stream.Close(); } ///////////////////////////////////////////////////////////////// else if (url.ToLower().Contains("/get_mission")) { string header = "HTTP/1.1 404 not found\r\nContent-Type: image/jpg\r\n\r\n"; byte[] temp = asciiEncoding.GetBytes(header); stream.Write(temp, 0, temp.Length); stream.Close(); } ///////////////////////////////////////////////////////////////// else if (url.ToLower().Contains("/mavlink/")) { /* GET /mavlink/ATTITUDE+VFR_HUD+NAV_CONTROLLER_OUTPUT+META_WAYPOINT+GPS_RAW_INT+HEARTBEAT+META_LINKQUALITY+GPS_STATUS+STATUSTEXT+SYS_STATUS?_=1355828718540 HTTP/1.1 Host: ubuntu:9999 Connection: keep-alive X-Requested-With: XMLHttpRequest User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11 Accept: Referer: http://ubuntu:9999/index.html Accept-Encoding: gzip,deflate,sdch Accept-Language: en-GB,en-US;q=0.8,en;q=0.6 Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 HTTP/1.1 200 OK Content-Type: application/json Content-Length: 2121 Date: Thu, 29 Nov 2012 12:13:38 GMT Server: ubuntu { "VFR_HUD": {"msg": {"throttle": 0, "groundspeed": 0.0, "airspeed": 0.0, "climb": 0.0, "mavpackettype": "VFR_HUD", "alt": -0.47999998927116394, "heading": 108}, "index": 687, "time_usec": 0}, "STATUSTEXT": {"msg": {"mavpackettype": "STATUSTEXT", "severity": 1, "text": "Initialising APM..."}, "index": 2, "time_usec": 0}, "SYS_STATUS": {"msg": {"onboard_control_sensors_present": 4294966287, "load": 0, "battery_remaining": -1, "errors_count4": 0, "drop_rate_comm": 0, "errors_count2": 0, "errors_count3": 0, "errors_comm": 0, "current_battery": -1, "errors_count1": 0, "onboard_control_sensors_health": 4294966287, "mavpackettype": "SYS_STATUS", "onboard_control_sensors_enabled": 4294945807, "voltage_battery": 10080}, "index": 693, "time_usec": 0}, "META_LINKQUALITY": {"msg": {"master_in": 11110, "mav_loss": 0, "mavpackettype": "META_LINKQUALITY", "master_out": 194, "packet_loss": 0.0}, "index": 194, "time_usec": 0}, "ATTITUDE": {"msg": {"pitchspeed": -0.000976863200776279, "yaw": 1.8878594636917114, "rollspeed": -0.0030046366155147552, "time_boot_ms": 194676, "pitch": -0.09986469894647598, "mavpackettype": "ATTITUDE", "yawspeed": -0.0015030358918011189, "roll": -0.029391441494226456}, "index": 687, "time_usec": 0}, "GPS_RAW_INT": {"msg": {"fix_type": 1, "cog": 0, "epv": 65535, "lon": 0, "time_usec": 0, "eph": 9999, "satellites_visible": 0, "lat": 0, "mavpackettype": "GPS_RAW_INT", "alt": 137000, "vel": 0}, "index": 687, "time_usec": 0}, "HEARTBEAT": {"msg": {"custom_mode": 0, "system_status": 4, "base_mode": 81, "autopilot": 3, "mavpackettype": "HEARTBEAT", "type": 2, "mavlink_version": 3}, "index": 190, "time_usec": 0}, "GPS_STATUS": {"msg": {"satellite_snr": "", "satellite_azimuth": "", "satellite_prn": "", "satellite_elevation": "", "satellites_visible": 0, "satellite_used": "", "mavpackettype": "GPS_STATUS"}, "index": 2, "time_usec": 0}, "NAV_CONTROLLER_OUTPUT": {"msg": {"wp_dist": 0, "nav_pitch": 0.0, "target_bearing": 0, "nav_roll": 0.0, "aspd_error": 0.0, "alt_error": 0.0, "mavpackettype": "NAV_CONTROLLER_OUTPUT", "xtrack_error": 0.0, "nav_bearing": 0}, "index": 687, "time_usec": 0}} */ JavaScriptSerializer serializer = new JavaScriptSerializer(); object[] data = new object[20]; Messagejson message = new Messagejson(); if (MainV2.comPort.MAV.getPacket((byte) MAVLink.MAVLINK_MSG_ID.ATTITUDE) != null) message.ATTITUDE = new Message2() { index = 1, msg = MainV2.comPort.MAV.getPacket((byte)MAVLink.MAVLINK_MSG_ID.ATTITUDE) .ToStructure<MAVLink.mavlink_attitude_t>() }; if (MainV2.comPort.MAV.getPacket((byte)MAVLink.MAVLINK_MSG_ID.VFR_HUD) != null) message.VFR_HUD = new Message2() { index = 1, msg = MainV2.comPort.MAV.getPacket((byte)MAVLink.MAVLINK_MSG_ID.VFR_HUD) .ToStructure<MAVLink.mavlink_vfr_hud_t>() }; if (MainV2.comPort.MAV.getPacket((byte)MAVLink.MAVLINK_MSG_ID.NAV_CONTROLLER_OUTPUT) != null) message.NAV_CONTROLLER_OUTPUT = new Message2() { index = 1, msg = MainV2.comPort.MAV.getPacket((byte)MAVLink.MAVLINK_MSG_ID.NAV_CONTROLLER_OUTPUT) .ToStructure<MAVLink.mavlink_nav_controller_output_t>() }; if (MainV2.comPort.MAV.getPacket((byte)MAVLink.MAVLINK_MSG_ID.GPS_RAW_INT) != null) message.GPS_RAW_INT = new Message2() { index = 1, msg = MainV2.comPort.MAV.getPacket((byte)MAVLink.MAVLINK_MSG_ID.GPS_RAW_INT) .ToStructure<MAVLink.mavlink_gps_raw_int_t>() }; if (MainV2.comPort.MAV.getPacket((byte) MAVLink.MAVLINK_MSG_ID.HEARTBEAT) != null) message.HEARTBEAT = new Message2() { index = 1, msg = MainV2.comPort.MAV.getPacket((byte) MAVLink.MAVLINK_MSG_ID.HEARTBEAT) .ToStructure<MAVLink.mavlink_heartbeat_t>() }; if (MainV2.comPort.MAV.getPacket((byte) MAVLink.MAVLINK_MSG_ID.GPS_STATUS) != null) message.GPS_STATUS = new Message2() { index = 1, msg = MainV2.comPort.MAV.getPacket((byte) MAVLink.MAVLINK_MSG_ID.GPS_STATUS) .ToStructure<MAVLink.mavlink_gps_status_t>() }; if (MainV2.comPort.MAV.getPacket((byte) MAVLink.MAVLINK_MSG_ID.STATUSTEXT) != null) message.STATUSTEXT = new Message2() { index = 1, msg = MainV2.comPort.MAV.getPacket((byte) MAVLink.MAVLINK_MSG_ID.STATUSTEXT) .ToStructure<MAVLink.mavlink_statustext_t>() }; if (MainV2.comPort.MAV.getPacket((byte) MAVLink.MAVLINK_MSG_ID.SYS_STATUS) != null) message.SYS_STATUS = new Message2() { index = 1, msg = MainV2.comPort.MAV.getPacket((byte)MAVLink.MAVLINK_MSG_ID.SYS_STATUS) .ToStructure<MAVLink.mavlink_sys_status_t>() }; message.META_LINKQUALITY = message.SYS_STATUS = new Message2() { index = packetindex, time_usec = 0, msg = new META_LINKQUALITY() { master_in = (int) MainV2.comPort.MAV.packetsnotlost, mavpackettype = "META_LINKQUALITY", master_out = MainV2.comPort.packetcount, packet_loss = 100 - MainV2.comPort.MAV.cs.linkqualitygcs, mav_loss = 0 } }; packetindex++; string output = serializer.Serialize(message); string header = "HTTP/1.1 200 OK\r\nContent-Type: application/json\r\nContent-Length: " + output.Length + "\r\n\r\n"; byte[] temp = asciiEncoding.GetBytes(header); stream.Write(temp, 0, temp.Length); temp = asciiEncoding.GetBytes(output); stream.Write(temp, 0, temp.Length); goto again; //stream.Close(); } ///////////////////////////////////////////////////////////////// else if (url.ToLower().Contains("/mav/")) { //C:\Users\hog\Desktop\DIYDrones\mavelous\modules\lib\mavelous_web Regex rex = new Regex(@"([^\s]+)\s(.+)\sHTTP/1", RegexOptions.IgnoreCase); Match match = rex.Match(url); if (match.Success) { string fileurl = match.Groups[2].Value; fileurl = fileurl.Replace("/mav/", ""); if (fileurl == "" || fileurl == "/") fileurl = "index.html"; string header = "HTTP/1.1 200 OK\r\n"; if (fileurl.Contains(".html")) header += "Content-Type: text/html\r\n\r\n"; else if (fileurl.Contains(".js")) header += "Content-Type: application/x-javascript\r\n\r\n"; else if (fileurl.Contains(".css")) header += "Content-Type: text/css\r\n\r\n"; else header += "Content-Type: text/plain\r\n\r\n"; byte[] temp = asciiEncoding.GetBytes(header); stream.Write(temp, 0, temp.Length); BinaryReader file = new BinaryReader(File.Open(mavelous_web + fileurl, FileMode.Open, FileAccess.Read, FileShare.Read)); byte[] buffer = new byte[1024]; while (file.BaseStream.Position < file.BaseStream.Length) { int leng = file.Read(buffer, 0, buffer.Length); stream.Write(buffer, 0, leng); } file.Close(); stream.Close(); } ///////////////////////////////////////////////////////////////// else { string header = "HTTP/1.1 404 not found\r\nContent-Type: image/jpg\r\n\r\n"; byte[] temp = asciiEncoding.GetBytes(header); stream.Write(temp, 0, temp.Length); stream.Close(); } } ///////////////////////////////////////////////////////////////// else { Console.WriteLine(url); string header = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n"; byte[] temp = asciiEncoding.GetBytes(header); stream.Write(temp, 0, temp.Length); string content = @" <a href=/mav/>Mavelous</a> <a href=/mavlink/>Mavelous traffic</a> <a href=/hud.jpg>Hud image</a> <a href=/map.jpg>Map image </a> <a href=/both.jpg>Map & hud image</a> <a href=/hud.html>hud html5</a> <a href=/network.kml>network kml</a> <a href=/georefnetwork.kml>georef kml</a> "; temp = asciiEncoding.GetBytes(content); stream.Write(temp, 0, temp.Length); } stream.Close(); log.Info("Close http " + url); } catch (Exception ee) { log.Error("Failed http ", ee); } } }
public void ProcessClient(object clientobj) { var client = clientobj as TcpClient; using (client) { try { // Get a stream object for reading and writing log.Info("Accepted Client " + client.Client.RemoteEndPoint.ToString()); //client.SendBufferSize = 100 * 1024; // 100kb //client.LingerState.Enabled = true; //client.NoDelay = true; // makesure we have valid image GCSViews.FlightData.myhud.streamjpgenable = true; NetworkStream stream = client.GetStream(); // 5 seconds - default for httpd 2.2+ stream.ReadTimeout = 5000; goto skipagain; again: log.Info("doing Again"); skipagain: var asciiEncoding = new ASCIIEncoding(); var request = new byte[1024 * 4]; int len = 0; // handle header try { len = stream.Read(request, 0, request.Length); } catch { return; } string head = System.Text.Encoding.ASCII.GetString(request, 0, len); log.Info(head); int index = head.IndexOf('\n'); if (index == -1) { return; } string url = head.Substring(0, index - 1); //url = url.Replace("\r", ""); //url = url.Replace("GET ",""); //url = url.Replace(" HTTP/1.0", ""); //url = url.Replace(" HTTP/1.1", ""); //Tracking.AddEvent("HTTPServer", "Get", url, ""); ///////////////////////////////////////////////////////////////// if (url.Contains(" /websocket/server")) { using (var writer = new StreamWriter(stream, Encoding.Default)) { writer.WriteLine("HTTP/1.1 101 WebSocket Protocol Handshake"); writer.WriteLine("Upgrade: WebSocket"); writer.WriteLine("Connection: Upgrade"); //writer.WriteLine("WebSocket-Location: ws://localhost:56781/websocket/server"); int start = head.IndexOf("Sec-WebSocket-Key:") + 19; int end = head.IndexOf('\r', start); if (end == -1) { end = head.IndexOf('\n', start); } string accept = ComputeWebSocketHandshakeSecurityHash09(head.Substring(start, end - start)); writer.WriteLine("Sec-WebSocket-Accept: " + accept); writer.WriteLine("Server: Mission Planner"); writer.WriteLine(""); writer.Flush(); while (client.Connected) { while (client.Available > 0) { var bydata = stream.ReadByte(); Console.Write(bydata.ToString("X2")); if (bydata == 0x88) { return; } } byte[] packet = new byte[1024 * 32]; var cs = JsonConvert.SerializeObject(MainV2.comPort.MAV.cs); var wps = JsonConvert.SerializeObject(MainV2.comPort.MAV.wps); foreach (var sendme in new[] { cs, wps }) { int i = 0; var tosend = sendme.Length; packet[i++] = 0x81; // fin - utf if (tosend <= 125) { packet[i++] = (byte)(tosend); } else { packet[i++] = 126; // nomask - 2 byte length packet[i++] = (byte)(tosend >> 8); packet[i++] = (byte)(tosend & 0xff); } foreach (char ch in sendme) { packet[i++] = (byte)ch; } stream.Write(packet, 0, i); stream.Flush(); } Thread.Sleep(200); } } } ///////////////////////////////////////////////////////////////// else if (url.Contains(" /websocket/raw")) { using (var writer = new StreamWriter(stream, Encoding.Default)) { writer.WriteLine("HTTP/1.1 101 WebSocket Protocol Handshake"); writer.WriteLine("Upgrade: WebSocket"); writer.WriteLine("Connection: Upgrade"); writer.WriteLine("WebSocket-Location: ws://localhost:56781/websocket/raw"); int start = head.IndexOf("Sec-WebSocket-Key:") + 19; int end = head.IndexOf('\r', start); if (end == -1) { end = head.IndexOf('\n', start); } string accept = ComputeWebSocketHandshakeSecurityHash09(head.Substring(start, end - start)); writer.WriteLine("Sec-WebSocket-Accept: " + accept); if (head.Contains("Sec-WebSocket-Protocol:")) { writer.WriteLine("Sec-WebSocket-Protocol: binary"); } writer.WriteLine("Server: Mission Planner"); writer.WriteLine(""); writer.Flush(); EventHandler <MAVLink.MAVLinkMessage> action = null; action = (sender, message) => { var sendme = message.buffer; try { byte[] packet = new byte[1024 * 32]; int i = 0; var tosend = sendme.Length; packet[i++] = 0x82; // fin - data if (tosend <= 125) { packet[i++] = (byte)(tosend); } else { packet[i++] = 126; // nomask - 2 byte length packet[i++] = (byte)(tosend >> 8); packet[i++] = (byte)(tosend & 0xff); } foreach (char ch in sendme) { packet[i++] = (byte)ch; } stream.WriteAsync(packet, 0, i); stream.FlushAsync(); } catch { ((MAVLinkInterface)sender).OnPacketReceived -= action; stream.Close(); client.Close(); } }; MainV2.comPort.OnPacketReceived += action; while (client.Connected) { while (client.Available > 0) { var bydata = stream.ReadByte(); Console.Write(bydata.ToString("X2")); if (bydata == 0x88) { return; } } Thread.Sleep(200); } MainV2.comPort.OnPacketReceived -= action; } } ///////////////////////////////////////////////////////////////// else if (url.Contains(" /georefnetwork.kml")) { byte[] buffer = Encoding.ASCII.GetBytes(georefkml); string header = "HTTP/1.1 200 OK\r\nServer: here\r\nKeep-Alive: timeout=15, max=100\r\nConnection: Keep-Alive\r\nCache-Control: no-cache\r\nContent-Type: application/vnd.google-earth.kml+xml\r\nX-Pad: avoid browser bug\r\nContent-Length: " + buffer.Length + "\r\n\r\n"; byte[] temp = asciiEncoding.GetBytes(header); stream.Write(temp, 0, temp.Length); stream.Write(buffer, 0, buffer.Length); stream.Flush(); goto again; //stream.Close(); } ///////////////////////////////////////////////////////////////// else if (url.Contains(" /location.kml")) { SharpKml.Dom.Document kml = new SharpKml.Dom.Document(); foreach (var mavLinkInterface in MainV2.Comports) { foreach (var MAV in mavLinkInterface.MAVlist) { SharpKml.Dom.Placemark pmplane = new SharpKml.Dom.Placemark(); pmplane.Name = "P/Q " + MAV.cs.altasl; pmplane.Visibility = true; SharpKml.Dom.Location loc = new SharpKml.Dom.Location(); loc.Latitude = MAV.cs.lat; loc.Longitude = MAV.cs.lng; loc.Altitude = MAV.cs.altasl; if (loc.Altitude < 0) { loc.Altitude = 0.01; } SharpKml.Dom.Orientation ori = new SharpKml.Dom.Orientation(); ori.Heading = MAV.cs.yaw; ori.Roll = -MAV.cs.roll; ori.Tilt = -MAV.cs.pitch; SharpKml.Dom.Scale sca = new SharpKml.Dom.Scale(); sca.X = 2; sca.Y = 2; sca.Z = 2; SharpKml.Dom.Model model = new SharpKml.Dom.Model(); model.Location = loc; model.Orientation = ori; model.AltitudeMode = SharpKml.Dom.AltitudeMode.Absolute; model.Scale = sca; SharpKml.Dom.Link link = new SharpKml.Dom.Link(); link.Href = new Uri("block_plane_0.dae", UriKind.Relative); model.Link = link; pmplane.Geometry = model; kml.AddFeature(pmplane); } } SharpKml.Dom.LookAt la = new SharpKml.Dom.LookAt() { Altitude = MainV2.comPort.MAV.cs.altasl, Latitude = MainV2.comPort.MAV.cs.lat, Longitude = MainV2.comPort.MAV.cs.lng, Tilt = 80, Heading = MainV2.comPort.MAV.cs.yaw, AltitudeMode = SharpKml.Dom.AltitudeMode.Absolute, Range = 50 }; if (la.Latitude.Value != 0 && la.Longitude.Value != 0) { kml.Viewpoint = la; } SharpKml.Base.Serializer serializer = new SharpKml.Base.Serializer(); serializer.Serialize(kml); byte[] buffer = Encoding.ASCII.GetBytes(serializer.Xml); string header = "HTTP/1.1 200 OK\r\nContent-Type: application/vnd.google-earth.kml+xml\r\nContent-Length: " + buffer.Length + "\r\n\r\n"; byte[] temp = asciiEncoding.GetBytes(header); stream.Write(temp, 0, temp.Length); stream.Write(buffer, 0, buffer.Length); goto again; } else if (url.Contains(" /network.kml")) { byte[] buffer = Encoding.ASCII.GetBytes(@"<?xml version=""1.0"" encoding=""UTF-8""?> <kml xmlns=""http://www.opengis.net/kml/2.2"" xmlns:gx=""http://www.google.com/kml/ext/2.2"" xmlns:kml=""http://www.opengis.net/kml/2.2"" xmlns:atom=""http://www.w3.org/2005/Atom""> <Folder> <name> Network Links </name> <open> 1 </open> <NetworkLink> <name> View Centered Placemark</name> <open> 1 </open> <refreshVisibility> 0 </refreshVisibility> <flyToView> 1 </flyToView> <Link> <href> http://127.0.0.1:56781/location.kml</href> <refreshMode> onInterval </refreshMode> <refreshInterval> 1 </refreshInterval> <viewRefreshTime> 1 </viewRefreshTime> </Link> </NetworkLink> <NetworkLink> <name> View Centered Placemark</name> <open> 1 </open> <refreshVisibility> 0 </refreshVisibility> <flyToView> 0 </flyToView> <Link> <href> http://127.0.0.1:56781/wps.kml</href> </Link> </NetworkLink> </Folder> </kml>"); string header = "HTTP/1.1 200 OK\r\nContent-Type: application/vnd.google-earth.kml+xml\r\nContent-Length: " + buffer.Length + "\r\n\r\n"; byte[] temp = asciiEncoding.GetBytes(header); stream.Write(temp, 0, temp.Length); stream.Write(buffer, 0, buffer.Length); stream.Flush(); goto again; } else if (url.Contains(" /wps.kml")) { SharpKml.Dom.Document kml = new SharpKml.Dom.Document(); SharpKml.Dom.CoordinateCollection coords = new SharpKml.Dom.CoordinateCollection(); PointLatLngAlt home = null; // draw track try { foreach (var point in GCSViews.FlightPlanner.instance.pointlist) { if (point == null) { continue; } if (point.Tag.ToLower().Contains("home")) { home = point; } coords.Add(new SharpKml.Base.Vector(point.Lat, point.Lng, point.Alt)); } } catch { } var altmode = SharpKml.Dom.AltitudeMode.Absolute; foreach (var point in GCSViews.FlightPlanner.instance.pointlist) { if (point == null) { continue; } SharpKml.Dom.Placemark wp = new SharpKml.Dom.Placemark(); wp.Name = "WP " + point.Tag + " Alt: " + point.Alt; SharpKml.Dom.Point wppoint = new SharpKml.Dom.Point(); wppoint.AltitudeMode = altmode; wppoint.Coordinate = new Vector() { Latitude = point.Lat, Longitude = point.Lng, Altitude = point.Alt }; wp.Geometry = wppoint; kml.AddFeature(wp); } SharpKml.Dom.LineString ls = new SharpKml.Dom.LineString(); ls.AltitudeMode = altmode; ls.Coordinates = coords; ls.Extrude = false; ls.Tessellate = true; Style style = new Style(); style.Id = "yellowLineGreenPoly"; unchecked { style.Line = new LineStyle(new Color32((int)0xff00ffff), 4); } Style style2 = new Style(); style2.Id = "yellowLineGreenPoly"; style2.Line = new LineStyle(new Color32((int)0x7f00ffff), 4); // above ground SharpKml.Dom.Placemark pm = new SharpKml.Dom.Placemark() { Geometry = ls, Name = "WPs", StyleSelector = style }; kml.AddFeature(pm); // on ground SharpKml.Dom.LineString ls2 = new SharpKml.Dom.LineString(); ls2.Coordinates = coords; ls2.Extrude = false; ls2.Tessellate = true; ls2.AltitudeMode = SharpKml.Dom.AltitudeMode.ClampToGround; SharpKml.Dom.Placemark pm2 = new SharpKml.Dom.Placemark() { Geometry = ls2, Name = "onground", StyleSelector = style2 }; kml.AddFeature(pm2); SharpKml.Base.Serializer serializer = new SharpKml.Base.Serializer(); serializer.Serialize(kml); byte[] buffer = Encoding.ASCII.GetBytes(serializer.Xml); string header = "HTTP/1.1 200 OK\r\nContent-Type: application/vnd.google-earth.kml+xml\r\nContent-Length: " + buffer.Length + "\r\n\r\n"; byte[] temp = asciiEncoding.GetBytes(header); stream.Write(temp, 0, temp.Length); stream.Write(buffer, 0, buffer.Length); stream.Flush(); goto again; //stream.Close(); } ///////////////////////////////////////////////////////////////// else if (url.Contains(" /hud.html")) { var file = Xamarin.Properties.Resources.hud; string header = "HTTP/1.1 200 OK\r\nConnection: close\r\nContent-Type: text/html\r\nContent-Length: " + file.Length + "\r\n\r\n"; byte[] temp = asciiEncoding.GetBytes(header); stream.Write(temp, 0, temp.Length); byte[] buffer = ASCIIEncoding.ASCII.GetBytes(file); stream.Write(buffer, 0, buffer.Length); stream.Close(); } ///////////////////////////////////////////////////////////////// else if (url.Contains(" /guided?")) { //http://127.0.0.1:56781/guided?lat=-34&lng=117.8&alt=30 Regex rex = new Regex(@"lat=([\-\.0-9]+)&lng=([\-\.0-9]+)&alt=([\.0-9]+)", RegexOptions.IgnoreCase); Match match = rex.Match(url); if (match.Success) { Locationwp gwp = new Locationwp() { lat = double.Parse(match.Groups[1].Value), lng = double.Parse(match.Groups[2].Value), alt = float.Parse(match.Groups[3].Value) }; try { MainV2.comPort.setGuidedModeWP(gwp); } catch { } string header = "HTTP/1.1 200 OK\r\n\r\nSent Guide Mode Wp"; byte[] temp = asciiEncoding.GetBytes(header); stream.Write(temp, 0, temp.Length); } else { string header = "HTTP/1.1 200 OK\r\n\r\nFailed Guide Mode Wp"; byte[] temp = asciiEncoding.GetBytes(header); stream.Write(temp, 0, temp.Length); } stream.Close(); } ///////////////////////////////////////////////////////////////// else if (url.ToLower().Contains("post /guide")) { Regex rex = new Regex(@"lat"":([\-\.0-9]+),""lon"":([\-\.0-9]+),""alt"":([\.0-9]+)", RegexOptions.IgnoreCase); Match match = rex.Match(head); if (match.Success) { Locationwp gwp = new Locationwp() { lat = double.Parse(match.Groups[1].Value), lng = double.Parse(match.Groups[2].Value), alt = float.Parse(match.Groups[3].Value) }; try { MainV2.comPort.setGuidedModeWP(gwp); } catch { } string header = "HTTP/1.1 200 OK\r\n\r\nSent Guide Mode Wp"; byte[] temp = asciiEncoding.GetBytes(header); stream.Write(temp, 0, temp.Length); } else { string header = "HTTP/1.1 200 OK\r\n\r\nFailed Guide Mode Wp"; byte[] temp = asciiEncoding.GetBytes(header); stream.Write(temp, 0, temp.Length); } stream.Close(); } ///////////////////////////////////////////////////////////////// else if (url.ToLower().Contains(" /command_long")) { string header = "HTTP/1.1 404 not found\r\nContent-Type: image/jpg\r\n\r\n"; byte[] temp = asciiEncoding.GetBytes(header); stream.Write(temp, 0, temp.Length); stream.Close(); } ///////////////////////////////////////////////////////////////// else if (url.ToLower().Contains(" /rcoverride")) { string header = "HTTP/1.1 404 not found\r\nContent-Type: image/jpg\r\n\r\n"; byte[] temp = asciiEncoding.GetBytes(header); stream.Write(temp, 0, temp.Length); stream.Close(); } ///////////////////////////////////////////////////////////////// else if (url.ToLower().Contains(" /get_mission")) { string header = "HTTP/1.1 404 not found\r\nContent-Type: image/jpg\r\n\r\n"; byte[] temp = asciiEncoding.GetBytes(header); stream.Write(temp, 0, temp.Length); stream.Close(); } ///////////////////////////////////////////////////////////////// else if (url.ToLower().Contains(" /mavlink/")) { /* * GET /mavlink/ATTITUDE+VFR_HUD+NAV_CONTROLLER_OUTPUT+META_WAYPOINT+GPS_RAW_INT+HEARTBEAT+META_LINKQUALITY+GPS_STATUS+STATUSTEXT+SYS_STATUS?_=1355828718540 HTTP/1.1 * Host: ubuntu:9999 * Connection: keep-alive * X-Requested-With: XMLHttpRequest * User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11 * Accept: * Referer: http://ubuntu:9999/index.html * Accept-Encoding: gzip,deflate,sdch * Accept-Language: en-GB,en-US;q=0.8,en;q=0.6 * Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 * * HTTP/1.1 200 OK * Content-Type: application/json * Content-Length: 2121 * Date: Thu, 29 Nov 2012 12:13:38 GMT * Server: ubuntu * * { * "VFR_HUD": {"msg": {"throttle": 0, "groundspeed": 0.0, "airspeed": 0.0, "climb": 0.0, "mavpackettype": "VFR_HUD", "alt": -0.47999998927116394, "heading": 108}, "index": 687, "time_usec": 0}, * "STATUSTEXT": {"msg": {"mavpackettype": "STATUSTEXT", "severity": 1, "text": "Initialising APM..."}, "index": 2, "time_usec": 0}, * "SYS_STATUS": {"msg": {"onboard_control_sensors_present": 4294966287, "load": 0, "battery_remaining": -1, "errors_count4": 0, "drop_rate_comm": 0, "errors_count2": 0, "errors_count3": 0, "errors_comm": 0, "current_battery": -1, "errors_count1": 0, "onboard_control_sensors_health": 4294966287, "mavpackettype": "SYS_STATUS", "onboard_control_sensors_enabled": 4294945807, "voltage_battery": 10080}, "index": 693, "time_usec": 0}, * "META_LINKQUALITY": {"msg": {"master_in": 11110, "mav_loss": 0, "mavpackettype": "META_LINKQUALITY", "master_out": 194, "packet_loss": 0.0}, "index": 194, "time_usec": 0}, * "ATTITUDE": {"msg": {"pitchspeed": -0.000976863200776279, "yaw": 1.8878594636917114, "rollspeed": -0.0030046366155147552, "time_boot_ms": 194676, "pitch": -0.09986469894647598, "mavpackettype": "ATTITUDE", "yawspeed": -0.0015030358918011189, "roll": -0.029391441494226456}, "index": 687, "time_usec": 0}, * "GPS_RAW_INT": {"msg": {"fix_type": 1, "cog": 0, "epv": 65535, "lon": 0, "time_usec": 0, "eph": 9999, "satellites_visible": 0, "lat": 0, "mavpackettype": "GPS_RAW_INT", "alt": 137000, "vel": 0}, "index": 687, "time_usec": 0}, * "HEARTBEAT": {"msg": {"custom_mode": 0, "system_status": 4, "base_mode": 81, "autopilot": 3, "mavpackettype": "HEARTBEAT", "type": 2, "mavlink_version": 3}, "index": 190, "time_usec": 0}, * "GPS_STATUS": {"msg": {"satellite_snr": "", "satellite_azimuth": "", "satellite_prn": "", "satellite_elevation": "", "satellites_visible": 0, "satellite_used": "", "mavpackettype": "GPS_STATUS"}, "index": 2, "time_usec": 0}, * "NAV_CONTROLLER_OUTPUT": {"msg": {"wp_dist": 0, "nav_pitch": 0.0, "target_bearing": 0, "nav_roll": 0.0, "aspd_error": 0.0, "alt_error": 0.0, "mavpackettype": "NAV_CONTROLLER_OUTPUT", "xtrack_error": 0.0, "nav_bearing": 0}, "index": 687, "time_usec": 0}} */ object[] data = new object[20]; if (MainV2.comPort.MAV.getPacket((byte)MAVLink.MAVLINK_MSG_ID.ATTITUDE) != null) { var tmsg = MainV2.comPort.MAV.getPacket((uint)MAVLink.MAVLINK_MSG_ID.ATTITUDE) .ToStructure <MAVLink.mavlink_attitude_t>(); var json = JsonConvert.SerializeObject(tmsg); var name = MAVLink.MAVLINK_MESSAGE_INFOS.GetMessageInfo((uint)MAVLink.MAVLINK_MSG_ID.ATTITUDE).name; } Messagejson message = new Messagejson(); if (MainV2.comPort.MAV.getPacket((byte)MAVLink.MAVLINK_MSG_ID.ATTITUDE) != null) { message.ATTITUDE = new Message2() { index = 1, msg = MainV2.comPort.MAV.getPacket((byte)MAVLink.MAVLINK_MSG_ID.ATTITUDE) .ToStructure <MAVLink.mavlink_attitude_t>() } } ; if (MainV2.comPort.MAV.getPacket((byte)MAVLink.MAVLINK_MSG_ID.VFR_HUD) != null) { message.VFR_HUD = new Message2() { index = 1, msg = MainV2.comPort.MAV.getPacket((byte)MAVLink.MAVLINK_MSG_ID.VFR_HUD) .ToStructure <MAVLink.mavlink_vfr_hud_t>() } } ; if (MainV2.comPort.MAV.getPacket((byte)MAVLink.MAVLINK_MSG_ID.NAV_CONTROLLER_OUTPUT) != null) { message.NAV_CONTROLLER_OUTPUT = new Message2() { index = 1, msg = MainV2.comPort.MAV.getPacket((byte)MAVLink.MAVLINK_MSG_ID.NAV_CONTROLLER_OUTPUT) .ToStructure <MAVLink.mavlink_nav_controller_output_t>() } } ; if (MainV2.comPort.MAV.getPacket((byte)MAVLink.MAVLINK_MSG_ID.GPS_RAW_INT) != null) { message.GPS_RAW_INT = new Message2() { index = 1, msg = MainV2.comPort.MAV.getPacket((byte)MAVLink.MAVLINK_MSG_ID.GPS_RAW_INT) .ToStructure <MAVLink.mavlink_gps_raw_int_t>() } } ; if (MainV2.comPort.MAV.getPacket((byte)MAVLink.MAVLINK_MSG_ID.HEARTBEAT) != null) { message.HEARTBEAT = new Message2() { index = 1, msg = MainV2.comPort.MAV.getPacket((byte)MAVLink.MAVLINK_MSG_ID.HEARTBEAT) .ToStructure <MAVLink.mavlink_heartbeat_t>() } } ; if (MainV2.comPort.MAV.getPacket((byte)MAVLink.MAVLINK_MSG_ID.GPS_STATUS) != null) { message.GPS_STATUS = new Message2() { index = 1, msg = MainV2.comPort.MAV.getPacket((byte)MAVLink.MAVLINK_MSG_ID.GPS_STATUS) .ToStructure <MAVLink.mavlink_gps_status_t>() } } ; if (MainV2.comPort.MAV.getPacket((byte)MAVLink.MAVLINK_MSG_ID.STATUSTEXT) != null) { message.STATUSTEXT = new Message2() { index = 1, msg = MainV2.comPort.MAV.getPacket((byte)MAVLink.MAVLINK_MSG_ID.STATUSTEXT) .ToStructure <MAVLink.mavlink_statustext_t>() } } ; if (MainV2.comPort.MAV.getPacket((byte)MAVLink.MAVLINK_MSG_ID.SYS_STATUS) != null) { message.SYS_STATUS = new Message2() { index = 1, msg = MainV2.comPort.MAV.getPacket((byte)MAVLink.MAVLINK_MSG_ID.SYS_STATUS) .ToStructure <MAVLink.mavlink_sys_status_t>() } } ; message.META_LINKQUALITY = message.SYS_STATUS = new Message2() { index = packetindex, time_usec = 0, msg = new META_LINKQUALITY() { master_in = (int)MainV2.comPort.MAV.packetsnotlost, mavpackettype = "META_LINKQUALITY", master_out = MainV2.comPort.packetcount, packet_loss = 100 - MainV2.comPort.MAV.cs.linkqualitygcs, mav_loss = 0 } }; packetindex++; string output = JsonConvert.SerializeObject(message); string header = "HTTP/1.1 200 OK\r\nContent-Type: application/json\r\nContent-Length: " + output.Length + "\r\n\r\n"; byte[] temp = asciiEncoding.GetBytes(header); stream.Write(temp, 0, temp.Length); temp = asciiEncoding.GetBytes(output); stream.Write(temp, 0, temp.Length); stream.Flush(); goto again; //stream.Close(); } ///////////////////////////////////////////////////////////////// else if (url.ToLower().Contains(" /mav/")) { //C:\Users\hog\Desktop\DIYDrones\mavelous\modules\lib\mavelous_web Regex rex = new Regex(@"([^\s]+)\s(.+)\sHTTP/1", RegexOptions.IgnoreCase); Match match = rex.Match(url); if (match.Success) { string fileurl = WebUtility.UrlDecode(match.Groups[2].Value); fileurl = fileurl.Replace("/mav/", ""); if (fileurl == "" || fileurl == "/") { fileurl = "index.html"; } if (File.Exists(mavelous_web + fileurl)) { string header = "HTTP/1.1 200 OK\r\n"; if (fileurl.Contains(".htm")) { header += "Content-Type: text/html\r\n"; } else if (fileurl.Contains(".js")) { header += "Content-Type: application/x-javascript\r\n"; } else if (fileurl.Contains(".css")) { header += "Content-Type: text/css\r\n"; } else { header += "Content-Type: text/plain\r\n"; } var fileinfo = new FileInfo(mavelous_web + fileurl); var filetime = fileinfo.LastWriteTimeUtc.ToString("ddd, dd MMM yyyy HH:mm:ss") + " GMT"; var modified = Regex.Match(head, "If-Modified-Since:(.*)", RegexOptions.IgnoreCase); if (modified.Success && modified.Groups[1].Value.Trim().ToLower() == filetime.ToLower()) { string header2 = "HTTP/1.1 304 not modified\r\nConnection: Keep-Alive\r\n\r\n"; byte[] temp2 = asciiEncoding.GetBytes(header2); stream.Write(temp2, 0, temp2.Length); stream.Flush(); goto again; } header += "Connection: keep-alive\r\nLast-Modified: " + filetime + "\r\nContent-Length: " + fileinfo.Length + "\r\n\r\n"; byte[] temp = asciiEncoding.GetBytes(header); stream.Write(temp, 0, temp.Length); BinaryReader file = new BinaryReader(File.Open(mavelous_web + fileurl, FileMode.Open, FileAccess.Read, FileShare.Read)); byte[] buffer = new byte[1024]; while (file.BaseStream.Position < file.BaseStream.Length) { int leng = file.Read(buffer, 0, buffer.Length); stream.Write(buffer, 0, leng); } file.Close(); stream.Flush(); goto again; } } ///////////////////////////////////////////////////////////////// { string header = "HTTP/1.1 404 not found\r\nConnection: Keep-Alive\r\nContent-Length: 0\r\nContent -Type: text/plain\r\n\r\n"; byte[] temp = asciiEncoding.GetBytes(header); stream.Write(temp, 0, temp.Length); stream.Flush(); goto again; } } ///////////////////////////////////////////////////////////////// else if (url.ToLower().Contains(" / ")) { Console.WriteLine(url); string header = "HTTP/1.1 200 OK\r\nConnection: close\r\nContent-Type: text/html\r\n\r\n"; byte[] temp = asciiEncoding.GetBytes(header); stream.Write(temp, 0, temp.Length); string content = @" <a href=/mav/>Mavelous</a> <a href=/mavlink/>Mavelous traffic</a> <a href=/hud.jpg>Hud image</a> <a href=/map.jpg>Map image </a> <a href=/both.jpg>Map & hud image</a> <a href=/hud.html>hud html5</a> <a href=/network.kml>network kml</a> <a href=/georefnetwork.kml>georef kml</a> "; temp = asciiEncoding.GetBytes(content); stream.Write(temp, 0, temp.Length); } ///////////////////////////////////////////////////////////////// else { string header = "HTTP/1.1 404 not found\r\nContent-Type: text/plain\r\n\r\n"; byte[] temp = asciiEncoding.GetBytes(header); stream.Write(temp, 0, temp.Length); } stream.Close(); log.Info("Close http " + url); client.Close(); } catch (Exception ee) { log.Error("Failed http ", ee); } } }
public void dowork(string logFile, string dirWithImages, float offsetseconds, bool dooffset) { DateTime localmin = DateTime.MaxValue; DateTime localmax = DateTime.MinValue; DateTime startTime = DateTime.MinValue; photocoords = new Hashtable(); timecoordcache = new Hashtable(); imagetotime = new Hashtable(); //logFile = @"C:\Users\hog\Pictures\farm 1-10-2011\100SSCAM\2011-10-01 11-48 1.log"; TXT_outputlog.AppendText("Read Log\n"); List<string[]> list = readLog(logFile); TXT_outputlog.AppendText("Log Read\n"); //dirWithImages = @"C:\Users\hog\Pictures\farm 1-10-2011\100SSCAM"; TXT_outputlog.AppendText("Read images\n"); string[] files = Directory.GetFiles(dirWithImages); TXT_outputlog.AppendText("images read\n"); Document kml = new Document(); StreamWriter sw4 = new StreamWriter(dirWithImages + Path.DirectorySeparatorChar + "loglocation.csv"); StreamWriter sw3 = new StreamWriter(dirWithImages + Path.DirectorySeparatorChar + "location.kml"); StreamWriter sw2 = new StreamWriter(dirWithImages + Path.DirectorySeparatorChar + "location.txt"); StreamWriter sw = new StreamWriter(dirWithImages + Path.DirectorySeparatorChar + "location.tel"); sw.WriteLine("version=1"); sw.WriteLine("#seconds offset - " + TXT_offsetseconds.Text); sw.WriteLine("#longitude and latitude - in degrees"); sw.WriteLine("#name utc longitude latitude height"); int first = 0; int matchs = 0; int lastmatchindex = 0; TXT_outputlog.AppendText("start Processing\n"); foreach (string filename in files) { if (filename.ToLower().EndsWith(".jpg") && !filename.ToLower().Contains("_geotag")) { DateTime photodt = getPhotoTime(filename); if (startTime == DateTime.MinValue) { startTime = new DateTime(photodt.Year, photodt.Month, photodt.Day, 0, 0, 0, 0, DateTimeKind.Utc).ToLocalTime(); foreach (string[] arr in list) { DateTime crap = startTime.AddMilliseconds(int.Parse(arr[1])).AddSeconds(offsetseconds); if (localmin > crap) localmin = crap; if (localmax < crap) localmax = crap; } log.InfoFormat("min " + localmin + " max " + localmax); TXT_outputlog.AppendText("Log min " + localmin + " max " + localmax + "\r\n"); } TXT_outputlog.AppendText("Photo " + Path.GetFileNameWithoutExtension(filename) + " time " + photodt + "\r\n"); //Application.DoEvents(); int a = 0; foreach (string[] arr in list) { a++; if (lastmatchindex > (a)) continue; if (a % 1000 == 0) Application.DoEvents(); DateTime logdt = startTime.AddMilliseconds(int.Parse(arr[1])).AddSeconds(offsetseconds); if (first == 0) { TXT_outputlog.AppendText("Photo " + Path.GetFileNameWithoutExtension(filename) + " " + photodt + " vs Log " + logdt + "\r\n"); TXT_outputlog.AppendText("offset should be about " + (photodt - logdt).TotalSeconds + "\r\n"); if (dooffset) return; first++; } // time has past, logs are in time order if (photodt < logdt.AddSeconds(-1)) { lastmatchindex = a; break; } //Console.Write("ph " + dt + " log " + crap + " \r"); timecoordcache[(long)(logdt.AddSeconds(-offsetseconds) - DateTime.MinValue).TotalSeconds] = new double[] { double.Parse(arr[latpos]), double.Parse(arr[lngpos]), double.Parse(arr[altpos]) }; sw4.WriteLine("ph " + filename + " " + photodt + " log " + logdt); if (photodt.ToString("yyyy-MM-ddTHH:mm:ss") == logdt.ToString("yyyy-MM-ddTHH:mm:ss")) { lastmatchindex = a; TXT_outputlog.AppendText("MATCH Photo " + Path.GetFileNameWithoutExtension(filename) + " " + photodt + "\r\n"); matchs++; SharpKml.Dom.Timestamp tstamp = new SharpKml.Dom.Timestamp(); tstamp.When = photodt; kml.AddFeature( new Placemark() { Time = tstamp, Name = Path.GetFileNameWithoutExtension(filename), Geometry = new SharpKml.Dom.Point() { Coordinate = new Vector(double.Parse(arr[latpos]), double.Parse(arr[lngpos]), double.Parse(arr[altpos])) }, Description = new Description() { Text = "<table><tr><td><img src=\"" + Path.GetFileName(filename).ToLower() + "\" width=500 /></td></tr></table>" }, StyleSelector = new Style() { Balloon = new BalloonStyle() { Text = "$[name]<br>$[description]" } } } ); photocoords[filename] = new double[] { double.Parse(arr[latpos]), double.Parse(arr[lngpos]), double.Parse(arr[altpos]), double.Parse(arr[cogpos]) }; imagetotime[filename] = (long)(logdt.AddSeconds(-offsetseconds) - DateTime.MinValue).TotalSeconds; sw2.WriteLine(Path.GetFileNameWithoutExtension(filename) + " " + arr[lngpos] + " " + arr[latpos] + " " + arr[altpos]); sw.WriteLine(Path.GetFileNameWithoutExtension(filename) + "\t" + logdt.ToString("yyyy:MM:dd HH:mm:ss") + "\t" + arr[lngpos] + "\t" + arr[latpos] + "\t" + arr[altpos]); sw.Flush(); sw2.Flush(); log.InfoFormat(Path.GetFileNameWithoutExtension(filename) + " " + arr[lngpos] + " " + arr[latpos] + " " + arr[altpos] + " "); break; } //Console.WriteLine(crap); } } } Serializer serializer = new Serializer(); serializer.Serialize(kml); sw3.Write(serializer.Xml); sw3.Close(); MainV2.instance.georefkml = serializer.Xml; writeGPX(dirWithImages + Path.DirectorySeparatorChar + "location.gpx"); sw4.Close(); sw2.Close(); sw.Close(); TXT_outputlog.AppendText("Done " + matchs + " matchs"); }
public void dowork(string logFile, string dirWithImages, float offsetseconds, bool dooffset) { DateTime localmin = DateTime.MaxValue; DateTime localmax = DateTime.MinValue; DateTime startTime = DateTime.MinValue; //logFile = @"C:\Users\hog\Pictures\farm 1-10-2011\100SSCAM\2011-10-01 11-48 1.log"; List<string[]> list = readLog(logFile); //dirWithImages = @"C:\Users\hog\Pictures\farm 1-10-2011\100SSCAM"; string[] files = Directory.GetFiles(dirWithImages); Document kml = new Document(); StreamWriter sw3 = new StreamWriter(dirWithImages + Path.DirectorySeparatorChar + "location.kml"); StreamWriter sw2 = new StreamWriter(dirWithImages + Path.DirectorySeparatorChar + "location.txt"); StreamWriter sw = new StreamWriter(dirWithImages + Path.DirectorySeparatorChar + "location.tel"); sw.WriteLine("version=1"); sw.WriteLine("#longitude and latitude - in degrees"); sw.WriteLine("#name utc longitude latitude height"); int first = 0; int matchs = 0; foreach (string file in files) { if (file.ToLower().EndsWith(".jpg")) { DateTime dt = getPhotoTime(file); if (startTime == DateTime.MinValue) { startTime = new DateTime(dt.Year, dt.Month, dt.Day, 0, 0, 0, 0, DateTimeKind.Utc).ToLocalTime(); foreach (string[] arr in list) { DateTime crap = startTime.AddMilliseconds(int.Parse(arr[1])).AddSeconds(offsetseconds); if (localmin > crap) localmin = crap; if (localmax < crap) localmax = crap; } Console.WriteLine("min " + localmin + " max " + localmax); TXT_outputlog.AppendText("Log min " + localmin + " max " + localmax + "\r\n"); } TXT_outputlog.AppendText("Photo " + Path.GetFileNameWithoutExtension(file) + " time " + dt + "\r\n"); foreach (string[] arr in list) { //Application.DoEvents(); DateTime crap = startTime.AddMilliseconds(int.Parse(arr[1])).AddSeconds(offsetseconds); if (first == 0) { TXT_outputlog.AppendText("Photo " + Path.GetFileNameWithoutExtension(file) + " " + dt + " vs Log " + crap + "\r\n"); TXT_outputlog.AppendText("offset should be about " + (dt - crap).TotalSeconds + "\r\n"); if (dooffset) return; first++; } //Console.Write("ph " + dt + " log " + crap + " \r"); if (dt.Equals(crap)) { TXT_outputlog.AppendText("MATCH Photo " + Path.GetFileNameWithoutExtension(file) + " " + dt + "\r\n"); matchs++; kml.AddFeature( new Placemark() { Name = Path.GetFileNameWithoutExtension(file), Geometry = new SharpKml.Dom.Point() { Coordinate = new Vector(double.Parse(arr[lngpos]), double.Parse(arr[latpos]), double.Parse(arr[altpos])) } } ); sw2.WriteLine(Path.GetFileNameWithoutExtension(file) + " " + arr[lngpos] + " " + arr[latpos] + " " + arr[altpos]); sw.WriteLine(Path.GetFileNameWithoutExtension(file) + "\t" + crap.ToString("yyyy:MM:dd HH:mm:ss") + "\t" + arr[lngpos] + "\t" + arr[latpos] + "\t" + arr[altpos]); sw.Flush(); sw2.Flush(); Console.WriteLine(Path.GetFileNameWithoutExtension(file) + " " + arr[lngpos] + " " + arr[latpos] + " " + arr[altpos] + " "); break; } //Console.WriteLine(crap); } } } Serializer serializer = new Serializer(); serializer.Serialize(kml); sw3.Write(serializer.Xml); sw3.Close(); sw2.Close(); sw.Close(); MessageBox.Show("Done " + matchs + " matchs"); }
public void TestSerialize() { var serializer = new Serializer(); var coords = new CoordinateCollection(); // First test empty. serializer.SerializeRaw(coords); Assert.That(serializer.Xml, Is.EqualTo("<coordinates xmlns=\"http://www.opengis.net/kml/2.2\" />")); // Now with a value. coords.Add(new Vector(1, 2, 3)); serializer.SerializeRaw(coords); string expected = string.Format(CultureInfo.InvariantCulture, XmlFormat, "2,1,3"); Assert.That(serializer.Xml, Is.EqualTo(expected)); }
public void DoAcceptTcpClientCallback(IAsyncResult ar) { // Get the listener that handles the client request. TcpListener listener = (TcpListener)ar.AsyncState; // End the operation and display the received data on // the console. using ( TcpClient client = listener.EndAcceptTcpClient(ar)) { // Signal the calling thread to continue. tcpClientConnected.Set(); try { // Get a stream object for reading and writing log.Info("Accepted Client " + client.Client.RemoteEndPoint.ToString()); //client.SendBufferSize = 100 * 1024; // 100kb //client.LingerState.Enabled = true; //client.NoDelay = true; // makesure we have valid image GCSViews.FlightData.myhud.streamjpgenable = true; NetworkStream stream = client.GetStream(); // 3 seconds stream.ReadTimeout = 3000; again: var asciiEncoding = new ASCIIEncoding(); var request = new byte[1024]; int len = stream.Read(request, 0, request.Length); string head = System.Text.Encoding.ASCII.GetString(request, 0, len); log.Info(head); int index = head.IndexOf('\n'); string url = head.Substring(0, index - 1); //url = url.Replace("\r", ""); //url = url.Replace("GET ",""); //url = url.Replace(" HTTP/1.0", ""); //url = url.Replace(" HTTP/1.1", ""); Tracking.AddEvent("HTTPServer", "Get", url, ""); ///////////////////////////////////////////////////////////////// if (url.Contains("websocket")) { using (var writer = new StreamWriter(stream, Encoding.Default)) { writer.WriteLine("HTTP/1.1 101 WebSocket Protocol Handshake"); writer.WriteLine("Upgrade: WebSocket"); writer.WriteLine("Connection: Upgrade"); writer.WriteLine("WebSocket-Location: ws://localhost:56781/websocket/server"); int start = head.IndexOf("Sec-WebSocket-Key:") + 19; int end = head.IndexOf('\r', start); if (end == -1) { end = head.IndexOf('\n', start); } string accept = ComputeWebSocketHandshakeSecurityHash09(head.Substring(start, end - start)); writer.WriteLine("Sec-WebSocket-Accept: " + accept); writer.WriteLine("Server: APM Planner"); writer.WriteLine(""); writer.Flush(); while (client.Connected) { Thread.Sleep(200); log.Debug(stream.DataAvailable + " " + client.Available); while (client.Available > 0) { Console.Write(stream.ReadByte()); } byte[] packet = new byte[256]; string sendme = MainV2.comPort.MAV.cs.roll + "," + MainV2.comPort.MAV.cs.pitch + "," + MainV2.comPort.MAV.cs.yaw; packet[0] = 0x81; // fin - binary packet[1] = (byte)sendme.Length; int i = 2; foreach (char ch in sendme) { packet[i++] = (byte)ch; } stream.Write(packet, 0, i); //break; } } } ///////////////////////////////////////////////////////////////// else if (url.Contains("georefnetwork.kml")) { string header = "HTTP/1.1 200 OK\r\nContent-Type: application/vnd.google-earth.kml+xml\r\nContent-Length: " + georefkml.Length + "\r\n\r\n"; byte[] temp = asciiEncoding.GetBytes(header); stream.Write(temp, 0, temp.Length); byte[] buffer = Encoding.ASCII.GetBytes(georefkml); stream.Write(buffer, 0, buffer.Length); goto again; //stream.Close(); } ///////////////////////////////////////////////////////////////// else if (url.Contains("network.kml")) { SharpKml.Dom.Document kml = new SharpKml.Dom.Document(); SharpKml.Dom.Placemark pmplane = new SharpKml.Dom.Placemark(); pmplane.Name = "P/Q " + MainV2.comPort.MAV.cs.altasl; pmplane.Visibility = true; SharpKml.Dom.Location loc = new SharpKml.Dom.Location(); loc.Latitude = MainV2.comPort.MAV.cs.lat; loc.Longitude = MainV2.comPort.MAV.cs.lng; loc.Altitude = MainV2.comPort.MAV.cs.altasl; if (loc.Altitude < 0) { loc.Altitude = 0.01; } SharpKml.Dom.Orientation ori = new SharpKml.Dom.Orientation(); ori.Heading = MainV2.comPort.MAV.cs.yaw; ori.Roll = -MainV2.comPort.MAV.cs.roll; ori.Tilt = -MainV2.comPort.MAV.cs.pitch; SharpKml.Dom.Scale sca = new SharpKml.Dom.Scale(); sca.X = 2; sca.Y = 2; sca.Z = 2; SharpKml.Dom.Model model = new SharpKml.Dom.Model(); model.Location = loc; model.Orientation = ori; model.AltitudeMode = SharpKml.Dom.AltitudeMode.Absolute; model.Scale = sca; SharpKml.Dom.Link link = new SharpKml.Dom.Link(); link.Href = new Uri("block_plane_0.dae", UriKind.Relative); model.Link = link; pmplane.Geometry = model; SharpKml.Dom.LookAt la = new SharpKml.Dom.LookAt() { Altitude = loc.Altitude.Value, Latitude = loc.Latitude.Value, Longitude = loc.Longitude.Value, Tilt = 80, Heading = MainV2.comPort.MAV.cs.yaw, AltitudeMode = SharpKml.Dom.AltitudeMode.Absolute, Range = 50 }; if (loc.Latitude.Value != 0 && loc.Longitude.Value != 0) { kml.Viewpoint = la; kml.AddFeature(pmplane); } SharpKml.Dom.CoordinateCollection coords = new SharpKml.Dom.CoordinateCollection(); //if (loc.Latitude.Value != 0 && loc.Longitude.Value != 0) { //foreach (var point in MainV2.comPort.MAV.wps.Values) { // coords.Add(new SharpKml.Base.Vector(point.x, point.y, point.z)); } } //else { PointLatLngAlt home = null; // draw track try { foreach (var point in GCSViews.FlightPlanner.instance.fullpointlist) { if (point.Tag.ToLower().Contains("home")) { home = point; } if (point != null) { coords.Add(new SharpKml.Base.Vector(point.Lat, point.Lng, point.Alt)); } } } catch { } foreach (var point in GCSViews.FlightPlanner.instance.fullpointlist) { if (point == null) { continue; } SharpKml.Dom.Placemark wp = new SharpKml.Dom.Placemark(); wp.Name = "WP " + point.Tag + " Alt: " + point.Alt; SharpKml.Dom.Point wppoint = new SharpKml.Dom.Point(); var altmode = SharpKml.Dom.AltitudeMode.RelativeToGround; wppoint.AltitudeMode = altmode; wppoint.Coordinate = new Vector() { Latitude = point.Lat, Longitude = point.Lng, Altitude = point.Alt }; wp.Geometry = wppoint; kml.AddFeature(wp); } } SharpKml.Dom.LineString ls = new SharpKml.Dom.LineString(); ls.AltitudeMode = SharpKml.Dom.AltitudeMode.RelativeToGround; ls.Coordinates = coords; ls.Extrude = false; ls.Tessellate = true; Style style = new Style(); style.Id = "yellowLineGreenPoly"; style.Line = new LineStyle(new Color32(HexStringToColor("ff00ffff")), 4); Style style2 = new Style(); style2.Id = "yellowLineGreenPoly"; style2.Line = new LineStyle(new Color32(HexStringToColor("7f00ffff")), 4); // above ground SharpKml.Dom.Placemark pm = new SharpKml.Dom.Placemark() { Geometry = ls, Name = "WPs", StyleSelector = style }; kml.AddFeature(pm); // on ground SharpKml.Dom.LineString ls2 = new SharpKml.Dom.LineString(); ls2.Coordinates = coords; ls2.Extrude = false; ls2.Tessellate = true; ls2.AltitudeMode = SharpKml.Dom.AltitudeMode.ClampToGround; SharpKml.Dom.Placemark pm2 = new SharpKml.Dom.Placemark() { Geometry = ls2, Name = "onground", StyleSelector = style2 }; kml.AddFeature(pm2); SharpKml.Base.Serializer serializer = new SharpKml.Base.Serializer(); serializer.Serialize(kml); byte[] buffer = Encoding.ASCII.GetBytes(serializer.Xml); string header = "HTTP/1.1 200 OK\r\nContent-Type: application/vnd.google-earth.kml+xml\r\nContent-Length: " + buffer.Length + "\r\n\r\n"; byte[] temp = asciiEncoding.GetBytes(header); stream.Write(temp, 0, temp.Length); stream.Write(buffer, 0, buffer.Length); goto again; //stream.Close(); } ///////////////////////////////////////////////////////////////// else if (url.Contains("block_plane_0.dae")) { string header = "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\n\r\n"; byte[] temp = asciiEncoding.GetBytes(header); stream.Write(temp, 0, temp.Length); BinaryReader file = new BinaryReader(File.Open("block_plane_0.dae", FileMode.Open, FileAccess.Read, FileShare.Read)); byte[] buffer = new byte[1024]; while (file.PeekChar() != -1) { int leng = file.Read(buffer, 0, buffer.Length); stream.Write(buffer, 0, leng); } file.Close(); stream.Close(); } ///////////////////////////////////////////////////////////////// else if (url.Contains("hud.html")) { string header = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n"; byte[] temp = asciiEncoding.GetBytes(header); stream.Write(temp, 0, temp.Length); BinaryReader file = new BinaryReader(File.Open("hud.html", FileMode.Open, FileAccess.Read, FileShare.Read)); byte[] buffer = new byte[1024]; while (file.PeekChar() != -1) { int leng = file.Read(buffer, 0, buffer.Length); stream.Write(buffer, 0, leng); } file.Close(); stream.Close(); } ///////////////////////////////////////////////////////////////// else if (url.ToLower().Contains("hud.jpg") || url.ToLower().Contains("map.jpg") || url.ToLower().Contains("both.jpg")) { refreshmap(); string header = "HTTP/1.1 200 OK\r\nContent-Type: multipart/x-mixed-replace;boundary=APMPLANNER\r\n\r\n--APMPLANNER\r\n"; byte[] temp = asciiEncoding.GetBytes(header); stream.Write(temp, 0, temp.Length); while (client.Connected) { System.Threading.Thread.Sleep(200); // 5hz byte[] data = null; if (url.ToLower().Contains("hud")) { GCSViews.FlightData.myhud.streamjpgenable = true; data = GCSViews.FlightData.myhud.streamjpg.ToArray(); } else if (url.ToLower().Contains("map")) { data = GetControlJpegRaw(GCSViews.FlightData.mymap); } else { GCSViews.FlightData.myhud.streamjpgenable = true; Image img1 = Image.FromStream(GCSViews.FlightData.myhud.streamjpg); Image img2 = GetControlJpeg(GCSViews.FlightData.mymap); int bigger = img1.Height > img2.Height ? img1.Height : img2.Height; Image imgout = new Bitmap(img1.Width + img2.Width, bigger); Graphics grap = Graphics.FromImage(imgout); grap.DrawImageUnscaled(img1, 0, 0); grap.DrawImageUnscaled(img2, img1.Width, 0); MemoryStream streamjpg = new MemoryStream(); imgout.Save(streamjpg, System.Drawing.Imaging.ImageFormat.Jpeg); data = streamjpg.ToArray(); } header = "Content-Type: image/jpeg\r\nContent-Length: " + data.Length + "\r\n\r\n"; temp = asciiEncoding.GetBytes(header); stream.Write(temp, 0, temp.Length); stream.Write(data, 0, data.Length); header = "\r\n--APMPLANNER\r\n"; temp = asciiEncoding.GetBytes(header); stream.Write(temp, 0, temp.Length); } GCSViews.FlightData.myhud.streamjpgenable = false; stream.Close(); } ///////////////////////////////////////////////////////////////// else if (url.Contains("/guided?")) { //http://127.0.0.1:56781/guided?lat=-34&lng=117.8&alt=30 Regex rex = new Regex(@"lat=([\-\.0-9]+)&lng=([\-\.0-9]+)&alt=([\.0-9]+)", RegexOptions.IgnoreCase); Match match = rex.Match(url); if (match.Success) { Locationwp gwp = new Locationwp() { lat = double.Parse(match.Groups[1].Value), lng = double.Parse(match.Groups[2].Value), alt = float.Parse(match.Groups[3].Value) }; try { MainV2.comPort.setGuidedModeWP(gwp); } catch { } string header = "HTTP/1.1 200 OK\r\n\r\nSent Guide Mode Wp"; byte[] temp = asciiEncoding.GetBytes(header); stream.Write(temp, 0, temp.Length); } else { string header = "HTTP/1.1 200 OK\r\n\r\nFailed Guide Mode Wp"; byte[] temp = asciiEncoding.GetBytes(header); stream.Write(temp, 0, temp.Length); } stream.Close(); } ///////////////////////////////////////////////////////////////// else if (url.ToLower().Contains(".jpg")) { Regex rex = new Regex(@"([^\s]+)\s(.+)\sHTTP/1", RegexOptions.IgnoreCase); Match match = rex.Match(url); if (match.Success) { string fileurl = match.Groups[2].Value; using (Image orig = Image.FromFile(georefimagepath + fileurl)) using (Image resi = ResizeImage(orig, new Size(640, 480))) using (MemoryStream memstream = new MemoryStream()) { resi.Save(memstream, System.Drawing.Imaging.ImageFormat.Jpeg); memstream.Position = 0; string header = "HTTP/1.1 200 OK\r\nContent-Type: image/jpg\r\nContent-Length: " + memstream.Length + "\r\n\r\n"; byte[] temp = asciiEncoding.GetBytes(header); stream.Write(temp, 0, temp.Length); using (BinaryReader file = new BinaryReader(memstream)) { byte[] buffer = new byte[1024]; while (file.BaseStream.Position < file.BaseStream.Length) { int leng = file.Read(buffer, 0, buffer.Length); stream.Write(buffer, 0, leng); } } } goto again; //stream.Close(); } ///////////////////////////////////////////////////////////////// else { string header = "HTTP/1.1 404 not found\r\nContent-Type: image/jpg\r\n\r\n"; byte[] temp = asciiEncoding.GetBytes(header); stream.Write(temp, 0, temp.Length); } stream.Close(); } ///////////////////////////////////////////////////////////////// else if (url.ToLower().Contains("post /guide")) { Regex rex = new Regex(@"lat"":([\-\.0-9]+),""lon"":([\-\.0-9]+),""alt"":([\.0-9]+)", RegexOptions.IgnoreCase); Match match = rex.Match(head); if (match.Success) { Locationwp gwp = new Locationwp() { lat = double.Parse(match.Groups[1].Value), lng = double.Parse(match.Groups[2].Value), alt = float.Parse(match.Groups[3].Value) }; try { MainV2.comPort.setGuidedModeWP(gwp); } catch { } string header = "HTTP/1.1 200 OK\r\n\r\nSent Guide Mode Wp"; byte[] temp = asciiEncoding.GetBytes(header); stream.Write(temp, 0, temp.Length); } else { string header = "HTTP/1.1 200 OK\r\n\r\nFailed Guide Mode Wp"; byte[] temp = asciiEncoding.GetBytes(header); stream.Write(temp, 0, temp.Length); } stream.Close(); } ///////////////////////////////////////////////////////////////// else if (url.ToLower().Contains("/command_long")) { string header = "HTTP/1.1 404 not found\r\nContent-Type: image/jpg\r\n\r\n"; byte[] temp = asciiEncoding.GetBytes(header); stream.Write(temp, 0, temp.Length); stream.Close(); } ///////////////////////////////////////////////////////////////// else if (url.ToLower().Contains("/rcoverride")) { string header = "HTTP/1.1 404 not found\r\nContent-Type: image/jpg\r\n\r\n"; byte[] temp = asciiEncoding.GetBytes(header); stream.Write(temp, 0, temp.Length); stream.Close(); } ///////////////////////////////////////////////////////////////// else if (url.ToLower().Contains("/get_mission")) { string header = "HTTP/1.1 404 not found\r\nContent-Type: image/jpg\r\n\r\n"; byte[] temp = asciiEncoding.GetBytes(header); stream.Write(temp, 0, temp.Length); stream.Close(); } ///////////////////////////////////////////////////////////////// else if (url.ToLower().Contains("/mavlink/")) { /* * GET /mavlink/ATTITUDE+VFR_HUD+NAV_CONTROLLER_OUTPUT+META_WAYPOINT+GPS_RAW_INT+HEARTBEAT+META_LINKQUALITY+GPS_STATUS+STATUSTEXT+SYS_STATUS?_=1355828718540 HTTP/1.1 * Host: ubuntu:9999 * Connection: keep-alive * X-Requested-With: XMLHttpRequest * User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11 * Accept: * Referer: http://ubuntu:9999/index.html * Accept-Encoding: gzip,deflate,sdch * Accept-Language: en-GB,en-US;q=0.8,en;q=0.6 * Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 * * HTTP/1.1 200 OK * Content-Type: application/json * Content-Length: 2121 * Date: Thu, 29 Nov 2012 12:13:38 GMT * Server: ubuntu * * { * "VFR_HUD": {"msg": {"throttle": 0, "groundspeed": 0.0, "airspeed": 0.0, "climb": 0.0, "mavpackettype": "VFR_HUD", "alt": -0.47999998927116394, "heading": 108}, "index": 687, "time_usec": 0}, * "STATUSTEXT": {"msg": {"mavpackettype": "STATUSTEXT", "severity": 1, "text": "Initialising APM..."}, "index": 2, "time_usec": 0}, * "SYS_STATUS": {"msg": {"onboard_control_sensors_present": 4294966287, "load": 0, "battery_remaining": -1, "errors_count4": 0, "drop_rate_comm": 0, "errors_count2": 0, "errors_count3": 0, "errors_comm": 0, "current_battery": -1, "errors_count1": 0, "onboard_control_sensors_health": 4294966287, "mavpackettype": "SYS_STATUS", "onboard_control_sensors_enabled": 4294945807, "voltage_battery": 10080}, "index": 693, "time_usec": 0}, * "META_LINKQUALITY": {"msg": {"master_in": 11110, "mav_loss": 0, "mavpackettype": "META_LINKQUALITY", "master_out": 194, "packet_loss": 0.0}, "index": 194, "time_usec": 0}, * "ATTITUDE": {"msg": {"pitchspeed": -0.000976863200776279, "yaw": 1.8878594636917114, "rollspeed": -0.0030046366155147552, "time_boot_ms": 194676, "pitch": -0.09986469894647598, "mavpackettype": "ATTITUDE", "yawspeed": -0.0015030358918011189, "roll": -0.029391441494226456}, "index": 687, "time_usec": 0}, * "GPS_RAW_INT": {"msg": {"fix_type": 1, "cog": 0, "epv": 65535, "lon": 0, "time_usec": 0, "eph": 9999, "satellites_visible": 0, "lat": 0, "mavpackettype": "GPS_RAW_INT", "alt": 137000, "vel": 0}, "index": 687, "time_usec": 0}, * "HEARTBEAT": {"msg": {"custom_mode": 0, "system_status": 4, "base_mode": 81, "autopilot": 3, "mavpackettype": "HEARTBEAT", "type": 2, "mavlink_version": 3}, "index": 190, "time_usec": 0}, * "GPS_STATUS": {"msg": {"satellite_snr": "", "satellite_azimuth": "", "satellite_prn": "", "satellite_elevation": "", "satellites_visible": 0, "satellite_used": "", "mavpackettype": "GPS_STATUS"}, "index": 2, "time_usec": 0}, * "NAV_CONTROLLER_OUTPUT": {"msg": {"wp_dist": 0, "nav_pitch": 0.0, "target_bearing": 0, "nav_roll": 0.0, "aspd_error": 0.0, "alt_error": 0.0, "mavpackettype": "NAV_CONTROLLER_OUTPUT", "xtrack_error": 0.0, "nav_bearing": 0}, "index": 687, "time_usec": 0}} */ JavaScriptSerializer serializer = new JavaScriptSerializer(); object[] data = new object[20]; Messagejson message = new Messagejson(); if (MainV2.comPort.MAV.packets[(byte)MAVLink.MAVLINK_MSG_ID.ATTITUDE] != null) { message.ATTITUDE = new Message2() { index = MainV2.comPort.MAV.packetseencount[(byte)MAVLink.MAVLINK_MSG_ID.ATTITUDE], msg = MainV2.comPort.MAV.packets[(byte)MAVLink.MAVLINK_MSG_ID.ATTITUDE].ByteArrayToStructure <MAVLink.mavlink_attitude_t>(6) } } ; if (MainV2.comPort.MAV.packets[(byte)MAVLink.MAVLINK_MSG_ID.VFR_HUD] != null) { message.VFR_HUD = new Message2() { index = MainV2.comPort.MAV.packetseencount[(byte)MAVLink.MAVLINK_MSG_ID.VFR_HUD], msg = MainV2.comPort.MAV.packets[(byte)MAVLink.MAVLINK_MSG_ID.VFR_HUD].ByteArrayToStructure <MAVLink.mavlink_vfr_hud_t>(6) } } ; if (MainV2.comPort.MAV.packets[(byte)MAVLink.MAVLINK_MSG_ID.NAV_CONTROLLER_OUTPUT] != null) { message.NAV_CONTROLLER_OUTPUT = new Message2() { index = MainV2.comPort.MAV.packetseencount[(byte)MAVLink.MAVLINK_MSG_ID.NAV_CONTROLLER_OUTPUT], msg = MainV2.comPort.MAV.packets[(byte)MAVLink.MAVLINK_MSG_ID.NAV_CONTROLLER_OUTPUT].ByteArrayToStructure <MAVLink.mavlink_nav_controller_output_t>(6) } } ; if (MainV2.comPort.MAV.packets[(byte)MAVLink.MAVLINK_MSG_ID.GPS_RAW_INT] != null) { message.GPS_RAW_INT = new Message2() { index = MainV2.comPort.MAV.packetseencount[(byte)MAVLink.MAVLINK_MSG_ID.GPS_RAW_INT], msg = MainV2.comPort.MAV.packets[(byte)MAVLink.MAVLINK_MSG_ID.GPS_RAW_INT].ByteArrayToStructure <MAVLink.mavlink_gps_raw_int_t>(6) } } ; if (MainV2.comPort.MAV.packets[(byte)MAVLink.MAVLINK_MSG_ID.HEARTBEAT] != null) { message.HEARTBEAT = new Message2() { index = MainV2.comPort.MAV.packetseencount[(byte)MAVLink.MAVLINK_MSG_ID.HEARTBEAT], msg = MainV2.comPort.MAV.packets[(byte)MAVLink.MAVLINK_MSG_ID.HEARTBEAT].ByteArrayToStructure <MAVLink.mavlink_heartbeat_t>(6) } } ; if (MainV2.comPort.MAV.packets[(byte)MAVLink.MAVLINK_MSG_ID.GPS_STATUS] != null) { message.GPS_STATUS = new Message2() { index = MainV2.comPort.MAV.packetseencount[(byte)MAVLink.MAVLINK_MSG_ID.GPS_STATUS], msg = MainV2.comPort.MAV.packets[(byte)MAVLink.MAVLINK_MSG_ID.GPS_STATUS].ByteArrayToStructure <MAVLink.mavlink_gps_status_t>(6) } } ; if (MainV2.comPort.MAV.packets[(byte)MAVLink.MAVLINK_MSG_ID.STATUSTEXT] != null) { message.STATUSTEXT = new Message2() { index = MainV2.comPort.MAV.packetseencount[(byte)MAVLink.MAVLINK_MSG_ID.STATUSTEXT], msg = MainV2.comPort.MAV.packets[(byte)MAVLink.MAVLINK_MSG_ID.STATUSTEXT].ByteArrayToStructure <MAVLink.mavlink_statustext_t>(6) } } ; if (MainV2.comPort.MAV.packets[(byte)MAVLink.MAVLINK_MSG_ID.SYS_STATUS] != null) { message.SYS_STATUS = new Message2() { index = MainV2.comPort.MAV.packetseencount[(byte)MAVLink.MAVLINK_MSG_ID.SYS_STATUS], msg = MainV2.comPort.MAV.packets[(byte)MAVLink.MAVLINK_MSG_ID.SYS_STATUS].ByteArrayToStructure <MAVLink.mavlink_sys_status_t>(6) } } ; message.META_LINKQUALITY = message.SYS_STATUS = new Message2() { index = packetindex, time_usec = 0, msg = new META_LINKQUALITY() { master_in = (int)MainV2.comPort.packetsnotlost, mavpackettype = "META_LINKQUALITY", master_out = MainV2.comPort.packetcount, packet_loss = 100 - MainV2.comPort.MAV.cs.linkqualitygcs, mav_loss = 0 } }; packetindex++; string output = serializer.Serialize(message); string header = "HTTP/1.1 200 OK\r\nContent-Type: application/json\r\nContent-Length: " + output.Length + "\r\n\r\n"; byte[] temp = asciiEncoding.GetBytes(header); stream.Write(temp, 0, temp.Length); temp = asciiEncoding.GetBytes(output); stream.Write(temp, 0, temp.Length); goto again; //stream.Close(); } ///////////////////////////////////////////////////////////////// else if (url.ToLower().Contains("/mav/")) { //C:\Users\hog\Desktop\DIYDrones\mavelous\modules\lib\mavelous_web Regex rex = new Regex(@"([^\s]+)\s(.+)\sHTTP/1", RegexOptions.IgnoreCase); Match match = rex.Match(url); if (match.Success) { string fileurl = match.Groups[2].Value; fileurl = fileurl.Replace("/mav/", ""); if (fileurl == "" || fileurl == "/") { fileurl = "index.html"; } string header = "HTTP/1.1 200 OK\r\n"; if (fileurl.Contains(".html")) { header += "Content-Type: text/html\r\n\r\n"; } else if (fileurl.Contains(".js")) { header += "Content-Type: application/x-javascript\r\n\r\n"; } else if (fileurl.Contains(".css")) { header += "Content-Type: text/css\r\n\r\n"; } else { header += "Content-Type: text/plain\r\n\r\n"; } byte[] temp = asciiEncoding.GetBytes(header); stream.Write(temp, 0, temp.Length); BinaryReader file = new BinaryReader(File.Open(mavelous_web + fileurl, FileMode.Open, FileAccess.Read, FileShare.Read)); byte[] buffer = new byte[1024]; while (file.BaseStream.Position < file.BaseStream.Length) { int leng = file.Read(buffer, 0, buffer.Length); stream.Write(buffer, 0, leng); } file.Close(); stream.Close(); } ///////////////////////////////////////////////////////////////// else { string header = "HTTP/1.1 404 not found\r\nContent-Type: image/jpg\r\n\r\n"; byte[] temp = asciiEncoding.GetBytes(header); stream.Write(temp, 0, temp.Length); stream.Close(); } } ///////////////////////////////////////////////////////////////// else { Console.WriteLine(url); string header = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n"; byte[] temp = asciiEncoding.GetBytes(header); stream.Write(temp, 0, temp.Length); string content = @" <a href=/mav/>Mavelous</a> <a href=/mavlink/>Mavelous traffic</a> <a href=/hud.jpg>Hud image</a> <a href=/map.jpg>Map image </a> <a href=/both.jpg>Map & hud image</a> <a href=/hud.html>hud html5</a> <a href=/network.kml>network kml</a> "; temp = asciiEncoding.GetBytes(content); stream.Write(temp, 0, temp.Length); } stream.Close(); } catch (Exception ee) { log.Error("Failed http ", ee); } } }
private void CreateReportFiles(Dictionary<string, PictureInformation> listPhotosWithInfo, string dirWithImages, float offset) { // Write report files Document kml = new Document(); // Clear Stations IDs JXL_StationIDs.Clear(); using (StreamWriter swlogloccsv = new StreamWriter(dirWithImages + Path.DirectorySeparatorChar + "loglocation.csv")) using (StreamWriter swlockml = new StreamWriter(dirWithImages + Path.DirectorySeparatorChar + "location.kml")) using (StreamWriter swloctxt = new StreamWriter(dirWithImages + Path.DirectorySeparatorChar + "location.txt")) using (StreamWriter swloctel = new StreamWriter(dirWithImages + Path.DirectorySeparatorChar + "location.tel")) using (XmlTextWriter swloctrim = new XmlTextWriter(dirWithImages + Path.DirectorySeparatorChar + "location.jxl", Encoding.ASCII)) { swloctrim.Formatting = Formatting.Indented; swloctrim.WriteStartDocument(false); swloctrim.WriteStartElement("JOBFile"); swloctrim.WriteAttributeString("jobName", "MPGeoRef"); swloctrim.WriteAttributeString("product", "Gatewing"); swloctrim.WriteAttributeString("productVersion", "1.0"); swloctrim.WriteAttributeString("version", "5.6"); // enviro swloctrim.WriteStartElement("Environment"); swloctrim.WriteStartElement("CoordinateSystem"); swloctrim.WriteElementString("SystemName", "Default"); swloctrim.WriteElementString("ZoneName", "Default"); swloctrim.WriteElementString("DatumName", "WGS 1984"); swloctrim.WriteStartElement("Ellipsoid"); swloctrim.WriteElementString("EarthRadius", "6378137"); swloctrim.WriteElementString("Flattening", "0.00335281067183"); swloctrim.WriteEndElement(); swloctrim.WriteStartElement("Projection"); swloctrim.WriteElementString("Type", "NoProjection"); swloctrim.WriteElementString("Scale", "1"); swloctrim.WriteElementString("GridOrientation", "IncreasingNorthEast"); swloctrim.WriteElementString("SouthAzimuth", "false"); swloctrim.WriteElementString("ApplySeaLevelCorrection", "true"); swloctrim.WriteEndElement(); swloctrim.WriteStartElement("LocalSite"); swloctrim.WriteElementString("Type", "Grid"); swloctrim.WriteElementString("ProjectLocationLatitude", ""); swloctrim.WriteElementString("ProjectLocationLongitude", ""); swloctrim.WriteElementString("ProjectLocationHeight", ""); swloctrim.WriteEndElement(); swloctrim.WriteStartElement("Datum"); swloctrim.WriteElementString("Type", "ThreeParameter"); swloctrim.WriteElementString("GridName", "WGS 1984"); swloctrim.WriteElementString("Direction", "WGS84ToLocal"); swloctrim.WriteElementString("EarthRadius", "6378137"); swloctrim.WriteElementString("Flattening", "0.00335281067183"); swloctrim.WriteElementString("TranslationX", "0"); swloctrim.WriteElementString("TranslationY", "0"); swloctrim.WriteElementString("TranslationZ", "0"); swloctrim.WriteEndElement(); swloctrim.WriteStartElement("HorizontalAdjustment"); swloctrim.WriteElementString("Type", "NoAdjustment"); swloctrim.WriteEndElement(); swloctrim.WriteStartElement("VerticalAdjustment"); swloctrim.WriteElementString("Type", "NoAdjustment"); swloctrim.WriteEndElement(); swloctrim.WriteStartElement("CombinedScaleFactor"); swloctrim.WriteStartElement("Location"); swloctrim.WriteElementString("Latitude", ""); swloctrim.WriteElementString("Longitude", ""); swloctrim.WriteElementString("Height", ""); swloctrim.WriteEndElement(); swloctrim.WriteElementString("Scale", ""); swloctrim.WriteEndElement(); swloctrim.WriteEndElement(); swloctrim.WriteEndElement(); // fieldbook swloctrim.WriteStartElement("FieldBook"); swloctrim.WriteRaw(@" <CameraDesignRecord ID='00000001'> <Type>GoPro </Type> <HeightPixels>2400</HeightPixels> <WidthPixels>3200</WidthPixels> <PixelSize>0.0000022</PixelSize> <LensModel>Rectilinear</LensModel> <NominalFocalLength>0.002</NominalFocalLength> </CameraDesignRecord> <CameraRecord2 ID='00000002'> <CameraDesignID>00000001</CameraDesignID> <CameraPosition>01</CameraPosition> <Optics> <IdealAngularMagnification>1.0</IdealAngularMagnification> <AngleSymmetricDistortion> <Order3>-0.35</Order3> <Order5>0.15</Order5> <Order7>-0.033</Order7> <Order9> 0</Order9> </AngleSymmetricDistortion> <AngleDecenteringDistortion> <Column>0</Column> <Row>0</Row> </AngleDecenteringDistortion> </Optics> <Geometry> <PerspectiveCenterPixels> <PrincipalPointColumn>-1615.5</PrincipalPointColumn> <PrincipalPointRow>-1187.5</PrincipalPointRow> <PrincipalDistance>-2102</PrincipalDistance> </PerspectiveCenterPixels> <VectorOffset> <X>0</X> <Y>0</Y> <Z>0</Z> </VectorOffset> <BiVectorAngle> <XX>0</XX> <YY>0</YY> <ZZ>-1.5707963268</ZZ> </BiVectorAngle> </Geometry> </CameraRecord2>"); // 2mm fl // res 2400 * 3200 = 7,680,000 // sensor size = 1/2.5" - 5.70 × 4.28 mm // 2.2 μm // fl in pixels = fl in mm * res / sensor size swloctrim.WriteStartElement("PhotoInstrumentRecord"); swloctrim.WriteAttributeString("ID", "0000000E"); swloctrim.WriteElementString("Type", "Aerial"); swloctrim.WriteElementString("Model", "X100"); swloctrim.WriteElementString("Serial", "000-000"); swloctrim.WriteElementString("FirmwareVersion", "v0.0"); swloctrim.WriteElementString("UserDefinedName", "Prototype"); swloctrim.WriteEndElement(); swloctrim.WriteStartElement("AtmosphereRecord"); swloctrim.WriteAttributeString("ID", "0000000F"); swloctrim.WriteElementString("Pressure", ""); swloctrim.WriteElementString("Temperature", ""); swloctrim.WriteElementString("PPM", ""); swloctrim.WriteElementString("ApplyEarthCurvatureCorrection", "false"); swloctrim.WriteElementString("ApplyRefractionCorrection", "false"); swloctrim.WriteElementString("RefractionCoefficient", "0"); swloctrim.WriteElementString("PressureInputMethod", "ReadFromInstrument"); swloctrim.WriteEndElement(); swloctel.WriteLine("version=1"); swloctel.WriteLine("#seconds offset - " + offset); swloctel.WriteLine("#longitude and latitude - in degrees"); swloctel.WriteLine("#name utc longitude latitude height"); swloctxt.WriteLine("#name longitude/X latitude/Y height/Z yaw pitch roll"); TXT_outputlog.AppendText("Start Processing\n"); // Dont know why but it was 10 in the past so let it be. Used to generate jxl file simulating x100 from trimble int lastRecordN = JXL_ID_OFFSET; // path CoordinateCollection coords = new CoordinateCollection(); foreach (var item in vehicleLocations.Values) { coords.Add(new SharpKml.Base.Vector(item.Lat, item.Lon, item.AltAMSL)); } var ls = new LineString() { Coordinates = coords, AltitudeMode = AltitudeMode.Absolute }; SharpKml.Dom.Placemark pm = new SharpKml.Dom.Placemark() { Geometry = ls, Name = "path" }; kml.AddFeature(pm); foreach (PictureInformation picInfo in listPhotosWithInfo.Values) { string filename = Path.GetFileName(picInfo.Path); string filenameWithoutExt = Path.GetFileNameWithoutExtension(picInfo.Path); SharpKml.Dom.Timestamp tstamp = new SharpKml.Dom.Timestamp(); tstamp.When = picInfo.Time; kml.AddFeature( new Placemark() { Time = tstamp, Visibility = true, Name = filenameWithoutExt, Geometry = new SharpKml.Dom.Point() { Coordinate = new Vector(picInfo.Lat, picInfo.Lon, picInfo.AltAMSL), AltitudeMode = AltitudeMode.Absolute }, Description = new Description() { Text = "<table><tr><td><img src=\"" + filename.ToLower() + "\" width=500 /></td></tr></table>" }, StyleSelector = new Style() { Balloon = new BalloonStyle() { Text = "$[name]<br>$[description]" } } } ); double lat = picInfo.Lat; double lng = picInfo.Lon; double alpha = picInfo.Yaw + (double)num_camerarotation.Value;; RectangleF rect = getboundingbox(lat, lng, alpha, (double)num_hfov.Value, (double)num_vfov.Value); Console.WriteLine(rect); //http://en.wikipedia.org/wiki/World_file /* using (StreamWriter swjpw = new StreamWriter(dirWithImages + Path.DirectorySeparatorChar + Path.GetFileNameWithoutExtension(filename) + ".jgw")) { swjpw.WriteLine((rect.Height / 2448.0).ToString("0.00000000000000000")); swjpw.WriteLine((0).ToString("0.00000000000000000")); // swjpw.WriteLine((0).ToString("0.00000000000000000")); // swjpw.WriteLine((rect.Width / -3264.0).ToString("0.00000000000000000")); // distance per pixel swjpw.WriteLine((rect.Left).ToString("0.00000000000000000")); swjpw.WriteLine((rect.Top).ToString("0.00000000000000000")); swjpw.Close(); }*/ kml.AddFeature( new GroundOverlay() { Name = filenameWithoutExt, Visibility = false, Time = tstamp, AltitudeMode = AltitudeMode.ClampToGround, Bounds = new LatLonBox() { Rotation = -alpha % 360, North = rect.Bottom, East = rect.Right, West = rect.Left, South = rect.Top, }, Icon = new SharpKml.Dom.Icon() { Href = new Uri(filename.ToLower(), UriKind.Relative), }, } ); swloctxt.WriteLine(filename + " " + picInfo.Lat + " " + picInfo.Lon + " " + picInfo.getAltitude(useAMSLAlt) + " " + picInfo.Yaw + " " + picInfo.Pitch + " " + picInfo.Roll); swloctel.WriteLine(filename + "\t" + picInfo.Time.ToString("yyyy:MM:dd HH:mm:ss") + "\t" + picInfo.Lon + "\t" + picInfo.Lat + "\t" + picInfo.getAltitude(useAMSLAlt)); swloctel.Flush(); swloctxt.Flush(); lastRecordN = GenPhotoStationRecord(swloctrim, picInfo.Path, picInfo.Lat, picInfo.Lon, picInfo.getAltitude(useAMSLAlt), 0, 0, picInfo.Yaw, picInfo.Width, picInfo.Height, lastRecordN); log.InfoFormat(filename + " " + picInfo.Lon + " " + picInfo.Lat + " " + picInfo.getAltitude(useAMSLAlt) + " "); } Serializer serializer = new Serializer(); serializer.Serialize(kml); swlockml.Write(serializer.Xml); Utilities.httpserver.georefkml = serializer.Xml; Utilities.httpserver.georefimagepath = dirWithImages + Path.DirectorySeparatorChar; writeGPX(dirWithImages + Path.DirectorySeparatorChar + "location.gpx", listPhotosWithInfo); // flightmission GenFlightMission(swloctrim, lastRecordN); swloctrim.WriteEndElement(); // fieldbook swloctrim.WriteEndElement(); // job swloctrim.WriteEndDocument(); TXT_outputlog.AppendText("Done \n\n"); } }
public void TestLegacyKml() { const string Xml = "<kml xmlns=\"http://earth.google.com/kml/2.2\">" + "<Placemark>" + "<name>My Placemark</name>" + "</Placemark>" + "</kml>"; var parser = new Parser(); parser.ParseString(Xml, false); Kml root = parser.Root as Kml; Assert.That(root, Is.Not.Null); // Make sure it didn't add the old namespace Assert.That(root.Namespaces.GetNamespacesInScope(XmlNamespaceScope.ExcludeXml), Is.Not.Contains(string.Empty)); // Make sure it serializes Serializer serializer = new Serializer(); Assert.That(() => serializer.Serialize(root), Throws.Nothing); Assert.That(serializer.Xml, Is.Not.Null.Or.Empty); }