Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
63 commits
Select commit Hold shift + click to select a range
20419f2
Implemented DeviceSettings plugin with modular component handlers for…
MadhusuthananRavi Jun 12, 2026
01dcf97
RDKEMW-6176: Avioded empty spaces
MadhusuthananRavi Jun 15, 2026
611bf32
RDKEMW-6176: Added build setup and configuration files.
MadhusuthananRavi Jun 15, 2026
b94fe51
RDKEMW-6176: Modified DeviceSettings Plugin code according to latest …
MadhusuthananRavi Jun 15, 2026
f605382
RDKEMW-6176: Modified DeviceSettings Plugin code according to review …
MadhusuthananRavi Jun 15, 2026
14575a6
RDKEMW-6176: Modified DeviceSettings Plugin code according to CI rev…
MadhusuthananRavi Jun 15, 2026
10598ed
RDKEMW-6176: Modified DeviceSettings Plugin code according to CI revi…
MadhusuthananRavi Jun 15, 2026
cef0fe1
RDKEMW-6176: Modified DeviceSettings Plugin code according to CI revi…
MadhusuthananRavi Jun 16, 2026
5866659
RDKEMW-6176: Removed all the devicesettings library reference from en…
MadhusuthananRavi Jun 18, 2026
dcd1078
RDKEMW-6176: Removed all the devicesettings library reference from en…
MadhusuthananRavi Jun 18, 2026
1a87e47
RDKEMW-6176: Removed all the devicesettings config files into entserv…
MadhusuthananRavi Jun 23, 2026
b465cc4
RDKEMW-6176: Removed the helper folder in entservices-devicesettings…
MadhusuthananRavi Jun 24, 2026
def977b
RDKEMW-6176: Removed all the unwanted include headers and dscontrolle…
MadhusuthananRavi Jun 25, 2026
1f6a5ed
RDKEMW-6176: Added native builds and L1-tests configuration details
MadhusuthananRavi Jun 25, 2026
dabd274
RDKEMW-6176: Added native builds and L1-tests configuration details
MadhusuthananRavi Jun 25, 2026
8b7150d
RDKEMW-6176: Added native builds and L1-tests configuration details
MadhusuthananRavi Jun 28, 2026
924f8b6
RDKEMW-6176: Added native builds and L1-tests configuration details
MadhusuthananRavi Jun 28, 2026
2a679c5
RDKEMW-6176: Added VideoPort Component resolution static configuratio…
MadhusuthananRavi Jun 28, 2026
2b5a80f
RDKEMW-6176: Removed unwanted commented codes
MadhusuthananRavi Jun 28, 2026
2c43a72
RDKEMW-6176: Helper file from entservices-helpers is renamed.
MadhusuthananRavi Jul 1, 2026
b42ca70
RDKEMW-6176: Modified devicesettings plugin according to entservices-…
MadhusuthananRavi Jul 6, 2026
997e410
Resolved the HDMI_HOT_PLUG event notifications not received from
Jul 8, 2026
ac9cb98
RDKEMW-6176: Duplicate struct HDMIVideoPortResolution is removed from…
MadhusuthananRavi Jul 8, 2026
86e26a3
RDKEMW-6176: Unable to refer from VideoPort interface file so revert…
MadhusuthananRavi Jul 8, 2026
c9b0726
RDKEMW-6176: Modified DSController IARM initialisation name.
MadhusuthananRavi Jul 9, 2026
26c44e0
RDKEMW-6176: Modified devicesettings plugin according to entservices-…
MadhusuthananRavi Jul 10, 2026
6178649
RDKEMW-6176: Solved Bootup crash issue
MadhusuthananRavi Jul 10, 2026
03fc9f1
RDKEMW-6176: Solved Bootup issue in entservices-devicesettings
MadhusuthananRavi Jul 10, 2026
dba6634
RDKEMW-6176: Implemented Host Persistence store for the missing metho…
MadhusuthananRavi Jul 11, 2026
e4c9c6d
RDKEMW-6176: Modified default persistence storage path
MadhusuthananRavi Jul 11, 2026
fdd038b
RDKEMW-6176: Implemented the GetAudioMS12ProfileList method
MadhusuthananRavi Jul 12, 2026
a416e68
RDKEMW-6176: Added debug logs in device::HostPersistence
MadhusuthananRavi Jul 12, 2026
e5de229
RDKEMW-6176: HostPersistence getProperty failure issue solved
MadhusuthananRavi Jul 12, 2026
5346313
RDKEMW-6176: HdmiInStatus issue solved
MadhusuthananRavi Jul 15, 2026
d719be4
RDKEMW-6176: HdmiInStatus issue solved
MadhusuthananRavi Jul 15, 2026
5cf0e39
RDKEMW-6176: Update vector based config loading
yuvaramachandran-gurusamy Jul 15, 2026
6fe2595
RDKEMW-6176: Fix Build Error
yuvaramachandran-gurusamy Jul 16, 2026
429a740
RDKEMW-6176: Modified resolution conversion method and added missing…
MadhusuthananRavi Jul 17, 2026
4b83faf
RDKEMW-6176: Modified entservices-devicesettings code according to th…
MadhusuthananRavi Jul 19, 2026
30c5761
Added bootup initialization time decrease changes
MadhusuthananRavi Jul 21, 2026
4ef845b
RDKEMW-6176: Removed unwanted config methods from entservices-devices…
MadhusuthananRavi Jul 21, 2026
971b436
RDKEMW-6176: Plugin Initialization time decrease code
MadhusuthananRavi Jul 27, 2026
00cefd2
Revert "RDKEMW-6176: Plugin Initialization time decrease code"
MadhusuthananRavi Jul 27, 2026
be4ed0c
Revert "Added bootup initialization time decrease changes"
MadhusuthananRavi Jul 27, 2026
10158de
Bootup time optimization
MadhusuthananRavi Jul 27, 2026
89cf313
thread issue
MadhusuthananRavi Jul 27, 2026
343df61
Bootup time optimization
MadhusuthananRavi Jul 28, 2026
ce5070b
RDKEMW-6176: Bootup time optimization
MadhusuthananRavi Jul 28, 2026
61aea5a
RDKEMW-6176: Removed unused config methods
MadhusuthananRavi Jul 28, 2026
95cc30e
RDKEMW-6176: Solved runtime error
MadhusuthananRavi Jul 29, 2026
872352c
RDKEMW-6176: Solved runtime error
MadhusuthananRavi Jul 29, 2026
e19fec1
RDKEMW-6176: Enabled DS_AUDIO_SETTINGS_PERSISTENCE flag
MadhusuthananRavi Jul 29, 2026
ab8dbfe
RDKEMW-6176: Removed devicesettings library linkage in entservices-de…
MadhusuthananRavi Jul 29, 2026
56f5a2b
RDKEMW-6176: Removed default value return in methods and added proper…
MadhusuthananRavi Jul 30, 2026
c67d36c
RDKEMW-6176: Added changes to solve resolution fix
MadhusuthananRavi Jul 30, 2026
35e7823
RDKEMW-6176: Added changes to solve the bootup logo issue
MadhusuthananRavi Jul 31, 2026
4408fe6
RDKEMW-6176: Added changes to solve resolution fix
MadhusuthananRavi Aug 2, 2026
818dbda
RDKEMW-6176: Added changes to solve resolution fix
MadhusuthananRavi Aug 2, 2026
b152a85
RDKEMW-6176: Modified dsFPInit() as lazy initialisation as per IARM …
MadhusuthananRavi Aug 3, 2026
93044e8
RDKEMW-6176: Removed deprecated methods and event from IDeviceSetting…
MadhusuthananRavi Aug 3, 2026
894980e
RDKEMW-6176: avioded bootup LED setstate based on condition
MadhusuthananRavi Aug 5, 2026
11bfd49
RDKEMW-6176: avioded bootup LED setstate based on condition
MadhusuthananRavi Aug 5, 2026
e3d43d4
RDKEMW-6176: Modified GetFPDBrightness
MadhusuthananRavi Aug 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# These owners will be the default owners for everything in
# the repo. Unless a later match takes precedence,
# @global-owner1 and @global-owner2 will be requested for
# review when someone opens a pull request.
* @rdkcentral/entservices-maintainers
21 changes: 21 additions & 0 deletions .github/copilot-instructions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
### Review Comment Linking Guidelines

