[NOVATEK] NT96580行车记录仪功能学习笔记

本文详细探讨了基于联咏NT96580的行车记录仪功能开发,包括u-Boot升级灯控制、Flash内容存储、低电检测、按键处理、LED灯状态管理、视频水印设置、SD卡文件系统、版本号管理、视频上锁、声音处理、摄像头参数配置、App功能设置、WiFi管理和恢复出厂设置等各个环节,提供了关键代码和配置说明。
摘要由CSDN通过智能技术生成

目录

 

sdk文件结构(我个人理解)

一、u-Boot升级灯

二、将内容保存在Flash里面

1、应用场景:ACC断开后震动开机次数计数

(1)在UIInfo.h定义一个名为SF_SHOCKPOWERON_CNT的成员来记录震动开机次数

​编辑

(2)然后在震动开关机文件里面的函数应用

三、低电检测

应用 :低电震动不开机

四、按键

1、检测灵敏度

2、拍照按键

3、电源键

五、LED灯

1、配置

(1)在Dx\580_CARDV_EVB\IOCfg.h进行引脚配置

(2)LED灯控制函数

2、WiFi和录像状态

3、状态判断

(1)录像

 (2)WiFi

4、实现LED灯闪烁

 

六、水印

1、视频时间水印

(1)字体大小

(2)位置

(3)格式

2、视频图片水印

(1)去除

(2)水印图片样式&大小

3、提示语

4、AE_LOG(目前还不知道是啥)

七、SD卡保存文件名和路径

1、路径名

(1)一级名

(2)二级名

2、文件名

 停车监控文件名后缀

​编辑

ET580两路摄像头前后路区分

 八、版本号

(1)声明

(2)调用

九、视频上锁保存在EMR文件夹

有一个宏定义要打开才能生效

实现

 

十、声音

1、声音索引定义

2、发声

3、音量大小

4、SD卡异常报警声音

十一、摄像头相关

1、参数配置(分辨率+帧数)

(1)宏定义

(2)调用

2、镜头接入检测和app画面显示

(1)镜头接入

(2)调用

3、ET580后路摄像头一段时间后无法显示以及拍照报错

4、ET580 后路摄像头录制没有声音

5、镜头驱动帧数

十二、App功能设置

1、选项设置

2、功能实现

3、记录仪设置--录像质量选项

十三、WiFi

配置

wifi分辨率

1、默认WiFi名和密码

2、WiFi名和密码修改

APP修改WiFi名如果是CARDV_,这个前缀是改不掉的(其他的可以)

功能

1、修改密码后关机再上电密码没有保存

2、WiFi名和密码恢复出厂设置

方法一:

方法二:

十四、恢复出厂设置

1、记录仪功能设置恢复出厂设置

(1)恢复出厂设置函数

(2)设置

1)增加一个存储状态的变量(保存在Flash)

​编辑

2)在SysResetFlag()函数里面增加一项Reset

2、WiFi名称和密码恢复出厂设置

十五 、一秒5帧

十六、镜头翻转

目前验证不行

​编辑 解决办法直接改驱动

ET580镜头驱动翻转(写寄存器的值)

十七、镜头震动检测

镜头那边的真正实现函数

十八、停车监控时间计数

十九、画中画

1、逻辑

 2、WiFi:1920*1080P30画中画切换出问题的地方(AHD580三录)

3、WiFi:1280*720p30使用原方法画中画切换出现问题解决办法(AHD580三录)

4、ET580两路用原方法是可以的

5、初始状态显示模式设置(刚启动就画中画显示)

6、画中画app按钮切换选项

二十、画面镜像(水平翻转)

1、wifi命令

(1)声明

 (2)注册命令

2、调用函数命令

(1)声明

(2)注册命令

 (3)实现函数

二十一、水印实时日期和时间

 

二十三、ET580-64G升级卡(默认32G)

1、na51055_linux_ET580\code\driver\source\Makefile

2、BSP\root-fs\rootfs\etc_Model\etc_CARDV_ETHCAM_RX_EVB\init.d\S14_MMC_FS

​编辑

3、copy AHD580的/code/lib/external的exfat-utils-1.2.7过来

​编辑 4、修改/code/lib/external/Makefile加上下面的内容(AHD580复制过来)

 5、SrcCode\System\SysStrg_Exe.c先不加这个,64G卡格式化会失败报错

6、BSP\u-boot\include

​编辑

7、BSP\u-boot\cmd

8、BSP\u-boot\fs

 9、BSP\u-boot\cpnfigs

 10、BSP\u-boot\board

二十四、 ET后拉摄像头拍照报错

 

二十五、WIFI名字的MAC地址太长

二十六、视频录制格式(.TS/.MP4/.MOV)

二十七、各种开关

1、关机

2、WIFI开关

3、拍照

4、格式化SD卡

5、恢复出厂设置

6、录像开始与停止

(1)功能

(2)app同步

7、时间水印

​编辑

8、录像声音

9、视频上锁

10、喇叭宏定义

二十八、串口指令打印版本号

二十九、MOVIE_ISP_LOG

1、宏定义

2、实现函数

三十、修改码率使得文件大小降低

三十一、停车监控震动感应时长

1、功能设置界面选项

2、功能函数

三十二、突然断电有损坏文件

三十三、SD卡里面预留1G空间

三十四、wifi重启后app预览会消失

三十五、WIFI开关和视频流开关

三十六、震动开机会生成小文件

三十七、打开WIFI和关闭WIFI后文件预览不显示

三十八、后路不出图的时候模拟拔插

编译时候遇见的问题

1、代码中能跳转但是编译报错

2、ET580后路摄像头录像三倍速问题

3、停车监控前路进了缩时后路没有

解决办法

4、ET580 进入回放后出来以太网后路不显示,需要拔插才显示

5、正常录像通过APP打开停车监控时长后继续正常录像,报Vid的错误

6、按照JIRA改了之后MAC地址还是很长


 

sdk文件结构(我个人理解)

97fea3480140204cd6140043791035b2.png

1、DX文件夹里面是IO口以及项目使用到的相关外设配置

2、GX是外设功能实现函数所在文件夹

3、Startup文件夹是整个项目的入口,里面有个startup.c文件是main函数所在

4、UIAPP是手机APP功能设置的文件夹,增删改功能主要是在UIAPP和UIWnd文件夹里面操作

一、u-Boot升级灯

运行u-Boot程序时LED灯闪烁,找到运行过程中一直在运行的函数在里面进行LED引脚电平的翻转

宏定义

Z:\SunFan\AHD580\pip\na51055_PIP\BSP\u-boot\include\configs\nvt-na51055-evb.h

800fef1c14dc747436ae3e80d8997ef9.png

Z:\SunFan\AHD580\pip\na51055_PIP\BSP\u-boot\drivers\mtd\nvt_flash_spi\nvt_flash_spi_cmd.c

自带led引脚电平设置函数

/*      LED function for FW update*/
static void led_set_gpio_high(int operation)
{
	u32 gpio_reg;
	int ofs = NVT_LED_RED_PIN/32;
	int shift = NVT_LED_RED_PIN & 0x1F;

	ofs = ofs*0x4;

	/*Set gpio as high*/
	gpio_reg = INW(IOADDR_GPIO_REG_BASE + 0x20 + ofs);

	#if 0
	if (gpio_reg & (1 << shift))
		RESTORE_GPIO_DIR = 1;
	else {
		gpio_reg |= (1 << shift);
		OUTW(IOADDR_GPIO_REG_BASE + 0x20 + ofs, gpio_reg);
	}
	#else
	gpio_reg |= (1 << shift);
	OUTW(IOADDR_GPIO_REG_BASE + 0x20 + ofs, gpio_reg);
	#endif

	OUTW(IOADDR_GPIO_REG_BASE + 0x40 + ofs, (1 << shift));

	//LED BLUE
	ofs = NVT_LED_BLUE_PIN/32;
	shift = NVT_LED_BLUE_PIN & 0x1F;
	ofs = ofs*0x4;
	gpio_reg = INW(IOADDR_GPIO_REG_BASE + 0x20 + ofs);
	gpio_reg |= (1 << shift);
	OUTW(IOADDR_GPIO_REG_BASE + 0x20 + ofs, gpio_reg);
	OUTW(IOADDR_GPIO_REG_BASE + 0x40 + ofs, (1 << shift));

	#if 0 // do not use delay!!! it will slow down flash erase/program!!!
	/*Config duration*/
	if (operation)
		mdelay(NVT_LED_PROGRAM_DURATION);
	else
		mdelay(NVT_LED_ERASE_DURATION);
	#endif
}

