From 8ed86c467afa107f7aafacb85ca64c979cf56dc2 Mon Sep 17 00:00:00 2001 From: Jungshik Jang Date: Fri, 11 Jul 2014 11:56:46 +0900 Subject: [PATCH] Implement retransmission of cec request. BUG: 16218422 Change-Id: I4a6692ba8815e9a0ae26c872656b31b678d54fd6 Conflicts: services/core/java/com/android/server/hdmi/HdmiCecController.java --- .../android/server/hdmi/HdmiCecController.java | 17 +++++++++++++---- .../com/android/server/hdmi/HdmiConfig.java | 7 +++++++ 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/services/core/java/com/android/server/hdmi/HdmiCecController.java b/services/core/java/com/android/server/hdmi/HdmiCecController.java index 4ecca32fd9f76..14d9b752b4f05 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecController.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecController.java @@ -533,16 +533,25 @@ final class HdmiCecController { @Override public void run() { byte[] body = buildBody(cecMessage.getOpcode(), cecMessage.getParams()); - final int error = nativeSendCecCommand(mNativePtr, cecMessage.getSource(), - cecMessage.getDestination(), body); - if (error != Constants.SEND_RESULT_SUCCESS) { + int i = 0; + int errorCode = Constants.SEND_RESULT_SUCCESS; + do { + errorCode = nativeSendCecCommand(mNativePtr, cecMessage.getSource(), + cecMessage.getDestination(), body); + if (errorCode == Constants.SEND_RESULT_SUCCESS) { + break; + } + } while (i++ < HdmiConfig.RETRANSMISSION_COUNT); + + final int finalError = errorCode; + if (finalError != Constants.SEND_RESULT_SUCCESS) { Slog.w(TAG, "Failed to send " + cecMessage); } if (callback != null) { runOnServiceThread(new Runnable() { @Override public void run() { - callback.onSendCompleted(error); + callback.onSendCompleted(finalError); } }); } diff --git a/services/core/java/com/android/server/hdmi/HdmiConfig.java b/services/core/java/com/android/server/hdmi/HdmiConfig.java index 8ae76b5129391..0793107c72492 100644 --- a/services/core/java/com/android/server/hdmi/HdmiConfig.java +++ b/services/core/java/com/android/server/hdmi/HdmiConfig.java @@ -39,5 +39,12 @@ final class HdmiConfig { // Number of retries for polling each device in address allocation mechanism. static final int ADDRESS_ALLOCATION_RETRY = 3; + // CEC spec said that it should try retransmission at least once. + // The actual number of send request for a single command will be at most + // RETRANSMISSION_COUNT + 1. Note that it affects only to normal commands + // and polling message for logical address allocation and device discovery + // action. They will have their own retransmission count. + static final int RETRANSMISSION_COUNT = 1; + private HdmiConfig() { /* cannot be instantiated */ } }