When writing review comments based on custom instructions located in .github/instructions/**.instructions.md, include a direct GitHub link to the exact violated guideline in the respective instruction file. Use the following format:

Refer: https://github.com/rdkcentral/entservices-devicesettings/blob/develop/.github/instructions/<instruction-file>.instructions.md#guideline-section-name

## Examples

Refer: https://github.com/rdkcentral/entservices-devicesettings/blob/develop/.github/instructions/Plugin.instructions.md#interface-implementation

Refer: https://github.com/rdkcentral/entservices-devicesettings/blob/develop/.github/instructions/Pluginlifecycle.instructions.md#deactivated

Refer: https://github.com/rdkcentral/entservices-devicesettings/blob/develop/.github/instructions/Pluginimplementation.instructions.md#inter-plugin-communication

Refer: https://github.com/rdkcentral/entservices-devicesettings/blob/develop/.github/instructions/Pluginmodule.instructions.md#module-name-convention

Refer: https://github.com/rdkcentral/entservices-devicesettings/blob/develop/.github/instructions/Pluginconfig.instructions.md#plugin-configuration

Refer: https://github.com/rdkcentral/entservices-devicesettings/blob/develop/.github/instructions/Plugincmake.instructions.md#namespace-usage

Refer: https://github.com/rdkcentral/entservices-devicesettings/blob/develop/.github/instructions/PluginOnboardingCompliance.instructions.md#coverity-scan-inclusion-and-test-workflow-updates-for-new-plugins
203 changes: 203 additions & 0 deletions .github/instructions/Plugin.instructions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,203 @@
---
description: Guidelines for C++ files and header files that share the same name as their parent folder.
applyTo: "**/*.cpp,**/*.h"
---

# Instructions summary
1. [Interface Implementation](https://github.com/rdkcentral/entservices-devicesettings/blob/develop/.github/instructions/Plugin.instructions.md#interface-implementation)
2. [Service Registration](https://github.com/rdkcentral/entservices-devicesettings/blob/develop/.github/instructions/Plugin.instructions.md#service-registration)
3. [JSON-RPC Stub Registration](https://github.com/rdkcentral/entservices-devicesettings/blob/develop/.github/instructions/Plugin.instructions.md#json-rpc-stub-registration)
4. [Handling Out-of-Process Plugin Failures](https://github.com/rdkcentral/entservices-devicesettings/blob/develop/.github/instructions/Plugin.instructions.md#handling-out-of-process-plugin-failures)

### Interface Implementation

### Requirement

Each plugin must implement the appropriate Thunder interfaces.

-> PluginHost::IPlugin – Mandatory for all plugins.

-> PluginHost::IDispatcher or derive from PluginHost::JSONRPC – Mandatory If the plugin handles JSON-RPC.

-> Custom interfaces (like IHdcpProfile for HdcpProfile plugin) must be added to ThunderInterfaces for RPC.

-> PluginHost::IWeb – If the plugin handles web requests.


### Example

```cpp
BEGIN_INTERFACE_MAP(HdcpProfile)
INTERFACE_ENTRY(PluginHost::IPlugin)
INTERFACE_ENTRY(PluginHost::IDispatcher)
INTERFACE_AGGREGATE(Exchange::IHdcpProfile, _hdcpProfile)
END_INTERFACE_MAP
```

### Service Registration

### Requirement

All Thunder services must be registered using the SERVICE_REGISTRATION macro with name, major, minor and patch versions of service. Register the service using the following macro:

```
SERVICE_REGISTRATION(ServiceName, MAJOR, MINOR, PATCH)
```

For better readability, it is always good to define the following plugin metadata which is not mandatory:

- **Precondition** - List of Thunder subsystems that must be active in order for the plugin to activate. This can also be set in Plugin.conf.in file.

- **Terminations** - List of Thunder subsystems that will cause the plugin to deactivate if they are marked inactive whilst the plugin is running.

- **Controls** - List of the subsystems that are controlled by the plugin.

### Example

```cpp
namespace WPEFramework {
namespace {
static Plugin::Metadata<Plugin::HdcpProfile> metadata(
API_VERSION_NUMBER_MAJOR,
API_VERSION_NUMBER_MINOR,
API_VERSION_NUMBER_PATCH,
{}, // Preconditions
{}, // Terminations
{} // Controls
);
}

namespace Plugin {
// Register HdcpProfile service with Thunder
SERVICE_REGISTRATION(HdcpProfile,API_VERSION_NUMBER_MAJOR,API_VERSION_NUMBER_MINOR,API_VERSION_NUMBER_PATCH);
}
}
```

### JSON-RPC Stub Registration

### Requirement

If the plugin includes <interfaces/IPluginName*.h>, <interfaces/JsonData_PluginName.h>, and <interfaces/JPluginName.h> and inherits from PluginHost::JsonRPC, then it provides JSON‑RPC support and uses autogenerated JSON‑RPC stubs.

These autogenerated stubs are the Exchange::J* C++ classes (for example, Exchange::JHdcpProfile and JsonData_HdcpProfile.h) that are produced by the Thunder JSON‑RPC code generator from the IPluginName* interface headers; they expose the C++ interface over JSON‑RPC so you do not have to call Register() for each method manually.

Plugins using autogenerated JSON-RPC stubs (Exchange::J* classes) must register and unregister them in Initialize() and Deinitialize() methods.It should not be done in constructor and destructor.

In Initialize():

```cpp
Exchange::JHdcpProfile::Register(*this, _hdcpProfile);
```

In Deinitialize():

```cpp
Exchange::JHdcpProfile::Unregister(*this);
```

It is strongly recommended to use the autogenerated JSON-RPC stubs rather than registering the json-rpc methods manually as below.

```cpp
RDKShell::RDKShell()
...
{
.....
Register(RDKSHELL_METHOD_MOVE_TO_FRONT, &RDKShell::moveToFrontWrapper, this);
Register(RDKSHELL_METHOD_MOVE_TO_BACK, &RDKShell::moveToBackWrapper, this);
...
}
```

### Handling Out-of-Process Plugin Failures

### Requirement

- If the plugin runs as out-of-process, then it should implement RPC::IRemoteConnection::INotification interface inside your plugin.

### Example

```cpp
class TestPlugin : public PluginHost::IPlugin, public PluginHost::JSONRPC {
private:
class Notification : public RPC::IRemoteConnection::INotification {
public:
explicit Notification(TestPlugin* parent)
: _parent(*parent)
{
ASSERT(parent != nullptr);
}

~Notification() override = default;

Notification(Notification&&) = delete;
Notification(const Notification&) = delete;
Notification& operator=(Notification&&) = delete;
Notification& operator=(const Notification&) = delete;

public:
void Activated(RPC::IRemoteConnection* /* connection */) override
{
}
void Deactivated(RPC::IRemoteConnection* connection) override
{
_parent.Deactivated(connection);
}

