コード例 #1
0
        public byte[] HandleGetStatus(byte[] requestBody, bool isReadRequest)
        {
            if (isReadRequest)
            {
                var body = new Enumerable <byte>();
                if (_status32.HasValue)
                {
                    body = new Enumerable <byte>()
                    {
                        _serializator.Serialize((ushort)(_status32.Value >> 16)),
                        _serializator.Serialize((ushort)(_status32.Value & 0x0000FFFF)),
                    };
                }
                else
                {
                    body = new Enumerable <byte>()
                    {
                        _serializator.Serialize(_status16 ?? 0),
                    };
                }
                body.Add(_serializator.Serialize(_serial));

                return(body.ToArray());
            }
            else
            {
                throw new NotSupportedException();
            }
        }
コード例 #2
0
        public RUSEMCModuleDevice(WordSerializator serializator) : base(serializator)
        {
            _serial   = 100;
            _status16 = 0;

            _calibrationFile      = deserialize(Properties.Resources.V01_RUS40_Cal, FileType.CALIBRATION);
            _factorySettingsFile  = deserialize(Properties.Resources.V01_RUS40_FSet, FileType.FACTORY_SETTINGS);
            _dataPacketFormatFile = generateDataPacketFormatFile();

            byte[] generateDataPacketFormatFile()
            {
                var body = new Enumerable <byte>()
                {
                    "EMC_Mdl_0101DDMMYYF_".GetASCIIBytes(),
                    serializator.Serialize(_serial),
                    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Reserved
                };
                var i = new SmartInt().Add(1);

                addEntity("STAT", i, i.Add(2).DValue, 0);
                addEntity("STAT", i, i.Add(2).DValue, 0);
                addEntity("TST1", i, i.Add(2).DValue, 0);
                addEntity("TST2", i, i.Add(2).DValue, 0);

                return(body.ToArray());

                void addEntity(string mnemonicName, int position, int length, byte numOfBits)
                {
                    body.Add(mnemonicName.GetASCIIBytes());
                    body.Add(_serializator.Serialize((ushort)position));
                    body.Add((byte)length);
                    body.Add(numOfBits);
                }
            }
        }
コード例 #3
0
        public InclinometrVirtualDevice(WordSerializator serializator) : base(serializator)
        {
            _serial = 999;

            _calibrationFile            = deserialize(Properties.Resources.V01_RUS03_Cal, FileType.CALIBRATION);
            _factorySettingsFile        = deserialize(Properties.Resources.V01_RUS03_FSet, FileType.FACTORY_SETTINGS);
            _dataPacketFormatFile       = generateDataPacketFormatFile();
            _flashDataPacketFormatFile  = _dataPacketFormatFile;
            _temperatureCalibrationFile = deserialize(Properties.Resources.V01_RUS03_TCal, FileType.TEMPERATURE_CALIBRATION);

            byte[] generateDataPacketFormatFile()
            {
                var body = new Enumerable <byte>()
                {
                    "INCL____0101DDMMYYF_".GetASCIIBytes(),
                    serializator.Serialize(_serial),
                    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Reserve
                };
                var i = new SmartInt().Add(1);

                addEntity("STAT", (ushort)i, (byte)i.Add(2).DValue, 0, false);
                addEntity("INC_", (ushort)i, (byte)i.Add(2).DValue, 0, false);
                addEntity("AZI_", (ushort)i, (byte)i.Add(2).DValue, 0, false);
                addEntity("GTF_", (ushort)i, (byte)i.Add(2).DValue, 0, false);
                addEntity("XGpr", (ushort)i, (byte)i.Add(2).DValue, 0, false);
                addEntity("YGpr", (ushort)i, (byte)i.Add(2).DValue, 0, false);
                addEntity("ZGpr", (ushort)i, (byte)i.Add(2).DValue, 0, false);
                addEntity("XMpr", (ushort)i, (byte)i.Add(2).DValue, 0, false);
                addEntity("YMpr", (ushort)i, (byte)i.Add(2).DValue, 0, false);
                addEntity("ZMpr", (ushort)i, (byte)i.Add(2).DValue, 0, false);
                addEntity("TGad", (ushort)i, (byte)i.Add(2).DValue, 0, true);
                addEntity("TMad", (ushort)i, (byte)i.Add(2).DValue, 0, true);

                return(body.ToArray());

                void addEntity(string mnemonicName, ushort position, byte length, byte numOfBits, bool isSigned)
                {
                    body.Add(mnemonicName.GetASCIIBytes());
                    body.Add(_serializator.Serialize(position));
                    body.Add(length);
                    body.Add((isSigned ? (1 << 7) : 0).ToByte().BitOR(numOfBits));
                }
            }
        }