static void led_set_gpio_low(void)
{
	//u32 gpio_reg;
	int ofs = NVT_LED_RED_PIN/32;
	int shift = NVT_LED_RED_PIN & 0x1F;

	ofs = ofs*0x4;
	/*Set gpio as low*/
	OUTW(IOADDR_GPIO_REG_BASE + 0x60 + ofs, (1 << shift));

	//LED BLUE
	ofs = NVT_LED_BLUE_PIN/32;
	shift = NVT_LED_BLUE_PIN & 0x1F;

	ofs = ofs*0x4;
	OUTW(IOADDR_GPIO_REG_BASE + 0x60 + ofs, (1 << shift));

	#if 0
	/*Force gpio direction as original config*/
	if (!(RESTORE_GPIO_DIR)) {
		gpio_reg = INW(IOADDR_GPIO_REG_BASE + 0x20 + ofs);
		gpio_reg &= ~(1 << shift);
		OUTW(IOADDR_GPIO_REG_BASE + 0x20 + ofs, gpio_reg);
		RESTORE_GPIO_DIR = 0;
	}
	#endif
}

在spiNand_programPage和nand_cmd_erase_block里面进行计数电平翻转

2fb47923f352166b38045ce143088ed0.png

32747a49cec54cd506374bae79fd8fa2.png

0d14eac5b8dbad1e67128d804e99ed93.png

9ef0a1f912fa912a7c38437714576198.png

二、将内容保存在Flash里面

在UIInfo.h(na51055_PIP\code\application\source\cardv\SrcCode\UIWnd\SPORTCAM\UIInfo\UIInfo.h)里面名为UI_IndexInfo的枚举类型定义一个成员用来计数(枚举类型里面的美格成员都是一个唯一的整数值),然后通过SysSetFlag()和SysGetFlag()函数来设置和获取枚举类型成员的值

cddd95d9d8538f3d12623f0ffd5d36d5.png

1、应用场景:ACC断开后震动开机次数计数

(1)在UIInfo.h定义一个名为SF_SHOCKPOWERON_CNT的成员来记录震动开机次数

4043df53930aa9d16cd7d2d19a62d066.png

(2)然后在震动开关机文件里面的函数应用

UIWnd\SPORTCAM\UIFlow\UIFlowMovie\UIFlowWndMovie.c:

每次开机都会跑这个函数,acc接入震动开机计数清零、acc断开开机一次计数值甲乙

6aa3eed717c7b57207d733763bbc2271.png

System\SysMain_Exe.c:在System_OnShutdown关机函数里面判断计数值是否超过预设值,调用Gsensor_SetSensitivityParking(GSENSOR_OFF);并传入参数GSENSOR_OFF使得下次震动无法开机

	Gsensor_SetSensitivityParking(DrvPower_GetBatteryValue()<195?GSENSOR_OFF:SysGetFlag(FL_GSENSOR));

		/*sf begin*/
		if(SysGetFlag(SF_SHOCKPOWERON_CNT)>9){
			Gsensor_SetSensitivityParking(GSENSOR_OFF);
		}
		/*sf end*/

三、低电检测

System\SysMain_Exe.c:在System_OnShutdown关机函数里面调用DrvPower_GetBatteryValue通过ADC读取当前电压值并做出判断。

电压值<11.6V ACC断开后下次震动无法开机Gsensor_SetSensitivityParking(GSENSOR_OFF);

电压正常Gsensor_SetSensitivityParking(SysGetFlag(FL_GSENSOR));

87d5164f75750c6461bae36cf5631d40.png

4743431b976bc5e50f513f3bd227bd8c.png

应用 :低电震动不开机

Gx\include\GxInput.h

da08212589e7a4f5a45902f095cafa44.png

System\SysMain_Exe.c 

409f85b5ef07e3d1fc17f01876596ee3.png

 Gsensor_SetSensitivityParking函数最后是跳到code\driver\source\gsensor\gsensor_da380\gsensor_da380.c里面去执行GSensor_DA380_ParkingMode

四、按键

1、检测灵敏度

在System\SysInput_Exe.c里面有定时器,每几秒循环在检测。SX_TIMER_ITEM的参数三就是循环检测的时间(参数*20ms)

c40b8664a691ecd039904ce997ecc01b.png

2、拍照按键

长按:格式化存储卡并重启

短按:拍照

System\SysInput_Exe.c

void UI_DetNormalKey(void)
{
	static int press_cnt = 0;
	int adc_key ;
	adc_key = DrvKey_DetNormalKey();

	if(press_cnt)
		printf("adc_key:%d press_cnt:%d\n",adc_key,press_cnt);

	if(adc_key!=0){
		press_cnt++;
	}else if(press_cnt>30){
		if(System_GetState(SYS_STATE_CARD) == CARD_INSERTED){//判断存储卡是否插入
			UISound_Play(DEMOSOUND_SOUND_KEY_TONE);
			Ux_SendEvent(&CustomMovieObjCtrl, NVTEVT_EXE_MOVIE_REC_STOP, 0);//停止录像
			Delay_DelayMs(1000);
			Ux_SendEvent(0, NVTEVT_EXE_SYSRESET, 0);//默认恢复设置:WiFIi名和密码等
			Delay_DelayMs(1000);
			BKG_PostEvent(NVTEVT_BKW_FORMAT_CARD);//格式化存储卡
			Delay_DelayMs(3000);
			// Ux_SendEvent(&CustomMovieObjCtrl, NVTEVT_EXE_MOVIE_REC_START, 0);
			system("cd /root");
			system("reboot");
			press_cnt = 0;
		}
	}else if(press_cnt>0){
		if(gMovData.State == MOV_ST_REC){//录像开启时才进行拍照
			Ux_SendEvent(&CustomMovieObjCtrl, NVTEVT_EXE_MOVIE_REC_RAWENC, 0);
		}
		press_cnt = 0;
	}
}

3、电源键

长按:关机

短按:开启/暂停录像

Gx\GxInput\Key\GxKey.c

d7c1ae54fdfcee6a5432f8da4d0c0224.png

void GxKey_DetPwrKey(void)
{
	static int pwr_cnt = 0;
	UINT32 uiPwrKey = DrvKey_DetPowerKey();
	if(pwr_cnt)
		printf("pwr_cnt:%d\n",pwr_cnt);
	if(uiPwrKey!=0){
		pwr_cnt++;
	}else if(pwr_cnt>30){
		UISound_Play(DEMOSOUND_SOUND_KEY_TONE);
		if (g_fpKeyCB) {
			g_fpKeyCB(KEY_CB_POWER, KEY_RELEASE, -2147483648);
		}
		pwr_cnt = 0;
	}else if(pwr_cnt>0){
		if(SysGetFlag(FL_MOVIE_REC)==0){//判断当前录像状态:开/关
			Ux_SendEvent(&CustomMovieObjCtrl, NVTEVT_EXE_MOVIE_REC_START, 0);//开启录像
			WifiApp_SendCmd(WIFIAPP_CMD_NOTIFY_STATUS, WIFIAPP_RET_RECORD_STARTED);//手机APP同步
		}else{
			Ux_SendEvent(&CustomMovieObjCtrl, NVTEVT_EXE_MOVIE_REC_STOP, 0);
			WifiApp_SendCmd(WIFIAPP_CMD_NOTIFY_STATUS, WIFIAPP_RET_RECORD_STOPPED);
		}
		pwr_cnt = 0;
	}
}

五、LED灯

蓝灯L_GPIO_12:录像——开启录像闪烁、关闭录像常亮

红灯L_GPIO_11:WiFi——开启WiFi常亮、手机连接成功闪烁

1、配置

(1)在Dx\580_CARDV_EVB\IOCfg.h进行引脚配置

c3b3e8ba5a8757c10c6f88e0044a0e59.png

(2)LED灯控制函数

Dx\580_CARDV_EVB\IOCfg.c

void LED_red_ctrl(BOOL status)
{
	if(status)
		gpio_setPin(LED_RED);
	else
		gpio_clearPin(LED_RED);
}

void LED_blue_ctrl(BOOL status)
{
	if(status)
		gpio_setPin(LED_BLUE);
	else
		gpio_clearPin(LED_BLUE);
}

Dx\include\DrvExt.h 

db7b5c7fec11298f6df82db06e35a244.png

2、WiFi和录像状态

code\application\source\cardv\SrcCode\PrjInc.h:WiFi和LED状态

0b8ee676a19b4ebd68c8f034e1c01889.png

UIWnd\ALEXA\UIFlow\UIFlowMovie\UIFlowMovieFuncs.h :录像状态

9e97fa4ad013f9845a60e757e7dc763c.png

3、状态判断

195ed05099ba4911951c64557b826354.png

(1)录像

SrcCode\UIApp\Movie\UIAppMovie_Exe.c:

fad08a1989212277e33c03ddc7f65e4b.png

6bbccb83833a236b94150600ab238036.png

 (2)WiFi

UIApp\Setup\UISetup_Exe.c:

1f96379b9c2bcf3cc71bd564aad87d46.png

a2e9c05c08aba86ba23438d39bbae678.png

UIApp\Network\UIAppNetwork.c:

e5509c590aa44a2366e09321d7f0130d.png

4、实现LED灯闪烁

System\SysInput_Exe.c里面循环运行的定时器函数UI_DetCustom1Key

