private static void parse_status_response(Bytes response, Pod pod) { pod.state_last_updated = DateTime.UtcNow; var s0 = response[0]; uint s1 = response.DWord(1); uint s2 = response.DWord(5); parse_delivery_state(pod, (byte)(s0 >> 4)); pod.state_progress = (PodProgress)(s0 & 0xF); pod.radio_message_sequence = (int)(s1 & 0x00007800) >> 11; pod.insulin_delivered = ((s1 & 0x0FFF8000) >> 15) * 0.05m; pod.insulin_canceled = (s1 & 0x000007FF) * 0.05m; pod.state_faulted = ((s2 >> 31) != 0); pod.state_alert = (byte)((s2 >> 23) & 0xFF); pod.state_active_minutes = (uint)((s2 & 0x007FFC00) >> 10); pod.insulin_reservoir = (s2 & 0x000003FF) * 0.05m; }
private static void parse_version_response(Bytes response, Pod pod) { bool lengthyResponse = false; pod.state_last_updated = DateTime.UtcNow; int i = 1; if (response.Length == 27) { pod.id_version_unknown_7_bytes = response.ToArray(i, i + 7); i += 7; lengthyResponse = true; } var mx = response.Byte(i++); var my = response.Byte(i++); var mz = response.Byte(i++); pod.id_version_pm = $"{mx}.{my}.{mz}"; var ix = response.Byte(i++); var iy = response.Byte(i++); var iz = response.Byte(i++); pod.id_version_pi = $"{ix}.{iy}.{iz}"; pod.id_version_unknown_byte = response.Byte(i++); pod.state_progress = (PodProgress)(response.Byte(i++) & 0x0F); pod.id_lot = response.DWord(i); pod.id_t = response.DWord(i + 4); i += 8; if (!lengthyResponse) { var rb = response.Byte(i++); pod.radio_low_gain = rb >> 6; pod.radio_rssi = rb & 0b00111111; pod.radio_address = response.DWord(i); } else { pod.radio_address = response.DWord(i); } }
public static Packet parse(Bytes data) { if (data.Length < 5) { return(null); } var crc_computed = CrcUtil.Crc8(data.Sub(0, data.Length - 1).ToArray()); var crc = data[data.Length - 1]; if (crc != crc_computed) { return(null); } var address = data.DWord(0); var d4 = data.Byte(4); var type = (RadioPacketType)(d4 & 0b11100000); var sequence = d4 & 0b00011111; var body = data.Sub(5); return(new Packet(address, type, sequence, body)); }