Utility functions for download firmware

Added set of utility functions to be used within the classes for
managing the PSU firmware updates. Here is a breakdown of the key
functions:

- getDevicePath():
  Construct the PSU device path using I2C bus and address.

- getClassInstance():
  Determines the appropriate updater class to use based on PSU model
  number.

- getFWFilenamePath():
  Searches a directory for a firmware file matching a specified prefix
  and file extension (.bin or .hex).

- calculateCRC8():
  Computes the CRC-8 checksum for transferred data.

- delay():
  Pauses execution for a specified number of milliseconds.

- bigEndianToLittleEndian():
  Converts a 32-bit value from big-endian to little-endian.

- validateFWFile():
  Checks if a firmware file exists and is non-empty.

- openFirmwareFile():
  Opens a firmware file in binary mode, returning a file stream if
  successful.

- readFirmwareBytes():
  Reads specified number of data bytes from a firmware file into a
  buffer. Return data read or null to the caller.

- usePsuJsonFile():
  Wrapper to check the existence of the PSU JSON file.

- Class accessors to private data:
  getPsuInventoryPath(): Accessor for PSU inventory path.
  getDevPath(): Accessor for device path.
  getDevName(): Accessor for device name.
  getImageDir(): Accessor for image directory.
  getI2C(): I2C interface accessor.

Tested every function manually:

- getDevicePath() (using busctl):
  - Validate I2C bus and address values through psuInventoryPath
    validate expected result
  - Modified psuInventoryPath to invalid path
    validate returned invalid path.

- getClassInstance():
  - Validate with matching model number the function instantiate
    appropriate class.
  - Validate the default class instantiated.

- getFWFilenamePath():
  - Validate return of the correct file name in the PSU FW directory
  - Validate null returns when FW files don't exist

- calculaterCRC8():
  - Validate single byte 0x0 result 0x0, single byte 0x01 result 0x07

- delay():
  - Verified the task suspend execution.

- bigEndianToLittleEndian():
  - Verified input 0x12345678 resulted in 0x78563412

- validateFWFile():
  - Validate the existence of the file otherwise an error is logged
  - Validate the file size is greater than 0 otherwise an error is
    logged.

- openFirmwareFile():
  - Validate ifstream object is returned and was able to read from.
  - Validate error logged if the file name is null
  - validate error logged when unable to open the file

- readFirmwareBytes():
  - Validate data read from FW file
  - Validate number of bytes read.

- usePsuJsonFile():
  - Added JSON file to simulator and validated true return.

Change-Id: I0b8b24ae7d37724dab608d2c4977c1b42d4e1632
Signed-off-by: Faisal Awada <faisal@us.ibm.com>
diff --git a/tools/power-utils/main.cpp b/tools/power-utils/main.cpp
index eb81db4..f240ece 100644
--- a/tools/power-utils/main.cpp
+++ b/tools/power-utils/main.cpp
@@ -71,7 +71,7 @@
     if (!updateArguments.empty())
     {
         assert(updateArguments.size() == 2);
-        if (updater::update(updateArguments[0], updateArguments[1]))
+        if (updater::update(bus, updateArguments[0], updateArguments[1]))
         {
             ret = "Update successful";
         }