97953918403f109a8e095d654b413160.png

	//LED
	static WIFI_type wifi_cnt = WIFI_STATUS_OFF;
	if(cardv_status.WIFI_status!=wifi_cnt){
		if(cardv_status.WIFI_status==WIFI_STATUS_OFF){
			cardv_status.LED_status.RED_LED = OFF;
			LED_red_ctrl(OFF);
		}else{
			cardv_status.LED_status.RED_LED = ON;
			LED_red_ctrl(ON);
		}
		wifi_cnt = cardv_status.WIFI_status ;
	}else if(cardv_status.WIFI_status==WIFI_STATUS_CONNECT){
		cardv_status.LED_status.RED_LED = !cardv_status.LED_status.RED_LED;
		LED_red_ctrl(cardv_status.LED_status.RED_LED);
	}

	if(gMovData.State == MOV_ST_REC){
		cardv_status.LED_status.BLUE_LED = !cardv_status.LED_status.BLUE_LED;
		LED_blue_ctrl(cardv_status.LED_status.BLUE_LED);
	}else if(cardv_status.LED_status.BLUE_LED == OFF){
		cardv_status.LED_status.BLUE_LED = ON;
		LED_blue_ctrl(ON);
	}

 

六、水印

1、视频时间水印

(1)字体大小

UIApp\MovieStamp\MovieStamp.c:MovieStamp_Setup

3723a0012796944c0641ba4e47e3c0f6.png

(2)位置

UIApp\MovieStamp\MovieStamp.c:MovieStamp_Setup

93b94430084ecab7759b71949ac8ba13.png

在UIApp\Movie\UIAppMovie_Exe.c里面有MoiveStamp_Exe.c结构体(好几个,需要找到对应的~懒人方法:全部改成一样的)

a68258959e4f8823e583b34cf7b56e69.png

(3)格式

UIApp\MovieStamp\MovieStamp.c:MovieStamp_UpdateData

年月日/月日年...AM/PM

8e1dff5acf48fdfe4a103628339a1167.png

UIApp\Movie\UIAppMovie_Exe.c:MovieExe_WifiMovieStamp()

70d937548b45f252d9c95efd9a76d671.png

2、视频图片水印

(1)去除

改了宏定义和驱动后需要make clean再make

source\cardv\SrcCode\PrjCfg_DVCam.h和PrjCfg_Default.h将“WATERLOGO_FUNCTION”改成DISABLE

954719fd5a4b627a53a9f4131d1157f8.png

0ce46dbd998301663edee5fd48e7fc2e.png

(2)水印图片样式&大小

UIApp\Movie\UIAppMovie_Exe.c:根据WiFi分辨率选择图片样式和大小(848*480 / 1080*480)

c064664d79beba3cfe88c521044f6961.png

3、提示语

40a9833882a187d1624bc7b34dd29bd4.jpeg

UIApp\Network\WifiAppCmd.c+WifiAppCmd.h 和 UIApp\Network\WifiAppXML.c+WifiAppXML.h

73c4a581b53db62780d9a1057b0747bc.png

b4ab4788be28a53cdaee01283a46e35b.pngdfa737717d971a098563b247cc2f3cfc.png

cfb50ebba26e272f598244d9b33b6f35.png

4、AE_LOG(目前还不知道是啥)

SrcCode\UIApp\MovieStamp\MovieStamp.c:MovieStamp_get_isp_status显示在录像上

e2242f3f54ee45178db52240a09e442b.png

 

七、SD卡保存文件名和路径

1、路径名

(1)一级名

UIApp\Movie\UIAppMovie_Exe.c:MOVIE_ROOT_PATH
e1b61d544cc86b92474c54accec3e1ae.png

(2)二级名

UIApp\Movie\UIAppMovie_RecSetting.c:

Moive是正常录像的文件名(当存储卡满的时候新的视频会从第一个视频开始覆盖),EMR是震动开机时的视频(会上锁不会被覆盖)

b6eccaf367f3d0209e8ee77cc6ffd548.png

2、文件名

UIApp\Movie\UIAppMovie_Exe.c:NH_endChar

MovieExe_FileNamingCB视频文件命名,MovieExe_RawEncodeFileNamingCB照片文件名

4a194c21dd6cd847dfc4d8828c18d24e.png

b5dbc4893983c78ff3f4d701b92f722f.png

 停车监控文件名后缀

UIApp\Movie\UIAppMovie_Exe.c:MovieExe_FileNamingCB

9348f2640738448a8b299d262ebdaabb.png

ET580两路摄像头前后路区分

MovieExe_FileNamingCB

423e6257681e451d95aa82e0a8594e06.png

71e88b9434e44defbb54d387f3e71d07.png

 八、版本号

(1)声明

SrcCode\PrjInc.h

dc8cadacb950f049d5e5684e09d43b09.png

SrcCode\ProjectInfo.h

1704077e226f7554e219ee77b656f0d2.png

System\SysMain.c 

static char FW_verison[32];
char* Prj_GetVersionString(void)
{
	char  buf[32];
	char* p  =	NULL;
	int   i  =	0;
	int   j  = 	0;

	char months[12][5] = {"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
	char month_ver[5];
	char day_ver[5];
	char year_ver[5];

	strcpy(buf,__DATE__);
	p = strtok(buf, " ");

    while (p != NULL) {
		switch(i)
		{
			case 0:
				for(j=0;j<12;j++){
					if(strcmp(p,months[j])==0){
						sprintf(month_ver,"%02d",j+1);
					}
				}
				break;
			case 1:
				sprintf(day_ver,"%02d",atoi(p));
				break;
			case 2:
				sprintf(year_ver,"%s",p);
				break;
		}
        p = strtok(NULL, " ");
		i++;
    }
	sprintf(FW_verison,"AHD580666666.%s%s%s",year_ver,month_ver,day_ver);
	return FW_verison;
}

(2)调用

1、UIApp\Network\WifiAppXML.c

c3e3aa7a05fc019c9f61680fa60c0bbc.png

2、UIWnd\SPORTCAM\UIMenu\UIMenuCommon\MenuCommonOption.c——MenuCommonOption_UpdateContent

e5d79dea07c4ab985d7aaf8bfa060361.png

3、UIWnd\SPORTCAM\UIInfo\UIInfo.c——Save_MenuInfo

ee49cca7627d1baa75dd61568519378e.png

九、视频上锁保存在EMR文件夹

有一个宏定义要打开才能生效

UIWnd\SPORTCAM\UIInfo\UICfgDefault.h:DEFAULT_MOVIE_URGENT_PROTECT_AUTO

650d2e9e5d904e89b21cf56c9f3d6f15.png

 

Ux_PostEvent(NVTEVT_KEY_SELECT, 1, NVTEVT_KEY_PRESS);

UIFlow\UIFlowMovie\UIFlowWndMovie.c)——UIFlowWndMovie_OnKeyMenu

398eaff2434a32acdcf23f7a5e022804.png

c00d820e1d7f58d9b7bbb9d0d5f82a55.png

实现

System\SysInput_Exe.c:UI_DetCustom1Key

3f6e88fda9e56fb22a93ac4cead3524b.png

 

十、声音

1、声音索引定义

SrcCode\UIWnd\SPORTCAM\Resource\SoundData.h

b8fdd83821c236a975718e3b08ed3b16.png

UIWnd\SPORTCAM\Resource\SoundData.c

4241ba3b2b8dc7fc63ef2f7a59b8c27a.png

2、发声

UIWnd\SPORTCAM\Resource\SoundData.c:UISound_Play()

直接调用UISound_Play()即可

f70b109bdb0cf16a52a7dc13e67a3ab0.png

0590b2ecfd2f1fcf7c2ed7f9f1a57668.png

3、音量大小

通过GxSound_SetVolume()函数的参数设置声音大小,最大100

code\application\source\cardv\SrcCode\System\SysMain_Exe.c:System_OnBoot

5373e6f584294ba8845e0829af652c1d.png

4、SD卡异常报警声音

UIWnd\SPORTCAM\Resource\SoundData.c

e4a984c46f744aedbbbfc6b3ae156194.png

在下面声明的时候是第四个在上面使用的时候也要对应第四个

UIWnd\SPORTCAM\Resource\SoundData.h 

39961efc293d480ca9cea3acfdd2160d.png

实现

SrcCode\Dx\580_CARDV_ETHCAM_RX_EVB\DxStorage_Card.c

dde5360ea60b47108dfba8a7eb636288.png

5c633d831498441eafa73f79b88d23bf.png

十一、摄像头相关

1、参数配置(分辨率+帧数)

(1)宏定义

UIWnd\SPORTCAM\UIInfo\UICfgDefault.h:DEFAULT_MOVIE_SIZE

991d70f22a5a0a861885be3f44936e5f.png

(2)调用

UIWnd\SPORTCAM\UIInfo\UIInfo.c:SysResetFlag

bca9914c764f4060dc8936695b890b1c.png

d6171e3f8f893ec9f613e707a7509c0d.png

2594f1bec2ca61fed788843d3548f58b.png

2、镜头接入检测和app画面显示

(1)镜头接入

UIApp\Movie\UIAppMovie_Exe.c:MovieExe_Sensor_HotPlug_Disp

bcefc2a8066d4ad0cc5e0f041b9a3c36.png

