140 lines
4.7 KiB
C#
140 lines
4.7 KiB
C#
using System;
|
|
using System.Collections.ObjectModel;
|
|
using System.Diagnostics;
|
|
using System.Linq;
|
|
using System.Reactive;
|
|
using System.Threading;
|
|
using LoraGamepad.Models;
|
|
using LoraGamepad.Util;
|
|
using ReactiveUI;
|
|
|
|
namespace LoraGamepad.ViewModels;
|
|
|
|
public class TProViewModel : ViewModelBase
|
|
{
|
|
|
|
private bool _isOpenPortButtonVisible = true;
|
|
private bool _isClosePortButtonVisible;
|
|
|
|
private ObservableCollection<CBPortItem> _portList = new();
|
|
public CBPortItem PortSelectItem { get; set; }
|
|
public SliderConfig SliderValue { get; }
|
|
public BtnConfig BtnIsPressed { get; }
|
|
|
|
private readonly SerialPipeIn _serialPipeIn;
|
|
private readonly CrsfParserPipeIn _crsfParserPipeIn;
|
|
public ReactiveCommand<Unit, Unit> OpenPort { get; }
|
|
public ReactiveCommand<Unit, Unit> ClosePort { get; }
|
|
|
|
public Thread ReadThread;
|
|
public TProViewModel()
|
|
{
|
|
SliderValue = new SliderConfig();
|
|
BtnIsPressed = new BtnConfig();
|
|
|
|
PortList = CBPortItem.GetPortList();
|
|
_serialPipeIn = new SerialPipeIn();
|
|
_crsfParserPipeIn = new CrsfParserPipeIn();
|
|
_serialPipeIn.OnOut += _crsfParserPipeIn.Push;
|
|
_crsfParserPipeIn.OnOut += data =>
|
|
{
|
|
SliderValue.RightHorizonValue = data.channel[0];
|
|
SliderValue.RightVerticalValue = data.channel[1];
|
|
SliderValue.LeftHorizonValue = data.channel[2];
|
|
SliderValue.LeftVerticalValue = data.channel[3];
|
|
// Console.WriteLine($"{data.channel[4]},{data.channel[5]},{data.channel[6]},{data.channel[7]},{data.channel[8]},{data.channel[9]}");
|
|
// Console.WriteLine($"{data.channel[10]},{data.channel[11]},{data.channel[12]},{data.channel[13]},{data.channel[14]},{data.channel[15]}");
|
|
SliderValue.LeftUpValue = data.channel[4];
|
|
BtnIsPressed.BtnLeftUp = data.channel[5] > 0;
|
|
BtnIsPressed.BtnRightUp = data.channel[6] > 0;
|
|
BtnIsPressed.BtnRightDown = data.channel[7] > 0;
|
|
SliderValue.MidLeftValue = data.channel[8];
|
|
SliderValue.MidRightValue = data.channel[9];
|
|
BtnIsPressed.BtnModel1 = data.channel[10] > 0;
|
|
BtnIsPressed.BtnModel2 = data.channel[11] > 0;
|
|
BtnIsPressed.BtnModel3 = data.channel[12] > 0;
|
|
BtnIsPressed.BtnModel4 = data.channel[13] > 0;
|
|
BtnIsPressed.BtnModel5 = data.channel[14] > 0;
|
|
BtnIsPressed.BtnModel6 = data.channel[15] > 0;
|
|
};
|
|
ReadThread = new Thread(ReadThreadEntry);
|
|
|
|
OpenPort = ReactiveCommand.Create(PortOpenButtonClick);
|
|
ClosePort = ReactiveCommand.Create(PortCloseButtonClick);
|
|
|
|
}
|
|
|
|
public void ReadThreadEntry()
|
|
{
|
|
while (true)
|
|
{
|
|
if (SerialPort.Me.TryRead(out var data))
|
|
{
|
|
// Console.WriteLine(BitConverter.ToString(data));
|
|
_serialPipeIn.Push(data);
|
|
}
|
|
SpinWait.SpinUntil(() => false, 1);
|
|
}
|
|
}
|
|
|
|
/// <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);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 打开串口按键可见性属性
|
|
/// </summary>
|
|
public bool IsOpenPortButtonVisible
|
|
{
|
|
get => _isOpenPortButtonVisible;
|
|
set => this.RaiseAndSetIfChanged(ref _isOpenPortButtonVisible, value);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 打开串口按键响应
|
|
/// </summary>
|
|
private void PortOpenButtonClick()
|
|
{
|
|
if (PortSelectItem.PortName == "") return;
|
|
SerialPort.Me.Open(PortSelectItem.PortName,250000,1000);
|
|
IsOpenPortButtonVisible = false;
|
|
IsClosePortButtonVisible = true;
|
|
ReadThread.Start();
|
|
}
|
|
|
|
/// <summary>
|
|
/// 关闭串口按键响应
|
|
/// </summary>
|
|
private void PortCloseButtonClick()
|
|
{
|
|
SerialPort.Me.Close();
|
|
IsOpenPortButtonVisible = true;
|
|
IsClosePortButtonVisible = false;
|
|
}
|
|
|
|
} |