1161 lines
45 KiB
C#
1161 lines
45 KiB
C#
using System.Collections.ObjectModel;
|
|
using System.Drawing;
|
|
using System.Net.NetworkInformation;
|
|
using System.Reflection;
|
|
using Echo.UserInterface.Backend;
|
|
using ImGuiNET;
|
|
using SDL2;
|
|
using SDL2Demo.SdlWrapper;
|
|
using testdrid.SdlWrapper;
|
|
using SDL2Demo.Forms;
|
|
using SDL2Demo;
|
|
using SDL2Demo.Jobs;
|
|
using SDL2Demo.Screenhacks;
|
|
using skyscraper5.Skyscraper;
|
|
using skyscraper5.Skyscraper.Equipment;
|
|
using skyscraper5.Skyscraper.Gps;
|
|
using skyscraper5.Skyscraper.IO;
|
|
using skyscraper5.Skyscraper.IO.CrazycatStreamReader;
|
|
using skyscraper5.Skyscraper.IO.TunerInterface;
|
|
using skyscraper5.Skyscraper.Scraper.Storage;
|
|
using skyscraper5.Skyscraper.Scraper.Storage.Filesystem;
|
|
using skyscraper5.Skyscraper.Scraper.Storage.InMemory;
|
|
using skyscraper5.src.Skyscraper;
|
|
using skyscraper8.Skyscraper.Plugins;
|
|
using skyscraper8.Skyscraper.Scraper.Storage;
|
|
using Exception = System.Exception;
|
|
|
|
|
|
namespace SkyscraperUI
|
|
{
|
|
public class Program
|
|
{
|
|
public static void Main(string[] args)
|
|
{
|
|
new Program().Run();
|
|
}
|
|
|
|
private bool quit;
|
|
|
|
private static PluginLogger logger = PluginLogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
|
|
|
|
private void Run()
|
|
{
|
|
rng = new Random();
|
|
|
|
logger.Log(PluginLogLevel.Debug, "Loading skyscraper5.ini...");
|
|
FileInfo iniFile = new FileInfo("skyscraper5.ini");
|
|
if (iniFile.Exists)
|
|
ini = new Ini(iniFile.FullName);
|
|
else
|
|
ini = new Ini();
|
|
|
|
showPuppets = ini.ReadValue("ui", "enable_puppets", true);
|
|
|
|
logger.Log(PluginLogLevel.Debug, "Initializing SDL...");
|
|
int sdlInit = SDL.SDL_Init(SDL.SDL_INIT_EVERYTHING);
|
|
if (sdlInit != 0)
|
|
{
|
|
throw new Exception(SDL.SDL_GetError());
|
|
}
|
|
|
|
logger.Log(PluginLogLevel.Debug, "Initializing SDL_Image...");
|
|
int imgInit = SDL_image.IMG_Init(SDL_image.IMG_InitFlags.IMG_INIT_PNG);
|
|
if (imgInit != 2)
|
|
{
|
|
throw new Exception(SDL.SDL_GetError());
|
|
}
|
|
|
|
logger.Log(PluginLogLevel.Debug, "Create Window...");
|
|
window = Window.Create("skyscraper5 GUI", 1280, 720);
|
|
|
|
logger.Log(PluginLogLevel.Debug, "Create Renderer...");
|
|
renderer = Renderer.Create(window);
|
|
renderer.SetDrawBlendMode(SDL.SDL_BlendMode.SDL_BLENDMODE_BLEND);
|
|
PictureWindow.Renderer = renderer;
|
|
|
|
logger.Log(PluginLogLevel.Debug, "Create ImGui Context...");
|
|
IntPtr intPtr = ImGui.CreateContext();
|
|
ImGui.SetCurrentContext(intPtr);
|
|
ImGui.StyleColorsClassic();
|
|
ImGui.GetStyle().FrameRounding = 2;
|
|
ImGui.GetStyle().FrameBorderSize = 1;
|
|
|
|
logger.Log(PluginLogLevel.Debug, "Create ImGui Device...");
|
|
imGuiDevice = new ImGuiDevice(window.Pointer, renderer.Pointer);
|
|
imGuiDevice.Initialize();
|
|
EventPoller.GetInstance().Junction = imGuiDevice;
|
|
|
|
logger.Log(PluginLogLevel.Debug, "Loading Puppet Charset...");
|
|
Surface charsetSurface = Surface.LoadFromBMP("charset.bmp");
|
|
charsetSurface.SetColorKey(1, 0x00000000);
|
|
Texture charsetTexture = Texture.FromSurface(renderer, charsetSurface);
|
|
charsetSurface.Dispose();
|
|
|
|
logger.Log(PluginLogLevel.Debug, "Create Pressure Plate Charset...");
|
|
Surface object2Surface = Surface.ImageLoad("Object2.bmp");
|
|
object2Surface.SetColorKey(1, 0x00000000);
|
|
Texture object2Texture = Texture.FromSurface(renderer, object2Surface);
|
|
object2Surface.Dispose();
|
|
object2Charset = new CharSet(object2Texture) { CharacterNumber = 4 };
|
|
|
|
logWindow = new LogWindow();
|
|
logWindow.Register();
|
|
logWindow.IsOpen = ini.ReadValue("ui", "enable_log", true); ;
|
|
|
|
uiBlockingWindow = new UiBlockingWindow();
|
|
messageWindows = new List<MessageWindow>();
|
|
|
|
logger.Log(PluginLogLevel.Debug, "Loading Screen Hacks...");
|
|
LoadScreenHacks();
|
|
|
|
logger.Log(PluginLogLevel.Debug, "Starting Startup Thread...");
|
|
Thread theStartupThread = new Thread(StartupThread);
|
|
theStartupThread.Priority = ThreadPriority.Lowest;
|
|
theStartupThread.Start();
|
|
|
|
logger.Log(PluginLogLevel.Debug, "Formatting Charset...");
|
|
charsets = new CharSet[8];
|
|
for (byte i = 0; i < 8; i++)
|
|
{
|
|
charsets[i] = new CharSet(charsetTexture)
|
|
{ CharacterNumber = i, X = rng.Next(1280), Y = rng.Next(720) };
|
|
charsets[i].SetHome(new Point(24 * i, 720 - 32));
|
|
charsets[i].AutoMoveToHome();
|
|
}
|
|
|
|
logger.Log(PluginLogLevel.Debug, "Registering Quit Handler...");
|
|
EventPoller.GetInstance().Quit += TestdridClass_Quit;
|
|
|
|
logger.Log(PluginLogLevel.Debug, "Entering Main Loop...");
|
|
previous = DateTime.Now;
|
|
now = DateTime.Now;
|
|
while (!quit)
|
|
{
|
|
EventPoller.GetInstance().PollEvents();
|
|
BeforeRenderFrame();
|
|
|
|
renderer.Clear();
|
|
RenderFrame();
|
|
imGuiDevice.Render(ImGui.GetDrawData());
|
|
|
|
renderer.Present();
|
|
window.GlSwap();
|
|
}
|
|
|
|
if (CanCancelJob())
|
|
jobContext.Job.Cancel();
|
|
|
|
if (gps != null)
|
|
gps.Stop();
|
|
|
|
if (streamReader != null)
|
|
streamReader.Dispose();
|
|
}
|
|
|
|
private void LoadScreenHacks()
|
|
{
|
|
Assembly assembly = GetType().Assembly;
|
|
Type[] types = assembly.GetTypes();
|
|
types = types.Where(x => x.GetCustomAttribute(typeof(ScreenHackIdAttribute)) != null).ToArray();
|
|
Array.Sort(types, new ScreenHackTypeComparer());
|
|
allScreenHacks = new ScreenHack[types.Length];
|
|
for (int i = 0; i < allScreenHacks.Length; i++)
|
|
{
|
|
allScreenHacks[i] = (ScreenHack)Activator.CreateInstance(types[i]);
|
|
}
|
|
|
|
int readValue = ini.ReadValue("ui", "screenhack", -1);
|
|
if (readValue == -1)
|
|
{
|
|
readValue = 0;
|
|
}
|
|
|
|
currentScreenHack = allScreenHacks[readValue];
|
|
currentScreenHack.Setup(window.GetWindowRectangle(), renderer);
|
|
}
|
|
|
|
private ImGuiDevice imGuiDevice;
|
|
private Random rng;
|
|
private Renderer renderer;
|
|
private Window window;
|
|
|
|
private CharSet[] charsets;
|
|
private DateTime previous;
|
|
private DateTime now;
|
|
private UiBlockingWindow uiBlockingWindow;
|
|
private List<TunerMetadata> tuners;
|
|
private ConfigureTunersWindow configureTunersWindow;
|
|
private Ini ini;
|
|
|
|
private ReadOnlyCollection<KeyValuePair<int, DataStorageFactory>> dataStorageFactories;
|
|
private ReadOnlyCollection<KeyValuePair<int, ObjectStorageFactory>> objectStorageFactories;
|
|
private ReadOnlyCollection<KeyValuePair<TunerFactoryIdAttribute, ITunerFactory>> tunerFactories;
|
|
|
|
private IStreamReader streamReader;
|
|
private DataStorage dataStorage;
|
|
private ObjectStorage objectStorage;
|
|
private IGpsReceiver gps;
|
|
|
|
|
|
private List<MessageWindow> messageWindows;
|
|
private AboutWindow aboutWindow;
|
|
private ConfigureDataStorageWindow configureDataStorageWindow;
|
|
private ConfigureObjectStorageWindow configureObjectStorageWindow;
|
|
private SatellitesConfigurationWindow satellitesConfigurationWindow;
|
|
private List<SatellitePosition> satellitePositions;
|
|
private List<LnbType> lnbTypes;
|
|
private List<DishType> dishTypes;
|
|
private LogWindow logWindow;
|
|
private ScrapeFromTcp scrapeFromTcpWindow;
|
|
private JobContext jobContext;
|
|
private CharSet object2Charset;
|
|
private Blindscan blindscanWindow;
|
|
private CoopBlindscan coopBlindscanWindow;
|
|
private ConfigureTunerFactoryWindow tunerFactoryWindow;
|
|
private ConfigureLnbTypes configureLnbTypesWindow;
|
|
private ConfigureDishTypes configureDishTypesWindow;
|
|
private ConfigureGpsWindow configureGpsWindow;
|
|
private GpsDisplay gpsDisplayWindow;
|
|
private BlindscanJobDeleter jobDeleter;
|
|
|
|
private ScreenHack[] allScreenHacks;
|
|
private ScreenHack currentScreenHack;
|
|
|
|
private bool showPuppets;
|
|
private bool showLogWindowOnJobStart;
|
|
private bool showConfigureTunersWindow;
|
|
private bool blockUi;
|
|
private bool showDemoWindow;
|
|
private bool showMainMenu;
|
|
private bool showIqWindow;
|
|
private bool showTunerFactoryConfiguration;
|
|
private bool showConfigureLnbTypesWindow;
|
|
private bool showConfigureDishTypesWindow;
|
|
|
|
private string engineProductName;
|
|
private Version engineVersion;
|
|
|
|
|
|
private void BeforeRenderFrame()
|
|
{
|
|
if (jobContext != null)
|
|
{
|
|
if (jobContext.MessageQueue.Count != 0)
|
|
{
|
|
MessageWindow messageWindow = jobContext.MessageQueue.Dequeue();
|
|
logWindow.Log(messageWindow.Message);
|
|
messageWindows.Add(messageWindow);
|
|
}
|
|
|
|
if (jobContext.ReadyForNextJob)
|
|
{
|
|
foreach (CharSet charSet in charsets)
|
|
charSet.AutoMoveToHome();
|
|
|
|
logWindow.Log(String.Format("Job completed: {0}", jobContext.Job.ToString()));
|
|
SoundPlayer.PlaySoundFile("Teleport2.wav");
|
|
jobContext = null;
|
|
}
|
|
}
|
|
}
|
|
|
|
private bool CanOpenJobDeleter()
|
|
{
|
|
if (jobContext != null)
|
|
return false;
|
|
|
|
if (jobDeleter != null)
|
|
{
|
|
if (!jobDeleter.Closed)
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
private bool CanOpenDishTypesConfiguration()
|
|
{
|
|
if (showConfigureDishTypesWindow)
|
|
return false;
|
|
|
|
if (jobContext != null)
|
|
return false;
|
|
|
|
return true;
|
|
}
|
|
|
|
private bool CanOpenLnbTypesConfiguration()
|
|
{
|
|
if (showConfigureLnbTypesWindow)
|
|
return false;
|
|
|
|
if (jobContext != null)
|
|
return false;
|
|
|
|
return true;
|
|
}
|
|
|
|
private bool CanOpenTunerFactoryConfiguration()
|
|
{
|
|
if (showTunerFactoryConfiguration)
|
|
return false;
|
|
|
|
if (showConfigureTunersWindow)
|
|
return false;
|
|
|
|
return true;
|
|
}
|
|
|
|
private bool CanOpenTunerConfiguration()
|
|
{
|
|
if (showConfigureTunersWindow)
|
|
return false;
|
|
|
|
if (tuners == null)
|
|
return false;
|
|
|
|
if (tuners.Count == 0)
|
|
return false;
|
|
|
|
if (satellitePositions.Count == 0)
|
|
return false;
|
|
|
|
return true;
|
|
}
|
|
|
|
private bool CanPerformBlindscan()
|
|
{
|
|
if (jobContext != null)
|
|
return false;
|
|
|
|
if (tuners == null)
|
|
return false;
|
|
|
|
if (tuners.Count == 0)
|
|
return false;
|
|
|
|
if (showConfigureTunersWindow)
|
|
return false;
|
|
|
|
if (blindscanWindow != null)
|
|
return false;
|
|
|
|
if (coopBlindscanWindow != null)
|
|
return false;
|
|
|
|
if (scrapeFromTcpWindow != null)
|
|
return false;
|
|
|
|
return true;
|
|
}
|
|
|
|
private bool CanScrapeFromTcpIp()
|
|
{
|
|
if (jobContext != null)
|
|
return false;
|
|
|
|
if (scrapeFromTcpWindow != null)
|
|
return false;
|
|
|
|
if (blindscanWindow != null)
|
|
return false;
|
|
|
|
return true;
|
|
}
|
|
|
|
private bool CanCancelJob()
|
|
{
|
|
if (jobContext == null)
|
|
return false;
|
|
|
|
return jobContext.CanCancel;
|
|
}
|
|
|
|
private bool _isDisplayingGpsLocation;
|
|
private bool IsDisplayingGpsLocation()
|
|
{
|
|
if (gpsDisplayWindow == null)
|
|
return false;
|
|
|
|
return _isDisplayingGpsLocation;
|
|
}
|
|
|
|
private bool CanShowGpsLocation()
|
|
{
|
|
return true;
|
|
}
|
|
|
|
private bool IsDisplayingNmeaData()
|
|
{
|
|
if (gpsDisplayWindow == null)
|
|
return false;
|
|
|
|
if (!_isDisplayingGpsLocation)
|
|
return false;
|
|
|
|
if (!gpsDisplayWindow.HasNmea)
|
|
return false;
|
|
|
|
return gpsDisplayWindow.RenderNmea;
|
|
}
|
|
|
|
private bool CanDisplayNmeaData()
|
|
{
|
|
if (gpsDisplayWindow == null)
|
|
return false;
|
|
|
|
if (!_isDisplayingGpsLocation)
|
|
return false;
|
|
|
|
return gpsDisplayWindow.HasNmea;
|
|
}
|
|
|
|
|
|
private bool playedStartSound;
|
|
|
|
private void RenderFrame()
|
|
{
|
|
if (!playedStartSound)
|
|
{
|
|
SoundPlayer.PlaySoundFile("Decision2.wav");
|
|
playedStartSound = true;
|
|
}
|
|
currentScreenHack.Render();
|
|
|
|
if (showPuppets)
|
|
{
|
|
if (jobContext != null)
|
|
{
|
|
lock (jobContext.PressurePlates)
|
|
{
|
|
foreach (IPressurePlate jobContextPressurePlate in jobContext.PressurePlates)
|
|
{
|
|
if (jobContextPressurePlate.Visible)
|
|
{
|
|
object2Charset.X = jobContextPressurePlate.Position.X;
|
|
object2Charset.Y = jobContextPressurePlate.Position.Y;
|
|
object2Charset.Render(renderer);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
for (int i = 0; i < charsets.Length; i++)
|
|
{
|
|
//if (!charsets[i].AutoMoving || charsets[i].AutoMoveTargetReached)
|
|
//charsets[i].AutoMoveTo(new Point(rng.Next(1280), rng.Next(720)));
|
|
charsets[i].Render(renderer);
|
|
}
|
|
}
|
|
|
|
previous = now;
|
|
now = DateTime.Now;
|
|
imGuiDevice.NewFrame(now - previous);
|
|
ImGui.NewFrame();
|
|
|
|
if (!blockUi)
|
|
{
|
|
|
|
if (showMainMenu)
|
|
{
|
|
ImGui.BeginMainMenuBar();
|
|
if (ImGui.BeginMenu("Jobs"))
|
|
{
|
|
if (ImGui.MenuItem("Connect to TCP/IP Stream", CanScrapeFromTcpIp()))
|
|
scrapeFromTcpWindow = new ScrapeFromTcp();
|
|
if (ImGui.MenuItem("Perform Blindscan", CanPerformBlindscan()))
|
|
blindscanWindow = new Blindscan(tuners, satellitePositions, lnbTypes, dataStorage);
|
|
if (ImGui.MenuItem("Perform Cooperative Blindscan", CanPerformBlindscan()))
|
|
coopBlindscanWindow = new CoopBlindscan(tuners, satellitePositions, lnbTypes, dataStorage);
|
|
if (ImGui.MenuItem("Cancel current job", CanCancelJob()))
|
|
jobContext.Job.Cancel();
|
|
if (ImGui.MenuItem("Quit"))
|
|
quit = true;
|
|
ImGui.EndMenu();
|
|
}
|
|
|
|
if (ImGui.BeginMenu("View"))
|
|
{
|
|
if (ImGui.MenuItem("Show Puppets", "", showPuppets))
|
|
showPuppets = !showPuppets;
|
|
if (ImGui.MenuItem("Show ImGui Demo Window", "", showDemoWindow))
|
|
showDemoWindow = !showDemoWindow;
|
|
if (ImGui.MenuItem("Show Log Window", "", logWindow.IsOpen))
|
|
logWindow.IsOpen = !logWindow.IsOpen;
|
|
if (ImGui.MenuItem("Auto-Show Log Window when job starts", "", showLogWindowOnJobStart))
|
|
showLogWindowOnJobStart = !showLogWindowOnJobStart;
|
|
if (ImGui.MenuItem("Show GPS Location", "", IsDisplayingGpsLocation(), CanShowGpsLocation()))
|
|
{
|
|
if (gpsDisplayWindow == null)
|
|
gpsDisplayWindow = new GpsDisplay(gps);
|
|
_isDisplayingGpsLocation = !_isDisplayingGpsLocation;
|
|
}
|
|
|
|
if (ImGui.MenuItem("Show NMEA data", "", IsDisplayingNmeaData(), CanDisplayNmeaData()))
|
|
gpsDisplayWindow.RenderNmea = !gpsDisplayWindow.RenderNmea;
|
|
|
|
ImGui.EndMenu();
|
|
}
|
|
|
|
if (ImGui.BeginMenu("Configuration"))
|
|
{
|
|
if (ImGui.MenuItem("Configure Tuner Factory", CanOpenTunerFactoryConfiguration()))
|
|
{
|
|
showTunerFactoryConfiguration = true;
|
|
tunerFactoryWindow = new ConfigureTunerFactoryWindow(ini, tunerFactories);
|
|
}
|
|
if (ImGui.MenuItem("Configure Tuners", CanOpenTunerConfiguration()))
|
|
{
|
|
showConfigureTunersWindow = true;
|
|
configureTunersWindow = new ConfigureTunersWindow(tuners, dataStorage);
|
|
}
|
|
|
|
if (ImGui.MenuItem("Configure LNB Types", CanOpenLnbTypesConfiguration()))
|
|
{
|
|
showConfigureLnbTypesWindow = true;
|
|
configureLnbTypesWindow = new ConfigureLnbTypes(dataStorage, lnbTypes);
|
|
}
|
|
|
|
if (ImGui.MenuItem("Configure Dish Types", CanOpenDishTypesConfiguration()))
|
|
{
|
|
showConfigureDishTypesWindow = true;
|
|
configureDishTypesWindow = new ConfigureDishTypes(dataStorage, dishTypes);
|
|
}
|
|
|
|
if (ImGui.MenuItem("Configure GPS Receiver", configureGpsWindow == null))
|
|
{
|
|
configureGpsWindow = new ConfigureGpsWindow(ini);
|
|
}
|
|
|
|
if (ImGui.MenuItem("Configure Satellite Positions", satellitesConfigurationWindow == null))
|
|
{
|
|
satellitesConfigurationWindow = new SatellitesConfigurationWindow(dataStorage);
|
|
}
|
|
|
|
if (ImGui.MenuItem("Configure Data Storage", configureDataStorageWindow == null))
|
|
{
|
|
configureDataStorageWindow = new ConfigureDataStorageWindow(ini, dataStorageFactories);
|
|
}
|
|
|
|
if (ImGui.MenuItem("Configure Object Storage", configureObjectStorageWindow == null))
|
|
{
|
|
configureObjectStorageWindow = new ConfigureObjectStorageWindow(ini, objectStorageFactories);
|
|
}
|
|
|
|
ImGui.EndMenu();
|
|
}
|
|
|
|
if (ImGui.BeginMenu("Data"))
|
|
{
|
|
if (ImGui.MenuItem("Delete Blindscan Jobs", CanOpenJobDeleter()))
|
|
{
|
|
jobDeleter = new BlindscanJobDeleter(dataStorage);
|
|
}
|
|
ImGui.EndMenu();
|
|
}
|
|
|
|
if (ImGui.BeginMenu("Help"))
|
|
{
|
|
if (ImGui.MenuItem("About skyscraper5", aboutWindow == null))
|
|
{
|
|
aboutWindow = new AboutWindow();
|
|
}
|
|
|
|
ImGui.EndMenu();
|
|
}
|
|
|
|
ImGui.EndMainMenuBar();
|
|
}
|
|
|
|
if (jobDeleter != null)
|
|
{
|
|
jobDeleter.Render();
|
|
if (jobDeleter.Closed)
|
|
{
|
|
jobDeleter = null;
|
|
}
|
|
}
|
|
|
|
if (showConfigureDishTypesWindow)
|
|
{
|
|
configureDishTypesWindow.Render();
|
|
if (configureDishTypesWindow.Closed)
|
|
{
|
|
showConfigureDishTypesWindow = false;
|
|
configureDishTypesWindow = null;
|
|
}
|
|
}
|
|
if (showConfigureLnbTypesWindow)
|
|
{
|
|
configureLnbTypesWindow.Render();
|
|
if (configureLnbTypesWindow.Closed)
|
|
{
|
|
showConfigureLnbTypesWindow = false;
|
|
configureLnbTypesWindow = null;
|
|
}
|
|
}
|
|
if (showTunerFactoryConfiguration)
|
|
{
|
|
tunerFactoryWindow.Render();
|
|
if (tunerFactoryWindow.Closed)
|
|
{
|
|
if (tunerFactoryWindow.RequireRestart)
|
|
{
|
|
MessageWindow mw = new MessageWindow(
|
|
"To apply the tuner factory configuration, skyscraper5 will need to restart. Press the okay button to exit the application.");
|
|
mw.OnClose = () => quit = true;
|
|
messageWindows.Add(mw);
|
|
}
|
|
|
|
showTunerFactoryConfiguration = false;
|
|
tunerFactoryWindow = null;
|
|
}
|
|
}
|
|
|
|
if (showConfigureTunersWindow)
|
|
{
|
|
configureTunersWindow.Render();
|
|
if (configureTunersWindow.Closed)
|
|
{
|
|
showConfigureTunersWindow = false;
|
|
configureTunersWindow = null;
|
|
}
|
|
}
|
|
|
|
if (showDemoWindow)
|
|
ImGui.ShowDemoWindow();
|
|
|
|
if (configureDataStorageWindow != null)
|
|
{
|
|
configureDataStorageWindow.Render();
|
|
if (!configureDataStorageWindow.IsOpen)
|
|
{
|
|
if (configureDataStorageWindow.RequireRestart)
|
|
{
|
|
MessageWindow mw = new MessageWindow(
|
|
"To apply the storage configuration, skyscraper5 will need to restart. Press the okay button to exit the application.");
|
|
mw.OnClose = () => quit = true;
|
|
messageWindows.Add(mw);
|
|
}
|
|
|
|
configureDataStorageWindow = null;
|
|
}
|
|
}
|
|
|
|
if (configureObjectStorageWindow != null)
|
|
{
|
|
configureObjectStorageWindow.Render();
|
|
if (!configureObjectStorageWindow.IsOpen)
|
|
{
|
|
if (configureObjectStorageWindow.RequireRestart)
|
|
{
|
|
MessageWindow mw = new MessageWindow(
|
|
"To apply the storage configuration, skyscraper5 will need to restart. Press the okay button to exit the application.");
|
|
mw.OnClose = () => quit = true;
|
|
messageWindows.Add(mw);
|
|
}
|
|
|
|
configureObjectStorageWindow = null;
|
|
}
|
|
}
|
|
|
|
if (configureGpsWindow != null)
|
|
{
|
|
configureGpsWindow.Render();
|
|
if (!configureGpsWindow.IsOpen)
|
|
{
|
|
if (configureGpsWindow.RequireRestart)
|
|
{
|
|
MessageWindow mw = new MessageWindow(
|
|
"To apply the GPS receiver configuration, skyscraper5 will need to restart. Press the okay button to exit the application.");
|
|
mw.OnClose = () => quit = true;
|
|
messageWindows.Add(mw);
|
|
}
|
|
|
|
configureGpsWindow = null;
|
|
}
|
|
}
|
|
|
|
if (satellitesConfigurationWindow != null)
|
|
{
|
|
satellitesConfigurationWindow.Render();
|
|
if (satellitesConfigurationWindow.Closed)
|
|
{
|
|
satellitesConfigurationWindow = null;
|
|
satellitePositions = dataStorage.UiSatellitesListAll();
|
|
}
|
|
}
|
|
|
|
if (scrapeFromTcpWindow != null)
|
|
{
|
|
scrapeFromTcpWindow.Render();
|
|
if (!scrapeFromTcpWindow.IsOpen)
|
|
{
|
|
if (scrapeFromTcpWindow.OkayButtonClicked)
|
|
{
|
|
EnrollJob(scrapeFromTcpWindow);
|
|
}
|
|
|
|
scrapeFromTcpWindow = null;
|
|
}
|
|
}
|
|
|
|
if (blindscanWindow != null)
|
|
{
|
|
blindscanWindow.Render();
|
|
if (!blindscanWindow.WindowOpen)
|
|
{
|
|
if (blindscanWindow.SelectedBlindscanTarget != null || blindscanWindow.ContinuationMode)
|
|
{
|
|
EnrollJob(blindscanWindow);
|
|
}
|
|
|
|
blindscanWindow = null;
|
|
}
|
|
}
|
|
|
|
if (coopBlindscanWindow != null)
|
|
{
|
|
coopBlindscanWindow.Render();
|
|
if (!coopBlindscanWindow.WindowOpen)
|
|
{
|
|
if (coopBlindscanWindow.Configuration != null)
|
|
{
|
|
EnrollJob(coopBlindscanWindow);
|
|
}
|
|
coopBlindscanWindow = null;
|
|
}
|
|
}
|
|
|
|
if (aboutWindow != null)
|
|
{
|
|
aboutWindow.Render();
|
|
if (aboutWindow.Closed)
|
|
aboutWindow = null;
|
|
}
|
|
|
|
if (_isDisplayingGpsLocation)
|
|
{
|
|
gpsDisplayWindow.Render();
|
|
}
|
|
|
|
if (jobContext != null)
|
|
{
|
|
if (jobContext.Renderables.Count > 0)
|
|
{
|
|
lock (jobContext.Renderables)
|
|
{
|
|
foreach (IRenderable jobContextRenderable in jobContext.Renderables)
|
|
{
|
|
jobContextRenderable.Render();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
logWindow.Render();
|
|
|
|
foreach (MessageWindow messageWindow in messageWindows)
|
|
{
|
|
messageWindow.Render();
|
|
}
|
|
|
|
messageWindows.RemoveAll(x => x.Closed);
|
|
}
|
|
else
|
|
{
|
|
uiBlockingWindow.Render();
|
|
}
|
|
|
|
ImGui.EndFrame();
|
|
ImGui.Render();
|
|
|
|
}
|
|
|
|
private void TestdridClass_Quit(SDL.SDL_QuitEvent qe)
|
|
{
|
|
quit = true;
|
|
gps.Stop();
|
|
}
|
|
|
|
private void EnrollJob(IJob job)
|
|
{
|
|
if (jobContext == null)
|
|
{
|
|
jobContext = new JobContext();
|
|
}
|
|
|
|
if (showLogWindowOnJobStart)
|
|
logWindow.IsOpen = true;
|
|
|
|
job.JobContext = jobContext;
|
|
|
|
jobContext.Gps = gps;
|
|
jobContext.ImgUiDevice = imGuiDevice;
|
|
jobContext.Ini = ini;
|
|
jobContext.StreamReader = streamReader;
|
|
jobContext.LogWindow = logWindow;
|
|
jobContext.PressurePlates = new List<IPressurePlate>();
|
|
jobContext.RNG = rng;
|
|
jobContext.MessageQueue = new Queue<MessageWindow>();
|
|
jobContext.Renderables = new List<IRenderable>();
|
|
jobContext.Job = job;
|
|
jobContext.ReadyForNextJob = false;
|
|
jobContext.Puppets = charsets;
|
|
jobContext.DataStorage = dataStorage;
|
|
jobContext.ObjectStorage = objectStorage;
|
|
jobContext.ScraperEventLogger = logWindow;
|
|
jobContext.Thread = new Thread(job.Run);
|
|
jobContext.Thread.Name = "Current Job";
|
|
jobContext.Thread.Start();
|
|
}
|
|
|
|
private class StartupThreadType
|
|
{
|
|
|
|
}
|
|
|
|
private void StartupThread()
|
|
{
|
|
PluginLogger localLogger = PluginLogManager.GetLogger(typeof(StartupThreadType));
|
|
|
|
uiBlockingWindow.Title = "Starting up...";
|
|
blockUi = true;
|
|
|
|
//LOAD STORAGE ----------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
localLogger.Log(PluginLogLevel.Debug, "Starting Storage Connection Manager...");
|
|
uiBlockingWindow.Text = "Please wait while I acquire a handle to the Storage Connection Manager...";
|
|
StorageConnectionManager connectionManager = StorageConnectionManager.GetInstance();
|
|
|
|
localLogger.Log(PluginLogLevel.Debug, "Enumerating Data Storage Factories...");
|
|
uiBlockingWindow.Text = "Please wait while I enumerate the data storage factories...";
|
|
dataStorageFactories = connectionManager.GetDataStorages().ToList().AsReadOnly();
|
|
|
|
localLogger.Log(PluginLogLevel.Debug, "Enumerating Object Storage Factories...");
|
|
uiBlockingWindow.Text = "Please wait while I enumerate the object storage factories...";
|
|
objectStorageFactories = connectionManager.GetObjectStorages().ToList().AsReadOnly();
|
|
|
|
localLogger.Log(PluginLogLevel.Debug, "Checking for configuration file...");
|
|
uiBlockingWindow.Text = "Please wait while I check for the configuration file...";
|
|
if (!connectionManager.IniExists())
|
|
{
|
|
localLogger.Log(PluginLogLevel.Warn, "Configuration file not found!");
|
|
string rant = String.Format("The configuration file does not exist.\r\nPlease create one in the UI!");
|
|
messageWindows.Add(new MessageWindow(rant));
|
|
ini = new Ini();
|
|
blockUi = false;
|
|
showMainMenu = true;
|
|
return;
|
|
}
|
|
|
|
DataStorageFactory dataStorageFactory;
|
|
try
|
|
{
|
|
localLogger.Log(PluginLogLevel.Debug, "Getting default data storage factory...");
|
|
uiBlockingWindow.Text = "Please wait while I acquire the default data storage factory...";
|
|
dataStorageFactory = connectionManager.GetDefaultDataStorageFactory();
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
localLogger.Log(PluginLogLevel.Error, "Failed to start the data storage factory: {0}", e.Message);
|
|
string rant = String.Format("Could not load the data storage factory.\nThe following went wrong:\n\n{0}\n\n", e.Message);
|
|
messageWindows.Add(new MessageWindow(rant));
|
|
blockUi = false;
|
|
showMainMenu = true;
|
|
return;
|
|
}
|
|
|
|
ObjectStorageFactory objectStorageFactory;
|
|
try
|
|
{
|
|
localLogger.Log(PluginLogLevel.Debug, "Getting default object storage factory...");
|
|
uiBlockingWindow.Text = "Please wait while I acquire the default object storage factory...";
|
|
objectStorageFactory = connectionManager.GetDefaultObjectStorageFactory();
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
localLogger.Log(PluginLogLevel.Error, "Failed to start the object storage factory: {0}", e.Message);
|
|
string rant = String.Format("Could not load the object storage factory.\nThe following went wrong:\n\n{0}\n\n", e.Message);
|
|
messageWindows.Add(new MessageWindow(rant));
|
|
blockUi = false;
|
|
showMainMenu = true;
|
|
return;
|
|
}
|
|
|
|
uiBlockingWindow.Text = "Please wait while I open the data storage...";
|
|
dataStorage = dataStorageFactory.CreateDataStorage();
|
|
|
|
uiBlockingWindow.Text = "Please wait while I check whether the data storage and the object storage are the same...";
|
|
bool equivalentStorages = objectStorageFactory.IsEquivalent(dataStorageFactory);
|
|
|
|
if (equivalentStorages)
|
|
{
|
|
uiBlockingWindow.Text = "It is.";
|
|
uiBlockingWindow.Line2 = "Casting Data Storage to Object Storage.";
|
|
objectStorage = (ObjectStorage)dataStorage;
|
|
}
|
|
else
|
|
{
|
|
uiBlockingWindow.Text = "It isn't.";
|
|
uiBlockingWindow.Line2 = "Creating object storage...";
|
|
try
|
|
{
|
|
objectStorage = objectStorageFactory.CreateObjectStorage();
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
string objectStorageName = connectionManager.GetName(objectStorageFactory);
|
|
localLogger.Log(PluginLogLevel.Error, "Failed to start the object storage factory: {0}", e.Message);
|
|
string rant = String.Format("Could not load {1}.\nThe following went wrong:\n\n{0}\n\n", e.Message, objectStorageName);
|
|
messageWindows.Add(new MessageWindow(rant));
|
|
blockUi = false;
|
|
showMainMenu = true;
|
|
return;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
uiBlockingWindow.Text = "Reporting UI Version to the storages...";
|
|
uiBlockingWindow.Line2 = "";
|
|
dataStorage.UiSetVersion(2);
|
|
objectStorage.UiSetVersion(2);
|
|
|
|
uiBlockingWindow.Text = "Please wait while I test whether the data storage is responding...";
|
|
try
|
|
{
|
|
dataStorage.Ping();
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
string brokenStorageName = connectionManager.GetName(objectStorageFactory);
|
|
InMemoryScraperStorageFactory fssf = new InMemoryScraperStorageFactory();
|
|
dataStorage = fssf.CreateDataStorage();
|
|
string rant = String.Format(
|
|
"{0} failed to respond.\nThe following went wrong:\n\n{1}\n\nI've switched to a volatile in-memory storage. This will work, but is quite possibly not what you want. It will not and cannot save any data. Please consider configuring {0} correctly.",
|
|
brokenStorageName, e.Message);
|
|
messageWindows.Add(new MessageWindow(rant));
|
|
}
|
|
|
|
uiBlockingWindow.Text = "Please wait while I test whether the object storage is responding...";
|
|
try
|
|
{
|
|
objectStorage.Ping();
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
string brokenStorageName = connectionManager.GetName(objectStorageFactory);
|
|
FilesystemScraperStorageFactory fssf = new FilesystemScraperStorageFactory();
|
|
fssf.Directory = "dummy_object_storage";
|
|
objectStorage = fssf.CreateObjectStorage();
|
|
string rant = String.Format(
|
|
"{0} failed to respond.\nThe following went wrong:\n\n{1}\n\nI've switched to a file system based storage. This will work, but is quite possibly not what you want. Please consider configuring {0} correctly.",
|
|
brokenStorageName, e.Message);
|
|
messageWindows.Add(new MessageWindow(rant));
|
|
}
|
|
|
|
//LOAD GPS ----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
uiBlockingWindow.Text = "Please wait while I load the GPS receiver library...";
|
|
int gpsReceiverId = GpsManager.GetConfiguredGpsId();
|
|
IGpsReceiverFactory gpsReceiverFactory = GpsManager.GetGpsReceiverFactoryById(gpsReceiverId);
|
|
GpsManager.AutoconfigureGpsReceiverFactory(gpsReceiverFactory);
|
|
|
|
uiBlockingWindow.Text = "Please wait while I instantiate the GPS receiver...";
|
|
gps = gpsReceiverFactory.CreateGpsReceiver();
|
|
|
|
uiBlockingWindow.Text = "Please wait while I start the GPS receiver...";
|
|
gps.Start();
|
|
|
|
//LOAD BASE DATA --------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
uiBlockingWindow.Text = "Please wait while I query the storage for known satellite positions...";
|
|
satellitePositions = dataStorage.UiSatellitesListAll();
|
|
|
|
uiBlockingWindow.Text = "Please wait while I check for the default LNB types...";
|
|
EquipmentUtilities.InsertDefaultLnbTypes(dataStorage);
|
|
|
|
uiBlockingWindow.Text = "Please wait while I query the storage for known LNB types...";
|
|
lnbTypes = dataStorage.UiLnbTypesListAll();
|
|
|
|
uiBlockingWindow.Text = "Please wait while I check for the default dish types...";
|
|
EquipmentUtilities.InsertDefaultDishTypes(dataStorage);
|
|
|
|
uiBlockingWindow.Text = "Please wait while I query the storage for known Dish types...";
|
|
dishTypes = dataStorage.UiDishTypesListAll();
|
|
|
|
//LOAD TUNER --------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
uiBlockingWindow.Text = "Please wait while I check the Tuner Factory classes...";
|
|
TunerFactoryConnectionManager tunerFactoryConnectionManager = TunerFactoryConnectionManager.GetInstance();
|
|
tunerFactories = tunerFactoryConnectionManager.GetKnownFactories();
|
|
int tunerFactory = ini.ReadValue("startup", "tunerFactory", 0);
|
|
KeyValuePair<TunerFactoryIdAttribute, ITunerFactory> bootingTuner = tunerFactories.First(x => x.Key.Id == tunerFactory);
|
|
bool isNoTuner = bootingTuner.Key.DisplayName.Equals("No tuner");
|
|
if (isNoTuner)
|
|
{
|
|
messageWindows.Add(new MessageWindow(
|
|
"Please not that Skyscraper is currently configured to not use a Tuner Factory Class. This will work, but functionality will be severely limited. Please configure a Tuner Factory Class in order to get the best experience."));
|
|
}
|
|
|
|
uiBlockingWindow.Text = "Please wait while I'll apply the tuner factory class configuration..:";
|
|
TunerFactoryConnectionManager.ConfigureFactoryFromIni(bootingTuner, ini);
|
|
|
|
uiBlockingWindow.Text = "Please wait while the Tuner Factory class code is being executed...";
|
|
try
|
|
{
|
|
streamReader = bootingTuner.Value.CreateStreamReader();
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
uiBlockingWindow.Text = "Oh dear, it failed.";
|
|
messageWindows.Add(new MessageWindow(
|
|
"Please not that the Tuner Factory class code failed to execute. " +
|
|
"This won't stop the program from working, but functionality will be severely limited. " +
|
|
"Please make sure the Tuner Factory Class is properly configured in order to get the best experience.\n\n" +
|
|
"The following went wrong:\n" + e.Message));
|
|
streamReader = new NullTunerFactory().CreateStreamReader();
|
|
}
|
|
|
|
|
|
try
|
|
{
|
|
uiBlockingWindow.Text = "Please wait while I try to see whether the tuner factory works...";
|
|
streamReader.CheckForDVB();
|
|
}
|
|
catch (BadImageFormatException e)
|
|
{
|
|
uiBlockingWindow.Text = "Oh dear, it doesn't.";
|
|
messageWindows.Add(new MessageWindow(
|
|
"The configured tuner factory is not suitable for the current processor architecture. Tuning won't work, therefore functionality will be severely limited. Please configure a Tuner Factory Class suitable for this processor architecture in order to get the best experience. If you need to run crazycat69's StreamReader.dll on 64-bit machines, try RemoteStreamReader."));
|
|
streamReader = new NullTunerFactory().CreateStreamReader();
|
|
}
|
|
|
|
uiBlockingWindow.Text = "Please wait while I check for your tuners...";
|
|
List<TunerMetadata> foundTuners = new List<TunerMetadata>();
|
|
bool checkForDvbExEx = streamReader.CheckForDVBExEx((index, name, type) =>
|
|
{
|
|
TunerMetadata tuner = new TunerMetadata(index, name, type);
|
|
uiBlockingWindow.Line2 = String.Format("Found tuner {0}", name);
|
|
foundTuners.Add(tuner);
|
|
});
|
|
if (!checkForDvbExEx)
|
|
{
|
|
if (!isNoTuner)
|
|
uiBlockingWindow.Line2 = String.Format("{0} has failed. Tuning won't be possible!", nameof(streamReader.CheckForDVBExEx));
|
|
}
|
|
|
|
foreach (TunerMetadata foundTuner in foundTuners)
|
|
{
|
|
streamReader.StopDVB();
|
|
|
|
uiBlockingWindow.Line2 = String.Format("Starting tuner {0}", foundTuner.Name);
|
|
bool startDvbEx = streamReader.StartDvbEx(foundTuner.Index);
|
|
if (!startDvbEx)
|
|
{
|
|
uiBlockingWindow.Line2 = String.Format("Failed to start {0}", foundTuner.Name);
|
|
Thread.Sleep(1000);
|
|
continue;
|
|
}
|
|
|
|
uiBlockingWindow.Line2 = String.Format("Checking capabilities of {0}", foundTuner.Name);
|
|
foundTuner.Caps = streamReader.GetCaps();
|
|
|
|
byte[] macBuffer = new byte[6];
|
|
uiBlockingWindow.Line2 = String.Format("Reading MAC Address of {0}", foundTuner.Name);
|
|
bool mac = streamReader.GetMAC(macBuffer);
|
|
if (!mac)
|
|
{
|
|
uiBlockingWindow.Line2 = String.Format("Failed to read MAC Address of {0}", foundTuner.Name);
|
|
Thread.Sleep(1000);
|
|
}
|
|
else
|
|
{
|
|
foundTuner.MacAddress = new PhysicalAddress(macBuffer);
|
|
}
|
|
|
|
uiBlockingWindow.Line2 = String.Format("Stopping {0}", foundTuner.Name);
|
|
bool stopDvb = streamReader.StopDVB();
|
|
if (!stopDvb)
|
|
{
|
|
uiBlockingWindow.Line2 = String.Format("Failed to stop {0}", foundTuner.Name);
|
|
Thread.Sleep(1000);
|
|
continue;
|
|
}
|
|
|
|
uiBlockingWindow.Line2 = String.Format("Querying storage for configuration of {0}...", foundTuner.Name);
|
|
if (dataStorage.UiTunerTestFor(foundTuner))
|
|
{
|
|
dataStorage.UiTunerGetConfiguration(foundTuner);
|
|
}
|
|
|
|
if (tuners == null)
|
|
tuners = new List<TunerMetadata>();
|
|
tuners.Add(foundTuner);
|
|
}
|
|
|
|
uiBlockingWindow.Text = "Please wait while I check the engine Version...";
|
|
uiBlockingWindow.Line2 = "Reading ProductName...";
|
|
this.engineProductName = streamReader.GetEngineName();
|
|
|
|
uiBlockingWindow.Line2 = "Reading ProductVersion...";
|
|
this.engineVersion = streamReader.GetEngineVersion();
|
|
|
|
if (!this.engineProductName.Equals("NullStreamReader"))
|
|
{
|
|
bool finalCaps = streamReader.CheckForDVB();
|
|
if (!finalCaps)
|
|
{
|
|
messageWindows.Add(new MessageWindow("Somehow CheckForDVB failed after a second call."));
|
|
}
|
|
}
|
|
|
|
uiBlockingWindow.Text = "Please wait while I try to qualify the engine...";
|
|
uiBlockingWindow.Line2 = "";
|
|
QualificationToolResultEnum qualification = QualificationTool.QualifyTunerFactory(this.engineProductName, this.engineVersion);
|
|
switch (qualification)
|
|
{
|
|
case QualificationToolResultEnum.Good:
|
|
break;
|
|
case QualificationToolResultEnum.Bad:
|
|
messageWindows.Add(new MessageWindow(String.Format("You are using {0}, Version {1}\nThis version is known to cause issues with skyscraper. You can continue using it, but if it causes issues, you're on your own.", this.engineProductName, this.engineVersion)));
|
|
break;
|
|
case QualificationToolResultEnum.Unknown:
|
|
messageWindows.Add(new MessageWindow(String.Format("You are using {0}, Version {1}\nThis version has not been tested with skyscraper, and might cause some issues. Consider submitting a copy of this version to the author.", this.engineProductName, this.engineVersion)));
|
|
break;
|
|
case QualificationToolResultEnum.PossibleIssues:
|
|
messageWindows.Add(new MessageWindow(String.Format("You are using {0}, Version {1}\nThis version will work, but might have minor issues in some edge cases.", this.engineProductName, this.engineVersion)));
|
|
break;
|
|
default:
|
|
messageWindows.Add(new MessageWindow(String.Format("You are using {0}, Version {1}\nThe Qualification said \"{2}\", but this status is not implemented.\n Possibly your skyscraper Version and your testdrid Version mismatch?", this.engineProductName, this.engineVersion,qualification.ToString())));
|
|
break;
|
|
}
|
|
|
|
//gseTest();
|
|
|
|
blockUi = false;
|
|
showMainMenu = true;
|
|
}
|
|
|
|
private void gseTest()
|
|
{
|
|
SearchResult sr = new SearchResult();
|
|
TunerMetadata tunerMetadata = tuners.Find(x => x.Name.Contains("5927"));
|
|
bool startDvbEx = streamReader.StartDvbEx(tunerMetadata.Index);
|
|
bool sendDiSEqC = streamReader.SendDiSEqC(2, DiSEqC_Opcode.DISEQC_HIGH_NIBBLE | DiSEqC_Opcode.DISEQC_VERTICAL | DiSEqC_Opcode.DISEQC_HIGH_BAND | DiSEqC_Opcode.DISEQC_OPTION_B | DiSEqC_Opcode.DISEQC_POSITION_A);
|
|
/*bool channel = streamReader.SetChannel(12611938, 21999618, 1, VITERBIRATE_TYPE.VR_3_4, 9750000, 10600000, 11700000);
|
|
while (true)
|
|
{
|
|
streamReader.SignalInfo(ref sr);
|
|
if (sr.Lock)
|
|
break;
|
|
else
|
|
Thread.Sleep(100);
|
|
}*/
|
|
bool blScanEx = streamReader.BLScanEx(11817000, 5000, 1, 9750000, 10600000, 11700000, 1000000, STD_TYPE.STD_AUTO, ref sr);
|
|
|
|
bool channel = streamReader.SetChannel(11817000, 29700000, 1, VITERBIRATE_TYPE.VR_AUTO, 9750000, 10600000, 11700000);
|
|
bool signalInfo = streamReader.SignalInfo(ref sr);
|
|
}
|
|
}
|
|
}
|