CEC : Add validator for tuner device status message

Test: atest HdmiCecMessageValidatorTest
Bug: 170811408
Change-Id: Idf94ddb5d14e3cac2bda0dfbb54c63bd7bdca6db
This commit is contained in:
Shraddha Basantwani
2020-11-03 12:30:03 +05:30
parent 48695cb073
commit f0f01aecdd
2 changed files with 93 additions and 1 deletions

View File

@@ -156,7 +156,6 @@ public class HdmiCecMessageValidator {
addValidationInfo(Constants.MESSAGE_GIVE_DECK_STATUS, statusRequestValidator, DEST_DIRECT);
addValidationInfo(Constants.MESSAGE_PLAY, new PlayModeValidator(), DEST_DIRECT);
// TODO: Handle messages for the Tuner Control.
addValidationInfo(
Constants.MESSAGE_GIVE_TUNER_DEVICE_STATUS, statusRequestValidator, DEST_DIRECT);
addValidationInfo(
@@ -167,6 +166,10 @@ public class HdmiCecMessageValidator {
Constants.MESSAGE_SELECT_DIGITAL_SERVICE,
new SelectDigitalServiceValidator(),
DEST_DIRECT);
addValidationInfo(
Constants.MESSAGE_TUNER_DEVICE_STATUS,
new TunerDeviceStatusValidator(),
DEST_DIRECT);
// Messages for the Vendor Specific Commands.
VariableLengthValidator maxLengthValidator = new VariableLengthValidator(0, 14);
@@ -722,6 +725,35 @@ public class HdmiCecMessageValidator {
|| (isWithinRange(value, 0xC1, 0xC3)));
}
/*
* Check if the given value is a valid Tuner Device info. A valid value is one which falls
* within the range description defined in CEC 1.4 Specification : Operand Descriptions
* (Section 17)
*
* @param params Tuner device info
* @return true if the Tuner device info is valid
*/
private boolean isValidTunerDeviceInfo(byte[] params) {
int tunerDisplayInfo = params[0] & 0x7F;
if (tunerDisplayInfo == 0x00) {
// Displaying digital tuner
if (params.length >= 5) {
return isValidDigitalServiceIdentification(params, 1);
}
} else if (tunerDisplayInfo == 0x01) {
// Not displaying Tuner
return true;
} else if (tunerDisplayInfo == 0x02) {
// Displaying Analogue tuner
if (params.length >= 5) {
return (isValidAnalogueBroadcastType(params[1])
&& isValidAnalogueFrequency(HdmiUtils.twoBytesToInt(params, 2))
&& isValidBroadcastSystem(params[4]));
}
}
return false;
}
private class PhysicalAddressValidator implements ParameterValidator {
@Override
public int isValid(byte[] params) {
@@ -1000,6 +1032,21 @@ public class HdmiCecMessageValidator {
}
}
/**
* Check if the given tuner device status parameter is valid. A valid parameter should lie
* within the range description defined in CEC 1.4 Specification : Operand Descriptions (Section
* 17)
*/
private class TunerDeviceStatusValidator implements ParameterValidator {
@Override
public int isValid(byte[] params) {
if (params.length < 1) {
return ERROR_PARAMETER_SHORT;
}
return toErrorCode(isValidTunerDeviceInfo(params));
}
}
/** Check if the given user control press parameter is valid. */
private class UserControlPressedValidator implements ParameterValidator {
@Override

View File

@@ -451,6 +451,51 @@ public class HdmiCecMessageValidatorTest {
assertMessageValidity("40:93:91:09:F4:40").isEqualTo(ERROR_PARAMETER);
}
@Test
public void isValid_tunerDeviceStatus() {
// Displaying digital tuner
assertMessageValidity("40:07:00:00:11:CE:90:0F:00:78").isEqualTo(OK);
assertMessageValidity("40:07:80:10:13:0B:34:38").isEqualTo(OK);
assertMessageValidity("40:07:00:9A:06:F9:D3:E6").isEqualTo(OK);
assertMessageValidity("40:07:00:91:09:F4:40:C8").isEqualTo(OK);
// Not displaying tuner
assertMessageValidity("40:07:01").isEqualTo(OK);
assertMessageValidity("40:07:81:07:64:B9:02").isEqualTo(OK);
// Displaying analogue tuner
assertMessageValidity("40:07:02:00:13:0F:00:96").isEqualTo(OK);
assertMessageValidity("40:07:82:02:EA:60:1F").isEqualTo(OK);
assertMessageValidity("4F:07:00:00:11:CE:90:0F:00:78").isEqualTo(ERROR_DESTINATION);
assertMessageValidity("F0:07:82:02:EA:60:1F").isEqualTo(ERROR_SOURCE);
assertMessageValidity("40:07").isEqualTo(ERROR_PARAMETER_SHORT);
// Invalid display info
assertMessageValidity("40:07:09:A1:8C:17:51").isEqualTo(ERROR_PARAMETER);
assertMessageValidity("40:07:A7:0C:29").isEqualTo(ERROR_PARAMETER);
// Invalid Digital Broadcast System
assertMessageValidity("40:07:00:14:11:CE:90:0F:00:78").isEqualTo(ERROR_PARAMETER);
// Invalid Digital Broadcast System
assertMessageValidity("40:07:80:A0:07:95:F1").isEqualTo(ERROR_PARAMETER);
// Insufficient data for ARIB Broadcast system
assertMessageValidity("40:07:00:00:11:CE:90:0F:00").isEqualTo(ERROR_PARAMETER);
// Insufficient data for ATSC Broadcast system
assertMessageValidity("40:07:80:10:13:0B:34").isEqualTo(ERROR_PARAMETER);
// Insufficient data for DVB Broadcast system
assertMessageValidity("40:07:00:18:BE:77:00:7D:01").isEqualTo(ERROR_PARAMETER);
// Invalid channel number format
assertMessageValidity("40:07:80:9A:10:F9:D3").isEqualTo(ERROR_PARAMETER);
// Insufficient data for 1 part channel number
assertMessageValidity("40:07:00:90:04:F7").isEqualTo(ERROR_PARAMETER);
// Insufficient data for 2 part channel number
assertMessageValidity("40:07:80:91:09:F4:40").isEqualTo(ERROR_PARAMETER);
// Invalid Analogue Broadcast type
assertMessageValidity("40:07:02:03:EA:60:1F").isEqualTo(ERROR_PARAMETER);
// Invalid Analogue Frequency
assertMessageValidity("40:07:82:00:FF:FF:00").isEqualTo(ERROR_PARAMETER);
// Invalid Broadcast system
assertMessageValidity("40:07:02:02:EA:60:20").isEqualTo(ERROR_PARAMETER);
}
@Test
public void isValid_UserControlPressed() {
assertMessageValidity("40:44:07").isEqualTo(OK);