Beispiel #1
0
        private void TaskBuilder()
        {
            //回复同步
            mRecoverTask              = new SimpleSerialPortTask <ResetEcuReq, NullEntity>();
            mRecoverParam             = mRecoverTask.GetRequestEntity();
            mRecoverTask.RetryMaxCnts = 1;
            mRecoverTask.Timerout     = 1000;
            mRecoverParam.deviceType  = 0XF1;
            mRecoverParam.cmdCode     = 0x02;
            mRecoverParam.param1      = 0;
            mRecoverParam.param2      = 0;
            //等待同步报文
            //监听0x06
            mBroadCastTask = new SimpleSerialPortTask <NullEntity, pcTakeoverReq>();
            mBroadCastTask.RetryMaxCnts = 0;
            mBroadCastTask.Timerout     = 30 * 1000;
            mBroadCastTask.SimpleSerialPortTaskOnPostExecute += (object sender, EventArgs e) =>
            {
                SerialPortEventArgs <pcTakeoverReq> mEventArgs = e as SerialPortEventArgs <pcTakeoverReq>;
                if (mEventArgs.Data != null)
                {
                    //PC接管报文的响应
                    mStopSyncTask.Excute();
                    //启动监控,防止没有发成功,直到由PC接管为止
                    mMonitorTask.Excute();
                }
                else
                {
                    SetListView(sender, "上电超时!", "设备未上电或通讯有异常");
                    SetItemFail(sender, BindSteps.WAIT_POWER);
                    SetMainText(sender, STEP_LEVEL.FAIL);
                    StopTask();
                }
            };
            //监控同步报文
            mMonitorTask = new SimpleSerialPortTask <NullEntity, pcTakeoverReq>();
            mMonitorTask.RetryMaxCnts = 0;
            mMonitorTask.Timerout     = 1000;
            mMonitorTask.SimpleSerialPortTaskOnPostExecute += (object sender, EventArgs e) =>
            {
                SerialPortEventArgs <pcTakeoverReq> mEventArgs = e as SerialPortEventArgs <pcTakeoverReq>;
                if (mEventArgs.Data != null)
                {
                    mStopSyncTask.Excute();
                    //再继续监控
                    mMonitorTask.Excute();
                }
                else
                {
                    SetMainText(sender, STEP_LEVEL.CHECK_SN);
                    mGetDevInfoTask.Excute();
                }
            };

            //停止同步报文
            mStopSyncTask              = new SimpleSerialPortTask <pcTakeOverRsp, NullEntity>();
            mStopSyncParam             = mStopSyncTask.GetRequestEntity();
            mStopSyncTask.RetryMaxCnts = 0;
            mStopSyncTask.Timerout     = 1000;
            mStopSyncParam.DeviceType  = 0xF1;
            mStopSyncParam.HardWareID  = 0xF1;
            mStopSyncParam.FirmID      = 0;

            //获取SN号
            mGetDevInfoTask = new SimpleSerialPortTask <getDevinfoReq, getDevinfoRsp>();
            mDevInfoParam   = mGetDevInfoTask.GetRequestEntity();
            mGetDevInfoTask.RetryMaxCnts = 10;
            mGetDevInfoTask.Timerout     = 1000;
            mDevInfoParam.devType        = 0X08;
            mGetDevInfoTask.SimpleSerialPortTaskOnPostExecute += (object sender, EventArgs e) =>
            {
                SerialPortEventArgs <getDevinfoRsp> mEventArgs = e as SerialPortEventArgs <getDevinfoRsp>;
                if (mEventArgs.Data != null)
                {
                    string devSN = ByteProcess.byteArrayToString(mEventArgs.Data.devSN);
                    if (mSN != devSN)
                    {
                        string temp = String.Format("设备读取的SN号:{0}", devSN);
                        SetListView(sender, "标签和设备SN号不匹配", temp);
                        SetMainText(sender, STEP_LEVEL.FAIL);
                        SetItemFail(sender, BindSteps.SN_VALID);
                        mRecoverTask.Excute();
                        StopTask();
                    }
                    else
                    {
                        SetValidSN(sender, INFO_LEVEL.PASS);
                        SetMainText(sender, STEP_LEVEL.BIND_KEY1);
                        mBindKey1Param.ack_device = Const.PCU;
                        mBindKey1Task.Excute();
                        mTimeout = 100;
                    }
                }
                else
                {
                    SetListView(sender, "未收到读取设备信息", "设备未上电或通讯有异常");
                    SetMainText(sender, STEP_LEVEL.FAIL);
                    SetValidSN(sender, INFO_LEVEL.FAIL);
                    mRecoverTask.Excute();
                    StopTask();
                }
            };

            mBindKey1Task              = new SimpleSerialPortTask <get7001Result, get7001ResultRsp>();
            mBindKey1Param             = mBindKey1Task.GetRequestEntity();
            mBindKey1Param.ack_device  = Const.PCU;
            mBindKey1Param.server_mode = 0x08;//绑定钥匙
            mBindKey1Task.RetryMaxCnts = 0;
            mBindKey1Task.Timerout     = 10 * 1000;
            mBindKey1Task.SimpleSerialPortTaskOnPostExecute += (object sender, EventArgs e) =>
            {
                SerialPortEventArgs <get7001ResultRsp> mEventArgs = e as SerialPortEventArgs <get7001ResultRsp>;
                if (mEventArgs.Data != null)
                {
                    byte mAskDevice = (byte)mEventArgs.Data.ack_device; //应答设备
                    byte mAskResult = (byte)mEventArgs.Data.ack_value;  //响应
                    int  temp       = (byte)mEventArgs.Data.CutError_1 |
                                      mEventArgs.Data.CutError_2 << 8 |
                               mEventArgs.Data.ShortError_1 << 16;
                    int iAddrCode = temp >> 4;
                    if (mAskDevice == Const.PCU)
                    {
                        // 如果不为0, 说明有按下,把地址码键值存入List
                        if (iAddrCode != 0)
                        {
                            // 先判断是否含有某个Key
                            if (ht.ContainsKey(iAddrCode))
                            {
                                int iCnt = (int)ht[iAddrCode];
                                ht[iAddrCode] = iCnt + 1;
                            }
                            else//如果不存在此KEY
                            {
                                ht.Add(iAddrCode, 0);
                            }
                        }
                    }
                    //判断哈希的最大值
                    int valueMax = 0;
                    foreach (int value in ht.Values)
                    {
                        if (value > valueMax)
                        {
                            valueMax = value;
                        }
                    }
                    //判断次数是否超过某一值
                    if (valueMax >= this.TryCnts)
                    {
                        foreach (int key in ht.Keys)
                        {
                            if ((int)ht[key] == valueMax)
                            {
                                SetBindKey1(sender, INFO_LEVEL.PASS);
                                //保存Key1按键
                                mKey1Value = key;
                                mTimeout   = 100;
                                byte[] temp1 = new byte[3];
                                temp1[0] = (byte)(mKey1Value >> 16 & 0xFF);
                                temp1[1] = (byte)(mKey1Value >> 8 & 0xFF);
                                temp1[2] = (byte)(mKey1Value & 0xFF);
                                mWriteKeyParam.Key1Value = temp1;
                                SetKeyValue(sender, KeyType.BIND_KEY1, mKey1Value);
                                ht.Clear();
                                //写NV
                                if (KeyNumber == 2)
                                {
                                    SetMainText(sender, STEP_LEVEL.BIND_KEY2);
                                    mBindKey2Task.Excute();
                                }
                                else
                                {
                                    //写NV
                                    byte[] temp2 = new byte[3];
                                    mWriteKeyParam.Key2Value = temp2;
                                    mWriteKeyTask.Excute();
                                }
                                return;
                            }
                        }
                    }
                    if (mTimeout-- > 0)
                    {
                        Thread.Sleep(50);
                        mBindKey1Task.Excute();
                    }
                    else
                    {
                        SetListView(sender, "绑定超时", "未在5秒内,有效按下按键");
                        SetItemFail(sender, BindSteps.KEY1_BIND);
                        SetMainText(sender, STEP_LEVEL.BIND_TIMEOUT);
                        mRecoverTask.Excute();
                        StopTask();
                    }
                }
                else
                {
                    SetListView(sender, "未收到钥匙的绑定和检查的响应", "设备未上电或通讯有异常");
                    SetItemFail(sender, BindSteps.KEY1_BIND);
                    SetMainText(sender, STEP_LEVEL.FAIL);
                    mRecoverTask.Excute();
                    StopTask();
                }
            };

            mBindKey2Task              = new SimpleSerialPortTask <get7001Result, get7001ResultRsp>();
            mBindKey2Param             = mBindKey2Task.GetRequestEntity();
            mBindKey2Param.ack_device  = Const.PCU;
            mBindKey2Param.server_mode = 0x08;//绑定钥匙
            mBindKey2Task.RetryMaxCnts = 0;
            mBindKey2Task.Timerout     = 10 * 1000;
            mBindKey2Task.SimpleSerialPortTaskOnPostExecute += (object sender, EventArgs e) =>
            {
                SerialPortEventArgs <get7001ResultRsp> mEventArgs = e as SerialPortEventArgs <get7001ResultRsp>;
                if (mEventArgs.Data != null)
                {
                    byte mAskDevice = (byte)mEventArgs.Data.ack_device; //应答设备
                    byte mAskResult = (byte)mEventArgs.Data.ack_value;  //响应
                    int  temp       = (byte)mEventArgs.Data.CutError_1 |
                                      mEventArgs.Data.CutError_2 << 8 |
                               mEventArgs.Data.ShortError_1 << 16;
                    int iAddrCode = temp >> 4;
                    if (mAskDevice == Const.PCU)
                    {
                        // 如果不为0, 说明有按下,把地址码键值存入List
                        if (iAddrCode != 0 && iAddrCode != mKey1Value)
                        {
                            // 先判断是否含有某个Key
                            if (ht.ContainsKey(iAddrCode))
                            {
                                int iCnt = (int)ht[iAddrCode];
                                ht[iAddrCode] = iCnt + 1;
                            }
                            else//如果不存在此KEY
                            {
                                ht.Add(iAddrCode, 0);
                            }
                        }
                    }
                    //判断哈希的最大值
                    int valueMax = 0;
                    foreach (int value in ht.Values)
                    {
                        if (value >= valueMax)
                        {
                            valueMax = value;
                        }
                    }
                    //判断次数是否超过某一值
                    if (valueMax > this.TryCnts)
                    {
                        foreach (int key in ht.Keys)
                        {
                            if ((int)ht[key] == valueMax)
                            {
                                SetBindKey2(sender, INFO_LEVEL.PASS);
                                //保存Key1按键
                                mKey2Value = key;
                                byte[] temp1 = new byte[3];
                                temp1[0] = (byte)(mKey2Value >> 16 & 0xFF);
                                temp1[1] = (byte)(mKey2Value >> 8 & 0xFF);
                                temp1[2] = (byte)(mKey2Value & 0xFF);
                                mWriteKeyParam.Key2Value = temp1;
                                SetKeyValue(sender, KeyType.BIND_KEY2, mKey2Value);
                                mWriteKeyTask.Excute();
                                ht.Clear();
                                return;
                            }
                        }
                    }

                    if (mTimeout-- > 0)
                    {
                        Thread.Sleep(50);
                        mBindKey2Task.Excute();
                    }
                    else
                    {
                        SetListView(sender, "绑定超时", "未在5秒内,有效按下按键");
                        SetItemFail(sender, BindSteps.KEY2_BIND);
                        SetMainText(sender, STEP_LEVEL.BIND_TIMEOUT);
                        mRecoverTask.Excute();
                        StopTask();
                    }
                }
                else
                {
                    SetListView(sender, "未收到钥匙的绑定和检查的响应", "设备未上电或通讯有异常");
                    SetItemFail(sender, BindSteps.KEY2_BIND);
                    SetMainText(sender, STEP_LEVEL.FAIL);
                    mRecoverTask.Excute();
                    StopTask();
                }
            };

            mWriteKeyTask              = new SimpleSerialPortTask <writeKeyAddrReq, writeKeyAddrRsp>();
            mWriteKeyParam             = mWriteKeyTask.GetRequestEntity();
            mWriteKeyParam.Key1Index   = 0;
            mWriteKeyParam.Key2Index   = 1;
            mWriteKeyParam.KeyNumber   = 2;
            mWriteKeyParam.DeviceType  = Const.CCU;
            mWriteKeyTask.RetryMaxCnts = 0;
            mWriteKeyTask.Timerout     = 10 * 1000;
            mWriteKeyTask.SimpleSerialPortTaskOnPostExecute += (object sender, EventArgs e) =>
            {
                SerialPortEventArgs <writeKeyAddrRsp> mEventArgs = e as SerialPortEventArgs <writeKeyAddrRsp>;
                if (mEventArgs.Data != null)
                {
                    byte mResult = (byte)mEventArgs.Data.Result;
                    if (mResult == 0)
                    {
                        ht.Clear();
                        SetWriteNV(sender, INFO_LEVEL.PASS);
                        SetMainText(sender, STEP_LEVEL.PASS);
                        mRecoverTask.Excute();
                        StopTask();
                    }
                }
                else
                {
                    SetListView(sender, "写钥匙地址到设备失败", "设备异常或通讯有异常");
                    SetItemFail(sender, BindSteps.WRITE_NV);
                    SetMainText(sender, STEP_LEVEL.FAIL);
                    mRecoverTask.Excute();
                    StopTask();
                }
            };
        }
