8 Commits

9 changed files with 337 additions and 25 deletions

View File

@ -119,6 +119,13 @@ static uint32_t s_tapZoomNewestTargetHybridFocalLength = 0; // unit: 0.1mm
static T_DjiMutexHandle s_tapZoomMutex = NULL;
static E_DjiCameraVideoStreamType s_cameraVideoStreamType;
static int sockfd;
static struct sockaddr_in server;
static struct sockaddr_in client;
static socklen_t addrlen;
char s_positionMessage[100]=" ";
/* Private functions declaration ---------------------------------------------*/
//用于s_commonHandler中的回调函数:相机类基础功能
static T_DjiReturnCode GetSystemState(T_DjiCameraSystemState *systemState);
@ -587,6 +594,9 @@ static T_DjiReturnCode SetFocusTarget(T_DjiCameraPointInScreen target)
USER_LOG_INFO("set focus target x:%.2f y:%.2f", target.focusX, target.focusY);
memcpy(&s_cameraFocusTarget, &target, sizeof(T_DjiCameraPointInScreen));
sprintf(s_positionMessage, "%.2f,%.2f", target.focusX, target.focusY);
sendto(sockfd, s_positionMessage, strlen(s_positionMessage), 0, (struct sockaddr *)&server, sizeof(server));
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
@ -1399,6 +1409,15 @@ T_DjiReturnCode DjiTest_CameraEmuBaseStartService(void)
s_isCamInited = true;
// 创建UDP套接字
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(POSITION_PORT_RLX);
server.sin_addr.s_addr = htonl(INADDR_ANY);
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}

View File

