示例#1
0
        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);
            }
        }
示例#2
0
        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));
        }
示例#3
0
        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}");
            }
        }