Esempio n. 1
0
        public Android.App.Dialog Show(Action <Sensor> onSensorCreated)
        {
            var adb = new IONAlertDialog(context);

            adb.SetTitle(Resource.String.sensor_create_manual_entry);
            adb.SetView(content);

            var ret = adb.Show();

            content.FindViewById(Resource.Id.cancel).Click += (sender, e) => {
                ret.Dismiss();
            };

            content.FindViewById(Resource.Id.ok_done).Click += (sender, e) => {
                double d;

                if (!double.TryParse(measurement.Text, out d))
                {
                    Toast.MakeText(context, Resource.String.please_enter_valid_number, ToastLength.Long).Show();
                    return;
                }

                var sensor = new ManualSensor(sensorType, sensorType == ESensorType.Vacuum);
                sensor.measurement = sensorUnit.OfScalar(d);
                sensor.name        = name.Text;
                onSensorCreated(sensor);

                ret.Dismiss();
            };

            return(ret);
        }
        public void hideLHUI()
        {
            LabelMiddle.Text       = undefinedText;
            LabelTop.Hidden        = true;
            Connection.Hidden      = true;
            DeviceImage.Hidden     = true;
            LabelBottom.Hidden     = true;
            LabelSubview.Hidden    = true;
            subviewTable.Hidden    = true;
            headingDivider.Hidden  = true;
            connectionColor.Hidden = true;
            subviewHide.Hidden     = true;
            subviewTable.Source    = null;
            subviewTable.ReloadData();
            subviewTable.Hidden = true;
            max = 0;
            min = 0;
            LabelMiddle.Font = UIFont.FromName("DroidSans", 20f);

            if (attachedSensor != null)
            {
                attachedSensor.topLabel.BackgroundColor = UIColor.Clear;
                attachedSensor.topLabel.TextColor       = UIColor.Gray;
                attachedSensor = null;
            }
            subviewHide.SetImage(null, UIControlState.Normal);
            currentSensor = null;
            manualSensor  = null;
            isManual      = false;
        }
Esempio n. 3
0
 public ManualSensorParcelable(ManualSensor sensor)
 {
     sensorType = sensor.type;
     isRelative = sensor.isRelative;
     unitCode   = UnitLookup.GetCode(sensor.unit);
     amount     = sensor.measurement.amount;
     name       = sensor.name;
 }
Esempio n. 4
0
        // Overridden from SensorParcelable
        public override Sensor Get(IION ion)
        {
            var ret = new ManualSensor(sensorType, isRelative);

            ret.name        = name;
            ret.measurement = UnitLookup.GetUnit(unitCode).OfScalar(amount);

            return(ret);
        }
            private Sensor ReadManualSensor(BinaryReader reader)
            {
                // Read the actual sensor type
                var sensorType = (ESensorType)reader.ReadInt32();
                // Read whether or not the sensor is relative
                var relative = reader.ReadBoolean();
                // Read and determine the unit code
                var rawUnit = reader.ReadByte();
                // Read the amount of the sensor
                var amount = reader.ReadDouble();
                // Read the minimum measurement of the sensor
                var rawMinUnit   = reader.ReadByte();
                var rawMinAmount = 0.0;

                if (rawMinUnit != 0)
                {
                    rawMinAmount = reader.ReadDouble();
                }
                // Read the maximum measurement of the sensor
                var rawMaxUnit   = reader.ReadByte();
                var rawMaxAmount = 0.0;

                if (rawMaxUnit != 0)
                {
                    rawMaxAmount = reader.ReadDouble();
                }

                var name = reader.ReadString();

                //var ret = new ManualSensor(sensorType, AppState.context.preferences.units.DefaultUnitFor(sensorType).OfScalar(0.0), relative);
                var ret = new ManualSensor(AppState.context.manualSensorContainer, sensorType, AppState.context.preferences.units.DefaultUnitFor(sensorType).OfScalar(0.0), relative);

                ret.SetMeasurement(UnitLookup.GetUnit(rawUnit).OfScalar(amount));

                if (rawMinUnit != 0)
                {
                    ret.minMeasurement = UnitLookup.GetUnit(rawMinUnit).OfScalar(rawMinAmount);
                }

                if (rawMaxUnit != 0)
                {
                    ret.maxMeasurement = UnitLookup.GetUnit(rawMaxUnit).OfScalar(rawMaxAmount);
                }

                ret.name = name;

                return(ret);
            }
 // Overridden from IONActivity
 protected override void OnResume()
 {
     base.OnResume();
     if (!sensorLocked)
     {
         var s = new ManualSensor(ESensorType.Pressure, false);
         s.unit = ion.preferences.units.pressure;
         s.ForceSetMeasurement(ion.preferences.units.pressure.OfScalar(0));
         OnSensorChanged(s);
         ion.PostToMainDelayed(() => {
             slider.ScrollToPressure(s.measurement, true);
         }, TimeSpan.FromMilliseconds(500));
     }
     Refresh();
     slider.onScroll += OnSliderScroll;
     ion.locationManager.onLocationChanged += OnLocationChanged;
     elevation.Text = SensorUtils.ToFormattedString(ion.locationManager.lastKnownLocation.altitude.ConvertTo(ion.preferences.units.length), true);
 }
