Imitation.cs 9.69 KB
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//using System.Timers;
using System.Windows.Forms;
//using System.Threading;


namespace GeneralLib
{
    /// <summary>
    /// 模拟数据产生事件的委托
    /// </summary>
    /// <param name="statusStr"></param>
    public delegate void DemoCreatEvt(DemoResult result);

    /// <summary>
    /// 模拟结果
    /// </summary>
    public class DemoResult
    {
        public string KeyID = "";
        public string Value = "";
        public double Speed = 0;
    }

    /// <summary>
    /// 演示模式接口
    /// </summary>
    public interface IDemo
    {
        /// <summary>
        /// 获取模拟结果
        /// </summary>
        /// <returns></returns>
        string GetValue();
    }

    /// <summary>
    /// 基本模式,如签到,只需事件,值自定义
    /// </summary>
    public class BaseDemo : IDemo
    {
        /// <summary>
        /// 模拟事件返回值指定
        /// </summary>
        public string ResultValue = "";
        /// <summary>
        /// 获取模拟结果
        /// </summary>
        /// <returns></returns>
        public string GetValue()
        {
            return ResultValue;
        }
    }

    /// <summary>
    /// 选择模式
    /// </summary>
    public class ChoiceDemo : IDemo
    {
        /// <summary>
        /// 选项个数
        /// </summary>
        public int OptionCount = 4;
        /// <summary>
        /// 可选个数
        /// </summary>
        public int LimitCount = 1;
        /// <summary>
        /// 是否选满可选个数
        /// </summary>
        public bool IsForced = false;
        /// <summary>
        /// 选项格式是否ABCD
        /// </summary>
        public bool IsABC = false;
        /// <summary>
        /// 结果是否排序
        /// </summary>
        public bool IsOrderly = false;

        /// <summary>
        /// 获取模拟结果
        /// </summary>
        /// <returns></returns>
        public string GetValue()
        {
            string res = "";

            Random rnd = new Random();
            int sel = LimitCount;
            if (!IsForced)
            {
                sel = (int)(LimitCount * rnd.NextDouble()) + 1;
            }

            List<int> listOption = new List<int>();
            for (int i = 1; i <= OptionCount; i++)
            {
                listOption.Add(i);
            }
            List<int> listRes = new List<int>();
            for (int i = 1; i <= sel; i++)
            {
                int n = (int)(listOption.Count * rnd.NextDouble());
                int val = listOption[n];
                listOption.Remove(val);
                listRes.Add(val);
            }

            if (listRes.Count > 0)
            {
                if (IsOrderly)
                    listRes.Sort();

                string[] aryRes = new string[listRes.Count];
                if (IsABC)
                {
                    for (int i = 0; i < listRes.Count; i++)
                        aryRes[i] = Convert.ToChar(64 + listRes[i]).ToString();
                }
                else
                {
                    for (int i = 0; i < listRes.Count; i++)
                        aryRes[i] = listRes[i].ToString();
                }
                res = string.Join(",", aryRes);
            }

            return res;
        }
    }

    /// <summary>
    /// 数值模式
    /// </summary>
    public class NumberDemo : IDemo
    {
        /// <summary>
        /// 最大值
        /// </summary>
        public int MaxVal = 100;
        /// <summary>
        /// 最小值
        /// </summary>
        public int MinVal = -100;
        //public int MaxLen = 0;
        /// <summary>
        /// 小数位,-1为任意小数位
        /// </summary>
        public int Decimal = 0;

        /// <summary>
        /// 获取模拟结果
        /// </summary>
        /// <returns></returns>
        public string GetValue()
        {
            string res = "";

            Random rnd = new Random();

            int v1 = MinVal;
            int v2 = MaxVal;
            if (MaxVal < MinVal)
            {
                v1 = MaxVal;
                v2 = MinVal;
            }

            int vRnd = 0;
            int dec = 0;
            if (Decimal == -1)
                dec = (int)(5 * rnd.NextDouble());
            else if (Decimal > 0)
                dec = Decimal;
            if (dec > 0)
            {
                double pow = Math.Pow(10, dec);
                v1 = v1 * (int)pow;
                v2 = v2 * (int)pow;
                vRnd = (int)((v2 - v1 + 1) * rnd.NextDouble()) + v1;
                res = ((double)vRnd / pow).ToString("F" + dec);
            }
            else
            {
                vRnd = (int)((v2 - v1 + 1) * rnd.NextDouble()) + v1;
                res = vRnd.ToString();
            }

            return res;
        }
    }

