1
0
mirror of https://github.com/Artemis-RGB/Artemis synced 2025-12-13 05:48:35 +00:00

Added button to open logs folder to settings

Render exceptions are logged instead of thrown
Fixed layer condition crash
Logs are now archived and kept for 7 days
This commit is contained in:
SpoinkyNL 2016-12-16 20:30:25 +01:00
parent 2a13859afd
commit 08f8f45026
6 changed files with 107 additions and 94 deletions

View File

@ -62,16 +62,7 @@ namespace Artemis.Managers
} }
catch (Exception e) catch (Exception e)
{ {
if (_canShowException) _logger.Warn(e, "Exception in render loop");
{
Execute.OnUIThread(delegate
{
_canShowException = false;
_loopTimer.Stop();
App.GetArtemisExceptionViewer(e).ShowDialog();
Environment.Exit(0);
});
}
} }
} }

View File

@ -75,59 +75,62 @@ namespace Artemis.Models
{ {
if ((Profile == null) || (DataModel == null) || (DeviceManager.ActiveKeyboard == null)) if ((Profile == null) || (DataModel == null) || (DeviceManager.ActiveKeyboard == null))
return; return;
lock (DataModel) lock (DataModel)
{ {
// Get all enabled layers who's conditions are met lock (Profile)
var renderLayers = GetRenderLayers(keyboardOnly); {
// Get all enabled layers who's conditions are met
var renderLayers = GetRenderLayers(keyboardOnly);
// If the profile has no active LUA wrapper, create one // If the profile has no active LUA wrapper, create one
if (!string.IsNullOrEmpty(Profile.LuaScript)) if (!string.IsNullOrEmpty(Profile.LuaScript))
Profile.Activate(DeviceManager.ActiveKeyboard); Profile.Activate(DeviceManager.ActiveKeyboard);
// Render the keyboard layer-by-layer // Render the keyboard layer-by-layer
var keyboardRect = DeviceManager.ActiveKeyboard.KeyboardRectangle(KeyboardScale); var keyboardRect = DeviceManager.ActiveKeyboard.KeyboardRectangle(KeyboardScale);
using (var g = Graphics.FromImage(frame.KeyboardBitmap)) using (var g = Graphics.FromImage(frame.KeyboardBitmap))
{ {
Profile?.DrawLayers(g, renderLayers.Where(rl => rl.LayerType.DrawType == DrawType.Keyboard), Profile?.DrawLayers(g, renderLayers.Where(rl => rl.LayerType.DrawType == DrawType.Keyboard),
DataModel, keyboardRect, false, true, "keyboard"); DataModel, keyboardRect, false, true, "keyboard");
} }
// Render mice layer-by-layer // Render mice layer-by-layer
var devRec = new Rect(0, 0, 40, 40); var devRec = new Rect(0, 0, 40, 40);
using (var g = Graphics.FromImage(frame.MouseBitmap)) using (var g = Graphics.FromImage(frame.MouseBitmap))
{ {
Profile?.DrawLayers(g, renderLayers.Where(rl => rl.LayerType.DrawType == DrawType.Mouse), Profile?.DrawLayers(g, renderLayers.Where(rl => rl.LayerType.DrawType == DrawType.Mouse),
DataModel, devRec, false, true, "mouse"); DataModel, devRec, false, true, "mouse");
} }
// Render headsets layer-by-layer // Render headsets layer-by-layer
using (var g = Graphics.FromImage(frame.HeadsetBitmap)) using (var g = Graphics.FromImage(frame.HeadsetBitmap))
{ {
Profile?.DrawLayers(g, renderLayers.Where(rl => rl.LayerType.DrawType == DrawType.Headset), Profile?.DrawLayers(g, renderLayers.Where(rl => rl.LayerType.DrawType == DrawType.Headset),
DataModel, devRec, false, true, "headset"); DataModel, devRec, false, true, "headset");
} }
// Render generic devices layer-by-layer // Render generic devices layer-by-layer
using (var g = Graphics.FromImage(frame.GenericBitmap)) using (var g = Graphics.FromImage(frame.GenericBitmap))
{ {
Profile?.DrawLayers(g, renderLayers.Where(rl => rl.LayerType.DrawType == DrawType.Generic), Profile?.DrawLayers(g, renderLayers.Where(rl => rl.LayerType.DrawType == DrawType.Generic),
DataModel, devRec, false, true, "generic"); DataModel, devRec, false, true, "generic");
} }
// Render mousemats layer-by-layer // Render mousemats layer-by-layer
using (var g = Graphics.FromImage(frame.MousematBitmap)) using (var g = Graphics.FromImage(frame.MousematBitmap))
{ {
Profile?.DrawLayers(g, renderLayers.Where(rl => rl.LayerType.DrawType == DrawType.Mousemat), Profile?.DrawLayers(g, renderLayers.Where(rl => rl.LayerType.DrawType == DrawType.Mousemat),
DataModel, devRec, false, true, "mousemat"); DataModel, devRec, false, true, "mousemat");
} }
// Trace debugging // Trace debugging
if (DateTime.Now.AddSeconds(-2) <= LastTrace || Logger == null) if (DateTime.Now.AddSeconds(-2) <= LastTrace || Logger == null)
return; return;
LastTrace = DateTime.Now; LastTrace = DateTime.Now;
var dmJson = JsonConvert.SerializeObject(DataModel, Formatting.Indented); var dmJson = JsonConvert.SerializeObject(DataModel, Formatting.Indented);
Logger.Trace("Effect datamodel as JSON: \r\n{0}", dmJson); Logger.Trace("Effect datamodel as JSON: \r\n{0}", dmJson);
Logger.Trace("Effect {0} has to render {1} layers", Name, renderLayers.Count); Logger.Trace("Effect {0} has to render {1} layers", Name, renderLayers.Count);
foreach (var renderLayer in renderLayers) foreach (var renderLayer in renderLayers)
Logger.Trace("- Layer name: {0}, layer type: {1}", renderLayer.Name, renderLayer.LayerType); Logger.Trace("- Layer name: {0}, layer type: {1}", renderLayer.Name, renderLayer.LayerType);
}
} }
} }