Esempio n. 7
0
            // Overridden from ISensorModel
            public Sensor ToSensor(IION ion)
            {
                var sensorType = (ESensorType)Enum.Parse(typeof(ESensorType), type);
                //var ret = new ManualSensor(sensorType, AppState.context.preferences.units.DefaultUnitFor(sensorType).OfScalar(0.0), isRelative);
                var ret = new ManualSensor(ion.manualSensorContainer, sensorType, AppState.context.preferences.units.DefaultUnitFor(sensorType).OfScalar(0.0), isRelative);

                ret.name = name;
                ret.SetMeasurement(UnitLookup.GetUnit(unit).OfScalar(measurement));

                if (hasMinMeasurement)
                {
                    ret.minMeasurement = UnitLookup.GetUnit(minUnit).OfScalar(minMeasurement);
                }

                if (hasMaxMeasurement)
                {
                    ret.maxMeasurement = UnitLookup.GetUnit(maxUnit).OfScalar(maxMeasurement);
                }

                return(ret);
            }
Esempio n. 8
0
        /// <summary>
        /// Called when the temperature sensor's measurement is changed.
        /// </summary>
        /// <param name="sensor">Sensor.</param>
        private void OnTemperatureSensorChanged(SensorEvent sensorEvent)
        {
            var measurement = sensorEvent.sensor.measurement;

            if (!editTemperature.IsEditing)
            {
                editTemperature.Text = SensorUtils.ToFormattedString(measurement);
            }

            temperatureUnit = measurement.unit;
            buttonTemperatureUnit.SetTitle(measurement.unit.ToString(), UIControlState.Normal);
            if (pressureSensor == null)
            {
                pressureSensor = new ManualSensor(ion.manualSensorContainer, ESensorType.Pressure, new Scalar(pressureUnit, 0.0));
            }
            var temp = ion.fluidManager.lastUsedFluid.GetSaturatedTemperature(pressureSensor.fluidState, pressureSensor.measurement, ion.locationManager.lastKnownLocation.altitude).ConvertTo(temperatureUnit);

            labelSatTempUnit.Text = temp.unit.ToString();

            UpdateDelta();
        }
        public void setUI(ManualSensor lowManual, ManualSensor highManual)
        {
            pLowHigh.SetTitle(Util.Strings.Analyzer.UNSPECIFIED, UIControlState.Normal);
            pLowHigh.BackgroundColor = UIColor.White;
            pLowHigh.SetTitleColor(UIColor.Black, UIControlState.Normal);

            if (currentSensor == null)
            {
                pdeviceName.Text       = currentSensor.name;
                pdeviceImage.Image     = UIImage.FromBundle("ic_edit");
                pconnectionStatus.Text = "";
                pconnection.Image      = null;
                pconnection.Hidden     = true;
                pbatteryImage.Image    = null;
                connectionColor.Hidden = true;
                conDisButton.Hidden    = true;

                if (lowManual != null && manualSensor != null && lowManual == manualSensor)
                {
                    pLowHigh.SetTitle(Util.Strings.Analyzer.LOWSIDE, UIControlState.Normal);
                    pLowHigh.BackgroundColor    = UIColor.Blue;
                    pLowHigh.Layer.CornerRadius = 6f;
                    pLowHigh.SetTitleColor(UIColor.White, UIControlState.Normal);
                }
                else if (highManual != null && manualSensor != null && highManual == manualSensor)
                {
                    pLowHigh.SetTitle(Util.Strings.Analyzer.HIGHSIDE, UIControlState.Normal);
                    pLowHigh.BackgroundColor    = UIColor.Red;
                    pLowHigh.Layer.CornerRadius = 6f;
                    pLowHigh.SetTitleColor(UIColor.White, UIControlState.Normal);
                }

                if (manualSensor.unit != Units.Vacuum.MICRON)
                {
                    pgaugeValue.Text = manualSensor.measurement.amount.ToString("N");
                }
                else
                {
                    pgaugeValue.Text = manualSensor.measurement.amount.ToString();
                }
                pvalueType.Text = manualSensor.unit.ToString();
            }
            else
            {
                pdeviceName.Text = currentSensor.name;
                if (currentSensor.device.isConnected)
                {
                    pconnection.Image = UIImage.FromBundle("ic_bluetooth_connected");
                    connectionColor.BackgroundColor = UIColor.Green;
                    pconnectionStatus.Text          = "";
                    if (currentSensor.device.battery > 75)
                    {
                        pbatteryImage.Image = UIImage.FromBundle("img_battery_100");
                    }
                    else if (currentSensor.device.battery > 50)
                    {
                        pbatteryImage.Image = UIImage.FromBundle("img_battery_75");
                    }
                    else if (currentSensor.device.battery > 25)
                    {
                        pbatteryImage.Image = UIImage.FromBundle("img_battery_50");
                    }
                    else if (currentSensor.device.battery > 0)
                    {
                        pbatteryImage.Image = UIImage.FromBundle("img_battery_25");
                    }
                    else
                    {
                        pbatteryImage.Image = UIImage.FromBundle("img_battery_0");
                    }
                }
                else
                {
                    pconnection.Image           = UIImage.FromBundle("ic_bluetooth_disconnected");
                    pconnectionStatus.Text      = Util.Strings.Device.DISCONNECTED;
                    pconnectionStatus.TextColor = UIColor.Red;

                    connectionColor.BackgroundColor = UIColor.Red;
                }

                if (currentSensor.unit != Units.Vacuum.MICRON)
                {
                    pgaugeValue.Text = currentSensor.measurement.amount.ToString("N");
                }
                else
                {
                    pgaugeValue.Text = currentSensor.measurement.amount.ToString();
                }
                pvalueType.Text = currentSensor.unit.ToString();

                pconnection.Hidden     = false;
                connectionColor.Hidden = false;
                conDisButton.Hidden    = false;
                pdeviceImage.Image     = DeviceUtil.GetUIImageFromDeviceModel(currentSensor.device.serialNumber.deviceModel);
                if (AppState.context.currentAnalyzer.lowSideSensor != null && AppState.context.currentAnalyzer.lowSideSensor == currentSensor)
                {
                    pLowHigh.SetTitle(Util.Strings.Analyzer.LOWSIDE, UIControlState.Normal);
                    pLowHigh.SetTitleColor(UIColor.White, UIControlState.Normal);
                    pLowHigh.BackgroundColor = UIColor.Blue;
                }
                else if (AppState.context.currentAnalyzer.highSideSensor != null && AppState.context.currentAnalyzer.highSideSensor == currentSensor)
                {
                    pLowHigh.SetTitle(Util.Strings.Analyzer.HIGHSIDE, UIControlState.Normal);
                    pLowHigh.SetTitleColor(UIColor.White, UIControlState.Normal);
                    pLowHigh.BackgroundColor = UIColor.Red;
                }
                aView.Hidden = false;
            }
        }
 public ManualSensorEditDialog(Context context, ManualSensor sensor)
 {
     this.context = context;
     this.sensor  = sensor;
 }