BEGIN_INTERFACE_MAP(Notification)
INTERFACE_ENTRY(RPC::IRemoteConnection::INotification)
END_INTERFACE_MAP

private:
TestPlugin& _parent;
};

public:
TestPlugin()
: _connectionId(0)
, _service(nullptr)
, _testPlugin(nullptr)
, _notification(this)
{
}
~TestPlugin() override = default;

TestPlugin(TestPlugin&&) = delete;
TestPlugin(const TestPlugin&) = delete;
TestPlugin& operator=(TestPlugin&&) = delete;
TestPlugin& operator=(const TestPlugin&) = delete;

BEGIN_INTERFACE_MAP(TestPlugin)
INTERFACE_ENTRY(PluginHost::IPlugin)
INTERFACE_ENTRY(PluginHost::IDispatcher)
INTERFACE_AGGREGATE(Exchange::ITestPlugin, _testPlugin)
END_INTERFACE_MAP

public:
// IPlugin methods
const string Initialize(PluginHost::IShell* service) override;
void Deinitialize(PluginHost::IShell* service) override;
string Information() const override;

private:
void Deactivated(RPC::IRemoteConnection* connection);

private:
uint32_t _connectionId;
PluginHost::IShell* _service;
Exchange::ITestPlugin* _testPlugin;
Core::Sink<Notification> _notification;
};
```

- It should be registered during Initialize() to get itself notified when the remote process connects or disconnects.

### Example

```cpp
const string TestPlugin::Initialize(PluginHost::IShell* service)
{
// Register for COM-RPC connection/disconnection notifications
_service->Register(&_notification);
}
```
67 changes: 67 additions & 0 deletions .github/instructions/PluginOnboardingCompliance.instructions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
---
applyTo: "CMakeLists.txt"
---

## Requirement

### Coverity Scan Inclusion and Test Workflow Updates for New Plugins

When adding a new plugin in `CMakeLists.txt`, you **must** also update the following to guarantee the plugin is included in all required test and Coverity analysis workflows:

- **CI Workflow Files:**
- `L1-tests.yml`
- `L2-tests.yml`
- `L2-tests-oop.yml`
- **Coverity Build Script:**
- `cov_build.sh`

**Example:**

1. **CMake Plugin Registration Example**

If you add your plugin in `CMakeLists.txt` as:
```cmake
if (PLUGIN_RESOURCEMANAGER)
add_subdirectory(ResourceManager)
endif()
if (PLUGIN_MY_NEW_PLUGIN)
add_subdirectory(MyNewPlugin)
endif()
```
2. **Update Coverity Build Script**

Add your plugin’s flag in the build command in `cov_build.sh`:
```bash
cmake \
-DPLUGIN_CORE=ON \
-DPLUGIN_LEGACY=ON \
# <-- NEW PLUGIN FLAG
-DPLUGIN_MY_NEW_PLUGIN=ON \
.
```
This ensures Coverity runs on your new plugin.

3. **Update Test Workflow YAMLs**

Ensure each test workflow references your new plugin using the **DPLUGIN_<PLUGINNAME>** CMake flag in their build/test step. For example, in `L1-tests.yml`:
```yaml
jobs:
build-test:
runs-on: ubuntu-22.04
steps:
- name: Configure with new plugin
run: |
cmake \
-DPLUGIN_CORE=ON \
-DPLUGIN_MY_NEW_PLUGIN=ON \
.
- name: Run tests
run: |
ctest
```
Repeat similar additions in `L2-tests.yml` and `L2-tests-oop.yml`.

**Summary:**
Whenever a new plugin is registered via `CMakeLists.txt`, always update:
- `cov_build.sh` (add plugin flag to Coverity scan build step)
- All test CI workflows (`L1-tests.yml`, `L2-tests.yml`, `L2-tests-oop.yml`) to include your plugin flag so that your plugin’s code quality and tests are assured!
43 changes: 43 additions & 0 deletions .github/instructions/Plugincmake.instructions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
---
applyTo: "**/CMakeLists.txt"
---

### NAMESPACE Usage

### Requirement

All CMake targets, install paths, export sets,find_package and references must use the ${NAMESPACE} variable instead of hardcoded framework names (e.g., WPEFrameworkCore, WPEFrameworkPlugins).
This ensures smooth upgrades (e.g., WPEFramework → Thunder) and prevents regressions.

### Correct Example

```cmake
set(MODULE_NAME ${NAMESPACE}${PLUGIN_NAME})

