Compare commits

..

No commits in common. "master" and "v3.5.5-RC5" have entirely different histories.

160 changed files with 2167 additions and 3626 deletions

1
.gitignore vendored
View File

@ -1 +0,0 @@
/Matrix App/bin/

Binary file not shown.

View File

@ -8,8 +8,8 @@
#define MATRIX_MAX_HEIGHT 20
#define MATRIX_LED_MAX_COUNT (MATRIX_MAX_WIDTH * MATRIX_MAX_HEIGHT)
#define STD_WIDTH 16
#define STD_HEIGHT 16
#define STD_WIDTH 10
#define STD_HEIGHT 10
#define STD_LED_MAX_COUNT (STD_WIDTH * STD_HEIGHT)
//#define DEBUG_PRINT_CALLBACK
@ -23,6 +23,14 @@ uint8_t height = STD_HEIGHT;
uint32_t ledCount;
uint8_t gamma8(uint8_t x) {
uint32_t x2 = (uint32_t) x;
x2 = x2 * x2 * 258 >> 16;
return (uint8_t) x2;
}
CRGB leds[MATRIX_LED_MAX_COUNT];
typedef void (*FNPTR_t)();
@ -34,7 +42,7 @@ uint8_t getByte() {
uint16_t getWord() {
uint16_t highByte = getByte();
uint16_t lowByte = getByte();
uint16_t lowByte = getByte();
return highByte << 8 | lowByte;
}
@ -43,7 +51,7 @@ void scale() {
#ifdef DEBUG_PRINT_CALLBACK
Serial.println("scale called");
#endif
width = getByte();
width = getByte();
height = getByte();
#ifdef DEBUG_PRINT_CALLBACK
@ -67,11 +75,14 @@ void scale() {
Serial.println(ledCount);
#endif
FastLED.addLeds<LED_TYPE, DATA_PIN, GRB>(leds, ledCount);
for (uint16_t x = 0; x < ledCount; x++) {
leds[x] = 0;
}
FastLED.addLeds<LED_TYPE, DATA_PIN>(leds, ledCount);
for (uint16_t x = 0; x < ledCount; x++) {
leds[x].r = 0;
leds[x].g = 0;
leds[x].b = 0;
}
FastLED.show();
}
@ -82,9 +93,9 @@ void single() {
#endif
uint16_t index = getWord();
uint8_t green = getByte();
uint8_t red = getByte();
uint8_t blue = getByte();
uint8_t green = gamma8(getByte());
uint8_t red = gamma8(getByte());
uint8_t blue = gamma8(getByte());
#ifdef DEBUG_PRINT_CALLBACK
Serial.print("Index: ");
@ -109,6 +120,12 @@ void image() {
Serial.readBytes((char*) leds, ledCount * 3);
for (uint16_t x = 0; x < ledCount; x++) {
leds[x].r = gamma8(leds[x].r);
leds[x].g = gamma8(leds[x].g);
leds[x].b = gamma8(leds[x].b);
}
FastLED.show();
}
@ -117,9 +134,9 @@ void fill() {
Serial.println("Called fill");
#endif
uint8_t green = getByte();
uint8_t red = getByte();
uint8_t blue = getByte();
uint8_t green = gamma8(getByte());
uint8_t red = gamma8(getByte());
uint8_t blue = gamma8(getByte());
#ifdef DEBUG_PRINT_CALLBACK
Serial.print("Red: ");
@ -153,39 +170,25 @@ void config() {
}
}
void upload() {
return;
}
void info() {
Serial.write((uint8_t) 91);
Serial.write((uint8_t) 0b01000000);
Serial.write("ATmega328P Arduino");
}
FNPTR_t opcodeTable[] = {
scale, // opcode 0x00
single, // opcode 0x01
image, // opcode 0x02
fill, // opcode 0x03
config, // opcode 0x04
upload,
info
};
config // opcode 0x04
};
void setup() {
ledCount = STD_LED_MAX_COUNT;
Serial.begin(9600);
FastLED.addLeds<LED_TYPE, DATA_PIN, GRB>(leds, ledCount);
FastLED.setCorrection(TypicalLEDStrip);
FastLED.setBrightness(80);
FastLED.addLeds<LED_TYPE, DATA_PIN>(leds, ledCount);
for (uint16_t i = 0; i < ledCount; i++) {
leds[i] = 0;
leds[i].r = 0;
leds[i].g = 0;
leds[i].b = 0;
}
FastLED.show();
}
@ -202,9 +205,9 @@ void loop() {
Serial.println(opcode);
#endif
if (opcode <= 6) {
if (opcode <= 4) {
opcodeTable[opcode]();
Serial.write(75);
Serial.write(21);
}
}
}

View File

@ -1,169 +0,0 @@
from time import sleep
from machine import UART, Pin
import array, time
from machine import Pin
import rp2
# Configure the number of WS2812 LEDs.
NUM_LEDS = 256
PIN_NUM = 16
brightness = 0.2
@rp2.asm_pio(sideset_init=rp2.PIO.OUT_LOW, out_shiftdir=rp2.PIO.SHIFT_LEFT, autopull=True, pull_thresh=24)
def ws2812():
T1 = 2
T2 = 5
T3 = 3
wrap_target()
label("bitloop")
out(x, 1) .side(0) [T3 - 1]
jmp(not_x, "do_zero") .side(1) [T1 - 1]
jmp("bitloop") .side(1) [T2 - 1]
label("do_zero")
nop() .side(0) [T2 - 1]
wrap()
# Create the StateMachine with the ws2812 program, outputting on pin
sm = rp2.StateMachine(0, ws2812, freq=8_000_000, sideset_base=Pin(PIN_NUM))
# Start the StateMachine, it will wait for data on its FIFO.
sm.active(1)
# Display a pattern on the LEDs via an array of LED RGB values.
global ar
global leds
global gif
global currentFrame
global delay
##########################################################################
def show():
for i in range(leds):
r = ar[i] >> 16
g = ar[i] >> 8 & 0xFF
b = ar[i] & 0xFF
r = r >> 1
g = g >> 1
b = b >> 1
ar[i] = r << 16 | g << 8 | b
sm.put(ar, 8)
leds = 256 # number of leds
uart = UART(0, 9600) # serial bluetooth
led = Pin(25, Pin.OUT) # builtin LED
ar = array.array("I", [0 for _ in range(NUM_LEDS)]) # color array
gif = [array.array("I", [0 for _ in range(leds)]) for _ in range(1)]
currentFrame = -1
# gurantees that only N-bytes are read from the UART
def readNBytes(n):
rawBytes = b''
bytesRead = 0
while True:
if uart.any():
rawBytes += uart.read(n - bytesRead)
bytesRead = len(rawBytes)
# not enough was read
if bytesRead < n:
continue
else:
return rawBytes
while True:
led.low()
if uart.any() != 0:
opcode = uart.read(1)
print("Opcode: ", opcode)
if opcode == b'\x00':
width = readNBytes(1)[0]
height = readNBytes(1)[0]
if width <= 32 and height <= 32:
leds = width * height
ar = array.array("I", [0 for _ in range(leds)])
show()
elif opcode == b'\x02':
rawBytes = readNBytes(leds * 3);
for i in range(leds):
ar[i] = rawBytes[i * 3 + 1] << 16 | rawBytes[i * 3] << 8 | rawBytes[i * 3 + 2]
show()
currentFrame = -1
elif opcode == b'\x03':
r = readNBytes(1)
g = readNBytes(1)
b = readNBytes(1)
for i in range(leds):
ar[i] = g[0] << 16 | r[0] << 8 | b[0]
show()
elif opcode == b'\x04':
uart.write([75])
# [width] [height] [frames] [delay] [rgb-frames]
elif opcode == b'\x05':
gifDim = readNBytes(5)
delay = (gifDim[3] << 8) | gifDim[4]
print("w ", gifDim[0], " h ", gifDim[1], " f ", gifDim[2], " d ", delay)
leds = gifDim[0] * gifDim[1]
gif = [array.array("I", [0 for _ in range(leds)]) for _ in range(gifDim[2])]
for f in range(gifDim[2]):
frame = readNBytes(leds * 3)
print("frame read: ", f)
for i in range(leds):
gif[f][i] = frame[i * 3 + 1] << 16 | frame[i * 3] << 8 | frame[i * 3 + 2]
#uart.write(bytearray([91])) # synchronize
currentFrame = 0
print("Everything read")
# [Synchro-byte] [feature-flags] [Controller-Id]
#
# feature-flags:
# [Bit 7] = Bluetooth (true)
# [Bit 6] = USB (false)
# [Bit 0] = Upload (true)
#
elif opcode == b'\x06':
uart.write(b'\x5B\x81')
uart.write("RP2040 Micro python")
led.high()
uart.write(bytearray([75]))
elif currentFrame != -1:
print("showing")
for i in range(leds):
ar[i] = gif[currentFrame][i]
show()
currentFrame += 1
if (currentFrame >= len(gif)):
currentFrame = 0
time.sleep(delay * 1e-3)

View File

@ -1,12 +1,5 @@
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<s:Boolean x:Key="/Default/ResxEditorPersonal/CheckedGroups/=Matrix_0020App_002Fforms_002FColorWheel/@EntryIndexedValue">False</s:Boolean>
<s:Boolean x:Key="/Default/ResxEditorPersonal/CheckedGroups/=Matrix_0020App_002Fforms_002FMatrix/@EntryIndexedValue">False</s:Boolean>
<s:Boolean x:Key="/Default/ResxEditorPersonal/CheckedGroups/=Matrix_0020App_002Fforms_002FMatrixDesigner/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/ResxEditorPersonal/CheckedGroups/=Matrix_0020App_002Fforms_002FSettings/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/ResxEditorPersonal/CheckedGroups/=Matrix_0020App_002FMatrix/@EntryIndexedValue">False</s:Boolean>
<s:Boolean x:Key="/Default/ResxEditorPersonal/CheckedGroups/=Matrix_0020App_002FMatrixDesigner/@EntryIndexedValue">False</s:Boolean>
<s:Boolean x:Key="/Default/ResxEditorPersonal/CheckedGroups/=Matrix_0020App_002FProperties_002FResources/@EntryIndexedValue">False</s:Boolean>
<s:Boolean x:Key="/Default/ResxEditorPersonal/Initialized/@EntryValue">True</s:Boolean>
<s:Boolean x:Key="/Default/ResxEditorPersonal/OrderByFullPath/@EntryValue">False</s:Boolean>
<s:Boolean x:Key="/Default/ResxEditorPersonal/ShowComments/@EntryValue">False</s:Boolean></wpf:ResourceDictionary>
<s:Boolean x:Key="/Default/ResxEditorPersonal/CheckedGroups/=Matrix_0020App_002FProperties_002FResources/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/ResxEditorPersonal/Initialized/@EntryValue">True</s:Boolean></wpf:ResourceDictionary>

View File

@ -732,6 +732,7 @@ namespace Matrix_App
private void InitializeComponent()
{
components = new System.ComponentModel.Container();
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
}
}
}

View File

@ -3,8 +3,10 @@ namespace Matrix_App
{
public static class Defaults
{
public const int MatrixStartWidth = 16;
public const int MatrixStartHeight = 16;
public const int PortNameUpdateInterval = 5000;
public const int MatrixStartWidth = 10;
public const int MatrixStartHeight = 10;
public const int MatrixStartFrames = 1;
public const int MatrixLimitedWidth = 512;
@ -12,9 +14,14 @@ namespace Matrix_App
public const int BaudRate = 9600;
public const int ReadTimeoutMs = 20500;
public const int WriteTimeoutMs = 2500;
public const int ReadTimeoutMs = 5500;
public const int WriteTimeoutMs = 5500;
/// <summary>
/// Total count of LEDs at start
/// </summary>
public static readonly int MATRIX_START_LED_COUNT = MatrixStartWidth * MatrixStartHeight * Bpp;
/// <summary>
/// Number of Bytes Per Pixel: 3 cause Red (1 byte) + Blue (1 Byte) + Green (1 byte) = 3
/// </summary>
@ -23,14 +30,12 @@ namespace Matrix_App
public const int FilterPreviewWidth = 32;
public const int FilterPreviewHeight = 32;
public const int ArduinoSynchronizationByte = 91;
public const int ArduinoSuccessByte = 75;
public const int ArduinoErrorByte = 255;
public const int ArduinoSuccessByte = 21;
public const int ArduinoCommandQueueSize = 2;
public const int ArduinoCommandQueueSize = 5;
public const int ArduinoReceiveBufferSize = 1 + 1 + 1 + MatrixLimitedWidth * MatrixLimitedHeight;
public const int DequeueWaitTimeoutCounter = 3;
public const int DequeueWaitTimeoutCounter = 2;
}
public static class ArduinoInstruction
@ -38,9 +43,6 @@ namespace Matrix_App
public const byte OpcodeScale = 0;
public const byte OpcodeImage = 2;
public const byte OpcodeFill = 3;
public const byte OpcodePush = 5;
public const byte OpcodeInfo = 6;
// public static readonly byte OpcodeConfig = 4;
public static readonly byte OPCODE_CONFIG = 4;
}
}

View File

@ -23,7 +23,7 @@ namespace Matrix_App
Height = height;
Bits = new Int32[width * height];
BitsHandle = GCHandle.Alloc(Bits, GCHandleType.Pinned);
Bitmap = new Bitmap(width, height, width * 4, PixelFormat.Format32bppRgb, BitsHandle.AddrOfPinnedObject());
Bitmap = new Bitmap(width, height, width * 4, PixelFormat.Format32bppPArgb, BitsHandle.AddrOfPinnedObject());
}
public void SetPixel(int x, int y, Color colour)
@ -31,7 +31,7 @@ namespace Matrix_App
int index = x + (y * Width);
int col = colour.ToArgb();
Bits[index] = col & 0x00FFFFFF;
Bits[index] = col;
}
public void SetImage(Bitmap image)

View File

