Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
26 changes: 24 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,32 @@ All notable changes to this project will be documented in this file. Dates are d

Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).

<!-- auto-changelog-above -->

#### [1.1.12](https://github.com/rdkcentral/control/compare/1.1.11...1.1.12)

> 9 April 2026

- RDKEMW-16333: Update Thunder plugin to use _string and _boolean [`#197`](https://github.com/rdkcentral/control/pull/197)
- RDKEMW-5849 : remove deprecated "experience" code [`#185`](https://github.com/rdkcentral/control/pull/185)

#### [1.1.11.2](https://github.com/rdkcentral/control/compare/1.1.11.1...1.1.11.2)

> 7 April 2026

- RDKEMW-16711: CHANGELOG for ctrlm hotfix release 1.1.11.2 [`#196`](https://github.com/rdkcentral/control/pull/196)
- RDKEMW-16711 : Add wakeup reason string, on support/1.1.11 [`#195`](https://github.com/rdkcentral/control/pull/195)

#### [1.1.11.1](https://github.com/rdkcentral/control/compare/1.1.11...1.1.11.1)

> 1 April 2026

- RDKEMW-16330: Update Control Manager to use bool for NSM [`#188`](https://github.com/rdkcentral/control/pull/188)
- RDKEMW-16330: update CHANGELOG for release 1.1.11p1 [`98ea5f5`](https://github.com/rdkcentral/control/commit/98ea5f51f8da9ef6ded7038d760baa3b41cc4a90)

#### [1.1.11](https://github.com/rdkcentral/control/compare/1.1.10...1.1.11)

> 5 March 2026
> 6 March 2026

- RDKEMW-14589: No UI action with "Info" keypress from rf4ce remote in RF mode [`#181`](https://github.com/rdkcentral/control/pull/181)
- RDKEMW-14445 : Add session end and protocol return to telemetry [`#182`](https://github.com/rdkcentral/control/pull/182)
Expand All @@ -15,7 +38,6 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
- RDKEMW-12930: RF4CE network export XCONF on pair/unpair/etc. [`#177`](https://github.com/rdkcentral/control/pull/177)
- RDKEMW-13833: Remove duplicate RFC fetch attempts in listeners [`#179`](https://github.com/rdkcentral/control/pull/179)

<!-- auto-changelog-above -->

#### [1.1.10](https://github.com/rdkcentral/control/compare/1.1.9...1.1.10)

Expand Down
2 changes: 0 additions & 2 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -234,8 +234,6 @@ if(THUNDER)
if(AUTH_ACTIVATION_STATUS)
add_compile_definitions(AUTH_ACTIVATION_STATUS)
endif()
#By default disabled but can be enabled
#add_compile_definitions(AUTH_EXPERIENCE)
target_link_libraries(controlMgr RdkCertSelector)
endif()
endif()
Expand Down
2 changes: 1 addition & 1 deletion include/ctrlm_ipc_voice.h
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@
#define CTRLM_VOICE_SESSION_TEXT_MAX_LENGTH (512) ///< Session text string maximum length
#define CTRLM_VOICE_SESSION_MSG_MAX_LENGTH (128) ///< Session message string maximum length
#define CTRLM_VOICE_QUERY_STRING_MAX_LENGTH (128) ///< Query string maximum name or value length
#define CTRLM_VOICE_QUERY_STRING_MAX_PAIRS (16) ///< Query string maximum number of name/value pairs
#define CTRLM_VOICE_QUERY_STRING_MAX_PAIRS (24) ///< Query string maximum number of name/value pairs
#define CTRLM_VOICE_REQUEST_IP_MAX_LENGTH (48) ///< cURL request primary IP address string maximum length (big enough for IPv6)

#define CTRLM_VOICE_MIN_UTTERANCE_DURATION_MAXIMUM (600) ///< Maximum value of the utterance duration minimum setting (in milliseconds)
Expand Down
1 change: 0 additions & 1 deletion src/auth/ctrlm_auth.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@ class ctrlm_auth_t {
virtual bool get_device_id(std::string &device_id) = 0;
virtual bool get_account_id(std::string &account_id) = 0;
virtual bool get_partner_id(std::string &partner_id) = 0;
virtual bool get_experience(std::string &experience) = 0;
virtual bool get_sat(std::string &sat, time_t &expiration) = 0;
virtual bool supports_sat_expiration() const = 0;

Expand Down
5 changes: 0 additions & 5 deletions src/auth/ctrlm_auth_thunder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,11 +48,6 @@ bool ctrlm_auth_thunder_t::get_partner_id(std::string &partner_id) {
return(ret);
}

bool ctrlm_auth_thunder_t::get_experience(std::string &experience) {
bool ret = this->plugin->get_experience(experience);
return(ret);
}

bool ctrlm_auth_thunder_t::get_sat(std::string &sat, time_t &expiration) {
bool ret = this->plugin->get_sat(sat, expiration);
return(ret);
Expand Down
1 change: 0 additions & 1 deletion src/auth/ctrlm_auth_thunder.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ class ctrlm_auth_thunder_t : public ctrlm_auth_t {
virtual bool get_device_id(std::string &device_id);
virtual bool get_account_id(std::string &account_id);
virtual bool get_partner_id(std::string &partner_id);
virtual bool get_experience(std::string &experience);
virtual bool get_sat(std::string &sat, time_t &expiration);
virtual bool supports_sat_expiration() const;

Expand Down
18 changes: 0 additions & 18 deletions src/auth/ctrlm_thunder_plugin_authservice.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -125,24 +125,6 @@ bool ctrlm_thunder_plugin_authservice_t::get_account_id(std::string &account_id)
return(ret);
}

bool ctrlm_thunder_plugin_authservice_t::get_experience(std::string &experience) {
bool ret = false;
JsonObject params, response;
if(this->call_plugin("getExperience", (void *)&params, (void *)&response)) {
if(response["success"].Boolean()) { // If success doesn't exist, it defaults to false which is fine.
experience = response["experience"].String();
if(!experience.empty()) {
ret = true;
}
} else {
XLOGD_WARN("Success for getExperience was false");
}
} else {
XLOGD_WARN("Call for getExperience failed");
}
return(ret);
}

bool ctrlm_thunder_plugin_authservice_t::get_sat(std::string &sat, time_t &expiration) {
bool ret = false;
JsonObject params, response;
Expand Down
7 changes: 0 additions & 7 deletions src/auth/ctrlm_thunder_plugin_authservice.h
Original file line number Diff line number Diff line change
Expand Up @@ -75,13 +75,6 @@ class ctrlm_thunder_plugin_authservice_t : public Thunder::Plugin::ctrlm_thunder
*/
bool get_account_id(std::string &account_id);

/**
* Function that retrieves the Experience String from Authservice.
* @param experience The reference to a string which will contain the Experience String.
* @return True on success otherwise False.
*/
bool get_experience(std::string &experience);

/**
* Function that retrieves the SAT Token from Authservice.
* @param sat The reference to a string which will contain the SAT Token.
Expand Down
1 change: 0 additions & 1 deletion src/ctrlm.h
Original file line number Diff line number Diff line change
Expand Up @@ -458,7 +458,6 @@ gboolean ctrlm_main_has_device_id_get(void);
gboolean ctrlm_main_has_device_type_get(void);
gboolean ctrlm_main_has_service_account_id_get(void);
gboolean ctrlm_main_has_partner_id_get(void);
gboolean ctrlm_main_has_experience_get(void);
gboolean ctrlm_main_needs_service_access_token_get(void);
void ctrlm_main_invalidate_service_access_token(void);
void ctrlm_main_sat_enabled_set(gboolean sat_enabled);
Expand Down
4 changes: 0 additions & 4 deletions src/ctrlm_controller.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -118,10 +118,6 @@ string ctrlm_obj_controller_t::partner_id_get() const {
return(obj_network_->partner_id_get());
}

string ctrlm_obj_controller_t::experience_get() const {
return(obj_network_->experience_get());
}

string ctrlm_obj_controller_t::stb_name_get() const {
return(obj_network_->stb_name_get());
}
Expand Down
1 change: 0 additions & 1 deletion src/ctrlm_controller.h
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,6 @@ class ctrlm_obj_controller_t
std::string device_id_get() const;
std::string service_account_id_get() const;
std::string partner_id_get() const;
std::string experience_get() const;
std::string stb_name_get() const;
void set_device_minor_id(int device_minor_id);
int get_device_minor_id() const;
Expand Down
46 changes: 0 additions & 46 deletions src/ctrlm_main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -302,10 +302,6 @@ static void ctrlm_main_has_service_account_id_set(gboolean has_id);
static gboolean ctrlm_load_partner_id(void);
static void ctrlm_main_has_partner_id_set(gboolean has_id);
#endif
#ifdef AUTH_EXPERIENCE
static gboolean ctrlm_load_experience(void);
static void ctrlm_main_has_experience_set(gboolean has_experience);
#endif
#ifdef AUTH_SAT_TOKEN
static gboolean ctrlm_load_service_access_token(void);
static void ctrlm_main_has_service_access_token_set(gboolean has_token);
Expand Down Expand Up @@ -1421,30 +1417,6 @@ gboolean ctrlm_load_partner_id(void) {
}
#endif

#ifdef AUTH_EXPERIENCE
gboolean ctrlm_main_has_experience_get(void) {
return(g_ctrlm.has_experience);
}

void ctrlm_main_has_experience_set(gboolean has_experience) {
g_ctrlm.has_experience = has_experience;
}

gboolean ctrlm_load_experience(void) {
if(!g_ctrlm.authservice->get_experience(g_ctrlm.experience)) {
ctrlm_main_has_experience_set(false);
return(false);
}
g_ctrlm.voice_session->voice_stb_data_experience_set(g_ctrlm.experience);

for(auto const &itr : g_ctrlm.networks) {
itr.second->experience_set(g_ctrlm.experience);
}
ctrlm_main_has_experience_set(true);
return(true);
}
#endif

#ifdef AUTH_SAT_TOKEN
gboolean ctrlm_main_needs_service_access_token_get(void) {
gboolean ret = false;
Expand Down Expand Up @@ -1510,12 +1482,6 @@ gboolean ctrlm_has_authservice_data(void) {
}
#endif

#ifdef AUTH_EXPERIENCE
if(!ctrlm_main_has_experience_get()) {
ret = FALSE;
}
#endif

#ifdef AUTH_SAT_TOKEN
if(ctrlm_main_needs_service_access_token_get()) {
ret = FALSE;
Expand Down Expand Up @@ -1566,18 +1532,6 @@ gboolean ctrlm_load_authservice_data(void) {
}
#endif

#ifdef AUTH_EXPERIENCE
if(!ctrlm_main_has_experience_get()) {
XLOGD_INFO("load experience");
if(!ctrlm_load_experience()) {
XLOGD_TELEMETRY("failed to load experience");
ret = FALSE;
} else {
XLOGD_INFO("load experience successfully <%s>", ctrlm_is_pii_mask_enabled() ? "***" : g_ctrlm.experience.c_str());
}
}
#endif

#ifdef AUTH_SAT_TOKEN
if(ctrlm_main_needs_service_access_token_get()) {
XLOGD_INFO("load sat token");
Expand Down
10 changes: 0 additions & 10 deletions src/ctrlm_network.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -187,16 +187,6 @@ string ctrlm_obj_network_t::partner_id_get() const {
return(partner_id_);
}

void ctrlm_obj_network_t::experience_set(const string& experience) {
THREAD_ID_VALIDATE();
experience_ = experience;
}

string ctrlm_obj_network_t::experience_get() const {
THREAD_ID_VALIDATE();
return(experience_);
}

void ctrlm_obj_network_t::stb_name_set(const string& stb_name) {
THREAD_ID_VALIDATE();
XLOGD_INFO("STB Name <%s>", stb_name.c_str());
Expand Down
3 changes: 0 additions & 3 deletions src/ctrlm_network.h
Original file line number Diff line number Diff line change
Expand Up @@ -192,8 +192,6 @@ class ctrlm_obj_network_t
std::string service_account_id_get() const;
void partner_id_set(const std::string& partner_id);
std::string partner_id_get() const;
void experience_set(const std::string& experience);
std::string experience_get() const;
void mask_key_codes_set(gboolean mask_key_codes);
gboolean mask_key_codes_get() const;
void stb_name_set(const std::string& stb_name);
Expand Down Expand Up @@ -325,7 +323,6 @@ class ctrlm_obj_network_t
std::string device_id_;
std::string service_account_id_;
std::string partner_id_;
std::string experience_;
std::string stb_name_;
ctrlm_rcu_validation_result_t validation_result_ = CTRLM_RCU_VALIDATION_RESULT_MAX;
ctrlm_key_code_t validation_key_ = CTRLM_KEY_CODE_INVALID;
Expand Down
47 changes: 47 additions & 0 deletions src/thunder/ctrlm_thunder_plugin.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -261,6 +261,53 @@ bool ctrlm_thunder_plugin_t::call_plugin(std::string method, void *params, void
return(ret);
}

bool ctrlm_thunder_plugin_t::call_plugin_boolean(std::string method, void *params, bool *response) {
bool ret = false;
auto clientObject = (JSONRPC::LinkType<Core::JSON::IElement>*)this->plugin_client;
JsonObject *jsonParams = (JsonObject *)params;
if(clientObject) {
if(!method.empty() && jsonParams && response) {
Core::JSON::Boolean jsonResponse;
uint32_t thunderRet = clientObject->Invoke<JsonObject, Core::JSON::Boolean>(CALL_TIMEOUT, _T(method), *jsonParams, jsonResponse);
if(thunderRet != Core::ERROR_NONE) {
XLOGD_ERROR("Thunder call failed <%s> <%u>", method.c_str(), thunderRet);
} else {
*response = jsonResponse.Value();
ret = true;
}
} else {
XLOGD_ERROR("Invalid parameters");
}
} else {
XLOGD_ERROR("Client is NULL");
}
Comment on lines +278 to +283

Copilot AI Apr 9, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The new error logs are very generic and lose useful context for debugging (e.g., which method was invoked and which pointer was null). Consider including method and explicit null details (clientObject/jsonParams/response) in the log message so failures can be triaged from logs without reproducing locally.

Copilot uses AI. Check for mistakes.
return(ret);
}

bool ctrlm_thunder_plugin_t::call_plugin_string(std::string method, void *params, std::string *response) {
bool ret = false;
auto clientObject = (JSONRPC::LinkType<Core::JSON::IElement>*)this->plugin_client;
JsonObject *jsonParams = (JsonObject *)params;
if(clientObject) {
if(!method.empty() && jsonParams && response) {
Core::JSON::String jsonString;
uint32_t thunderRet = clientObject->Invoke<JsonObject, Core::JSON::String>(CALL_TIMEOUT, _T(method), *jsonParams, jsonString);
if(thunderRet != Core::ERROR_NONE) {
XLOGD_ERROR("Thunder call failed <%s> <%u>", method.c_str(), thunderRet);
} else {
*response = jsonString.Value();
ret = true;
}
} else {
XLOGD_ERROR("Invalid parameters");
}
} else {
XLOGD_ERROR("Client is NULL");
}
return(ret);
}


bool ctrlm_thunder_plugin_t::call_controller(std::string method, void *params, void *response) {
bool ret = false;
if(this->controller) {
Expand Down
29 changes: 23 additions & 6 deletions src/thunder/ctrlm_thunder_plugin.h
Original file line number Diff line number Diff line change
Expand Up @@ -105,17 +105,16 @@ class ctrlm_thunder_plugin_t {
std::string callsign_with_api();

/**
* This functions is used to get a Thunder Plugin property.
* @param method The method in which the user wants to call.
* @param params The WPEFramework JsonObject containing the parameters for the call. (We can't include WPEFramework headers in controlMgr .h files as their logging macros clash)
* This function is used to get a Thunder Plugin property.
* @param property The name of the property that the user wants to get
* @param response The WPEFramework JsonObject containing the response from the call. (We can't include WPEFramework headers in controlMgr .h files as their logging macros clash)
* @param retries The number of retries if the call times out.
* @return True if the call succeeded, otherwise False.
*/
bool property_get(std::string property, void *response, unsigned int retries = 0);

/**
* This functions is used to call a Thunder Plugin method.
* This function is used to call a Thunder Plugin method.
* @param method The method in which the user wants to call.
* @param params The WPEFramework JsonObject containing the parameters for the call. (We can't include WPEFramework headers in controlMgr .h files as their logging macros clash)
* @param response The WPEFramework JsonObject containing the response from the call. (We can't include WPEFramework headers in controlMgr .h files as their logging macros clash)
Expand All @@ -125,7 +124,25 @@ class ctrlm_thunder_plugin_t {
bool call_plugin(std::string method, void *params, void *response, unsigned int retries = 0);

/**
* This functions is used to call a Thunder Controller method.
* This function is used to call a Thunder Plugin method.
* @param method The method in which the user wants to call.
* @param params The WPEFramework JsonObject containing the parameters for the call. (We can't include WPEFramework headers in controlMgr .h files as their logging macros clash)
* @param response The boolean pointer which will be assigned the response from the call
* @return True if the call succeeded, otherwise False.
*/
bool call_plugin_boolean(std::string method, void *params, bool *response);

/**
* This function is used to call a Thunder Plugin method.
* @param method The method in which the user wants to call.
* @param params The WPEFramework JsonObject containing the parameters for the call. (We can't include WPEFramework headers in controlMgr .h files as their logging macros clash)
* @param response The string pointer which will be assigned containing the response from the call.
* @return True if the call succeeded, otherwise False.
*/
bool call_plugin_string(std::string method, void *params, std::string *response);
Comment on lines +131 to +142

Copilot AI Apr 9, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The new call_plugin_boolean / call_plugin_string helpers don’t expose the retries parameter that call_plugin(...) provides, which makes the Thunder-call API inconsistent and reduces flexibility for callers (especially for transient timeout scenarios). Consider adding an optional unsigned int retries = 0 parameter (matching call_plugin) or refactoring to reuse the existing retry logic so all call variants behave consistently.

Suggested change
* @return True if the call succeeded, otherwise False.
*/
bool call_plugin_boolean(std::string method, void *params, bool *response);
/**
* This function is used to call a Thunder Plugin method.
* @param method The method in which the user wants to call.
* @param params The WPEFramework JsonObject containing the parameters for the call. (We can't include WPEFramework headers in controlMgr .h files as their logging macros clash)
* @param response The string pointer which will be assigned containing the response from the call.
* @return True if the call succeeded, otherwise False.
*/
bool call_plugin_string(std::string method, void *params, std::string *response);
* @param retries The number of retries if the call times out.
* @return True if the call succeeded, otherwise False.
*/
bool call_plugin_boolean(std::string method, void *params, bool *response, unsigned int retries = 0);
/**
* This function is used to call a Thunder Plugin method.
* @param method The method in which the user wants to call.
* @param params The WPEFramework JsonObject containing the parameters for the call. (We can't include WPEFramework headers in controlMgr .h files as their logging macros clash)
* @param response The string pointer which will be assigned containing the response from the call.
* @param retries The number of retries if the call times out.
* @return True if the call succeeded, otherwise False.
*/
bool call_plugin_string(std::string method, void *params, std::string *response, unsigned int retries = 0);

Copilot uses AI. Check for mistakes.
Comment on lines +131 to +142

Copilot AI Apr 9, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The new call_plugin_boolean / call_plugin_string helpers don’t expose the retries parameter that call_plugin(...) provides, which makes the Thunder-call API inconsistent and reduces flexibility for callers (especially for transient timeout scenarios). Consider adding an optional unsigned int retries = 0 parameter (matching call_plugin) or refactoring to reuse the existing retry logic so all call variants behave consistently.

Suggested change
* @return True if the call succeeded, otherwise False.
*/
bool call_plugin_boolean(std::string method, void *params, bool *response);
/**
* This function is used to call a Thunder Plugin method.
* @param method The method in which the user wants to call.
* @param params The WPEFramework JsonObject containing the parameters for the call. (We can't include WPEFramework headers in controlMgr .h files as their logging macros clash)
* @param response The string pointer which will be assigned containing the response from the call.
* @return True if the call succeeded, otherwise False.
*/
bool call_plugin_string(std::string method, void *params, std::string *response);
* @param retries The number of retries if the call times out.
* @return True if the call succeeded, otherwise False.
*/
bool call_plugin_boolean(std::string method, void *params, bool *response, unsigned int retries = 0);
/**
* This function is used to call a Thunder Plugin method.
* @param method The method in which the user wants to call.
* @param params The WPEFramework JsonObject containing the parameters for the call. (We can't include WPEFramework headers in controlMgr .h files as their logging macros clash)
* @param response The string pointer which will be assigned containing the response from the call.
* @param retries The number of retries if the call times out.
* @return True if the call succeeded, otherwise False.
*/
bool call_plugin_string(std::string method, void *params, std::string *response, unsigned int retries = 0);

Copilot uses AI. Check for mistakes.

/**
* This function is used to call a Thunder Controller method.
* @param method The method in which the user wants to call.
* @param params The WPEFramework JsonObject containing the parameters for the call. (We can't include WPEFramework headers in controlMgr .h files as their logging macros clash)
* @param params The WPEFramework JsonObject containing the response from the call. (We can't include WPEFramework headers in controlMgr .h files as their logging macros clash)
Expand Down Expand Up @@ -164,4 +181,4 @@ class ctrlm_thunder_plugin_t {
};
};

#endif
#endif
Loading
Loading