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
|
|
|
}
|