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

Started work on Corsair mouse support

This commit is contained in:
Robert Beekman 2016-05-19 23:21:34 +02:00
parent a9373012a8
commit 3a18ce4a5a
20 changed files with 1029 additions and 952 deletions

View File

@ -278,22 +278,23 @@
</Compile> </Compile>
<Compile Include="ArtemisBootstrapper.cs" /> <Compile Include="ArtemisBootstrapper.cs" />
<Compile Include="DAL\ProfileProvider.cs" /> <Compile Include="DAL\ProfileProvider.cs" />
<Compile Include="DeviceProviders\Corsair\CorsairMice.cs" />
<Compile Include="DeviceProviders\DeviceProvider.cs" />
<Compile Include="Events\ActiveKeyboardChanged.cs" /> <Compile Include="Events\ActiveKeyboardChanged.cs" />
<Compile Include="Events\ToggleEnabled.cs" /> <Compile Include="Events\ToggleEnabled.cs" />
<Compile Include="Events\ActiveEffectChanged.cs" /> <Compile Include="Events\ActiveEffectChanged.cs" />
<Compile Include="Events\ChangeBitmap.cs" /> <Compile Include="Events\ChangeBitmap.cs" />
<Compile Include="InjectionFactories\IProfileEditorViewModelFactory.cs" /> <Compile Include="InjectionFactories\IProfileEditorViewModelFactory.cs" />
<Compile Include="ItemBehaviours\BindableSelectedItemBehavior.cs" /> <Compile Include="ItemBehaviours\BindableSelectedItemBehavior.cs" />
<Compile Include="KeyboardProviders\Corsair\CorsairRGB.cs" /> <Compile Include="DeviceProviders\Corsair\CorsairRGB.cs" />
<Compile Include="KeyboardProviders\KeyboardProvider.cs" /> <Compile Include="DeviceProviders\KeyboardProvider.cs" />
<Compile Include="KeyboardProviders\KeyboardRegion.cs" /> <Compile Include="DeviceProviders\Logitech\Orion.cs" />
<Compile Include="KeyboardProviders\Logitech\Orion.cs" /> <Compile Include="DeviceProviders\Logitech\Utilities\KeyboardNames.cs" />
<Compile Include="KeyboardProviders\Logitech\Utilities\KeyboardNames.cs" /> <Compile Include="DeviceProviders\Logitech\Utilities\KeyMap.cs" />
<Compile Include="KeyboardProviders\Logitech\Utilities\KeyMap.cs" /> <Compile Include="DeviceProviders\Logitech\Utilities\LogitechGSDK.cs" />
<Compile Include="KeyboardProviders\Logitech\Utilities\LogitechGSDK.cs" /> <Compile Include="DeviceProviders\Logitech\Utilities\OrionUtilities.cs" />
<Compile Include="KeyboardProviders\Logitech\Utilities\OrionUtilities.cs" /> <Compile Include="DeviceProviders\Razer\BlackWidow.cs" />
<Compile Include="KeyboardProviders\Razer\BlackWidow.cs" /> <Compile Include="DeviceProviders\Razer\Utilities\RazerUtilities.cs" />
<Compile Include="KeyboardProviders\Razer\Utilities\RazerUtilities.cs" />
<Compile Include="Managers\EffectManager.cs" /> <Compile Include="Managers\EffectManager.cs" />
<Compile Include="Managers\KeyboardManager.cs" /> <Compile Include="Managers\KeyboardManager.cs" />
<Compile Include="Managers\LoopManager.cs" /> <Compile Include="Managers\LoopManager.cs" />

View File

@ -4,7 +4,7 @@ using System.Diagnostics;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Xml.Serialization; using System.Xml.Serialization;
using Artemis.KeyboardProviders; using Artemis.DeviceProviders;
using Artemis.Models; using Artemis.Models;
using Artemis.Models.Profiles; using Artemis.Models.Profiles;

View File

@ -0,0 +1,74 @@
using System.Threading;
using System.Windows.Media;
using CUE.NET;
using CUE.NET.Devices.Generic.Enums;
using CUE.NET.Devices.Mouse;
using CUE.NET.Exceptions;
namespace Artemis.DeviceProviders.Corsair
{
internal class CorsairMice : DeviceProvider
{
private readonly CorsairRGB _corsairRgb;
private CorsairMouse _mouse;
public CorsairMice(CorsairRGB corsairRgb)
{
_corsairRgb = corsairRgb;
UpdateCanUse();
}
private void UpdateCanUse()
{
if (!CanInitializeSdk())
{
CanUse = false;
return;
}
if (CueSDK.ProtocolDetails == null)
CueSDK.Initialize(true);
_mouse = CueSDK.MouseSDK;
}
private static bool CanInitializeSdk()
{
// Try for about 10 seconds, in case CUE isn't started yet
var tries = 0;
while (tries < 9)
{
try
{
if (CueSDK.ProtocolDetails == null)
CueSDK.Initialize();
}
catch (CUEException e)
{
if (e.Error == CorsairError.ServerNotFound)
{
tries++;
Thread.Sleep(1000);
continue;
}
}
catch (WrapperException)
{
CueSDK.Reinitialize();
return true;
}
return true;
}
return false;
}
public override void UpdateDevice(Brush brush)
{
if (!CanUse)
return;
}
}
}

View File

@ -1,122 +1,122 @@
using System.Drawing; using System.Drawing;
using System.Threading; using System.Threading;
using System.Windows; using System.Windows;
using Artemis.Properties; using Artemis.Properties;
using Artemis.Utilities; using Artemis.Utilities;
using CUE.NET; using CUE.NET;
using CUE.NET.Brushes; using CUE.NET.Brushes;
using CUE.NET.Devices.Generic.Enums; using CUE.NET.Devices.Generic.Enums;
using CUE.NET.Devices.Keyboard; using CUE.NET.Devices.Keyboard;
using CUE.NET.Exceptions; using CUE.NET.Exceptions;
namespace Artemis.KeyboardProviders.Corsair namespace Artemis.DeviceProviders.Corsair
{ {
public class CorsairRGB : KeyboardProvider public class CorsairRGB : KeyboardProvider
{ {
private CorsairKeyboard _keyboard; private CorsairKeyboard _keyboard;
public CorsairRGB() public CorsairRGB()
{ {
Name = "Corsair RGB Keyboards"; Name = "Corsair RGB Keyboards";
CantEnableText = "Couldn't connect to your Corsair keyboard.\n" + CantEnableText = "Couldn't connect to your Corsair keyboard.\n" +
"Please check your cables and/or drivers (could be outdated) and that Corsair Utility Engine is running.\n" + "Please check your cables and/or drivers (could be outdated) and that Corsair Utility Engine is running.\n" +
"In CUE, make sure \"Enable SDK\" is checked under Settings > Program.\n\n" + "In CUE, make sure \"Enable SDK\" is checked under Settings > Program.\n\n" +
"If needed, you can select a different keyboard in Artemis under settings."; "If needed, you can select a different keyboard in Artemis under settings.";
} }
public override bool CanEnable() public override bool CanEnable()
{ {
// Try for about 10 seconds, in case CUE isn't started yet // Try for about 10 seconds, in case CUE isn't started yet
var tries = 0; var tries = 0;
while (tries < 9) while (tries < 9)
{ {
try try
{ {
if (CueSDK.ProtocolDetails == null) if (CueSDK.ProtocolDetails == null)
CueSDK.Initialize(); CueSDK.Initialize();
} }
catch (CUEException e) catch (CUEException e)
{ {
if (e.Error == CorsairError.ServerNotFound) if (e.Error == CorsairError.ServerNotFound)
{ {
tries++; tries++;
Thread.Sleep(1000); Thread.Sleep(1000);
continue; continue;
} }
} }
catch (WrapperException) catch (WrapperException)
{ {
CueSDK.Reinitialize(); CueSDK.Reinitialize();
return true; return true;
} }
return true; return true;
} }
return false; return false;
} }
/// <summary> /// <summary>
/// Enables the SDK and sets updatemode to manual as well as the color of the background to black. /// Enables the SDK and sets updatemode to manual as well as the color of the background to black.
/// </summary> /// </summary>
public override void Enable() public override void Enable()
{ {
try try
{ {
if (CueSDK.ProtocolDetails == null) if (CueSDK.ProtocolDetails == null)
CueSDK.Initialize(true); CueSDK.Initialize(true);
} }
catch (WrapperException) catch (WrapperException)
{ {
/*CUE is already initialized*/ /*CUE is already initialized*/
} }
_keyboard = CueSDK.KeyboardSDK; _keyboard = CueSDK.KeyboardSDK;
if (_keyboard.DeviceInfo.Model == "K95 RGB") if (_keyboard.DeviceInfo.Model == "K95 RGB")
{ {
Height = 7; Height = 7;
Width = 25; Width = 25;
PreviewSettings = new PreviewSettings(626, 175, new Thickness(0, -15, 0, 0), Resources.k95); PreviewSettings = new PreviewSettings(626, 175, new Thickness(0, -15, 0, 0), Resources.k95);
} }
else if (_keyboard.DeviceInfo.Model == "K70 RGB") else if (_keyboard.DeviceInfo.Model == "K70 RGB")
{ {
Height = 7; Height = 7;
Width = 21; Width = 21;
PreviewSettings = new PreviewSettings(626, 195, new Thickness(0, -25, 0, 0), Resources.k70); PreviewSettings = new PreviewSettings(626, 195, new Thickness(0, -25, 0, 0), Resources.k70);
} }
else if (_keyboard.DeviceInfo.Model == "K65 RGB") else if (_keyboard.DeviceInfo.Model == "K65 RGB")
{ {
Height = 7; Height = 7;
Width = 18; Width = 18;
PreviewSettings = new PreviewSettings(610, 240, new Thickness(0, -30, 0, 0), Resources.k65); PreviewSettings = new PreviewSettings(610, 240, new Thickness(0, -30, 0, 0), Resources.k65);
} }
else if (_keyboard.DeviceInfo.Model == "STRAFE RGB") else if (_keyboard.DeviceInfo.Model == "STRAFE RGB")
{ {
Height = 6; Height = 6;
Width = 22; Width = 22;
PreviewSettings = new PreviewSettings(620, 215, new Thickness(0, -15, 0, 0), Resources.strafe); PreviewSettings = new PreviewSettings(620, 215, new Thickness(0, -15, 0, 0), Resources.strafe);
} }
} }
public override void Disable() public override void Disable()
{ {
CueSDK.Reinitialize(); CueSDK.Reinitialize();
} }
/// <summary> /// <summary>
/// Properly resizes any size bitmap to the keyboard by creating a rectangle whose size is dependent on the bitmap /// Properly resizes any size bitmap to the keyboard by creating a rectangle whose size is dependent on the bitmap
/// size. /// size.
/// </summary> /// </summary>
/// <param name="bitmap"></param> /// <param name="bitmap"></param>
public override void DrawBitmap(Bitmap bitmap) public override void DrawBitmap(Bitmap bitmap)
{ {
var image = ImageUtilities.ResizeImage(bitmap, Width, Height); var image = ImageUtilities.ResizeImage(bitmap, Width, Height);
var brush = new ImageBrush var brush = new ImageBrush
{ {
Image = image Image = image
}; };
_keyboard.Brush = brush; _keyboard.Brush = brush;
_keyboard.Update(); _keyboard.Update();
} }
} }
} }