Esempio n. 11
0
        /// <summary>
        /// Initializes the temperature widgets for the activity.
        /// </summary>
        private void InitTemperatureWidgets()
        {
            var temperatureView = FindViewById(Resource.Id.temperature);

            temperatureAddView        = temperatureView.FindViewById(Resource.Id.add);
            temperatureLockIconView   = temperatureAddView.FindViewById <ImageView>(Resource.Id.padlock);
            temperatureSensorIconView = temperatureAddView.FindViewById <ImageView>(Resource.Id.icon);
            temperatureEntryView      = temperatureView.FindViewById <EditText>(Resource.Id.edit);
            temperatureUnitView       = temperatureView.FindViewById <Button>(Resource.Id.unit);
            temperatureClearView      = temperatureView.FindViewById <Button>(Resource.Id.clear);

            temperatureTextWatcher = new Watcher((editable) => {
                var text = editable.ToString();
                try {
                    if (temperatureSensor == null)
                    {
                        temperatureSensor      = new ManualSensor(ESensorType.Temperature, false);
                        temperatureSensor.name = GetString(Resource.String.name);
                        temperatureSensor.unit = temperatureUnit;
                    }
                    if (!"".Equals(text))
                    {
                        temperatureSensor.measurement = temperatureSensor.unit.OfScalar(double.Parse(text));
                    }
                } catch (System.Exception) {
                }
            });

            temperatureAddView.SetOnClickListener(new ViewClickAction((view) => {
                if (!isTemperatureLocked)
                {
                    new GaugeDeviceSensorSelectDialog(this, ion, ESensorType.Temperature, (sensor) => {
                        temperatureSensor = sensor;
                    }).Show();
                }
            }));

            temperatureAddView.SetOnLongClickListener(new ViewLongClickAction((view) => {
                if (!isTemperatureLocked)
                {
                    temperatureSensor = null;
                }
            }));

            temperatureClearView.SetOnClickListener(new ViewClickAction((view) => {
                SetTemperatureInputQuietly("");
            }));

            temperatureUnitView.Text = temperatureUnit.ToString();
            temperatureUnitView.SetOnClickListener(new ViewClickAction((v) => {
                var units = temperatureSensor != null ? temperatureSensor.supportedUnits : SensorUtils.DEFAULT_TEMPERATURE_UNITS;
                UnitDialog.Create(this, units, (obj, unit) => {
                    temperatureUnit = unit;
                    temperatureEntryView.ClearFocus();
                    if (temperatureSensor != null && temperatureSensor.isEditable)
                    {
                        temperatureSensor.unit = unit;
                    }
                }).Show();
            }));
            temperatureEntryView.AddTextChangedListener(temperatureTextWatcher);
        }
