// вызывается из потока собыйти unity static private void setpos(PacketSetpos setpos) { if (!idnames.ContainsKey(setpos.idname)) { return; } int id = idnames[setpos.idname]; if (devices.ContainsKey(id)) { switch (devices[id].GetType().ToString()) { case "manipulator1": { manipulator1 manipulator = (manipulator1)devices[id]; manipulator.SetPos(setpos.a0, setpos.a1, setpos.a2); } break; case "manipulator2": { manipulator2 manipulator = (manipulator2)devices[id]; manipulator.SetPos(setpos.a0, setpos.a1, setpos.a2, setpos.a3, setpos.a4, setpos.a5, setpos.a6 != 0.0f); } break; default: return; } } if (things.ContainsKey(id)) { things[id].SetPos(setpos.a0, setpos.a1, setpos.a2, setpos.a3, setpos.a4, setpos.a5, setpos.a6, setpos.a7 != 0.0f); } if (tables.ContainsKey(id)) { tables[id].SetPos(setpos.a0, setpos.a1, setpos.a2, setpos.a3, setpos.a4, setpos.a5, setpos.a6, setpos.a7 != 0.0f); } return; }
static private Packet receive_packet(Context context, bool blocking = true) { var start = Process.GetCurrentProcess().TotalProcessorTime; try { byte[] bytes = new byte[1024]; if (context.buffer.Length == 0) { if (blocking || context.client.GetStream().DataAvailable) { while (true) { int r = context.client.GetStream().Read(bytes, 0, bytes.Length); if (r > 0) { context.buffer += Encoding.ASCII.GetString(bytes, 0, r); } if (!context.client.GetStream().DataAvailable) { break; } } } } while (true) { int pos = 0; string packet = ""; if (context.buffer.Length > 0 && context.buffer.Substring(pos, 4) == "json") { int pos1 = context.buffer.IndexOf(":", pos); if (pos1 != -1) { int size = Int32.Parse(context.buffer.Substring(pos + 4, pos1 - pos - 4)); pos1 += 1; pos = pos1 + size; while (pos > context.buffer.Length) { if (!context.client.GetStream().DataAvailable) { break; } int r = context.client.GetStream().Read(bytes, 0, bytes.Length); if (r > 0) { context.buffer += Encoding.ASCII.GetString(bytes, 0, r); } } packet = context.buffer.Substring(pos1, size); context.buffer = context.buffer.Substring(pos); } } if (packet.Length == 0) { break; } PacketHeader header = UnityEngine.JsonUtility.FromJson <PacketHeader>(packet); header.json_data = packet; if (header.packet == "setpos") { PacketSetpos setpos = UnityEngine.JsonUtility.FromJson <PacketSetpos>(header.json_data); context.packetdict[setpos.idname] = setpos; } else { context.packetdeque.Enqueue(header); } var check = Process.GetCurrentProcess().TotalProcessorTime; if ((check - start).Milliseconds >= 20) { break; } } } catch (Exception e) { Log(e.ToString()); } if (context.packetdeque.Count == 0) { if (context.packetdict.Count == 0) { return(null); } Random rand = new Random(); int r = rand.Next(context.packetdict.Count); int i = 0; foreach (var item in context.packetdict) { if (i == r) { context.packetdict.Remove(item.Key); return(item.Value); } i++; } } Log("received " + ((PacketHeader)context.packetdeque.Peek()).json_data); return(context.packetdeque.Dequeue()); }