View File

@ -0,0 +1,30 @@
using System.Windows.Media;
namespace Artemis.DeviceProviders
{
public abstract class DeviceProvider
{
/// <summary>
/// Indicates the device type
/// </summary>
public DeviceType Type { get; set; }
/// <summary>
/// Indicates whether or not the device can be updated
/// </summary>
public bool CanUse { get; set; }
/// <summary>
/// Updates a non-keyboard to take the colours of the provided brush
/// </summary>
/// <param name="brush"></param>
public abstract void UpdateDevice(Brush brush);
}
public enum DeviceType
{
Keyboard,
Mouse,
Headset
}
}

View File

@ -1,69 +1,64 @@
using System.Drawing; using System;
using System.Windows; using System.Drawing;
using Size = System.Windows.Size; using System.Windows;
using Brush = System.Windows.Media.Brush;
namespace Artemis.KeyboardProviders using Size = System.Windows.Size;
{
public abstract class KeyboardProvider : DeviceProvider namespace Artemis.DeviceProviders
{ {
protected KeyboardProvider() public abstract class KeyboardProvider : DeviceProvider
{ {
Type = DeviceType.Keyboard; protected KeyboardProvider()
} {
Type = DeviceType.Keyboard;
public string Name { get; set; } }
public int Height { get; set; }
public int Width { get; set; } public string Name { get; set; }
public string CantEnableText { get; set; } public int Height { get; set; }
public int Width { get; set; }
public PreviewSettings PreviewSettings { get; set; } public string CantEnableText { get; set; }
public abstract bool CanEnable(); public PreviewSettings PreviewSettings { get; set; }
public abstract void Enable();
// TODO: This should be done in a background thread with a callback mechanism as it causes UI lag public abstract bool CanEnable();
public abstract void Disable(); public abstract void Enable();
public abstract void DrawBitmap(Bitmap bitmap); // TODO: This should be done in a background thread with a callback mechanism as it causes UI lag
public abstract void Disable();
/// <summary> public abstract void DrawBitmap(Bitmap bitmap);
/// Returns a bitmap matching the keyboard's dimensions
/// </summary> /// <summary>
/// <returns></returns> /// Returns a bitmap matching the keyboard's dimensions
public Bitmap KeyboardBitmap() => new Bitmap(Width, Height); /// </summary>
/// <returns></returns>
/// <summary> public Bitmap KeyboardBitmap() => new Bitmap(Width, Height);
/// Returns a bitmap matching the keyboard's dimensions using the provided scale
/// </summary> /// <summary>
/// <returns></returns> /// Returns a bitmap matching the keyboard's dimensions using the provided scale
public Bitmap KeyboardBitmap(int scale) => new Bitmap(Width*scale, Height*scale); /// </summary>
/// <returns></returns>
public Rect KeyboardRectangle(int scale) => new Rect(new Size(Width*scale, Height*scale)); public Bitmap KeyboardBitmap(int scale) => new Bitmap(Width*scale, Height*scale);
}
public Rect KeyboardRectangle(int scale) => new Rect(new Size(Width*scale, Height*scale));
public class DeviceProvider
{ public override void UpdateDevice(Brush brush)
public DeviceType Type { get; set; } {
} throw new NotImplementedException("KeyboardProvider doesn't implement UpdateDevice, use DrawBitmap instead.");
}
public enum DeviceType }
{
Keyboard, public struct PreviewSettings
Mouse, {
Headset public int Width { get; set; }
} public int Height { get; set; }
public Thickness Margin { get; set; }
public struct PreviewSettings public Bitmap Image { get; set; }
{
public int Width { get; set; } public PreviewSettings(int width, int height, Thickness margin, Bitmap image)
public int Height { get; set; } {
public Thickness Margin { get; set; } Width = width;
public Bitmap Image { get; set; } Height = height;
Margin = margin;
public PreviewSettings(int width, int height, Thickness margin, Bitmap image) Image = image;
{ }
Width = width; }
Height = height;
Margin = margin;
Image = image;
}
}
} }

View File

