diff options
-rw-r--r-- | utils/cec-follower/Makefile.am | 3 | ||||
l--------- | utils/cec-follower/cec-common.cpp | 1 | ||||
-rw-r--r-- | utils/cec-follower/cec-follower.cpp | 275 | ||||
-rw-r--r-- | utils/cec-follower/cec-follower.h | 2 |
4 files changed, 13 insertions, 268 deletions
diff --git a/utils/cec-follower/Makefile.am b/utils/cec-follower/Makefile.am index e6544f64..e1585681 100644 --- a/utils/cec-follower/Makefile.am +++ b/utils/cec-follower/Makefile.am @@ -1,7 +1,8 @@ bin_PROGRAMS = cec-follower man_MANS = cec-follower.1 -cec_follower_SOURCES = cec-follower.cpp cec-follower.h cec-processing.cpp cec-log.cpp +cec_follower_SOURCES = cec-follower.cpp cec-follower.h cec-processing.cpp cec-log.cpp cec-common.cpp +cec_follower_CPPFLAGS = -I$(top_srcdir)/utils/common cec_follower_LDFLAGS = -lrt cec-log.cpp: cec-log.h diff --git a/utils/cec-follower/cec-common.cpp b/utils/cec-follower/cec-common.cpp new file mode 120000 index 00000000..083f11d7 --- /dev/null +++ b/utils/cec-follower/cec-common.cpp @@ -0,0 +1 @@ +../common/cec-common.cpp
\ No newline at end of file diff --git a/utils/cec-follower/cec-follower.cpp b/utils/cec-follower/cec-follower.cpp index fafad84a..3f746bf2 100644 --- a/utils/cec-follower/cec-follower.cpp +++ b/utils/cec-follower/cec-follower.cpp @@ -105,126 +105,6 @@ static void usage(void) ); } -static std::string caps2s(unsigned caps) -{ - std::string s; - - if (caps & CEC_CAP_PHYS_ADDR) - s += "\t\tPhysical Address\n"; - if (caps & CEC_CAP_LOG_ADDRS) - s += "\t\tLogical Addresses\n"; - if (caps & CEC_CAP_TRANSMIT) - s += "\t\tTransmit\n"; - if (caps & CEC_CAP_PASSTHROUGH) - s += "\t\tPassthrough\n"; - if (caps & CEC_CAP_RC) - s += "\t\tRemote Control Support\n"; - if (caps & CEC_CAP_MONITOR_ALL) - s += "\t\tMonitor All\n"; - if (caps & CEC_CAP_NEEDS_HPD) - s += "\t\tNeeds HPD\n"; - if (caps & CEC_CAP_MONITOR_PIN) - s += "\t\tMonitor Pin\n"; - return s; -} - -const char *version2s(unsigned version) -{ - switch (version) { - case CEC_OP_CEC_VERSION_1_3A: - return "1.3a"; - case CEC_OP_CEC_VERSION_1_4: - return "1.4"; - case CEC_OP_CEC_VERSION_2_0: - return "2.0"; - default: - return "Unknown"; - } -} - -const char *prim_type2s(unsigned type) -{ - switch (type) { - case CEC_OP_PRIM_DEVTYPE_TV: - return "TV"; - case CEC_OP_PRIM_DEVTYPE_RECORD: - return "Record"; - case CEC_OP_PRIM_DEVTYPE_TUNER: - return "Tuner"; - case CEC_OP_PRIM_DEVTYPE_PLAYBACK: - return "Playback"; - case CEC_OP_PRIM_DEVTYPE_AUDIOSYSTEM: - return "Audio System"; - case CEC_OP_PRIM_DEVTYPE_SWITCH: - return "Switch"; - case CEC_OP_PRIM_DEVTYPE_PROCESSOR: - return "Processor"; - default: - return "Unknown"; - } -} - -const char *la_type2s(unsigned type) -{ - switch (type) { - case CEC_LOG_ADDR_TYPE_TV: - return "TV"; - case CEC_LOG_ADDR_TYPE_RECORD: - return "Record"; - case CEC_LOG_ADDR_TYPE_TUNER: - return "Tuner"; - case CEC_LOG_ADDR_TYPE_PLAYBACK: - return "Playback"; - case CEC_LOG_ADDR_TYPE_AUDIOSYSTEM: - return "Audio System"; - case CEC_LOG_ADDR_TYPE_SPECIFIC: - return "Specific"; - case CEC_LOG_ADDR_TYPE_UNREGISTERED: - return "Unregistered"; - default: - return "Unknown"; - } -} - -const char *la2s(unsigned la) -{ - switch (la & 0xf) { - case 0: - return "TV"; - case 1: - return "Recording Device 1"; - case 2: - return "Recording Device 2"; - case 3: - return "Tuner 1"; - case 4: - return "Playback Device 1"; - case 5: - return "Audio System"; - case 6: - return "Tuner 2"; - case 7: - return "Tuner 3"; - case 8: - return "Playback Device 2"; - case 9: - return "Playback Device 3"; - case 10: - return "Tuner 4"; - case 11: - return "Playback Device 3"; - case 12: - return "Reserved 1"; - case 13: - return "Reserved 2"; - case 14: - return "Specific"; - case 15: - default: - return "Unregistered"; - } -} - static std::string tx_status2s(const struct cec_msg &msg) { std::string s; @@ -293,88 +173,6 @@ std::string status2s(const struct cec_msg &msg) return s; } -std::string all_dev_types2s(unsigned types) -{ - std::string s; - - if (types & CEC_OP_ALL_DEVTYPE_TV) - s += "TV, "; - if (types & CEC_OP_ALL_DEVTYPE_RECORD) - s += "Record, "; - if (types & CEC_OP_ALL_DEVTYPE_TUNER) - s += "Tuner, "; - if (types & CEC_OP_ALL_DEVTYPE_PLAYBACK) - s += "Playback, "; - if (types & CEC_OP_ALL_DEVTYPE_AUDIOSYSTEM) - s += "Audio System, "; - if (types & CEC_OP_ALL_DEVTYPE_SWITCH) - s += "Switch, "; - if (s.length()) - return s.erase(s.length() - 2, 2); - return s; -} - -static std::string laflags2s(unsigned flags) -{ - std::string s; - - if (!flags) - return s; - - s = "("; - if (flags & CEC_LOG_ADDRS_FL_ALLOW_UNREG_FALLBACK) - s += "Allow Fallback to Unregistered, "; - if (flags & CEC_LOG_ADDRS_FL_ALLOW_RC_PASSTHRU) - s += "Allow RC Passthrough, "; - if (flags & CEC_LOG_ADDRS_FL_CDC_ONLY) - s += "CDC-Only, "; - if (s.length()) - s.erase(s.length() - 2, 2); - return s + ")"; -} - -std::string rc_src_prof2s(unsigned prof) -{ - std::string s; - - prof &= 0x1f; - if (prof == 0) - return "\t\tNone\n"; - if (prof & CEC_OP_FEAT_RC_SRC_HAS_DEV_ROOT_MENU) - s += "\t\tSource Has Device Root Menu\n"; - if (prof & CEC_OP_FEAT_RC_SRC_HAS_DEV_SETUP_MENU) - s += "\t\tSource Has Device Setup Menu\n"; - if (prof & CEC_OP_FEAT_RC_SRC_HAS_MEDIA_CONTEXT_MENU) - s += "\t\tSource Has Contents Menu\n"; - if (prof & CEC_OP_FEAT_RC_SRC_HAS_MEDIA_TOP_MENU) - s += "\t\tSource Has Media Top Menu\n"; - if (prof & CEC_OP_FEAT_RC_SRC_HAS_MEDIA_CONTEXT_MENU) - s += "\t\tSource Has Media Context-Sensitive Menu\n"; - return s; -} - -std::string dev_feat2s(unsigned feat) -{ - std::string s; - - feat &= 0x7e; - if (feat == 0) - return "\t\tNone\n"; - if (feat & CEC_OP_FEAT_DEV_HAS_RECORD_TV_SCREEN) - s += "\t\tTV Supports <Record TV Screen>\n"; - if (feat & CEC_OP_FEAT_DEV_HAS_SET_OSD_STRING) - s += "\t\tTV Supports <Set OSD String>\n"; - if (feat & CEC_OP_FEAT_DEV_HAS_DECK_CONTROL) - s += "\t\tSupports Deck Control\n"; - if (feat & CEC_OP_FEAT_DEV_HAS_SET_AUDIO_RATE) - s += "\t\tSource Supports <Set Audio Rate>\n"; - if (feat & CEC_OP_FEAT_DEV_SINK_HAS_ARC_TX) - s += "\t\tSink Supports ARC Tx\n"; - if (feat & CEC_OP_FEAT_DEV_SOURCE_HAS_ARC_RX) - s += "\t\tSource Supports ARC Rx\n"; - return s; -} - void sad_encode(const struct short_audio_desc *sad, __u32 *descriptor) { __u8 b1, b2, b3 = 0; @@ -690,87 +488,30 @@ int main(int argc, char **argv) #else printf("cec-follower SHA : not available\n"); #endif - printf("\nDriver Info:\n"); - printf("\tDriver Name : %s\n", caps.driver); - printf("\tAdapter Name : %s\n", caps.name); - printf("\tCapabilities : 0x%08x\n", caps.capabilities); - printf("%s", caps2s(caps.capabilities).c_str()); - printf("\tDriver version : %d.%d.%d\n", - caps.version >> 16, - (caps.version >> 8) & 0xff, - caps.version & 0xff); - printf("\tAvailable Logical Addresses: %u\n", - caps.available_log_addrs); doioctl(&node, CEC_ADAP_G_PHYS_ADDR, &node.phys_addr); - printf("\tPhysical Address : %x.%x.%x.%x\n", - cec_phys_addr_exp(node.phys_addr)); struct cec_log_addrs laddrs = { }; doioctl(&node, CEC_ADAP_G_LOG_ADDRS, &laddrs); node.adap_la_mask = laddrs.log_addr_mask; node.cec_version = laddrs.cec_version; - printf("\tLogical Address Mask : 0x%04x\n", laddrs.log_addr_mask); - printf("\tCEC Version : %s\n", version2s(laddrs.cec_version)); - if (laddrs.vendor_id != CEC_VENDOR_ID_NONE) - printf("\tVendor ID : 0x%06x\n", laddrs.vendor_id); - printf("\tLogical Addresses : %u %s\n", - laddrs.num_log_addrs, laflags2s(laddrs.flags).c_str()); - for (unsigned i = 0; i < laddrs.num_log_addrs; i++) { - if (laddrs.log_addr[i] == CEC_LOG_ADDR_INVALID) - printf("\n\t Logical Address : Not Allocated\n"); - else - printf("\n\t Logical Address : %d\n", - laddrs.log_addr[i]); - printf("\t Primary Device Type : %s\n", - prim_type2s(laddrs.primary_device_type[i])); - printf("\t Logical Address Type : %s\n", - la_type2s(laddrs.log_addr_type[i])); - if (laddrs.cec_version < CEC_OP_CEC_VERSION_2_0) - continue; - printf("\t All Device Types : %s\n", - all_dev_types2s(laddrs.all_device_types[i]).c_str()); - + printf("\n"); + cec_driver_info(caps, laddrs, node.phys_addr); + if (laddrs.cec_version >= CEC_OP_CEC_VERSION_2_0) { bool is_dev_feat = false; + for (unsigned idx = 0; idx < sizeof(laddrs.features[0]); idx++) { - __u8 byte = laddrs.features[i][idx]; - - if (!is_dev_feat) { - if (byte & 0x40) { - printf("\t RC Source Profile :\n%s", - rc_src_prof2s(byte).c_str()); - } else { - const char *s = "Reserved"; - - switch (byte & 0xf) { - case 0: - s = "None"; - break; - case 2: - s = "RC Profile 1"; - break; - case 6: - s = "RC Profile 2"; - break; - case 10: - s = "RC Profile 3"; - break; - case 14: - s = "RC Profile 4"; - break; - } - printf("\t RC TV Profile : %s\n", s); - } - } else { + __u8 byte = laddrs.features[0][idx]; + + if (is_dev_feat) { node.has_arc_rx = (byte & CEC_OP_FEAT_DEV_SOURCE_HAS_ARC_RX) != 0; node.has_arc_tx = (byte & CEC_OP_FEAT_DEV_SINK_HAS_ARC_TX) != 0; node.has_aud_rate = (byte & CEC_OP_FEAT_DEV_HAS_SET_AUDIO_RATE) != 0; node.has_deck_ctl = (byte & CEC_OP_FEAT_DEV_HAS_DECK_CONTROL) != 0; node.has_rec_tv = (byte & CEC_OP_FEAT_DEV_HAS_RECORD_TV_SCREEN) != 0; node.has_osd_string = (byte & CEC_OP_FEAT_DEV_HAS_SET_OSD_STRING) != 0; - printf("\t Device Features :\n%s", - dev_feat2s(byte).c_str()); + break; } if (byte & CEC_OP_FEAT_EXT) continue; diff --git a/utils/cec-follower/cec-follower.h b/utils/cec-follower/cec-follower.h index a699dd1d..0f624779 100644 --- a/utils/cec-follower/cec-follower.h +++ b/utils/cec-follower/cec-follower.h @@ -47,6 +47,8 @@ #include <config.h> #endif +#include <cec-common.h> + #define ARRAY_SIZE(a) \ (sizeof(a) / sizeof(*a)) |