@ -31,6 +31,13 @@
#include "dji_typedef.h"
#include "dji_payload_camera.h"
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#define POSITION_PORT_RLX 20005
#ifdef __cplusplus
extern "C" {
#endif

View File

@ -42,6 +42,7 @@
#define VIDEO_FRAME_MAX_COUNT 18000 // max video duration 10 minutes
#define VIDEO_FRAME_AUD_LEN 6
#define DATA_SEND_FROM_VIDEO_STREAM_MAX_LEN 60000
#define MAXDATASIZE 100000
/* Private types -------------------------------------------------------------*/
typedef enum {
@ -123,6 +124,7 @@ static T_DjiReturnCode StopDownloadNotification(void);
_Noreturn static void *UserCameraMedia_SendVideoTask(void *arg);
static void *UserCameraMedia_SendVideoTask_tc(void *arg);
static void *UserCameraMedia_SendVideoTask_ximea(void *arg);
/* Private variables -------------------------------------------------------------*/
static T_DjiCameraMediaDownloadPlaybackHandler s_psdkCameraMedia = {0};//控制相机类负载设备执行媒体文件下载回放功能
@ -212,14 +214,24 @@ T_DjiReturnCode DjiTest_CameraEmuMediaStartService(void)
}
// 创建线程执行用户自定义函数
// if (DjiPlatform_GetHalNetworkHandler() != NULL || DjiPlatform_GetHalUsbBulkHandler() != NULL) {
// returnCode = osalHandler->TaskCreate("user_camera_media_task", UserCameraMedia_SendVideoTask_tc, 2048,
// NULL, &s_userSendVideoThread);
// if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
// USER_LOG_ERROR("user send video task create error.");
// return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
// }
// }
if (DjiPlatform_GetHalNetworkHandler() != NULL || DjiPlatform_GetHalUsbBulkHandler() != NULL) {
returnCode = osalHandler->TaskCreate("user_camera_media_task", UserCameraMedia_SendVideoTask_ximea, 2048,
NULL, &s_userSendVideoThread);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("user send video task create error.");
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
}
char ipAddr[100];
uint16_t port;
returnCode = DjiPayloadCamera_GetVideoStreamRemoteAddress(ipAddr, &port);
if (returnCode == DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_INFO("Get video stream remote address-------------------------------------: %s, port: %d", ipAddr, port);
} else {
USER_LOG_INFO("get video stream remote address error------------------------------------.");
return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
}
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
@ -559,7 +571,10 @@ static T_DjiReturnCode DjiPlayback_VideoFileTranscode(const char *inPath, const
snprintf(ffmpegCmdStr, FFMPEG_CMD_BUF_SIZE,
"echo \"y\" | ffmpeg -i \"%s\" -codec copy -f \"%s\" \"%s\" 1>/dev/null 2>&1", inPath,
outFormat, outPath);
// echo "y" | ffmpeg -i "/home/300tc/projects_source/Payload-SDK/samples/sample_c/module_sample/camera_emu/media_file/PSDK_0005.h264" -codec copy -f "h264" "/home/300tc/projects_source/Payload-SDK/samples/sample_c/module_sample/camera_emu/media_file/out.h264" 1>/dev/null 2>&1
// printf(ffmpegCmdStr);
fpCommand = popen(ffmpegCmdStr, "r");
if (fpCommand == NULL) {
USER_LOG_ERROR("execute transcode command fail.");
@ -1178,7 +1193,7 @@ static void *UserCameraMedia_SendVideoTask(void *arg)
uint16_t lengthOfDataToBeSent = 0;
int lengthOfDataHaveBeenSent = 0;
char *dataBuffer = NULL;
T_TestPayloadCameraPlaybackCommand playbackCommand = {0};//??????????????????????
T_TestPayloadCameraPlaybackCommand playbackCommand = {0};//取出将要执行的命令,放入此变量
uint16_t bufferReadSize = 0;
char *videoFilePath = NULL;
char *transcodedFilePath = NULL;//转换视频编码后的文件路径
@ -1238,6 +1253,8 @@ static void *UserCameraMedia_SendVideoTask(void *arg)
exit(1);
}
int frameNumberSendCounter=0;
while (1) {
osalHandler->TaskSleepMs(1000 / SEND_VIDEO_TASK_FREQ);
@ -1354,6 +1371,8 @@ send:
//3. 解析视频流文件
//基于PSDK 开发的相机类负载设备获取视频流文件的信息后,将解析视频流文件的内容,识别视频流文件的帧头。
frameBufSize = frameInfo[frameNumber].size;//这行几行代码的意思:每一帧的大小不一样
printf("第 %d 帧大小:%d\n", frameNumberSendCounter, frameBufSize);
frameNumberSendCounter++;
if (videoStreamType == DJI_CAMERA_VIDEO_STREAM_TYPE_H264_DJI_FORMAT) {
frameBufSize = frameBufSize + VIDEO_FRAME_AUD_LEN;
}
@ -1554,7 +1573,7 @@ static void *UserCameraMedia_SendVideoTask_tc(void *arg)
int aa = v_ifmtCtx->streams[videoindex]->r_frame_rate.num;
int bb = v_ifmtCtx->streams[videoindex]->r_frame_rate.den;
double dInputFps = v_ifmtCtx->streams[videoindex]->r_frame_rate.num*1.0 / v_ifmtCtx->streams[videoindex]->r_frame_rate.den;
printf("摄像头的帧率%d\n",(int)dInputFps);
printf("摄像头的帧率: %d\n",(int)dInputFps);
//视频流的编解码器
@ -1562,7 +1581,7 @@ static void *UserCameraMedia_SendVideoTask_tc(void *arg)
AVCodec *pCodec;
pCodec=avcodec_find_decoder(v_ifmtCtx->streams[videoindex]->codecpar->codec_id);
printf("编码器名字:%%s\n",pCodec->name);
printf("编码器名字:%s\n",pCodec->name);
if(pCodec==NULL)
{
@ -1808,6 +1827,7 @@ static void *UserCameraMedia_SendVideoTask_tc(void *arg)
//3. 解析视频流文件
//基于PSDK 开发的相机类负载设备获取视频流文件的信息后,将解析视频流文件的内容,识别视频流文件的帧头。
frameBufSize = datasize;
videoStreamType = DJI_CAMERA_VIDEO_STREAM_TYPE_H264_DJI_FORMAT;
if (videoStreamType == DJI_CAMERA_VIDEO_STREAM_TYPE_H264_DJI_FORMAT) {
frameBufSize = frameBufSize + VIDEO_FRAME_AUD_LEN;
}
@ -1852,6 +1872,7 @@ static void *UserCameraMedia_SendVideoTask_tc(void *arg)
dataLength - lengthOfDataHaveBeenSent);
returnCode = DjiPayloadCamera_SendVideoStream((const uint8_t *) dataBuffer + lengthOfDataHaveBeenSent,
lengthOfDataToBeSent);
printf("fasong: %d!!!!\n", lengthOfDataToBeSent);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("send video stream error: 0x%08llX.", returnCode);
}
@ -1881,6 +1902,186 @@ static void *UserCameraMedia_SendVideoTask_tc(void *arg)
}
}
static void *UserCameraMedia_SendVideoTask_ximea(void *arg)
{
int ret;
T_DjiReturnCode returnCode;
static uint32_t sendVideoStep = 0;
FILE *fpFile = NULL;
unsigned long dataLength = 0;
uint16_t lengthOfDataToBeSent = 0;
int lengthOfDataHaveBeenSent = 0;
char *dataBuffer = NULL;
T_TestPayloadCameraPlaybackCommand playbackCommand = {0};//取出将要执行的命令,放入此变量
uint16_t bufferReadSize = 0;
char *videoFilePath = NULL;
char *transcodedFilePath = NULL;//转换视频编码后的文件路径
float frameRate = 1.0f;
T_TestPayloadCameraVideoFrameInfo *frameInfo = NULL;//时长,大小,此帧在文件中的位置
uint32_t frameNumber = 0;
uint32_t frameCount = 0;
uint32_t startTimeMs = 0;
bool sendVideoFlag = true;
bool sendOneTimeFlag = false;
T_DjiDataChannelState videoStreamState = {0};
E_DjiCameraMode mode = DJI_CAMERA_MODE_SHOOT_PHOTO;
T_DjiOsalHandler *osalHandler = DjiPlatform_GetOsalHandler();
uint32_t frameBufSize = 0;
E_DjiCameraVideoStreamType videoStreamType;
char curFileDirPath[DJI_FILE_PATH_SIZE_MAX];
char tempPath[DJI_FILE_PATH_SIZE_MAX];
USER_UTIL_UNUSED(arg);
//获取视频流文件信息(1)
returnCode = DjiUserUtil_GetCurrentFileDirPath(__FILE__, DJI_FILE_PATH_SIZE_MAX, curFileDirPath);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Get file current path error, stat = 0x%08llX", returnCode);
exit(1);
}
if (s_isMediaFileDirPathConfigured == true) {
snprintf(tempPath, DJI_FILE_PATH_SIZE_MAX, "%sPSDK_0005.h264", s_mediaFileDirPath);
} else {
snprintf(tempPath, DJI_FILE_PATH_SIZE_MAX, "%smedia_file/PSDK_0005.h264", curFileDirPath);
}
//使用PSDK 开发的相机类负载设备在创建视频流处理线程后,需要先初始化线程状态并向相机类负载设备申请用于缓存视频流文件的内存空间。
videoFilePath = osalHandler->Malloc(DJI_FILE_PATH_SIZE_MAX);
if (videoFilePath == NULL) {
USER_LOG_ERROR("malloc memory for video file path fail.");
exit(1);
}
transcodedFilePath = osalHandler->Malloc(DJI_FILE_PATH_SIZE_MAX);
if (transcodedFilePath == NULL) {
USER_LOG_ERROR("malloc memory for transcoded file path fail.");
exit(1);
}
frameInfo = osalHandler->Malloc(VIDEO_FRAME_MAX_COUNT * sizeof(T_TestPayloadCameraVideoFrameInfo));
if (frameInfo == NULL) {
USER_LOG_ERROR("malloc memory for frame info fail.");
exit(1);
}
memset(frameInfo, 0, VIDEO_FRAME_MAX_COUNT * sizeof(T_TestPayloadCameraVideoFrameInfo));
//???????????????????????????????????????????????????????????????
returnCode = DjiPlayback_StopPlayProcess();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("stop playback and start liveview error: 0x%08llX.", returnCode);
exit(1);
}
//tc+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
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);
server.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(sockfd, (struct sockaddr *) &server, sizeof(server)) == -1)
{
perror("Bind() error.");
}
int udpReceivedCounter=0;
//tc-------------------------------------------------------------------------------------------------------------------
while (1)
{
send:
num = recvfrom(sockfd, buf, MAXDATASIZE, 0, (struct sockaddr *) &client, &addrlen);
if (num < 0) {
perror("recvfrom() error\n");
continue;
}
// printf("You got a message (%d bytes) from client. \nId is %d\n", num, udpReceivedCounter);
udpReceivedCounter++;
//3. 解析视频流文件
//基于PSDK 开发的相机类负载设备获取视频流文件的信息后,将解析视频流文件的内容,识别视频流文件的帧头。
videoStreamType = DJI_CAMERA_VIDEO_STREAM_TYPE_H264_DJI_FORMAT;
frameBufSize = num;//这行几行代码的意思:每一帧的大小不一样
if (videoStreamType == DJI_CAMERA_VIDEO_STREAM_TYPE_H264_DJI_FORMAT) {
frameBufSize = frameBufSize + VIDEO_FRAME_AUD_LEN;
}
dataBuffer = calloc(frameBufSize, 1);
if (dataBuffer == NULL) {
USER_LOG_ERROR("malloc fail.");
goto free;
}
memcpy(dataBuffer,buf,num);
dataLength = num;
//4. 发送视频流数据
//基于PSDK 开发的相机类负载设备在解析视频流文件并识别视频流文件的帧头后调用视频流发送接口PsdkPayloadCamera_SendVideoStream,
//以逐帧的方式发送视频流数据。若视频流格式为DJI H264格式需要在每一帧的最后增加AUD信息用于标识一帧的结束。
if (videoStreamType == DJI_CAMERA_VIDEO_STREAM_TYPE_H264_DJI_FORMAT) {
memcpy(&dataBuffer[num], s_frameAudInfo, VIDEO_FRAME_AUD_LEN);
dataLength = dataLength + VIDEO_FRAME_AUD_LEN;
}
// for(int i=0;i<dataLength - VIDEO_FRAME_AUD_LEN;i++)
// {
//// printf("%c",data[i]);
// printf("%02X ",dataBuffer[i]);
// }
// printf("\n");
lengthOfDataHaveBeenSent = 0;
while (dataLength - lengthOfDataHaveBeenSent)
{
lengthOfDataToBeSent = USER_UTIL_MIN(DATA_SEND_FROM_VIDEO_STREAM_MAX_LEN,
dataLength - lengthOfDataHaveBeenSent);
returnCode = DjiPayloadCamera_SendVideoStream((const uint8_t *) dataBuffer + lengthOfDataHaveBeenSent,
lengthOfDataToBeSent);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
USER_LOG_ERROR("send video stream error: 0x%08llX.", returnCode);
}
lengthOfDataHaveBeenSent += lengthOfDataToBeSent;
}
if ((frameNumber++) >= frameCount) {
USER_LOG_DEBUG("reach file tail.");
frameNumber = 0;
if (sendOneTimeFlag == true)
sendVideoFlag = false;
}
//5. 获取视频流状态
//使用PSDK 开发的相机类负载设备能够获取视频流发送的实时状态,方便用户调整视频流的码率,确保图传画面的稳定显示。
returnCode = DjiPayloadCamera_GetVideoStreamState(&videoStreamState);
if (returnCode == DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_DEBUG(
"video stream state: realtimeBandwidthLimit: %d, realtimeBandwidthBeforeFlowController: %d, realtimeBandwidthAfterFlowController:%d busyState: %d.",
videoStreamState.realtimeBandwidthLimit, videoStreamState.realtimeBandwidthBeforeFlowController,
videoStreamState.realtimeBandwidthAfterFlowController,
videoStreamState.busyState);
} else {
USER_LOG_ERROR("get video stream state error.");
}
free:
free(dataBuffer);
}
}
#ifndef __CC_ARM
#pragma GCC diagnostic pop
#endif

