目录
(1)在UIInfo.h定义一个名为SF_SHOCKPOWERON_CNT的成员来记录震动开机次数
(1)在Dx\580_CARDV_EVB\IOCfg.h进行引脚配置
APP修改WiFi名如果是CARDV_,这个前缀是改不掉的(其他的可以)
2)在SysResetFlag()函数里面增加一项Reset
2、WiFi:1920*1080P30画中画切换出问题的地方(AHD580三录)
3、WiFi:1280*720p30使用原方法画中画切换出现问题解决办法(AHD580三录)
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卡格式化会失败报错
4、ET580 进入回放后出来以太网后路不显示,需要拔插才显示
5、正常录像通过APP打开停车监控时长后继续正常录像,报Vid的错误
sdk文件结构(我个人理解)
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
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里面进行计数电平翻转
二、将内容保存在Flash里面
在UIInfo.h(na51055_PIP\code\application\source\cardv\SrcCode\UIWnd\SPORTCAM\UIInfo\UIInfo.h)里面名为UI_IndexInfo的枚举类型定义一个成员用来计数(枚举类型里面的美格成员都是一个唯一的整数值),然后通过SysSetFlag()和SysGetFlag()函数来设置和获取枚举类型成员的值
1、应用场景:ACC断开后震动开机次数计数
(1)在UIInfo.h定义一个名为SF_SHOCKPOWERON_CNT的成员来记录震动开机次数
(2)然后在震动开关机文件里面的函数应用
UIWnd\SPORTCAM\UIFlow\UIFlowMovie\UIFlowWndMovie.c:
每次开机都会跑这个函数,acc接入震动开机计数清零、acc断开开机一次计数值甲乙
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));
应用 :低电震动不开机
Gx\include\GxInput.h
System\SysMain_Exe.c
Gsensor_SetSensitivityParking函数最后是跳到code\driver\source\gsensor\gsensor_da380\gsensor_da380.c里面去执行GSensor_DA380_ParkingMode
四、按键
1、检测灵敏度
在System\SysInput_Exe.c里面有定时器,每几秒循环在检测。SX_TIMER_ITEM的参数三就是循环检测的时间(参数*20ms)
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
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进行引脚配置
(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
2、WiFi和录像状态
code\application\source\cardv\SrcCode\PrjInc.h:WiFi和LED状态
UIWnd\ALEXA\UIFlow\UIFlowMovie\UIFlowMovieFuncs.h :录像状态
3、状态判断
(1)录像
SrcCode\UIApp\Movie\UIAppMovie_Exe.c:
(2)WiFi
UIApp\Setup\UISetup_Exe.c:
UIApp\Network\UIAppNetwork.c:
4、实现LED灯闪烁
System\SysInput_Exe.c里面循环运行的定时器函数UI_DetCustom1Key
//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
(2)位置
UIApp\MovieStamp\MovieStamp.c:MovieStamp_Setup
在UIApp\Movie\UIAppMovie_Exe.c里面有MoiveStamp_Exe.c结构体(好几个,需要找到对应的~懒人方法:全部改成一样的)
(3)格式
UIApp\MovieStamp\MovieStamp.c:MovieStamp_UpdateData
年月日/月日年...AM/PM
UIApp\Movie\UIAppMovie_Exe.c:MovieExe_WifiMovieStamp()
2、视频图片水印
(1)去除
改了宏定义和驱动后需要make clean再make
source\cardv\SrcCode\PrjCfg_DVCam.h和PrjCfg_Default.h将“WATERLOGO_FUNCTION”改成DISABLE
(2)水印图片样式&大小
UIApp\Movie\UIAppMovie_Exe.c:根据WiFi分辨率选择图片样式和大小(848*480 / 1080*480)
3、提示语
UIApp\Network\WifiAppCmd.c+WifiAppCmd.h 和 UIApp\Network\WifiAppXML.c+WifiAppXML.h
4、AE_LOG(目前还不知道是啥)
SrcCode\UIApp\MovieStamp\MovieStamp.c:MovieStamp_get_isp_status显示在录像上
七、SD卡保存文件名和路径
1、路径名
(1)一级名
UIApp\Movie\UIAppMovie_Exe.c:MOVIE_ROOT_PATH
(2)二级名
UIApp\Movie\UIAppMovie_RecSetting.c:
Moive是正常录像的文件名(当存储卡满的时候新的视频会从第一个视频开始覆盖),EMR是震动开机时的视频(会上锁不会被覆盖)
2、文件名
UIApp\Movie\UIAppMovie_Exe.c:NH_endChar
MovieExe_FileNamingCB视频文件命名,MovieExe_RawEncodeFileNamingCB照片文件名
停车监控文件名后缀
UIApp\Movie\UIAppMovie_Exe.c:MovieExe_FileNamingCB
ET580两路摄像头前后路区分
MovieExe_FileNamingCB
八、版本号
(1)声明
SrcCode\PrjInc.h
SrcCode\ProjectInfo.h
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
2、UIWnd\SPORTCAM\UIMenu\UIMenuCommon\MenuCommonOption.c——MenuCommonOption_UpdateContent
3、UIWnd\SPORTCAM\UIInfo\UIInfo.c——Save_MenuInfo
九、视频上锁保存在EMR文件夹
有一个宏定义要打开才能生效
UIWnd\SPORTCAM\UIInfo\UICfgDefault.h:DEFAULT_MOVIE_URGENT_PROTECT_AUTO
Ux_PostEvent(NVTEVT_KEY_SELECT, 1, NVTEVT_KEY_PRESS);
UIFlow\UIFlowMovie\UIFlowWndMovie.c)——UIFlowWndMovie_OnKeyMenu
实现
System\SysInput_Exe.c:UI_DetCustom1Key
十、声音
1、声音索引定义
SrcCode\UIWnd\SPORTCAM\Resource\SoundData.h
UIWnd\SPORTCAM\Resource\SoundData.c
2、发声
UIWnd\SPORTCAM\Resource\SoundData.c:UISound_Play()
直接调用UISound_Play()即可
3、音量大小
通过GxSound_SetVolume()函数的参数设置声音大小,最大100
code\application\source\cardv\SrcCode\System\SysMain_Exe.c:System_OnBoot
4、SD卡异常报警声音
UIWnd\SPORTCAM\Resource\SoundData.c
在下面声明的时候是第四个在上面使用的时候也要对应第四个
UIWnd\SPORTCAM\Resource\SoundData.h
实现
SrcCode\Dx\580_CARDV_ETHCAM_RX_EVB\DxStorage_Card.c
十一、摄像头相关
1、参数配置(分辨率+帧数)
(1)宏定义
UIWnd\SPORTCAM\UIInfo\UICfgDefault.h:DEFAULT_MOVIE_SIZE
(2)调用
UIWnd\SPORTCAM\UIInfo\UIInfo.c:SysResetFlag
2、镜头接入检测和app画面显示
(1)镜头接入
UIApp\Movie\UIAppMovie_Exe.c:MovieExe_Sensor_HotPlug_Disp
不同镜头接入时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
4、ET580 后路摄像头录制没有声音
UIApp\Background\UIBackgroundObj.c:BackgroundEthCamTxRecInfo
5、镜头驱动帧数
code\hdal\ext_devices\sensor\sen_gc8613:sen_gc8613
CTL_SENDRV_GET_MODE_BASIC_PARAM
十二、App功能设置
1、选项设置
UIApp\Network\WifiAppCmdMapping.c
2、功能实现
UIApp\Movie\UIAppMovie_Exe.c 和 UIApp\Setup\UISetup_Exe.c
3、记录仪设置--录像质量选项
UIApp\Network\WifiAppCmdMapping.c(这个不知道要不要还没试)
UIWnd\SPORTCAM\UIInfo\UIInfo.h(这个不知道要不要还没试)
UIWnd\SPORTCAM\UIFlow\UIFlowMovie\UIFlowMovieIcons.c
UIWnd\SPORTCAM\Resource\UIResource.c (主要的)
UIWnd\SPORTCAM\UIMenu\UIMenuMovie\MenuMovie.c(显示选项的地方)
十三、WiFi
上电跑这边打开wifi以及视频流
SrcCode\System\SysMain.c
配置
UIWnd\SPORTCAM\UIInfo\UIMovieMapping.c
wifi分辨率
UIWnd\SPORTCAM\UIInfo\UIMovieMapping.c
-
MOVIE_SIZE_PARAM
定义了一些与视频编码相关的参数:
UINT32 uiWidth
: 视频的宽度,通常以像素为单位。UINT32 uiHeight
: 视频的高度,同样以像素为单位。UINT32 uiVidFrameRate
: 视频的帧率,即每秒播放的画面数量。通常以帧/秒(fps)为单位。UINT32 uiTargetBitrate
: 目标比特率,即视频编码时的目标数据传输速率。比特率越高,视频质量越好,但文件大小也越大。通常以比特/秒(bps)为单位。UINT32 uiDispAspectRatio
: 显示的宽高比(aspect ratio),这是一个比例值,描述视频画面的宽度与高度的比例关系。例如,16:9 或 4:3。UINT32 uiImageRatio
: 图像比例,这可能是指视频图像的长宽比,但与uiDispAspectRatio
类似。有时在不同的上下文中,这可能具有特定的含义,比如它可能指的是像素的宽高比(pixel aspect ratio, PAR)。
MOVIE_AQ_PARAM
定义了一些与视频编码中的自适应量化 (Adaptive Quantization, AQ) 相关的参数。自适应量化是一种技术,用于根据视频内容调整量化参数,从而优化编码质量和效率。
-
INT32 aq_enable
: 一个布尔标志,指示是否启用自适应量化功能。通常非零值表示启用,零值表示禁用。 -
UINT32 aq_str
: 自适应量化强度。这是一个无符号整数,用于控制自适应量化算法的强度或敏感度。较高的值意味着更强烈的自适应量化效果。 -
INT32 sraq_init_aslog2
: 初始自适应量化参数的对数形式。这是自适应量化过程开始时使用的初始量化参数的一个对数表示。例如,如果初始量化参数为 16,则该值可以设置为 4,因为 24=1624=16。 -
INT32 max_sraq
: 最大自适应量化参数。这是自适应量化参数可以达到的最大值,用于限制量化参数的增长。 -
INT32 min_sraq
: 最小自适应量化参数。这是自适应量化参数可以达到的最小值,用于防止量化参数过低导致质量损失。 -
INT32 sraq_const_aslog2
: 自适应量化常量的对数形式。这个参数用于调整自适应量化算法的行为,可以看作是一个常量因子,影响量化参数的变化程度。
MOVIE_CBR_PARAM
定义了一系列与恒定比特率 (Constant Bitrate, CBR) 编码模式相关的参数。CBR 是一种视频编码模式,其中输出视频流的比特率保持在一个固定的水平。
-
UINT32 uiEnable
: 一个布尔标志,指示是否启用 CBR 编码模式。通常非零值表示启用,零值表示禁用。 -
UINT32 uiStaticTime
: 静态时间,可能用于控制编码过程中的静态阶段或预热阶段的时间长度。 -
UINT32 uiFrameRate
: 视频的帧率,即每秒播放的画面数量。通常以帧/秒(fps)为单位。 -
UINT32 uiByteRate
: 目标比特率,即视频编码时的目标数据传输速率。比特率越高,视频质量越好,但文件大小也越大。通常以比特/秒(bps)为单位。在 CBR 模式下,这通常是恒定的。 -
UINT32 uiGOP
: Group Of Pictures 的缩写,表示一组图片。这是一组连续的关键帧(I 帧)和非关键帧(P 帧和 B 帧)的集合。GOP 大小决定了 I 帧之间的距离,进而影响视频的随机访问能力和压缩效率。 -
UINT32 uiInitIQp
: 初始 I 帧量化参数。量化参数(QP)用于控制视频编码的质量,较小的 QP 值通常会导致更高的视频质量。 -
UINT32 uiMinIQp
: 最小 I 帧量化参数。这限制了 I 帧 QP 的下限,以防止过度压缩导致的质量损失。 -
UINT32 uiMaxIQp
: 最大 I 帧量化参数。这限制了 I 帧 QP 的上限,以防止过度压缩导致的质量损失。 -
UINT32 uiInitPQp
: 初始 P 帧量化参数。与 I 帧类似,P 帧也有自己的量化参数。 -
UINT32 uiMinPQp
: 最小 P 帧量化参数。 -
UINT32 uiMaxPQp
: 最大 P 帧量化参数。 -
INT32 iIPWeight
: I 帧与 P 帧之间的权重。这可以用来调整 I 帧和 P 帧在编码过程中的相对重要性。 -
UINT32 uiRowRcEnalbe
: 一个布尔标志,指示是否启用按行的比特率控制。如果启用,编码器会在每一行上应用比特率控制。 -
UINT32 uiRowRcQpRange
: 按行比特率控制的量化参数范围。这可以用来调整按行比特率控制的效果。 -
UINT32 uiRowRcQpStep
: 按行比特率控制的量化参数步长。这可以用来控制量化参数随行变化的程度。
1、默认WiFi名和密码
UIApp\Network\UIAppNetwork.c
gSSID_AP_default和PASSPHRASE_AP_default是默认的WiFi名和密码;
gSSID和gPASSPHRASE保存用户修改后的WiFi名和密码。
2、WiFi名和密码修改
UIApp\Setup\UISetup_Exe.c:SetupExe_OnWifiSetSSID、SetupExe_OnWifiSetPassPhrase
APP修改WiFi名如果是CARDV_,这个前缀是改不掉的(其他的可以)
功能
1、修改密码后关机再上电密码没有保存
UIApp\Network\UIAppNetwork.c:UINet_WifiSetting
2、WiFi名和密码恢复出厂设置
修改名字和密码后需要掉电和拔卡后才能真正保存验证恢复出厂设置功能
方法一:
UIWnd\SPORTCAM\UIInfo\UIInfo.h:Reset_MenuInfo
方法二:
UIWnd\SPORTCAM\UIInfo\UIInfo.h:UIMenuUIMenuStoreInfo这个结构体内的数据会永久保存(保存在flash里面)
UIWnd\SPORTCAM\UIInfo\UIInfo.c:SysResetFlag
十四、恢复出厂设置
1、记录仪功能设置恢复出厂设置
(1)恢复出厂设置函数
UIApp\Setup\UISetup_Exe.c
UIWnd\SPORTCAM\UIInfo\UIInfo.c
(2)设置
1)增加一个存储状态的变量(保存在Flash)
UIWnd\SPORTCAM\UIInfo\UIInfo.h(可参照本文 二、将内容保存在Flash里面)
UIApp\Network\WifiAppCmdMapping.c :选项设置
2)在SysResetFlag()函数里面增加一项Reset
UIWnd\SPORTCAM\UIInfo\UIInfo.c
2、WiFi名称和密码恢复出厂设置
UIApp\Setup\UISetup_Exe.c:Reset_MenuInfo
UIWnd\SPORTCAM\UIInfo\UIInfo.c:Reset_MenuInfo
UIWnd\SPORTCAM\UIInfo\UIInfo.c: SysExeMenuSettingFuncs
十五 、一秒5帧
UIWnd\SPORTCAM\UIInfo\UIInfo.c:SysSetFixedFlag()
十六、镜头翻转
目前验证不行
code\hdal\ext_devices\sensor\configs\dtsi\gc4653_cfg.dtsi
解决办法直接改驱动
改了宏定义和驱动后需要make clean
code\hdal\ext_devices\sensor\sen_gc4653\sen_gc4653.c:sen_chg_mode_gc8613
ET580镜头驱动翻转(写寄存器的值)
十七、镜头震动检测
在Gx\include\GxInput.h里面声明
在 Gx\GxInput\Gsensor\GxGsensor.c定义
SrcCode\System\SysInput_Exe.c:UI_DetCustom1Key函数500ms检测一次太久了,放到UI_DetNormalKey中100ms检测一次
ZSystem\SysInput_Exe.c:UI_DetCustom1Key
镜头那边的真正实现函数
code\driver\source\gsensor\gsensor_da380\gsensor_da380.c
十八、停车监控时间计数
System\SysInput_Exe.c:UI_DetCustom1Key
通过UI_GetData(Sys_GetFlag)获取预先设置的停车监控时间
时间倒数结束后关机
十九、画中画
1、逻辑
UIApp\Movie\UIAppMovie_Exe.c:MovieExe_OnDualcam
获取镜头接入状态
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的返回值出现了问题
3、WiFi:1280*720p30使用原方法画中画切换出现问题解决办法(AHD580三录)
UIApp\Movie\UIAppMovie_Exe.c
UIApp\AppDisp_PipView.c :PipView_OnDraw_3sensor
FL_DUAL_CAM初始化的地方:UIWnd\SPORTCAM\UIInfo\UIInfo.c :SysSetFixedFlagSysInit
4、ET580两路用原方法是可以的
5、初始状态显示模式设置(刚启动就画中画显示)
UIApp\Movie\UIAppMovie_Exe.c:MovieExe_EthCam_ChgDispCB
6、画中画app按钮切换选项
UIApp\Network\WifiAppCmdMapping.c
二十、画面镜像(水平翻转)
记录仪设置里面有个开关按钮但目前不起作用
1、wifi命令
(1)声明
UIApp\Network\WifiAppCmd.h:WIFIAPP_CMD_FLIP_MIRROR
(2)注册命令
UIApp\Network\WifiAppCmd.c:
2、调用函数命令
(1)声明
UIApp\Network\UIAppWiFiCmd.h:NVTEVT_WIFI_EXE_MOVIE_FLIP_MIRROR
(2)注册命令
UIApp\Network\UIAppWiFiCmd_Exe.c
(3)实现函数
UIApp\Network\UIAppWiFiCmdMovie_Exe.c:WiFiCmd_OnExeSetMovieFlipMirror
UIWnd\SPORTCAM\UIInfo\UIInfo.h
但是主界面没有显示这个功能图标
目前测试改动如下:
UIInfo.c
二十一、水印实时日期和时间
UIApp\Setup\UISetup_Exe.c:SetupExe_OnData
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
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)
原厂提供解决办法
1、na51055_linux_ET580\code\driver\source\Makefile
在Makefile做如下修改才会编译出exfat.ko并install到BSP中
2、BSP\root-fs\rootfs\etc_Model\etc_CARDV_ETHCAM_RX_EVB\init.d\S14_MMC_FS
etc_XXX根据当前配置进行选择,在S14_MMC_FS文件里面加如下内容,以加载exfat.ko
3、copy AHD580的/code/lib/external的exfat-utils-1.2.7过来
4、修改/code/lib/external/Makefile加上下面的内容(AHD580复制过来)
5、SrcCode\System\SysStrg_Exe.c先不加这个,64G卡格式化会失败报错
在System_OnStrgInit_FS()中,打开FILE_CFG_SUPPORT_EXFAT
6、BSP\u-boot\include
Z:\SunFan\ET580\na51055_linux_ET580\BSP\u-boot\include\fs.h
7、BSP\u-boot\cmd
Z:\SunFan\ET580\na51055_linux_ET580\BSP\u-boot\cmd\Makefile
Z:\SunFan\ET580\na51055_linux_ET580\BSP\u-boot\cmd\Kconfig
8、BSP\u-boot\fs
Z:\SunFan\ET580\na51055_linux_ET580\BSP\u-boot\fs\Makefile
Z:\SunFan\ET580\na51055_linux_ET580\BSP\u-boot\fs\Kconfig
Z:\SunFan\ET580\na51055_linux_ET580\BSP\u-boot\fs\fs.c
9、BSP\u-boot\cpnfigs
Z:\SunFan\ET580\na51055_linux_ET580\BSP\u-boot\configs\nvt-na51055_nand_defconfig
10、BSP\u-boot\board
Z:\SunFan\ET580\na51055_linux_ET580\BSP\u-boot\board\novatek\common\nvt_ivot_fw_update_utils.c
二十四、 ET后拉摄像头拍照报错
原厂提供的方法:96580_patch_imgcap_20240705比对这个文件夹进行增加
code\lib\include\ImageApp\ImageApp_MovieMulti.h
code\lib\include\ImageApp\ImageApp_Common.h
二十五、WIFI名字的MAC地址太长
二十六、视频录制格式(.TS/.MP4/.MOV)
SrcCode\PrjCfg_Default.h
二十七、各种开关
1、关机
Ux_PostEvent(NVTEVT_SYSTEM_SHUTDOWN, 1, 0); 调用这个命令执行关机
System\SysMain_Exe.c:命令执行函数注册
2、WIFI开关
UIApp\Setup\UISetup_Exe.c:
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:
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命令
UIApp\Network\WifiAppCmd.c
FL_MOVIE_DATEIMPRINT是保存开关的状态,存在flash里面的
UIApp\Network\UIAppWiFiCmd_Exe.c
命令注册执行函数
UIApp\Network\UIAppWiFiCmdMovie_Exe.c
UIApp\Movie\UIAppMovie_Exe.c :
最终在这实现功能
8、录像声音
在UIApp\Network\WifiAppCmd.h定义app命令WIFIAPP_CMD_MOVIE_AUDIO 2007
UIApp\Network\UIAppWiFiCmd_Exe.c为NVTEVT_WIFI_EXE_MOVIE_AUDIO命令注册执行函数
使用:先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:
二十八、串口指令打印版本号
目前是输入指令没反应---未解决
1、code\application\source\cardv\SrcCode\UIApp\Network\EthCamAppCmd.h
2、code\application\source\cardv\SrcCode\System\SysInput_cmd.c
二十九、MOVIE_ISP_LOG
1、宏定义
code\application\source\cardv\SrcCode\UIApp\MovieStamp\MovieStamp.h
开了ISP_LOG视频水印会被去掉
2、实现函数
修改过和原来的不一样但我还没有对比
code\application\source\cardv\SrcCode\UIApp\MovieStamp\MovieStamp.c
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三路的
三十一、停车监控震动感应时长
1、功能设置界面选项
UIApp\Network\WifiAppCmdMapping.c
2、功能函数
UIApp\Network\UIAppWiFiCmd.h
UIApp\Network\UIAppWiFiCmdMovie_Exe.c
UIApp\Movie\UIAppMovie_Exe.c
三十二、突然断电有损坏文件
UIApp\Movie\UIAppMovie_Exe.c
放在这个地方程序会跑飞
放在这个地方
三十三、SD卡里面预留1G空间
UIApp\Movie\UIAppMovie_Exe.cs
三十四、wifi重启后app预览会消失
视频流被关闭了没有打开
SrcCode\System\SysInput_Exe.c在语音判断实现打开WIFI的地方开启视频流
三十五、WIFI开关和视频流开关
BKG_PostEvent(NVTEVT_BKW_WIFI_ON);WIFI开关
Ux_PostEvent(NVTEVT_EXE_MOVIE_STRM_START,0);视频流开关
三十六、震动开机会生成小文件
停车监控倒计时结束的不是很及时,导致录完一分钟后有开始录了2~3秒视频
按理说计数120才有1秒,但是有延迟,现在计数到117就执行关机程序
三十七、打开WIFI和关闭WIFI后文件预览不显示
打开WiFi和关闭WiFi都要切换模式
System_ChangeSubMode(SYS_SUBMODE_NORMAL);
System_ChangeSubMode(SYS_SUBMODE_WIFI);
三十八、后路不出图的时候模拟拔插
UIApp\WifiCmdParser\WifiCmdParser.c
编译时候遇见的问题
1、代码中能跳转但是编译报错
停车监控的函数
代码编辑器或IDE能够成功跳转到函数的声明和定义位置,但在使用make
编译时却收到“undefined reference to function”的错误,这通常意味着链接阶段出现了问题
2、ET580后路摄像头录像三倍速问题
UIWnd\SPORTCAM\UIInfo\UIInfo.c
停车监控的1秒5帧,但一上电就会跑这里
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
UIWnd\SPORTCAM\UIInfo\UIMovieMapping.c
UIApp\Movie\UIAppMovie_Exe.c :FlowMovie_CheckReOpenItem(如果这样做的话前后路都是可以进入缩时但是在app设置了停车监控时长后进行正常录像会报VID!!!!)
解决办法
code\application\source\cardv\SrcCode\UIApp\Movie\UIAppMovie_Exe.c:FlowMovie_CheckReOpenItem
MovieExe_OnRecStart:再跑一遍FlowMovie_CheckReOpenItem使得前后路的帧数同时设置
code\application\source\cardv\SrcCode\UIWnd\SPORTCAM\UIInfo\UIMovieMapping.c
4、ET580 进入回放后出来以太网后路不显示,需要拔插才显示
UIApp\Movie\UIAppMovie_Exe.c:注释5037&5039
code\application\source\cardv\SrcCode\PrjCfg_EthCamRx.h:打开注释
5、正常录像通过APP打开停车监控时长后继续正常录像,报Vid的错误
目前发现是前后路帧数不同步的问题,解决办法在第三点
6、按照JIRA改了之后MAC地址还是很长
UIApp\Network\UIAppNetwork.c
判断条件改成0,让它跑下面不然会自动填充0