mbox series

[v2,0/2] cec: One Touch Record tests

Message ID cover.1623972511.git.deborahbrouwer3563@gmail.com
Headers show
Series cec: One Touch Record tests | expand

Message

Deborah Brouwer June 17, 2021, 11:41 p.m. UTC
This is part of an Outreachy project to expand the testing of
One Touch Record messages as handled by CEC adapters.

Changes since v1:
	Patch 1/2 cec: expand One Touch Record TV Screen test
	- add space after 'switch'
	- add "return" before fail
	- check analog broadcast type and broadcast system operand
	- add a comment when follower ignores message
	
	Patch 2/2 cec: expand One Touch Record On test
	- new patch

Deborah Brouwer (2):
  cec: expand One Touch Record TV Screen test
  cec: expand One Touch Record On test

 utils/cec-compliance/cec-test.cpp | 160 +++++++++++++++++++++++++++---
 utils/cec-follower/cec-tuner.cpp  |  37 ++++++-
 2 files changed, 176 insertions(+), 21 deletions(-)

Comments

Hans Verkuil June 18, 2021, 7:44 a.m. UTC | #1
On 18/06/2021 01:41, Deborah Brouwer wrote:
> Check that the follower ignores the Record TV Screen message if the

> initiator has a logical address other than Record or Backup (aka Reserved

> in CEC Version < 2.0). If the follower replies correctly, check that the

> source operand is valid.

> 

> Signed-off-by: Deborah Brouwer <deborahbrouwer3563@gmail.com>

> ---

>  utils/cec-compliance/cec-test.cpp | 53 ++++++++++++++++++++++++++-----

>  utils/cec-follower/cec-tuner.cpp  |  9 ++++--

>  2 files changed, 51 insertions(+), 11 deletions(-)

> 

> diff --git a/utils/cec-compliance/cec-test.cpp b/utils/cec-compliance/cec-test.cpp

> index 40d8369d..0051d72a 100644

> --- a/utils/cec-compliance/cec-test.cpp

> +++ b/utils/cec-compliance/cec-test.cpp

> @@ -1150,13 +1150,6 @@ static const vec_remote_subtests tuner_ctl_subtests{

>  

>  static int one_touch_rec_tv_screen(struct node *node, unsigned me, unsigned la, bool interactive)

>  {

> -	/*

> -	  TODO:

> -	  - Page 36 in HDMI CEC 1.4b spec lists additional behaviors that should be

> -	    checked for.

> -	  - The TV should ignore this message when received from other LA than Recording or

> -	    Reserved.

> -	 */

>  	struct cec_msg msg;

>  

>  	cec_msg_init(&msg, me, la);

> @@ -1172,8 +1165,52 @@ static int one_touch_rec_tv_screen(struct node *node, unsigned me, unsigned la,

>  		return OK_REFUSED;

>  	if (cec_msg_status_is_abort(&msg))

>  		return OK_PRESUMED;

> +	/*

> +	 * Follower should ignore this message if initiator has a logical

> +	 * address other than Record or Backup (aka "Reserved" in CEC Version < 2.0).

> +	 */

> +	if (!cec_has_record(1 << me) && !cec_has_backup(1 << me)) {

> +		fail_on_test(!timed_out(&msg));

> +		return OK;

> +	}

> +	fail_on_test(timed_out(&msg));

>  

> -	return 0;

> +	struct cec_op_record_src rec_src = {};

> +

> +	cec_ops_record_on(&msg, &rec_src);

> +

> +	if (rec_src.type < 1 || rec_src.type > 5)


Don't use the numbers, use the corresponding defines (CEC_OP_RECORD_SRC_OWN and
CEC_OP_RECORD_SRC_EXT_PHYS_ADDR).

> +		return fail("Invalid source.\n");

> +

> +	if (rec_src.type == CEC_OP_RECORD_SRC_DIGITAL &&

> +	    rec_src.digital.service_id_method == CEC_OP_SERVICE_ID_METHOD_BY_DIG_ID) {

> +

> +		switch (rec_src.digital.dig_bcast_system) {

> +		case CEC_OP_DIG_SERVICE_BCAST_SYSTEM_ARIB_GEN:

> +		case CEC_OP_DIG_SERVICE_BCAST_SYSTEM_ATSC_GEN:

> +		case CEC_OP_DIG_SERVICE_BCAST_SYSTEM_DVB_GEN:

> +		case CEC_OP_DIG_SERVICE_BCAST_SYSTEM_ARIB_BS:

> +		case CEC_OP_DIG_SERVICE_BCAST_SYSTEM_ARIB_CS:

> +		case CEC_OP_DIG_SERVICE_BCAST_SYSTEM_ARIB_T:

> +		case CEC_OP_DIG_SERVICE_BCAST_SYSTEM_ATSC_CABLE:

> +		case CEC_OP_DIG_SERVICE_BCAST_SYSTEM_ATSC_SAT:

> +		case CEC_OP_DIG_SERVICE_BCAST_SYSTEM_ATSC_T:

> +		case CEC_OP_DIG_SERVICE_BCAST_SYSTEM_DVB_C:

> +		case CEC_OP_DIG_SERVICE_BCAST_SYSTEM_DVB_S:

> +		case CEC_OP_DIG_SERVICE_BCAST_SYSTEM_DVB_S2:

> +		case CEC_OP_DIG_SERVICE_BCAST_SYSTEM_DVB_T:

> +			break;

> +		default:

> +			return fail("Invalid digital service broadcast system operand.\n");

> +		}

> +	}

> +

> +	if (rec_src.type == CEC_OP_RECORD_SRC_ANALOG) {

> +		fail_on_test(rec_src.analog.ana_bcast_type > 2);


Ditto here...

> +		fail_on_test(rec_src.analog.bcast_system > 8 && rec_src.analog.bcast_system != 0x1f);


...and here.

Regards,

	Hans

> +	}

> +

> +	return OK;

>  }

>  

>  static int one_touch_rec_on(struct node *node, unsigned me, unsigned la, bool interactive)

> diff --git a/utils/cec-follower/cec-tuner.cpp b/utils/cec-follower/cec-tuner.cpp

> index b9c21684..fd11bd10 100644

> --- a/utils/cec-follower/cec-tuner.cpp

> +++ b/utils/cec-follower/cec-tuner.cpp

> @@ -583,9 +583,6 @@ void process_tuner_record_timer_msgs(struct node *node, struct cec_msg &msg, uns

>  		  This is only a basic implementation.

>  

>  		  TODO:

> -		  - If we are a TV, we should only send Record On if the

> -		    remote end is a Recording device or Reserved. Otherwise ignore.

> -

>  		  - Device state should reflect whether we are recording, etc. In

>  		    recording mode we should ignore Standby messages.

>  		*/

> @@ -594,6 +591,12 @@ void process_tuner_record_timer_msgs(struct node *node, struct cec_msg &msg, uns

>  		if (!node->has_rec_tv)

>  			break;

>  

> +		__u8 la = cec_msg_initiator(&msg);

> +

> +		/* Ignore if initiator is not Record or Backup (aka "Reserved" in CEC Version < 2.0) */

> +		if (!cec_has_record(1 << la) && !cec_has_backup(1 << la))

> +			return;

> +

>  		struct cec_op_record_src rec_src = {};

>  

>  		rec_src.type = CEC_OP_RECORD_SRC_OWN;

>