示例#1
0
        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;
示例#2
0
        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;
示例#3
0
        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);
            }
        }
示例#4
0
        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);
        }
示例#5
0
        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);
        }
示例#6
0
        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)
            {