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:
parent
2a13859afd
commit
08f8f45026
@ -62,16 +62,7 @@ namespace Artemis.Managers
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
if (_canShowException)
|
||||
{
|
||||
Execute.OnUIThread(delegate
|
||||
{
|
||||
_canShowException = false;
|
||||
_loopTimer.Stop();
|
||||
App.GetArtemisExceptionViewer(e).ShowDialog();
|
||||
Environment.Exit(0);
|
||||
});
|
||||
}
|
||||
_logger.Warn(e, "Exception in render loop");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -75,59 +75,62 @@ namespace Artemis.Models
|
||||
{
|
||||
if ((Profile == null) || (DataModel == null) || (DeviceManager.ActiveKeyboard == null))
|
||||
return;
|
||||
|
||||
|
||||
lock (DataModel)
|
||||
{
|
||||
// Get all enabled layers who's conditions are met
|
||||
var renderLayers = GetRenderLayers(keyboardOnly);
|
||||
lock (Profile)
|
||||
{
|
||||
// Get all enabled layers who's conditions are met
|
||||
var renderLayers = GetRenderLayers(keyboardOnly);
|
||||
|
||||
// If the profile has no active LUA wrapper, create one
|
||||
if (!string.IsNullOrEmpty(Profile.LuaScript))
|
||||
Profile.Activate(DeviceManager.ActiveKeyboard);
|
||||
// If the profile has no active LUA wrapper, create one
|
||||
if (!string.IsNullOrEmpty(Profile.LuaScript))
|
||||
Profile.Activate(DeviceManager.ActiveKeyboard);
|
||||
|
||||
// Render the keyboard layer-by-layer
|
||||
var keyboardRect = DeviceManager.ActiveKeyboard.KeyboardRectangle(KeyboardScale);
|
||||
using (var g = Graphics.FromImage(frame.KeyboardBitmap))
|
||||
{
|
||||
Profile?.DrawLayers(g, renderLayers.Where(rl => rl.LayerType.DrawType == DrawType.Keyboard),
|
||||
DataModel, keyboardRect, false, true, "keyboard");
|
||||
}
|
||||
// Render mice layer-by-layer
|
||||
var devRec = new Rect(0, 0, 40, 40);
|
||||
using (var g = Graphics.FromImage(frame.MouseBitmap))
|
||||
{
|
||||
Profile?.DrawLayers(g, renderLayers.Where(rl => rl.LayerType.DrawType == DrawType.Mouse),
|
||||
DataModel, devRec, false, true, "mouse");
|
||||
}
|
||||
// Render headsets layer-by-layer
|
||||
using (var g = Graphics.FromImage(frame.HeadsetBitmap))
|
||||
{
|
||||
Profile?.DrawLayers(g, renderLayers.Where(rl => rl.LayerType.DrawType == DrawType.Headset),
|
||||
DataModel, devRec, false, true, "headset");
|
||||
}
|
||||
// Render generic devices layer-by-layer
|
||||
using (var g = Graphics.FromImage(frame.GenericBitmap))
|
||||
{
|
||||
Profile?.DrawLayers(g, renderLayers.Where(rl => rl.LayerType.DrawType == DrawType.Generic),
|
||||
DataModel, devRec, false, true, "generic");
|
||||
}
|
||||
// Render mousemats layer-by-layer
|
||||
using (var g = Graphics.FromImage(frame.MousematBitmap))
|
||||
{
|
||||
Profile?.DrawLayers(g, renderLayers.Where(rl => rl.LayerType.DrawType == DrawType.Mousemat),
|
||||
DataModel, devRec, false, true, "mousemat");
|
||||
}
|
||||
// Render the keyboard layer-by-layer
|
||||
var keyboardRect = DeviceManager.ActiveKeyboard.KeyboardRectangle(KeyboardScale);
|
||||
using (var g = Graphics.FromImage(frame.KeyboardBitmap))
|
||||
{
|
||||
Profile?.DrawLayers(g, renderLayers.Where(rl => rl.LayerType.DrawType == DrawType.Keyboard),
|
||||
DataModel, keyboardRect, false, true, "keyboard");
|
||||
}
|
||||
// Render mice layer-by-layer
|
||||
var devRec = new Rect(0, 0, 40, 40);
|
||||
using (var g = Graphics.FromImage(frame.MouseBitmap))
|
||||
{
|
||||
Profile?.DrawLayers(g, renderLayers.Where(rl => rl.LayerType.DrawType == DrawType.Mouse),
|
||||
DataModel, devRec, false, true, "mouse");
|
||||
}
|
||||
// Render headsets layer-by-layer
|
||||
using (var g = Graphics.FromImage(frame.HeadsetBitmap))
|
||||
{
|
||||
Profile?.DrawLayers(g, renderLayers.Where(rl => rl.LayerType.DrawType == DrawType.Headset),
|
||||
DataModel, devRec, false, true, "headset");
|
||||
}
|
||||
// Render generic devices layer-by-layer
|
||||
using (var g = Graphics.FromImage(frame.GenericBitmap))
|
||||
{
|
||||
Profile?.DrawLayers(g, renderLayers.Where(rl => rl.LayerType.DrawType == DrawType.Generic),
|
||||
DataModel, devRec, false, true, "generic");
|
||||
}
|
||||
// Render mousemats layer-by-layer
|
||||
using (var g = Graphics.FromImage(frame.MousematBitmap))
|
||||
{
|
||||
Profile?.DrawLayers(g, renderLayers.Where(rl => rl.LayerType.DrawType == DrawType.Mousemat),
|
||||
DataModel, devRec, false, true, "mousemat");
|
||||
}
|
||||
|
||||
// Trace debugging
|
||||
if (DateTime.Now.AddSeconds(-2) <= LastTrace || Logger == null)
|
||||
return;
|
||||
// Trace debugging
|
||||
if (DateTime.Now.AddSeconds(-2) <= LastTrace || Logger == null)
|
||||
return;
|
||||
|
||||
LastTrace = DateTime.Now;
|
||||
var dmJson = JsonConvert.SerializeObject(DataModel, Formatting.Indented);
|
||||
Logger.Trace("Effect datamodel as JSON: \r\n{0}", dmJson);
|
||||
Logger.Trace("Effect {0} has to render {1} layers", Name, renderLayers.Count);
|
||||
foreach (var renderLayer in renderLayers)
|
||||
Logger.Trace("- Layer name: {0}, layer type: {1}", renderLayer.Name, renderLayer.LayerType);
|
||||
LastTrace = DateTime.Now;
|
||||
var dmJson = JsonConvert.SerializeObject(DataModel, Formatting.Indented);
|
||||
Logger.Trace("Effect datamodel as JSON: \r\n{0}", dmJson);
|
||||
Logger.Trace("Effect {0} has to render {1} layers", Name, renderLayers.Count);
|
||||
foreach (var renderLayer in renderLayers)
|
||||
Logger.Trace("- Layer name: {0}, layer type: {1}", renderLayer.Name, renderLayer.LayerType);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -21,38 +21,41 @@ namespace Artemis.Profiles.Layers.Models
|
||||
|
||||
public bool ConditionMet(IDataModel subject)
|
||||
{
|
||||
if (string.IsNullOrEmpty(Field) || string.IsNullOrEmpty(Value) || string.IsNullOrEmpty(Type))
|
||||
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")
|
||||
lock (subject)
|
||||
{
|
||||
return _interpreter.Eval<bool>($"subject.{Field}.ToLower(){Operator}(value)",
|
||||
new Parameter("subject", subject.GetType(), subject),
|
||||
new Parameter("value", Value.ToLower()));
|
||||
}
|
||||
if (string.IsNullOrEmpty(Field) || string.IsNullOrEmpty(Value) || string.IsNullOrEmpty(Type))
|
||||
return false;
|
||||
|
||||
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;
|
||||
}
|
||||
var inspect = GeneralHelpers.GetPropertyValue(subject, Field);
|
||||
if (inspect == null)
|
||||
return false;
|
||||
|
||||
return _interpreter.Eval<bool>($"subject.{Field} {Operator} value",
|
||||
new Parameter("subject", subject.GetType(), subject), rightParam);
|
||||
// Put the subject in a list, allowing Dynamic Linq to be used.
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -36,11 +36,13 @@ namespace Artemis.Utilities
|
||||
|
||||
// Step 3. Set target properties
|
||||
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.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.ArchiveEvery = FileArchivePeriod.Minute;
|
||||
|
||||
// Step 4. Define rules
|
||||
var rule1 = new LoggingRule("*", logLevel, debuggerTarget);
|
||||
@ -53,9 +55,12 @@ namespace Artemis.Utilities
|
||||
// Step 5. Activate the configuration
|
||||
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();
|
||||
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)
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
using System;
|
||||
using System.ComponentModel;
|
||||
using System.Diagnostics;
|
||||
using System.Dynamic;
|
||||
@ -12,6 +13,7 @@ using Caliburn.Micro;
|
||||
using MahApps.Metro.Controls;
|
||||
using NLog;
|
||||
using ILogger = Ninject.Extensions.Logging.ILogger;
|
||||
using Process = System.Diagnostics.Process;
|
||||
|
||||
namespace Artemis.ViewModels.Flyouts
|
||||
{
|
||||
@ -201,6 +203,12 @@ namespace Artemis.ViewModels.Flyouts
|
||||
MainManager.EnableProgram();
|
||||
}
|
||||
|
||||
public void ShowLogs()
|
||||
{
|
||||
var logPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + @"\Artemis\logs";
|
||||
System.Diagnostics.Process.Start(logPath);
|
||||
}
|
||||
|
||||
public void ShowDebug()
|
||||
{
|
||||
IWindowManager manager = new WindowManager();
|
||||
|
||||
@ -102,16 +102,19 @@
|
||||
<ComboBox Grid.Row="9" Grid.Column="1" x:Name="LogLevels" Margin="10" VerticalAlignment="Center"
|
||||
HorizontalAlignment="Right"
|
||||
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"
|
||||
VerticalAlignment="Center" Width="90" HorizontalAlignment="Right"
|
||||
VerticalAlignment="Center" Width="100" HorizontalAlignment="Right"
|
||||
Style="{DynamicResource SquareButtonStyle}" />
|
||||
|
||||
<!-- Buttons -->
|
||||
<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}" />
|
||||
<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}" />
|
||||
|
||||
<!-- Version -->
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user