private static float conformToFloat(byte[] data, int offset, RNPointFieldMsg field) { float x = float.NaN; if (field.datatype == RNPointFieldMsg.Datatype.FLOAT32) { x = System.BitConverter.ToSingle(data, offset + field.offset); } else if (field.datatype == RNPointFieldMsg.Datatype.FLOAT64) { x = (float)System.BitConverter.ToDouble(data, offset + field.offset); } else if (field.datatype == RNPointFieldMsg.Datatype.UINT8 || field.datatype == RNPointFieldMsg.Datatype.INT8) { x = System.BitConverter.ToChar(data, offset + field.offset); } else if (field.datatype == RNPointFieldMsg.Datatype.UINT16) { x = System.BitConverter.ToUInt16(data, offset + field.offset); } else if (field.datatype == RNPointFieldMsg.Datatype.INT16) { x = System.BitConverter.ToInt16(data, offset + field.offset); } else if (field.datatype == RNPointFieldMsg.Datatype.UINT32) { x = System.BitConverter.ToUInt32(data, offset + field.offset); } else if (field.datatype == RNPointFieldMsg.Datatype.INT32) { x = System.BitConverter.ToInt32(data, offset + field.offset); } else if (field.datatype == RNPointFieldMsg.Datatype.INT64) { x = System.BitConverter.ToInt64(data, offset + field.offset); } return(x); }
public new static void CallBack(ROSBridgeMsg msg) { RNDataMsg radiationMsg = (RNDataMsg)msg; if (verbose > 1) { StringBuilder sb = new StringBuilder(); sb.Append(radiationMsg.header.GetSeq()); sb.Append(string.Format("\nWidth: {0} ({1})", radiationMsg.width, radiationMsg.data.Length / radiationMsg.point_step)); sb.Append("\nFields:"); foreach (RNPointFieldMsg field in radiationMsg.fields) { sb.Append("\n\t"); sb.Append(field.ToString()); } sb.Append("\nScalar Fields:"); foreach (RNPointFieldMsg field in radiationMsg.scalar_fields) { sb.Append("\n\t"); sb.Append(field.ToString()); } Debug.Log(sb.ToString()); } RNPointFieldMsg field_x = null, field_y = null, field_z = null, field_e = null, field_channel = null, field_detector = null; for (int i = 0; i < radiationMsg.fields.Length; i++) { if (radiationMsg.fields[i].name.Equals(positionXFieldName)) { field_x = radiationMsg.fields[i]; } else if (radiationMsg.fields[i].name.Equals(positionYFieldName)) { field_y = radiationMsg.fields[i]; } else if (radiationMsg.fields[i].name.Equals(positionZFieldName)) { field_z = radiationMsg.fields[i]; } else if (radiationMsg.fields[i].name.Equals(radiationFieldName)) { field_e = radiationMsg.fields[i]; } else if (radiationMsg.fields[i].name.Equals("channel")) { field_channel = radiationMsg.fields[i]; } else if (radiationMsg.fields[i].name.Equals("detector_id")) { field_detector = radiationMsg.fields[i]; } } if (field_x == null || field_y == null || field_z == null || field_e == null) { return; } RNDataVisualizer visualizer = GameObject.Find("LiveRadiation").GetComponent <RNDataVisualizer>(); int currStart = 0; float x, y, z, intensity; for (int i = 0; i < radiationMsg.width; i++, currStart += radiationMsg.point_step) { //x = conformToFloat(radiationMsg.data, currStart, field_x); //y = conformToFloat(radiationMsg.data, currStart, field_y); //z = conformToFloat(radiationMsg.data, currStart, field_z); x = System.BitConverter.ToSingle(radiationMsg.data, currStart + field_x.offset); y = System.BitConverter.ToSingle(radiationMsg.data, currStart + field_y.offset); z = System.BitConverter.ToSingle(radiationMsg.data, currStart + field_z.offset); intensity = conformToFloat(radiationMsg.data, currStart, field_e); visualizer.AddRadiationPoint(new Vector3(x, y, z), intensity); if (verbose > 0) { Debug.Log(field_x.ToString() + "\n" + field_y.ToString() + "\n" + field_z.ToString() + "\n" + field_e.ToString()); Debug.Log(string.Format("({0}, {1}, {2}): {3}", x, y, z, intensity)); if (field_channel != null) { Debug.Log(System.BitConverter.ToInt16(radiationMsg.data, currStart + field_channel.offset)); } if (field_detector != null) { Debug.Log(System.BitConverter.ToInt16(radiationMsg.data, currStart + field_detector.offset)); } } } }