/// <summary> /// Функция обновления статистики по данным декодера /// </summary> /// <param name="buf">Буфер данных</param> /// <param name="bufLen">Длина буфера</param> public void Update(byte[] buf, int bufLen) { HSIFrame = ByteArrayToStructure.Make<HSIMessageStruct>(buf); // узнаем, по какому каналу пришли данные _curChannelId = HSIFrame.Status & 1; byte flag = HSIFrame.Flag; int sz = 0; if (bufLen > 8) { sz = (buf[7] << 8) | buf[8]; flag = HSIFrame.data[sz-1]; } // подсчитаем статистику по текущему каналу switch (flag) { case HSI_SR_FLAG: Channels[_curChannelId].SRCnt++; break; case HSI_DR_FLAG: Channels[_curChannelId].DRCnt++; break; case HSI_TIMESTAMP_FLAG: Channels[_curChannelId].TimeStampCnt++; break; case HSI_OBT_FLAG: Channels[_curChannelId].OBTCnt++; Array.Copy(buf, 9, Channels[_curChannelId].OBTVal, 0, 5); break; case HSI_UKS_FLAG: Channels[_curChannelId].UKSCnt++; if (onUKSFrameReceived != null) // если есть обработчик УКС, вызовем его, чтобы вывести их на экран, к примеру { byte[] tmpUKSBuf = new byte[sz]; Array.Copy(buf, 9, tmpUKSBuf, 0, sz); onUKSFrameReceived(tmpUKSBuf,HSIFrame.Time); } break; default: break; } }
/// <summary> /// Функция обновления статистики по данным декодера /// </summary> /// <param name="buf">Буфер данных декодера КВВ</param> public void Update(byte[] buf, FileStream fStream, uint channelForWriting) { _hsiFrame = ByteArrayToStructure.Make<HSIMessageStruct>(buf); _curChannelId = 0; // узнаем, по какому каналу пришли данные if ((_hsiFrame.Status & HSI_STATUS_CHANNEL_BIT_MASK) > 0) _curChannelId = 1; // подсчитаем статистику по текущему каналу Channels[_curChannelId].FramesCnt++; if ((_hsiFrame.Status & HSI_STATUS_MARKER_ERROR_BIT_MASK) > 0) Channels[_curChannelId].ErrInMarkerCnt++; if ((_hsiFrame.Status & HSI_STATUS_CRC_ERROR_BIT_MASK) > 0) Channels[_curChannelId].ErrInCRCCnt++; if ((_hsiFrame.Status & HSI_STATUS_STOPBIT_ERROR_BIT_MASK) > 0) Channels[_curChannelId].ErrInStopBitCnt++; if ((_hsiFrame.Status & HSI_STATUS_PARITY_ERROR_BIT_MASK) > 0) Channels[_curChannelId].ErrInParityCnt++; if ((_hsiFrame.Flag & HSI_FLAG_BUSY_BIT_MASK) == HSI_FLAG_BUSY_BIT_MASK) Channels[_curChannelId].StatusBUSYCnt++; if ((_hsiFrame.Flag & HSI_FLAG_DATA_BIT_MASK) == HSI_FLAG_DATA_BIT_MASK) Channels[_curChannelId].StatusDataFramesCnt++; if ((_hsiFrame.Flag & HSI_FLAG_ME_BIT_MASK) == HSI_FLAG_ME_BIT_MASK) Channels[_curChannelId].StatusMECnt++; if ((_hsiFrame.Flag & HSI_FLAG_SR_BIT_MASK) == HSI_FLAG_SR_BIT_MASK) Channels[_curChannelId].StatusSRCnt++; // пишем в файл, если файл задан и пришли данные по выбранному каналу if ((fStream != null) && ((_hsiFrame.Flag & HSI_FLAG_DATA_BIT_MASK) == HSI_FLAG_DATA_BIT_MASK) && (_curChannelId == channelForWriting)) { fStream.Write(_hsiFrame.data, 0, HSI_FRAME_SIZE_BYTES); } }