@ -1,84 +1,82 @@
using System.Collections.Generic; using System.Drawing;
using System.Drawing; using System.Threading;
using System.Threading; using System.Windows;
using System.Windows; using Artemis.DeviceProviders.Logitech.Utilities;
using Artemis.KeyboardProviders.Logitech.Utilities; using Artemis.Properties;
using Artemis.Properties; using Artemis.Utilities;
using Artemis.Utilities;
using Point = System.Drawing.Point; namespace Artemis.DeviceProviders.Logitech
{
namespace Artemis.KeyboardProviders.Logitech internal class Orion : KeyboardProvider
{ {
internal class Orion : KeyboardProvider public Orion()
{ {
public Orion() Name = "Logitech G910 RGB";
{ CantEnableText = "Couldn't connect to your Logitech G910.\n" +
Name = "Logitech G910 RGB"; "Please check your cables and updating the Logitech Gaming Software\n" +
CantEnableText = "Couldn't connect to your Logitech G910.\n" + "A minimum version of 8.81.15 is required.\n\n" +
"Please check your cables and updating the Logitech Gaming Software\n" + "If needed, you can select a different keyboard in Artemis under settings.";
"A minimum version of 8.81.15 is required.\n\n" + Height = 6;
"If needed, you can select a different keyboard in Artemis under settings."; Width = 21;
Height = 6; PreviewSettings = new PreviewSettings(540, 154, new Thickness(25, -80, 0, 0), Resources.g910);
Width = 21; }
PreviewSettings = new PreviewSettings(540, 154, new Thickness(25, -80, 0, 0), Resources.g910);
} public override bool CanEnable()
{
public override bool CanEnable() //if (DllManager.RestoreDll())
{ // RestoreDll();
//if (DllManager.RestoreDll()) int majorNum = 0, minorNum = 0, buildNum = 0;
// RestoreDll();
int majorNum = 0, minorNum = 0, buildNum = 0; LogitechGSDK.LogiLedInit();
LogitechGSDK.LogiLedGetSdkVersion(ref majorNum, ref minorNum, ref buildNum);
LogitechGSDK.LogiLedInit(); LogitechGSDK.LogiLedShutdown();
LogitechGSDK.LogiLedGetSdkVersion(ref majorNum, ref minorNum, ref buildNum);
LogitechGSDK.LogiLedShutdown(); // Turn it into one long number...
var version = int.Parse($"{majorNum}{minorNum}{buildNum}");
// Turn it into one long number... CantEnableText = "Couldn't connect to your Logitech G910.\n" +
var version = int.Parse($"{majorNum}{minorNum}{buildNum}"); "Please check your cables and updating the Logitech Gaming Software\n" +
CantEnableText = "Couldn't connect to your Logitech G910.\n" + $"A minimum version of 8.81.15 is required (detected {majorNum}.{minorNum}.{buildNum}).\n\n" +
"Please check your cables and updating the Logitech Gaming Software\n" + "If the detected version differs from the version LGS is reporting, reinstall LGS or see the FAQ.\n\n" +
$"A minimum version of 8.81.15 is required (detected {majorNum}.{minorNum}.{buildNum}).\n\n" + "If needed, you can select a different keyboard in Artemis under settings.";
"If the detected version differs from the version LGS is reporting, reinstall LGS or see the FAQ.\n\n" +
"If needed, you can select a different keyboard in Artemis under settings."; return version >= 88115;
}
return version >= 88115;
} private void RestoreDll()
{
private void RestoreDll() MessageBox.Show(
{ "Artemis couldn't enable your Logitech keyboard, because the required files are not in place.\n\n" +
MessageBox.Show( "This happens when you run The Division and shut down Artemis before shutting down The Division\n" +
"Artemis couldn't enable your Logitech keyboard, because the required files are not in place.\n\n" + "It can be fixed automatically by clicking OK, but to avoid this message in the future please\n" +
"This happens when you run The Division and shut down Artemis before shutting down The Division\n" + "shut down The Division before shutting down Artemis.\n\n" +
"It can be fixed automatically by clicking OK, but to avoid this message in the future please\n" + "Click OK to fix the issue and restart Artemis");
"shut down The Division before shutting down Artemis.\n\n" +
"Click OK to fix the issue and restart Artemis"); GeneralHelpers.RunAsAdministrator();
}
GeneralHelpers.RunAsAdministrator();
} public override void Enable()
{
public override void Enable() // Initialize the SDK
{ LogitechGSDK.LogiLedInit();
// Initialize the SDK Thread.Sleep(200);
LogitechGSDK.LogiLedInit();
Thread.Sleep(200); LogitechGSDK.LogiLedSaveCurrentLighting();
LogitechGSDK.LogiLedSetTargetDevice(LogitechGSDK.LOGI_DEVICETYPE_PERKEY_RGB);
LogitechGSDK.LogiLedSaveCurrentLighting();
LogitechGSDK.LogiLedSetTargetDevice(LogitechGSDK.LOGI_DEVICETYPE_PERKEY_RGB); // Disable keys we can't color
LogitechGSDK.LogiLedSetLighting(0, 0, 0);
// Disable keys we can't color }
LogitechGSDK.LogiLedSetLighting(0, 0, 0);
} public override void Disable()
{
public override void Disable() // Shutdown the SDK
{ LogitechGSDK.LogiLedRestoreLighting();
// Shutdown the SDK LogitechGSDK.LogiLedShutdown();
LogitechGSDK.LogiLedRestoreLighting(); }
LogitechGSDK.LogiLedShutdown();
} public override void DrawBitmap(Bitmap bitmap)
{
public override void DrawBitmap(Bitmap bitmap) LogitechGSDK.LogiLedSetLightingFromBitmap(OrionUtilities.BitmapToByteArray(bitmap));
{ }
LogitechGSDK.LogiLedSetLightingFromBitmap(OrionUtilities.BitmapToByteArray(bitmap)); }
}
}
} }

View File

@ -1,137 +1,137 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Windows.Forms; using System.Windows.Forms;
using Artemis.Utilities.Keyboard; using Artemis.Utilities.Keyboard;
namespace Artemis.KeyboardProviders.Logitech.Utilities namespace Artemis.DeviceProviders.Logitech.Utilities
{ {
public static class KeyMap public static class KeyMap
{ {
static KeyMap() static KeyMap()
{ {
// There are several keyboard layouts // There are several keyboard layouts
// TODO: Implemented more layouts and an option to select them // TODO: Implemented more layouts and an option to select them
UsEnglishOrionKeys = new List<Key> UsEnglishOrionKeys = new List<Key>
{ {
// Row 1 // Row 1
new Key(Keys.Escape, 0, 0), new Key(Keys.Escape, 0, 0),
new Key(Keys.F1, 1, 0), new Key(Keys.F1, 1, 0),
new Key(Keys.F2, 2, 0), new Key(Keys.F2, 2, 0),
new Key(Keys.F3, 3, 0), new Key(Keys.F3, 3, 0),
new Key(Keys.F4, 4, 0), new Key(Keys.F4, 4, 0),
new Key(Keys.F5, 5, 0), new Key(Keys.F5, 5, 0),
new Key(Keys.F6, 6, 0), new Key(Keys.F6, 6, 0),
new Key(Keys.F7, 7, 0), new Key(Keys.F7, 7, 0),
new Key(Keys.F8, 8, 0), new Key(Keys.F8, 8, 0),
new Key(Keys.F9, 9, 0), new Key(Keys.F9, 9, 0),
new Key(Keys.F10, 10, 0), new Key(Keys.F10, 10, 0),
new Key(Keys.F11, 11, 0), new Key(Keys.F11, 11, 0),
new Key(Keys.F12, 12, 0), new Key(Keys.F12, 12, 0),
new Key(Keys.PrintScreen, 13, 0), new Key(Keys.PrintScreen, 13, 0),
new Key(Keys.Scroll, 14, 0), new Key(Keys.Scroll, 14, 0),
new Key(Keys.Pause, 15, 0), new Key(Keys.Pause, 15, 0),
// Row 2 // Row 2
new Key(Keys.Oemtilde, 0, 1), new Key(Keys.Oemtilde, 0, 1),
new Key(Keys.D1, 1, 1), new Key(Keys.D1, 1, 1),
new Key(Keys.D2, 2, 1), new Key(Keys.D2, 2, 1),
new Key(Keys.D3, 3, 1), new Key(Keys.D3, 3, 1),
new Key(Keys.D4, 4, 1), new Key(Keys.D4, 4, 1),
new Key(Keys.D5, 5, 1), new Key(Keys.D5, 5, 1),
new Key(Keys.D6, 6, 1), new Key(Keys.D6, 6, 1),
new Key(Keys.D7, 7, 1), new Key(Keys.D7, 7, 1),
new Key(Keys.D8, 8, 1), new Key(Keys.D8, 8, 1),
new Key(Keys.D9, 9, 1), new Key(Keys.D9, 9, 1),
new Key(Keys.D0, 10, 1), new Key(Keys.D0, 10, 1),
new Key(Keys.OemMinus, 11, 1), new Key(Keys.OemMinus, 11, 1),
new Key(Keys.Oemplus, 12, 1), new Key(Keys.Oemplus, 12, 1),
new Key(Keys.Back, 13, 1), new Key(Keys.Back, 13, 1),
new Key(Keys.Insert, 14, 1), new Key(Keys.Insert, 14, 1),
new Key(Keys.Home, 15, 1), new Key(Keys.Home, 15, 1),
new Key(Keys.PageUp, 16, 1), new Key(Keys.PageUp, 16, 1),
new Key(Keys.NumLock, 17, 1), new Key(Keys.NumLock, 17, 1),
new Key(Keys.Divide, 18, 1), new Key(Keys.Divide, 18, 1),
new Key(Keys.Multiply, 19, 1), new Key(Keys.Multiply, 19, 1),
new Key(Keys.Subtract, 20, 1), new Key(Keys.Subtract, 20, 1),
// Row 3 // Row 3
new Key(Keys.Tab, 0, 2), new Key(Keys.Tab, 0, 2),
new Key(Keys.Q, 1, 2), new Key(Keys.Q, 1, 2),
new Key(Keys.W, 2, 2), new Key(Keys.W, 2, 2),
new Key(Keys.E, 3, 2), new Key(Keys.E, 3, 2),
new Key(Keys.R, 4, 2), new Key(Keys.R, 4, 2),
new Key(Keys.T, 5, 2), new Key(Keys.T, 5, 2),
new Key(Keys.Y, 6, 2), new Key(Keys.Y, 6, 2),
new Key(Keys.U, 7, 2), new Key(Keys.U, 7, 2),
new Key(Keys.I, 8, 2), new Key(Keys.I, 8, 2),
new Key(Keys.O, 9, 2), new Key(Keys.O, 9, 2),
new Key(Keys.P, 10, 2), new Key(Keys.P, 10, 2),
new Key(Keys.OemOpenBrackets, 11, 2), new Key(Keys.OemOpenBrackets, 11, 2),
new Key(Keys.Oem6, 12, 2), new Key(Keys.Oem6, 12, 2),
new Key(Keys.Delete, 14, 2), new Key(Keys.Delete, 14, 2),
new Key(Keys.End, 15, 2), new Key(Keys.End, 15, 2),
new Key(Keys.Next, 16, 2), new Key(Keys.Next, 16, 2),
new Key(Keys.NumPad7, 17, 2), new Key(Keys.NumPad7, 17, 2),
new Key(Keys.NumPad8, 18, 2), new Key(Keys.NumPad8, 18, 2),
new Key(Keys.NumPad9, 19, 2), new Key(Keys.NumPad9, 19, 2),
new Key(Keys.Add, 20, 2), new Key(Keys.Add, 20, 2),
// Row 4 // Row 4
new Key(Keys.Capital, 0, 3), new Key(Keys.Capital, 0, 3),
new Key(Keys.A, 1, 3), new Key(Keys.A, 1, 3),
new Key(Keys.S, 2, 3), new Key(Keys.S, 2, 3),
new Key(Keys.D, 3, 3), new Key(Keys.D, 3, 3),
new Key(Keys.F, 4, 3), new Key(Keys.F, 4, 3),
new Key(Keys.G, 5, 3), new Key(Keys.G, 5, 3),
new Key(Keys.H, 6, 3), new Key(Keys.H, 6, 3),
new Key(Keys.J, 7, 3), new Key(Keys.J, 7, 3),
new Key(Keys.K, 8, 3), new Key(Keys.K, 8, 3),
new Key(Keys.L, 9, 3), new Key(Keys.L, 9, 3),
new Key(Keys.Oem1, 10, 3), new Key(Keys.Oem1, 10, 3),
new Key(Keys.Oem7, 11, 3), new Key(Keys.Oem7, 11, 3),
new Key(Keys.Oem5, 12, 3), new Key(Keys.Oem5, 12, 3),
new Key(Keys.Return, 13, 3), new Key(Keys.Return, 13, 3),
new Key(Keys.NumPad4, 17, 3), new Key(Keys.NumPad4, 17, 3),
new Key(Keys.NumPad5, 18, 3), new Key(Keys.NumPad5, 18, 3),
new Key(Keys.NumPad6, 19, 3), new Key(Keys.NumPad6, 19, 3),
// Row 5 // Row 5
new Key(Keys.LShiftKey, 1, 4), new Key(Keys.LShiftKey, 1, 4),
new Key(Keys.OemBackslash, 2, 4), new Key(Keys.OemBackslash, 2, 4),
new Key(Keys.Z, 2, 4), new Key(Keys.Z, 2, 4),
new Key(Keys.X, 3, 4), new Key(Keys.X, 3, 4),
new Key(Keys.C, 4, 4), new Key(Keys.C, 4, 4),
new Key(Keys.V, 5, 4), new Key(Keys.V, 5, 4),
new Key(Keys.B, 6, 4), new Key(Keys.B, 6, 4),
new Key(Keys.N, 7, 4), new Key(Keys.N, 7, 4),
new Key(Keys.M, 8, 4), new Key(Keys.M, 8, 4),
new Key(Keys.Oemcomma, 9, 4), new Key(Keys.Oemcomma, 9, 4),
new Key(Keys.OemPeriod, 10, 4), new Key(Keys.OemPeriod, 10, 4),
new Key(Keys.OemQuestion, 11, 4), new Key(Keys.OemQuestion, 11, 4),
new Key(Keys.RShiftKey, 13, 4), new Key(Keys.RShiftKey, 13, 4),
new Key(Keys.Up, 15, 4), new Key(Keys.Up, 15, 4),
new Key(Keys.NumPad1, 17, 4), new Key(Keys.NumPad1, 17, 4),
new Key(Keys.NumPad2, 18, 4), new Key(Keys.NumPad2, 18, 4),
new Key(Keys.NumPad3, 19, 4), new Key(Keys.NumPad3, 19, 4),
// Both returns return "Return" (Yes...) // Both returns return "Return" (Yes...)
// new OrionKey(System.Windows.Forms.Keys.Return, 20, 4), // new OrionKey(System.Windows.Forms.Keys.Return, 20, 4),
// Row 6 // Row 6
new Key(Keys.LControlKey, 0, 5), new Key(Keys.LControlKey, 0, 5),
new Key(Keys.LWin, 1, 5), new Key(Keys.LWin, 1, 5),
new Key(Keys.LMenu, 2, 5), new Key(Keys.LMenu, 2, 5),
new Key(Keys.Space, 5, 5), new Key(Keys.Space, 5, 5),
new Key(Keys.RMenu, 11, 5), new Key(Keys.RMenu, 11, 5),
new Key(Keys.RWin, 12, 5), new Key(Keys.RWin, 12, 5),
new Key(Keys.Apps, 13, 5), new Key(Keys.Apps, 13, 5),
new Key(Keys.RControlKey, 14, 5), new Key(Keys.RControlKey, 14, 5),
new Key(Keys.Left, 15, 5), new Key(Keys.Left, 15, 5),
new Key(Keys.Down, 16, 5), new Key(Keys.Down, 16, 5),
new Key(Keys.Right, 17, 5), new Key(Keys.Right, 17, 5),
new Key(Keys.NumPad0, 18, 5), new Key(Keys.NumPad0, 18, 5),
new Key(Keys.Decimal, 19, 5) new Key(Keys.Decimal, 19, 5)
}; };
} }
public static List<Key> UsEnglishOrionKeys { get; set; } public static List<Key> UsEnglishOrionKeys { get; set; }
} }
} }

View File

@ -1,111 +1,111 @@
namespace Artemis.KeyboardProviders.Logitech.Utilities namespace Artemis.DeviceProviders.Logitech.Utilities
{ {
public enum KeyboardNames public enum KeyboardNames
{ {
ESC = 0x01, ESC = 0x01,
F1 = 0x3b, F1 = 0x3b,
F2 = 0x3c, F2 = 0x3c,
F3 = 0x3d, F3 = 0x3d,
F4 = 0x3e, F4 = 0x3e,
F5 = 0x3f, F5 = 0x3f,
F6 = 0x40, F6 = 0x40,
F7 = 0x41, F7 = 0x41,
F8 = 0x42, F8 = 0x42,
F9 = 0x43, F9 = 0x43,
F10 = 0x44, F10 = 0x44,
F11 = 0x57, F11 = 0x57,
F12 = 0x58, F12 = 0x58,
PRINT_SCREEN = 0x137, PRINT_SCREEN = 0x137,
SCROLL_LOCK = 0x46, SCROLL_LOCK = 0x46,
PAUSE_BREAK = 0x45, PAUSE_BREAK = 0x45,
TILDE = 0x29, TILDE = 0x29,
ONE = 0x02, ONE = 0x02,
TWO = 0x03, TWO = 0x03,
THREE = 0x04, THREE = 0x04,
FOUR = 0x05, FOUR = 0x05,
FIVE = 0x06, FIVE = 0x06,
SIX = 0x07, SIX = 0x07,
SEVEN = 0x08, SEVEN = 0x08,
EIGHT = 0x09, EIGHT = 0x09,
NINE = 0x0A, NINE = 0x0A,
ZERO = 0x0B, ZERO = 0x0B,
MINUS = 0x0C, MINUS = 0x0C,
EQUALS = 0x0D, EQUALS = 0x0D,
BACKSPACE = 0x0E, BACKSPACE = 0x0E,
INSERT = 0x152, INSERT = 0x152,
HOME = 0x147, HOME = 0x147,
PAGE_UP = 0x149, PAGE_UP = 0x149,
NUM_LOCK = 0x145, NUM_LOCK = 0x145,
NUM_SLASH = 0x135, NUM_SLASH = 0x135,
NUM_ASTERISK = 0x37, NUM_ASTERISK = 0x37,
NUM_MINUS = 0x4A, NUM_MINUS = 0x4A,
TAB = 0x0F, TAB = 0x0F,
Q = 0x10, Q = 0x10,
W = 0x11, W = 0x11,
E = 0x12, E = 0x12,
R = 0x13, R = 0x13,
T = 0x14, T = 0x14,
Y = 0x15, Y = 0x15,
U = 0x16, U = 0x16,
I = 0x17, I = 0x17,
O = 0x18, O = 0x18,
P = 0x19, P = 0x19,
OPEN_BRACKET = 0x1A, OPEN_BRACKET = 0x1A,
CLOSE_BRACKET = 0x1B, CLOSE_BRACKET = 0x1B,
BACKSLASH = 0x2B, BACKSLASH = 0x2B,
KEYBOARD_DELETE = 0x153, KEYBOARD_DELETE = 0x153,
END = 0x14F, END = 0x14F,
PAGE_DOWN = 0x151, PAGE_DOWN = 0x151,
NUM_SEVEN = 0x47, NUM_SEVEN = 0x47,
NUM_EIGHT = 0x48, NUM_EIGHT = 0x48,
NUM_NINE = 0x49, NUM_NINE = 0x49,
NUM_PLUS = 0x4E, NUM_PLUS = 0x4E,
CAPS_LOCK = 0x3A, CAPS_LOCK = 0x3A,
A = 0x1E, A = 0x1E,
S = 0x1F, S = 0x1F,
D = 0x20, D = 0x20,
F = 0x21, F = 0x21,
G = 0x22, G = 0x22,
H = 0x23, H = 0x23,
J = 0x24, J = 0x24,
K = 0x25, K = 0x25,
L = 0x26, L = 0x26,
SEMICOLON = 0x27, SEMICOLON = 0x27,
APOSTROPHE = 0x28, APOSTROPHE = 0x28,
ENTER = 0x1C, ENTER = 0x1C,
NUM_FOUR = 0x4B, NUM_FOUR = 0x4B,
NUM_FIVE = 0x4C, NUM_FIVE = 0x4C,
NUM_SIX = 0x4D, NUM_SIX = 0x4D,
LEFT_SHIFT = 0x2A, LEFT_SHIFT = 0x2A,
Z = 0x2C, Z = 0x2C,
X = 0x2D, X = 0x2D,
C = 0x2E, C = 0x2E,
V = 0x2F, V = 0x2F,
B = 0x30, B = 0x30,
N = 0x31, N = 0x31,
M = 0x32, M = 0x32,
COMMA = 0x33, COMMA = 0x33,
PERIOD = 0x34, PERIOD = 0x34,
FORWARD_SLASH = 0x35, FORWARD_SLASH = 0x35,
RIGHT_SHIFT = 0x36, RIGHT_SHIFT = 0x36,
ARROW_UP = 0x148, ARROW_UP = 0x148,
NUM_ONE = 0x4F, NUM_ONE = 0x4F,
NUM_TWO = 0x50, NUM_TWO = 0x50,
NUM_THREE = 0x51, NUM_THREE = 0x51,
NUM_ENTER = 0x11C, NUM_ENTER = 0x11C,
LEFT_CONTROL = 0x1D, LEFT_CONTROL = 0x1D,
LEFT_WINDOWS = 0x15B, LEFT_WINDOWS = 0x15B,
LEFT_ALT = 0x38, LEFT_ALT = 0x38,
SPACE = 0x39, SPACE = 0x39,
RIGHT_ALT = 0x138, RIGHT_ALT = 0x138,
RIGHT_WINDOWS = 0x15C, RIGHT_WINDOWS = 0x15C,
APPLICATION_SELECT = 0x15D, APPLICATION_SELECT = 0x15D,
RIGHT_CONTROL = 0x11D, RIGHT_CONTROL = 0x11D,
ARROW_LEFT = 0x14B, ARROW_LEFT = 0x14B,
ARROW_DOWN = 0x150, ARROW_DOWN = 0x150,
ARROW_RIGHT = 0x14D, ARROW_RIGHT = 0x14D,
NUM_ZERO = 0x52, NUM_ZERO = 0x52,
NUM_PERIOD = 0x53, NUM_PERIOD = 0x53,
TEST = 0x1 TEST = 0x1
} }
} }

View File

@ -1,95 +1,95 @@
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
// ReSharper disable InconsistentNaming // ReSharper disable InconsistentNaming
namespace Artemis.KeyboardProviders.Logitech.Utilities namespace Artemis.DeviceProviders.Logitech.Utilities
{ {
public class LogitechGSDK public class LogitechGSDK
{ {
//LED SDK //LED SDK
private const int LOGI_DEVICETYPE_MONOCHROME_ORD = 0; private const int LOGI_DEVICETYPE_MONOCHROME_ORD = 0;
private const int LOGI_DEVICETYPE_RGB_ORD = 1; private const int LOGI_DEVICETYPE_RGB_ORD = 1;
private const int LOGI_DEVICETYPE_PERKEY_RGB_ORD = 2; private const int LOGI_DEVICETYPE_PERKEY_RGB_ORD = 2;
public const int LOGI_DEVICETYPE_MONOCHROME = 1 << LOGI_DEVICETYPE_MONOCHROME_ORD; public const int LOGI_DEVICETYPE_MONOCHROME = 1 << LOGI_DEVICETYPE_MONOCHROME_ORD;
public const int LOGI_DEVICETYPE_RGB = 1 << LOGI_DEVICETYPE_RGB_ORD; public const int LOGI_DEVICETYPE_RGB = 1 << LOGI_DEVICETYPE_RGB_ORD;
public const int LOGI_DEVICETYPE_PERKEY_RGB = 1 << LOGI_DEVICETYPE_PERKEY_RGB_ORD; public const int LOGI_DEVICETYPE_PERKEY_RGB = 1 << LOGI_DEVICETYPE_PERKEY_RGB_ORD;
public const int LOGI_LED_BITMAP_WIDTH = 21; public const int LOGI_LED_BITMAP_WIDTH = 21;
public const int LOGI_LED_BITMAP_HEIGHT = 6; public const int LOGI_LED_BITMAP_HEIGHT = 6;
public const int LOGI_LED_BITMAP_BYTES_PER_KEY = 4; public const int LOGI_LED_BITMAP_BYTES_PER_KEY = 4;
public const int LOGI_LED_BITMAP_SIZE = public const int LOGI_LED_BITMAP_SIZE =
LOGI_LED_BITMAP_WIDTH*LOGI_LED_BITMAP_HEIGHT*LOGI_LED_BITMAP_BYTES_PER_KEY; LOGI_LED_BITMAP_WIDTH*LOGI_LED_BITMAP_HEIGHT*LOGI_LED_BITMAP_BYTES_PER_KEY;
public const int LOGI_LED_DURATION_INFINITE = 0; public const int LOGI_LED_DURATION_INFINITE = 0;
[DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)] [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
public static extern bool LogiLedInit(); public static extern bool LogiLedInit();
[DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)] [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
public static extern bool LogiLedSetTargetDevice(int targetDevice); public static extern bool LogiLedSetTargetDevice(int targetDevice);
[DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)] [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
public static extern bool LogiLedGetSdkVersion(ref int majorNum, ref int minorNum, ref int buildNum); public static extern bool LogiLedGetSdkVersion(ref int majorNum, ref int minorNum, ref int buildNum);
[DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)] [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
public static extern bool LogiLedSaveCurrentLighting(); public static extern bool LogiLedSaveCurrentLighting();
[DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)] [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
public static extern bool LogiLedSetLighting(int redPercentage, int greenPercentage, int bluePercentage); public static extern bool LogiLedSetLighting(int redPercentage, int greenPercentage, int bluePercentage);
[DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)] [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
public static extern bool LogiLedRestoreLighting(); public static extern bool LogiLedRestoreLighting();
[DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)] [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
public static extern bool LogiLedFlashLighting(int redPercentage, int greenPercentage, int bluePercentage, public static extern bool LogiLedFlashLighting(int redPercentage, int greenPercentage, int bluePercentage,
int milliSecondsDuration, int milliSecondsInterval); int milliSecondsDuration, int milliSecondsInterval);
[DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)] [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
public static extern bool LogiLedPulseLighting(int redPercentage, int greenPercentage, int bluePercentage, public static extern bool LogiLedPulseLighting(int redPercentage, int greenPercentage, int bluePercentage,
int milliSecondsDuration, int milliSecondsInterval); int milliSecondsDuration, int milliSecondsInterval);
[DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)] [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
public static extern bool LogiLedStopEffects(); public static extern bool LogiLedStopEffects();
[DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)] [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
public static extern bool LogiLedSetLightingFromBitmap(byte[] bitmap); public static extern bool LogiLedSetLightingFromBitmap(byte[] bitmap);
[DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)] [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
public static extern bool LogiLedSetLightingForKeyWithScanCode(int keyCode, int redPercentage, public static extern bool LogiLedSetLightingForKeyWithScanCode(int keyCode, int redPercentage,
int greenPercentage, int bluePercentage); int greenPercentage, int bluePercentage);
[DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)] [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
public static extern bool LogiLedSetLightingForKeyWithHidCode(int keyCode, int redPercentage, public static extern bool LogiLedSetLightingForKeyWithHidCode(int keyCode, int redPercentage,
int greenPercentage, int bluePercentage); int greenPercentage, int bluePercentage);
[DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)] [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
public static extern bool LogiLedSetLightingForKeyWithQuartzCode(int keyCode, int redPercentage, public static extern bool LogiLedSetLightingForKeyWithQuartzCode(int keyCode, int redPercentage,
int greenPercentage, int bluePercentage); int greenPercentage, int bluePercentage);
[DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)] [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
public static extern bool LogiLedSetLightingForKeyWithKeyName(int keyCode, int redPercentage, public static extern bool LogiLedSetLightingForKeyWithKeyName(int keyCode, int redPercentage,
int greenPercentage, int bluePercentage); int greenPercentage, int bluePercentage);
[DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)] [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
public static extern bool LogiLedSaveLightingForKey(KeyboardNames keyName); public static extern bool LogiLedSaveLightingForKey(KeyboardNames keyName);
[DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)] [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
public static extern bool LogiLedRestoreLightingForKey(KeyboardNames keyName); public static extern bool LogiLedRestoreLightingForKey(KeyboardNames keyName);
[DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)] [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
public static extern bool LogiLedFlashSingleKey(KeyboardNames keyName, int redPercentage, int greenPercentage, public static extern bool LogiLedFlashSingleKey(KeyboardNames keyName, int redPercentage, int greenPercentage,
int bluePercentage, int msDuration, int msInterval); int bluePercentage, int msDuration, int msInterval);
[DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)] [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
public static extern bool LogiLedPulseSingleKey(KeyboardNames keyName, int startRedPercentage, public static extern bool LogiLedPulseSingleKey(KeyboardNames keyName, int startRedPercentage,
int startGreenPercentage, int startBluePercentage, int finishRedPercentage, int finishGreenPercentage, int startGreenPercentage, int startBluePercentage, int finishRedPercentage, int finishGreenPercentage,
int finishBluePercentage, int msDuration, bool isInfinite); int finishBluePercentage, int msDuration, bool isInfinite);
[DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)] [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
public static extern bool LogiLedStopEffectsOnKey(KeyboardNames keyName); public static extern bool LogiLedStopEffectsOnKey(KeyboardNames keyName);
[DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)] [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
public static extern void LogiLedShutdown(); public static extern void LogiLedShutdown();
} }
} }

View File

@ -1,230 +1,230 @@
using System.Drawing; using System.Drawing;
using System.Drawing.Drawing2D; using System.Drawing.Drawing2D;
using System.Drawing.Imaging; using System.Drawing.Imaging;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
namespace Artemis.KeyboardProviders.Logitech.Utilities namespace Artemis.DeviceProviders.Logitech.Utilities
{ {
public static class OrionUtilities public static class OrionUtilities
{ {
public static KeyMapping[] Keymappings = public static KeyMapping[] Keymappings =
{ {
// First row // First row
new KeyMapping(0, 0), new KeyMapping(0, 0),
new KeyMapping(1, 1), new KeyMapping(1, 1),
new KeyMapping(2, 1), new KeyMapping(2, 1),
new KeyMapping(3, 2), new KeyMapping(3, 2),
new KeyMapping(4, 3), new KeyMapping(4, 3),
new KeyMapping(5, 4), new KeyMapping(5, 4),
new KeyMapping(6, 5), new KeyMapping(6, 5),
new KeyMapping(7, 6), new KeyMapping(7, 6),
new KeyMapping(8, 7), new KeyMapping(8, 7),
new KeyMapping(9, 8), new KeyMapping(9, 8),
new KeyMapping(10, 9), new KeyMapping(10, 9),
new KeyMapping(11, 9), new KeyMapping(11, 9),
new KeyMapping(12, 10), new KeyMapping(12, 10),
new KeyMapping(13, 11), new KeyMapping(13, 11),
new KeyMapping(13, 12), new KeyMapping(13, 12),
new KeyMapping(14, 13), new KeyMapping(14, 13),
new KeyMapping(15, 14), new KeyMapping(15, 14),
new KeyMapping(16, 15), new KeyMapping(16, 15),
new KeyMapping(17, 16), new KeyMapping(17, 16),
new KeyMapping(18, 17), new KeyMapping(18, 17),
new KeyMapping(19, 18), new KeyMapping(19, 18),
// Second row // Second row
new KeyMapping(21, 21), new KeyMapping(21, 21),
new KeyMapping(22, 22), new KeyMapping(22, 22),
new KeyMapping(23, 23), new KeyMapping(23, 23),
new KeyMapping(24, 24), new KeyMapping(24, 24),
new KeyMapping(25, 25), new KeyMapping(25, 25),
new KeyMapping(26, 26), new KeyMapping(26, 26),
new KeyMapping(27, 27), new KeyMapping(27, 27),
new KeyMapping(28, 28), new KeyMapping(28, 28),
new KeyMapping(29, 29), new KeyMapping(29, 29),
new KeyMapping(30, 30), new KeyMapping(30, 30),
new KeyMapping(31, 31), new KeyMapping(31, 31),
new KeyMapping(32, 32), new KeyMapping(32, 32),
new KeyMapping(33, 33), new KeyMapping(33, 33),
new KeyMapping(34, 34), new KeyMapping(34, 34),
new KeyMapping(35, 35), new KeyMapping(35, 35),
new KeyMapping(36, 36), new KeyMapping(36, 36),
new KeyMapping(37, 37), new KeyMapping(37, 37),
new KeyMapping(38, 38), new KeyMapping(38, 38),
new KeyMapping(39, 39), new KeyMapping(39, 39),
new KeyMapping(40, 40), new KeyMapping(40, 40),
new KeyMapping(41, 41), new KeyMapping(41, 41),
// Third row // Third row
new KeyMapping(42, 42), new KeyMapping(42, 42),
new KeyMapping(43, 43), new KeyMapping(43, 43),
new KeyMapping(44, 44), new KeyMapping(44, 44),
new KeyMapping(45, 45), new KeyMapping(45, 45),
new KeyMapping(46, 46), new KeyMapping(46, 46),
new KeyMapping(47, 46), new KeyMapping(47, 46),
new KeyMapping(48, 47), new KeyMapping(48, 47),
new KeyMapping(49, 48), new KeyMapping(49, 48),
new KeyMapping(50, 49), new KeyMapping(50, 49),
new KeyMapping(51, 50), new KeyMapping(51, 50),
new KeyMapping(52, 51), new KeyMapping(52, 51),
new KeyMapping(53, 52), new KeyMapping(53, 52),
new KeyMapping(54, 53), new KeyMapping(54, 53),
new KeyMapping(54, 54), new KeyMapping(54, 54),
new KeyMapping(55, 55), new KeyMapping(55, 55),
new KeyMapping(56, 56), new KeyMapping(56, 56),
new KeyMapping(57, 57), new KeyMapping(57, 57),
new KeyMapping(58, 58), new KeyMapping(58, 58),
new KeyMapping(59, 59), new KeyMapping(59, 59),
new KeyMapping(60, 60), new KeyMapping(60, 60),
new KeyMapping(61, 61), new KeyMapping(61, 61),
new KeyMapping(62, 62), new KeyMapping(62, 62),
// Fourth row // Fourth row
new KeyMapping(63, 63), new KeyMapping(63, 63),
new KeyMapping(64, 64), new KeyMapping(64, 64),
new KeyMapping(65, 65), new KeyMapping(65, 65),
new KeyMapping(66, 65), new KeyMapping(66, 65),
new KeyMapping(67, 66), new KeyMapping(67, 66),
new KeyMapping(68, 67), new KeyMapping(68, 67),
new KeyMapping(69, 68), new KeyMapping(69, 68),
new KeyMapping(70, 69), new KeyMapping(70, 69),
new KeyMapping(71, 70), new KeyMapping(71, 70),
new KeyMapping(72, 71), new KeyMapping(72, 71),
new KeyMapping(73, 72), new KeyMapping(73, 72),
new KeyMapping(74, 73), new KeyMapping(74, 73),
new KeyMapping(75, 74), new KeyMapping(75, 74),
new KeyMapping(76, 75), new KeyMapping(76, 75),
new KeyMapping(76, 76), new KeyMapping(76, 76),
new KeyMapping(78, 77), new KeyMapping(78, 77),
new KeyMapping(79, 78), new KeyMapping(79, 78),
new KeyMapping(79, 79), new KeyMapping(79, 79),
new KeyMapping(80, 80), new KeyMapping(80, 80),
new KeyMapping(81, 81), new KeyMapping(81, 81),
new KeyMapping(82, 82), new KeyMapping(82, 82),
// Fifth row // Fifth row
new KeyMapping(84, 84), new KeyMapping(84, 84),
new KeyMapping(85, 85), new KeyMapping(85, 85),
new KeyMapping(86, 86), new KeyMapping(86, 86),
new KeyMapping(87, 87), new KeyMapping(87, 87),
new KeyMapping(88, 88), new KeyMapping(88, 88),
new KeyMapping(89, 89), new KeyMapping(89, 89),
new KeyMapping(90, 90), new KeyMapping(90, 90),
new KeyMapping(91, 91), new KeyMapping(91, 91),
new KeyMapping(92, 92), new KeyMapping(92, 92),
new KeyMapping(93, 93), new KeyMapping(93, 93),
new KeyMapping(94, 94), new KeyMapping(94, 94),
new KeyMapping(95, 95), new KeyMapping(95, 95),
new KeyMapping(96, 96), new KeyMapping(96, 96),
new KeyMapping(97, 97), new KeyMapping(97, 97),
new KeyMapping(98, 98), new KeyMapping(98, 98),
new KeyMapping(99, 99), new KeyMapping(99, 99),
new KeyMapping(100, 100), new KeyMapping(100, 100),
new KeyMapping(101, 101), new KeyMapping(101, 101),
new KeyMapping(102, 102), new KeyMapping(102, 102),
new KeyMapping(103, 103), new KeyMapping(103, 103),
new KeyMapping(104, 104), new KeyMapping(104, 104),
// Sixth row // Sixth row
new KeyMapping(105, 105), new KeyMapping(105, 105),
new KeyMapping(106, 106), new KeyMapping(106, 106),
new KeyMapping(107, 107), new KeyMapping(107, 107),
new KeyMapping(108, 107), new KeyMapping(108, 107),
new KeyMapping(109, 109), new KeyMapping(109, 109),
new KeyMapping(110, 110), new KeyMapping(110, 110),
new KeyMapping(111, 110), new KeyMapping(111, 110),
new KeyMapping(112, 111), new KeyMapping(112, 111),
new KeyMapping(113, 112), new KeyMapping(113, 112),
new KeyMapping(114, 113), new KeyMapping(114, 113),
new KeyMapping(115, 114), new KeyMapping(115, 114),
new KeyMapping(116, 115), new KeyMapping(116, 115),
new KeyMapping(115, 116), // ALTGR new KeyMapping(115, 116), // ALTGR
new KeyMapping(116, 117), new KeyMapping(116, 117),
new KeyMapping(117, 118), new KeyMapping(117, 118),
new KeyMapping(118, 119), new KeyMapping(118, 119),
new KeyMapping(119, 120), new KeyMapping(119, 120),
new KeyMapping(120, 121), new KeyMapping(120, 121),
new KeyMapping(121, 122), new KeyMapping(121, 122),
new KeyMapping(122, 123), new KeyMapping(122, 123),
new KeyMapping(124, 124) new KeyMapping(124, 124)
}; };
public static byte[] BitmapToByteArray(Bitmap b, bool remap = true) public static byte[] BitmapToByteArray(Bitmap b, bool remap = true)
{ {
if (b.Width > 21 || b.Height > 6) if (b.Width > 21 || b.Height > 6)
b = ResizeImage(b, 21, 6); b = ResizeImage(b, 21, 6);
var rect = new Rectangle(0, 0, b.Width, b.Height); var rect = new Rectangle(0, 0, b.Width, b.Height);
var bitmapData = b.LockBits(rect, ImageLockMode.ReadWrite, b.PixelFormat); var bitmapData = b.LockBits(rect, ImageLockMode.ReadWrite, b.PixelFormat);
var depth = Image.GetPixelFormatSize(b.PixelFormat); var depth = Image.GetPixelFormatSize(b.PixelFormat);
var step = depth/8; var step = depth/8;
var pixels = new byte[21*6*step]; var pixels = new byte[21*6*step];
var iptr = bitmapData.Scan0; var iptr = bitmapData.Scan0;
// Copy data from pointer to array // Copy data from pointer to array
Marshal.Copy(iptr, pixels, 0, pixels.Length); Marshal.Copy(iptr, pixels, 0, pixels.Length);
if (!remap) if (!remap)
return pixels; return pixels;
var remapped = new byte[pixels.Length]; var remapped = new byte[pixels.Length];
// Every key is 4 bytes // Every key is 4 bytes
for (var i = 0; i <= pixels.Length/4; i++) for (var i = 0; i <= pixels.Length/4; i++)
{ {
var firstSByte = Keymappings[i].Source*4; var firstSByte = Keymappings[i].Source*4;
var firstTByte = Keymappings[i].Target*4; var firstTByte = Keymappings[i].Target*4;
for (var j = 0; j < 4; j++) for (var j = 0; j < 4; j++)
remapped[firstTByte + j] = pixels[firstSByte + j]; remapped[firstTByte + j] = pixels[firstSByte + j];
} }
return remapped; return remapped;
} }
/// <summary> /// <summary>
/// Resize the image to the specified width and height. /// Resize the image to the specified width and height.
/// </summary> /// </summary>
/// <param name="image">The image to resize.</param> /// <param name="image">The image to resize.</param>
/// <param name="width">The width to resize to.</param> /// <param name="width">The width to resize to.</param>
/// <param name="height">The height to resize to.</param> /// <param name="height">The height to resize to.</param>
/// <returns>The resized image.</returns> /// <returns>The resized image.</returns>
public static Bitmap ResizeImage(Image image, int width, int height) public static Bitmap ResizeImage(Image image, int width, int height)
{ {
var destRect = new Rectangle(0, 0, width, height); var destRect = new Rectangle(0, 0, width, height);
var destImage = new Bitmap(width, height); var destImage = new Bitmap(width, height);
destImage.SetResolution(image.HorizontalResolution, image.VerticalResolution); destImage.SetResolution(image.HorizontalResolution, image.VerticalResolution);
using (var graphics = Graphics.FromImage(destImage)) using (var graphics = Graphics.FromImage(destImage))
{ {
graphics.CompositingMode = CompositingMode.SourceCopy; graphics.CompositingMode = CompositingMode.SourceCopy;
graphics.CompositingQuality = CompositingQuality.HighQuality; graphics.CompositingQuality = CompositingQuality.HighQuality;
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphics.SmoothingMode = SmoothingMode.HighQuality; graphics.SmoothingMode = SmoothingMode.HighQuality;
graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
using (var wrapMode = new ImageAttributes()) using (var wrapMode = new ImageAttributes())
{ {
wrapMode.SetWrapMode(WrapMode.TileFlipXY); wrapMode.SetWrapMode(WrapMode.TileFlipXY);
graphics.DrawImage(image, destRect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, wrapMode); graphics.DrawImage(image, destRect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, wrapMode);
} }
} }
return destImage; return destImage;
} }
public struct KeyMapping public struct KeyMapping
{ {
public KeyMapping(int source, int target) public KeyMapping(int source, int target)
{ {
Source = source; Source = source;
Target = target; Target = target;
} }
public int Source { get; set; } public int Source { get; set; }
public int Target { get; set; } public int Target { get; set; }
} }
} }
} }

View File

@ -1,49 +1,49 @@
using System.Drawing; using System.Drawing;
using Artemis.KeyboardProviders.Razer.Utilities; using Artemis.DeviceProviders.Razer.Utilities;
using Corale.Colore.Core; using Corale.Colore.Core;
using Corale.Colore.Razer; using Corale.Colore.Razer;
using Constants = Corale.Colore.Razer.Keyboard.Constants; using Constants = Corale.Colore.Razer.Keyboard.Constants;
namespace Artemis.KeyboardProviders.Razer namespace Artemis.DeviceProviders.Razer
{ {
public class BlackWidow : KeyboardProvider public class BlackWidow : KeyboardProvider
{ {
public BlackWidow() public BlackWidow()
{ {
Name = "Razer BlackWidow Chroma"; Name = "Razer BlackWidow Chroma";
CantEnableText = "Couldn't connect to your Razer BlackWidow Chroma.\n" + CantEnableText = "Couldn't connect to your Razer BlackWidow Chroma.\n" +
"Please check your cables and try updating Razer Synapse.\n\n" + "Please check your cables and try updating Razer Synapse.\n\n" +
"If needed, you can select a different keyboard in Artemis under settings."; "If needed, you can select a different keyboard in Artemis under settings.";
} }
public override bool CanEnable() public override bool CanEnable()
{ {
if (!Chroma.IsSdkAvailable()) if (!Chroma.IsSdkAvailable())
return false; return false;
// Some people have Synapse installed, but not a Chroma keyboard, deal with this // Some people have Synapse installed, but not a Chroma keyboard, deal with this
var blackWidowFound = Chroma.Instance.Query(Devices.Blackwidow).Connected; var blackWidowFound = Chroma.Instance.Query(Devices.Blackwidow).Connected;
var blackWidowTeFound = Chroma.Instance.Query(Devices.BlackwidowTe).Connected; var blackWidowTeFound = Chroma.Instance.Query(Devices.BlackwidowTe).Connected;
return blackWidowFound || blackWidowTeFound; return blackWidowFound || blackWidowTeFound;
} }
public override void Enable() public override void Enable()
{ {
Chroma.Instance.Initialize(); Chroma.Instance.Initialize();
Height = Constants.MaxRows; Height = Constants.MaxRows;
Width = Constants.MaxColumns; Width = Constants.MaxColumns;
} }
public override void Disable() public override void Disable()
{ {
Chroma.Instance.Uninitialize(); Chroma.Instance.Uninitialize();
} }
public override void DrawBitmap(Bitmap bitmap) public override void DrawBitmap(Bitmap bitmap)
{ {
var razerArray = RazerUtilities.BitmapColorArray(bitmap, Height, Width); var razerArray = RazerUtilities.BitmapColorArray(bitmap, Height, Width);
Chroma.Instance.Keyboard.SetCustom(razerArray); Chroma.Instance.Keyboard.SetCustom(razerArray);
} }
} }
} }

View File

@ -1,22 +1,22 @@
using System.Drawing; using System.Drawing;
using Artemis.Utilities; using Artemis.Utilities;
using Corale.Colore.Razer.Keyboard.Effects; using Corale.Colore.Razer.Keyboard.Effects;
namespace Artemis.KeyboardProviders.Razer.Utilities namespace Artemis.DeviceProviders.Razer.Utilities
{ {
public static class RazerUtilities public static class RazerUtilities
{ {
public static Custom BitmapColorArray(Bitmap b, int height, int width) public static Custom BitmapColorArray(Bitmap b, int height, int width)
{ {
var keyboardGrid = Custom.Create(); var keyboardGrid = Custom.Create();
if (b.Width > width || b.Height > height) if (b.Width > width || b.Height > height)
b = ImageUtilities.ResizeImage(b, width, height); b = ImageUtilities.ResizeImage(b, width, height);
for (var y = 0; y < b.Height; y++) for (var y = 0; y < b.Height; y++)
for (var x = 0; x < b.Width; x++) for (var x = 0; x < b.Width; x++)
keyboardGrid[y, x] = b.GetPixel(x, y); keyboardGrid[y, x] = b.GetPixel(x, y);
return keyboardGrid; return keyboardGrid;
} }
} }
} }

View File

@ -1,4 +1,4 @@
using Artemis.KeyboardProviders; using Artemis.DeviceProviders;
namespace Artemis.Events namespace Artemis.Events
{ {

View File

@ -1,7 +1,7 @@
using Artemis.KeyboardProviders; using Artemis.DeviceProviders;
using Artemis.KeyboardProviders.Corsair; using Artemis.DeviceProviders.Corsair;
using Artemis.KeyboardProviders.Logitech; using Artemis.DeviceProviders.Logitech;
using Artemis.KeyboardProviders.Razer; using Artemis.DeviceProviders.Razer;
using Artemis.Modules.Effects.AudioVisualizer; using Artemis.Modules.Effects.AudioVisualizer;
using Artemis.Modules.Effects.Debug; using Artemis.Modules.Effects.Debug;
using Artemis.Modules.Effects.TypeWave; using Artemis.Modules.Effects.TypeWave;

View File

@ -1,21 +0,0 @@
using System.Drawing;
namespace Artemis.KeyboardProviders
{
public class KeyboardRegion
{
public KeyboardRegion(string regionName, Point topLeft, Point bottomRight)
{
RegionName = regionName;
TopLeft = topLeft;
BottomRight = bottomRight;
}
public string RegionName { get; set; }
public Point TopLeft { get; set; }
public Point BottomRight { get; set; }
public Rectangle GetRectangle()
=> new Rectangle(TopLeft.X, TopLeft.Y, BottomRight.X - TopLeft.X, BottomRight.Y - TopLeft.Y);
}
}

View File

@ -1,8 +1,8 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using Artemis.DeviceProviders;
using Artemis.Events; using Artemis.Events;
using Artemis.KeyboardProviders;
using Artemis.Services; using Artemis.Services;
using Artemis.Settings; using Artemis.Settings;
using Caliburn.Micro; using Caliburn.Micro;

View File

@ -3,8 +3,8 @@ using System.Drawing;
using System.Drawing.Drawing2D; using System.Drawing.Drawing2D;
using System.Linq; using System.Linq;
using System.Windows.Forms; using System.Windows.Forms;
using Artemis.KeyboardProviders.Corsair; using Artemis.DeviceProviders.Corsair;
using Artemis.KeyboardProviders.Logitech.Utilities; using Artemis.DeviceProviders.Logitech.Utilities;
using Artemis.Managers; using Artemis.Managers;
using Artemis.Models; using Artemis.Models;
using Artemis.Utilities; using Artemis.Utilities;

View File

@ -5,7 +5,7 @@ using System.Drawing.Drawing2D;
using System.Linq; using System.Linq;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Artemis.KeyboardProviders; using Artemis.DeviceProviders;
namespace Artemis.Utilities.Keyboard namespace Artemis.Utilities.Keyboard
{ {

View File

@ -9,8 +9,8 @@ using System.Windows.Input;
using System.Windows.Media; using System.Windows.Media;
using System.Windows.Threading; using System.Windows.Threading;
using Artemis.DAL; using Artemis.DAL;
using Artemis.DeviceProviders;
using Artemis.Events; using Artemis.Events;
using Artemis.KeyboardProviders;
using Artemis.Managers; using Artemis.Managers;
using Artemis.Models; using Artemis.Models;
using Artemis.Models.Profiles; using Artemis.Models.Profiles;