test_widget.c 15.9 KB
/**
 ********************************************************************
 * @file    test_widget.c
 * @brief
 *
 * @copyright (c) 2021 DJI. All rights reserved.
 *
 * All information contained herein is, and remains, the property of DJI.
 * The intellectual and technical concepts contained herein are proprietary
 * to DJI and may be covered by U.S. and foreign patents, patents in process,
 * and protected by trade secret or copyright law.  Dissemination of this
 * information, including but not limited to data and other proprietary
 * material(s) incorporated within the information, in any form, is strictly
 * prohibited without the express written consent of DJI.
 *
 * If you receive this source code without DJI’s authorization, you may not
 * further disseminate the information, and you must immediately remove the
 * source code and notify DJI of its removal. DJI reserves the right to pursue
 * legal actions against you for any loss(es) or damage(s) caused by your
 * failure to do so.
 *
 *********************************************************************
 */

/* Includes ------------------------------------------------------------------*/
#include "test_widget.h"
#include <dji_widget.h>
#include <dji_logger.h>
#include "../utils/util_misc.h"
#include <dji_platform.h>
#include <stdio.h>
#include "dji_sdk_config.h"
#include "file_binary_array_list_en.h"

#include "file_binary_array_list_cn.h"
#include "dji_aircraft_info.h"
#include "OT2_GPIO.h"
#include "serial_number.h"
#include "widget_manager.h"
#include "flash.h"

/* Private constants ---------------------------------------------------------*/
#define WIDGET_DIR_PATH_LEN_MAX         (256)
#define WIDGET_TASK_STACK_SIZE          (2048)

/* Private types -------------------------------------------------------------*/

/*****************************************************/
int8_t filtration = 0;			//按键映射过滤

T_DjiMobileAppInfo appinfo;

/*****************************************************/

/* Private functions declaration ---------------------------------------------*/
static void *DjiTest_WidgetTask(void *arg);
static T_DjiReturnCode DjiTestWidget_SetWidgetValue(E_DjiWidgetType widgetType, uint32_t index, int32_t value,
                                                    void *userData);
static T_DjiReturnCode DjiTestWidget_GetWidgetValue(E_DjiWidgetType widgetType, uint32_t index, int32_t *value,
                                                    void *userData);

/* Private values ------------------------------------------------------------*/
static T_DjiTaskHandle s_widgetTestThread;
static bool s_isWidgetFileDirPathConfigured = false;
static char s_widgetFileDirPath[DJI_FILE_PATH_SIZE_MAX] = {0};

