Replace ExportTempate createsHWMon boolean with an enumeration type

The createsHWMon boolean in the ExportTemplate structure applies an
important initialization strategy for some I2C devies. When new I2C
devices are added to the map of potential I2C devices it is common for
entries to be copied, and pasted, without review of all of the
parameters.

This change is an attempt to reduce copy/paste errors. An enumeration
provides better guidance for initializing the new entry.

Tested:
Confirmed, during debug, the correct initialization path is taken
based upon the hasHWMonDir value.
Confirmed I2C entries are still initialized.

Change-Id: I9141e1875ee99bfe1e7abdc616fb5ea2446e40ba
Signed-off-by: Johnathan Mantey <johnathanx.mantey@intel.com>
diff --git a/include/devices.hpp b/include/devices.hpp
index 73c363c..01a6e7a 100644
--- a/include/devices.hpp
+++ b/include/devices.hpp
@@ -29,235 +29,323 @@
     }
 };
 
+// I2C device drivers may create a /hwmon subdirectory. For example the tmp75
+// driver creates a /sys/bus/i2c/devices/<busnum>-<i2caddr>/hwmon
+// directory. The sensor code relies on the presence of the /hwmon
+// subdirectory to collect sensor readings. Initialization of this subdir is
+// not reliable. I2C devices flagged with hasHWMonDir are tested for correct
+// initialization, and when a failure is detected the device is deleted, and
+// then recreated. The default is to retry 5 times before moving to the next
+// device.
+
+// Devices such as I2C EEPROMs do not generate this file structure. These
+// kinds of devices are flagged using the noHWMonDir enumeration. The
+// expectation is they are created correctly on the first attempt.
+
+// This enumeration class exists to reduce copy/paste errors. It is easy to
+// overlook the trailing parameter in the ExportTemplate structure when it is
+// a simple boolean.
+enum class createsHWMon : bool
+{
+    noHWMonDir,
+    hasHWMonDir
+};
+
 struct ExportTemplate
 {
     ExportTemplate(const char* params, const char* bus, const char* constructor,
-                   const char* destructor, bool createsHWMon) :
+                   const char* destructor, createsHWMon hasHWMonDir) :
         parameters(params),
         busPath(bus), add(constructor), remove(destructor),
-        createsHWMon(createsHWMon){};
+        hasHWMonDir(hasHWMonDir){};
     const char* parameters;
     const char* busPath;
     const char* add;
     const char* remove;
-    bool createsHWMon;
+    createsHWMon hasHWMonDir;
 };
 
 const boost::container::flat_map<const char*, ExportTemplate, CmpStr>
     exportTemplates{
         {{"EEPROM_24C01",
           ExportTemplate("24c01 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", false)},
+                         "new_device", "delete_device",
+                         createsHWMon::noHWMonDir)},
          {"EEPROM_24C02",
           ExportTemplate("24c02 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", false)},
+                         "new_device", "delete_device",
+                         createsHWMon::noHWMonDir)},
          {"EEPROM_24C04",
           ExportTemplate("24c04 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", false)},
+                         "new_device", "delete_device",
+                         createsHWMon::noHWMonDir)},
          {"EEPROM_24C08",
           ExportTemplate("24c08 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", false)},
+                         "new_device", "delete_device",
+                         createsHWMon::noHWMonDir)},
          {"EEPROM_24C16",
           ExportTemplate("24c16 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", false)},
+                         "new_device", "delete_device",
+                         createsHWMon::noHWMonDir)},
          {"EEPROM_24C32",
           ExportTemplate("24c32 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", false)},
+                         "new_device", "delete_device",
+                         createsHWMon::noHWMonDir)},
          {"EEPROM_24C64",
           ExportTemplate("24c64 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", false)},
+                         "new_device", "delete_device",
+                         createsHWMon::noHWMonDir)},
          {"EEPROM_24C128",
           ExportTemplate("24c128 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", false)},
+                         "new_device", "delete_device",
+                         createsHWMon::noHWMonDir)},
          {"EEPROM_24C256",
           ExportTemplate("24c256 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", false)},
+                         "new_device", "delete_device",
+                         createsHWMon::noHWMonDir)},
          {"ADM1266",
           ExportTemplate("adm1266 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", false)},
+                         "new_device", "delete_device",
+                         createsHWMon::noHWMonDir)},
          {"ADM1272",
           ExportTemplate("adm1272 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", false)},
+                         "new_device", "delete_device",
+                         createsHWMon::noHWMonDir)},
          {"ADS7828",
           ExportTemplate("ads7828 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", false)},
+                         "new_device", "delete_device",
+                         createsHWMon::noHWMonDir)},
          {"DPS310",
           ExportTemplate("dps310 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", false)},
+                         "new_device", "delete_device",
+                         createsHWMon::noHWMonDir)},
          {"SI7020",
           ExportTemplate("si7020 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", false)},
+                         "new_device", "delete_device",
+                         createsHWMon::noHWMonDir)},
          {"EEPROM",
           ExportTemplate("eeprom $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", false)},