Esempio n. 12
0
        /// <summary>
        /// Initializes the state and the event handlers for the temperature widgets.
        /// </summary>
        private void InitTemperatureWidgets()
        {
            imageTemperatureLock.Image = UIImage.FromBundle("ic_lock");
            viewTemperatureTouchArea.AddGestureRecognizer(new UITapGestureRecognizer(() => {
                if (!temperatureSensorLocked)
                {
                    var dm                    = InflateViewController <DeviceManagerViewController>(VC_DEVICE_MANAGER);
                    dm.displayFilter          = new SensorOfTypeFilter(ESensorType.Temperature);
                    dm.onSensorReturnDelegate = (GaugeDeviceSensor sensor) => {
                        temperatureUnit   = sensor.unit;
                        temperatureSensor = sensor;
                        if (ptSlider != null)
                        {
                            ptSlider.ptScroller.ScrollEnabled = false;
                            ptSlider.setOffsetFromSensorMeasurement(new SensorEvent(SensorEvent.EType.Invalidated, sensor));
                        }
                        InvalidateViewController();
                    };
                    NavigationController.PushViewController(dm, true);
                }
            }));

            viewTemperatureTouchArea.AddGestureRecognizer(new UILongPressGestureRecognizer(() => {
                if (!temperatureSensorLocked)
                {
                    temperatureSensor = null;
                    ClearPressureInput();
                    ClearTemperatureInput();
                    if (ptSlider != null)
                    {
                        ptSlider.ptScroller.ScrollEnabled = true;
                    }
                }
                InvalidateViewController();
            }));

            editTemperature.ShouldReturn += (textField) => {
                textField.ResignFirstResponder();
                return(true);
            };

            editTemperature.AddTarget((object obj, EventArgs args) => {
                if (temperatureSensor == null)
                {
                    temperatureSensor = new ManualSensor(ion.manualSensorContainer, ESensorType.Temperature, AppState.context.preferences.units.DefaultUnitFor(ESensorType.Pressure).OfScalar(0.0), true);
                }

                SetTemperatureMeasurementFromEditText();
            }, UIControlEvent.EditingChanged);

            buttonTemperatureUnit.SetBackgroundImage(UIImage.FromBundle("ButtonGold").AsNinePatch(), UIControlState.Normal);
            buttonTemperatureUnit.TouchUpInside += (object sender, EventArgs e) => {
                if (temperatureSensor == null || temperatureSensor.isEditable)
                {
                    var supportedUnits = temperatureSensor != null ? temperatureSensor.supportedUnits : SensorUtils.DEFAULT_TEMPERATURE_UNITS;
                    var dialog         = CommonDialogs.CreateUnitPicker(Strings.Measure.PICK_UNIT, supportedUnits, (obj, unit) => {
                        temperatureUnit = unit;
                        if (ptSlider != null)
                        {
                            ptSlider.ptView.tempLookup = unit;
                        }
                        if (pressureSensor != null)
                        {
                            entryMode = new SensorEntryMode(this, pressureSensor, temperatureUnit, editPressure, editTemperature);
                        }
                        else
                        {
                            entryMode = new SensorEntryMode(this, temperatureSensor, pressureUnit, editTemperature, editPressure);
                        }
                        SetTemperatureMeasurementFromEditText();
                        if (ptSlider != null)
                        {
                            recalculateSlider(pressureUnit, ptSlider.ptView.tempLookup);
                        }
                    });
                    PresentViewController(dialog, true, null);
                }
            };
        }
