sensors: clean up sensor if activate fails and catch all exceptions

Free sensor resources if the activate function fails.
Catch all exceptions (not only std::runtime_error) because the
upper layer doesn't expect them.

BUG=26084010

Tracked-On: https://jira01.devtools.intel.com/browse/BP-157
Change-Id: Ide399e32a85c858cb407010675d90c7997b0cc9d
Signed-off-by: Constantin Musca <constantin.musca@intel.com>
diff --git a/peripheral/sensors/edison_arduino/SensorDescriptionFactory.cpp b/peripheral/sensors/edison_arduino/SensorDescriptionFactory.cpp
index 1e0d9ab..25ef666 100644
--- a/peripheral/sensors/edison_arduino/SensorDescriptionFactory.cpp
+++ b/peripheral/sensors/edison_arduino/SensorDescriptionFactory.cpp
@@ -29,23 +29,17 @@
 
 struct sensor_t const *
 SensorDescriptionFactory::getDescription(Sensor::Type type) {
-  try {
-    switch(type) {
-      case Sensor::Type::kMPU9150Accelerometer:
-        return &MPU9150Accelerometer::kSensorDescription;
-        break;
-      case Sensor::Type::kMMA7660Accelerometer:
-        return &MMA7660Accelerometer::kSensorDescription;
-        break;
-      case Sensor::Type::kGroveLight:
-        return &GroveLight::kSensorDescription;
-        break;
-      default:
-        ALOGE("%s: No %d sensor description available.",__func__, type);
-    }
-  } catch (const std::runtime_error& e) {
-    ALOGE("%s: Failed to get sensor %d description.",__func__, type);
+  switch(type) {
+    case Sensor::Type::kMPU9150Accelerometer:
+      return &MPU9150Accelerometer::kSensorDescription;
+    case Sensor::Type::kMMA7660Accelerometer:
+      return &MMA7660Accelerometer::kSensorDescription;
+    case Sensor::Type::kGroveLight:
+      return &GroveLight::kSensorDescription;
+    default:
+      ALOGE("%s: No %d sensor description available.", __func__, type);
   }
+
   return nullptr;
 }
 
diff --git a/peripheral/sensors/edison_arduino/SensorFactory.cpp b/peripheral/sensors/edison_arduino/SensorFactory.cpp
index 3404133..2b0c4aa 100644
--- a/peripheral/sensors/edison_arduino/SensorFactory.cpp
+++ b/peripheral/sensors/edison_arduino/SensorFactory.cpp
@@ -20,26 +20,20 @@
 #include "sensors/Sensors.hpp"
 
 Sensor * SensorFactory::createSensor(Sensor::Type type) {
-  try {
-    switch(type) {
-      case Sensor::Type::kMPU9150Accelerometer:
-        return new MPU9150Accelerometer(
-            SensorDescriptionFactory::getI2cBusNumber(),
-            MPU9150_DEFAULT_I2C_ADDR, AK8975_DEFAULT_I2C_ADDR, false);
-        break;
-      case Sensor::Type::kMMA7660Accelerometer:
-        return new MMA7660Accelerometer(
-            SensorDescriptionFactory::getI2cBusNumber(),
-            MMA7660_DEFAULT_I2C_ADDR);
-        break;
-      case Sensor::Type::kGroveLight:
-        return new GroveLight(0);
-        break;
-      default:
-        ALOGE("%s: No %d sensor available.",__func__, type);
-    }
-  } catch (const std::runtime_error& e) {
-    ALOGE("%s: Failed to instantiate sensor %d.",__func__, type);
+  switch(type) {
+    case Sensor::Type::kMPU9150Accelerometer:
+      return new MPU9150Accelerometer(
+          SensorDescriptionFactory::getI2cBusNumber(),
+          MPU9150_DEFAULT_I2C_ADDR, AK8975_DEFAULT_I2C_ADDR, false);
+    case Sensor::Type::kMMA7660Accelerometer:
+      return new MMA7660Accelerometer(
+          SensorDescriptionFactory::getI2cBusNumber(),
+          MMA7660_DEFAULT_I2C_ADDR);
+    case Sensor::Type::kGroveLight:
+      return new GroveLight(0);
+    default:
+      ALOGE("%s: No %d sensor available.", __func__, type);
   }
+
   return nullptr;
 }
diff --git a/peripheral/sensors/edison_arduino/SensorsHAL.cpp b/peripheral/sensors/edison_arduino/SensorsHAL.cpp
index 1863f1c..a2d9fa1 100644
--- a/peripheral/sensors/edison_arduino/SensorsHAL.cpp
+++ b/peripheral/sensors/edison_arduino/SensorsHAL.cpp
@@ -55,7 +55,7 @@
   int rc = 0;
 
   if (enabled != 0 && enabled != 1) {
-    ALOGE("%s: Invaled parameter", __func__);
+    ALOGE("%s: Invalid parameter", __func__);
     return -EINVAL;
   }
 
@@ -71,6 +71,9 @@
           return -1;
         }
         rc = sensors[handle]->activate(handle, enabled);
+        if (rc != 0) {
+          goto delete_sensor;
+        }
       } else {
         return 0;
       }
@@ -83,11 +86,21 @@
         return 0;
       }
     }
+
     return rc;
-  } catch (const std::runtime_error& e) {
-    ALOGE("%s: Failed to activate sensor(s). keep running", __func__);
-    return -1;
+  } catch (const std::exception& e) {
+    /* The upper layer doesn't expect exceptions. Catch them all. */
+    ALOGE("%s: Failed to %s sensor %d. Error message: %s.",
+        __func__, enabled ? "activate" : "deactivate", handle, e.what());
   }
+
+delete_sensor:
+  if (sensors[handle] != nullptr) {
+    delete sensors[handle];
+    sensors[handle] = nullptr;
+  }
+
+  return -1;
 }
 
 int SensorContext::setDelay(int handle, int64_t ns) {