static const T_DjiWidgetHandlerListItem s_widgetHandlerList[] = {
#if (defined ET_2)||(defined PT_2)
    {CN_FOREWARD, DJI_WIDGET_TYPE_BUTTON,   DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
    {CN_REVERSAL, DJI_WIDGET_TYPE_BUTTON,   DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
	{LS_FOREWARD, DJI_WIDGET_TYPE_SWITCH,   DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
    {LS_REVERSAL, DJI_WIDGET_TYPE_SWITCH,   DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},

#elif (defined ET_4)||(defined PT_4)||(defined PT4S)
	#ifndef PT4S
		{CN_LASER, 	  DJI_WIDGET_TYPE_SWITCH,   DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
		{LS_LASER, 	  DJI_WIDGET_TYPE_SWITCH,   DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
	#endif
	
	{CN_FRONT,	  DJI_WIDGET_TYPE_SWITCH,   DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
    {CN_BEHIND,   DJI_WIDGET_TYPE_SWITCH,   DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
	{LS_FRONT,	  DJI_WIDGET_TYPE_SWITCH,   DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
    {LS_BEHIND,   DJI_WIDGET_TYPE_SWITCH,   DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},	
	
	#ifdef ET_4
		{FRONT_BEHIND,	  DJI_WIDGET_TYPE_SWITCH,   DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
		{LEFT_RIGHT,   DJI_WIDGET_TYPE_SWITCH,   DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
	#else
		{PHOTO_DROP_SINGLE,	  DJI_WIDGET_TYPE_SWITCH,   DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
		{PHOTO_DROP_ALL,   	  DJI_WIDGET_TYPE_SWITCH,   DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
	#endif
#endif

    {CN_LEFT,	  DJI_WIDGET_TYPE_SWITCH,   DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
    {CN_RIGHT, 	  DJI_WIDGET_TYPE_SWITCH,   DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
    {CN_ALL,	  DJI_WIDGET_TYPE_SWITCH,   DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
    {LS_LEFT, 	  DJI_WIDGET_TYPE_SWITCH,   DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
    {LS_RIGHT,	  DJI_WIDGET_TYPE_SWITCH,   DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
    {LS_ALL,	  DJI_WIDGET_TYPE_SWITCH,   DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL}
};

static const char *s_widgetTypeNameArray[] = {
    "Unknown",
    "Button",
    "Switch",
    "Scale",
    "List",
    "Int input box"
};

static const uint32_t s_widgetHandlerListCount = sizeof(s_widgetHandlerList) / sizeof(T_DjiWidgetHandlerListItem);
static int32_t s_widgetValueList[sizeof(s_widgetHandlerList) / sizeof(T_DjiWidgetHandlerListItem)] = {0};

/* Exported functions definition ---------------------------------------------*/
T_DjiReturnCode DjiTest_WidgetStartService(void)
{
    T_DjiReturnCode djiStat;
    T_DjiOsalHandler *osalHandler = DjiPlatform_GetOsalHandler();

    //Step 1 : Init DJI Widget
    djiStat = DjiWidget_Init();
    if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
        USER_LOG_ERROR("Dji test widget init error, stat = 0x%08llX", djiStat);
        return djiStat;
    }

#ifdef SYSTEM_ARCH_LINUX
    //Step 2 : Set UI Config (Linux environment)
    char curFileDirPath[WIDGET_DIR_PATH_LEN_MAX];
    char tempPath[WIDGET_DIR_PATH_LEN_MAX];
    djiStat = DjiUserUtil_GetCurrentFileDirPath(__FILE__, WIDGET_DIR_PATH_LEN_MAX, curFileDirPath);
    if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
        USER_LOG_ERROR("Get file current path error, stat = 0x%08llX", djiStat);
        return djiStat;
    }

    if (s_isWidgetFileDirPathConfigured == true) {
        snprintf(tempPath, WIDGET_DIR_PATH_LEN_MAX, "%swidget_file/en_big_screen", s_widgetFileDirPath);
    } else {
        snprintf(tempPath, WIDGET_DIR_PATH_LEN_MAX, "%swidget_file/en_big_screen", curFileDirPath);
    }

    //set default ui config path
    djiStat = DjiWidget_RegDefaultUiConfigByDirPath(tempPath);
    if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
        USER_LOG_ERROR("Add default widget ui config error, stat = 0x%08llX", djiStat);
        return djiStat;
    }

    //set ui config for English language
    djiStat = DjiWidget_RegUiConfigByDirPath(DJI_MOBILE_APP_LANGUAGE_ENGLISH,
                                             DJI_MOBILE_APP_SCREEN_TYPE_BIG_SCREEN,
                                             tempPath);
    if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
        USER_LOG_ERROR("Add widget ui config error, stat = 0x%08llX", djiStat);
        return djiStat;
    }

    //set ui config for Chinese language
    if (s_isWidgetFileDirPathConfigured == true) {
        snprintf(tempPath, WIDGET_DIR_PATH_LEN_MAX, "%swidget_file/cn_big_screen", s_widgetFileDirPath);
    } else {
        snprintf(tempPath, WIDGET_DIR_PATH_LEN_MAX, "%swidget_file/cn_big_screen", curFileDirPath);
    }

    djiStat = DjiWidget_RegUiConfigByDirPath(DJI_MOBILE_APP_LANGUAGE_CHINESE,
                                             DJI_MOBILE_APP_SCREEN_TYPE_BIG_SCREEN,
                                             tempPath);
    if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
        USER_LOG_ERROR("Add widget ui config error, stat = 0x%08llX", djiStat);
        return djiStat;
    }
#else
    //Step 2 : Set UI Config (RTOS environment)
		//自定义控件二进制配置文件(英文)
    T_DjiWidgetBinaryArrayConfig enWidgetBinaryArrayConfig = {
        .binaryArrayCount = g_EnBinaryArrayCount,		// 二进制数组控件文件数量
        .fileBinaryArrayList = g_EnFileBinaryArrayList	// 二进制数组控件文件列表
    };
		//自定义控件二进制配置文件(中文)
		T_DjiWidgetBinaryArrayConfig cnWidgetBinaryArrayConfig = {
        .binaryArrayCount = g_CnBinaryArrayCount,		// 二进制数组控件文件数量
        .fileBinaryArrayList = g_CnFileBinaryArrayList	// 二进制数组控件文件列表
    };

    //set default ui config
		//注册二进制配置文件默认的路径
    djiStat = DjiWidget_RegDefaultUiConfigByBinaryArray(&enWidgetBinaryArrayConfig);
    if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
        USER_LOG_ERROR("Add default widget ui config error, stat = 0x%08llX", djiStat);
        return djiStat;
    }
		
		//系统语言为英文时,控件配置文件的路径
		djiStat = DjiWidget_RegUiConfigByBinaryArray(DJI_MOBILE_APP_LANGUAGE_ENGLISH,
														DJI_MOBILE_APP_SCREEN_TYPE_BIG_SCREEN,
														&enWidgetBinaryArrayConfig);
		 if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
        USER_LOG_ERROR("Add default English widget ui config error, stat = 0x%08llX", djiStat);
        return djiStat;
    }
		 
		//系统语言为中文时,控件配置文件的路径
		djiStat = DjiWidget_RegUiConfigByBinaryArray(DJI_MOBILE_APP_LANGUAGE_CHINESE,
														DJI_MOBILE_APP_SCREEN_TYPE_BIG_SCREEN,
														&cnWidgetBinaryArrayConfig);
		 if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
        USER_LOG_ERROR("Add default Chinese widget ui config error, stat = 0x%08llX", djiStat);
        return djiStat;
    }
		
#endif
    //Step 3 : Set widget handler list
		//通过PsdkWidget_RegHandlerList接口注册负载设备的某项功能和对应的控件参数,将负载设备的功能绑定到指定的控件上。
    djiStat = DjiWidget_RegHandlerList(s_widgetHandlerList, s_widgetHandlerListCount);
    if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
        USER_LOG_ERROR("Set widget handler list error, stat = 0x%08llX", djiStat);
        return djiStat;
    }

    //Step 4 : Run widget api sample task
    if (osalHandler->TaskCreate("user_widget_task", DjiTest_WidgetTask, WIDGET_TASK_STACK_SIZE, NULL,
                                &s_widgetTestThread) != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
        USER_LOG_ERROR("Dji widget test task create error.");
        return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
    }

    return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}

T_DjiReturnCode DjiTest_WidgetSetConfigFilePath(const char *path)
{
    memset(s_widgetFileDirPath, 0, sizeof(s_widgetFileDirPath));
    memcpy(s_widgetFileDirPath, path, USER_UTIL_MIN(strlen(path), sizeof(s_widgetFileDirPath) - 1));
    s_isWidgetFileDirPathConfigured = true;

    return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}

__attribute__((weak)) void DjiTest_WidgetLogAppend(const char *fmt, ...)
{

}

#ifndef __CC_ARM
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wmissing-noreturn"
#pragma GCC diagnostic ignored "-Wreturn-type"
#pragma GCC diagnostic ignored "-Wformat"
#endif

/* Private functions definition-----------------------------------------------*/
static void *DjiTest_WidgetTask(void *arg)
{
    char message[DJI_WIDGET_FLOATING_WINDOW_MSG_MAX_LEN];
    uint32_t sysTimeMs = 0;
    T_DjiReturnCode djiStat;
    T_DjiOsalHandler *osalHandler = DjiPlatform_GetOsalHandler();

	char* cn_info = NULL;
	char* en_info = NULL;
	
	char DomesticVersion[255] = {0};
	char ForeignVersion[255] = {0};
	
#if(defined PT_2)||(defined PT_4)||(defined PT4S)
	cn_info = "极至科技\n警告:\n挂载重于500g物品,必须配合云台安全扣使用!";
	en_info = "JiZhi Technology\nWarning:\nIf the weight is more than 500g, it must be used with safety lock catch!";
	sprintf(DomesticVersion,"提示:未激活,功能不可用.\r\n请进入微信小程序\"极至服务\",\r\n输入设备SN码: %.14s,\r\n获取激活码激活设备.\r\n",ptSncode);
	sprintf(ForeignVersion,"Reminder: Not activated, function not available.\r\nPlease enter\r\nhttps://jzdrones.com/\r\nInput device SN code: %.14s\r\nObtain an activation code to activate the device.\r\n",ptSncode);
	
#elif (defined	ET_2)||(defined ET_4)
	cn_info = "极至科技";
	en_info = "JiZhi Technology";
	
	sprintf(DomesticVersion,"提示:未激活,功能不可用.\r\n请进入微信小程序\"极至服务\",\r\n输入设备SN码: %.16s,\r\n获取激活码激活设备.\r\n",otSncode);
	sprintf(ForeignVersion,"Reminder: Not activated, function not available.\r\nPlease enter\r\nhttps://jzdrones.com/\r\nInput device SN code: %.16s\r\nObtain an activation code to activate the device.\r\n",otSncode);
#endif	
	
    USER_UTIL_UNUSED(arg);

    while (1) {
        djiStat = osalHandler->GetTimeMs(&sysTimeMs);
        if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
            USER_LOG_ERROR("Get system time ms error, stat = 0x%08llX", djiStat);
        }

		//获取系统语言
		djiStat = DjiAircraftInfo_GetMobileAppInfo(&appinfo);
		
		
		if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) 
            USER_LOG_ERROR("Get Mobile App info error, stat = 0x%08llX", djiStat);
		else
		{
			//中文
			if(appinfo.appLanguage == DJI_MOBILE_APP_LANGUAGE_CHINESE)
			{
				if(Active_State_Get()==0)
				{
					djiStat = DjiWidgetFloatingWindow_ShowMessage(DomesticVersion);
					if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
						USER_LOG_ERROR("Floating window show message error, stat = 0x%08llX", djiStat);
					}
				}
				else
					snprintf(message, DJI_WIDGET_FLOATING_WINDOW_MSG_MAX_LEN, "%s\n",cn_info);
			}
			else 		//其他语言
			{
				if(Active_State_Get()==0)
				{
					djiStat = DjiWidgetFloatingWindow_ShowMessage(ForeignVersion);
					if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
						USER_LOG_ERROR("Floating window show message error, stat = 0x%08llX", djiStat);
					}
				}
				else
					snprintf(message, DJI_WIDGET_FLOATING_WINDOW_MSG_MAX_LEN, "%s\n",en_info);
			}
		}
		
#ifndef USER_FIRMWARE_MAJOR_VERSION
//        snprintf(message, DJI_WIDGET_FLOATING_WINDOW_MSG_MAX_LEN, "System time : %u ms", sysTimeMs);
#else
        snprintf(message, DJI_WIDGET_FLOATING_WINDOW_MSG_MAX_LEN,
                 "System time : %u ms\r\nVersion: v%02d.%02d.%02d.%02d\r\nBuild time: %s %s", sysTimeMs,
                 USER_FIRMWARE_MAJOR_VERSION, USER_FIRMWARE_MINOR_VERSION,
                 USER_FIRMWARE_MODIFY_VERSION, USER_FIRMWARE_DEBUG_VERSION,
                 __DATE__, __TIME__);
#endif


    if(Active_State_Get()!=0)
		{
			Test_GPIO();		//挂钩检测
			
			djiStat = DjiWidgetFloatingWindow_ShowMessage(message);
			if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
				USER_LOG_ERROR("Floating window show message error, stat = 0x%08llX", djiStat);
			}
		}

        osalHandler->TaskSleepMs(400);
		
		
    }
}

#ifndef __CC_ARM
#pragma GCC diagnostic pop
#endif

static T_DjiReturnCode DjiTestWidget_SetWidgetValue(E_DjiWidgetType widgetType, uint32_t index, int32_t value,
                                                    void *userData)
{
    USER_UTIL_UNUSED(userData);

	if(filtration>=5&&(Active_State_Get()!=0))
	{
		USER_LOG_INFO("Set widget value, widgetType = %s, widgetIndex = %d ,widgetValue = %d",
                  s_widgetTypeNameArray[widgetType], index, value);
		
		s_widgetValueList[index] = value;
		
		WidgetManager(index,value);
	}

    return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}

static T_DjiReturnCode DjiTestWidget_GetWidgetValue(E_DjiWidgetType widgetType, uint32_t index, int32_t *value,
                                                    void *userData)
{
    USER_UTIL_UNUSED(userData);
    USER_UTIL_UNUSED(widgetType);
	
	if(Active_State_Get()!=0)
	{
		//控件同步
		Widget_Sync(s_widgetValueList);
		
		*value = s_widgetValueList[index];
	}
    return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}

/****************** (C) COPYRIGHT DJI Innovations *****END OF FILE****/