2
0

Add project files.

This commit is contained in:
DangHome
2022-05-23 00:58:58 +08:00
parent e5a279a1fd
commit f0b02be1a5
51 changed files with 3090 additions and 0 deletions

View File

@@ -0,0 +1,48 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CMM.Library.Method
{
public static class AssemblyData
{
/// <summary>
/// 當下Assembly名稱
/// </summary>
public static string AssemblyName => System.Reflection.Assembly.GetExecutingAssembly().GetName().Name;
public static string AppName => AppDomain.CurrentDomain.FriendlyName;
/// <summary>
/// 程式根目錄,無視工作目錄
/// </summary>
public static string Path => AppDomain.CurrentDomain.BaseDirectory;
/// <summary>
/// 版本
/// </summary>
public static string AssemblyVersion => GetAssemblyVersion();
public static string AppVersion => GetFileVersion(Process.GetCurrentProcess().MainModule.FileName);
/// <summary>
/// CCM 輸出
/// </summary>
public static string smonitors => System.IO.Path.Combine(Path, "smonitors.tmp");
static string GetAssemblyVersion()
{
var fi = System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase.Replace(@"file:///", "");
return GetFileVersion(fi);
}
public static string GetFileVersion(string filePath)
{
var fvi = FileVersionInfo.GetVersionInfo(filePath);
return $"{fvi.FileMajorPart}." +
$"{fvi.FileMinorPart}." +
$"{fvi.FileBuildPart}." +
$"{fvi.FilePrivatePart}";
}
}
}

View File

@@ -0,0 +1,177 @@
using CMM.Library.Base;
using CMM.Library.Helpers;
using CMM.Library.ViewModel;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CMM.Library.Method
{
/// <summary>
/// Control My Monitor Management Command
/// </summary>
public static class CMMCommand
{
static readonly string CMMTmpFolder = Path.Combine(Path.GetTempPath(), $"CMM");
static readonly string CMMexe = Path.Combine(CMMTmpFolder, "ControlMyMonitor.exe");
static readonly string CMMsMonitors = Path.Combine(CMMTmpFolder, "smonitors.tmp");
static readonly string CMMcfg = Path.Combine(CMMTmpFolder, "ControlMyMonitor.cfg");
public static async Task ScanMonitor()
{
await BytesToFileAsync(new(CMMexe));
await ConsoleHelper.CmdCommandAsync($"{CMMexe} /smonitors {CMMsMonitors}");
}
public static async Task ScanMonitorInterfaces(IEnumerable<XMonitor> monitors)
{
var taskList = new List<Task>();
foreach (var mon in monitors)
{
taskList.Add(Task.Run(async () => await
ScanMonitorInterfaces($"{CMMTmpFolder}\\{mon.SerialNumber}.tmp", mon)));
}
await Task.WhenAll(taskList.ToArray());
}
static async Task ScanMonitorInterfaces(string savePath, XMonitor mon)
{
//await ConsoleHelper.CmdCommandAsync($"{CMMexe} /scomma {savePath} {mon.MonitorID}");
await mon.ReadMonitorStatus(savePath);
}
/// <summary>
/// 取得螢幕狀態
/// </summary>
public static async Task ReadMonitorStatus(this XMonitor @this, string filePath)
{
var statusColle = new ObservableRangeCollection<XMonitorStatus>();
if (!File.Exists(filePath)) return;
foreach (var line in await File.ReadAllLinesAsync(filePath))
{
var sp = line.Split(",");
if (sp.Length < 6) continue;
statusColle.Add(new XMonitorStatus
{
VCP_Code = StrTrim(sp[0]),
VCPCodeName = StrTrim(sp[1]),
Read_Write = StrTrim(sp[2]),
CurrentValue = TryGetInt(sp[3]),
MaximumValue = TryGetInt(sp[4]),
PossibleValues = TryGetArrStr(sp),
});
}
@this.Status = statusColle;
string StrTrim(string str)
{
if (string.IsNullOrEmpty(str)) return null;
return str;
}
string TryGetArrStr(string[] strArr)
{
if (strArr.Length < 7) return null;
var outStr = string.Join(",", strArr[5..]);
outStr = outStr.Substring(1, outStr.Length - 2);
return outStr;
}
int? TryGetInt(string str)
{
if (int.TryParse(str, out var value)) return value;
return null;
}
}
/// <summary>
/// 取得螢幕清單
/// </summary>
public static async Task<IEnumerable<XMonitor>> ReadMonitorsData()
{
var monitors = new List<XMonitor>();
if (!File.Exists(CMMsMonitors)) return monitors;
XMonitor mon = null;
string context;
foreach (var line in await File.ReadAllLinesAsync(CMMsMonitors))
{
var sp = line.Split(":", StringSplitOptions.RemoveEmptyEntries);
try
{
if (sp.Length != 2 || string.IsNullOrEmpty(sp[1])) continue;
context = sp[1].Substring(2, sp[1].Length - 3);
}
catch
{
continue;
}
if (sp[0].StartsWith("Monitor Device Name"))
{
mon = new XMonitor();
mon.MonitorDeviceName = context;
continue;
}
if (sp[0].StartsWith("Monitor Name"))
{
mon.MonitorName = context;
continue;
}
if (sp[0].StartsWith("Serial Number"))
{
mon.SerialNumber = context;
continue;
}
if (sp[0].StartsWith("Adapter Name"))
{
mon.AdapterName = context;
continue;
}
if (sp[0].StartsWith("Monitor ID"))
{
mon.MonitorID = context;
monitors.Add(mon);
continue;
}
}
return monitors;
}
static void BytesToFile(FileInfo fi)
{
fi.Refresh();
if (fi.Exists) return;
if (!fi.Directory.Exists) fi.Directory.Create();
File.WriteAllBytes(fi.FullName, fi.Name.ResourceToByteArray());
}
static async Task BytesToFileAsync(FileInfo fi)
{
fi.Refresh();
if (fi.Exists) return;
if (!fi.Directory.Exists) fi.Directory.Create();
await File.WriteAllBytesAsync(fi.FullName, fi.Name.ResourceToByteArray());
}
}
}

29
Library/Method/CMMMgr.cs Normal file
View File

@@ -0,0 +1,29 @@
using CMM.Library.Base;
using CMM.Library.ViewModel;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CMM.Library.Method
{
public class CMMMgr : PropertyBase
{
public ObservableRangeCollection<XMonitor> Monitors
{
get => _Monitors;
set { SetProperty(ref _Monitors, value); }
}
ObservableRangeCollection<XMonitor> _Monitors = new ();
public async Task Init()
{
await CMMCommand.ScanMonitor();
var monColle = new ObservableRangeCollection<XMonitor>();
monColle.AddRange(await CMMCommand.ReadMonitorsData());
Monitors = monColle;
await CMMCommand.ScanMonitorInterfaces(monColle);
}
}
}