Compare commits

...

10 Commits

Author SHA1 Message Date
Sven Vogel 51a90d0e2a fixed image urls after repository move 2023-12-10 19:21:46 +00:00
Sven Vogel a8a5d92d96 added images to README 2023-02-27 18:51:32 +00:00
Teridax 95a750e489
Update README.md 2022-10-09 21:57:57 +00:00
Sven Vogel 917631c4ad new controller setup 2021-11-30 16:11:07 +01:00
Sven Vogel e0b321b61d Spashscreen updated 2021-08-08 15:05:12 +02:00
Sven Vogel 54ece7e1f3 2 new instructions:
- upload (beta)
- info

RP2040 support (see .py)
bug fixes
2021-08-08 14:50:24 +02:00
Sven Vogel da6e4bbb08 Arduino Code Update for Success Byte Fix 2021-07-06 14:41:58 +02:00
Sven Vogel ee5aee20dc Bug fixes II.
Ready for presentation
2021-07-06 14:40:41 +02:00
Sven Vogel 979133f314 Bug fixes 2021-07-06 14:17:53 +02:00
Sven Vogel 5b90fee738 Bug fixes
+ minecraft filter
+ HSL color space for color adjust
+ builtin gamma correction
+ matrix orientation flip
2021-07-04 14:56:52 +02:00
160 changed files with 3645 additions and 2186 deletions

1
.gitignore vendored Normal file
View File

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

Binary file not shown.

View File

@ -0,0 +1,169 @@
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

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

View File

@ -1,5 +1,12 @@
<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">True</s:Boolean>
<s:Boolean x:Key="/Default/ResxEditorPersonal/Initialized/@EntryValue">True</s:Boolean></wpf:ResourceDictionary>
<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>

View File

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

View File

@ -8,6 +8,7 @@
<ApplicationIcon>MatrixIcon.ico</ApplicationIcon>
<EnableNETAnalyzers>true</EnableNETAnalyzers>
<Nullable>enable</Nullable>
<LangVersion>latest</LangVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
@ -17,7 +18,9 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="System.IO.Ports" Version="3.1.0" />
<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.Management" Version="5.0.0" />
</ItemGroup>
@ -28,6 +31,21 @@
<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,5 +10,8 @@
<Compile Update="Matrix.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="SplashScreen.cs">
<SubType>Form</SubType>
</Compile>
</ItemGroup>
</Project>

View File

@ -1,182 +0,0 @@
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