@ -31,62 +31,6 @@ namespace Matrix_App
x /= len;
y /= len;
}
public static void RgbFromHsl(float h, float s, float l, out float r, out float g, out float b)
{
var c = (1 - MathF.Abs(2 * l - 1)) * s;
var x = c * (1.0f - Math.Abs((h / 60.0f) % 2.0f - 1.0f));
var m = l - c * 0.5f;
if (h < 60) { r = c; g = x; b = 0; }
else if (h < 120) { r = x; g = c; b = 0; }
else if (h < 180) { r = 0; g = c; b = x; }
else if (h < 240) { r = 0; g = x; b = c; }
else if (h < 300) { r = x; g = 0; b = c; }
else { r = c; g = 0; b = x; }
r += m;
g += m;
b += m;
}
public static void HslFromRgb(float r, float g, float b, out float h, out float s, out float l)
{
var cmax = Math.Max(Math.Max(r, g), b);
var cmin = Math.Min(Math.Min(r, g), b);
var delta = cmax - cmin;
if (delta < 1e-2)
{
h = 0;
}
else if (MathF.Abs(cmax - r) < 1e-3)
{
if (r < b)
{
h = 360 - MathF.Abs(60 * ((g - b) / delta));
}
else
{
h = 60 * ((g - b) / delta + 0f);
}
}
else if (MathF.Abs(cmax - g) < 1e-3)
{
h = 60 * ((b - r) / delta + 2f);
}
else if (MathF.Abs(cmax - b) < 1e-3)
{
h = 60 * ((r - g) / delta + 4f);
} else
{
h = 0;
}
l = (cmax + cmin) * 0.5f;
s = (cmax - cmin) / (1 - MathF.Abs(2 * l - 1.0f));
}
public static void RgbFromHsv(float h, float s, float v, out float r, out float g, out float b)
{

View File

@ -8,7 +8,6 @@
<ApplicationIcon>MatrixIcon.ico</ApplicationIcon>
<EnableNETAnalyzers>true</EnableNETAnalyzers>
<Nullable>enable</Nullable>
<LangVersion>latest</LangVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
@ -18,9 +17,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Bluetooth" Version="1.0.0.2" />
<PackageReference Include="System.Drawing.Common" Version="5.0.2" />
<PackageReference Include="System.IO.Ports" Version="6.0.0-preview.5.21301.5" />
<PackageReference Include="System.IO.Ports" Version="3.1.0" />
<PackageReference Include="System.Management" Version="5.0.0" />
</ItemGroup>
@ -31,21 +28,6 @@
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<Compile Remove="SplashScreen.Designer.cs" />
<Compile Update="forms\MatrixDesigner.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="forms\Matrix.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="forms\ColorWheel.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="forms\SplashScreen.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="forms\Settings.cs">
<SubType>Form</SubType>
</Compile>
</ItemGroup>
<ItemGroup>

View File

@ -10,8 +10,5 @@
<Compile Update="Matrix.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="SplashScreen.cs">
<SubType>Form</SubType>
</Compile>
</ItemGroup>
</Project>

View File

@ -1,6 +1,5 @@
using System.IO.Ports;
using System.Drawing;
using System.Windows.Forms;
namespace Matrix_App
{
@ -36,7 +35,7 @@ namespace Matrix_App
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MatrixDesignerMain));
this.Ports = new System.Windows.Forms.Button();
this.Ports = new System.Windows.Forms.ComboBox();
this.Modus = new System.Windows.Forms.TabControl();
this.tabPage1 = new System.Windows.Forms.TabPage();
this.groupBox3 = new System.Windows.Forms.GroupBox();
@ -83,7 +82,6 @@ namespace Matrix_App
this.DragDropButton = new System.Windows.Forms.Button();
matrixView = new Matrix_App.Matrix();
this.panel3 = new System.Windows.Forms.Panel();
this.PushButton = new Button();
this.Modus.SuspendLayout();
this.tabPage1.SuspendLayout();
this.groupBox3.SuspendLayout();
@ -109,20 +107,13 @@ namespace Matrix_App
//
// Ports
//
this.Ports.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.Ports.Location = new System.Drawing.Point(62, 130);
this.Ports.Name = "Ports";
this.Ports.Size = new System.Drawing.Size(163, 23);
this.Ports.TabIndex = 0;
this.Ports.Click += PortsOnClick;
this.Ports.Text = "Settings";
//
// Push Button
//
this.PushButton.Location = new Point(3, 481 + 113 + 8);
this.PushButton.Size = new Size(216, 23 + 6);
this.PushButton.Text = "Push Animation";
this.PushButton.Click += PushButtonOnClick;
//
this.Ports.SelectedIndexChanged += new System.EventHandler(this.Ports_SelectedIndexChanged);
//
// Modus
//
this.Modus.Controls.Add(this.tabPage1);
@ -354,7 +345,7 @@ namespace Matrix_App
this.matrixHeight.Size = new System.Drawing.Size(163, 23);
this.matrixHeight.TabIndex = 1;
this.matrixHeight.Value = new decimal(new int[] {
16,
10,
0,
0,
0});
@ -377,7 +368,7 @@ namespace Matrix_App
this.matrixWidth.Size = new System.Drawing.Size(163, 23);
this.matrixWidth.TabIndex = 0;
this.matrixWidth.Value = new decimal(new int[] {
Defaults.MatrixStartWidth,
10,
0,
0,
0});
@ -386,7 +377,6 @@ namespace Matrix_App
// Zeichnen
//
this.Zeichnen.BackColor = System.Drawing.Color.Transparent;
this.Zeichnen.Controls.Add(this.PushButton);
this.Zeichnen.Controls.Add(this.groupBox2);
this.Zeichnen.Controls.Add(this.groupBox1);
this.Zeichnen.Controls.Add(this.Clear);
@ -560,7 +550,6 @@ namespace Matrix_App
this.fill.TabIndex = 7;
this.fill.Text = "Fill";
this.fill.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
this.fill.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
this.fill.UseVisualStyleBackColor = true;
this.fill.Click += new System.EventHandler(this.DrawFill_Click);
@ -748,7 +737,7 @@ namespace Matrix_App
#endregion
private System.Windows.Forms.Button Ports;
private System.Windows.Forms.ComboBox Ports;
private System.Windows.Forms.TabControl Modus;
private System.Windows.Forms.TabPage tabPage1;
private System.Windows.Forms.TabPage Zeichnen;
@ -795,7 +784,6 @@ namespace Matrix_App
private System.Windows.Forms.Label label7;
private System.Windows.Forms.Label label6;
private System.Windows.Forms.GroupBox groupBox3;
private System.Windows.Forms.Button PushButton;
}
}

View File