不同镜头接入时System_GetEnableSensor()和 System_GetPrevEnableSensor();检测返回值不同

(2)调用

UIApp\Movie\UIAppMovie_Exe.c:MovieExe_PipCB调用MovieExe_DispCB

UIApp\AppDisp_PipView.c:MovieExe_DispCB调用PipView_OnDraw调用PipView_OnDraw-3Sensor(老版本)

INT32 PipView_OnDraw_3sensor(APPDISP_VIEW_DRAW *pDraw) //PIP = Picture In Picture
{
	IRECT            dst_region;
	#if (DUALCAM_PIP_BEHIND_FLIP)
	IPOINT	dstLocation = {0, 0};
	#endif
	
	if (1){//pDraw->viewcnt == 3){

		if(UI_GetData(FL_DUAL_CAM) == DUALCAM_BOTH){
			if(pDraw->p_dst_img->dim.w  && pDraw->p_dst_img->dim.h){
				PipView_FillDataBlack(pDraw->p_dst_img, NULL) ;
			}

			// img1
			dst_region.x = 0;
			dst_region.y = pDraw->p_dst_img->dim.h / 2;
			dst_region.w = pDraw->p_dst_img->dim.w ;
			dst_region.h = pDraw->p_dst_img->dim.h / 2;
			if(pDraw->p_src_img[0] && pDraw->p_dst_img->dim.w && pDraw->p_dst_img->dim.h){
				PipView_ScaleData(pDraw->p_src_img[0], &dst_region, pDraw->p_dst_img, &dst_region);
			}
			// img2
			dst_region.x = 0;
			dst_region.y = 0;
			dst_region.w = pDraw->p_dst_img->dim.w / 2;
			dst_region.h = pDraw->p_dst_img->dim.h / 2;
			if(pDraw->p_src_img[1] && pDraw->p_dst_img->dim.w && pDraw->p_dst_img->dim.h){
				#if (DUALCAM_PIP_BEHIND_FLIP == DISABLE)
				PipView_ScaleData(pDraw->p_src_img[1], REGION_MATCH_IMG, pDraw->p_dst_img, &dst_region);
				#else
				// flip rear image to destination buffer
				IRECT		dstRegion;

				// scale rear image to top-right corner of destination buffer (size 1/4)
				dstRegion.x = 0;//pDraw->p_dst_img->dim.w / 2;
				dstRegion.y = 0;
				dstRegion.w = ALIGN_CEIL_4(pDraw->p_dst_img->dim.w / 2);
				dstRegion.h = ALIGN_CEIL_4(pDraw->p_dst_img->dim.h / 2);
				PipView_ScaleData(pDraw->p_src_img[1], REGION_MATCH_IMG, pDraw->p_dst_img, &dstRegion);

				// flip and paste scaled image from top-right to top-left of destination buffer
				dstLocation.x = pDraw->p_dst_img->dim.w / 2;//0;
				dstLocation.y = 0;
				PipView_RotateData(pDraw->p_dst_img, &dstRegion, pDraw->p_dst_img, &dstLocation, HD_VIDEO_DIR_MIRRORX);

				// paste top-right of front image to destination buffer
				if (pDraw->p_src_img[0]) {
					PipView_ScaleData(pDraw->p_src_img[0], &dstRegion, pDraw->p_dst_img, &dstRegion);
				}
				#endif
			}
			// img3
			dst_region.x = pDraw->p_dst_img->dim.w / 2;
			dst_region.y = 0;
			dst_region.w = pDraw->p_dst_img->dim.w / 2;
			dst_region.h = pDraw->p_dst_img->dim.h / 2;
			if(pDraw->p_src_img[2] && pDraw->p_dst_img->dim.w && pDraw->p_dst_img->dim.h){
				#if (DUALCAM_PIP_BEHIND_FLIP == DISABLE)
				PipView_ScaleData(pDraw->p_src_img[2], REGION_MATCH_IMG, pDraw->p_dst_img, &dst_region);
				#else
				IRECT		dstRegion;

				// scale rear image to top-right corner of destination buffer (size 1/4)
				dstRegion.x = pDraw->p_dst_img->dim.w / 2;
				dstRegion.y = dst_region.y;
				dstRegion.w = ALIGN_CEIL_4(pDraw->p_dst_img->dim.w / 2);
				dstRegion.h = ALIGN_CEIL_4(pDraw->p_dst_img->dim.h / 2);
				PipView_ScaleData(pDraw->p_src_img[2], REGION_MATCH_IMG, pDraw->p_dst_img, &dstRegion);

				// flip and paste scaled image from top-right to top-left of destination buffer
				dstLocation.x = 0;
				dstLocation.y = dst_region.y;
				PipView_RotateData(pDraw->p_dst_img, &dstRegion, pDraw->p_dst_img, &dstLocation, HD_VIDEO_DIR_MIRRORX);

				// paste top-right of front image to destination buffer
				//if (pDraw->p_src_img[0]) {
				//	PipView_ScaleData(pDraw->p_src_img[0], &dstRegion, pDraw->p_dst_img, &dstRegion);
				//}
				PipView_FillDataBlack(pDraw->p_dst_img, &dstRegion) ;
				#endif
			}
		}else if(UI_GetData(FL_DUAL_CAM) == DUALCAM_FRONT){//Tx1
			if(pDraw->p_src_img[0] && pDraw->p_dst_img != pDraw->p_src_img[0]){
			        PipView_FillDataBlack(pDraw->p_dst_img, NULL) ;
			}
			// img1
			dst_region.x = 0;
			dst_region.y = 0;
			dst_region.w = pDraw->p_dst_img->dim.w;
			dst_region.h = pDraw->p_dst_img->dim.h;
			if(pDraw->p_src_img[0] && pDraw->p_dst_img != pDraw->p_src_img[0]){
			        PipView_ScaleData(pDraw->p_src_img[0], REGION_MATCH_IMG, pDraw->p_dst_img, &dst_region);
			}

		}else if(UI_GetData(FL_DUAL_CAM) == DUALCAM_BEHIND){//Tx2
			if(pDraw->p_src_img[1] && pDraw->p_dst_img != pDraw->p_src_img[1]){
			        PipView_FillDataBlack(pDraw->p_dst_img, NULL) ;
			}

			// img2
			dst_region.x = 0;
			dst_region.y = 0;
			dst_region.w = pDraw->p_dst_img->dim.w;
			dst_region.h = pDraw->p_dst_img->dim.h;
			if(pDraw->p_src_img[1] && pDraw->p_dst_img != pDraw->p_src_img[1]){
			        PipView_ScaleData(pDraw->p_src_img[2], REGION_MATCH_IMG, pDraw->p_dst_img, &dst_region);
			}
		}else if(UI_GetData(FL_DUAL_CAM) == DUALCAM_BOTH2){//Rx Sensor
			//if(pDraw->p_src_img[0] && pDraw->p_dst_img != pDraw->p_src_img[0])
			//        PipView_FillDataBlack(pDraw->p_dst_img, NULL, COLOR_YUV_BLACK) ;

			// img0
			dst_region.x = 0;
			dst_region.y = 0;
			dst_region.w = pDraw->p_dst_img->dim.w;
			dst_region.h = pDraw->p_dst_img->dim.h;
			if(pDraw->p_src_img[2] && pDraw->p_dst_img != pDraw->p_src_img[2]){
			        PipView_ScaleData(pDraw->p_src_img[2], REGION_MATCH_IMG, pDraw->p_dst_img, &dst_region);
			}
		}
		
	}
	return E_OK;
}

3、ET580后路摄像头一段时间后无法显示以及拍照报错

na51055_linux_ET580\configs\Linux\cfg_580_CARDV_ETHCAM_RX_EVB\nvt-na51055-info.dtsi

58b1d724bd514cd78d1aa7f21e221a1a.png

4、ET580 后路摄像头录制没有声音

UIApp\Background\UIBackgroundObj.c:BackgroundEthCamTxRecInfo

560eb4e34e7c440bbdb191650c8b6a55.jpeg

5、镜头驱动帧数

code\hdal\ext_devices\sensor\sen_gc8613:sen_gc8613

CTL_SENDRV_GET_MODE_BASIC_PARAM

2e19f46e097b4b278c251b69bd5d6e96.png

十二、App功能设置

1、选项设置

UIApp\Network\WifiAppCmdMapping.c

f231c7e7be72ccb6c082adc192509e46.png

4a502d32e11e91e99ef59850af7830c2.png

2、功能实现

UIApp\Movie\UIAppMovie_Exe.c   和   UIApp\Setup\UISetup_Exe.c

 

3、记录仪设置--录像质量选项

UIApp\Network\WifiAppCmdMapping.c(这个不知道要不要还没试)

44dff91f5b7e4a15a3dbf3f02df5f47e.png

UIWnd\SPORTCAM\UIInfo\UIInfo.h(这个不知道要不要还没试)

924e0fe03a2d4070bce9d8259ac33d27.png

UIWnd\SPORTCAM\UIFlow\UIFlowMovie\UIFlowMovieIcons.c

