public routedMessage sendNextCmd(routedMessage msg) { if (filePos >= bin.Length) { byte[] cmd = new byte[2]; cmd[0] = 0x94; cmd[1] = crc; return(new routedMessage(msg.Route.getReturnRoute(), cmd)); } else { int len = Math.Min(128, bin.Length - filePos); byte[] cmd = new byte[len + 2]; cmd[0] = 0x92; cmd[1] = (byte)len; Array.Copy(bin, filePos, cmd, 2, len); for (int i = filePos; i < filePos + len; i++) { crc ^= bin[i]; } filePos += len; // Update main form with % complete if (null != UploadEvent) { int pcentDone = (int)Math.Ceiling(filePos * 100.0 / bin.Length); UploadEvent(this, new UploadEventArgs(pcentDone)); } return(new routedMessage(msg.Route.getReturnRoute(), cmd)); } }
public bool matches(routedMessage message) { //crudely matches set and get responses if (message.Command[0] == sent.Command[0] + 1) { // TODO for get commands match more for set commands, ack needs more info return(true); } return(false); }
public routedMessage getNextRequest() { //take child off top of list if (UnwalkedRoutes.Count > 0) { route next = UnwalkedRoutes[0]; UnwalkedRoutes.RemoveAt(0); routedMessage request = new routedMessage(next, enumerateMsg); return(request); } return(null); }
public void enumerateResponse(routedMessage resp) { route from = resp.Route.getReturnRoute(); commandReader reader = resp.getReader(); reader.ReadByte(); string name = reader.ReadString(); //add to tree under parent //_parent.findNode(from); routedNode p = _parent; //problem with not having the first part of the address // TODO do it properly! int i; if (from.Length > 1) { p = p.children[0]; for (i = 1; i < from.Length - 1; i++) { byte childIdx = from.getLink(i - 1); p = p.children[childIdx]; } p.children.Add(from.getLink(i - 1), new routedNode(name, from)); } else { p.children.Add(0, new routedNode(name, from)); } // else if (from.Length == 2) p.children[0].children.Add((byte)p.children[0].children.Count, new routedNode(name, from)); // else p.children.Add(from.getLink(i-1), new routedNode(name,from)); //add children to unwalked list try { while (1 == 1) { byte con = reader.ReadByte(); UnwalkedRoutes.Add(new route(from, con)); } } catch (Exception) { } }
public object getProperty(ccParameter param, int start, int num) { //send request message routedMessage m = new routedMessage(node.address, new byte[] { 0x03, (byte)param.Index, (byte)start, (byte)num }); MessageSubscription sub = new MessageSubscription() { singleShot = true, sent = m }; con.SendRoutedMessage(m, 0, sub); //wait for reply asyncWaitForReply(sub, defaultTimeout); //decode message param.parseValue(sub.reply); return(param.Value); }
public void setProperty(ccParameter param, int start, int num) { //assume value already set in local param uint nBlocks = 1; uint blockSize = 0; if (param.Value.GetType().IsArray) { if (start >= param.ArrayLen) { throw (new Exception("Set routed Property index too big")); } num = Math.Min(num, (int)param.ArrayLen - start); //calc number of blocks to send blockSize = 32; nBlocks = ((uint)num - 1) / blockSize + 1; } UInt32 startidx = (UInt32)start; for (int i = 0; i < nBlocks; i++) { byte size = (byte)Math.Min(blockSize, start + num - startidx); routedMessage m = new routedMessage(node.address, param.buildSetCmd(startidx, size)); MessageSubscription sub = new MessageSubscription() { singleShot = true, sent = m }; con.SendRoutedMessage(m, 0, sub); //wait for ack asyncWaitForReply(sub, defaultTimeout); //TODO check ack? startidx += blockSize; } }
public void handleReply(routedMessage message) { //pass to async method reply = message; }
public void parseValue(routedMessage msg) { UInt32 startIdx; byte len; commandReader reader = msg.getReader(); reader.ReadByte(); reader.ReadByte(); switch (TypeIdx) { case CC_BOOL: Value = reader.ReadBoolean(); break; case CC_STRING: Value = reader.ReadString(); break; case CC_UINT8: byte valb = reader.ReadByte(); Value = valb; break; case CC_INT8: sbyte valsb = reader.ReadSByte(); Value = valsb; break; case CC_UINT16: UInt16 valui16 = reader.ReadUInt16(); Value = valui16; break; case CC_INT16: Int16 vali16 = reader.ReadInt16(); Value = vali16; break; case CC_UINT32: UInt32 valui32 = reader.ReadUInt32(); Value = valui32; break; case CC_INT32: Int32 vali32 = reader.ReadInt32(); Value = vali32; break; case CC_UINT64: throw (new NotImplementedException()); break; case CC_INT64: throw (new NotImplementedException()); break; case CC_BOOL_ARRAY: throw (new NotImplementedException()); break; case CC_STRING_ARRAY: throw (new NotImplementedException()); break; case CC_UINT8_ARRAY: startIdx = reader.Read7BitEncodedUInt32(); len = reader.ReadByte(); if (Value == null) { Value = new byte[ArrayLen]; } for (UInt32 i = startIdx; i < startIdx + len; i++) { ((byte[])Value)[i] = reader.ReadByte(); } break; case CC_INT8_ARRAY: startIdx = reader.Read7BitEncodedUInt32(); len = reader.ReadByte(); if (Value == null) { Value = new sbyte[ArrayLen]; } for (UInt32 i = startIdx; i < startIdx + len; i++) { ((sbyte[])Value)[i] = reader.ReadSByte(); } break; case CC_UINT16_ARRAY: startIdx = reader.Read7BitEncodedUInt32(); len = reader.ReadByte(); if (Value == null) { Value = new UInt16[ArrayLen]; } for (UInt32 i = startIdx; i < startIdx + len; i++) { ((UInt16[])Value)[i] = reader.ReadUInt16(); } break; case CC_INT16_ARRAY: startIdx = reader.Read7BitEncodedUInt32(); len = reader.ReadByte(); if (Value == null) { Value = new Int16[ArrayLen]; } for (UInt32 i = startIdx; i < startIdx + len; i++) { ((Int16[])Value)[i] = reader.ReadInt16(); } break; case CC_UINT32_ARRAY: startIdx = reader.Read7BitEncodedUInt32(); len = reader.ReadByte(); if (Value == null) { Value = new UInt32[ArrayLen]; } for (UInt32 i = startIdx; i < startIdx + len; i++) { ((UInt32[])Value)[i] = reader.ReadUInt32(); } break; case CC_INT32_ARRAY: startIdx = reader.Read7BitEncodedUInt32(); len = reader.ReadByte(); if (Value == null) { Value = new Int32[ArrayLen]; } for (UInt32 i = startIdx; i < startIdx + len; i++) { ((Int32[])Value)[i] = reader.ReadInt32(); } break; case CC_UINT64_ARRAY: throw (new NotImplementedException()); break; case CC_INT64_ARRAY: throw (new NotImplementedException()); break; case CC_FLOAT: throw (new NotImplementedException()); break; case CC_DOUBLE: throw (new NotImplementedException()); break; case CC_FLOAT_ARRAY: throw (new NotImplementedException()); break; case CC_DOUBLE_ARRAY: throw (new NotImplementedException()); break; case CC_ENUMERATION: byte valenum = reader.ReadByte(); Value = valenum; break; case CC_ENUMERATION_VALUES: startIdx = reader.ReadByte(); len = reader.ReadByte(); string[] stringArray = new string[len]; for (int i = 0; i < len; i++) { stringArray[i] = reader.ReadString(); } Value = stringArray; break; case CC_VOID_FUNCTION: throw (new NotImplementedException()); break; } }