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(); } }
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); } } }
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)); } } }
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); } } }
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>()); }