From 0aa336ad69c05bd01bfdfe72381218629899fdb3 Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 22 Dec 2018 22:47:51 +0100 Subject: [PATCH] Various fixes to new data elements --- .../mqbcoding/stats/DashboardFragment.java | 1227 +++++++++-------- app/src/main/res/drawable/ic_battery.png | Bin 15806 -> 15832 bytes app/src/main/res/drawable/ic_distance.png | Bin 814 -> 16071 bytes app/src/main/res/drawable/ic_eco.png | Bin 16905 -> 17000 bytes app/src/main/res/drawable/ic_ecoavg.png | Bin 17288 -> 17385 bytes app/src/main/res/drawable/ic_fuel.png | Bin 16235 -> 16276 bytes app/src/main/res/drawable/ic_fuelprimary.png | Bin 16588 -> 16332 bytes .../main/res/drawable/ic_fuelsecondary.png | Bin 16736 -> 16498 bytes app/src/main/res/drawable/ic_gearbox.png | Bin 16112 -> 16168 bytes app/src/main/res/drawable/ic_heading.png | Bin 1257 -> 17196 bytes app/src/main/res/drawable/ic_lateral.png | Bin 17166 -> 16923 bytes app/src/main/res/drawable/ic_longitudinal.png | Bin 17407 -> 17151 bytes app/src/main/res/drawable/ic_measurement.png | Bin 1069 -> 16647 bytes app/src/main/res/drawable/ic_obd2.png | Bin 0 -> 16409 bytes app/src/main/res/drawable/ic_odometer.png | Bin 1257 -> 17386 bytes app/src/main/res/drawable/ic_oil.png | Bin 16460 -> 16974 bytes .../res/drawable/ic_outsidetemperature.png | Bin 16190 -> 16254 bytes .../main/res/drawable/ic_pedalposition.png | Bin 16625 -> 16693 bytes app/src/main/res/drawable/ic_powermeter.png | Bin 17301 -> 17369 bytes app/src/main/res/drawable/ic_radio.png | Bin 15494 -> 16082 bytes app/src/main/res/drawable/ic_spanner.png | Bin 1295 -> 17073 bytes .../res/layout/layout_dashboard_gauges.xml | 132 +- 22 files changed, 684 insertions(+), 675 deletions(-) create mode 100644 app/src/main/res/drawable/ic_obd2.png diff --git a/app/src/main/java/com/mqbcoding/stats/DashboardFragment.java b/app/src/main/java/com/mqbcoding/stats/DashboardFragment.java index eb8caeed..faf51635 100644 --- a/app/src/main/java/com/mqbcoding/stats/DashboardFragment.java +++ b/app/src/main/java/com/mqbcoding/stats/DashboardFragment.java @@ -15,6 +15,7 @@ import android.os.IBinder; import android.preference.PreferenceManager; import android.support.annotation.Nullable; +import android.support.constraint.ConstraintLayout; import android.util.Log; import android.view.LayoutInflater; import android.view.View; @@ -49,7 +50,6 @@ public class DashboardFragment extends CarFragment { private Speedometer mClockLeft, mClockCenter, mClockRight; private Speedometer mClockMaxLeft, mClockMaxCenter, mClockMaxRight; private Speedometer mClockMinLeft, mClockMinCenter, mClockMinRight; - private ImageView mImageMaxLeft, mImageMaxCenter, mImageMaxRight; private RaySpeedometer mRayLeft, mRayCenter, mRayRight; private ImageView mSteeringWheelAngle; private String mElement1Query, mElement2Query, mElement3Query, mElement4Query; @@ -207,7 +207,7 @@ public void run() { postUpdate(); } - }, 0, 1000);//Update text every second + }, 0, 250);//Update display 0,25 second } @@ -310,11 +310,6 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, mTextMinCenter = rootView.findViewById(R.id.textMinCenter); mTextMinRight = rootView.findViewById(R.id.textMinRight); - //minmax backgrounds: - mImageMaxLeft = rootView.findViewById(R.id.image_MaxLeft); - mImageMaxCenter = rootView.findViewById(R.id.image_MaxCenter); - mImageMaxRight = rootView.findViewById(R.id.image_MaxRight); - //------------------------------------------------------------- //Give them all the right custom typeface //clocks @@ -504,11 +499,12 @@ public void run() { mTextMinCenter.setText("-"); mTextMinRight.setText("-"); mTextMaxRight.setText("-"); + stagingDone = true; + } } }, 2000); - stagingDone = true; } } @@ -556,9 +552,6 @@ public void run() { mTextMinCenter.setVisibility(View.VISIBLE); mTextMinRight.setVisibility(View.VISIBLE); - mImageMaxLeft.setVisibility(View.VISIBLE); - mImageMaxCenter.setVisibility(View.VISIBLE); - mImageMaxRight.setVisibility(View.VISIBLE); } else { // don't show any of it mTextMaxLeft.setVisibility(View.INVISIBLE); mTextMaxCenter.setVisibility(View.INVISIBLE); @@ -568,9 +561,6 @@ public void run() { mTextMinCenter.setVisibility(View.INVISIBLE); mTextMinRight.setVisibility(View.INVISIBLE); - mImageMaxLeft.setVisibility(View.INVISIBLE); - mImageMaxCenter.setVisibility(View.INVISIBLE); - mImageMaxRight.setVisibility(View.INVISIBLE); } //show clock marks for max/min, according to the setting @@ -670,9 +660,7 @@ public void onDestroyView() { mRayLeft = null; mRayCenter = null; mRayRight = null; - mImageMaxLeft = null; - mImageMaxCenter = null; - mImageMaxRight = null; + mDebugQuery = null; selectedFont = null; pressureUnit = null; @@ -1032,11 +1020,26 @@ private void setupElement(String queryElement, TextView value, TextView label) { label.setBackgroundResource(0); break; } + + if (label.getText() != "") + { + ConstraintLayout.LayoutParams params = (ConstraintLayout.LayoutParams) label.getLayoutParams(); + params.width = 600; + label.setLayoutParams(params); + } + + + } private void setupClocks(String queryClock, Speedometer clock, TextView icon, RaySpeedometer ray, Speedometer min, Speedometer max) { + String queryTrim = ""; + String queryLong = queryClock; + String torqueUnit = ""; + long queryPid = 0; + TypedArray typedArray2 = getContext().getTheme().obtainStyledAttributes(new int[]{R.attr.themedStopWatchBackground}); int swBackgroundResource = typedArray2.getResourceId(0, 0); typedArray2.recycle(); @@ -1051,623 +1054,654 @@ private void setupClocks(String queryClock, Speedometer clock, TextView icon, Ra } ImageIndicator imageIndicator = new ImageIndicator(getContext(), needleResource, clockSize, clockSize); + if (queryClock.contains("-")) { + queryTrim = queryClock.substring(0, queryClock.indexOf("-")); // check the prefix + } else { + queryTrim = "other"; + } + // get min/max values and unit from torque + if (queryTrim.equals("torque")) { + queryClock = queryClock.substring(queryClock.lastIndexOf('_') + 1); + queryClock = queryClock.substring(2); + queryPid = new BigInteger(queryClock, 16).longValue(); - switch (queryClock) { - case "none": // currently impossible to choose, maybe in the future? - setupClock(icon, "ic_none", "", clock, false, "", 0, 100, "float"); - break; - case "test": - setupClock(icon, "ic_measurement", "", clock, false, getString(R.string.testing), 0, 360, "float"); - break; - case "exlap-vehicleSpeed": - setupClock(icon, "ic_none", "", clock, false, getString(R.string.unit_kmh), 0, 350, "integer"); - break; - case "exlap-Nav_Altitude": - setupClock(icon, "ic_altitude", "", clock, false, "m", -100, 3000, "integer"); - break; - case "exlap-Nav_Heading": // this is a compass, so a little bit more is needed to setup the clock - setupClock(icon, "ic_heading", "", clock, false, "°", 0, 360, "integer"); - clock.setUnit(""); //still needs a unit and translation, but haven't found where the unit gets this unit yet. - clock.setMarkColor(Color.parseColor("#00FFFFFF")); - - //set the degrees so it functions as a circle - clock.setStartDegree(270); - clock.setEndDegree(630); - ray.setStartDegree(270); - ray.setEndDegree(630); - min.setStartDegree(270); - min.setEndDegree(630); - max.setStartDegree(270); - max.setEndDegree(630); - // set background resource to the same as stopwatch - clock.setBackgroundResource(swBackgroundResource); - break; - case "exlap-engineSpeed": - setupClock(icon, "ic_none", getString(R.string.unit_rpm), clock, true, getString(R.string.unit_rpm1000), 0, 9, "float"); + try { + if (torqueService != null) { + torqueUnit = torqueService.getUnitForPid(queryPid); + } + } catch (Exception e) { + Log.e(TAG, "Error: " + e.getMessage()); + } + } - clock.setTicks(); - clock.setTickTextFormat(0); + // setup each of the clocks: + switch (queryLong) { + case "none": // currently impossible to choose, maybe in the future? + setupClock(icon, "ic_none", "", clock, false, "", 0, 100, "float"); + break; + case "test": + setupClock(icon, "ic_measurement", "", clock, false, getString(R.string.testing), 0, 360, "float"); + break; + case "exlap-vehicleSpeed": + case "torque_speed_0x0d": + setupClock(icon, "ic_none", "", clock, false, getString(R.string.unit_kmh), 0, 350, "integer"); + break; + case "exlap-Nav_Altitude": + setupClock(icon, "ic_altitude", "", clock, false, "m", -100, 3000, "integer"); + break; + case "exlap-Nav_Heading": // this is a compass, so a little bit more is needed to setup the clock + setupClock(icon, "ic_heading", "", clock, false, "°", 0, 360, "integer"); + clock.setMarkColor(Color.parseColor("#00FFFFFF")); + + //set the degrees so it functions as a circle + clock.setStartDegree(270); + clock.setEndDegree(630); + ray.setStartDegree(270); + ray.setEndDegree(630); + min.setStartDegree(270); + min.setEndDegree(630); + max.setStartDegree(270); + max.setEndDegree(630); + // set background resource to the same as stopwatch + clock.setBackgroundResource(swBackgroundResource); + break; + case "exlap-engineSpeed": + case "torque_rpm_0x0c": + setupClock(icon, "ic_none", getString(R.string.unit_rpm), clock, true, getString(R.string.unit_rpm1000), 0, 9, "float"); + + clock.setTicks(); + clock.setTickTextFormat(0); + + break; + case "torque-voltage_0xff1238": + case "exlap-batteryVoltage": + setupClock(icon, "ic_battery", "", clock, false, getString(R.string.unit_volt), 0, 17, "float"); + break; + case "exlap-oilTemperature": + setupClock(icon, "ic_oil", "", clock, true, "°", 0, 200, "float"); + break; + case "exlap-coolantTemperature": + setupClock(icon, "ic_water", "", clock, true, "°", 0, 200, "float"); + break; + case "exlap-outsideTemperature": + setupClock(icon, "ic_outsidetemperature", "", clock, false, "°", -25, 50, "float"); + break; + case "exlap-gearboxOilTemperature": + setupClock(icon, "ic_gearbox", "", clock, false, "°", 0, 200, "float"); + break; + case "torque-turboboost_0xff1202": + case "exlap-absChargingAirPressure": + case "exlap-relChargingAirPressure": + setupClock(icon, "ic_turbo", "", clock, true, pressureUnit, pressureMin, pressureMax, "float"); + break; + case "exlap-lateralAcceleration": + setupClock(icon, "ic_lateral", "", clock, false, getString(R.string.unit_g), -3, 3, "float"); + break; + case "exlap-longitudinalAcceleration": + setupClock(icon, "ic_longitudinal", "", clock, false, getString(R.string.unit_g), -3, 3, "float"); + break; + case "exlap-yawRate": + setupClock(icon, "ic_yaw", "", clock, false, "°/s", -1, 1, "float"); + break; + case "wheelAngle": + setupClock(icon, "ic_wheelangle", "", clock, false, "°", -45, 45, "float"); + break; + case "exlap-EcoHMI_Score.AvgShort": + case "exlap-EcoHMI_Score.AvgTrip": + setupClock(icon, "ic_eco", "", clock, false, "", 0, 100, "integer"); + break; + case "exlap-powermeter": + setupClock(icon, "ic_powermeter", "", clock, false, "%", 0, 5000, "integer"); + break; + case "exlap-acceleratorPosition": + setupClock(icon, "ic_pedalposition", "", clock, false, "%", 0, 100, "integer"); + break; + case "exlap-brakePressure": + setupClock(icon, "ic_brakepedalposition", "", clock, false, "%", 0, 100, "integer"); + break; + case "exlap-currentTorque": + setupClock(icon, "ic_none", "", clock, false, getString(R.string.unit_nm), 0, 500, "float"); + break; + case "exlap-currentOutputPower": + setupClock(icon, "ic_none", "", clock, false, getString(R.string.unit_kw), 0, 500, "float"); + break; + case "exlap-currentConsumptionPrimary": + case "exlap-cycleConsumptionPrimary": + setupClock(icon, "ic_fuelprimary", "", clock, false, "l/h", 0, 100, "float"); + break; + case "exlap-currentConsumptionSecondary": + case "exlap-cycleConsumptionSecondary": + setupClock(icon, "ic_fuelsecondary", "", clock, false, "l/h", 0, 100, "float"); + break; + case "exlap-tankLevelPrimary": + setupClock(icon, "ic_fuelprimary", "", clock, false, "%", 0, 100, "float"); + break; + case "exlap-tankLevelSecondary": + setupClock(icon, "ic_fuelsecondary", "", clock, false, "%", 0, 100, "float"); + break; + case "torque-fuelpressure_0x0a": + setupClock(icon, "ic_none", getString(R.string.label_fuel), clock, false, torqueUnit, 0, 800, "float"); + break; + case "torque-engineload_0x04": + setupClock(icon, "ic_none", getString(R.string.label_load), clock, false, torqueUnit, 0, 100, "float"); + break; + case "torque-timing_advance_0x0e": + setupClock(icon, "ic_none", getString(R.string.label_timing), clock, false, torqueUnit, -60, 60, "float"); + break; + case "torque-intake_air_temperature_0x0f": + setupClock(icon, "ic_none", getString(R.string.label_iat), clock, false, torqueUnit, 0, 100, "float"); + break; + case "torque-mass_air_flow_0x10": + setupClock(icon, "ic_none", getString(R.string.label_maf), clock, false, torqueUnit, 0, 700, "float"); + break; + case "torque-throttle_position_0x11": + setupClock(icon, "ic_none", getString(R.string.label_throttle), clock, false, torqueUnit, 0, 100,"float"); + break; + case "torque-AFR_0xff1249": + setupClock(icon, "ic_none", getString(R.string.label_afr), clock, false, "torqueUnit", 0, 35, "float"); + break; + case "torque-fueltrimshortterm1_0x06": + setupClock(icon, "ic_none", getString(R.string.label_ftst1), clock, false, torqueUnit, -20, 20, "float"); + break; + case "torque-fueltrimlongterm1_0x07": + setupClock(icon, "ic_none", getString(R.string.label_ftlt1), clock, false, torqueUnit, -20, 20, "float"); + break; + case "torque-fueltrimshortterm2_0x08": + setupClock(icon, "ic_none", getString(R.string.label_ftst2), clock, false, torqueUnit, -20, 20, "float"); + break; + case "torque-fueltrimlongterm2_0x09": + setupClock(icon, "ic_none", getString(R.string.label_ftlt2), clock, false, torqueUnit, -20, 20, "float"); + break; + case "torque-accelerometer_total_0xff1223": + setupClock(icon, "ic_none", "", clock, false, "G", -3, 3, "float"); + break; + case "torque-phonebatterylevel_0xff129a": + setupClock(icon, "ic_battery", "", clock, false, "%", 0, 100, "integer"); + break; + case "torque-phonebarometer_0xff1270": + setupClock(icon, "ic_none", "", clock, false, torqueUnit, 900, 1070, "float"); + break; + case "torque-obdadaptervoltage_0xff1238": + setupClock(icon, "ic_obd2", "", clock, false, "V", 0, 17, "float"); + break; + case "torque-hybridbattlevel_0x5b": + setupClock(icon, "ic_battery", "", clock, false, "%", 0, 100, "float"); + break; - break; - case "torque-voltage_0xff1238": - case "exlap-batteryVoltage": - setupClock(icon, "ic_battery", "", clock, false, getString(R.string.unit_volt), 0, 17, "float"); - break; - case "exlap-oilTemperature": - setupClock(icon, "ic_oil", "", clock, true, "°", 0, 200, "float"); - break; - case "exlap-coolantTemperature": - setupClock(icon, "ic_water", "", clock, true, "°", 0, 200, "float"); - break; - case "exlap-outsideTemperature": - setupClock(icon, "ic_outsidetemperature", "", clock, false, "°", -25, 50, "float"); - break; - case "exlap-gearboxOilTemperature": - setupClock(icon, "ic_gearbox", "", clock, false, "°", 0, 200, "float"); - break; - case "torque-turboboost_0xff1202": - case "exlap-absChargingAirPressure": - case "exlap-relChargingAirPressure": - setupClock(icon, "ic_turbo", "", clock, true, pressureUnit, pressureMin, pressureMax, "float"); - break; - case "exlap-lateralAcceleration": - setupClock(icon, "ic_lateral", "", clock, false, getString(R.string.unit_g), -3, 3, "float"); - break; - case "exlap-longitudinalAcceleration": - setupClock(icon, "ic_longitudinal", "", clock, false, getString(R.string.unit_g), -3, 3, "float"); - break; - case "exlap-yawRate": - setupClock(icon, "ic_yaw", "", clock, false, "°/s", -1, 1, "float"); - break; - case "wheelAngle": - setupClock(icon, "ic_wheelangle", "", clock, false, "°", -45, 45, "float"); - break; - case "exlap-EcoHMI_Score.AvgShort": - case "exlap-EcoHMI_Score.AvgTrip": - setupClock(icon, "ic_eco", "", clock, false, "", 0, 100, "integer"); - break; - case "exlap-powermeter": - setupClock(icon, "ic_powermeter", "", clock, false, "%", 0, 5000, "integer"); - break; - case "exlap-acceleratorPosition": - setupClock(icon, "ic_pedalposition", "", clock, false, "%", 0, 100, "integer"); - break; - case "exlap-brakePressure": - setupClock(icon, "ic_brakepedalposition", "", clock, false, "%", 0, 100, "integer"); - break; - case "exlap-currentTorque": - setupClock(icon, "ic_none", "", clock, false, getString(R.string.unit_nm), 0, 500, "float"); - break; - case "exlap-currentOutputPower": - setupClock(icon, "ic_none", "", clock, false, getString(R.string.unit_kw), 0, 500, "float"); - break; - case "exlap-currentConsumptionPrimary": - case "exlap-cycleConsumptionPrimary": - setupClock(icon, "ic_fuelprimary", "", clock, false, "l/h", 0, 100, "float"); - break; - case "exlap-currentConsumptionSecondary": - case "exlap-cycleConsumptionSecondary": - setupClock(icon, "ic_fuelsecondary", "", clock, false, "l/h", 0, 100, "float"); - break; - case "exlap-tankLevelPrimary": - setupClock(icon, "ic_fuelprimary", "", clock, false, "%", 0, 100, "float"); - break; - case "exlap-tankLevelSecondary": - setupClock(icon, "ic_fuelsecondary", "", clock, false, "%", 0, 100, "float"); - break; - case "torque-fuelpressure_0x0a": - setupClock(icon, "ic_none", getString(R.string.label_fuel), clock, false, "", 0, 350, "float"); - break; - case "torque-engineload_0x04": - setupClock(icon, "ic_none", getString(R.string.label_load), clock, false, "", 0, 100, "float"); - break; - case "torque-timing_advance_0x0e": - setupClock(icon, "ic_none", getString(R.string.label_timing), clock, false, "", 0, 100, "float"); - break; - case "torque-intake_air_temperature_0x0f": - setupClock(icon, "ic_none", getString(R.string.label_iat), clock, false, "", 0, 100, "float"); - break; - case "torque-mass_air_flow_0x10": - setupClock(icon, "ic_none", getString(R.string.label_maf), clock, false, "", 0, 100, "float"); - break; - case "torque-throttle_position_0x11": - setupClock(icon, "ic_none", getString(R.string.label_throttle), clock, false, "", 0, 100, "float"); - break; - case "torque-AFR_0xff1249": - setupClock(icon, "ic_none", getString(R.string.label_afr), clock, false, ":1", 0, 100, "float"); - break; - case "torque-fueltrimshortterm1_0x06": - setupClock(icon, "ic_none", getString(R.string.label_ftst1), clock, false, "", 0, 100, "float"); - break; - case "torque-fueltrimlongterm1_0x07": - setupClock(icon, "ic_none", getString(R.string.label_ftlt1), clock, false, "", 0, 100, "float"); - break; - case "torque-fueltrimshortterm2_0x08": - setupClock(icon, "ic_none", getString(R.string.label_ftst2), clock, false, "", 0, 100, "float"); - break; - case "torque-fueltrimlongterm2_0x09": - setupClock(icon, "ic_none", getString(R.string.label_ftlt2), clock, false, "", 0, 100, "float"); - break; - case "torque-accelerometer_total_0xff1223": - setupClock(icon, "ic_none", "", clock, false, "G", -3, 3, "float"); - break; - case "torque-phonebatterylevel_0xff129a": - setupClock(icon, "ic_battery", "", clock, false, "%", 0, 100, "integer"); - break; - case "torque-phonebarometer_0xff1270": - setupClock(icon, "ic_none", "", clock, false, "", 900, 1300, "float"); - break; - case "torque-obdadaptervoltage_0xff1238": - setupClock(icon, "ic_obd2", "", clock, false, "V", 0, 17, "float"); - break; - case "torque-hybridbattlevel_0x5b": - setupClock(icon, "ic_battery", "", clock, false, "%", 0, 100, "float"); - break; + } - } + // make the icon appear in the color of unitTextColor + Drawable iconBackground = (Drawable) icon.getBackground(); + if (iconBackground != null) { + int iconTint = clock.getUnitTextColor(); + iconBackground.setColorFilter(iconTint, PorterDuff.Mode.SRC_ATOP); + icon.setBackground(iconBackground); + icon.setTextColor(iconTint); + } + + // bring mins and max's in line with the clock + float minimum = clock.getMinSpeed(); + float maximum = clock.getMaxSpeed(); - // make the icon appear in the color of unitTextColor - Drawable iconBackground = (Drawable) icon.getBackground(); - if (iconBackground != null) { - int iconTint = clock.getUnitTextColor(); - iconBackground.setColorFilter(iconTint, PorterDuff.Mode.SRC_ATOP); - icon.setBackground(iconBackground); - icon.setTextColor(iconTint); + min.setMinMaxSpeed(minimum, maximum); + ray.setMinMaxSpeed(minimum, maximum); + max.setMinMaxSpeed(minimum, maximum); } - // bring mins and max's in line with the clock - float minimum = clock.getMinSpeed(); - float maximum = clock.getMaxSpeed(); + //update clock with data + private void updateClock (String query, Speedometer clock, RaySpeedometer visray, TextView + textmax, TextView textmin, Speedometer clockmax, Speedometer clockmin){ + if (query == null) { + return; - min.setMinMaxSpeed(minimum, maximum); - ray.setMinMaxSpeed(minimum, maximum); - max.setMinMaxSpeed(minimum, maximum); - } + } else if (stagingDone) { - //update clock with data - private void updateClock(String query, Speedometer clock, RaySpeedometer visray, TextView textmax, TextView textmin, Speedometer clockmax, Speedometer clockmin) { - if (query == null) { - return; + float randomClockVal = randFloat(0, 360); + speedFactor = 1f; + pressureFactor = 1f; + long queryPid = 0; + Float clockValue = 0f; + Float oldValue = 0f; + String queryTrim = ""; + String queryLong = query; + String temperatureUnit = (String) mLastMeasurements.get("unitTemperature.temperatureUnit"); - } else if (stagingDone == true) { - float randomClockVal = randFloat(0, 360); - speedFactor = 1f; - pressureFactor = 1f; - long queryPid = 0; - Float clockValue = 0f; - Float oldValue = 0f; - String queryTrim = ""; - String temperatureUnit = (String) mLastMeasurements.get("unitTemperature.temperatureUnit"); - String queryLong = query; - - if (temperatureUnit == null) { - temperatureUnit = "°"; - } + if (temperatureUnit == null) { + temperatureUnit = "°"; + } - if (query.contains("-")) { - queryTrim = query.substring(0, query.indexOf("-")); // check the prefix - } else { - queryTrim = "other"; - } - // Get the value that should be put on the clock, depending on the query - // exlap queries use mLastMeasurements.get(query) - // torque pid queries use torqueService.getValueForPid(queryPid), queryPid is trimmed from the query string - if (queryTrim.equals("torque")) { - query = query.substring(query.lastIndexOf('_') + 1); - query = query.substring(2); - queryPid = new BigInteger(query, 16).longValue(); - - try { - if (torqueService != null) { - clockValue = torqueService.getValueForPid(queryPid, true); - } - } catch (Exception e) { - Log.e(TAG, "Error: " + e.getMessage()); + if (query.contains("-")) { + queryTrim = query.substring(0, query.indexOf("-")); // check the prefix + } else { + queryTrim = "other"; } - } else if (queryTrim.equals("exlap")) { - query = query.substring(query.lastIndexOf('-') + 1); - clockValue = (Float) mLastMeasurements.get(query); - } else { // the only other kind of query is the "random" one. - clockValue = randomClockVal; - } - oldValue = (Float) clock.getSpeed(); - if (clockValue != null) { - switch (queryLong) { - case "test": - case "none": // none cannot happen currently - //don't do anything - break; - // all data that can be put on the clock without further modification: - case "exlap-Nav_Heading": - case "exlap-batteryVoltage": - case "exlap-Nav_Altitude": - case "exlap-lateralAcceleration": - case "exlap-longitudinalAcceleration": - case "exlap-yawRate": - case "exlap-EcoHMI_Score.AvgShort": - case "exlap-EcoHMI_Score.AvgTrip": - case "exlap-brakePressure": - case "exlap-currentTorque": - case "exlap-currentOutputPower": - // all data that can be put on the clock without further modification: - break; - //rpm data, needs to be divided by 1000 before displayed on the clock - case "exlap-engineSpeed": - clockValue = clockValue / 1000; - // temperatures - case "exlap-oilTemperature": - case "exlap-coolantTemperature": - case "exlap-outsideTemperature": - case "exlap-gearboxOilTemperature": - clock.setUnit(temperatureUnit); - // pressures - case "exlap-absChargingAirPressure": - case "exlap-relChargingAirPressure": - clockValue = clockValue * pressureFactor; - break; - // specific case for wheel angle, since it needs to be turned around - case "exlap-wheelAngle": - clockValue = clockValue * -1; // make it negative, otherwise right = left and vice versa - break; - // hybrid power has 1020 as value 0. - case "exlap-powermeter": - clockValue = clockValue - 1020; - // percentages - case "exlap-acceleratorPosition": - case "exlap-tankLevelPrimary": - case "exlap-tankLevelSecondary": - clockValue = clockValue * 100; - break; - // specific consumption data with specific consumption units - // todo: maybe it's better to remove setting the unit from updateclock, but do it on setupclock - case "exlap-currentConsumptionPrimary": - String consumptionUnit = (String) mLastMeasurements.get("currentConsumptionPrimary.unit"); - if (consumptionUnit != null) { - clock.setUnit(consumptionUnit); - } - break; - case "exlap-currentConsumptionSecondary": - String consumption2Unit = (String) mLastMeasurements.get("currentConsumptionSecondary.unit"); - if (consumption2Unit != null) { - clock.setUnit(consumption2Unit); - } - break; - case "exlap-cycleConsumptionPrimary": - String cycconsumptionUnit = (String) mLastMeasurements.get("cycleConsumptionPrimary.unit"); - if (cycconsumptionUnit != null) { - clock.setUnit(cycconsumptionUnit); - } - break; - case "exlap-cycleConsumptionSecondary": - String cycconsumption2Unit = (String) mLastMeasurements.get("cycleConsumptionSecondary.unit"); - if (cycconsumption2Unit != null) { - clock.setUnit(cycconsumption2Unit); - } - break; - // speed, has specific unit requirements and mph calculation - case "exlap-vehicleSpeed": - String speedUnit = (String) mLastMeasurements.get("vehicleSpeed.unit"); - if (speedUnit != null) { - switch (speedUnit) { - case "mph": - speedFactor = 1.60934f; - clock.setUnit("mph"); - break; - case "kmh": - speedFactor = 1f; - clock.setUnit("kmh"); - break; - } - clockValue = clockValue * speedFactor; - } - break; - // torque data elements: - case "torque-fuelpressure_0x0a": - case "torque-engineload_0x04": - case "torque-timing_advance_0x0e": - case "torque-intake_air_temperature_0x0f": - case "torque-mass_air_flow_0x10": - case "torque-throttle_position_0x11": - case "torque-AFR_0xff1249": - case "torque-fueltrimshortterm1_0x06": - case "torque-fueltrimlongterm1_0x07": - case "torque-fueltrimshortterm2_0x08": - case "torque-fueltrimlongterm2_0x09": - case "torque-accelerometer_total_0xff1223": - case "torque-phonebatterylevel_0xff129a": - case "torque-phonebarometer_0xff1270": - case "torque-obdadaptervoltage_0xff1238": - case "torque-hybridbattlevel_0x5b": + // Get the value that should be put on the clock, depending on the query + // exlap queries use mLastMeasurements.get(query) + // torque pid queries use torqueService.getValueForPid(queryPid), queryPid is trimmed from the query string + switch (queryTrim) { + case "torque": + query = query.substring(query.lastIndexOf('_') + 1); + query = query.substring(2); queryPid = new BigInteger(query, 16).longValue(); + try { if (torqueService != null) { - float torqueData = torqueService.getValueForPid(queryPid, true); - String unitText = torqueService.getUnitForPid(queryPid); - Log.d(TAG,"Query: " + query + " unit: " + unitText); - - //todo: also get min/max - float torqueMin = torqueService.getMinValueForPid(queryPid); - float torqueMax = torqueService.getMinValueForPid(queryPid); - clock.setMinSpeed(torqueMin); - clock.setMaxSpeed(torqueMax); - clockValue = torqueData; + clockValue = torqueService.getValueForPid(queryPid, true); } } catch (Exception e) { Log.e(TAG, "Error: " + e.getMessage()); } break; + case "exlap": + query = query.substring(query.lastIndexOf('-') + 1); + clockValue = (Float) mLastMeasurements.get(query); + break; + default: // the only other kind of query is the "random" one. + clockValue = randomClockVal; + break; + } + + oldValue = (Float) clock.getSpeed(); + if (clockValue != null) { + switch (queryLong) { + case "test": + case "none": // none cannot happen currently + //don't do anything + break; + // all data that can be put on the clock without further modification: + case "exlap-Nav_Heading": + case "exlap-batteryVoltage": + case "exlap-Nav_Altitude": + case "exlap-lateralAcceleration": + case "exlap-longitudinalAcceleration": + case "exlap-yawRate": + case "exlap-EcoHMI_Score.AvgShort": + case "exlap-EcoHMI_Score.AvgTrip": + case "exlap-brakePressure": + case "exlap-currentTorque": + case "exlap-currentOutputPower": + // all data that can be put on the clock without further modification: + break; + //rpm data, needs to be divided by 1000 before displayed on the clock + case "exlap-engineSpeed": + clockValue = clockValue / 1000; + // temperatures + case "exlap-oilTemperature": + case "exlap-coolantTemperature": + case "exlap-outsideTemperature": + case "exlap-gearboxOilTemperature": + clock.setUnit(temperatureUnit); + // pressures + case "exlap-absChargingAirPressure": + case "exlap-relChargingAirPressure": + clockValue = clockValue * pressureFactor; + break; + // specific case for wheel angle, since it needs to be turned around + case "exlap-wheelAngle": + clockValue = clockValue * -1; // make it negative, otherwise right = left and vice versa + break; + // hybrid power has 1020 as value 0. + case "exlap-powermeter": + clockValue = clockValue - 1020; + // percentages + case "exlap-acceleratorPosition": + case "exlap-tankLevelPrimary": + case "exlap-tankLevelSecondary": + clockValue = clockValue * 100; + break; + // specific consumption data with specific consumption units + // todo: maybe it's better to remove setting the unit from updateclock, but do it on setupclock + case "exlap-currentConsumptionPrimary": + String consumptionUnit = (String) mLastMeasurements.get("currentConsumptionPrimary.unit"); + if (consumptionUnit != null) { + clock.setUnit(consumptionUnit); + } + break; + case "exlap-currentConsumptionSecondary": + String consumption2Unit = (String) mLastMeasurements.get("currentConsumptionSecondary.unit"); + if (consumption2Unit != null) { + clock.setUnit(consumption2Unit); + } + break; + case "exlap-cycleConsumptionPrimary": + String cycconsumptionUnit = (String) mLastMeasurements.get("cycleConsumptionPrimary.unit"); + if (cycconsumptionUnit != null) { + clock.setUnit(cycconsumptionUnit); + } + break; + case "exlap-cycleConsumptionSecondary": + String cycconsumption2Unit = (String) mLastMeasurements.get("cycleConsumptionSecondary.unit"); + if (cycconsumption2Unit != null) { + clock.setUnit(cycconsumption2Unit); + } + break; + // speed, has specific unit requirements and mph calculation + case "exlap-vehicleSpeed": + String speedUnit = (String) mLastMeasurements.get("vehicleSpeed.unit"); + if (speedUnit != null) { + switch (speedUnit) { + case "mph": + speedFactor = 1.60934f; + clock.setUnit("mph"); + break; + case "kmh": + speedFactor = 1f; + clock.setUnit("kmh"); + break; + } + clockValue = clockValue * speedFactor; + } + break; + // torque data elements: + case "torque-rpm_0x0c": + clockValue = clockValue / 1000; + break; + case "torque-speed_0x0d": + case "torque-fuelpressure_0x0a": + case "torque-engineload_0x04": + case "torque-timing_advance_0x0e": + case "torque-intake_air_temperature_0x0f": + case "torque-mass_air_flow_0x10": + case "torque-throttle_position_0x11": + case "torque-AFR_0xff1249": + case "torque-fueltrimshortterm1_0x06": + case "torque-fueltrimlongterm1_0x07": + case "torque-fueltrimshortterm2_0x08": + case "torque-fueltrimlongterm2_0x09": + case "torque-accelerometer_total_0xff1223": + case "torque-phonebatterylevel_0xff129a": + case "torque-phonebarometer_0xff1270": + case "torque-obdadaptervoltage_0xff1238": + case "torque-hybridbattlevel_0x5b": + queryPid = new BigInteger(query, 16).longValue(); + Log.d(TAG,"queryPid " + queryPid); + + try { + if (torqueService != null) { + float torqueData = torqueService.getValueForPid(queryPid, true); + String unitText = torqueService.getUnitForPid(queryPid); + clockValue = torqueData; + clock.setUnit(unitText); + + } + } catch (Exception e) { + Log.e(TAG, "Error: " + e.getMessage()); + } + break; + } + } + // don't update when there's nothing to update + if (clockValue == oldValue) { + return; + } + // update clock with latest clockValue + if (clockValue != null) { + clock.speedTo(clockValue); } - } - // don't update when there's nothing to update - if (clockValue == oldValue) { - return; - } - // update clock with latest clockValue - if (clockValue != null) { - clock.speedTo(clockValue); - } - // get the speed from the clock and have the high-visibility rays move to this speed as well - float tempValue = clock.getSpeed(); - visray.speedTo(tempValue); + // get the speed from the clock and have the high-visibility rays move to this speed as well + float tempValue = clock.getSpeed(); + visray.speedTo(tempValue); - // update the max clocks and text - if (stagingDone) { - Float maxValue = clockmax.getSpeed(); - Float minValue = clockmin.getSpeed(); + // update the max clocks and text + if (stagingDone) { + Float maxValue = clockmax.getSpeed(); + Float minValue = clockmin.getSpeed(); - if (tempValue > maxValue) { - clockmax.setSpeedAt(tempValue); - textmax.setText(String.format(Locale.US, getContext().getText(R.string.format_decimals).toString(), tempValue)); - } + if (tempValue > maxValue) { + clockmax.setSpeedAt(tempValue); + textmax.setText(String.format(Locale.US, getContext().getText(R.string.format_decimals).toString(), tempValue)); + } - // update the min clocks and text - if (tempValue < minValue) { - clockmin.setSpeedAt(tempValue); - textmin.setText(String.format(Locale.US, getContext().getText(R.string.format_decimals).toString(), tempValue)); + // update the min clocks and text + if (tempValue < minValue) { + clockmin.setSpeedAt(tempValue); + textmin.setText(String.format(Locale.US, getContext().getText(R.string.format_decimals).toString(), tempValue)); + } } } } - } - //update the elements - private void updateElement(String queryElement, TextView value, TextView label) { - long queryPid = 0; + //update the elements + private void updateElement (String queryElement, TextView value, TextView label){ + long queryPid = 0; - if (queryElement == null) { - return; - } else switch (queryElement) { - case "none": - value.setText(""); - break; - case "test": - float randomValue = randFloat(0, 100); - value.setText(String.format(Locale.US, getContext().getText(R.string.format_decimals).toString(), randomValue)); - break; - case "debug": - String mDebugvalue = (String) mLastMeasurements.get(mDebugQuery); - if (mDebugvalue != null) { - value.setText(mDebugvalue); - } - break; - case "torque_version": - try { - if (torqueService != null) { - String torqueVersion = Integer.toString(torqueService.getVersion()); - if (torqueVersion != null) { - value.setText(torqueVersion); + if (queryElement == null) { + return; + } else switch (queryElement) { + case "none": + value.setText(""); + break; + case "test": + float randomValue = randFloat(0, 100); + value.setText(String.format(Locale.US, getContext().getText(R.string.format_decimals).toString(), randomValue)); + break; + case "debug": + String mDebugvalue = (String) mLastMeasurements.get(mDebugQuery); + if (mDebugvalue != null) { + value.setText(mDebugvalue); + } + break; + case "torque_version": + try { + if (torqueService != null) { + String torqueVersion = Integer.toString(torqueService.getVersion()); + if (torqueVersion != null) { + value.setText(torqueVersion); + } } + } catch (Exception e) { + Log.e(TAG, "Error: " + e.getMessage()); } - } catch (Exception e) { - Log.e(TAG, "Error: " + e.getMessage()); - } - break; - // the following are torque PIDs. - case "torque_fuelpressure_0x0a": - case "torque_engineload_0x04": - case "torque_timing_advance_0x0e": - case "torque_intake_air_temperature_0x0f": - case "torque_mass_air_flow_0x10": - case "torque_throttle_position_0x11": - case "torque_turboboost_0xff1202": - case "torque_voltage_0xff1238": - case "torque_AFR_0xff1249": - case "torque_fueltrimshortterm1_0x06": - case "torque_fueltrimlongterm1_0x07": - case "torque_fueltrimshortterm2_0x08": - case "torque_fueltrimlongterm2_0x09": - case "torque_accelerometer_total_0xff1223": - queryElement = queryElement.substring(queryElement.lastIndexOf('_') + 1); - queryElement = queryElement.substring(2); - queryPid = new BigInteger(queryElement, 16).longValue(); - try { - if (torqueService != null) { - float torqueData = torqueService.getValueForPid(queryPid, true); - String unitText = torqueService.getUnitForPid(queryPid); - value.setText(String.format(Locale.US, getContext().getText(R.string.format_decimals).toString() + unitText, torqueData)); + break; + // the following are torque PIDs. + case "torque_fuelpressure_0x0a": + case "torque_engineload_0x04": + case "torque_timing_advance_0x0e": + case "torque_intake_air_temperature_0x0f": + case "torque_mass_air_flow_0x10": + case "torque_throttle_position_0x11": + case "torque_turboboost_0xff1202": + case "torque_voltage_0xff1238": + case "torque_AFR_0xff1249": + case "torque_fueltrimshortterm1_0x06": + case "torque_fueltrimlongterm1_0x07": + case "torque_fueltrimshortterm2_0x08": + case "torque_fueltrimlongterm2_0x09": + case "torque_accelerometer_total_0xff1223": + queryElement = queryElement.substring(queryElement.lastIndexOf('_') + 1); + queryElement = queryElement.substring(2); + queryPid = new BigInteger(queryElement, 16).longValue(); + try { + if (torqueService != null) { + float torqueData = torqueService.getValueForPid(queryPid, true); + String unitText = torqueService.getUnitForPid(queryPid); + value.setText(String.format(Locale.US, getContext().getText(R.string.format_decimals).toString() + unitText, torqueData)); + } + } catch (Exception e) { + Log.e(TAG, "Error: " + e.getMessage()); } - } catch (Exception e) { - Log.e(TAG, "Error: " + e.getMessage()); - } - break; - // the following torque values should have the unit as label - case "torque_rpm_0x0c": - case "torque_speed_0x0d": - queryElement = queryElement.substring(queryElement.lastIndexOf('_') + 1); - queryElement = queryElement.substring(2); - queryPid = new BigInteger(queryElement, 16).longValue(); - try { - if (torqueService != null) { - float torqueData = torqueService.getValueForPid(queryPid, true); - String unitText = torqueService.getUnitForPid(queryPid); - value.setText(String.format(Locale.US, getContext().getText(R.string.format_decimals).toString(), torqueData)); - label.setText(unitText); + break; + // the following torque values should have the unit as label + case "torque_rpm_0x0c": + case "torque_speed_0x0d": + queryElement = queryElement.substring(queryElement.lastIndexOf('_') + 1); + queryElement = queryElement.substring(2); + queryPid = new BigInteger(queryElement, 16).longValue(); + try { + if (torqueService != null) { + float torqueData = torqueService.getValueForPid(queryPid, true); + String unitText = torqueService.getUnitForPid(queryPid); + value.setText(String.format(Locale.US, getContext().getText(R.string.format_decimals).toString(), torqueData)); + label.setText(unitText); + } + } catch (Exception e) { + Log.e(TAG, "Error: " + e.getMessage()); } - } catch (Exception e) { - Log.e(TAG, "Error: " + e.getMessage()); - } - break; - - case "batteryVoltage": - Float mBatteryVoltage = (Float) mLastMeasurements.get("batteryVoltage"); - if (mBatteryVoltage != null) { - value.setText(String.format(Locale.US, getContext().getText(R.string.format_volt).toString(), mBatteryVoltage)); - } - break; + break; - // all temperatures can be handled in the same way, the only difference is the queryElement string - case "coolantTemperature": - case "oilTemperature": - case "gearboxOilTemperature": - case "outsideTemperature": - Float mTemperature = (Float) mLastMeasurements.get(queryElement); - if (mTemperature != null) { - value.setText(String.format(Locale.US, getContext().getText(R.string.format_temperature).toString(), mTemperature)); - } - break; - case "vehicleSpeed": - Float mVehicleSpeed = (Float) mLastMeasurements.get("vehicleSpeed"); - String speedUnit = (String) mLastMeasurements.get("vehicleSpeed.unit"); - if (mVehicleSpeed != null && speedUnit != null) { - value.setText(String.format(Locale.US, getContext().getText(R.string.format_decimals).toString(), mVehicleSpeed)); - label.setText(speedUnit); - } - // values that don't need any decimals - case "engineSpeed": - case "Nav_Heading": - case "Nav_Altitude": - Float mNoDecimalValue = (Float) mLastMeasurements.get(queryElement); - if (mNoDecimalValue != null) { - value.setText(String.format(Locale.US, getContext().getText(R.string.format_noDecimals).toString(), mNoDecimalValue)); - } - break; + case "batteryVoltage": + Float mBatteryVoltage = (Float) mLastMeasurements.get("batteryVoltage"); + if (mBatteryVoltage != null) { + value.setText(String.format(Locale.US, getContext().getText(R.string.format_volt).toString(), mBatteryVoltage)); + } + break; + + // all temperatures can be handled in the same way, the only difference is the queryElement string + case "coolantTemperature": + case "oilTemperature": + case "gearboxOilTemperature": + case "outsideTemperature": + Float mTemperature = (Float) mLastMeasurements.get(queryElement); + if (mTemperature != null) { + value.setText(String.format(Locale.US, getContext().getText(R.string.format_temperature).toString(), mTemperature)); + } + break; + case "vehicleSpeed": + Float mVehicleSpeed = (Float) mLastMeasurements.get("vehicleSpeed"); + String speedUnit = (String) mLastMeasurements.get("vehicleSpeed.unit"); + if (mVehicleSpeed != null && speedUnit != null) { + value.setText(String.format(Locale.US, getContext().getText(R.string.format_decimals).toString(), mVehicleSpeed)); + label.setText(speedUnit); + } + // values that don't need any decimals + case "engineSpeed": + case "Nav_Heading": + case "Nav_Altitude": + Float mNoDecimalValue = (Float) mLastMeasurements.get(queryElement); + if (mNoDecimalValue != null) { + value.setText(String.format(Locale.US, getContext().getText(R.string.format_noDecimals).toString(), mNoDecimalValue)); + } + break; + + // Decimal values, without any specific modification: + case "currentOutputPower": + case "currentTorque": + Float mCurrentDecimalValue = (Float) mLastMeasurements.get(queryElement); + if (mCurrentDecimalValue != null) { + value.setText(String.format(Locale.US, getContext().getText(R.string.format_decimals).toString(), mCurrentDecimalValue)); + } + break; - // Decimal values, without any specific modification: - case "currentOutputPower": - case "currentTorque": - Float mCurrentDecimalValue = (Float) mLastMeasurements.get(queryElement); - if (mCurrentDecimalValue != null) { - value.setText(String.format(Locale.US, getContext().getText(R.string.format_decimals).toString(), mCurrentDecimalValue)); - } - break; + case "currentGear": + Boolean reverseGear = (Boolean) mLastMeasurements.get("reverseGear.engaged"); + Boolean parkingBrake = (Boolean) mLastMeasurements.get("parkingBrake.engaged"); + String currentGear = (String) mLastMeasurements.get("currentGear"); + String recommendedGear = (String) mLastMeasurements.get("recommendedGear"); + String gearText = "-"; - case "currentGear": - Boolean reverseGear = (Boolean) mLastMeasurements.get("reverseGear.engaged"); - Boolean parkingBrake = (Boolean) mLastMeasurements.get("parkingBrake.engaged"); - String currentGear = (String) mLastMeasurements.get("currentGear"); - String recommendedGear = (String) mLastMeasurements.get("recommendedGear"); - String gearText = "-"; - - if (parkingBrake != null && parkingBrake) { - value.setTextColor(Color.WHITE); - gearText = "P"; - } else if (reverseGear != null && reverseGear) { - value.setTextColor(Color.WHITE); - gearText = "R"; - } else if (currentGear == null) { - value.setTextColor(Color.WHITE); - gearText = "-"; - } else if (currentGear != null && recommendedGear != null) { - if (recommendedGear.equals(currentGear) || recommendedGear.equals("NoRecommendation")) { + if (parkingBrake != null && parkingBrake) { + value.setTextColor(Color.WHITE); + gearText = "P"; + } else if (reverseGear != null && reverseGear) { value.setTextColor(Color.WHITE); - gearText = convGear(currentGear); - } else if (!recommendedGear.equals(currentGear)) { - value.setTextColor(Color.RED); - gearText = (convGear(currentGear) + "▶" + convGear(recommendedGear)); + gearText = "R"; + } else if (currentGear == null) { + value.setTextColor(Color.WHITE); + gearText = "-"; + } else if (currentGear != null && recommendedGear != null) { + if (recommendedGear.equals(currentGear) || recommendedGear.equals("NoRecommendation")) { + value.setTextColor(Color.WHITE); + gearText = convGear(currentGear); + } else if (!recommendedGear.equals(currentGear)) { + value.setTextColor(Color.RED); + gearText = (convGear(currentGear) + "▶" + convGear(recommendedGear)); + } } - } - value.setText(gearText); - break; - case "lateralAcceleration": - case "longitudinalAcceleration": - Float mAcceleration = (Float) mLastMeasurements.get(queryElement); - if (mAcceleration != null) { - value.setText(String.format(Locale.US, getContext().getText(R.string.format_gforce).toString(), mAcceleration)); - } - break; - case "yawRate": - Float mYawRate = (Float) mLastMeasurements.get(queryElement); - if (mYawRate != null) { - value.setText(String.format(Locale.US, getContext().getText(R.string.format_degreespersec).toString(), mYawRate)); - } - break; - case "Sound_Volume": - Float mSoundVol = (Float) mLastMeasurements.get(queryElement); - if (mSoundVol != null) { - value.setText(String.format(Locale.US, getContext().getText(R.string.format_noDecimals).toString(), mSoundVol)); - } - break; - case "acceleratorPosition": - Float mAcceleratorPosition = (Float) mLastMeasurements.get("acceleratorPosition"); - if (mAcceleratorPosition != null) { - Float mAccelPosPercent = mAcceleratorPosition * 100; - value.setText(String.format(Locale.US, getContext().getText(R.string.format_percent).toString(), mAccelPosPercent)); - } - break; - case "brakePressure": - Float mBrakePressure = (Float) mLastMeasurements.get("brakePressure"); - if (mBrakePressure != null) { - value.setText(String.format(Locale.US, getContext().getText(R.string.format_percent).toString(), mBrakePressure)); - } - break; - case "wheelAngle": - Float mWheelAngle = (Float) mLastMeasurements.get(queryElement); - if (mWheelAngle != null) { - value.setText(String.format(Locale.US, getContext().getText(R.string.format_degrees).toString(), mWheelAngle)); - } - break; - case "powermeter": - Float mPowermeter = (Float) mLastMeasurements.get(queryElement); - if (mPowermeter != null) { - value.setText(String.format(Locale.US, getContext().getText(R.string.format_noDecimals).toString(), mPowermeter)); - } - break; - - // eco values - case "EcoHMI_Score.AvgShort": - case "EcoHMI_Score.AvgTrip": - Float mEcoScore = (Float) mLastMeasurements.get(queryElement); - if (mEcoScore != null) { - value.setText(String.format(Locale.US, getContext().getText(R.string.format_noDecimals).toString(), mEcoScore)); - } - break; - case "shortTermConsumptionPrimary": - case "shortTermConsumptionSecondary": - Float mshortConsumption = (Float) mLastMeasurements.get(queryElement); - if (mshortConsumption != null) { - value.setText(String.format(Locale.US, "%.1f".toString(), mshortConsumption)); - } - break; - case "Nav_CurrentPosition.Longitude": - case "Nav_CurrentPosition.Latitude": - case "Nav_CurrentPosition.City": - case "Nav_CurrentPosition.State": - case "Nav_CurrentPosition.Country": - case "Nav_CurrentPosition.Street": - case "Radio_Tuner.Name": - case "Radio_Text": - case "totalDistance.distanceValue": - case "vehicleIdenticationNumber.VIN": - String elementValue = (String) mLastMeasurements.get(queryElement); - if (elementValue != null) value.setText(elementValue); - break; - case "blinkingState": - break; - case "tyreStates.stateRearRight": - case "tyreStates.stateRearLeft": - case "tyreStates.stateFrontRight": - case "tyreStates.stateFrontLeft": - String tyreState = (String) mLastMeasurements.get(queryElement); - if (tyreState != null) { - value.setText(tyreState); - //if (tyreState != "OK") value.setTextColor(Color.RED); - } - break; + value.setText(gearText); + break; + case "lateralAcceleration": + case "longitudinalAcceleration": + Float mAcceleration = (Float) mLastMeasurements.get(queryElement); + if (mAcceleration != null) { + value.setText(String.format(Locale.US, getContext().getText(R.string.format_gforce).toString(), mAcceleration)); + } + break; + case "yawRate": + Float mYawRate = (Float) mLastMeasurements.get(queryElement); + if (mYawRate != null) { + value.setText(String.format(Locale.US, getContext().getText(R.string.format_degreespersec).toString(), mYawRate)); + } + break; + case "Sound_Volume": + Float mSoundVol = (Float) mLastMeasurements.get(queryElement); + if (mSoundVol != null) { + value.setText(String.format(Locale.US, getContext().getText(R.string.format_noDecimals).toString(), mSoundVol)); + } + break; + case "acceleratorPosition": + Float mAcceleratorPosition = (Float) mLastMeasurements.get("acceleratorPosition"); + if (mAcceleratorPosition != null) { + Float mAccelPosPercent = mAcceleratorPosition * 100; + value.setText(String.format(Locale.US, getContext().getText(R.string.format_percent).toString(), mAccelPosPercent)); + } + break; + case "brakePressure": + Float mBrakePressure = (Float) mLastMeasurements.get("brakePressure"); + if (mBrakePressure != null) { + value.setText(String.format(Locale.US, getContext().getText(R.string.format_percent).toString(), mBrakePressure)); + } + break; + case "wheelAngle": + Float mWheelAngle = (Float) mLastMeasurements.get(queryElement); + if (mWheelAngle != null) { + value.setText(String.format(Locale.US, getContext().getText(R.string.format_degrees).toString(), mWheelAngle)); + } + break; + case "powermeter": + Float mPowermeter = (Float) mLastMeasurements.get(queryElement); + if (mPowermeter != null) { + value.setText(String.format(Locale.US, getContext().getText(R.string.format_noDecimals).toString(), mPowermeter)); + } + break; + + // eco values + case "EcoHMI_Score.AvgShort": + case "EcoHMI_Score.AvgTrip": + Float mEcoScore = (Float) mLastMeasurements.get(queryElement); + if (mEcoScore != null) { + value.setText(String.format(Locale.US, getContext().getText(R.string.format_noDecimals).toString(), mEcoScore)); + } + break; + case "shortTermConsumptionPrimary": + case "shortTermConsumptionSecondary": + Float mshortConsumption = (Float) mLastMeasurements.get(queryElement); + if (mshortConsumption != null) { + value.setText(String.format(Locale.US, "%.1f".toString(), mshortConsumption)); + } + break; + case "Nav_CurrentPosition.Longitude": + case "Nav_CurrentPosition.Latitude": + case "Nav_CurrentPosition.City": + case "Nav_CurrentPosition.State": + case "Nav_CurrentPosition.Country": + case "Nav_CurrentPosition.Street": + case "Radio_Tuner.Name": + case "Radio_Text": + case "totalDistance.distanceValue": + case "vehicleIdenticationNumber.VIN": + String elementValue = (String) mLastMeasurements.get(queryElement); + if (elementValue != null) value.setText(elementValue); + break; + case "blinkingState": + break; + case "tyreStates.stateRearRight": + case "tyreStates.stateRearLeft": + case "tyreStates.stateFrontRight": + case "tyreStates.stateFrontLeft": + String tyreState = (String) mLastMeasurements.get(queryElement); + if (tyreState != null) { + value.setText(tyreState); + //if (tyreState != "OK") value.setTextColor(Color.RED); + } + break; + } } - } + + // set clock label, units, etc. private void setupClock(TextView icon, String iconDrawableName, String iconText, Speedometer clock, Boolean backgroundWithWarningArea, String unit, Integer minspeed, Integer maxspeed, String speedFormat) { @@ -1687,6 +1721,17 @@ private void setupClock(TextView icon, String iconDrawableName, String iconText, clock.setUnit(unit); clock.setMinMaxSpeed(minspeed, maxspeed); + //dynamically scale the icon_space in case there's only an icon, and no text + if (iconText != "") + { + + + ConstraintLayout.LayoutParams params = (ConstraintLayout.LayoutParams) icon.getLayoutParams(); + params.width = 600; + icon.setLayoutParams(params); + } + + // determine if an empty background, without red warning area is wanted if (!backgroundWithWarningArea) { clock.setBackgroundResource(emptyBackgroundResource); diff --git a/app/src/main/res/drawable/ic_battery.png b/app/src/main/res/drawable/ic_battery.png index 84f36ee1fc5488baa2fd8cb5452be9c704d07f16..320264fea0b07da1986a835bf070cf19f9cd00a7 100644 GIT binary patch delta 458 zcmdm2eWO~jGr-TCmrII^fq{Y7)59eQNJoJ%2OE&ISmDUDQE?J8uc48ykx__|p_Pf5 zmC@t_%$BGko7q@07?q7JlMGB#&2$Y@jEr>65=~5X6I0ETbQ6uuO_GcZlP!`g5;sp| zeak|O!pRG{%=u7kHJhx%d3y6k?jS}cOM}U*yyie^vmI}~K1+RiRo>){Hv09CJzX3_ zDsH{Gn>sF9jWaAsz)-D!{ zpZsfcurTkfR}~QpOfD{Pa{|NqPkll2Am-}#u;2;?$& My85}Sb4q9e07{6Zp#T5? delta 432 zcmcany{}raGr-TCmrII^fq{Y7)59eQNPB=V2OE$KeY@Fxqv9lHUIRm2Ba0A2Gb;lV zE91!rm@QF7HnXv0Fe)1vSs137nCcoErljhcS(upXCK@GM=vtU0n_8qMTNoyqrfr_c z`j&+lg_9R@ne(C8YBpJi^YrG8+(C>?=0=lQdCh^;W;@<|eHL8vIj=Olh#>e$dHyYZ?JuTc`nWEHUSAj`tfZ@(?O v){!aWONVPS!eY2vmaJMO2MqQ9|Ct$%$O+8;yC=aE$YtbP0l+XkKK;@4u diff --git a/app/src/main/res/drawable/ic_distance.png b/app/src/main/res/drawable/ic_distance.png index 77713fc38ce58efcfa5691301b0c845c54db2e93..fe7f5167897a74a6aa2013a39647108c1d7e9dea 100644 GIT binary patch literal 16071 zcmeI3dt6d?AIFbqwlK4cy0kP#d&)B8B8VW8@aX zvNg*9-Zc-|zGNe1GTt zyLkRN8)D{$+T&gE5CqwWhXutVze%R=Teiqw-+i-i$j=B_*g`o3*^M)Ot)QK|#v@(t zisBY17DPp|1=4gczEHXp_EM$G5H$pGW~yX-!7^AuSPG|#B>u$TPy9$Eh=l&cL`D=P zN)`yGiNdlo;Q85e;{@5u1S}zOCKu09u@QrGSivW#(!~-vTjftQ`?8VP)J!H4%o4>i zf8s1tLBfKl7($>l112!Md`JR{50k)Tc~KcmCY?EhK%-C@WQsT0n?j;_v*{Ezokr;W z5V?3H;$#R@*s(z&z2%TAe`1Fp)WNF`HQEEbtUBhzRkL_w0PB?`WZ zB#}?Hn7r}{g5`n?kxU_yN(d%j{!(eC!kmIT&GAB_{eYFQ2Z+iNm zrR9p?ECfL>(m^xjacUV%j)mpY%nSh>oQ2%VpP=NIp&?q<_k=x8CPK15U`L# zeyz2CSbdqjX`=sk0xkYP`p`9$X|UwaHk8H6tQy)xE=^G=`5Ex6RAf#3mA!6peLZcU zJ%?;M{l%i!C&JSD`uv!;J+flooKKGFP-7!&0T~zHJO@+``Hi;z$`<_s)0~Pk&3Yz{ zf_%tS)8F1yuzO(Y!aq+1y9cKBXU0oJ3NEd;+JI&t%XIQuj)nQiLjuh8VKBTI9P+^C zff+F(6)av5BtrJD+_WlL$bFe}26haZxNxXMprbd@GF8C8bMs7ET9JnZEEe>mvBqkq^Kw8M&kG*Dv<7b+r9fZ+mZpvD+3R79Wv!v)enjWJxPh(G~`3#5S> zW4KTefdUK{NCP#-aG@ds1sE=n25OAqLPZ1$FkB!F)EL8siU<^7xIh}HF@_5j5h%cL zfizHK3>PXQP=MhAX`sd!E>uLI0K)~+K#eh6sE9xTh6|*D8e_On5rF~>7f1s&#&Dq` z0tFZ@kOpdu;X*|O3NTzC4b&LJg^CCiV7NdUs4<2M6%i=FaDg;XV+ufjs$opr)8u0P+s0mbRNclKM2sNZ(`}m%;$9p%tm?zjeKA1jbv*zf!509q3 zyXK4Oi-{hm@aGTUDwc~xjSos^o>ZPzTzOC^IjVS8UbWuK+wYM2_Agyu%1=t0V`e!2 zM1L`zVq@DJkT>$M)~9xgb-FGJxtfr+rT5DIa20Y@?*Xl}HI6m9867F70vs-Op0%Ee zH`?%aX=}<;tRgh+nj}MtVX>B3>vHMXn(VcETy?Hx_GQldD78IHQmvH`^UT9rNd_*@ zD`xY4-ACUmcCXL`>%aEBiq}?ay94};6~T{dGanK*bsryH=8-s=y|r-L96RkC0xr_p z-DV1|UEA6`75BncOt0NhUC@a0)+B0%�K-zOAb!S-g#(RpUZ?WAOf`r?WTym^@6z zrObD_#nj){bL%y>I_r)xjVVv)?#!l`{XIQa9hCtN4GVN5RF2GdjCQ3veWEB-^deXH>6V^)1saV(iNM`dCA-&feGY%3|9FtG&2I#|b^R z?e3;(rUx6V$~tFjA~a6VStE0Zo?%}fqV|9qcl^wM%W4z2lqwaA-}NZ3~VY5vz~fdSB7zr-}>biVG58!bBK+TFRyT}PLVj=uQY;?O*e+nn#J=)o?bVXG#E z$EtliOXksUl$`rvap+jt1iJ2sRo-St!aPHCXUD|g%*mx&o~_7zn|bs6Q)1=VYXZlX z=O?^QMHK4ZD%|04akzWpgN-FMcOFY?LKSY3CuwVmio$H?;-H1c$9!kS{OQs@JHKdd z#RkEOM%JCWcs=f#V|+z9lM{KT?a7n5r_U>#4N2d$9vgW)VA{^cm}V0B{)Dsgm-$QY zCbu?j(VlSW(8ty+3@yz4ckHBfpT|{>EmUs9T`p~->^S=(Ah zryiQL=)kVa^-Hn~pLd=qn|h+W<=oY;eH^ZQl2=Y@As`4HfjCd{dI9Q-hNYZ zX8ulD`%LGO+=;*Hs%?%%{(jUh>$uC$2{*cqWf$&Wsjt@Cm3_c6>|UOeRJX`~=d9?n z7o3Po#C*e8ZCu0T+5_3EKhOOvpA*=UZW?aX;@VG;x>#AA z2_?(qvVj`sL+1$2zBp-4zq>mrWJ=t(Wa` z(yeb1stw@<#~Jc8=BzxvL@9sBMPpRYfM6jJ!A`W%Mi5d7N{WDJBM4TCA_#&K2pmKb zlvD=6pjatZ3HJ|3AR!Vl2$9cX=E$&@-P@hrOR`}oq0PuHz0|lh+_wx zK)+BDD;i2-MMFufXvjjW0?Y#+fuUTo$q~N90^k*J2^a@n=ax}kkmMuJ)Qu_6SbY&6 zr`vmwlB69;69-MGBLhl*R$KwbBF2`1vzeAqPVgbt!7#AdiIYnvKMjLvTNc4NGcSQjO49)7sw;=}%exA4!$NN-R#kN!n8P)4FNne8_{8B#!5@o|EHD zguZFp)x0M1DIP1BO}^>qWaX=89(CLP^z`q753#!u`hUO!&pc|j{pIQ31s`Gy!1Nya zY2bZ?&m!iDUXB>A*tQlio*o%C=&Vyb=3?w>GWQ|tk_IDe+BVMYVJIFqF!zZ8a4p8} zoV8g3wj*p-fl^+5#gRcPvZ1EK6}57{u(axMh|U z8<>KGjXP^wFZdFx11D{N$#?QSu)yw1{xs0SbHDi#YdHPo9<~AI`%9Q_v|hLeJh%M` z%s)9n+5~;q@JnZ-k0h|4x3((@;|F#Rckp7ripLK-;aWobTTYVAggzCS@461&NgC=W zu|b(5k|ZrA^cisyY^9v-){t}Lp&(>!rX>yKCIzQ%?q|3d0e2Pci z>3>P#_r|sXa3|%QPk}3#SIZDE2TaC#cs#MX%-(7#-Tg$>`PKib`;sS#G-V2q)MH6! s`Qz_Uqr5OJ8cJeCLrJV?II_h41Jaq+RYDP63IG5A07*qoM6N<$f@)EC6#xJL diff --git a/app/src/main/res/drawable/ic_eco.png b/app/src/main/res/drawable/ic_eco.png index a0c80b37558f8691c22e2c6e1f77037c12ab3c19..61ac3250829a10fddf9abe76836911d24d301960 100644 GIT binary patch delta 1840 zcma)7XH*l08qFeMV<^ZlKuIjTTB2bj5Ks!5FodEaBY}dfgkWQ_GJPN+QVxMYSTaOL z9u&el1Y{aCgtj1Ckg}pco~#JS5E&}t(Vp}E^t>PM$9L~{?z!iD=lgSS^3Oo&&p`d; zt1k9R^4jtM06@vnf#7<~UVn}(^cXEFZ9xtCSzu*j6SRqmn~AX{*2EHPn%xPu_`3vy z6rH97VeqE-AX79BPYpt2{mm@Ucq|5o#^Qr8RDUx}ps~4mV-I8%@_#wAb!E-}cBN5A zUIzriW3taHnjceRgktD92=`>?n{27oSqAjHBf-`!TD)2qlBz~jd(L1Z{+$&jIA$n%k!Hg5i^p@C_>O+ zVrJwWt`5!c&xQM!(97g>`<=L26ogWz2%N<#ZMtpBZO}@H5H@tBx^tWY*}W(+I8baV zTrUioD_0bNH058*r$Vdc{|H^ONg5@KAQG1dxb0Xc^K5N){44dfF7zgdt@Gh4(QnJT zVn}5Nc#rUHjwlw!usp)f*2bSxxq4(Mx!|W&54XS#3PviUO2O}{tZwUJWTf8QH4i_z z4eNTmeG#-@LLTSFfK1hH^UiNC$G0-OMCQQN!@1Zdo{K0vu`ra=ev%|>B%_>EKbwKN zOh02dJSN(@yC_UzwuWO~sWqgb@b_~&`hgz+e!$xi9L5%`X?F;ENT+(+_l-oj0aSpE z@jH0kt-R*Eb!A#(9@J>%QX6OfG?L74foEzr)Ho7mhAnO1xwCql;rMD?_fn-NC4}$f zy8AF9U3hV+?Viz+aO|PoEr&;8AKqG2B%t3s9IQ7?{~{CW#Q)?;DE=Z72d592(Z_D8 zsEErL-i8q!WZPm%Ow)nb0C@>1juq9r8zK+h|Ix~CAo#C16@SKH%dDDfOl9*u4*{QtwXFR-S3vi~n_H!Mq8<2#YTve#W(Cfg(iW}2A zA)LgJABS9EL)gBSxp#2{=4&9SuD|GzvCUa#b@nh_0n;+kuU)NWCe=q4Yob5L$9)Hh zW7GITHJdA7fi|TkBF!Sj02rl3;nP%9w&wEGq#O|{_dO3OJ_Q-T_Qe5ol|pzvRZQXF z%SWDetUV68NCR3`iVfVj=Sw)3Pb4dT9g{A!=;j^$Bk2Gl*Yh_cu0*=au*vf__e|C&0SfTrl# z)o*Ff%=`}66UUhbEVu##C8MZ3QuO?AC zz7i|m&8FZ(KX%~LI;XTbJ+@AG+CoEY!M;>Yey(IWk8ZKk z!eR)&gbhq!#u;~%0!Q19nnsnV3q1|q{=HuRGyrO}Owj`Qtfq6sVOEcVD`^|~615n~ z^A)w0()T=7xVEYiadr30<|8j5v1e8MHz zSq3?ucTlRUc&p?xe9Bdn7HfpOgc7goBUg-YQOORBRB&^t&iXP#uVzm!e0 zXV9Jz2@H(|t{|no@qQszT4O{hA@>QvYZJC%AYV>IM&8+|<*b#r%Xy|csgDtg-vYWn zaaK0(pzqJ)O5%6lFWJaUeK%3RvhgzVhs{G&RoA}1TQ0xDCkVkehz8w7`3k40DFpHp z&KlyVc-QMPiOjSfbloWj>vRmfo`?D>StF$R6a&NYjQ4su4-}*~uozq5i_+h77CzL~ w46!GqZUfB7GiyD=|0AO#{~OwUydx;!Akikbf7{~3aRmY#i7te?i+=b21N>W7n*aa+ delta 1741 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 Fe*ht2LCpXF delta 2128 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 I=akR{04-a@GXMYp diff --git a/app/src/main/res/drawable/ic_fuelprimary.png b/app/src/main/res/drawable/ic_fuelprimary.png index 37960daad28409f68fad12f1020ffe2139477f0b..250b1818ba076ca48846c07867ceff97a68d0e34 100644 GIT binary patch delta 1179 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 MPgg&ebxsLQ00+BR(*OVf delta 1449 zcmey=!1$nvQL!_?&z+Y`ii?4Pf!EW+B?w4+fG`IekPLmh*?pp-IFrqtjaHS+dnq?4>DVz3$e4bXcc7Sm*f{`AOI>qA14{!7psa;u(&iH^Z&-*@Ia!Xwf)^#U zHp_C!GBKGOO}61N2U43$dGhsH5)v7dCcm)Ot7rb_>EaktaqG=&&mJE~iR1NWBiIgd zbSk#-xC?daI?g#(^uQsBPvwY^%p4UX;lh#!4k~=p6!`Jx!^ux2IixSp3FT5$JNHOC&a%IS^gMYn4y zEtT1>5@#Fm{qs?+*CG>>l`aK5GX7dU<&~rCffEwDTjWpu%U`g}VeZ}oiI;tp-!_}f z(OtGP)ybl5wpwa-ivd4$Wc*6>%>3%tDcJ!ZkZmne!%I0^R34V<{w~tFz3{K#ygr9Y=R{<%9y2nHIlN$ z3XIr|q-SX8c-t%-i@%wk(TUwL_yHQ?6D%&xYg7Tvu3SG$-trobiN_ z)hgTJWkEvuE$hr^bD#PR8LNe7uSBBq> zPxtZvT3xo_;GF#o%YFr}aazUsGJajlp-<-~iT%0s$Z_sdtD_DqDlFdn`5R^X&R>|S z=I}Gkh~MJXj-HR9vDPYC4vA|#cV`K2SmZI+U(41kxAwv@rKgrt*R4)-P_A#hc_36f z-*IBL-KsA;ve>>Hb~$dncF!-R>w5xUy6BXzVU22V|8lR`KJV0j_w`qV-0G`VUplwC z%T)1TC7a2&;C*LhrZ+s}*yG2%s{eMgA4BAVsR_a7<>p4M^)r5-nz(vzj6*nluVt*xV zuD@i);hHNAZoAzs7c$LCo|~@B#?sfFR>*iOtS0LcG1H+X?dzM=|-LA4TGt6wbCiVX0YSTsg)Yr%V**!UGzKVnI0oSYVWjYpC zmPgb-Up$E^qpxW)>$c-27B{3jwt6yL$#@p?Q}OT4*D@ypzeN>qJdi)5tM=YeUXQ~k zXZl%&J4*Yn{jBTyYTd*8wi~PSE`PohclP?L)p2t>Y=TN>pZX)Sz<&1cHGkeKZQ9a* ze};zA`Zc>^*Ui^yVO&SG8elCt8parohF=PMIzKb&3oPBKAtZ~STRJ6%ZdE*Yd!!m%-E3&t;ucLK6VOH)W#$ diff --git a/app/src/main/res/drawable/ic_gearbox.png b/app/src/main/res/drawable/ic_gearbox.png index 4df4ac2fa4d5ea79a0c56a1ca5ee4ab8771c9919..52cd53425303083a451d4a5a2c0b23842fb3e4bf 100644 GIT binary patch delta 998 zcmexRyP{69Gr-TCmrII^fq{Y7)59eQNJoJ%2OE&ISmDUDQE?J8pP`Yikx__|p_QqT zm67@6gUlA_LhLMaRZ`51EfbTCl68$z%*}L-Eld)1Eey?*bdwBCO)L!(4NMY~3^$)( zdBZ}K%E@vZ=4iHTmgSOVVzM-tY{O#?q&AoG6zDT6T#}mn!dk!nkEe@cNX4x;clT#s zNsu}IvAoLmoZ~_TKR&&?F)|`DF-Hy_^o+?W6_Q~I{Kfy`(Ss$6IQX z{^uQIf#-#H7mN>lZpl5ze4gd)G}8wjhs<6dc(~;^iwx7R1MJ6Ztr@;FoR>WPo_$-x z`g51ko^9H4=1srqar4b(r>w%+PVFtYvAwmiO3ZjlJlE-OXWw)#o?P6W$GHE{#QI|^ zzBKyX*fr^qyWgd_W3{i{PrYL_JD%BWxPHqiH(9$6dPmFN2P-|d6#A4Tb+k|J-d(?q zXLWlQ-`&h{$5-N)E{E0p7+(E|do6c6K!BwjQ1&b%wr^!f4`zn;MJ zJ{(f*HS1PAUM*~rR;JGOBBZTK@5q(nji-`7XMGE`mpiC)q5j1#pS?*>o@*YP?Qr>p z_lIM32Pfxgae{rPn;{5HEI@C96ALKK0Mm-tmP;%z>ioXC+!y=I`Zxbwy9V1C>nop2 z9()wy{oPR%chlA2=(VrPrN0jy`?B;E^QSNKTT6^YwkTx)gG_MC0$9jFlA+fL@%xMn YExKI3cKc_V0<$iIr>mdKI;Vst09A{?f&c&j delta 937 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 literal 1257 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 delta 1619 zcma)7X;70_6#WuH0$~vmff|BQEC~UDBFIwNVgxFSArJ)F5fy?qQJ_dMB7QZL zvST8{s)0cU*+rlf5D=82m8A+vL;}j7QL6M~#%0>+kDfX2-8W~>ym#N5H}@80!Y=&) z)6Mbqc2h#{LIVJxX5kT5HfD4yYm!+6 zJ)A%fXV}_UTZT8~%f3MTFDF=mCMy5qvbLb9{7{oXfdYdQ381VJ5eiKXN(p!bU*gpd z3hZ$##8VHKZ>Xt{UOWzQ4?3oaT4m8A)fQ2qwii^Gy5SlDv*8uhiWaN-VX=@GOp9#79#5bHN;jznDM+qOj= zB9H6y-v)};vfmgA4UB{XYm4u7=99Egzm2ozcferVRX#I|EqCEFot+RaADQ5kip+pD zH8qWiQ+_ThL-m>`wmqR~B2Tqp9m=+8;6v{&KW+&l6wW1*Xf{Pj!h6`^;owN+JBs@=2MPu#DK^OpCIj*MVWim@f$Ev(q4X$N0pwIU9Ob8|Y@x0-tMNIfb2 zwJ8#Xs-RSlO-^Qh`0#zPBTIY#{{5GS7Bn#!Xdy$kvm2k7$S5o<3}`5)1O8PL;wwW7 zmG1hleDqa&dbr+N0O{;It5o}$u;u#KuTSLd#HvKvkU zu1*gbsCv8?iA2Wi1fabjx;z|+oq(X4!_#(3!zEE%;OtkRkx%J~)?gf<4)DcD6WOul zm#Oy2t?heY!{~veIT9|0glFmXt(>K1I#&eNK6uUS2*tA%#BhqhbcmoBZid4(9GtXJ z&+P+T?8xL~0v5_LvvT3;b4=CDH`?<6ByI=p8n(4nTfy1F%OZ7~4o2Qrm0bU1+IGN!p)_1>XB+a+Hc8><|>oig}*?QN$_ zqQp@{37J7pPv0P3QXSom!C)M1h{UeZBrWMVr#YXl*%j1HSGyZkFE`$QC@CrFkg5bB zbf%6sKVq$~ukW6r71a0j^|hh1oR!P5-S2v$XF>u30**BwDWsW8H!%JdUBRu%3j}r~ zus0`CV9dsQmyp-vAWMNKpR%y9kV9$pFjixZO-)T{C?YfLwed^azRK;R(*=QN)}KGf zSF2(|@5UK~Fb|=>zrUm4JJefPus_S>Drg7}28V=%l*C3VWcQ{6@e7TrhK7bS50}=f zfjHZed+9O|pjnqD84xDx_3X(cPt-H62H`&m#z2E?3f50e$f` z?8)|h`@(+3DVJ^jm4C}#dvt2_`tqo9yl!JsrATHh!lr2CoD;3Su1@iMRZlL5F@15a zuD)K^(Q%W;8p4~J-o56Q_x-~ttKBkVaH;iUqaRTxYCAhanNRyUUO;xKH4hUV9WB4H zv60=}#Y|5p@+snMK>dCaUi&@PWNqhGjnLJB>wRLS%9nZq^ZQs&M4P276p$RZ#`!&K T`z@$R03NR1E)6oywDW%hUAe#` diff --git a/app/src/main/res/drawable/ic_longitudinal.png b/app/src/main/res/drawable/ic_longitudinal.png index c8563f7f834294ef4a5faa08beb7c79aa15a2c9f..984eadab7b67c989a73434a35ebc0e5654ccb6a5 100644 GIT binary patch delta 1800 zcma)-dosh0UP-Kexn|0T^f6QNZuYJy5=j^lBUhAyS_nf_K zrM;U|XSLLissjL^nv67!VK4%U?Wm1|LemxPxD#;shl5S*c_$>Os_xKDIWdc@7`RdaKE2wL58NbY8v+%3&e0=B-QeIG|WQ)JH6_33> zc^BYtbC5`6o}{jkS}&cMnemh^$hXtQbWAr;Sx(5y%ky<@ilozXMve9#0nqmLGVIYi z?m);&=_KRu5EhFa;=Fix8hp9$RiMkA4CkqV4=W=b$A{B*6p1iVWPCh|>bEy1;$nXS zubl|~WqAJ-&nM8$O(lbt_;rh6DnDzWF z+Bq`0FR0I8b9q9pqo=0_TNxO02i@JRpc`;Zitd>8HC1*_O;y~>iZ9(F@LA`ttW3#& zeAHM`QE{dVW>q~pI?8DO;fXRz4M=KzXvUH3?)*_E2u6kj1-;?wH#$NAp8-GD1bL@m zA~t&>7FX+UBk9lMOCrxH6bejQTH4nF?VBz^ZEJG5Zn^+8*EycjJ_&~0B}c$cYzoE0 z@4YCL?>xP|1qakTJUmDw(t-7>igjxmjb>6v+TG)j`8|DoHg8*5pF;pN-7cv3^Gie_ z=}>0Jl&uEgfSM;3hXY^4$zE2tq#ySxL6taN{W3N@Jgg%vEiNv`J2~xy)9DMQh%Akb z<^sk*sguF6V**1^)C*w*mF;#-uM(An9~2=gwY4@q;pm?5#%d)~Ee!&JU^3Y66A>|6 zl$M-@2u2j7WFvwp1u0n~-G#NawV&_kX3v*O_NNN-j2Xx5PoFMx7Q~tj{txJXUUxoB zKLn8t=eY9rV{)Mti~{8yb{!JtJi&3{6}%CgN-`U`@dV!!-tyy#kjnR(ZmcIVT&gW?o>ia5KynBFB$<@xTg2 zwVQhpyV4si5O4Cqb^DivFiHQkWv8ScQ zJ+L~Vys1e{1Uoe7V60hca&mIV;b&xiY8+wuV!adzl>IwIm@u$W3$$O|jQzq4^!D~1 z@U2j+P75m_m1$Hi<&S-`9IR^yYB_XSL9G&}wf)Nu68Q@6zRbhW;&CRpbJByOX zkTykJ+}~+2EiEkyD?#Bir5vg%bEF{{Dhdt`uA@Eg4%%{i7Jpx$9e_gO#KZOJ!w}t&v>D)GTlc z$J4JlCL-@mb=&{}&76;(ZlSgz_Cu47|9x{IGF_Y@L@$3-!~t47#{#uwMkMsL0UmB% Kt_?1sng0QPVMJ8` delta 1863 zcma)7c{JPU8vcbSqOoMCj>;f1mZ>#}P_?8;qHP#sZBc7#nUJC+RT4T?#&jVZs+K89 zs7|AqD77|X$x%8eMOEu6s>aq%?N#p2A9p!(?jQF#=X>9Cp7VU``@HAdy9(L62GPm( zAQRv)4Hy6ba1znk6U@Z@A$I_b-b+G4u8z9Yajw9YA+2a;VQgmYg)z6avamI?V7E)- z{!Yn4Z^(H?&=XIEFe2C-s2RKMfC)PX3e(;v;>jV@2z!E^DJ?QCF)kr8j%NFBnjI{s z_8;N?68}TEPqPQ)_1Wq&+OU6Z6Q96lLYL8&SSxHe#U>0qp?QR{Wr$^%G0qZWZfqVF z5^7-?9&Qz35h~1;S%m&yO7>lt_22JiB;P9(D0o7otTAjExHXuB_V74UC_-MZjxDe= zVag1XoSnSrk?PD6NftAYjqutbe&OxN7OmyhQtJ2CFQt@hOLVs#)d09$-is@VslVqTpVK9Nxy^wc2W&H!S_?U%-g+g$idst!b z+Vk2#JSyX|z1Aep!TewcKreTn7K`z=sOqY!Ywp57M@B||JADTm@%8m?O~86oS{tQO zcX45)px9s{c4H$dD(V#^m`>kBur_?+#|2@sNR{D%frp{&Z*lHS`fjc+p$1^CD!{Xd zP&GBRF3f!@_KvZkp`os4k6B->Z7E+)WK=la*$D;bjg1{1(uB(b7!2kO_Rcd3P%eM_ zUAD8w#fw&jQFB)n)VG0_cFIAh6jSwT$ITGox#pznijKOvx&geq)K~TMp<6+1mm3vC zI@q%eh7FQMF2S|)c158~f#2f_eLOEFIyxHIQKsUUyLL!c{f{sI3OJM87+}Knyxk$$ z+g@9kgc#(E#8_(B>djXYZo1wt-V`%n_@Rl300ohohH|dl^XNyt%SV=yngdM=&;Q1| z*_^y`NdX3f0h@)1)6>(5&I2E(C51@-Aw_`0#rcDgmcU^MaIM3M0DUn!>hQVA2M1`gd-C=+qaTMQyPZx0{zoePCR*-e+0-G$yFccC8)M!v}>qUGCzX*vk9 zwsH|QDr#%yAMIBpV>{$ByC~b_<%v*IshV>>bR*cWz5&mU^*>&xyPbp(BIe_aKZx9ZK( zMWg5MOA!o+oj^fBLDz#?+(aDT)De8v8!6=s1|#vjz}Lmu5v8qiOO6OdOCccHEN91x zEHL~xhu0W*DLg;@rfO)Ob2Nj_ANBL4Whn{hj=#TJO6+%Hno4CmyS!{F;*3g>E9k`IVam&@h6Z)mRebwwzQ&=4n|hF2?8h{ejF-A; zP)nHE;e4=ha{s)O0|FEYE=+eDVI7`KI;hA&DO}Hcs*Z{P5sl#RconU!sWn{gEZ4V4 zOZnSKn$)_#4v?={cY*VkiPgZ5a(I`xcC z6o8o2{F=YIx~hIAc3vS)V5XAq5FsXJK?1a84O>}R4MMUaQa_(P0ivg;$N%z9s{LgDnFsaCB8S}V zvkkF>km}0HE2mTY!ZE3ToDT(CRu3qwfLFPf^Q4t~i@gC4Tq(KAjm!M`_Ihnl>(j>5 zE@^4@NS63yi{I?)8#KCrJO-Ms#;ByG<;V4-zWf2m`|j&U%!SFZvHaZWulYz|t{$GU zvCNhBpi-$u!jb4lX#)= zbu)+aQ@RM{Rm?QGxOA+PJeLVSf`J6b$Nwb}e^@3d2ufln+fK{=`a>1@V^q>((A98J zVqjn(lBG5&D6>h(RCN5V;O9}=#--LL$6t5!i6rTr;zKBw&zOUO=Pw&8lY2)*X64;z cto2qhAmiWnEWShi68JL$Bp0$XA0M3YPr%DW&;S4c diff --git a/app/src/main/res/drawable/ic_measurement.png b/app/src/main/res/drawable/ic_measurement.png index 8f5f659973c5cd8b13be63c828c3bcc3f6312086..f708c70167093389008ea302dbb816572c0e12bb 100644 GIT binary patch literal 16647 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 literal 1069 zcmV+|1k(G7P)gj87?Wglt@Woro=TP2mJR48HTQ>ssiR0*L^tyU@zv9&B) zjYexrB|@Wl*+`VG#8$~ewaP|Fr4n2JKFoKVaeL0(Idjh4y*KWkF=uDK`R4ndnfcB) z-`z1uJdb!`w+-kQM#P2^rybt^eylk>B_RH8xkW^MqE5`*%djqm7VwzqbR zSdsHMX7v}qv%v9e1FJY!e+zii+MfZR+w(#LZXgW>Z136IJ{Y-DH}rqUa=`lT4boP8 zY(|B);fl$uNg6L9E=f-YX)Ct6>LQE-SAe6yKLNRrj=o|~LEG=R2;v|v;wZw=9(pG| zUAuy!75l;JItPEw>RSbU9bgMM-_?Es7hEsbm^Vkk{+zY*u_dXKu)o`qels0K?tWR) zqXOMO+L+mXIS+r5r39ttZ0s*`AA7%V#`?NLuKm{jL=An^%Q~hdJuNXJR2GznRC5LW zcjUZo_iDXsW3ENaQHvOoPAJD}fiZq*$py_Bsj5Nnl8yUpCx~U_vXy%z>Ac)_%C^{~ zq*KacOPNenL$dK_c8VC1UX}EddgFo8W5Yj8$9qi?i%AXK23`Z+0503#*++Q;xC*?3 zyL5h4q9e<0m3>0mRyUVgXzC3G%7on6+fs4(h4S0L%1*9WEXu;C*RAh5<>A+Ts}BeC zR6<>1U*opeRzN080^JSBd}s9p?iy4Zb%=F(2Y;vdNoncA3Sk=Z9;WT?~V&lrM zCu@;oCOrdJE6(?cH+EBz-ZF*Qv^PHl=obetSQ5n zR=0rD73cgEcpDdM?!|?2i@^~ID>fx}wpLXwKhg2t`ct`Van-qJlxM1gTRQbO=z+)R n|2&2bBVxmb5wT&zb4%<$go%r&(ep){00000NkvXXu0mjfEnESA diff --git a/app/src/main/res/drawable/ic_obd2.png b/app/src/main/res/drawable/ic_obd2.png new file mode 100644 index 0000000000000000000000000000000000000000..f0b99d3b247d1c4d727a3affd593b29cf9cbc368 GIT binary patch literal 16409 zcmeI3dsGv57RQ4KYA9=23*v(s;-dmhX7VO!2q*!?HYmv3iVVpFQj$!}Lqb|5k^0uw z`oc$TvE2%S7Ame?MO(I|m7<7MSpg~7tsGtm|O4lGzO4*i*=S)8aNk*5CD`f*D8 z@G3e>FkKOopihvzCXga3IwV6TTNKF}1zKj|yA`6WIG=K`$LlmP*sn!XMK~!5@0s7xM3{WYy zDf)~c>H=#*N`hn=B^1%Z6b_wBlY(3xg~z8eI6NMk_cDbEGB^Op0$3o8$r7+Z0h>t~ zcu_@U^q){GlMAB7;RESVD~Ot|*J}g-keQiD&t%aNZ5qJf^Z5YC1ei=3I)kRmQtKfj zO|6@44>A}>4C|y?g+{MH)D&x6C>1g2gQ!$%qM_Hod8sr*iPX9Qb|^)_2x$NY9Rx-b z$)rOXjX|rl9hyuEz)DyJtMxim#~4+oNk{aEE*%*o<&b;K#ORtxBtyAJJzkY+)YLkC z*cueU0Mb#Fx|l2t3`D~^#GsYJVQbJ+nLXOs>lO0h#d#`{)idU?!$!pzGONcfvuy?Y z3JKA36@+SGNRMb^5JV}m@3Lis2q~eVwp~S;AFoi$kW8JQ5Wq@?*Lye`EQa*32;Gl7 z8iPS&1jaBp0ybN~U?e%{?UOKa2_jR-vj*jXGzOE#WX3QV0uDpKVh4Z>0SMY-ILySx zKubpk>7i$e;yBkKj!Y_$BU%-t7b#Rw8VqREX+mIl&|&7#h7yD#N<@nu7A#^3fzgH? zRJKhfh*0bFkXi~yh(+iCU7?T(Qb87z&1dmwEH+C{WAfNAjSuoc8Uti8pg@_FErU~S z03;Ge`H0YBL~5`W3L4tpQ)Gw~4L^KXY&n||$meiqAXA2hXTW?K6bM2zn9Y@=pFk!@ zDjiJZ5Nt%ErCJ5r@*t(d9P7Er&}0k-OUehiAPt1UR2m0l%V>NkFpw6=g96!1uAIf? zFb7kN5@tlI#R?s|QL`L2FuILxO>H^6`svX@hf-l{P8vw7gRP|(L>;WXp>8(RtgISa z2@4>pwXKPC&>C1K1fCijKBytxfJiZNF`o^9J-&l{>>Qctu-aNzw!*O26_Y7oF$W97 z9?CXr>>xTsuFr(D@PagSe>_Xc+oL`$8#}x-9a5*kG7&IHZg2oA5dzlhhEnmrxN^@{ zhX3u#jndNo4_3~;o==zJV0n)$U7__tCP2#`-Gq>>+!#V&#MtnjvCmJimao!apU(lU zFMwhF9?&}avD(D{pmp?PwZqa_wL&jK+m`K6F~bfj>-E-tMOcpB8p0wjhr{9s0qihV zu}oovl?h@6+PZbt7Q{zS%%;IQMinNGC3J8M2%Li;Fsi-_Kx0zl|55`O2 z!T`ZH30(MmFkS)|1_-`M;KJvF@e;T&K=4fh7d{`1m%xPqf^QPI@cCf81TG8^e3QV1 z&j;fraAAPpn*=U=J{T{73j+k-Byi#L!FUN=7$Ep2feW7x#!KMB0Kqp2T=;x2UIG^e z2);?+!smnW61Xrx@J#|2J|B#iz=Z*VZ{p%24?pk;tI?-CGttL68}juB(MLfk(#6pd z63H}|L^9`)NDrQ%zxPNa14tsZrJzrd?nfUfMRu+FCY(fa$%+s!h%q*Fyq}#O3wvJ( zzWIJY{nqUY)zP{t_Om#l}jEnPAFANvm5)qYPrd8{ou{c`k$I^_HJ=zir8HXEKJykc z&n2A{Zr0vJ;#{tiHdz3RPkG2O^9Q6xx0hXy#??*!*)1ig`-SfK18p@hY==!oSA9-#q!z#F@Hch_CQ2aGq}QbNW?PK4VLg*L!n5ym-6W6fVBJ zv@Y3ioqS7Wn|WR2t5=hEt{?s)a)k~81B z|2w{-qc85pjpORfYxPmR-%s9Fxw9v}SDO6!!j+}miaUH*m$tc@3tyYQEI3@eE}Bbo z;!cU}FWG$kLdVzR3_mz|Bp#ex_Ez@y%da=CFxR9e=eORd_T}am_0*%^$9kqY{c0!= zGzk4JtSwxr@mv&C*m$?;(*2h5&yI?TU(LC&djI3!I#;p| z=6%^$eyZYJrw(W!M;H5NPybrJG^C%Ax5}r_rS6xq2h8%C@?yqA%|8EGRXlbLZ~T+- zb@}QB@>|choHdk3sLNM)ruLG$-8AEkeie7(@@Cv88-Y2u_B%Ir^t{mT#NA}s_Jg_3 z<&j5e*NMVLpVHzo7;O0J~^H7J7e9z_UxUv&sEH= zIVn0{xZS8SHv$>iwWwk5Xfser#MCrSwKqLzkIi~XQ&RWf?o{(DuV+owSmJ{(TVC{=QW;y0I2qRZpFBSy zVWsj)uemyTf4^iyHCH~a?0m_SkX;+ei7weUT)gM^MJcXMD_6U zaK@Kbpmko#lmoAu_IMrZ32<2pyM(`bqUo0c zenqDmE~Qu8f#FhSg*^YH!mXg#^SzI&%0G0 z_S^IK)Sh&4sJf8%O3Klzq4JtVZv?+{YC&4-rNeXTs+Utu9tr>axu|LGBtcQT`8NH_ z6>R~u9J+E;C}rQQVRM literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_odometer.png b/app/src/main/res/drawable/ic_odometer.png index 0de4b35018a98ba13635900f310fe1d2cfb7b160..29c6a67570331a109917f606244308ee6b10ed62 100644 GIT binary patch literal 17386 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 PaoAX`w#;AQx9$G`=U_3- literal 1257 zcmV=P)b}lv@QR6WHL8#6L7Xa&k$AIO)BA_SQt^y~3gTP*3X9mM9 zh_{Xa6>7NDmFf=linZga`l-6I79Y)A#+9j6Q%)EF-U2pKnw{r>UxAS*&js!U220KG z9`JfL-nXR~d-+sTNL{9$C>r&X>Spx;bw-(IvS`~JeN&uJm$g%&iiFfP>bWGCGwMrf zZyip03`A^qZ$1Qs0Pjx4Ki^Qq=Eubzfp{L|xhuLh7LU zTjKl+bym{8QGHkKi9r8R-;cI|Q1!bq4rhg}0)AHqJ3(k`;&h+dSJb}OeDzwG1ezu7 zx2XN0)*kikq-|!AQtz~tkojaD4QFT7JEMNNx+?DHt4nHdFk2l~_Y~FN5w;CqEm_hl z5&Ae8y;q{HPrVqbY^c*ozuHr#{^i8ajQFU>Y zd&7s}b3v;JrJK_yi7gDUErZJd83;TD>;}4k4}}eNzW43|?je8i61KNRTTl3I4HAX6 zCuy*vLi&8ws8Z_eqVkHw-}ZK-+~F{O!Po%=i8)nBt*_JRe6>67XPCcaRex>=p^IUB zDCu-qJ#DhZX_S zezb->=MMmvDh)^|wU&uWtu51af7m)7<>lcE;85L4R6?TAGf6&gX<&r-YLcwwg`CRHE{{V7-1}B>txlW;=(1b6i85{w&MsWc6#PNw+Y~W$x_;uFixbVot zz)GdN$$YC{z%I4FjKo7u4g69u<&x1~0(?!rPyqZ0Jf7ugSm-kv3V#M{uQx^N!~pp; zNbxA}bllGYEUGeNFK!?f&LStkre%sDqf8^&2 zz-yKICDT#MqV2kEACv~V-&f2@^Yer#Ua zbXd*fXa@I{JwDWl=YiuShs6#<;25wet<3a##nT>4yG7v!p{b4=gr+*C9ijgLxYd8v TAI_me00000NkvXXu0mjfw-sn! diff --git a/app/src/main/res/drawable/ic_oil.png b/app/src/main/res/drawable/ic_oil.png index 85efe3d5f159161505cc6f4b45f37ac0e60be658..b520edf95bcaae4e0e036d72a94fb768b3b19096 100644 GIT binary patch delta 1850 zcma)-X;cyl7RT8!(z2dDw@}GaJ1GJ#Af>sR8kR_!xM6B(`qX;n7Ck_n=a%?fYeZpKF zM*si-1*fxi2JA2sR$XRd~WOQ~RG;-Iw1p-#^p$_l5MZ$lU!4upAhX z?h7`6Ujd(D)v#>$Yzon$Ey)zj=(Etrv@AUT06v21dSm*soWX03-?F}seAm{9Y&0;2Ce=PtO9-2?9bX_kzmBat0xthXwWV*XC~(U z-{g0_X{}6{xH+&PA(eH&x|um>3=!td+sH@DEum~ag?I;GGX}iyGYE!Dn*87xaQP)= z(rUh3#w;!Lr#Q>ruL#t^NcI7s?470#U26PRlLTpgL)Zk19}B1p5glz+WUSK*q-+l>-i59h$d(Fv z^qBNF{`(9>wy^+4Xez$)EBXv)L|M?V{}SD-s9$2KZzr;Mu7B8b_!QI(I8=cOi%`tl zVj8vl8cu$A!2pl(Mb`RxG?|{qmcsbgEPCPb3D;Z>mLZlPzxmBeW(V zUONn*`f8wPx~lY}WDyZ#)U)>cKX5dj!!$vy^9U`QsRbCR6c5@RiXOjlwdeUN%xtOi zO#T`Vs0s79WgZpJ#SEQPT^zS3BZn$vB*?RA<7DF5rk}}RpS60mrS0U=_X~a*tjP96 zr0xP%VB*znPWz|k`$(_3P_9BbteCRi#PBaD?p81yk`g5=2CQGIaO@JHTKmO zBd=)s>TbDJ!He`pu@f%639Sd%z(`Py^k%nWjaWzfARz06H=%5{gLvMjiwX%V^XVol zbIFNcIEj8Z8hwuFAFE{8OnzRejck zJKu3Ju;CWn$(t<8n`aTPxvD>PpCI@F!auP|Lz@Za>p47h_6yT- z=J}wT?sFwuAW|Z|M)^)euIr469CX*JRyWt> zv=-rhAETzIDh9kJB+885ZtdoQ%rb}MwJ!-n^M^ZHZ;^$^F`X?#8x7=!e!HMn%rZ6Q vM7vkYk16~;ler|=_Z3J5c+5$qk z?D{bO4a2YtyJgs=o%1Cp?3`I<&iSA3`+t{n))xweFcMu-41WX$AOnyA$N*#jG5{HX z3_wOAiT^TM$Sfco7y(9spaEz~ZUD9e6+k2KJ#g9pG$nTcFAJzv;7pz(2wr-XnGpceSeO8_}#J+Kz=sfDd!5;zPrc^#l%fL{ep zsso@?(jvSJ(0`A>JNoQ%+#3gmy$(~-fR_RCD|oa6lmbiuX>L--vl zk)V2zsVH8d8g#1?)${bDz< ztAQu5O00I-3UtcU&UsmbRswed%N_kIfZO!f(O|6K)yH+lJ5lG&_G+T>M~70GjI~C9z3bQ&iUXMf!Az-Ur-w9*WXWom!iCP ziHJH|3(|{q3}#Vf^SO#gN_2fKut|gM1^$sKw12AoDV_++HNdhtG%T77M=-NRRqjZU z%Uz|F9~2+~pi~WMPm3n=5%7)e83*Kf{4$p^0k~IM(XbE}0u*8Gg5)cSJxUxKi~cyi zR|-^ORr8Jj---h^VeOOWORLtYH8=qJNi7`5l!=625wEx*nZQzM`!X$PC9qjQodkAk zv44i#1SqU2Ys4STK%HLrrMRI8cnsKOi(#@H3Fo*b5zeiG0(MYi2{^t#7DJvE&ee*5 zn{BOJ3l^}oN{!VI?284YSOLlbR%=x*0)-mHf6{^rKsQhTJR?$lNSYPNT&wiC6nH-h z;Wo&For*%**yTDueoEGCkjA7<1(|ICYtQ|d!iWxq89j=xYJX&MXlx$>^~~Hmn-Gv8V81xj^?Fd4n7eF!g-Ro~ z1Fve81M_g#-M|-G3-YnMl?ou!DjT--J)&71QOmfPhHx3_~sQNT%;)_?4hY4u3s zKAUCI8FDNI()g-m)PoXL!rcZuFTNX8u)2E=jmX0~Q&c34yEoYrTBzTf-vvCY5Mx5Q z+@2Vc**vT*>l|I*p6rU^!~#5XgGwUX^!z&DJzK03&wNvpr9mNEdXlL@rOoqsBMKp& z2JTaTy=qg3<0#+m6Hy06=6^{6Xk3K2L$>aVb+u*zXhIX)C{K9^>wrQ%Gk>NKP5QCU zE{4l0Cz1hBn$5;5i2Qqs`AReJfwW;VPLpp}OPbdiRsfkRt?|1+*gjhb(JxnikOb7D zfDAweAOnyQ1JI?&{{sNyZd#1JSh9@(015yANkvXXu0mjf D^{eWI diff --git a/app/src/main/res/drawable/ic_outsidetemperature.png b/app/src/main/res/drawable/ic_outsidetemperature.png index 2b08ce0ee0fac9cb47c0e63c29d5cef0d81f5fa7..1e1633114b4a9aa8b895a01730db2057a5aeaf09 100644 GIT binary patch delta 1085 zcmdm2_peT|Gr-TCmrII^fq{Y7)59eQNJoJ%2OE&ISmDUDQE?J8pP`Yikx__|p_QqD zm67@6gUlA_LhLMaRgz6i4NWafjCD;?jFNOsje)GBL^BgzGfNYr)D+9a6k~&=%_msi zun?tkvK)swnk}1Uxn!A`EDa{x@R$Rs&80l~`Yg;Q8D}TIu-2~+@^oJIo&u^J|C2Z{ijxGV$Sj{b2ni^rTy8@PIbZ96w)i+cJ7CiSV)Ls|D)g)cMPch@w zq3^9y@k)DOTWI`{--FD_IxmVGT!y>YjVeedKIN>zVf zJQk2U=D6m8?4AbxT?)Ik7v&$B{4{_6o-$Uw!;gRHELxt<_x<6tPk(+3xjidj?|aDp zXWGF6t96=A+I#w!f8?>#lYOceGfB?YR{T+s&cjrjemT8kj4`dBm8+`K+Uw>1w?6$; zQJAsdj_}3T@~_guTKBHvR@{)y>Yd+veRan@38kuLi^&pu4dI{neVbA@{s?J z%FR{(%LHtjmwSnA3gd~_T=_8hmF1+4ypycLTXxDlcllDXC;HTfe;sjqnfE`=IC)rj zarCC9=^y6(SDVvzGtxy~UaL%L*U}g3>p!|)+8uLzo1ksSi{3;{*3-X=s#b8tNJzbr zJ9;F9o@XuQ#>-1Qk6AT(}|p z$-En9BJORyV5sFEccl0S$8I+fo&V1+#xG5n*|*=YfBW$-FAk>F%Wh}pcCEOy+m}OA zaPPU0`X9!XUv8$WfBX4AbQ)uw?#+`5i*9d}K0i%j@3mJamHHlV&g{?g<$vybA#ZfGkn^r delta 1016 zcmexYx35mIGr-TCmrII^fq{Y7)59eQNPB=V2OE$KeY@Fxqv9lHJ_AEtL$eS=Ln{+A zD-*-X2bnFudQttZJj$HwQ!OHa}=X#3$yFa(IKfE`ycT+7Ky^YC{fy;qWgMoDcgGfU?Q^1PZw|J`pPH$A1d;g%W2xCWL&XMXH4U&Ia&KIU! zm@tdsh3Omr{fA%P;;xXBe^7C*!EK{({<6>9nY(%)$<8^TdgsJdkNtBTM1F|MKNkKo zQSP3Y&Fs${QJtYP4o&~TqifUrwL;MUDNn|dqCfh}E`Llp+Mv&CUSGd!d%Ex6qzmRv-VW#Bg>kgGv9pHr`pk8T%g2pVGEvm(OXvslaKY^9ZXV(qNl#xvXCjm zz4!P2plj>pqaAYhbl=_lEA+v7k;gn=S1|ZIzU6dtm74Fyyux!Tc1Pbw+))kqW6$@? z_`1VKxnmz6+bFNtJi&SQ%UK=^4xRmO_?0Q(sK@;tixu0&64&lr-6b32e{bDn=>@75 z6LJF9XFXKmdsy!*d969BVw2l$!>3ZwWev+d+MZKqxXYEc{X?{>?Mc213#X*>elIZE z9;{+JS$RR5hd-QZ{T;I{1IQ?a(Mr_PR6X}0Oh=PA$* z31$df7uT~SVtIhx=R2kk%A0j(v8>qG6?-0*9+?7wiF4t)U-=A?rl?#9LL8tV}6}Te(n57I@++=Fr!%y@}rh&7US|`HjA4&TCJ#U=n5gG+)h|1 z$?wggtm}&-66rZ+r5{Vjk)Pp;(~on{_1ryAf88IS&-;13pU?Ar{(HR!C3y42FV1d*GZs&^Tc`*!{~21}U+1 z!Mes`vC%Q8SXV3tg^k5JqwtIvJPH@fMB}hbG=|BbOM4(QkpFcl{94oPi!V|H9HFj` zcNTi;xUGkjqjT5^k_2y)3nvMVJg8QH4~fEkGIKeM6%k@`kLT7KTVPgn%?=w+iK$g& zg-67+X9cFo9KT`xL0TKjwppp9_-0!<7+Y3`4z^m+f`2iiMN}IfLZ#WGsdZWAYYBIeITi^Q9vBk23o{WnT z&3z;S3pShdnbMEpKNG3VqWK>Zf7?`JC&0%GHuLujg7}7f*C@qzI<%-YECpx@3@p0IV8AM%ZTQK;%We+o8%& z!w19OHrBt2oL6v6R-h{zR(Q84RLjDJx{W0O7)TX+T*Lbr`NIU`i|@Ad4hMyqo-S9d z=q<$UO198#-Zni2%B>#SAlK(=au2j4$ujW0kfeqROD=@FdE$fz@AQ-bzs$$UU!-?O_<|))+ccR`VHpg zMvdNQ`shG+r|B{>D%X#2#O8>k{#93R3(Q`)Cb%ak0d#=?gLyU9GK2*mt|>q!4B{lpGg&j$nj@`< zNwtF-1CN#-hLAm%cpvl6yiV#M5c`4Rj9H}wTC&&PtNhwPYFJ=ly?uq`jwQ=hPM3mO zP28z-;?j=M21Ab7g1Fu*gRMkGzo4EKn|eu;XCt2>PLd!u;KG;d8CNk1nm!0 z@q9bXH5ghR&!T&GJvP<{4tZi`Sj=>uLy&xdpo3M)ODd$)|uTq-Q_5zSWi&rn^=-7|FP z4H$9F=7F@2xN^y4{OTCOq5WNtZ*4yvQH(368i!s%96PQyJ7_J7P2uO!`!j9+%!4u& zQOuU&$0uFFqnYgQ!*&Wzyhkw=aZK1^=%S-b%Fu%+!qELg7hht-j*2lid4*>~U-N7D zYZM%Lh>WW_m|43R)CzHOyQ-B}hN6Z?d0IKaO0C;Fg}7a8#_)bENL%JY;@XmJ>JHA0 zbiYHf4Yh3nQ=@MyHyKa{t7a7r1c%=IMu4brH(hO${Ob*bVBIo~u-VU+`Oi7_UrMK| b;VukhRuPF7$H}ADZ4L_XCHvIxh)Vkli8{0K delta 1459 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 delta 2140 zcma)8c{mde1Kw=R+)9UIs5Vy(V~!zvE@p(FtS0HpD@ zIKpqY{SU>(eyj5m^YqI@G?0uw3Tc3HLZQu!Ow0^W8LvU6{~JNTPvFL0`rf|27*iw) z?PrM8_eFamF{VEHNN-b=k+-L@p{KEtDYFB-2>!pC8LHxDlK-{Jgh{|eL`)1aETl|+ z8#7XhtOxE0GX-VLnd?yl@i;4|n2E()O3D@IeQng}3A;f5iGnWSJ3?!*^-=32D6LHn zZwnS(xf`f((q3G&9BrY4umqfnJCRzez2T6lfP*q{QZ7p15@5$iT4v+Iic%PCpmSA(hW!8+LeQc_-AS~CgE&N)TRnv zIe7iDcA!mK|LPQN*5e7yxCYS2D0+K0i~=t&A0R&|a$N$PCJ2lJs%|x7MMgB{u~g8p zuDNhXC{*Y*nPQ(7aDf(aF=JxQ9G?ttvp7Yd+T>FZy`=1~PG|FMZs=91&MER5ML9j( zEh3k|RU3$0OC(QdwXfd!vBO>pDf>uPcMwRv@~A6f?iuZ&MNn>kwK&3WeMw)A5i;~| zZJ*@MI#8hXa;8QD(VA5X_0fw|ze%Mx2-cQO7ii=r3$dZm<_70KyZN>0Fn`FqeC3%E zhTqA-Z>r0R1SeeQaIj*J$=Ap3s013shzVz(FU5Gk^i4|jK;4OC_^b0@3aprjKQv=9 za(hpgF8SNuD8N6cX}`2*YE2Hm1+P#`k4P=j9@y|d(|Cq((cDPu#dIw-fMyP79|~xB zCTjgH(lP0gPrP0j$#t-Fj;GH5NXuI_au*WR98IX!>l8SF_cLi(Inf=FX_DG` z|4?1y&sq4_u%p6#9?|yE;3@-`+ufw5(KO#Gvx!Ds$dsB`^Y9xLJFqUK*k)rZ2Z2=^ zju!d&dRdV(s>1zroJi%T*+@;j+AqK!_@*N)2FveQ2qT{Mdlv&eTdDe?uuud2cHTSN zAx&Ikp?r>j$J8(VrCimj?i;vV*;{lGQWggkp8eZWILq5?hH)$?AFB5;W~vbd&%VgK zgU?1;Dh^|VLj{%IDY*$(S-bPAkCl+abr9pVb`Hu)x5S4_HFi0YA0nzQO4g{g>g_1; zYb|K@k zTr@u0DB@n_a*8EuafGt-gQz?Xq65lc%pIvI4^>bYE!(ZYN zVY}NR+`A5fZMVGJ%&V4;)zgdQs;Mk7(0D&4@18Hqo0;53U%gPo-p*jhdGR65;13wp z47wJ8tyq8f@-K||VOGO!61sEwi-V%#b74G6T!)|u@ zaWe|Rb!r!I8;?BQQF&bS=eK8!_5>}5;~R#~KAzGZ6?e-vj}zzFaSet58agMA$eT-B zjn5=k)ZoY_UwQ`Y%Xv*$X~vMB72)zp)Ny=jkL zkbazP93kmxc9Cc@st6@)e|nr&E}U)HUcPh;V>t1qw5!ji9}*e!;F@1sEMwgAgF?2z zq3t-4;Ev{7;x&0y&dg?+gg$5mmc9Q(p(5X)s@$eJ=rT-oK0zyl&UafcaM+2^4!t1b zcLXi^U{b7k;Og}=a?8%XR6Atlrw~=Nbo~gwXTIA-MR5ZNiVC;eQjtlx#CtgJwHr+? z58A=QOWPL z0_I;HxRc&j_!t?;S)hAxj5-45oLn~`(;Ip8yaXhNJE)tm-ySok(6wBmlGoUIVrlR1 zB<=I?zn(l8J2=%5EPKC27dT%~-8&>3H^sGRv(#A%T?;Q!k&oy2=4VB%GJZ*F@6ucW mPXB~0&>m>7Jc9)RJZ9s=#9sMGr~JMP0Q@OCT!pnq(!T)+p6HqY diff --git a/app/src/main/res/drawable/ic_radio.png b/app/src/main/res/drawable/ic_radio.png index 5410c9ca8c74855866bc2e5fe326345e001bf3c0..a4550c18a050cbfd0019dd1245c7416ae8d171b0 100644 GIT binary patch delta 1421 zcmZpxyi}{$8Q|y6%O%Cdz`(%k>ERLtq@zHXgAGVptZ-zSs3^{4d2gdt6*I4qu8~oQ zk)f5Tv6Zp;(^b5)F!j8iNP%*=HSOfAiIlZ;FfbraK!%yf;-Ez(lc(k#r( z(~>uzV424>`7Wy~b8%wXWOX(>qI6B}WV1lC@ElvyQ)pTisQthdBom~-u{IQz50)qquI~FuvWSz9=wsS&=ONvCGkcas~fm2K` z6<;n~^TsL7(Q@h3si~2RpUsgwH)&gu+W95v&*s>^W}kiY_nG?n%=hAym>-@2C2LW$uDtPAkXdK(60~l~A7gix4PJxJ1hl$g6Zbe@yF6_c@lk zGQEdyTChJ)OxfL-H~qv8W3w4eeLXLnm%of?;Ed=#TfrUvpdZLzeEOq6-|>wREt@xp z?%(=2XwocSRzO%YO_t^1l zZKfjs$eJ$!&HGdqRiw$}ACawCn#1ayDj>e7pO^ijxOjzN-m%1w|F<$$I?I^f)(#Ii z`t6X-g=-7cA6nQnU5+-maqpnhp8M|>$RC$Eb0F`J>_ru&RT7EKE3@vH&i%n6-dg)- zbF5?j!TP|5_40?^1B3XtZhI_p#=ZPbuJniC-F|J=e?P2`=;V*m$o-(=M!V+R%IG#im=kqYHV;%qr4tBmyJ+V=a`|JQ93yRBcbUzEs8ki>*U_0z%{vk>5nyjS+BITUmTqwBbuxnmQ(zu|M=34`=ws<7rfKc;l6OW zAW!zf)U>eW&b(EzE}6=k|8_WaNlG6mYpcz6v3Iji7F))*U1o1q!^&heJ6(&OxSZ?{ zckceM{IT7A`lYyV)wkTDsa#+7)X%seHDZSNvV-|IO`QePteFUk~S&Mc+cwJr!$ty2|y0Gb&=& z+E&Tt@$9x(c_AUHclpP%xrZ|R6=SFDO0W$1rKj|5=Zqg}EywSzyC(HEe{Ed;L8EEQ zSn{*>n=ktO`vzN)U;IJ4vMG!u?utpfq95qpNW7okTAh>~ec|?^U$fV2`;uL3%-zhG zkzOCMzq9aZFOpAwrNus%FmXyfWw<*LdvKkf$VmABoM$|`lKi(CI~ z?~Ju)|7`I3$MNQY#{PfP7CB?!@W%pmBJP?@xB9=uneBAelF{r G5}E+RynxF9 delta 1140 zcmcaq+g7RA8Q|y6%O%Cdz`(%k>ERLtr2RmcgAGXbtx}Mks3^{4p|a7cika6?*T^Eo z(9Fuj%*xPW@q=+7CKBN+KK|8_UYJy=j`DVq>FEo|}siy?OtFR;j*`W&)$)ltrCk_$o| zq&En@VB5!6p!WKpy421kM|xe&JRO7Dmw4X2T&DFx+tb_V8T+(bM_BtA;~CZ;xmRz; zKj(AFll=>~GTR?paF*dc^Lf@CaVu(4G?%SfvUQT*%lo?&Ud~)PZ(gSF)iVb@tAa1N z@Z9KG66d+~YRk0ff=RPfWc4?03iOO##jC?xptw|7fbj-<34{OB8^(XxYFNLp&hRz* zwB^88hFaF5x6F*YJ~6!GU%>f;Q{trI2C)a33H3G($&)57pL*Q%=GUBt^5WT!2PQOT ze@I<=O7WV-j#FO>@(yyo()JV)d$HMXL->ce56TZtN$~lwHeq_g*7XeM<2S{!*)hhk z%*sto)!o1=!J?-fHSbhNr1;PBhVMa5W(hkV%~8{7ir@U;3sXS)`hL!DtUpYyZ_Qd` zBymdP@cSOy`p46jZ1?sy^VC*-JIy3@{%-9|_mk;uNq?`XOBTPYo%29&!Tmh-#^=m3 zyav%hyL{L!c=n`BlWS0JV&7a4?E0bb{Sl=H^B5L$U#U|*P`5jmtt?G2wEMy1TW_q= zO4BT@n7%N5b!kl65O7fOfXRozrj`4cZlr8K%=m8F@0f$%53H^~(00f*)b;<5vs?}5 z-~P8@xpM3E>h3qs{CAtB7;cOCy@R1%FjCjWG08A%%j;gHXNAEI>4)s<7|od1HVK@% zaW&Xvo!IWZQ(7;kynUS3QMP5$iz$uOG8M8vmi4^fa(vl~mxr#d(#$-u$oN2dle*Z3 zZMqxxcm*`|q@{EzJE) z$Jfk|-!^Nj;0>>mB}snrY(F-waIK39Q$HAe;QRr`1l|qzqE_Y!$qHJ(I_<@#f8e;w z?hN+EZkL1U>zsBb1phku+hMk@OUPM{2cesHF+aQgO6R_|d%gbh6;XbZ_B{DyTzMdL z-m2|q6Sr$E-lM5%TdiOH@Vd*id6(M0C~R2mz*cN@AiMI$gnP~<`_|5V@gO0tRMsMK z|8$#(JDVo6v$H>cATy`A*wO+AbP0l+XkK D$cqiC diff --git a/app/src/main/res/drawable/ic_spanner.png b/app/src/main/res/drawable/ic_spanner.png index 573eb1e2d9461d68ec2e0346ae54cebb76b51d50..e2b2ba84737752a6b3911c78f6ef19b60efb5733 100644 GIT binary patch literal 17073 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 T2$L25Qwir~ZuVuiA%FZIKV^-G literal 1295 zcmV+q1@QWbP)sMJv&W`Z=WhyZ4=Ya}g{G!#ff3EGs_3?Wq`J&N>| zq+v+|k`78biZqDyCDOx4i{q7m04e1ka3?TGGW-Kv9-%`)7+BL>a!5}|deZ(Km((fg zGfBV6EVU|0&5|}ry2#e+3Zzy~Px>sIP6MzN7b)s zNdkST6WVKye%vcR1NhI%cIBWi^*B^x(|)h~VoCFDz9$!jX%niq=?SlV+{qt^Ym77x zsTt?QlNuqU7D)~E@4udSz{w9rw5>(jA`_>2B<-9M7I_Z=mB4ernB#^Qdv#8;<)Qp0 zTYf(9GH{GcjM@-TTtdJ~V4q{i0MHs!w;dRF+BqmK$?uzZ?@#-vk~47TNOkj?N7QCxkh+ zY_rQHL?=+6ry1|HI`;!*1tkPr3;gO3`5U++LAx^G61+2=SEmN}-0B?%Ry(r%5(27$ zH@sQd4V;yr?RCzc0Qd&j2-E|$7>DvaaM;Qxfeuec{s;j#VouB<{sPt~XtxM>o80g_ zur5MZazem@nDSa+m)GHYc(Em>?HX%bh+d3mYXe>a4ls45>jORp?gi$@=!+)=G-3ka zPrwPQbPN+mb^vz)4`4pZLi`Ebns8~p<+PgsUIiA$)DIG_l4wG}BhJVq#k)XVf=+KB zb7}Sv@s)a#%YHf`;5DbSKFmgJ0nP(1urssAnYC`9J>g#2>F6HA#Fxr^kclJ&Y;Zb! zAE?UGxPloXy;JvQGWW{&z-9R&5=qD!c*yCnA`czZ*`*j_1lU5veLx`y-Q#rJYAalU zaR46z&*n0!!0i~<9pY=Cxe!F+2!+wN7r4~!6E{GHc!exp2RIw}z^Q)>=)fLNib?3W zHDJgi(hs~y<~PXZ7=^1b$D9y*fu)5eG83T?`+)ngK@3>M)K%>$aIUAUn#_-~`?Aes zF$itP1h_6>ZPXIMoToyp@nqN7@-Yg$SF#aupHm)0>IkICELQ;|PQJ#IRob*CkoITM zQBY)DlFUFxk}h=e1D>qHriW*1)NGLJt6A|X}FJY{UM zMV|)K4Zq%|Kjz7{lSAkfVm4VF@HBALaRzq)wnILc!GznMt56Ei%*GwudvF{Dh=mB&|SNDydfH3b##W z-vpA7^jIK$QNZ1i3^6m*MCM&uHuM2&)0`Q1hGHL$G0z#dNNSg~Leer#J#qXY=?6(4 zNqQ&947jNQDYsW}r1Bv1siUNjLFiOL+7DiN#~h(j$N#8GS-wFb_%8qe002ovPDHLk FV1hRDO&S0I diff --git a/app/src/main/res/layout/layout_dashboard_gauges.xml b/app/src/main/res/layout/layout_dashboard_gauges.xml index 5b075d87..20371b3b 100644 --- a/app/src/main/res/layout/layout_dashboard_gauges.xml +++ b/app/src/main/res/layout/layout_dashboard_gauges.xml @@ -75,8 +75,8 @@ + app:layout_constraintVertical_bias="0.69" + /> + android:textSize="24sp" + app:layout_constraintStart_toStartOf="@+id/dial_MinLeft" + app:layout_constraintTop_toTopOf="@+id/dial_MinLeft" + app:layout_constraintEnd_toEndOf="@+id/dial_MinLeft"/> + android:textSize="24sp" + app:layout_constraintStart_toStartOf="@+id/dial_MinLeft" + app:layout_constraintEnd_toEndOf="@+id/dial_MaxLeft" + app:layout_constraintTop_toTopOf="@+id/dial_MaxLeft" /> + android:textSize="24sp" + app:layout_constraintStart_toStartOf="@+id/dial_MinCenter" + app:layout_constraintTop_toTopOf="@+id/dial_MinCenter" /> + android:textSize="24sp" + app:layout_constraintEnd_toEndOf="@+id/dial_MinCenter" + app:layout_constraintTop_toTopOf="@+id/dial_MinCenter" /> + android:textSize="24sp" + app:layout_constraintStart_toStartOf="@+id/dial_MinRight" + app:layout_constraintTop_toTopOf="@+id/dial_MinRight" /> - - - - - - + android:textSize="24sp" + app:layout_constraintEnd_toEndOf="@+id/dial_MinRight" + app:layout_constraintTop_toBottomOf="@+id/dial_MinRight" /> \ No newline at end of file