b085e570cea84ba88ca01254e00d0a09.png

UIWnd\SPORTCAM\Resource\UIResource.c (主要的)

300c7cb486ed48ffb419f9761dc9be96.png

 UIWnd\SPORTCAM\UIMenu\UIMenuMovie\MenuMovie.c(显示选项的地方)

6a86015548f44189a3f2ae377e980e1c.png

十三、WiFi

上电跑这边打开wifi以及视频流

SrcCode\System\SysMain.c

c1b9fa8e1f7a4e5abfda544dabf1c001.png

配置

UIWnd\SPORTCAM\UIInfo\UIMovieMapping.c

7a69ecb7feac5f0f8b692a75f3c7f756.png

wifi分辨率

UIWnd\SPORTCAM\UIInfo\UIMovieMapping.c

b477e2faa76c4ed69079112b06d644ce.png

  •  MOVIE_SIZE_PARAM 定义了一些与视频编码相关的参数:
  1. UINT32 uiWidth: 视频的宽度,通常以像素为单位。
  2. UINT32 uiHeight: 视频的高度,同样以像素为单位。
  3. UINT32 uiVidFrameRate: 视频的帧率,即每秒播放的画面数量。通常以帧/秒(fps)为单位。
  4. UINT32 uiTargetBitrate: 目标比特率,即视频编码时的目标数据传输速率。比特率越高,视频质量越好,但文件大小也越大。通常以比特/秒(bps)为单位。
  5. UINT32 uiDispAspectRatio: 显示的宽高比(aspect ratio),这是一个比例值,描述视频画面的宽度与高度的比例关系。例如,16:9 或 4:3。
  6. UINT32 uiImageRatio: 图像比例,这可能是指视频图像的长宽比,但与 uiDispAspectRatio 类似。有时在不同的上下文中,这可能具有特定的含义,比如它可能指的是像素的宽高比(pixel aspect ratio, PAR)。

 

  • MOVIE_AQ_PARAM 定义了一些与视频编码中的自适应量化 (Adaptive Quantization, AQ) 相关的参数。自适应量化是一种技术,用于根据视频内容调整量化参数,从而优化编码质量和效率。
  1. INT32 aq_enable: 一个布尔标志,指示是否启用自适应量化功能。通常非零值表示启用,零值表示禁用。

  2. UINT32 aq_str: 自适应量化强度。这是一个无符号整数,用于控制自适应量化算法的强度或敏感度。较高的值意味着更强烈的自适应量化效果。

  3. INT32 sraq_init_aslog2: 初始自适应量化参数的对数形式。这是自适应量化过程开始时使用的初始量化参数的一个对数表示。例如,如果初始量化参数为 16,则该值可以设置为 4,因为 24=1624=16。

  4. INT32 max_sraq: 最大自适应量化参数。这是自适应量化参数可以达到的最大值,用于限制量化参数的增长。

  5. INT32 min_sraq: 最小自适应量化参数。这是自适应量化参数可以达到的最小值,用于防止量化参数过低导致质量损失。

  6. INT32 sraq_const_aslog2: 自适应量化常量的对数形式。这个参数用于调整自适应量化算法的行为,可以看作是一个常量因子,影响量化参数的变化程度。

 

  • MOVIE_CBR_PARAM 定义了一系列与恒定比特率 (Constant Bitrate, CBR) 编码模式相关的参数。CBR 是一种视频编码模式,其中输出视频流的比特率保持在一个固定的水平。
  1. UINT32 uiEnable: 一个布尔标志,指示是否启用 CBR 编码模式。通常非零值表示启用,零值表示禁用。

  2. UINT32 uiStaticTime: 静态时间,可能用于控制编码过程中的静态阶段或预热阶段的时间长度。

  3. UINT32 uiFrameRate: 视频的帧率,即每秒播放的画面数量。通常以帧/秒(fps)为单位。

  4. UINT32 uiByteRate: 目标比特率,即视频编码时的目标数据传输速率。比特率越高,视频质量越好,但文件大小也越大。通常以比特/秒(bps)为单位。在 CBR 模式下,这通常是恒定的。

  5. UINT32 uiGOP: Group Of Pictures 的缩写,表示一组图片。这是一组连续的关键帧(I 帧)和非关键帧(P 帧和 B 帧)的集合。GOP 大小决定了 I 帧之间的距离,进而影响视频的随机访问能力和压缩效率。

  6. UINT32 uiInitIQp: 初始 I 帧量化参数。量化参数(QP)用于控制视频编码的质量,较小的 QP 值通常会导致更高的视频质量。

  7. UINT32 uiMinIQp: 最小 I 帧量化参数。这限制了 I 帧 QP 的下限,以防止过度压缩导致的质量损失。

  8. UINT32 uiMaxIQp: 最大 I 帧量化参数。这限制了 I 帧 QP 的上限,以防止过度压缩导致的质量损失。

  9. UINT32 uiInitPQp: 初始 P 帧量化参数。与 I 帧类似,P 帧也有自己的量化参数。

  10. UINT32 uiMinPQp: 最小 P 帧量化参数。

  11. UINT32 uiMaxPQp: 最大 P 帧量化参数。

  12. INT32 iIPWeight: I 帧与 P 帧之间的权重。这可以用来调整 I 帧和 P 帧在编码过程中的相对重要性。

  13. UINT32 uiRowRcEnalbe: 一个布尔标志,指示是否启用按行的比特率控制。如果启用,编码器会在每一行上应用比特率控制。

  14. UINT32 uiRowRcQpRange: 按行比特率控制的量化参数范围。这可以用来调整按行比特率控制的效果。

  15. UINT32 uiRowRcQpStep: 按行比特率控制的量化参数步长。这可以用来控制量化参数随行变化的程度。

61489e11af794b64ad9e866c308df495.png

1、默认WiFi名和密码

UIApp\Network\UIAppNetwork.c

gSSID_AP_default和PASSPHRASE_AP_default是默认的WiFi名和密码;

gSSID和gPASSPHRASE保存用户修改后的WiFi名和密码。

902fb7a279b0f7e377ff2b536e8cf21b.png

2、WiFi名和密码修改

UIApp\Setup\UISetup_Exe.c:SetupExe_OnWifiSetSSID、SetupExe_OnWifiSetPassPhrase

f429c733d9379db0932f1ad75984f8dd.png

 

APP修改WiFi名如果是CARDV_,这个前缀是改不掉的(其他的可以)

功能

1、修改密码后关机再上电密码没有保存

UIApp\Network\UIAppNetwork.c:UINet_WifiSetting

a391c4e6b4026186cc3b60f2a2de61d8.png

2、WiFi名和密码恢复出厂设置

修改名字和密码后需要掉电和拔卡后才能真正保存验证恢复出厂设置功能

方法一:

UIWnd\SPORTCAM\UIInfo\UIInfo.h:Reset_MenuInfo

efa0fd9841d044016bcc45dbdea66fff.png

方法二:

UIWnd\SPORTCAM\UIInfo\UIInfo.h:UIMenuUIMenuStoreInfo这个结构体内的数据会永久保存(保存在flash里面)

2af44277214fc33319ce56a2d4a0e9b3.png

UIWnd\SPORTCAM\UIInfo\UIInfo.c:SysResetFlag

0548e477fcc61e25e4e21f834d50aaf8.png

703801bce19c82d3268f446a0645d83c.png

十四、恢复出厂设置

1、记录仪功能设置恢复出厂设置

(1)恢复出厂设置函数

UIApp\Setup\UISetup_Exe.c

768c1df20e3994478ffc9ba2688af711.png

UIWnd\SPORTCAM\UIInfo\UIInfo.c

784a831f92d49260a759dcd7eb7911e2.png

(2)设置

1)增加一个存储状态的变量(保存在Flash)

UIWnd\SPORTCAM\UIInfo\UIInfo.h(可参照本文   二、将内容保存在Flash里面)

72e22e66c7051126c5a64b073c9bcee5.png

UIApp\Network\WifiAppCmdMapping.c :选项设置

2747dd13b3ea65a8290c654945630827.png

2)在SysResetFlag()函数里面增加一项Reset

UIWnd\SPORTCAM\UIInfo\UIInfo.c

dd7a439ee1f4c10fd0a3eea2724080d5.png

2、WiFi名称和密码恢复出厂设置

UIApp\Setup\UISetup_Exe.c:Reset_MenuInfo

4364f635db7fded15b83112520bca630.png

UIWnd\SPORTCAM\UIInfo\UIInfo.c:Reset_MenuInfo

267c1dbba2b8b0462a2fefe40f0eb44a.png

UIWnd\SPORTCAM\UIInfo\UIInfo.c: SysExeMenuSettingFuncs

f4e837b83bed63c778a33456153d6ca0.png

十五 、一秒5帧

UIWnd\SPORTCAM\UIInfo\UIInfo.c:SysSetFixedFlag()
619bcd9f1b64fbcb6d14d504c2da0318.png

6ed937233b613de1af52b8b9ecb021c1.png

十六、镜头翻转

目前验证不行

