5 Commits

Author SHA1 Message Date
47153346cd fix
1. 无法第二次启动,授时等待时间优化;
2. 遥控器界面显示:硬盘可用空间,当前帧率剩余飞行时间;
3. 帧率曝光时间和遥控器右侧边栏数字联动;
4. bin2后面加通道数,侧边栏显示bin和通道数;
5. 遥控器去掉惯导定位精度,改为显示full nav;
6. 其他界面改动;
2023-08-23 11:56:23 +08:00
699112b487 相机控制 2023-08-18 11:49:20 +08:00
4343500d70 推流 2023-08-18 10:50:41 +08:00
b2f2c17b7a DataTransmission 2023-08-18 10:45:06 +08:00
c2559f2bbc 电源管理 2023-08-16 18:36:23 +08:00
12 changed files with 312 additions and 112 deletions

View File

@ -93,11 +93,11 @@ bool DjiMediaFile_IsSupported(const char *filePath)
T_DjiReturnCode DjiMediaFile_CreateHandle(const char *filePath, T_DjiMediaFileHandle *pMediaFileHandle) T_DjiReturnCode DjiMediaFile_CreateHandle(const char *filePath, T_DjiMediaFileHandle *pMediaFileHandle)
{ {
int optIndex; int optIndex;//这个指数 指明了 filePath中的文件格式 处于数组s_mediaFileOpt中的哪一个元素
T_DjiOsalHandler *osalHandler = DjiPlatform_GetOsalHandler(); T_DjiOsalHandler *osalHandler = DjiPlatform_GetOsalHandler();
for (optIndex = 0; optIndex < s_mediaFileOptCount; optIndex++) { for (optIndex = 0; optIndex < s_mediaFileOptCount; optIndex++) {
if (s_mediaFileOpt[optIndex].isSupportedFunc(filePath) == true) { if (s_mediaFileOpt[optIndex].isSupportedFunc(filePath) == true) {//查看filePath的格式是否 存在于 所有支持的格式中
break; break;
} }
} }
@ -116,7 +116,7 @@ T_DjiReturnCode DjiMediaFile_CreateHandle(const char *filePath, T_DjiMediaFileHa
return DJI_ERROR_SYSTEM_MODULE_CODE_MEMORY_ALLOC_FAILED; 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)->mediaFileThm.privThm = NULL;
(*pMediaFileHandle)->mediaFileScr.privScr = NULL; (*pMediaFileHandle)->mediaFileScr.privScr = NULL;

View File

@ -75,12 +75,12 @@ typedef struct {
/* Private variables ---------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/
static bool s_isCamInited = false; static bool s_isCamInited = false;
static T_DjiCameraCommonHandler s_commonHandler; static T_DjiCameraCommonHandler s_commonHandler;//注册相机类基础功能
static T_DjiCameraExposureMeteringHandler s_exposureMeteringHandler; static T_DjiCameraExposureMeteringHandler s_exposureMeteringHandler;//用于测光
static T_DjiCameraFocusHandler s_focusHandler; static T_DjiCameraFocusHandler s_focusHandler;//设置对焦
static T_DjiCameraDigitalZoomHandler s_digitalZoomHandler; static T_DjiCameraDigitalZoomHandler s_digitalZoomHandler;//数字变焦
static T_DjiCameraOpticalZoomHandler s_opticalZoomHandler; static T_DjiCameraOpticalZoomHandler s_opticalZoomHandler;//光学变焦
static T_DjiCameraTapZoomHandler s_tapZoomHandler; static T_DjiCameraTapZoomHandler s_tapZoomHandler;//指点变焦功能
static T_DjiTaskHandle s_userCameraThread; 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 T_DjiCameraSpotMeteringTarget s_cameraSpotMeteringTarget = {0};
static E_DjiCameraFocusMode s_cameraFocusMode = DJI_CAMERA_FOCUS_MODE_AUTO; static E_DjiCameraFocusMode s_cameraFocusMode = DJI_CAMERA_FOCUS_MODE_AUTO;
static T_DjiCameraPointInScreen s_cameraFocusTarget = {0}; static T_DjiCameraPointInScreen s_cameraFocusTarget = {0};//对焦点
static uint32_t s_cameraFocusRingValue = FOCUS_MID_RINGVALUE; static uint32_t s_cameraFocusRingValue = FOCUS_MID_RINGVALUE;//对焦环
static T_DjiCameraFocusAssistantSettings s_cameraFocusAssistantSettings = {0}; static T_DjiCameraFocusAssistantSettings s_cameraFocusAssistantSettings = {0};
static E_DjiCameraZoomDirection s_cameraZoomDirection = DJI_CAMERA_ZOOM_DIRECTION_OUT; static E_DjiCameraZoomDirection s_cameraZoomDirection = DJI_CAMERA_ZOOM_DIRECTION_OUT;
@ -120,6 +120,7 @@ static T_DjiMutexHandle s_tapZoomMutex = NULL;
static E_DjiCameraVideoStreamType s_cameraVideoStreamType; static E_DjiCameraVideoStreamType s_cameraVideoStreamType;
/* Private functions declaration ---------------------------------------------*/ /* Private functions declaration ---------------------------------------------*/
//用于s_commonHandler中的回调函数:相机类基础功能
static T_DjiReturnCode GetSystemState(T_DjiCameraSystemState *systemState); static T_DjiReturnCode GetSystemState(T_DjiCameraSystemState *systemState);
static T_DjiReturnCode SetMode(E_DjiCameraMode mode); static T_DjiReturnCode SetMode(E_DjiCameraMode mode);
static T_DjiReturnCode StartRecordVideo(void); static T_DjiReturnCode StartRecordVideo(void);
@ -135,11 +136,13 @@ static T_DjiReturnCode GetPhotoTimeIntervalSettings(T_DjiCameraPhotoTimeInterval
static T_DjiReturnCode GetSDCardState(T_DjiCameraSDCardState *sdCardState); static T_DjiReturnCode GetSDCardState(T_DjiCameraSDCardState *sdCardState);
static T_DjiReturnCode FormatSDCard(void); static T_DjiReturnCode FormatSDCard(void);
//用于s_exposureMeteringHandler中的回调函数:测光
static T_DjiReturnCode SetMeteringMode(E_DjiCameraMeteringMode mode); static T_DjiReturnCode SetMeteringMode(E_DjiCameraMeteringMode mode);
static T_DjiReturnCode GetMeteringMode(E_DjiCameraMeteringMode *mode); static T_DjiReturnCode GetMeteringMode(E_DjiCameraMeteringMode *mode);
static T_DjiReturnCode SetSpotMeteringTarget(T_DjiCameraSpotMeteringTarget target); static T_DjiReturnCode SetSpotMeteringTarget(T_DjiCameraSpotMeteringTarget target);
static T_DjiReturnCode GetSpotMeteringTarget(T_DjiCameraSpotMeteringTarget *target); static T_DjiReturnCode GetSpotMeteringTarget(T_DjiCameraSpotMeteringTarget *target);
//用于s_focusHandler中的回调函数:设置对焦功能
static T_DjiReturnCode SetFocusMode(E_DjiCameraFocusMode mode); static T_DjiReturnCode SetFocusMode(E_DjiCameraFocusMode mode);
static T_DjiReturnCode GetFocusMode(E_DjiCameraFocusMode *mode); static T_DjiReturnCode GetFocusMode(E_DjiCameraFocusMode *mode);
static T_DjiReturnCode SetFocusTarget(T_DjiCameraPointInScreen target); static T_DjiReturnCode SetFocusTarget(T_DjiCameraPointInScreen target);
@ -150,18 +153,25 @@ static T_DjiReturnCode SetFocusRingValue(uint32_t value);
static T_DjiReturnCode GetFocusRingValue(uint32_t *value); static T_DjiReturnCode GetFocusRingValue(uint32_t *value);
static T_DjiReturnCode GetFocusRingValueUpperBound(uint32_t *value); static T_DjiReturnCode GetFocusRingValueUpperBound(uint32_t *value);
//用于s_digitalZoomHandler的回调函数中:数字变焦功能
static T_DjiReturnCode SetDigitalZoomFactor(dji_f32_t factor); static T_DjiReturnCode SetDigitalZoomFactor(dji_f32_t factor);
//用于s_opticalZoomHandler的回调函数中:光学变焦功能
static T_DjiReturnCode SetOpticalZoomFocalLength(uint32_t focalLength); static T_DjiReturnCode SetOpticalZoomFocalLength(uint32_t focalLength);
static T_DjiReturnCode GetOpticalZoomFocalLength(uint32_t *focalLength); static T_DjiReturnCode GetOpticalZoomFocalLength(uint32_t *focalLength);
static T_DjiReturnCode GetOpticalZoomSpec(T_DjiCameraOpticalZoomSpec *spec); static T_DjiReturnCode GetOpticalZoomSpec(T_DjiCameraOpticalZoomSpec *spec);
static T_DjiReturnCode StartContinuousOpticalZoom(E_DjiCameraZoomDirection direction, E_DjiCameraZoomSpeed speed); static T_DjiReturnCode StartContinuousOpticalZoom(E_DjiCameraZoomDirection direction, E_DjiCameraZoomSpeed speed);
static T_DjiReturnCode StopContinuousOpticalZoom(void); static T_DjiReturnCode StopContinuousOpticalZoom(void);
//用于s_tapZoomHandler中的回调函数:指点变焦功能
static T_DjiReturnCode GetTapZoomState(T_DjiCameraTapZoomState *state); static T_DjiReturnCode GetTapZoomState(T_DjiCameraTapZoomState *state);
static T_DjiReturnCode SetTapZoomEnabled(bool enabledFlag); static T_DjiReturnCode SetTapZoomEnabled(bool enabledFlag);
static T_DjiReturnCode GetTapZoomEnabled(bool *enabledFlag); static T_DjiReturnCode GetTapZoomEnabled(bool *enabledFlag);
static T_DjiReturnCode SetTapZoomMultiplier(uint8_t multiplier); static T_DjiReturnCode SetTapZoomMultiplier(uint8_t multiplier);
static T_DjiReturnCode GetTapZoomMultiplier(uint8_t *multiplier); static T_DjiReturnCode GetTapZoomMultiplier(uint8_t *multiplier);
static T_DjiReturnCode TapZoomAtTarget(T_DjiCameraPointInScreen target); static T_DjiReturnCode TapZoomAtTarget(T_DjiCameraPointInScreen target);
//
static T_DjiReturnCode DjiTest_CameraHybridZoom(uint32_t focalLength); static T_DjiReturnCode DjiTest_CameraHybridZoom(uint32_t focalLength);
static T_DjiReturnCode DjiTest_CameraRotationGimbal(T_TestCameraGimbalRotationArgument gimbalRotationArgument); static T_DjiReturnCode DjiTest_CameraRotationGimbal(T_TestCameraGimbalRotationArgument gimbalRotationArgument);
@ -826,6 +836,7 @@ static T_DjiReturnCode TapZoomAtTarget(T_DjiCameraPointInScreen target)
return DJI_ERROR_SYSTEM_MODULE_CODE_NONSUPPORT_IN_CURRENT_STATE; return DJI_ERROR_SYSTEM_MODULE_CODE_NONSUPPORT_IN_CURRENT_STATE;
} }
//设置云台相机指点变焦的模式
rotationMode = DJI_GIMBAL_ROTATION_MODE_RELATIVE_ANGLE; rotationMode = DJI_GIMBAL_ROTATION_MODE_RELATIVE_ANGLE;
rotationProperty.relativeAngleRotation.actionTime = TAP_ZOOM_DURATION / 10; rotationProperty.relativeAngleRotation.actionTime = TAP_ZOOM_DURATION / 10;
@ -938,8 +949,8 @@ static T_DjiReturnCode DjiTest_CameraRotationGimbal(T_TestCameraGimbalRotationAr
static void *UserCamera_Task(void *arg) static void *UserCamera_Task(void *arg)
{ {
static uint32_t photoCnt = 0; static uint32_t photoCnt = 0;//????????
static uint32_t step = 0; static uint32_t step = 0;//控制任务的执行时间间隔
T_DjiReturnCode returnCode; T_DjiReturnCode returnCode;
int32_t tempFocalLength = 0; int32_t tempFocalLength = 0;
dji_f32_t tempDigitalFactor = 0.0f; dji_f32_t tempDigitalFactor = 0.0f;
@ -950,7 +961,7 @@ static void *UserCamera_Task(void *arg)
USER_UTIL_UNUSED(arg); USER_UTIL_UNUSED(arg);
while (1) { while (1) {
osalHandler->TaskSleepMs(1000 / PAYLOAD_CAMERA_EMU_TASK_FREQ); osalHandler->TaskSleepMs(1000 / PAYLOAD_CAMERA_EMU_TASK_FREQ);//睡眠10ms
step++; step++;
returnCode = osalHandler->MutexLock(s_commonMutex); returnCode = osalHandler->MutexLock(s_commonMutex);
@ -964,11 +975,13 @@ static void *UserCamera_Task(void *arg)
s_cameraSDCardState.availableCaptureCount = s_cameraSDCardState.remainSpaceInMB / SDCARD_PER_PHOTO_SPACE_IN_MB; s_cameraSDCardState.availableCaptureCount = s_cameraSDCardState.remainSpaceInMB / SDCARD_PER_PHOTO_SPACE_IN_MB;
//realize your photo shoot and storage logic here //realize your photo shoot and storage logic here
//1. 确认拍照状态使用PSDK 开发的相机类负载设备在执行完拍照动作后,需要获取负载设备的拍照状态。
if (s_cameraState.shootingState != DJI_CAMERA_SHOOTING_PHOTO_IDLE && if (s_cameraState.shootingState != DJI_CAMERA_SHOOTING_PHOTO_IDLE &&
photoCnt++ > TAKING_PHOTO_SPENT_TIME_MS_EMU / (1000 / PAYLOAD_CAMERA_EMU_TASK_FREQ)) { photoCnt++ > TAKING_PHOTO_SPENT_TIME_MS_EMU / (1000 / PAYLOAD_CAMERA_EMU_TASK_FREQ)) {
photoCnt = 0; photoCnt = 0;
//store the photo after shooting finished //store the photo after shooting finished
//2. 存储照片相机类负载设备在执行完拍照后使用PSDK 开发的相机类负载设备将相机拍摄的照片存储在相机类负载设备上的内存卡中。
if (s_cameraShootPhotoMode == DJI_CAMERA_SHOOT_PHOTO_MODE_SINGLE) { if (s_cameraShootPhotoMode == DJI_CAMERA_SHOOT_PHOTO_MODE_SINGLE) {
s_cameraSDCardState.remainSpaceInMB = s_cameraSDCardState.remainSpaceInMB =
s_cameraSDCardState.remainSpaceInMB - SDCARD_PER_PHOTO_SPACE_IN_MB; s_cameraSDCardState.remainSpaceInMB - SDCARD_PER_PHOTO_SPACE_IN_MB;
@ -989,6 +1002,7 @@ static void *UserCamera_Task(void *arg)
} }
//check the remain space of sdcard //check the remain space of sdcard
//3. 检查存储空间:
if (s_cameraSDCardState.remainSpaceInMB > SDCARD_TOTAL_SPACE_IN_MB) { if (s_cameraSDCardState.remainSpaceInMB > SDCARD_TOTAL_SPACE_IN_MB) {
s_cameraSDCardState.remainSpaceInMB = 0; s_cameraSDCardState.remainSpaceInMB = 0;
s_cameraSDCardState.isFull = true; s_cameraSDCardState.isFull = true;
@ -1025,6 +1039,8 @@ static void *UserCamera_Task(void *arg)
} }
// 10Hz // 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)) { if (USER_UTIL_IS_WORK_TURN(step, 10, PAYLOAD_CAMERA_EMU_TASK_FREQ)) {
returnCode = osalHandler->MutexLock(s_zoomMutex); returnCode = osalHandler->MutexLock(s_zoomMutex);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) { if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
@ -1146,6 +1162,7 @@ out:
continue; continue;
} }
// 预估可拍照张数和可录像时长的功能。
if (s_cameraState.isRecording) { if (s_cameraState.isRecording) {
s_cameraState.currentVideoRecordingTimeInSeconds++; s_cameraState.currentVideoRecordingTimeInSeconds++;
s_cameraSDCardState.remainSpaceInMB = s_cameraSDCardState.remainSpaceInMB =
@ -1250,27 +1267,29 @@ T_DjiReturnCode DjiTest_CameraEmuBaseStartService(void)
SDCARD_TOTAL_SPACE_IN_MB / SDCARD_PER_SECONDS_RECORD_SPACE_IN_MB; SDCARD_TOTAL_SPACE_IN_MB / SDCARD_PER_SECONDS_RECORD_SPACE_IN_MB;
/* Register the camera common handler */ /* Register the camera common handler */
//注册相机类基础功能1SetMode设置相机工作模式照片/视频/回放2如果是photo模式使用SetShootPhotoMode设置照片拍照模式3StartShootPhoto开始拍摄照片
s_commonHandler.GetSystemState = GetSystemState; s_commonHandler.GetSystemState = GetSystemState;
s_commonHandler.SetMode = SetMode; s_commonHandler.SetMode = SetMode;//设置相机模式:照片/视频/回放
s_commonHandler.GetMode = DjiTest_CameraGetMode; s_commonHandler.GetMode = DjiTest_CameraGetMode;
s_commonHandler.StartRecordVideo = StartRecordVideo; s_commonHandler.StartRecordVideo = StartRecordVideo;//控制相机录像s_cameraState.isRecording = true;
s_commonHandler.StopRecordVideo = StopRecordVideo; s_commonHandler.StopRecordVideo = StopRecordVideo;
s_commonHandler.StartShootPhoto = StartShootPhoto; s_commonHandler.StartShootPhoto = StartShootPhoto;//控制相机拍摄照片:单拍/连拍/等时间间隔;只是改变了s_cameraState的状态
s_commonHandler.StopShootPhoto = StopShootPhoto; s_commonHandler.StopShootPhoto = StopShootPhoto;
s_commonHandler.SetShootPhotoMode = SetShootPhotoMode; s_commonHandler.SetShootPhotoMode = SetShootPhotoMode;//写入变量s_cameraShootPhotoMode设置相机类负载的拍照模式:单拍/连拍/等时间间隔
s_commonHandler.GetShootPhotoMode = GetShootPhotoMode; s_commonHandler.GetShootPhotoMode = GetShootPhotoMode;//读取变量s_cameraShootPhotoMode
s_commonHandler.SetPhotoBurstCount = SetPhotoBurstCount; s_commonHandler.SetPhotoBurstCount = SetPhotoBurstCount;//控制相机连拍写入变量s_cameraBurstCount
s_commonHandler.GetPhotoBurstCount = GetPhotoBurstCount; s_commonHandler.GetPhotoBurstCount = GetPhotoBurstCount;// 读取变量s_cameraBurstCount
s_commonHandler.SetPhotoTimeIntervalSettings = SetPhotoTimeIntervalSettings; s_commonHandler.SetPhotoTimeIntervalSettings = SetPhotoTimeIntervalSettings;//控制相机定时拍照变量s_cameraPhotoTimeIntervalSettings有啥用
s_commonHandler.GetPhotoTimeIntervalSettings = GetPhotoTimeIntervalSettings; s_commonHandler.GetPhotoTimeIntervalSettings = GetPhotoTimeIntervalSettings;// 读取变量s_cameraPhotoTimeIntervalSettings
s_commonHandler.GetSDCardState = GetSDCardState; s_commonHandler.GetSDCardState = GetSDCardState;//获取SD 卡的当前状态
s_commonHandler.FormatSDCard = FormatSDCard; s_commonHandler.FormatSDCard = FormatSDCard;//SD卡格式化
returnCode = DjiPayloadCamera_RegCommonHandler(&s_commonHandler); returnCode = DjiPayloadCamera_RegCommonHandler(&s_commonHandler);//注册相机类基础功能
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) { if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("camera register common handler error:0x%08llX", returnCode); USER_LOG_ERROR("camera register common handler error:0x%08llX", returnCode);
} }
//注册相机测光功能
/* Register the camera metering handler */ /* Register the camera metering handler */
#if USER_CAMERA_EMU_METERING_ON #if USER_CAMERA_EMU_METERING_ON
s_exposureMeteringHandler.SetMeteringMode = SetMeteringMode; s_exposureMeteringHandler.SetMeteringMode = SetMeteringMode;
@ -1285,15 +1304,16 @@ T_DjiReturnCode DjiTest_CameraEmuBaseStartService(void)
} }
#endif #endif
//注册相机设置对焦功能
/* Register the camera focus handler */ /* Register the camera focus handler */
#if USER_CAMERA_EMU_FOCUS_ON #if USER_CAMERA_EMU_FOCUS_ON
s_focusHandler.SetFocusMode = SetFocusMode; s_focusHandler.SetFocusMode = SetFocusMode;
s_focusHandler.GetFocusMode = GetFocusMode; s_focusHandler.GetFocusMode = GetFocusMode;
s_focusHandler.SetFocusTarget = SetFocusTarget; s_focusHandler.SetFocusTarget = SetFocusTarget;//设置对焦点
s_focusHandler.GetFocusTarget = GetFocusTarget; s_focusHandler.GetFocusTarget = GetFocusTarget;
s_focusHandler.SetFocusAssistantSettings = SetFocusAssistantSettings; s_focusHandler.SetFocusAssistantSettings = SetFocusAssistantSettings;
s_focusHandler.GetFocusAssistantSettings = GetFocusAssistantSettings; s_focusHandler.GetFocusAssistantSettings = GetFocusAssistantSettings;
s_focusHandler.SetFocusRingValue = SetFocusRingValue; s_focusHandler.SetFocusRingValue = SetFocusRingValue;//设置对焦环
s_focusHandler.GetFocusRingValue = GetFocusRingValue; s_focusHandler.GetFocusRingValue = GetFocusRingValue;
s_focusHandler.GetFocusRingValueUpperBound = GetFocusRingValueUpperBound; s_focusHandler.GetFocusRingValueUpperBound = GetFocusRingValueUpperBound;
@ -1304,9 +1324,10 @@ T_DjiReturnCode DjiTest_CameraEmuBaseStartService(void)
} }
#endif #endif
//注册相机数字变焦功能
/* Register the camera digital zoom handler */ /* Register the camera digital zoom handler */
#if USER_CAMERA_EMU_HYBRID_ZOOM_ON #if USER_CAMERA_EMU_HYBRID_ZOOM_ON
s_digitalZoomHandler.SetDigitalZoomFactor = SetDigitalZoomFactor; s_digitalZoomHandler.SetDigitalZoomFactor = SetDigitalZoomFactor;//设置数字变焦因子
s_digitalZoomHandler.GetDigitalZoomFactor = DjiTest_CameraGetDigitalZoomFactor; s_digitalZoomHandler.GetDigitalZoomFactor = DjiTest_CameraGetDigitalZoomFactor;
returnCode = DjiPayloadCamera_RegDigitalZoomHandler(&s_digitalZoomHandler); returnCode = DjiPayloadCamera_RegDigitalZoomHandler(&s_digitalZoomHandler);
@ -1315,12 +1336,13 @@ T_DjiReturnCode DjiTest_CameraEmuBaseStartService(void)
return returnCode; return returnCode;
} }
//注册相机光学变焦功能
/* Register the camera optical zoom handler */ /* Register the camera optical zoom handler */
s_opticalZoomHandler.SetOpticalZoomFocalLength = SetOpticalZoomFocalLength; s_opticalZoomHandler.SetOpticalZoomFocalLength = SetOpticalZoomFocalLength;//设置光学变焦相机的焦距
s_opticalZoomHandler.GetOpticalZoomFocalLength = GetOpticalZoomFocalLength; s_opticalZoomHandler.GetOpticalZoomFocalLength = GetOpticalZoomFocalLength;
s_opticalZoomHandler.GetOpticalZoomFactor = DjiTest_CameraGetOpticalZoomFactor; s_opticalZoomHandler.GetOpticalZoomFactor = DjiTest_CameraGetOpticalZoomFactor;//获取相机类负载设备的变焦系数
s_opticalZoomHandler.GetOpticalZoomSpec = GetOpticalZoomSpec; s_opticalZoomHandler.GetOpticalZoomSpec = GetOpticalZoomSpec;//获取光学变焦的范围
s_opticalZoomHandler.StartContinuousOpticalZoom = StartContinuousOpticalZoom; s_opticalZoomHandler.StartContinuousOpticalZoom = StartContinuousOpticalZoom;//控制相机类负载设备开始变焦
s_opticalZoomHandler.StopContinuousOpticalZoom = StopContinuousOpticalZoom; s_opticalZoomHandler.StopContinuousOpticalZoom = StopContinuousOpticalZoom;
returnCode = DjiPayloadCamera_RegOpticalZoomHandler(&s_opticalZoomHandler); returnCode = DjiPayloadCamera_RegOpticalZoomHandler(&s_opticalZoomHandler);
@ -1330,6 +1352,7 @@ T_DjiReturnCode DjiTest_CameraEmuBaseStartService(void)
} }
#endif #endif
//注册指点变焦功能
/* Register the camera tap zoom handler */ /* Register the camera tap zoom handler */
#if USER_CAMERA_EMU_TAP_ZOOM_ON #if USER_CAMERA_EMU_TAP_ZOOM_ON
s_tapZoomHandler.GetTapZoomState = GetTapZoomState; s_tapZoomHandler.GetTapZoomState = GetTapZoomState;

