Files
BPI-CM9-Linux/aml-comp/vendor/amlogic/aml_tvserver/test/main_tvtest.cpp
T

255 lines
7.6 KiB
C++
Raw Normal View History

2026-08-13 11:28:40 +08:00
/*
* 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;
}