MLECO-3096: Removing data_acq and data_psn

Further to the HAL refactoring done in previous commits,
this CR simpifies HAL by removing data_acq and data_psn
"modules". The associated function pointers have been
removed.

Change-Id: I04c194c08dfe0aff98ce4e0f0f056bac254c137d
Signed-off-by: Kshitij Sisodia <kshitij.sisodia@arm.com>
diff --git a/docs/documentation.md b/docs/documentation.md
index 9fe2b46..3e7a5c4 100644
--- a/docs/documentation.md
+++ b/docs/documentation.md
@@ -168,27 +168,23 @@
 hal
 ├── CMakeLists.txt
 ├── include
-│   ├── data_acq.h
-│   ├── data_psn.h
-│   ├── hal.h
-│   └── timer.h
+│     ├── hal.h
+│     ├── hal_lcd.h
+│     └── timer.h
 └── source
     ├── components
-    │   ├── cmsis_device
-    │   ├── lcd
-    │   ├── npu
-    │   ├── npu_ta
-    │   └── stdout
-    ├── platform
-    │   ├── mps3
-    │   ├── native
-    │   └── simple
-    ├── profiles
-    │   ├── bare-metal
-    │   └── native
-    ├── data_acq.c
-    ├── data_psn.c
-    └── hal.c
+    │     ├── cmsis_device
+    │     ├── lcd
+    │     ├── npu
+    │     ├── npu_ta
+    │     ├── platform_pmu
+    │     └── stdout
+    ├── hal.c
+    ├── hal_timer.c
+    └── platform
+        ├── mps3
+        ├── native
+        └── simple
 ```
 
 HAL is built as a separate project into a static library `libhal.a`. It is linked with use-case executable.
@@ -220,19 +216,8 @@
   `source/platform/simple`:
   These folders contain platform specific declaration and defines, such as, platform initialisation code, peripheral
   memory map, system registers, system specific timer implementation and other.
-  Platform is built from selected components and configured cmsis device. The platform could be used with different
-  profiles. Profile is included into the platform build based on `PLATFORM_PROFILE` build parameter.
-  Platform code is a separate CMake project, and it is built into a static library `libplatform-drivers.a`. It is linked
-  into HAL library.
-
-- `source/profiles/bare-metal`\
-  `source/profiles/native`:
-  As mentioned before, profiles are added into platform build. Currently, we support bare-metal and native profiles.
-  bare-metal contains the HAL support layer and platform initialization helpers. Function calls are routed
-  to platform-specific logic at this level.
-
-  Native profile allows the built application to be executed on the build (native) machine, i.e. x86. It bypasses and
-  stubs platform devices replacing them with standard C or C++ library calls.
+  Platform is built from selected components and configured cmsis device. It is a separate CMake project, and is 
+  built into a static library `libplatform-drivers.a`. It is linked into HAL library.
 
 ## Models and resources
 
diff --git a/docs/sections/customizing.md b/docs/sections/customizing.md
index 982479e..604e708 100644
--- a/docs/sections/customizing.md
+++ b/docs/sections/customizing.md
@@ -28,8 +28,7 @@
 
 The following sign indicates the important conventions to apply:
 
-> **Convention:** The code is developed using `C++11` and `C99` standards. This is then governed by TensorFlow Lite for
-> Microcontrollers framework.
+> **Convention:** The code is developed using `C++14` and `C99` standards.
 
 ## Software project description
 
@@ -98,20 +97,16 @@
   |--------------------|----------------------------------------------------------------------------------------------|
   |  `inited`            |  Initialization flag. Is set after the `platform_init()` function is called.                   |
   |  `plat_name`         |  Platform name. it is set to `mps3-bare` for MPS3 build and `FVP` for Fast Model build.      |
-  |  `data_acq`          |  Pointer to data acquisition module responsible for user interaction and other data collection for the application logic.               |
-  |  `data_psn`          |  Pointer to data presentation module responsible for data output through components available in the selected platform: `LCD --` for MPS3, `console --` for Fast Model. |
   |  `timer`             |  Pointer to platform timer implementation (see `platform_timer`)                               |
   |  `platform_init`     |  Pointer to platform initialization function.                                                |
   |  `platform_release`  |  Pointer to platform release function                                                        |
 
-- `hal_init` function: Initializes the HAL structure based on the compile time configuration. This must be called before
+- `hal_init` function: Initializes the HAL structure based on the compile-time configuration. This must be called before
     any other function in this API.
 
   |  Parameter name  | Description|
   |------------------|-----------------------------------------------------|
   |  `platform`        | Pointer to a pre-allocated `hal_platform` struct.   |
-  |  `data_acq`        | Pointer to a pre-allocated data acquisition module  |
-  |  `data_psn`        | Pointer to a pre-allocated data presentation module |
   |  `timer`           | Pointer to a pre-allocated timer module             |
   |  `return`          | Zero returned if successful, an error code is returned if unsuccessful.            |
 
@@ -129,28 +124,6 @@
   | ----------------| ------------------------------------------------------------------- |
   |  `platform`       | Pointer to a pre-allocated and initialized `hal_platform` struct.   |
 
-- `data_acq_module` structure: Structure to encompass the data acquisition module and linked methods.
-
-  | Attribute name | Description                                        |
-  |----------------|----------------------------------------------------|
-  | `inited`        | Initialization flag. Is set after the `system_init ()` function is called. |
-  | `system_name`    | Channel name. It is set to `UART` for MPS3 build and Fast Model builds.   |
-  | `system_init`    | Pointer to data acquisition module initialization function. The pointer is set according to the platform selected during the build. This function is called by the platform initialization routines. |
-  | `get_input`      | Pointer to a function reading user input. The pointer is set according to the selected platform during the build. For MPS3 and Fast Model environments, the function reads data from UART.   |
-
-- `data_psn_module` structure: Structure to encompass the data presentation module and associated methods.
-
-  | Attribute name     | Description                                    |
-  |--------------------|------------------------------------------------|
-  | `inited`             | Initialization flag. It is set after the `system_init ()` function is called. |
-  | `system_name`        | System component name used to present data. It is set to `lcd` for the MPS3 build and to `log_psn` for the Fast Model build. For Fast Model, the console output of the data summary replaces all pixel drawing functions.  |
-  | `system_init`        | Pointer to data presentation module initialization function. The pointer is set according to the platform selected during the build. This function is called by the platform initialization routines. |
-  | `present_data_image` | Pointer to a function to draw an image. The pointer is set according to the selected platform during the build. For MPS3, the image is drawn on the LCD. For Fast Model, the image summary is printed in the UART (coordinates, channel info, downsample factor). |
-  | `present_data_text`  | Pointer to a function to print a text. The pointer is set according to the selected platform during the build. For MPS3, the text is drawn on the LCD. For Fast Model, the text is printed in the UART. |
-  | `present_box`        | Pointer to a function to draw a rectangle. The pointer is set according to the selected platform during the build. For MPS3, the image is drawn on the LCD. For Fast Model, the image summary is printed in the UART. |
-  | `clear`              | Pointer to a function to clear the output. The pointer is set according to the selected platform during the build. For MPS3, the function clears the LCD. For Fast Model, nothing happens. |
-  | `set_text_color`     | Pointer to a function to set text color for the next call of `present_data_text()` function. The pointer is set according to the selected platform during the build. For MPS3, the function sets the color for the text printed on the LCD. For Fast Model, nothing happens. |
-
 - `platform_timer` structure: The structure to hold a platform-specific timer implementation.
 
   | Attribute name      | Description                                    |
@@ -175,12 +148,10 @@
 {
 
   hal_platform platform;
-  data_acq_module dataAcq;
-  data_psn_module dataPsn;
   platform_timer timer;
 
   /* Initialise the HAL and platform */
-  hal_init(&platform, &dataAcq, &dataPsn, &timer);
+  hal_init(&platform, &timer);
   hal_platform_init(&platform);
 
   ...
@@ -608,22 +579,23 @@
 
 ## Reading user input from console
 
-The platform data acquisition module uses the `get_input` function to read the keyboard input from the UART. It can be
-used as follows:
+The platform package under HAL must provide an implementation for a function `GetLine`. This is then wrapped by HAL to 
+expose a function called `hal_get_user_input`. 
 
 ```C++
 char ch_input[128];
-platform.data_acq->get_input(ch_input, sizeof(ch_input));
+hal_get_user_input(ch_input, sizeof(ch_input));
 ```
 
-The function is blocked until a user provides an input.
+The function intends to block until a line has been provided. For embedded targets, this call might be redirected to get
+input from a UART block. For the host targets, this will just be a call to the C standard library instead.
 
 ## Output to MPS3 LCD
 
-The platform presentation module has functions to print text or an image to the board LCD. For example:
+The HAL exposes LCD functions to print text or an image to the board LCD. For example:
 
-- `present_data_text`
-- `present_data_image`
+- `hal_lcd_display_text`
+- `hal_lcd_display_image`
 
 Text presentation function has the following signature:
 
@@ -640,7 +612,7 @@
 
 ```C++
 std::string hello("Hello world");
-platform.data_psn->present_data_text(hello.c_str(), hello.size(), 10, 35, 0);
+hal_lcd_display_text(hello.c_str(), hello.size(), 10, 35, 0);
 ```
 
 The image presentation function has the following signature:
@@ -653,14 +625,15 @@
 - `const uint32_t pos_y`: The y coordinate of the first pixel.
 - `const uint32_t downsample_factor`: The factor by which the image is to be downsampled.
 
-For example, the following code snippet visualizes an input tensor data for `MobileNet v2 224`, by downsampling it
-twice:
+For example, the following code snippet visualizes an input tensor data for `MobileNet v2 224`, by down-sampling it
+by a factor of two:
 
 ```C++