+                         "new_device", "delete_device",
+                         createsHWMon::noHWMonDir)},
          {"EMC1412",
           ExportTemplate("emc1412 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", true)},
+                         "new_device", "delete_device",
+                         createsHWMon::hasHWMonDir)},
          {"EMC1413",
           ExportTemplate("emc1413 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", true)},
+                         "new_device", "delete_device",
+                         createsHWMon::hasHWMonDir)},
          {"EMC1414",
           ExportTemplate("emc1414 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", true)},
+                         "new_device", "delete_device",
+                         createsHWMon::hasHWMonDir)},
          {"Gpio", ExportTemplate("$Index", "/sys/class/gpio", "export",
-                                 "unexport", false)},
+                                 "unexport", createsHWMon::noHWMonDir)},
          {"INA230",
           ExportTemplate("ina230 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", true)},
+                         "new_device", "delete_device",
+                         createsHWMon::hasHWMonDir)},
          {"ISL68137",
           ExportTemplate("isl68137 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", true)},
+                         "new_device", "delete_device",
+                         createsHWMon::hasHWMonDir)},
          {"ISL68220",
           ExportTemplate("isl68220 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", true)},
+                         "new_device", "delete_device",
+                         createsHWMon::hasHWMonDir)},
          {"ISL69225",
           ExportTemplate("isl69225 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", true)},
+                         "new_device", "delete_device",
+                         createsHWMon::hasHWMonDir)},
          {"ISL68223",
           ExportTemplate("isl68223 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", true)},
+                         "new_device", "delete_device",
+                         createsHWMon::hasHWMonDir)},
          {"ISL69243",
           ExportTemplate("isl69243 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", true)},
+                         "new_device", "delete_device",
+                         createsHWMon::hasHWMonDir)},
          {"ISL69260",
           ExportTemplate("isl69260 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", true)},
+                         "new_device", "delete_device",
+                         createsHWMon::hasHWMonDir)},
          {"MAX16601",
           ExportTemplate("max16601 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", true)},
+                         "new_device", "delete_device",
+                         createsHWMon::hasHWMonDir)},
          {"MAX20710",
           ExportTemplate("max20710 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", true)},
+                         "new_device", "delete_device",
+                         createsHWMon::hasHWMonDir)},
          {"MAX20730",
           ExportTemplate("max20730 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", true)},
+                         "new_device", "delete_device",
+                         createsHWMon::hasHWMonDir)},
          {"MAX20734",
           ExportTemplate("max20734 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", true)},
+                         "new_device", "delete_device",
+                         createsHWMon::hasHWMonDir)},
          {"MAX20796",
           ExportTemplate("max20796 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", true)},
+                         "new_device", "delete_device",
+                         createsHWMon::hasHWMonDir)},
          {"MAX31725",
           ExportTemplate("max31725 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", true)},
+                         "new_device", "delete_device",
+                         createsHWMon::hasHWMonDir)},
          {"MAX31730",
           ExportTemplate("max31730 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", true)},
+                         "new_device", "delete_device",
+                         createsHWMon::hasHWMonDir)},
          {"MAX34440",
           ExportTemplate("max34440 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", true)},
+                         "new_device", "delete_device",
+                         createsHWMon::hasHWMonDir)},
          {"MAX34451",
           ExportTemplate("max34451 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", true)},
+                         "new_device", "delete_device",
+                         createsHWMon::hasHWMonDir)},
          {"MAX6654",
           ExportTemplate("max6654 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", true)},
+                         "new_device", "delete_device",
+                         createsHWMon::hasHWMonDir)},
          {"NCT6779",
           ExportTemplate("nct6779 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", true)},
+                         "new_device", "delete_device",
+                         createsHWMon::hasHWMonDir)},
          {"PCA9542Mux",
           ExportTemplate("pca9542 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", false)},
+                         "new_device", "delete_device",
+                         createsHWMon::noHWMonDir)},
          {"PCA9543Mux",
           ExportTemplate("pca9543 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", false)},
+                         "new_device", "delete_device",
+                         createsHWMon::noHWMonDir)},
          {"PCA9544Mux",
           ExportTemplate("pca9544 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", false)},
+                         "new_device", "delete_device",
+                         createsHWMon::noHWMonDir)},
          {"PCA9545Mux",
           ExportTemplate("pca9545 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", false)},
+                         "new_device", "delete_device",
+                         createsHWMon::noHWMonDir)},
          {"PCA9546Mux",
           ExportTemplate("pca9546 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", false)},
+                         "new_device", "delete_device",
+                         createsHWMon::noHWMonDir)},
          {"PCA9547Mux",
           ExportTemplate("pca9547 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", false)},
+                         "new_device", "delete_device",
+                         createsHWMon::noHWMonDir)},
          {"PCA9548Mux",
           ExportTemplate("pca9548 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", false)},
+                         "new_device", "delete_device",
+                         createsHWMon::noHWMonDir)},
          {"PCA9846Mux",
           ExportTemplate("pca9846 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", false)},
+                         "new_device", "delete_device",
+                         createsHWMon::noHWMonDir)},
          {"PCA9847Mux",
           ExportTemplate("pca9847 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", false)},
