1. 无法第二次启动,授时等待时间优化;
2. 遥控器界面显示:硬盘可用空间,当前帧率剩余飞行时间;
3. 帧率曝光时间和遥控器右侧边栏数字联动;
4. bin2后面加通道数,侧边栏显示bin和通道数;
5. 遥控器去掉惯导定位精度,改为显示full nav;
6. 其他界面改动;
This commit is contained in:
tangchao0503
2023-08-23 11:39:28 +08:00
parent 699112b487
commit 47153346cd
6 changed files with 233 additions and 77 deletions

View File

@ -349,10 +349,10 @@ static void *UserFcSubscription_Task(void *arg)
USER_LOG_DEBUG("gps TIME: %d.", gpsTime);
}//PsdkLogger_UserLogInfo
if(counter>1 &&counter<10 && isGetGpsDate_time)//避免dji的bug第一次获取的gpsDate和gpsTime都为0
if(counter>1 &&counter<3 && isGetGpsDate_time)//避免dji的bug第一次获取的gpsDate和gpsTime都为0
{
printf("开始设置时间\n");
system('date');
system("date");
char *gpsDate_str = (char *)malloc(sizeof(char)*50);
char *gpsTime_str = (char *)malloc(sizeof(char)*20);
@ -423,6 +423,7 @@ static void *UserFcSubscription_Task(void *arg)
// printf("command---:%s\n",command);
system(command);
system("echo \"1\" > /media/nvme/300TC/config/timesyncfromdji");
}
counter++;

View File

@ -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;
//0ximeaAirborneSystem系统未就绪不可启动1ximeaAirborneSystem系统就绪可以启动
//2ximeaAirborneSystem系统正在启动3ximeaAirborneSystem系统启动成功4系统已经关闭,并且不能再次启动
//2ximeaAirborneSystem系统正在启动3ximeaAirborneSystem系统启动成功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,7 +226,6 @@ 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) {
@ -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;\nP: %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;\nP: %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\nVersion: v%02d.%02d.%02d.%02d\r\nBuild 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-61ximea官方错误代码99发生的ximea官方错误代码没有处理100未打开101打开102设置帧率103自动曝光104正在采集;
switch (s_stateOfXimea)//0-61ximea官方错误代码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)//系统关闭
{
if (systemON_Control == 3)
printf("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)//系统启动
{
if (systemON_Control == 0)
printf("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 > 150)
if(value > 250)
{
strcpy(s_strUIMessage,"帧率不可超过150");
strcpy(s_strUIMessage,"帧率不可超过250");
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****/

View File

@ -108,7 +108,7 @@
"widget_index": 6,
"widget_type": "int_input_box",
"widget_name": "帧率",
"int_input_box_hint": "unit:hz"
"int_input_box_hint": "单位:hz"
},
{
"widget_index": 7,
@ -119,12 +119,12 @@
"widget_index": 8,
"widget_type": "int_input_box",
"widget_name": "曝光时间",
"int_input_box_hint": "unit:ms"
"int_input_box_hint": "单位:毫秒"
},
{
"widget_index": 9,
"widget_type": "switch",
"widget_name": "开始采集"
"widget_name": "高光谱采集"
},
{
"widget_index": 10,
@ -132,10 +132,10 @@
"widget_name": "系统指令",
"list_item": [
{
"item_name": "等待指令"
"item_name": "其他"
},
{
"item_name": "重启电脑"
"item_name": "重启"
},
{
"item_name": "关机"
@ -157,7 +157,7 @@
"widget_name": "bin",
"list_item": [
{
"item_name": "等待指令"
"item_name": "其他"
},
{
"item_name": "光谱1"

View File

@ -108,7 +108,7 @@
"widget_index": 6,
"widget_type": "int_input_box",
"widget_name": "帧率",
"int_input_box_hint": "unit:hz"
"int_input_box_hint": "单位:hz"
},
{
"widget_index": 7,
@ -119,12 +119,12 @@
"widget_index": 8,
"widget_type": "int_input_box",
"widget_name": "曝光时间",
"int_input_box_hint": "unit:ms"
"int_input_box_hint": "单位:毫秒"
},
{
"widget_index": 9,
"widget_type": "switch",
"widget_name": "开始采集"
"widget_name": "高光谱采集"
},
{
"widget_index": 10,
@ -132,10 +132,10 @@
"widget_name": "系统指令",
"list_item": [
{
"item_name": "等待指令"
"item_name": "其他"
},
{
"item_name": "重启电脑"
"item_name": "重启"
},
{
"item_name": "关机"
@ -157,7 +157,7 @@
"widget_name": "bin",
"list_item": [
{
"item_name": "等待指令"
"item_name": "其他"
},
{
"item_name": "光谱1"

View File

@ -1,5 +1,5 @@
cmake_minimum_required(VERSION 3.5)
project(dji_sdk_demo_linux C)
project(dji_300tc C)
set(CMAKE_C_FLAGS "-pthread -std=gnu99")
set(CMAKE_EXE_LINKER_FLAGS "-pthread")

View File

@ -137,7 +137,7 @@ int main(int argc, char **argv)
return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR;
}
returnCode = DjiCore_SetAlias("PSDK_APPALIAS");
returnCode = DjiCore_SetAlias("300TC_3.32.37.21");
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("set alias error");
return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR;