feyris-tan ef86554f9a Import
2025-05-12 22:09:16 +02:00

141 lines
4.6 KiB
C#

using GeoCoordinatePortable;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using skyscraper5.Skyscraper.Scraper.Storage.InMemory.Model;
using AprsSharp.Parsers.Aprs;
using skyscraper5.Skyscraper;
using skyscraper5.Aprs.AprsSharp;
using System.IO;
namespace skyscraper5.Aprs.AprsStorage
{
internal class AprsFilesystemStorage : LX9SESStorage
{
public AprsFilesystemStorage(DirectoryInfo root)
{
this.rootDirectory = root;
this.jsonSerializerSettings = new JsonSerializerSettings()
{
NullValueHandling = NullValueHandling.Ignore,
Formatting = Formatting.Indented
};
}
private readonly DirectoryInfo rootDirectory;
private readonly JsonSerializerSettings jsonSerializerSettings;
private void EnsureDirectoryExists(DirectoryInfo di)
{
if (di.Exists)
return;
EnsureDirectoryExists(di.Parent);
di.Create();
}
public bool AprsPosition(DateTime currentTime, string packetSender, GeoCoordinate positionCoordinates, string piComment)
{
string path = Path.Combine(rootDirectory.FullName, "APRS", String.Format("{0}.json", packetSender));
FileInfo fi = new FileInfo(path);
InMemoryAprsData aprsEntry;
if (fi.Exists)
aprsEntry = JsonConvert.DeserializeObject<InMemoryAprsData>(File.ReadAllText(fi.FullName));
else
{
aprsEntry = new InMemoryAprsData(packetSender);
EnsureDirectoryExists(fi.Directory);
}
bool result = aprsEntry.LastSeen < currentTime;
if (!result)
return false;
aprsEntry.LastSeen = currentTime;
result = aprsEntry.Longitude != positionCoordinates.Longitude || aprsEntry.Latitude != positionCoordinates.Latitude;
if (result)
{
aprsEntry.Longitude = positionCoordinates.Longitude;
aprsEntry.Latitude = positionCoordinates.Latitude;
aprsEntry.Comment = piComment;
aprsEntry.TimesMoved++;
if (aprsEntry.TimesMoved > 2)
Console.WriteLine("{0} is actually moving", packetSender);
File.WriteAllText(fi.FullName, JsonConvert.SerializeObject(aprsEntry, Formatting.Indented, jsonSerializerSettings));
return true;
}
return false;
}
public bool AprsWeatherReport(DateTime currentTime, string packetSender, WeatherInfo wi)
{
string path = Path.Combine(rootDirectory.FullName, "APRS", "Weather", packetSender, String.Format("{0}.json", currentTime.ToUnixTime()));
FileInfo fi = new FileInfo(path);
if (fi.Exists)
return false;
EnsureDirectoryExists(fi.Directory);
File.WriteAllText(fi.FullName, JsonConvert.SerializeObject(wi, Formatting.Indented, jsonSerializerSettings));
return true;
}
public bool AprsStationCapabilities(string packetSender, StationCapabilities stationCapabilities)
{
string path = Path.Combine(rootDirectory.FullName, "APRS", "Capabilities", String.Format("{0}.json", packetSender));
FileInfo fi = new FileInfo(path);
if (fi.Exists)
return false;
EnsureDirectoryExists(fi.Directory);
File.WriteAllText(fi.FullName, JsonConvert.SerializeObject(stationCapabilities, Formatting.Indented, jsonSerializerSettings));
return true;
}
public bool AprsGpsSentence(DateTime currentTime, string packetSender, double? course, double? magneticVariation, double? speed)
{
string path = Path.Combine(rootDirectory.FullName, "APRS", String.Format("{0}.json", packetSender));
FileInfo fi = new FileInfo(path);
InMemoryAprsData aprsEntry;
if (fi.Exists)
aprsEntry = JsonConvert.DeserializeObject<InMemoryAprsData>(File.ReadAllText(fi.FullName));
else
{
return false;
}
bool result = aprsEntry.LastSeen == currentTime;
if (!result)
return false;
result = aprsEntry.Course != course || aprsEntry.MagneticVariation != magneticVariation || aprsEntry.Speed != speed;
if (result)
{
aprsEntry.Course = course;
aprsEntry.MagneticVariation = magneticVariation;
aprsEntry.Speed = speed;
File.WriteAllText(fi.FullName, JsonConvert.SerializeObject(aprsEntry, Formatting.Indented, jsonSerializerSettings));
return true;
}
return false;
}
public void AprsMessage(string sender, DateTime currentTime, string receiver, string message)
{
int msgCrc32 = Hasher.HashObjects(sender, receiver, message);
string path = Path.Combine(rootDirectory.FullName, "APRS", "Messages", String.Format("{1}_{0}.json", currentTime.ToUnixTime(), msgCrc32));
FileInfo fi = new FileInfo(path);
if (fi.Exists)
return;
var foo = new { sender, currentTime, receiver, message };
EnsureDirectoryExists(fi.Directory);
File.WriteAllText(fi.FullName, JsonConvert.SerializeObject(foo, Formatting.Indented, jsonSerializerSettings));
}
}
}