View File

@ -21,38 +21,41 @@ namespace Artemis.Profiles.Layers.Models
public bool ConditionMet(IDataModel subject) public bool ConditionMet(IDataModel subject)
{ {
if (string.IsNullOrEmpty(Field) || string.IsNullOrEmpty(Value) || string.IsNullOrEmpty(Type)) lock (subject)
return false;
var inspect = GeneralHelpers.GetPropertyValue(subject, Field);
if (inspect == null)
return false;
// Put the subject in a list, allowing Dynamic Linq to be used.
if (Type == "String")
{ {
return _interpreter.Eval<bool>($"subject.{Field}.ToLower(){Operator}(value)", if (string.IsNullOrEmpty(Field) || string.IsNullOrEmpty(Value) || string.IsNullOrEmpty(Type))
new Parameter("subject", subject.GetType(), subject), return false;
new Parameter("value", Value.ToLower()));
}
Parameter rightParam = null; var inspect = GeneralHelpers.GetPropertyValue(subject, Field);
switch (Type) if (inspect == null)
{ return false;
case "Enum":
var enumType = GeneralHelpers.GetPropertyValue(subject, Field).GetType();
rightParam = new Parameter("value", Enum.Parse(enumType, Value));
break;
case "Boolean":
rightParam = new Parameter("value", bool.Parse(Value));
break;
case "Int32":
rightParam = new Parameter("value", int.Parse(Value));
break;
}
return _interpreter.Eval<bool>($"subject.{Field} {Operator} value", // Put the subject in a list, allowing Dynamic Linq to be used.
new Parameter("subject", subject.GetType(), subject), rightParam); if (Type == "String")
{
return _interpreter.Eval<bool>($"subject.{Field}.ToLower(){Operator}(value)",
new Parameter("subject", subject.GetType(), subject),
new Parameter("value", Value.ToLower()));
}
Parameter rightParam = null;
switch (Type)
{
case "Enum":
var enumType = GeneralHelpers.GetPropertyValue(subject, Field).GetType();
rightParam = new Parameter("value", Enum.Parse(enumType, Value));
break;
case "Boolean":
rightParam = new Parameter("value", bool.Parse(Value));
break;
case "Int32":
rightParam = new Parameter("value", int.Parse(Value));
break;
}
return _interpreter.Eval<bool>($"subject.{Field} {Operator} value",
new Parameter("subject", subject.GetType(), subject), rightParam);
}
} }
} }
} }

View File