Beispiel #2
0
        private void TaskBuilder()
        {
            //停止同步报文
            mStopSyncTask              = new SimpleSerialPortTask <pcTakeOverRsp, NullEntity>();
            mStopSyncParam             = mStopSyncTask.GetRequestEntity();
            mStopSyncTask.RetryMaxCnts = 0;
            mStopSyncTask.Timerout     = 1000;
            mStopSyncParam.DeviceType  = 0xF1;
            mStopSyncParam.HardWareID  = 0xF1;
            // mStopSyncParam.FirmID = 17;
            //mStopSyncParam.FirmID1 = 35;
//mStopSyncParam.FirmID2 = 4;
            //重启指令
            mResetEcuTask              = new SimpleSerialPortTask <ResetEcuReq, NullEntity>();
            mResetEcuParam             = mResetEcuTask.GetRequestEntity();
            mResetEcuTask.RetryMaxCnts = 0;
            mResetEcuTask.Timerout     = 1000;
            mResetEcuParam.deviceType  = 0XF1;
            mResetEcuParam.cmdCode     = 0x02;
            mResetEcuParam.param1      = 0x11223344;
            //等待同步报文
            mBroadCastTask = new SimpleSerialPortTask <NullEntity, pcTakeoverReq>();
            mBroadCastTask.RetryMaxCnts = 0;
            mBroadCastTask.Timerout     = 500;
            mBroadCastTask.SimpleSerialPortTaskOnPostExecute += (object sender, EventArgs e) =>
            {
                SerialPortEventArgs <pcTakeoverReq> mEventArgs = e as SerialPortEventArgs <pcTakeoverReq>;
                if (mEventArgs.Data != null)
                {
                    byte hw1 = (byte)(mEventArgs.Data.hardwareID >> 24);
                    byte hw2 = (byte)(mEventArgs.Data.hardwareID >> 16);
                    byte hw3 = (byte)(mEventArgs.Data.hardwareID >> 8);

                    string softVersion = String.Format("W{0}{1:D2}.{2:D2}", (byte)(mEventArgs.Data.hardwareID >> 24),
                                                       (byte)(mEventArgs.Data.hardwareID >> 16),
                                                       (byte)(mEventArgs.Data.hardwareID >> 8));

                    mStopSyncParam.FirmID  = hw1;
                    mStopSyncParam.FirmID1 = hw2;
                    mStopSyncParam.FirmID2 = hw3;

                    //PC接管报文的响应
                    mStopSyncTask.Excute();
                    Thread.Sleep(5);
                    mStopSyncTask.Excute();
                    Thread.Sleep(5);
                    mStopSyncTask.Excute();
                    Thread.Sleep(5);
                    if (mParam.bPCU)
                    {
                        mPcuTask.ExcuteTask();//开始升级PCU
                    }
                    else if (mParam.bCCU)
                    {
                        mCcuTask.ExcuteTask();//开始升级CCU
                    }
                }
                else
                {
                    if (mParam.bPCU)
                    {
                        mPcuTask.ExcuteTask();//开始升级PCU
                    }
                    else if (mParam.bCCU)
                    {
                        //设备未上电
                        TaskArgs mArgs = new TaskArgs();
                        mArgs.msg   = "中控未上电";
                        mArgs.level = Task_Level.TASK_FAIL;
                        ccuListViewItemHandler(sender, mArgs);
                        bTaskRunning           = false;
                        mResetEcuParam.cmdCode = 0x02; //升级失败或者其他,恢复同步指令
                        mResetEcuTask.Excute();
                        Thread.Sleep(10);
                        mResetEcuTask.Excute();
                        Thread.Sleep(10);
                        mResetEcuTask.Excute();
                        Thread.Sleep(10);
                        mBroadCastTask.ClosePort();
                    }
                }
            };

            mPcuTask = new PcuTask(this.mParam.mPcuFilePath);
            //执行结束回调
            mPcuTask.TaskDoneHandler += (object sender, EventArgs e) =>
            {
                TaskArgs mArgs = e as TaskArgs;
                if (mParam.bCCU && mArgs.level == Task_Level.TASK_PASS)
                {
                    if (mCcuTask != null)
                    {
                        mCcuTask.ExcuteTask();
                    }
                }
                else
                {
                    bTaskRunning           = false;
                    mResetEcuParam.cmdCode = 0x02; //升级失败或者其他,恢复同步指令
                    mResetEcuTask.Excute();
                    Thread.Sleep(10);
                    mResetEcuTask.Excute();
                    Thread.Sleep(10);
                    mResetEcuTask.Excute();
                    Thread.Sleep(10);
                    mBroadCastTask.ClosePort();
                }
            };
            //PCU Item
            mPcuTask.PcuLviHandler += (object sender, EventArgs e) =>
            {
                pcuListViewItemHandler(sender, e);
            };
            //PCU 进度回调
            mPcuTask.pcuProgressBarHandler += (object sender, EventArgs e) =>
            {
                pcuProgressBarHandler(sender, e);
            };

            mCcuTask = new CcuTask(this.mParam.mCcuFilePath);
            //执行结束后回调
            mCcuTask.TaskDoneHandler += (object sender, EventArgs e) =>
            {
                bTaskRunning = false;
                TaskArgs mArgs = e as TaskArgs;
                if (mArgs.level == Task_Level.TASK_PASS)
                {
                    mResetEcuParam.cmdCode = 0x01; //升级成功后,进行重启
                }
                else
                {
                    mResetEcuParam.cmdCode = 0x02; //升级失败或者其他,恢复同步指令
                }
                mResetEcuTask.Excute();
                Thread.Sleep(10);
                mResetEcuTask.Excute();
                Thread.Sleep(10);
                mResetEcuTask.Excute();
                Thread.Sleep(10);
                mBroadCastTask.ClosePort();
            };
            //CCU Item
            mCcuTask.CcuLviHandler += (object sender, EventArgs e) =>
            {
                ccuListViewItemHandler(sender, e);
            };
            //CCU 进度回调
            mCcuTask.CcuProgressBarHandler += (object sender, EventArgs e) =>
            {
                ccuProgressBarHandler(sender, e);
            };
        }