/* * Copyright (c) 2019 Amlogic, Inc. All rights reserved. * * This source code is subject to the terms and conditions defined in the * file 'LICENSE' which is part of this source code package. * * Description: */ #define LOG_MODULE_TAG "TV" #define LOG_CLASS_TAG "TvTest-cpp" #include #include #include #include #include #include #include #include #include #include "CTvLog.h" static int WriteSysfs(const char *path, const char *cmd) { int fd; fd = open(path, O_CREAT|O_RDWR | O_TRUNC, 0777); if (fd >= 0) { write(fd, cmd, strlen(cmd)); close(fd); return 0; } return -1; } static int WriteSysfs(const char *path, int value) { char cmdbuf[32] = {0}; sprintf(cmdbuf,"%d",value); return WriteSysfs(path, cmdbuf); } class TvTest: public TvClient::TvClientIObserver { public: tv_source_input_t CurrentSource; tv_source_input_t CurrentPipSource; int EdidVer; TvTest() { mpTvClient = TvClient::GetInstance(); mpTvClient->setTvClientObserver(this); } ~TvTest() { mpTvClient->Release(); } void onTvClientEvent(CTvEvent &event) { int eventType = event.getEventType(); printf("%s: eventType: %d.\n", __FUNCTION__, eventType); switch (eventType) { case CTvEvent::TV_EVENT_SIGNAL_DETECT: { TvEvent::SignalDetectEvent *signalDetectEvent = (TvEvent::SignalDetectEvent *)(&event); printf("%s: source: %d, signalFmt: %d, transFmt: %d, status: %d, isDVI: %d, Hdrinfo: %ud.\n", __FUNCTION__, signalDetectEvent->mSourceInput, signalDetectEvent->mFmt, signalDetectEvent->mTrans_fmt, signalDetectEvent->mStatus, signalDetectEvent->mDviFlag, signalDetectEvent->mhdr_info); WriteSysfs("/sys/class/video/disable_video", 0); break; } case CTvEvent::TV_EVENT_SOURCE_CONNECT: { TvEvent::SourceConnectEvent *sourceConnectEvent = (TvEvent::SourceConnectEvent *)(&event); printf("%s: source: %d, connectStatus: %d\n", __FUNCTION__, sourceConnectEvent->mSourceInput, sourceConnectEvent->connectionState); break; } default: printf("invalid event!\n", __FUNCTION__); break; } return; } int SendCmd(const char *data) { printf("%s: cmd is %s.\n", __FUNCTION__, data); if (strcmp(data, "start") == 0) { mpTvClient->StartTv(CurrentSource); } else if (strcmp(data, "stop") == 0) { mpTvClient->StopTv(CurrentSource); } else if (strcmp(data, "EDID_set") == 0) { mpTvClient->SetEdidVersion(CurrentSource, EdidVer); } else if (strcmp(data, "startPIP") == 0) { mpTvClient->StartTvInPIP(CurrentPipSource); } else if (strcmp(data, "stopPIP") == 0) { mpTvClient->StopTvInPIP(CurrentPipSource); } else { LOGE("invalid cmd!\n"); } return 0; } TvClient *mpTvClient; }; static int SetOsdBlankStatus(const char *path, int cmd) { return WriteSysfs(path, cmd); } static int DisplayInit() { SetOsdBlankStatus("/sys/class/graphics/fb0/osd_display_debug", 1); SetOsdBlankStatus("/sys/class/graphics/fb0/blank", 1); return 0; } static int SwitchPiPsource() { char Command[1]; int Source = SOURCE_INVALID; int id = 0; printf("##########################\n"); printf("#### please set PIP parms ####\n"); printf("#### only HDMI 1/2 support pip ####\n"); printf("#### source can set 1/2 ####\n"); printf("#### audio id need greater than 0 ####\n"); printf("#### set source && audio id (e.g. 1 2) ####\n"); printf("##########################\n"); if (scanf("%d %d", &Source, &id) != 2 || id <= 0) { printf("Error reading id\n"); while (getchar() != '\n'); return SOURCE_INVALID; } if (Source == 1) { Source = SOURCE_HDMI1; } else if (Source == 2) { Source = SOURCE_HDMI2; } SetAudioDecoderId(1, id); return Source; } int main(int argc, char **argv) { TvTest *test = new TvTest(); char Command[1]; int run = 1; DisplayInit(); test->CurrentSource=SOURCE_HDMI1; test->CurrentPipSource=SOURCE_INVALID; test->EdidVer=14; printf("#### please select cmd####\n"); printf("#### select 1 to hdmi 1 ####\n"); printf("#### select 2 to hdmi 2 ####\n"); printf("#### select 3 to hdmi 3 ####\n"); printf("#### select 4 to edid 1.4 (this is default) ####\n"); printf("#### select 5 to edid 2.0 ####\n"); printf("#### select 6 to edid auto ####\n"); printf("#### select 7 to AV1 ####\n"); printf("#### select 8 to AV2 ####\n"); printf("#### select 9 to PIP ####\n"); printf("#### select q to stop####\n"); printf("##########################\n"); while (run) { scanf("%s", Command); switch (Command[0]) { case 'q': { test->SendCmd("stop"); test->SendCmd("stopPIP"); SetOsdBlankStatus("/sys/class/graphics/fb0/blank", 0); run = 0; break; } case '1': { test->SendCmd("stop"); SetOsdBlankStatus("/sys/class/graphics/fb0/blank", 0); test->CurrentSource=SOURCE_HDMI1; test->SendCmd("start"); break; } case '2': { test->SendCmd("stop"); SetOsdBlankStatus("/sys/class/graphics/fb0/blank", 0); test->CurrentSource=SOURCE_HDMI2; test->SendCmd("start"); break; } case '3': { test->SendCmd("stop"); SetOsdBlankStatus("/sys/class/graphics/fb0/blank", 0); test->CurrentSource=SOURCE_HDMI3; test->SendCmd("start"); break; } case '4': { test->EdidVer = 0; test->SendCmd("EDID_set"); break; } case '5': { test->EdidVer = 1; test->SendCmd("EDID_set"); break; } case '6': { test->EdidVer = 2; test->SendCmd("EDID_set"); break; } case '7': { test->SendCmd("stop"); printf("#### select ####\n"); SetOsdBlankStatus("/sys/class/graphics/fb0/blank", 0); test->CurrentSource=SOURCE_AV1; test->SendCmd("start"); break; } case '8': { test->SendCmd("stop"); SetOsdBlankStatus("/sys/class/graphics/fb0/blank", 0); test->CurrentSource=SOURCE_AV2; test->SendCmd("start"); break; } case '9': { test->SendCmd("stopPIP"); SetOsdBlankStatus("/sys/class/graphics/fb0/blank", 0); test->CurrentPipSource = SwitchPiPsource(); if (test->CurrentPipSource == SOURCE_INVALID) break; test->SendCmd("startPIP"); break; } default: { test->SendCmd("start"); break; } } fflush (stdout); } delete test; return 0; }