@ -2,52 +2,53 @@
#define DEBUG_ENABLED
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Windows.Forms;
using System.IO.Ports;
using System.Timers;
using System.Windows.Forms;
using Matrix_App.adds;
using Matrix_App.forms;
using Matrix_App.Properties;
using Matrix_App.Themes;
using System.Drawing.Imaging;
using System.IO;
using System.Management;
using System.Text.RegularExpressions;
using static Matrix_App.Defaults;
using static Matrix_App.ArduinoInstruction;
using static Matrix_App.Utils;
using Matrix_App.Themes;
using Timer = System.Timers.Timer;
namespace Matrix_App
{
public partial class MatrixDesignerMain : Form
{
private void PortsOnClick(object? sender, EventArgs e)
{
new Settings(ref commandQueue, ref port);
}
#region Private-Members
/// <summary>
/// Port update Timer
/// Reloads available port names at consecutive rates
/// Port update Timer
/// Reloads available port names at consecutive rates
/// </summary>
private Timer? portNameUpdater;
private Timer? delay;
private static SerialPort _port = new SerialPort();
private uint portNumber;
private bool runningGif;
private static SerialPort port = new();
private PortCommandQueue commandQueue = new(ref port);
private readonly PortCommandQueue commandQueue = new PortCommandQueue(ref _port);
private readonly Regex comRegex = new Regex(@"COM[\d]+");
/// <summary>
/// Gif like frame video buffer
/// Gif like frame video buffer
/// </summary>
public static byte[][] gifBuffer = CreateImageRGB_NT(MatrixStartWidth, MatrixStartHeight, MatrixStartFrames);
public static readonly ThreadQueue IMAGE_DRAWER = new("Matrix Image Drawer", 4);
public static readonly ThreadQueue IMAGE_DRAWER = new ThreadQueue("Matrix Image Drawer", 4);
#endregion
#region Setup
@ -60,16 +61,20 @@ namespace Matrix_App
matrixView.Instance(this);
// Generate filter access buttons
MatrixGifGenerator.GenerateBaseUi(pregeneratedModsBase, matrixView, this);
Init();
// apply light-mode by default
new LightMode().ApplyTheme(this);
Show();
}
private void Init()
{
// Create port name update timer
portNameUpdater = new Timer(PortNameUpdateInterval);
portNameUpdater.Elapsed += UpdatePortNames;
portNameUpdater.AutoReset = true;
portNameUpdater.Enabled = true;
// create gif playback timer
delay = new Timer((int) Delay.Value);
delay.Elapsed += Timelineupdate;
@ -79,42 +84,42 @@ namespace Matrix_App
ZeichnenFarbRad.handler = ColorWheel_Handler!;
// setup port settings
port.BaudRate = BaudRate;
port.ReadTimeout = ReadTimeoutMs;
port.WriteTimeout = WriteTimeoutMs;
port.Parity = Parity.None;
port.DataBits = 8;
port.StopBits = StopBits.One;
_port.BaudRate = BaudRate;
_port.ReadTimeout = ReadTimeoutMs;
_port.WriteTimeout = WriteTimeoutMs;
// setup matrix
AdjustMatrixTable();
// search for initial ports
//GatherPortNames();
GatherPortNames();
HideEasterEgg();
}
private void HideEasterEgg()
{
if (DateTime.Now.DayOfWeek != DayOfWeek.Wednesday)
if (((int) DateTime.Now.DayOfWeek) != 3)
return;
if (new Random().Next(0, 9) >= 1)
return;
using (Bitmap wednesdayFrog = new(Resources.Frosch))
using (Bitmap wednesdayFrog = new Bitmap(Properties.Resources.Frosch))
{
matrixWidth.Value = wednesdayFrog.Width;
matrixHeight.Value = wednesdayFrog.Height;
ResizeGif();
for (var x = 0; x < wednesdayFrog.Width; x++)
for (var y = 0; y < wednesdayFrog.Height; y++)
{
var pixel = wednesdayFrog.GetPixel(x, y);
for (var y = 0; y < wednesdayFrog.Height; y++)
{
var pixel = wednesdayFrog.GetPixel(x, y);
matrixView.SetPixelNoRefresh(x, y, pixel);
matrixView.SetPixelNoRefresh(x, y, pixel);
}
}
}
@ -126,31 +131,160 @@ namespace Matrix_App
#region UI-Methods
#region Port-ComboBox
/// <summary>
/// Updates the port names to newest available ports.
/// Called by <see cref="portNameUpdater"/>.
/// </summary>
/// <param name="source"></param>
/// <param name="e"></param>
private void UpdatePortNames(object source, ElapsedEventArgs e)
{
if (Ports.InvokeRequired)
{
// invoke on the combo-boxes thread
Ports.Invoke(new Action(GatherPortNames));
}
else
{
// run on this thread
GatherPortNames();
}
}
/// <summary>
/// Gathers all available ports and sets them to the combobox <see cref="Ports"/>
/// </summary>
[SuppressMessage("ReSharper", "CoVariantArrayConversion", Justification = "Never got an exception, so seems to be just fine")]
private void GatherPortNames()
{
var ports = SerialPort.GetPortNames();
// save previously selected
var selected = this.Ports.SelectedItem;
// get device names from ports
var newPorts = GetDeviceNames(ports);
// add virtual port
newPorts.AddLast("Virtual-Unlimited (COM257)");
// search for new port
foreach (var newPort in newPorts)
{
// find any new port
var found = Ports.Items.Cast<object?>().Any(oldPort => (string) oldPort! == newPort);
// some port wasn't found, recreate list
if (!found)
{
commandQueue.InvalidatePort();
Ports.Items.Clear();
Ports.Items.AddRange(newPorts.ToArray()!);
// select previously selected port if port is still accessible
if (selected != null && Ports.Items.Contains(selected))
{
Ports.SelectedItem = selected;
} else
{
Ports.SelectedIndex = 0;
}
break;
}
}
}
private static LinkedList<string> GetDeviceNames(string[] ports)
{
ManagementClass processClass = new ManagementClass("Win32_PnPEntity");
ManagementObjectCollection devicePortNames = processClass.GetInstances();
var newPorts = new LinkedList<string>();
foreach (var currentPort in ports)
{
foreach (var o in devicePortNames)
{
var name = ((ManagementObject) o).GetPropertyValue("Name");
if (name == null || !name.ToString()!.Contains(currentPort))
continue;
newPorts.AddLast(name.ToString()!);
break;
}
}
return newPorts;
}
/// <summary>
/// Invoked when the selected port has changed.
/// Applies the new port settings.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Ports_SelectedIndexChanged(object sender, EventArgs e)
{
lock (_port)
{
if (!_port.IsOpen)
{
var item = (string)((ComboBox)sender).SelectedItem;
if (item != null)
{
// extract port
var matches = comRegex.Matches(item);
if(matches.Count > 0)
{
// only select valid port numbers (up to (including) 256)
portNumber = UInt32.Parse(matches[0].Value.Split('M')[1]);
if (portNumber <= 256)
{
// set valid port
_port.PortName = matches[0].Value;
commandQueue.ValidatePort();
} else if (portNumber == 257)
{
// virtual mode, increase limitations as no real arduino is connected
matrixWidth.Maximum = MatrixLimitedWidth;
matrixHeight.Maximum = MatrixLimitedHeight;
} else
{
// no port selected reset settings
matrixWidth.Maximum = MatrixStartWidth;
matrixHeight.Maximum = MatrixStartHeight;
}
}
}
}
}
}
#endregion
#region Scale
/// <summary>
/// Applies a new size to the gif and matrix
/// Applies a new size to the gif and matrix
/// </summary>
private void AdjustMatrixTable()
{
var width = (int) matrixWidth.Value;
var height = (int) matrixHeight.Value;
int width = (int)this.matrixWidth.Value;
int height = (int)this.matrixHeight.Value;
matrixView.resize(width, height);
ResizeGif();
// Delay.Minimum = Math.Min(Width.Value * Height.Value * 5, 500);
// Delay.Minimum = Math.Min(Width.Value * Height.Value * 5, 500);
}
private void Width_ValueChanged(object sender, EventArgs e)
{
AdjustMatrixTable();
commandQueue.EnqueueArduinoCommand(
OpcodeScale, // opcode
(byte) matrixWidth.Value,
(byte) matrixHeight.Value
OpcodeScale, // opcode
(byte)matrixWidth.Value,
(byte)matrixHeight.Value
);
}
@ -158,9 +292,9 @@ namespace Matrix_App
{
AdjustMatrixTable();
commandQueue.EnqueueArduinoCommand(
OpcodeScale, // opcode
(byte) matrixWidth.Value,
(byte) matrixHeight.Value
OpcodeScale, // opcode
(byte)matrixWidth.Value,
(byte)matrixHeight.Value
);
}
@ -169,25 +303,20 @@ namespace Matrix_App
#region Edit/Draw
#region TextBoxen
private void DrawTextBoxRed_KeyUp(object sender, KeyEventArgs e)
{
if (int.TryParse(ZeichnenTextBoxRed.Text, out var value) && value < 256 && value >= 0)
{
ZeichnenTrackBarRed.Value = value;
ZeichnenFarbRad.setRGB((byte) ZeichnenTrackBarRed.Value, (byte) ZeichnenTrackBarGreen.Value,
(byte) ZeichnenTrackBarBlue.Value);
ZeichnenFarbRad.setRGB((byte)ZeichnenTrackBarRed.Value, (byte)ZeichnenTrackBarGreen.Value, (byte)ZeichnenTrackBarBlue.Value);
}
else if (value >= 256)
{
ZeichnenTrackBarRed.Value = 255;
ZeichnenTextBoxRed.Text = @"255";
ZeichnenFarbRad.setRGB((byte) ZeichnenTrackBarRed.Value, (byte) ZeichnenTrackBarGreen.Value,
(byte) ZeichnenTrackBarBlue.Value);
ZeichnenFarbRad.setRGB((byte)ZeichnenTrackBarRed.Value, (byte)ZeichnenTrackBarGreen.Value, (byte)ZeichnenTrackBarBlue.Value);
}
matrixView.SetPaintColor(Color.FromArgb(ZeichnenTrackBarRed.Value, ZeichnenTrackBarGreen.Value,
ZeichnenTrackBarBlue.Value));
matrixView.SetPaintColor(Color.FromArgb(ZeichnenTrackBarRed.Value, ZeichnenTrackBarGreen.Value, ZeichnenTrackBarBlue.Value));
}
private void DrawTextBoxGreen_KeyUp(object sender, KeyEventArgs e)
@ -195,19 +324,16 @@ namespace Matrix_App
if (int.TryParse(ZeichnenTextBoxGreen.Text, out var value) && value < 256 && value >= 0)
{
ZeichnenTrackBarGreen.Value = value;
ZeichnenFarbRad.setRGB((byte) ZeichnenTrackBarRed.Value, (byte) ZeichnenTrackBarGreen.Value,
(byte) ZeichnenTrackBarBlue.Value);
ZeichnenFarbRad.setRGB((byte)ZeichnenTrackBarRed.Value, (byte)ZeichnenTrackBarGreen.Value, (byte)ZeichnenTrackBarBlue.Value);
}
else if (value >= 256)
{
ZeichnenTrackBarGreen.Value = 255;
ZeichnenTextBoxGreen.Text = @"255";
ZeichnenFarbRad.setRGB((byte) ZeichnenTrackBarRed.Value, (byte) ZeichnenTrackBarGreen.Value,
(byte) ZeichnenTrackBarBlue.Value);
ZeichnenFarbRad.setRGB((byte)ZeichnenTrackBarRed.Value, (byte)ZeichnenTrackBarGreen.Value, (byte)ZeichnenTrackBarBlue.Value);
}
matrixView.SetPaintColor(Color.FromArgb(ZeichnenTrackBarRed.Value, ZeichnenTrackBarGreen.Value, ZeichnenTrackBarBlue.Value));
matrixView.SetPaintColor(Color.FromArgb(ZeichnenTrackBarRed.Value, ZeichnenTrackBarGreen.Value,
ZeichnenTrackBarBlue.Value));
}
private void DrawTextBoxBlue_KeyUp(object sender, KeyEventArgs e)
@ -215,56 +341,44 @@ namespace Matrix_App
if (int.TryParse(ZeichnenTextBoxBlue.Text, out var value) && value < 256 && value >= 0)
{
ZeichnenTrackBarBlue.Value = value;
ZeichnenFarbRad.setRGB((byte) ZeichnenTrackBarRed.Value, (byte) ZeichnenTrackBarGreen.Value,
(byte) ZeichnenTrackBarBlue.Value);
ZeichnenFarbRad.setRGB((byte)ZeichnenTrackBarRed.Value, (byte)ZeichnenTrackBarGreen.Value, (byte)ZeichnenTrackBarBlue.Value);
}
else if (value >= 256)
{
ZeichnenTrackBarBlue.Value = 255;
ZeichnenTextBoxBlue.Text = @"255";
ZeichnenFarbRad.setRGB((byte) ZeichnenTrackBarRed.Value, (byte) ZeichnenTrackBarGreen.Value,
(byte) ZeichnenTrackBarBlue.Value);
ZeichnenFarbRad.setRGB((byte)ZeichnenTrackBarRed.Value, (byte)ZeichnenTrackBarGreen.Value, (byte)ZeichnenTrackBarBlue.Value);
}
matrixView.SetPaintColor(Color.FromArgb(ZeichnenTrackBarRed.Value, ZeichnenTrackBarGreen.Value, ZeichnenTrackBarBlue.Value));
matrixView.SetPaintColor(Color.FromArgb(ZeichnenTrackBarRed.Value, ZeichnenTrackBarGreen.Value,
ZeichnenTrackBarBlue.Value));
}
#endregion
#region TackBars
private void ZeichnenTrackBarRed_Scroll(object sender, EventArgs e)
{
ZeichnenTextBoxRed.Text = ZeichnenTrackBarRed.Value.ToString();
ZeichnenFarbRad.setRGB((byte) ZeichnenTrackBarRed.Value, (byte) ZeichnenTrackBarGreen.Value,
(byte) ZeichnenTrackBarBlue.Value);
matrixView.SetPaintColor(Color.FromArgb(ZeichnenTrackBarRed.Value, ZeichnenTrackBarGreen.Value,
ZeichnenTrackBarBlue.Value));
ZeichnenFarbRad.setRGB((byte)ZeichnenTrackBarRed.Value, (byte)ZeichnenTrackBarGreen.Value, (byte)ZeichnenTrackBarBlue.Value);
matrixView.SetPaintColor(Color.FromArgb(ZeichnenTrackBarRed.Value, ZeichnenTrackBarGreen.Value, ZeichnenTrackBarBlue.Value));
}
private void ZeichnenTrackBarGreen_Scroll(object sender, EventArgs e)
{
ZeichnenTextBoxGreen.Text = ZeichnenTrackBarGreen.Value.ToString();
ZeichnenFarbRad.setRGB((byte) ZeichnenTrackBarRed.Value, (byte) ZeichnenTrackBarGreen.Value,
(byte) ZeichnenTrackBarBlue.Value);
matrixView.SetPaintColor(Color.FromArgb(ZeichnenTrackBarRed.Value, ZeichnenTrackBarGreen.Value,
ZeichnenTrackBarBlue.Value));
ZeichnenFarbRad.setRGB((byte)ZeichnenTrackBarRed.Value, (byte)ZeichnenTrackBarGreen.Value, (byte)ZeichnenTrackBarBlue.Value);
matrixView.SetPaintColor(Color.FromArgb(ZeichnenTrackBarRed.Value, ZeichnenTrackBarGreen.Value, ZeichnenTrackBarBlue.Value));
}
private void ZeichnenTrackBarBlue_Scroll(object sender, EventArgs e)
{
ZeichnenTextBoxBlue.Text = ZeichnenTrackBarBlue.Value.ToString();
ZeichnenFarbRad.setRGB((byte) ZeichnenTrackBarRed.Value, (byte) ZeichnenTrackBarGreen.Value,
(byte) ZeichnenTrackBarBlue.Value);
matrixView.SetPaintColor(Color.FromArgb(ZeichnenTrackBarRed.Value, ZeichnenTrackBarGreen.Value,
ZeichnenTrackBarBlue.Value));
ZeichnenFarbRad.setRGB((byte)ZeichnenTrackBarRed.Value, (byte)ZeichnenTrackBarGreen.Value, (byte)ZeichnenTrackBarBlue.Value);
matrixView.SetPaintColor(Color.FromArgb(ZeichnenTrackBarRed.Value, ZeichnenTrackBarGreen.Value, ZeichnenTrackBarBlue.Value));
}
#endregion
/// <summary>
/// Sets a new color to the edit tab
/// Sets a new color to the edit tab
/// </summary>
/// <param name="color"></param>
public void SetColor(Color color)
@ -281,7 +395,7 @@ namespace Matrix_App
}
/// <summary>
/// Updates trackbars and RGB-textboxes according to color wheel settings
/// Updates trackbars and RGB-textboxes according to color wheel settings
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
@ -295,32 +409,30 @@ namespace Matrix_App
ZeichnenTextBoxGreen.Text = ZeichnenFarbRad.getGreen().ToString();
ZeichnenTextBoxBlue.Text = ZeichnenFarbRad.getBlue().ToString();
matrixView.SetPaintColor(Color.FromArgb(ZeichnenTrackBarRed.Value, ZeichnenTrackBarGreen.Value,
ZeichnenTrackBarBlue.Value));
matrixView.SetPaintColor(Color.FromArgb(ZeichnenTrackBarRed.Value, ZeichnenTrackBarGreen.Value, ZeichnenTrackBarBlue.Value));
}
/// <summary>
/// Fills the entire Matrix with a color
/// Fills the entire Matrix with a color
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void DrawFill_Click(object sender, EventArgs e)
{
var color = Color.FromArgb(ZeichnenTrackBarRed.Value, ZeichnenTrackBarGreen.Value,
ZeichnenTrackBarBlue.Value);
var color = Color.FromArgb(ZeichnenTrackBarRed.Value, ZeichnenTrackBarGreen.Value, ZeichnenTrackBarBlue.Value);
matrixView.SetPaintColor(color);
matrixView.Fill(color);
commandQueue.EnqueueArduinoCommand(
OpcodeFill, // Opcode
(byte) ZeichnenTrackBarRed.Value, // Red
(byte) ZeichnenTrackBarGreen.Value, // Green
(byte) ZeichnenTrackBarBlue.Value // Blue
);
OpcodeFill, // Opcode
(byte)ZeichnenTrackBarRed.Value, // Red
(byte)ZeichnenTrackBarGreen.Value,// Green
(byte)ZeichnenTrackBarBlue.Value // Blue
);
}
/// <summary>
/// Sets the entire Matrix to black
/// Sets the entire Matrix to black
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
@ -329,25 +441,25 @@ namespace Matrix_App
matrixView.Fill(Color.Black);
commandQueue.EnqueueArduinoCommand(
OpcodeFill, // opcode
0, // red
0, // green
0 // blue
OpcodeFill, // opcode
0, // red
0, // green
0 // blue
);
}
#endregion
#region Image-Drag-Drop
/// <summary>
/// Handles click event, opens a file dialog to choose and image file
/// Handles click event, opens a file dialog to choose and image file
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void DragDrop_Click(object sender, EventArgs e)
{
using OpenFileDialog openFileDialog = new()
using OpenFileDialog openFileDialog = new OpenFileDialog
{
InitialDirectory = "c:\\",
Filter = @"image files (*.PNG;*.JPG;*.GIF)|*.*",
@ -364,8 +476,8 @@ namespace Matrix_App
}
/// <summary>
/// Loads an image file froim disk and sets the matrix to it.
/// If the image is an gif, the gif buffer will be set to the gif, as well as the matrix itself.
/// Loads an image file froim disk and sets the matrix to it.
/// If the image is an gif, the gif buffer will be set to the gif, as well as the matrix itself.
/// </summary>
/// <param name="filePath"></param>
private void LoadFromFile(string filePath)
@ -378,9 +490,9 @@ namespace Matrix_App
var frames = Math.Min(gif.GetFrameCount(FrameDimension.Time), 120);
if (gif.GetFrameCount(FrameDimension.Time) > 120)
MessageBox.Show(
@"Das Gif ist zu Groß. Die Maximalgröße sind 120 Frames. Das Gif wird abgeschnitten sein, damit es in die Maximalgröße passt.",
@"Gif to large");
{
MessageBox.Show(@"Das Gif ist zu Groß. Die Maximalgröße sind 120 Frames. Das Gif wird abgeschnitten sein, damit es in die Maximalgröße passt.", @"Gif to large");
}
FrameCount.Value = frames;
Timeline.Maximum = frames - 1;
@ -397,41 +509,46 @@ namespace Matrix_App
// fetch each pixel and store
for (var x = 0; x < bitmap.Width; x++)
for (var y = 0; y < bitmap.Height; y++)
{
var pixel = bitmap.GetPixel(x, y);
for (var y = 0; y < bitmap.Height; y++)
{
var pixel = bitmap.GetPixel(x, y);
var index = x + y * bitmap.Width;
var index = x + y * bitmap.Width;
matrixView.SetPixelNoRefresh(x, y, pixel);
matrixView.SetPixelNoRefresh(x, y, pixel);
gifBuffer[i][index * 3 + 0] = pixel.R;
gifBuffer[i][index * 3 + 1] = pixel.G;
gifBuffer[i][index * 3 + 2] = pixel.B;
gifBuffer[i][index * 3] = pixel.G;
gifBuffer[i][index * 3 + 1] = pixel.R;
gifBuffer[i][index * 3 + 2] = pixel.B;
}
}
}
matrixView.Refresh();
Timeline.Value = 0;
}
else
{
Bitmap bitmap = ResizeImage(new Bitmap(filePath), matrixView.matrixWidth(), matrixView.matrixHeight());
Bitmap bitmap = new Bitmap(filePath);
bitmap = ResizeImage(bitmap, matrixView.matrixWidth(), matrixView.matrixHeight());
matrixView.SetImage(bitmap);
for (var x = 0; x < bitmap.Width; x++)
for (var y = 0; y < bitmap.Height; y++)
for (int x = 0; x < bitmap.Width; x++)
{
var pixel = bitmap.GetPixel(x, y);
for (int y = 0; y < bitmap.Height; y++)
{
var pixel = bitmap.GetPixel(x, y);
var index = x + y * bitmap.Width;
int index = x + y * bitmap.Width;
gifBuffer[Timeline.Value][index * 3 + 0] = pixel.R;
gifBuffer[Timeline.Value][index * 3 + 1] = pixel.G;
gifBuffer[Timeline.Value][index * 3 + 2] = pixel.B;
gifBuffer[Timeline.Value][index * 3] = pixel.G;
gifBuffer[Timeline.Value][index * 3 + 1] = pixel.R;
gifBuffer[Timeline.Value][index * 3 + 2] = pixel.B;
}
}
}
WriteImage(gifBuffer[Timeline.Value]);
}
@ -445,11 +562,10 @@ namespace Matrix_App
private void DragDrop_DragDrop(object sender, DragEventArgs e)
{
string[] picturePath = (string[]) e.Data.GetData(DataFormats.FileDrop);
string[] picturePath = (string[])e.Data.GetData(DataFormats.FileDrop);
LoadFromFile(picturePath[0]);
}
#endregion
#region Timeline
@ -462,7 +578,7 @@ namespace Matrix_App
public int GetDelayTime()
{
return (int) Delay.Value;
return (int)Delay.Value;
}
private void FrameCount_ValueChanged(object sender, EventArgs e)
@ -476,64 +592,93 @@ namespace Matrix_App
else
{
Timeline.Enabled = true;
Timeline.Maximum = (int) FrameCount.Value - 1;
Timeline.Maximum = (int)FrameCount.Value - 1;
}
}
private void Timeline_ValueChanged(object sender, EventArgs e)
{
var timeFrame = Timeline.Value;
WriteImage(gifBuffer[timeFrame]);
lock (matrixView)
IMAGE_DRAWER.Enqueue(() =>
{
matrixView.SetImage(gifBuffer[timeFrame]);
}
WriteImage(gifBuffer[timeFrame]);
var width = matrixView.matrixWidth();
var height = matrixView.matrixHeight();
lock (matrixView)
{
for (var y = 0; y < height; y++)
{
var index = y * width;
for (var x = 0; x < width; x++)
{
var tmp = (index + x) * 3;
var color = Color.FromArgb(gifBuffer[timeFrame][tmp + 1], gifBuffer[timeFrame][tmp], gifBuffer[timeFrame][tmp + 2]);
matrixView.SetPixelNoRefresh(x, y, color);
}
}
}
matrixView.Refresh();
return true;
});
matrixView.Refresh();
}
/// <summary>
/// Stores the current matrix at the index noted by the timeline into the Gif
/// Stores the current matrix at the index noted by the timeline into the Gif
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Apply_Click(object sender, EventArgs e)
{
var width = matrixView.matrixWidth();
var height = matrixView.matrixHeight();
int width = matrixView.matrixWidth();
int height = matrixView.matrixHeight();
for (var y = 0; y < height; y++)
for (int y = 0; y < height; y++)
{
var i = y * width;
int i = y * width;
for (var x = 0; x < width; x++)
for (int x = 0; x < width; x++)
{
var tmp = (i + x) * 3;
int tmp = (i + x) * 3;
var color = matrixView.GetPixel(x, y);
gifBuffer[Timeline.Value][tmp + 0] = color.R;
gifBuffer[Timeline.Value][tmp + 1] = color.G;
gifBuffer[Timeline.Value][tmp] = color.G;
gifBuffer[Timeline.Value][tmp + 1] = color.R;
gifBuffer[Timeline.Value][tmp + 2] = color.B;
}
}
}
private void Timelineupdate(object source, ElapsedEventArgs e)
private void Timelineupdate(Object source, ElapsedEventArgs e)
{
if (Timeline.InvokeRequired)
{
// invoke on the combo-boxes thread
Timeline.Invoke(new Action(() =>
{
if (Timeline.Value < Timeline.Maximum)
{
Timeline.Value = Timeline.Value + 1;
}
else
{
Timeline.Value = 0;
}
}));
}
}
/// <summary>
/// Starts playing the timeline
/// Starts playing the timeline
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
@ -547,19 +692,19 @@ namespace Matrix_App
Timeline.Value = 0;
runningGif = true;
if (delay != null)
delay.Enabled = true;
Play.Image = new Bitmap(Resources.Stop);
Play.Image = new Bitmap(Properties.Resources.Stop);
}
else
{
Play.Image = new Bitmap(Resources.Play);
Play.Image = new Bitmap(Properties.Resources.Play);
Play.Text = @"Play";
runningGif = false;
if (delay != null)
if (delay != null)
delay.Enabled = false;
}
}
@ -567,28 +712,30 @@ namespace Matrix_App
private void Timeline_MouseDown(object sender, MouseEventArgs e)
{
if (!runningGif) return;
Play.Image = new Bitmap(Resources.Play);
Play.Text = @"Play";
runningGif = false;
if (delay != null)
delay.Enabled = false;
if (runningGif)
{
Play.Image = new Bitmap(Properties.Resources.Play);
Play.Text = @"Play";
runningGif = false;
if (delay != null)
delay.Enabled = false;
}
}
private void Delay_ValueChanged(object sender, EventArgs _)
{
if (delay != null)
if (delay != null)
delay.Interval = (int) Delay.Value;
}
#endregion
#region Properties
private void Save_Click(object sender, EventArgs e)
{
SaveFileDialog save = new()
SaveFileDialog save = new SaveFileDialog
{
InitialDirectory = "c:\\",
Filter = @"image files (*.PNG;*.JPG;*.GIF)|*.*",
@ -600,23 +747,20 @@ namespace Matrix_App
{
string filePath = save.FileName;
Bitmap[] gifBitmap = new Bitmap[gifBuffer.Length];
GifWriter writer = new(File.Create(filePath));
GifWriter writer = new GifWriter(File.Create(filePath));
for (var i = 0; i < FrameCount.Value; i++)
{
gifBitmap[i] = new Bitmap((int) matrixWidth.Value, (int) matrixHeight.Value);
gifBitmap[i] = new Bitmap((int)matrixWidth.Value, (int)matrixHeight.Value);
for (var j = 0; j < gifBuffer[i].Length / 3; j++)
{
var y = j / (int) matrixWidth.Value;
var x = j % (int) matrixWidth.Value;
var y = j / (int)matrixWidth.Value;
var x = j % (int)matrixWidth.Value;
gifBitmap[i].SetPixel(x, y,
Color.FromArgb(gifBuffer[i][j * 3], gifBuffer[i][j * 3 + 1], gifBuffer[i][j * 3 + 2]));
gifBitmap[i].SetPixel(x, y, Color.FromArgb(gifBuffer[i][j * 3 + 1], gifBuffer[i][j * 3], gifBuffer[i][j * 3 + 2]));
}
writer.WriteFrame(gifBitmap[i], (int) Delay.Value);
writer.WriteFrame(gifBitmap[i], (int)Delay.Value);
}
writer.Dispose();
}
}
@ -624,7 +768,7 @@ namespace Matrix_App
private void ConfigButton_Click(object sender, EventArgs e)
{
commandQueue.EnqueueArduinoCommand(4);
PortCommandQueue.WaitForLastDequeue();
commandQueue.WaitForLastDequeue();
byte[] data = commandQueue.GetLastData();
if (commandQueue.GetMark() > 0)
@ -632,25 +776,13 @@ namespace Matrix_App
int width = data[0];
int height = data[1];
matrixWidth.Value = width;
matrixHeight.Value = height;
this.matrixWidth.Value = width;
this.matrixHeight.Value = height;
for (var y = 0; y < height; y++)
for (var x = 0; x < width; x++)
for (var x = 0; x < width * height * 3; x++)
{
var i0 = x * 3 + y * width * 3;
var x1 = height - y - 1;
var y1 = width - x - 1;
var i1 = x1 * 3 + y1 * width * 3;
// degamma
gifBuffer[0][i0 + 0] = (byte) MathF.Sqrt(data[i1 + 0 + 2] / 258.0f * 65536.0f);
gifBuffer[0][i0 + 1] = (byte) MathF.Sqrt(data[i1 + 1 + 2] / 258.0f * 65536.0f);
gifBuffer[0][i0 + 2] = (byte) MathF.Sqrt(data[i1 + 2 + 2] / 258.0f * 65536.0f);
gifBuffer[0][x] = data[2 + x];
}
Timeline.Value = 1;
Timeline.Value = 0;
}
@ -668,14 +800,16 @@ namespace Matrix_App
}
/// <summary>
/// Resizes the Gif image buffer
/// Resizes the Gif image buffer
/// </summary>
private void ResizeGif()
{
var frames = (int) FrameCount.Value;
int frames = (int)FrameCount.Value;
gifBuffer = new byte[frames + 1][];
for (var i = 0; i <= frames; i++)
for (int i = 0; i <= frames; i++)
{
gifBuffer[i] = new byte[matrixView.matrixWidth() * matrixView.matrixHeight() * 3];
}
}
#endregion
@ -697,38 +831,14 @@ namespace Matrix_App
#endregion
#region IO-Utils
private void WriteImage(byte[] rgbImageData)
{
var gammaImage = new byte[rgbImageData.Length];
var width = matrixView.matrixWidth();
var height = matrixView.matrixHeight();
for (var y = 0; y < height; y++)
for (var x = 0; x < width; x++)
{
var i0 = x * 3 + y * width * 3;
;
var x1 = height - y - 1;
var y1 = width - x - 1;
var i1 = x1 * 3 + y1 * width * 3;
gammaImage[i0 + 0] = rgbImageData[i1 + 0];
gammaImage[i0 + 1] = rgbImageData[i1 + 1];
gammaImage[i0 + 2] = rgbImageData[i1 + 2];
}
for (var i = 0; i < rgbImageData.Length; i++)
gammaImage[i] = (byte) ((gammaImage[i] * gammaImage[i] * 258) >> 16);
commandQueue.EnqueueArduinoCommand(OpcodeImage, gammaImage);
commandQueue.EnqueueArduinoCommand(OpcodeImage, rgbImageData);
}
/// <summary>
/// Converts the matrix's pixel ARGB buffer to an 3-byte RGB tuple array and sends them to the arduino
/// Converts the matrix's pixel ARGB buffer to an 3-byte RGB tuple array and sends them to the arduino
/// </summary>
public void EnqueuePixelSet()
{
@ -736,38 +846,16 @@ namespace Matrix_App
byte[] image = new byte[pixels.Length * 3];
for (var x = 0; x < pixels.Length; x++)
for (int x = 0; x < pixels.Length; x++)
{
image[x * 3 + 0] = (byte) ((pixels[x] >> 16) & 0xFF);
image[x * 3 + 1] = (byte) ((pixels[x] >> 8) & 0xFF);
image[x * 3 + 2] = (byte) ((pixels[x] >> 0) & 0xFF);
image[x * 3] = (byte)(pixels[x] >> 8 & 0xFF);
image[x * 3 + 1] = (byte)(pixels[x] >> 16 & 0xFF);
image[x * 3 + 2] = (byte)(pixels[x] & 0xFF);
}
WriteImage(image);
}
#endregion
private void PushButtonOnClick(object? sender, EventArgs e)
{
var bytes = matrixWidth.Value * matrixHeight.Value * 3 * gifBuffer.Length + 5;
var data = new byte[(int) bytes];
data[0] = (byte) matrixWidth.Value;
data[1] = (byte) matrixHeight.Value;
data[2] = (byte) gifBuffer.Length;
data[3] = (byte) ((int) Delay.Value >> 8);
data[4] = (byte) ((int) Delay.Value & 0xFF);
for (var frame = 0; frame < gifBuffer.Length; frame++)
{
for (var pixel = 0; pixel < gifBuffer[0].Length; pixel++)
{
data[frame * gifBuffer[0].Length + pixel + 5] = (byte) (gifBuffer[frame][pixel] * gifBuffer[frame][pixel] * 258 >> 16);
}
}
commandQueue.EnqueueArduinoCommand(OpcodePush, data);
}
}
}
}

