Files
Payload-SDK/samples/sample_c/module_sample/widget/test_widget.c
tangchao0503 47153346cd fix
1. 无法第二次启动,授时等待时间优化;
2. 遥控器界面显示:硬盘可用空间,当前帧率剩余飞行时间;
3. 帧率曝光时间和遥控器右侧边栏数字联动;
4. bin2后面加通道数,侧边栏显示bin和通道数;
5. 遥控器去掉惯导定位精度,改为显示full nav;
6. 其他界面改动;
2023-08-23 11:56:23 +08:00

1051 lines
37 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
********************************************************************
* @file test_widget.c
* @brief
*
* @copyright (c) 2021 DJI. All rights reserved.
*
* All information contained herein is, and remains, the property of DJI.
* The intellectual and technical concepts contained herein are proprietary
* to DJI and may be covered by U.S. and foreign patents, patents in process,
* and protected by trade secret or copyright law. Dissemination of this
* information, including but not limited to data and other proprietary
* material(s) incorporated within the information, in any form, is strictly
* prohibited without the express written consent of DJI.
*
* If you receive this source code without DJIs authorization, you may not
* further disseminate the information, and you must immediately remove the
* source code and notify DJI of its removal. DJI reserves the right to pursue
* legal actions against you for any loss(es) or damage(s) caused by your
* failure to do so.
*
*********************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "test_widget.h"
#include <dji_widget.h>
#include <dji_logger.h>
#include "../utils/util_misc.h"
#include <dji_platform.h>
#include <stdio.h>
#include "dji_sdk_config.h"
#include "file_binary_array_list_en.h"
//sbg
#include <stdlib.h>
#include <string.h>
/* Private constants ---------------------------------------------------------*/
#define WIDGET_DIR_PATH_LEN_MAX (256)
#define WIDGET_TASK_STACK_SIZE (2048)
/* Private types -------------------------------------------------------------*/
/* Private functions declaration ---------------------------------------------*/
static void *DjiTest_WidgetTask(void *arg);
static T_DjiReturnCode DjiTestWidget_SetWidgetValue(E_DjiWidgetType widgetType, uint32_t index, int32_t value,
void *userData);
static T_DjiReturnCode DjiTestWidget_GetWidgetValue(E_DjiWidgetType widgetType, uint32_t index, int32_t *value,
void *userData);
static T_DjiReturnCode PsdkTestWidget_SetWidgetValue_StartRecord(E_DjiWidgetType widgetType, uint32_t index, int32_t value,
void *userData);
static void *PsdkTest_IrisRecordSystemChanged(void *arg);
static void extractSpectralBinAndBandnumber(bool isModifyBin);
/* Private values ------------------------------------------------------------*/
static T_DjiTaskHandle s_widgetTestThread;
static bool s_isWidgetFileDirPathConfigured = false;
static char s_widgetFileDirPath[DJI_FILE_PATH_SIZE_MAX] = {0};
static T_DjiTaskHandle s_widgetSbgThread;
static T_DjiTaskHandle s_widgetXimeaThread;
int SbgRecordCondition=0;
static int s_sbgMagState=0;
static int s_stateOfXimea=100;
static int s_stateOfSbg=0;
static int s_stateOfFile=0;
//0ximeaAirborneSystem系统未就绪不可启动1ximeaAirborneSystem系统就绪可以启动
//2ximeaAirborneSystem系统正在启动3ximeaAirborneSystem系统启动成功4系统已经关闭
int systemON_Control = 0;
char s_strUIMessage[100]=" ";
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 s_spectralBin[100]=" ";
int spectralBinInt = 0;
static char * s_strSbgSolutionMode=" ";
static char * s_strStateOfXimea=" ";
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;
static const T_DjiWidgetHandlerListItem s_widgetHandlerList[] = {
{0, DJI_WIDGET_TYPE_BUTTON, DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
{1, DJI_WIDGET_TYPE_LIST, DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
{2, DJI_WIDGET_TYPE_SWITCH, DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
{3, DJI_WIDGET_TYPE_SCALE, DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
{4, DJI_WIDGET_TYPE_BUTTON, DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
{5, DJI_WIDGET_TYPE_SWITCH, PsdkTestWidget_SetWidgetValue_StartRecord, DjiTestWidget_GetWidgetValue, NULL},
{6, DJI_WIDGET_TYPE_INT_INPUT_BOX, PsdkTestWidget_SetWidgetValue_StartRecord, DjiTestWidget_GetWidgetValue, NULL},
{7, DJI_WIDGET_TYPE_BUTTON, PsdkTestWidget_SetWidgetValue_StartRecord, DjiTestWidget_GetWidgetValue, NULL},
{8, DJI_WIDGET_TYPE_INT_INPUT_BOX, PsdkTestWidget_SetWidgetValue_StartRecord, DjiTestWidget_GetWidgetValue, NULL},
{9, DJI_WIDGET_TYPE_SWITCH, PsdkTestWidget_SetWidgetValue_StartRecord, DjiTestWidget_GetWidgetValue, NULL},
{10, DJI_WIDGET_TYPE_LIST, PsdkTestWidget_SetWidgetValue_StartRecord, DjiTestWidget_GetWidgetValue, NULL},//PsdkTestWidget_SetWidgetValue
{11, DJI_WIDGET_TYPE_LIST, PsdkTestWidget_SetWidgetValue_StartRecord, DjiTestWidget_GetWidgetValue, NULL},
};
static const char *s_widgetTypeNameArray[] = {
"Unknown",
"Button",
"Switch",
"Scale",
"List",
"Int input box"
};
static const uint32_t s_widgetHandlerListCount = sizeof(s_widgetHandlerList) / sizeof(T_DjiWidgetHandlerListItem);
static int32_t s_widgetValueList[sizeof(s_widgetHandlerList) / sizeof(T_DjiWidgetHandlerListItem)] = {0};
/* Exported functions definition ---------------------------------------------*/
T_DjiReturnCode DjiTest_WidgetStartService(void)
{
T_DjiReturnCode djiStat;
T_DjiOsalHandler *osalHandler = DjiPlatform_GetOsalHandler();
//Step 1 : Init DJI Widget
djiStat = DjiWidget_Init();
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Dji test widget init error, stat = 0x%08llX", djiStat);
return djiStat;
}
#ifdef SYSTEM_ARCH_LINUX
//Step 2 : Set UI Config (Linux environment)
//获取控件图像和UI配置文件所在文件夹
USER_LOG_INFO("验证是否定义了宏PSDK_ARCH_SYS_LINUX:是!--------------------------------------------------------------------------------------------------------------------------");
char curFileDirPath[WIDGET_DIR_PATH_LEN_MAX];
char tempPath[WIDGET_DIR_PATH_LEN_MAX];
djiStat = DjiUserUtil_GetCurrentFileDirPath(__FILE__, WIDGET_DIR_PATH_LEN_MAX, curFileDirPath);
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Get file current path error, stat = 0x%08llX", djiStat);
return djiStat;
}
if (s_isWidgetFileDirPathConfigured == true) {
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
djiStat = DjiWidget_RegDefaultUiConfigByDirPath(tempPath);
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Add default widget ui config error, stat = 0x%08llX", djiStat);
return djiStat;
}
//set ui config for English language
//设置系统语言为英文时控件配置文件的路径
djiStat = DjiWidget_RegUiConfigByDirPath(DJI_MOBILE_APP_LANGUAGE_ENGLISH,
DJI_MOBILE_APP_SCREEN_TYPE_BIG_SCREEN,
tempPath);
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Add widget ui config error, stat = 0x%08llX", djiStat);
return djiStat;
}
//set ui config for Chinese language
if (s_isWidgetFileDirPathConfigured == true) {
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,
DJI_MOBILE_APP_SCREEN_TYPE_BIG_SCREEN,
tempPath);
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Add widget ui config error, stat = 0x%08llX", djiStat);
return djiStat;
}
#else
//Step 2 : Set UI Config (RTOS environment)
T_DjiWidgetBinaryArrayConfig enWidgetBinaryArrayConfig = {
.binaryArrayCount = g_EnBinaryArrayCount,
.fileBinaryArrayList = g_EnFileBinaryArrayList
};
//set default ui config
djiStat = DjiWidget_RegDefaultUiConfigByBinaryArray(&enWidgetBinaryArrayConfig);
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Add default widget ui config error, stat = 0x%08llX", djiStat);
return djiStat;
}
#endif
//Step 3 : Set widget handler list
djiStat = DjiWidget_RegHandlerList(s_widgetHandlerList, s_widgetHandlerListCount);
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Set widget handler list error, stat = 0x%08llX", djiStat);
return djiStat;
}
//Step 4 : Run widget api sample task
if (osalHandler->TaskCreate("user_widget_task", DjiTest_WidgetTask, WIDGET_TASK_STACK_SIZE, NULL,
&s_widgetTestThread) != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Dji widget test task create error.");
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) {
USER_LOG_ERROR("Psdk widget test task(ximea) create error.");
return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
}
/* tc-----------------------------------------------*/
struct hostent *he;
he=gethostbyname("127.0.0.1");
s_sockfd=socket(AF_INET, SOCK_DGRAM,0);
bzero(&s_server,sizeof(s_server));
s_server.sin_family = AF_INET;
s_server.sin_port = htons(PORT);
s_server.sin_addr= *((struct in_addr *)he->h_addr);
/* tc-----------------------------------------------*/
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
T_DjiReturnCode DjiTest_WidgetSetConfigFilePath(const char *path)
{
memset(s_widgetFileDirPath, 0, sizeof(s_widgetFileDirPath));
memcpy(s_widgetFileDirPath, path, USER_UTIL_MIN(strlen(path), sizeof(s_widgetFileDirPath) - 1));
s_isWidgetFileDirPathConfigured = true;
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
__attribute__((weak)) void DjiTest_WidgetLogAppend(const char *fmt, ...)
{
}
#ifndef __CC_ARM
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wmissing-noreturn"
#pragma GCC diagnostic ignored "-Wreturn-type"
#pragma GCC diagnostic ignored "-Wformat"
#endif
/* Private functions definition-----------------------------------------------*/
//在DJI pilot的浮窗上显示系统时间
int messageTimeCounter = 0;
int messageTimespan = 10;
int XimeaAirborneSystemSurvival_Counter = 1;
int ximeaAirborneSystemSurvivalTime = 0;
int ximeaAirborneSystemSurvivalTime_Temp = 0;
static void *DjiTest_WidgetTask(void *arg)
{
char message[DJI_WIDGET_FLOATING_WINDOW_MSG_MAX_LEN];
uint32_t sysTimeMs = 0;
T_DjiReturnCode djiStat;
T_DjiOsalHandler *osalHandler = DjiPlatform_GetOsalHandler();
extractSpectralBinAndBandnumber(false);
USER_UTIL_UNUSED(arg);
while (1) {
djiStat = osalHandler->GetTimeMs(&sysTimeMs);
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Get system time ms error, stat = 0x%08llX", djiStat);
}
#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 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,
USER_FIRMWARE_MAJOR_VERSION, USER_FIRMWARE_MINOR_VERSION,
USER_FIRMWARE_MODIFY_VERSION, USER_FIRMWARE_DEBUG_VERSION,
__DATE__, __TIME__);
#endif
djiStat = DjiWidgetFloatingWindow_ShowMessage(message);
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Floating window show message error, stat = 0x%08llX", djiStat);
}
messageTimeCounter++;
if (messageTimeCounter % messageTimespan == 0)
{
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)
// {
// if (XimeaAirborneSystemSurvival_Counter % 10 ==0)
// {
// if (ximeaAirborneSystemSurvivalTime - ximeaAirborneSystemSurvivalTime_Temp == 0)
// {
// strcpy(s_strUIMessage,"采集系统无响应,请重启!");
// messageTimeCounter = 0;
// messageTimespan = 10;
// }
//
// XimeaAirborneSystemSurvival_Counter = 1;
// ximeaAirborneSystemSurvivalTime_Temp = ximeaAirborneSystemSurvivalTime;
// }
//
// XimeaAirborneSystemSurvival_Counter++;
// }
osalHandler->TaskSleepMs(1000);
}
}
static void *PsdkTest_IrisRecordSystemChanged(void *arg)//
{
// FILE * fp;
// char buffer[80];
// fp = popen("/home/iris-xport/cpp_qtcreator/ximeaImageRecorder-Release/ximeaImageRecorder", "r");ss
// fgets(buffer, sizeof(buffer), fp);
// printf("%s", buffer);
// pclose(fp);
int sockfd;
struct sockaddr_in server;
struct sockaddr_in client;
socklen_t addrlen;
int num;
char buf[MAXDATASIZE];
if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
{
perror("Creatingsocket failed.");
}
bzero(&server,sizeof(server));
server.sin_family=AF_INET;
server.sin_port=htons(PORT+1);
server.sin_addr.s_addr= htonl(INADDR_ANY);
if(bind(sockfd, (struct sockaddr *)&server, sizeof(server)) == -1)
{
perror("Bind()error.");
}
addrlen=sizeof(client);
while (1)
{
//printf("PsdkTest_IrisRecordSystemChanged: record system status change! 8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888\n");
num =recvfrom(sockfd,buf,MAXDATASIZE,0,(struct sockaddr*)&client,&addrlen);
if (num < 0)
{
perror("recvfrom() error\n");
continue;
}
buf[num] = '\0';
printf("You got a message (%s) from client.\n",buf);
//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[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[3]: %s\n\n", result[3]);
printf("result[4]: %s\n\n", result[4]);
if (strcmp(result[0],"sbg") == 0)
{
s_stateOfSbg = atoi(result[1]);
printf("sbg的状态为: %d\n\n", atoi(result[1]));
switch (s_stateOfSbg)
{
case 0:
s_strStateOfSbg="未打开";
if (systemON_Control == 0 || systemON_Control == 4)
{
strcpy(s_strUIMessage,"系统已就绪!");
messageTimeCounter = 0;
messageTimespan = 1000;
systemON_Control = 1;//ximeaAirborneSystem系统一启动就会发送此信息 → 代表采集系统就绪;
}
if (systemON_Control == 3)
{
strcpy(s_strUIMessage,"数据量过大,采集系统已经停止,请重新上电!");
messageTimeCounter = 0;
messageTimespan = 1000;
}
break;
case 1:
s_strStateOfSbg="波特率设置失败";
break;
case 2:
s_strStateOfSbg="打开成功";
break;
case 3:
s_strStateOfSbg="采集中";
systemON_Control = 3;
break;
default:
break;
}
}
else if (strcmp(result[0],"Accuracy") == 0)
{
// printf("惯导定位精度为: %s\n\n", result[1]);
s_strSbgAccuracy=result[1];
s_strSbgSatelliteCounter=result[2];
ximeaAirborneSystemSurvivalTime++;
// s_sbgMagState = atoi(result[1]);
// switch (s_sbgMagState)
// {
// case 0:
// s_strSbgAccuracy="false";
// break;
// case 1:
// s_strSbgAccuracy="true";
// break;
// default:
// break;
// }
}
else if (strcmp(result[0],"SolutionMode") == 0)
{
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采集中
{
case 10:
s_strStateOfXimea="10";
strcpy(s_strUIMessage,"相机timeout请重启");
messageTimeCounter = 0;
messageTimespan = 200;
break;
case 11:
s_strStateOfXimea="11";
strcpy(s_strUIMessage,"相机Invalid arguments supplied");
messageTimeCounter = 0;
messageTimespan = 200;
break;
case 57:
s_strStateOfXimea="57";
strcpy(s_strUIMessage,"相机被占用!");
messageTimeCounter = 0;
messageTimespan = 200;
break;
case 99:
s_strStateOfXimea="99";
strcpy(s_strUIMessage,"相机异常,错误码见日志!");
messageTimeCounter = 0;
messageTimespan = 200;
break;
case 100:
s_strStateOfXimea="未打开";
break;
case 101:
s_strStateOfXimea="打开成功";
strcpy(s_strUIMessage,"系统启动成功!");
messageTimeCounter = 0;
messageTimespan = 20;
break;
case 102:
s_strStateOfXimea="帧率完成";
break;
case 103:
s_strStateOfXimea="曝光完成";
break;
case 104:
s_strStateOfXimea="采集中";
break;
default:
break;
}
}
else if (strcmp(result[0],"XimeaAutoExpose") == 0)
{
strcpy(XimeaExposeMaxValue, result[1]);
int exposeTimeTmp = atoi(result[2]);
sprintf(XimeaExposeTime,"%d",exposeTimeTmp);
s_widgetValueList[8] = exposeTimeTmp;
strcpy(s_strUIMessage,"曝光时间设置成功!");
messageTimeCounter = 0;
messageTimespan = 10;
}
else if (strcmp(result[0],"XimeaFrameRate") == 0)
{
framerate = atoi(result[1]);
s_widgetValueList[6] = framerate;
sprintf(XimeaFramerate,"%d",framerate);
// strcpy(XimeaFramerate,result[1]);
strcpy(s_strUIMessage,"帧率设置成功!");
messageTimeCounter = 0;
messageTimespan = 10;
}
else if (strcmp(result[0],"bin") == 0)
{
spectralBinInt = atoi(result[2]);
}
}
}
#ifndef __CC_ARM
#pragma GCC diagnostic pop
#endif
static T_DjiReturnCode DjiTestWidget_SetWidgetValue(E_DjiWidgetType widgetType, uint32_t index, int32_t value,
void *userData)
{
USER_UTIL_UNUSED(userData);
USER_LOG_INFO("Set widget value, widgetType = %s, widgetIndex = %d ,widgetValue = %d",
s_widgetTypeNameArray[widgetType], index, value);
s_widgetValueList[index] = value;
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
static T_DjiReturnCode DjiTestWidget_GetWidgetValue(E_DjiWidgetType widgetType, uint32_t index, int32_t *value,
void *userData)
{
USER_UTIL_UNUSED(userData);
USER_UTIL_UNUSED(widgetType);
*value = s_widgetValueList[index];
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
int frameRateGlobel = 0;
static T_DjiReturnCode PsdkTestWidget_SetWidgetValue_StartRecord(E_DjiWidgetType widgetType, uint32_t index, int32_t value,
void *userData)
{
USER_UTIL_UNUSED(userData);
USER_LOG_INFO("Set widget value, widgetType = %s, widgetIndex = %d ,widgetValue = %d",
s_widgetTypeNameArray[widgetType], index, value);
s_widgetValueList[index] = value;
switch (index)
{
case 5://系统启动关闭
if (value==0)//系统关闭
{
printf("systemON_Control的值为%d\n", systemON_Control);
if (0 <= systemON_Control && systemON_Control <= 4)
{
strcpy(s_strUIMessage,"系统已经关闭!");
messageTimeCounter = 0;
messageTimespan = 1000;
char* command = "2";
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)//系统启动
{
printf("systemON_Control的值为%d\n", systemON_Control);
if (systemON_Control == 4)
{
strcpy(s_strUIMessage,"请等待系统初始化!");
messageTimeCounter = 0;
messageTimespan = 1000;
}
else if (systemON_Control == 0 || systemON_Control == 1)
{
strcpy(s_strUIMessage,"系统启动中,请等待!");
messageTimeCounter = 0;
messageTimespan = 1000;
char* command = "1";
sendto(s_sockfd, command,strlen(command),0,(struct sockaddr *)&s_server,sizeof(s_server));
systemON_Control = 2;
}
else if (systemON_Control == 2)
{
strcpy(s_strUIMessage,"系统启动中,请等待!");
messageTimeCounter = 0;
messageTimespan = 1000;
}
else if (systemON_Control == 3)
{
strcpy(s_strUIMessage,"系统已经启动!");
messageTimeCounter = 0;
messageTimespan = 1000;
}
}
break;
case 6://设置帧率
{
if (s_stateOfXimea < 101)
{
strcpy(s_strUIMessage,"请先启动系统!");
messageTimeCounter = 0;
messageTimespan = 10;
break;
}
else if (s_stateOfXimea > 103)
{
strcpy(s_strUIMessage,"相机采集中,此操作无效!");
messageTimeCounter = 0;
messageTimespan = 10;
break;
}
// 控制帧率范围
if(value > 250)
{
strcpy(s_strUIMessage,"帧率不可超过250");
messageTimeCounter = 0;
messageTimespan = 10;
break;
}
else if(value == 0)
{
strcpy(s_strUIMessage,"帧率无效!");
messageTimeCounter = 0;
messageTimespan = 10;
break;
}
//
frameRateGlobel = value;
char command[50] = "5,";
char framerate[20];
sprintf(framerate,"%d",value);
strcat(command,framerate);
sendto(s_sockfd, command,strlen(command),0,(struct sockaddr *)&s_server,sizeof(s_server));
break;
}
case 7://自动曝光
if (value==0)
{
;
}
else if (value==1)
{
if (s_stateOfXimea < 101)
{
strcpy(s_strUIMessage,"请先启动系统!");
messageTimeCounter = 0;
messageTimespan = 10;
break;
}
else if (s_stateOfXimea > 103)
{
strcpy(s_strUIMessage,"相机采集中,此操作无效!");
messageTimeCounter = 0;
messageTimespan = 10;
break;
}
strcpy(s_strUIMessage,"正在自动曝光,请稍等!");
messageTimeCounter = 0;
messageTimespan = 1000;
char* command = "6";
sendto(s_sockfd, command,strlen(command),0,(struct sockaddr *)&s_server,sizeof(s_server));
}
break;
case 8://手动设置曝光时间
{
if (s_stateOfXimea < 101)
{
strcpy(s_strUIMessage,"请先启动系统!");
messageTimeCounter = 0;
messageTimespan = 10;
break;
}
else if (s_stateOfXimea > 103)
{
strcpy(s_strUIMessage,"相机采集中,此操作无效!");
messageTimeCounter = 0;
messageTimespan = 10;
break;
}
//曝光时间有效性判断
if(frameRateGlobel == 0)
{
strcpy(s_strUIMessage,"请先设置帧率!");
messageTimeCounter = 0;
messageTimespan = 10;
break;
}
float maxExposureTime = 1 / (float)frameRateGlobel * 1000;//单位是ms
if(value > maxExposureTime)
{
strcpy(s_strUIMessage,"曝光时间超过上限,无效!");
messageTimeCounter = 0;
messageTimespan = 10;
break;
}
else if(value == 0)
{
strcpy(s_strUIMessage,"曝光时间无效!");
messageTimeCounter = 0;
messageTimespan = 10;
break;
}
//
char command[50] = "7,";
char exposureTime[20];
sprintf(exposureTime,"%d",(value));
strcat(command,exposureTime);
sendto(s_sockfd, command,strlen(command),0,(struct sockaddr *)&s_server,sizeof(s_server));
break;
}
case 9:
if (value==0)//停止采集
{
char* command = "4";
sendto(s_sockfd, command,strlen(command),0,(struct sockaddr *)&s_server,sizeof(s_server));
}
else if (value==1)//开始采集
{
if (s_stateOfXimea < 101)
{
strcpy(s_strUIMessage,"请先启动系统!");
messageTimeCounter = 0;
messageTimespan = 10;
break;
}
else if (s_stateOfXimea == 101)
{
strcpy(s_strUIMessage,"请先设置帧率!");
messageTimeCounter = 0;
messageTimespan = 10;
break;
}
else if (s_stateOfXimea == 102)
{
strcpy(s_strUIMessage,"请先设置曝光时间!");
messageTimeCounter = 0;
messageTimespan = 10;
break;
}
char* command = "3";
sendto(s_sockfd, command,strlen(command),0,(struct sockaddr *)&s_server,sizeof(s_server));
}
break;
case 10:
if (value==0)//等待指令
{
}
if (value==1)
{
system("reboot");
}
else if (value==2)
{
system("shutdown now");
}
else if (value==3)
{
system("/home/300tc/projects/udpClient/udpClient 127.0.0.1 9,1");
}
else if (value==4)
{
system("/home/300tc/projects/udpClient/udpClient 127.0.0.1 9,0");
}
else if (value==5)
{
strcpy(s_strUIMessage,"系统正在更新,稍后会自动重启!");
messageTimeCounter = 0;
messageTimespan = 10000;
system("/home/pi/tc_ShellScripts/update0.sh &> /media/nvme/300TC/update/log");
}
break;
case 11:
if (value==0)//等待指令
{
}
if (value==1)
{
system("sudo sed -i 's/spectralBin =.*/spectralBin = 1;/g' /media/nvme/300TC/config/ximea.cfg");
}
else if (value==2)
{
system("sudo sed -i 's/spectralBin =.*/spectralBin = 2;/g' /media/nvme/300TC/config/ximea.cfg");
}
extractSpectralBinAndBandnumber(true);
strcpy(s_strUIMessage,"请重新上电!");
messageTimeCounter = 0;
messageTimespan = 10000;
break;
default:
break;
}
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****/