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