package com.netsdk.demo.module;
|
|
import java.io.IOException;
|
|
import com.netsdk.lib.ImageAlgLib;
|
import com.netsdk.lib.ToolKits;
|
import com.netsdk.lib.NetSDKLib;
|
import com.netsdk.lib.NetSDKLib.*;
|
|
|
public class ThermalCameraModule {
|
|
static ImageAlgLib imageAlgApi = ImageAlgLib.IMAGEALG_INSTANCE;
|
|
public static class ThermalCameraStatus {
|
public boolean bSearching = false; // 是否正在查找
|
public int nFinderHanle; // 取到的查询句柄
|
public int nTotalCount; // 符合此次查询条件的结果总条数
|
public LLong hRadiometryHandle = new LLong(0); // 订阅句柄
|
}
|
|
private static ThermalCameraStatus status = new ThermalCameraStatus();
|
|
/**
|
* 订阅温度分布数据(热图)
|
*/
|
public static boolean radiometryAttach(int nChannel, fRadiometryAttachCB cbNotify) {
|
/*
|
* 入参
|
*/
|
NET_IN_RADIOMETRY_ATTACH stIn = new NET_IN_RADIOMETRY_ATTACH();
|
stIn.nChannel = nChannel; // 通道号
|
stIn.cbNotify = cbNotify; // 回调函数
|
|
/*
|
* 出参
|
*/
|
NET_OUT_RADIOMETRY_ATTACH stOut = new NET_OUT_RADIOMETRY_ATTACH();
|
status.hRadiometryHandle = LoginModule.netsdk.CLIENT_RadiometryAttach(LoginModule.m_hLoginHandle, stIn, stOut, 3000);
|
|
if(status.hRadiometryHandle.longValue() == 0) {
|
System.err.printf("RadiometryAttach Failed!" + ToolKits.getErrorCodePrint());
|
}
|
|
return status.hRadiometryHandle.longValue() != 0;
|
}
|
|
/**
|
* 获取查询总个数
|
*/
|
public static boolean isAttaching() {
|
return status.hRadiometryHandle.longValue() != 0;
|
}
|
|
/**
|
* 开始获取热图数据
|
*/
|
public static int radiometryFetch(int nChannel) {
|
|
int nStatus = -1;
|
|
/*
|
* 入参
|
*/
|
NET_IN_RADIOMETRY_FETCH stIn = new NET_IN_RADIOMETRY_FETCH();
|
stIn.nChannel = nChannel; // 通道号
|
|
/*
|
* 出参
|
*/
|
NET_OUT_RADIOMETRY_FETCH stOut = new NET_OUT_RADIOMETRY_FETCH();
|
|
if(!LoginModule.netsdk.CLIENT_RadiometryFetch(LoginModule.m_hLoginHandle, stIn, stOut, 3000)) {
|
System.err.printf("RadiometryFetch Failed!" + ToolKits.getErrorCodePrint());
|
} else {
|
nStatus = stOut.nStatus;
|
}
|
|
return nStatus;
|
}
|
|
/**
|
* 处理回调数据(热图)
|
* @throws IOException
|
*/
|
public static boolean saveData(NET_RADIOMETRY_DATA radiometryData) throws IOException {
|
|
if (radiometryData == null) {
|
return false;
|
}
|
|
int nWidth = radiometryData.stMetaData.nWidth;
|
int nHeight = radiometryData.stMetaData.nHeight;
|
|
short[] pGrayImg = new short[nWidth * nHeight];
|
float[] pTempForPixels = new float[nWidth * nHeight];
|
|
if(LoginModule.netsdk.CLIENT_RadiometryDataParse(radiometryData, pGrayImg, pTempForPixels)) {
|
byte[] pYData = new byte[nWidth*nHeight*2];
|
imageAlgApi.drcTable(pGrayImg, (short)nWidth, (short)nHeight, 0, pYData, null);
|
ToolKits.savePicture(pYData, "./GrayscaleMap.yuv");
|
} else {
|
System.err.println("saveData failed!" + ToolKits.getErrorCodePrint());
|
return false;
|
}
|
|
return true;
|
}
|
|
/**
|
* 取消订阅温度分布数据
|
*/
|
public static void radiometryDetach() {
|
if(status.hRadiometryHandle.longValue() != 0) {
|
LoginModule.netsdk.CLIENT_RadiometryDetach(status.hRadiometryHandle);
|
status.hRadiometryHandle.setValue(0);
|
}
|
}
|
|
/**
|
* 查询测温点
|
*/
|
public static NET_RADIOMETRYINFO queryPointTemper(int nChannel, short x, short y) {
|
int nQueryType = NetSDKLib.NET_QUERY_DEV_RADIOMETRY_POINT_TEMPER;
|
|
// 入参
|
NET_IN_RADIOMETRY_GETPOINTTEMPER stIn = new NET_IN_RADIOMETRY_GETPOINTTEMPER();
|
stIn.nChannel = nChannel;
|
stIn.stCoordinate.nx = x;
|
stIn.stCoordinate.ny = y;
|
|
// 出参
|
NET_OUT_RADIOMETRY_GETPOINTTEMPER stOut = new NET_OUT_RADIOMETRY_GETPOINTTEMPER();
|
|
stIn.write();
|
stOut.write();
|
boolean bRet = LoginModule.netsdk.CLIENT_QueryDevInfo(LoginModule.m_hLoginHandle, nQueryType, stIn.getPointer(), stOut.getPointer(), null, 3000);
|
if(!bRet) {
|
System.err.printf("QueryPointTemper Failed!" + ToolKits.getErrorCodePrint());
|
return null;
|
}
|
|
stOut.read();
|
return stOut.stPointTempInfo;
|
}
|
|
/**
|
* 查询测温项
|
*/
|
public static NET_RADIOMETRYINFO queryItemTemper(int nChannel, int nPresetId, int nRuleId, int nMeterType) {
|
int nQueryType = NetSDKLib.NET_QUERY_DEV_RADIOMETRY_TEMPER;
|
|
// 入参
|
NET_IN_RADIOMETRY_GETTEMPER stIn = new NET_IN_RADIOMETRY_GETTEMPER();
|
stIn.stCondition.nPresetId = nPresetId;
|
stIn.stCondition.nRuleId = nRuleId;
|
stIn.stCondition.nMeterType = nMeterType; // eg: NET_RADIOMETRY_METERTYPE.NET_RADIOMETRY_METERTYPE_AREA;
|
stIn.stCondition.nChannel = nChannel;
|
|
// 出参
|
NET_OUT_RADIOMETRY_GETTEMPER stOut = new NET_OUT_RADIOMETRY_GETTEMPER();
|
|
stIn.write();
|
stOut.write();
|
boolean bRet = LoginModule.netsdk.CLIENT_QueryDevInfo(LoginModule.m_hLoginHandle, nQueryType, stIn.getPointer(), stOut.getPointer(), null, 3000);
|
if(!bRet) {
|
System.err.printf("QueryPointTemper Failed!" + ToolKits.getErrorCodePrint());
|
return null;
|
}
|
|
stOut.read();
|
return stOut.stTempInfo;
|
}
|
|
/**
|
* 开始查询信息
|
*/
|
public static boolean startFind(NET_IN_RADIOMETRY_STARTFIND stuIn) {
|
if(status.bSearching) {
|
stopFind();
|
}
|
|
/*
|
* 出参
|
*/
|
NET_OUT_RADIOMETRY_STARTFIND stuOut = new NET_OUT_RADIOMETRY_STARTFIND();
|
stuIn.write();
|
stuOut.write();
|
status.bSearching = LoginModule.netsdk.CLIENT_StartFind(LoginModule.m_hLoginHandle,
|
NET_FIND.NET_FIND_RADIOMETRY, stuIn.getPointer(), stuOut.getPointer(), 5000);
|
if (status.bSearching) {
|
stuOut.read();
|
status.nFinderHanle = stuOut.nFinderHanle;
|
status.nTotalCount = stuOut.nTotalCount;
|
}else {
|
System.err.printf("startFind Failed!" + ToolKits.getErrorCodePrint());
|
}
|
|
return status.bSearching;
|
}
|
|
/**
|
* 获取查询总个数
|
*/
|
public static int getTotalCount() {
|
return status.nTotalCount;
|
}
|
|
/**
|
* 查询信息
|
*/
|
public static NET_OUT_RADIOMETRY_DOFIND doFind(int nOffset, int nCount) {
|
if(!status.bSearching) {
|
System.err.printf("DoFind Failed! [need startFind]");
|
return null;
|
}
|
|
/*
|
* 入参
|
*/
|
NET_IN_RADIOMETRY_DOFIND stuIn = new NET_IN_RADIOMETRY_DOFIND();
|
stuIn.nFinderHanle = status.nFinderHanle;
|
stuIn.nBeginNumber = nOffset;
|
stuIn.nCount = nCount;
|
|
/*
|
* 出参
|
*/
|
NET_OUT_RADIOMETRY_DOFIND stuOut = new NET_OUT_RADIOMETRY_DOFIND();
|
|
stuIn.write();
|
stuOut.write();
|
if (!LoginModule.netsdk.CLIENT_DoFind(LoginModule.m_hLoginHandle,
|
NET_FIND.NET_FIND_RADIOMETRY, stuIn.getPointer(), stuOut.getPointer(), 5000)) {
|
System.err.printf("DoFind Failed!" + ToolKits.getErrorCodePrint());
|
return null;
|
}
|
|
stuOut.read();
|
return stuOut;
|
}
|
|
/**
|
* 停止查询信息
|
*/
|
public static void stopFind() {
|
if(!status.bSearching) {
|
return;
|
}
|
|
/*
|
* 入参
|
*/
|
NET_IN_RADIOMETRY_STOPFIND stuIn = new NET_IN_RADIOMETRY_STOPFIND();
|
stuIn.nFinderHanle = status.nFinderHanle;
|
|
/*
|
* 出参
|
*/
|
NET_OUT_RADIOMETRY_STOPFIND stuOut = new NET_OUT_RADIOMETRY_STOPFIND();
|
|
stuIn.write();
|
stuOut.write();
|
LoginModule.netsdk.CLIENT_StopFind(LoginModule.m_hLoginHandle,
|
NET_FIND.NET_FIND_RADIOMETRY, stuIn.getPointer(), stuOut.getPointer(), 5000);
|
|
status.bSearching = false;
|
status.nFinderHanle = 0;
|
// status.nTotalCount = 0;
|
|
return;
|
}
|
}
|