public object this[string key] { get { ZpiArgument zpiArgument = Arguments.SingleOrDefault(a => a.Name == key); if (zpiArgument != null) { return(zpiArgument.Value); } else { throw new IndexOutOfRangeException($"Argument with key {key} not found"); } } set { ZpiArgument zpiArgument = Arguments.SingleOrDefault(a => a.Name == key); if (zpiArgument != null) { zpiArgument.Value = value; } else { throw new IndexOutOfRangeException($"Argument with key {key} not found. Use AddOrUpdate method"); } } }
public void AddOrUpdate(string name, ParamType paramType, object value = null) { ZpiArgument zpiArgument = Arguments.SingleOrDefault(a => a.Name == name && a.ParamType == paramType); if (zpiArgument == null) { ZpiArgument requestArgument = new ZpiArgument() { Name = name, ParamType = paramType }; if (value != null) { requestArgument.Value = value; } Arguments.Add(requestArgument); } else { zpiArgument.Value = value; } }
protected void ParseArguments(ArgumentCollection arguments, int length, byte[] buffer) { int index = 0; int preLen = -1; foreach (ZpiArgument argument in arguments.Arguments) { switch (argument.ParamType) { case ParamType.uint8ZdoInd: argument.Value = (byte)(index < buffer.Length ? (DeviceState)buffer[index] : 0); break; case ParamType.uint8: argument.Value = (byte)(index < buffer.Length ? buffer[index] : 0); index += 1; break; case ParamType.uint16: argument.Value = BitConverter.ToUInt16(buffer, index); index += 2; break; case ParamType.uint32: argument.Value = BitConverter.ToUInt32(buffer, index); index += 4; break; case ParamType.longaddr: argument.Value = BitConverter.ToUInt64(buffer, index); index += 8; break; case ParamType.buffer: ZpiArgument argLen = RequestArguments.Arguments.SingleOrDefault(arg => arg.Name == "len"); if (argLen != null) { int len = (int)argLen.Value; byte[] newValue = new byte[len]; Array.Copy(buffer, index, newValue, 0, len); argument.Value = newValue; index += len; } else { int len = length - 2; byte[] newValue = new byte[length]; Array.Copy(buffer, index, newValue, 0, len); argument.Value = newValue; index += len; } break; case ParamType.buffer8: byte[] buf8 = new byte[8]; Array.Copy(buffer, index, buf8, 0, 8); argument.Value = buf8; index += 8; break; case ParamType.buffer16: byte[] buf16 = new byte[16]; Array.Copy(buffer, index, buf16, 0, 8); argument.Value = buf16; index += 16; break; case ParamType.buffer18: byte[] buf18 = new byte[18]; Array.Copy(buffer, index, buf18, 0, 8); argument.Value = buf18; index += 18; break; case ParamType.buffer32: byte[] buf32 = new byte[32]; Array.Copy(buffer, index, buf32, 0, 8); argument.Value = buf32; index += 32; break; case ParamType.buffer42: byte[] buf42 = new byte[32]; Array.Copy(buffer, index, buf42, 0, 8); argument.Value = buf42; index += 42; break; case ParamType.buffer100: byte[] buf100 = new byte[100]; Array.Copy(buffer, index, buf100, 0, 8); argument.Value = buf100; index += 100; break; case ParamType.zdomsgcb: break; case ParamType._preLenUint8: preLen = Convert.ToInt32(buffer[index]); argument.Value = preLen; index += 1; break; case ParamType._preLenUint16: byte[] lenValue = new byte[2]; Array.Copy(buffer, index, lenValue, 0, 2); preLen = BitConverter.ToInt32(lenValue, 0); argument.Value = preLen; index += 2; break; case ParamType.dynbuffer: if (preLen >= 0) { byte[] dynbuf = new byte[preLen]; Array.Copy(buffer, index, dynbuf, 0, preLen); argument.Value = dynbuf; index += preLen; } break; case ParamType.listbuffer: if (preLen >= 0) { byte[] dynbuf = new byte[preLen * 2]; Array.Copy(buffer, index, dynbuf, 0, preLen * 2); argument.Value = dynbuf; index += preLen * 2; } break; case ParamType.preLenList: preLen = Convert.ToInt32(buffer[index]); index += 1; break; case ParamType.devlistbuffer: if (preLen >= 0) { List <ushort> ids = new List <ushort>(); for (int i = 0; i < preLen; i++) { byte[] id = new byte[2]; Array.Copy(buffer, index, id, 0, 2); ushort idValue = BitConverter.ToUInt16(id, 0); ids.Add(idValue); index += 2; } argument.Value = ids; } break; case ParamType.nwklistbuffer: if (preLen >= 0) { List <Network> networkList = new List <Network>(); BinarySerializer serializer = new BinarySerializer(); for (int i = 0; i < preLen; i++) { byte[] nwk = new byte[6]; Array.Copy(buffer, index, nwk, 0, 6); using (MemoryStream stream = new MemoryStream()) { Network network = serializer.Deserialize <Network>(nwk); networkList.Add(network); } index += 6; } argument.Value = networkList; } break; default: throw new Exception("Type not implemented"); } } }
public void AddOrUpdate(ZpiArgument zpiArgument) { AddOrUpdate(zpiArgument.Name, zpiArgument.ParamType, zpiArgument.Value); }
private static void LoadSubSys(JObject root) { foreach (JObject subSys in root.Values()) { string subSysName = subSys.Path; CommandSubsystem subSystem = (CommandSubsystem)subSys["id"].Value <int>(); if (_zpiObjects.ContainsKey(subSystem) == false) { _zpiObjects.Add(subSystem, new List <ZpiObject>()); } foreach (var attr in subSys["cmds"].Values()) { if (attr["params"].Value <JArray>("rsp") != null) { //Sync ZpiSREQ zpiSREQ = new ZpiSREQ(); zpiSREQ.Name = attr.Path.Substring(attr.Path.LastIndexOf(".") + 1); zpiSREQ.CommandId = (byte)attr["cmdId"].Value <byte>(); zpiSREQ.Type = (MessageType)attr["type"].Value <int>(); zpiSREQ.CommandSubsystem = subSystem; foreach (JObject item in attr["params"]["req"]) { foreach (var itm in item) { ZpiArgument zpiArgument = new ZpiArgument() { Name = itm.Key, ParamType = (ParamType)itm.Value.Value <int>() }; zpiSREQ.RequestArguments.AddOrUpdate(zpiArgument); } } if (attr["params"].Value <JArray>("rsp") != null) { foreach (JObject item in attr["params"]["rsp"]) { foreach (var itm in item) { ZpiArgument zpiArgument = new ZpiArgument() { Name = itm.Key, ParamType = (ParamType)itm.Value.Value <int>() }; zpiSREQ.ResponseArguments.AddOrUpdate(zpiArgument); } } } _zpiObjects[subSystem].Add(zpiSREQ); } else { //Async ZpiObject zpiObject = new ZpiSREQ(); zpiObject.Name = attr.Path.Substring(attr.Path.LastIndexOf(".") + 1); zpiObject.CommandId = (byte)attr["cmdId"].Value <byte>(); zpiObject.Type = (MessageType)attr["type"].Value <int>(); zpiObject.CommandSubsystem = subSystem; foreach (JObject item in attr["params"]["req"]) { foreach (var itm in item) { ZpiArgument zpiArgument = new ZpiArgument() { Name = itm.Key, ParamType = (ParamType)itm.Value.Value <int>() }; zpiObject.RequestArguments.AddOrUpdate(zpiArgument); } } _zpiObjects[subSystem].Add(zpiObject); } } } }