Newer
Older
Correlator / Correlator / ViewModel / AuditionViewModel.cs
using System;
using System.Runtime.InteropServices;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Threading;
using Correlator.Util;
using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Command;
using LiveCharts;
using LiveCharts.Defaults;

namespace Correlator.ViewModel
{
    public class AuditionViewModel : ViewModelBase
    {
        public RelayCommand MuteCommand { get; set; }
        public IChartValues ColumnValues { get; set; } = new ChartValues<ObservablePoint>();

        /// <summary>
        /// 传感器A信号强度0-5
        /// </summary>
        private int _sensorASignalIntensity;

        public int SensorASignalIntensity
        {
            get => _sensorASignalIntensity;
            private set
            {
                _sensorASignalIntensity = value;
                RaisePropertyChanged(() => SensorASignalIntensity);
            }
        }

        /// <summary>
        /// 传感器B信号强度0-5
        /// </summary>
        private int _sensorBSignalIntensity;

        public int SensorBSignalIntensity
        {
            get => _sensorBSignalIntensity;
            private set
            {
                _sensorBSignalIntensity = value;
                RaisePropertyChanged(() => SensorBSignalIntensity);
            }
        }

        /// <summary>
        /// 传感器A按钮
        /// </summary>
        private bool _sensorAIsEnable;

        public bool SensorAIsEnable
        {
            get => _sensorAIsEnable;
            set
            {
                _sensorAIsEnable = value;
                RaisePropertyChanged(() => SensorAIsEnable);
            }
        }

        /// <summary>
        /// 传感器B按钮
        /// </summary>
        private bool _sensorBIsEnable;

        public bool SensorBIsEnable
        {
            get => _sensorBIsEnable;
            set
            {
                _sensorBIsEnable = value;
                RaisePropertyChanged(() => SensorBIsEnable);
            }
        }

        private bool _muteIsChecked = true;

        public bool MuteIsChecked
        {
            get => _muteIsChecked;
            set
            {
                _muteIsChecked = value;
                RaisePropertyChanged(() => MuteIsChecked);
            }
        }

        #region user32.dll

        private const byte VkVolumeMute = 0xAD;
        private const byte VkVolumeDown = 0xAE;
        private const byte VkVolumeUp = 0xAF;
        private const uint KeyEventExtendedKey = 0x0001;
        private const uint KeyEventKeyUp = 0x0002;

        //函数名不能改,否则会报找不到函数错误,dll里面定好了的
        [DllImport("user32.dll")]
        private static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, uint dwExtraInfo);

        [DllImport("user32.dll")]
        private static extern byte MapVirtualKey(uint uCode, uint uMapType);

        #endregion

        private readonly DispatcherTimer _statusTimer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(1) };

        public AuditionViewModel()
        {
            //静音
            MuteCommand = new RelayCommand(() =>
            {
                if (_muteIsChecked)
                {
                    //静音
                    keybd_event(VkVolumeMute, MapVirtualKey(VkVolumeMute, 0), KeyEventExtendedKey, 0);
                    keybd_event(VkVolumeMute, MapVirtualKey(VkVolumeMute, 0),
                        KeyEventExtendedKey | KeyEventKeyUp, 0);
                }
                else
                {
                    //非静音
                    keybd_event(VkVolumeMute, MapVirtualKey(VkVolumeMute, 0), KeyEventExtendedKey, 0);
                    keybd_event(VkVolumeMute, MapVirtualKey(VkVolumeMute, 0),
                        KeyEventExtendedKey | KeyEventKeyUp, 0);
                }
            });

            var random = new Random();
            for (var i = 0; i < 100; i++)
            {
                var p = new ObservablePoint
                {
                    X = i,
                    Y = random.Next(-60, 60)
                };

                ColumnValues.Add(p);
            }

            //动态显示折线图
            Task.Factory.StartNew(RandomTempValue);

            //每秒查询信号状态
            _statusTimer.Tick += delegate
            {
                SensorASignalIntensity = 5;
                SensorAIsEnable = FlowStatus.RedSensorIsEnable;
                SensorBSignalIntensity = 5;
                SensorBIsEnable = FlowStatus.BlueSensorIsEnable;
            };
            _statusTimer.Start();
        }

        private void RandomTempValue()
        {
            var random = new Random();
            var i = 100;
            while (true)
            {
                Thread.Sleep(100);

                i++;
                var y = random.Next(-60, 60);
                ColumnValues.Add(new ObservablePoint(i, y));
                //设置最多显示150个点
                if (ColumnValues.Count > 100)
                {
                    ColumnValues.RemoveAt(0);
                }
            }
        }
    }
}