CEC : Add validator for tuner device status message
Test: atest HdmiCecMessageValidatorTest Bug: 170811408 Change-Id: Idf94ddb5d14e3cac2bda0dfbb54c63bd7bdca6db
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user