public void Append(BaseMessage msg,string rackName,string boardName) { try { lock (lockFile) { if (sw != null) { sw.WriteLine("{0},{1:D2},{2},{3:D2},{4},0x{5:X2},{6}", Util.FormateDateTime3(msg.DtTime), msg.RackNo, rackName, msg.SlotNo, boardName, msg.Code, errorDescription.GetDescription(msg.Code) ); } } } catch (Exception ee) { LogHelper.GetLogger<ErrorCodeMsgFile>().Error(ee.Message); LogHelper.GetLogger<ErrorCodeMsgFile>().Error(ee.StackTrace); } }
//没有消息的时候,界面会周期性发送0xFF消息 public void AppendLog(BaseMessage msg) { if (TestStatus == TestStatus.THRESHOLD) { //检查被测板卡的心跳是否都已经收到 CheckPreTstHeart(msg); } //生成心跳超时 if (TestStatus == TestStatus.RUNNING) { if (msg is IdleMsg) //idle消息会每秒钟发出来 { List<Board> boards = GetTimeoutBoard(runTimeoutDic, runTimeout); foreach (var b in boards) { Rack r = GetRack(b); if (r != null) { HeartTimeoutMsg mymsg = HeartTimeoutMsg.CreateNewMsg(r.No, b.No); if (msgQueue != null) msgQueue.Push(mymsg); //下一次再进行超时判断 runTimeoutDic[b] = DateTime.Now; } } } else //心跳消息、错误码消息都算是心跳,更新收到上次心跳的时间 { Board board = GetBoard(msg.RackNo, msg.SlotNo); runTimeoutDic[board] = DateTime.Now; } } //只在测试过程中记录日志,并且不记录心跳数据 if (TestStatus == TestStatus.RUNNING && errorCodeMsgFile != null && !IsHeartMsg(msg)) { Board b = GetBoard(msg.RackNo, msg.SlotNo); if(b.IsPassed) { b.IsPassed = false; GenBoardStatusChangeEvent(b); } errorCodeMsgFile.Append(msg, GetRack(msg.RackNo).Name, GetBoard(msg.RackNo, msg.SlotNo).Name); } }
//是否是心跳或者空闲消息 private bool IsHeartMsg(BaseMessage msg) { return (msg is HeartMsg || msg is IdleMsg); }
//检查是否所有的心跳都已经收到 private void CheckPreTstHeart(BaseMessage msg) { if (!IsHeartMsg(msg)) return; //更新心跳记录 Board b = GetBoard(msg.RackNo, msg.SlotNo); if (preTimeoutDic.ContainsKey(b)) preTimeoutDic[b] = true; //如果所有心跳都收到,开始正式测试 bool isAllOk = true; foreach (var kv in preTimeoutDic) { isAllOk &= kv.Value; } if (isAllOk) { StartNomalTest(); return; } //如果超时了,还有板卡没有收到消息,进入异常结束 if (DateTime.Now.Ticks - preTestTime.Ticks > (uint)preTimeout * 10000000) { List<Board> boards = new List<Board>(); foreach (var kv in preTimeoutDic) { if (kv.Value == false) boards.Add(kv.Key); } //执行异常结束工作 FinishUnExpectedTest(); GenTimeoutEvent(boards, TestStatus.THRESHOLD); } }