﻿#ifndef _JIDU_H_
#define _JIDU_H_
#include "otx/OTXBase.hpp"

#define JD_EUC_COUNT 59

#ifdef __cplusplus
extern "C" {
#endif
	OTX_API int clearDataCenterCache();
	OTX_API int setFactory(const char* factory);
	OTX_API int setLanguage(const char* lang = "zh-CN");
	OTX_API int callServer(int iType, const char* inParams, char* outBuffer, uint32_t outBufferSize);
	OTX_API int getAppEnvironment(void);
	OTX_API int getLastErrMsg(char* outBuffer, uint32_t outBufferSize);//TODO 最近一次callServer的错误原因

	OTX_API int trans_jd_vinAscii(const char* inParams, uint32_t offset, uint32_t inLen, char* outBuffer, uint32_t outBufferSize);

	//胎压id，按照左前、右前、右后和左后排序(每轮胎8字符)。 
	//工厂		##需要提前调用callServer(4, "", NULL, 0)
	OTX_API int get_jd_tpmsId(uint8_t* outBuffer, uint32_t outBufferSize);


	//安全常量 
	//工厂		##需要提前调用callServer(6, "", NULL, 0)
	//售后		##需要提前调用callServer(59, "", NULL, 0)
	OTX_API int get_jd_swdlConstants_byEcuName(const char* ecuName, uint8_t* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_immoConstants_byEcuName(const char* ecuName, uint8_t* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_salConstants_byEcuName(const char* ecuName, uint8_t* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_commonConstants_byEcuName(const char* ecuName, uint8_t* outBuffer, uint32_t outBufferSize);

	//0:无结果； 1:ECU离线未检测到ECU; 2:ECU硬件版本不匹配; 3:ECU升级失败; 4:Fota升级成功; 5:选装件，不需要Fota
	OTX_API int get_jd_ecuFotaStatus_byEcuName(char* ecuName);
	OTX_API int get_jd_ecuFotaStatus_byEcuId(uint16_t ecuId);
	OTX_API int set_jd_ecuFotaStatus_byEcuName(char* ecuName, int status);
	OTX_API int set_jd_ecuFotaStatus_byEcuId(uint16_t ecuId, int status);
	OTX_API int check_jd_ecuFotaStatus_report(char* statisticId, char* statisticName, char* blockId, char* blockName);//过程上报:


	//OTA证书
	//工厂		##需要提前调用callServer(27, "", NULL, 0)
	//售后		##服务器需要提前调用callServer(64, "", NULL, 0)
	OTX_API int get_jd_otaCert_ca(uint8_t* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_otaCert_client(uint8_t* outBuffer, uint32_t outBufferSize);

	//证书信息 ecuName ={"TCAM","BGM", "CDC","ACU"} 
	//工厂		##需要提前调用callServer(20,"", NULL, 0)
	//工厂默认	##需要提前调用callServer(23,"", NULL, 0)
	//售后		##服务器需要提前调用callServer(56, "", NULL, 0)
	//售后默认	##服务器需要提前调用callServer(65, "", NULL, 0)
	OTX_API int get_jd_certInfo_ecuCa(uint8_t* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_certInfo_vid(uint8_t* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_certInfo_dvcKey_byEcuName(const char* ecuName, uint8_t* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_certInfo_p12_byEcuName(const char* ecuName, uint8_t* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_certInfo_p12Key_byEcuName(const char* ecuName, uint8_t* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_certInfo_aesKey_byEcuName(const char* ecuName, uint8_t* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_certInfo_soaKey_byEcuName(const char* ecuName, uint8_t* outBuffer, uint32_t outBufferSize);

	OTX_API int jd_certBrush_callback(const char* deviceSn, char* vin, int carType, char* ecuName, char* ecuSn, int ackFlag, char* reason);
	OTX_API int jd_certRevoke_callback(const char* deviceSn, char* vin, int carType, char* ecuName, char* ecuSn);
	OTX_API int jd_keyBrush_callback(const char* deviceSn, char* vin, int carType, char* ecuName, int type, int ackFlag, char* messag);


	//订单信息 
	//工厂		##需要提前调用callServer(26, "", NULL, 0)
	OTX_API int get_jd_orderInfo_vehicle_vin(char* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_orderInfo_byEcuId(uint32_t ecuId, char* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_orderInfo_ecuName_byEcuId(int ecuId, char* outBuffer, uint32_t outBufferSize);

	OTX_API int get_jd_orderInfo_vehicle_ccp(uint8_t* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_orderInfo_swpn(char* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_orderInfo_vehicleType(char* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_orderInfo_baseLine(char* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_orderInfo_displayVersion(char* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_orderInfo_eboc(char* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_orderInfo_mixNo(char* outBuffer, uint32_t outBufferSize);

	OTX_API int get_jd_orderInfo_ecuCount();
	OTX_API int get_jd_orderInfo_ecuId(int index);
	OTX_API int get_jd_orderInfo_ecuName(int index, char* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_orderInfo_ecuSwpn(int index, char* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_orderInfo_ecuHwpn(int index, char* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_orderInfo_vehicleEnvironment();

	OTX_API int get_jd_orderInfo_ecuId_byEcuName(const char* ecuName);
	OTX_API int get_jd_orderInfo_ecuHwpn_byEcuName(const char* ecuName, char* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_orderInfo_ecuSwpn_byEcuName(const char* ecuName, char* outBuffer, uint32_t outBufferSize);
	OTX_API uint64_t get_jd_orderInfo_ecuFlashFileSize(int index, char* outBuffer, uint32_t outBufferSize);
	OTX_API uint64_t get_jd_orderInfo_ecuFlashFileSize_byEcuName(const char* ecuName, char* outBuffer, uint32_t outBufferSize);

	//订单信息 
	//售后		##需要提前调用callServer(51, "", NULL, 0)
	OTX_API int get_jd_orderInfo_swpn(char* outBuffer, uint32_t outBufferSize);
	//售后		##需要提前调用callServer(53, "", NULL, 0)
	//售后		##需要提前调用callServer(68, "", NULL, 0)
	OTX_API int get_jd_orderInfo_vehicle_ccp(uint8_t* outBuffer, uint32_t outBufferSize);

	//售后		##需要提前调用callServer(54, "", NULL, 0)
	OTX_API int get_jd_orderInfo_ecuHwpn_byEcuName(const char* ecuName, char* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_orderInfo_ecuCount();
	OTX_API int get_jd_orderInfo_ecuId(int index);
	OTX_API int get_jd_orderInfo_ecuName(int index, char* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_orderInfo_ecuSwpn(int index, char* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_orderInfo_ecuSn_byEcuId(int ecuId, char* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_orderInfo_ecuName_byEcuId(int ecuId, char* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_orderInfo_ecuSwpn_byEcuId(int ecuId, char* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_orderInfo_ecuHwpn_byEcuId(int ecuId, char* outBuffer, uint32_t outBufferSize);

	OTX_API int set_jd_deviceSn(char* deviceSn);
	OTX_API int get_jd_deviceSn(char* outBuffer, uint32_t outBufferSize);

	OTX_API int get_jd_ecuName_byEcuId(uint16_t ecuId, char* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_ecuName_byIpAddr(uint32_t ipAddr, char* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_doIp_byEcuName(const char* ecuName);
	OTX_API int get_jd_doIp_byEcuId(uint16_t ecuId);

	//售后		##内部调用callServer(68, "", NULL, 0)
	OTX_API int get_jd_ccpTaskNum(const char* vid, const char* vin, int sceneType, char* outBuffer, uint32_t outBufferSize);


	//售后		##内部调用callServer(74, "", NULL, 0)	诊断仪标定数据上传 (carType: [MarsOne：1, Venus：2])
	OTX_API int set_jd_calibration_uploadData(const char* vin, int carType, const char* ecuName, const char* ecuAddr, uint8_t* inParams, int inLen);
	//售后		##内部调用callServer(75, "", NULL, 0)	诊断仪标定数据下载 (carType: [MarsOne：1, Venus：2])
	OTX_API int get_jd_calibration_downloadData(const char* vin, int carType, const char* ecuName, const char* ecuAddr, uint8_t* outBuffer, uint32_t outBufferSize);


	//查询EOL all密钥信息
	//工厂		##需要提前调用callServer(19, "", NULL, 0)
	//售后		##需要提前调用callServer(58, "", NULL, 0)
	OTX_API int get_jd_immoKeyEcm(uint8_t* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_immoKeyIem(uint8_t* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_immoKeyMgm(uint8_t* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_immoKeyRemote(uint8_t* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_dkBncmBgm(uint8_t* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_powerRootKey(uint8_t* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_powerRootKeyId(uint8_t* outBuffer, uint32_t outBufferSize);

	//工厂		##需要提前调用callServer(21, "", NULL, 0)
	//售后		##需要提前调用callServer(55, "", NULL, 0)
	OTX_API int get_jd_aesKey_byEcuName(const char* ecuName, uint8_t* outBuffer, uint32_t outBufferSize);


	//售后		##需要提前调用callServer(79, "", NULL, 0)
	OTX_API int get_jd_orderInfo_ebocCount();
	OTX_API int get_jd_orderInfo_eboc_byAttributeName(const char* attribute, char* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_orderInfo_eboc_featureCode(int index, char* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_orderInfo_eboc_featureName(int index, char* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_orderInfo_eboc_featureCname(int index, char* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_orderInfo_eboc_featureFamilyName(int index, char* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_orderInfo_eboc_featureFamilyCname(int index, char* outBuffer, uint32_t outBufferSize);

	//售后		##需要提前调用callServer(82, "", NULL, 0)
	OTX_API int get_jd_orderInfo_vehicleActiveStatus();
	//售后		##获取车辆激活状态 1未激活 2激活 3工程模式
	OTX_API int get_jd_vehicleActiveStatus(const char* vin);

	//售后		##需要提前调用callServer(85, "", NULL, 0)
	OTX_API int get_jd_vehicleEnvStatus();
	OTX_API int get_jd_vehicleEnvStatusName(uint8_t* outBuffer, uint32_t outBufferSize);

	//售后		##需要提前调用callServer(86, "", NULL, 0)
	OTX_API int get_jd_lastOtaVersion(uint8_t* outBuffer, uint32_t outBufferSize);


	//售后		##需要提前调用callServer(87, "", NULL, 0)
	OTX_API int get_jd_orderInfo_vehicleEnvChangeWorkFlowStatus();
	//售后		##内部调用callServer(87, "", NULL, 0)	查询车辆环境切换工单审批状态 1:审批中 2:审批拒绝 3:审批通过 4:工单失效 5:无申请数据
	OTX_API int get_jd_vehicleEnvChangeWorkFlowStatus(const char* vin, int carType, const char* userName, int env, int action);


	//售后		##调用callServer(88, "", NULL, 0)
	OTX_API int get_jd_vehicleSoftApps(const char* vin, int carType, const char* targetVersion);
	OTX_API int get_jd_vehicleSoftApps_ecuHwpn_byEcuId(uint16_t ecuId, uint8_t* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_vehicleSoftApps_ecuSwpn_byEcuId(uint16_t ecuId, uint8_t* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_vehicleSoftApps_ecuHwpn_byEcuName(const char* ecuName, uint8_t* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_vehicleSoftApps_ecuSwpn_byEcuName(const char* ecuName, uint8_t* outBuffer, uint32_t outBufferSize);

	//售后		##需要提前调用callServer(89, "", NULL, 0)
	OTX_API int get_jd_vehicleSoftVerByEcu(char* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_vehicleSoftVerByEcu_ecuUpgradePathList(char* outBuffer, uint32_t outBufferSize);

	//售后		##需要提前调用callServer(90, "", NULL, 0)
	OTX_API int get_jd_vehicleSoftUpgradePath(char* outBuffer, uint32_t outBufferSize);

	//售后		##需要提前调用callServer(91, "", NULL, 0)
	OTX_API int get_jd_vehicleVersionInfo(char* baselineVerBuffer, uint32_t baselineVerBufferSize, char* targetVerBuffer, uint32_t targetVerBufferSize);

	//售后		##需要提前调用callServer(92, "", NULL, 0)
	OTX_API int get_jd_fotaCanNotDriveByVin_targetVehicleSoftVersion(char* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_fotaCanNotDriveByVin_statusOccurTimestamp(char* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_fotaCanNotDriveByVin_vehicleUpgradeSubStatusMsg(char* outBuffer, uint32_t outBufferSize);

	//售后		##内部调用callServer(93, "", NULL, 0)
	OTX_API int get_jd_appBridgeFiles_swpn(int appId, char* outBuffer, uint32_t outBufferSize);

	//查询工位测试结果 station={00：preFOTA、01：ECOS 、02：FHC 、03：Rework、04：QFC}  
	//工厂		##需要提前调用##需要提前调用callServer(28, "", NULL, 0)
	OTX_API int get_jd_eolStationResult(const char* vin, const char* station);
	OTX_API int get_jd_eolStationBlockCount();
	OTX_API bool get_jd_eolStationBlockResult(int blockIndex); //block must less than get_jd_eolStationBlockCount()
	OTX_API int get_jd_eolStationBlockName(int blockIndex, char* blockNameBuffer, uint32_t blockNameBufferSize);
	OTX_API bool get_jd_eolStationBlockResultByBlockName(const char* blockName);
	OTX_API bool get_jd_eolStationBlockResultByBlockId(const char* blockId);

	OTX_API int jd_report_station_begin();//进入工位时要调用
	OTX_API int jd_report_station_end();//结束工位时要调用
	OTX_API int jd_report_setStation(const char* station);//station传入字符串，工位信息
	OTX_API int jd_report_setReworkStation(const char* station);
	OTX_API int jd_report_setMixNo(const char* mixNo);//mixNo传入字符串，订单中心获取
	OTX_API int jd_report_setCarConfig(const char* carConfig);//车型配置
	OTX_API int jd_report_setSerialNo(const char* serialNo);//serialNo传入字符串，APP获取
	OTX_API int jd_report_setVin(const char* vin);//vin传入字符串，车辆中读取
	OTX_API int jd_report_setVehicleType(const char* vehicleType);//vehicleType传入字符串，车辆类型
	OTX_API int jd_report_setCell(const char* cell);//cell传入字符串，设备信息
	OTX_API int jd_report_getBncmFeedbackResult(char* outBuffer, int outBufferSize);
	//小项测试开始 itemInfo 包含(statisticId大项Id; statisticName大项名称; blockId小项Id; blockName小项名称)
	OTX_API int jd_report_block_begin(char* itemInfo);
	//小项测试结束 itemInfo 包含(statisticId大项Id; blockId小项Id)
	OTX_API int jd_report_block_end(char* itemInfo);
	//参数:itemInfo,逗号拼接以下参数(blockId, itemName, itemId, ecuName, ecuAddr, expectedData)
	OTX_API int jd_report_addOkItem(char* itemInfo, uint8_t* cmdReq, int reqLen, uint8_t* cmdAck, int ackLen);
	OTX_API int jd_report_addNokItem(char* itemInfo, uint8_t* cmdReq, int reqLen, uint8_t* cmdAck, int ackLen, char* failReason);
	OTX_API int jd_report_addCacheItem(char* itemInfo, uint8_t* cmdReq, int reqLen, uint8_t* cmdAck, int ackLen, int result, char* failReason);
	OTX_API int jd_report_getResult(char* outBuffer, int outBufferSize);
	OTX_API int jd_report_getQueueSize();

	/***************************************************************
	* 函数: 本地整车包
	/***************************************************************/
	OTX_API int get_jd_vehicleConfig_pkgCount();//已下载整车包数量
	OTX_API int get_jd_vehicleConfig_pkgName(int index, char* outBuffer, int outBufferSize);
	OTX_API int set_jd_vehicleConfig_vehicleSoftVer(const char* vehicleSoftVer);//选择一个整车包用于刷写
	OTX_API int get_jd_vehicleConfig_ecuCount();
	OTX_API int get_jd_vehicleConfig_ecuId(int index);
	OTX_API int get_jd_vehicleConfig_ecuName(int index, char* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_vehicleConfig_ecuHwpn(int index, char* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_vehicleConfig_ecuSwpn(int index, char* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_vehicleConfig_ecuFlashFileSize(int index, char* outBuffer, uint32_t outBufferSize);

	//OTX_API int get_jd_vehicleConfig_ecuHwpnByEcuName(char* ecuName, char* outBuffer, uint32_t outBufferSize);
	//OTX_API int get_jd_vehicleConfig_ecuSwpnByEcuName(char* ecuName, char* outBuffer, uint32_t outBufferSize);
	//OTX_API int get_jd_vehicleConfig_ecuIdByEcuName(char* ecuName, char* outBuffer, uint32_t outBufferSize);
	//OTX_API int get_jd_vehicleConfig_ecuFlashFileSizeByEcuName(char* ecuName, char* outBuffer, uint32_t outBufferSize);

	OTX_API int get_jd_vehicleConfig_ecuHwpnByEcuId(uint16_t ecuId, char* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_vehicleConfig_ecuSwpnByEcuId(uint16_t ecuId, char* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_vehicleConfig_ecuNameByEcuId(uint16_t ecuId, char* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_vehicleConfig_ecuFlashFileSizeByEcuId(uint16_t ecuId, char* outBuffer, uint32_t outBufferSize);

	OTX_API int get_jd_vehicleConfig_displayBaseLine(char* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_vehicleConfig_latestAvailableSwpn(char* outBuffer, uint32_t outBufferSize);//最新可用版本
	OTX_API int get_jd_vehicleConfig_latestBatchSwpn(char* outBuffer, uint32_t outBufferSize);//批量最新可用版本

	OTX_API bool jd_check_diagnosisCertificate();
	//整车包校验 mode=0:下载完整性校验(-1:无包;  0:下载中;  1:有效) mode=1:服务端废弃校验  
	OTX_API int jd_check_vehicleSwpn(const char* swpn, int mode = 0);
	//桥版本校验 下载完整性校验(-1:无包;  0:下载中;  1:有效)
	OTX_API int jd_check_bridgeSwpn(int bridgeId);

	//SBL刷写
	OTX_API int get_jd_SBL_verificationBlockStart(char* ecuName, char* hwpn, char* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_SBL_verificationBlockLength(char* ecuName, char* hwpn);
	OTX_API int get_jd_SBL_swSignatureDev(char* ecuName, char* hwpn, uint8_t* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_SBL_swSignature(char* ecuName, char* hwpn, uint8_t* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_SBL_dataFormatIdentifier(char* ecuName, char* hwpn, uint8_t* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_SBL_erraseInfo(char* ecuName, char* hwpn, uint8_t* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_SBL_activeAddress(char* ecuName, char* hwpn, uint8_t* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_SBL_blockCount(char* ecuName, char* hwpn);
	OTX_API int get_jd_SBL_blockCheckSumByIndex(char* ecuName, char* hwpn, int index, uint8_t* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_SBL_blockStartAddrByIndex(char* ecuName, char* hwpn, int index, uint8_t* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_SBL_blockLengthByIndex(char* ecuName, char* hwpn, int index, uint8_t* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_SBL_blockDataLengthByIndex(char* ecuName, char* hwpn, int index, uint8_t* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_SBL_blockDataByIndex(char* ecuName, char* hwpn, int index, uint8_t* outBuffer, uint32_t outBufferSize);

	OTX_API int get_jd_SBL_verificationBlockStart_byEcuId(int ecuId, char* hwpn, char* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_SBL_verificationBlockLength_byEcuId(int ecuId, char* hwpn);
	OTX_API int get_jd_SBL_swSignatureDev_byEcuId(int ecuId, char* hwpn, uint8_t* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_SBL_swSignature_byEcuId(int ecuId, char* hwpn, uint8_t* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_SBL_dataFormatIdentifier_byEcuId(int ecuId, char* hwpn, uint8_t* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_SBL_erraseInfo_byEcuId(int ecuId, char* hwpn, uint8_t* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_SBL_activeAddress_byEcuId(int ecuId, char* hwpn, uint8_t* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_SBL_blockCount_byEcuId(int ecuId, char* hwpn);
	OTX_API int get_jd_SBL_blockCheckSum_byEcuId(int ecuId, char* hwpn, int index, uint8_t* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_SBL_blockStartAddr_byEcuId(int ecuId, char* hwpn, int index, uint8_t* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_SBL_blockLength_byEcuId(int ecuId, char* hwpn, int index, uint8_t* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_SBL_blockDataLength_byEcuId(int ecuId, char* hwpn, int index, uint8_t* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_SBL_blockData_byEcuId(int ecuId, char* hwpn, int index, uint8_t* outBuffer, uint32_t outBufferSize);

	OTX_API int get_jd_SBL_verificationBlockStart_byBridgeId(int bridgeId, char* hwpn, char* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_SBL_verificationBlockLength_byBridgeId(int bridgeId, char* hwpn);
	OTX_API int get_jd_SBL_swSignatureDev_byBridgeId(int bridgeId, char* hwpn, uint8_t* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_SBL_swSignature_byBridgeId(int bridgeId, char* hwpn, uint8_t* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_SBL_dataFormatIdentifier_byBridgeId(int bridgeId, char* hwpn, uint8_t* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_SBL_erraseInfo_byBridgeId(int bridgeId, char* hwpn, uint8_t* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_SBL_activeAddress_byBridgeId(int bridgeId, char* hwpn, uint8_t* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_SBL_blockCount_byBridgeId(int bridgeId, char* hwpn);
	OTX_API int get_jd_SBL_blockCheckSum_byBridgeId(int bridgeId, char* hwpn, int index, uint8_t* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_SBL_blockStartAddr_byBridgeId(int bridgeId, char* hwpn, int index, uint8_t* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_SBL_blockLength_byBridgeId(int bridgeId, char* hwpn, int index, uint8_t* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_SBL_blockDataLength_byBridgeId(int bridgeId, char* hwpn, int index, uint8_t* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_SBL_blockData_byBridgeId(int bridgeId, char* hwpn, int index, uint8_t* outBuffer, uint32_t outBufferSize);

	OTX_API int jd_reset_bncm_ecuCommonInfo();
	OTX_API int jd_add_bncm_ecuCommonInfo(char* commandKey, char* afterParseCommandRes, char* commandReq, char* commandRes);
	//售后		##内部调用callServer(29, "", NULL, 0)
	//售后		##内部调用callServer(67, "", NULL, 0)
	OTX_API int jd_upload_bncm_ecuCommonInfo(char* serialNo, char* vin, char* vid, char* deviceSn);


	OTX_API int jd_reset_ecuDiagnosticInfo();
	OTX_API int jd_add_ecuDiagnosticInfo(char* ecuType, char* ecuId, char* commandKey, char* afterParseCommandRes, char* commandReq, char* commandRes);
	//售后		##内部调用callServer(80, "", NULL, 0)
	OTX_API int jd_upload_ecuDiagnosticInfo(char* vin, char* vid, int carType, char* deviceSn, int reportType, char* baseLine, char* displayBaseLine, char* cdcModule);


	//0:ECU未配置； 1:ECU离线; 2:ECU在线且不需要升级; 3:ECU升级失败，需要重新升级；4: ecu硬件版本号不匹配; 5: ecu软件版本号不匹配; 6: ecu刷写条件不满足;
	OTX_API int get_jd_ecuStatus_byEcuName(char* ecuName);
	OTX_API int set_jd_ecuStatus_byEcuName(char* ecuName, int status);
	OTX_API int check_jd_ecuStatus_byEcuName(char* ecuName);//0:未挂载Ecu 1:挂载Ecu -1:CCP错误

	//TODO 车辆信息
	OTX_API int set_jd_vehicleInfo_ccp(uint8_t* ccp, uint32_t inLen);
	OTX_API int set_jd_vehicleInfo_vehicleType(char* vehicleType);
	OTX_API int get_jd_vehicleInfo_ccpByte(uint32_t offset);//TODO 返回CCP字节值
	OTX_API int get_jd_vehicleInfo_batteryCapacity();//TODO 根据CCP返回电池容量
	OTX_API int set_jd_vehicleInfo_baseLine(char* baseLine);
	OTX_API int set_jd_vehicleInfo_tpmsId(char* tpmsId);
	OTX_API int set_jd_vehicleInfo_ssh_Status(int status);//1打开 0关闭
	OTX_API int set_jd_vehicleInfo_chargingIsOpen(int status);//充电口盖打开 1成功 0失败
	OTX_API int set_jd_vehicleInfo_gloveboxIsOpen(int status);//手套箱打开 1成功 0失败
	OTX_API int set_jd_vehicleInfo_batteryRemin(char* soc);//TODO 电池电量
	OTX_API int get_jd_vehicleInfo_ecuCount();

	OTX_API int get_jd_vehicleInfo_ecuName(int index, char* outBuffer, uint32_t outBufferSize);//TODO 拓扑图排序
	OTX_API int get_jd_vehicleInfo_ecuName_orderByInitial(int index, char* outBuffer, uint32_t outBufferSize);//TODO 首字母升序
	OTX_API int get_jd_vehicleInfo_doIP_byEcuName(char* ecuName, char* outBuffer, uint32_t outBufferSize);
	OTX_API int get_jd_vehicleInfo_ecuName_byIpAddr(char* ipHex, char* outBuffer, uint32_t outBufferSize);

	OTX_API int set_jd_vehicleInfo_ecuSn(char* ecuName, char* ecuSn);
	OTX_API int set_jd_vehicleInfo_ecuSwpn(char* ecuName, char* ecuSwpn);
	OTX_API int set_jd_vehicleInfo_ecuHwpn(char* ecuName, char* ecuHwpn);

	OTX_API int set_jd_vehicleInfo_ecuSn_byEcuId(uint16_t ecuId, char* ecuSn);
	OTX_API int set_jd_vehicleInfo_ecuSwpn_byEcuId(uint16_t ecuId, char* ecuSwpn);
	OTX_API int set_jd_vehicleInfo_ecuHwpn_byEcuId(uint16_t ecuId, char* ecuHwpn);
	OTX_API int set_jd_vehicleInfo_ecuName_byEcuId(uint16_t ecuId, char* ecuName);
	OTX_API int set_jd_vehicleInfo_pkiName_byEcuId(uint16_t ecuId, char* pkiName);
	OTX_API int get_jd_vehicleInfo_ecuId(uint16_t ecuId);
	OTX_API int get_jd_vehicleInfo_ecuHwpn_byEcuId(uint16_t ecuId, char* outBuffer, uint32_t outBufferSize);

	OTX_API int get_jd_vehicleInfo_ecuHwpn_byEcuName(const char* ecuName, char* outBuffer, uint32_t outBufferSize);

	OTX_API bool check_jd_ecuVersion_swpn(char* orderSwpn, char* vehicleSwpn);
	OTX_API bool check_jd_ecuVersion_hwpn(char* orderHwpn, char* vehicleHwpn);
	OTX_API int check_jd_ecuVersion_report(char* statisticId, char* statisticName, char* blockId, char* blockName);//过程上报:版本比对

	//故障码
	OTX_API int jd_dtc_queryByDTCNo(const char* ecuName, const char* dtcNo, char* outBuffer, int outBufferSize);
	OTX_API int jd_dtc_setWhiteList(const char* whiteList);//工厂版
	OTX_API int jd_dtc_reloadDtcMask();//售后加载DTC白名单
	OTX_API int jd_dtc_isInWhiteList(const char* ecuName, const char* dtcNo);
	OTX_API int jd_dtc_readAll(const char* ecuName, uint8_t* dtcBytefiled, uint32_t inLen);
	OTX_API int jd_dtc_parsedByIndex(const char* ecuName, int index, char* outBuffer, int outBufferSize);
	OTX_API int jd_dtc_report(char* statisticId, char* statisticName, char* blockId, char* blockName);//过程上报:故障码DTC

	//刷写
	OTX_API bool jd_ecuflash_hwpnCheck(const char* ecuName);//刷写检查
	OTX_API bool jd_ecuflash_hwpnCheck_byEcuId(uint16_t ecuId);//刷写检查

	OTX_API bool jd_ecuflash_orderCheck(const char* ecuName);//联网检查
	OTX_API bool jd_ecuflash_orderCheck_byEcuId(uint16_t ecuId);//联网检查

	OTX_API bool jd_ecuflash_checkHighVoltage(const char* ecuName);
	OTX_API bool jd_ecuflash_setSecurityAccessMode(int mode);//刷写安全访问模式 0:普通刷写(默认)，优先使用pinCode; 1:换件刷写，优先使用 FFFFFFFF
	OTX_API int jd_ecuflash_ecuCount(int status);//获取处于各状态的ecu数量

	OTX_API bool jd_ecuflash_addEcu(const char* ecuName, const char* evName, const char* logicalLinkName, int priority);//添加刷写任务
	OTX_API int jd_ecuflash_getProgress(const char* ecuName);//刷写进度
	OTX_API int jd_ecuflash_getStatus(const char* ecuName);//刷写状态 (0,未开始 1,刷写中 2,刷写失败 3,刷写成功)
	OTX_API uint64_t jd_ecuflash_getRemainder(const char* ecuName);//剩余刷写时间
	OTX_API uint64_t jd_ecuflash_getInstallRemainder(const char* ecuName, int expectedTime);//剩余安装时间
	OTX_API uint64_t jd_ecuflash_getStartTimestamp(const char* ecuName);//刷写开始时间戳(秒级)
	OTX_API uint64_t jd_ecuflash_getEndTimestamp(const char* ecuName);//刷写结束时间戳(秒级)

	OTX_API bool jd_ecuflash_addEcu_byEcuId(uint16_t ecuId, const char* evName, const char* logicalLinkName, int priority);//添加刷写任务
	OTX_API int jd_ecuflash_getProgress_byEcuId(uint16_t ecuId);//刷写进度
	OTX_API int jd_ecuflash_getStatus_byEcuId(uint16_t ecuId);//刷写状态 (0,未开始 1,刷写中 2,刷写失败 3,刷写成功)
	OTX_API uint64_t jd_ecuflash_getRemainder_byEcuId(uint16_t ecuId);//剩余刷写时间
	OTX_API uint64_t jd_ecuflash_getInstallRemainder_byEcuId(uint16_t ecuId, int expectedTime);//剩余安装时间
	OTX_API uint64_t jd_ecuflash_getStartTimestamp_byEcuId(uint16_t ecuId);//刷写开始时间戳(秒级)
	OTX_API uint64_t jd_ecuflash_getEndTimestamp_byEcuId(uint16_t ecuId);//刷写结束时间戳(秒级)

	OTX_API bool jd_ecuflash_start();
	//TODO 工程版刷写(单文件刷写)
	OTX_API bool jd_ecuFlash_start2(const char* ecuName, const char* evName, const char* logicalLinkName, const char* pinCode, const char* filepath, const char* keyInfo, int signatureMode, int securityAccess, int installVerify);
	OTX_API int jd_ecuflash_getCmd(const char* ecuName, char* outBuffer, int outBufferSize);
	OTX_API bool jd_ecuFlash_start3(uint16_t ecuId, const char* evName, const char* logicalLinkName, uint16_t bridgeId);
	OTX_API bool jd_ecuflash_stop();

	//TODO 代码版原有接口
	OTX_API int GetEcuDtcSnapShotGlobalRealTime(uint32_t timestamp, char* outBuffer, int outBufferSize);
	OTX_API bool IsFodSyncVinCcpSuccess(uint8_t* resp, uint32_t respSize);
	OTX_API int GetSecurityMask(int doipId, uint8_t* outBuffer, uint32_t outBufferSize);

	OTX_API void test_bncm_report(const char* csvFilepath);

#ifdef __cplusplus
}
#endif

#endif
