using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

using My.SerialPort;                                                                     //自定义的串口助手类  
using System.IO.Ports;
using ShowforAW60ByCharp.Data;                                                           //工程数据区

namespace ShowforAW60ByCharp
{
    ///----------------------------------------------------------------------------------
    /// <summary>
    ///     该Form页为应用程序预开始页，显示启动画面。通过在ShockwaveFlah控件中播放制作
    ///     好的开始flash动画。  同时在程序中不停的接听来自底端程序通过串口SCI发来的演
    ///     示界面启动命令串。形如 0xFF 0xFF 0xFF code 0x00 0x00 0x00. 01-start 02-stop
    /// </summary>
    ///----------------------------------------------------------------------------------
    public partial class PreStart : Form
    {
        string                ComNum;                                                    //用于放用于串口通讯的号，比如COM1

        bool                  RunOkFlag            = false;                              //运行正常标志，用于执行特别函数的时候，判断是否执行成功
        string                Message;                                                   //运行状态，以及出错信息
        byte[]                ReceiveDataArray;                                          //临时用于接收数据的数组，byte型

        delegate void delegateFor7ByteFromMCU(string str);                               //委托,将从串口接收到的数据显示出来
        SerialPort SpForControlPC = new SerialPort();                                    //首先定义一个串口通讯通道

        /// <summary>
        /// 表单初始化，同时也初始化flash控件，显示flash动画。并不停监听底端动态。即查看
        /// SCI有无数据可以接受。
        /// </summary>
        public PreStart()
        {
            InitializeComponent();

            this.axShockwaveFlash1.Movie = Application.StartupPath.ToString() +          //获取应用程序所在地址 
                                                                  "\\startflash.swf";    //将FLASH文件地址赋给shockwaveFlash控件    
            this.axShockwaveFlash1.Play();                                               //播放FLASH影片

                                                                                         //处理SCI接收，判断有无底层发送过来的启动命令
            if (SerialPort.GetPortNames().Length > 0)                                    //判断当前系统是否存在串口,> 0则存在
            {
                ComNum = SerialPort.GetPortNames().GetValue(0).ToString();               //获取当前系统中存在的第一个串口 


                if (SpForControlPC.IsOpen)
                    HelperSCI.SCIClose(SpForControlPC);                                  //判断当前选用的串口是否已经打开，如果是，则关闭
                                                                                         //初始化串口,并打开
                RunOkFlag = HelperSCI.SCIInit(SpForControlPC, ComNum, DefinedTypeData.BaudRate);

                if (!RunOkFlag)
                {
                    Message = "串口" + ComNum + "以波特率" + DefinedTypeData.BaudRate.ToString() + "进行初始化，失败！";
                    MessageBox.Show(Message);                                            //显示处理消息
                    this.Close();                                                        //关闭应用程序 //如果串口打开失败，跳出，并显示出错信息.否则继续向下执行
                }
                else
                {
                                                                                         //打开串口没有出错，接收串口数据
                    HelperSCI.SetBytesForReceived(SpForControlPC, 7);                    //设定受到7个字节，进行接收。因为底端发过来的就是7个字节

                    SpForControlPC.DataReceived +=                                       //绑定DataReceived事件
                        new SerialDataReceivedEventHandler(this.SpForControlPC_DataReceived);
                }

            }
            else
            {
                                                                                         //不存在串口，直接跳出，并提示警告信息;
                Message = "检测到你的系统中不存在串口！";
                MessageBox.Show(Message);                                                //显示处理消息
                this.Close();                                                            //关闭应用程序
            }

        }


        /// <summary>
        /// 表单Form1的双击事件,用于退出应用程序
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Form1_DoubleClick(object sender, EventArgs e)
        {
            this.Close();                                                                //双击表单空白处时，退出应用程序
            //Application.Run(new StartShow());
            
            //this.Hide();
        }

        private void PreStart_FormClosed(object sender, FormClosedEventArgs e)
        {
            //Application.Run(new StartShow());
            //this.Hide();
        }


        #region SpForControlPC_DataReceived事件，触发事件。此过程进行演示页面的显示
        ///------------------------------------------------------------------------------
        /// <summary>
        /// 串口DataReceived事件，当收到一定数据后，自动触发该事件。
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        ///------------------------------------------------------------------------------
        private void SpForControlPC_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            int i;
          
            if (HelperSCI.SCIReceiveData(SpForControlPC,                                 //开始接受数据,并放置于ReceiveDataArray中
                                    ref ReceiveDataArray))                               //注意使用 ref关键字，需要赋值
            {
                if (ReceiveDataArray.Length != 7)                                        //如果接受到的不是7位，则清空此次接收数据，重新接收    * * *
                {
                    for (i = 0; i < ReceiveDataArray.Length; i++)
                        ReceiveDataArray[i] = 0;                                         //都清零，避免影响
                }
                else
                {
                    CmdBytesFromMCU_Handle(ReceiveDataArray);                            //如果接收到的位7位，属于我规定的位数，准备解析出执行码
                }
            }
        }
        ///------------------------------------------------------------------------------
        /// <summary>
        /// 处理从低端接收过来的数据，解析出操作码。形如0xFF 0xFF 0xFF CODE 0x00 0x00 0x00
        /// </summary>
        /// <param name="CmdB">接收到的数据字节</param>
        ///------------------------------------------------------------------------------
        private void CmdBytesFromMCU_Handle(byte[] CmdB)
        {
            if (!(CmdB[0] == DefinedTypeData.CODE_FAILED &&                              //识别除CODE位的其他标识，是否正确
                  CmdB[1] == DefinedTypeData.CODE_FAILED &&
                  CmdB[2] == DefinedTypeData.CODE_FAILED &&
                  CmdB[4] == DefinedTypeData.CODE_SUCCESSED &&
                  CmdB[5] == DefinedTypeData.CODE_SUCCESSED &&
                  CmdB[6] == DefinedTypeData.CODE_SUCCESSED))                                              
            {
                return;                                                                  //如果标识识别失败，说明为非法或意外指令，直接跳出函数
            }

            if (CmdB[3] == DefinedTypeData.CODE_START_PC_SHOW)                           //识别到开始命令码CODE_START_PC_SHOW
            {
                                                                                         //识别到AW60演示开始命令.准备显示AW60演示功能页面
                                                                                         //FOR TEST,this.Close();//能够执行到这里
                HelperSCI.SCIClose(SpForControlPC);                                      //关闭串口

                System.Threading.Thread t = new                                          //利用线程打开新的窗体               
                   System.Threading.Thread(new System.Threading.ThreadStart(NewMainWinForm));
                t.Start();  
            }
            else if (CmdB[3] == DefinedTypeData.CODE_STOP_PC_SHOW)
            {
                /* 识别到AW60演示的停止命令
                   暂时保留处理，可扩展     */

            }
            else
            {
                /* 其他命令不作处理
                   暂时保留处理，可扩展     */
            }
        }
        #endregion


        /// <summary>
        /// 打开新的窗体，SartShow
        /// </summary>
        public void NewMainWinForm()
        {
            Application.Run(new StartShow());
        }


    }
}



/* ***  2010/09/26 截止  苏州大学嵌入式仿真研究所 *** */