View File

@ -46,7 +46,7 @@ static T_DjiReturnCode ReceiveDataFromOnboardComputer(const uint8_t *data, uint1
static T_DjiReturnCode ReceiveDataFromPayload(const uint8_t *data, uint16_t len); static T_DjiReturnCode ReceiveDataFromPayload(const uint8_t *data, uint16_t len);
/* Private variables ---------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/
static T_DjiTaskHandle s_userDataTransmissionThread; static T_DjiTaskHandle s_userDataTransmissionThread;//线程句柄
static T_DjiAircraftInfoBaseInfo s_aircraftInfoBaseInfo; static T_DjiAircraftInfoBaseInfo s_aircraftInfoBaseInfo;
/* Exported functions definition ---------------------------------------------*/ /* Exported functions definition ---------------------------------------------*/
@ -72,6 +72,7 @@ T_DjiReturnCode DjiTest_DataTransmissionStartService(void)
return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR; return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR;
} }
//函数ReceiveDataFromMobile能够获取用户在DJI Pilot "文本输入框控件" 中向负载设备发送的信息编码格式为UTF-8
channelAddress = DJI_CHANNEL_ADDRESS_MASTER_RC_APP; channelAddress = DJI_CHANNEL_ADDRESS_MASTER_RC_APP;
djiStat = DjiLowSpeedDataChannel_RegRecvDataCallback(channelAddress, ReceiveDataFromMobile); djiStat = DjiLowSpeedDataChannel_RegRecvDataCallback(channelAddress, ReceiveDataFromMobile);
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) { if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
@ -113,6 +114,7 @@ T_DjiReturnCode DjiTest_DataTransmissionStartService(void)
return DJI_ERROR_SYSTEM_MODULE_CODE_NONSUPPORT; return DJI_ERROR_SYSTEM_MODULE_CODE_NONSUPPORT;
} }
//调用osal层中注册的创建任务的函数来 创建一个任务(在新线程中运行)
if (osalHandler->TaskCreate("user_transmission_task", UserDataTransmission_Task, if (osalHandler->TaskCreate("user_transmission_task", UserDataTransmission_Task,
DATA_TRANSMISSION_TASK_STACK_SIZE, NULL, &s_userDataTransmissionThread) != DATA_TRANSMISSION_TASK_STACK_SIZE, NULL, &s_userDataTransmissionThread) !=
DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) { DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {

View File

@ -349,10 +349,10 @@ static void *UserFcSubscription_Task(void *arg)
USER_LOG_DEBUG("gps TIME: %d.", gpsTime); USER_LOG_DEBUG("gps TIME: %d.", gpsTime);
}//PsdkLogger_UserLogInfo }//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"); printf("开始设置时间\n");
system('date'); system("date");
char *gpsDate_str = (char *)malloc(sizeof(char)*50); char *gpsDate_str = (char *)malloc(sizeof(char)*50);
char *gpsTime_str = (char *)malloc(sizeof(char)*20); char *gpsTime_str = (char *)malloc(sizeof(char)*20);
@ -423,6 +423,7 @@ static void *UserFcSubscription_Task(void *arg)
// printf("command---:%s\n",command); // printf("command---:%s\n",command);
system(command); system(command);
system("echo \"1\" > /media/nvme/300TC/config/timesyncfromdji");
} }
counter++; counter++;

