public static int BUILD_BYTE_ARRAY_HEADER(MESSAGE_FRAME_TYPE_T frameType, MESSAGE_DATA_CODE_T dataCode, ushort serialNo, byte destinationNetwork, byte destinationStation, ushort destinationModuleIO, byte destinationMultidropStation, ushort destinationExtensionStation, ushort responseLength, ushort endCode, byte[] dataArray, int startIndex) { int headerLength = 0; IntPtr p = IntPtr.Zero; try { switch (frameType, dataCode) { case (MESSAGE_FRAME_TYPE_T.MC_3E, MESSAGE_DATA_CODE_T.ASCII): headerLength = Marshal.SizeOf <RESPONSE_MESSAGE_HEADER_IN_3E_ASCII_T>(); if (headerLength > dataArray.Length - startIndex) { throw new SLMPException(SLMP_EXCEPTION_CODE_T.INSUFFICIENT_DATA_ARRAY_BUFFER); } RESPONSE_MESSAGE_HEADER_IN_3E_ASCII_T header3a = new RESPONSE_MESSAGE_HEADER_IN_3E_ASCII_T(0x30); Message.BINARY_TO_ASCII_ARRAY(destinationNetwork, header3a.network, 0); Message.BINARY_TO_ASCII_ARRAY(destinationStation, header3a.station, 0); Message.BINARY_TO_ASCII_ARRAY(destinationModuleIO, header3a.module_io, 0); Message.BINARY_TO_ASCII_ARRAY(destinationMultidropStation, header3a.multidrop_station, 0); Message.BINARY_TO_ASCII_ARRAY(endCode, header3a.end_code, 0); Message.BINARY_TO_ASCII_ARRAY((ushort)(responseLength + 4), header3a.response_length, 0); p = Marshal.AllocHGlobal(headerLength); Marshal.StructureToPtr(header3a, p, false); break;
public static int BUILD_BYTE_ARRAY_HEADER(MESSAGE_FRAME_TYPE_T frameType, MESSAGE_DATA_CODE_T dataCode, COMMANDS_T command, SUB_COMMANDS_T subcommand, ReadOnlySpan <byte> errorInformation, byte[] dataArray, int startIndex) { int headerLength = 0; IntPtr p = IntPtr.Zero; try { switch (frameType, dataCode) { case (MESSAGE_FRAME_TYPE_T.MC_3E, MESSAGE_DATA_CODE_T.ASCII): case (MESSAGE_FRAME_TYPE_T.MC_4E, MESSAGE_DATA_CODE_T.ASCII): if (errorInformation == null) { headerLength = 0; } else { headerLength = Marshal.SizeOf <REQUEST_COMMAND_HEADER_IN_3E_ASCII_T>(); if (dataArray.Length - startIndex < headerLength + errorInformation.Length) { throw new SLMPException(SLMP_EXCEPTION_CODE_T.INSUFFICIENT_DATA_ARRAY_BUFFER); } REQUEST_COMMAND_HEADER_IN_3E_ASCII_T header3a = new REQUEST_COMMAND_HEADER_IN_3E_ASCII_T(0x30); Message.Message.BINARY_TO_ASCII_ARRAY((ushort)command, header3a.command, 0); Message.Message.BINARY_TO_ASCII_ARRAY((ushort)subcommand, header3a.subcommand, 0); p = Marshal.AllocHGlobal(headerLength); Marshal.StructureToPtr(header3a, p, false); errorInformation.CopyTo(dataArray.AsSpan(startIndex)); Marshal.Copy(p, dataArray, startIndex + errorInformation.Length, headerLength); headerLength += errorInformation.Length; } break;
public static int REMOTE_OPERATION_RESPONSE_LENGTH(MESSAGE_DATA_CODE_T dataCode, REMOTE_OPERATION_T operation) { int asc = 0; switch (dataCode) { case MESSAGE_DATA_CODE_T.ASCII: asc = 2; break; case MESSAGE_DATA_CODE_T.BINARY: asc = 1; break; default: throw new SLMPException(SLMP_EXCEPTION_CODE_T.INVALID_DATA_CODE); } switch (operation) { case REMOTE_OPERATION_T.RUN: case REMOTE_OPERATION_T.STOP: case REMOTE_OPERATION_T.PAUSE: case REMOTE_OPERATION_T.LATCH_CLEAR: case REMOTE_OPERATION_T.RESET: return(0); case REMOTE_OPERATION_T.READ_TYPE_NAME: return(__TYPE_NAME_LENGTH + 2 * asc); default: throw new SLMPException(SLMP_EXCEPTION_CODE_T.INVALID_REMOTE_OPERATION); } }
public static int PARSE_REMOTE_READ_TYPE_NAME_RESPONSE(MESSAGE_DATA_CODE_T dataCode, ReadOnlySpan <byte> source, out string modelName, out ushort modelCode) { int index = 0; if (source.Length < REMOTE_OPERATION_REQUEST_LENGTH(dataCode, REMOTE_OPERATION_T.READ_TYPE_NAME)) { throw new SLMPException(SLMP_EXCEPTION_CODE_T.INSUFFICIENT_DATA_ARRAY_BUFFER); } modelName = System.Text.Encoding.ASCII.GetString(source.Slice(0, __TYPE_NAME_LENGTH)); index += 16; switch (dataCode) { case MESSAGE_DATA_CODE_T.ASCII: try { modelCode = Convert.ToUInt16(System.Text.Encoding.ASCII.GetString(source.Slice(__TYPE_NAME_LENGTH, 4)), 16); } catch (Exception) { throw new SLMPException(SLMP_EXCEPTION_CODE_T.INVALID_MODEL_CODE); } index += 4; break; case MESSAGE_DATA_CODE_T.BINARY: modelCode = (ushort)(source[__TYPE_NAME_LENGTH] + (source[__TYPE_NAME_LENGTH + 1] << 8)); index += 2; break; default: throw new SLMPException(SLMP_EXCEPTION_CODE_T.INVALID_DATA_CODE); } return(index); }
public static int BUILD_REMOTE_RUN_REQUEST(MESSAGE_DATA_CODE_T dataCode, REMOTE_CONTROL_MODE_T controlMode, REMOTE_CLEAR_MODE_T clearMode, byte[] dataArray, int startIndex) { int index = startIndex; if (dataArray.Length - startIndex < REMOTE_OPERATION_REQUEST_LENGTH(dataCode, REMOTE_OPERATION_T.RUN)) { throw new SLMPException(SLMP_EXCEPTION_CODE_T.INSUFFICIENT_DATA_ARRAY_BUFFER); } switch (dataCode) { case MESSAGE_DATA_CODE_T.ASCII: index += Message.Message.BINARY_TO_ASCII_ARRAY((ushort)controlMode, dataArray, index); index += Message.Message.BINARY_TO_ASCII_ARRAY((byte)clearMode, dataArray, index); index += Message.Message.BINARY_TO_ASCII_ARRAY((byte)0, dataArray, index); break; case MESSAGE_DATA_CODE_T.BINARY: index += Message.Message.BINARY_TO_BINARY_ARRAY((ushort)controlMode, dataArray, index); index += Message.Message.BINARY_TO_BINARY_ARRAY((byte)clearMode, dataArray, index); index += Message.Message.BINARY_TO_BINARY_ARRAY((byte)0, dataArray, index); break; default: throw new SLMPException(SLMP_EXCEPTION_CODE_T.INVALID_DATA_CODE); } return(index - startIndex); }
public RemoteOperationMaster(MESSAGE_FRAME_TYPE_T frameType, MESSAGE_DATA_CODE_T dataCode, bool dedicationR, SocketInterface sc, ref DESTINATION_ADDRESS_T destination, int sendBufferSize = 4096, int receiveBufferSize = 4096, object sync = null) { __socket = sc; __frame_type = frameType; __data_code = dataCode; __destination = destination; __send_byte_array = new byte[sendBufferSize]; __receive_byte_array = new byte[receiveBufferSize]; __sync_object = sync ?? new object(); switch (frameType, dataCode, dedicationR) {