コード例 #4
0
        public RUSTechnologicalModuleDevice(WordSerializator serializator) : base(serializator)
        {
            _serial   = 100;
            _status32 = Global.Random.NextUInt();

            _calibrationFile            = deserialize(Properties.Resources.V01_RUS24_Cal, FileType.CALIBRATION);
            _factorySettingsFile        = deserialize(Properties.Resources.V01_RUS24_FSet, FileType.FACTORY_SETTINGS);
            _dataPacketFormatFile       = generateDataPacketFormatFile();
            _flashDataPacketFormatFile  = generateDataPacketFormatFile();
            _temperatureCalibrationFile = deserialize(Properties.Resources.V01_RUS24_TCal, FileType.TEMPERATURE_CALIBRATION);
            _workModeFile = deserialize(Properties.Resources.V01_RUS24_WMode, FileType.WORK_MODE);

            byte[] generateDataPacketFormatFile()
            {
                var body = new Enumerable <byte>()
                {
                    "TEXMODUL0101DDMMYYF_".GetASCIIBytes(),
                    serializator.Serialize(_serial),
                    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Reserved
                };
                var i = new SmartInt().Add(1);

                addEntity("STAT", i, i.Add(2).DValue, 0);
                addEntity("STAT", i, i.Add(2).DValue, 0);
                addEntity("TST1", i, i.Add(2).DValue, 0);
                addEntity("TST2", i, i.Add(2).DValue, 0);

                return(body.ToArray());

                void addEntity(string mnemonicName, int position, int length, byte numOfBits)
                {
                    body.Add(mnemonicName.GetASCIIBytes());
                    body.Add(_serializator.Serialize((ushort)position));
                    body.Add((byte)length);
                    body.Add(numOfBits);
                }
            }
        }
コード例 #5
0
        IEnumerable <byte> handle(IEnumerable <byte> data)
        {
            _buffer.AddRange(data);

            while (_buffer.Count >= MINIMAL_REQUEST_LENGTH)
            {
                var answer = handleDevices(_devices).ToArray();
                if (answer.Length == 0) // nothing is found
                {
                    _buffer.RemoveRange(0, (_buffer.Count - MINIMAL_REQUEST_LENGTH + 1).NegativeToZero());
                }
                else
                {
                    return(answer);
                }

                IEnumerable <byte> handleDevices(IEnumerable <VirtualRUSDeviceBase> devices)
                {
                    foreach (var device in devices)
                    {
                        var isReadRequest = true;
                        foreach (var handlerInfo in getHandlers(device).DublicateEach(2)) // First we see for read commands, then for burn
                        {
                            var requestBytes = buildRequest((byte)device.Id, handlerInfo.Address.GetInfo().Address, isReadRequest);
                            var start        = _buffer.Find(requestBytes);
                            if (start.Found)
                            {
                                _buffer.RemoveRange(0, start.Index); // All bytes before request bytes are trash
                                byte[] request     = _buffer.Take(MINIMAL_REQUEST_LENGTH).ToArray();
                                byte[] requestBody = null;
                                if (isReadRequest)
                                {
                                    _buffer.RemoveRange(0, MINIMAL_REQUEST_LENGTH); // Remove request from the buffer, because it'll be handled
                                }
                                else
                                {
                                    // Write requests always have length field
                                    var bodyLength = _serializator.Deserialize(_buffer.Skip(MINIMAL_REQUEST_LENGTH - 2));
                                    var fullLength = MINIMAL_REQUEST_LENGTH // Header + body length/CRC16
                                                     + bodyLength
                                                     + 2;                   // CRC16 Length
                                    if (_buffer.Count >= fullLength)        // received completely
                                    {
                                        request     = _buffer.Take(fullLength).ToArray();
                                        requestBody = _buffer.Skip(MINIMAL_REQUEST_LENGTH)
                                                      .Take(bodyLength)
                                                      .ToArray();
                                        _buffer.RemoveRange(0, fullLength);
                                    }
                                    else // we are waiting for the packet to be written completely in the next function call
                                    {
                                        return(Enumerable.Empty <byte>());
                                    }
                                }

                                var packet     = request.Take(MINIMAL_REQUEST_LENGTH - 2); // Header
                                var answerBody = handlerInfo.Handler(requestBody, isReadRequest);
                                if (answerBody != null)                                    // No data in answer
                                {
                                    packet = packet
                                             .Concat(_serializator.Serialize(answerBody.Length.ToUInt16()))
                                             .Concat(answerBody);
                                }
                                var crc = _crc16Calculator.ComputeChecksum(packet.ToArray());
                                packet = packet.Concat(_serializator.Serialize(crc));

                                return(packet.ToArray());
                            }

                            isReadRequest = !isReadRequest;
                        }
                    }

                    return(Enumerable.Empty <byte>());

                    IEnumerable <RequestHandlerInfo> getHandlers(VirtualRUSDeviceBase vd)
                    {
                        return(vd.GetType()
                               .GetMethods(BindingFlags.Public | BindingFlags.Instance)
                               .Select(mi => (MI: mi, Info: mi.GetCustomAttribute <SalachovCommandHandlerAttribute>()))
                               .Where(i => i.Info != null)
                               .Select(rh => new RequestHandlerInfo(
                                           rh.Info.Address,
                                           (RequestHandlerInfo.HandleDelegate)Delegate.CreateDelegate(typeof(RequestHandlerInfo.HandleDelegate), vd, rh.MI))));
                    }
                }
            }

            return(Enumerable.Empty <byte>());
        }