@ -53,6 +53,7 @@ static T_DjiReturnCode PsdkTestWidget_SetWidgetValue_StartRecord(E_DjiWidgetType
void * userData ) ;
static void * PsdkTest_IrisRecordSystemChanged ( void * arg ) ;
static void extractSpectralBinAndBandnumber ( bool isModifyBin ) ;
/* Private values ------------------------------------------------------------*/
static T_DjiTaskHandle s_widgetTestThread ;
@ -73,23 +74,33 @@ static int s_stateOfSbg=0;
static int s_stateOfFile = 0 ;
//0: ximeaAirborneSystem系统未就绪, 不可启动; 1: ximeaAirborneSystem系统就绪, 可以启动;
//2: ximeaAirborneSystem系统正在启动; 3: ximeaAirborneSystem系统启动成功; 4: 系统已经关闭,并且不能再次启动 ;
//2: ximeaAirborneSystem系统正在启动; 3: ximeaAirborneSystem系统启动成功; 4: 系统已经关闭;
int systemON_Control = 0 ;
char s_strUIMessage [ 100 ] = " " ;
static char * s_strStateOfSbg = " None " ;
static char * s_strSbgSatelliteCounter = " None " ;
static char * s_strSbgAccuracy = " None " ;
static char * s_strStateOfSbg = " " ;
static char * s_strSbgSatelliteCounter = " " ;
static char * s_strSbgAccuracy = " " ;
char XimeaFramerate [ 100 ] = " " ;
int framerate = 0 ;
char XimeaExposeTime [ 100 ] = " " ;
char XimeaExposeMaxValue [ 100 ] = " " ;
char spectralBin [ 100 ] = " None " ;
static char * s_strSbgSolutionMode = " None " ;
static char * s_strStateOfXimea = " None " ;
char s_ spectralBin[ 100 ] = " " ;
int spectralBinInt = 0 ;
static char * s_strSbgSolutionMode = " " ;
static char * s_strStateOfXimea = " " ;
char * s_strPitch = " None " ;
char * s_strRoll = " None " ;
char * s_strYaw = " None " ;
char * s_strPitch = " " ;
char * s_strRoll = " " ;
char * s_strYaw = " " ;
char * s_remainingTime = " " ;
char * remainingTimeTmp [ 10 ] ;
char * s_remainingSpace = " " ;
char * remainingSpaceTmp [ 10 ] ;
char jsonPathCn [ WIDGET_DIR_PATH_LEN_MAX ] ;
char jsonPathEn [ WIDGET_DIR_PATH_LEN_MAX ] ;
static int s_sockfd ;
static struct sockaddr_in s_server ;
@ -152,6 +163,7 @@ T_DjiReturnCode DjiTest_WidgetStartService(void)
snprintf ( tempPath , WIDGET_DIR_PATH_LEN_MAX , " %swidget_file/en_big_screen " , s_widgetFileDirPath ) ;
} else {
snprintf ( tempPath , WIDGET_DIR_PATH_LEN_MAX , " %swidget_file/en_big_screen " , curFileDirPath ) ;
snprintf ( jsonPathEn , WIDGET_DIR_PATH_LEN_MAX , " %swidget_file/en_big_screen/widget_config.json " , curFileDirPath ) ;
}
//set default ui config path
@ -176,6 +188,7 @@ T_DjiReturnCode DjiTest_WidgetStartService(void)
snprintf ( tempPath , WIDGET_DIR_PATH_LEN_MAX , " %swidget_file/cn_big_screen " , s_widgetFileDirPath ) ;
} else {
snprintf ( tempPath , WIDGET_DIR_PATH_LEN_MAX , " %swidget_file/cn_big_screen " , curFileDirPath ) ;
snprintf ( jsonPathCn , WIDGET_DIR_PATH_LEN_MAX , " %swidget_file/cn_big_screen/widget_config.json " , curFileDirPath ) ;
}
djiStat = DjiWidget_RegUiConfigByDirPath ( DJI_MOBILE_APP_LANGUAGE_CHINESE ,
@ -213,10 +226,9 @@ T_DjiReturnCode DjiTest_WidgetStartService(void)
return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN ;
}
//Step 5 : Run ximea task
if ( osalHandler - > TaskCreate ( " ximea " , PsdkTest_IrisRecordSystemChanged , WIDGET_TASK_STACK_SIZE , NULL ,
& s_widgetXimeaThread ) ! = DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS ) {
& s_widgetXimeaThread ) ! = DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS ) {
USER_LOG_ERROR ( " Psdk widget test task(ximea) create error. " ) ;
return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN ;
}
@ -273,6 +285,8 @@ static void *DjiTest_WidgetTask(void *arg)
T_DjiReturnCode djiStat ;
T_DjiOsalHandler * osalHandler = DjiPlatform_GetOsalHandler ( ) ;
extractSpectralBinAndBandnumber ( false ) ;
USER_UTIL_UNUSED ( arg ) ;
while ( 1 ) {
@ -282,8 +296,8 @@ static void *DjiTest_WidgetTask(void *arg)
}
# ifndef USER_FIRMWARE_MAJOR_VERSION
snprintf ( message , DJI_WIDGET_FLOATING_WINDOW_MSG_MAX_LEN , " %s \n 相机 : %s; 惯导: %s;\n 卫星: %s; 精度 : %s; \n 帧率: %s;曝光: %s;max: %s; \n P: %s; R: %s; Y: %s; \n 光谱bin: %s; \n " ,
s_strUIMessage , s_strStateOfXimea , s_strStateOfSbg , s_strSbgSatelliteCounter , s_strSbgAccuracy , XimeaFramerate , XimeaExposeTime , XimeaExposeMaxValue , s_strPitch , s_strRoll , s_strYaw , spectralBin ) ;
snprintf ( message , DJI_WIDGET_FLOATING_WINDOW_MSG_MAX_LEN , " %s \n 高光谱 : %s; 惯导: %s;\n 卫星: %s; 惯导状态 : %s; \n 帧率: %s;曝光: %s;max: %s; \n P: %s; R: %s; Y: %s; \n 光谱bin: %s; \n 时间: %s min; 空间: %s G; \n ",
s_strUIMessage , s_strStateOfXimea , s_strStateOfSbg , s_strSbgSatelliteCounter , s_strSbgSolutionMode , XimeaFramerate , XimeaExposeTime , XimeaExposeMaxValue , s_strPitch , s_strRoll , s_strYaw , s_ spectralBin, s_remainingTime , s_remainingSpace );
# else
snprintf ( message , DJI_WIDGET_FLOATING_WINDOW_MSG_MAX_LEN ,
" System time : %u ms \r \n Version: v%02d.%02d.%02d.%02d \r \n Build time: %s %s " , sysTimeMs ,
@ -306,6 +320,54 @@ static void *DjiTest_WidgetTask(void *arg)
strcpy ( s_strUIMessage , " " ) ;
}
char buffer [ 128 ] ;
FILE * fp ;
// 获取剩余硬盘空间和剩余采集时间
fp = popen ( " df --output=avail --block-size=1 /media/nvme | tail -n 1 " , " r " ) ;
if ( fp = = NULL ) {
perror ( " popen " ) ;
}
// 读取输出并处理
if ( fgets ( buffer , sizeof ( buffer ) , fp ) ! = NULL )
{
// printf("当前字符串-----: %s \n", buffer);
// 将输出转换为数值
unsigned long long availableBytes = strtoull ( buffer , NULL , 10 ) ;
// 转换为MB
double availableMB = availableBytes / ( 1024.0 * 1024.0 ) ;
sprintf ( remainingSpaceTmp , " %.0f " , availableMB / 1024 ) ;
s_remainingSpace = remainingSpaceTmp ;
if ( spectralBinInt ! = 0 & & framerate ! = 0 )
{
double frameSize ;
if ( spectralBinInt = = 1 )
{
frameSize = 0.783 ;
}
else
{
frameSize = 0.783 / 2 ;
}
double minTemp = availableMB / ( frameSize * framerate * 60 ) ;
sprintf ( remainingTimeTmp , " %.0f " , minTemp ) ;
s_remainingTime = remainingTimeTmp ;
// 打印结果
// printf("Available space: %.2f MB;\n", availableMB);
// printf("remainint time of record:%.2f;\n", temp);
}
}
// 关闭文件指针
pclose ( fp ) ;
//判断ximeaAirborneSystem系统是否存活
// if(ximeaAirborneSystemSurvivalTime > 10)
// {
@ -381,14 +443,18 @@ static void *PsdkTest_IrisRecordSystemChanged(void *arg)//
//printf("You got a message (%s%) from client.\nIt's ip is%s, port is %d.\n",buf,inet_ntoa(client.sin_addr),htons(client.sin_port));
char * result [ 3 ] ;
char * result [ 5 ] ;
result [ 0 ] = strtok ( buf , " , " ) ;
result [ 1 ] = strtok ( NULL , " , " ) ;
result [ 2 ] = strtok ( NULL , " , " ) ;
result [ 3 ] = strtok ( NULL , " , " ) ;
result [ 4 ] = strtok ( NULL , " , " ) ;
// printf(" result[0]: %s\n", result[0]);
// printf(" result[1]: %s\n\n", result[1]);
// printf(" result[2]: %s\n\n", result[2]);
printf( " result[0]: %s\n " , result [ 0 ] ) ;
printf( " result[1]: %s\n \n " , result [ 1 ] ) ;
printf( " result[2]: %s\n \n " , result [ 2 ] ) ;
printf ( " result[3]: %s \n \n " , result [ 3 ] ) ;
printf ( " result[4]: %s \n \n " , result [ 4 ] ) ;
if ( strcmp ( result [ 0 ] , " sbg " ) = = 0 )
@ -401,7 +467,7 @@ static void *PsdkTest_IrisRecordSystemChanged(void *arg)//
case 0 :
s_strStateOfSbg = " 未打开 " ;
if ( systemON_Control = = 0 )
if ( systemON_Control = = 0 | | systemON_Control = = 4 )
{
strcpy ( s_strUIMessage , " 系统已就绪! " ) ;
messageTimeCounter = 0 ;
@ -460,36 +526,36 @@ static void *PsdkTest_IrisRecordSystemChanged(void *arg)//
}
else if ( strcmp ( result [ 0 ] , " SolutionMode " ) = = 0 )
{
// s_sbgMagState = atoi(result[1]);
//
// switch ( s_sbgMagState)
// {
// case 0:
// s_strSbgSolutionMode=" UNINITIALIZED";
// break;
// case 1:
// s_strSbgSolutionMode=" VERTICAL_GYRO";
// break;
// case 2:
// s_strSbgSolutionMode="AHRS";
// break;
// case 3:
// s_strSbgSolutionMode=" NAV_VELOCITY";
// break;
// case 4:
// s_strSbgSolutionMode=" NAV_POSITION";
// break;
//
// default:
// break;
// }
s_sbgMagState = atoi ( result [ 1 ] ) ;
switch ( s_sbgMagState)
{
case 0 :
s_strSbgSolutionMode= " UNINITI " ; // UNINITIALIZED
break;
case 1 :
s_strSbgSolutionMode= " GYRO " ; // VERTICAL_GYRO
break;
case 2 :
s_strSbgSolutionMode= " AHRS " ;
break;
case 3 :
s_strSbgSolutionMode= " VELOCITY " ; // NAV_VELOCITY
break;
case 4 :
s_strSbgSolutionMode= " FULL " ; // NAV_POSITION
break;
default:
break;
}
}
else if ( strcmp ( result [ 0 ] , " ximea " ) = = 0 )
{
s_stateOfXimea = atoi ( result [ 1 ] ) ;
printf ( " ximea的状态为: %d \n \n " , atoi ( result [ 1 ] ) ) ;
switch ( s_stateOfXimea ) //0-61: ximea官方错误代码; 99: 发生的ximea官方错误代码, 没有处理; 100: 未打开; 101: 打开; 102: 设置帧率; 103: 自动曝光; 104: 正在 采集;
switch ( s_stateOfXimea ) //0-61: ximea官方错误代码; 99: 发生的ximea官方错误代码, 没有处理; 100: 未打开; 101: 打开; 102: 设置帧率; 103: 自动曝光; 104: 采集中 ;
{
case 10 :
s_strStateOfXimea = " 10 " ;
@ -531,13 +597,13 @@ static void *PsdkTest_IrisRecordSystemChanged(void *arg)//
break ;
case 102 :
s_strStateOfXimea = " 帧率已设置 " ;
s_strStateOfXimea = " 帧率完成 " ;
break ;
case 103 :
s_strStateOfXimea = " 曝光完成 " ;
break ;
case 104 :
s_strStateOfXimea = " 正在 采集" ;
s_strStateOfXimea = " 采集中 " ;
break ;
default :
@ -547,7 +613,10 @@ static void *PsdkTest_IrisRecordSystemChanged(void *arg)//
else if ( strcmp ( result [ 0 ] , " XimeaAutoExpose " ) = = 0 )
{
strcpy ( XimeaExposeMaxValue , result [ 1 ] ) ;
strcpy ( XimeaExposeTime , result [ 2 ] ) ;
int exposeTimeTmp = atoi ( result [ 2 ] ) ;
sprintf ( XimeaExposeTime , " %d " , exposeTimeTmp ) ;
s_widgetValueList [ 8 ] = exposeTimeTmp ;
strcpy ( s_strUIMessage , " 曝光时间设置成功! " ) ;
messageTimeCounter = 0 ;
@ -555,8 +624,9 @@ static void *PsdkTest_IrisRecordSystemChanged(void *arg)//
}
else if ( strcmp ( result [ 0 ] , " XimeaFrameRate " ) = = 0 )
{
int tmp = atoi ( result [ 1 ] ) ;
sprintf ( XimeaFramerate , " %d " , tmp ) ;
framerate = atoi ( result [ 1 ] ) ;
s_widgetValueList [ 6 ] = framerate ;
sprintf ( XimeaFramerate , " %d " , framerate ) ;
// strcpy(XimeaFramerate,result[1]);
strcpy ( s_strUIMessage , " 帧率设置成功! " ) ;
@ -565,8 +635,7 @@ static void *PsdkTest_IrisRecordSystemChanged(void *arg)//
}
else if ( strcmp ( result [ 0 ] , " bin " ) = = 0 )
{
int spectralBin_tm = atoi ( result [ 2 ] ) ;
sprintf ( spectralBin , " %d " , spectralBin_tm ) ;
spectralBinInt = atoi ( result [ 2 ] ) ;
}
}
}
@ -613,7 +682,8 @@ static T_DjiReturnCode PsdkTestWidget_SetWidgetValue_StartRecord(E_DjiWidgetType
case 5 : //系统启动关闭
if ( value = = 0 ) //系统关闭
{
i f ( systemON_Control = = 3 )
print f( " systemON_Control的值为:%d \n " , systemON_Control ) ;
if ( 0 < = systemON_Control & & systemON_Control < = 4 )
{
strcpy ( s_strUIMessage , " 系统已经关闭! " ) ;
messageTimeCounter = 0 ;
@ -623,17 +693,44 @@ static T_DjiReturnCode PsdkTestWidget_SetWidgetValue_StartRecord(E_DjiWidgetType
sendto ( s_sockfd , command , strlen ( command ) , 0 , ( struct sockaddr * ) & s_server , sizeof ( s_server ) ) ;
systemON_Control = 4 ;
// sleep(1);//此线程不能睡眠,否则会报很多错误
// char *commandtmp = (char *)malloc(sizeof(char)*100);
// strcat(commandtmp, "kill $(ps aux | grep ximeaAirborneSystem | grep -v grep | awk \'{print $2}\')");
// printf("命令行指令为:%s\n",commandtmp);
// system(commandtmp);
FILE * fp ;
fp = popen ( " kill $(ps aux | grep ximeaAirborneSystem | grep -v grep | awk \' {print $2} \' ) " , " r " ) ;
if ( fp = = NULL )
{
perror ( " popen " ) ;
}
s_strStateOfXimea = " " ;
s_strStateOfSbg = " " ;
s_strSbgSatelliteCounter = " " ;
s_strSbgSolutionMode = " " ;
sprintf ( XimeaFramerate , " %s " , " " ) ;
sprintf ( XimeaExposeTime , " %s " , " " ) ;
sprintf ( XimeaExposeMaxValue , " %s " , " " ) ;
sprintf ( s_spectralBin , " %s " , " " ) ;
s_remainingTime = " " ;
s_widgetValueList [ 6 ] = 0 ;
s_widgetValueList [ 8 ] = 0 ;
}
}
else if ( value = = 1 ) //系统启动
{
i f ( systemON_Control = = 0 )
print f( " systemON_Control的值为:%d \n " , systemON_Control ) ;
if ( systemON_Control = = 4 )
{
strcpy ( s_strUIMessage , " 请等待系统初始化! " ) ;
messageTimeCounter = 0 ;
messageTimespan = 1000 ;
}
else if ( systemON_Control = = 1 )
else if ( systemON_Control = = 0 | | systemON_Control = = 1 )
{
strcpy ( s_strUIMessage , " 系统启动中,请等待! " ) ;
messageTimeCounter = 0 ;
@ -656,12 +753,6 @@ static T_DjiReturnCode PsdkTestWidget_SetWidgetValue_StartRecord(E_DjiWidgetType
messageTimeCounter = 0 ;
messageTimespan = 1000 ;
}
else if ( systemON_Control = = 4 )
{
strcpy ( s_strUIMessage , " 相机占用,请重新上电! " ) ;
messageTimeCounter = 0 ;
messageTimespan = 1000 ;
}
}
break ;
case 6 : //设置帧率
@ -685,9 +776,9 @@ static T_DjiReturnCode PsdkTestWidget_SetWidgetValue_StartRecord(E_DjiWidgetType
// 控制帧率范围
if ( value > 1 50)
if ( value > 2 50)
{
strcpy ( s_strUIMessage , " 帧率不可超过1 50! " ) ;
strcpy ( s_strUIMessage , " 帧率不可超过2 50! " ) ;
messageTimeCounter = 0 ;
messageTimespan = 10 ;
@ -880,6 +971,8 @@ static T_DjiReturnCode PsdkTestWidget_SetWidgetValue_StartRecord(E_DjiWidgetType
system ( " sudo sed -i 's/spectralBin =.*/spectralBin = 2;/g' /media/nvme/300TC/config/ximea.cfg " ) ;
}
extractSpectralBinAndBandnumber ( true ) ;
strcpy ( s_strUIMessage , " 请重新上电! " ) ;
messageTimeCounter = 0 ;
messageTimespan = 10000 ;
@ -892,4 +985,66 @@ static T_DjiReturnCode PsdkTestWidget_SetWidgetValue_StartRecord(E_DjiWidgetType
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS ;
}
static void extractSpectralBinAndBandnumber ( bool isModifyBin )
{
unsigned long long spectralBin , height ;
char buffer [ 128 ] ;
FILE * fp ;
fp = popen ( " grep \" spectralBin = \" /media/nvme/300TC/config/ximea.cfg | awk '{print $3}' | tr -d ';' " , " r " ) ;
if ( fp = = NULL ) {
perror ( " popen " ) ;
}
if ( fgets ( buffer , sizeof ( buffer ) , fp ) ! = NULL )
{
// printf("当前字符串-----: %s \n", buffer);
spectralBin = strtoull ( buffer , NULL , 10 ) ;
}
pclose ( fp ) ;
if ( spectralBin = = 1 )
{
fp = popen ( " grep \" height \" /media/nvme/300TC/config/ximea.cfg | head -n 1 | awk '{print $3}' | tr -d ';' " , " r " ) ;
if ( fp = = NULL ) {
perror ( " popen " ) ;
}
if ( fgets ( buffer , sizeof ( buffer ) , fp ) ! = NULL )
{
// printf("当前字符串-----: %s \n", buffer);
height = strtoull ( buffer , NULL , 10 ) ;
}
pclose ( fp ) ;
}
else if ( spectralBin = = 2 )
{
fp = popen ( " grep \" height \" /media/nvme/300TC/config/ximea.cfg | head -n 2 | tail -n 1 | awk '{print $3}' | tr -d ';' " , " r " ) ;
if ( fp = = NULL ) {
perror ( " popen " ) ;
}
if ( fgets ( buffer , sizeof ( buffer ) , fp ) ! = NULL )
{
// printf("当前字符串-----: %s \n", buffer);
height = strtoull ( buffer , NULL , 10 ) ;
}
pclose ( fp ) ;
}
char command [ 256 ] ;
memset ( command , 0 , sizeof ( command ) ) ;
sprintf ( command , " sudo sed -i 's/.*bin.*/ \" widget_name \" : \" bin%d_%d \" ,/g' %s " , spectralBin , height , jsonPathCn ) ;
// printf("command: %s", command);
system ( command ) ;
memset ( command , 0 , sizeof ( command ) ) ;
sprintf ( command , " sudo sed -i 's/.*bin.*/ \" widget_name \" : \" bin%d_%d \" ,/g' %s " , spectralBin , height , jsonPathEn ) ;
// printf("command: %s", command);
system ( command ) ;
if ( ! isModifyBin )
{
sprintf ( s_spectralBin , " %d_%d " , spectralBin , height ) ;
}
}
/****************** (C) COPYRIGHT DJI Innovations *****END OF FILE****/