package com.iailab.netsdk.demo.frame.ThermalCamera; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.concurrent.locks.ReentrantLock; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.SwingUtilities; import com.sun.jna.Memory; import com.sun.jna.Native; import com.sun.jna.Pointer; import com.iailab.netsdk.common.BorderEx; import com.iailab.netsdk.common.Res; import com.iailab.netsdk.demo.module.ThermalCameraModule; import com.iailab.netsdk.lib.ToolKits; import com.iailab.netsdk.lib.NetSDKLib.*; /** * 热图信息对话框 */ public class HeatMapDialog extends JDialog{ /** * */ private static final long serialVersionUID = 1L; private JDialog target = this; private ReentrantLock lock = new ReentrantLock(); private NET_RADIOMETRY_DATA gData = new NET_RADIOMETRY_DATA(); public HeatMapDialog() { setTitle(Res.string().getShowInfo("HEATMAP")); setLayout(new BorderLayout()); setModal(true); pack(); setSize(400, 440); setResizable(false); setLocationRelativeTo(null); setDefaultCloseOperation(DISPOSE_ON_CLOSE); /////////////////////////////// operatePanel = new OperatePanel(); showPanel = new HeatMapShowPanel(); add(showPanel, BorderLayout.CENTER); add(operatePanel, BorderLayout.NORTH); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e){ try { ThermalCameraModule.radiometryDetach(); }finally { dispose(); } } }); } /** * 订阅回调 */ private RadiometryAttachCB cbNotify = new RadiometryAttachCB(); private class RadiometryAttachCB implements fRadiometryAttachCB { @Override public void invoke(LLong lAttachHandle, final NET_RADIOMETRY_DATA pBuf, int nBufLen, Pointer dwUser) { copyRadiometryData(pBuf); SwingUtilities.invokeLater(new Runnable() { public void run() { target.setTitle(Res.string().getShowInfo("HEATMAP")); operatePanel.saveBtn.setEnabled(true); showPanel.updateData(); } }); } } private void copyRadiometryData(NET_RADIOMETRY_DATA data) { lock.lock(); gData.stMetaData = data.stMetaData; gData.dwBufSize = data.dwBufSize; gData.pbDataBuf = new Memory(data.dwBufSize); gData.pbDataBuf.write(0, data.pbDataBuf.getByteArray(0, data.dwBufSize), 0, data.dwBufSize); lock.unlock(); } /** * 操作界面 * */ public class OperatePanel extends JPanel { /** * */ private static final long serialVersionUID = 1L; public OperatePanel() { BorderEx.set(this, Res.string().getShowInfo("HEATMAP_OPERATE"), 1); setLayout(new FlowLayout(FlowLayout.LEFT, 5, 10)); attachBtn = new JButton(Res.string().getShowInfo("RADIOMETRY_ATTACH")); fetchBtn = new JButton(Res.string().getShowInfo("RADIOMETRY_FETCH")); saveBtn = new JButton(Res.string().getShowInfo("SAVE_HEATMAP")); Dimension btnDimension = new Dimension(120, 20); attachBtn.setPreferredSize(btnDimension); fetchBtn.setPreferredSize(btnDimension); saveBtn.setPreferredSize(btnDimension); fetchBtn.setEnabled(false); saveBtn.setEnabled(false); add(attachBtn); add(fetchBtn); add(saveBtn); attachBtn.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { SwingUtilities.invokeLater(new Runnable() { public void run() { attach(); } }); } }); fetchBtn.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { SwingUtilities.invokeLater(new Runnable() { public void run() { fetch(); } }); } }); saveBtn.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { SwingUtilities.invokeLater(new Runnable() { public void run() { try { save(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); } }); } public void attach() { freeMemory(); target.setTitle(Res.string().getShowInfo("HEATMAP")); if (ThermalCameraModule.isAttaching()) { ThermalCameraModule.radiometryDetach(); fetchBtn.setEnabled(false); saveBtn.setEnabled(false); attachBtn.setText(Res.string().getShowInfo("RADIOMETRY_ATTACH")); }else { if (ThermalCameraModule.radiometryAttach(ThermalCameraFrame.THERMAL_CHANNEL, cbNotify)) { attachBtn.setText(Res.string().getShowInfo("RADIOMETRY_DETACH")); showPanel.clearData(); fetchBtn.setEnabled(true); }else { JOptionPane.showMessageDialog(null, ToolKits.getErrorCodeShow(), Res.string().getErrorMessage(), JOptionPane.ERROR_MESSAGE); } } } public void fetch() { freeMemory(); saveBtn.setEnabled(false); int nStatus = ThermalCameraModule.radiometryFetch(ThermalCameraFrame.THERMAL_CHANNEL); if (nStatus != -1) { showPanel.clearData(); String[] arrStatus = Res.string().getTemperStatusList(); if (nStatus >= 1 && nStatus <= arrStatus.length) { target.setTitle(Res.string().getShowInfo("HEATMAP") + " : " + arrStatus[nStatus-1]); } }else { JOptionPane.showMessageDialog(null, ToolKits.getErrorCodeShow(), Res.string().getErrorMessage(), JOptionPane.ERROR_MESSAGE); } } public void save() throws IOException { lock.lock(); boolean bSaved = ThermalCameraModule.saveData(gData); lock.unlock(); if (bSaved) { JOptionPane.showMessageDialog(null, Res.string().getShowInfo("HEATMAP_SAVE_SUCCESS"), Res.string().getPromptMessage(), JOptionPane.PLAIN_MESSAGE); }else { JOptionPane.showMessageDialog(null, ToolKits.getErrorCodeShow(), Res.string().getErrorMessage(), JOptionPane.ERROR_MESSAGE); } } public void freeMemory() { lock.lock(); if (gData.pbDataBuf != null) { Native.free(Pointer.nativeValue(gData.pbDataBuf)); Pointer.nativeValue(gData.pbDataBuf, 0); } lock.unlock(); } private JButton attachBtn; private JButton fetchBtn; private JButton saveBtn; } /** * 查询显示界面 * */ public class HeatMapShowPanel extends JPanel { /** * */ private static final long serialVersionUID = 1L; public HeatMapShowPanel() { BorderEx.set(this, Res.string().getShowInfo("HEATMAP_METADATA_INFO"), 1); setLayout(new FlowLayout(FlowLayout.CENTER, 15, 25)); JLabel heightLabel = new JLabel(Res.string().getShowInfo("HEIGHT"), JLabel.LEFT); heightTextField = new JTextField(); JLabel widthLabel = new JLabel(Res.string().getShowInfo("WIDTH"), JLabel.LEFT); widthTextField = new JTextField(); JLabel channelLabel = new JLabel(Res.string().getShowInfo("CHANNEL"), JLabel.LEFT); channelTextField = new JTextField(); JLabel timeLabel = new JLabel(Res.string().getShowInfo("TIME"), JLabel.LEFT); timeTextField = new JTextField(); JLabel lengthLabel = new JLabel(Res.string().getShowInfo("LENGTH"), JLabel.LEFT); lengthTextField = new JTextField(); JLabel sensorTypeLabel = new JLabel(Res.string().getShowInfo("SENSOR_TYPE"), JLabel.LEFT); sensorTypeTextField = new JTextField(); Dimension lableDimension = new Dimension(100, 20); Dimension textFieldDimension = new Dimension(140, 20); heightLabel.setPreferredSize(lableDimension); widthLabel.setPreferredSize(lableDimension); channelLabel.setPreferredSize(lableDimension); timeLabel.setPreferredSize(lableDimension); lengthLabel.setPreferredSize(lableDimension); sensorTypeLabel.setPreferredSize(lableDimension); heightTextField.setPreferredSize(textFieldDimension); widthTextField.setPreferredSize(textFieldDimension); channelTextField.setPreferredSize(textFieldDimension); timeTextField.setPreferredSize(textFieldDimension); lengthTextField.setPreferredSize(textFieldDimension); sensorTypeTextField.setPreferredSize(textFieldDimension); heightTextField.setEditable(false); widthTextField.setEditable(false); channelTextField.setEditable(false); timeTextField.setEditable(false); lengthTextField.setEditable(false); sensorTypeTextField.setEditable(false); add(heightLabel); add(heightTextField); add(widthLabel); add(widthTextField); add(channelLabel); add(channelTextField); add(timeLabel); add(timeTextField); add(lengthLabel); add(lengthTextField); add(sensorTypeLabel); add(sensorTypeTextField); } public void updateData() { String[] data = new String[6]; lock.lock(); data[0] = String.valueOf(gData.stMetaData.nHeight); data[1] = String.valueOf(gData.stMetaData.nWidth); data[2] = String.valueOf(gData.stMetaData.nChannel+1); data[3] = gData.stMetaData.stTime.toStringTimeEx(); data[4] = String.valueOf(gData.stMetaData.nLength); try { data[5] = new String(gData.stMetaData.szSensorType, "GBK").trim(); } catch (UnsupportedEncodingException e) { data[5] = new String(gData.stMetaData.szSensorType).trim(); } lock.unlock(); setData(data); } public void clearData() { setData(new String[6]); } private void setData(String[] data) { if (data.length != 6) { System.err.printf("data length %d != 6", data.length); return; } heightTextField.setText(data[0]); widthTextField.setText(data[1]); channelTextField.setText(data[2]); timeTextField.setText(data[3]); lengthTextField.setText(data[4]); sensorTypeTextField.setText(data[5]); } private JTextField heightTextField; private JTextField widthTextField; private JTextField channelTextField; private JTextField timeTextField; private JTextField lengthTextField; private JTextField sensorTypeTextField; } private OperatePanel operatePanel; private HeatMapShowPanel showPanel; }