From 76407ef42394ff1046c508a106c0b51812df2a0f Mon Sep 17 00:00:00 2001
From: rk <94314517@qq.com>
Date: 星期三, 10 十二月 2025 18:12:53 +0800
Subject: [PATCH] 钥匙柜开门添加 指纹方式
---
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/usb/DevComm.java | 1812 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 1,812 insertions(+), 0 deletions(-)
diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/usb/DevComm.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/usb/DevComm.java
new file mode 100644
index 0000000..de65fb7
--- /dev/null
+++ b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/usb/DevComm.java
@@ -0,0 +1,1812 @@
+package com.doumee.keyCabinet.utils.usb;
+
+import android.app.Activity;
+import android.content.Context;
+import android.os.SystemClock;
+import android.widget.Toast;
+
+import java.io.IOException;
+import java.security.InvalidParameterException;
+import java.util.Arrays;
+import java.util.LinkedList;
+import java.util.Queue;
+
+import android_serialport_api.ComBean;
+import android_serialport_api.SerialHelper;
+
+/**
+ * Created by KMS on 2016/8/23.
+ */
+public class DevComm {
+ public static final int MAX_DATA_LEN = 498;
+ public static final int IMAGE_DATA_UNIT = 496;
+ public static final int ID_NOTE_SIZE = 64;
+ public static final int MODULE_SN_LEN = 16;
+
+ private static final int SCSI_TIMEOUT = 5000; //ms
+ private static final int COMM_SLEEP_TIME = 40; //ms
+
+ private static final int CMD_PACKET_LEN = 26;
+ private static final int RCM_PACKET_LEN = 26;
+ private static final int RCM_DATA_OFFSET = 10;
+
+ /***************************************************************************/
+ /***************************************************************************/
+ private static final int CMD_PREFIX_CODE = 0xAA55;
+ private static final int CMD_DATA_PREFIX_CODE = 0xA55A;
+ private static final int RCM_PREFIX_CODE = 0x55AA;
+ private static final int RCM_DATA_PREFIX_CODE = 0x5AA5;
+
+ /***************************************************************************
+ * System Code (0x0000 ~ 0x001F, 0x0000 : Reserved)
+ ***************************************************************************/
+ private static final short CMD_TEST_CONNECTION = 0x0001;
+ private static final short CMD_SET_PARAM = 0x0002;
+ private static final short CMD_GET_PARAM = 0x0003;
+ private static final short CMD_GET_DEVICE_INFO = 0x0004;
+ private static final short CMD_ENTER_ISPMODE = 0x0005;
+ private static final short CMD_SET_ID_NOTE = 0x0006;
+ private static final short CMD_GET_ID_NOTE = 0x0007;
+ private static final short CMD_SET_MODULE_SN = 0x0008;
+ private static final short CMD_GET_MODULE_SN = 0x0009;
+
+ /***************************************************************************
+ * Sensor Code (0x0020 ~ 0x003F)
+ ***************************************************************************/
+ private static final short CMD_GET_IMAGE = 0x0020;
+ private static final short CMD_FINGER_DETECT = 0x0021;
+ private static final short CMD_UP_IMAGE = 0x0022;
+ private static final short CMD_DOWN_IMAGE = 0x0023;
+ private static final short CMD_SLED_CTRL = 0x0024;
+
+ /***************************************************************************
+ * Template Code (0x0040 ~ 0x005F)
+ ***************************************************************************/
+ private static final short CMD_STORE_CHAR = 0x0040;
+ private static final short CMD_LOAD_CHAR = 0x0041;
+ private static final short CMD_UP_CHAR = 0x0042;
+ private static final short CMD_DOWN_CHAR = 0x0043;
+ private static final short CMD_DEL_CHAR = 0x0044;
+ private static final short CMD_GET_EMPTY_ID = 0x0045;
+ private static final short CMD_GET_STATUS = 0x0046;
+ private static final short CMD_GET_BROKEN_ID = 0x0047;
+ private static final short CMD_GET_ENROLL_COUNT = 0x0048;
+
+ /***************************************************************************
+ * FingerPrint Alagorithm Code (0x0060 ~ 0x007F)
+ ***************************************************************************/
+ private static final short CMD_GENERATE = 0x0060;
+ private static final short CMD_MERGE = 0x0061;
+ private static final short CMD_MATCH = 0x0062;
+ private static final short CMD_SEARCH = 0x0063;
+ private static final short CMD_VERIFY = 0x0064;
+
+ /***************************************************************************
+ * Unknown Command
+ ***************************************************************************/
+ private static final short RCM_INCORRECT_COMMAND = 0x00FF;
+
+ /***************************************************************************
+ * Error Code
+ ***************************************************************************/
+ public static final int ERR_SUCCESS = 0;
+ public static final int ERR_FAIL = 1;
+ public static final int ERR_CONNECTION = 2;
+ public static final int ERR_VERIFY = 0x10;
+ public static final int ERR_IDENTIFY = 0x11;
+ public static final int ERR_TMPL_EMPTY = 0x12;
+ public static final int ERR_TMPL_NOT_EMPTY = 0x13;
+ public static final int ERR_ALL_TMPL_EMPTY = 0x14;
+ public static final int ERR_EMPTY_ID_NOEXIST = 0x15;
+ public static final int ERR_BROKEN_ID_NOEXIST = 0x16;
+ public static final int ERR_INVALID_TMPL_DATA = 0x17;
+ public static final int ERR_DUPLICATION_ID = 0x18;
+ public static final int ERR_BAD_QUALITY = 0x19;
+ public static final int ERR_MERGE_FAIL = 0x1A;
+ public static final int ERR_NOT_AUTHORIZED = 0x1B;
+ public static final int ERR_MEMORY = 0x1C;
+ public static final int ERR_INVALID_TMPL_NO = 0x1D;
+ public static final int ERR_INVALID_PARAM = 0x22;
+ public static final int ERR_GEN_COUNT = 0x25;
+ public static final int ERR_INVALID_BUFFER_ID = 0x26;
+ public static final int ERR_INVALID_OPERATION_MODE = 0x27;
+ public static final int ERR_FP_NOT_DETECTED = 0x28;
+
+ /***************************************************************************
+ * Parameter Index
+ ***************************************************************************/
+ public static final int DP_DEVICE_ID = 0;
+ public static final int DP_SECURITY_LEVEL = 1;
+ public static final int DP_DUP_CHECK = 2;
+ public static final int DP_BAUDRATE = 3;
+ public static final int DP_AUTO_LEARN = 4;
+
+ /***************************************************************************
+ * Device ID, Security Level
+ ***************************************************************************/
+ public static final int MIN_DEVICE_ID = 1;
+ public static final int MAX_DEVICE_ID = 255;
+ public static final int MIN_SECURITY_LEVEL = 1;
+ public static final int MAX_SECURITY_LEVEL = 5;
+
+ public static final int GD_TEMPLATE_NOT_EMPTY = 0x01;
+ public static final int GD_TEMPLATE_EMPTY = 0x00;
+
+ //--------------- For Usb Communication ------------//
+ public int m_nPacketSize;
+ public byte m_bySrcDeviceID = 1, m_byDstDeviceID = 1;
+ public byte[] m_abyPacket = new byte[64 * 1024];
+ public byte[] m_abyPacket2 = new byte[64 * 1024];
+ //--------------------------------------------------//
+
+ private final Context mApplicationContext;
+ private Activity m_parentAcitivity;
+ private static final int VID = 0x2009;
+ private static final int PID = 0x7638;
+
+ private UsbController m_usbBase;
+
+ // Serial Port
+ private DispQueueThread DispQueue;
+ private SerialControl m_SerialPort;
+
+ // uart variables
+ public byte[] m_pWriteBuffer;
+ public byte[] m_pReadBuffer;
+ public byte[] m_pUARTReadBuf;
+ public int m_nUARTReadLen;
+ public boolean m_bBufferHandle = false;
+
+ // Connection
+ public byte m_nConnected; // 0 : Not Connected, 1 : ttyUART, 2 : USB
+
+ public DevComm(Activity parentActivity, IUsbConnState usbConnState){
+ m_parentAcitivity = parentActivity;
+ mApplicationContext = parentActivity.getApplicationContext();
+
+ // usb init
+ m_usbBase = new UsbController(parentActivity, usbConnState, VID, PID);
+
+ // init variables
+ m_nConnected = 0;
+ m_nUARTReadLen = 0;
+ m_pWriteBuffer = new byte[DevComm.MAX_DATA_LEN];
+ m_pReadBuffer = new byte[DevComm.MAX_DATA_LEN];
+ m_pUARTReadBuf = new byte[DevComm.MAX_DATA_LEN];
+
+ // uart thread initialize
+ DispQueue = new DispQueueThread();
+ DispQueue.start();
+ m_SerialPort = new SerialControl();
+ }
+
+ public boolean IsInit(){
+ if (m_nConnected == 0)
+ return false;
+ else if (m_nConnected == 1)
+ return true;
+ else if (m_nConnected == 2)
+ return m_usbBase.IsInit();
+
+ return false;
+ }
+
+ public boolean OpenComm(String p_szDevice, int p_nBaudrate){
+ if (m_nConnected != 0)
+ return false;
+
+ if (p_szDevice == "USB") // usb mode
+ {
+ if (!m_usbBase.IsInit())
+ m_usbBase.init();
+ if (!m_usbBase.IsInit())
+ return false;
+ m_nConnected = 2;
+ }
+ else // tty uart mode
+ {
+ m_SerialPort.setPort(p_szDevice);
+ m_SerialPort.setBaudRate(p_nBaudrate);
+ try
+ {
+ m_SerialPort.open();
+ } catch (SecurityException e) {
+ Toast.makeText(mApplicationContext, "Open ttyUART device failed!", Toast.LENGTH_SHORT).show();
+ return false;
+ } catch (IOException e) {
+ Toast.makeText(mApplicationContext, "Open ttyUART device failed!", Toast.LENGTH_SHORT).show();
+ return false;
+ } catch (InvalidParameterException e) {
+ Toast.makeText(mApplicationContext, "Open ttyUART device failed!", Toast.LENGTH_SHORT).show();
+ return false;
+ }
+ m_nConnected = 1;
+ }
+
+ return true;
+ }
+
+ public boolean CloseComm(){
+ if (m_nConnected == 0) {
+ return false;
+ }
+ else if (m_nConnected == 1) { // tty uart mode
+ m_SerialPort.stopSend();
+ m_SerialPort.close();
+ }
+ else { // usb mode
+ m_usbBase.uninit();
+ }
+
+ m_nConnected = 0;
+ return true;
+ }
+
+ /************************************************************************/
+ /************************************************************************/
+ public int Run_TestConnection()
+ {
+ boolean w_bRet;
+
+ InitCmdPacket(CMD_TEST_CONNECTION, m_bySrcDeviceID, m_byDstDeviceID, m_abyPacket2, (short)0);
+
+ w_bRet = Send_Command(CMD_TEST_CONNECTION);
+
+ if(!w_bRet)
+ return ERR_CONNECTION;
+
+ return GetRetCode();
+ }
+ /************************************************************************/
+ /************************************************************************/
+ public int Run_SetParam(int p_nParamIndex, int p_nParamValue)
+ {
+ boolean w_bRet;
+ byte[] w_abyData = new byte[5];
+
+ w_abyData[0] = (byte)p_nParamIndex;
+
+ //memcpy(&w_abyData[1], &p_nParamValue, 4);
+ w_abyData[1] = (byte)(p_nParamValue & 0x000000ff);
+ w_abyData[2] = (byte)((p_nParamValue & 0x0000ff00) >> 8);
+ w_abyData[3] = (byte)((p_nParamValue & 0x00ff0000) >> 16);
+ w_abyData[4] = (byte)((p_nParamValue & 0xff000000) >> 24);
+
+ InitCmdPacket(CMD_SET_PARAM, m_bySrcDeviceID, m_byDstDeviceID, w_abyData, (short)5);
+
+ w_bRet = Send_Command(CMD_SET_PARAM);
+
+ if (!w_bRet)
+ return ERR_CONNECTION;
+
+ return GetRetCode();
+ }
+ /************************************************************************/
+ /************************************************************************/
+ int Run_GetParam(int p_nParamIndex, int[] p_pnParamValue)
+ {
+ boolean w_bRet;
+ byte[] w_abyData = new byte[1];
+
+ w_abyData[0] = (byte)p_nParamIndex;
+
+ InitCmdPacket(CMD_GET_PARAM, m_bySrcDeviceID, m_byDstDeviceID, w_abyData, (short)1);
+
+ w_bRet = Send_Command(CMD_GET_PARAM);
+
+ if(!w_bRet)
+ return ERR_CONNECTION;
+
+ if (GetRetCode() != ERR_SUCCESS)
+ return GetRetCode();
+
+ //memcpy(p_pnParamValue, g_pRcmPacket->m_abyData, 4);
+ p_pnParamValue[0] = (int)( (int)((m_abyPacket[RCM_DATA_OFFSET+3] << 24) & 0xFF000000) |
+ (int)((m_abyPacket[RCM_DATA_OFFSET+2] << 16) & 0x00FF0000) |
+ (int)((m_abyPacket[RCM_DATA_OFFSET+1] << 8) & 0x0000FF00) |
+ (int)(m_abyPacket[RCM_DATA_OFFSET+0] & 0x000000FF));
+
+ return ERR_SUCCESS;
+ }
+ /************************************************************************/
+ /************************************************************************/
+ public int Run_GetDeviceInfo(String[] p_szDevInfo)
+ {
+ int w_nDevInfoLen;
+ boolean w_bRet;
+ String w_strTmp;
+ byte[] w_szDevInfo;
+
+ InitCmdPacket(CMD_GET_DEVICE_INFO, m_bySrcDeviceID, m_byDstDeviceID, m_abyPacket2, 0);
+
+ w_bRet = Send_Command(CMD_GET_DEVICE_INFO);
+
+ if (!w_bRet)
+ return ERR_CONNECTION;
+
+ if (GetRetCode() != ERR_SUCCESS)
+ return GetRetCode();
+
+ w_nDevInfoLen = MAKEWORD(m_abyPacket[RCM_DATA_OFFSET+0], m_abyPacket[RCM_DATA_OFFSET+1]);
+
+ w_bRet = Receive_DataPacket(CMD_GET_DEVICE_INFO);
+
+ if(w_bRet == false)
+ return ERR_CONNECTION;
+
+ if ( GetRetCode() != ERR_SUCCESS )
+ return GetRetCode();
+
+ //memcpy(p_szDevInfo, g_pRcmPacket->m_abyData, w_wDevInfoLen);
+ w_szDevInfo = new byte[w_nDevInfoLen];
+ System.arraycopy(m_abyPacket, RCM_DATA_OFFSET, w_szDevInfo, 0, w_nDevInfoLen);
+ w_strTmp = new String(w_szDevInfo);
+ p_szDevInfo[0] = w_strTmp;
+
+ return ERR_SUCCESS;
+ }
+ /************************************************************************/
+ /************************************************************************/
+ int Run_SetIDNote(int p_nTmplNo, String p_pstrNote)
+ {
+ boolean w_bRet = false;
+ byte[] w_abyData = new byte[ID_NOTE_SIZE+2];
+ byte[] w_abyData2 = new byte[2];
+ byte[] w_abyNoteBuf = p_pstrNote.getBytes();
+
+ //. Assemble command packet
+ w_abyData2[0] = LOBYTE((short)(ID_NOTE_SIZE + 2));
+ w_abyData2[1] = HIBYTE((short)(ID_NOTE_SIZE + 2));
+
+ InitCmdPacket(CMD_SET_ID_NOTE, m_bySrcDeviceID, m_byDstDeviceID, w_abyData2, 2);
+
+ //. Send command packet to target
+ w_bRet = Send_Command(CMD_SET_ID_NOTE);
+
+ if(w_bRet == false)
+ return ERR_CONNECTION;
+
+ if( GetRetCode() != ERR_SUCCESS)
+ return GetRetCode();
+
+ //. Assemble data packet
+ memset(w_abyData, (byte)0, ID_NOTE_SIZE+2);
+ w_abyData[0] = LOBYTE((short)p_nTmplNo);
+ w_abyData[1] = HIBYTE((short)p_nTmplNo);
+ System.arraycopy(w_abyNoteBuf, 0, w_abyData, 2, w_abyNoteBuf.length);
+
+ InitCmdDataPacket(CMD_SET_ID_NOTE, m_bySrcDeviceID, m_byDstDeviceID, w_abyData, ID_NOTE_SIZE+2);
+
+ //. Send data packet to target
+ w_bRet = Send_DataPacket(CMD_SET_ID_NOTE);
+
+ if (w_bRet == false)
+ return ERR_CONNECTION;
+
+ return GetRetCode();
+ }
+ /************************************************************************/
+ /************************************************************************/
+ int Run_GetIDNote(int p_nTmplNo, String[] p_pstrNote)
+ {
+ boolean w_bRet = false;
+ byte[] w_abyData = new byte[2];
+ String w_strTmp;
+
+ //. Assemble command packet
+ w_abyData[0] = LOBYTE((short)p_nTmplNo);
+ w_abyData[1] = HIBYTE((short)p_nTmplNo);
+ InitCmdPacket(CMD_GET_ID_NOTE, m_bySrcDeviceID, m_byDstDeviceID, w_abyData, 2);
+
+ //. Send command packet to target
+ w_bRet = Send_Command(CMD_GET_ID_NOTE);
+
+ if(w_bRet == false)
+ return ERR_CONNECTION;
+
+ if (GetRetCode() != ERR_SUCCESS)
+ return GetRetCode();
+
+ w_bRet = Receive_DataPacket(CMD_GET_ID_NOTE);
+
+ if (w_bRet == false)
+ return ERR_CONNECTION;
+
+ if (GetRetCode() != ERR_SUCCESS)
+ return GetRetCode();
+
+ //memset(m_abyPacket2, (byte)0, ID_NOTE_SIZE+1);
+ memset(m_abyPacket2, (byte)0, 512);
+ System.arraycopy(m_abyPacket, RCM_DATA_OFFSET, m_abyPacket2, 0, ID_NOTE_SIZE);
+
+ w_strTmp = new String(m_abyPacket2);
+ p_pstrNote[0] = w_strTmp;
+
+ return ERR_SUCCESS;
+ }
+ /************************************************************************/
+ /************************************************************************/
+ int Run_SetModuleSN(String p_pstrModuleSN)
+ {
+ boolean w_bRet = false;
+ byte[] w_abyData = p_pstrModuleSN.getBytes();
+ byte[] w_abyModuleSN = new byte[MODULE_SN_LEN];
+ byte[] w_abyData2 = new byte[2];
+
+ memset(w_abyModuleSN, (byte)0, MODULE_SN_LEN);
+ System.arraycopy(w_abyData, 0, w_abyModuleSN, 0, w_abyData.length);
+
+ //. Assemble command packet
+ w_abyData2[0] = LOBYTE((short)(MODULE_SN_LEN));
+ w_abyData2[1] = HIBYTE((short)(MODULE_SN_LEN));
+
+ InitCmdPacket(CMD_SET_MODULE_SN, m_bySrcDeviceID, m_byDstDeviceID, w_abyData2, 2);
+
+ //. Send command packet to target
+ w_bRet = Send_Command(CMD_SET_MODULE_SN);
+
+ if(w_bRet == false)
+ return ERR_CONNECTION;
+
+ if( GetRetCode() != ERR_SUCCESS)
+ return GetRetCode();
+
+ //. Assemble data packet
+ InitCmdDataPacket(CMD_SET_MODULE_SN, m_bySrcDeviceID, m_byDstDeviceID, w_abyModuleSN, MODULE_SN_LEN);
+
+ //. Send data packet to target
+ w_bRet = Send_DataPacket(CMD_SET_MODULE_SN);
+
+ if (w_bRet == false)
+ return ERR_CONNECTION;
+
+ return GetRetCode();
+ }
+ /************************************************************************/
+ /************************************************************************/
+ int Run_GetModuleSN(String[] p_pstrModuleSN)
+ {
+ boolean w_bRet = false;
+ String w_strTmp;
+
+ //. Assemble command packet
+ InitCmdPacket(CMD_GET_MODULE_SN, m_bySrcDeviceID, m_byDstDeviceID, m_abyPacket2, 0);
+
+ //. Send command packet to target
+ w_bRet = Send_Command(CMD_GET_MODULE_SN);
+
+ if(w_bRet == false)
+ return ERR_CONNECTION;
+
+ if (GetRetCode() != ERR_SUCCESS)
+ return GetRetCode();
+
+ w_bRet = Receive_DataPacket(CMD_GET_MODULE_SN);
+
+ if (w_bRet == false)
+ return ERR_CONNECTION;
+
+ if (GetRetCode() != ERR_SUCCESS)
+ return GetRetCode();
+
+ //memset(m_abyPacket2, (byte)0, MODULE_SN_LEN+1);
+ memset(m_abyPacket2, (byte)0, 512);
+ System.arraycopy(m_abyPacket, RCM_DATA_OFFSET, m_abyPacket2, 0, MODULE_SN_LEN);
+
+ w_strTmp = new String(m_abyPacket2);
+ p_pstrModuleSN[0] = w_strTmp;
+
+ return ERR_SUCCESS;
+ }
+ /************************************************************************/
+ /************************************************************************/
+ public int Run_GetImage()
+ {
+ boolean w_bRet;
+
+ InitCmdPacket(CMD_GET_IMAGE, m_bySrcDeviceID, m_byDstDeviceID, m_abyPacket2, 0);
+
+ w_bRet = Send_Command(CMD_GET_IMAGE);
+
+ if(!w_bRet)
+ return ERR_CONNECTION;
+
+ return GetRetCode();
+ }
+ /************************************************************************/
+ /************************************************************************/
+ int Run_FingerDetect(int[] p_pnDetectResult)
+ {
+ boolean w_bRet;
+
+ InitCmdPacket(CMD_FINGER_DETECT, m_bySrcDeviceID, m_byDstDeviceID, m_abyPacket2, 0);
+
+ w_bRet = Send_Command(CMD_FINGER_DETECT);
+
+ if (!w_bRet)
+ return ERR_CONNECTION;
+
+ if (GetRetCode() != ERR_SUCCESS)
+ return GetRetCode();
+
+ p_pnDetectResult[0] = m_abyPacket[RCM_DATA_OFFSET];
+
+ return ERR_SUCCESS;
+ }
+ /************************************************************************/
+ /************************************************************************/
+ public int Run_UpImage(int p_nType, byte[] p_pFpData, int[] p_pnImgWidth, int[] p_pnImgHeight)
+ {
+ int i, n, r, w, h, size;
+ boolean w_bRet;
+ byte[] w_abyData = new byte[1];
+
+ w_abyData[0] = (byte)p_nType;
+
+ InitCmdPacket(CMD_UP_IMAGE, m_bySrcDeviceID, m_byDstDeviceID, w_abyData, 1);
+
+ w_bRet = Send_Command(CMD_UP_IMAGE);
+
+ if (!w_bRet)
+ return ERR_CONNECTION;
+
+ if (GetRetCode() != ERR_SUCCESS)
+ return GetRetCode();
+
+ w = MAKEWORD(m_abyPacket[RCM_DATA_OFFSET+0], m_abyPacket[RCM_DATA_OFFSET+1]);
+ h = MAKEWORD(m_abyPacket[RCM_DATA_OFFSET+2], m_abyPacket[RCM_DATA_OFFSET+3]);
+
+ size = w * h;
+ n = size / IMAGE_DATA_UNIT;
+ r = size % IMAGE_DATA_UNIT;
+
+ if (m_nConnected == 1) {
+ for (i=0; i<n; i++)
+ {
+ w_bRet = Receive_DataPacket(CMD_UP_IMAGE);
+ if(w_bRet == false)
+ return ERR_CONNECTION;
+
+ if (GetRetCode() != ERR_SUCCESS)
+ return GetRetCode();
+
+ System.arraycopy(m_abyPacket, RCM_DATA_OFFSET + 2, p_pFpData, i * IMAGE_DATA_UNIT, IMAGE_DATA_UNIT);
+ }
+
+ if (r > 0)
+ {
+ w_bRet = Receive_DataPacket(CMD_UP_IMAGE);
+ if(w_bRet == false)
+ return ERR_CONNECTION;
+
+ if (GetRetCode() != ERR_SUCCESS)
+ return GetRetCode();
+
+ System.arraycopy(m_abyPacket, RCM_DATA_OFFSET + 2, p_pFpData, i * IMAGE_DATA_UNIT, r);
+ }
+ }
+ else if (m_nConnected == 2) {
+ w_bRet = USB_ReceiveImage(p_pFpData, w * h);
+ if (w_bRet == false)
+ return ERR_CONNECTION;
+ }
+ else {
+ return ERR_CONNECTION;
+ }
+
+ p_pnImgWidth[0] = w;
+ p_pnImgHeight[0] = h;
+
+ return ERR_SUCCESS;
+ }
+ /************************************************************************/
+ /************************************************************************/
+ int Run_DownImage(byte[] p_pData, int p_nWidth, int p_nHeight)
+ {
+ /*
+ int i, n, r, w, h;
+ boolean w_bRet;
+ BYTE w_abyData[840];
+
+ w = p_nWidth;
+ h = p_nHeight;
+
+ w_abyData[0] = LOBYTE(p_nWidth);
+ w_abyData[1] = HIBYTE(p_nWidth);
+ w_abyData[2] = LOBYTE(p_nHeight);
+ w_abyData[3] = HIBYTE(p_nHeight);
+
+ //. Assemble command packet
+ InitCmdPacket(CMD_DOWN_IMAGE, m_bySrcDeviceID, m_byDstDeviceID, w_abyData, 4);
+
+ Send_Command(CMD_DOWN_IMAGE, w_bRet, m_bySrcDeviceID, m_byDstDeviceID);
+
+ if(!w_bRet)
+ return ERR_CONNECTION;
+
+ if (GetRetCode() != ERR_SUCCESS)
+ return GetRetCode();
+
+ n = (w*h)/DOWN_IMAGE_DATA_UINT;
+ r = (w*h)%DOWN_IMAGE_DATA_UINT;
+
+ w_bRet = USB_DownImage(m_hUsbHandle, p_pData, p_nWidth*p_nHeight);
+
+ if(w_bRet == false)
+ return ERR_CONNECTION;
+ */
+ return ERR_SUCCESS;
+ }
+ /************************************************************************/
+ /************************************************************************/
+ public int Run_SLEDControl(int p_nState)
+ {
+ boolean w_bRet;
+ byte[] w_abyData = new byte[2];
+
+ w_abyData[0] = LOBYTE((short)p_nState);
+ w_abyData[1] = HIBYTE((short)p_nState);
+
+ InitCmdPacket(CMD_SLED_CTRL, m_bySrcDeviceID, m_byDstDeviceID, w_abyData, 2);
+
+ w_bRet = Send_Command(CMD_SLED_CTRL);
+
+ if(!w_bRet)
+ return ERR_CONNECTION;
+
+ return GetRetCode();
+ }
+ /************************************************************************/
+ /************************************************************************/
+ public int Run_StoreChar(int p_nTmplNo, int p_nRamBufferID, int[] p_pnDupTmplNo)
+ {
+ boolean w_bRet;
+ byte[] w_abyData = new byte[4];
+
+ w_abyData[0] = LOBYTE((short)p_nTmplNo);
+ w_abyData[1] = HIBYTE((short)p_nTmplNo);
+ w_abyData[2] = LOBYTE((short)p_nRamBufferID);
+ w_abyData[3] = HIBYTE((short)p_nRamBufferID);
+
+ InitCmdPacket(CMD_STORE_CHAR, m_bySrcDeviceID, m_byDstDeviceID, w_abyData, 4);
+
+ //. Send command packet to target
+ w_bRet = Send_Command(CMD_STORE_CHAR);
+
+ if (!w_bRet)
+ return ERR_CONNECTION;
+
+ if (GetRetCode() != ERR_SUCCESS)
+ {
+ if (GetRetCode() == ERR_DUPLICATION_ID)
+ p_pnDupTmplNo[0] = MAKEWORD(m_abyPacket[RCM_DATA_OFFSET+0], m_abyPacket[RCM_DATA_OFFSET+1]);
+
+ return GetRetCode();
+ }
+
+ return GetRetCode();
+ }
+ /************************************************************************/
+ /************************************************************************/
+ public int Run_LoadChar(int p_nTmplNo, int p_nRamBufferID)
+ {
+ boolean w_bRet;
+ byte[] w_abyData = new byte[4];
+
+ w_abyData[0] = LOBYTE((short)p_nTmplNo);
+ w_abyData[1] = HIBYTE((short)p_nTmplNo);
+ w_abyData[2] = LOBYTE((short)p_nRamBufferID);
+ w_abyData[3] = HIBYTE((short)p_nRamBufferID);
+
+ InitCmdPacket(CMD_LOAD_CHAR, m_bySrcDeviceID, m_byDstDeviceID, w_abyData, 4);
+
+ //. Send command packet to target
+ w_bRet = Send_Command(CMD_LOAD_CHAR);
+
+ if (!w_bRet)
+ return ERR_CONNECTION;
+
+ return GetRetCode();
+ }
+ /************************************************************************/
+ /************************************************************************/
+ public int Run_UpChar(int p_nRamBufferID, byte[] p_pbyTemplate)
+ {
+ boolean w_bRet = false;
+ byte[] w_abyData = new byte[2];
+
+ //. Assemble command packet
+ w_abyData[0] = LOBYTE((short)p_nRamBufferID);
+ w_abyData[1] = HIBYTE((short)p_nRamBufferID);
+ InitCmdPacket(CMD_UP_CHAR, m_bySrcDeviceID, m_byDstDeviceID, w_abyData, 2);
+
+ //. Send command packet to target
+ w_bRet = Send_Command(CMD_UP_CHAR);
+
+ if(w_bRet == false)
+ return ERR_CONNECTION;
+
+ if (GetRetCode() != ERR_SUCCESS)
+ return GetRetCode();
+
+ w_bRet = Receive_DataPacket(CMD_UP_CHAR);
+
+ if (w_bRet == false)
+ return ERR_CONNECTION;
+
+ if (GetRetCode() != ERR_SUCCESS)
+ return GetRetCode();
+
+ //memcpy(p_pbyTemplate, &g_pRcmPacket->m_abyData[0], GD_RECORD_SIZE);
+ System.arraycopy(m_abyPacket, RCM_DATA_OFFSET, p_pbyTemplate, 0, MAX_DATA_LEN);
+
+ return ERR_SUCCESS;
+ }
+ /************************************************************************/
+ /************************************************************************/
+ public int Run_DownChar(int p_nRamBufferID, byte[] p_pbyTemplate)
+ {
+ boolean w_bRet = false;
+ byte[] w_abyData = new byte[MAX_DATA_LEN+2];
+ byte[] w_abyData2 = new byte[2];
+
+ //. Assemble command packet
+ w_abyData2[0] = LOBYTE((short)(MAX_DATA_LEN + 2));
+ w_abyData2[1] = HIBYTE((short)(MAX_DATA_LEN + 2));
+
+ InitCmdPacket(CMD_DOWN_CHAR, m_bySrcDeviceID, m_byDstDeviceID, w_abyData2, 2);
+
+ //. Send command packet to target
+ w_bRet = Send_Command(CMD_DOWN_CHAR);
+
+ if(w_bRet == false)
+ return ERR_CONNECTION;
+
+ if( GetRetCode() != ERR_SUCCESS)
+ return GetRetCode();
+
+ SystemClock.sleep(10);
+
+ //. Assemble data packet
+ w_abyData[0] = LOBYTE((short)p_nRamBufferID);
+ w_abyData[1] = HIBYTE((short)p_nRamBufferID);
+ //memcpy(&w_abyData[2], p_pbyTemplate, GD_RECORD_SIZE);
+ System.arraycopy(p_pbyTemplate, 0, w_abyData, 2, MAX_DATA_LEN);
+
+ InitCmdDataPacket(CMD_DOWN_CHAR, m_bySrcDeviceID, m_byDstDeviceID, w_abyData, MAX_DATA_LEN+2);
+
+ //. Send data packet to target
+ w_bRet = Send_DataPacket(CMD_DOWN_CHAR);
+
+ if (w_bRet == false)
+ return ERR_CONNECTION;
+
+ return GetRetCode();
+ }
+ /************************************************************************/
+ /************************************************************************/
+ public int Run_DelChar(int p_nSTmplNo, int p_nETmplNo)
+ {
+ boolean w_bRet;
+ byte[] w_abyData = new byte[4];
+
+ w_abyData[0] = LOBYTE((short)p_nSTmplNo);
+ w_abyData[1] = HIBYTE((short)p_nSTmplNo);
+ w_abyData[2] = LOBYTE((short)p_nETmplNo);
+ w_abyData[3] = HIBYTE((short)p_nETmplNo);
+
+ //. Assemble command packet
+ InitCmdPacket(CMD_DEL_CHAR, m_bySrcDeviceID, m_byDstDeviceID, w_abyData, 4);
+
+ w_bRet = Send_Command(CMD_DEL_CHAR);
+
+ if(!w_bRet)
+ return ERR_CONNECTION;
+
+ return GetRetCode();
+ }
+ /************************************************************************/
+ /************************************************************************/
+ public int Run_GetEmptyID(int p_nSTmplNo, int p_nETmplNo, int[] p_pnEmptyID)
+ {
+ boolean w_bRet;
+ byte[] w_abyData = new byte[4];
+
+ w_abyData[0] = LOBYTE((short)p_nSTmplNo);
+ w_abyData[1] = HIBYTE((short)p_nSTmplNo);
+ w_abyData[2] = LOBYTE((short)p_nETmplNo);
+ w_abyData[3] = HIBYTE((short)p_nETmplNo);
+
+ //. Assemble command packet
+ InitCmdPacket(CMD_GET_EMPTY_ID, m_bySrcDeviceID, m_byDstDeviceID, w_abyData, 4);
+
+ w_bRet = Send_Command(CMD_GET_EMPTY_ID);
+
+ if(!w_bRet)
+ return ERR_CONNECTION;
+
+ if ( GetRetCode() != ERR_SUCCESS )
+ return GetRetCode();
+
+ p_pnEmptyID[0] = MAKEWORD(m_abyPacket[RCM_DATA_OFFSET+0], m_abyPacket[RCM_DATA_OFFSET+1]);
+
+ return ERR_SUCCESS;
+ }
+ /************************************************************************/
+ /************************************************************************/
+ public int Run_GetStatus(int p_nTmplNo, int[] p_pnStatus)
+ {
+ boolean w_bRet;
+ byte[] w_abyData = new byte[2];
+
+ w_abyData[0] = LOBYTE((short)p_nTmplNo);
+ w_abyData[1] = HIBYTE((short)p_nTmplNo);
+
+ InitCmdPacket(CMD_GET_STATUS, m_bySrcDeviceID, m_byDstDeviceID, w_abyData, 2);
+
+ w_bRet = Send_Command(CMD_GET_STATUS);
+
+ if(!w_bRet)
+ return ERR_CONNECTION;
+
+ if ( GetRetCode() != ERR_SUCCESS )
+ return GetRetCode();
+
+ p_pnStatus[0] = m_abyPacket[RCM_DATA_OFFSET+0];
+
+ return ERR_SUCCESS;
+ }
+ /************************************************************************/
+ /************************************************************************/
+ public int Run_GetBrokenID(int p_nSTmplNo, int p_nETmplNo, int[] p_pnCount, int[] p_pnFirstID)
+ {
+ boolean w_bRet;
+ byte[] w_abyData = new byte[4];
+
+ w_abyData[0] = LOBYTE((short)p_nSTmplNo);
+ w_abyData[1] = HIBYTE((short)p_nSTmplNo);
+ w_abyData[2] = LOBYTE((short)p_nETmplNo);
+ w_abyData[3] = HIBYTE((short)p_nETmplNo);
+
+ //. Assemble command packet
+ InitCmdPacket(CMD_GET_BROKEN_ID, m_bySrcDeviceID, m_byDstDeviceID, w_abyData, 4);
+
+ w_bRet = Send_Command(CMD_GET_BROKEN_ID);
+
+ if(!w_bRet)
+ return ERR_CONNECTION;
+
+ if (GetRetCode() != ERR_SUCCESS)
+ return GetRetCode();
+
+ p_pnCount[0] = MAKEWORD(m_abyPacket[RCM_DATA_OFFSET+0], m_abyPacket[RCM_DATA_OFFSET+1]);
+ p_pnFirstID[0] = MAKEWORD(m_abyPacket[RCM_DATA_OFFSET+2], m_abyPacket[RCM_DATA_OFFSET+3]);
+
+ return ERR_SUCCESS;
+ }
+ /************************************************************************/
+ /************************************************************************/
+ public int Run_GetEnrollCount(int p_nSTmplNo, int p_nETmplNo, int[] p_pnEnrollCount)
+ {
+ boolean w_bRet;
+ byte[] w_abyData = new byte[4];
+
+ w_abyData[0] = LOBYTE((short)p_nSTmplNo);
+ w_abyData[1] = HIBYTE((short)p_nSTmplNo);
+ w_abyData[2] = LOBYTE((short)p_nETmplNo);
+ w_abyData[3] = HIBYTE((short)p_nETmplNo);
+
+ //. Assemble command packet
+ InitCmdPacket(CMD_GET_ENROLL_COUNT, m_bySrcDeviceID, m_byDstDeviceID, w_abyData, 4);
+
+ w_bRet = Send_Command(CMD_GET_ENROLL_COUNT);
+
+ if (!w_bRet)
+ return ERR_CONNECTION;
+
+ if(GetRetCode() != ERR_SUCCESS)
+ return GetRetCode();
+
+ p_pnEnrollCount[0] = MAKEWORD(m_abyPacket[RCM_DATA_OFFSET+0], m_abyPacket[RCM_DATA_OFFSET+1]);
+
+ return ERR_SUCCESS;
+ }
+ /************************************************************************/
+ /************************************************************************/
+ public int Run_Generate(int p_nRamBufferID)
+ {
+ boolean w_bRet;
+ byte[] w_abyData = new byte[2];
+
+ w_abyData[0] = LOBYTE((short)p_nRamBufferID);
+ w_abyData[1] = HIBYTE((short)p_nRamBufferID);
+
+ InitCmdPacket(CMD_GENERATE, m_bySrcDeviceID, m_byDstDeviceID, w_abyData, 2);
+
+ //. Send command packet to target
+ w_bRet = Send_Command(CMD_GENERATE);
+
+ if(!w_bRet)
+ return ERR_CONNECTION;
+
+ return GetRetCode();
+ }
+ /************************************************************************/
+ /************************************************************************/
+ public int Run_Merge(int p_nRamBufferID, int p_nMergeCount)
+ {
+ boolean w_bRet;
+ byte[] w_abyData = new byte[3];
+
+ w_abyData[0] = LOBYTE((short)p_nRamBufferID);
+ w_abyData[1] = HIBYTE((short)p_nRamBufferID);
+ w_abyData[2] = (byte)p_nMergeCount;
+
+ InitCmdPacket(CMD_MERGE, m_bySrcDeviceID, m_byDstDeviceID, w_abyData, 3);
+
+ w_bRet = Send_Command(CMD_MERGE);
+
+ if (!w_bRet)
+ return ERR_CONNECTION;
+
+ return GetRetCode();
+ }
+ /************************************************************************/
+ /************************************************************************/
+ public int Run_Match(int p_nRamBufferID0, int p_nRamBufferID1)
+ {
+ boolean w_bRet;
+ byte[] w_abyData = new byte[4];
+
+ w_abyData[0] = LOBYTE((short)p_nRamBufferID0);
+ w_abyData[1] = HIBYTE((short)p_nRamBufferID0);
+ w_abyData[2] = LOBYTE((short)p_nRamBufferID1);
+ w_abyData[3] = HIBYTE((short)p_nRamBufferID1);
+
+ InitCmdPacket(CMD_MATCH, m_bySrcDeviceID, m_byDstDeviceID, w_abyData, 4);
+
+ w_bRet = Send_Command(CMD_MATCH);
+
+ if (!w_bRet)
+ return ERR_CONNECTION;
+
+ return GetRetCode();
+ }
+ /************************************************************************/
+ /************************************************************************/
+ public int Run_Search(int p_nRamBufferID, int p_nStartID, int p_nSearchCount, int[] p_pnTmplNo, int[] p_pnLearnResult)
+ {
+ boolean w_bRet;
+ byte[] w_abyData = new byte[6];
+
+ w_abyData[0] = LOBYTE((short)p_nRamBufferID);
+ w_abyData[1] = HIBYTE((short)p_nRamBufferID);
+ w_abyData[2] = LOBYTE((short)p_nStartID);
+ w_abyData[3] = HIBYTE((short)p_nStartID);
+ w_abyData[4] = LOBYTE((short)p_nSearchCount);
+ w_abyData[5] = HIBYTE((short)p_nSearchCount);
+
+ InitCmdPacket(CMD_SEARCH, m_bySrcDeviceID, m_byDstDeviceID, w_abyData, 6);
+
+ //. Send command packet to target
+ w_bRet = Send_Command(CMD_SEARCH);
+
+ if (!w_bRet)
+ return ERR_CONNECTION;
+
+ if(GetRetCode() != ERR_SUCCESS)
+ return GetRetCode();
+
+ p_pnTmplNo[0] = MAKEWORD(m_abyPacket[RCM_DATA_OFFSET+0], m_abyPacket[RCM_DATA_OFFSET+1]);
+ p_pnLearnResult[0] = m_abyPacket[RCM_DATA_OFFSET+2];
+
+ return GetRetCode();
+ }
+ /************************************************************************/
+ /************************************************************************/
+ public int Run_Verify(int p_nTmplNo, int p_nRamBufferID, int[] p_pnLearnResult)
+ {
+ boolean w_bRet;
+ byte[] w_abyData = new byte[4];
+
+ w_abyData[0] = LOBYTE((short)p_nTmplNo);
+ w_abyData[1] = HIBYTE((short)p_nTmplNo);
+ w_abyData[2] = LOBYTE((short)p_nRamBufferID);
+ w_abyData[3] = HIBYTE((short)p_nRamBufferID);
+
+ //. Assemble command packet
+ InitCmdPacket(CMD_VERIFY, m_bySrcDeviceID, m_byDstDeviceID, w_abyData, 4);
+
+ w_bRet = Send_Command(CMD_VERIFY);
+
+ if (!w_bRet)
+ return ERR_CONNECTION;
+
+ p_pnLearnResult[0] = m_abyPacket[RCM_DATA_OFFSET+2];
+
+ return GetRetCode();
+ }
+
+ public boolean GetDeviceInformation(String[] deviceInfo)
+ {
+ int[] w_nRecvLen = new int[1];
+ byte[] w_abyPCCmd = new byte[6];
+ byte[] w_abyData = new byte[32];
+
+ String w_strTmp;
+ boolean w_bRet;
+
+ Arrays.fill(w_abyPCCmd, (byte) 0);
+
+ w_abyPCCmd[2] = 0x04;
+
+ w_bRet = SendPackage(w_abyPCCmd, w_abyData);
+
+ //Toast.makeText(mApplicationContext, "GetDeviceInformation, SendPackage ret = " + w_bRet, Toast.LENGTH_SHORT).show();
+
+ if (!w_bRet)
+ {
+ return false;
+ }
+
+ w_bRet = RecvPackage(w_abyData, w_nRecvLen);
+
+ //Toast.makeText(mApplicationContext, "GetDeviceInformation, RecvPackage : " + w_bRet, Toast.LENGTH_SHORT).show();
+
+ if (!w_bRet)
+ {
+ return false;
+ }
+
+ w_strTmp = new String(w_abyData);
+ deviceInfo[0] = w_strTmp;
+
+ //Toast.makeText(mApplicationContext, "GetDeviceInformation, Recv Data : " + w_strTmp, Toast.LENGTH_SHORT).show();
+
+ return true;
+ }
+
+
+
+ private boolean SendPackage(byte[] pPCCmd, byte[] pData)
+ {
+ int nDataLen;
+
+ pPCCmd[0] = (byte)0xEF;
+ pPCCmd[1] = 0x01;
+
+ nDataLen = (int)((int)((pPCCmd[5] << 8) & 0x0000FF00) | (int)(pPCCmd[4] & 0x000000FF));
+
+ return m_usbBase.UsbSCSIWrite(pPCCmd, 6, pData, nDataLen, 5000);
+ }
+
+ private boolean RecvPackage(byte[] pData, int[] pLevRen)
+ {
+ int w_nLen;
+ byte[] w_abyPCCmd = new byte[6];
+ byte[] w_abyRespond = new byte[4];
+ boolean w_bRet;
+
+ w_abyPCCmd[0] = (byte)0xEF;
+ w_abyPCCmd[1] = 0x02;
+ w_abyPCCmd[2] = 0;
+ w_abyPCCmd[3] = 0;
+ w_abyPCCmd[4] = 0;
+ w_abyPCCmd[5] = 0;
+
+ // receive status
+ w_bRet = m_usbBase.UsbSCSIRead(w_abyPCCmd, 6, w_abyRespond, 4, 5000);
+
+ if (!w_bRet)
+ return false;
+
+ // receive data
+ //w_nLen = (int)((w_abyRespond[3] << 8) | w_abyRespond[2]);
+ w_nLen = (int)((int)((w_abyRespond[3] << 8) & 0x0000FF00) | (int)(w_abyRespond[2] & 0x000000FF));
+
+ if (w_nLen > 0)
+ {
+ //w_nTime = SystemClock.elapsedRealtime();
+
+ w_abyPCCmd[1] = 0x03;
+ w_bRet = m_usbBase.UsbSCSIRead(w_abyPCCmd, 6, pData, w_nLen, 5000);
+
+ //w_nTime = SystemClock.elapsedRealtime() - w_nTime;
+
+ if (!w_bRet)
+ return false;
+
+ pLevRen[0] = w_nLen;
+ }
+
+ return true;
+ }
+
+ /***************************************************************************
+ * Get Return Code
+ ***************************************************************************/
+ private short GetRetCode()
+ {
+ return (short)((int)((m_abyPacket[9] << 8) & 0x0000FF00) | (int)(m_abyPacket[8] & 0x000000FF));
+ }
+
+ /***************************************************************************
+ * Get Data Length
+ ***************************************************************************/
+ private short GetDataLen()
+ {
+ return (short)(((m_abyPacket[7] << 8) & 0x0000FF00) | (m_abyPacket[6] & 0x000000FF));
+ }
+
+ /***************************************************************************
+ * Set Data Length
+ ***************************************************************************/
+ private void SetDataLen(short p_wDataLen)
+ {
+ m_abyPacket[6] = (byte)(p_wDataLen & 0xFF);
+ m_abyPacket[7] = (byte)(((p_wDataLen & 0xFF00) >> 8) & 0xFF);
+ }
+
+ /***************************************************************************
+ * Set Command Data
+ ***************************************************************************/
+ private void SetCmdData(short p_wData, boolean p_bFirst)
+ {
+ if (p_bFirst)
+ {
+ m_abyPacket[8] = (byte)(p_wData & 0xFF);
+ m_abyPacket[9] = (byte)(((p_wData & 0xFF00) >> 8) & 0xFF);
+ }
+ else
+ {
+ m_abyPacket[10] = (byte)(p_wData & 0xFF);
+ m_abyPacket[11] = (byte)(((p_wData & 0xFF00) >> 8) & 0xFF);
+ }
+ }
+
+ /***************************************************************************
+ * Get Command Data
+ ***************************************************************************/
+ private short GetCmdData(boolean p_bFirst)
+ {
+ if (p_bFirst)
+ {
+ return (short)(((m_abyPacket[9] << 8) & 0x0000FF00) | (m_abyPacket[8] & 0x000000FF));
+ }
+ else
+ {
+ return (short)(((m_abyPacket[11] << 8) & 0x0000FF00) | (m_abyPacket[10] & 0x000000FF));
+ }
+ }
+
+ /***************************************************************************
+ * Get 2bytes packet checksum(pDataPkt[0] + pDataPkt[1] + ....)
+ ***************************************************************************/
+ private short CalcChkSumOfPkt(byte[] pDataPkt, int nSize)
+ {
+ int i, nChkSum = 0;
+
+ for(i=0;i<nSize;i++)
+ {
+ if ((int)pDataPkt[i] < 0)
+ nChkSum = nChkSum + ((int)pDataPkt[i] + 256);
+ else
+ nChkSum = nChkSum + pDataPkt[i];
+ }
+
+ return (short)nChkSum;
+ }
+
+ /***************************************************************************
+ * Make Command Packet
+ ***************************************************************************/
+ void InitCmdPacket(short wCMDCode, byte bySrcDeviceID, byte byDstDeviceID, byte[] pbyData, int nDataLen)
+ {
+ short w_wCheckSum;
+
+ memset(m_abyPacket, (byte)0, CMD_PACKET_LEN);
+
+ //g_pCmdPacket->m_wPrefix = CMD_PREFIX_CODE;
+ m_abyPacket[0] = (byte)(CMD_PREFIX_CODE & 0xFF);
+ m_abyPacket[1] = (byte)((CMD_PREFIX_CODE >> 8) & 0xFF);
+
+ //g_pCmdPacket->m_bySrcDeviceID = p_bySrcDeviceID;
+ m_abyPacket[2] = bySrcDeviceID;
+
+ //g_pCmdPacket->m_byDstDeviceID = p_byDstDeviceID;
+ m_abyPacket[3] = byDstDeviceID;
+
+ //g_pCmdPacket->m_wCMDCode = p_wCMDCode;
+ m_abyPacket[4] = (byte)(wCMDCode & 0xFF);
+ m_abyPacket[5] = (byte)((wCMDCode >> 8) & 0xFF);
+
+ //g_pCmdPacket->m_wDataLen = p_wDataLen;
+ m_abyPacket[6] = (byte)(nDataLen & 0xFF);
+ m_abyPacket[7] = (byte)((nDataLen >> 8) & 0xFF);
+
+ if (nDataLen > 0)
+ //memcpy(g_pCmdPacket->m_abyData, p_pbyData, wDataLen);
+ System.arraycopy(pbyData, 0, m_abyPacket, 8, nDataLen);
+
+ w_wCheckSum = CalcChkSumOfPkt(m_abyPacket, CMD_PACKET_LEN-2);
+
+ //g_pCmdPacket->m_wCheckSum = w_wCheckSum;
+ m_abyPacket[24] = (byte)(w_wCheckSum & 0xFF);
+ m_abyPacket[25] = (byte)((w_wCheckSum >> 8) & 0xFF);
+
+ m_nPacketSize = CMD_PACKET_LEN;
+ }
+ /***************************************************************************
+ * Make Data Packet
+ ***************************************************************************/
+ void InitCmdDataPacket(short wCMDCode, byte bySrcDeviceID, byte byDstDeviceID, byte[] pbyData, int nDataLen)
+ {
+ short w_wCheckSum;
+
+ //g_pCmdPacket->m_wPrefix = CMD_DATA_PREFIX_CODE;
+ m_abyPacket[0] = (byte)(CMD_DATA_PREFIX_CODE & 0xFF);
+ m_abyPacket[1] = (byte)((CMD_DATA_PREFIX_CODE >> 8) & 0xFF);
+
+ //g_pCmdPacket->m_bySrcDeviceID = p_bySrcDeviceID;
+ m_abyPacket[2] = bySrcDeviceID;
+
+ //g_pCmdPacket->m_byDstDeviceID = p_byDstDeviceID;
+ m_abyPacket[3] = byDstDeviceID;
+
+ //g_pCmdPacket->m_wCMDCode = p_wCMDCode;
+ m_abyPacket[4] = (byte)(wCMDCode & 0xFF);
+ m_abyPacket[5] = (byte)((wCMDCode >> 8) & 0xFF);
+
+ //g_pCmdPacket->m_wDataLen = p_wDataLen;
+ m_abyPacket[6] = (byte)(nDataLen & 0xFF);
+ m_abyPacket[7] = (byte)((nDataLen >> 8) & 0xFF);
+
+ //memcpy(&g_pCmdPacket->m_abyData[0], p_pbyData, p_wDataLen);
+ System.arraycopy(pbyData, 0, m_abyPacket, 8, nDataLen);
+
+ //. Set checksum
+ w_wCheckSum = CalcChkSumOfPkt(m_abyPacket, nDataLen + 8);
+
+ m_abyPacket[nDataLen+8] = (byte)(w_wCheckSum & 0xFF);
+ m_abyPacket[nDataLen+9] = (byte)((w_wCheckSum >> 8) & 0xFF);
+
+ m_nPacketSize = nDataLen + 10;
+ }
+ /***************************************************************************
+ * Check Packet
+ ***************************************************************************/
+ boolean CheckReceive( byte[] pbyPacket, int nPacketLen, short wPrefix, short wCMDCode )
+ {
+ short w_wCalcCheckSum, w_wCheckSum, w_wTmp;
+
+ //. Check prefix code
+ w_wTmp = (short)((int)((pbyPacket[1] << 8) & 0x0000FF00) | (int)(pbyPacket[0] & 0x000000FF));
+
+ if (wPrefix != w_wTmp)
+ {
+ return false;
+ }
+
+ //. Check checksum
+ w_wCheckSum = (short)((int)((pbyPacket[nPacketLen-1] << 8) & 0x0000FF00) | (int)(pbyPacket[nPacketLen-2] & 0x000000FF));
+
+ w_wCalcCheckSum = CalcChkSumOfPkt(pbyPacket, nPacketLen-2);
+
+ if (w_wCheckSum != w_wCalcCheckSum)
+ {
+ return false;
+ }
+
+ //. Check Command Code
+ w_wTmp = (short)((int)((pbyPacket[5] << 8) & 0x0000FF00) | (int)(pbyPacket[4] & 0x000000FF));
+ if (wCMDCode != w_wTmp)
+ {
+ return false;
+ }
+
+ return true;
+ }
+
+ //--------------------------- Send, Receive Communication Packet Functions ---------------------//
+ public boolean Send_Command(short p_wCmd)
+ {
+ if (m_nConnected == 1)
+ return UART_SendCommand(p_wCmd);
+ else if (m_nConnected == 2)
+ return USB_SendPacket(p_wCmd);
+ else
+ return false;
+ }
+
+ public boolean Send_DataPacket(short p_wCmd)
+ {
+ if (m_nConnected == 1)
+ return UART_SendDataPacket(p_wCmd);
+ else if (m_nConnected == 2)
+ return USB_SendDataPacket(p_wCmd);
+ else
+ return false;
+ }
+
+ public boolean Receive_DataPacket(short p_wCmd)
+ {
+ if (m_nConnected == 1)
+ return UART_ReceiveDataPacket(p_wCmd);
+ else if (m_nConnected == 2)
+ return USB_ReceiveDataPacket(p_wCmd);
+ else
+ return false;
+ }
+
+ //-------------------------------- USB Communication Functions --------------------------------//
+ private boolean USB_SendPacket(short wCMD)
+ {
+ byte[] btCDB = new byte[8];
+ boolean w_bRet;
+
+ Arrays.fill(btCDB, (byte)0);
+
+ btCDB[0] = (byte)0xEF; btCDB[1] = 0x11; btCDB[4] = (byte)m_nPacketSize;
+
+ w_bRet = m_usbBase.UsbSCSIWrite(btCDB, 8, m_abyPacket, m_nPacketSize, SCSI_TIMEOUT);
+
+ if (!w_bRet)
+ {
+ return false;
+ }
+
+ return USB_ReceiveAck( wCMD );
+ }
+
+ private boolean USB_ReceiveAck(short wCMD)
+ {
+ int c, w_nLen, w_nReadCount = 0;
+ byte[] btCDB = new byte[8];
+ byte[] w_abyWaitPacket = new byte[CMD_PACKET_LEN];
+
+ Arrays.fill(btCDB, (byte)0);
+
+ //w_nReadCount = GetReadWaitTime(p_byCMD);
+
+ c = 0;
+ Arrays.fill(w_abyWaitPacket, (byte)0xAF);
+
+ do
+ {
+ Arrays.fill(m_abyPacket, (byte)0);
+
+ btCDB[0] = (byte)0xEF; btCDB[1] = (byte)0x12;
+
+ w_nLen = RCM_PACKET_LEN;
+
+ if (!m_usbBase.UsbSCSIRead(btCDB, 8, m_abyPacket, w_nLen, SCSI_TIMEOUT))
+ {
+ return false;
+ }
+
+ SystemClock.sleep(COMM_SLEEP_TIME);
+
+ c++;
+
+ //if ( c > w_nReadCount)
+ //{
+ // return false;
+ //}
+ } while ( memcmp(m_abyPacket, w_abyWaitPacket, CMD_PACKET_LEN) == true );
+
+ m_nPacketSize = w_nLen;
+
+ if (!CheckReceive(m_abyPacket, m_nPacketSize, (short)RCM_PREFIX_CODE, wCMD )) {
+ return false;
+ }
+ return true;
+ }
+
+ boolean USB_ReceiveDataAck(short wCMD)
+ {
+ byte[] btCDB = new byte[8];
+ byte[] w_WaitPacket = new byte[10];
+ int w_nLen;
+
+ memset(btCDB, (byte)0, 8);
+ memset(w_WaitPacket, (byte)0xAF, 10);
+
+ do
+ {
+ btCDB[0] = (byte)0xEF; btCDB[1] = 0x15;
+ w_nLen = 8;
+
+ if (!m_usbBase.UsbSCSIRead(btCDB, 8, m_abyPacket, w_nLen, SCSI_TIMEOUT))
+ {
+ return false;
+ }
+
+ SystemClock.sleep(COMM_SLEEP_TIME);
+
+ }while(memcmp(m_abyPacket, w_WaitPacket, 8) == true);
+
+ //w_nLen = g_pRcmPacket->m_wDataLen + 2;
+ w_nLen = (short)((int)((m_abyPacket[7] << 8) & 0x0000FF00) | (int)(m_abyPacket[6] & 0x000000FF)) + 2;
+
+ if (USB_ReceiveRawData(m_abyPacket2, w_nLen) == false)
+ {
+ return false;
+ }
+
+ System.arraycopy(m_abyPacket2, 0, m_abyPacket, 8, w_nLen);
+
+ m_nPacketSize = 8 + w_nLen;
+
+ if (!CheckReceive(m_abyPacket, m_nPacketSize, (short)RCM_DATA_PREFIX_CODE, wCMD ))
+ {
+ return false;
+ }
+
+ return true;
+ }
+
+ boolean USB_SendDataPacket(short wCMD)
+ {
+ byte[] btCDB = new byte[8];
+
+ memset(btCDB, (byte)0, 8);
+
+ btCDB[0] = (byte)0xEF; btCDB[1] = 0x13;
+
+ btCDB[4] = (byte)(m_nPacketSize & 0xFF);
+ btCDB[5] = (byte)((m_nPacketSize >> 8) & 0xFF);
+
+ if (!m_usbBase.UsbSCSIWrite(btCDB, 8, m_abyPacket, m_nPacketSize, SCSI_TIMEOUT ) )
+ return false;
+
+ return USB_ReceiveDataAck(wCMD);
+ }
+
+ boolean USB_ReceiveDataPacket(short wCMD)
+ {
+ return USB_ReceiveDataAck(wCMD);
+ }
+
+ boolean USB_ReceiveRawData(byte[] pBuffer, int nDataLen)
+ {
+ byte[] btCDB = new byte[8];
+
+ memset(btCDB, (byte)0, 8);
+
+ btCDB[0] = (byte)0xEF; btCDB[1] = 0x14;
+
+ if (!m_usbBase.UsbSCSIRead(btCDB, 8, pBuffer, nDataLen, SCSI_TIMEOUT ) )
+ return false;
+
+ return true;
+ }
+
+ boolean USB_ReceiveImage(byte[] p_pBuffer, int nDataLen )
+ {
+ byte[] btCDB = new byte[8];
+ byte[] w_WaitPacket = new byte[8];
+
+ memset( btCDB, (byte)0, 8 );
+ memset( w_WaitPacket, (byte)0xAF, 8 );
+
+ if (nDataLen < 1024*64)
+ {
+ btCDB[0] = (byte)0xEF; btCDB[1] = 0x16;
+
+ if (!m_usbBase.UsbSCSIRead(btCDB, 8, p_pBuffer, nDataLen, SCSI_TIMEOUT ))
+ return false;
+ }
+ else if (nDataLen == 256*288)
+ {
+ btCDB[0] = (byte)0xEF; btCDB[1] = 0x16; btCDB[2] = 0x00;
+
+ if (!m_usbBase.UsbSCSIRead(btCDB, 8, p_pBuffer, nDataLen/2, SCSI_TIMEOUT))
+ return false;
+
+ btCDB[0] = (byte)0xEF; btCDB[1] = 0x16; btCDB[2] = 0x01;
+
+ if (!m_usbBase.UsbSCSIRead(btCDB, 8, m_abyPacket2, nDataLen/2, SCSI_TIMEOUT ))
+ return false;
+
+ System.arraycopy(m_abyPacket2, 0, p_pBuffer, nDataLen/2, nDataLen/2);
+ }
+
+ return true;
+ }
+
+ //-------------------------------- UART Communication Functions --------------------------------//
+ public boolean UART_SendCommand(short p_wCmd)
+ {
+ int w_nResult = 0;
+
+ if (m_nConnected == 1)
+ {
+ byte[] w_pData = new byte[m_nPacketSize];
+ System.arraycopy(m_abyPacket, 0, w_pData, 0, m_nPacketSize);
+ m_SerialPort.send(w_pData, m_nPacketSize);
+ }
+
+ return UART_ReceiveAck(p_wCmd);
+ }
+
+ public boolean UART_ReceiveAck(short p_wCmd)
+ {
+ if (!UART_ReadDataN(m_abyPacket, 0, CMD_PACKET_LEN))
+ return false;
+
+ if (!CheckReceive(m_abyPacket, CMD_PACKET_LEN, (short)RCM_PREFIX_CODE, p_wCmd))
+ return false;
+
+ return true;
+ }
+
+ public boolean UART_ReceiveDataAck(short p_wCmd)
+ {
+ if (!UART_ReadDataN(m_abyPacket, 0, 8))
+ return false;
+
+ if (!UART_ReadDataN(m_abyPacket, 8, GetDataLen() + 2))
+ return false;
+
+ return CheckReceive(m_abyPacket, GetDataLen() + 10, (short)RCM_DATA_PREFIX_CODE, p_wCmd);
+ }
+
+ public boolean UART_SendDataPacket(short p_wCmd)
+ {
+ int w_nSendCnt = 0;
+
+ if (m_nConnected == 1)
+ {
+ byte[] w_pData = new byte[m_nPacketSize];
+ System.arraycopy(m_abyPacket, 0, w_pData, 0, m_nPacketSize);
+ m_SerialPort.send(w_pData, m_nPacketSize);
+ }
+
+ return UART_ReceiveDataAck(p_wCmd);
+ }
+ /***************************************************************************/
+ /***************************************************************************/
+ public boolean UART_ReceiveDataPacket(short p_wCmd)
+ {
+ return UART_ReceiveDataAck(p_wCmd);
+ }
+ /***************************************************************************/
+ /***************************************************************************/
+ public boolean UART_ReceiveData(short p_wCmd, int p_nDataLen, byte[] p_pBuffer)
+ {
+ int w_nReceivedCnt;
+ int w_wPacketDataLen = 0;
+
+ for (w_nReceivedCnt = 0; w_nReceivedCnt < p_nDataLen; w_nReceivedCnt += w_wPacketDataLen)
+ {
+ w_wPacketDataLen = p_nDataLen - w_nReceivedCnt;
+ if (w_wPacketDataLen > MAX_DATA_LEN) w_wPacketDataLen = MAX_DATA_LEN;
+ if (UART_ReceiveDataPacket(p_wCmd) == false)
+ return false;
+ System.arraycopy(m_abyPacket, 8, p_pBuffer, w_nReceivedCnt, GetDataLen() + 4);
+ }
+ return true;
+ }
+ /***************************************************************************/
+ /***************************************************************************/
+ boolean UART_ReadDataN(byte[] p_pData, int p_nStart, int p_nLen)
+ {
+// int w_nAckCnt = 0;
+ int w_nRecvLen, w_nTotalRecvLen;
+ int w_nTmpLen;
+ long w_nTime;
+ int i;
+
+ w_nRecvLen = p_nLen;
+ w_nTotalRecvLen = 0;
+
+ w_nTime = System.currentTimeMillis();
+
+ while(w_nTotalRecvLen < p_nLen )
+ {
+ if (System.currentTimeMillis() - w_nTime > 10000)
+ {
+ m_nUARTReadLen = 0;
+ return false;
+ }
+
+ i = 0;
+ while (m_bBufferHandle)
+ {
+ i++;
+ if (i < 10000)
+ break;
+ }
+
+ m_bBufferHandle = true;
+
+ if (m_nUARTReadLen <= 0) {
+ m_bBufferHandle = false;
+ continue;
+ }
+
+ if (p_nLen - w_nTotalRecvLen < m_nUARTReadLen)
+ {
+ w_nTmpLen = p_nLen - w_nTotalRecvLen;
+ System.arraycopy(m_pUARTReadBuf, 0, p_pData, p_nStart + w_nTotalRecvLen, w_nTmpLen);
+ w_nRecvLen = w_nRecvLen - w_nTmpLen;
+ w_nTotalRecvLen = w_nTotalRecvLen + w_nTmpLen;
+ m_nUARTReadLen = m_nUARTReadLen - w_nTmpLen;
+ System.arraycopy(m_pUARTReadBuf, w_nTmpLen, m_abyPacket2, 0, m_nUARTReadLen);
+ System.arraycopy(m_abyPacket2, 0, m_pUARTReadBuf, 0, m_nUARTReadLen);
+ }
+ else
+ {
+ System.arraycopy(m_pUARTReadBuf, 0, p_pData, p_nStart + w_nTotalRecvLen, m_nUARTReadLen);
+ w_nRecvLen = w_nRecvLen - m_nUARTReadLen;
+ w_nTotalRecvLen = w_nTotalRecvLen + m_nUARTReadLen;
+ m_nUARTReadLen = 0;
+ }
+
+ m_bBufferHandle = false;
+ }
+
+ return true;
+ }
+
+ private boolean memcmp(byte[] p1, byte[] p2, int nLen)
+ {
+ int i;
+
+ for (i=0; i<nLen; i++)
+ {
+ if (p1[i] != p2[i])
+ return false;
+ }
+
+ return true;
+ }
+
+ private void memset(byte[] p1, byte nValue, int nLen)
+ {
+ Arrays.fill(p1, 0, nLen, nValue);
+ }
+
+ private void memcpy(byte[] p1, byte nValue, int nLen)
+ {
+ Arrays.fill(p1, 0, nLen, nValue);
+ }
+
+ private short MAKEWORD(byte low, byte high)
+ {
+ short s;
+ s = (short)((int)((high << 8) & 0x0000FF00) | (int)(low & 0x000000FF));
+ return s;
+ }
+
+ private byte LOBYTE(short s)
+ {
+ return (byte)(s & 0xFF);
+ }
+
+ private byte HIBYTE(short s)
+ {
+ return (byte)((s >> 8) & 0xFF);
+ }
+
+
+ // uart control classes ======================================================
+ private class SerialControl extends SerialHelper{
+
+ public SerialControl(){
+ }
+
+ @Override
+ protected void onDataReceived(final ComBean ComRecData)
+ {
+ DispQueue.AddQueue(ComRecData);
+ }
+ }
+
+ private class DispQueueThread extends Thread{
+ private Queue<ComBean> QueueList = new LinkedList<ComBean>();
+ @Override
+ public void run() {
+ super.run();
+ while(!isInterrupted()) {
+ int i;
+ while(true)
+ {
+ final ComBean ComData;
+ if ((ComData=QueueList.poll())==null)
+ break;
+
+ i = 0;
+ while (m_bBufferHandle)
+ {
+ i++;
+ if (i > 10000)
+ break;
+ }
+ m_bBufferHandle = true;
+ System.arraycopy(ComData.bRec, 0, m_pUARTReadBuf, m_nUARTReadLen, ComData.nSize);
+ m_nUARTReadLen = m_nUARTReadLen + ComData.nSize;
+ m_bBufferHandle = false;
+// break;
+ }
+ }
+ }
+
+ public synchronized void AddQueue(ComBean ComData){
+ QueueList.add(ComData);
+ }
+ }
+ // ! uart control classes ====================================================
+
+ public static String GetErrorMsg(int nErrorCode) {
+ String str = new String("");
+
+ switch (nErrorCode) {
+ case DevComm.ERR_SUCCESS:
+ str = "鎴愬姛";
+ break;
+ case DevComm.ERR_VERIFY:
+ str = "楠岃瘉涓嶉�氳繃";
+ break;
+ case DevComm.ERR_IDENTIFY:
+ str = "璇嗗埆涓嶅悎鏍煎搧";
+ break;
+ case DevComm.ERR_EMPTY_ID_NOEXIST:
+ str = "绌烘ā鏉夸笉瀛樺湪";
+ break;
+ case DevComm.ERR_BROKEN_ID_NOEXIST:
+ str = "妯℃澘涓嶅瓨鍦�";
+ break;
+ case DevComm.ERR_TMPL_NOT_EMPTY:
+ str = "姝D鐨勬ā鏉垮凡瀛樺湪";
+ break;
+ case DevComm.ERR_TMPL_EMPTY:
+ str = "姝ゆā鏉垮凡绌�";
+ break;
+ case DevComm.ERR_INVALID_TMPL_NO:
+ str = "鏃犳晥妯℃澘缂栧彿";
+ break;
+ case DevComm.ERR_ALL_TMPL_EMPTY:
+ str = "鎵�鏈夋ā鏉块兘鏄┖鐨�";
+ break;
+ case DevComm.ERR_INVALID_TMPL_DATA:
+ str = "鏃犳晥妯℃澘鏁版嵁";
+ break;
+ case DevComm.ERR_DUPLICATION_ID:
+ str = "閲嶅鐨処D";
+ break;
+ case DevComm.ERR_BAD_QUALITY:
+ str = "鍔h川鍥惧儚";
+ break;
+ case DevComm.ERR_MERGE_FAIL:
+ str = "鍚堝苟澶辫触";
+ break;
+ case DevComm.ERR_NOT_AUTHORIZED:
+ str = "璁惧鏈巿鏉�";
+ break;
+ case DevComm.ERR_MEMORY:
+ str = "鍐呭瓨閿欒";
+ break;
+ case DevComm.ERR_INVALID_PARAM:
+ str = "鏃犳晥鍙傛暟";
+ break;
+ case DevComm.ERR_GEN_COUNT:
+ str = "鐢熸垚璁℃暟鏃犳晥";
+ break;
+ case DevComm.ERR_INVALID_BUFFER_ID:
+ str = "RAM缂撳啿鍖篒D鏃犳晥";
+ break;
+ case DevComm.ERR_INVALID_OPERATION_MODE:
+ str = "鎿嶄綔妯″紡鏃犳晥";
+ break;
+ case DevComm.ERR_FP_NOT_DETECTED:
+ str = "鏈娴嬪埌鎵嬫寚";
+ break;
+ default:
+ str = String.format("澶辫触, 閿欒鐮�=%d", nErrorCode);
+ break;
+ }
+
+ return str;
+ }
+}
--
Gitblit v1.9.3