View File

@ -4,7 +4,6 @@ using System.Drawing;
using System.Reflection;
using System.Threading;
using System.Windows.Forms;
using Matrix_App.minecraft;
using Matrix_App.PregeneratedMods.reflection;
using static Matrix_App.Utils;
using static Matrix_App.Defaults;
@ -24,9 +23,7 @@ namespace Matrix_App
new Boxblur(),
new ColorAdjust(),
new Grayscale(),
new Invert(),
new Transfom(),
new Minecraft()
new Invert()
};
// Static generator accessible members
@ -80,8 +77,6 @@ namespace Matrix_App
_playbackFrame++;
}
public delegate void update();
/// <summary>
/// Colors a single fragment at the specified pixel location (x|y) at frame frame.
/// </summary>
@ -95,8 +90,6 @@ namespace Matrix_App
/// <param name="b">Pixel Blue value in range [0, 1] (saturated)</param>
protected abstract void ColorFragment(in int x, in int y, in float u, in float v, in int frame, out float r, out float g, out float b);
protected abstract void CreateUi(FlowLayoutPanel anchor, update runner);
// Buffer to store generator result in
private static byte[][] _animationBuffer = null!;
@ -114,21 +107,13 @@ namespace Matrix_App
// generate button
var button = new Button
{
AutoSize = true,
Width = 215,
Text = FieldWidgets.GetBetterFieldName(generator.GetType().Name)
};
button.Width = anchor.ClientSize.Width - button.Margin.Right - button.Margin.Left;
button.Click += (sender, e) =>
{
lock (matrix)
{
OpenGeneratorUi(generator, matrix);
}
};
button.Click += (sender, e) => OpenGeneratorUi(generator, matrix);
button.Image = CreateSnapshot(generator);
button.TextImageRelation = TextImageRelation.ImageBeforeText;
button.TextAlign = ContentAlignment.MiddleRight;
button.ImageAlign = ContentAlignment.MiddleLeft;
button.Height = FilterPreviewHeight * 3 / 2;
anchor.Controls.Add(button);
}
@ -180,7 +165,7 @@ namespace Matrix_App
@"Filter incomplete", MessageBoxButtons.YesNo, MessageBoxIcon.Warning))
{
BlockBuffer();
ColorStore(_animationBuffer, MatrixDesignerMain.gifBuffer);
FlipColorStoreRG_GR(_animationBuffer, MatrixDesignerMain.gifBuffer);
_form.ResetTimeline();
}
else
@ -190,7 +175,7 @@ namespace Matrix_App
}
else
{
ColorStore(_animationBuffer, MatrixDesignerMain.gifBuffer);
FlipColorStoreRG_GR(_animationBuffer, MatrixDesignerMain.gifBuffer);
_form.ResetTimeline();
}
}
@ -219,11 +204,11 @@ namespace Matrix_App
Form prompt = new Form
{
AutoSize = true,
AutoSizeMode = AutoSizeMode.GrowOnly,
Width = 500,
Height = 320,
Text = @"Vorgenerierter Modus: " + _generator.GetType().Name
};
var confirmation = new Button {Text = @"Apply", Anchor = AnchorStyles.Top | AnchorStyles.Left};
confirmation.Click += (sender, e) => {
success = true;
@ -232,16 +217,13 @@ namespace Matrix_App
FlowLayoutPanel controlPanel = new FlowLayoutPanel
{
Anchor = AnchorStyles.Bottom | AnchorStyles.Left,
Anchor = AnchorStyles.Top | AnchorStyles.Left,
FlowDirection = FlowDirection.BottomUp,
Dock = DockStyle.Fill,
Dock = DockStyle.Top,
WrapContents = false,
AutoSizeMode = AutoSizeMode.GrowOnly,
AutoSize = true
};
_generator.CreateUi(controlPanel, InvokeGenerator);
PlaybackTimer.Interval = _form.GetDelayTime();
PlaybackTimer.Enabled = true;
@ -276,9 +258,9 @@ namespace Matrix_App
prompt.MinimumSize = prompt.Size;
prompt.Controls.Add(controlPanel);
prompt.Controls.Add(southPane);
prompt.MaximizeBox = false;
prompt.Height = southPane.Height * 2 + controlPanel.Height + 16;
prompt.FormBorderStyle = FormBorderStyle.FixedDialog;
prompt.StartPosition = FormStartPosition.CenterScreen;
prompt.MaximizeBox = false;
prompt.ShowDialog();
PlaybackTimer.Enabled = false;
@ -290,7 +272,7 @@ namespace Matrix_App
{
// Create new initial buffer and copy what ever was in the Gif buffer to it
_initialBuffer = CreateImageRGB_NT(matrix.matrixWidth(), matrix.matrixHeight(), MatrixDesignerMain.gifBuffer.Length);
ColorStore(MatrixDesignerMain.gifBuffer, _initialBuffer);
FlipColorStoreRG_GR(MatrixDesignerMain.gifBuffer, _initialBuffer);
// Set Generator args
SetGlobalArgs(matrix.matrixWidth(),
matrix.matrixHeight(),
@ -317,10 +299,9 @@ namespace Matrix_App
var divider = new Label
{
BorderStyle = BorderStyle.Fixed3D,
AutoSize = false,
Dock = DockStyle.Fill,
Anchor = AnchorStyles.Top | AnchorStyles.Left,
Height = lineHeight,
AutoSize = false,
Height = lineHeight,
Width = 500
};
controlPanel.Controls.Add(divider);
@ -334,11 +315,11 @@ namespace Matrix_App
{
for (var x = 0; x < width; x++)
{
var u = x / (float) width;
var u = x / (float)width;
for (var y = 0; y < height; y++)
{
var v = y / (float) height;
var v = y / (float)height;
_generator!.ColorFragment(x, y, u, v, frame, out var r, out var g, out var b);

View File

@ -0,0 +1,182 @@
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.IO.Ports;
using System.Security.Permissions;
using System.Text;
using System.Threading;
using static Matrix_App.Defaults;
namespace Matrix_App
{
public class PortCommandQueue
{
private const string threadDeliverName = "Arduino Port Deliver Thread";
private Queue<byte[]> byteWriteQueue = new Queue<byte[]>();
private Thread portDeliverThread;
private SerialPort port;
private bool running = false;
private volatile bool kill = false;
private volatile bool isPortValid = false;
private byte[] recived = new byte[ArduinoReceiveBufferSize];
private int mark;
public PortCommandQueue(ref SerialPort port)
{
this.port = port;
portDeliverThread = new Thread(new ThreadStart(ManageQueue));
portDeliverThread.Name = threadDeliverName;
}
private void ManageQueue()
{
try
{
while (!kill)
{
if (byteWriteQueue.Count > 0)
{
byte[] bytes;
lock (byteWriteQueue)
{
bytes = byteWriteQueue.Dequeue();
}
lock (port)
{
if (isPortValid)
{
port.Open();
port.Write(bytes, 0, bytes.Length);
int b;
mark = 0;
while((b = port.ReadByte()) != ArduinoSuccessByte)
{
recived[mark++] = (byte) b;
}
port.Close();
}
}
}
}
} catch (ThreadInterruptedException)
{
Thread.CurrentThread.Interrupt();
return;
}
catch (Exception)
{
// omit
}
}
[SecurityPermissionAttribute(SecurityAction.Demand, ControlThread = true)]
public void Close()
{
try
{
if (running)
{
kill = true;
portDeliverThread.Interrupt();
portDeliverThread.Join(1000);
}
}
catch (ThreadStartException)
{
// omit
}
catch (ThreadInterruptedException)
{
// omit
}
}
public void EnqueueArduinoCommand(params byte[] bytes)
{
if (!running)
{
running = true;
portDeliverThread.Start();
}
if (byteWriteQueue.Count < ArduinoCommandQueueSize)
{
lock (byteWriteQueue)
{
byteWriteQueue.Enqueue(bytes);
}
}
}
public void EnqueueArduinoCommand(byte opcode, params byte[] data)
{
byte[] wrapper = new byte[data.Length + 1];
System.Buffer.BlockCopy(data, 0, wrapper, 1, data.Length);
wrapper[0] = opcode;
EnqueueArduinoCommand(wrapper);
}
public void DequeueAll()
{
lock (byteWriteQueue)
{
byteWriteQueue.Clear();
}
}
internal void WaitForLastDequeue()
{
int timeCount = 0;
bool wait = true;
while(wait)
{
lock(byteWriteQueue)
{
wait = byteWriteQueue.Count != 0;
}
timeCount++;
Thread.Sleep(500);
wait = timeCount == DequeueWaitTimeoutCounter;
}
}
public byte[] GetLastData()
{
return recived;
}
public void ValidatePort()
{
isPortValid = true;
}
public void InvalidatePort()
{
isPortValid = false;
}
public int GetMark()
{
int tmp = mark;
mark = 0;
return tmp;
}
}
}

View File

@ -1,5 +1,4 @@
using System;
using System.Windows.Forms;
using Matrix_App.PregeneratedMods.reflection;
using static Matrix_App.GifGeneratorUtils;
@ -49,10 +48,5 @@ namespace Matrix_App.PregeneratedMods
b = tmpB;
}
}
protected override void CreateUi(FlowLayoutPanel anchor, update invokeGenerator)
{
}
}
}

View File

@ -1,5 +1,4 @@
using System;
using System.Windows.Forms;
using Matrix_App.PregeneratedMods.reflection;
using static Matrix_App.GifGeneratorUtils;
@ -7,20 +6,16 @@ namespace Matrix_App.PregeneratedMods
{
public class ColorAdjust : MatrixGifGenerator
{
[UiWidget]
[UiDescription(title: "Contrast", description: "Constrasts the image, or loweres difference")]
private float contrast = 0.5f;
[UiWidget]
[UiDescription(title: "Tone offset", description: "Sets an additional offset to the pixels hue")]
private float hueOffset = 0.0f;
[UiWidget]
[UiDescription(title: "Saturation boost", description: "Decreases or increases (chroma-based) saturation")]
[UiDescription(title: "Saturation boost", description: "Decreases or increases saturation")]
private float saturationBoost = 0.5f;
[UiWidget]
[UiDescription(title: "Luminance boost", description: "Decreases or increases luminance")]
[UiDescription(title: "Brightness boost", description: "Decreases or increases brightness")]
private float valueBoost = 0.5f;
[UiWidget]
@ -45,7 +40,7 @@ namespace Matrix_App.PregeneratedMods
SampleFrame(actualStore!, frame, x, y, width, out float tr, out float tg, out float tb);
// Adjust HSV
HslFromRgb(tr, tg, tb, out float h, out float s, out float value);
HsvFromRgb(tr, tg, tb, out float h, out float s, out float value);
h = h / 360.0f + hueOffset;
h = (h - MathF.Floor(h)) * 360.0f;
@ -53,22 +48,11 @@ namespace Matrix_App.PregeneratedMods
value = Boost(value, valueBoost);
// Adjust RGB
RgbFromHsl(h, s, value, out tr, out tg, out tb);
RgbFromHsv(h, s, value, out tr, out tg, out tb);
r = Boost(tr, redBoost);
g = Boost(tg, greenBoost);
b = Boost(tb, blueBoost);
float enhancedContrast = contrast * 10.0f;
r = MathF.Pow(r, enhancedContrast) * enhancedContrast;
g = MathF.Pow(g, enhancedContrast) * enhancedContrast;
b = MathF.Pow(b, enhancedContrast) * enhancedContrast;
}
protected override void CreateUi(FlowLayoutPanel anchor, update invokeGenerator)
{
}
}
}

View File

@ -1,5 +1,4 @@
using System.Windows.Forms;
using Matrix_App.PregeneratedMods.reflection;
using Matrix_App.PregeneratedMods.reflection;
using static Matrix_App.GifGeneratorUtils;
namespace Matrix_App.PregeneratedMods
@ -30,10 +29,5 @@ namespace Matrix_App.PregeneratedMods
b = average;
}
}
protected override void CreateUi(FlowLayoutPanel anchor, update invokeGenerator)
{
}
}
}

