
1. 无法第二次启动,授时等待时间优化; 2. 遥控器界面显示:硬盘可用空间,当前帧率剩余飞行时间; 3. 帧率曝光时间和遥控器右侧边栏数字联动; 4. bin2后面加通道数,侧边栏显示bin和通道数; 5. 遥控器去掉惯导定位精度,改为显示full nav; 6. 其他界面改动;
1051 lines
37 KiB
C
1051 lines
37 KiB
C
/**
|
||
********************************************************************
|
||
* @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 DJI’s 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;
|
||
|
||
//0:ximeaAirborneSystem系统未就绪,不可启动;1:ximeaAirborneSystem系统就绪,可以启动;
|
||
//2:ximeaAirborneSystem系统正在启动;3:ximeaAirborneSystem系统启动成功;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-61:ximea官方错误代码;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****/
|