using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Timers;
using System.Windows.Forms;
using Newtonsoft.Json.Linq;
using static ControllerDllCSharp.ClassLibControllerDll;
namespace AssistClient.Device
{
    public class LightDev : IDisposable
    {
        private long portHandle;
        /// <summary>
        /// 光源亮度值
        /// </summary>
        public int DigitalValue { get; private set; }

        public Action<WarningEnum, string> WarningEvent;
        /// <summary>
        /// 光源亮度值<通道号,亮度值0-255>
        /// </summary>
        public Action<int, int> DigitalEvent;
        /// <summary>
        /// 是否打开设备成功
        /// </summary>
        public bool IsInit { get; private set; } = false;
        //private System.Timers.Timer timer = new System.Timers.Timer();
        public LightDev()
        {
        }
        public bool start(int comNum)
        {
            try
            {
                int result = CreateSerialPort(comNum, ref portHandle);  //创建串口
                if (result != SUCCESS)
                    throw new Exception($"打开光源设备(COM{comNum})失败: {result}");

                IsInit = true;
                //timer.Elapsed += Timer_Elapsed;
                //timer.Interval = 100;
                //timer.Enabled = true;

                return true;
            }
            catch (Exception ex)
            {
                WarningEvent?.Invoke(WarningEnum.High, ex.Message);
                return false;
            }
        }
         

        public void stop()
        {
            if (!IsInit) return;
            try
            {
                IsInit = false;
                //timer.Elapsed -= Timer_Elapsed;
                //timer.Stop();
                int result = ReleaseSerialPort(portHandle);  //断开串口 
            }
            catch { }
        }
        public int getDigitalValue(int channelIndex)
        {
            if (!IsInit) return -1;

            int value = 0;
            if (GetDigitalValue(ref value, channelIndex, portHandle) != SUCCESS)
                return -1;

            DigitalEvent?.Invoke(channelIndex, value);
            return value;
        }
        /// <summary>
        /// 设置亮度值 
        /// </summary>
        /// <param name="channelIndex">通道</param>
        /// <param name="value">0-255</param>
        /// <returns></returns>
        public bool setDigitalValue(int channelIndex, int value)
        {
            if (!IsInit) return false;
            Task.Factory.StartNew(() => {
                if (SetDigitalValue(channelIndex, value, portHandle) != SUCCESS)
                    return;// false;
            });

            return true;
        }

        private void Timer_Elapsed(object sender, ElapsedEventArgs e)
        {
            if (!IsInit) return;

        }


        public void Dispose()
        {
            stop();
        }
    }
}