View File

@ -33,6 +33,17 @@
#include "ffmpeg_tc.h"
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#define PORT 666
#ifdef __cplusplus
extern "C" {
#endif

View File

@ -423,6 +423,7 @@ static void *UserFcSubscription_Task(void *arg)
// printf("command---:%s\n",command);
system(command);
system("mkdir /media/nvme/300TC/config");
system("echo \"1\" > /media/nvme/300TC/config/timesyncfromdji");
}
counter++;

View File

@ -54,6 +54,7 @@ static T_DjiReturnCode PsdkTestWidget_SetWidgetValue_StartRecord(E_DjiWidgetType
static void *PsdkTest_IrisRecordSystemChanged(void *arg);
static void extractSpectralBinAndBandnumber(bool isModifyBin);
static void extractSpatialBinAndWidth(bool isModifyBin);
static void closeXimeaRecordSystem();
/* Private values ------------------------------------------------------------*/
@ -88,7 +89,9 @@ char XimeaExposeTime[100]=" ";
int exposeTimeInt = 0;
char XimeaExposeMaxValue[100]=" ";
char s_spectralBin[100]=" ";
char s_spatialBin[100]=" ";
int spectralBinInt = 0;
int spatialBinInt = 0;
static char * s_strSbgSolutionMode=" ";
static char * s_strStateOfXimea=" ";
@ -245,6 +248,8 @@ T_DjiReturnCode DjiTest_WidgetStartService(void)
s_server.sin_family = AF_INET;
s_server.sin_port = htons(PORT);
s_server.sin_addr= *((struct in_addr *)he->h_addr);
system("/home/300tc/projects/udpClient/udpClient 127.0.0.1 10");
/* tc-----------------------------------------------*/
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
@ -303,8 +308,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 μs %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);
snprintf(message, DJI_WIDGET_FLOATING_WINDOW_MSG_MAX_LEN, "%s\n高光谱: %s 惯导: %s\n卫星: %s 惯导状态: %s\n帧率: %s 曝光: %s μs %s \nP: %s R: %s Y: %s \n时间: %s min 空间: %s G\n光谱bin: %s 空间bin: %s\n",
s_strUIMessage, s_strStateOfXimea, s_strStateOfSbg, s_strSbgSatelliteCounter, s_strSbgSolutionMode, XimeaFramerate, XimeaExposeTime, XimeaExposeMaxValue, s_strPitch, s_strRoll, s_strYaw, s_remainingTime, s_remainingSpace, s_spectralBin, s_spatialBin);
#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,
@ -327,6 +332,9 @@ static void *DjiTest_WidgetTask(void *arg)
strcpy(s_strUIMessage," ");
}
extractSpectralBinAndBandnumber(false);
extractSpatialBinAndWidth(false);
char buffer[128];
FILE *fp;
@ -345,24 +353,28 @@ static void *DjiTest_WidgetTask(void *arg)
// 转换为MB
double availableMB = availableBytes / (1024.0 * 1024.0);
sprintf(remainingSpaceTmp, "%.0f", availableMB/1024);
sprintf(remainingSpaceTmp, "%.2f", availableMB/1024);
s_remainingSpace = remainingSpaceTmp;
if (spectralBinInt!=0 && framerate!=0)
{
double frameSize;
if (spectralBinInt==1)
if (spectralBinInt + spatialBinInt==2)
{
frameSize = 0.783;
}
else
else if(spectralBinInt + spatialBinInt==3)
{
frameSize = 0.783/2;
}
else if(spectralBinInt + spatialBinInt==4)
{
frameSize = 0.783/4;
}
double minTemp = availableMB / (frameSize * framerate * 60);
sprintf(remainingTimeTmp, "%.0f", minTemp);
sprintf(remainingTimeTmp, "%.2f", minTemp);
s_remainingTime = remainingTimeTmp;
// 打印结果
@ -374,8 +386,6 @@ static void *DjiTest_WidgetTask(void *arg)
// 关闭文件指针
pclose(fp);
extractSpectralBinAndBandnumber(false);
//判断ximeaAirborneSystem系统是否存活
// if(ximeaAirborneSystemSurvivalTime > 10)
@ -491,6 +501,7 @@ static void *PsdkTest_IrisRecordSystemChanged(void *arg)//
break;
case 3:
s_strStateOfSbg="采集中";
s_widgetValueList[5] = 1;
break;
default:
@ -589,6 +600,7 @@ static void *PsdkTest_IrisRecordSystemChanged(void *arg)//
break;
case 101:
s_strStateOfXimea="连接成功";
s_widgetValueList[9] = 0;
if(s_stateOfXimea == 100)
{
@ -601,12 +613,15 @@ static void *PsdkTest_IrisRecordSystemChanged(void *arg)//
break;
case 102:
s_strStateOfXimea="连接成功";
s_widgetValueList[9] = 0;
break;
case 103:
s_strStateOfXimea="连接成功";
s_widgetValueList[9] = 0;
break;
case 104:
s_strStateOfXimea="采集中";
s_widgetValueList[9] = 1;
break;
default:
@ -874,7 +889,7 @@ static T_DjiReturnCode PsdkTestWidget_SetWidgetValue_StartRecord(E_DjiWidgetType
}
//曝光时间有效性判断
float maxExposureTime = 1 / (float)framerate * 1000;//单位是ms
float maxExposureTime = 1 / (float)framerate * 1000 * 1000;//单位是μs
if(value > maxExposureTime)
{
@ -934,14 +949,17 @@ static T_DjiReturnCode PsdkTestWidget_SetWidgetValue_StartRecord(E_DjiWidgetType
if (value==1)
{
system("sudo sed -i 's/spectralBin =.*/spectralBin = 1;/g' /media/nvme/300TC/config/ximea.cfg");
system("sudo sed -i 's/spatialBin =.*/spatialBin = 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");
system("sudo sed -i 's/spatialBin =.*/spatialBin = 2;/g' /media/nvme/300TC/config/ximea.cfg");
}
closeXimeaRecordSystem();
extractSpectralBinAndBandnumber(true);
extractSpatialBinAndWidth(true);
strcpy(s_strUIMessage,"请等待采集系统重启!");
messageTimeCounter = 0;
@ -972,6 +990,7 @@ static void closeXimeaRecordSystem()
sprintf(XimeaExposeTime,"%s"," ");
sprintf(XimeaExposeMaxValue,"%s"," ");
sprintf(s_spectralBin,"%s"," ");
sprintf(s_spatialBin,"%s"," ");
s_remainingTime=" ";
s_widgetValueList[5] = 0;
@ -1028,6 +1047,7 @@ static void extractSpectralBinAndBandnumber(bool isModifyBin)
}
s_widgetValueList[10] = spectralBin;
spectralBinInt = spectralBin;
if (!isModifyBin)
{
@ -1035,4 +1055,57 @@ static void extractSpectralBinAndBandnumber(bool isModifyBin)
}
}
static void extractSpatialBinAndWidth(bool isModifyBin)
{
unsigned long long spatialBinBin, width;
char buffer[128];
FILE *fp;
fp = popen("grep \"spatialBin = \" /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);
spatialBinBin = strtoull(buffer, NULL, 10);
}
pclose(fp);
if (spatialBinBin == 1)
{
fp = popen("grep \"width\" /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);
width = strtoull(buffer, NULL, 10);
}
pclose(fp);
}
else if(spatialBinBin == 2)
{
fp = popen("grep \"width\" /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);
width = strtoull(buffer, NULL, 10);
}
pclose(fp);
}
s_widgetValueList[11] = spatialBinBin;
spatialBinInt = spatialBinBin;
if (!isModifyBin)
{
sprintf(s_spatialBin,"%d_%d", spatialBinBin, width);
}
}
/****************** (C) COPYRIGHT DJI Innovations *****END OF FILE****/

View File

@ -77,10 +77,10 @@
"item_name": "其他"
},
{
"item_name": "光谱1"
"item_name": "1"
},
{
"item_name": "光谱2"
"item_name": "2"
}
]
}

View File

@ -77,10 +77,10 @@
"item_name": "其他"
},
{
"item_name": "光谱1"
"item_name": "1"
},
{
"item_name": "光谱2"
"item_name": "2"
}
]
}

View File

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