255 lines
7.6 KiB
C++
255 lines
7.6 KiB
C++
/*
|
|
* 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 <syslog.h>
|
|
#include <signal.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <unistd.h>
|
|
#include <fcntl.h>
|
|
#include <pthread.h>
|
|
#include <TvClient.h>
|
|
#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;
|
|
}
|