    /// <summary>
    /// 模拟控制类
    /// </summary>
    public class Imitation
    {
        /// <summary>
        /// 键盘列表
        /// </summary>
        public List<string> KeyIDList = new List<string>();
        ///// <summary>
        ///// 预定值列表
        ///// </summary>
        //public List<string> ValueList = new List<string>();

        ///// <summary>
        ///// 结果仅从预定值列表产生
        ///// </summary>
        //public bool OnlyValueList = false;

        /// <summary>
        /// 模拟数据产生事件
        /// </summary>
        public event DemoCreatEvt DemoCreat;

        /// <summary>
        /// 演示模式
        /// </summary>
        public IDemo DemoType = null;

        /// <summary>
        /// 控制计时器,产生数据事件
        /// </summary>
        private Timer TmrDemo = new Timer();

        /// <summary>
        /// 启动时间,用来计算速度
        /// </summary>
        private int timeStart = 0;

        public Imitation()
        {
            TmrDemo.Interval = 1000;
            TmrDemo.Enabled = false;
            TmrDemo.Tick += new EventHandler(TmrDemo_Tick);
        }

        ~Imitation()
        {
            TmrDemo.Stop();
            TmrDemo.Enabled = false;
        }

        /// <summary>
        /// 事件计时间隔
        /// </summary>
        public int Interval
        {
            get { return TmrDemo.Interval; }
            set { TmrDemo.Interval = value; }
        }

        /// <summary>
        /// 已经产生的模拟数据,若重新开始模拟,需要清空,否则就是继续
        /// </summary>
        public Dictionary<string, DemoResult> ResultList = new Dictionary<string, DemoResult>();

        /// <summary>
        /// 未模拟过的键盘
        /// </summary>
        List<string> KeyIDListCreate = new List<string>();

        /// <summary>
        /// 启动模拟
        /// </summary>
        public void Start()
        {
            //初始化未模拟ID的列表
            KeyIDListCreate.Clear();
            foreach (var key in KeyIDList)
            {
                if (!ResultList.ContainsKey(key))
                    KeyIDListCreate.Add(key);
            }

            TmrDemo.Start();//开始模拟
            timeStart = Environment.TickCount;//记住开始时间
        }

        /// <summary>
        /// 停止模拟
        /// </summary>
        public void Stop()
        {
            TmrDemo.Stop();
        }

        /// <summary>
        /// 产生模拟数据
        /// </summary>
        void CreateData()
        {
            try
            {
                if (!TmrDemo.Enabled) return;

                if (DemoCreat != null)
                {
                    DemoResult demoRes = new DemoResult();

                    if (KeyIDListCreate.Count > 0)
                    {
                        Random rnd = new Random();
                        int nRnd = (int)(KeyIDListCreate.Count * rnd.NextDouble());
                        demoRes.KeyID = KeyIDListCreate[nRnd];
                        //KeyIDListCreate.Remove(demoRes.KeyID);//放在最后。杨斌 2014-06-06
                    }
                    else
                    {
                        Random rnd = new Random();
                        int nRnd = (int)(KeyIDList.Count * rnd.NextDouble());
                        demoRes.KeyID = KeyIDList[nRnd];

                        ////杨斌 2014-06-06
                        //List<int> lstNoVote = new List<int>();
                        //foreach (int key in KeyIDList)
                        //{
                        //    if (!ResultList.ContainsKey(key))
                        //        lstNoVote.Add(key);
                        //}
                        //if (lstNoVote.Count > 0)
                        //{
                        //    nRnd = (int)(lstNoVote.Count * rnd.NextDouble());
                        //    demoRes.KeyID = lstNoVote[nRnd];
                        //}
                    }
                    demoRes.Value = DemoType.GetValue();
                    demoRes.Speed = (Environment.TickCount - timeStart) / (double)1000;

                    if (ResultList.ContainsKey(demoRes.KeyID))
                        ResultList[demoRes.KeyID] = demoRes;
                    else
                        ResultList.Add(demoRes.KeyID, demoRes);

                    if (KeyIDListCreate.Contains(demoRes.KeyID))//杨斌 2014-06-06
                        KeyIDListCreate.Remove(demoRes.KeyID);

                    DemoCreat(demoRes);
                }
            }
            catch(Exception ex)
            {
                //SystemLog.WriterLog(ex, false);
            }
        }

        //计时器事件产生模拟事件
        void TmrDemo_Tick(object sender, EventArgs e)
        {
            CreateData();
        }

    }
}