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
9 changes: 8 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,16 @@ 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.7](https://github.com/rdkcentral/control/compare/1.1.6...1.1.7)

> 4 December 2025

- RDKEMW-11159: new_certselector_type [`#157`](https://github.com/rdkcentral/control/pull/157)
- RDKEMW-10425: Automation Logging [`#144`](https://github.com/rdkcentral/control/pull/144)
- RDKEMW-9600: FIRST_PACKET_TIMEOUTs [`#135`](https://github.com/rdkcentral/control/pull/135)

#### [1.1.6](https://github.com/rdkcentral/control/compare/1.1.5...1.1.6)

> 19 November 2025
Expand Down
2 changes: 1 addition & 1 deletion src/auth/ctrlm_auth_certificate.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ ctrlm_auth_certificate_t::ctrlm_auth_certificate_t() {

char *cert_path = NULL;
char *cert_password = NULL;
rdkcertselector_h cert_selector = rdkcertselector_new( NULL, NULL, "MTLS" );
rdkcertselector_h cert_selector = rdkcertselector_new( NULL, NULL, "FBK_MTLS" );

if(cert_selector == NULL){
XLOGD_TELEMETRY("cert selector init failed");
Expand Down
6 changes: 3 additions & 3 deletions src/ble/ctrlm_ble_controller.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -615,13 +615,13 @@ void ctrlm_obj_controller_ble_t::print_status() {
XLOGD_INFO("Model : %s", model_->to_string().c_str());
XLOGD_INFO("MAC Address : %s", ieee_address_->to_string().c_str());
XLOGD_INFO("Device Minor ID : %d", device_minor_id_);
XLOGD_INFO("Battery Level : %u%%", get_battery_percent());
XLOGD_AUTOMATION_INFO("Battery Level : %u%%", get_battery_percent());
XLOGD_INFO("HW Revision : %s", hw_revision_->to_string().c_str());
XLOGD_INFO("FW Revision : %s", fw_revision_->to_string().c_str());
XLOGD_INFO("SW Revision : %s", sw_revision_->to_string().c_str());
XLOGD_AUTOMATION_INFO("SW Revision : %s", sw_revision_->to_string().c_str());
XLOGD_INFO("Serial Number : %s", serial_number_->to_string().c_str());
XLOGD_INFO("");
XLOGD_INFO("Connected : %s", (connected_==true) ? "true" : "false");
XLOGD_AUTOMATION_INFO("Connected : %s", (connected_==true) ? "true" : "false");
XLOGD_INFO("Last Activity Time : %s", ctrlm_utils_time_as_string(this->last_activity_time_get()).c_str());
XLOGD_INFO("Bound Time : %s", ctrlm_utils_time_as_string(this->time_binding_get()).c_str());
XLOGD_INFO("");
Expand Down
99 changes: 69 additions & 30 deletions src/ble/ctrlm_ble_network.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -525,7 +525,6 @@ void ctrlm_obj_network_ble_t::req_process_voice_session_begin(void *data, int si

// only support ADPCM from ble-rcu component
ctrlm_hal_ble_VoiceEncoding_t encoding = CTRLM_HAL_BLE_ENCODING_ADPCM;
ctrlm_hal_ble_VoiceStreamEnd_t streamEnd = CTRLM_HAL_BLE_VOICE_STREAM_END_ON_KEY_UP;

ctrlm_voice_format_t voice_format = { .type = CTRLM_VOICE_FORMAT_INVALID };

Expand All @@ -543,43 +542,43 @@ void ctrlm_obj_network_ble_t::req_process_voice_session_begin(void *data, int si
audio_format.getHeaderInfoAdpcm(adpcm_frame->offset_step_size_index, adpcm_frame->offset_predicted_sample_lsb, adpcm_frame->offset_predicted_sample_msb, adpcm_frame->offset_sequence_value, adpcm_frame->shift_sequence_value, adpcm_frame->sequence_value_min, adpcm_frame->sequence_value_max);

pressAndHoldSupport = audio_format.getPressAndHoldSupport();
if(!pressAndHoldSupport) {
streamEnd = CTRLM_HAL_BLE_VOICE_STREAM_END_ON_AUDIO_DURATION;
}
controllers_[controller_id]->setPressAndHoldSupport(pressAndHoldSupport);
}
}

ctrlm_voice_start_audio_params_t audio_start_params;
audio_start_params.m_controller_id = controller_id;
audio_start_params.m_fd = -1;
audio_start_params.m_started = false;
auto audio_start_cb = std::bind(&ctrlm_obj_network_ble_t::start_controller_audio_streaming, this, std::placeholders::_1);

voice_status = ctrlm_get_voice_obj()->voice_session_req(network_id_get(), controller_id, device, voice_format, NULL,
controllers_[controller_id]->get_model().c_str(),
controllers_[controller_id]->get_sw_revision().to_string().c_str(),
controllers_[controller_id]->get_hw_revision().to_string().c_str(), 0.0,
false, NULL, NULL, NULL, true, pressAndHoldSupport);
false, NULL, NULL, NULL, true, pressAndHoldSupport, audio_start_cb, &audio_start_params);
if (!controllers_[controller_id]->get_capabilities().has_capability(ctrlm_controller_capabilities_t::capability::PAR) && (VOICE_SESSION_RESPONSE_AVAILABLE_PAR_VOICE == voice_status)) {
XLOGD_WARN("PAR voice is enabled but not supported by BLE controller treating as normal voice session");
voice_status = VOICE_SESSION_RESPONSE_AVAILABLE;
}
if (VOICE_SESSION_RESPONSE_AVAILABLE != voice_status) {
XLOGD_TELEMETRY("Failed opening voice session in ctrlm_voice_t, error = <%d>", voice_status);
} else {
int fd = -1;
bool success = false;

if (ble_rcu_interface_) {
int fd = -1;

if (!ble_rcu_interface_->startAudioStreaming(ieee_address, encoding, streamEnd, fd)) {
XLOGD_ERROR("failed to start audio streaming on remote");
} else {
if (!audio_start_params.m_started) { // voice session req did not need to start audio
start_controller_audio_streaming(&audio_start_params);
}
fd = audio_start_params.m_fd;

if (fd < 0) {
XLOGD_ERROR("Voice streaming pipe invalid (fd = <%d>), aborting voice session", fd);
success = false;
} else {
XLOGD_INFO("Acquired voice streaming pipe fd = <%d>, sending to voice engine", fd);
//Send the fd acquired from bluez to the voice engine
success = ctrlm_get_voice_obj()->voice_session_data(network_id_get(), controller_id, fd);
}
}
if (fd < 0) {
XLOGD_ERROR("Voice streaming pipe invalid (fd = <%d>), aborting voice session", fd);
success = false;
} else {
XLOGD_AUTOMATION_INFO("Acquired voice streaming pipe fd = <%d>, sending to voice engine", fd);
//Send the fd acquired from bluez to the voice engine
success = ctrlm_get_voice_obj()->voice_session_data(network_id_get(), controller_id, fd);
}

if (false == success) {
Expand Down Expand Up @@ -1826,7 +1825,7 @@ void ctrlm_obj_network_ble_t::ind_process_rcu_status(void *data, int size) {
print_status = false;
break;
case CTRLM_HAL_BLE_PROPERTY_IS_UPGRADING:
XLOGD_INFO("Controller <%s> firmware upgrading = %s", controller->ieee_address_get().to_string().c_str(), dqm->rcu_data.is_upgrading ? "TRUE" : "FALSE");
XLOGD_AUTOMATION_INFO("Controller <%s> firmware upgrading = %s", controller->ieee_address_get().to_string().c_str(), dqm->rcu_data.is_upgrading ? "TRUE" : "FALSE");
upgrade_in_progress_ = dqm->rcu_data.is_upgrading;
if (!dqm->rcu_data.is_upgrading) {
// If we get FALSE here, make sure the controller upgrade progress flag is cleared. But we don't want to set the controller progress
Expand All @@ -1837,7 +1836,7 @@ void ctrlm_obj_network_ble_t::ind_process_rcu_status(void *data, int size) {
print_status = false;
break;
case CTRLM_HAL_BLE_PROPERTY_UPGRADE_PROGRESS:
XLOGD_INFO("Controller <%s> firmware upgrade %d%% complete...", controller->ieee_address_get().to_string().c_str(), dqm->rcu_data.upgrade_progress);
XLOGD_AUTOMATION_INFO("Controller <%s> firmware upgrade %d%% complete...", controller->ieee_address_get().to_string().c_str(), dqm->rcu_data.upgrade_progress);
// From a controller perspective, we cannot use the CTRLM_HAL_BLE_PROPERTY_IS_UPGRADING flag above to determine if its actively upgrading.
// Instead, its more accurate to use the progress percentage to determine if the remote is actively receiving firmware packets.
controller->setUpgradeInProgress(dqm->rcu_data.upgrade_progress > 0 && dqm->rcu_data.upgrade_progress < 100);
Expand All @@ -1850,7 +1849,7 @@ void ctrlm_obj_network_ble_t::ind_process_rcu_status(void *data, int size) {
print_status = false;
break;
case CTRLM_HAL_BLE_PROPERTY_UPGRADE_ERROR:
XLOGD_ERROR("Controller <%s> firmware upgrade FAILED with error <%s>.", controller->ieee_address_get().to_string().c_str(), dqm->rcu_data.upgrade_error);
XLOGD_AUTOMATION_ERROR("Controller <%s> firmware upgrade FAILED with error <%s>.", controller->ieee_address_get().to_string().c_str(), dqm->rcu_data.upgrade_error);
report_status = false;
print_status = false;
controller->set_upgrade_error(dqm->rcu_data.upgrade_error);
Expand Down Expand Up @@ -1883,7 +1882,7 @@ void ctrlm_obj_network_ble_t::ind_process_rcu_status(void *data, int size) {
controller->ota_failure_cnt_incr();
break;
case CTRLM_HAL_BLE_PROPERTY_UNPAIR_REASON:
XLOGD_INFO("Controller <%s> notified reason for unpairing = <%s>", controller->ieee_address_get().to_string().c_str(), ctrlm_ble_unpair_reason_str(dqm->rcu_data.unpair_reason));
XLOGD_AUTOMATION_INFO("Controller <%s> notified reason for unpairing = <%s>", controller->ieee_address_get().to_string().c_str(), ctrlm_ble_unpair_reason_str(dqm->rcu_data.unpair_reason));
last_rcu_unpair_metrics_.write_rcu_unpair_event(controller->ieee_address_get().get_value(), string(ctrlm_ble_unpair_reason_str(dqm->rcu_data.unpair_reason)));
report_status = false;
print_status = false;
Expand All @@ -1898,7 +1897,7 @@ void ctrlm_obj_network_ble_t::ind_process_rcu_status(void *data, int size) {
}
break;
case CTRLM_HAL_BLE_PROPERTY_REBOOT_REASON:
XLOGD_TELEMETRY("Controller <%s> notified reason for rebooting = <%s%s%s%s>",
XLOGD_AUTOMATION_TELEMETRY("Controller <%s> notified reason for rebooting = <%s%s%s%s>",
controller->ieee_address_get().to_string().c_str(),
ctrlm_ble_reboot_reason_str(dqm->rcu_data.reboot_reason),
dqm->rcu_data.reboot_reason == CTRLM_BLE_RCU_REBOOT_REASON_ASSERT ? " - \"" : "",
Expand Down Expand Up @@ -2206,7 +2205,7 @@ void ctrlm_obj_network_ble_t::ind_process_keypress(void *data, int size) {
controller->setVoiceStartTime(keyDownTime);

XLOGD_INFO("------------------------------------------------------------------------");
XLOGD_INFO("CODE_VOICE_KEY button PRESSED event for device: %s", controller->ieee_address_get().to_string().c_str());
XLOGD_AUTOMATION_INFO("CODE_VOICE_KEY button PRESSED event for device: %s", controller->ieee_address_get().to_string().c_str());
XLOGD_INFO("------------------------------------------------------------------------");

ctrlm_voice_iarm_call_voice_session_t v_params;
Expand Down Expand Up @@ -2256,7 +2255,7 @@ void ctrlm_obj_network_ble_t::ind_process_keypress(void *data, int size) {
if (controller->isVoiceKey(dqm->event.code)) {
if(!controller->getPressAndHoldSupport()) { // if the voice session is "Press and Release" then don't end session on voice key up event
XLOGD_INFO("------------------------------------------------------------------------");
XLOGD_INFO("CODE_VOICE_KEY button RELEASED event for device: %s (ignored for PAR session)", controller->ieee_address_get().to_string().c_str());
XLOGD_AUTOMATION_INFO("CODE_VOICE_KEY button RELEASED event for device: %s (ignored for PAR session)", controller->ieee_address_get().to_string().c_str());
XLOGD_INFO("------------------------------------------------------------------------");
} else {
rdkx_timestamp_t keyUpTime, keyUpTimeLocal, voiceStartTimeLocal, firstAudioDataTime;
Expand Down Expand Up @@ -2291,11 +2290,11 @@ void ctrlm_obj_network_ble_t::ind_process_keypress(void *data, int size) {
}

XLOGD_INFO("------------------------------------------------------------------------");
XLOGD_INFO("CODE_VOICE_KEY button RELEASED event for device: %s duration <%lld ms> start lag <%lld ms>", controller->ieee_address_get().to_string().c_str(), audioDurationKeys, startAudioLag);
XLOGD_AUTOMATION_INFO("CODE_VOICE_KEY button RELEASED event for device: %s duration <%lld ms> start lag <%lld ms>", controller->ieee_address_get().to_string().c_str(), audioDurationKeys, startAudioLag);
XLOGD_INFO("------------------------------------------------------------------------");
} else {
XLOGD_INFO("------------------------------------------------------------------------");
XLOGD_INFO("CODE_VOICE_KEY button RELEASED event for device: %s duration <%lld ms>", controller->ieee_address_get().to_string().c_str(), audioDurationKeys);
XLOGD_AUTOMATION_INFO("CODE_VOICE_KEY button RELEASED event for device: %s duration <%lld ms>", controller->ieee_address_get().to_string().c_str(), audioDurationKeys);
XLOGD_INFO("------------------------------------------------------------------------");
}

Expand Down Expand Up @@ -2498,7 +2497,7 @@ void ctrlm_obj_network_ble_t::printStatus() {
it->second->print_status();
}
XLOGD_INFO("BLE Network Status: <%s>", ctrlm_rf_pair_state_str(state_));
XLOGD_TELEMETRY("IR Programming Status: <%s>", ctrlm_ir_state_str(ir_state_));
XLOGD_AUTOMATION_TELEMETRY("IR Programming Status: <%s>", ctrlm_ir_state_str(ir_state_));
XLOGD_WARN("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<");
}

Expand Down Expand Up @@ -2616,3 +2615,43 @@ ctrlm_controller_id_t ctrlm_obj_network_ble_t::find_controller_from_upgrade_sess
}
return id;
}

void ctrlm_obj_network_ble_t::start_controller_audio_streaming(ctrlm_voice_start_audio_params_t *params) {
THREAD_ID_VALIDATE();
int fd = -1;
ctrlm_controller_id_t id = params->m_controller_id;
params->m_fd = fd;
params->m_started = false;

if (!ready_) {
XLOGD_FATAL("Network is not ready!");
return;
}

if(!controller_exists(id)) {
XLOGD_WARN("Controller %u doesn't exist.", id);
return;
}

if (!ble_rcu_interface_) {
XLOGD_WARN("ble rcu interface not ready");
return;
}

ctrlm_hal_ble_VoiceEncoding_t encoding = CTRLM_HAL_BLE_ENCODING_ADPCM;
ctrlm_hal_ble_VoiceStreamEnd_t streamEnd = CTRLM_HAL_BLE_VOICE_STREAM_END_ON_KEY_UP;
auto rcu = controllers_.at(id);

if (rcu->getPressAndHoldSupport()) {
streamEnd = CTRLM_HAL_BLE_VOICE_STREAM_END_ON_AUDIO_DURATION;
}

uint64_t ieee_address = rcu->ieee_address_get().get_value();
if (!ble_rcu_interface_->startAudioStreaming(ieee_address, encoding, streamEnd, fd)) {
XLOGD_ERROR("failed to start audio streaming on remote");
return;
}

params->m_fd = fd;
params->m_started = true;
}
2 changes: 2 additions & 0 deletions src/ble/ctrlm_ble_network.h
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,8 @@ class ctrlm_obj_network_ble_t : public ctrlm_obj_network_t {

std::shared_ptr<ConfigSettings> getConfigSettings();

virtual void start_controller_audio_streaming(ctrlm_voice_start_audio_params_t *params);

private:
ctrlm_obj_network_ble_t();

Expand Down
12 changes: 6 additions & 6 deletions src/ble/hal/blercu/blercupairingstatemachine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -517,19 +517,19 @@ void BleRcuPairingStateMachine::onStateTransition(int oldState, int newState)
{
if (newState == FinishedState) {
if (oldState == UnpairingState) {
XLOGD_WARN("timed-out in un-pairing phase (failed rcu may be left paired)");
XLOGD_AUTOMATION_WARN("timed-out in un-pairing phase (failed rcu may be left paired)");
} else if (oldState == StartingDiscoveryState) {
XLOGD_ERROR("timed-out waiting for discovery started signal");
XLOGD_AUTOMATION_ERROR("timed-out waiting for discovery started signal");
} else if (oldState == DiscoveringState) {
XLOGD_ERROR("timed-out in discovery phase (didn't find target rcu device to pair to)");
XLOGD_AUTOMATION_ERROR("timed-out in discovery phase (didn't find target rcu device to pair to)");
} else if (oldState == StoppingDiscoveryState) {
XLOGD_ERROR("timed-out waiting for discovery to stop (suggesting something has gone wrong inside bluez)");
XLOGD_AUTOMATION_ERROR("timed-out waiting for discovery to stop (suggesting something has gone wrong inside bluez)");
}
} else if (newState == UnpairingState) {
if (oldState == EnablePairableState || oldState == PairingState) {
XLOGD_WARN("timed-out in pairing phase (rcu device didn't pair within %dms)", m_pairingTimeout);
XLOGD_AUTOMATION_WARN("timed-out in pairing phase (rcu device didn't pair within %dms)", m_pairingTimeout);
} else if (oldState == SetupState) {
XLOGD_WARN("timed-out in setup phase (rcu didn't response to all requests within %dms)", m_setupTimeout);
XLOGD_AUTOMATION_WARN("timed-out in setup phase (rcu didn't response to all requests within %dms)", m_setupTimeout);
}
}
}
Expand Down
4 changes: 2 additions & 2 deletions src/ble/hal/blercu/bluez/blercuadapter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1721,7 +1721,7 @@ void BleRcuAdapterBluez::onDevicePairedChanged(const BleAddress &address,
void BleRcuAdapterBluez::onDeviceReadyChanged(const BleAddress &address,
bool ready)
{
XLOGD_INFO("device with address %s is %sREADY", address.toString().c_str(), ready ? "" : "NOT ");
XLOGD_AUTOMATION_INFO("device with address %s is %sREADY", address.toString().c_str(), ready ? "" : "NOT ");

map<BleAddress, shared_ptr<BleRcuDeviceBluez>>::const_iterator it = m_devices.find(address);

Expand Down Expand Up @@ -1768,7 +1768,7 @@ bool BleRcuAdapterBluez::setConnectionParams(BleAddress address, double minInter

if (address == deviceInfo.address) {

XLOGD_INFO("HCI connection handle: %u, device: %s requesting an update of connection parameters to "
XLOGD_AUTOMATION_INFO("HCI connection handle: %u, device: %s requesting an update of connection parameters to "
"minInterval=%f, maxInterval=%f, latency=%d, supervisionTimeout=%d",
deviceInfo.handle, deviceInfo.address.toString().c_str(),
minInterval, maxInterval, latency, supervisionTimeout);
Expand Down
2 changes: 1 addition & 1 deletion src/ble/hal/blercu/bluez/blercudevice.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -668,7 +668,7 @@ void BleRcuDeviceBluez::onEnteredRecoveryDisconnectingState()
m_recoveryAttempts++;

// log the attempt
XLOGD_ERROR("entered recovery state after device %s failed to resolve services (attempt #%d)",
XLOGD_AUTOMATION_ERROR("entered recovery state after device %s failed to resolve services (attempt #%d)",
m_address.toString().c_str(), m_recoveryAttempts);


Expand Down
Loading