@ -32,6 +32,62 @@ namespace Matrix_App
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)
{
var c = v * s;

View File

@ -4,6 +4,7 @@ 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;
@ -23,7 +24,9 @@ namespace Matrix_App
new Boxblur(),
new ColorAdjust(),
new Grayscale(),
new Invert()
new Invert(),
new Transfom(),
new Minecraft()
};
// Static generator accessible members
@ -77,6 +80,8 @@ namespace Matrix_App
_playbackFrame++;
}
public delegate void update();
/// <summary>
/// Colors a single fragment at the specified pixel location (x|y) at frame frame.
/// </summary>
@ -90,6 +95,8 @@ 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!;
@ -107,13 +114,21 @@ namespace Matrix_App
// generate button
var button = new Button
{
Width = 215,
AutoSize = true,
Text = FieldWidgets.GetBetterFieldName(generator.GetType().Name)
};
button.Click += (sender, e) => OpenGeneratorUi(generator, matrix);
button.Width = anchor.ClientSize.Width - button.Margin.Right - button.Margin.Left;
button.Click += (sender, e) =>
{
lock (matrix)
{
OpenGeneratorUi(generator, matrix);
}
};
button.Image = CreateSnapshot(generator);
button.TextImageRelation = TextImageRelation.ImageBeforeText;
button.Height = FilterPreviewHeight * 3 / 2;
button.TextAlign = ContentAlignment.MiddleRight;
button.ImageAlign = ContentAlignment.MiddleLeft;
anchor.Controls.Add(button);
}
@ -165,7 +180,7 @@ namespace Matrix_App
@"Filter incomplete", MessageBoxButtons.YesNo, MessageBoxIcon.Warning))
{
BlockBuffer();
FlipColorStoreRG_GR(_animationBuffer, MatrixDesignerMain.gifBuffer);
ColorStore(_animationBuffer, MatrixDesignerMain.gifBuffer);
_form.ResetTimeline();
}
else
@ -175,7 +190,7 @@ namespace Matrix_App
}
else
{
FlipColorStoreRG_GR(_animationBuffer, MatrixDesignerMain.gifBuffer);
ColorStore(_animationBuffer, MatrixDesignerMain.gifBuffer);
_form.ResetTimeline();
}
}
@ -204,8 +219,8 @@ namespace Matrix_App
Form prompt = new Form
{
Width = 500,
Height = 320,
AutoSize = true,
AutoSizeMode = AutoSizeMode.GrowOnly,
Text = @"Vorgenerierter Modus: " + _generator.GetType().Name
};
@ -217,13 +232,16 @@ namespace Matrix_App
FlowLayoutPanel controlPanel = new FlowLayoutPanel
{
Anchor = AnchorStyles.Top | AnchorStyles.Left,
Anchor = AnchorStyles.Bottom | AnchorStyles.Left,
FlowDirection = FlowDirection.BottomUp,
Dock = DockStyle.Top,
Dock = DockStyle.Fill,
WrapContents = false,
AutoSizeMode = AutoSizeMode.GrowOnly,
AutoSize = true
};
_generator.CreateUi(controlPanel, InvokeGenerator);
PlaybackTimer.Interval = _form.GetDelayTime();
PlaybackTimer.Enabled = true;
@ -258,9 +276,9 @@ namespace Matrix_App
prompt.MinimumSize = prompt.Size;
prompt.Controls.Add(controlPanel);
prompt.Controls.Add(southPane);
prompt.Height = southPane.Height * 2 + controlPanel.Height + 16;
prompt.FormBorderStyle = FormBorderStyle.FixedDialog;
prompt.MaximizeBox = false;
prompt.FormBorderStyle = FormBorderStyle.FixedDialog;
prompt.StartPosition = FormStartPosition.CenterScreen;
prompt.ShowDialog();
PlaybackTimer.Enabled = false;
@ -272,7 +290,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);
FlipColorStoreRG_GR(MatrixDesignerMain.gifBuffer, _initialBuffer);
ColorStore(MatrixDesignerMain.gifBuffer, _initialBuffer);
// Set Generator args
SetGlobalArgs(matrix.matrixWidth(),
matrix.matrixHeight(),
@ -300,8 +318,9 @@ namespace Matrix_App
{
BorderStyle = BorderStyle.Fixed3D,
AutoSize = false,
Dock = DockStyle.Fill,
Anchor = AnchorStyles.Top | AnchorStyles.Left,
Height = lineHeight,
Width = 500
};
controlPanel.Controls.Add(divider);
@ -315,11 +334,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

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

View File

@ -1,4 +1,5 @@
using System;
using System.Windows.Forms;
using Matrix_App.PregeneratedMods.reflection;
using static Matrix_App.GifGeneratorUtils;
@ -6,16 +7,20 @@ 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 saturation")]
[UiDescription(title: "Saturation boost", description: "Decreases or increases (chroma-based) saturation")]
private float saturationBoost = 0.5f;
[UiWidget]
[UiDescription(title: "Brightness boost", description: "Decreases or increases brightness")]
[UiDescription(title: "Luminance boost", description: "Decreases or increases luminance")]
private float valueBoost = 0.5f;
[UiWidget]
@ -40,7 +45,7 @@ namespace Matrix_App.PregeneratedMods
SampleFrame(actualStore!, frame, x, y, width, out float tr, out float tg, out float tb);
// Adjust HSV
HsvFromRgb(tr, tg, tb, out float h, out float s, out float value);
HslFromRgb(tr, tg, tb, out float h, out float s, out float value);
h = h / 360.0f + hueOffset;
h = (h - MathF.Floor(h)) * 360.0f;
@ -48,11 +53,22 @@ namespace Matrix_App.PregeneratedMods
value = Boost(value, valueBoost);
// Adjust RGB
RgbFromHsv(h, s, value, out tr, out tg, out tb);
RgbFromHsl(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,4 +1,5 @@
using Matrix_App.PregeneratedMods.reflection;
using System.Windows.Forms;
using Matrix_App.PregeneratedMods.reflection;
using static Matrix_App.GifGeneratorUtils;
namespace Matrix_App.PregeneratedMods
@ -29,5 +30,10 @@ namespace Matrix_App.PregeneratedMods
b = average;
}
}
protected override void CreateUi(FlowLayoutPanel anchor, update invokeGenerator)
{
}
}
}