-platform.data_psn->present_data_image((uint8_t *) inputTensor->data.data, 224, 224, 3, 10, 35, 2);
+hal_lcd_display_image((uint8_t *) inputTensor->data.data, 224, 224, 3, 10, 35, 2);
 ```
 
-Please refer to the [Hardware Abstraction Layer API](./customizing.md#hardware-abstraction-layer-api) section for more data presentation functions.
+Please refer to the [Hardware Abstraction Layer API](./customizing.md#hardware-abstraction-layer-api) section for more
+LCD related functions.
 
 ## Building custom use-case
 
diff --git a/source/application/main/Main.cc b/source/application/main/Main.cc
index 8ed9c5a..e27d5b5 100644
--- a/source/application/main/Main.cc
+++ b/source/application/main/Main.cc
@@ -42,12 +42,10 @@
 int main ()
 {
     hal_platform    platform;
-    data_acq_module dataAcq;
-    data_psn_module dataPsn;
     platform_timer  timer;
 
     /* Initialise the HAL and platform. */
-    hal_init(&platform, &dataAcq, &dataPsn, &timer);
+    hal_init(&platform, &timer);
 
     if (0 == hal_platform_init(&platform)) {
         /* Application information, UART should have been initialised. */
diff --git a/source/application/main/UseCaseCommonUtils.cc b/source/application/main/UseCaseCommonUtils.cc
index d439446..340a767 100644
--- a/source/application/main/UseCaseCommonUtils.cc
+++ b/source/application/main/UseCaseCommonUtils.cc
@@ -36,12 +36,7 @@
     fflush(stdout);
 }
 
-
-
-
-bool PresentInferenceResult(
-    hal_platform &platform,
-    const std::vector<arm::app::ClassificationResult> &results)
+bool PresentInferenceResult(const std::vector<arm::app::ClassificationResult> &results)
 {
     constexpr uint32_t dataPsnTxtStartX1 = 150;
     constexpr uint32_t dataPsnTxtStartY1 = 30;
@@ -51,7 +46,7 @@
 
     constexpr uint32_t dataPsnTxtYIncr = 16;  /* Row index increment. */
 
-    platform.data_psn->set_text_color(COLOR_GREEN);
+    hal_lcd_set_text_color(COLOR_GREEN);
 
     /* Display each result. */
     uint32_t rowIdx1 = dataPsnTxtStartY1 + 2 * dataPsnTxtYIncr;
@@ -66,13 +61,13 @@
                 std::to_string(results[i].m_labelIdx) +
                 " (" + std::to_string(results[i].m_normalisedVal) + ")";
 
-        platform.data_psn->present_data_text(
+        hal_lcd_display_text(
                 resultStr.c_str(), resultStr.size(),
                 dataPsnTxtStartX1, rowIdx1, false);
         rowIdx1 += dataPsnTxtYIncr;
 
         resultStr = std::to_string(i + 1) + ") " + results[i].m_label;
-        platform.data_psn->present_data_text(
+        hal_lcd_display_text(
                 resultStr.c_str(), resultStr.size(),
                 dataPsnTxtStartX2, rowIdx2, 0);
         rowIdx2 += dataPsnTxtYIncr;
@@ -134,12 +129,12 @@
     return runInf;
 }
 
-int ReadUserInputAsInt(hal_platform& platform)
+int ReadUserInputAsInt()
 {
     char chInput[128];
     memset(chInput, 0, sizeof(chInput));
 
-    platform.data_acq->get_input(chInput, sizeof(chInput));
+    hal_get_user_input(chInput, sizeof(chInput));
     return atoi(chInput);
 }
 
@@ -181,7 +176,6 @@
 bool ListFilesHandler(ApplicationContext& ctx)
 {
     auto& model = ctx.Get<Model&>("model");
-    auto& platform = ctx.Get<hal_platform&>("platform");
 
     constexpr uint32_t dataPsnTxtStartX = 20;
     constexpr uint32_t dataPsnTxtStartY = 40;
@@ -192,12 +186,12 @@
     }
 
     /* Clear the LCD */
-    platform.data_psn->clear(COLOR_BLACK);
+    hal_lcd_clear(COLOR_BLACK);
 
     /* Show the total number of embedded files. */
     std::string strNumFiles = std::string{"Total Number of Files: "} +
                                std::to_string(NUMBER_OF_FILES);
-    platform.data_psn->present_data_text(strNumFiles.c_str(),
+    hal_lcd_display_text(strNumFiles.c_str(),
                                          strNumFiles.size(),
                                          dataPsnTxtStartX,
                                          dataPsnTxtStartY,
@@ -210,7 +204,7 @@
         for (uint32_t i = 0; i < NUMBER_OF_FILES; ++i, yVal += dataPsnTxtYIncr) {
 
             std::string currentFilename{get_filename(i)};
-            platform.data_psn->present_data_text(currentFilename.c_str(),
+            hal_lcd_display_text(currentFilename.c_str(),
                                                  currentFilename.size(),
                                                  dataPsnTxtStartX, yVal, false);
 
diff --git a/source/application/main/include/UseCaseCommonUtils.hpp b/source/application/main/include/UseCaseCommonUtils.hpp
index 7f5dde6..9b6d550 100644
--- a/source/application/main/include/UseCaseCommonUtils.hpp
+++ b/source/application/main/include/UseCaseCommonUtils.hpp
@@ -31,12 +31,10 @@
   /**
    * @brief           Presents inference results using the data presentation
    *                  object.
-   * @param[in]       platform    Reference to the hal platform object.
    * @param[in]       results     Vector of classification results to be displayed.
    * @return          true if successful, false otherwise.
    **/
-bool PresentInferenceResult(hal_platform& platform,
-                            const std::vector<arm::app::ClassificationResult>& results);
+bool PresentInferenceResult(const std::vector<arm::app::ClassificationResult>& results);
 
 
 /**
@@ -82,10 +80,9 @@
 
     /**
      * @brief           Read input and return as an integer.
-     * @param[in]       platform   Reference to the hal platform object.
      * @return          Integer value corresponding to the user input.
      **/
-    int ReadUserInputAsInt(hal_platform& platform);
+    int ReadUserInputAsInt();
 
 #if VERIFY_TEST_OUTPUT
     /**
diff --git a/source/hal/CMakeLists.txt b/source/hal/CMakeLists.txt
index 10016c2..37bf267 100644
--- a/source/hal/CMakeLists.txt
+++ b/source/hal/CMakeLists.txt
@@ -39,8 +39,6 @@
 target_sources(${HAL_TARGET}
     PRIVATE
     source/hal.c
-    source/data_psn.c
-    source/data_acq.c
     source/hal_timer.c)
 
 if (DEFINED VERIFY_TEST_OUTPUT)
diff --git a/source/hal/include/data_acq.h b/source/hal/include/data_acq.h
deleted file mode 100644
index 965fbe5..0000000
--- a/source/hal/include/data_acq.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright (c) 2021 Arm Limited. All rights reserved.
- * SPDX-License-Identifier: Apache-2.0
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef DATA_ACQ_H
-#define DATA_ACQ_H
-
-/**
- * This file is the top level abstraction for the data acquisition module.
- **/
-#include <stdint.h>
-
-/* Structure to encompass the data acquisition module and it's methods. */
-typedef struct data_acquisition_module {
-    int inited;                 /**< initialised or not. */
-    char system_name[8];        /**< name(s) of the channel in use. */
-    int (* system_init)(void);  /**< channel initialisation function. */
-
-    /* Function to go and check if there are any events that require handling. */
-    int (* get_input)(char *user_input, int size);
-} data_acq_module;
-
-/**
- * @brief           Initialise the data acquisition channel: goes and
- *                  sets the required channel up for usage.
- * @param[in,out]   module  Pointer to a pre-allocated data
- *                          acquisition structure object.
- * @return          0 if successful, error code otherwise.
- **/
-int data_acq_channel_init(data_acq_module *module);
-
-/**
- * @brief           Releases the data acquisition channel.
- * @param[in,out]   module  Pointer to a pre-allocated data
- *                          acquisition structure object.
- * @return          0 if successful, error code otherwise.
- **/
-int data_acq_channel_release(data_acq_module *module);
-
-#endif /* DATA_ACQ_H */
diff --git a/source/hal/include/data_psn.h b/source/hal/include/data_psn.h
deleted file mode 100644
index 05d7649..0000000
--- a/source/hal/include/data_psn.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright (c) 2021-2022 Arm Limited. All rights reserved.
- * SPDX-License-Identifier: Apache-2.0
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef DATA_PSN_H
-#define DATA_PSN_H
-
-/**
- * This file is the top level abstraction for the data presentation module
- **/
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-
-/* Structure to encompass the data presentation module and it's methods */
-typedef struct data_presentation_module {
-    int inited;                 /**< initialised or not */
-    char system_name[8];        /**< name of the system in use */
-    int (* system_init)(void);  /**< pointer to init function */
-
-    /** Pointer to the image presentation function */
-    int (* present_data_image)(const uint8_t *data, const uint32_t width,
-        const uint32_t height, const uint32_t channels,
-        const uint32_t pos_x, const uint32_t pos_y,
-        const uint32_t downsample_factor);
-
-    /* Pointer to text presentation function */
-    int (* present_data_text)(const char *str, const size_t str_sz,
-        const uint32_t pos_x, const uint32_t pos_y,
-        const bool allow_multiple_lines);
-
-    /* Pointer to box presentation function */
-    int (* present_box)(const uint32_t pos_x, const uint32_t pos_y,
-        const uint32_t width, const uint32_t height, const uint16_t color);
-
-    /* Pointer to clear presentation function */
-    int (* clear)(const uint16_t color);
-
-    /* Pointer to set text color presentation function */
-    int (* set_text_color)(const uint16_t color);
-} data_psn_module;
-
-
-/**
- * @brief           Initialises the data presentation system.
- * @param[in,out]   module  Pointer to a pre-allocated data
- *                          presentation structure object.
- * @return          0 if successful, error code otherwise.
- **/
-int data_psn_system_init(data_psn_module *module);
-
-/**
- * @brief           Releases the data presentation system.
- * @param[in,out]   module  Pointer to a pre-allocated data
- *                          presentation structure object.
- * @return          0 if successful, error code otherwise.
- **/
-int data_psn_system_release(data_psn_module *module);
-
-#endif /* DATA_PSN_H */
diff --git a/source/hal/include/hal.h b/source/hal/include/hal.h
index 6335e6d..25ea1e2 100644
--- a/source/hal/include/hal.h
+++ b/source/hal/include/hal.h
@@ -28,20 +28,18 @@
 extern "C" {
 #endif
 
-#include "platform_drivers.h"           /* Platform drivers */
-#include "data_acq.h"                   /* Data acquisition abstraction */
-#include "data_psn.h"                   /* Data presentation abstraction */
-#include "timer.h"                      /* Timer/profiler API */
+#include "platform_drivers.h"   /* Platform drivers */
+#include "timer.h"              /* Timer/profiler API */
+#include "hal_lcd.h"            /* LCD functions */
 
 #include <inttypes.h>
+#include <stdbool.h>
 
 /* Structure to define a platform context to be used by the application */
 typedef struct hal_platform_context {
     int inited;                         /**< initialised */
     char plat_name[64];                 /**< name of this platform */
-    data_acq_module * data_acq;         /**< data acquisition module pointer */
-    data_psn_module * data_psn;         /**< data presentation module pointer */
-    platform_timer *  timer;            /**< timer */
+    platform_timer* timer;              /**< timer */
     int (* platform_init)();            /**< pointer to platform initialisation function */
     void (* platform_release)();        /**< pointer to platform release function */
 } hal_platform;
@@ -50,13 +48,10 @@
  * @brief           Initialise the HAL structure based on compile time config. This
  *                  should be called before any other function in this API.
  * @param[in,out]   platform    Pointer to a pre-allocated platform struct.
- * @param[in,out]   data_acq    Pointer to a pre-allocated data acquisition module.
- * @param[in,out]   data_psn    Pointer to a pre-allocated data presentation module.
  * @param[in,out]   timer       Pointer to a pre-allocated timer module.
  * @return          0 if successful, error code otherwise.
  **/
-int hal_init(hal_platform *platform, data_acq_module *data_acq,
-    data_psn_module *data_psn, platform_timer *timer);
+int hal_init(hal_platform* platform, platform_timer* timer);
 
 
 /**
@@ -66,7 +61,7 @@
  *                          platform structure.
  * @return      0 if successful, error code otherwise.
  **/
-int hal_platform_init(hal_platform *platform);
+int hal_platform_init(hal_platform* platform);
 
 
 /**
@@ -74,7 +69,15 @@
  * @param[in]   platform    pointer to a pre-allocated and initialised
  *                          platform structure.
  **/
-void hal_platform_release(hal_platform *platform);
+void hal_platform_release(hal_platform* platform);
+
+/**
+ * @brief       Gets user input from the stdin interface.
+ * @param[out]  user_input  Pointer to a buffer where the input will be stored.
+ * @param[in]   size        Buffer size in bytes.
+ * @return      True if successful, false otherwise.
+ */
+bool hal_get_user_input(char* user_input, int size);
 
 #ifdef __cplusplus
 }
diff --git a/source/hal/include/hal_lcd.h b/source/hal/include/hal_lcd.h
new file mode 100644
index 0000000..0a484c5
--- /dev/null
+++ b/source/hal/include/hal_lcd.h
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2021-2022 Arm Limited. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef HAL_LCD_H
+#define HAL_LCD_H
+/**
+ * This file is the top level abstraction for the LCD related functions
+ **/
+
+#include "lcd_img.h"
+
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+
+/**
+ * See lcd_img.h for function docstrings.
+ * In the following macro definitions:
+ * d = data (pointer)
+ * w = width
+ * h = height
+ * c = channels
+ * x = x position
+ * y = y position
+ * s = down-sample factor (images)
+ * m = allow multiple lines (text)
+ * cl = colour
+ */
+#define hal_lcd_init()                          lcd_init()
+#define hal_lcd_display_image(d,w,h,c,x,y,s)    lcd_display_image(d,w,h,c,x,y,s)
+#define hal_lcd_display_text(s,l,x,y,m)         lcd_display_text(s,l,x,y,m)
+#define hal_lcd_display_box(x,y,w,h,cl)         lcd_display_box(x,y,w,h,cl)
+#define hal_lcd_clear(cl)                       lcd_clear(cl)
+#define hal_lcd_set_text_color(cl)              lcd_set_text_color(cl)
+
+#endif /* HAL_LCD_H */
diff --git a/source/hal/source/data_acq.c b/source/hal/source/data_acq.c
deleted file mode 100644
index ec6c725..0000000
--- a/source/hal/source/data_acq.c
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright (c) 2022 Arm Limited. All rights reserved.
- * SPDX-License-Identifier: Apache-2.0
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#include "data_acq.h"
-
-#include "log_macros.h"
-#include "platform_drivers.h"
-
-#include <assert.h>
-#include <stdlib.h>
-#include <string.h>
-
-/**
- * @brief       Get the user input from USART.
- * @param[out]  user_input  String read from the UART block.
- * @param[in]   size        String read length.
- * @return      0 if successful, error code otherwise.
- **/
-static int get_uart_user_input(char* user_input, int size)
-{
-    if (1 != GetLine(user_input, size - 1)) {
-        return 1;
-    }
-    return 0;
-}
-
-int data_acq_channel_init(data_acq_module* module)
-{
-    assert(module);
-
-    /* UART should have been initialised with low level initialisation
-     * routines. */
-    module->system_init = NULL;
-
-    strncpy(module->system_name, "UART", sizeof(module->system_name));
-    module->get_input = get_uart_user_input;
-    module->inited = 1;
-
-    return !(module->inited);
-}
-
-int data_acq_channel_release(data_acq_module* module)
-{
-    assert(module);
-    module->inited = 0;
-    module->get_input = NULL;
-    return 0;
-}
diff --git a/source/hal/source/data_psn.c b/source/hal/source/data_psn.c
deleted file mode 100644
index de088d7..0000000
--- a/source/hal/source/data_psn.c
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (c) 2022 Arm Limited. All rights reserved.
- * SPDX-License-Identifier: Apache-2.0
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#include "data_psn.h"
-
-#include "lcd_img.h"
-#include "platform_drivers.h"
-
-#include <assert.h>
-#include <string.h>
-
-int data_psn_system_init(data_psn_module* module)
-{
-    assert(module);
-
-    /* LCD output supported. */
-    module->system_init = lcd_init;
-    module->present_data_image = lcd_display_image;
-    module->present_data_text = lcd_display_text;
-    module->present_box = lcd_display_box;
-    module->set_text_color = lcd_set_text_color;
-    module->clear = lcd_clear;
-    strncpy(module->system_name, "lcd", sizeof(module->system_name));
-    module->inited =  !module->system_init();
-    return !module->inited;
-}
-
-int data_psn_system_release(data_psn_module* module)
-{
-    assert(module);
-    module->inited = 0;
-    return 0;
-}
diff --git a/source/hal/source/hal.c b/source/hal/source/hal.c
index 2715a17..d6028e7 100644
--- a/source/hal/source/hal.c
+++ b/source/hal/source/hal.c
@@ -23,13 +23,8 @@
 #include <assert.h>
 #include <string.h>
 
-int hal_init(hal_platform* platform, data_acq_module* data_acq,
-    data_psn_module* data_psn, platform_timer* timer)
+int hal_init(hal_platform* platform, platform_timer* timer)
 {
-    assert(platform && data_acq && data_psn);
-
-    platform->data_acq  = data_acq;
-    platform->data_psn  = data_psn;
     platform->timer     = timer;
     platform->platform_init     = platform_init;
     platform->platform_release  = platform_release;
@@ -59,46 +54,33 @@
         return state;
     }
 
-    /* Initialise the data acquisition module */
-    if (0 != (state = data_acq_channel_init(platform->data_acq))) {
-        if (!platform->data_acq->inited) {
-            printf_err("Failed to initialise data acq module: %s\n",
-                platform->data_acq->system_name);
-        }
-        hal_platform_release(platform);
+    /* Initialise LCD */
+    if (0 != (state = hal_lcd_init())) {
+        printf_err("hal_lcd_init failed\n");
         return state;
     }
 
-    /* Initialise the presentation module */
-    if (0 != (state = data_psn_system_init(platform->data_psn))) {
-        printf_err("Failed to initialise data psn module: %s\n",
-            platform->data_psn->system_name);
-        data_acq_channel_release(platform->data_acq);
-        hal_platform_release(platform);
-        return state;
-    }
-
-    /* Followed by the timer module */
+    /* Initialise the timer module */
     init_timer(platform->timer);
 
     info("%s platform initialised\n", platform->plat_name);
-    debug("Using %s module for data acquisition\n",
-            platform->data_acq->system_name);
-    debug("Using %s module for data presentation\n",
-        platform->data_psn->system_name);
-
     platform->inited = !state;
-
     return state;
 }
 
 void hal_platform_release(hal_platform *platform)
 {
     assert(platform && platform->platform_release);
-    data_acq_channel_release(platform->data_acq);
-    data_psn_system_release(platform->data_psn);
 
     hal_platform_clear(platform);
     info("Releasing platform %s\n", platform->plat_name);
     platform->platform_release();
 }
+
+bool hal_get_user_input(char* user_input, int size)
+{
+    if (1 != GetLine(user_input, size - 1)) {
+        return true;
+    }
+    return false;
+}
diff --git a/source/use_case/ad/src/MainLoop.cc b/source/use_case/ad/src/MainLoop.cc
index 5a289bf..e858320 100644
--- a/source/use_case/ad/src/MainLoop.cc
+++ b/source/use_case/ad/src/MainLoop.cc
@@ -78,7 +78,7 @@
         int menuOption = MENU_OPT_RUN_INF_NEXT;
         if (bUseMenu) {
             DisplayMenu();
-            menuOption = arm::app::ReadUserInputAsInt(platform);
+            menuOption = arm::app::ReadUserInputAsInt();
             printf("\n");
         }
         switch (menuOption) {
@@ -93,7 +93,7 @@
                        NUMBER_OF_FILES-1);
                 fflush(stdout);
                 auto audioIndex = static_cast<uint32_t>(
-                        arm::app::ReadUserInputAsInt(platform));
+                        arm::app::ReadUserInputAsInt());
                 executionSuccessful = ClassifyVibrationHandler(caseContext,
                                                            audioIndex,
                                                            false);
diff --git a/source/use_case/ad/src/UseCaseHandler.cc b/source/use_case/ad/src/UseCaseHandler.cc
index 853ab08..5585f36 100644
--- a/source/use_case/ad/src/UseCaseHandler.cc
+++ b/source/use_case/ad/src/UseCaseHandler.cc
@@ -33,12 +33,11 @@
     /**
      * @brief           Presents inference results using the data presentation
      *                  object.
-     * @param[in]       platform    reference to the hal platform object
      * @param[in]       result      average sum of classification results
      * @param[in]       threshold   if larger than this value we have an anomaly
      * @return          true if successful, false otherwise
      **/
-    static bool PresentInferenceResult(hal_platform& platform, float result, float threshold);
+    static bool PresentInferenceResult(float result, float threshold);
 
     /**
      * @brief Returns a function to perform feature calculation and populates input tensor data with
@@ -64,7 +63,6 @@
     /* Vibration classification handler */
     bool ClassifyVibrationHandler(ApplicationContext& ctx, uint32_t clipIndex, bool runAll)
     {
-        auto& platform = ctx.Get<hal_platform&>("platform");
         auto& profiler = ctx.Get<Profiler&>("profiler");
 
         constexpr uint32_t dataPsnTxtInfStartX = 20;
@@ -114,7 +112,7 @@
         auto audioDataStride = nMelSpecVectorsInAudioStride * frameStride;
 
         do {
-            platform.data_psn->clear(COLOR_BLACK);
+            hal_lcd_clear(COLOR_BLACK);
 
             auto currentIndex = ctx.Get<uint32_t>("clipIndex");
 
@@ -153,7 +151,7 @@
 
             /* Display message on the LCD - inference running. */
             std::string str_inf{"Running inference... "};
-            platform.data_psn->present_data_text(
+            hal_lcd_display_text(
                     str_inf.c_str(), str_inf.size(),
                     dataPsnTxtInfStartX, dataPsnTxtInfStartY, 0);
             info("Running inference on audio clip %" PRIu32 " => %s\n", currentIndex, get_filename(currentIndex));
@@ -202,12 +200,12 @@
 
             /* Erase. */
             str_inf = std::string(str_inf.size(), ' ');
-            platform.data_psn->present_data_text(
+            hal_lcd_display_text(
                     str_inf.c_str(), str_inf.size(),
                     dataPsnTxtInfStartX, dataPsnTxtInfStartY, 0);
 
             ctx.Set<float>("result", result);
-            if (!PresentInferenceResult(platform, result, scoreThreshold)) {
+            if (!PresentInferenceResult(result, scoreThreshold)) {
                 return false;
             }
 
@@ -221,13 +219,13 @@
     }
 
 
-    static bool PresentInferenceResult(hal_platform& platform, float result, float threshold)
+    static bool PresentInferenceResult(float result, float threshold)
     {
         constexpr uint32_t dataPsnTxtStartX1 = 20;
         constexpr uint32_t dataPsnTxtStartY1 = 30;
         constexpr uint32_t dataPsnTxtYIncr   = 16; /* Row index increment */
 
-        platform.data_psn->set_text_color(COLOR_GREEN);
+        hal_lcd_set_text_color(COLOR_GREEN);
 
         /* Display each result */
         uint32_t rowIdx1 = dataPsnTxtStartY1 + 2 * dataPsnTxtYIncr;
@@ -242,7 +240,7 @@
             anomalyResult += std::string("Everything fine, no anomaly detected!");
         }
 
-        platform.data_psn->present_data_text(
+        hal_lcd_display_text(
                 anomalyScore.c_str(), anomalyScore.size(),
                 dataPsnTxtStartX1, rowIdx1, false);
 
diff --git a/source/use_case/asr/src/MainLoop.cc b/source/use_case/asr/src/MainLoop.cc
index 40624f3..058211a 100644
--- a/source/use_case/asr/src/MainLoop.cc
+++ b/source/use_case/asr/src/MainLoop.cc
@@ -121,7 +121,7 @@
         int menuOption = MENU_OPT_RUN_INF_NEXT;
         if (bUseMenu) {
             DisplayMenu();
-            menuOption = arm::app::ReadUserInputAsInt(platform);
+            menuOption = arm::app::ReadUserInputAsInt();
             printf("\n");
         }
         switch (menuOption) {
@@ -136,7 +136,7 @@
                        NUMBER_OF_FILES-1);
                 fflush(stdout);
                 auto clipIndex = static_cast<uint32_t>(
-                                    arm::app::ReadUserInputAsInt(platform));
+                                    arm::app::ReadUserInputAsInt());
                 executionSuccessful = ClassifyAudioHandler(caseContext,
                                                            clipIndex,
                                                            false);
diff --git a/source/use_case/asr/src/UseCaseHandler.cc b/source/use_case/asr/src/UseCaseHandler.cc
index 7bce2c6..420f725 100644
--- a/source/use_case/asr/src/UseCaseHandler.cc
+++ b/source/use_case/asr/src/UseCaseHandler.cc
@@ -36,13 +36,10 @@
     /**
      * @brief           Presents inference results using the data presentation
      *                  object.
-     * @param[in]       platform    Reference to the hal platform object.
      * @param[in]       results     Vector of classification results to be displayed.
      * @return          true if successful, false otherwise.
      **/
-    static bool PresentInferenceResult(
-                    hal_platform& platform,
-                    const std::vector<arm::app::asr::AsrResult>& results);
+    static bool PresentInferenceResult(const std::vector<arm::app::asr::AsrResult>& results);
 
     /* Audio inference classification handler. */
     bool ClassifyAudioHandler(ApplicationContext& ctx, uint32_t clipIndex, bool runAll)
@@ -50,8 +47,7 @@
         constexpr uint32_t dataPsnTxtInfStartX = 20;
         constexpr uint32_t dataPsnTxtInfStartY = 40;
 
-        auto& platform = ctx.Get<hal_platform&>("platform");
-        platform.data_psn->clear(COLOR_BLACK);
+        hal_lcd_clear(COLOR_BLACK);
 
         auto& profiler = ctx.Get<Profiler&>("profiler");
 
@@ -103,7 +99,7 @@
 
         /* Loop to process audio clips. */
         do {
-            platform.data_psn->clear(COLOR_BLACK);
+            hal_lcd_clear(COLOR_BLACK);
 
             /* Get current audio clip index. */
             auto currentIndex = ctx.Get<uint32_t>("clipIndex");
@@ -136,7 +132,7 @@
 
             /* Display message on the LCD - inference running. */
             std::string str_inf{"Running inference... "};
-            platform.data_psn->present_data_text(
+            hal_lcd_display_text(
                                 str_inf.c_str(), str_inf.size(),
                                 dataPsnTxtInfStartX, dataPsnTxtInfStartY, 0);
 
@@ -192,13 +188,13 @@
 
             /* Erase. */
             str_inf = std::string(str_inf.size(), ' ');
-            platform.data_psn->present_data_text(
+            hal_lcd_display_text(
                                 str_inf.c_str(), str_inf.size(),
                                 dataPsnTxtInfStartX, dataPsnTxtInfStartY, 0);
 
             ctx.Set<std::vector<arm::app::asr::AsrResult>>("results", results);
 
-            if (!PresentInferenceResult(platform, results)) {
+            if (!PresentInferenceResult(results)) {
                 return false;
             }
 
@@ -212,14 +208,13 @@
     }
 
 
-    static bool PresentInferenceResult(hal_platform& platform,
-                                       const std::vector<arm::app::asr::AsrResult>& results)
+    static bool PresentInferenceResult(const std::vector<arm::app::asr::AsrResult>& results)
     {
         constexpr uint32_t dataPsnTxtStartX1 = 20;
         constexpr uint32_t dataPsnTxtStartY1 = 60;
         constexpr bool allow_multiple_lines = true;
 
-        platform.data_psn->set_text_color(COLOR_GREEN);
+        hal_lcd_set_text_color(COLOR_GREEN);
 
         info("Final results:\n");
         info("Total number of inferences: %zu\n", results.size());
@@ -243,7 +238,7 @@
         /* Get the decoded result for the combined result. */
         std::string finalResultStr = audio::asr::DecodeOutput(combinedResults);
 
-        platform.data_psn->present_data_text(
+        hal_lcd_display_text(
                             finalResultStr.c_str(), finalResultStr.size(),
                             dataPsnTxtStartX1, dataPsnTxtStartY1,
                             allow_multiple_lines);
diff --git a/source/use_case/img_class/src/MainLoop.cc b/source/use_case/img_class/src/MainLoop.cc
index 05322d1..7b67a19 100644
--- a/source/use_case/img_class/src/MainLoop.cc
+++ b/source/use_case/img_class/src/MainLoop.cc
@@ -60,7 +60,7 @@
         int menuOption = common::MENU_OPT_RUN_INF_NEXT;
         if (bUseMenu) {
             DisplayCommonMenu();
-            menuOption = arm::app::ReadUserInputAsInt(platform);
+            menuOption = arm::app::ReadUserInputAsInt();
             printf("\n");
         }
         switch (menuOption) {
@@ -70,7 +70,7 @@
             case common::MENU_OPT_RUN_INF_CHOSEN: {
                 printf("    Enter the image index [0, %d]: ", NUMBER_OF_FILES-1);
                 fflush(stdout);
-                auto imgIndex = static_cast<uint32_t>(arm::app::ReadUserInputAsInt(platform));
+                auto imgIndex = static_cast<uint32_t>(arm::app::ReadUserInputAsInt());
                 executionSuccessful = ClassifyImageHandler(caseContext, imgIndex, false);
                 break;
             }
diff --git a/source/use_case/img_class/src/UseCaseHandler.cc b/source/use_case/img_class/src/UseCaseHandler.cc
index 1f1d78b..9061282 100644
--- a/source/use_case/img_class/src/UseCaseHandler.cc
+++ b/source/use_case/img_class/src/UseCaseHandler.cc
@@ -44,7 +44,6 @@
     /* Image inference classification handler. */
     bool ClassifyImageHandler(ApplicationContext& ctx, uint32_t imgIndex, bool runAll)
     {
-        auto& platform = ctx.Get<hal_platform&>("platform");
         auto& profiler = ctx.Get<Profiler&>("profiler");
 
         constexpr uint32_t dataPsnImgDownscaleFactor = 2;
@@ -89,7 +88,7 @@
         std::vector<ClassificationResult> results;
 
         do {
-            platform.data_psn->clear(COLOR_BLACK);
+            hal_lcd_clear(COLOR_BLACK);
 
             /* Strings for presentation/logging. */
             std::string str_inf{"Running inference... "};
@@ -98,7 +97,7 @@
             LoadImageIntoTensor(ctx.Get<uint32_t>("imgIndex"), inputTensor);
 
             /* Display this image on the LCD. */
-            platform.data_psn->present_data_image(
+            hal_lcd_display_image(
                 static_cast<uint8_t *>(inputTensor->data.data),
                 nCols, nRows, nChannels,
                 dataPsnImgStartX, dataPsnImgStartY, dataPsnImgDownscaleFactor);
@@ -109,7 +108,7 @@
             }
 
             /* Display message on the LCD - inference running. */
-            platform.data_psn->present_data_text(str_inf.c_str(), str_inf.size(),
+            hal_lcd_display_text(str_inf.c_str(), str_inf.size(),
                                     dataPsnTxtInfStartX, dataPsnTxtInfStartY, false);
 
             /* Run inference over this image. */
@@ -122,7 +121,7 @@
 
             /* Erase. */
             str_inf = std::string(str_inf.size(), ' ');
-            platform.data_psn->present_data_text(str_inf.c_str(), str_inf.size(),
+            hal_lcd_display_text(str_inf.c_str(), str_inf.size(),
                                     dataPsnTxtInfStartX, dataPsnTxtInfStartY, false);
 
             auto& classifier = ctx.Get<ImgClassClassifier&>("classifier");
@@ -137,7 +136,7 @@
             arm::app::DumpTensor(outputTensor);
 #endif /* VERIFY_TEST_OUTPUT */
 
-            if (!PresentInferenceResult(platform, results)) {
+            if (!PresentInferenceResult(results)) {
                 return false;
             }
 
diff --git a/source/use_case/inference_runner/src/UseCaseHandler.cc b/source/use_case/inference_runner/src/UseCaseHandler.cc
index 1125830..2f4b7c8 100644
--- a/source/use_case/inference_runner/src/UseCaseHandler.cc
+++ b/source/use_case/inference_runner/src/UseCaseHandler.cc
@@ -116,7 +116,6 @@
 
 bool RunInferenceHandler(ApplicationContext& ctx)
 {
-    auto& platform = ctx.Get<hal_platform&>("platform");
     auto& profiler = ctx.Get<Profiler&>("profiler");
     auto& model = ctx.Get<Model&>("model");
 
@@ -143,9 +142,8 @@
     std::string str_inf{"Running inference... "};
 
     /* Display message on the LCD - inference running. */
-    platform.data_psn->present_data_text(
-                            str_inf.c_str(), str_inf.size(),
-                            dataPsnTxtInfStartX, dataPsnTxtInfStartY, 0);
+    hal_lcd_display_text(str_inf.c_str(), str_inf.size(),
+                         dataPsnTxtInfStartX, dataPsnTxtInfStartY, 0);
 
     if (!RunInference(model, profiler)) {
         return false;
@@ -153,7 +151,7 @@
 
     /* Erase. */
     str_inf = std::string(str_inf.size(), ' ');
-    platform.data_psn->present_data_text(
+    hal_lcd_display_text(
                             str_inf.c_str(), str_inf.size(),
                             dataPsnTxtInfStartX, dataPsnTxtInfStartY, 0);
 
diff --git a/source/use_case/kws/src/MainLoop.cc b/source/use_case/kws/src/MainLoop.cc
index 044c957..76dff8c 100644
--- a/source/use_case/kws/src/MainLoop.cc
+++ b/source/use_case/kws/src/MainLoop.cc
@@ -87,7 +87,7 @@
         int menuOption = MENU_OPT_RUN_INF_NEXT;
         if (bUseMenu) {
             DisplayMenu();
-            menuOption = arm::app::ReadUserInputAsInt(platform);
+            menuOption = arm::app::ReadUserInputAsInt();
             printf("\n");
         }
         switch (menuOption) {
@@ -97,7 +97,7 @@
             case MENU_OPT_RUN_INF_CHOSEN: {
                 printf("    Enter the audio clip index [0, %d]: ", NUMBER_OF_FILES-1);
                 fflush(stdout);
-                auto clipIndex = static_cast<uint32_t>(arm::app::ReadUserInputAsInt(platform));
+                auto clipIndex = static_cast<uint32_t>(arm::app::ReadUserInputAsInt());
                 executionSuccessful = ClassifyAudioHandler(caseContext, clipIndex, false);
                 break;
             }
diff --git a/source/use_case/kws/src/UseCaseHandler.cc b/source/use_case/kws/src/UseCaseHandler.cc
index 8dd7724..e04cefc 100644
--- a/source/use_case/kws/src/UseCaseHandler.cc
+++ b/source/use_case/kws/src/UseCaseHandler.cc
@@ -35,16 +35,14 @@
 namespace arm {
 namespace app {
 
-   
+
     /**
      * @brief           Presents inference results using the data presentation
      *                  object.
-     * @param[in]       platform    Reference to the hal platform object.
      * @param[in]       results     Vector of classification results to be displayed.
      * @return          true if successful, false otherwise.
      **/
-    static bool PresentInferenceResult(hal_platform& platform,
-                                       const std::vector<arm::app::kws::KwsResult>& results);
+    static bool PresentInferenceResult(const std::vector<arm::app::kws::KwsResult>& results);
 
     /**
      * @brief Returns a function to perform feature calculation and populates input tensor data with
@@ -68,7 +66,6 @@
     /* Audio inference handler. */
     bool ClassifyAudioHandler(ApplicationContext& ctx, uint32_t clipIndex, bool runAll)
     {
-        auto& platform = ctx.Get<hal_platform&>("platform");
         auto& profiler = ctx.Get<Profiler&>("profiler");
 
         constexpr uint32_t dataPsnTxtInfStartX = 20;
@@ -137,7 +134,7 @@
         const float secondsPerSample = 1.0/audio::MicroNetKwsMFCC::ms_defaultSamplingFreq;
 
         do {
-            platform.data_psn->clear(COLOR_BLACK);
+            hal_lcd_clear(COLOR_BLACK);
 
             auto currentIndex = ctx.Get<uint32_t>("clipIndex");
 
@@ -171,7 +168,7 @@
 
             /* Display message on the LCD - inference running. */
             std::string str_inf{"Running inference... "};
-            platform.data_psn->present_data_text(
+            hal_lcd_display_text(
                                 str_inf.c_str(), str_inf.size(),
                                 dataPsnTxtInfStartX, dataPsnTxtInfStartY, 0);
             info("Running inference on audio clip %" PRIu32 " => %s\n", currentIndex,
@@ -223,13 +220,13 @@
 
             /* Erase. */
             str_inf = std::string(str_inf.size(), ' ');
-            platform.data_psn->present_data_text(
+            hal_lcd_display_text(
                                 str_inf.c_str(), str_inf.size(),
                                 dataPsnTxtInfStartX, dataPsnTxtInfStartY, false);
 
             ctx.Set<std::vector<arm::app::kws::KwsResult>>("results", results);
 
-            if (!PresentInferenceResult(platform, results)) {
+            if (!PresentInferenceResult(results)) {
                 return false;
             }
 
@@ -242,61 +239,6 @@
         return true;
     }
 
-    static bool PresentInferenceResult(hal_platform& platform,
-                                       const std::vector<arm::app::kws::KwsResult>& results)
-    {
-        constexpr uint32_t dataPsnTxtStartX1 = 20;
-        constexpr uint32_t dataPsnTxtStartY1 = 30;
-        constexpr uint32_t dataPsnTxtYIncr   = 16;  /* Row index increment. */
-
-        platform.data_psn->set_text_color(COLOR_GREEN);
-        info("Final results:\n");
-        info("Total number of inferences: %zu\n", results.size());
-
-        /* Display each result */
-        uint32_t rowIdx1 = dataPsnTxtStartY1 + 2 * dataPsnTxtYIncr;
-
-        for (uint32_t i = 0; i < results.size(); ++i) {
-
-            std::string topKeyword{"<none>"};
-            float score = 0.f;
-            if (!results[i].m_resultVec.empty()) {
-                topKeyword = results[i].m_resultVec[0].m_label;
-                score = results[i].m_resultVec[0].m_normalisedVal;
-            }
-
-            std::string resultStr =
-                std::string{"@"} + std::to_string(results[i].m_timeStamp) +
-                std::string{"s: "} + topKeyword + std::string{" ("} +
-                std::to_string(static_cast<int>(score * 100)) + std::string{"%)"};
-
-            platform.data_psn->present_data_text(
-                                    resultStr.c_str(), resultStr.size(),
-                                    dataPsnTxtStartX1, rowIdx1, false);
-            rowIdx1 += dataPsnTxtYIncr;
-
-            if (results[i].m_resultVec.empty()) {
-                info("For timestamp: %f (inference #: %" PRIu32
-                     "); label: %s; threshold: %f\n",
-                     results[i].m_timeStamp, results[i].m_inferenceNumber,
-                     topKeyword.c_str(),
-                     results[i].m_threshold);
-            } else {
-                for (uint32_t j = 0; j < results[i].m_resultVec.size(); ++j) {
-                    info("For timestamp: %f (inference #: %" PRIu32
-                         "); label: %s, score: %f; threshold: %f\n",
-                         results[i].m_timeStamp,
-                         results[i].m_inferenceNumber,
-                         results[i].m_resultVec[j].m_label.c_str(),
-                         results[i].m_resultVec[j].m_normalisedVal,
-                         results[i].m_threshold);
-                }
-            }
-        }
-
-        return true;
-    }
-
     /**
      * @brief Generic feature calculator factory.
      *
@@ -344,6 +286,60 @@
         };
     }
 
+    static bool PresentInferenceResult(const std::vector<arm::app::kws::KwsResult>& results)
+    {
+        constexpr uint32_t dataPsnTxtStartX1 = 20;
+        constexpr uint32_t dataPsnTxtStartY1 = 30;
+        constexpr uint32_t dataPsnTxtYIncr   = 16;  /* Row index increment. */
+
+        hal_lcd_set_text_color(COLOR_GREEN);
+        info("Final results:\n");
+        info("Total number of inferences: %zu\n", results.size());
+
+        /* Display each result */
+        uint32_t rowIdx1 = dataPsnTxtStartY1 + 2 * dataPsnTxtYIncr;
+
+        for (uint32_t i = 0; i < results.size(); ++i) {
+
+            std::string topKeyword{"<none>"};
+            float score = 0.f;
+            if (!results[i].m_resultVec.empty()) {
+                topKeyword = results[i].m_resultVec[0].m_label;
+                score = results[i].m_resultVec[0].m_normalisedVal;
+            }
+
+            std::string resultStr =
+                    std::string{"@"} + std::to_string(results[i].m_timeStamp) +
+                    std::string{"s: "} + topKeyword + std::string{" ("} +
+                    std::to_string(static_cast<int>(score * 100)) + std::string{"%)"};
+
+            hal_lcd_display_text(
+                    resultStr.c_str(), resultStr.size(),
+                    dataPsnTxtStartX1, rowIdx1, false);
+            rowIdx1 += dataPsnTxtYIncr;
+
+            if (results[i].m_resultVec.empty()) {
+                info("For timestamp: %f (inference #: %" PRIu32
+                             "); label: %s; threshold: %f\n",
+                     results[i].m_timeStamp, results[i].m_inferenceNumber,
+                     topKeyword.c_str(),
+                     results[i].m_threshold);
+            } else {
+                for (uint32_t j = 0; j < results[i].m_resultVec.size(); ++j) {
+                    info("For timestamp: %f (inference #: %" PRIu32
+                                 "); label: %s, score: %f; threshold: %f\n",
+                         results[i].m_timeStamp,
+                         results[i].m_inferenceNumber,
+                         results[i].m_resultVec[j].m_label.c_str(),
+                         results[i].m_resultVec[j].m_normalisedVal,
+                         results[i].m_threshold);
+                }
+            }
+        }
+
+        return true;
+    }
+
     template std::function<void (std::vector<int16_t>&, size_t , bool, size_t)>
         FeatureCalc<int8_t>(TfLiteTensor* inputTensor,
                             size_t cacheSize,
diff --git a/source/use_case/kws_asr/src/MainLoop.cc b/source/use_case/kws_asr/src/MainLoop.cc
index a2beab3..096c966 100644
--- a/source/use_case/kws_asr/src/MainLoop.cc
+++ b/source/use_case/kws_asr/src/MainLoop.cc
@@ -156,7 +156,7 @@
         int menuOption = MENU_OPT_RUN_INF_NEXT;
         if (bUseMenu) {
             DisplayMenu();
-            menuOption = arm::app::ReadUserInputAsInt(platform);
+            menuOption = arm::app::ReadUserInputAsInt();
             printf("\n");
         }
         switch (menuOption) {
@@ -171,7 +171,7 @@
                        NUMBER_OF_FILES-1);
                 fflush(stdout);
                 auto clipIndex = static_cast<uint32_t>(
-                        arm::app::ReadUserInputAsInt(platform));
+                        arm::app::ReadUserInputAsInt());
                 executionSuccessful = ClassifyAudioHandler(caseContext,
                                                            clipIndex,
                                                            false);
diff --git a/source/use_case/kws_asr/src/UseCaseHandler.cc b/source/use_case/kws_asr/src/UseCaseHandler.cc
index d598de6..1e1a400 100644
--- a/source/use_case/kws_asr/src/UseCaseHandler.cc
+++ b/source/use_case/kws_asr/src/UseCaseHandler.cc
@@ -53,11 +53,10 @@
     /**
      * @brief           Presents kws inference results using the data presentation
      *                  object.
-     * @param[in]       platform    reference to the hal platform object
      * @param[in]       results     vector of classification results to be displayed
      * @return          true if successful, false otherwise
      **/
-    static bool PresentInferenceResult(hal_platform& platform, std::vector<arm::app::kws::KwsResult>& results);
+    static bool PresentInferenceResult(std::vector<arm::app::kws::KwsResult>& results);
 
     /**
      * @brief           Presents asr inference results using the data presentation
@@ -66,7 +65,7 @@
      * @param[in]       results     vector of classification results to be displayed
      * @return          true if successful, false otherwise
      **/
-    static bool PresentInferenceResult(hal_platform& platform, std::vector<arm::app::asr::AsrResult>& results);
+    static bool PresentInferenceResult(std::vector<arm::app::asr::AsrResult>& results);
 
     /**
      * @brief Returns a function to perform feature calculation and populates input tensor data with
@@ -186,9 +185,8 @@
         std::vector<arm::app::kws::KwsResult> kwsResults;
 
         /* Display message on the LCD - inference running. */
-        auto& platform = ctx.Get<hal_platform&>("platform");
         std::string str_inf{"Running KWS inference... "};
-        platform.data_psn->present_data_text(
+        hal_lcd_display_text(
                             str_inf.c_str(), str_inf.size(),
                             dataPsnTxtInfStartX, dataPsnTxtInfStartY, false);
 
@@ -258,11 +256,11 @@
 
         /* Erase. */
         str_inf = std::string(str_inf.size(), ' ');
-        platform.data_psn->present_data_text(
+        hal_lcd_display_text(
                             str_inf.c_str(), str_inf.size(),
                             dataPsnTxtInfStartX, dataPsnTxtInfStartY, false);
 
-        if (!PresentInferenceResult(platform, kwsResults)) {
+        if (!PresentInferenceResult(kwsResults)) {
             return output;
         }
 
@@ -285,8 +283,7 @@
         constexpr uint32_t dataPsnTxtInfStartY = 40;
 
         auto& profiler = ctx.Get<Profiler&>("profiler");
-        auto& platform = ctx.Get<hal_platform&>("platform");
-        platform.data_psn->clear(COLOR_BLACK);
+        hal_lcd_clear(COLOR_BLACK);
 
         /* Get model reference. */
         auto& asrModel = ctx.Get<Model&>("asrmodel");
@@ -356,7 +353,7 @@
 
         /* Display message on the LCD - inference running. */
         std::string str_inf{"Running ASR inference... "};
-        platform.data_psn->present_data_text(
+        hal_lcd_display_text(
                 str_inf.c_str(), str_inf.size(),
                 dataPsnTxtInfStartX, dataPsnTxtInfStartY, false);
 
@@ -407,11 +404,11 @@
 
             /* Erase */
             str_inf = std::string(str_inf.size(), ' ');
-            platform.data_psn->present_data_text(
+            hal_lcd_display_text(
                         str_inf.c_str(), str_inf.size(),
                         dataPsnTxtInfStartX, dataPsnTxtInfStartY, false);
         }
-        if (!PresentInferenceResult(platform, asrResults)) {
+        if (!PresentInferenceResult(asrResults)) {
             return false;
         }
 
@@ -423,8 +420,7 @@
     /* Audio inference classification handler. */
     bool ClassifyAudioHandler(ApplicationContext& ctx, uint32_t clipIndex, bool runAll)
     {
-        auto& platform = ctx.Get<hal_platform&>("platform");
-        platform.data_psn->clear(COLOR_BLACK);
+        hal_lcd_clear(COLOR_BLACK);
 
         /* If the request has a valid size, set the audio index. */
         if (clipIndex < NUMBER_OF_FILES) {
@@ -457,14 +453,13 @@
     }
 
 
-    static bool PresentInferenceResult(hal_platform& platform,
-                                       std::vector<arm::app::kws::KwsResult>& results)
+    static bool PresentInferenceResult(std::vector<arm::app::kws::KwsResult>& results)
     {
         constexpr uint32_t dataPsnTxtStartX1 = 20;
         constexpr uint32_t dataPsnTxtStartY1 = 30;
         constexpr uint32_t dataPsnTxtYIncr   = 16;  /* Row index increment. */
 
-        platform.data_psn->set_text_color(COLOR_GREEN);
+        hal_lcd_set_text_color(COLOR_GREEN);
 
         /* Display each result. */
         uint32_t rowIdx1 = dataPsnTxtStartY1 + 2 * dataPsnTxtYIncr;
@@ -484,7 +479,7 @@
                     std::string{"s: "} + topKeyword + std::string{" ("} +
                     std::to_string(static_cast<int>(score * 100)) + std::string{"%)"};
 
-            platform.data_psn->present_data_text(
+            hal_lcd_display_text(
                         resultStr.c_str(), resultStr.size(),
                         dataPsnTxtStartX1, rowIdx1, 0);
             rowIdx1 += dataPsnTxtYIncr;
@@ -502,13 +497,13 @@
         return true;
     }
 
-    static bool PresentInferenceResult(hal_platform& platform, std::vector<arm::app::asr::AsrResult>& results)
+    static bool PresentInferenceResult(std::vector<arm::app::asr::AsrResult>& results)
     {
         constexpr uint32_t dataPsnTxtStartX1 = 20;
         constexpr uint32_t dataPsnTxtStartY1 = 80;
         constexpr bool allow_multiple_lines = true;
 
-        platform.data_psn->set_text_color(COLOR_GREEN);
+        hal_lcd_set_text_color(COLOR_GREEN);
 
         /* Results from multiple inferences should be combined before processing. */
         std::vector<arm::app::ClassificationResult> combinedResults;
@@ -528,7 +523,7 @@
 
         std::string finalResultStr = audio::asr::DecodeOutput(combinedResults);
 
-        platform.data_psn->present_data_text(
+        hal_lcd_display_text(
                     finalResultStr.c_str(), finalResultStr.size(),
                     dataPsnTxtStartX1, dataPsnTxtStartY1, allow_multiple_lines);
 
diff --git a/source/use_case/noise_reduction/src/MainLoop.cc b/source/use_case/noise_reduction/src/MainLoop.cc
index c6214e3..bcaff6d 100644
--- a/source/use_case/noise_reduction/src/MainLoop.cc
+++ b/source/use_case/noise_reduction/src/MainLoop.cc
@@ -98,7 +98,7 @@
 
         if (bUseMenu) {
             DisplayMenu();
-            menuOption = arm::app::ReadUserInputAsInt(platform);
+            menuOption = arm::app::ReadUserInputAsInt();
             printf("\n");
         }
         switch (menuOption) {
@@ -108,7 +108,7 @@
             case MENU_OPT_RUN_INF_CHOSEN: {
                 printf("    Enter the audio clip IFM index [0, %d]: ", NUMBER_OF_FILES-1);
                 fflush(stdout);
-                auto clipIndex = static_cast<uint32_t>(arm::app::ReadUserInputAsInt(platform));
+                auto clipIndex = static_cast<uint32_t>(arm::app::ReadUserInputAsInt());
                 SetAppCtxClipIdx(caseContext, clipIndex);
                 executionSuccessful = NoiseReductionHandler(caseContext, false);
                 break;
diff --git a/source/use_case/noise_reduction/src/UseCaseHandler.cc b/source/use_case/noise_reduction/src/UseCaseHandler.cc
index 792b460..acb8ba7 100644
--- a/source/use_case/noise_reduction/src/UseCaseHandler.cc
+++ b/source/use_case/noise_reduction/src/UseCaseHandler.cc
@@ -64,8 +64,6 @@
             pMemDumpBytesWritten = ctx.Get<size_t*>("MEM_DUMP_BYTE_WRITTEN");
         }
         std::reference_wrapper<size_t> memDumpBytesWritten = std::ref(*pMemDumpBytesWritten);
-
-        auto& platform = ctx.Get<hal_platform&>("platform");
         auto& profiler = ctx.Get<Profiler&>("profiler");
 
         /* Get model reference. */
@@ -106,7 +104,7 @@
             audioFileAccessorFunc = ctx.Get<std::function<const char*(const uint32_t)>>("featureFileNames");
         }
         do{
-            platform.data_psn->clear(COLOR_BLACK);
+            hal_lcd_clear(COLOR_BLACK);
 
             auto startDumpAddress = memDumpBaseAddr + memDumpBytesWritten;
             auto currentIndex = ctx.Get<uint32_t>("clipIndex");
@@ -158,7 +156,7 @@
                 std::string str_inf{"Running inference... "};
 
                 /* Display message on the LCD - inference running. */
-                platform.data_psn->present_data_text(
+                hal_lcd_display_text(
                             str_inf.c_str(), str_inf.size(),
                             dataPsnTxtInfStartX, dataPsnTxtInfStartY, false);
 
@@ -191,7 +189,7 @@
 
                 /* Erase. */
                 str_inf = std::string(str_inf.size(), ' ');
-                platform.data_psn->present_data_text(
+                hal_lcd_display_text(
                                 str_inf.c_str(), str_inf.size(),
                                 dataPsnTxtInfStartX, dataPsnTxtInfStartY, false);
 
@@ -218,14 +216,14 @@
             IncrementAppCtxClipIdx(ctx);
 
             std::string clearString{' '};
-            platform.data_psn->present_data_text(
+            hal_lcd_display_text(
                     clearString.c_str(), clearString.size(),
                     dataPsnTxtInfStartX, dataPsnTxtInfStartY, false);
 
             std::string completeMsg{"Inference complete!"};
 
             /* Display message on the LCD - inference complete. */
-            platform.data_psn->present_data_text(
+            hal_lcd_display_text(
                     completeMsg.c_str(), completeMsg.size(),
                     dataPsnTxtInfStartX, dataPsnTxtInfStartY, false);
 
diff --git a/source/use_case/object_detection/src/MainLoop.cc b/source/use_case/object_detection/src/MainLoop.cc
index 4bec357..0f98c8a 100644
--- a/source/use_case/object_detection/src/MainLoop.cc
+++ b/source/use_case/object_detection/src/MainLoop.cc
@@ -67,7 +67,7 @@
         int menuOption = common::MENU_OPT_RUN_INF_NEXT;
         if (bUseMenu) {
             DisplayDetectionMenu();
-            menuOption = arm::app::ReadUserInputAsInt(platform);
+            menuOption = arm::app::ReadUserInputAsInt();
             printf("\n");
         }
         switch (menuOption) {
@@ -77,7 +77,7 @@
             case common::MENU_OPT_RUN_INF_CHOSEN: {
                 printf("    Enter the image index [0, %d]: ", NUMBER_OF_FILES-1);
                 fflush(stdout);
-                auto imgIndex = static_cast<uint32_t>(arm::app::ReadUserInputAsInt(platform));
+                auto imgIndex = static_cast<uint32_t>(arm::app::ReadUserInputAsInt());
                 executionSuccessful = ObjectDetectionHandler(caseContext, imgIndex, false);
                 break;
             }
diff --git a/source/use_case/object_detection/src/UseCaseHandler.cc b/source/use_case/object_detection/src/UseCaseHandler.cc
index 27d767d..f3b317e 100644
--- a/source/use_case/object_detection/src/UseCaseHandler.cc
+++ b/source/use_case/object_detection/src/UseCaseHandler.cc
@@ -30,31 +30,27 @@
     /**
      * @brief           Presents inference results along using the data presentation
      *                  object.
-     * @param[in]       platform           Reference to the hal platform object.
      * @param[in]       results            Vector of detection results to be displayed.
      * @return          true if successful, false otherwise.
      **/
-    static bool PresentInferenceResult(hal_platform& platform,
-                                       const std::vector<arm::app::object_detection::DetectionResult>& results);
+    static bool PresentInferenceResult(const std::vector<arm::app::object_detection::DetectionResult>& results);
 
     /**
      * @brief           Draw boxes directly on the LCD for all detected objects.
-     * @param[in]       platform           Reference to the hal platform object.
      * @param[in]       results            Vector of detection results to be displayed.
      * @param[in]       imageStartX        X coordinate where the image starts on the LCD.
      * @param[in]       imageStartY        Y coordinate where the image starts on the LCD.
      * @param[in]       imgDownscaleFactor How much image has been downscaled on LCD.
      **/
-    static void DrawDetectionBoxes(hal_platform& platform,
-                                   const std::vector<arm::app::object_detection::DetectionResult>& results,
-                                   uint32_t imgStartX,
-                                   uint32_t imgStartY,
-                                   uint32_t imgDownscaleFactor);
+    static void DrawDetectionBoxes(
+            const std::vector<arm::app::object_detection::DetectionResult>& results,
+           uint32_t imgStartX,
+           uint32_t imgStartY,
+           uint32_t imgDownscaleFactor);
 
     /* Object detection classification handler. */
     bool ObjectDetectionHandler(ApplicationContext& ctx, uint32_t imgIndex, bool runAll)
     {
-        auto& platform = ctx.Get<hal_platform&>("platform");
         auto& profiler = ctx.Get<Profiler&>("profiler");
 
         constexpr uint32_t dataPsnImgDownscaleFactor = 1;
@@ -64,7 +60,7 @@
         constexpr uint32_t dataPsnTxtInfStartX = 150;
         constexpr uint32_t dataPsnTxtInfStartY = 40;
 
-        platform.data_psn->clear(COLOR_BLACK);
+        hal_lcd_clear(COLOR_BLACK);
 
         auto& model = ctx.Get<Model&>("model");
 
@@ -114,7 +110,7 @@
             image::RgbToGrayscale(curr_image, dstPtr, copySz);
 
             /* Display image on the LCD. */
-            platform.data_psn->present_data_image(
+            hal_lcd_display_image(
                 (channelsImageDisplayed == 3) ? curr_image : dstPtr,
                 nCols, nRows, channelsImageDisplayed,
                 dataPsnImgStartX, dataPsnImgStartY, dataPsnImgDownscaleFactor);
@@ -125,7 +121,7 @@
             }
 
             /* Display message on the LCD - inference running. */
-            platform.data_psn->present_data_text(str_inf.c_str(), str_inf.size(),
+            hal_lcd_display_text(str_inf.c_str(), str_inf.size(),
                                     dataPsnTxtInfStartX, dataPsnTxtInfStartY, false);
 
             /* Run inference over this image. */
@@ -138,7 +134,7 @@
 
             /* Erase. */
             str_inf = std::string(str_inf.size(), ' ');
-            platform.data_psn->present_data_text(str_inf.c_str(), str_inf.size(),
+            hal_lcd_display_text(str_inf.c_str(), str_inf.size(),
                                     dataPsnTxtInfStartX, dataPsnTxtInfStartY, false);
 
             /* Detector post-processing*/
@@ -153,14 +149,14 @@
                 results);
 
             /* Draw boxes. */
-            DrawDetectionBoxes(platform, results, dataPsnImgStartX, dataPsnImgStartY, dataPsnImgDownscaleFactor);
+            DrawDetectionBoxes(results, dataPsnImgStartX, dataPsnImgStartY, dataPsnImgDownscaleFactor);
 
 #if VERIFY_TEST_OUTPUT
             arm::app::DumpTensor(modelOutput0);
             arm::app::DumpTensor(modelOutput1);
 #endif /* VERIFY_TEST_OUTPUT */
 
-            if (!PresentInferenceResult(platform, results)) {
+            if (!PresentInferenceResult(results)) {
                 return false;
             }
 
@@ -173,11 +169,9 @@
         return true;
     }
 
-
-    static bool PresentInferenceResult(hal_platform& platform,
-                                       const std::vector<arm::app::object_detection::DetectionResult>& results)
+    static bool PresentInferenceResult(const std::vector<arm::app::object_detection::DetectionResult>& results)
     {
-        platform.data_psn->set_text_color(COLOR_GREEN);
+        hal_lcd_set_text_color(COLOR_GREEN);
 
         /* If profiling is enabled, and the time is valid. */
         info("Final results:\n");
@@ -192,8 +186,7 @@
         return true;
     }
 
-    static void DrawDetectionBoxes(hal_platform& platform,
-                                   const std::vector<arm::app::object_detection::DetectionResult>& results,
+    static void DrawDetectionBoxes(const std::vector<arm::app::object_detection::DetectionResult>& results,
                                    uint32_t imgStartX,
                                    uint32_t imgStartY,
                                    uint32_t imgDownscaleFactor)
@@ -202,20 +195,20 @@
 
         for (const auto& result: results) {
             /* Top line. */
-            platform.data_psn->present_box(imgStartX + result.m_x0/imgDownscaleFactor,
+            hal_lcd_display_box(imgStartX + result.m_x0/imgDownscaleFactor,
                     imgStartY + result.m_y0/imgDownscaleFactor,
                     result.m_w/imgDownscaleFactor, lineThickness, COLOR_GREEN);
             /* Bot line. */
-            platform.data_psn->present_box(imgStartX + result.m_x0/imgDownscaleFactor,
+            hal_lcd_display_box(imgStartX + result.m_x0/imgDownscaleFactor,
                     imgStartY + (result.m_y0 + result.m_h)/imgDownscaleFactor - lineThickness,
                     result.m_w/imgDownscaleFactor, lineThickness, COLOR_GREEN);
 
             /* Left line. */
-            platform.data_psn->present_box(imgStartX + result.m_x0/imgDownscaleFactor,
+            hal_lcd_display_box(imgStartX + result.m_x0/imgDownscaleFactor,
                     imgStartY + result.m_y0/imgDownscaleFactor,
                     lineThickness, result.m_h/imgDownscaleFactor, COLOR_GREEN);
             /* Right line. */
-            platform.data_psn->present_box(imgStartX + (result.m_x0 + result.m_w)/imgDownscaleFactor - lineThickness,
+            hal_lcd_display_box(imgStartX + (result.m_x0 + result.m_w)/imgDownscaleFactor - lineThickness,
                     imgStartY + result.m_y0/imgDownscaleFactor,
                     lineThickness, result.m_h/imgDownscaleFactor, COLOR_GREEN);
         }
diff --git a/source/use_case/vww/src/MainLoop.cc b/source/use_case/vww/src/MainLoop.cc
index 30e85bf..03d6196 100644
--- a/source/use_case/vww/src/MainLoop.cc
+++ b/source/use_case/vww/src/MainLoop.cc
@@ -58,7 +58,7 @@
         int menuOption = common::MENU_OPT_RUN_INF_NEXT;
         if (bUseMenu) { 
             DisplayCommonMenu();
-            menuOption = arm::app::ReadUserInputAsInt(platform);
+            menuOption = arm::app::ReadUserInputAsInt();
             printf("\n");
         }
 
@@ -69,7 +69,7 @@
             case common::MENU_OPT_RUN_INF_CHOSEN: {
                 printf("    Enter the image index [0, %d]: ", NUMBER_OF_FILES-1);
                 fflush(stdout);
-                auto imgIndex = static_cast<uint32_t>(arm::app::ReadUserInputAsInt(platform));
+                auto imgIndex = static_cast<uint32_t>(arm::app::ReadUserInputAsInt());
                 executionSuccessful = ClassifyImageHandler(caseContext, imgIndex, false);
                 break;
             }
diff --git a/source/use_case/vww/src/UseCaseHandler.cc b/source/use_case/vww/src/UseCaseHandler.cc
index a47f191..56ba2b5 100644
--- a/source/use_case/vww/src/UseCaseHandler.cc
+++ b/source/use_case/vww/src/UseCaseHandler.cc
@@ -42,7 +42,6 @@
     /* Image inference classification handler. */
     bool ClassifyImageHandler(ApplicationContext &ctx, uint32_t imgIndex, bool runAll)
     {
-        auto& platform = ctx.Get<hal_platform &>("platform");
         auto& profiler = ctx.Get<Profiler&>("profiler");
 
         constexpr uint32_t dataPsnImgDownscaleFactor = 1;
@@ -89,7 +88,7 @@
         std::vector<ClassificationResult> results;
 
         do {
-            platform.data_psn->clear(COLOR_BLACK);
+            hal_lcd_clear(COLOR_BLACK);
 
             /* Strings for presentation/logging. */
             std::string str_inf{"Running inference... "};
@@ -98,7 +97,7 @@
             LoadImageIntoTensor(ctx.Get<uint32_t>("imgIndex"), inputTensor);
 
             /* Display this image on the LCD. */
-            platform.data_psn->present_data_image(
+            hal_lcd_display_image(
                 static_cast<uint8_t *>(inputTensor->data.data),
                 nCols, nRows, nChannels,
                 dataPsnImgStartX, dataPsnImgStartY, dataPsnImgDownscaleFactor);
@@ -115,7 +114,7 @@
             }
 
             /* Display message on the LCD - inference running. */
-            platform.data_psn->present_data_text(
+            hal_lcd_display_text(
                                 str_inf.c_str(), str_inf.size(),
                                 dataPsnTxtInfStartX, dataPsnTxtInfStartY, 0);
 
@@ -129,7 +128,7 @@
 
             /* Erase. */
             str_inf = std::string(str_inf.size(), ' ');
-            platform.data_psn->present_data_text(
+            hal_lcd_display_text(
                                 str_inf.c_str(), str_inf.size(),
                                 dataPsnTxtInfStartX, dataPsnTxtInfStartY, 0);
 
@@ -145,7 +144,7 @@
             arm::app::DumpTensor(outputTensor);
 #endif /* VERIFY_TEST_OUTPUT */
 
-            if (!PresentInferenceResult(platform, results)) {
+            if (!PresentInferenceResult(results)) {
                 return false;
             }
 
diff --git a/tests/common/ProfilerTests.cc b/tests/common/ProfilerTests.cc
index 1435dde..889e2f2 100644
--- a/tests/common/ProfilerTests.cc
+++ b/tests/common/ProfilerTests.cc
@@ -26,12 +26,10 @@
 TEST_CASE("Common: Test Profiler")
 {
     hal_platform    platform;
-    data_acq_module data_acq {};
-    data_psn_module data_psn {};
     platform_timer  timer {};
 
     /* Initialise the HAL and platform. */
-    hal_init(&platform, &data_acq, &data_psn, &timer);
+    hal_init(&platform, &timer);
     hal_platform_init(&platform);
 
     /* An invalid profiler shouldn't be of much use */
diff --git a/tests/use_case/img_class/ImgClassificationUCTest.cc b/tests/use_case/img_class/ImgClassificationUCTest.cc
index b989415..62d8eb8 100644
--- a/tests/use_case/img_class/ImgClassificationUCTest.cc
+++ b/tests/use_case/img_class/ImgClassificationUCTest.cc
@@ -44,12 +44,10 @@
 TEST_CASE("Inference by index", "[.]")
 {
     hal_platform    platform;
-    data_acq_module data_acq;
-    data_psn_module data_psn;
     platform_timer  timer;
 
     /* Initialise the HAL and platform. */
-    hal_init(&platform, &data_acq, &data_psn, &timer);
+    hal_init(&platform, &timer);
     hal_platform_init(&platform);
 
     /* Model wrapper object. */
@@ -84,12 +82,10 @@
 TEST_CASE("Inference run all images", "[.]")
 {
     hal_platform    platform;
-    data_acq_module data_acq;
-    data_psn_module data_psn;
     platform_timer  timer;
 
     /* Initialise the HAL and platform. */
-    hal_init(&platform, &data_acq, &data_psn, &timer);
+    hal_init(&platform, &timer);
     hal_platform_init(&platform);
 
     /* Model wrapper object. */
@@ -120,12 +116,10 @@
 TEST_CASE("List all images")
 {
     hal_platform    platform;
-    data_acq_module data_acq;
-    data_psn_module data_psn;
     platform_timer  timer;
 
     /* Initialise the HAL and platform. */
-    hal_init(&platform, &data_acq, &data_psn, &timer);
+    hal_init(&platform, &timer);
     hal_platform_init(&platform);
 
     /* Model wrapper object. */
diff --git a/tests/use_case/kws/KWSHandlerTest.cc b/tests/use_case/kws/KWSHandlerTest.cc
index a7e75fb..3013611 100644
--- a/tests/use_case/kws/KWSHandlerTest.cc
+++ b/tests/use_case/kws/KWSHandlerTest.cc
@@ -44,12 +44,10 @@
 TEST_CASE("Inference by index")
 {
     hal_platform    platform;
-    data_acq_module data_acq;
-    data_psn_module data_psn;
     platform_timer  timer;
 
     /* Initialise the HAL and platform. */
-    hal_init(&platform, &data_acq, &data_psn, &timer);
+    hal_init(&platform, &timer);
     hal_platform_init(&platform);
 
     /* Model wrapper object. */
@@ -123,12 +121,10 @@
 TEST_CASE("Inference run all clips")
 {
     hal_platform    platform;
-    data_acq_module data_acq;
-    data_psn_module data_psn;
     platform_timer  timer;
 
     /* Initialise the HAL and platform. */
-    hal_init(&platform, &data_acq, &data_psn, &timer);
+    hal_init(&platform, &timer);
     hal_platform_init(&platform);
 
     /* Model wrapper object. */
@@ -161,12 +157,10 @@
 TEST_CASE("List all audio clips")
 {
     hal_platform    platform;
-    data_acq_module data_acq;
-    data_psn_module data_psn;
     platform_timer  timer;
 
     /* Initialise the HAL and platform. */
-    hal_init(&platform, &data_acq, &data_psn, &timer);
+    hal_init(&platform, &timer);
     hal_platform_init(&platform);
 
     /* Model wrapper object. */
diff --git a/tests/use_case/noise_reduction/RNNNoiseUCTests.cc b/tests/use_case/noise_reduction/RNNNoiseUCTests.cc
index c2b7ffb..a376dd5 100644
--- a/tests/use_case/noise_reduction/RNNNoiseUCTests.cc
+++ b/tests/use_case/noise_reduction/RNNNoiseUCTests.cc
@@ -26,10 +26,8 @@
 
 #define PLATFORM \
 hal_platform    platform; \
-data_acq_module data_acq; \
-data_psn_module data_psn; \
 platform_timer  timer;    \
-hal_init(&platform, &data_acq, &data_psn, &timer); \
+hal_init(&platform, &timer); \
 hal_platform_init(&platform);
 
 #define CONTEXT \
diff --git a/tests/use_case/object_detection/ObjectDetectionUCTest.cc b/tests/use_case/object_detection/ObjectDetectionUCTest.cc
index 2e63f36..79e76bd 100644
--- a/tests/use_case/object_detection/ObjectDetectionUCTest.cc
+++ b/tests/use_case/object_detection/ObjectDetectionUCTest.cc
@@ -43,12 +43,10 @@
 TEST_CASE("Inference by index")
 {
     hal_platform    platform;
-    data_acq_module data_acq;
-    data_psn_module data_psn;
     platform_timer  timer;
 
     /* Initialise the HAL and platform. */
-    hal_init(&platform, &data_acq, &data_psn, &timer);
+    hal_init(&platform, &timer);
     hal_platform_init(&platform);
 
     /* Model wrapper object. */
@@ -75,12 +73,10 @@
 TEST_CASE("Inference run all images")
 {
     hal_platform    platform;
-    data_acq_module data_acq;
-    data_psn_module data_psn;
     platform_timer  timer;
 
     /* Initialise the HAL and platform. */
-    hal_init(&platform, &data_acq, &data_psn, &timer);
+    hal_init(&platform, &timer);
     hal_platform_init(&platform);
 
     /* Model wrapper object. */
@@ -107,12 +103,10 @@
 TEST_CASE("List all images")
 {
     hal_platform    platform;
-    data_acq_module data_acq;
-    data_psn_module data_psn;
     platform_timer  timer;
 
     /* Initialise the HAL and platform. */
-    hal_init(&platform, &data_acq, &data_psn, &timer);
+    hal_init(&platform, &timer);
     hal_platform_init(&platform);
 
     /* Model wrapper object. */
diff --git a/tests/use_case/vww/VisualWakeWordUCTests.cc b/tests/use_case/vww/VisualWakeWordUCTests.cc
index 700a6bb..16bd5a6 100644
--- a/tests/use_case/vww/VisualWakeWordUCTests.cc
+++ b/tests/use_case/vww/VisualWakeWordUCTests.cc
@@ -42,12 +42,10 @@
 TEST_CASE("Inference by index")
 {
     hal_platform    platform;
-    data_acq_module data_acq;
-    data_psn_module data_psn;
     platform_timer  timer;
 
     /* Initialise the HAL and platform */
-    hal_init(&platform, &data_acq, &data_psn, &timer);
+    hal_init(&platform, &timer);
     hal_platform_init(&platform);
 
     arm::app::VisualWakeWordModel model;    /* model wrapper object */
@@ -79,12 +77,10 @@
 TEST_CASE("Inference run all images")
 {
     hal_platform    platform;
-    data_acq_module data_acq;
-    data_psn_module data_psn;
     platform_timer  timer;
 
     /* Initialise the HAL and platform */
-    hal_init(&platform, &data_acq, &data_psn, &timer);
+    hal_init(&platform, &timer);
     hal_platform_init(&platform);
 
     arm::app::VisualWakeWordModel model;    /* model wrapper object */
@@ -112,12 +108,10 @@
 TEST_CASE("List all images")
 {
     hal_platform    platform;
-    data_acq_module data_acq;
-    data_psn_module data_psn;
     platform_timer  timer;
 
     /* Initialise the HAL and platform */
-    hal_init(&platform, &data_acq, &data_psn, &timer);
+    hal_init(&platform, &timer);
     hal_platform_init(&platform);
 
     arm::app::VisualWakeWordModel model;    /* model wrapper object */