void ReadData(byte[] buffer) { MemoryStream ms = new MemoryStream(buffer); StreamReader reader = new StreamReader(ms); string firstLine = reader.ReadLine(); switch (firstLine) { case PacketReader.HTMLTriggerString: // plain html case PacketReader.MSGTriggerString: // imgNumber, msgHTML case PacketReader.SOUNDTriggerString: // soundFileName case PacketReader.VOICETriggerString: // ゆっくりボイス case PacketReader.SETriggerString: // SE case PacketReader.SKYDOMETextureTriggerString: // SkydomeTexture if (packterStringQueue.ContainsKey(firstLine) == false) { packterStringQueue[firstLine] = new List <string>(); } string unicodeString = Encoding.UTF8.GetString(buffer); string[] splitString = unicodeString.Split(new char[] { '\n' }, 2); if (splitString.Length == 2) { packterStringQueue[firstLine].Add(splitString[1]); } break; case PacketReader.BallisticTriggerString: // 弾道軌道 while (true) { FlyPacket packet = new FlyPacketBallistic(); if (packet.SetFromData(reader) == false) { break; } packetQueue.Add(packet); } break; case PacketReader.GatewayBoardTriggerString: // Gatewayつき while (true) { FlyPacket packet = new FlyPacketWithGateway(); if (packet.SetFromData(reader) == false) { break; } packetQueue.Add(packet); } break; case PacketReader.BoardTriggerString: // PACKTER while (true) { FlyPacket packet = null; switch (mode) { case ConfigReader.ProgramMode.SenderReceiver: default: packet = new FlyPacketLay(); break; case ConfigReader.ProgramMode.Ballistic: packet = new FlyPacketBallistic(); break; } if (packet.SetFromData(reader) == false) { break; } packetQueue.Add(packet); } break; default: // 何にも引っかからなかったら無視する return; } }
public void ParseData2(byte[] buffer, out List <NavData> navDataList, out List <AngleData> angleDataList, out List <ProgramControlData> programControlDataList, out List <ServoData> servoDataList) { navDataList = new List <NavData>(); angleDataList = new List <AngleData>(); programControlDataList = new List <ProgramControlData>(); servoDataList = new List <ServoData>(); if (buffer == null || buffer.Length <= Marshal.SizeOf(typeof(FlyHeader))) { return; } FlyPacket flyPacket = Tool.ByteToStruct <FlyPacket>(buffer, 0, Marshal.SizeOf(typeof(FlyPacket))); if (!Enumerable.SequenceEqual(flyPacket.header.syncHeader, FlyProtocol.syncHeader) || flyPacket.header.dataType != FlyProtocol.dataType) { return; } if (dataLength2 + flyPacket.header.dataLen.SwapUInt16() > dataBuffer2.Length) { dataLength2 = 0; return; } if (flyPacket.data.Length < flyPacket.header.dataLen.SwapUInt16()) { return; } Array.Copy(flyPacket.data, 0, dataBuffer2, dataLength2, flyPacket.header.dataLen.SwapUInt16()); dataLength2 += flyPacket.header.dataLen.SwapUInt16(); for (; searchPos2 < dataLength2; ++searchPos2) { if (EqualHeader(FlyProtocol.navHeader, dataBuffer2, searchPos2)) { if (searchPos2 + FlyProtocol.NavDataLengthWithPadding >= dataLength2) { break; } byte[] packetBuffer = GetPacketDataWithoutPadding(dataBuffer2, searchPos2, FlyProtocol.NavDataLengthWithPadding); NavData navData = Tool.ByteToStruct <NavData>(packetBuffer, 0, packetBuffer.Length); if (navData.crc != CalcNavCrc(packetBuffer) || navData.endChar != 0x21) { searchPos2++; continue; } navDataList.Add(navData); searchPos2 += FlyProtocol.NavDataLengthWithPadding; Array.Copy(dataBuffer2, searchPos2, dataBuffer2, 0, dataLength2 - searchPos2); dataLength2 -= searchPos2; searchPos2 = 0; } if (EqualHeader(FlyProtocol.angleHeader, dataBuffer2, searchPos2)) { if (searchPos2 + FlyProtocol.AngleDataLengthWithPadding >= dataLength2) { break; } byte[] packetBuffer = GetPacketDataWithoutPadding(dataBuffer2, searchPos2, FlyProtocol.AngleDataLengthWithPadding); AngleData angleData = Tool.ByteToStruct <AngleData>(packetBuffer, 0, packetBuffer.Length); if (angleData.crc != CalcAngelCrc(packetBuffer)) { searchPos2++; continue; } angleDataList.Add(angleData); searchPos2 += FlyProtocol.AngleDataLengthWithPadding; Array.Copy(dataBuffer2, searchPos2, dataBuffer2, 0, dataLength2 - searchPos2); dataLength2 -= searchPos2; searchPos2 = 0; } if (EqualHeader(FlyProtocol.programHeader, dataBuffer2, searchPos2)) { if (searchPos2 + FlyProtocol.ProgramDataLengthWithPadding >= dataLength2) { break; } byte[] packetBuffer = GetPacketDataWithoutPadding(dataBuffer2, searchPos2, FlyProtocol.ProgramDataLengthWithPadding); ProgramControlData programControlData = Tool.ByteToStruct <ProgramControlData>(packetBuffer, 0, packetBuffer.Length); if (programControlData.crc != CalcProgramData(packetBuffer) || programControlData.endChar != 0x21) { searchPos2++; continue; } programControlDataList.Add(programControlData); searchPos2 += FlyProtocol.ProgramDataLengthWithPadding; Array.Copy(dataBuffer2, searchPos2, dataBuffer2, 0, dataLength2 - searchPos2); dataLength2 -= searchPos2; searchPos2 = 0; } if (EqualHeader(FlyProtocol.servoHeader, dataBuffer2, searchPos2)) { if (searchPos2 + FlyProtocol.ServoDataLengthWithPadding >= dataLength2) { break; } byte[] packetBuffer = GetPacketDataWithoutPadding(dataBuffer2, searchPos2, FlyProtocol.ServoDataLengthWithPadding); ServoData servoData = Tool.ByteToStruct <ServoData>(packetBuffer, 0, packetBuffer.Length); if (servoData.crc != CalcServoData(packetBuffer) || servoData.endChar != 0x21) { searchPos2++; continue; } servoDataList.Add(servoData); searchPos2 += FlyProtocol.ServoDataLengthWithPadding; Array.Copy(dataBuffer2, searchPos2, dataBuffer2, 0, dataLength2 - searchPos2); dataLength2 -= searchPos2; searchPos2 = 0; } } }