Esempio n. 13
0
        // Overridden from BaseIONViewController
        public override void ViewDidLoad()
        {
            base.ViewDidLoad();

            NavigationItem.Title = Strings.Fluid.PT_CALCULATOR;

            NavigationItem.RightBarButtonItem = new UIBarButtonItem(Strings.HELP, UIBarButtonItemStyle.Plain, delegate {
                var dialog = new UIAlertView(Strings.HELP, Strings.Fluid.STATE_HELP, null, Strings.OK);
                dialog.Show();
            });

            if (initialSensor == null)
            {
                InitNavigationBar("ic_nav_pt_chart", false);
                backAction = () => {
                    root.navigation.ToggleMenu();
                };
            }

            ion = AppState.context;

            ion.locationManager.onLocationChanged += DeltaOnLocationChanged;

            pressureUnit = ion.preferences.units.pressure;

            temperatureUnit = ion.preferences.units.temperature;

            InitPTChartWidgets();
            InitPressureWidgets();
            InitTemperatureWidgets();

            ClearPressureInput();
            ClearTemperatureInput();

            if (initialSensor != null)
            {
                var sensor = initialSensor;
                if (ESensorType.Pressure == sensor.type)
                {
                    pressureSensor = sensor;
                }
                else if (ESensorType.Temperature == sensor.type)
                {
                    temperatureSensor = sensor;
                }
                else
                {
                    //throw new Exception("Cannot accept sensor that is not a pressure or temperature sensor");
                    Log.E(this, "Cannot accept sensor that is not a pressure or temperature sensor");
                }
            }
            var manualEdit = false;
            var topMark    = new UILabel(new CGRect(.5 * View.Bounds.Width - 1, 310, 1, 128 + 20));

            if (initialSensor == null)
            {
                topMark.BackgroundColor = UIColor.Black;
                if (temperatureSensor == null)
                {
                    temperatureSensor = new ManualSensor(ion.manualSensorContainer, ESensorType.Temperature, AppState.context.preferences.units.DefaultUnitFor(ESensorType.Temperature).OfScalar(0.0), true);
                }
                ptSlider = new SliderView(View, pressureUnit, temperatureUnit, temperatureSensor, entryMode);

                ((ManualSensor)temperatureSensor).SetMeasurement(ptSlider.ptView.minTemperature.unit.OfScalar(ptSlider.ptView.minTemperature.amount));

                editTemperature.Text = temperatureSensor.measurement.amount.ToString("N");

                ptSlider.ptScroller.Scrolled += (sender, e) => {
                    if (!(pressureSensor is GaugeDeviceSensor) && !(temperatureSensor is GaugeDeviceSensor) & manualEdit == false)
                    {
                        if (temperatureSensor == null)
                        {
                            temperatureSensor = new ManualSensor(ion.manualSensorContainer, ESensorType.Temperature, AppState.context.preferences.units.DefaultUnitFor(ESensorType.Temperature).OfScalar(0.0), true);
                        }
                        setTemperatureValueFromSlider();
                    }
                };
            }

            editPressure.Started += (sender, e) => {
                manualEdit = true;
                if (ptSlider != null)
                {
                    ptSlider.ptScroller.ScrollEnabled = false;
                }
            };

            editPressure.EditingChanged += (sender, e) => {
                var valid = 0.0;
                double.TryParse(editPressure.Text, out valid);
                if (ptSlider != null)
                {
                    if (valid >= ptSlider.ptView.minPressure && valid <= ptSlider.ptView.maxPressure.amount)
                    {
                        var tempForPressure = ion.fluidManager.lastUsedFluid.GetSaturatedTemperature(pressureSensor.fluidState, new Scalar(pressureUnit, valid), ion.locationManager.lastKnownLocation.altitude).ConvertTo(temperatureUnit).amount;
                        var manualOffset    = (tempForPressure - ptSlider.ptView.minTemperature.amount) * ptSlider.ptView.tempTicks;
                        ptSlider.ptScroller.SetContentOffset(new CGPoint(manualOffset, 0), false);
                    }
                }
            };

            editPressure.Ended += (sender, e) => {
                manualEdit = false;
                if (ptSlider != null)
                {
                    ptSlider.ptScroller.ScrollEnabled = true;
                }
            };

            editTemperature.Started += (sender, e) => {
                manualEdit = true;
                if (ptSlider != null)
                {
                    ptSlider.ptScroller.ScrollEnabled = false;
                }
            };

            editTemperature.EditingChanged += (sender, e) => {
                var valid = 0.0;
                double.TryParse(editTemperature.Text, out valid);
                if (ptSlider != null)
                {
                    var manualOffset = (valid - ptSlider.ptView.minTemperature.amount) * ptSlider.ptView.tempTicks;
                    ptSlider.ptScroller.SetContentOffset(new CGPoint(manualOffset, 0), false);
                }
            };

            editTemperature.Ended += (sender, e) => {
                manualEdit = false;
                if (ptSlider != null)
                {
                    ptSlider.ptScroller.ScrollEnabled = true;
                }
            };
            if (ptSlider != null)
            {
                View.AddSubview(ptSlider.sliderLabel);
                View.AddSubview(ptSlider.ptScroller);
                View.AddSubview(topMark);
            }
        }
