Compare commits
No commits in common. "master" and "v3.5.5-RC5" have entirely different histories.
master
...
v3.5.5-RC5
|
@ -1 +0,0 @@
|
|||
/Matrix App/bin/
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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)
|
||||
|
|
@ -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>
|
|
@ -732,6 +732,7 @@ namespace Matrix_App
|
|||
private void InitializeComponent()
|
||||
{
|
||||
components = new System.ComponentModel.Container();
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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)
|
|
@ -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)
|
||||
{
|
|
@ -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>
|
||||
|
|
|
@ -10,8 +10,5 @@
|
|||
<Compile Update="Matrix.cs">
|
||||
<SubType>UserControl</SubType>
|
||||
</Compile>
|
||||
<Compile Update="SplashScreen.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
</Project>
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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;
|
|
@ -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;
|
|
@ -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)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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) =>
|
||||
{
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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>
|
Before Width: | Height: | Size: 245 KiB After Width: | Height: | Size: 241 KiB |
Before Width: | Height: | Size: 694 B |
Before Width: | Height: | Size: 609 B |
Before Width: | Height: | Size: 499 B |
Before Width: | Height: | Size: 740 B |
Before Width: | Height: | Size: 194 B |
Before Width: | Height: | Size: 650 B |
Before Width: | Height: | Size: 703 B |
Before Width: | Height: | Size: 880 B |
Before Width: | Height: | Size: 331 B |
Before Width: | Height: | Size: 769 B |
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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];
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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"
|
||||
]
|
||||
}
|
||||
}
|
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|