static int standby_resume_active_source_nowake(struct node *node, unsigned me, unsigned la, bool interactive) { if (!node->remote[la].in_standby) return NOTAPPLICABLE; struct cec_msg msg = {}; unsigned unresponsive_time = 0; __u8 new_status; node->remote[la].in_standby = false; /* In CEC 2.0 it is specified that a device shall not go out of standby if an Active Source message is received. */ announce("Sending Active Source message."); cec_msg_init(&msg, me, la); cec_msg_active_source(&msg, node->phys_addr); int res = doioctl(node, CEC_TRANSMIT, &msg); fail_on_test(res && res != ENONET); fail_on_test(wait_changing_power_status(node, me, la, new_status, unresponsive_time)); fail_on_test_v2_warn(node->remote[la].cec_version, new_status != CEC_OP_POWER_STATUS_STANDBY); node->remote[la].in_standby = true; if (unresponsive_time > 0) warn("The device stayed correctly in standby, but became unresponsive for %d s.\n", unresponsive_time); return 0; }
static int vivid_received(struct cec_adapter *adap, struct cec_msg *msg) { struct vivid_dev *dev = adap->priv; struct cec_msg reply; u8 dest = cec_msg_destination(msg); u16 pa; u8 disp_ctl; char osd[14]; if (cec_msg_is_broadcast(msg)) dest = adap->log_addrs.log_addr[0]; cec_msg_init(&reply, dest, cec_msg_initiator(msg)); switch (cec_msg_opcode(msg)) { case CEC_MSG_SET_STREAM_PATH: if (cec_is_sink(adap)) return -ENOMSG; cec_ops_set_stream_path(msg, &pa); if (pa != adap->phys_addr) return -ENOMSG; cec_msg_active_source(&reply, adap->phys_addr); cec_transmit_msg(adap, &reply, false); break; case CEC_MSG_SET_OSD_STRING: if (!cec_is_sink(adap)) return -ENOMSG; cec_ops_set_osd_string(msg, &disp_ctl, osd); switch (disp_ctl) { case CEC_OP_DISP_CTL_DEFAULT: strcpy(dev->osd, osd); dev->osd_jiffies = jiffies; break; case CEC_OP_DISP_CTL_UNTIL_CLEARED: strcpy(dev->osd, osd); dev->osd_jiffies = 0; break; case CEC_OP_DISP_CTL_CLEAR: dev->osd[0] = 0; dev->osd_jiffies = 0; break; default: cec_msg_feature_abort(&reply, cec_msg_opcode(msg), CEC_OP_ABORT_INVALID_OP); cec_transmit_msg(adap, &reply, false); break; } break; default: return -ENOMSG; } return 0; }
static int one_touch_play_req_active_source(struct node *node, unsigned me, unsigned la, bool interactive) { struct cec_msg msg = {}; cec_msg_init(&msg, me, la); cec_msg_active_source(&msg, node->phys_addr); fail_on_test(!transmit_timeout(node, &msg)); /* We have now said that we are active source, so receiving a reply to Request Active Source should fail the test. */ cec_msg_init(&msg, me, la); cec_msg_request_active_source(&msg, true); fail_on_test(!transmit_timeout(node, &msg)); fail_on_test(!timed_out(&msg)); return 0; }
static int one_touch_play_view_on_change(struct node *node, unsigned me, unsigned la, bool interactive, __u8 opcode) { struct cec_msg msg = {}; int ret; fail_on_test(!util_interactive_ensure_power_state(node, me, la, interactive, CEC_OP_POWER_STATUS_ON)); interactive_info(true, "Please switch the TV to another source."); ret = one_touch_play_view_on(node, me, la, interactive, opcode); if (ret && ret != PRESUMED_OK) return ret; cec_msg_init(&msg, me, la); cec_msg_active_source(&msg, node->phys_addr); fail_on_test(!transmit_timeout(node, &msg)); fail_on_test(interactive && !question("Did the TV switch to this source?")); if (interactive) return 0; else return PRESUMED_OK; }