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)); }
private static void parse_information_response(Bytes response, Pod pod) { int i = 1; var rt = response.Byte(i++); switch (rt) { case 0x01: pod.state_alert_w278 = response.Word(i); i += 2; pod.state_alerts = new ushort[] { response.Word(i), response.Word(i + 2), response.Word(i + 4), response.Word(i + 6), response.Word(i + 8), response.Word(i + 10), response.Word(i + 12), response.Word(i + 14), }; break; case 0x02: pod.state_last_updated = DateTime.UtcNow; pod.state_faulted = true; pod.state_progress = (PodProgress)response.Byte(i++); parse_delivery_state(pod, response.Byte(i++)); pod.insulin_canceled = response.Byte(i++) * 0.05m; pod.radio_message_sequence = response.Byte(i++); pod.insulin_delivered = response.Byte(i++) * 0.05m; pod.fault_event = response.Byte(i++); pod.fault_event_rel_time = response.Word(i); pod.insulin_reservoir = response.Word(i + 2) * 0.05m; pod.state_active_minutes = response.Word(i + 4); i += 6; pod.state_alert = response.Byte(i++); pod.fault_table_access = response.Byte(i++); byte f17 = response.Byte(i++); pod.fault_insulin_state_table_corruption = f17 >> 7; pod.fault_internal_variables = (f17 & 0x60) >> 6; pod.fault_immediate_bolus_in_progress = (f17 & 0x10) > 0; pod.fault_progress_before = (PodProgress)(f17 & 0x0F); byte r18 = response.Byte(i++); pod.radio_low_gain = (r18 & 0xC0) >> 6; pod.radio_rssi = r18 & 0x3F; pod.fault_progress_before2 = (PodProgress)(response.Byte(i++) & 0x0F); pod.fault_information_type2_last_word = response.Byte(i++); break; default: throw new ProtocolException($"Failed to parse the information response of type {rt}"); } }