public static void BuildMessagePacket(ref IFlMessage binMessage) { List <byte> packet = new List <byte>(); Type type; byte length = BASE_LENGTH; UInt16 crc; IFlBinMessage binMsg = (IFlBinMessage)binMessage; // TODO : Check message type(text). // TODO : Check message category. // TODO : Check DeviceID // STX. packet.Add(FlConstant.FL_BIN_MSG_STX); // Device ID. type = binMsg.Header.device_id.GetType(); packet.AddRange(InternalProtoUtil.BuildBinPacketForPrimitiveArgument(binMsg.Header.device_id, Type.GetTypeCode(type))); // Length packet.Add(length); // Message ID. packet.Add((byte)binMsg.Header.message_id); // Flag1 packet.Add(binMsg.Header.flag1.BitField1); // Flag2 packet.Add(binMsg.Header.flag2.BitField1); // Arguments if (binMessage.Arguments?.Count > 0) { foreach (object arg in binMessage.Arguments) { type = arg.GetType(); packet.AddRange(InternalProtoUtil.BuildBinPacketForPrimitiveArgument(arg, Type.GetTypeCode(type))); } } // Length value = ( current packet length + CRC(2 byte) + ETX(1 byte) ) // - ( STX(1 byte) + Device ID(4 byte) + Length(1 byte)) // => current packet length - 3 packet[LENGTH_FIELD_INDEX] = (byte)(packet.Count - 3); // CRC16 crc = FlUtil.CRC16(packet, 1, packet.Count - 1); packet.AddRange(InternalProtoUtil.BuildBinPacketForPrimitiveArgument(crc, crc.GetTypeCode())); // ETX packet.Add(FlConstant.FL_BIN_MSG_ETX); binMsg.Buffer = packet.ToArray(); }
public static void BuildMessagePacket(ref IFlMessage txtMessage) { List <byte> packet = new List <byte>(); // TODO : Check message type(text). // TODO : Check message category. // Command string packet. packet.AddRange(Encoding.ASCII.GetBytes(MessageIdToStringTable[txtMessage.MessageId])); // Arguments. if (txtMessage.Arguments?.Count > 0) { Type type; // Delimiter for a command and a device ID. packet.Add((byte)FlConstant.FL_TXT_MSG_ID_DEVICE_ID_DELIMITER); for (int i = 0; i < txtMessage.Arguments.Count; i++) { type = txtMessage.Arguments[i].GetType(); if (InternalProtoUtil.IsPrimitiveTyps(type) == true) { packet.AddRange(InternalProtoUtil.BuildAsciiPacketForPrimitiveArgument(txtMessage.Arguments[i], Type.GetTypeCode(type))); } if (i != (txtMessage.Arguments.Count - 1)) { // ',' packet.Add((byte)FlConstant.FL_TXT_MSG_ARG_DELIMITER); } } } // '\n' packet.Add((byte)FlConstant.FL_TXT_MSG_TAIL); txtMessage.Buffer = packet.ToArray(); }