v9.6.2017.0808   重构正向工程,基于映射表查找数据库字段类型到实体类型的映射
大石头 编写于 2017-08-08 21:38:06
X
using System;
using System.ComponentModel;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using NewLife.Log;
using NewLife.Windows;
using XCoder;

namespace XCom
{
    [DisplayName("串口调试工具")]
    public partial class FrmMain : Form
    {
        /// <summary>业务日志输出</summary>
        ILog BizLog;

        #region 窗体
        public FrmMain()
        {
            InitializeComponent();

            Icon = IcoHelper.GetIcon("串口");
        }

        private void FrmMain_Load(Object sender, EventArgs e)
        {
            var log = TextFileLog.Create(null, "Serial_{0:yyyy_MM_dd}.log");
            BizLog = txtReceive.Combine(log);
            txtReceive.UseWinFormControl();

            txtReceive.SetDefaultStyle(12);
            txtSend.SetDefaultStyle(12);
            numMutilSend.SetDefaultStyle(12);

            gbReceive.Tag = gbReceive.Text;
            gbSend.Tag = gbSend.Text;

            var menu = spList.Menu;
            txtReceive.ContextMenuStrip = menu;

            // 添加清空
            menu.Items.Insert(0, new ToolStripSeparator());
            var ti = new ToolStripMenuItem("清空");
            menu.Items.Insert(0, ti);
            ti.Click += mi清空_Click;

            // 加载保存的颜色
            UIConfig.Apply(txtReceive);

            ti = new ToolStripMenuItem("日志着色");
            ti.Name = "日志着色";
            menu.Items.Insert(2, ti);
            ti.Click += miCheck_Click;
            ti.Checked = XConfig.Current.ColorLog;
        }
        #endregion

        #region 收发数据
        void Connect()
        {
            spList.Connect();
            var st = spList.Port;
            //st.FrameSize = 8;
            if (st == null) return;

            // 需要考虑UI线程
            st.Disconnected += (s, e) => this.Invoke(Disconnect);

            // 发现USB2401端口,自动发送设置命令
            if (st.Description.Contains("USB2401") || st.Description.Contains("USBSER"))
            {
                var cmd = "AT+SET=00070000000000";
                st.Send(cmd.GetBytes());
                BizLog.Info(cmd);
                //TextControlLog.WriteLog(txtReceive, cmd);
            }

            "连接串口{0}".F(st.PortName).SpeechTip();

            btnConnect.Text = "关闭";

            var menu = txtReceive.ContextMenuStrip;
            var mi = menu.Items.Find("日志着色", false).FirstOrDefault() as ToolStripMenuItem;

            var cfg = XConfig.Current;
            cfg.ColorLog = mi.Checked;
            cfg.Save();
        }

        void Disconnect()
        {
            //if (spList.Enabled) return;
            if (btnConnect.Text == "打开") return;

            var st = spList.Port;
            if (st != null) st.Disconnected -= (s, e) => this.Invoke(Disconnect);
            spList.Disconnect();

            "串口已断开".SpeechTip();

            btnConnect.Text = "打开";
        }

        private void btnConnect_Click(Object sender, EventArgs e)
        {
            var btn = sender as Button;
            if (btn.Text == "打开")
                Connect();
            else
                Disconnect();
        }

        void OnReceived(Object sender, StringEventArgs e)
        {
            var line = e.Value;
            //TextControlLog.WriteLog(txtReceive, line);

            BizLog?.Info(line);
        }

        Int32 _pColor = 0;
        Int32 lastReceive = 0;
        Int32 lastSend = 0;
        private void timer1_Tick(Object sender, EventArgs e)
        {
            var sp = spList.Port;
            if (sp != null)
            {
                // 检查串口是否已断开,自动关闭已断开的串口,避免内存暴涨
                if (!spList.Enabled && btnConnect.Text == "打开")
                {
                    Disconnect();
                    return;
                }

                var rcount = spList.BytesOfReceived;
                var tcount = spList.BytesOfSent;
                if (rcount != lastReceive)
                {
                    gbReceive.Text = (gbReceive.Tag + "").Replace("0", rcount + "");
                    lastReceive = rcount;
                }
                if (tcount != lastSend)
                {
                    gbSend.Text = (gbSend.Tag + "").Replace("0", tcount + "");
                    lastSend = tcount;
                }

                var set = XConfig.Current;
                if (set.ColorLog) txtReceive.ColourDefault(_pColor);
                _pColor = txtReceive.TextLength;
            }
        }

        private void btnSend_Click(Object sender, EventArgs e)
        {
            var str = txtSend.Text;
            if (String.IsNullOrEmpty(str))
            {
                MessageBox.Show("发送内容不能为空!", Text);
                txtSend.Focus();
                return;
            }

            // 多次发送
            var count = (Int32)numMutilSend.Value;
            var sleep = (Int32)numSleep.Value;
            if (count <= 0) count = 1;
            if (sleep <= 0) sleep = 100;

            // 处理换行
            str = str.Replace("\n", "\r\n");

            if (count == 1)
            {
                spList.Send(str);
                return;
            }

            Task.Factory.StartNew(() =>
            {
                for (Int32 i = 0; i < count; i++)
                {
                    spList.Send(str);

                    if (count > 1) Thread.Sleep(sleep);
                }
            }).LogException();
        }
        #endregion

        #region 右键菜单
        private void mi清空_Click(Object sender, EventArgs e)
        {
            txtReceive.Clear();
            spList.ClearReceive();
        }

        private void mi清空2_Click(Object sender, EventArgs e)
        {
            txtSend.Clear();
            spList.ClearSend();
        }

        private void miCheck_Click(Object sender, EventArgs e)
        {
            var mi = sender as ToolStripMenuItem;
            mi.Checked = !mi.Checked;
        }
        #endregion
    }
}