TProPCMonitor/LoraGamepad/ViewModels/TProViewModel.cs

119 lines
3.5 KiB
C#
Raw Normal View History

2022-11-06 20:13:24 +08:00
using System;
2022-11-06 18:44:23 +08:00
using System.Collections.ObjectModel;
2022-11-06 20:13:24 +08:00
using System.Diagnostics;
2022-11-06 18:44:23 +08:00
using System.Linq;
using System.Reactive;
2022-11-06 20:13:24 +08:00
using System.Threading;
2022-11-06 18:44:23 +08:00
using LoraGamepad.Models;
2022-11-06 20:13:24 +08:00
using LoraGamepad.Util;
2022-11-06 18:44:23 +08:00
using ReactiveUI;
2022-11-06 14:49:30 +08:00
namespace LoraGamepad.ViewModels;
public class TProViewModel : ViewModelBase
{
2022-11-06 18:44:23 +08:00
private bool _isOpenPortButtonVisible = true;
private bool _isClosePortButtonVisible;
private ObservableCollection<CBPortItem> _portList = new();
public CBPortItem PortSelectItem { get; set; }
2022-11-06 20:13:24 +08:00
private readonly SerialPipeIn _serialPipeIn;
2022-11-08 15:05:47 +08:00
private readonly CrsfParserPipeIn _crsfParserPipeIn;
2022-11-06 18:44:23 +08:00
public ReactiveCommand<Unit, Unit> OpenPort { get; }
public ReactiveCommand<Unit, Unit> ClosePort { get; }
2022-11-06 20:13:24 +08:00
public Thread ReadThread;
2022-11-06 14:49:30 +08:00
public TProViewModel()
{
2022-11-06 18:44:23 +08:00
PortList = CBPortItem.GetPortList();
2022-11-06 20:13:24 +08:00
_serialPipeIn = new SerialPipeIn();
2022-11-08 15:05:47 +08:00
_crsfParserPipeIn = new CrsfParserPipeIn();
_serialPipeIn.OnOut += _crsfParserPipeIn.Push;
_crsfParserPipeIn.OnOut += data =>
{
Console.WriteLine(
$"Get Channel 0:{data.channel[0]},1:{data.channel[1]},2:{data.channel[2]},3:{data.channel[3]}");
};
2022-11-06 20:13:24 +08:00
ReadThread = new Thread(ReadThreadEntry);
2022-11-06 14:49:30 +08:00
2022-11-06 18:44:23 +08:00
OpenPort = ReactiveCommand.Create(PortOpenButtonClick);
ClosePort = ReactiveCommand.Create(PortCloseButtonClick);
2022-11-06 20:13:24 +08:00
}
2022-11-08 15:05:47 +08:00
2022-11-06 20:13:24 +08:00
public void ReadThreadEntry()
{
while (true)
{
if (SerialPort.Me.TryRead(out var data))
{
// Console.WriteLine(BitConverter.ToString(data));
_serialPipeIn.Push(data);
}
2022-11-08 15:05:47 +08:00
// Thread.Sleep(1);
2022-11-06 20:13:24 +08:00
}
2022-11-06 18:44:23 +08:00
}
/// <summary>
/// ComboBox串口列表绑定对象
/// </summary>
public ObservableCollection<CBPortItem> PortList
{
get => _portList;
set => this.RaiseAndSetIfChanged(ref _portList, value);
}
/// <summary>
/// 刷新串口列表事件处理函数
/// </summary>
public void OnPortListComboBoxPressed()
{
var newList = CBPortItem.GetPortList();
PortList.Except(newList,new CBPortItemCompare()).ToList().ForEach(a => { PortList.Remove(a); });
newList.Except(PortList, new CBPortItemCompare()).ToList().ForEach(a => { PortList.Add(a); });
newList.Except(PortList, new CBPortItemCompare()).ToList().ForEach(a => { PortList.Add(a); });
}
/// <summary>
/// 关闭串口按键可见性属性
/// </summary>
public bool IsClosePortButtonVisible
{
get => _isClosePortButtonVisible;
set => this.RaiseAndSetIfChanged(ref _isClosePortButtonVisible, value);
2022-11-06 14:49:30 +08:00
}
2022-11-06 18:44:23 +08:00
/// <summary>
/// 打开串口按键可见性属性
/// </summary>
public bool IsOpenPortButtonVisible
{
get => _isOpenPortButtonVisible;
set => this.RaiseAndSetIfChanged(ref _isOpenPortButtonVisible, value);
}
/// <summary>
/// 打开串口按键响应
/// </summary>
private void PortOpenButtonClick()
{
if (PortSelectItem.PortName == "") return;
2022-11-08 15:05:47 +08:00
SerialPort.Me.Open(PortSelectItem.PortName,115200,1000);
2022-11-06 18:44:23 +08:00
IsOpenPortButtonVisible = false;
IsClosePortButtonVisible = true;
2022-11-06 20:13:24 +08:00
ReadThread.Start();
2022-11-06 18:44:23 +08:00
}
/// <summary>
/// 关闭串口按键响应
/// </summary>
private void PortCloseButtonClick()
{
SerialPort.Me.Close();
IsOpenPortButtonVisible = true;
IsClosePortButtonVisible = false;
}
2022-11-06 14:49:30 +08:00
}