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(); } }; }
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); }; }