/** ******************************************************************** * @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 #include #include "../utils/util_misc.h" #include #include #include "dji_sdk_config.h" #include "file_binary_array_list_en.h" //sbg #include #include /* 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); static void closeXimeaRecordSystem(); /* 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]=" "; int exposeTimeInt = 0; 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_LIST, PsdkTestWidget_SetWidgetValue_StartRecord, 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 }; 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(); USER_UTIL_UNUSED(arg); while (1) { s_widgetValueList[6] = framerate; s_widgetValueList[8] = exposeTimeInt; if (systemON_Control == 4) { s_widgetValueList[5] = 0; } 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); extractSpectralBinAndBandnumber(false); //判断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="未打开"; strcpy(s_strUIMessage,"系统已就绪!"); messageTimeCounter = 0; messageTimespan = 1000; systemON_Control = 1;//ximeaAirborneSystem系统一启动就会发送此信息 → 代表采集系统就绪; 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="dis_UNINIT";//UNINITIALIZED break; case 1: s_strSbgSolutionMode="dis_GYRO";//VERTICAL_GYRO break; case 2: s_strSbgSolutionMode="dis_AHRS"; break; case 3: s_strSbgSolutionMode="dis_VELOCITY";//NAV_VELOCITY break; case 4: s_strSbgSolutionMode="en_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]); exposeTimeInt = atoi(result[2]); sprintf(XimeaExposeTime,"%d",exposeTimeInt); s_widgetValueList[8] = exposeTimeInt; 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; } 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); int32_t valueTmp = s_widgetValueList[index]; s_widgetValueList[index] = value; switch (index) { case 4: 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 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); closeXimeaRecordSystem(); } } 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; // printf("index-------:%d\n", index); // printf("valueTmp-------:%d\n", valueTmp); //下面的代码没有作用:无法恢复界面的值为默认值(valueTmp) // DjiTestWidget_SetWidgetValue(widgetType, index, valueTmp, userData); // s_widgetValueList[index] = valueTmp; 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; } // char command[50] = "5,"; char framerate_str[20]; sprintf(framerate_str,"%d",value); strcat(command,framerate_str); 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; } //曝光时间有效性判断 float maxExposureTime = 1 / (float)framerate * 1000;//单位是ms if(value > maxExposureTime) { strcpy(s_strUIMessage,"曝光时间已设置为最大!"); messageTimeCounter = 0; messageTimespan = 10; } 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; } 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("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"); } closeXimeaRecordSystem(); extractSpectralBinAndBandnumber(true); strcpy(s_strUIMessage,"请等待采集系统重启!"); messageTimeCounter = 0; messageTimespan = 10000; break; default: break; } return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS; } static void closeXimeaRecordSystem() { 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[5] = 0; // s_widgetValueList[6] = 0; // s_widgetValueList[8] = 0; framerate = 0; exposeTimeInt = 0; system("sudo gpio write 10 0"); } 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); } s_widgetValueList[10] = spectralBin; if (!isModifyBin) { sprintf(s_spectralBin,"%d_%d", spectralBin, height); } } /****************** (C) COPYRIGHT DJI Innovations *****END OF FILE****/