View File

@ -1,5 +1,4 @@
using System.Windows.Forms;
using static Matrix_App.GifGeneratorUtils;
using static Matrix_App.GifGeneratorUtils;
namespace Matrix_App.PregeneratedMods
{
@ -13,10 +12,5 @@ namespace Matrix_App.PregeneratedMods
g = 1 - lg;
b = 1 - lb;
}
protected override void CreateUi(FlowLayoutPanel anchor, update invokeGenerator)
{
}
}
}

View File

@ -1,7 +1,6 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
namespace Matrix_App.PregeneratedMods
{
@ -56,10 +55,5 @@ namespace Matrix_App.PregeneratedMods
g += 0.1f * s4;
b += 0.2f * s4;
}
protected override void CreateUi(FlowLayoutPanel anchor, update invokeGenerator)
{
}
}
}

View File

@ -1,5 +1,4 @@
using System;
using System.Windows.Forms;
using Matrix_App.PregeneratedMods.reflection;
namespace Matrix_App.PregeneratedMods
@ -17,11 +16,6 @@ namespace Matrix_App.PregeneratedMods
b = Next(frame, x, y + 34968);
}
protected override void CreateUi(FlowLayoutPanel anchor, update invokeGenerator)
{
}
private float Next(int frame, int x, int y)
{
var k = MathF.Sin(frame * 2356f + (x + y) * 5334f + (y * x) * 534f + 78.0f + seed * 435f) * 567f;

View File

@ -1,5 +1,4 @@
using System;
using System.Windows.Forms;
using Matrix_App.PregeneratedMods.reflection;
using static Matrix_App.GifGeneratorUtils;
@ -36,11 +35,6 @@ namespace Matrix_App.PregeneratedMods
}
}
protected override void CreateUi(FlowLayoutPanel anchor, update invokeGenerator)
{
}
private float AddHueOffset(float hue)
{
return MathF.Abs(hue + rotation * 360) % 360.0f;

View File

@ -1,5 +1,4 @@
using System;
using System.Windows.Forms;
namespace Matrix_App.PregeneratedMods
{
@ -30,10 +29,5 @@ namespace Matrix_App.PregeneratedMods
g = sp;
b = sp;
}
protected override void CreateUi(FlowLayoutPanel anchor, update invokeGenerator)
{
}
}
}

View File

@ -1,6 +1,5 @@

using System;
using System.Windows.Forms;
namespace Matrix_App.PregeneratedMods
{
@ -12,10 +11,5 @@ namespace Matrix_App.PregeneratedMods
g = v;
b = MathF.Sin(frame / (float) totalFrames * MathF.PI);
}
protected override void CreateUi(FlowLayoutPanel anchor, update invokeGenerator)
{
}
}
}

View File

@ -1,85 +0,0 @@
using System;
using System.Windows.Forms;
using Matrix_App.PregeneratedMods.reflection;
using static Matrix_App.GifGeneratorUtils;
namespace Matrix_App.PregeneratedMods
{
public sealed class Transfom : MatrixGifGenerator
{
[UiWidget]
[UiDescription(title: "Flip Horizontally", description: "Flips the image in the middle on the horizontal axis")]
private bool flipHorizontally = false;
[UiWidget]
[UiDescription(title: "Flip Vertically", description: "Flips the image in the middle on the vertical axis")]
private bool flipVertically = false;
[UiWidget]
[UiDescription(title: "Mirror Horizontally", description: "Mirrors the image in the middle on the horizontal axis")]
private bool mirrorHorizontally = false;
[UiWidget]
[UiDescription(title: "Mirror Vertically", description: "Mirrors the image in the middle on the vertical axis")]
private bool mirrorVertically = false;
[UiWidget]
[UiDescription(title: "Rotation", description: "Rotate counter-clock-wise, repeating the image where needed (at corners)")]
private int rotation = 0;
[UiWidget]
[UiDescription(title: "Skew X", description: "Skew the image on the x-axis")]
private float skewX = 0.0f;
[UiWidget]
[UiDescription(title: "Skew Y", description: "Skew the image on the y-axis")]
private float skewY = 0.0f;
[UiWidget]
[UiDescription(title: "Scale", description: "Scale up or down")]
private float scale = 0.5f;
protected override void ColorFragment(in int x, in int y, in float u, in float v, in int frame, out float r, out float g, out float b)
{
var sint = MathF.Sin(rotation / 180.0f * MathF.PI);
var cost = MathF.Cos(rotation / 180.0f * MathF.PI);
var tx = x;
var ty = y;
var otx = x - (width >> 1);
var oty = y - (height >> 1);
tx = (int) (otx * cost - oty * sint);
ty = (int) (otx * sint + oty * cost);
tx += width >> 1;
ty += height >> 1;
tx = flipVertically ? width - tx - 1 : tx;
ty = flipHorizontally ? height - ty - 1 : ty;
tx = mirrorVertically ? tx % (width >> 1) : tx;
ty = mirrorHorizontally ? ty % (height >> 1) : ty;
tx += (int) (ty * skewX * 2.0f);
ty += (int) (tx * skewY * 2.0f);
tx = (int) ((tx - (width >> 1)) * scale * 2.0f) + (width >> 1);
ty = (int) ((ty - (height >> 1)) * scale * 2.0f) + (height >> 1);
tx = Math.Abs(tx) % width;
ty = Math.Abs(ty) % height;
SampleFrame(actualStore!, frame, tx, ty, width, out float lr, out float lg, out float lb);
r = lr;
g = lg;
b = lb;
}
protected override void CreateUi(FlowLayoutPanel anchor, update invokeGenerator)
{
}
}
}

View File

@ -1,55 +0,0 @@
using System.Diagnostics;
using System.Drawing;
using System.Windows.Forms;
using Matrix_App.Properties;
namespace Matrix_App.minecraft
{
public class Minecraft : MatrixGifGenerator
{
private Bitmap? texture = Resources.Pumpkin;
protected override void CreateUi(FlowLayoutPanel anchor, update invokeGenerator)
{
CreateButton(Resources.CreeperHead, "Creeper", anchor, invokeGenerator);
CreateButton(Resources.EndermanHead, "Enderman", anchor, invokeGenerator);
CreateButton(Resources.EmeraldBlock, "Emerald", anchor, invokeGenerator);
CreateButton(Resources.CommandBlock, "Command Block", anchor, invokeGenerator);
CreateButton(Resources.DiamondOre, "Diamond ore", anchor, invokeGenerator);
CreateButton(Resources.GrassBlock, "Grass", anchor, invokeGenerator);
CreateButton(Resources.Pumpkin, "Pumpkin", anchor, invokeGenerator);
CreateButton(Resources.RedstoneLamp, "Redstone lamp", anchor, invokeGenerator);
CreateButton(Resources.TNT, "TNT", anchor, invokeGenerator);
CreateButton(Resources.BlueWool, "Blue wool", anchor, invokeGenerator);
}
private void CreateButton(Bitmap bitmap, string title, FlowLayoutPanel anchor, update invokeGenerator)
{
var button = new Button()
{
Text = title,
AutoSize = true,
Image = bitmap,
TextImageRelation = TextImageRelation.ImageBeforeText,
ImageAlign = ContentAlignment.MiddleLeft,
TextAlign = ContentAlignment.MiddleRight
};
button.Width = anchor.ClientSize.Width - button.Margin.Left - button.Margin.Right;
button.Click += (a, b) =>
{
texture = bitmap;
invokeGenerator();
};
anchor.Controls.Add(button);
}
protected override void ColorFragment(in int x, in int y, in float u, in float v, in int frame, out float r, out float g, out float b)
{
var color = texture!.GetPixel((int) (u * texture.Width), (int) (v * texture.Height));
r = color.R / 255.0f;
g = color.G / 255.0f;
b = color.B / 255.0f;
}
}
}

View File