View File

@ -33,9 +33,12 @@
/* Private types -------------------------------------------------------------*/ /* Private types -------------------------------------------------------------*/
/* Private functions declaration ---------------------------------------------*/ /* 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); static T_DjiReturnCode DjiTest_PowerOffNotificationCallback(bool *powerOffPreparationFlag);
/* Private variables ---------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/
//此变量是函数DjiTest_RegApplyHighPowerHandler先判断然后内存拷贝过来的
static T_DjiTestApplyHighPowerHandler s_applyHighPowerHandler; static T_DjiTestApplyHighPowerHandler s_applyHighPowerHandler;
/* Exported functions definition ---------------------------------------------*/ /* Exported functions definition ---------------------------------------------*/
@ -48,6 +51,9 @@ static T_DjiTestApplyHighPowerHandler s_applyHighPowerHandler;
*/ */
T_DjiReturnCode DjiTest_RegApplyHighPowerHandler(T_DjiTestApplyHighPowerHandler *applyHighPowerHandler) T_DjiReturnCode DjiTest_RegApplyHighPowerHandler(T_DjiTestApplyHighPowerHandler *applyHighPowerHandler)
{ {
//此函数的功能:验证这两个函数指针指向的函数是否可用 → 结构体T_PsdkTestApplyHighPowerHandler中有两个函数指针分别为pinInit和pinWrite
//1、先判断两个函数指针是否为空如果为空就报错
if (applyHighPowerHandler->pinInit == NULL) { if (applyHighPowerHandler->pinInit == NULL) {
USER_LOG_ERROR("reg apply high power handler pinInit error"); USER_LOG_ERROR("reg apply high power handler pinInit error");
return DJI_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER; 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; return DJI_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
} }
//2、如果不为空就内存拷贝到本文件的静态变量中
memcpy(&s_applyHighPowerHandler, applyHighPowerHandler, sizeof(T_DjiTestApplyHighPowerHandler)); memcpy(&s_applyHighPowerHandler, applyHighPowerHandler, sizeof(T_DjiTestApplyHighPowerHandler));
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS; return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
@ -72,6 +79,10 @@ T_DjiReturnCode DjiTest_RegApplyHighPowerHandler(T_DjiTestApplyHighPowerHandler
*/ */
T_DjiReturnCode DjiTest_PowerManagementStartService(void) T_DjiReturnCode DjiTest_PowerManagementStartService(void)
{ {
//此函数的功能:
//1、申请高功率。如果要申请高功率需要在执行本函数前先执行DjiTest_RegApplyHighPowerHandler函数
//2、负载设备关机前需要执行的操作
T_DjiReturnCode returnCode; T_DjiReturnCode returnCode;
T_DjiAircraftInfoBaseInfo baseInfo = {0}; 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_SKYPORT_V2 ||
baseInfo.djiAdapterType == DJI_SDK_ADAPTER_TYPE_XPORT)) { baseInfo.djiAdapterType == DJI_SDK_ADAPTER_TYPE_XPORT)) {
// apply high power // apply high power
//如果函数指针为空没有指向函数就返回错误代码DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN
if (s_applyHighPowerHandler.pinInit == NULL) { if (s_applyHighPowerHandler.pinInit == NULL) {
USER_LOG_ERROR("apply high power pin init interface is NULL error"); USER_LOG_ERROR("apply high power pin init interface is NULL error");
return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN; return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
@ -102,18 +114,21 @@ T_DjiReturnCode DjiTest_PowerManagementStartService(void)
return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN; return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
} }
//如果函数指针不为空(指向了一个函数),就执行函数,并根据返回值判断是否成功
returnCode = s_applyHighPowerHandler.pinInit(); returnCode = s_applyHighPowerHandler.pinInit();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) { if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("apply high power pin init error"); USER_LOG_ERROR("apply high power pin init error");
return returnCode; return returnCode;
} }
//注册高电压返回函数
returnCode = DjiPowerManagement_RegWriteHighPowerApplyPinCallback(s_applyHighPowerHandler.pinWrite); returnCode = DjiPowerManagement_RegWriteHighPowerApplyPinCallback(s_applyHighPowerHandler.pinWrite);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) { if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("register WriteHighPowerApplyPinCallback error."); USER_LOG_ERROR("register WriteHighPowerApplyPinCallback error.");
return returnCode; return returnCode;
} }
//执行高电压请求
returnCode = DjiPowerManagement_ApplyHighPowerSync(); returnCode = DjiPowerManagement_ApplyHighPowerSync();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) { if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("apply high power error"); USER_LOG_ERROR("apply high power error");
@ -122,6 +137,7 @@ T_DjiReturnCode DjiTest_PowerManagementStartService(void)
} }
// register power off notification callback function // register power off notification callback function
//负载设备关机前需要执行的操作
returnCode = DjiPowerManagement_RegPowerOffNotificationCallback(DjiTest_PowerOffNotificationCallback); returnCode = DjiPowerManagement_RegPowerOffNotificationCallback(DjiTest_PowerOffNotificationCallback);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) { if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("register power off notification callback function error"); USER_LOG_ERROR("register power off notification callback function error");
@ -145,6 +161,7 @@ T_DjiReturnCode DjiTest_PowerManagementStopService(void)
} }
/* Private functions definition-----------------------------------------------*/ /* Private functions definition-----------------------------------------------*/
//详细说明见函数申明处
static T_DjiReturnCode DjiTest_PowerOffNotificationCallback(bool *powerOffPreparationFlag) static T_DjiReturnCode DjiTest_PowerOffNotificationCallback(bool *powerOffPreparationFlag)
{ {
USER_LOG_INFO("aircraft will power off soon."); USER_LOG_INFO("aircraft will power off soon.");

View File

@ -39,6 +39,8 @@ extern "C" {
/* Exported types ------------------------------------------------------------*/ /* Exported types ------------------------------------------------------------*/
//里面的两个函数指针例子见下方网页中PsdkTest_HighPowerApplyPinInit + PsdkTest_WriteHighPowerApplyPin
//https://developer.dji.com/doc/payload-sdk-tutorial/cn/function-set/basic-function/power-management.html
typedef struct { typedef struct {
T_DjiReturnCode (*pinInit)(void); T_DjiReturnCode (*pinInit)(void);
T_DjiReturnCode (*pinWrite)(E_DjiPowerManagementPinState pinState); T_DjiReturnCode (*pinWrite)(E_DjiPowerManagementPinState pinState);

View File

@ -44,7 +44,7 @@ T_DjiRunTimeStamps DjiUtilTime_GetRunTimeStamps(void)
struct rusage rusage; struct rusage rusage;
struct timespec ts; 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; timeStamps.realUsec = (uint64_t) ts.tv_sec * 1000000 + ts.tv_nsec / 1000;
getrusage(RUSAGE_SELF, &rusage); getrusage(RUSAGE_SELF, &rusage);

View File

@ -53,6 +53,7 @@ static T_DjiReturnCode PsdkTestWidget_SetWidgetValue_StartRecord(E_DjiWidgetType
void *userData); void *userData);
static void *PsdkTest_IrisRecordSystemChanged(void *arg); static void *PsdkTest_IrisRecordSystemChanged(void *arg);
static void extractSpectralBinAndBandnumber(bool isModifyBin);
/* Private values ------------------------------------------------------------*/ /* Private values ------------------------------------------------------------*/
static T_DjiTaskHandle s_widgetTestThread; static T_DjiTaskHandle s_widgetTestThread;
@ -73,23 +74,33 @@ static int s_stateOfSbg=0;
static int s_stateOfFile=0; static int s_stateOfFile=0;
//0ximeaAirborneSystem系统未就绪不可启动1ximeaAirborneSystem系统就绪可以启动 //0ximeaAirborneSystem系统未就绪不可启动1ximeaAirborneSystem系统就绪可以启动
//2ximeaAirborneSystem系统正在启动3ximeaAirborneSystem系统启动成功4系统已经关闭,并且不能再次启动 //2ximeaAirborneSystem系统正在启动3ximeaAirborneSystem系统启动成功4系统已经关闭
int systemON_Control = 0; int systemON_Control = 0;
char s_strUIMessage[100]=" "; char s_strUIMessage[100]=" ";
static char * s_strStateOfSbg="None"; static char * s_strStateOfSbg=" ";
static char * s_strSbgSatelliteCounter="None"; static char * s_strSbgSatelliteCounter=" ";
static char * s_strSbgAccuracy="None"; static char * s_strSbgAccuracy=" ";
char XimeaFramerate[100]=" "; char XimeaFramerate[100]=" ";
int framerate = 0;
char XimeaExposeTime[100]=" "; char XimeaExposeTime[100]=" ";
char XimeaExposeMaxValue[100]=" "; char XimeaExposeMaxValue[100]=" ";
char spectralBin[100]="None"; char s_spectralBin[100]=" ";
static char * s_strSbgSolutionMode="None"; int spectralBinInt = 0;
static char * s_strStateOfXimea="None"; static char * s_strSbgSolutionMode=" ";
static char * s_strStateOfXimea=" ";
char * s_strPitch="None"; char * s_strPitch=" ";
char * s_strRoll="None"; char * s_strRoll=" ";
char * s_strYaw="None"; 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 int s_sockfd;
static struct sockaddr_in s_server; static struct sockaddr_in s_server;
@ -152,6 +163,7 @@ T_DjiReturnCode DjiTest_WidgetStartService(void)
snprintf(tempPath, WIDGET_DIR_PATH_LEN_MAX, "%swidget_file/en_big_screen", s_widgetFileDirPath); snprintf(tempPath, WIDGET_DIR_PATH_LEN_MAX, "%swidget_file/en_big_screen", s_widgetFileDirPath);
} else { } else {
snprintf(tempPath, WIDGET_DIR_PATH_LEN_MAX, "%swidget_file/en_big_screen", curFileDirPath); 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 //set default ui config path
@ -176,6 +188,7 @@ T_DjiReturnCode DjiTest_WidgetStartService(void)
snprintf(tempPath, WIDGET_DIR_PATH_LEN_MAX, "%swidget_file/cn_big_screen", s_widgetFileDirPath); snprintf(tempPath, WIDGET_DIR_PATH_LEN_MAX, "%swidget_file/cn_big_screen", s_widgetFileDirPath);
} else { } else {
snprintf(tempPath, WIDGET_DIR_PATH_LEN_MAX, "%swidget_file/cn_big_screen", curFileDirPath); 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, djiStat = DjiWidget_RegUiConfigByDirPath(DJI_MOBILE_APP_LANGUAGE_CHINESE,
@ -213,10 +226,9 @@ T_DjiReturnCode DjiTest_WidgetStartService(void)
return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN; return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
} }
//Step 5 : Run ximea task //Step 5 : Run ximea task
if (osalHandler->TaskCreate("ximea", PsdkTest_IrisRecordSystemChanged, WIDGET_TASK_STACK_SIZE, NULL, 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."); USER_LOG_ERROR("Psdk widget test task(ximea) create error.");
return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN; return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
} }
@ -273,6 +285,8 @@ static void *DjiTest_WidgetTask(void *arg)
T_DjiReturnCode djiStat; T_DjiReturnCode djiStat;
T_DjiOsalHandler *osalHandler = DjiPlatform_GetOsalHandler(); T_DjiOsalHandler *osalHandler = DjiPlatform_GetOsalHandler();
extractSpectralBinAndBandnumber(false);
USER_UTIL_UNUSED(arg); USER_UTIL_UNUSED(arg);
while (1) { while (1) {
@ -282,8 +296,8 @@ static void *DjiTest_WidgetTask(void *arg)
} }
#ifndef USER_FIRMWARE_MAJOR_VERSION #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", snprintf(message, DJI_WIDGET_FLOATING_WINDOW_MSG_MAX_LEN, "%s\n高光谱: %s; 惯导: %s;\n卫星: %s; 惯导状态: %s;\n帧率: %s;曝光: %s;max: %s;\nP: %s; R: %s; Y: %s;\n光谱bin: %s;\n时间: %s min; 空间: %s G;\n",
s_strUIMessage, s_strStateOfXimea, s_strStateOfSbg, s_strSbgSatelliteCounter, s_strSbgAccuracy, XimeaFramerate, XimeaExposeTime, XimeaExposeMaxValue, s_strPitch, s_strRoll, s_strYaw, spectralBin); s_strUIMessage, s_strStateOfXimea, s_strStateOfSbg, s_strSbgSatelliteCounter, s_strSbgSolutionMode, XimeaFramerate, XimeaExposeTime, XimeaExposeMaxValue, s_strPitch, s_strRoll, s_strYaw, s_spectralBin, s_remainingTime, s_remainingSpace);
#else #else
snprintf(message, DJI_WIDGET_FLOATING_WINDOW_MSG_MAX_LEN, 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, "System time : %u ms\r\nVersion: v%02d.%02d.%02d.%02d\r\nBuild time: %s %s", sysTimeMs,
@ -306,6 +320,54 @@ static void *DjiTest_WidgetTask(void *arg)
strcpy(s_strUIMessage," "); strcpy(s_strUIMessage," ");
} }
char buffer[128];
FILE *fp;
// 获取剩余硬盘空间和剩余采集时间
fp = popen("df --output=avail --block-size=1 /media/nvme | tail -n 1", "r");
if (fp == NULL) {
perror("popen");
}
// 读取输出并处理
if (fgets(buffer, sizeof(buffer), fp) != NULL)
{
// printf("当前字符串-----: %s \n", buffer);
// 将输出转换为数值
unsigned long long availableBytes = strtoull(buffer, NULL, 10);
// 转换为MB
double availableMB = availableBytes / (1024.0 * 1024.0);
sprintf(remainingSpaceTmp, "%.0f", availableMB/1024);
s_remainingSpace = remainingSpaceTmp;
if (spectralBinInt!=0 && framerate!=0)
{
double frameSize;
if (spectralBinInt==1)
{
frameSize = 0.783;
}
else
{
frameSize = 0.783/2;
}
double minTemp = availableMB / (frameSize * framerate * 60);
sprintf(remainingTimeTmp, "%.0f", minTemp);
s_remainingTime = remainingTimeTmp;
// 打印结果
// printf("Available space: %.2f MB;\n", availableMB);
// printf("remainint time of record:%.2f;\n", temp);
}
}
// 关闭文件指针
pclose(fp);
//判断ximeaAirborneSystem系统是否存活 //判断ximeaAirborneSystem系统是否存活
// if(ximeaAirborneSystemSurvivalTime > 10) // if(ximeaAirborneSystemSurvivalTime > 10)
// { // {
@ -381,14 +443,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)); //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[0] = strtok( buf, "," );
result[1] = strtok( NULL, "," ); result[1] = strtok( NULL, "," );
result[2] = strtok( NULL, "," ); result[2] = strtok( NULL, "," );
result[3] = strtok( NULL, "," );
result[4] = strtok( NULL, "," );
// printf("result[0]: %s\n", result[0]); printf("result[0]: %s\n", result[0]);
// printf("result[1]: %s\n\n", result[1]); printf("result[1]: %s\n\n", result[1]);
// printf("result[2]: %s\n\n", result[2]); 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) if (strcmp(result[0],"sbg") == 0)
@ -401,7 +467,7 @@ static void *PsdkTest_IrisRecordSystemChanged(void *arg)//
case 0: case 0:
s_strStateOfSbg="未打开"; s_strStateOfSbg="未打开";
if (systemON_Control == 0) if (systemON_Control == 0 || systemON_Control == 4)
{ {
strcpy(s_strUIMessage,"系统已就绪!"); strcpy(s_strUIMessage,"系统已就绪!");
messageTimeCounter = 0; messageTimeCounter = 0;
@ -460,36 +526,36 @@ static void *PsdkTest_IrisRecordSystemChanged(void *arg)//
} }
else if (strcmp(result[0],"SolutionMode") == 0) else if (strcmp(result[0],"SolutionMode") == 0)
{ {
// s_sbgMagState = atoi(result[1]); s_sbgMagState = atoi(result[1]);
//
// switch (s_sbgMagState) switch (s_sbgMagState)
// { {
// case 0: case 0:
// s_strSbgSolutionMode="UNINITIALIZED"; s_strSbgSolutionMode="UNINITI";//UNINITIALIZED
// break; break;
// case 1: case 1:
// s_strSbgSolutionMode="VERTICAL_GYRO"; s_strSbgSolutionMode="GYRO";//VERTICAL_GYRO
// break; break;
// case 2: case 2:
// s_strSbgSolutionMode="AHRS"; s_strSbgSolutionMode="AHRS";
// break; break;
// case 3: case 3:
// s_strSbgSolutionMode="NAV_VELOCITY"; s_strSbgSolutionMode="VELOCITY";//NAV_VELOCITY
// break; break;
// case 4: case 4:
// s_strSbgSolutionMode="NAV_POSITION"; s_strSbgSolutionMode="FULL";//NAV_POSITION
// break; break;
//
// default: default:
// break; break;
// } }
} }
else if (strcmp(result[0],"ximea") == 0) else if (strcmp(result[0],"ximea") == 0)
{ {
s_stateOfXimea = atoi(result[1]); s_stateOfXimea = atoi(result[1]);
printf("ximea的状态为: %d\n\n", atoi(result[1])); printf("ximea的状态为: %d\n\n", atoi(result[1]));
switch (s_stateOfXimea)//0-61ximea官方错误代码99发生的ximea官方错误代码没有处理100未打开101打开102设置帧率103自动曝光104正在采集; switch (s_stateOfXimea)//0-61ximea官方错误代码99发生的ximea官方错误代码没有处理100未打开101打开102设置帧率103自动曝光104采集
{ {
case 10: case 10:
s_strStateOfXimea="10"; s_strStateOfXimea="10";
@ -531,13 +597,13 @@ static void *PsdkTest_IrisRecordSystemChanged(void *arg)//
break; break;
case 102: case 102:
s_strStateOfXimea="帧率已设置"; s_strStateOfXimea="帧率完成";
break; break;
case 103: case 103:
s_strStateOfXimea="曝光完成"; s_strStateOfXimea="曝光完成";
break; break;
case 104: case 104:
s_strStateOfXimea="正在采集"; s_strStateOfXimea="采集";
break; break;
default: default:
@ -547,7 +613,10 @@ static void *PsdkTest_IrisRecordSystemChanged(void *arg)//
else if (strcmp(result[0],"XimeaAutoExpose") == 0) else if (strcmp(result[0],"XimeaAutoExpose") == 0)
{ {
strcpy(XimeaExposeMaxValue, result[1]); strcpy(XimeaExposeMaxValue, result[1]);
strcpy(XimeaExposeTime, result[2]);
int exposeTimeTmp = atoi(result[2]);
sprintf(XimeaExposeTime,"%d",exposeTimeTmp);
s_widgetValueList[8] = exposeTimeTmp;
strcpy(s_strUIMessage,"曝光时间设置成功!"); strcpy(s_strUIMessage,"曝光时间设置成功!");
messageTimeCounter = 0; messageTimeCounter = 0;
@ -555,8 +624,9 @@ static void *PsdkTest_IrisRecordSystemChanged(void *arg)//
} }
else if (strcmp(result[0],"XimeaFrameRate") == 0) else if (strcmp(result[0],"XimeaFrameRate") == 0)
{ {
int tmp = atoi(result[1]); framerate = atoi(result[1]);
sprintf(XimeaFramerate,"%d",tmp); s_widgetValueList[6] = framerate;
sprintf(XimeaFramerate,"%d",framerate);
// strcpy(XimeaFramerate,result[1]); // strcpy(XimeaFramerate,result[1]);
strcpy(s_strUIMessage,"帧率设置成功!"); strcpy(s_strUIMessage,"帧率设置成功!");
@ -565,8 +635,7 @@ static void *PsdkTest_IrisRecordSystemChanged(void *arg)//
} }
else if (strcmp(result[0],"bin") == 0) else if (strcmp(result[0],"bin") == 0)
{ {
int spectralBin_tm = atoi(result[2]); spectralBinInt = atoi(result[2]);
sprintf(spectralBin,"%d",spectralBin_tm);
} }
} }
} }
@ -613,7 +682,8 @@ static T_DjiReturnCode PsdkTestWidget_SetWidgetValue_StartRecord(E_DjiWidgetType
case 5://系统启动关闭 case 5://系统启动关闭
if (value==0)//系统关闭 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; messageTimeCounter = 0;
@ -623,17 +693,44 @@ static T_DjiReturnCode PsdkTestWidget_SetWidgetValue_StartRecord(E_DjiWidgetType
sendto(s_sockfd, command,strlen(command),0,(struct sockaddr *)&s_server,sizeof(s_server)); sendto(s_sockfd, command,strlen(command),0,(struct sockaddr *)&s_server,sizeof(s_server));
systemON_Control = 4; systemON_Control = 4;
// sleep(1);//此线程不能睡眠,否则会报很多错误
// char *commandtmp = (char *)malloc(sizeof(char)*100);
// strcat(commandtmp, "kill $(ps aux | grep ximeaAirborneSystem | grep -v grep | awk \'{print $2}\')");
// printf("命令行指令为:%s\n",commandtmp);
// system(commandtmp);
FILE *fp;
fp = popen("kill $(ps aux | grep ximeaAirborneSystem | grep -v grep | awk \'{print $2}\')", "r");
if (fp == NULL)
{
perror("popen");
}
s_strStateOfXimea=" ";
s_strStateOfSbg=" ";
s_strSbgSatelliteCounter=" ";
s_strSbgSolutionMode=" ";
sprintf(XimeaFramerate,"%s"," ");
sprintf(XimeaExposeTime,"%s"," ");
sprintf(XimeaExposeMaxValue,"%s"," ");
sprintf(s_spectralBin,"%s"," ");
s_remainingTime=" ";
s_widgetValueList[6] = 0;
s_widgetValueList[8] = 0;
} }
} }
else if (value==1)//系统启动 else if (value==1)//系统启动
{ {
if (systemON_Control == 0) printf("systemON_Control的值为:%d\n", systemON_Control);
if (systemON_Control == 4)
{ {
strcpy(s_strUIMessage,"请等待系统初始化!"); strcpy(s_strUIMessage,"请等待系统初始化!");
messageTimeCounter = 0; messageTimeCounter = 0;
messageTimespan = 1000; messageTimespan = 1000;
} }
else if (systemON_Control == 1) else if (systemON_Control == 0 || systemON_Control == 1)
{ {
strcpy(s_strUIMessage,"系统启动中,请等待!"); strcpy(s_strUIMessage,"系统启动中,请等待!");
messageTimeCounter = 0; messageTimeCounter = 0;
@ -656,12 +753,6 @@ static T_DjiReturnCode PsdkTestWidget_SetWidgetValue_StartRecord(E_DjiWidgetType
messageTimeCounter = 0; messageTimeCounter = 0;
messageTimespan = 1000; messageTimespan = 1000;
} }
else if (systemON_Control == 4)
{
strcpy(s_strUIMessage,"相机占用,请重新上电!");
messageTimeCounter = 0;
messageTimespan = 1000;
}
} }
break; break;
case 6://设置帧率 case 6://设置帧率
@ -685,9 +776,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; messageTimeCounter = 0;
messageTimespan = 10; messageTimespan = 10;
@ -880,6 +971,8 @@ static T_DjiReturnCode PsdkTestWidget_SetWidgetValue_StartRecord(E_DjiWidgetType
system("sudo sed -i 's/spectralBin =.*/spectralBin = 2;/g' /media/nvme/300TC/config/ximea.cfg"); system("sudo sed -i 's/spectralBin =.*/spectralBin = 2;/g' /media/nvme/300TC/config/ximea.cfg");
} }
extractSpectralBinAndBandnumber(true);
strcpy(s_strUIMessage,"请重新上电!"); strcpy(s_strUIMessage,"请重新上电!");
messageTimeCounter = 0; messageTimeCounter = 0;
messageTimespan = 10000; messageTimespan = 10000;
@ -892,4 +985,66 @@ static T_DjiReturnCode PsdkTestWidget_SetWidgetValue_StartRecord(E_DjiWidgetType
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS; return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
} }
static void extractSpectralBinAndBandnumber(bool isModifyBin)
{
unsigned long long spectralBin, height;
char buffer[128];
FILE *fp;
fp = popen("grep \"spectralBin = \" /media/nvme/300TC/config/ximea.cfg | awk '{print $3}' | tr -d ';'", "r");
if (fp == NULL) {
perror("popen");
}
if (fgets(buffer, sizeof(buffer), fp) != NULL)
{
// printf("当前字符串-----: %s \n", buffer);
spectralBin = strtoull(buffer, NULL, 10);
}
pclose(fp);
if (spectralBin == 1)
{
fp = popen("grep \"height\" /media/nvme/300TC/config/ximea.cfg | head -n 1 | awk '{print $3}' | tr -d ';'", "r");
if (fp == NULL) {
perror("popen");
}
if (fgets(buffer, sizeof(buffer), fp) != NULL)
{
// printf("当前字符串-----: %s \n", buffer);
height = strtoull(buffer, NULL, 10);
}
pclose(fp);
}
else if(spectralBin == 2)
{
fp = popen("grep \"height\" /media/nvme/300TC/config/ximea.cfg | head -n 2 | tail -n 1 | awk '{print $3}' | tr -d ';'", "r");
if (fp == NULL) {
perror("popen");
}
if (fgets(buffer, sizeof(buffer), fp) != NULL)
{
// printf("当前字符串-----: %s \n", buffer);
height = strtoull(buffer, NULL, 10);
}
pclose(fp);
}
char command[256];
memset(command, 0, sizeof(command));
sprintf(command,"sudo sed -i 's/.*bin.*/ \"widget_name\": \"bin%d_%d\",/g' %s", spectralBin, height, jsonPathCn);
// printf("command: %s", command);
system(command);
memset(command, 0, sizeof(command));
sprintf(command,"sudo sed -i 's/.*bin.*/ \"widget_name\": \"bin%d_%d\",/g' %s", spectralBin, height, jsonPathEn);
// printf("command: %s", command);
system(command);
if (!isModifyBin)
{
sprintf(s_spectralBin,"%d_%d", spectralBin, height);
}
}
/****************** (C) COPYRIGHT DJI Innovations *****END OF FILE****/ /****************** (C) COPYRIGHT DJI Innovations *****END OF FILE****/

