thermal: add getUndefinedTemperature function.

Bug: 34107726
Test: cts, vts
Change-Id: I8a3794158fbc0c9518a26f4616263aa464b43924
diff --git a/thermal/1.0/IThermal.hal b/thermal/1.0/IThermal.hal
index e5f70cb..076b697 100644
--- a/thermal/1.0/IThermal.hal
+++ b/thermal/1.0/IThermal.hal
@@ -75,4 +75,19 @@
     getCoolingDevices()
         generates (ThermalStatus status, vec<CoolingDevice> devices);
 
+    /* Retrieves an undefined temperature value.
+     *
+     * @return status Status of the operation. If status code is FAILURE,
+     *         the status.debugMessage must be populated with the human-readable
+     *         error message.
+     * @return undefinedTemperature returns an undefined temperature value if
+     *         status code is SUCCESS. Undefined temperature value is an
+     *         unreachable constant device temperature value for HAL.
+     *
+     */
+    @callflow(next={"*"})
+    @entry
+    @exit
+    getUndefinedTemperature()
+        generates (ThermalStatus status, float undefinedTemperature);
 };
diff --git a/thermal/1.0/default/Thermal.cpp b/thermal/1.0/default/Thermal.cpp
index 8a8ad0a..5bc313d 100644
--- a/thermal/1.0/default/Thermal.cpp
+++ b/thermal/1.0/default/Thermal.cpp
@@ -169,6 +169,13 @@
   return Void();
 }
 
+Return<void> Thermal::getUndefinedTemperature(getUndefinedTemperature_cb _hidl_cb) {
+  ThermalStatus status;
+  status.code = ThermalStatusCode::SUCCESS;
+  _hidl_cb(status, UNKNOWN_TEMPERATURE);
+  return Void();
+}
+
 IThermal* HIDL_FETCH_IThermal(const char* /* name */) {
   thermal_module_t* module;
   status_t err = hw_get_module(THERMAL_HARDWARE_MODULE_ID,
diff --git a/thermal/1.0/default/Thermal.h b/thermal/1.0/default/Thermal.h
index 2e06289..eec0ff5 100644
--- a/thermal/1.0/default/Thermal.h
+++ b/thermal/1.0/default/Thermal.h
@@ -45,6 +45,7 @@
     Return<void> getTemperatures(getTemperatures_cb _hidl_cb)  override;
     Return<void> getCpuUsages(getCpuUsages_cb _hidl_cb)  override;
     Return<void> getCoolingDevices(getCoolingDevices_cb _hidl_cb)  override;
+    Return<void> getUndefinedTemperature(getUndefinedTemperature_cb _hidl_cb) override;
     private:
         thermal_module_t* mModule;
 };
diff --git a/thermal/1.0/types.hal b/thermal/1.0/types.hal
index 8864f43..30cfdd9 100644
--- a/thermal/1.0/types.hal
+++ b/thermal/1.0/types.hal
@@ -46,27 +46,27 @@
 
     /**
      * Current temperature in Celsius. If not available set by HAL to
-     * UNKNOWN_TEMPERATURE.
+     * undefined temperature value.
      * Current temperature can be in any units if type=UNKNOWN.
      */
     float currentValue;
 
     /**
      * Throttling temperature constant for this temperature.
-     * If not available, set by HAL to UNKNOWN_TEMPERATURE.
+     * If not available, set by HAL to undefined temperature value.
      */
     float throttlingThreshold;
 
     /**
      * Shutdown temperature constant for this temperature.
-     * If not available, set by HAL to UNKNOWN_TEMPERATURE.
+     * If not available, set by HAL to undefined temperature value.
      */
     float shutdownThreshold;
 
     /**
      * Threshold temperature above which the VR mode clockrate minimums cannot
      * be maintained for this device.
-     * If not available, set by HAL to UNKNOWN_TEMPERATURE.
+     * If not available, set by HAL to undefined temperature value.
      */
     float vrThrottlingThreshold;
 
@@ -135,7 +135,3 @@
      */
     string debugMessage;
 };
