private DataPoint[] processIbeoPacket(ref IbeoPacket p, MemoryStream ms) { ms.Position = 0; BinaryReader br = new BinaryReader(ms); DataPoint[] points = null; p.MagicWord = BigToLittle(br.ReadUInt32()); if (p.MagicWord != MAGIC_WORD) { throw new Exception("FATAL BAD PACKET IN PROCESS!!!!"); } p.Size = BigToLittle(br.ReadUInt32()); p.DataType = BigToLittle(br.ReadUInt32()); p.IbeoTimeStamp = BigToLittle(br.ReadUInt32()); if (p.DataType == FILE_TYPE_COMPRESSED_SCAN) //FILE TYPE COMPRESSED SCAN { p.Version = br.ReadByte(); p.ScannerType = br.ReadByte(); p.ECUID = br.ReadByte(); p.PAD = br.ReadByte(); p.IbeoTimeStamp = BigToLittle(br.ReadUInt32()); p.StartAngle = BigToLittle(br.ReadInt16()); p.StopAngle = BigToLittle(br.ReadInt16()); p.ScanCount = BigToLittle(br.ReadUInt16()); //System.Console.WriteLine("Num stuffs:" + p.ScanCount); p.NumberOfPoints = BigToLittle(br.ReadUInt16()); p.ScanPoints = new IbeoPoint[p.NumberOfPoints]; points = new DataPoint[p.NumberOfPoints]; for (int i = 0; i < p.NumberOfPoints; i++) { p.ScanPoints[i] = new IbeoPoint(); p.ScanPoints[i].ScannerID = br.ReadByte(); p.ScanPoints[i].Channel = br.ReadByte(); p.ScanPoints[i].SubChannel = br.ReadByte(); p.ScanPoints[i].PointStatus = br.ReadByte(); p.ScanPoints[i].X = BigToLittle(br.ReadInt16()); p.ScanPoints[i].Y = BigToLittle(br.ReadInt16()); p.ScanPoints[i].Z = BigToLittle(br.ReadInt16()); p.ScanPoints[i].EchoPulseWidth = BigToLittle(br.ReadUInt16()); points[i] = new DataPoint(IbeoPointConverter(p.ScanPoints[i].X), IbeoPointConverter(p.ScanPoints[i].Y), IbeoPointConverter(p.ScanPoints[i].Z), p.ScanPoints[i].Channel, p.ScanPoints[i].SubChannel, p.ScanPoints[i].PointStatus); } } return(points); }
private void OnReadBytesComplete(IAsyncResult AsyncResult) { int bytesRead = tcpClient.GetStream().EndRead(AsyncResult); //THE BRIAN STATE MACHINE switch (syncState) { case 0: if (rxbuf[0] == MAGIC_WORD1) { syncState++; tempMsg.Position = 0; tempMsg.WriteByte(rxbuf[0]); } else { if (GotBadPacket != null) { GotBadPacket(this, new DrawDataPacketErrEventArgs(0, this)); } } AsyncReadResult = tcpClient.GetStream().BeginRead(rxbuf, 0, 1, new AsyncCallback(OnReadBytesComplete), null); break; case 1: if (rxbuf[0] == MAGIC_WORD2) { syncState++; tempMsg.WriteByte(rxbuf[0]); } else { syncState = 0; if (GotBadPacket != null) { GotBadPacket(this, new DrawDataPacketErrEventArgs(0, this)); } } AsyncReadResult = tcpClient.GetStream().BeginRead(rxbuf, 0, 1, new AsyncCallback(OnReadBytesComplete), null); break; case 2: if (rxbuf[0] == MAGIC_WORD3) { syncState++; tempMsg.WriteByte(rxbuf[0]); } else { syncState = 0; if (GotBadPacket != null) { GotBadPacket(this, new DrawDataPacketErrEventArgs(0, this)); } } AsyncReadResult = tcpClient.GetStream().BeginRead(rxbuf, 0, 1, new AsyncCallback(OnReadBytesComplete), null); break; case 3: if (rxbuf[0] == MAGIC_WORD4) { syncState++; tempMsg.WriteByte(rxbuf[0]); } else { syncState = 0; if (GotBadPacket != null) { GotBadPacket(this, new DrawDataPacketErrEventArgs(0, this)); } } AsyncReadResult = tcpClient.GetStream().BeginRead(rxbuf, 0, 12, new AsyncCallback(OnReadBytesComplete), null); break; case 4: tempMsg.Write(rxbuf, 0, bytesRead); if (tempMsg.Position == HEADER_SIZE) //got everything { syncState++; BinaryReader br = new BinaryReader(new MemoryStream(tempMsgBuf, 0, HEADER_SIZE)); //check to see the header.... BigToLittle(br.ReadUInt32()); //read the header msgSize = Convert.ToInt32(BigToLittle(br.ReadUInt32())); AsyncReadResult = tcpClient.GetStream().BeginRead(rxbuf, 0, msgSize, new AsyncCallback(OnReadBytesComplete), null); } else //read the rest.... { AsyncReadResult = tcpClient.GetStream().BeginRead(rxbuf, 0, 12 - bytesRead, new AsyncCallback(OnReadBytesComplete), null); } break; case 5: tempMsg.Write(rxbuf, 0, bytesRead); if (tempMsg.Position >= (msgSize + HEADER_SIZE)) //got everything { syncState = 0; if (tempMsg.Position > (msgSize + HEADER_SIZE)) { if (GotBadPacket != null) { GotBadPacket(this, new DrawDataPacketErrEventArgs(0, this)); } } if (GotDataPacket != null) { IbeoPacket p = new IbeoPacket(); TimeStampPacket tsp; if (tsPacketBufferList.Count != 0) { tsp = tsPacketBufferList.Peek(); } else { tsp = new TimeStampPacket(); tsp.CarTimeSeconds = 0; tsp.CarTimeTicks = 0; tsp.SeqNumber = 0; } totalPackets++; totalPacketsResetable++; DataPoint[] d = processIbeoPacket(ref p, tempMsg); if (d != null) { GotDataPacket(this, new DrawDataPacketEventArgs(d, this, tsp)); } if (p.DataType == FILE_TYPE_COMPRESSED_SCAN) //we got a data packet { //Console.WriteLine("SCAN"); //if (tsPacketBuffer.SeqNumber == 0) TimeStampPacket ts; if (tsPacketBufferList.Count > 0) { ts = tsPacketBufferList.Dequeue(); } else { System.Console.WriteLine("WARNING: LOST SEQ NUMBER!"); } } } AsyncReadResult = tcpClient.GetStream().BeginRead(rxbuf, 0, 1, new AsyncCallback(OnReadBytesComplete), null); } else { AsyncReadResult = tcpClient.GetStream().BeginRead(rxbuf, 0, msgSize - bytesRead, new AsyncCallback(OnReadBytesComplete), null); } break; } }
private DataPoint[] processIbeoPacket(ref IbeoPacket p, MemoryStream ms) { ms.Position = 0; BinaryReader br = new BinaryReader(ms); DataPoint[] points = null; p.MagicWord = BigToLittle(br.ReadUInt32()); if (p.MagicWord != MAGIC_WORD) throw new Exception("FATAL BAD PACKET IN PROCESS!!!!"); p.Size = BigToLittle(br.ReadUInt32()); p.DataType = BigToLittle(br.ReadUInt32()); p.IbeoTimeStamp = BigToLittle(br.ReadUInt32()); if (p.DataType == FILE_TYPE_COMPRESSED_SCAN) //FILE TYPE COMPRESSED SCAN { p.Version = br.ReadByte(); p.ScannerType = br.ReadByte(); p.ECUID = br.ReadByte(); p.PAD = br.ReadByte(); p.IbeoTimeStamp = BigToLittle(br.ReadUInt32()); p.StartAngle = BigToLittle(br.ReadInt16()); p.StopAngle = BigToLittle(br.ReadInt16()); p.ScanCount = BigToLittle(br.ReadUInt16()); //System.Console.WriteLine("Num stuffs:" + p.ScanCount); p.NumberOfPoints = BigToLittle(br.ReadUInt16()); p.ScanPoints = new IbeoPoint[p.NumberOfPoints]; points = new DataPoint[p.NumberOfPoints]; for (int i = 0; i < p.NumberOfPoints; i++) { p.ScanPoints[i] = new IbeoPoint(); p.ScanPoints[i].ScannerID = br.ReadByte(); p.ScanPoints[i].Channel = br.ReadByte(); p.ScanPoints[i].SubChannel = br.ReadByte(); p.ScanPoints[i].PointStatus = br.ReadByte(); p.ScanPoints[i].X = BigToLittle(br.ReadInt16()); p.ScanPoints[i].Y = BigToLittle(br.ReadInt16()); p.ScanPoints[i].Z = BigToLittle(br.ReadInt16()); p.ScanPoints[i].EchoPulseWidth = BigToLittle(br.ReadUInt16()); points[i] = new DataPoint(IbeoPointConverter(p.ScanPoints[i].X), IbeoPointConverter(p.ScanPoints[i].Y), IbeoPointConverter(p.ScanPoints[i].Z), p.ScanPoints[i].Channel, p.ScanPoints[i].SubChannel, p.ScanPoints[i].PointStatus); } } return points; }
private void OnReadBytesComplete(IAsyncResult AsyncResult) { int bytesRead = tcpClient.GetStream().EndRead(AsyncResult); //THE BRIAN STATE MACHINE switch (syncState) { case 0: if (rxbuf[0] == MAGIC_WORD1) { syncState++; tempMsg.Position = 0; tempMsg.WriteByte(rxbuf[0]); } else { if (GotBadPacket != null) GotBadPacket(this, new DrawDataPacketErrEventArgs(0, this)); } AsyncReadResult = tcpClient.GetStream().BeginRead(rxbuf, 0, 1, new AsyncCallback(OnReadBytesComplete), null); break; case 1: if (rxbuf[0] == MAGIC_WORD2) { syncState++; tempMsg.WriteByte(rxbuf[0]); } else { syncState = 0; if (GotBadPacket != null) GotBadPacket(this, new DrawDataPacketErrEventArgs(0, this)); } AsyncReadResult = tcpClient.GetStream().BeginRead(rxbuf, 0, 1, new AsyncCallback(OnReadBytesComplete), null); break; case 2: if (rxbuf[0] == MAGIC_WORD3) { syncState++; tempMsg.WriteByte(rxbuf[0]); } else { syncState = 0; if (GotBadPacket != null) GotBadPacket(this, new DrawDataPacketErrEventArgs(0, this)); } AsyncReadResult = tcpClient.GetStream().BeginRead(rxbuf, 0, 1, new AsyncCallback(OnReadBytesComplete), null); break; case 3: if (rxbuf[0] == MAGIC_WORD4) { syncState++; tempMsg.WriteByte(rxbuf[0]); } else { syncState = 0; if (GotBadPacket != null) GotBadPacket(this, new DrawDataPacketErrEventArgs(0, this)); } AsyncReadResult = tcpClient.GetStream().BeginRead(rxbuf, 0, 12, new AsyncCallback(OnReadBytesComplete), null); break; case 4: tempMsg.Write(rxbuf, 0, bytesRead); if (tempMsg.Position == HEADER_SIZE) //got everything { syncState++; BinaryReader br = new BinaryReader(new MemoryStream (tempMsgBuf,0,HEADER_SIZE)); //check to see the header.... BigToLittle(br.ReadUInt32()); //read the header msgSize = Convert.ToInt32(BigToLittle(br.ReadUInt32())); AsyncReadResult = tcpClient.GetStream().BeginRead(rxbuf, 0, msgSize, new AsyncCallback(OnReadBytesComplete), null); } else //read the rest.... { AsyncReadResult = tcpClient.GetStream().BeginRead(rxbuf, 0, 12 - bytesRead, new AsyncCallback(OnReadBytesComplete), null); } break; case 5: tempMsg.Write(rxbuf, 0, bytesRead); if (tempMsg.Position >= (msgSize + HEADER_SIZE)) //got everything { syncState=0; if (tempMsg.Position > (msgSize + HEADER_SIZE)) if (GotBadPacket != null) GotBadPacket(this, new DrawDataPacketErrEventArgs(0, this)); if (GotDataPacket != null) { IbeoPacket p = new IbeoPacket(); TimeStampPacket tsp; if (tsPacketBufferList.Count !=0 ) tsp = tsPacketBufferList.Peek(); else { tsp = new TimeStampPacket (); tsp.CarTimeSeconds = 0; tsp.CarTimeTicks = 0; tsp.SeqNumber = 0; } totalPackets++; totalPacketsResetable++; DataPoint[] d = processIbeoPacket(ref p, tempMsg); if (d!=null) GotDataPacket(this, new DrawDataPacketEventArgs(d, this, tsp)); if (p.DataType == FILE_TYPE_COMPRESSED_SCAN) //we got a data packet { //Console.WriteLine("SCAN"); //if (tsPacketBuffer.SeqNumber == 0) TimeStampPacket ts; if (tsPacketBufferList.Count>0) ts = tsPacketBufferList.Dequeue(); else System.Console.WriteLine("WARNING: LOST SEQ NUMBER!"); } } AsyncReadResult = tcpClient.GetStream().BeginRead(rxbuf, 0, 1, new AsyncCallback(OnReadBytesComplete), null); } else { AsyncReadResult = tcpClient.GetStream().BeginRead(rxbuf, 0, msgSize - bytesRead, new AsyncCallback(OnReadBytesComplete), null); } break; } }