View File

@ -108,7 +108,7 @@
"widget_index": 6, "widget_index": 6,
"widget_type": "int_input_box", "widget_type": "int_input_box",
"widget_name": "帧率", "widget_name": "帧率",
"int_input_box_hint": "unit:hz" "int_input_box_hint": "单位:hz"
}, },
{ {
"widget_index": 7, "widget_index": 7,
@ -119,12 +119,12 @@
"widget_index": 8, "widget_index": 8,
"widget_type": "int_input_box", "widget_type": "int_input_box",
"widget_name": "曝光时间", "widget_name": "曝光时间",
"int_input_box_hint": "unit:ms" "int_input_box_hint": "单位:毫秒"
}, },
{ {
"widget_index": 9, "widget_index": 9,
"widget_type": "switch", "widget_type": "switch",
"widget_name": "开始采集" "widget_name": "高光谱采集"
}, },
{ {
"widget_index": 10, "widget_index": 10,
@ -132,10 +132,10 @@
"widget_name": "系统指令", "widget_name": "系统指令",
"list_item": [ "list_item": [
{ {
"item_name": "等待指令" "item_name": "其他"
}, },
{ {
"item_name": "重启电脑" "item_name": "重启"
}, },
{ {
"item_name": "关机" "item_name": "关机"
@ -157,7 +157,7 @@
"widget_name": "bin", "widget_name": "bin",
"list_item": [ "list_item": [
{ {
"item_name": "等待指令" "item_name": "其他"
}, },
{ {
"item_name": "光谱1" "item_name": "光谱1"

View File

@ -108,7 +108,7 @@
"widget_index": 6, "widget_index": 6,
"widget_type": "int_input_box", "widget_type": "int_input_box",
"widget_name": "帧率", "widget_name": "帧率",
"int_input_box_hint": "unit:hz" "int_input_box_hint": "单位:hz"
}, },
{ {
"widget_index": 7, "widget_index": 7,
@ -119,12 +119,12 @@
"widget_index": 8, "widget_index": 8,
"widget_type": "int_input_box", "widget_type": "int_input_box",
"widget_name": "曝光时间", "widget_name": "曝光时间",
"int_input_box_hint": "unit:ms" "int_input_box_hint": "单位:毫秒"
}, },
{ {
"widget_index": 9, "widget_index": 9,
"widget_type": "switch", "widget_type": "switch",
"widget_name": "开始采集" "widget_name": "高光谱采集"
}, },
{ {
"widget_index": 10, "widget_index": 10,
@ -132,10 +132,10 @@
"widget_name": "系统指令", "widget_name": "系统指令",
"list_item": [ "list_item": [
{ {
"item_name": "等待指令" "item_name": "其他"
}, },
{ {
"item_name": "重启电脑" "item_name": "重启"
}, },
{ {
"item_name": "关机" "item_name": "关机"
@ -157,7 +157,7 @@
"widget_name": "bin", "widget_name": "bin",
"list_item": [ "list_item": [
{ {
"item_name": "等待指令" "item_name": "其他"
}, },
{ {
"item_name": "光谱1" "item_name": "光谱1"

View File

@ -1,5 +1,5 @@
cmake_minimum_required(VERSION 3.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_C_FLAGS "-pthread -std=gnu99")
set(CMAKE_EXE_LINKER_FLAGS "-pthread") set(CMAKE_EXE_LINKER_FLAGS "-pthread")

View File

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