-
-/**
- * TODO(pbond): add float constant UNDEFINED_TEMPERATURE.
- */
diff --git a/thermal/1.0/vts/Thermal.vts b/thermal/1.0/vts/Thermal.vts
index e76d943..d8cc670 100644
--- a/thermal/1.0/vts/Thermal.vts
+++ b/thermal/1.0/vts/Thermal.vts
@@ -79,4 +79,25 @@
         }
     }
 
+    api: {
+        name: "getUndefinedTemperature"
+        return_type_hidl: {
+            type: TYPE_STRUCT
+            predefined_type: "::android::hardware::thermal::V1_0::ThermalStatus"
+        }
+        return_type_hidl: {
+            type: TYPE_SCALAR
+            scalar_type: "float_t"
+        }
+        callflow: {
+            next: "*"
+        }
+        callflow: {
+            entry: true
+        }
+        callflow: {
+            exit: true
+        }
+    }
+
 }
diff --git a/thermal/1.0/vts/functional/thermal_hidl_hal_test.cpp b/thermal/1.0/vts/functional/thermal_hidl_hal_test.cpp
index 8a5ea2c..6eb6269 100644
--- a/thermal/1.0/vts/functional/thermal_hidl_hal_test.cpp
+++ b/thermal/1.0/vts/functional/thermal_hidl_hal_test.cpp
@@ -43,8 +43,6 @@
 #define THERMAL_SERVICE_NAME "thermal"
 #define MONITORING_OPERATION_NUMBER 10
 
-#define UNDEFINED_TEMPERATURE (-FLT_MAX)
-
 #define MAX_DEVICE_TEMPERATURE 200
 #define MAX_FAN_SPEED 20000
 
@@ -56,6 +54,17 @@
     ASSERT_NE(thermal_, nullptr);
     baseSize_ = 0;
     names_.clear();
+
+    {
+      float undefined_temperature;
+      thermal_->getUndefinedTemperature(
+          [&undefined_temperature](ThermalStatus status, float temperature) {
+            EXPECT_EQ(ThermalStatusCode::SUCCESS, status.code);
+            EXPECT_LT(MAX_DEVICE_TEMPERATURE, std::abs(undefined_temperature));
+            undefined_temperature = temperature;
+          });
+      undefined_temperature_ = undefined_temperature;
+    }
   }
 
   virtual void TearDown() override {}
@@ -127,21 +136,20 @@
     // .currentValue of known type is in Celsius and must be reasonable.
     EXPECT_TRUE(temperature.type == TemperatureType::UNKNOWN ||
                 std::abs(temperature.currentValue) < MAX_DEVICE_TEMPERATURE ||
-                temperature.currentValue == UNDEFINED_TEMPERATURE);
+                temperature.currentValue == undefined_temperature_);
 
     // .name must not be empty.
     EXPECT_LT(0u, temperature.name.size());
 
     // .currentValue must not exceed .shutdwonThreshold if defined.
     EXPECT_TRUE(temperature.currentValue < temperature.shutdownThreshold ||
-                temperature.currentValue == UNDEFINED_TEMPERATURE ||
-                temperature.shutdownThreshold == UNDEFINED_TEMPERATURE);
+                temperature.currentValue == undefined_temperature_ ||
+                temperature.shutdownThreshold == undefined_temperature_);
 
     // .throttlingThreshold must not exceed .shutdownThreshold if defined.
-    EXPECT_TRUE(temperature.throttlingThreshold <
-                    temperature.shutdownThreshold ||
-                temperature.throttlingThreshold == UNDEFINED_TEMPERATURE ||
-                temperature.shutdownThreshold == UNDEFINED_TEMPERATURE);
+    EXPECT_TRUE(temperature.throttlingThreshold < temperature.shutdownThreshold ||
+                temperature.throttlingThreshold == undefined_temperature_ ||
+                temperature.shutdownThreshold == undefined_temperature_);
   }
 
   // Check validity of CPU usage returned by Thermal HAL.
@@ -164,6 +172,7 @@
 
   size_t baseSize_;
   std::vector<hidl_string> names_;
+  float undefined_temperature_;
 };
 
 // Sanity test for Thermal::getTemperatures().