Esempio n. 14
0
        // Overridden from BaseIONViewController
        public override void ViewDidLoad()
        {
            base.ViewDidLoad();

            if (initialSensor == null)
            {
                InitNavigationBar("ic_nav_superheat_subcool", false);
                backAction = () => {
                    root.navigation.ToggleMenu();
                };
            }
            ion = AppState.context;

            NavigationItem.Title = Strings.Fluid.SUPERHEAT_SUBCOOL;
            NavigationItem.RightBarButtonItem = new UIBarButtonItem(Strings.HELP, UIBarButtonItemStyle.Plain, delegate {
                var dialog = new UIAlertView(Strings.HELP, Strings.Fluid.STATE_HELP, null, Strings.OK);
                dialog.Show();
            });

            InitializeFluidControlWidgets();


            ion.locationManager.onLocationChanged += DeltaOnLocationChanged;

            pressureUnit    = Units.Pressure.PSIG;
            temperatureUnit = Units.Temperature.FAHRENHEIT;

            pressureSensor    = new ManualSensor(ion.manualSensorContainer, ESensorType.Pressure, AppState.context.preferences.units.DefaultUnitFor(ESensorType.Pressure).OfScalar(0.0), true);
            temperatureSensor = new ManualSensor(ion.manualSensorContainer, ESensorType.Temperature, AppState.context.preferences.units.DefaultUnitFor(ESensorType.Temperature).OfScalar(0.0), false);

            pressureSensor.unit    = pressureUnit;
            temperatureSensor.unit = temperatureUnit;

            buttonPressureUnit.SetBackgroundImage(UIImage.FromBundle("ButtonGold").AsNinePatch(), UIControlState.Normal);
            buttonPressureUnit.TouchUpInside += OnPressureUnitChanged;

            buttonTemperatureUnit.SetBackgroundImage(UIImage.FromBundle("ButtonGold").AsNinePatch(), UIControlState.Normal);
            buttonTemperatureUnit.TouchUpInside += OnTemperatureUnitChanged;

            imagePressureLock.Image    = UIImage.FromBundle("ic_lock");
            imageTemperatureLock.Image = UIImage.FromBundle("ic_lock");

            View.AddGestureRecognizer(new UITapGestureRecognizer(() => {
                editPressure.ResignFirstResponder();
                editTemperature.ResignFirstResponder();
            }));

            viewPressureTouchArea.AddGestureRecognizer(new UITapGestureRecognizer(() => {
                if (!pressureSensorLocked)
                {
                    var dm                    = InflateViewController <DeviceManagerViewController>(VC_DEVICE_MANAGER);
                    dm.displayFilter          = new SensorOfTypeFilter(ESensorType.Pressure);
                    dm.onSensorReturnDelegate = (GaugeDeviceSensor sensor) => {
                        pressureSensor             = sensor;
                        buttonPressureUnit.Enabled = true;
                    };
                    NavigationController.PushViewController(dm, true);
                }
            }));

            viewPressureTouchArea.AddGestureRecognizer(new UILongPressGestureRecognizer(() => {
                if (!pressureSensorLocked)
                {
                    pressureSensor             = null;
                    buttonPressureUnit.Enabled = false;
                    ClearPressureInput();
                }
            }));

            editPressure.ShouldReturn += (textField) => {
                textField.ResignFirstResponder();
                return(true);
            };

            editTemperature.ShouldReturn += (textField) => {
                textField.ResignFirstResponder();
                return(true);
            };

            editPressure.AddTarget((object obj, EventArgs args) => {
                try {
                    if (pressureSensor != null && pressureSensor.isEditable)
                    {
                        var measurement = pressureUnit.OfScalar(double.Parse(editPressure.Text));
                        ((ManualSensor)pressureSensor).SetMeasurement(measurement);
                    }
                    ////if user removes a pressure sensor, they need to be able to create a new manual sensor
                    if (pressureSensor == null)
                    {
                        pressureSensor  = new ManualSensor(ion.manualSensorContainer, ESensorType.Pressure, AppState.context.preferences.units.DefaultUnitFor(ESensorType.Pressure).OfScalar(0.0), true);
                        var measurement = pressureUnit.OfScalar(double.Parse("0.00"));
                        ((ManualSensor)pressureSensor).SetMeasurement(measurement);
                    }
                    buttonPressureUnit.Enabled = true;
                } catch (Exception e) {
                    Log.E(this, "Failed to UpdatePressure: invalid string " + editPressure.Text, e);
                }
                UpdateDelta();
            }, UIControlEvent.EditingChanged);

            viewTemperatureTouchArea.AddGestureRecognizer(new UITapGestureRecognizer(() => {
                if (!temperatureSensorLocked)
                {
                    var dm                    = InflateViewController <DeviceManagerViewController>(VC_DEVICE_MANAGER);
                    dm.displayFilter          = new SensorOfTypeFilter(ESensorType.Temperature);
                    dm.onSensorReturnDelegate = (GaugeDeviceSensor sensor) => {
                        temperatureSensor             = sensor;
                        buttonTemperatureUnit.Enabled = true;
                    };
                    NavigationController.PushViewController(dm, true);
                }
            }));

            viewTemperatureTouchArea.AddGestureRecognizer(new UILongPressGestureRecognizer(() => {
                if (!temperatureSensorLocked)
                {
                    temperatureSensor             = null;
                    buttonTemperatureUnit.Enabled = false;
                    ClearTemperatureInput();
                }
            }));

            editTemperature.AddTarget((object obj, EventArgs args) => {
                try {
                    if (temperatureSensor != null && temperatureSensor.isEditable)
                    {
                        var measurement = temperatureUnit.OfScalar(double.Parse(editTemperature.Text));
                        ((ManualSensor)temperatureSensor).SetMeasurement(measurement);
                    }
                    ////if user removes a temperature sensor, they need to be able to create a new manual sensor
                    if (temperatureSensor == null)
                    {
                        temperatureSensor = new ManualSensor(ion.manualSensorContainer, ESensorType.Temperature, AppState.context.preferences.units.DefaultUnitFor(ESensorType.Temperature).OfScalar(0.0), false);
                        var measurement   = temperatureUnit.OfScalar(double.Parse("0.00"));
                        ((ManualSensor)temperatureSensor).SetMeasurement(measurement);
                    }
                    buttonTemperatureUnit.Enabled = true;
                } catch (Exception e) {
                    Log.E(this, "Failed to UpdateTemperature: invalid string " + editTemperature.Text + ".", e);
                }
                UpdateDelta();
            }, UIControlEvent.EditingChanged);

            editPressure.EditingDidEnd += (s, e) => {
                if (string.IsNullOrEmpty(editPressure.Text))
                {
                    ((ManualSensor)pressureSensor).SetMeasurement(pressureSensor.unit.OfScalar(0));
                }
            };

            if (initialSensor != null)
            {
                var sensor = initialSensor;
                if (ESensorType.Pressure == sensor.type)
                {
                    pressureSensor = sensor;
                    if (initialSensor.linkedSensor != null)
                    {
                        temperatureSensor = initialSensor.linkedSensor;
                    }
                    else
                    {
                        temperatureSensor = new ManualSensor(ion.manualSensorContainer, ESensorType.Temperature, AppState.context.preferences.units.DefaultUnitFor(ESensorType.Temperature).OfScalar(0.0), false);
                    }
                }
                else if (ESensorType.Temperature == sensor.type)
                {
                    temperatureSensor = sensor;
                    if (initialSensor.linkedSensor != null)
                    {
                        pressureSensor = initialSensor.linkedSensor;
                    }
                    else
                    {
                        pressureSensor = new ManualSensor(ion.manualSensorContainer, ESensorType.Pressure, AppState.context.preferences.units.DefaultUnitFor(ESensorType.Pressure).OfScalar(0.0), true);
                    }
                }
                else
                {
                    Log.E(this, "Cannot accept sensor that is not a pressure or temperature sensor");
                    //throw new Exception("Cannot accept sensor that is not a pressure or temperature sensor");
                }
            }
        }