HMS 功能

2024-04-11
暂无评分

概述

HMS(健康管理系统)是对飞机各模块的运行健康状态的一个监控系统。在DJI Pilot上已经提供了交互界面查看各模块的工作状态是否有异常。PSDK则提供了基本接口来获取各模块异常的错误信息,便于PSDK程序获知飞机各模块的工作状态。

基本概念

HMS错误信息

单条HMS的错误信息包括一个错误ID,错误的Index和一个错误的等级,在订阅HMS信息后,这些错误信息将会打包发送给PSDK。PSDK根据这些错误信息的数据解析成字符串,并从终端打印出来。

HMS 多国语言数据库可查询:hms.jsonopen in new window。 物流机双语数据库可查询:drone-hms-langs.jsonopen in new window

使用HMS功能

1. 初始化HMS功能模块

在使用HMS功能的相关接口之前,需要先调用DjiTest_HmsInit 接口初始化HMS功能模块。

returnCode = DjiTest_HmsInit();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
    USER_LOG_ERROR("Hms sample init error, error code:0x%08llX", returnCode);
    goto out;
}

2. 订阅飞行状态信息

在HMS模块内会根据TOPIC_STATUS_FLIGHT的订阅数据来判断飞机是否在空中,从而区分HMS信息是在飞行过程中接收到的还是在地上接收到的。

T_DjiReturnCode returnCode;

returnCode = DjiFcSubscription_Init();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
    USER_LOG_ERROR("Hms sample init data subscription module failed, error code:0x%08llX", returnCode);
    return returnCode;
}

/*! subscribe fc data */
returnCode = DjiFcSubscription_SubscribeTopic(DJI_FC_SUBSCRIPTION_TOPIC_STATUS_FLIGHT,
                                              DJI_DATA_SUBSCRIPTION_TOPIC_10_HZ,
                                              NULL);

if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
    USER_LOG_ERROR("HMS sample subscribe topic flight status error, error code:0x%08llX", returnCode);
    return returnCode;
}

3. 注册HMS信息回调

开发者可通过调用DjiHms_RegHmsInfoCallback 接口注册HMS信息回调的方式获取到实时的HMS错误信息推送,当HMS错误发生时,用户可以在DjiTest_HmsInfoCallback回调函数中获取到具体的HMS信息。


osalHandler = DjiPlatform_GetOsalHandler();
USER_LOG_INFO("--> Step 2: Register callback function of push HMS information");
DjiTest_WidgetLogAppend("--> Step 2: Register callback function of push HMS information");
returnCode = DjiHms_RegHmsInfoCallback(DjiTest_HmsInfoCallback);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
    USER_LOG_ERROR("Register callback function of push HMS information failed, error code:0x%08llX", returnCode);
    goto out;
}

osalHandler->TaskSleepMs(30000);

4. 解析HMS信息

当用户收到HMS信息的错误码之后,需要通过查表的方式获取,通过错误码以及区分飞机是否在空中,来获取到对应的错误字符串信息,结合对应的错误码可以采取相应的措施,保障飞行器的飞行安全。

char alarmIdStr[20] = {0};
char sensorIdStr[20] = {0};
char componentIdStr[20] = {0};
char printBuff[256] = {0};
const char *originalAlarmInfo = NULL;
uint8_t hmsCodeMatchFlag = 0;

if (!hmsInfoTable.hmsInfo) {
    USER_LOG_ERROR("Hms info table is null");
    return false;
}

for (int i = 0; i < hmsInfoTable.hmsInfoNum; i++) {
    hmsCodeMatchFlag = 0;
    for (int j = 0; j < sizeof(hmsErrCodeInfoTbl) / sizeof(T_DjiHmsErrCodeInfo); j++) {
        if (hmsInfoTable.hmsInfo[i].errorCode == hmsErrCodeInfoTbl[j].alarmId) {
            hmsCodeMatchFlag = 1;
            snprintf(alarmIdStr, sizeof(alarmIdStr), "%u", hmsInfoTable.hmsInfo[i].errorCode);
            //note:sensor_idx:[0,5].In order to be consistent with the display of pilot, add one.
            snprintf(sensorIdStr, sizeof(sensorIdStr), "%d", hmsInfoTable.hmsInfo[i].componentIndex + 1);
            snprintf(componentIdStr, sizeof(componentIdStr), "0x%02X", hmsInfoTable.hmsInfo[i].componentIndex + 1);
            if (DjiTest_GetValueOfFlightStatus() == DJI_FC_SUBSCRIPTION_FLIGHT_STATUS_IN_AIR) {
                originalAlarmInfo = hmsErrCodeInfoTbl[j].flyAlarmInfo;
            } else {
                originalAlarmInfo = hmsErrCodeInfoTbl[j].groundAlarmInfo;
            }
            originalAlarmInfo = hmsErrCodeInfoTbl[j].groundAlarmInfo;
            if (strlen(originalAlarmInfo)) {
                snprintf(printBuff, sizeof(printBuff), "%s", originalAlarmInfo);
                DjiTest_ReplaceStr(printBuff, sizeof(printBuff), oldReplaceAlarmIdStr, alarmIdStr);
                DjiTest_ReplaceStr(printBuff, sizeof(printBuff), oldReplaceIndexStr, sensorIdStr);
                DjiTest_ReplaceStr(printBuff, sizeof(printBuff), oldReplaceComponentIndexStr, componentIdStr);
                if (hmsInfoTable.hmsInfo[i].errorLevel > MIN_HMS_ERROR_LEVEL &&
                    hmsInfoTable.hmsInfo[i].errorLevel < MID_HMS_ERROR_LEVEL) {
                    USER_LOG_WARN("[ErrorCode:0x%2x] %s", hmsInfoTable.hmsInfo[i].errorCode, printBuff);
                } else if (hmsInfoTable.hmsInfo[i].errorLevel >= MID_HMS_ERROR_LEVEL &&
                           hmsInfoTable.hmsInfo[i].errorLevel < MAX_HMS_ERROR_LEVEL) {
                    USER_LOG_ERROR("[ErrorCode:0x%2x] %s", hmsInfoTable.hmsInfo[i].errorCode, printBuff);
                }
            }
        }
    }
    if (!hmsCodeMatchFlag) {
        USER_LOG_WARN("[ErrorCode:0x%2x] There are no matching documents in the current hmsErrCodeInfoTbl for now.",
                      hmsInfoTable.hmsInfo[i].errorCode);
    }
}

return true;
若您对文档有意见或疑惑,点击可快速反馈,我们会与您联系。