code\hdal\ext_devices\sensor\configs\dtsi\gc4653_cfg.dtsi

1931ac883dd24d19d0fce23a214cbed7.png

6c0d0fce1058587c13ac24cd508e1d60.png 解决办法直接改驱动

改了宏定义和驱动后需要make clean

code\hdal\ext_devices\sensor\sen_gc4653\sen_gc4653.c:sen_chg_mode_gc8613

b210ae8acc68d22d217ada351a5d1070.png

ET580镜头驱动翻转(写寄存器的值)

951bec7120394e21b0a03c7a7b424e9d.png

bb4d80f1bc664e70bd5c373443cc38ae.pnge3b95f2e442b4ebcac6d310a994615fb.png

十七、镜头震动检测

在Gx\include\GxInput.h里面声明

f094f2afb60c471ea9bdb83072f8b3ed.png

在 Gx\GxInput\Gsensor\GxGsensor.c定义

6078434f571b4768abfe0022f54c2add.png

SrcCode\System\SysInput_Exe.c:UI_DetCustom1Key函数500ms检测一次太久了,放到UI_DetNormalKey中100ms检测一次

d9d9f1dd1389a2f9c434fe732217bdb9.png

f37ac9805439ba6e95dbe95a3b9d6688.png

f64f1cb5c0dfbb5d6239386256ed2c74.png

 ZSystem\SysInput_Exe.c:UI_DetCustom1Key

af79997df01edbf4bed3fb5f8dd59aa5.png

镜头那边的真正实现函数

code\driver\source\gsensor\gsensor_da380\gsensor_da380.c 

7333d157b01e4509ad09ef124dc4c159.png

十八、停车监控时间计数

System\SysInput_Exe.c:UI_DetCustom1Key

通过UI_GetData(Sys_GetFlag)获取预先设置的停车监控时间

08829dacc78a35c874cf5ee2cd693eb1.png

 时间倒数结束后关机

9c138be22f0bebc4721801219812f3f6.png

十九、画中画

1、逻辑

UIApp\Movie\UIAppMovie_Exe.c:MovieExe_OnDualcam

获取镜头接入状态

c3f253a7dce8a1664c3cbffe5516c776.png

8400a3407083d1b6af80294f1d751b4e.png

UIApp\AppDisp_PipView.c:PipView_OnDraw_3sensor

INT32 PipView_OnDraw_3sensor(APPDISP_VIEW_DRAW *pDraw)
{
	IRECT	src_region[3]	=	{0};
	IRECT	dst_region[3]	=	{0};
	BOOL	is_cam_disp[3]	=	{0};//标记三个摄像头的画面是否需要显示
	UINT32	cam_work		=	System_GetEnableSensor();
	printf("\n\n\ncam_work:%d\n\n\n",cam_work);

	if(pDraw->p_dst_img->dim.w  && pDraw->p_dst_img->dim.h){
		PipView_FillDataBlack(pDraw->p_dst_img, NULL) ;//填充黑色背景
	}

	if(cardv_status.app_pip_style==DUALCAM_FRONT){//只显示前路
		is_cam_disp[0] = TRUE;
	}else if((cardv_status.app_pip_style==DUALCAM_BEHIND)&&(cam_work&0x2)){	//bit2只显示第二路
		is_cam_disp[1] = TRUE;
	}else if((cardv_status.app_pip_style==DUALCAM_BOTH2)&&(cam_work&0x4)){	//bit4只显示第三路
		is_cam_disp[2] = TRUE;
	}else{	//PIP 默认显示
		printf("\n\n\nDUALCAM_BOTH\n\n\n");
		if(cam_work==3){//前摄和第二路接入时
			dst_region[1].x = 0;
			dst_region[1].y = 0;
			dst_region[1].w = pDraw->p_dst_img->dim.w/2;
			dst_region[1].h = pDraw->p_dst_img->dim.h/2;
			is_cam_disp[0] = TRUE;
			is_cam_disp[1] = TRUE;
		}else if(cam_work==5){//前摄和第三路接入时
			dst_region[2].x = 0;
			dst_region[2].y = 0;
			dst_region[2].w = pDraw->p_dst_img->dim.w/2;
			dst_region[2].h = pDraw->p_dst_img->dim.h/2;
			is_cam_disp[0] = TRUE;
			is_cam_disp[2] = TRUE;
		}else{//三录摄像头都接入时
			dst_region[0].x = 0;
			dst_region[0].y = pDraw->p_dst_img->dim.h/2;
			dst_region[0].w = pDraw->p_dst_img->dim.w;
			dst_region[0].h = pDraw->p_dst_img->dim.h/2;

			dst_region[1].x = 0;
			dst_region[1].y = 0;
			dst_region[1].w = pDraw->p_dst_img->dim.w/2;
			dst_region[1].h = pDraw->p_dst_img->dim.h/2;

			dst_region[2].x = pDraw->p_dst_img->dim.w/2;
			dst_region[2].y = 0;
			dst_region[2].w = pDraw->p_dst_img->dim.w/2;
			dst_region[2].h = pDraw->p_dst_img->dim.h/2;

			is_cam_disp[0] = TRUE;
			is_cam_disp[1] = TRUE;
			is_cam_disp[2] = TRUE;
		}
	}

	for(int i=0;i<SENSOR_CAPS_COUNT;i++){//遍历预设摄像头数量
		if( is_cam_disp[i] ){//检查是否需要显示 TRUE/FALSE
			if(pDraw->p_src_img[i] && pDraw->p_dst_img->dim.w && pDraw->p_dst_img->dim.h){//判断确认目标图像的尺寸有效,即有地方可以绘制图像
				PipView_ScaleData(pDraw->p_src_img[i], src_region[i].w?&src_region[i]:REGION_MATCH_IMG, \
								  pDraw->p_dst_img,    dst_region[i].w?&dst_region[i]:REGION_MATCH_IMG);//对源图像(pDraw->p_src_img[i])进行缩放并复制到目标图像(pDraw->p_dst_img)中指定的区域
			}
		}
	}
	return E_OK;
}

 2、WiFi:1920*1080P30画中画切换出问题的地方(AHD580三录)

UIApp\Movie\UIAppMovie_Exe.c:MovieExe_WifiCB

ImageApp_MovieMulti_WifiPushIn的返回值出现了问题

ad92a85ad5bd6391dbd1cc6feb0cd7c6.png

3、WiFi:1280*720p30使用原方法画中画切换出现问题解决办法(AHD580三录)

UIApp\Movie\UIAppMovie_Exe.c

28d111cdcaf040dfdbee27458c5136f9.png

UIApp\AppDisp_PipView.c :PipView_OnDraw_3sensor

7a0ec120c1c638d58f3a0527040e0d4e.png

FL_DUAL_CAM初始化的地方:UIWnd\SPORTCAM\UIInfo\UIInfo.c :SysSetFixedFlagSysInit

ff640c448c93ef8a1e4ae991c9680f61.png

4、ET580两路用原方法是可以的

 

5、初始状态显示模式设置(刚启动就画中画显示)

UIApp\Movie\UIAppMovie_Exe.c:MovieExe_EthCam_ChgDispCB

278df612f002ba4bbc29f47b59214cc6.png

6、画中画app按钮切换选项

UIApp\Network\WifiAppCmdMapping.c

5467f703eb97430da1b2d188ed1532ca.png

二十、画面镜像(水平翻转)

记录仪设置里面有个开关按钮但目前不起作用

1、wifi命令

(1)声明

UIApp\Network\WifiAppCmd.h:WIFIAPP_CMD_FLIP_MIRROR

1433b3605c8d3db2fcd80c1ead09c2fc.png

 (2)注册命令

UIApp\Network\WifiAppCmd.c:

b04d4b1412b1602e6025a7c82bfac89a.png

2、调用函数命令

(1)声明

UIApp\Network\UIAppWiFiCmd.h:NVTEVT_WIFI_EXE_MOVIE_FLIP_MIRROR

fbed85aeca603615461640fde1ca1cc3.png

(2)注册命令

UIApp\Network\UIAppWiFiCmd_Exe.c

de2f781ac3fd74568e124835ac2f6c03.png

 (3)实现函数

UIApp\Network\UIAppWiFiCmdMovie_Exe.c:WiFiCmd_OnExeSetMovieFlipMirror

7435b7ce7cf6f3677862df323cca560c.png

UIWnd\SPORTCAM\UIInfo\UIInfo.h 

9824bb30aa59061484a7cb3bd0600a30.png

但是主界面没有显示这个功能图标

目前测试改动如下:

UIInfo.c

ccab3ad1adc4e2077344a8d526816b65.png

b523bf84f06856a68032f47f9e9ed0c4.png

d78c28953929ec9f1ee18530f553cdfb.png

 

二十一、水印实时日期和时间

UIApp\Setup\UISetup_Exe.c:SetupExe_OnData

5ae33f367a09eee269ba7a1eaab63dbf.png

