From 13af6a8ed977718984d34159260897135f1e57ac Mon Sep 17 00:00:00 2001 From: SpoinkyNL Date: Thu, 22 Dec 2016 17:53:07 +0100 Subject: [PATCH] Implemented LightFX game model --- Artemis/Artemis/Artemis.csproj | 1 + .../Games/LightFx/Data/LightFxState.cs | 40 +++++++++++++++++++ .../Modules/Games/LightFx/LightFxDataModel.cs | 8 +++- .../Modules/Games/LightFx/LightFxModel.cs | 23 ++++++++--- Artemis/LightFX2Artemis/LightFxState.cpp | 9 ++--- Artemis/LightFX2Artemis/Source.cpp | 4 +- 6 files changed, 69 insertions(+), 16 deletions(-) create mode 100644 Artemis/Artemis/Modules/Games/LightFx/Data/LightFxState.cs diff --git a/Artemis/Artemis/Artemis.csproj b/Artemis/Artemis/Artemis.csproj index e91f5adb4..7b4e9355e 100644 --- a/Artemis/Artemis/Artemis.csproj +++ b/Artemis/Artemis/Artemis.csproj @@ -379,6 +379,7 @@ GtaVView.xaml + diff --git a/Artemis/Artemis/Modules/Games/LightFx/Data/LightFxState.cs b/Artemis/Artemis/Modules/Games/LightFx/Data/LightFxState.cs new file mode 100644 index 000000000..287b8d075 --- /dev/null +++ b/Artemis/Artemis/Modules/Games/LightFx/Data/LightFxState.cs @@ -0,0 +1,40 @@ +using MoonSharp.Interpreter; + +namespace Artemis.Modules.Games.LightFx.Data +{ + [MoonSharpUserData] + public class LightFxState + { + public Device[] devices { get; set; } + public string game { get; set; } + public Mask mask { get; set; } + } + + [MoonSharpUserData] + public class Device + { + public Light[] lights { get; set; } + } + + [MoonSharpUserData] + public class Mask + { + public Light light { get; set; } + public int location { get; set; } + } + + [MoonSharpUserData] + public class Light + { + public Color color { get; set; } + } + + [MoonSharpUserData] + public class Color + { + public int brightness { get; set; } + public int red { get; set; } + public int green { get; set; } + public int blue { get; set; } + } +} \ No newline at end of file diff --git a/Artemis/Artemis/Modules/Games/LightFx/LightFxDataModel.cs b/Artemis/Artemis/Modules/Games/LightFx/LightFxDataModel.cs index 0807b5eca..aa86630e2 100644 --- a/Artemis/Artemis/Modules/Games/LightFx/LightFxDataModel.cs +++ b/Artemis/Artemis/Modules/Games/LightFx/LightFxDataModel.cs @@ -1,15 +1,19 @@ using Artemis.Models.Interfaces; +using Artemis.Modules.Games.LightFx.Data; using MoonSharp.Interpreter; +using Newtonsoft.Json; namespace Artemis.Modules.Games.LightFx { [MoonSharpUserData] public class LightFxDataModel : IDataModel { + [JsonProperty(PropertyName = "lightFxState")] + public LightFxState LightFxState { get; set; } + public LightFxDataModel() { - + LightFxState = new LightFxState(); } - } } \ No newline at end of file diff --git a/Artemis/Artemis/Modules/Games/LightFx/LightFxModel.cs b/Artemis/Artemis/Modules/Games/LightFx/LightFxModel.cs index 2b1cd4835..143c5eb34 100644 --- a/Artemis/Artemis/Modules/Games/LightFx/LightFxModel.cs +++ b/Artemis/Artemis/Modules/Games/LightFx/LightFxModel.cs @@ -1,16 +1,19 @@ using System; using System.Collections.Generic; +using System.IO; using Artemis.DAL; using Artemis.Managers; using Artemis.Models; using Artemis.Profiles.Layers.Models; +using Artemis.Utilities.DataReaders; using Artemis.Utilities.GameState; +using Newtonsoft.Json; namespace Artemis.Modules.Games.LightFx { public class LightFxModel : GameModel { - public LightFxModel(DeviceManager deviceManager, GameStateWebServer gameStateWebServer) + public LightFxModel(DeviceManager deviceManager, PipeServer pipeServer) : base(deviceManager, SettingsProvider.Load(), new LightFxDataModel()) { Name = "LightFX"; @@ -20,20 +23,28 @@ namespace Artemis.Modules.Games.LightFx Initialized = false; // This model can enable itself by changing its process name to the currently running Light FX game. - gameStateWebServer.GameDataReceived += GameStateWebServerOnGameDataReceived; + pipeServer.PipeMessage += PipeServerOnPipeMessage; } - private void GameStateWebServerOnGameDataReceived(object sender, GameDataReceivedEventArgs e) + private void PipeServerOnPipeMessage(string msg) { - var jsonString = e.Json.ToString(); // Ensure it's Light FX JSON - if (!jsonString.Contains("lightFxState")) + if (!msg.Contains("lightFxState")) return; // Deserialize and data + try + { + JsonConvert.PopulateObject(msg, DataModel); + } + catch (Exception ex) + { + Logger?.Error(ex, "Failed to deserialize LightFX JSON"); + throw; + } // Setup process name - + ProcessName = Path.GetFileNameWithoutExtension(((LightFxDataModel)DataModel).LightFxState.game); } public int Scale { get; set; } diff --git a/Artemis/LightFX2Artemis/LightFxState.cpp b/Artemis/LightFX2Artemis/LightFxState.cpp index abd02c572..263d0f64e 100644 --- a/Artemis/LightFX2Artemis/LightFxState.cpp +++ b/Artemis/LightFX2Artemis/LightFxState.cpp @@ -20,14 +20,11 @@ LightFxState::~LightFxState() json LightFxState::GetJson() { - json root; json j; - root["lightFxState"] = { j }; - j["game"] = Game; j["mask"] = { - { "location", LocationMask }, - { "light", LocationMaskLight->GetJson() } + {"location", LocationMask}, + {"light", LocationMaskLight->GetJson()} }; j["devices"] = {}; for (LightFxDevice* device : Devices) @@ -35,5 +32,5 @@ json LightFxState::GetJson() j["devices"].push_back(device->GetJson()); } - return j; + return json{{"lightFxState", j}}; } diff --git a/Artemis/LightFX2Artemis/Source.cpp b/Artemis/LightFX2Artemis/Source.cpp index 5da496bc8..fe3ba36b2 100644 --- a/Artemis/LightFX2Artemis/Source.cpp +++ b/Artemis/LightFX2Artemis/Source.cpp @@ -80,8 +80,8 @@ FN_DECLSPEC LFX_RESULT STDCALL LFX_Update() Transmit(j.dump().c_str()); // Only bother dumping it indented if actually debugging - if (FILELog::ReportingLevel() == logDEBUG1) - FILE_LOG(logDEBUG1) << "JSON: " << j.dump(4); + if (FILELog::ReportingLevel() == logDEBUG1) + FILE_LOG(logDEBUG1) << "JSON: " << j.dump(4); return LFX_SUCCESS; }