@ -37,6 +37,7 @@ namespace Matrix_App.PregeneratedMods.reflection
title = desc.title;
description.Text = desc.description;
description.ForeColor = Color.Gray;
description.Height += 10;
description.AutoSize = true;
}
@ -46,6 +47,7 @@ namespace Matrix_App.PregeneratedMods.reflection
Text = title,
Dock = DockStyle.Left,
Anchor = AnchorStyles.Top | AnchorStyles.Left,
Width = 100
});
switch (fieldValue)
@ -54,11 +56,10 @@ namespace Matrix_App.PregeneratedMods.reflection
{
var upDown = new NumericUpDown
{
Width = 360,
Dock = DockStyle.Fill,
Anchor = AnchorStyles.Top | AnchorStyles.Right,
Value = value,
Maximum = 1000
Width = 360,
Value = value
};
upDown.ValueChanged += (a, b) =>
{
@ -93,8 +94,8 @@ namespace Matrix_App.PregeneratedMods.reflection
Maximum = 100,
Minimum = 0,
Value = (int) (floatValue * 100.0f),
Width = 360,
TickFrequency = 10,
Width = 360
};
upDown.ValueChanged += (a, b) =>
{

View File

@ -70,16 +70,6 @@ namespace Matrix_App.Properties {
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap BlueWool {
get {
object obj = ResourceManager.GetObject("BlueWool", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
@ -90,56 +80,6 @@ namespace Matrix_App.Properties {
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap CommandBlock {
get {
object obj = ResourceManager.GetObject("CommandBlock", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap CreeperHead {
get {
object obj = ResourceManager.GetObject("CreeperHead", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap DiamondOre {
get {
object obj = ResourceManager.GetObject("DiamondOre", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap EmeraldBlock {
get {
object obj = ResourceManager.GetObject("EmeraldBlock", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap EndermanHead {
get {
object obj = ResourceManager.GetObject("EndermanHead", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
@ -170,16 +110,6 @@ namespace Matrix_App.Properties {
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap GrassBlock {
get {
object obj = ResourceManager.GetObject("GrassBlock", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
@ -200,26 +130,6 @@ namespace Matrix_App.Properties {
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap Pumpkin {
get {
object obj = ResourceManager.GetObject("Pumpkin", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap RedstoneLamp {
get {
object obj = ResourceManager.GetObject("RedstoneLamp", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
@ -239,15 +149,5 @@ namespace Matrix_App.Properties {
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap TNT {
get {
object obj = ResourceManager.GetObject("TNT", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
}
}

View File

@ -145,35 +145,4 @@
<data name="Pfüsikuh" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Splashcreen.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="DiamondOre" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\resources\diamond-ore.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="GrassBlock" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\resources\grass-block.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="Pumpkin" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\resources\pumpkin.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="RedstoneLamp" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\resources\redstone-lamp.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="TNT" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\resources\tnt.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="BlueWool" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\resources\wool.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="CommandBlock" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\resources\command-block.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="CreeperHead" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\resources\creeper-head.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="EmeraldBlock" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\resources\emerald-block.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="EndermanHead" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\resources\enderman-head.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
</root>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 245 KiB

After

Width:  |  Height:  |  Size: 241 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 694 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 609 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 499 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 740 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 194 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 650 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 703 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 880 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 331 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 769 B

View File

@ -1,7 +1,6 @@
using System.Collections.Generic;
using System.Threading;
namespace Matrix_App
{
public class ThreadQueue
@ -35,40 +34,35 @@ namespace Matrix_App
{
while(running)
{
lock (taskQueue)
Task? task = null;
lock(taskQueue)
{
working = taskQueue.Count > 0;
if (taskQueue.Count > 0)
{
working = true;
task = taskQueue.Dequeue();
}
else
{
working = false;
}
}
if (working)
if (task != null)
{
running = task();
} else
{
try
{
Task task;
lock (taskQueue)
{
task = taskQueue.Dequeue();
}
running = task();
lock (taskQueue)
{
working = taskQueue.Count > 0;
}
Thread.Sleep(10);
} catch(ThreadInterruptedException)
{
thread.Interrupt();
running = false;
}
}
else
{
lock (taskQueue)
{
Monitor.Wait(taskQueue);
}
}
}
}
@ -76,13 +70,11 @@ namespace Matrix_App
{
lock (taskQueue)
{
if (taskQueue.Count >= capacity)
return;
Monitor.Pulse(taskQueue);
working = true;
taskQueue.Enqueue(task);
if (taskQueue.Count < capacity)
{
taskQueue.Enqueue(task);
working = true;
}
}
}
@ -93,15 +85,10 @@ namespace Matrix_App
public void Stop()
{
lock (taskQueue)
{
Monitor.Pulse(taskQueue);
}
running = false;
thread.Interrupt();
thread.Join(100);
thread.Join(1500);
}
}
}

View File

@ -5,7 +5,7 @@ using static Matrix_App.Defaults;
namespace Matrix_App
{
public static class Utils
public sealed class Utils
{
/// <summary>
/// Resizes and image to the specified size in pixels.
@ -23,17 +23,20 @@ namespace Matrix_App
destImage.SetResolution(image.HorizontalResolution, image.VerticalResolution);
using var graphics = Graphics.FromImage(destImage);
graphics.CompositingMode = CompositingMode.SourceCopy;
graphics.CompositingQuality = CompositingQuality.HighQuality;
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphics.SmoothingMode = SmoothingMode.HighQuality;
graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
using var wrapMode = new ImageAttributes();
wrapMode.SetWrapMode(WrapMode.TileFlipXY);
graphics.DrawImage(image, destRect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, wrapMode);
using (var graphics = Graphics.FromImage(destImage))
{
graphics.CompositingMode = CompositingMode.SourceCopy;
graphics.CompositingQuality = CompositingQuality.HighQuality;
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphics.SmoothingMode = SmoothingMode.HighQuality;
graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
using (var wrapMode = new ImageAttributes())
{
wrapMode.SetWrapMode(WrapMode.TileFlipXY);
graphics.DrawImage(image, destRect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, wrapMode);
}
}
return destImage;
}
@ -42,14 +45,15 @@ namespace Matrix_App
/// </summary>
/// <param name="source"></param>
/// <param name="dest"></param>
public static void ColorStore(byte[][] source, byte[][] dest)
public static void FlipColorStoreRG_GR(byte[][] source, byte[][] dest)
{
for (var f = 0; f < source.Length; f++)
for (int f = 0; f < dest.Length; f++)
{
for (var x = 0; x < source[0].Length; x += 3)
for (int x = 0; x < dest[0].Length; x += 3)
{
dest[f][x + 0] = source[f][x + 0];
dest[f][x + 1] = source[f][x + 1];
// flip r, g
dest[f][x + 0] = source[f][x + 1];
dest[f][x + 1] = source[f][x + 0];
dest[f][x + 2] = source[f][x + 2];
}
}
@ -66,11 +70,11 @@ namespace Matrix_App
{
var image = new Bitmap(width, height);
for (var x = 0; x < width; x++)
for (int x = 0; x < width; x++)
{
for (var y = 0; y < height; y++)
for (int y = 0; y < height; y++)
{
var index = (x + y * width) * Bpp;
int index = (x + y * width) * Bpp;
image.SetPixel(x, y, Color.FromArgb(
buffer[index + 0],
@ -94,7 +98,7 @@ namespace Matrix_App
{
byte[][] bytes = new byte[frames][];
for (var frame = 0; frame < frames; frame++)
for (int frame = 0; frame < frames; frame++)
{
bytes[frame] = new byte[width * height * Bpp];
}

View File

@ -1,252 +0,0 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO.Ports;
using System.Security.Permissions;
using System.Threading;
using static Matrix_App.Defaults;
namespace Matrix_App.adds
{
public class PortCommandQueue
{
private const string ThreadDeliverName = "Arduino Port Deliver Thread";
private readonly Queue<byte[]> byteWriteQueue = new();
private readonly Queue<byte> statusByteQueue = new();
private readonly Thread portDeliverThread;
private readonly SerialPort tx;
private bool running;
private volatile bool kill;
private volatile bool isPortValid;
private readonly byte[] received = new byte[ArduinoReceiveBufferSize];
private int mark;
private volatile bool synchronized;
private bool updateRealtime;
public PortCommandQueue(ref SerialPort tx)
{
this.tx = tx;
portDeliverThread = new Thread(ManageQueue) { Name = ThreadDeliverName };
}
private void ManageQueue()
{
try
{
while (!kill)
{
if (!isPortValid) continue;
if (byteWriteQueue.Count <= 0)
{
lock (byteWriteQueue)
{
Monitor.Wait(byteWriteQueue);
}
continue;
}
byte[] bytes;
int statusByte;
lock (byteWriteQueue)
{
bytes = byteWriteQueue.Dequeue();
statusByte = statusByteQueue.Dequeue();
}
lock (tx)
{
var success = false;
var tryCounter = 0;
do
{
try
{
tx.Write(bytes, 0, bytes.Length);
var b = ArduinoErrorByte;
var errorFlag = false;
mark = 0;
while (!errorFlag && (b = tx.ReadByte()) != statusByte)
{
received[mark++] = (byte) b;
errorFlag = b == ArduinoErrorByte;
}
synchronized = b == ArduinoSynchronizationByte;
success = !errorFlag;
Debug.WriteLine("===================> Com Success !");
}
catch (Exception e)
{
Debug.WriteLine("=============================> ERROR <=================================");
Debug.WriteLine(e.Message);
}
tryCounter++;
} while (!success && tryCounter < 3);
}
}
}
catch (ThreadInterruptedException)
{
Thread.CurrentThread.Interrupt();
}
}
[SecurityPermission(SecurityAction.Demand, ControlThread = true)]
public void Close()
{
try
{
if (!running) return;
kill = true;
portDeliverThread.Interrupt();
portDeliverThread.Join(1000);
}
catch (ThreadStartException)
{
// omit
}
catch (ThreadInterruptedException)
{
// omit
}
finally
{
if (tx.IsOpen)
{
tx.Close();
}
}
}
private void EnqueueArduinoCommand(params byte[] bytes)
{
if (!updateRealtime && bytes[0] != ArduinoInstruction.OpcodeScale &&
bytes[0] != ArduinoInstruction.OpcodePush)
return;
if (!running)
{
running = true;
portDeliverThread.Start();
}
lock (byteWriteQueue)
{
Monitor.Pulse(byteWriteQueue);
if (byteWriteQueue.Count >= ArduinoCommandQueueSize) return;
lock (byteWriteQueue)
{
byteWriteQueue.Enqueue(bytes);
}
}
}
public void EnqueueArduinoCommand(byte opcode, params byte[] data)
{
byte[] wrapper = new byte[data.Length + 1];
Buffer.BlockCopy(data, 0, wrapper, 1, data.Length);
wrapper[0] = opcode;
statusByteQueue.Enqueue(ArduinoSuccessByte);
EnqueueArduinoCommand(wrapper);
}
public void DequeueAll()
{
lock (byteWriteQueue)
{
byteWriteQueue.Clear();
}
}
public static void WaitForLastDequeue()
{
var timeCount = 0;
var wait = true;
while(wait)
{
timeCount++;
Thread.Sleep(500);
wait = timeCount == DequeueWaitTimeoutCounter;
}
}
public byte[] GetLastData()
{
return received;
}
public void ValidatePort()
{
try
{
if (!tx.IsOpen)
{
tx.Open();
isPortValid = true;
}
}
catch (Exception e)
{
isPortValid = false;
Debug.WriteLine("Failed opening port: " + e.Message);
}
}
public void InvalidatePort()
{
isPortValid = false;
tx.Close();
}
/// <summary>
/// Returns last location of written byte in the received buffer.
/// Call clears the mark. Any other call will return 0, unless the mark has been
/// altered by reading new data from the serial port.
/// </summary>
/// <returns></returns>
public int GetMark()
{
var tmp = mark;
mark = 0;
return tmp;
}
public void EnqueueArduinoCommandSynchronized(byte[] bytes)
{
statusByteQueue.Enqueue(ArduinoSynchronizationByte);
EnqueueArduinoCommand(bytes);
while (!synchronized)
{
}
Debug.WriteLine("======================> Synchronized!");
synchronized = false;
}
public void SetRealtimeUpdates(bool @checked)
{
updateRealtime = @checked;
}
public bool GetRealtimeUpdates()
{
return updateRealtime;
}
}
}

View File

@ -8,117 +8,32 @@
".NETCoreApp,Version=v3.1": {
"Matrix App/1.0.0": {
"dependencies": {
"Bluetooth": "1.0.0.2",
"System.Drawing.Common": "5.0.2",
"System.IO.Ports": "6.0.0-preview.5.21301.5",
"System.IO.Ports": "4.4.0",
"System.Management": "5.0.0"
},
"runtime": {
"Matrix App.dll": {}
}
},
"Bluetooth/1.0.0.2": {
"dependencies": {
"Microsoft.Windows.SDK.Contracts": "10.0.19041.1",
"System.Runtime.InteropServices.WindowsRuntime": "4.3.0",
"System.Runtime.WindowsRuntime": "4.7.0"
},
"runtime": {
"lib/netstandard2.0/Bluetooth.dll": {
"assemblyVersion": "1.0.0.2",
"fileVersion": "1.0.0.2"
}
}
},
"Microsoft.NETCore.Platforms/5.0.0": {},
"Microsoft.NETCore.Targets/1.1.0": {},
"Microsoft.Win32.Registry/6.0.0-preview.5.21301.5": {
"Microsoft.Win32.Registry/5.0.0": {
"dependencies": {
"System.Security.AccessControl": "6.0.0-preview.5.21301.5",
"System.Security.Principal.Windows": "6.0.0-preview.5.21301.5"
"System.Security.AccessControl": "5.0.0",
"System.Security.Principal.Windows": "5.0.0"
},
"runtime": {
"lib/netstandard2.0/Microsoft.Win32.Registry.dll": {
"assemblyVersion": "6.0.0.0",
"fileVersion": "6.0.21.30105"
"assemblyVersion": "5.0.0.0",
"fileVersion": "5.0.20.51904"
}
},
"runtimeTargets": {
"runtimes/win/lib/netstandard2.0/Microsoft.Win32.Registry.dll": {
"rid": "win",
"assetType": "runtime",
"assemblyVersion": "6.0.0.0",
"fileVersion": "6.0.21.30105"
}
}
},
"Microsoft.Win32.SystemEvents/5.0.0": {
"dependencies": {
"Microsoft.NETCore.Platforms": "5.0.0"
},
"runtime": {
"lib/netstandard2.0/Microsoft.Win32.SystemEvents.dll": {
"assemblyVersion": "5.0.0.0",
"fileVersion": "5.0.20.51904"
}
},
"runtimeTargets": {
"runtimes/win/lib/netcoreapp3.0/Microsoft.Win32.SystemEvents.dll": {
"rid": "win",
"assetType": "runtime",
"assemblyVersion": "5.0.0.0",
"fileVersion": "5.0.20.51904"
}
}
},
"Microsoft.Windows.SDK.Contracts/10.0.19041.1": {
"dependencies": {
"System.Runtime.WindowsRuntime": "4.7.0",
"System.Runtime.WindowsRuntime.UI.Xaml": "4.6.0"
}
},
"runtime.linux-arm.runtime.native.System.IO.Ports/6.0.0-preview.5.21301.5": {
"runtimeTargets": {
"runtimes/linux-arm/native/libSystem.IO.Ports.Native.so": {
"rid": "linux-arm",
"assetType": "native",
"fileVersion": "0.0.0.0"
}
}
},
"runtime.linux-arm64.runtime.native.System.IO.Ports/6.0.0-preview.5.21301.5": {
"runtimeTargets": {
"runtimes/linux-arm64/native/libSystem.IO.Ports.Native.so": {
"rid": "linux-arm64",
"assetType": "native",
"fileVersion": "0.0.0.0"
}
}
},
"runtime.linux-x64.runtime.native.System.IO.Ports/6.0.0-preview.5.21301.5": {
"runtimeTargets": {
"runtimes/linux-x64/native/libSystem.IO.Ports.Native.so": {
"rid": "linux-x64",
"assetType": "native",
"fileVersion": "0.0.0.0"
}
}
},
"runtime.native.System.IO.Ports/6.0.0-preview.5.21301.5": {
"dependencies": {
"runtime.linux-arm.runtime.native.System.IO.Ports": "6.0.0-preview.5.21301.5",
"runtime.linux-arm64.runtime.native.System.IO.Ports": "6.0.0-preview.5.21301.5",
"runtime.linux-x64.runtime.native.System.IO.Ports": "6.0.0-preview.5.21301.5",
"runtime.osx-x64.runtime.native.System.IO.Ports": "6.0.0-preview.5.21301.5"
}
},
"runtime.osx-x64.runtime.native.System.IO.Ports/6.0.0-preview.5.21301.5": {
"runtimeTargets": {
"runtimes/osx-x64/native/libSystem.IO.Ports.Native.dylib": {
"rid": "osx-x64",
"assetType": "native",
"fileVersion": "0.0.0.0"
}
}
},
"System.CodeDom/5.0.0": {
@ -129,67 +44,29 @@
}
}
},
"System.Drawing.Common/5.0.2": {
"System.IO.Ports/4.4.0": {
"dependencies": {
"Microsoft.Win32.SystemEvents": "5.0.0"
},
"runtime": {
"lib/netcoreapp3.0/System.Drawing.Common.dll": {
"assemblyVersion": "5.0.0.2",
"fileVersion": "5.0.421.11614"
}
},
"runtimeTargets": {
"runtimes/unix/lib/netcoreapp3.0/System.Drawing.Common.dll": {
"rid": "unix",
"assetType": "runtime",
"assemblyVersion": "5.0.0.2",
"fileVersion": "5.0.421.11614"
},
"runtimes/win/lib/netcoreapp3.0/System.Drawing.Common.dll": {
"rid": "win",
"assetType": "runtime",
"assemblyVersion": "5.0.0.2",
"fileVersion": "5.0.421.11614"
}
}
},
"System.IO.Ports/6.0.0-preview.5.21301.5": {
"dependencies": {
"Microsoft.Win32.Registry": "6.0.0-preview.5.21301.5",
"runtime.native.System.IO.Ports": "6.0.0-preview.5.21301.5"
"Microsoft.Win32.Registry": "5.0.0"
},
"runtime": {
"lib/netstandard2.0/System.IO.Ports.dll": {
"assemblyVersion": "6.0.0.0",
"fileVersion": "6.0.21.30105"
"assemblyVersion": "4.0.0.0",
"fileVersion": "4.6.25519.3"
}
},
"runtimeTargets": {
"runtimes/linux/lib/netstandard2.0/System.IO.Ports.dll": {
"rid": "linux",
"assetType": "runtime",
"assemblyVersion": "6.0.0.0",
"fileVersion": "6.0.21.30105"
},
"runtimes/osx/lib/netstandard2.0/System.IO.Ports.dll": {
"rid": "osx",
"assetType": "runtime",
"assemblyVersion": "6.0.0.0",
"fileVersion": "6.0.21.30105"
},
"runtimes/win/lib/netstandard2.0/System.IO.Ports.dll": {
"rid": "win",
"assetType": "runtime",
"assemblyVersion": "6.0.0.0",
"fileVersion": "6.0.21.30105"
"assemblyVersion": "4.0.0.0",
"fileVersion": "4.6.25519.3"
}
}
},
"System.Management/5.0.0": {
"dependencies": {
"Microsoft.NETCore.Platforms": "5.0.0",
"Microsoft.Win32.Registry": "6.0.0-preview.5.21301.5",
"Microsoft.Win32.Registry": "5.0.0",
"System.CodeDom": "5.0.0"
},
"runtime": {
@ -207,66 +84,45 @@
}
}
},
"System.Runtime/4.3.0": {
"System.Security.AccessControl/5.0.0": {
"dependencies": {
"Microsoft.NETCore.Platforms": "5.0.0",
"Microsoft.NETCore.Targets": "1.1.0"
}
},
"System.Runtime.InteropServices.WindowsRuntime/4.3.0": {
"dependencies": {
"System.Runtime": "4.3.0"
}
},
"System.Runtime.WindowsRuntime/4.7.0": {
"dependencies": {
"Microsoft.NETCore.Platforms": "5.0.0"
}
},
"System.Runtime.WindowsRuntime.UI.Xaml/4.6.0": {
"dependencies": {
"Microsoft.NETCore.Platforms": "5.0.0",
"System.Runtime.WindowsRuntime": "4.7.0"
}
},
"System.Security.AccessControl/6.0.0-preview.5.21301.5": {
"dependencies": {
"System.Security.Principal.Windows": "6.0.0-preview.5.21301.5"
"System.Security.Principal.Windows": "5.0.0"
},
"runtime": {
"lib/netstandard2.0/System.Security.AccessControl.dll": {
"assemblyVersion": "6.0.0.0",
"fileVersion": "6.0.21.30105"
"assemblyVersion": "5.0.0.0",
"fileVersion": "5.0.20.51904"
}
},
"runtimeTargets": {
"runtimes/win/lib/netstandard2.0/System.Security.AccessControl.dll": {
"runtimes/win/lib/netcoreapp2.0/System.Security.AccessControl.dll": {
"rid": "win",
"assetType": "runtime",
"assemblyVersion": "6.0.0.0",
"fileVersion": "6.0.21.30105"
"assemblyVersion": "5.0.0.0",
"fileVersion": "5.0.20.51904"
}
}
},
"System.Security.Principal.Windows/6.0.0-preview.5.21301.5": {
"System.Security.Principal.Windows/5.0.0": {
"runtime": {
"lib/netstandard2.0/System.Security.Principal.Windows.dll": {
"assemblyVersion": "6.0.0.0",
"fileVersion": "6.0.21.30105"
"assemblyVersion": "5.0.0.0",
"fileVersion": "5.0.20.51904"
}
},
"runtimeTargets": {
"runtimes/unix/lib/netcoreapp2.1/System.Security.Principal.Windows.dll": {
"rid": "unix",
"assetType": "runtime",
"assemblyVersion": "6.0.0.0",
"fileVersion": "6.0.21.30105"
"assemblyVersion": "5.0.0.0",
"fileVersion": "5.0.20.51904"
},
"runtimes/win/lib/netcoreapp2.1/System.Security.Principal.Windows.dll": {
"rid": "win",
"assetType": "runtime",
"assemblyVersion": "6.0.0.0",
"fileVersion": "6.0.21.30105"
"assemblyVersion": "5.0.0.0",
"fileVersion": "5.0.20.51904"
}
}
}
@ -278,13 +134,6 @@
"serviceable": false,
"sha512": ""
},
"Bluetooth/1.0.0.2": {
"type": "package",
"serviceable": true,
"sha512": "sha512-dI5MtUEkDm2L81kHFeofWkpOvq7Yn2iNVl8dKa+DIeXhqHb9LrBSH7LpmaNOlZMLwQFDKageUpxV0w39GMeUag==",
"path": "bluetooth/1.0.0.2",
"hashPath": "bluetooth.1.0.0.2.nupkg.sha512"
},
"Microsoft.NETCore.Platforms/5.0.0": {
"type": "package",
"serviceable": true,
@ -292,68 +141,12 @@
"path": "microsoft.netcore.platforms/5.0.0",
"hashPath": "microsoft.netcore.platforms.5.0.0.nupkg.sha512"
},
"Microsoft.NETCore.Targets/1.1.0": {
"Microsoft.Win32.Registry/5.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==",
"path": "microsoft.netcore.targets/1.1.0",
"hashPath": "microsoft.netcore.targets.1.1.0.nupkg.sha512"
},
"Microsoft.Win32.Registry/6.0.0-preview.5.21301.5": {
"type": "package",
"serviceable": true,
"sha512": "sha512-qYLtJIAEJJmY2vXxlVO8x4uXfgq7DFOHjpmnHlLm7kmAvyNFckYY/Dx5CZythBXvI2/7sratbIGKqSTysfgZ8A==",
"path": "microsoft.win32.registry/6.0.0-preview.5.21301.5",
"hashPath": "microsoft.win32.registry.6.0.0-preview.5.21301.5.nupkg.sha512"
},
"Microsoft.Win32.SystemEvents/5.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-Bh6blKG8VAKvXiLe2L+sEsn62nc1Ij34MrNxepD2OCrS5cpCwQa9MeLyhVQPQ/R4Wlzwuy6wMK8hLb11QPDRsQ==",
"path": "microsoft.win32.systemevents/5.0.0",
"hashPath": "microsoft.win32.systemevents.5.0.0.nupkg.sha512"
},
"Microsoft.Windows.SDK.Contracts/10.0.19041.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-sgDwuoyubbLFNJR/BINbvfSNRiglF91D+Q0uEAkU4ZTO5Hgbnu8+gA4TCc65S56e1kK7gvR1+H4kphkDTr+9bw==",
"path": "microsoft.windows.sdk.contracts/10.0.19041.1",
"hashPath": "microsoft.windows.sdk.contracts.10.0.19041.1.nupkg.sha512"
},
"runtime.linux-arm.runtime.native.System.IO.Ports/6.0.0-preview.5.21301.5": {
"type": "package",
"serviceable": true,
"sha512": "sha512-VlGxrS0KZuoXA2zP/4JtcsnAUr66ivzLj2TdwXcaQ2vKTFOq9wCz7xYh08KvZVWXJKthpzhS+lWtdw/9vbVlgg==",
"path": "runtime.linux-arm.runtime.native.system.io.ports/6.0.0-preview.5.21301.5",
"hashPath": "runtime.linux-arm.runtime.native.system.io.ports.6.0.0-preview.5.21301.5.nupkg.sha512"
},
"runtime.linux-arm64.runtime.native.System.IO.Ports/6.0.0-preview.5.21301.5": {
"type": "package",
"serviceable": true,
"sha512": "sha512-fN2ienMgX5Gl8rmmmTkCxEBeN+KMEwHkTIE+4bHIH0sgPZJqrGV7o7sjjivZlv95L64cF+a4UVlxGqiMVEN6Nw==",
"path": "runtime.linux-arm64.runtime.native.system.io.ports/6.0.0-preview.5.21301.5",
"hashPath": "runtime.linux-arm64.runtime.native.system.io.ports.6.0.0-preview.5.21301.5.nupkg.sha512"
},
"runtime.linux-x64.runtime.native.System.IO.Ports/6.0.0-preview.5.21301.5": {
"type": "package",
"serviceable": true,
"sha512": "sha512-wLbxixueLlN1bT3tHi4bnXhyp2tuyJ92TBBBwW01YS4isxkLr8o4f2AGw8YbsF4y2Fgx8RRQiipkG1EFrZ7AKg==",
"path": "runtime.linux-x64.runtime.native.system.io.ports/6.0.0-preview.5.21301.5",
"hashPath": "runtime.linux-x64.runtime.native.system.io.ports.6.0.0-preview.5.21301.5.nupkg.sha512"
},
"runtime.native.System.IO.Ports/6.0.0-preview.5.21301.5": {
"type": "package",
"serviceable": true,
"sha512": "sha512-9Int9JpQ3quVnY3nsUFmrcanozIrEMFAydF+v8KmDwh0CtPb2AZLyyRtNEC3Z1WmoF8qf+T7jWwuPlrfl338dw==",
"path": "runtime.native.system.io.ports/6.0.0-preview.5.21301.5",
"hashPath": "runtime.native.system.io.ports.6.0.0-preview.5.21301.5.nupkg.sha512"
},
"runtime.osx-x64.runtime.native.System.IO.Ports/6.0.0-preview.5.21301.5": {
"type": "package",
"serviceable": true,
"sha512": "sha512-IhXEnQFgPxM/pUkEJkFBkr6XBkWFiuMGLlyl5BDG7LkJuGX4jAxJwL6n9Pue88ZyV45c0ajvuZOBnZJap+uIKA==",
"path": "runtime.osx-x64.runtime.native.system.io.ports/6.0.0-preview.5.21301.5",
"hashPath": "runtime.osx-x64.runtime.native.system.io.ports.6.0.0-preview.5.21301.5.nupkg.sha512"
"sha512": "sha512-dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==",
"path": "microsoft.win32.registry/5.0.0",
"hashPath": "microsoft.win32.registry.5.0.0.nupkg.sha512"
},
"System.CodeDom/5.0.0": {
"type": "package",
@ -362,19 +155,12 @@
"path": "system.codedom/5.0.0",
"hashPath": "system.codedom.5.0.0.nupkg.sha512"
},
"System.Drawing.Common/5.0.2": {
"System.IO.Ports/4.4.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-rvr/M1WPf24ljpvvrVd74+NdjRUJu1bBkspkZcnzSZnmAUQWSvanlQ0k/hVHk+cHufZbZfu7vOh/vYc0q5Uu/A==",
"path": "system.drawing.common/5.0.2",
"hashPath": "system.drawing.common.5.0.2.nupkg.sha512"
},
"System.IO.Ports/6.0.0-preview.5.21301.5": {
"type": "package",
"serviceable": true,
"sha512": "sha512-9jguTG3uxGLvERVKV6w8ctcaYktBv8ssZgl6xm1hI89BBIaU6WwC2SQt9ur+TT8UMxdu9ZG+QQMbCJKEKv9dnQ==",
"path": "system.io.ports/6.0.0-preview.5.21301.5",
"hashPath": "system.io.ports.6.0.0-preview.5.21301.5.nupkg.sha512"
"sha512": "sha512-izaIWbjFZdik3ypDuA6GWj6fabhB+tR5M7QLcvAqd+I+VjI8UWoVZkh68Ao8Vf8poWWrCU875r3HQZnQW6a7GA==",
"path": "system.io.ports/4.4.0",
"hashPath": "system.io.ports.4.4.0.nupkg.sha512"
},
"System.Management/5.0.0": {
"type": "package",
@ -383,47 +169,19 @@
"path": "system.management/5.0.0",
"hashPath": "system.management.5.0.0.nupkg.sha512"
},
"System.Runtime/4.3.0": {
"System.Security.AccessControl/5.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==",
"path": "system.runtime/4.3.0",
"hashPath": "system.runtime.4.3.0.nupkg.sha512"
"sha512": "sha512-dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==",
"path": "system.security.accesscontrol/5.0.0",
"hashPath": "system.security.accesscontrol.5.0.0.nupkg.sha512"
},
"System.Runtime.InteropServices.WindowsRuntime/4.3.0": {
"System.Security.Principal.Windows/5.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-J4GUi3xZQLUBasNwZnjrffN8i5wpHrBtZoLG+OhRyGo/+YunMRWWtwoMDlUAIdmX0uRfpHIBDSV6zyr3yf00TA==",
"path": "system.runtime.interopservices.windowsruntime/4.3.0",
"hashPath": "system.runtime.interopservices.windowsruntime.4.3.0.nupkg.sha512"
},
"System.Runtime.WindowsRuntime/4.7.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-RQxUkf37fp7MSWbOfKRjUjyudyfZb2u79YY5i1s+d7vuD80A7kmr2YfefO0JprQUhanxSm8bhXigCVfX2kEh+w==",
"path": "system.runtime.windowsruntime/4.7.0",
"hashPath": "system.runtime.windowsruntime.4.7.0.nupkg.sha512"
},
"System.Runtime.WindowsRuntime.UI.Xaml/4.6.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-r4tNw5v5kqRJ9HikWpcyNf3suGw7DjX93svj9iBjtdeLqL8jt9Z+7f+s4wrKZJr84u8IMsrIjt8K6jYvkRqMSg==",
"path": "system.runtime.windowsruntime.ui.xaml/4.6.0",
"hashPath": "system.runtime.windowsruntime.ui.xaml.4.6.0.nupkg.sha512"
},
"System.Security.AccessControl/6.0.0-preview.5.21301.5": {
"type": "package",
"serviceable": true,
"sha512": "sha512-EA9ul7nGN8oggMvloILnR+wnrbgLNZZQBYHq5nEq/ixwnKLV3M3Tbd1Jbj8oGck3XMj0owq81e4Jxp3s0IMICw==",
"path": "system.security.accesscontrol/6.0.0-preview.5.21301.5",
"hashPath": "system.security.accesscontrol.6.0.0-preview.5.21301.5.nupkg.sha512"
},
"System.Security.Principal.Windows/6.0.0-preview.5.21301.5": {
"type": "package",
"serviceable": true,
"sha512": "sha512-ywwCqFAaRVbgqqORqYg8jdaX6NUEpzbuhxyUhAs+7mZ8AFAO4PzFYrZ5JPkYejXwougDldtbi0zOkk1lLzugLw==",
"path": "system.security.principal.windows/6.0.0-preview.5.21301.5",
"hashPath": "system.security.principal.windows.6.0.0-preview.5.21301.5.nupkg.sha512"
"sha512": "sha512-t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==",
"path": "system.security.principal.windows/5.0.0",
"hashPath": "system.security.principal.windows.5.0.0.nupkg.sha512"
}
}
}

View File

@ -1,8 +1,8 @@
{
"runtimeOptions": {
"additionalProbingPaths": [
"C:\\Users\\Besitzer\\.dotnet\\store\\|arch|\\|tfm|",
"C:\\Users\\Besitzer\\.nuget\\packages"
"C:\\Users\\SvenV\\.dotnet\\store\\|arch|\\|tfm|",
"C:\\Users\\SvenV\\.nuget\\packages"
]
}
}

View File

@ -0,0 +1,187 @@
{
"runtimeTarget": {
"name": ".NETCoreApp,Version=v3.1",
"signature": ""
},
"compilationOptions": {},
"targets": {
".NETCoreApp,Version=v3.1": {
"Matrix App/1.0.0": {
"dependencies": {
"System.IO.Ports": "4.4.0",
"System.Management": "5.0.0"
},
"runtime": {
"Matrix App.dll": {}
}
},
"Microsoft.NETCore.Platforms/5.0.0": {},
"Microsoft.Win32.Registry/5.0.0": {
"dependencies": {
"System.Security.AccessControl": "5.0.0",
"System.Security.Principal.Windows": "5.0.0"
},
"runtime": {
"lib/netstandard2.0/Microsoft.Win32.Registry.dll": {
"assemblyVersion": "5.0.0.0",
"fileVersion": "5.0.20.51904"
}
},
"runtimeTargets": {
"runtimes/win/lib/netstandard2.0/Microsoft.Win32.Registry.dll": {
"rid": "win",
"assetType": "runtime",
"assemblyVersion": "5.0.0.0",
"fileVersion": "5.0.20.51904"
}
}
},
"System.CodeDom/5.0.0": {
"runtime": {
"lib/netstandard2.0/System.CodeDom.dll": {
"assemblyVersion": "5.0.0.0",
"fileVersion": "5.0.20.51904"
}
}
},
"System.IO.Ports/4.4.0": {
"dependencies": {
"Microsoft.Win32.Registry": "5.0.0"
},
"runtime": {
"lib/netstandard2.0/System.IO.Ports.dll": {
"assemblyVersion": "4.0.0.0",
"fileVersion": "4.6.25519.3"
}
},
"runtimeTargets": {
"runtimes/win/lib/netstandard2.0/System.IO.Ports.dll": {
"rid": "win",
"assetType": "runtime",
"assemblyVersion": "4.0.0.0",
"fileVersion": "4.6.25519.3"
}
}
},
"System.Management/5.0.0": {
"dependencies": {
"Microsoft.NETCore.Platforms": "5.0.0",
"Microsoft.Win32.Registry": "5.0.0",
"System.CodeDom": "5.0.0"
},
"runtime": {
"lib/netstandard2.0/System.Management.dll": {
"assemblyVersion": "4.0.0.0",
"fileVersion": "5.0.20.51904"
}
},
"runtimeTargets": {
"runtimes/win/lib/netcoreapp2.0/System.Management.dll": {
"rid": "win",
"assetType": "runtime",
"assemblyVersion": "4.0.0.0",
"fileVersion": "5.0.20.51904"
}
}
},
"System.Security.AccessControl/5.0.0": {
"dependencies": {
"Microsoft.NETCore.Platforms": "5.0.0",
"System.Security.Principal.Windows": "5.0.0"
},
"runtime": {
"lib/netstandard2.0/System.Security.AccessControl.dll": {
"assemblyVersion": "5.0.0.0",
"fileVersion": "5.0.20.51904"
}
},
"runtimeTargets": {
"runtimes/win/lib/netcoreapp2.0/System.Security.AccessControl.dll": {
"rid": "win",
"assetType": "runtime",
"assemblyVersion": "5.0.0.0",
"fileVersion": "5.0.20.51904"
}
}
},
"System.Security.Principal.Windows/5.0.0": {
"runtime": {
"lib/netstandard2.0/System.Security.Principal.Windows.dll": {
"assemblyVersion": "5.0.0.0",
"fileVersion": "5.0.20.51904"
}
},
"runtimeTargets": {
"runtimes/unix/lib/netcoreapp2.1/System.Security.Principal.Windows.dll": {
"rid": "unix",
"assetType": "runtime",
"assemblyVersion": "5.0.0.0",
"fileVersion": "5.0.20.51904"
},
"runtimes/win/lib/netcoreapp2.1/System.Security.Principal.Windows.dll": {
"rid": "win",
"assetType": "runtime",
"assemblyVersion": "5.0.0.0",
"fileVersion": "5.0.20.51904"
}
}
}
}
},
"libraries": {
"Matrix App/1.0.0": {
"type": "project",
"serviceable": false,
"sha512": ""
},
"Microsoft.NETCore.Platforms/5.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ==",
"path": "microsoft.netcore.platforms/5.0.0",
"hashPath": "microsoft.netcore.platforms.5.0.0.nupkg.sha512"
},
"Microsoft.Win32.Registry/5.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==",
"path": "microsoft.win32.registry/5.0.0",
"hashPath": "microsoft.win32.registry.5.0.0.nupkg.sha512"
},
"System.CodeDom/5.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-JPJArwA1kdj8qDAkY2XGjSWoYnqiM7q/3yRNkt6n28Mnn95MuEGkZXUbPBf7qc3IjwrGY5ttQon7yqHZyQJmOQ==",
"path": "system.codedom/5.0.0",
"hashPath": "system.codedom.5.0.0.nupkg.sha512"
},
"System.IO.Ports/4.4.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-izaIWbjFZdik3ypDuA6GWj6fabhB+tR5M7QLcvAqd+I+VjI8UWoVZkh68Ao8Vf8poWWrCU875r3HQZnQW6a7GA==",
"path": "system.io.ports/4.4.0",
"hashPath": "system.io.ports.4.4.0.nupkg.sha512"
},
"System.Management/5.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-MF1CHaRcC+MLFdnDthv4/bKWBZnlnSpkGqa87pKukQefgEdwtb9zFW6zs0GjPp73qtpYYg4q6PEKbzJbxCpKfw==",
"path": "system.management/5.0.0",
"hashPath": "system.management.5.0.0.nupkg.sha512"
},
"System.Security.AccessControl/5.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==",
"path": "system.security.accesscontrol/5.0.0",
"hashPath": "system.security.accesscontrol.5.0.0.nupkg.sha512"
},
"System.Security.Principal.Windows/5.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==",
"path": "system.security.principal.windows/5.0.0",
"hashPath": "system.security.principal.windows.5.0.0.nupkg.sha512"
}
}
}

Binary file not shown.

View File

@ -1,278 +0,0 @@
{
"runtimeTarget": {
"name": ".NETCoreApp,Version=v3.1",
"signature": ""
},
"compilationOptions": {},
"targets": {
".NETCoreApp,Version=v3.1": {
"Matrix App/1.0.0": {
"dependencies": {
"System.IO.Ports": "6.0.0-preview.5.21301.5",
"System.Management": "5.0.0"
},
"runtime": {
"Matrix App.dll": {}
}
},
"Microsoft.NETCore.Platforms/5.0.0": {},
"Microsoft.Win32.Registry/6.0.0-preview.5.21301.5": {
"dependencies": {
"System.Security.AccessControl": "6.0.0-preview.5.21301.5",
"System.Security.Principal.Windows": "6.0.0-preview.5.21301.5"
},
"runtime": {
"lib/netstandard2.0/Microsoft.Win32.Registry.dll": {
"assemblyVersion": "6.0.0.0",
"fileVersion": "6.0.21.30105"
}
},
"runtimeTargets": {
"runtimes/win/lib/netstandard2.0/Microsoft.Win32.Registry.dll": {
"rid": "win",
"assetType": "runtime",
"assemblyVersion": "6.0.0.0",
"fileVersion": "6.0.21.30105"
}
}
},
"runtime.linux-arm.runtime.native.System.IO.Ports/6.0.0-preview.5.21301.5": {
"runtimeTargets": {
"runtimes/linux-arm/native/libSystem.IO.Ports.Native.so": {
"rid": "linux-arm",
"assetType": "native",
"fileVersion": "0.0.0.0"
}
}
},
"runtime.linux-arm64.runtime.native.System.IO.Ports/6.0.0-preview.5.21301.5": {
"runtimeTargets": {
"runtimes/linux-arm64/native/libSystem.IO.Ports.Native.so": {
"rid": "linux-arm64",
"assetType": "native",
"fileVersion": "0.0.0.0"
}
}
},
"runtime.linux-x64.runtime.native.System.IO.Ports/6.0.0-preview.5.21301.5": {
"runtimeTargets": {
"runtimes/linux-x64/native/libSystem.IO.Ports.Native.so": {
"rid": "linux-x64",
"assetType": "native",
"fileVersion": "0.0.0.0"
}
}
},
"runtime.native.System.IO.Ports/6.0.0-preview.5.21301.5": {
"dependencies": {
"runtime.linux-arm.runtime.native.System.IO.Ports": "6.0.0-preview.5.21301.5",
"runtime.linux-arm64.runtime.native.System.IO.Ports": "6.0.0-preview.5.21301.5",
"runtime.linux-x64.runtime.native.System.IO.Ports": "6.0.0-preview.5.21301.5",
"runtime.osx-x64.runtime.native.System.IO.Ports": "6.0.0-preview.5.21301.5"
}
},
"runtime.osx-x64.runtime.native.System.IO.Ports/6.0.0-preview.5.21301.5": {
"runtimeTargets": {
"runtimes/osx-x64/native/libSystem.IO.Ports.Native.dylib": {
"rid": "osx-x64",
"assetType": "native",
"fileVersion": "0.0.0.0"
}
}
},
"System.CodeDom/5.0.0": {
"runtime": {
"lib/netstandard2.0/System.CodeDom.dll": {
"assemblyVersion": "5.0.0.0",
"fileVersion": "5.0.20.51904"
}
}
},
"System.IO.Ports/6.0.0-preview.5.21301.5": {
"dependencies": {
"Microsoft.Win32.Registry": "6.0.0-preview.5.21301.5",
"runtime.native.System.IO.Ports": "6.0.0-preview.5.21301.5"
},
"runtime": {
"lib/netstandard2.0/System.IO.Ports.dll": {
"assemblyVersion": "6.0.0.0",
"fileVersion": "6.0.21.30105"
}
},
"runtimeTargets": {
"runtimes/linux/lib/netstandard2.0/System.IO.Ports.dll": {
"rid": "linux",
"assetType": "runtime",
"assemblyVersion": "6.0.0.0",
"fileVersion": "6.0.21.30105"
},
"runtimes/osx/lib/netstandard2.0/System.IO.Ports.dll": {
"rid": "osx",
"assetType": "runtime",
"assemblyVersion": "6.0.0.0",
"fileVersion": "6.0.21.30105"
},
"runtimes/win/lib/netstandard2.0/System.IO.Ports.dll": {
"rid": "win",
"assetType": "runtime",
"assemblyVersion": "6.0.0.0",
"fileVersion": "6.0.21.30105"
}
}
},
"System.Management/5.0.0": {
"dependencies": {
"Microsoft.NETCore.Platforms": "5.0.0",
"Microsoft.Win32.Registry": "6.0.0-preview.5.21301.5",
"System.CodeDom": "5.0.0"
},
"runtime": {
"lib/netstandard2.0/System.Management.dll": {
"assemblyVersion": "4.0.0.0",
"fileVersion": "5.0.20.51904"
}
},
"runtimeTargets": {
"runtimes/win/lib/netcoreapp2.0/System.Management.dll": {
"rid": "win",
"assetType": "runtime",
"assemblyVersion": "4.0.0.0",
"fileVersion": "5.0.20.51904"
}
}
},
"System.Security.AccessControl/6.0.0-preview.5.21301.5": {
"dependencies": {
"System.Security.Principal.Windows": "6.0.0-preview.5.21301.5"
},
"runtime": {
"lib/netstandard2.0/System.Security.AccessControl.dll": {
"assemblyVersion": "6.0.0.0",
"fileVersion": "6.0.21.30105"
}
},
"runtimeTargets": {
"runtimes/win/lib/netstandard2.0/System.Security.AccessControl.dll": {
"rid": "win",
"assetType": "runtime",
"assemblyVersion": "6.0.0.0",
"fileVersion": "6.0.21.30105"
}
}
},
"System.Security.Principal.Windows/6.0.0-preview.5.21301.5": {
"runtime": {
"lib/netstandard2.0/System.Security.Principal.Windows.dll": {
"assemblyVersion": "6.0.0.0",
"fileVersion": "6.0.21.30105"
}
},
"runtimeTargets": {
"runtimes/unix/lib/netcoreapp2.1/System.Security.Principal.Windows.dll": {
"rid": "unix",
"assetType": "runtime",
"assemblyVersion": "6.0.0.0",
"fileVersion": "6.0.21.30105"
},
"runtimes/win/lib/netcoreapp2.1/System.Security.Principal.Windows.dll": {
"rid": "win",
"assetType": "runtime",
"assemblyVersion": "6.0.0.0",
"fileVersion": "6.0.21.30105"
}
}
}
}
},
"libraries": {
"Matrix App/1.0.0": {
"type": "project",
"serviceable": false,
"sha512": ""
},
"Microsoft.NETCore.Platforms/5.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ==",
"path": "microsoft.netcore.platforms/5.0.0",
"hashPath": "microsoft.netcore.platforms.5.0.0.nupkg.sha512"
},
"Microsoft.Win32.Registry/6.0.0-preview.5.21301.5": {
"type": "package",
"serviceable": true,
"sha512": "sha512-qYLtJIAEJJmY2vXxlVO8x4uXfgq7DFOHjpmnHlLm7kmAvyNFckYY/Dx5CZythBXvI2/7sratbIGKqSTysfgZ8A==",
"path": "microsoft.win32.registry/6.0.0-preview.5.21301.5",
"hashPath": "microsoft.win32.registry.6.0.0-preview.5.21301.5.nupkg.sha512"
},
"runtime.linux-arm.runtime.native.System.IO.Ports/6.0.0-preview.5.21301.5": {
"type": "package",
"serviceable": true,
"sha512": "sha512-VlGxrS0KZuoXA2zP/4JtcsnAUr66ivzLj2TdwXcaQ2vKTFOq9wCz7xYh08KvZVWXJKthpzhS+lWtdw/9vbVlgg==",
"path": "runtime.linux-arm.runtime.native.system.io.ports/6.0.0-preview.5.21301.5",
"hashPath": "runtime.linux-arm.runtime.native.system.io.ports.6.0.0-preview.5.21301.5.nupkg.sha512"
},
"runtime.linux-arm64.runtime.native.System.IO.Ports/6.0.0-preview.5.21301.5": {
"type": "package",
"serviceable": true,
"sha512": "sha512-fN2ienMgX5Gl8rmmmTkCxEBeN+KMEwHkTIE+4bHIH0sgPZJqrGV7o7sjjivZlv95L64cF+a4UVlxGqiMVEN6Nw==",
"path": "runtime.linux-arm64.runtime.native.system.io.ports/6.0.0-preview.5.21301.5",
"hashPath": "runtime.linux-arm64.runtime.native.system.io.ports.6.0.0-preview.5.21301.5.nupkg.sha512"
},
"runtime.linux-x64.runtime.native.System.IO.Ports/6.0.0-preview.5.21301.5": {
"type": "package",
"serviceable": true,
"sha512": "sha512-wLbxixueLlN1bT3tHi4bnXhyp2tuyJ92TBBBwW01YS4isxkLr8o4f2AGw8YbsF4y2Fgx8RRQiipkG1EFrZ7AKg==",
"path": "runtime.linux-x64.runtime.native.system.io.ports/6.0.0-preview.5.21301.5",
"hashPath": "runtime.linux-x64.runtime.native.system.io.ports.6.0.0-preview.5.21301.5.nupkg.sha512"
},
"runtime.native.System.IO.Ports/6.0.0-preview.5.21301.5": {
"type": "package",
"serviceable": true,
"sha512": "sha512-9Int9JpQ3quVnY3nsUFmrcanozIrEMFAydF+v8KmDwh0CtPb2AZLyyRtNEC3Z1WmoF8qf+T7jWwuPlrfl338dw==",
"path": "runtime.native.system.io.ports/6.0.0-preview.5.21301.5",
"hashPath": "runtime.native.system.io.ports.6.0.0-preview.5.21301.5.nupkg.sha512"
},
"runtime.osx-x64.runtime.native.System.IO.Ports/6.0.0-preview.5.21301.5": {
"type": "package",
"serviceable": true,
"sha512": "sha512-IhXEnQFgPxM/pUkEJkFBkr6XBkWFiuMGLlyl5BDG7LkJuGX4jAxJwL6n9Pue88ZyV45c0ajvuZOBnZJap+uIKA==",
"path": "runtime.osx-x64.runtime.native.system.io.ports/6.0.0-preview.5.21301.5",
"hashPath": "runtime.osx-x64.runtime.native.system.io.ports.6.0.0-preview.5.21301.5.nupkg.sha512"
},
"System.CodeDom/5.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-JPJArwA1kdj8qDAkY2XGjSWoYnqiM7q/3yRNkt6n28Mnn95MuEGkZXUbPBf7qc3IjwrGY5ttQon7yqHZyQJmOQ==",
"path": "system.codedom/5.0.0",
"hashPath": "system.codedom.5.0.0.nupkg.sha512"
},
"System.IO.Ports/6.0.0-preview.5.21301.5": {
"type": "package",
"serviceable": true,
"sha512": "sha512-9jguTG3uxGLvERVKV6w8ctcaYktBv8ssZgl6xm1hI89BBIaU6WwC2SQt9ur+TT8UMxdu9ZG+QQMbCJKEKv9dnQ==",
"path": "system.io.ports/6.0.0-preview.5.21301.5",
"hashPath": "system.io.ports.6.0.0-preview.5.21301.5.nupkg.sha512"
},
"System.Management/5.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-MF1CHaRcC+MLFdnDthv4/bKWBZnlnSpkGqa87pKukQefgEdwtb9zFW6zs0GjPp73qtpYYg4q6PEKbzJbxCpKfw==",
"path": "system.management/5.0.0",
"hashPath": "system.management.5.0.0.nupkg.sha512"
},
"System.Security.AccessControl/6.0.0-preview.5.21301.5": {
"type": "package",
"serviceable": true,
"sha512": "sha512-EA9ul7nGN8oggMvloILnR+wnrbgLNZZQBYHq5nEq/ixwnKLV3M3Tbd1Jbj8oGck3XMj0owq81e4Jxp3s0IMICw==",
"path": "system.security.accesscontrol/6.0.0-preview.5.21301.5",
"hashPath": "system.security.accesscontrol.6.0.0-preview.5.21301.5.nupkg.sha512"
},
"System.Security.Principal.Windows/6.0.0-preview.5.21301.5": {
"type": "package",
"serviceable": true,
"sha512": "sha512-ywwCqFAaRVbgqqORqYg8jdaX6NUEpzbuhxyUhAs+7mZ8AFAO4PzFYrZ5JPkYejXwougDldtbi0zOkk1lLzugLw==",
"path": "system.security.principal.windows/6.0.0-preview.5.21301.5",
"hashPath": "system.security.principal.windows.6.0.0-preview.5.21301.5.nupkg.sha512"
}
}
}

Some files were not shown because too many files have changed in this diff Show More