using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.Serialization;
using System.Xml.Serialization;
using System.IO;
using System.Linq;
using System.Xml;

namespace SiaSun.LMS.LED
{
    public partial class Main : Form
    {
        #region 自定义变量

        SiaSun.LMS.Common.BX_5M mBX_5M = new SiaSun.LMS.Common.BX_5M();

        public static Main mainWin;

        #endregion

        #region 构造函数

        public Main()
        {
            InitializeComponent();
            mainWin = this;
        }

        #endregion

        #region 系统函数

        //加载窗体
        private void Main_Load(object sender, EventArgs e)
        {
            //忽略线程间调用错误
            Control.CheckForIllegalCrossThreadCalls = false;

            //初始化LED资源
            mBX_5M.InitDLLResource(this.Handle);


            //显示托盘
            this.notifyIcon1.Visible = true;

            this.btnStop.Enabled = false;

            //默认启动
            this.btnStart_Click(null, EventArgs.Empty);

            //后台运行:属性中FormWindowState=Maximized
            this.btnBackRun_Click(null, EventArgs.Empty);
        }

        //启动发送大屏
        private void btnStart_Click(object sender, EventArgs e)
        {
            try
            {
                //设置状态
                btnStart.Enabled = false;
                btnStop.Enabled = true;

                //启动
                LEDApply.RunWorkerAsync();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        //停止发送大屏
        private void btnStop_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("确定停止LED监视任务!","系统提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Asterisk) == DialogResult.OK)
            {
                try
                {
                    btnStop.Enabled = false;
                    btnStart.Enabled = true;
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
        }

        //后台监控
        private void LEDApply_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {  
                while (btnStop.Enabled)
                {
                    //检查是否最大值
                    if (rchMessage.Lines.Length >= rchMessage.MaxLength)
                        rchMessage.Clear();


                    

                    //BX-5M
                    this.LED_SEND(mBX_5M);

                    //延迟显示
                    System.Threading.Thread.Sleep(2000);

                    //释放内存
                    System.Diagnostics.Process.GetCurrentProcess().MinWorkingSet = new IntPtr(20);
                }
            }
            catch (Exception ex)
            {
                btnStart.Enabled = true;
                btnStop.Enabled = false;
                lblMessage.Text = ex.Message;
            }
        }

        //后台运行
        private void btnBackRun_Click(object sender, EventArgs e)
        {
            if (!this.Visible)
                return;

            this.WindowState = FormWindowState.Minimized;

            this.Hide();

            this.notifyIcon1.ShowBalloonTip(3, "提示", "程序隐藏在后台运行", ToolTipIcon.Info);
        }

        #endregion

        #region    显示或隐藏窗体

        //显示
        private void menuItemShow_Click(object sender, EventArgs e)
        {
            if (this.Visible)
                return;
            this.StartPosition = FormStartPosition.CenterScreen;
            this.WindowState = FormWindowState.Maximized;
            this.Visible = true;
        }

        //双击显示
        private void notifyIcon1_DoubleClick(object sender, EventArgs e)
        {
            menuItemShow_Click(null, EventArgs.Empty);
        }

        //退出
        private void menuItemExit_Click(object sender, EventArgs e)
        {
            try
            {
                //停止监视
                btnStop_Click(null, EventArgs.Empty);

                //释放资源
                this.LEDApply.Dispose();

                //释放LED资源
                //mBX_5M.FreeDLLResource();

                //释放资源
                this.notifyIcon1.Visible = false;
                this.notifyIcon1.Dispose();

                //退出
                Application.ExitThread();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        #endregion

        #region 自定义方法

        public void LED_SEND(SiaSun.LMS.Common.BX_5M mBX_5M)
        {
            int AREA_NO =-1;

            int RETURN_ERROR = 0;

            string RETURN_ERROR_MESSAGE = string.Empty;

            string APP_PATH = AppDomain.CurrentDomain.BaseDirectory.ToString().Trim();

       

            try
            {
                //取得自动处理标识为“1”自动处理,发送状态为“0”未发送的记录
                IList<SiaSun.LMS.Model.LED_MAIN> lsLED_MAIN = Program._I_LEDService.LED_MAIN_GetList_AUTO_FLAG_LED_STATUS("1", "0");

                

                foreach (SiaSun.LMS.Model.LED_MAIN mLED_MAIN in lsLED_MAIN)
                {
                    //检查是否最大值
                    if (rchMessage.Lines.Length >= rchMessage.MaxLength)
                        rchMessage.Clear();

                    //初始化图文区序号
                    AREA_NO = -1;

                    #region 添加屏幕

                    RETURN_ERROR = mBX_5M.AddScreen(mLED_MAIN.CONTROL_TYPE,
                                                    mLED_MAIN.SCREEN_WIDTH,
                                                    mLED_MAIN.SCREEN_HEIGHT,
                                                    mLED_MAIN.LED_IP);
                    if (!mBX_5M.GetErrorMessage("AddScreen", RETURN_ERROR, out RETURN_ERROR_MESSAGE))
                    {
                        rchMessage.Text += SiaSun.LMS.Common.StringUtil.GetCurDateTimeString() + string.Format("AddScreen Error: {0}\r\n", RETURN_ERROR_MESSAGE);
                    }

                    #endregion

                    #region 添加节目
                    
                    RETURN_ERROR = mBX_5M.AddScreenProgram();
                    if (!mBX_5M.GetErrorMessage("AddScreenProgram", RETURN_ERROR, out RETURN_ERROR_MESSAGE))
                    {
                        rchMessage.Text += SiaSun.LMS.Common.StringUtil.GetCurDateTimeString() + string.Format("AddScreenProgram Error: {0}\r\n", RETURN_ERROR_MESSAGE);
                    }

                    #endregion

                    //取得指定LED_ID且按LINE_NO从小到大排序的LED_LIST记录
                    IList<SiaSun.LMS.Model.LED_LIST> lsLED_LIST = Program._I_LEDService.LED_LIST_GetList_LED_ID(mLED_MAIN.LED_ID);

                    foreach (SiaSun.LMS.Model.LED_LIST mLED_LIST in lsLED_LIST)
                    {
                        //BX-5M屏幕不支持发送内容为空
                        if (string.IsNullOrEmpty(mLED_LIST.LINE_TEXT) || mLED_LIST.LINE_TEXT == null)
                        {
                            if (mLED_LIST.LINE_NO == 1)
                            {

                                if (mLED_MAIN.DEVICE_CODE == "12007")
                                    mLED_LIST.LINE_TEXT = "1#垛机空闲  ";
                                if (mLED_MAIN.DEVICE_CODE == "12010")
                                    mLED_LIST.LINE_TEXT = "2#垛机空闲  ";
                                if (mLED_MAIN.DEVICE_CODE == "12013")
                                    mLED_LIST.LINE_TEXT = "3#垛机空闲  ";
                                if (mLED_MAIN.DEVICE_CODE == "12016")
                                    mLED_LIST.LINE_TEXT = "4#垛机空闲  ";
                            }
                            else
                            {
                                if (mLED_MAIN.DEVICE_CODE == "12007")
                                    mLED_LIST.LINE_TEXT = "1#入库站台正常  ";
                                if (mLED_MAIN.DEVICE_CODE == "12010")
                                    mLED_LIST.LINE_TEXT = "2#入库站台正常  ";
                                if (mLED_MAIN.DEVICE_CODE == "12013")
                                    mLED_LIST.LINE_TEXT = "3#入库站台正常  ";
                                if (mLED_MAIN.DEVICE_CODE == "12016")
                                    mLED_LIST.LINE_TEXT = "4#入库站台正常  ";
                            }

                            //continue;
                        }
                        //else
                        //{
                        //    if (mLED_LIST.LINE_NO == 0)
                        //    {
                        //        if (!string.IsNullOrEmpty(mLED_MAIN.LED_MAIN_PARA1) && mLED_MAIN.LED_MAIN_PARA1 != null)
                        //        {
                        //            //if (Convert.ToDateTime(mLED_MAIN.LED_MAIN_PARA1.ToString()).AddSeconds(30) < System.DateTime.Now)
                        //            //{
                        //            //if (mLED_MAIN.DEVICE_CODE == "12007" && mLED_LIST.LINE_TEXT != "1巷道入库站台正常   ")
                        //            //    mLED_LIST.LINE_TEXT = "1巷道入库站台正常   ";
                        //            //if (mLED_MAIN.DEVICE_CODE == "12010" && mLED_LIST.LINE_TEXT != "2巷道入库站台正常   ")
                        //            //    mLED_LIST.LINE_TEXT = "2巷道入库站台正常    ";
                        //            //if (mLED_MAIN.DEVICE_CODE == "12013" && mLED_LIST.LINE_TEXT != "3巷道入库站台正常   ")
                        //            //    mLED_LIST.LINE_TEXT = "3巷道入库站台正常    ";
                        //            //if (mLED_MAIN.DEVICE_CODE == "12016" && mLED_LIST.LINE_TEXT != "4巷道入库站台正常   ")
                        //            //    mLED_LIST.LINE_TEXT = "4巷道入库站台正常    ";
                        //            //}
                        //        }
                        //        //else
                        //        //{
                        //        //    continue;
                        //        //}
                        //    }
                        //}





                        //图文区序号从0开始
                        AREA_NO++;

                        string PATH = APP_PATH + mLED_LIST.FILE_NAME;

                        #region 添加图文区
                        
                        RETURN_ERROR = mBX_5M.AddScreenProgramBmpTextArea(mLED_LIST.AREA_X,
                                                                          mLED_LIST.AREA_Y,
                                                                          mLED_LIST.AREA_WIDTH,
                                                                          mLED_LIST.AREA_HEIGHT);
                        if (!mBX_5M.GetErrorMessage("AddScreenProgramBmpTextArea", RETURN_ERROR, out RETURN_ERROR_MESSAGE))
                        {
                            rchMessage.Text += SiaSun.LMS.Common.StringUtil.GetCurDateTimeString() + string.Format("AddScreenProgramBmpTextArea Error: {0}\r\n", RETURN_ERROR_MESSAGE);
                        }

                        #endregion

                        //生成或重写对应文件
                        //System.IO.File.WriteAllText(PATH,mLED_LIST.LINE_TEXT.Length>15? mLED_LIST.LINE_TEXT.Substring(0,14): mLED_LIST.LINE_TEXT);

                        System.IO.File.WriteAllText(PATH,mLED_LIST.LINE_TEXT);

                        //160,32的屏幕,10号字体,每行最多显示10字
                        if (mLED_LIST.LINE_TEXT.Length < 11)
                        {
                            mLED_LIST.SHOW_STUNT = 1;//静止
                        }

                        #region 添加文件到图文区
                        
                        RETURN_ERROR = mBX_5M.AddScreenProgramAreaBmpTextFile(AREA_NO,
                                                                              PATH,
                                                                              mLED_LIST.FONT_SIZE,
                                                                              mLED_LIST.SHOW_STUNT,
                                                                              mLED_LIST.RUN_SPEED,
                                                                              mLED_LIST.SHOW_TIME);
                        if (!mBX_5M.GetErrorMessage("AddScreenProgramAreaBmpTextFile", RETURN_ERROR, out RETURN_ERROR_MESSAGE))
                        {
                            rchMessage.Text += SiaSun.LMS.Common.StringUtil.GetCurDateTimeString() + string.Format("AddScreenProgramAreaBmpTextFile Error: {0}\r\n", RETURN_ERROR_MESSAGE);
                        }

                        #endregion
                    }

                    //未添加任何图文区
                    if (AREA_NO == -1)
                    {
                        #region 强制关机

                        //RETURN_ERROR = mBX_5M.PowerOffScreen();
                        //if (!mBX_5M.GetErrorMessage("PowerOffScreen", RETURN_ERROR, out RETURN_ERROR_MESSAGE))
                        //{
                        //    rchMessage.Text += SiaSun.LMS.Common.StringUtil.GetCurDateTimeString() + string.Format("PowerOffScreen Error: {0}\r\n", RETURN_ERROR_MESSAGE);
                        //}

                        #endregion
                    }
                    else
                    {
                        #region 强制开机

                        //RETURN_ERROR = mBX_5M.PowerOnScreen();
                        //if (!mBX_5M.GetErrorMessage("PowerOnScreen", RETURN_ERROR, out RETURN_ERROR_MESSAGE))
                        //{
                        //    rchMessage.Text += SiaSun.LMS.Common.StringUtil.GetCurDateTimeString() + string.Format("PowerOnScreen Error: {0}\r\n", RETURN_ERROR_MESSAGE);
                        //}

                        #endregion

                        #region 发送数据
          
                        RETURN_ERROR = mBX_5M.SendScreenInfo();
                        if (!mBX_5M.GetErrorMessage("SendScreenInfo", RETURN_ERROR, out RETURN_ERROR_MESSAGE))
                        {
                            rchMessage.Text += SiaSun.LMS.Common.StringUtil.GetCurDateTimeString() + string.Format("SendScreenInfo Error: {0}\r\n", RETURN_ERROR_MESSAGE);
                        }

                        #endregion
                    }

                    #region 删除屏幕

                    RETURN_ERROR = mBX_5M.DeleteScreen();
                    if (!mBX_5M.GetErrorMessage("DeleteScreen", RETURN_ERROR, out RETURN_ERROR_MESSAGE))
                    {
                        rchMessage.Text += SiaSun.LMS.Common.StringUtil.GetCurDateTimeString() + string.Format("DeleteScreen Error: {0}\r\n", RETURN_ERROR_MESSAGE);
                    }

                    #endregion

                    //更新LED_MAIN.LED_STATUS="1"(已发送)
                    mLED_MAIN.LED_STATUS = "1";
                    mLED_MAIN.LED_MAIN_PARA1 = System.DateTime.Now.ToString();
                    Program._I_LEDService.LED_MAIN_Update(mLED_MAIN);
                }
            }
            catch (Exception ex)
            {
                //Program._log.Error(string.Format("LED_SEND catch Exception: {0}", ex.Message));
            }
        }


        #endregion

        #region 数据清理

        private void miDataClear_Click(object sender, EventArgs e)
        {
            ToolStripMenuItem item = sender as ToolStripMenuItem;
            if (item != null)
            {
                switch (item.Name)
                {
                    //数据清理
                    case "miDataClear":
                        TABLE_CLEAR frmClear = new TABLE_CLEAR();
                        frmClear.Show(this);
                        break;
                }
            }
        }

        #endregion
    }
}