@ -36,11 +36,13 @@ namespace Artemis.Utilities
// Step 3. Set target properties // Step 3. Set target properties
debuggerTarget.Layout = @"${logger:shortName=True} - ${uppercase:${level}}: ${message}"; debuggerTarget.Layout = @"${logger:shortName=True} - ${uppercase:${level}}: ${message}";
fileTarget.FileName = "${specialfolder:folder=MyDocuments}/Artemis/logs/${shortdate}.txt";
fileTarget.Layout = "${longdate}|${level:uppercase=true}|${logger}|${message} ${exception:format=tostring}"; fileTarget.Layout = "${longdate}|${level:uppercase=true}|${logger}|${message} ${exception:format=tostring}";
fileTarget.EnableFileDelete = true; fileTarget.FileName = "${specialfolder:folder=MyDocuments}/Artemis/logs/log.txt";
fileTarget.ArchiveFileName = "${specialfolder:folder=MyDocuments}/Artemis/logs/log-{#}.txt";
fileTarget.ArchiveEvery = FileArchivePeriod.Day;
fileTarget.ArchiveNumbering = ArchiveNumberingMode.Date;
fileTarget.ArchiveOldFileOnStartup = true;
fileTarget.MaxArchiveFiles = 7; fileTarget.MaxArchiveFiles = 7;
fileTarget.ArchiveEvery = FileArchivePeriod.Minute;
// Step 4. Define rules // Step 4. Define rules
var rule1 = new LoggingRule("*", logLevel, debuggerTarget); var rule1 = new LoggingRule("*", logLevel, debuggerTarget);
@ -53,9 +55,12 @@ namespace Artemis.Utilities
// Step 5. Activate the configuration // Step 5. Activate the configuration
LogManager.Configuration = config; LogManager.Configuration = config;
// Log as fatal so it always shows // Log as fatal so it always shows, add some spacing since this indicates the start of a new log
var logger = LogManager.GetCurrentClassLogger(); var logger = LogManager.GetCurrentClassLogger();
logger.Fatal("INFO: Set log level to {0}", logLevel); var logMsg = $" INFO: Set log level to {logLevel} ";
logger.Fatal(new string('-', logMsg.Length));
logger.Fatal(logMsg);
logger.Fatal(new string('-', logMsg.Length));
} }
private static void MemoryTargetOnEventReceived(LogEventInfo logEventInfo) private static void MemoryTargetOnEventReceived(LogEventInfo logEventInfo)

View File

@ -1,3 +1,4 @@
using System;
using System.ComponentModel; using System.ComponentModel;
using System.Diagnostics; using System.Diagnostics;
using System.Dynamic; using System.Dynamic;
@ -12,6 +13,7 @@ using Caliburn.Micro;
using MahApps.Metro.Controls; using MahApps.Metro.Controls;
using NLog; using NLog;
using ILogger = Ninject.Extensions.Logging.ILogger; using ILogger = Ninject.Extensions.Logging.ILogger;
using Process = System.Diagnostics.Process;
namespace Artemis.ViewModels.Flyouts namespace Artemis.ViewModels.Flyouts
{ {
@ -201,6 +203,12 @@ namespace Artemis.ViewModels.Flyouts
MainManager.EnableProgram(); MainManager.EnableProgram();
} }
public void ShowLogs()
{
var logPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + @"\Artemis\logs";
System.Diagnostics.Process.Start(logPath);
}
public void ShowDebug() public void ShowDebug()
{ {
IWindowManager manager = new WindowManager(); IWindowManager manager = new WindowManager();

View File

@ -102,16 +102,19 @@
<ComboBox Grid.Row="9" Grid.Column="1" x:Name="LogLevels" Margin="10" VerticalAlignment="Center" <ComboBox Grid.Row="9" Grid.Column="1" x:Name="LogLevels" Margin="10" VerticalAlignment="Center"
HorizontalAlignment="Right" HorizontalAlignment="Right"
Width="140" /> Width="140" />
<Button Grid.Row="10" Grid.Column="0" Margin="10" x:Name="ShowLogs" Content="Show logs"
VerticalAlignment="Center" Width="100" HorizontalAlignment="Left"
Style="{DynamicResource SquareButtonStyle}" />
<Button Grid.Row="10" Grid.Column="1" Margin="10" x:Name="ShowDebug" Content="Show debugger" <Button Grid.Row="10" Grid.Column="1" Margin="10" x:Name="ShowDebug" Content="Show debugger"
VerticalAlignment="Center" Width="90" HorizontalAlignment="Right" VerticalAlignment="Center" Width="100" HorizontalAlignment="Right"
Style="{DynamicResource SquareButtonStyle}" /> Style="{DynamicResource SquareButtonStyle}" />
<!-- Buttons --> <!-- Buttons -->
<Button Grid.Row="11" Grid.Column="0" Margin="10" x:Name="ResetSettings" Content="Reset settings" <Button Grid.Row="11" Grid.Column="0" Margin="10" x:Name="ResetSettings" Content="Reset settings"
VerticalAlignment="Center" HorizontalAlignment="Left" Width="90" VerticalAlignment="Center" HorizontalAlignment="Left" Width="100"
Style="{DynamicResource SquareButtonStyle}" /> Style="{DynamicResource SquareButtonStyle}" />
<Button Grid.Row="11" Grid.Column="1" Margin="11" x:Name="SaveSettings" Content="Save changes" <Button Grid.Row="11" Grid.Column="1" Margin="11" x:Name="SaveSettings" Content="Save changes"
VerticalAlignment="Center" HorizontalAlignment="Right" Width="90" VerticalAlignment="Center" HorizontalAlignment="Right" Width="100"
Style="{DynamicResource SquareButtonStyle}" /> Style="{DynamicResource SquareButtonStyle}" />
<!-- Version --> <!-- Version -->