2023-09-18 20:37:36 +08:00
|
|
|
|
/**
|
|
|
|
|
|
********************************************************************
|
|
|
|
|
|
* @file dji_config_manager.c
|
|
|
|
|
|
* @brief
|
|
|
|
|
|
*
|
|
|
|
|
|
* @copyright (c) 2018 DJI. All rights reserved.
|
|
|
|
|
|
*
|
|
|
|
|
|
* All information contained herein is, and remains, the property of DJI.
|
|
|
|
|
|
* The intellectual and technical concepts contained herein are proprietary
|
|
|
|
|
|
* to DJI and may be covered by U.S. and foreign patents, patents in process,
|
|
|
|
|
|
* and protected by trade secret or copyright law. Dissemination of this
|
|
|
|
|
|
* information, including but not limited to data and other proprietary
|
|
|
|
|
|
* material(s) incorporated within the information, in any form, is strictly
|
|
|
|
|
|
* prohibited without the express written consent of DJI.
|
|
|
|
|
|
*
|
|
|
|
|
|
* If you receive this source code without DJI’s authorization, you may not
|
|
|
|
|
|
* further disseminate the information, and you must immediately remove the
|
|
|
|
|
|
* source code and notify DJI of its removal. DJI reserves the right to pursue
|
|
|
|
|
|
* legal actions against you for any loss(es) or damage(s) caused by your
|
|
|
|
|
|
* failure to do so.
|
|
|
|
|
|
*
|
|
|
|
|
|
*********************************************************************
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
/* Includes ------------------------------------------------------------------*/
|
|
|
|
|
|
#include <utils/util_misc.h>
|
|
|
|
|
|
#include <dji_logger.h>
|
|
|
|
|
|
#include <utils/util_file.h>
|
|
|
|
|
|
#include <dji_aircraft_info.h>
|
|
|
|
|
|
#include "dji_config_manager.h"
|
|
|
|
|
|
#include "utils/cJSON.h"
|
|
|
|
|
|
|
|
|
|
|
|
/* Private constants ---------------------------------------------------------*/
|
|
|
|
|
|
|
|
|
|
|
|
/* Private types -------------------------------------------------------------*/
|
|
|
|
|
|
|
|
|
|
|
|
/* Private values -------------------------------------------------------------*/
|
|
|
|
|
|
static T_DjiUserInfo s_configManagerUserInfo = {0};
|
|
|
|
|
|
static T_DjiUserLinkConfig s_configManagerLinkInfo = {0};
|
|
|
|
|
|
static bool s_configManagerIsEnable = false;
|
|
|
|
|
|
|
|
|
|
|
|
/* Private functions declaration ---------------------------------------------*/
|
|
|
|
|
|
static T_DjiReturnCode DjiUserConfigManager_GetAppInfoInner(const char *path, T_DjiUserInfo *userInfo);
|
|
|
|
|
|
static T_DjiReturnCode DjiUserConfigManager_GetLinkConfigInner(const char *path, T_DjiUserLinkConfig *linkConfig);
|
|
|
|
|
|
|
|
|
|
|
|
/* Exported functions definition ---------------------------------------------*/
|
|
|
|
|
|
T_DjiReturnCode DjiUserConfigManager_LoadConfiguration(const char *path)
|
|
|
|
|
|
{
|
|
|
|
|
|
T_DjiReturnCode returnCode;
|
|
|
|
|
|
|
|
|
|
|
|
if (path == NULL) {
|
2024-04-07 16:23:51 +08:00
|
|
|
|
perror("Config file path is null.\n");
|
|
|
|
|
|
return DJI_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
|
2023-09-18 20:37:36 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2024-04-07 16:23:51 +08:00
|
|
|
|
printf("Load configuration start, config file path is: %s\r\n", path);
|
2023-09-18 20:37:36 +08:00
|
|
|
|
|
2024-04-07 16:23:51 +08:00
|
|
|
|
returnCode = DjiUserConfigManager_GetAppInfoInner(path, &s_configManagerUserInfo);
|
2023-09-18 20:37:36 +08:00
|
|
|
|
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
|
|
|
|
|
|
perror("Get app info failed.\n");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-04-07 16:23:51 +08:00
|
|
|
|
returnCode = DjiUserConfigManager_GetLinkConfigInner(path, &s_configManagerLinkInfo);
|
2023-09-18 20:37:36 +08:00
|
|
|
|
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
|
|
|
|
|
|
perror("Get link info failed.\n");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
printf("\r\nLoad configuration successfully.\r\n");
|
|
|
|
|
|
|
|
|
|
|
|
s_configManagerIsEnable = true;
|
|
|
|
|
|
|
|
|
|
|
|
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void DjiUserConfigManager_GetAppInfo(T_DjiUserInfo *userInfo)
|
|
|
|
|
|
{
|
|
|
|
|
|
memcpy(userInfo, &s_configManagerUserInfo, sizeof(T_DjiUserInfo));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void DjiUserConfigManager_GetLinkConfig(T_DjiUserLinkConfig *linkConfig)
|
|
|
|
|
|
{
|
|
|
|
|
|
memcpy(linkConfig, &s_configManagerLinkInfo, sizeof(T_DjiUserLinkConfig));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool DjiUserConfigManager_IsEnable(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
return s_configManagerIsEnable;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* Private functions definition-----------------------------------------------*/
|
|
|
|
|
|
static T_DjiReturnCode DjiUserConfigManager_GetAppInfoInner(const char *path, T_DjiUserInfo *userInfo)
|
|
|
|
|
|
{
|
|
|
|
|
|
T_DjiReturnCode returnCode;
|
|
|
|
|
|
uint32_t fileSize = 0;
|
|
|
|
|
|
uint32_t readRealSize = 0;
|
|
|
|
|
|
T_DjiOsalHandler *osalHandler = DjiPlatform_GetOsalHandler();
|
|
|
|
|
|
uint8_t *jsonData = NULL;
|
|
|
|
|
|
cJSON *jsonRoot = NULL;
|
|
|
|
|
|
cJSON *jsonItem = NULL;
|
|
|
|
|
|
cJSON *jsonValue = NULL;
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef SYSTEM_ARCH_LINUX
|
|
|
|
|
|
returnCode = UtilFile_GetFileSizeByPath(path, &fileSize);
|
|
|
|
|
|
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
|
|
|
|
|
|
USER_LOG_ERROR("Get file size by path failed, stat = 0x%08llX", returnCode);
|
|
|
|
|
|
return returnCode;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
USER_LOG_DEBUG("Get config json file size is %d", fileSize);
|
|
|
|
|
|
|
|
|
|
|
|
jsonData = osalHandler->Malloc(fileSize + 1);
|
|
|
|
|
|
if (jsonData == NULL) {
|
|
|
|
|
|
USER_LOG_ERROR("Malloc failed.");
|
|
|
|
|
|
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-10-31 22:16:41 +08:00
|
|
|
|
memset(jsonData, 0, fileSize);
|
|
|
|
|
|
|
2023-09-18 20:37:36 +08:00
|
|
|
|
UtilFile_GetFileDataByPath(path, 0, fileSize, jsonData, &readRealSize);
|
|
|
|
|
|
|
|
|
|
|
|
jsonData[readRealSize] = '\0';
|
|
|
|
|
|
|
|
|
|
|
|
jsonRoot = cJSON_Parse((char *) jsonData);
|
|
|
|
|
|
if (jsonRoot == NULL) {
|
2024-04-07 16:23:51 +08:00
|
|
|
|
returnCode = DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
|
|
|
|
|
|
goto jsonDataFree;
|
2023-09-18 20:37:36 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
jsonItem = cJSON_GetObjectItem(jsonRoot, "dji_sdk_app_info");
|
|
|
|
|
|
if (jsonItem != NULL) {
|
|
|
|
|
|
jsonValue = cJSON_GetObjectItem(jsonItem, "user_app_name");
|
|
|
|
|
|
if (jsonValue != NULL) {
|
|
|
|
|
|
strcpy(userInfo->appName, jsonValue->valuestring);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
jsonValue = cJSON_GetObjectItem(jsonItem, "user_app_id");
|
|
|
|
|
|
if (jsonValue != NULL) {
|
|
|
|
|
|
strcpy(userInfo->appId, jsonValue->valuestring);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
jsonValue = cJSON_GetObjectItem(jsonItem, "user_app_key");
|
|
|
|
|
|
if (jsonValue != NULL) {
|
|
|
|
|
|
strcpy(userInfo->appKey, jsonValue->valuestring);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
jsonValue = cJSON_GetObjectItem(jsonItem, "user_app_license");
|
|
|
|
|
|
if (jsonValue != NULL) {
|
|
|
|
|
|
strcpy(userInfo->appLicense, jsonValue->valuestring);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
jsonValue = cJSON_GetObjectItem(jsonItem, "user_develop_account");
|
|
|
|
|
|
if (jsonValue != NULL) {
|
|
|
|
|
|
strcpy(userInfo->developerAccount, jsonValue->valuestring);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
jsonValue = cJSON_GetObjectItem(jsonItem, "user_baud_rate");
|
|
|
|
|
|
if (jsonValue != NULL) {
|
|
|
|
|
|
strcpy(userInfo->baudRate, jsonValue->valuestring);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (strlen(userInfo->appName) >= sizeof(userInfo->appName) ||
|
|
|
|
|
|
strlen(userInfo->appId) > sizeof(userInfo->appId) ||
|
|
|
|
|
|
strlen(userInfo->appKey) > sizeof(userInfo->appKey) ||
|
|
|
|
|
|
strlen(userInfo->appLicense) > sizeof(userInfo->appLicense) ||
|
|
|
|
|
|
strlen(userInfo->developerAccount) >= sizeof(userInfo->developerAccount) ||
|
|
|
|
|
|
strlen(userInfo->baudRate) > sizeof(userInfo->baudRate)) {
|
|
|
|
|
|
USER_LOG_ERROR("Length of user information string is beyond limit. Please check.");
|
2024-04-07 16:23:51 +08:00
|
|
|
|
returnCode = DJI_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
|
|
|
|
|
|
goto jsonDataFree;
|
2023-09-18 20:37:36 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (!strcmp(userInfo->appName, "your_app_name") ||
|
|
|
|
|
|
!strcmp(userInfo->appId, "your_app_id") ||
|
|
|
|
|
|
!strcmp(userInfo->appKey, "your_app_key") ||
|
|
|
|
|
|
!strcmp(userInfo->appLicense, "your_app_license") ||
|
|
|
|
|
|
!strcmp(userInfo->developerAccount, "your_developer_account") ||
|
|
|
|
|
|
!strcmp(userInfo->baudRate, "your_baud_rate")) {
|
|
|
|
|
|
USER_LOG_ERROR(
|
|
|
|
|
|
"Please fill in correct user information to 'samples/sample_c++/platform/linux/manifold2/application/dji_sdk_config.json' file.");
|
2024-04-07 16:23:51 +08:00
|
|
|
|
returnCode = DJI_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
|
|
|
|
|
|
goto jsonDataFree;
|
2023-09-18 20:37:36 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2024-04-07 16:23:51 +08:00
|
|
|
|
jsonDataFree:
|
2023-09-18 20:37:36 +08:00
|
|
|
|
osalHandler->Free(jsonData);
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static T_DjiReturnCode DjiUserConfigManager_GetLinkConfigInner(const char *path, T_DjiUserLinkConfig *linkConfig)
|
|
|
|
|
|
{
|
|
|
|
|
|
T_DjiReturnCode returnCode;
|
|
|
|
|
|
uint32_t fileSize = 0;
|
|
|
|
|
|
uint32_t readRealSize = 0;
|
|
|
|
|
|
T_DjiOsalHandler *osalHandler = DjiPlatform_GetOsalHandler();
|
|
|
|
|
|
uint8_t *jsonData = NULL;
|
|
|
|
|
|
cJSON *jsonRoot = NULL;
|
|
|
|
|
|
cJSON *jsonItem = NULL;
|
|
|
|
|
|
cJSON *jsonValue = NULL;
|
|
|
|
|
|
cJSON *jsonConfig = NULL;
|
|
|
|
|
|
int32_t configValue;
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef SYSTEM_ARCH_LINUX
|
|
|
|
|
|
|
|
|
|
|
|
returnCode = UtilFile_GetFileSizeByPath(path, &fileSize);
|
|
|
|
|
|
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
|
|
|
|
|
|
USER_LOG_ERROR("Get file size by path failed, stat = 0x%08llX", returnCode);
|
|
|
|
|
|
return returnCode;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
USER_LOG_DEBUG("Get config json file size is %d", fileSize);
|
|
|
|
|
|
|
|
|
|
|
|
jsonData = osalHandler->Malloc(fileSize + 1);
|
|
|
|
|
|
if (jsonData == NULL) {
|
|
|
|
|
|
USER_LOG_ERROR("Malloc failed.");
|
|
|
|
|
|
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-10-31 22:16:41 +08:00
|
|
|
|
memset(jsonData, 0, fileSize);
|
|
|
|
|
|
|
2023-09-18 20:37:36 +08:00
|
|
|
|
UtilFile_GetFileDataByPath(path, 0, fileSize, jsonData, &readRealSize);
|
|
|
|
|
|
|
|
|
|
|
|
jsonData[readRealSize] = '\0';
|
|
|
|
|
|
|
|
|
|
|
|
jsonRoot = cJSON_Parse((char *) jsonData);
|
|
|
|
|
|
if (jsonRoot == NULL) {
|
|
|
|
|
|
goto jsonDataFree;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
jsonItem = cJSON_GetObjectItem(jsonRoot, "dji_sdk_link_config");
|
|
|
|
|
|
if (jsonItem != NULL) {
|
|
|
|
|
|
jsonValue = cJSON_GetObjectItem(jsonItem, "link_select");
|
|
|
|
|
|
if (jsonValue != NULL) {
|
|
|
|
|
|
printf("\r\nSelect link type: %s\r\n", jsonValue->valuestring);
|
|
|
|
|
|
if (strcmp(jsonValue->valuestring, "use_only_uart") == 0) {
|
|
|
|
|
|
linkConfig->type = DJI_USER_LINK_CONFIG_USE_ONLY_UART;
|
|
|
|
|
|
} else if (strcmp(jsonValue->valuestring, "use_uart_and_network_device") == 0) {
|
|
|
|
|
|
linkConfig->type = DJI_USER_LINK_CONFIG_USE_UART_AND_NETWORK_DEVICE;
|
|
|
|
|
|
} else if (strcmp(jsonValue->valuestring, "use_uart_and_usb_bulk_device") == 0) {
|
|
|
|
|
|
linkConfig->type = DJI_USER_LINK_CONFIG_USE_UART_AND_USB_BULK_DEVICE;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
jsonValue = cJSON_GetObjectItem(jsonItem, "uart_config");
|
|
|
|
|
|
if (jsonValue != NULL) {
|
|
|
|
|
|
jsonConfig = cJSON_GetObjectItem(jsonValue, "uart1_device_name");
|
|
|
|
|
|
printf("\r\nConfig uart1 device name: %s\r\n", jsonConfig->valuestring);
|
|
|
|
|
|
strcpy(linkConfig->uartConfig.uart1DeviceName, jsonConfig->valuestring);
|
|
|
|
|
|
|
|
|
|
|
|
jsonConfig = cJSON_GetObjectItem(jsonValue, "uart2_device_name");
|
|
|
|
|
|
printf("Config uart2 device name: %s\r\n", jsonConfig->valuestring);
|
|
|
|
|
|
strcpy(linkConfig->uartConfig.uart2DeviceName, jsonConfig->valuestring);
|
|
|
|
|
|
|
|
|
|
|
|
jsonConfig = cJSON_GetObjectItem(jsonValue, "uart2_device_enable");
|
|
|
|
|
|
printf("Config uart2 device enable: %s\r\n", jsonConfig->valuestring);
|
|
|
|
|
|
if (strcmp(jsonConfig->valuestring, "true") == 0) {
|
|
|
|
|
|
linkConfig->uartConfig.uart2DeviceEnable = true;
|
|
|
|
|
|
} else {
|
|
|
|
|
|
linkConfig->uartConfig.uart2DeviceEnable = false;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
jsonValue = cJSON_GetObjectItem(jsonItem, "network_config");
|
|
|
|
|
|
if (jsonValue != NULL) {
|
|
|
|
|
|
jsonConfig = cJSON_GetObjectItem(jsonValue, "network_device_name");
|
|
|
|
|
|
printf("\r\nConfig network device name: %s\r\n", jsonConfig->valuestring);
|
|
|
|
|
|
strcpy(linkConfig->networkConfig.networkDeviceName, jsonConfig->valuestring);
|
|
|
|
|
|
|
|
|
|
|
|
jsonConfig = cJSON_GetObjectItem(jsonValue, "network_usb_adapter_vid");
|
|
|
|
|
|
printf("Config network usb adapter vid: %s\r\n", jsonConfig->valuestring);
|
|
|
|
|
|
sscanf(jsonConfig->valuestring, "%X", &configValue);
|
|
|
|
|
|
linkConfig->networkConfig.networkUsbAdapterVid = configValue;
|
|
|
|
|
|
|
|
|
|
|
|
jsonConfig = cJSON_GetObjectItem(jsonValue, "network_usb_adapter_pid");
|
|
|
|
|
|
printf("Config network usb adapter vid: %s\r\n", jsonConfig->valuestring);
|
|
|
|
|
|
sscanf(jsonConfig->valuestring, "%X", &configValue);
|
|
|
|
|
|
linkConfig->networkConfig.networkUsbAdapterPid = configValue;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
jsonValue = cJSON_GetObjectItem(jsonItem, "usb_bulk_config");
|
|
|
|
|
|
if (jsonValue != NULL) {
|
|
|
|
|
|
jsonConfig = cJSON_GetObjectItem(jsonValue, "usb_device_vid");
|
|
|
|
|
|
printf("\r\nConfig usb device vid: %s\r\n", jsonConfig->valuestring);
|
|
|
|
|
|
sscanf(jsonConfig->valuestring, "%X", &configValue);
|
|
|
|
|
|
linkConfig->usbBulkConfig.usbDeviceVid = configValue;
|
|
|
|
|
|
|
|
|
|
|
|
jsonConfig = cJSON_GetObjectItem(jsonValue, "usb_device_pid");
|
|
|
|
|
|
printf("Config usb device pid: %s\r\n", jsonConfig->valuestring);
|
|
|
|
|
|
sscanf(jsonConfig->valuestring, "%X", &configValue);
|
|
|
|
|
|
linkConfig->usbBulkConfig.usbDevicePid = configValue;
|
|
|
|
|
|
|
|
|
|
|
|
jsonConfig = cJSON_GetObjectItem(jsonValue, "usb_bulk1_device_name");
|
|
|
|
|
|
printf("Config usb bulk1 device name: %s\r\n", jsonConfig->valuestring);
|
|
|
|
|
|
strcpy(linkConfig->usbBulkConfig.usbBulk1DeviceName, jsonConfig->valuestring);
|
|
|
|
|
|
|
|
|
|
|
|
jsonConfig = cJSON_GetObjectItem(jsonValue, "usb_bulk1_interface_num");
|
|
|
|
|
|
printf("Config usb bulk1 interface num: %s\r\n", jsonConfig->valuestring);
|
|
|
|
|
|
sscanf(jsonConfig->valuestring, "%X", &configValue);
|
|
|
|
|
|
linkConfig->usbBulkConfig.usbBulk1InterfaceNum = configValue;
|
|
|
|
|
|
|
|
|
|
|
|
jsonConfig = cJSON_GetObjectItem(jsonValue, "usb_bulk1_endpoint_in");
|
|
|
|
|
|
printf("Config usb bulk1 endpoint in: %s\r\n", jsonConfig->valuestring);
|
|
|
|
|
|
sscanf(jsonConfig->valuestring, "%X", &configValue);
|
|
|
|
|
|
linkConfig->usbBulkConfig.usbBulk1EndpointIn = configValue;
|
|
|
|
|
|
|
|
|
|
|
|
jsonConfig = cJSON_GetObjectItem(jsonValue, "usb_bulk1_endpoint_out");
|
|
|
|
|
|
printf("Config usb bulk1 endpoint out: %s\r\n", jsonConfig->valuestring);
|
|
|
|
|
|
sscanf(jsonConfig->valuestring, "%X", &configValue);
|
|
|
|
|
|
linkConfig->usbBulkConfig.usbBulk1EndpointOut = configValue;
|
|
|
|
|
|
|
|
|
|
|
|
jsonConfig = cJSON_GetObjectItem(jsonValue, "usb_bulk2_device_name");
|
|
|
|
|
|
printf("Config usb bulk2 device name: %s\r\n", jsonConfig->valuestring);
|
|
|
|
|
|
strcpy(linkConfig->usbBulkConfig.usbBulk2DeviceName, jsonConfig->valuestring);
|
|
|
|
|
|
|
|
|
|
|
|
jsonConfig = cJSON_GetObjectItem(jsonValue, "usb_bulk2_interface_num");
|
|
|
|
|
|
printf("Config usb bulk2 interface num: %s\r\n", jsonConfig->valuestring);
|
|
|
|
|
|
sscanf(jsonConfig->valuestring, "%X", &configValue);
|
|
|
|
|
|
linkConfig->usbBulkConfig.usbBulk2InterfaceNum = configValue;
|
|
|
|
|
|
|
|
|
|
|
|
jsonConfig = cJSON_GetObjectItem(jsonValue, "usb_bulk2_endpoint_in");
|
|
|
|
|
|
printf("Config usb bulk2 endpoint in: %s\r\n", jsonConfig->valuestring);
|
|
|
|
|
|
linkConfig->usbBulkConfig.usbBulk2EndpointIn = configValue;
|
|
|
|
|
|
|
|
|
|
|
|
jsonConfig = cJSON_GetObjectItem(jsonValue, "usb_bulk2_endpoint_out");
|
|
|
|
|
|
printf("Config usb bulk2 endpoint out: %s\r\n", jsonConfig->valuestring);
|
|
|
|
|
|
linkConfig->usbBulkConfig.usbBulk2EndpointOut = configValue;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
jsonDataFree:
|
|
|
|
|
|
osalHandler->Free(jsonData);
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/****************** (C) COPYRIGHT DJI Innovations *****END OF FILE****/
|