find_package(${NAMESPACE}Plugins REQUIRED)

find_package(${NAMESPACE}Definitions REQUIRED)

target_link_libraries(${MODULE_NAME}
PRIVATE
CompileSettingsDebug::CompileSettingsDebug
${NAMESPACE}Plugins::${NAMESPACE}Plugins
${NAMESPACE}Definitions::${NAMESPACE}Definitions)
```


### Incorrect Example

```cmake
set(MODULE_NAME WPEFramework${PLUGIN_NAME})

find_package(WPEFrameworkPlugins REQUIRED)

find_package(WPEFrameworkDefinitions REQUIRED)

target_link_libraries(${MODULE_NAME}
PRIVATE
CompileSettingsDebug::CompileSettingsDebug
WPEFrameworkPlugins::WPEFrameworkPlugins
WPEFrameworkDefinitions::WPEFrameworkDefinitions)
```
49 changes: 49 additions & 0 deletions .github/instructions/Pluginconfig.instructions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
---
applyTo: "**/*.config,**/*.conf.in"
---

### Plugin Configuration

### Requirement

- Each plugin must define <PluginName>.conf.in file that includes the following mandatory properties:

- **autostart**: Indicates whether the plugin should start automatically when the framework boots. This should be set to false by default.

- **callsign**: A unique identifier used to reference the plugin within the framework. Every callsign must be defined with a prefix of org.rdk and it must be followed by the ENT Service name written in PascalCase (e.g., org.rdk.PersistentStore).

- **Custom properties**: Any additional configuration parameters required by the plugin. These are passed during activation via PluginHost::IShell::ConfigLine(). The following structural configuration elements are commonly defined:
- startuporder - Specifies the order in which plugins are started, relative to others.
- precondition - If these aren't met, the plugin stays in the Preconditions state and activates automatically once they are satisfied. It is recommended to define the precondition if the plugin depends on other subsystems being active.
- mode - Defines the execution mode of the plugin.

### Plugin Mode Determination

If the plugin's mode is set to OFF, it is treated as in-process.

If no mode is specified, the plugin defaults to in-process.

If the mode is explicitly set to LOCAL, the plugin runs out-of-process.

The plugin mode is configured in the plugin's CMakeLists.txt file.

- **locator** - Update with the name of the library (.so) that contains the actual plugin Implementation code.

### Example

<PluginName>.conf.in

```
precondition = ["Platform"]
callsign = "org.rdk.HdcpProfile"
autostart = "@PLUGIN_HDCPPROFILE_AUTOSTART@"
startuporder = "@PLUGIN_HDCPPROFILE_STARTUPORDER@"

configuration = JSON()
rootobject = JSON()

rootobject.add("mode", "@PLUGIN_HDCPPROFILE_MODE@")
rootobject.add("locator", "lib@PLUGIN_IMPLEMENTATION@.so")

configuration.add("root", rootobject)
```
Loading
Loading