INT32 SetupExe_OnDate(VControl *pCtrl, UINT32 paramNum, UINT32 *paramArray)
{
    DBG_FUNC_BEGIN("\r\n");
	if (paramNum == 3) {
        struct tm Curr_DateTime;

		DBG_IND("%d %d %d\r\n", paramArray[0], paramArray[1], paramArray[2]);

        Curr_DateTime = hwclock_get_time(TIME_ID_CURRENT);
        Curr_DateTime.tm_year = paramArray[0];
        Curr_DateTime.tm_mon = paramArray[1];
        Curr_DateTime.tm_mday = paramArray[2];

        hwclock_set_time(TIME_ID_CURRENT, Curr_DateTime, 0);
	}
    DBG_FUNC_END("\r\n");
	return NVTEVT_CONSUME;
}

UIApp\Setup\UISetup_Exe.c:SetupExe_OnTime

aa9ee1b6ab2f6cd492e4b81e9a05fff2.png

INT32 SetupExe_OnTime(VControl *pCtrl, UINT32 paramNum, UINT32 *paramArray)
{
    DBG_FUNC_BEGIN("\r\n");
	if (paramNum == 3) {
        struct tm Curr_DateTime;

		DBG_IND("%d %d %d\r\n", paramArray[0], paramArray[1], paramArray[2]);

        Curr_DateTime = hwclock_get_time(TIME_ID_CURRENT);
        Curr_DateTime.tm_hour = paramArray[0];
        Curr_DateTime.tm_min  = paramArray[1];
        Curr_DateTime.tm_sec  = paramArray[2];

        hwclock_set_time(TIME_ID_CURRENT, Curr_DateTime, 0);
	}
    DBG_FUNC_END("\r\n");
	return NVTEVT_CONSUME;
}

 

二十三、ET580-64G升级卡(默认32G)

原厂提供解决办法

13dfb99dbc764371a9c228591ab11620.jpeg

008e8695d3a74c6eae3b9e7c7e3c3a5d.jpeg

72018ac11e1c4ca48ffda9c5f2539417.jpeg

d176a372649d4d8aa39fdb9e13cba5c6.jpeg

1、na51055_linux_ET580\code\driver\source\Makefile

在Makefile做如下修改才会编译出exfat.ko并install到BSP中

5cf8e48debdf4bb48f23c89a96080e07.png

2、BSP\root-fs\rootfs\etc_Model\etc_CARDV_ETHCAM_RX_EVB\init.d\S14_MMC_FS

etc_XXX根据当前配置进行选择,在S14_MMC_FS文件里面加如下内容,以加载exfat.ko

560d942a33b8436cb23633116a9f6194.png

3、copy AHD580的/code/lib/external的exfat-utils-1.2.7过来

150c69c2fe5243ca9c469170cbd938f8.png 4、修改/code/lib/external/Makefile加上下面的内容(AHD580复制过来)

b2ccdaaa6be441b6bbae1bcfe680ef72.png

00e08a1b1a6741c4a7962d39033fb6b8.png

0350ba31cccb471fa20c774aa15b7ae0.png 6f867fc2b12d46f39747d1a6f4bcf512.png

 5、SrcCode\System\SysStrg_Exe.c先不加这个,64G卡格式化会失败报错

在System_OnStrgInit_FS()中,打开FILE_CFG_SUPPORT_EXFAT

73d01d6593924712bb51592c32bfefcc.png

6、BSP\u-boot\include

 Z:\SunFan\ET580\na51055_linux_ET580\BSP\u-boot\include\fs.h

4442475b0b9b485daaef4d96ef3dbe2b.png

7、BSP\u-boot\cmd

Z:\SunFan\ET580\na51055_linux_ET580\BSP\u-boot\cmd\Makefile

6337c456d4d848a5bb095665f9e0b571.png Z:\SunFan\ET580\na51055_linux_ET580\BSP\u-boot\cmd\Kconfig

c95be3af31944071ac4c8fe191e87a95.png

8、BSP\u-boot\fs

a906455b4a6048b3af699769903cba22.png

Z:\SunFan\ET580\na51055_linux_ET580\BSP\u-boot\fs\Makefile

5cff4cb551dc4835a6c1bb6fdd686da5.png Z:\SunFan\ET580\na51055_linux_ET580\BSP\u-boot\fs\Kconfig 

95bdecab9eff427dbf89e8326d72da2e.png

Z:\SunFan\ET580\na51055_linux_ET580\BSP\u-boot\fs\fs.c

7b0c012c56454795a1e2f48b4018ec3c.png 863bee7498bc4cdcb53197309929199d.png

 9、BSP\u-boot\cpnfigs

Z:\SunFan\ET580\na51055_linux_ET580\BSP\u-boot\configs\nvt-na51055_nand_defconfig

430df13241c24bec8470012ccaf0e305.png

7e8600ca7473412db677de8c960e5d42.png

 10、BSP\u-boot\board

Z:\SunFan\ET580\na51055_linux_ET580\BSP\u-boot\board\novatek\common\nvt_ivot_fw_update_utils.c

e253e60d45bb4b5995cf0234317936f9.png

 

二十四、 ET后拉摄像头拍照报错

原厂提供的方法:96580_patch_imgcap_20240705比对这个文件夹进行增加

code\lib\include\ImageApp\ImageApp_MovieMulti.h

76befc5b820c4a18821d60d90a754de0.png

b765bdc2c2594626a1cfdd9f2e1b9c4d.png

code\lib\include\ImageApp\ImageApp_Common.h

65d7a27ff8be481bbb636cb3e5e3b059.png

f83130cfa2094214b0538bc0cdc4b7c9.png

 

二十五、WIFI名字的MAC地址太长

68fa1875cd3e42f6ac80883fa10bfa38.png

二十六、视频录制格式(.TS/.MP4/.MOV)

SrcCode\PrjCfg_Default.h

2dfb0bbe7f8548588b98c5a5d9e7e7b8.png

二十七、各种开关

1、关机

Ux_PostEvent(NVTEVT_SYSTEM_SHUTDOWN, 1, 0); 调用这个命令执行关机

System\SysMain_Exe.c:命令执行函数注册

0c04d2728621453ab51bea5865a11ccc.png

2eb6e4acad1d409f96e8c03dfcb8da37.png

2、WIFI开关

UIApp\Setup\UISetup_Exe.c:

4173d8542ac04cb388c542c5f9d4ca5d.png

Ux_SendEvent(&UISetupObjCtrl, NVTEVT_EXE_WIFI_STOP, 0);

Ux_SendEvent(&UISetupObjCtrl, NVTEVT_EXE_WIFI_START, 0);

Ux_SendEvent(0, NVTEVT_EXE_WIFI_STOP, 0);

Ux_SendEvent(0, NVTEVT_EXE_WIFI_START, 0);

3、拍照

Ux_SendEvent(&CustomMovieObjCtrl, NVTEVT_EXE_MOVIE_REC_RAWENC, 0);

4、格式化SD卡

BKG_PostEvent(NVTEVT_BKW_FORMAT_CARD);

5、恢复出厂设置

Ux_SendEvent(0, NVTEVT_EXE_SYSRESET, 0);

6、录像开始与停止

(1)功能

UIApp\Movie\UIAppMovie_Exe.c:

3fb60bede6b8429da91c3b4c44aba24d.png

Ux_SendEvent(&CustomMovieObjCtrl, NVTEVT_EXE_MOVIE_REC_START, 0);

Ux_SendEvent(&CustomMovieObjCtrl, NVTEVT_EXE_MOVIE_REC_STOP, 0);

(2)app同步

UIApp\Network\WifiAppCmd.h定义了各种app命令和功能

WifiApp_SendCmd(WIFIAPP_CMD_NOTIFY_STATUS, WIFIAPP_RET_RECORD_STARTED);

WifiApp_SendCmd(WIFIAPP_CMD_NOTIFY_STATUS, WIFIAPP_RET_RECORD_STOPPED);

7、时间水印

UIApp\Network\WifiAppCmd.h

app命令

00f8966451694063a9b1b587e160f19e.png

UIApp\Network\WifiAppCmd.c

FL_MOVIE_DATEIMPRINT是保存开关的状态,存在flash里面的

acb048cba83a40c4b96b8e9051b737e5.png

UIApp\Network\UIAppWiFiCmd_Exe.c

命令注册执行函数

10f8edbb47284a15a0d8bb050b1d753c.png

UIApp\Network\UIAppWiFiCmdMovie_Exe.c 

562f394c4efa4717939c77d2dda1c50c.png

UIApp\Movie\UIAppMovie_Exe.c :

最终在这实现功能

05eaa052ea7147209f820b8248fd419b.png

8、录像声音

在UIApp\Network\WifiAppCmd.h定义app命令WIFIAPP_CMD_MOVIE_AUDIO 2007

a510d34b843d4a97b1d803492fde79f1.png

UIApp\Network\UIAppWiFiCmd_Exe.c为NVTEVT_WIFI_EXE_MOVIE_AUDIO命令注册执行函数

0951afdc9b494fe18949c1d4ba5a9485.png

