Compare commits
19 Commits
5938550032
...
3.38.44.21
Author | SHA1 | Date | |
---|---|---|---|
b353303431 | |||
a3ea1b8b67 | |||
9bb6969cd7 | |||
1494807973 | |||
9e63686a52 | |||
2f467085f8 | |||
4d872189be | |||
4df18d88dd | |||
80159490e1 | |||
884cd90ac4 | |||
1b12e68f84 | |||
db81ffe5cc | |||
9f76699bc2 | |||
23153193a6 | |||
47153346cd | |||
699112b487 | |||
4343500d70 | |||
b2f2c17b7a | |||
c2559f2bbc |
@ -93,11 +93,11 @@ bool DjiMediaFile_IsSupported(const char *filePath)
|
||||
|
||||
T_DjiReturnCode DjiMediaFile_CreateHandle(const char *filePath, T_DjiMediaFileHandle *pMediaFileHandle)
|
||||
{
|
||||
int optIndex;
|
||||
int optIndex;//这个指数 指明了 filePath中的文件格式 处于数组s_mediaFileOpt中的哪一个元素
|
||||
T_DjiOsalHandler *osalHandler = DjiPlatform_GetOsalHandler();
|
||||
|
||||
for (optIndex = 0; optIndex < s_mediaFileOptCount; optIndex++) {
|
||||
if (s_mediaFileOpt[optIndex].isSupportedFunc(filePath) == true) {
|
||||
if (s_mediaFileOpt[optIndex].isSupportedFunc(filePath) == true) {//查看filePath的格式是否 存在于 所有支持的格式中
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -116,7 +116,7 @@ T_DjiReturnCode DjiMediaFile_CreateHandle(const char *filePath, T_DjiMediaFileHa
|
||||
return DJI_ERROR_SYSTEM_MODULE_CODE_MEMORY_ALLOC_FAILED;
|
||||
}
|
||||
|
||||
(*pMediaFileHandle)->mediaFileOptItem = s_mediaFileOpt[optIndex];
|
||||
(*pMediaFileHandle)->mediaFileOptItem = s_mediaFileOpt[optIndex];//为pMediaFileHandle(媒体文件句柄)添加处理函数
|
||||
(*pMediaFileHandle)->mediaFileThm.privThm = NULL;
|
||||
(*pMediaFileHandle)->mediaFileScr.privScr = NULL;
|
||||
|
||||
|
@ -75,12 +75,12 @@ typedef struct {
|
||||
/* Private variables ---------------------------------------------------------*/
|
||||
static bool s_isCamInited = false;
|
||||
|
||||
static T_DjiCameraCommonHandler s_commonHandler;
|
||||
static T_DjiCameraExposureMeteringHandler s_exposureMeteringHandler;
|
||||
static T_DjiCameraFocusHandler s_focusHandler;
|
||||
static T_DjiCameraDigitalZoomHandler s_digitalZoomHandler;
|
||||
static T_DjiCameraOpticalZoomHandler s_opticalZoomHandler;
|
||||
static T_DjiCameraTapZoomHandler s_tapZoomHandler;
|
||||
static T_DjiCameraCommonHandler s_commonHandler;//注册相机类基础功能
|
||||
static T_DjiCameraExposureMeteringHandler s_exposureMeteringHandler;//用于测光
|
||||
static T_DjiCameraFocusHandler s_focusHandler;//设置对焦
|
||||
static T_DjiCameraDigitalZoomHandler s_digitalZoomHandler;//数字变焦
|
||||
static T_DjiCameraOpticalZoomHandler s_opticalZoomHandler;//光学变焦
|
||||
static T_DjiCameraTapZoomHandler s_tapZoomHandler;//指点变焦功能
|
||||
|
||||
static T_DjiTaskHandle s_userCameraThread;
|
||||
|
||||
@ -96,8 +96,8 @@ static E_DjiCameraMeteringMode s_cameraMeteringMode = DJI_CAMERA_METERING_MODE_C
|
||||
static T_DjiCameraSpotMeteringTarget s_cameraSpotMeteringTarget = {0};
|
||||
|
||||
static E_DjiCameraFocusMode s_cameraFocusMode = DJI_CAMERA_FOCUS_MODE_AUTO;
|
||||
static T_DjiCameraPointInScreen s_cameraFocusTarget = {0};
|
||||
static uint32_t s_cameraFocusRingValue = FOCUS_MID_RINGVALUE;
|
||||
static T_DjiCameraPointInScreen s_cameraFocusTarget = {0};//对焦点
|
||||
static uint32_t s_cameraFocusRingValue = FOCUS_MID_RINGVALUE;//对焦环
|
||||
static T_DjiCameraFocusAssistantSettings s_cameraFocusAssistantSettings = {0};
|
||||
|
||||
static E_DjiCameraZoomDirection s_cameraZoomDirection = DJI_CAMERA_ZOOM_DIRECTION_OUT;
|
||||
@ -119,7 +119,15 @@ 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);
|
||||
static T_DjiReturnCode SetMode(E_DjiCameraMode mode);
|
||||
static T_DjiReturnCode StartRecordVideo(void);
|
||||
@ -135,11 +143,13 @@ static T_DjiReturnCode GetPhotoTimeIntervalSettings(T_DjiCameraPhotoTimeInterval
|
||||
static T_DjiReturnCode GetSDCardState(T_DjiCameraSDCardState *sdCardState);
|
||||
static T_DjiReturnCode FormatSDCard(void);
|
||||
|
||||
//用于s_exposureMeteringHandler中的回调函数:测光
|
||||
static T_DjiReturnCode SetMeteringMode(E_DjiCameraMeteringMode mode);
|
||||
static T_DjiReturnCode GetMeteringMode(E_DjiCameraMeteringMode *mode);
|
||||
static T_DjiReturnCode SetSpotMeteringTarget(T_DjiCameraSpotMeteringTarget target);
|
||||
static T_DjiReturnCode GetSpotMeteringTarget(T_DjiCameraSpotMeteringTarget *target);
|
||||
|
||||
//用于s_focusHandler中的回调函数:设置对焦功能
|
||||
static T_DjiReturnCode SetFocusMode(E_DjiCameraFocusMode mode);
|
||||
static T_DjiReturnCode GetFocusMode(E_DjiCameraFocusMode *mode);
|
||||
static T_DjiReturnCode SetFocusTarget(T_DjiCameraPointInScreen target);
|
||||
@ -150,18 +160,25 @@ static T_DjiReturnCode SetFocusRingValue(uint32_t value);
|
||||
static T_DjiReturnCode GetFocusRingValue(uint32_t *value);
|
||||
static T_DjiReturnCode GetFocusRingValueUpperBound(uint32_t *value);
|
||||
|
||||
//用于s_digitalZoomHandler的回调函数中:数字变焦功能
|
||||
static T_DjiReturnCode SetDigitalZoomFactor(dji_f32_t factor);
|
||||
|
||||
//用于s_opticalZoomHandler的回调函数中:光学变焦功能
|
||||
static T_DjiReturnCode SetOpticalZoomFocalLength(uint32_t focalLength);
|
||||
static T_DjiReturnCode GetOpticalZoomFocalLength(uint32_t *focalLength);
|
||||
static T_DjiReturnCode GetOpticalZoomSpec(T_DjiCameraOpticalZoomSpec *spec);
|
||||
static T_DjiReturnCode StartContinuousOpticalZoom(E_DjiCameraZoomDirection direction, E_DjiCameraZoomSpeed speed);
|
||||
static T_DjiReturnCode StopContinuousOpticalZoom(void);
|
||||
|
||||
//用于s_tapZoomHandler中的回调函数:指点变焦功能
|
||||
static T_DjiReturnCode GetTapZoomState(T_DjiCameraTapZoomState *state);
|
||||
static T_DjiReturnCode SetTapZoomEnabled(bool enabledFlag);
|
||||
static T_DjiReturnCode GetTapZoomEnabled(bool *enabledFlag);
|
||||
static T_DjiReturnCode SetTapZoomMultiplier(uint8_t multiplier);
|
||||
static T_DjiReturnCode GetTapZoomMultiplier(uint8_t *multiplier);
|
||||
static T_DjiReturnCode TapZoomAtTarget(T_DjiCameraPointInScreen target);
|
||||
|
||||
//
|
||||
static T_DjiReturnCode DjiTest_CameraHybridZoom(uint32_t focalLength);
|
||||
static T_DjiReturnCode DjiTest_CameraRotationGimbal(T_TestCameraGimbalRotationArgument gimbalRotationArgument);
|
||||
|
||||
@ -577,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;
|
||||
}
|
||||
|
||||
@ -826,6 +846,7 @@ static T_DjiReturnCode TapZoomAtTarget(T_DjiCameraPointInScreen target)
|
||||
return DJI_ERROR_SYSTEM_MODULE_CODE_NONSUPPORT_IN_CURRENT_STATE;
|
||||
}
|
||||
|
||||
//设置云台相机指点变焦的模式
|
||||
rotationMode = DJI_GIMBAL_ROTATION_MODE_RELATIVE_ANGLE;
|
||||
rotationProperty.relativeAngleRotation.actionTime = TAP_ZOOM_DURATION / 10;
|
||||
|
||||
@ -938,8 +959,8 @@ static T_DjiReturnCode DjiTest_CameraRotationGimbal(T_TestCameraGimbalRotationAr
|
||||
|
||||
static void *UserCamera_Task(void *arg)
|
||||
{
|
||||
static uint32_t photoCnt = 0;
|
||||
static uint32_t step = 0;
|
||||
static uint32_t photoCnt = 0;//????????
|
||||
static uint32_t step = 0;//控制任务的执行时间间隔
|
||||
T_DjiReturnCode returnCode;
|
||||
int32_t tempFocalLength = 0;
|
||||
dji_f32_t tempDigitalFactor = 0.0f;
|
||||
@ -950,7 +971,7 @@ static void *UserCamera_Task(void *arg)
|
||||
USER_UTIL_UNUSED(arg);
|
||||
|
||||
while (1) {
|
||||
osalHandler->TaskSleepMs(1000 / PAYLOAD_CAMERA_EMU_TASK_FREQ);
|
||||
osalHandler->TaskSleepMs(1000 / PAYLOAD_CAMERA_EMU_TASK_FREQ);//睡眠10ms
|
||||
step++;
|
||||
|
||||
returnCode = osalHandler->MutexLock(s_commonMutex);
|
||||
@ -964,11 +985,13 @@ static void *UserCamera_Task(void *arg)
|
||||
s_cameraSDCardState.availableCaptureCount = s_cameraSDCardState.remainSpaceInMB / SDCARD_PER_PHOTO_SPACE_IN_MB;
|
||||
|
||||
//realize your photo shoot and storage logic here
|
||||
//1. 确认拍照状态:使用PSDK 开发的相机类负载设备在执行完拍照动作后,需要获取负载设备的拍照状态。
|
||||
if (s_cameraState.shootingState != DJI_CAMERA_SHOOTING_PHOTO_IDLE &&
|
||||
photoCnt++ > TAKING_PHOTO_SPENT_TIME_MS_EMU / (1000 / PAYLOAD_CAMERA_EMU_TASK_FREQ)) {
|
||||
photoCnt = 0;
|
||||
|
||||
//store the photo after shooting finished
|
||||
//2. 存储照片:相机类负载设备在执行完拍照后,使用PSDK 开发的相机类负载设备将相机拍摄的照片存储在相机类负载设备上的内存卡中。
|
||||
if (s_cameraShootPhotoMode == DJI_CAMERA_SHOOT_PHOTO_MODE_SINGLE) {
|
||||
s_cameraSDCardState.remainSpaceInMB =
|
||||
s_cameraSDCardState.remainSpaceInMB - SDCARD_PER_PHOTO_SPACE_IN_MB;
|
||||
@ -989,6 +1012,7 @@ static void *UserCamera_Task(void *arg)
|
||||
}
|
||||
|
||||
//check the remain space of sdcard
|
||||
//3. 检查存储空间:
|
||||
if (s_cameraSDCardState.remainSpaceInMB > SDCARD_TOTAL_SPACE_IN_MB) {
|
||||
s_cameraSDCardState.remainSpaceInMB = 0;
|
||||
s_cameraSDCardState.isFull = true;
|
||||
@ -1025,6 +1049,8 @@ static void *UserCamera_Task(void *arg)
|
||||
}
|
||||
|
||||
// 10Hz
|
||||
// ! step%10:相当于10毫秒执行一次,tc → Add logic here for zoom camera
|
||||
//没看关于这个if
|
||||
if (USER_UTIL_IS_WORK_TURN(step, 10, PAYLOAD_CAMERA_EMU_TASK_FREQ)) {
|
||||
returnCode = osalHandler->MutexLock(s_zoomMutex);
|
||||
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
|
||||
@ -1146,6 +1172,7 @@ out:
|
||||
continue;
|
||||
}
|
||||
|
||||
// 预估可拍照张数和可录像时长的功能。
|
||||
if (s_cameraState.isRecording) {
|
||||
s_cameraState.currentVideoRecordingTimeInSeconds++;
|
||||
s_cameraSDCardState.remainSpaceInMB =
|
||||
@ -1250,27 +1277,29 @@ T_DjiReturnCode DjiTest_CameraEmuBaseStartService(void)
|
||||
SDCARD_TOTAL_SPACE_IN_MB / SDCARD_PER_SECONDS_RECORD_SPACE_IN_MB;
|
||||
|
||||
/* Register the camera common handler */
|
||||
//注册相机类基础功能,(1)SetMode:设置相机工作模式(照片/视频/回放);(2)如果是photo模式,使用SetShootPhotoMode设置照片拍照模式;(3)StartShootPhoto开始拍摄照片
|
||||
s_commonHandler.GetSystemState = GetSystemState;
|
||||
s_commonHandler.SetMode = SetMode;
|
||||
s_commonHandler.SetMode = SetMode;//设置相机模式:照片/视频/回放
|
||||
s_commonHandler.GetMode = DjiTest_CameraGetMode;
|
||||
s_commonHandler.StartRecordVideo = StartRecordVideo;
|
||||
s_commonHandler.StartRecordVideo = StartRecordVideo;//控制相机录像:s_cameraState.isRecording = true;
|
||||
s_commonHandler.StopRecordVideo = StopRecordVideo;
|
||||
s_commonHandler.StartShootPhoto = StartShootPhoto;
|
||||
s_commonHandler.StartShootPhoto = StartShootPhoto;//控制相机拍摄照片:单拍/连拍/等时间间隔;只是改变了s_cameraState的状态
|
||||
s_commonHandler.StopShootPhoto = StopShootPhoto;
|
||||
s_commonHandler.SetShootPhotoMode = SetShootPhotoMode;
|
||||
s_commonHandler.GetShootPhotoMode = GetShootPhotoMode;
|
||||
s_commonHandler.SetPhotoBurstCount = SetPhotoBurstCount;
|
||||
s_commonHandler.GetPhotoBurstCount = GetPhotoBurstCount;
|
||||
s_commonHandler.SetPhotoTimeIntervalSettings = SetPhotoTimeIntervalSettings;
|
||||
s_commonHandler.GetPhotoTimeIntervalSettings = GetPhotoTimeIntervalSettings;
|
||||
s_commonHandler.GetSDCardState = GetSDCardState;
|
||||
s_commonHandler.FormatSDCard = FormatSDCard;
|
||||
s_commonHandler.SetShootPhotoMode = SetShootPhotoMode;//写入变量s_cameraShootPhotoMode,设置相机类负载的拍照模式:单拍/连拍/等时间间隔
|
||||
s_commonHandler.GetShootPhotoMode = GetShootPhotoMode;//读取变量s_cameraShootPhotoMode
|
||||
s_commonHandler.SetPhotoBurstCount = SetPhotoBurstCount;//控制相机连拍,写入变量s_cameraBurstCount
|
||||
s_commonHandler.GetPhotoBurstCount = GetPhotoBurstCount;// 读取变量s_cameraBurstCount
|
||||
s_commonHandler.SetPhotoTimeIntervalSettings = SetPhotoTimeIntervalSettings;//控制相机定时拍照,变量s_cameraPhotoTimeIntervalSettings有啥用,
|
||||
s_commonHandler.GetPhotoTimeIntervalSettings = GetPhotoTimeIntervalSettings;// 读取变量s_cameraPhotoTimeIntervalSettings
|
||||
s_commonHandler.GetSDCardState = GetSDCardState;//获取SD 卡的当前状态
|
||||
s_commonHandler.FormatSDCard = FormatSDCard;//SD卡格式化
|
||||
|
||||
returnCode = DjiPayloadCamera_RegCommonHandler(&s_commonHandler);
|
||||
returnCode = DjiPayloadCamera_RegCommonHandler(&s_commonHandler);//注册相机类基础功能
|
||||
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
|
||||
USER_LOG_ERROR("camera register common handler error:0x%08llX", returnCode);
|
||||
}
|
||||
|
||||
//注册相机测光功能
|
||||
/* Register the camera metering handler */
|
||||
#if USER_CAMERA_EMU_METERING_ON
|
||||
s_exposureMeteringHandler.SetMeteringMode = SetMeteringMode;
|
||||
@ -1285,15 +1314,16 @@ T_DjiReturnCode DjiTest_CameraEmuBaseStartService(void)
|
||||
}
|
||||
#endif
|
||||
|
||||
//注册相机设置对焦功能
|
||||
/* Register the camera focus handler */
|
||||
#if USER_CAMERA_EMU_FOCUS_ON
|
||||
s_focusHandler.SetFocusMode = SetFocusMode;
|
||||
s_focusHandler.GetFocusMode = GetFocusMode;
|
||||
s_focusHandler.SetFocusTarget = SetFocusTarget;
|
||||
s_focusHandler.SetFocusTarget = SetFocusTarget;//设置对焦点
|
||||
s_focusHandler.GetFocusTarget = GetFocusTarget;
|
||||
s_focusHandler.SetFocusAssistantSettings = SetFocusAssistantSettings;
|
||||
s_focusHandler.GetFocusAssistantSettings = GetFocusAssistantSettings;
|
||||
s_focusHandler.SetFocusRingValue = SetFocusRingValue;
|
||||
s_focusHandler.SetFocusRingValue = SetFocusRingValue;//设置对焦环
|
||||
s_focusHandler.GetFocusRingValue = GetFocusRingValue;
|
||||
s_focusHandler.GetFocusRingValueUpperBound = GetFocusRingValueUpperBound;
|
||||
|
||||
@ -1304,9 +1334,10 @@ T_DjiReturnCode DjiTest_CameraEmuBaseStartService(void)
|
||||
}
|
||||
#endif
|
||||
|
||||
//注册相机数字变焦功能
|
||||
/* Register the camera digital zoom handler */
|
||||
#if USER_CAMERA_EMU_HYBRID_ZOOM_ON
|
||||
s_digitalZoomHandler.SetDigitalZoomFactor = SetDigitalZoomFactor;
|
||||
s_digitalZoomHandler.SetDigitalZoomFactor = SetDigitalZoomFactor;//设置数字变焦因子
|
||||
s_digitalZoomHandler.GetDigitalZoomFactor = DjiTest_CameraGetDigitalZoomFactor;
|
||||
|
||||
returnCode = DjiPayloadCamera_RegDigitalZoomHandler(&s_digitalZoomHandler);
|
||||
@ -1315,12 +1346,13 @@ T_DjiReturnCode DjiTest_CameraEmuBaseStartService(void)
|
||||
return returnCode;
|
||||
}
|
||||
|
||||
//注册相机光学变焦功能
|
||||
/* Register the camera optical zoom handler */
|
||||
s_opticalZoomHandler.SetOpticalZoomFocalLength = SetOpticalZoomFocalLength;
|
||||
s_opticalZoomHandler.SetOpticalZoomFocalLength = SetOpticalZoomFocalLength;//设置光学变焦相机的焦距
|
||||
s_opticalZoomHandler.GetOpticalZoomFocalLength = GetOpticalZoomFocalLength;
|
||||
s_opticalZoomHandler.GetOpticalZoomFactor = DjiTest_CameraGetOpticalZoomFactor;
|
||||
s_opticalZoomHandler.GetOpticalZoomSpec = GetOpticalZoomSpec;
|
||||
s_opticalZoomHandler.StartContinuousOpticalZoom = StartContinuousOpticalZoom;
|
||||
s_opticalZoomHandler.GetOpticalZoomFactor = DjiTest_CameraGetOpticalZoomFactor;//获取相机类负载设备的变焦系数
|
||||
s_opticalZoomHandler.GetOpticalZoomSpec = GetOpticalZoomSpec;//获取光学变焦的范围
|
||||
s_opticalZoomHandler.StartContinuousOpticalZoom = StartContinuousOpticalZoom;//控制相机类负载设备开始变焦
|
||||
s_opticalZoomHandler.StopContinuousOpticalZoom = StopContinuousOpticalZoom;
|
||||
|
||||
returnCode = DjiPayloadCamera_RegOpticalZoomHandler(&s_opticalZoomHandler);
|
||||
@ -1330,6 +1362,7 @@ T_DjiReturnCode DjiTest_CameraEmuBaseStartService(void)
|
||||
}
|
||||
#endif
|
||||
|
||||
//注册指点变焦功能
|
||||
/* Register the camera tap zoom handler */
|
||||
#if USER_CAMERA_EMU_TAP_ZOOM_ON
|
||||
s_tapZoomHandler.GetTapZoomState = GetTapZoomState;
|
||||
@ -1376,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;
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -46,7 +46,7 @@ static T_DjiReturnCode ReceiveDataFromOnboardComputer(const uint8_t *data, uint1
|
||||
static T_DjiReturnCode ReceiveDataFromPayload(const uint8_t *data, uint16_t len);
|
||||
|
||||
/* Private variables ---------------------------------------------------------*/
|
||||
static T_DjiTaskHandle s_userDataTransmissionThread;
|
||||
static T_DjiTaskHandle s_userDataTransmissionThread;//线程句柄
|
||||
static T_DjiAircraftInfoBaseInfo s_aircraftInfoBaseInfo;
|
||||
|
||||
/* Exported functions definition ---------------------------------------------*/
|
||||
@ -72,6 +72,7 @@ T_DjiReturnCode DjiTest_DataTransmissionStartService(void)
|
||||
return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR;
|
||||
}
|
||||
|
||||
//函数ReceiveDataFromMobile能够获取用户在DJI Pilot "文本输入框控件" 中向负载设备发送的信息(编码格式为UTF-8)。
|
||||
channelAddress = DJI_CHANNEL_ADDRESS_MASTER_RC_APP;
|
||||
djiStat = DjiLowSpeedDataChannel_RegRecvDataCallback(channelAddress, ReceiveDataFromMobile);
|
||||
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
|
||||
@ -113,6 +114,7 @@ T_DjiReturnCode DjiTest_DataTransmissionStartService(void)
|
||||
return DJI_ERROR_SYSTEM_MODULE_CODE_NONSUPPORT;
|
||||
}
|
||||
|
||||
//调用osal层中注册的创建任务的函数来 创建一个任务(在新线程中运行)
|
||||
if (osalHandler->TaskCreate("user_transmission_task", UserDataTransmission_Task,
|
||||
DATA_TRANSMISSION_TASK_STACK_SIZE, NULL, &s_userDataTransmissionThread) !=
|
||||
DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
|
||||
|
@ -349,10 +349,10 @@ static void *UserFcSubscription_Task(void *arg)
|
||||
USER_LOG_DEBUG("gps TIME: %d.", gpsTime);
|
||||
}//PsdkLogger_UserLogInfo
|
||||
|
||||
if(counter>1 &&counter<10 && isGetGpsDate_time)//避免dji的bug:第一次获取的gpsDate和gpsTime都为0
|
||||
if(counter>1 &&counter<3 && isGetGpsDate_time)//避免dji的bug:第一次获取的gpsDate和gpsTime都为0
|
||||
{
|
||||
printf("开始设置时间\n");
|
||||
system('date');
|
||||
system("date");
|
||||
|
||||
char *gpsDate_str = (char *)malloc(sizeof(char)*50);
|
||||
char *gpsTime_str = (char *)malloc(sizeof(char)*20);
|
||||
@ -423,6 +423,8 @@ 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++;
|
||||
|
||||
|
@ -33,9 +33,12 @@
|
||||
/* Private types -------------------------------------------------------------*/
|
||||
|
||||
/* Private functions declaration ---------------------------------------------*/
|
||||
//需要自己写的函数:功能是负载设备关机前需要执行的命令
|
||||
//https://developer.dji.com/doc/payload-sdk-tutorial/cn/function-set/basic-function/power-management.html
|
||||
static T_DjiReturnCode DjiTest_PowerOffNotificationCallback(bool *powerOffPreparationFlag);
|
||||
|
||||
/* Private variables ---------------------------------------------------------*/
|
||||
//此变量是函数DjiTest_RegApplyHighPowerHandler先判断然后内存拷贝过来的
|
||||
static T_DjiTestApplyHighPowerHandler s_applyHighPowerHandler;
|
||||
|
||||
/* Exported functions definition ---------------------------------------------*/
|
||||
@ -48,6 +51,9 @@ static T_DjiTestApplyHighPowerHandler s_applyHighPowerHandler;
|
||||
*/
|
||||
T_DjiReturnCode DjiTest_RegApplyHighPowerHandler(T_DjiTestApplyHighPowerHandler *applyHighPowerHandler)
|
||||
{
|
||||
//此函数的功能:验证这两个函数指针指向的函数是否可用 → 结构体T_PsdkTestApplyHighPowerHandler中有两个函数指针,分别为pinInit和pinWrite
|
||||
|
||||
//1、先判断两个函数指针是否为空,如果为空就报错
|
||||
if (applyHighPowerHandler->pinInit == NULL) {
|
||||
USER_LOG_ERROR("reg apply high power handler pinInit error");
|
||||
return DJI_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
|
||||
@ -58,6 +64,7 @@ T_DjiReturnCode DjiTest_RegApplyHighPowerHandler(T_DjiTestApplyHighPowerHandler
|
||||
return DJI_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
//2、如果不为空就内存拷贝到本文件的静态变量中
|
||||
memcpy(&s_applyHighPowerHandler, applyHighPowerHandler, sizeof(T_DjiTestApplyHighPowerHandler));
|
||||
|
||||
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
|
||||
@ -72,6 +79,10 @@ T_DjiReturnCode DjiTest_RegApplyHighPowerHandler(T_DjiTestApplyHighPowerHandler
|
||||
*/
|
||||
T_DjiReturnCode DjiTest_PowerManagementStartService(void)
|
||||
{
|
||||
//此函数的功能:
|
||||
//1、申请高功率。如果要申请高功率,需要在执行本函数前,先执行DjiTest_RegApplyHighPowerHandler函数
|
||||
//2、负载设备关机前需要执行的操作
|
||||
|
||||
T_DjiReturnCode returnCode;
|
||||
T_DjiAircraftInfoBaseInfo baseInfo = {0};
|
||||
|
||||
@ -92,6 +103,7 @@ T_DjiReturnCode DjiTest_PowerManagementStartService(void)
|
||||
(baseInfo.djiAdapterType == DJI_SDK_ADAPTER_TYPE_SKYPORT_V2 ||
|
||||
baseInfo.djiAdapterType == DJI_SDK_ADAPTER_TYPE_XPORT)) {
|
||||
// apply high power
|
||||
//如果函数指针为空(没有指向函数),就返回错误代码:DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN
|
||||
if (s_applyHighPowerHandler.pinInit == NULL) {
|
||||
USER_LOG_ERROR("apply high power pin init interface is NULL error");
|
||||
return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
|
||||
@ -102,18 +114,21 @@ T_DjiReturnCode DjiTest_PowerManagementStartService(void)
|
||||
return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
|
||||
}
|
||||
|
||||
//如果函数指针不为空(指向了一个函数),就执行函数,并根据返回值判断是否成功
|
||||
returnCode = s_applyHighPowerHandler.pinInit();
|
||||
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
|
||||
USER_LOG_ERROR("apply high power pin init error");
|
||||
return returnCode;
|
||||
}
|
||||
|
||||
//注册高电压返回函数
|
||||
returnCode = DjiPowerManagement_RegWriteHighPowerApplyPinCallback(s_applyHighPowerHandler.pinWrite);
|
||||
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
|
||||
USER_LOG_ERROR("register WriteHighPowerApplyPinCallback error.");
|
||||
return returnCode;
|
||||
}
|
||||
|
||||
//执行高电压请求
|
||||
returnCode = DjiPowerManagement_ApplyHighPowerSync();
|
||||
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
|
||||
USER_LOG_ERROR("apply high power error");
|
||||
@ -122,6 +137,7 @@ T_DjiReturnCode DjiTest_PowerManagementStartService(void)
|
||||
}
|
||||
|
||||
// register power off notification callback function
|
||||
//负载设备关机前需要执行的操作
|
||||
returnCode = DjiPowerManagement_RegPowerOffNotificationCallback(DjiTest_PowerOffNotificationCallback);
|
||||
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
|
||||
USER_LOG_ERROR("register power off notification callback function error");
|
||||
@ -145,6 +161,7 @@ T_DjiReturnCode DjiTest_PowerManagementStopService(void)
|
||||
}
|
||||
|
||||
/* Private functions definition-----------------------------------------------*/
|
||||
//详细说明见函数申明处
|
||||
static T_DjiReturnCode DjiTest_PowerOffNotificationCallback(bool *powerOffPreparationFlag)
|
||||
{
|
||||
USER_LOG_INFO("aircraft will power off soon.");
|
||||
|
@ -30,6 +30,9 @@
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
#include "dji_typedef.h"
|
||||
#include "dji_power_management.h"
|
||||
#include <wiringPi.h>
|
||||
|
||||
#define HIGH_POWER_APPLY_PIN 11
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
@ -39,6 +42,8 @@ extern "C" {
|
||||
|
||||
|
||||
/* Exported types ------------------------------------------------------------*/
|
||||
//里面的两个函数指针例子见下方网页中:PsdkTest_HighPowerApplyPinInit + PsdkTest_WriteHighPowerApplyPin
|
||||
//https://developer.dji.com/doc/payload-sdk-tutorial/cn/function-set/basic-function/power-management.html
|
||||
typedef struct {
|
||||
T_DjiReturnCode (*pinInit)(void);
|
||||
T_DjiReturnCode (*pinWrite)(E_DjiPowerManagementPinState pinState);
|
||||
|
@ -44,7 +44,7 @@ T_DjiRunTimeStamps DjiUtilTime_GetRunTimeStamps(void)
|
||||
struct rusage rusage;
|
||||
struct timespec ts;
|
||||
|
||||
clock_gettime(CLOCK_MONOTONIC, &ts);
|
||||
clock_gettime(CLOCK_MONOTONIC, &ts);//系统的启动时间,不能被设置:https://blog.csdn.net/liu44235/article/details/37692635
|
||||
timeStamps.realUsec = (uint64_t) ts.tv_sec * 1000000 + ts.tv_nsec / 1000;
|
||||
|
||||
getrusage(RUSAGE_SELF, &rusage);
|
||||
|
@ -53,6 +53,9 @@ static T_DjiReturnCode PsdkTestWidget_SetWidgetValue_StartRecord(E_DjiWidgetType
|
||||
void *userData);
|
||||
|
||||
static void *PsdkTest_IrisRecordSystemChanged(void *arg);
|
||||
static void extractSpectralBinAndBandnumber(bool isModifyBin);
|
||||
static void extractSpatialBinAndWidth(bool isModifyBin);
|
||||
static void closeXimeaRecordSystem();
|
||||
|
||||
/* Private values ------------------------------------------------------------*/
|
||||
static T_DjiTaskHandle s_widgetTestThread;
|
||||
@ -73,23 +76,36 @@ static int s_stateOfSbg=0;
|
||||
static int s_stateOfFile=0;
|
||||
|
||||
//0:ximeaAirborneSystem系统未就绪,不可启动;1:ximeaAirborneSystem系统就绪,可以启动;
|
||||
//2:ximeaAirborneSystem系统正在启动;3:ximeaAirborneSystem系统启动成功;4:系统已经关闭,并且不能再次启动;
|
||||
//2:ximeaAirborneSystem系统正在启动;3:ximeaAirborneSystem系统启动成功;4:系统已经关闭;
|
||||
int systemON_Control = 0;
|
||||
|
||||
char s_strUIMessage[100]=" ";
|
||||
static char * s_strStateOfSbg="None";
|
||||
static char * s_strSbgSatelliteCounter="None";
|
||||
static char * s_strSbgAccuracy="None";
|
||||
static char * s_strStateOfSbg=" ";
|
||||
char s_strSbgSatelliteCounter[100]=" ";
|
||||
char s_strSbgAccuracy[100]=" ";
|
||||
char XimeaFramerate[100]=" ";
|
||||
int framerate = 0;
|
||||
char XimeaExposeTime[100]=" ";
|
||||
int exposeTimeInt = 0;
|
||||
char XimeaExposeMaxValue[100]=" ";
|
||||
char spectralBin[100]="None";
|
||||
static char * s_strSbgSolutionMode="None";
|
||||
static char * s_strStateOfXimea="None";
|
||||
char s_spectralBin[100]=" ";
|
||||
char s_spatialBin[100]=" ";
|
||||
int spectralBinInt = 0;
|
||||
int spatialBinInt = 0;
|
||||
static char * s_strSbgSolutionMode=" ";
|
||||
static char * s_strStateOfXimea=" ";
|
||||
|
||||
char * s_strPitch="None";
|
||||
char * s_strRoll="None";
|
||||
char * s_strYaw="None";
|
||||
char * s_strPitch=" ";
|
||||
char * s_strRoll=" ";
|
||||
char * s_strYaw=" ";
|
||||
|
||||
char * s_remainingTime=" ";
|
||||
char * remainingTimeTmp[10];
|
||||
char * s_remainingSpace=" ";
|
||||
char * remainingSpaceTmp[10];
|
||||
|
||||
char jsonPathCn[WIDGET_DIR_PATH_LEN_MAX];
|
||||
char jsonPathEn[WIDGET_DIR_PATH_LEN_MAX];
|
||||
|
||||
static int s_sockfd;
|
||||
static struct sockaddr_in s_server;
|
||||
@ -100,14 +116,13 @@ static const T_DjiWidgetHandlerListItem s_widgetHandlerList[] = {
|
||||
{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},
|
||||
{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
|
||||
{11, DJI_WIDGET_TYPE_LIST, PsdkTestWidget_SetWidgetValue_StartRecord, DjiTestWidget_GetWidgetValue, NULL},
|
||||
};
|
||||
|
||||
static const char *s_widgetTypeNameArray[] = {
|
||||
@ -152,6 +167,7 @@ T_DjiReturnCode DjiTest_WidgetStartService(void)
|
||||
snprintf(tempPath, WIDGET_DIR_PATH_LEN_MAX, "%swidget_file/en_big_screen", s_widgetFileDirPath);
|
||||
} else {
|
||||
snprintf(tempPath, WIDGET_DIR_PATH_LEN_MAX, "%swidget_file/en_big_screen", curFileDirPath);
|
||||
snprintf(jsonPathEn, WIDGET_DIR_PATH_LEN_MAX, "%swidget_file/en_big_screen/widget_config.json", curFileDirPath);
|
||||
}
|
||||
|
||||
//set default ui config path
|
||||
@ -176,6 +192,7 @@ T_DjiReturnCode DjiTest_WidgetStartService(void)
|
||||
snprintf(tempPath, WIDGET_DIR_PATH_LEN_MAX, "%swidget_file/cn_big_screen", s_widgetFileDirPath);
|
||||
} else {
|
||||
snprintf(tempPath, WIDGET_DIR_PATH_LEN_MAX, "%swidget_file/cn_big_screen", curFileDirPath);
|
||||
snprintf(jsonPathCn, WIDGET_DIR_PATH_LEN_MAX, "%swidget_file/cn_big_screen/widget_config.json", curFileDirPath);
|
||||
}
|
||||
|
||||
djiStat = DjiWidget_RegUiConfigByDirPath(DJI_MOBILE_APP_LANGUAGE_CHINESE,
|
||||
@ -213,10 +230,9 @@ T_DjiReturnCode DjiTest_WidgetStartService(void)
|
||||
return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
|
||||
}
|
||||
|
||||
|
||||
//Step 5 : Run ximea task
|
||||
if (osalHandler->TaskCreate("ximea", PsdkTest_IrisRecordSystemChanged, WIDGET_TASK_STACK_SIZE, NULL,
|
||||
&s_widgetXimeaThread) != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
|
||||
&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;
|
||||
}
|
||||
@ -232,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;
|
||||
@ -275,15 +293,23 @@ static void *DjiTest_WidgetTask(void *arg)
|
||||
|
||||
USER_UTIL_UNUSED(arg);
|
||||
|
||||
while (1) {
|
||||
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_strUIMessage, s_strStateOfXimea, s_strStateOfSbg, s_strSbgSatelliteCounter, s_strSbgAccuracy, XimeaFramerate, XimeaExposeTime, XimeaExposeMaxValue, s_strPitch, s_strRoll, s_strYaw, spectralBin);
|
||||
snprintf(message, DJI_WIDGET_FLOATING_WINDOW_MSG_MAX_LEN, "%s\n高光谱: %s 惯导: %s\n卫星: %s 惯导状态: %s\n帧率: %s 曝光: %s μ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,
|
||||
@ -306,6 +332,61 @@ static void *DjiTest_WidgetTask(void *arg)
|
||||
strcpy(s_strUIMessage," ");
|
||||
}
|
||||
|
||||
extractSpectralBinAndBandnumber(false);
|
||||
extractSpatialBinAndWidth(false);
|
||||
|
||||
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, "%.2f", availableMB/1024);
|
||||
s_remainingSpace = remainingSpaceTmp;
|
||||
|
||||
if (spectralBinInt!=0 && framerate!=0)
|
||||
{
|
||||
double frameSize;
|
||||
if (spectralBinInt + spatialBinInt==2)
|
||||
{
|
||||
frameSize = 0.783;
|
||||
}
|
||||
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, "%.2f", minTemp);
|
||||
s_remainingTime = remainingTimeTmp;
|
||||
|
||||
// 打印结果
|
||||
// printf("Available space: %.2f MB;\n", availableMB);
|
||||
// printf("remainint time of record:%.2f;\n", temp);
|
||||
}
|
||||
}
|
||||
|
||||
// 关闭文件指针
|
||||
pclose(fp);
|
||||
|
||||
|
||||
//判断ximeaAirborneSystem系统是否存活
|
||||
// if(ximeaAirborneSystemSurvivalTime > 10)
|
||||
// {
|
||||
@ -381,14 +462,18 @@ static void *PsdkTest_IrisRecordSystemChanged(void *arg)//
|
||||
//printf("You got a message (%s%) from client.\nIt's ip is%s, port is %d.\n",buf,inet_ntoa(client.sin_addr),htons(client.sin_port));
|
||||
|
||||
|
||||
char * result[3];
|
||||
char * result[5];
|
||||
result[0] = strtok( buf, "," );
|
||||
result[1] = strtok( NULL, "," );
|
||||
result[2] = strtok( NULL, "," );
|
||||
result[3] = strtok( NULL, "," );
|
||||
result[4] = strtok( NULL, "," );
|
||||
|
||||
// printf("result[0]: %s\n", result[0]);
|
||||
// printf("result[1]: %s\n\n", result[1]);
|
||||
// printf("result[2]: %s\n\n", result[2]);
|
||||
printf("result[0]: %s\n", result[0]);
|
||||
printf("result[1]: %s\n\n", result[1]);
|
||||
printf("result[2]: %s\n\n", result[2]);
|
||||
printf("result[3]: %s\n\n", result[3]);
|
||||
printf("result[4]: %s\n\n", result[4]);
|
||||
|
||||
|
||||
if (strcmp(result[0],"sbg") == 0)
|
||||
@ -401,21 +486,11 @@ static void *PsdkTest_IrisRecordSystemChanged(void *arg)//
|
||||
case 0:
|
||||
s_strStateOfSbg="未打开";
|
||||
|
||||
if (systemON_Control == 0)
|
||||
{
|
||||
strcpy(s_strUIMessage,"系统已就绪!");
|
||||
messageTimeCounter = 0;
|
||||
messageTimespan = 1000;
|
||||
strcpy(s_strUIMessage,"系统已就绪!");
|
||||
messageTimeCounter = 0;
|
||||
messageTimespan = 1000;
|
||||
|
||||
systemON_Control = 1;//ximeaAirborneSystem系统一启动就会发送此信息 → 代表采集系统就绪;
|
||||
}
|
||||
|
||||
if (systemON_Control == 3)
|
||||
{
|
||||
strcpy(s_strUIMessage,"数据量过大,采集系统已经停止,请重新上电!");
|
||||
messageTimeCounter = 0;
|
||||
messageTimespan = 1000;
|
||||
}
|
||||
systemON_Control = 1;//ximeaAirborneSystem系统一启动就会发送此信息 → 代表采集系统就绪;
|
||||
|
||||
break;
|
||||
case 1:
|
||||
@ -426,7 +501,7 @@ static void *PsdkTest_IrisRecordSystemChanged(void *arg)//
|
||||
break;
|
||||
case 3:
|
||||
s_strStateOfSbg="采集中";
|
||||
systemON_Control = 3;
|
||||
s_widgetValueList[5] = 1;
|
||||
break;
|
||||
|
||||
default:
|
||||
@ -436,9 +511,10 @@ static void *PsdkTest_IrisRecordSystemChanged(void *arg)//
|
||||
else if (strcmp(result[0],"Accuracy") == 0)
|
||||
{
|
||||
// printf("惯导定位精度为: %s\n\n", result[1]);
|
||||
// printf("卫星数为: %s\n\n", result[2]);
|
||||
|
||||
s_strSbgAccuracy=result[1];
|
||||
s_strSbgSatelliteCounter=result[2];
|
||||
strcpy(s_strSbgAccuracy,result[1]);
|
||||
strcpy(s_strSbgSatelliteCounter,result[2]);
|
||||
|
||||
ximeaAirborneSystemSurvivalTime++;
|
||||
|
||||
@ -460,36 +536,36 @@ static void *PsdkTest_IrisRecordSystemChanged(void *arg)//
|
||||
}
|
||||
else if (strcmp(result[0],"SolutionMode") == 0)
|
||||
{
|
||||
// s_sbgMagState = atoi(result[1]);
|
||||
//
|
||||
// switch (s_sbgMagState)
|
||||
// {
|
||||
// case 0:
|
||||
// s_strSbgSolutionMode="UNINITIALIZED";
|
||||
// break;
|
||||
// case 1:
|
||||
// s_strSbgSolutionMode="VERTICAL_GYRO";
|
||||
// break;
|
||||
// case 2:
|
||||
// s_strSbgSolutionMode="AHRS";
|
||||
// break;
|
||||
// case 3:
|
||||
// s_strSbgSolutionMode="NAV_VELOCITY";
|
||||
// break;
|
||||
// case 4:
|
||||
// s_strSbgSolutionMode="NAV_POSITION";
|
||||
// break;
|
||||
//
|
||||
// default:
|
||||
// break;
|
||||
// }
|
||||
s_sbgMagState = atoi(result[1]);
|
||||
|
||||
switch (s_sbgMagState)
|
||||
{
|
||||
case 0:
|
||||
s_strSbgSolutionMode="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:正在采集;
|
||||
switch (s_stateOfXimea)//0-61:ximea官方错误代码;99:发生的ximea官方错误代码,没有处理;100:未打开;101:打开;102:设置帧率;103:自动曝光;104:采集中;
|
||||
{
|
||||
case 10:
|
||||
s_strStateOfXimea="10";
|
||||
@ -520,24 +596,32 @@ static void *PsdkTest_IrisRecordSystemChanged(void *arg)//
|
||||
messageTimespan = 200;
|
||||
break;
|
||||
case 100:
|
||||
s_strStateOfXimea="未打开";
|
||||
s_strStateOfXimea="未连接";
|
||||
break;
|
||||
case 101:
|
||||
s_strStateOfXimea="打开成功";
|
||||
s_strStateOfXimea="连接成功";
|
||||
s_widgetValueList[9] = 0;
|
||||
|
||||
strcpy(s_strUIMessage,"系统启动成功!");
|
||||
messageTimeCounter = 0;
|
||||
messageTimespan = 20;
|
||||
if(s_stateOfXimea == 100)
|
||||
{
|
||||
strcpy(s_strUIMessage,"系统启动成功!");
|
||||
messageTimeCounter = 0;
|
||||
messageTimespan = 20;
|
||||
}
|
||||
systemON_Control = 3;
|
||||
|
||||
break;
|
||||
case 102:
|
||||
s_strStateOfXimea="帧率已设置";
|
||||
s_strStateOfXimea="连接成功";
|
||||
s_widgetValueList[9] = 0;
|
||||
break;
|
||||
case 103:
|
||||
s_strStateOfXimea="曝光完成";
|
||||
s_strStateOfXimea="连接成功";
|
||||
s_widgetValueList[9] = 0;
|
||||
break;
|
||||
case 104:
|
||||
s_strStateOfXimea="正在采集";
|
||||
s_strStateOfXimea="采集中";
|
||||
s_widgetValueList[9] = 1;
|
||||
break;
|
||||
|
||||
default:
|
||||
@ -547,7 +631,10 @@ static void *PsdkTest_IrisRecordSystemChanged(void *arg)//
|
||||
else if (strcmp(result[0],"XimeaAutoExpose") == 0)
|
||||
{
|
||||
strcpy(XimeaExposeMaxValue, result[1]);
|
||||
strcpy(XimeaExposeTime, result[2]);
|
||||
|
||||
exposeTimeInt = atoi(result[2]);
|
||||
sprintf(XimeaExposeTime,"%d",exposeTimeInt);
|
||||
s_widgetValueList[8] = exposeTimeInt;
|
||||
|
||||
strcpy(s_strUIMessage,"曝光时间设置成功!");
|
||||
messageTimeCounter = 0;
|
||||
@ -555,8 +642,9 @@ static void *PsdkTest_IrisRecordSystemChanged(void *arg)//
|
||||
}
|
||||
else if (strcmp(result[0],"XimeaFrameRate") == 0)
|
||||
{
|
||||
int tmp = atoi(result[1]);
|
||||
sprintf(XimeaFramerate,"%d",tmp);
|
||||
framerate = atoi(result[1]);
|
||||
s_widgetValueList[6] = framerate;
|
||||
sprintf(XimeaFramerate,"%d",framerate);
|
||||
// strcpy(XimeaFramerate,result[1]);
|
||||
|
||||
strcpy(s_strUIMessage,"帧率设置成功!");
|
||||
@ -565,8 +653,7 @@ static void *PsdkTest_IrisRecordSystemChanged(void *arg)//
|
||||
}
|
||||
else if (strcmp(result[0],"bin") == 0)
|
||||
{
|
||||
int spectralBin_tm = atoi(result[2]);
|
||||
sprintf(spectralBin,"%d",spectralBin_tm);
|
||||
spectralBinInt = atoi(result[2]);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -598,7 +685,6 @@ static T_DjiReturnCode DjiTestWidget_GetWidgetValue(E_DjiWidgetType widgetType,
|
||||
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)
|
||||
{
|
||||
@ -606,16 +692,47 @@ static T_DjiReturnCode PsdkTestWidget_SetWidgetValue_StartRecord(E_DjiWidgetType
|
||||
|
||||
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)//系统关闭
|
||||
{
|
||||
if (systemON_Control == 3)
|
||||
printf("systemON_Control的值为:%d\n", systemON_Control);
|
||||
if (0 <= systemON_Control && systemON_Control <= 4)
|
||||
{
|
||||
strcpy(s_strUIMessage,"系统已经关闭!");
|
||||
strcpy(s_strUIMessage,"系统正在关闭!");
|
||||
messageTimeCounter = 0;
|
||||
messageTimespan = 1000;
|
||||
|
||||
@ -623,17 +740,26 @@ static T_DjiReturnCode PsdkTestWidget_SetWidgetValue_StartRecord(E_DjiWidgetType
|
||||
sendto(s_sockfd, command,strlen(command),0,(struct sockaddr *)&s_server,sizeof(s_server));
|
||||
|
||||
systemON_Control = 4;
|
||||
|
||||
// sleep(1);//此线程不能睡眠,否则会报很多错误
|
||||
// char *commandtmp = (char *)malloc(sizeof(char)*100);
|
||||
// strcat(commandtmp, "kill $(ps aux | grep ximeaAirborneSystem | grep -v grep | awk \'{print $2}\')");
|
||||
// printf("命令行指令为:%s\n",commandtmp);
|
||||
// system(commandtmp);
|
||||
|
||||
closeXimeaRecordSystem();
|
||||
}
|
||||
}
|
||||
else if (value==1)//系统启动
|
||||
{
|
||||
if (systemON_Control == 0)
|
||||
printf("systemON_Control的值为:%d\n", systemON_Control);
|
||||
if (systemON_Control == 4)
|
||||
{
|
||||
strcpy(s_strUIMessage,"请等待系统初始化!");
|
||||
messageTimeCounter = 0;
|
||||
messageTimespan = 1000;
|
||||
}
|
||||
else if (systemON_Control == 1)
|
||||
else if (systemON_Control == 0 || systemON_Control == 1)
|
||||
{
|
||||
strcpy(s_strUIMessage,"系统启动中,请等待!");
|
||||
messageTimeCounter = 0;
|
||||
@ -656,12 +782,6 @@ static T_DjiReturnCode PsdkTestWidget_SetWidgetValue_StartRecord(E_DjiWidgetType
|
||||
messageTimeCounter = 0;
|
||||
messageTimespan = 1000;
|
||||
}
|
||||
else if (systemON_Control == 4)
|
||||
{
|
||||
strcpy(s_strUIMessage,"相机占用,请重新上电!");
|
||||
messageTimeCounter = 0;
|
||||
messageTimespan = 1000;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 6://设置帧率
|
||||
@ -672,6 +792,13 @@ static T_DjiReturnCode PsdkTestWidget_SetWidgetValue_StartRecord(E_DjiWidgetType
|
||||
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)
|
||||
@ -685,9 +812,9 @@ static T_DjiReturnCode PsdkTestWidget_SetWidgetValue_StartRecord(E_DjiWidgetType
|
||||
|
||||
|
||||
// 控制帧率范围
|
||||
if(value > 150)
|
||||
if(value > 250)
|
||||
{
|
||||
strcpy(s_strUIMessage,"帧率不可超过150!");
|
||||
strcpy(s_strUIMessage,"帧率不可超过250!");
|
||||
messageTimeCounter = 0;
|
||||
messageTimespan = 10;
|
||||
|
||||
@ -703,12 +830,10 @@ static T_DjiReturnCode PsdkTestWidget_SetWidgetValue_StartRecord(E_DjiWidgetType
|
||||
}
|
||||
|
||||
//
|
||||
frameRateGlobel = value;
|
||||
|
||||
char command[50] = "5,";
|
||||
char framerate[20];
|
||||
sprintf(framerate,"%d",value);
|
||||
strcat(command,framerate);
|
||||
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;
|
||||
}
|
||||
@ -764,24 +889,13 @@ static T_DjiReturnCode PsdkTestWidget_SetWidgetValue_StartRecord(E_DjiWidgetType
|
||||
}
|
||||
|
||||
//曝光时间有效性判断
|
||||
if(frameRateGlobel == 0)
|
||||
{
|
||||
strcpy(s_strUIMessage,"请先设置帧率!");
|
||||
messageTimeCounter = 0;
|
||||
messageTimespan = 10;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
float maxExposureTime = 1 / (float)frameRateGlobel * 1000;//单位是ms
|
||||
float maxExposureTime = 1 / (float)framerate * 1000 * 1000;//单位是μs
|
||||
|
||||
if(value > maxExposureTime)
|
||||
{
|
||||
strcpy(s_strUIMessage,"曝光时间超过上限,无效!");
|
||||
strcpy(s_strUIMessage,"曝光时间已设置为最大!");
|
||||
messageTimeCounter = 0;
|
||||
messageTimespan = 10;
|
||||
|
||||
break;
|
||||
}
|
||||
else if(value == 0)
|
||||
{
|
||||
@ -804,6 +918,11 @@ static T_DjiReturnCode PsdkTestWidget_SetWidgetValue_StartRecord(E_DjiWidgetType
|
||||
case 9:
|
||||
if (value==0)//停止采集
|
||||
{
|
||||
if (s_stateOfXimea != 104)
|
||||
{
|
||||
s_strStateOfXimea="连接成功";
|
||||
}
|
||||
|
||||
char* command = "4";
|
||||
sendto(s_sockfd, command,strlen(command),0,(struct sockaddr *)&s_server,sizeof(s_server));
|
||||
}
|
||||
@ -817,70 +936,32 @@ static T_DjiReturnCode PsdkTestWidget_SetWidgetValue_StartRecord(E_DjiWidgetType
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
s_strStateOfXimea="预约采集";
|
||||
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");
|
||||
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();
|
||||
|
||||
strcpy(s_strUIMessage,"请重新上电!");
|
||||
extractSpectralBinAndBandnumber(true);
|
||||
extractSpatialBinAndWidth(true);
|
||||
|
||||
strcpy(s_strUIMessage,"请等待采集系统重启!");
|
||||
messageTimeCounter = 0;
|
||||
messageTimespan = 10000;
|
||||
|
||||
@ -892,4 +973,139 @@ static T_DjiReturnCode PsdkTestWidget_SetWidgetValue_StartRecord(E_DjiWidgetType
|
||||
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=" ";
|
||||
sprintf(s_strSbgSatelliteCounter,"%s"," ");
|
||||
s_strSbgSolutionMode=" ";
|
||||
sprintf(XimeaFramerate,"%s"," ");
|
||||
sprintf(XimeaExposeTime,"%s"," ");
|
||||
sprintf(XimeaExposeMaxValue,"%s"," ");
|
||||
sprintf(s_spectralBin,"%s"," ");
|
||||
sprintf(s_spatialBin,"%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;
|
||||
spectralBinInt = spectralBin;
|
||||
|
||||
if (!isModifyBin)
|
||||
{
|
||||
sprintf(s_spectralBin,"%d_%d", spectralBin, height);
|
||||
}
|
||||
}
|
||||
|
||||
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****/
|
||||
|
@ -8,134 +8,24 @@
|
||||
"is_enable": true
|
||||
},
|
||||
"speaker": {
|
||||
"is_enable_tts": true,
|
||||
"is_enable_tts": false,
|
||||
"is_enable_voice": false
|
||||
},
|
||||
"widget_list": [
|
||||
{
|
||||
"widget_index": 0,
|
||||
"widget_type": "button",
|
||||
"widget_name": "按钮",
|
||||
"icon_file_set": {
|
||||
"icon_file_name_selected": "icon_button1.png",
|
||||
"icon_file_name_unselected": "icon_button1.png"
|
||||
},
|
||||
"customize_rc_buttons_config": {
|
||||
"is_enable": true,
|
||||
"mapping_config_display_order": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"widget_index": 1,
|
||||
"widget_type": "list",
|
||||
"widget_name": "列表",
|
||||
"list_item": [
|
||||
{
|
||||
"item_name": "选项_1",
|
||||
"icon_file_set": {
|
||||
"icon_file_name_selected": "icon_list_item1.png",
|
||||
"icon_file_name_unselected": "icon_list_item1.png"
|
||||
}
|
||||
},
|
||||
{
|
||||
"item_name": "选项_2",
|
||||
"icon_file_set": {
|
||||
"icon_file_name_selected": "icon_list_item2.png",
|
||||
"icon_file_name_unselected": "icon_list_item2.png"
|
||||
}
|
||||
}
|
||||
],
|
||||
"customize_rc_buttons_config": {
|
||||
"is_enable": true,
|
||||
"mapping_config_display_order": 1
|
||||
}
|
||||
},
|
||||
{
|
||||
"widget_index": 2,
|
||||
"widget_type": "switch",
|
||||
"widget_name": "开关",
|
||||
"icon_file_set": {
|
||||
"icon_file_name_selected": "icon_switch_select.png",
|
||||
"icon_file_name_unselected": "icon_switch_unselect.png"
|
||||
},
|
||||
"customize_rc_buttons_config": {
|
||||
"is_enable": true,
|
||||
"mapping_config_display_order": 2
|
||||
}
|
||||
},
|
||||
{
|
||||
"widget_index": 3,
|
||||
"widget_type": "scale",
|
||||
"widget_name": "范围条",
|
||||
"icon_file_set": {
|
||||
"icon_file_name_selected": "icon_scale.png",
|
||||
"icon_file_name_unselected": "icon_scale.png"
|
||||
},
|
||||
"customize_rc_buttons_config": {
|
||||
"is_enable": true,
|
||||
"mapping_config_display_order": 3,
|
||||
"button_value_step_length": 5
|
||||
}
|
||||
},
|
||||
{
|
||||
"widget_index": 4,
|
||||
"widget_type": "button",
|
||||
"widget_name": "按钮",
|
||||
"icon_file_set": {
|
||||
"icon_file_name_selected": "icon_button1.png",
|
||||
"icon_file_name_unselected": "icon_button1.png"
|
||||
},
|
||||
"customize_rc_buttons_config": {
|
||||
"is_enable": true,
|
||||
"mapping_config_display_order": 0
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"config_interface": {
|
||||
"text_input_box": {
|
||||
"widget_name": "文本输入框",
|
||||
"placeholder_text": "请输入消息",
|
||||
"is_enable": true
|
||||
},
|
||||
"widget_list": [
|
||||
{
|
||||
"widget_index": 5,
|
||||
"widget_type": "switch",
|
||||
"widget_name": "系统启动"
|
||||
},
|
||||
{
|
||||
"widget_index": 6,
|
||||
"widget_type": "int_input_box",
|
||||
"widget_name": "帧率",
|
||||
"int_input_box_hint": "unit:hz"
|
||||
},
|
||||
{
|
||||
"widget_index": 7,
|
||||
"widget_type": "button",
|
||||
"widget_name": "自动曝光"
|
||||
},
|
||||
{
|
||||
"widget_index": 8,
|
||||
"widget_type": "int_input_box",
|
||||
"widget_name": "曝光时间",
|
||||
"int_input_box_hint": "unit:ms"
|
||||
},
|
||||
{
|
||||
"widget_index": 9,
|
||||
"widget_type": "switch",
|
||||
"widget_name": "开始采集"
|
||||
},
|
||||
{
|
||||
"widget_index": 10,
|
||||
"widget_index": 4,
|
||||
"widget_type": "list",
|
||||
"widget_name": "系统指令",
|
||||
"widget_name": "高级指令",
|
||||
"list_item": [
|
||||
{
|
||||
"item_name": "等待指令"
|
||||
"item_name": "其他"
|
||||
},
|
||||
{
|
||||
"item_name": "重启电脑"
|
||||
"item_name": "重启"
|
||||
},
|
||||
{
|
||||
"item_name": "关机"
|
||||
@ -152,18 +42,45 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"widget_index": 11,
|
||||
"widget_index": 5,
|
||||
"widget_type": "switch",
|
||||
"widget_name": "系统启动"
|
||||
},
|
||||
{
|
||||
"widget_index": 6,
|
||||
"widget_type": "int_input_box",
|
||||
"widget_name": "帧率",
|
||||
"int_input_box_hint": "单位:赫兹"
|
||||
},
|
||||
{
|
||||
"widget_index": 7,
|
||||
"widget_type": "button",
|
||||
"widget_name": "自动曝光"
|
||||
},
|
||||
{
|
||||
"widget_index": 8,
|
||||
"widget_type": "int_input_box",
|
||||
"widget_name": "曝光时间",
|
||||
"int_input_box_hint": "单位:微秒"
|
||||
},
|
||||
{
|
||||
"widget_index": 9,
|
||||
"widget_type": "switch",
|
||||
"widget_name": "高光谱采集"
|
||||
},
|
||||
{
|
||||
"widget_index": 10,
|
||||
"widget_type": "list",
|
||||
"widget_name": "bin",
|
||||
"list_item": [
|
||||
{
|
||||
"item_name": "等待指令"
|
||||
"item_name": "其他"
|
||||
},
|
||||
{
|
||||
"item_name": "光谱1"
|
||||
"item_name": "1"
|
||||
},
|
||||
{
|
||||
"item_name": "光谱2"
|
||||
"item_name": "2"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
@ -8,134 +8,24 @@
|
||||
"is_enable": true
|
||||
},
|
||||
"speaker": {
|
||||
"is_enable_tts": true,
|
||||
"is_enable_tts": false,
|
||||
"is_enable_voice": false
|
||||
},
|
||||
"widget_list": [
|
||||
{
|
||||
"widget_index": 0,
|
||||
"widget_type": "button",
|
||||
"widget_name": "Button",
|
||||
"icon_file_set": {
|
||||
"icon_file_name_selected": "icon_button1.png",
|
||||
"icon_file_name_unselected": "icon_button1.png"
|
||||
},
|
||||
"customize_rc_buttons_config": {
|
||||
"is_enable": true,
|
||||
"mapping_config_display_order": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"widget_index": 1,
|
||||
"widget_type": "list",
|
||||
"widget_name": "List",
|
||||
"list_item": [
|
||||
{
|
||||
"item_name": "Item_1",
|
||||
"icon_file_set": {
|
||||
"icon_file_name_selected": "icon_list_item1.png",
|
||||
"icon_file_name_unselected": "icon_list_item1.png"
|
||||
}
|
||||
},
|
||||
{
|
||||
"item_name": "Item_2",
|
||||
"icon_file_set": {
|
||||
"icon_file_name_selected": "icon_list_item2.png",
|
||||
"icon_file_name_unselected": "icon_list_item2.png"
|
||||
}
|
||||
}
|
||||
],
|
||||
"customize_rc_buttons_config": {
|
||||
"is_enable": true,
|
||||
"mapping_config_display_order": 1
|
||||
}
|
||||
},
|
||||
{
|
||||
"widget_index": 2,
|
||||
"widget_type": "switch",
|
||||
"widget_name": "Switch",
|
||||
"icon_file_set": {
|
||||
"icon_file_name_selected": "icon_switch_select.png",
|
||||
"icon_file_name_unselected": "icon_switch_unselect.png"
|
||||
},
|
||||
"customize_rc_buttons_config": {
|
||||
"is_enable": true,
|
||||
"mapping_config_display_order": 2
|
||||
}
|
||||
},
|
||||
{
|
||||
"widget_index": 3,
|
||||
"widget_type": "scale",
|
||||
"widget_name": "Scale",
|
||||
"icon_file_set": {
|
||||
"icon_file_name_selected": "icon_scale.png",
|
||||
"icon_file_name_unselected": "icon_scale.png"
|
||||
},
|
||||
"customize_rc_buttons_config": {
|
||||
"is_enable": true,
|
||||
"mapping_config_display_order": 3,
|
||||
"button_value_step_length": 5
|
||||
}
|
||||
},
|
||||
{
|
||||
"widget_index": 4,
|
||||
"widget_type": "button",
|
||||
"widget_name": "Button",
|
||||
"icon_file_set": {
|
||||
"icon_file_name_selected": "icon_button1.png",
|
||||
"icon_file_name_unselected": "icon_button1.png"
|
||||
},
|
||||
"customize_rc_buttons_config": {
|
||||
"is_enable": true,
|
||||
"mapping_config_display_order": 0
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"config_interface": {
|
||||
"text_input_box": {
|
||||
"widget_name": "TextInputBox",
|
||||
"placeholder_text": "Please input message",
|
||||
"is_enable": true
|
||||
},
|
||||
"widget_list": [
|
||||
{
|
||||
"widget_index": 5,
|
||||
"widget_type": "switch",
|
||||
"widget_name": "系统启动"
|
||||
},
|
||||
{
|
||||
"widget_index": 6,
|
||||
"widget_type": "int_input_box",
|
||||
"widget_name": "帧率",
|
||||
"int_input_box_hint": "unit:hz"
|
||||
},
|
||||
{
|
||||
"widget_index": 7,
|
||||
"widget_type": "button",
|
||||
"widget_name": "自动曝光"
|
||||
},
|
||||
{
|
||||
"widget_index": 8,
|
||||
"widget_type": "int_input_box",
|
||||
"widget_name": "曝光时间",
|
||||
"int_input_box_hint": "unit:ms"
|
||||
},
|
||||
{
|
||||
"widget_index": 9,
|
||||
"widget_type": "switch",
|
||||
"widget_name": "开始采集"
|
||||
},
|
||||
{
|
||||
"widget_index": 10,
|
||||
"widget_index": 4,
|
||||
"widget_type": "list",
|
||||
"widget_name": "系统指令",
|
||||
"widget_name": "高级指令",
|
||||
"list_item": [
|
||||
{
|
||||
"item_name": "等待指令"
|
||||
"item_name": "其他"
|
||||
},
|
||||
{
|
||||
"item_name": "重启电脑"
|
||||
"item_name": "重启"
|
||||
},
|
||||
{
|
||||
"item_name": "关机"
|
||||
@ -152,18 +42,45 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"widget_index": 11,
|
||||
"widget_index": 5,
|
||||
"widget_type": "switch",
|
||||
"widget_name": "系统启动"
|
||||
},
|
||||
{
|
||||
"widget_index": 6,
|
||||
"widget_type": "int_input_box",
|
||||
"widget_name": "帧率",
|
||||
"int_input_box_hint": "单位:赫兹"
|
||||
},
|
||||
{
|
||||
"widget_index": 7,
|
||||
"widget_type": "button",
|
||||
"widget_name": "自动曝光"
|
||||
},
|
||||
{
|
||||
"widget_index": 8,
|
||||
"widget_type": "int_input_box",
|
||||
"widget_name": "曝光时间",
|
||||
"int_input_box_hint": "单位:微秒"
|
||||
},
|
||||
{
|
||||
"widget_index": 9,
|
||||
"widget_type": "switch",
|
||||
"widget_name": "高光谱采集"
|
||||
},
|
||||
{
|
||||
"widget_index": 10,
|
||||
"widget_type": "list",
|
||||
"widget_name": "bin",
|
||||
"list_item": [
|
||||
{
|
||||
"item_name": "等待指令"
|
||||
"item_name": "其他"
|
||||
},
|
||||
{
|
||||
"item_name": "光谱1"
|
||||
"item_name": "1"
|
||||
},
|
||||
{
|
||||
"item_name": "光谱2"
|
||||
"item_name": "2"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
@ -85,7 +85,7 @@ T_DjiReturnCode DjiTest_XPortStartService(void)
|
||||
return djiStat;
|
||||
}
|
||||
|
||||
//通过注册回调函数获取X-Port 的姿态信息.注册后,回调函数将会被自动调用,调用频率为
|
||||
//通过注册回调函数获取X-Port 的姿态信息.注册后,回调函数将会被自动调用,调用频率为10hz
|
||||
djiStat = DjiXPort_RegReceiveAttitudeInformationCallback(ReceiveXPortAttitudeInformation);
|
||||
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
|
||||
USER_LOG_ERROR("register receive XPort attitude information callback function error: 0x%08llX.",
|
||||
|
@ -1,5 +1,5 @@
|
||||
cmake_minimum_required(VERSION 3.5)
|
||||
project(dji_sdk_demo_linux C)
|
||||
project(dji_300tc C)
|
||||
|
||||
set(CMAKE_C_FLAGS "-pthread -std=gnu99")
|
||||
set(CMAKE_EXE_LINKER_FLAGS "-pthread")
|
||||
@ -95,6 +95,9 @@ target_link_libraries(${PROJECT_NAME}
|
||||
z
|
||||
m
|
||||
pthread
|
||||
rt
|
||||
crypt
|
||||
wiringPi
|
||||
)
|
||||
|
||||
add_custom_command(TARGET ${PROJECT_NAME}
|
||||
|
@ -56,9 +56,9 @@
|
||||
#include "dji_sdk_config.h"
|
||||
|
||||
/* Private constants ---------------------------------------------------------*/
|
||||
#define DJI_LOG_PATH "Logs/DJI"
|
||||
#define DJI_LOG_INDEX_FILE_NAME "Logs/latest"
|
||||
#define DJI_LOG_FOLDER_NAME "Logs"
|
||||
#define DJI_LOG_PATH "/media/nvme/300TC/programRunLog/djiLog/DJI"
|
||||
#define DJI_LOG_INDEX_FILE_NAME "/media/nvme/300TC/programRunLog/djiLog/latest"
|
||||
#define DJI_LOG_FOLDER_NAME "/media/nvme/300TC/programRunLog/djiLog"
|
||||
#define DJI_LOG_PATH_MAX_SIZE (128)
|
||||
#define DJI_LOG_FOLDER_NAME_MAX_SIZE (32)
|
||||
#define DJI_LOG_MAX_COUNT (10)
|
||||
@ -137,7 +137,7 @@ int main(int argc, char **argv)
|
||||
return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR;
|
||||
}
|
||||
|
||||
returnCode = DjiCore_SetAlias("PSDK_APPALIAS");
|
||||
returnCode = DjiCore_SetAlias("300TC_3.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;
|
||||
@ -721,12 +721,32 @@ delay:
|
||||
|
||||
static T_DjiReturnCode DjiTest_HighPowerApplyPinInit()
|
||||
{
|
||||
wiringPiSetup(); // 初始化WiringPi库
|
||||
|
||||
pinMode(HIGH_POWER_APPLY_PIN, OUTPUT); // 配置引脚为输出模式
|
||||
pullUpDnControl(HIGH_POWER_APPLY_PIN, PUD_DOWN); // 启用下拉电阻,使引脚默认为低电平
|
||||
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
|
||||
}
|
||||
|
||||
static T_DjiReturnCode DjiTest_WriteHighPowerApplyPin(E_DjiPowerManagementPinState pinState)
|
||||
{
|
||||
//attention: please pull up the HWPR pin state by hardware.
|
||||
|
||||
int wiringPiState;
|
||||
|
||||
switch (pinState) {
|
||||
case DJI_POWER_MANAGEMENT_PIN_STATE_RESET:
|
||||
wiringPiState = LOW; // WiringPi库中,LOW表示低电平
|
||||
break;
|
||||
case DJI_POWER_MANAGEMENT_PIN_STATE_SET:
|
||||
wiringPiState = HIGH; // WiringPi库中,HIGH表示高电平
|
||||
break;
|
||||
default:
|
||||
USER_LOG_ERROR("pin state unknown: %d.", pinState);
|
||||
return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
|
||||
}
|
||||
|
||||
digitalWrite(HIGH_POWER_APPLY_PIN, wiringPiState); // 使用WiringPi库设置引脚状态
|
||||
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user