View File

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

View File

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

View File

@ -1,4 +1,5 @@
using System;
using System.Windows.Forms;
using Matrix_App.PregeneratedMods.reflection;
namespace Matrix_App.PregeneratedMods
@ -16,6 +17,11 @@ 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,4 +1,5 @@
using System;
using System.Windows.Forms;
using Matrix_App.PregeneratedMods.reflection;
using static Matrix_App.GifGeneratorUtils;
@ -35,6 +36,11 @@ 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,4 +1,5 @@
using System;
using System.Windows.Forms;
namespace Matrix_App.PregeneratedMods
{
@ -29,5 +30,10 @@ namespace Matrix_App.PregeneratedMods
g = sp;
b = sp;
}
protected override void CreateUi(FlowLayoutPanel anchor, update invokeGenerator)
{
}
}
}

View File

@ -1,5 +1,6 @@

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

View File

@ -0,0 +1,55 @@
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,7 +37,6 @@ namespace Matrix_App.PregeneratedMods.reflection
title = desc.title;
description.Text = desc.description;
description.ForeColor = Color.Gray;
description.Height += 10;
description.AutoSize = true;
}
@ -47,7 +46,6 @@ namespace Matrix_App.PregeneratedMods.reflection
Text = title,
Dock = DockStyle.Left,
Anchor = AnchorStyles.Top | AnchorStyles.Left,
Width = 100
});
switch (fieldValue)
@ -56,10 +54,11 @@ namespace Matrix_App.PregeneratedMods.reflection
{
var upDown = new NumericUpDown
{
Width = 360,
Dock = DockStyle.Fill,
Anchor = AnchorStyles.Top | AnchorStyles.Right,
Width = 360,
Value = value
Value = value,
Maximum = 1000
};
upDown.ValueChanged += (a, b) =>
{
@ -94,8 +93,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,6 +70,16 @@ 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>
@ -80,6 +90,56 @@ 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>
@ -110,6 +170,16 @@ 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>
@ -130,6 +200,26 @@ 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>
@ -149,5 +239,15 @@ 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,4 +145,35 @@
<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: 241 KiB

After

Width:  |  Height:  |  Size: 245 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 694 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 609 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 499 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 740 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 194 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 650 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 703 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 880 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 331 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 769 B

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.Format32bppPArgb, BitsHandle.AddrOfPinnedObject());
Bitmap = new Bitmap(width, height, width * 4, PixelFormat.Format32bppRgb, 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;
Bits[index] = col & 0x00FFFFFF;
}
public void SetImage(Bitmap image)

View File

@ -0,0 +1,252 @@
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

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

View File

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

Binary file not shown.

View File

@ -8,32 +8,117 @@
".NETCoreApp,Version=v3.1": {
"Matrix App/1.0.0": {
"dependencies": {
"System.IO.Ports": "4.4.0",
"Bluetooth": "1.0.0.2",
"System.Drawing.Common": "5.0.2",
"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/5.0.0": {
"Bluetooth/1.0.0.2": {
"dependencies": {
"System.Security.AccessControl": "5.0.0",
"System.Security.Principal.Windows": "5.0.0"
"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": {
"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": "5.0.0.0",
"fileVersion": "5.0.20.51904"
"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"
}
}
},
"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": {
@ -44,29 +129,67 @@
}
}
},
"System.IO.Ports/4.4.0": {
"System.Drawing.Common/5.0.2": {
"dependencies": {
"Microsoft.Win32.Registry": "5.0.0"
"Microsoft.Win32.SystemEvents": "5.0.0"
},
"runtime": {
"lib/netstandard2.0/System.IO.Ports.dll": {
"assemblyVersion": "4.0.0.0",
"fileVersion": "4.6.25519.3"
"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"
},
"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": "4.0.0.0",
"fileVersion": "4.6.25519.3"
"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": "5.0.0",
"Microsoft.Win32.Registry": "6.0.0-preview.5.21301.5",
"System.CodeDom": "5.0.0"
},
"runtime": {
@ -84,45 +207,66 @@
}
}
},
"System.Security.AccessControl/5.0.0": {
"System.Runtime/4.3.0": {
"dependencies": {
"Microsoft.NETCore.Platforms": "5.0.0",
"System.Security.Principal.Windows": "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"
},
"runtime": {
"lib/netstandard2.0/System.Security.AccessControl.dll": {
"assemblyVersion": "5.0.0.0",
"fileVersion": "5.0.20.51904"
"assemblyVersion": "6.0.0.0",
"fileVersion": "6.0.21.30105"
}
},
"runtimeTargets": {
"runtimes/win/lib/netcoreapp2.0/System.Security.AccessControl.dll": {
"runtimes/win/lib/netstandard2.0/System.Security.AccessControl.dll": {
"rid": "win",
"assetType": "runtime",
"assemblyVersion": "5.0.0.0",
"fileVersion": "5.0.20.51904"
"assemblyVersion": "6.0.0.0",
"fileVersion": "6.0.21.30105"
}
}
},
"System.Security.Principal.Windows/5.0.0": {
"System.Security.Principal.Windows/6.0.0-preview.5.21301.5": {
"runtime": {
"lib/netstandard2.0/System.Security.Principal.Windows.dll": {
"assemblyVersion": "5.0.0.0",
"fileVersion": "5.0.20.51904"
"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": "5.0.0.0",
"fileVersion": "5.0.20.51904"
"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": "5.0.0.0",
"fileVersion": "5.0.20.51904"
"assemblyVersion": "6.0.0.0",
"fileVersion": "6.0.21.30105"
}
}
}
@ -134,6 +278,13 @@
"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,
@ -141,12 +292,68 @@
"path": "microsoft.netcore.platforms/5.0.0",
"hashPath": "microsoft.netcore.platforms.5.0.0.nupkg.sha512"
},
"Microsoft.Win32.Registry/5.0.0": {
"Microsoft.NETCore.Targets/1.1.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"
"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"
},
"System.CodeDom/5.0.0": {
"type": "package",
@ -155,12 +362,19 @@
"path": "system.codedom/5.0.0",
"hashPath": "system.codedom.5.0.0.nupkg.sha512"
},
"System.IO.Ports/4.4.0": {
"System.Drawing.Common/5.0.2": {
"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"
"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"
},
"System.Management/5.0.0": {
"type": "package",
@ -169,19 +383,47 @@
"path": "system.management/5.0.0",
"hashPath": "system.management.5.0.0.nupkg.sha512"
},
"System.Security.AccessControl/5.0.0": {
"System.Runtime/4.3.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"
"sha512": "sha512-JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==",
"path": "system.runtime/4.3.0",
"hashPath": "system.runtime.4.3.0.nupkg.sha512"
},
"System.Security.Principal.Windows/5.0.0": {
"System.Runtime.InteropServices.WindowsRuntime/4.3.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"
"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"
}
}
}

View File

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

View File

@ -1,187 +0,0 @@
{
"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"
}
}
}

View File

@ -0,0 +1,278 @@
{
"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"
}
}
}

Binary file not shown.

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