使用:先SysSetFlag(FL_MOVIE_AUDIO,0/1)之后Ux_SendEvent(&CustomMovieObjCtrl,NVTEVT_EXE_MOVIE_AUDIO,1,SysGetFlag(FL_MOVIE_AUDIO));

9、视频上锁

Ux_PostEvent(NVTEVT_KEY_SELECT, 1, NVTEVT_KEY_PRESS);

10、喇叭宏定义

UIWnd\SPORTCAM\UIInfo\UICfgDefault.h:

7a6cce12015d410e835495ded21167b1.png

二十八、串口指令打印版本号

目前是输入指令没反应---未解决

1、code\application\source\cardv\SrcCode\UIApp\Network\EthCamAppCmd.h

d70f3cbaf4c647bc99f6621a2f442554.png

2、code\application\source\cardv\SrcCode\System\SysInput_cmd.c

f6267d24ad584a6b982f46511c10a750.png

d1c55af695b1458d85af9acf6e982e12.png

二十九、MOVIE_ISP_LOG

1、宏定义

code\application\source\cardv\SrcCode\UIApp\MovieStamp\MovieStamp.h

开了ISP_LOG视频水印会被去掉

e811784bb60e4e059f78b579f5f7b0ad.png

2、实现函数

修改过和原来的不一样但我还没有对比

code\application\source\cardv\SrcCode\UIApp\MovieStamp\MovieStamp.c

4f5fe9bc77a4495c9140d1ea9b81c37a.png

static void MovieStamp_get_isp_status(UINT32 id, char* Buf, UINT32 BufLen)
{
	AET_STATUS_INFO ae_status = {0};
	AWBT_STATUS awb_status = {0};
	IQT_WDR_PARAM wdr = {0};
//	IQT_DEFOG_PARAM defog = {0};
	id = 0;
	ae_status.id = 0;//id;
	vendor_isp_get_ae(AET_ITEM_STATUS, &ae_status);
	awb_status.id = id;
	vendor_isp_get_awb(AWBT_ITEM_STATUS, &awb_status);
	wdr.id = id;
	vendor_isp_get_iq(IQT_ITEM_WDR_PARAM, &wdr);
//	defog.id = id;
//	vendor_isp_get_iq(IQT_ITEM_DEFOG_PARAM, &defog);
#if 0
	snprintf(Buf, BufLen, "%3d %4d %4d %6d %6d %4d %4d %d %d %4d %4d %4d\0",
												ae_status.status_info.lv/100000,
												ae_status.status_info.lum,
												ae_status.status_info.expect_lum,
												ae_status.status_info.expotime[0],
												ae_status.status_info.iso_gain[0],
												ae_status.status_info.overexp_adj,
												ae_status.status_info.overexp_cnt,
												wdr.wdr.enable,
												defog.defog.enable,
												awb_status.status.cur_r_gain,
												awb_status.status.cur_b_gain,
												awb_status.status.cur_ct
												);
#else
	snprintf(Buf, BufLen, "%3d %4d %4d %6d %6d %4d %4d %d %4d %4d %4d\0",
												ae_status.status_info.lv/100000,
												ae_status.status_info.lum,
												ae_status.status_info.expect_lum,
												ae_status.status_info.expotime[0],
												ae_status.status_info.iso_gain[0],
												ae_status.status_info.overexp_adj,
												ae_status.status_info.overexp_cnt,
												wdr.wdr.enable,
												awb_status.status.cur_r_gain,
												awb_status.status.cur_b_gain,
												awb_status.status.cur_ct
												);
#endif
	//DBG_DUMP("isp Buf=%s\r\n",Buf);

	return;
}

三十、修改码率使得文件大小降低

UIWnd\SPORTCAM\UIInfo\UIMovieMapping.c

前面两个是以太网的ET580,最后一个是AHD580三路的

eef1f0b956ac47db8b89813d15424097.png

三十一、停车监控震动感应时长

1、功能设置界面选项

UIApp\Network\WifiAppCmdMapping.c

0a448483c62b4eff8a73ea861b13c9a9.png

2、功能函数

UIApp\Network\UIAppWiFiCmd.h

3013ac2b33214e8b827e637c2dbf18cc.png

UIApp\Network\UIAppWiFiCmdMovie_Exe.c

7d9f38fbd3a745ea811ff5e73ec91bfa.png

UIApp\Movie\UIAppMovie_Exe.c

 

三十二、突然断电有损坏文件

UIApp\Movie\UIAppMovie_Exe.c

放在这个地方程序会跑飞

0c655d60365345f788733389ea30209b.png

放在这个地方

7bdef7edb919466c8b08d6acd6927df5.png

三十三、SD卡里面预留1G空间

UIApp\Movie\UIAppMovie_Exe.cs

6e94127e1d9945a49f30d5e79d156929.png

三十四、wifi重启后app预览会消失

fdc2a75fed5546599c0ec5c32cce89f3.png

 视频流被关闭了没有打开

SrcCode\System\SysInput_Exe.c在语音判断实现打开WIFI的地方开启视频流

ac1dc3bc02c9479fae2bdddd562d3ce9.png

 

三十五、WIFI开关和视频流开关

BKG_PostEvent(NVTEVT_BKW_WIFI_ON);WIFI开关
Ux_PostEvent(NVTEVT_EXE_MOVIE_STRM_START,0);视频流开关

三十六、震动开机会生成小文件

停车监控倒计时结束的不是很及时,导致录完一分钟后有开始录了2~3秒视频

b6b6f9844e1b49ada1db7411c5012a8e.png

按理说计数120才有1秒,但是有延迟,现在计数到117就执行关机程序

2d8443cc939540f1bc315c0ddb429297.png

三十七、打开WIFI和关闭WIFI后文件预览不显示

打开WiFi和关闭WiFi都要切换模式

System_ChangeSubMode(SYS_SUBMODE_NORMAL);
System_ChangeSubMode(SYS_SUBMODE_WIFI);

416cc5359159457b90f01fdaa5c11c64.png

三十八、后路不出图的时候模拟拔插

UIApp\WifiCmdParser\WifiCmdParser.c

e1ed8113f4d14562bc375b461ecee1d3.png

编译时候遇见的问题

1、代码中能跳转但是编译报错

停车监控的函数

代码编辑器或IDE能够成功跳转到函数的声明和定义位置,但在使用make编译时却收到“undefined reference to function”的错误,这通常意味着链接阶段出现了问题1d8f83ddd4f3b225bcb170abd46021e8.png

2、ET580后路摄像头录像三倍速问题

UIWnd\SPORTCAM\UIInfo\UIInfo.c

停车监控的1秒5帧,但一上电就会跑这里

85505eb84f094b4dbaea95740cd41c5b.png

3、停车监控前路进了缩时后路没有

停车监控(缩时录影)前后路帧数没有同步

MOVIE_TIMELAPSEREC_OFF:1秒30帧,1分钟1800帧

MOVIE_TIMELAPSEREC_100MS:1秒10帧,录3分钟凑够1800帧

MOVIE_TIMELAPSEREC_200MS:1秒5帧,录6分钟凑够1800帧

MOVIE_TIMELAPSEREC_500MS:1秒2帧,录15分钟凑够1800帧

 

UIWnd\SPORTCAM\UIInfo\UIInfo.h

2d965c873f374f50968b1881132fe922.png

UIWnd\SPORTCAM\UIInfo\UIMovieMapping.c 

5c29c89dd70744a4a84ae900ffe8108d.png

UIApp\Movie\UIAppMovie_Exe.c :FlowMovie_CheckReOpenItem(如果这样做的话前后路都是可以进入缩时但是在app设置了停车监控时长后进行正常录像会报VID!!!!)

47b96313f5814b9e99a9538ec0ee0b27.png

解决办法

code\application\source\cardv\SrcCode\UIApp\Movie\UIAppMovie_Exe.c:FlowMovie_CheckReOpenItem

88ccf8ad1b6b4a5c9d1406a47f52fff2.png

MovieExe_OnRecStart:再跑一遍FlowMovie_CheckReOpenItem使得前后路的帧数同时设置

244df28787fe4754a7439d20201db663.png

code\application\source\cardv\SrcCode\UIWnd\SPORTCAM\UIInfo\UIMovieMapping.c

bf88ebfd8f0e4039a9218ce20e6cb7b2.png

4、ET580 进入回放后出来以太网后路不显示,需要拔插才显示

UIApp\Movie\UIAppMovie_Exe.c:注释5037&5039

9f1c18a8a1f641d5b0805f1fdf5de391.png

code\application\source\cardv\SrcCode\PrjCfg_EthCamRx.h:打开注释

6755aaf8d8bc45feb6060012527f9651.png

5、正常录像通过APP打开停车监控时长后继续正常录像,报Vid的错误

目前发现是前后路帧数不同步的问题,解决办法在第三点

c44b21baf515409990ee0e1eaeae54ed.png

6、按照JIRA改了之后MAC地址还是很长

d47bee1b61bd4b9b9a736dc66b716c11.png

UIApp\Network\UIAppNetwork.c

判断条件改成0,让它跑下面不然会自动填充0

6ed469348e2346f2bf3b98cafbc51bdb.png

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值