1bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan/* 2bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan * Copyright 2014 Intel Corporation All Rights Reserved. 3bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan * 4bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan * Licensed under the Apache License, Version 2.0 (the "License"); 5bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan * you may not use this file except in compliance with the License. 6bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan * You may obtain a copy of the License at 7bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan * 8bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan * http://www.apache.org/licenses/LICENSE-2.0 9bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan * 10bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan * Unless required by applicable law or agreed to in writing, software 11bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan * distributed under the License is distributed on an "AS IS" BASIS, 12bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan * See the License for the specific language governing permissions and 14bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan * limitations under the License. 15bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan */ 16bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan 17bc0b49155603ba1c0c1fc86d13127d04021e7c70shravanpackage com.intel.thermal; 18bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan 19bc0b49155603ba1c0c1fc86d13127d04021e7c70shravanimport android.os.UEventObserver; 20bc0b49155603ba1c0c1fc86d13127d04021e7c70shravanimport android.util.Log; 21bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan 22bc0b49155603ba1c0c1fc86d13127d04021e7c70shravanimport java.lang.Math; 23bc0b49155603ba1c0c1fc86d13127d04021e7c70shravanimport java.util.ArrayList; 24bc0b49155603ba1c0c1fc86d13127d04021e7c70shravanimport java.util.Arrays; 25bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan 26bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan/** 27bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan * The VirtualThermalZone class extends the ThermalZone class, with a default 28bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan * implementation of the isZoneStateChanged() method. This computes the 29bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan * zone state by computing the equation, which can be linear / higher order implementation 30bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan * @hide 31bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan */ 32bc0b49155603ba1c0c1fc86d13127d04021e7c70shravanpublic class VirtualThermalZone extends ThermalZone { 33bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan 34bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan private static final String TAG = "VirtualThermalZone"; 35bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan private String mEmulTempPath; 36bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan private ThermalZoneMonitor mTzm = null; 37bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan 38bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan public void setEmulTempPath(String path) { 39bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan mEmulTempPath = path; 40bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan } 41bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan 42bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan public String getEmulTempPath() { 43bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan return mEmulTempPath; 44bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan } 45bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan 46bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan public VirtualThermalZone() { 47bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan super(); 48bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan } 49bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan 50bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan // overridden to start UEvent observer only for Virtual zone 51bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan public void startEmulTempObserver() { 52bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan if (!getEmulTempFlag()) { 53bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan return; 54bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan } 55bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan int indx = ThermalUtils.getThermalZoneIndex(getZoneName()); 56bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan if (indx == -1) { 57bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan Log.i(TAG, "Could not obtain emul_temp sysfs node for " + getZoneName()); 58bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan return; 59bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan } 60bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan String uEventDevPath = ThermalManager.sUEventDevPath + indx; 61bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan setEmulTempPath(ThermalManager.sSysfsSensorBasePath + indx + "/emul_temp"); 62bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan mEmulTempObserver.startObserving(uEventDevPath); 63bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan } 64bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan 65bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan public void unregisterReceiver() { 66bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan super.unregisterReceiver(); 67bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan if (getEmulTempFlag()) { 68bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan mEmulTempObserver.stopObserving(); 69bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan } 70bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan } 71bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan 72bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan public void startMonitoring() { 73bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan mTzm = new ThermalZoneMonitor(this); 74bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan } 75bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan 76bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan public void stopMonitoring() { 77bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan if (mTzm != null) { 78bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan mTzm.stopMonitor(); 79bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan } 80bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan } 81bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan 82bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan // override fucntion 83bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan public void calibrateThresholds() { 84bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan ThermalSensor ts = getThermalSensorList().get(0); 85bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan ThermalSensorAttrib sa = mThermalSensorsAttribMap.get(ts.getSensorName()); 86bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan if (sa == null) { 87bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan return; 88bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan } 89bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan Integer weights[] = sa.getWeights(); 90bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan int m = weights[0]; 91bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan int c = getOffset(); 92bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan 93bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan if (m == 0) return; 94bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan for (int i = 0; i < mZoneTempThresholdsRaw.length; i++) { 95bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan // We do not want to convert '0'. Let it represent 0 C. 96bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan if (mZoneTempThresholdsRaw[i] == 0) continue; 97bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan // Get raw systherm temperature: y=mx+c <--> x=(y-c)/m 98bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan mZoneTempThresholds[i] = ((mZoneTempThresholdsRaw[i] - c) * 1000) / m; 99bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan } 100bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan Log.i(TAG, "calibrateThresholds[]: " + Arrays.toString(mZoneTempThresholds)); 101bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan } 102bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan 103bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan private int calculateZoneTemp() { 104bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan int curZoneTemp = 0; 105bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan int weightedTemp; 106bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan ArrayList<ThermalSensor> list = getThermalSensorList(); 107bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan 108bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan // Check if the SensorList is sane and usable 109bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan if (list == null || list.get(0) == null) { 110bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan return ThermalManager.INVALID_TEMP; 111bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan } 112bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan 113bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan if (isUEventSupported()) { 114bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan // for uevent based monitoring only first sensor used 115bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan ThermalSensor ts = list.get(0); 116bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan weightedTemp = getWeightedTemp(ts, ts.readSensorTemp()); 117bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan return weightedTemp == ThermalManager.INVALID_TEMP 118bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan ? ThermalManager.INVALID_TEMP : weightedTemp + getOffset(); 119bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan } 120bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan 121bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan // Polling mode 122bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan for (ThermalSensor ts : list) { 123bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan if (ts != null && ts.getSensorActiveStatus()) { 124bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan weightedTemp = getWeightedTemp(ts, ts.readSensorTemp()); 125bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan if (weightedTemp == ThermalManager.INVALID_TEMP) { 126bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan return ThermalManager.INVALID_TEMP; 127bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan } 128bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan curZoneTemp += weightedTemp; 129bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan } 130bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan } 131bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan return curZoneTemp + getOffset(); 132bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan } 133bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan 134bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan private UEventObserver mEmulTempObserver = new UEventObserver() { 135bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan @Override 136bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan public void onUEvent(UEventObserver.UEvent event) { 137bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan String type = event.get("EVENT"); 138bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan if (type == null || Integer.parseInt(type) != ThermalManager.THERMAL_EMUL_TEMP_EVENT) { 139bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan Log.i(TAG, "EventType does not match"); 140bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan return; 141bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan } 142bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan 143bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan if (!getZoneName().equals(event.get("NAME"))) { 144bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan Log.i(TAG, "ZoneName does not match"); 145bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan return; 146bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan } 147bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan 148bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan int temp = calculateZoneTemp(); 149bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan if (temp == ThermalManager.INVALID_TEMP) { 150bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan Log.i(TAG, "Obtained INVALID_TEMP[0xDEADBEEF]"); 151bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan return; 152bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan } 153bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan 154bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan String path = getEmulTempPath(); 155bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan if (path == null) { 156bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan Log.i(TAG, "EmulTempPath is null"); 157bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan return; 158bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan } 159bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan 160bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan int ret = ThermalUtils.writeSysfs(path, temp); 161bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan if (ret == -1) { 162bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan Log.i(TAG, "Writing into emul_temp sysfs failed"); 163bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan } 164bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan } 165bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan }; 166bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan 167bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan // override function 168bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan public boolean updateZoneTemp() { 169bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan int curZoneTemp = ThermalManager.INVALID_TEMP; 170bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan int rawSensorTemp, sensorTemp; 171bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan int weightedTemp; 172bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan boolean flag = false; 173bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan 174bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan if (isUEventSupported()) { 175bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan // In UEvent mode, the obtained temperature is the zone temperature 176bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan return true; 177bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan } else { 178c9dcd35c3100acf9ab3d8d679c12abcf021a33d4Shravan for (int i = 0; i < mThermalSensors.size(); i++) { 179c9dcd35c3100acf9ab3d8d679c12abcf021a33d4Shravan if (mThermalSensors.get(i) != null 180c9dcd35c3100acf9ab3d8d679c12abcf021a33d4Shravan && mThermalSensors.get(i).getSensorActiveStatus()) { 181bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan if (flag == false) { 182bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan // one time initialization of zone temp 183bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan curZoneTemp = 0; 184bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan flag = true; 185bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan } 186c9dcd35c3100acf9ab3d8d679c12abcf021a33d4Shravan weightedTemp = getWeightedTemp(mThermalSensors.get(i)); 187bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan if (weightedTemp != ThermalManager.INVALID_TEMP) { 188bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan curZoneTemp += weightedTemp; 189bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan } 190bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan } 191bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan } 192bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan } 193bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan 194bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan if (curZoneTemp != ThermalManager.INVALID_TEMP) { 195bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan curZoneTemp += getOffset(); 196bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan setZoneTemp(curZoneTemp); 197bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan if (getMovingAverageFlag() && !isUEventSupported()) { 198bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan // only for polling mode apply moving average on predicted zone temp 199bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan setZoneTemp(movingAverageTemp()); 200bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan } 201bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan return true; 202bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan } 203bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan 204bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan return false; 205bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan } 206bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan 207bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan private int getWeightedTemp(ThermalSensor ts) { 208bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan return getWeightedTemp(ts, ts.getCurrTemp()); 209bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan } 210bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan 211bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan private int getWeightedTemp(ThermalSensor ts, int rawSensorTemp) { 212bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan int curZoneTemp = 0; 213bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan Integer weights[], order[]; 214bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan ThermalSensorAttrib sa = mThermalSensorsAttribMap.get(ts.getSensorName()); 215bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan 216bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan // No point in calculating 'WeightedTemp' on an 'anyway invalid' temperature 217bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan if (rawSensorTemp == ThermalManager.INVALID_TEMP || sa == null) { 218bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan return ThermalManager.INVALID_TEMP; 219bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan } 220bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan 221bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan weights = sa.getWeights(); 222bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan order = sa.getOrder(); 223bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan if (weights == null && order == null) return rawSensorTemp; 224bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan if (weights != null) { 225bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan if (order == null) { 226bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan // only first weight will be considered 227bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan return (weights[0] * rawSensorTemp) / 1000; 228bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan } else if (order != null && weights.length == order.length) { 229bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan // if order array is provided in xml, 230bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan // it should be of same size as weights array 231bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan int sensorTemp = 0; 232bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan for (int i = 0; i < weights.length; i++) { 233bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan // Divide by 1000 to convert to mC 234bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan sensorTemp += (weights[i] * (int) Math.pow(rawSensorTemp, order[i])) / 1000; 235bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan } 236bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan return sensorTemp; 237bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan } 238bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan } 239bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan // for every other mismatch return the raw sensor temp 240bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan return rawSensorTemp; 241bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan } 242bc0b49155603ba1c0c1fc86d13127d04021e7c70shravan} 243