+                         "new_device", "delete_device",
+                         createsHWMon::noHWMonDir)},
          {"PCA9848Mux",
           ExportTemplate("pca9848 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", false)},
+                         "new_device", "delete_device",
+                         createsHWMon::noHWMonDir)},
          {"PCA9849Mux",
           ExportTemplate("pca9849 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", false)},
-         {"SBTSI",
-          ExportTemplate("sbtsi $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", true)},
+                         "new_device", "delete_device",
+                         createsHWMon::noHWMonDir)},
+         {"SBTSI", ExportTemplate("sbtsi $Address",
+                                  "/sys/bus/i2c/devices/i2c-$Bus", "new_device",
+                                  "delete_device", createsHWMon::hasHWMonDir)},
          {"SIC450",
           ExportTemplate("sic450 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", true)},
-         {"pmbus",
-          ExportTemplate("pmbus $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", true)},
+                         "new_device", "delete_device",
+                         createsHWMon::hasHWMonDir)},
+         {"pmbus", ExportTemplate("pmbus $Address",
+                                  "/sys/bus/i2c/devices/i2c-$Bus", "new_device",
+                                  "delete_device", createsHWMon::hasHWMonDir)},
          {"PXE1610",
           ExportTemplate("pxe1610 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", true)},
+                         "new_device", "delete_device",
+                         createsHWMon::hasHWMonDir)},
          {"XDPE12284",
           ExportTemplate("xdpe12284 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", true)},
+                         "new_device", "delete_device",
+                         createsHWMon::hasHWMonDir)},
          {"LM95234",
           ExportTemplate("lm95234 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", true)},
+                         "new_device", "delete_device",
+                         createsHWMon::hasHWMonDir)},
          {"TMP112",
           ExportTemplate("tmp112 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", true)},
+                         "new_device", "delete_device",
+                         createsHWMon::hasHWMonDir)},
          {"TMP175",
           ExportTemplate("tmp175 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", true)},
+                         "new_device", "delete_device",
+                         createsHWMon::hasHWMonDir)},
          {"TMP421",
           ExportTemplate("tmp421 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", true)},
+                         "new_device", "delete_device",
+                         createsHWMon::hasHWMonDir)},
          {"TMP441",
           ExportTemplate("tmp441 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", true)},
-         {"LM75A",
-          ExportTemplate("lm75a $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", true)},
+                         "new_device", "delete_device",
+                         createsHWMon::hasHWMonDir)},
+         {"LM75A", ExportTemplate("lm75a $Address",
+                                  "/sys/bus/i2c/devices/i2c-$Bus", "new_device",
+                                  "delete_device", createsHWMon::hasHWMonDir)},
          {"LM25066",
           ExportTemplate("lm25066 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", true)},
-         {"TMP75",
-          ExportTemplate("tmp75 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", true)},
+                         "new_device", "delete_device",
+                         createsHWMon::hasHWMonDir)},
+         {"TMP75", ExportTemplate("tmp75 $Address",
+                                  "/sys/bus/i2c/devices/i2c-$Bus", "new_device",
+                                  "delete_device", createsHWMon::hasHWMonDir)},
          {"W83773G",
           ExportTemplate("w83773g $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", true)},
+                         "new_device", "delete_device",
+                         createsHWMon::hasHWMonDir)},
          {"RAA228000",
           ExportTemplate("raa228000 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", true)},
+                         "new_device", "delete_device",
+                         createsHWMon::hasHWMonDir)},
          {"DPS800",
           ExportTemplate("dps800 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", true)},
+                         "new_device", "delete_device",
+                         createsHWMon::hasHWMonDir)},
          {"MAX31790",
           ExportTemplate("max31790 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", true)},
-         {"JC42",
-          ExportTemplate("jc42 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", true)},
+                         "new_device", "delete_device",
+                         createsHWMon::hasHWMonDir)},
+         {"JC42", ExportTemplate("jc42 $Address",
+                                 "/sys/bus/i2c/devices/i2c-$Bus", "new_device",
+                                 "delete_device", createsHWMon::hasHWMonDir)},
          {"ADM1293",
           ExportTemplate("adm1293 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", false)},
+                         "new_device", "delete_device",
+                         createsHWMon::noHWMonDir)},
          {"INA219",
           ExportTemplate("ina219 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", false)},
+                         "new_device", "delete_device",
+                         createsHWMon::noHWMonDir)},
          {"RAA229126",
           ExportTemplate("raa229126 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", true)},
+                         "new_device", "delete_device",
+                         createsHWMon::hasHWMonDir)},
          {"MP2971",
           ExportTemplate("mp2971 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", true)},
+                         "new_device", "delete_device",
+                         createsHWMon::hasHWMonDir)},
          {"MP2973",
           ExportTemplate("mp2973 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", true)},
+                         "new_device", "delete_device",
+                         createsHWMon::hasHWMonDir)},
          {"HDC1080",
           ExportTemplate("hdc1080 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device", false)}}};
+                         "new_device", "delete_device",
+                         createsHWMon::noHWMonDir)}}};
 } // namespace devices