|
@@ -0,0 +1,957 @@
|
|
|
|
+package com.example.administrator.wingcool_gt9_apk;
|
|
|
|
+
|
|
|
|
+import android.Manifest;
|
|
|
|
+import android.app.Activity;
|
|
|
|
+import android.app.PendingIntent;
|
|
|
|
+import android.content.Context;
|
|
|
|
+import android.content.Intent;
|
|
|
|
+import android.content.IntentFilter;
|
|
|
|
+import android.content.pm.PackageManager;
|
|
|
|
+import android.content.res.Configuration;
|
|
|
|
+import android.content.res.Resources;
|
|
|
|
+import android.graphics.BitmapFactory;
|
|
|
|
+import android.graphics.Matrix;
|
|
|
|
+import android.hardware.usb.UsbConstants;
|
|
|
|
+import android.hardware.usb.UsbDevice;
|
|
|
|
+import android.hardware.usb.UsbDeviceConnection;
|
|
|
|
+import android.hardware.usb.UsbEndpoint;
|
|
|
|
+import android.hardware.usb.UsbInterface;
|
|
|
|
+import android.hardware.usb.UsbManager;
|
|
|
|
+import android.net.Uri;
|
|
|
|
+import android.os.Bundle;
|
|
|
|
+import android.os.Environment;
|
|
|
|
+import android.os.Handler;
|
|
|
|
+import android.os.Message;
|
|
|
|
+import android.os.SystemClock;
|
|
|
|
+import android.support.annotation.NonNull;
|
|
|
|
+import android.support.v4.app.ActivityCompat;
|
|
|
|
+import android.support.v4.content.ContextCompat;
|
|
|
|
+import android.support.v4.view.ViewPager;
|
|
|
|
+import android.support.v7.app.AppCompatActivity;
|
|
|
|
+import android.text.Editable;
|
|
|
|
+import android.text.TextWatcher;
|
|
|
|
+import android.util.DisplayMetrics;
|
|
|
|
+import android.util.Log;
|
|
|
|
+import android.view.View;
|
|
|
|
+import android.view.animation.Animation;
|
|
|
|
+import android.view.animation.TranslateAnimation;
|
|
|
|
+import android.widget.AdapterView;
|
|
|
|
+import android.widget.Button;
|
|
|
|
+import android.widget.CheckBox;
|
|
|
|
+import android.widget.EditText;
|
|
|
|
+import android.widget.ImageView;
|
|
|
|
+import android.widget.Spinner;
|
|
|
|
+import android.widget.TextView;
|
|
|
|
+import android.widget.Toast;
|
|
|
|
+
|
|
|
|
+import java.io.BufferedReader;
|
|
|
|
+import java.io.File;
|
|
|
|
+import java.io.FileInputStream;
|
|
|
|
+import java.io.IOException;
|
|
|
|
+import java.io.InputStream;
|
|
|
|
+import java.io.InputStreamReader;
|
|
|
|
+import java.io.RandomAccessFile;
|
|
|
|
+import java.io.Reader;
|
|
|
|
+import java.text.DecimalFormat;
|
|
|
|
+import java.util.ArrayList;
|
|
|
|
+import java.util.Collection;
|
|
|
|
+import java.util.HashMap;
|
|
|
|
+import java.util.List;
|
|
|
|
+import java.util.Locale;
|
|
|
|
+import java.util.concurrent.ExecutorService;
|
|
|
|
+import java.util.concurrent.Executors;
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ *
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+public class UsbSetting extends AppCompatActivity
|
|
|
|
+ //implements OpenDevicesReceiver.OpenDevicesListener, View.OnClickListener , ViewPager.OnPageChangeListener, AdapterView.OnItemSelectedListener{
|
|
|
|
+ implements OpenDevicesReceiver.OpenDevicesListener, View.OnClickListener , ViewPager.OnPageChangeListener{
|
|
|
|
+ private static final int CONNECTED_SUCCESS = 0;
|
|
|
|
+ private static final int RECEIVER_MESSAGE_SUCCESS = 1;
|
|
|
|
+ private static final int SEND_MESSAGE_SUCCESS = 2;
|
|
|
|
+ private static final int DEBUG_MESSAGE_SUCCESS = 3;
|
|
|
|
+ private static final int DEBUG_MESSAGE_ERROR = 4;
|
|
|
|
+
|
|
|
|
+ private static final String USB_ACTION = "com.host2device";
|
|
|
|
+ private static final String ACTION_USB_PERMISSION = "com.host2device.USB_PERMISSION";
|
|
|
|
+ private ExecutorService mThreadPool;
|
|
|
|
+ private UsbManager mUsbManager;
|
|
|
|
+ private OpenDevicesReceiver cfgOpenDevicesReceiver;
|
|
|
|
+ private UsbDeviceConnection mUsbDeviceConnection;
|
|
|
|
+
|
|
|
|
+ private UsbEndpoint mUsbEndpointOut;
|
|
|
|
+ private UsbEndpoint mUsbEndpointIn;
|
|
|
|
+ private int iProductId;
|
|
|
|
+ private byte byProductType = 0;
|
|
|
|
+ private static final byte GT9 = 0x01;
|
|
|
|
+ private static final byte GT7 = 0x02;
|
|
|
|
+ private Button mReadCfg;
|
|
|
|
+ private Button mSendCfg;
|
|
|
|
+ private byte[] mBytes = new byte[1024];
|
|
|
|
+ private byte[] mSendData = new byte[1024];
|
|
|
|
+
|
|
|
|
+ private Context mAlertContext;
|
|
|
|
+
|
|
|
|
+ String value;
|
|
|
|
+
|
|
|
|
+ private boolean isNeedFindDevice = true;
|
|
|
|
+
|
|
|
|
+ private int bottonMode = 0;
|
|
|
|
+
|
|
|
|
+ private UsbInterface mUsbInterface;
|
|
|
|
+ private StringBuffer mStringBuffer = new StringBuffer();
|
|
|
|
+ private Context mContext;
|
|
|
|
+
|
|
|
|
+ private TextView mShow;
|
|
|
|
+ private TextView tvVenderID;
|
|
|
|
+
|
|
|
|
+ //View Usb Setting 定义
|
|
|
|
+ private Spinner spinInterface;
|
|
|
|
+ private CheckBox cbMouseRightClickDis,cbMouseDoubleClickEn,cbWakeUpEn;
|
|
|
|
+ private Spinner spinReportType,spinUartProtocal;
|
|
|
|
+ private EditText edtVID,edtPID; //2 bytes
|
|
|
|
+ private Spinner spinUartBuad;
|
|
|
|
+ private CheckBox cbLongPressRightKeyEn;
|
|
|
|
+ private EditText edtDimensionX,edtDimensionY,edtUSBResolutionX,edtUSBResolutionY; //2 bytes
|
|
|
|
+
|
|
|
|
+ private ViewPager vpagerCfg;
|
|
|
|
+ private ImageView img_cursor;
|
|
|
|
+ private TextView tvUsbSetting;
|
|
|
|
+
|
|
|
|
+ private ArrayList<View> listViews;
|
|
|
|
+ View viewusbsetting;
|
|
|
|
+
|
|
|
|
+ private int offset = 0;//移动条图片的偏移量
|
|
|
|
+ private int currIndex = 0;//当前页面的编号
|
|
|
|
+ private int bmpWidth;// 移动条图片的长度
|
|
|
|
+ private int one = 0; //移动条滑动一页的距离
|
|
|
|
+ private int two = 0; //滑动条移动两页的距离
|
|
|
|
+ private int three = 0; //滑动条移动三页的距离
|
|
|
|
+ private int four = 0; //滑动条移动四页的距离
|
|
|
|
+ private int five = 0; //滑动条移动五页的距离
|
|
|
|
+ private int six = 0; //滑动条移动六页的距离
|
|
|
|
+ private int seven = 0; //滑动条移动七页的距离
|
|
|
|
+ private int eight = 0; //滑动条移动八页的距离
|
|
|
|
+ private int nine = 0; //滑动条移动九页的距离
|
|
|
|
+ private int iChooseVPager = 0; //当前停在哪个vpager
|
|
|
|
+
|
|
|
|
+ private byte mSendGetGt9ConfigData[]={
|
|
|
|
+ 0x03,0x00,0x0f,(byte)0x80,0x47,0x00,0x3f,0x00,
|
|
|
|
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
|
|
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
|
|
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
|
|
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
|
|
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
|
|
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
|
|
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ Handler mHandler = new Handler() {
|
|
|
|
+ @Override
|
|
|
|
+ public void handleMessage(Message msg) {
|
|
|
|
+
|
|
|
|
+ StringBuilder stringBuilder = new StringBuilder("");
|
|
|
|
+ StringBuffer resultSb = new StringBuffer();
|
|
|
|
+ // for (int i = 1; i < mBytes.length; i++) {
|
|
|
|
+ int checksum = 0 ;
|
|
|
|
+ switch (msg.what) {
|
|
|
|
+ case CONNECTED_SUCCESS://车机和手机连接成功
|
|
|
|
+ //mError.setText("");
|
|
|
|
+ mReadCfg.setEnabled(true);
|
|
|
|
+ mSendCfg.setEnabled(true);
|
|
|
|
+ break;
|
|
|
|
+
|
|
|
|
+ case RECEIVER_MESSAGE_SUCCESS://成功接受到数据
|
|
|
|
+
|
|
|
|
+ break;
|
|
|
|
+
|
|
|
|
+ case SEND_MESSAGE_SUCCESS://成功发送数据
|
|
|
|
+ //mMessage.setText("");
|
|
|
|
+ break;
|
|
|
|
+
|
|
|
|
+ case DEBUG_MESSAGE_SUCCESS://成功发送数据
|
|
|
|
+ //StringBuilder stringBuilder = new StringBuilder("");
|
|
|
|
+ // StringBuffer resultSb = new StringBuffer();
|
|
|
|
+
|
|
|
|
+ checksum = 0 ;
|
|
|
|
+ for (int i = 0; i < 216; i++) {
|
|
|
|
+
|
|
|
|
+ int v = mSendData[i] & 0xFF;
|
|
|
|
+ checksum =checksum+ v;
|
|
|
|
+ //byte v = mSendData[i];
|
|
|
|
+ String hv = Integer.toHexString(v);
|
|
|
|
+ //String hv = Byte.toString(v);
|
|
|
|
+ stringBuilder.append(hv);
|
|
|
|
+ stringBuilder.append(",");
|
|
|
|
+ }
|
|
|
|
+ //mShow.setText(stringBuilder.toString());
|
|
|
|
+ //mShow.setText(value);
|
|
|
|
+ break;
|
|
|
|
+ case DEBUG_MESSAGE_ERROR://成功发送数据
|
|
|
|
+ //mShow.setText("ERROR");
|
|
|
|
+ //mError.setText("ERROR");
|
|
|
|
+ break;
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ protected void onCreate(Bundle savedInstanceState) {
|
|
|
|
+ super.onCreate(savedInstanceState);
|
|
|
|
+ setContentView(R.layout.activity_usbsetting);
|
|
|
|
+ mAlertContext = UsbSetting.this;
|
|
|
|
+ ConstantsActivity.activityList.add(this);
|
|
|
|
+ //switchLanguage(ConstantsActivity.langae);
|
|
|
|
+ init();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //核心设置的代码
|
|
|
|
+ protected void switchLanguage(String language) {
|
|
|
|
+ Resources resources = getResources();
|
|
|
|
+ Configuration config = resources.getConfiguration();
|
|
|
|
+ DisplayMetrics dm = resources.getDisplayMetrics();
|
|
|
|
+ switch (language) {
|
|
|
|
+ case "zh":
|
|
|
|
+ config.locale = Locale.CHINESE;
|
|
|
|
+ resources.updateConfiguration(config, dm);
|
|
|
|
+ break;
|
|
|
|
+ case "en":
|
|
|
|
+ config.locale = Locale.ENGLISH;
|
|
|
|
+ resources.updateConfiguration(config, dm);
|
|
|
|
+ break;
|
|
|
|
+ default:
|
|
|
|
+ config.locale = Locale.US;
|
|
|
|
+ resources.updateConfiguration(config, dm);
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private void init() {
|
|
|
|
+ initView();
|
|
|
|
+ initViewPager();
|
|
|
|
+ initUsbSpin();
|
|
|
|
+ initListener();
|
|
|
|
+ initData();
|
|
|
|
+ openDevices();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private void initView() {
|
|
|
|
+ mReadCfg = (Button) findViewById(R.id.readcfg);
|
|
|
|
+ mSendCfg = (Button) findViewById(R.id.sendcfg);
|
|
|
|
+ mShow = (TextView) findViewById(R.id.show);
|
|
|
|
+
|
|
|
|
+ tvVenderID = (TextView) findViewById(R.id.venderid);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private void initViewPager() {
|
|
|
|
+ vpagerCfg = (ViewPager) findViewById(R.id.vpagercfg);
|
|
|
|
+
|
|
|
|
+ tvUsbSetting = (TextView) findViewById(R.id.tvusbsetting);
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ img_cursor = (ImageView) findViewById(R.id.img_cursor);
|
|
|
|
+
|
|
|
|
+ //下划线动画的相关设置:
|
|
|
|
+ bmpWidth = BitmapFactory.decodeResource(getResources(), R.mipmap.line).getWidth();// 获取图片宽度
|
|
|
|
+ DisplayMetrics dm = new DisplayMetrics();
|
|
|
|
+ getWindowManager().getDefaultDisplay().getMetrics(dm);
|
|
|
|
+ int screenW = dm.widthPixels;// 获取分辨率宽度
|
|
|
|
+ //offset = (screenW / 3 - bmpWidth) / 2;// 计算偏移量
|
|
|
|
+ offset = (screenW / 9 - bmpWidth) / 2;// 计算偏移量
|
|
|
|
+ Matrix matrix = new Matrix();
|
|
|
|
+ matrix.postTranslate(offset, 0);
|
|
|
|
+ img_cursor.setImageMatrix(matrix);// 设置动画初始位置
|
|
|
|
+ //移动的距离
|
|
|
|
+ one = offset * 2 + bmpWidth;// 移动一页的偏移量,比如1->2,或者2->3
|
|
|
|
+ two = one * 2;// 移动两页的偏移量,比如1直接跳3
|
|
|
|
+ three = one * 3;// 移动两页的偏移量,比如1直接跳3
|
|
|
|
+ four = one * 4;// 移动两页的偏移量,比如1直接跳3
|
|
|
|
+ five = one * 5;// 移动两页的偏移量,比如1直接跳3
|
|
|
|
+ six = one * 6;// 移动两页的偏移量,比如1直接跳3
|
|
|
|
+ seven = one * 7;// 移动两页的偏移量,比如1直接跳3
|
|
|
|
+ eight = one * 8;// 移动两页的偏移量,比如1直接跳3
|
|
|
|
+ nine = one * 9;// 移动两页的偏移量,比如1直接跳3
|
|
|
|
+
|
|
|
|
+ //往ViewPager填充View,同时设置点击事件与页面切换事件
|
|
|
|
+ listViews = new ArrayList<View>();
|
|
|
|
+
|
|
|
|
+ //LayoutInflater mInflater = getLayoutInflater();
|
|
|
|
+ viewusbsetting = View.inflate(this,R.layout.view_usb_setting, null);
|
|
|
|
+
|
|
|
|
+ //listViews.add(mInflater.inflate(R.layout.view_one, null, false));
|
|
|
|
+ //listViews.add(mInflater.inflate(R.layout.view_two, null, false));
|
|
|
|
+ //listViews.add(mInflater.inflate(R.layout.view_three, null, false));
|
|
|
|
+
|
|
|
|
+ listViews.add(viewusbsetting);
|
|
|
|
+
|
|
|
|
+ vpagerCfg.setAdapter(new MyPagerAdapter(listViews));
|
|
|
|
+ vpagerCfg.setCurrentItem(0); //设置ViewPager当前页,从0开始算
|
|
|
|
+
|
|
|
|
+ tvUsbSetting.setOnClickListener(this);
|
|
|
|
+
|
|
|
|
+ vpagerCfg.addOnPageChangeListener(this);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //===============================各view中的元素初始化开始===============================================//
|
|
|
|
+ private void initUsbSpin() {
|
|
|
|
+ spinInterface = viewusbsetting.findViewById(R.id._interface);
|
|
|
|
+ cbMouseRightClickDis = viewusbsetting.findViewById(R.id.mouserightclickdis);
|
|
|
|
+ cbMouseDoubleClickEn = viewusbsetting.findViewById(R.id.mousedoubleclicken);
|
|
|
|
+ cbWakeUpEn = viewusbsetting.findViewById(R.id.wakeupen);
|
|
|
|
+ spinReportType = viewusbsetting.findViewById(R.id.reporttype);
|
|
|
|
+ spinUartProtocal = viewusbsetting.findViewById(R.id.uartprotocal);
|
|
|
|
+
|
|
|
|
+ edtVID = viewusbsetting.findViewById(R.id.vid);
|
|
|
|
+ edtPID = viewusbsetting.findViewById(R.id.pid);
|
|
|
|
+
|
|
|
|
+ spinUartBuad = viewusbsetting.findViewById(R.id.uartbuad);
|
|
|
|
+
|
|
|
|
+ cbLongPressRightKeyEn = viewusbsetting.findViewById(R.id.longpressrightkeyen);
|
|
|
|
+
|
|
|
|
+ edtDimensionX = viewusbsetting.findViewById(R.id.dimensionx);
|
|
|
|
+ edtDimensionY = viewusbsetting.findViewById(R.id.dimensiony);
|
|
|
|
+ edtUSBResolutionX = viewusbsetting.findViewById(R.id.usbresolutionx);
|
|
|
|
+ edtUSBResolutionY = viewusbsetting.findViewById(R.id.usbresolutiony);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //===============================各view中的元素初始化结束===============================================//
|
|
|
|
+
|
|
|
|
+ private void initListener() {
|
|
|
|
+ mReadCfg.setOnClickListener(this);
|
|
|
|
+ mSendCfg.setOnClickListener(this);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private void initData() {
|
|
|
|
+ mContext = getApplicationContext();
|
|
|
|
+ mReadCfg.setEnabled(false); //
|
|
|
|
+
|
|
|
|
+ mSendCfg.setEnabled(false);
|
|
|
|
+
|
|
|
|
+ mThreadPool = Executors.newFixedThreadPool(5);
|
|
|
|
+
|
|
|
|
+ mUsbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 打开设备 , 让车机和手机端连起来
|
|
|
|
+ */
|
|
|
|
+ private void openDevices() {
|
|
|
|
+
|
|
|
|
+ //列举设备(手机)
|
|
|
|
+ cfgOpenDevicesReceiver = new OpenDevicesReceiver(this);
|
|
|
|
+ mThreadPool.execute(new Runnable() {
|
|
|
|
+ @Override
|
|
|
|
+ public void run() {
|
|
|
|
+ SystemClock.sleep(1000);
|
|
|
|
+ PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, 0, new Intent(ACTION_USB_PERMISSION), 0);
|
|
|
|
+ IntentFilter intentFilter = new IntentFilter(USB_ACTION);
|
|
|
|
+
|
|
|
|
+ registerReceiver(cfgOpenDevicesReceiver, intentFilter);
|
|
|
|
+ while(isNeedFindDevice) {
|
|
|
|
+ SystemClock.sleep(100);
|
|
|
|
+ HashMap<String, UsbDevice> deviceList = mUsbManager.getDeviceList();
|
|
|
|
+ if (deviceList != null) {
|
|
|
|
+ for (UsbDevice usbDevice : deviceList.values()) {
|
|
|
|
+ //int productId = usbDevice.getProductId();
|
|
|
|
+ int vendorId = usbDevice.getVendorId();
|
|
|
|
+ if ((vendorId == 0x27C0) //之前VID错误了,做兼容
|
|
|
|
+ ||(vendorId == 0x27C6) //汇顶的VID
|
|
|
|
+ ||(vendorId == 0x222A) //奕力的VID
|
|
|
|
+ ||(vendorId == 0x056A)) //8191主动笔和Wacom主动笔
|
|
|
|
+ {
|
|
|
|
+ //这里说明下,这里的377 , 7205是我这台机子上独有,因为我这上面有多台设备,所以我在这里
|
|
|
|
+ //判断了下.只有一台设备的无需这一步.
|
|
|
|
+ //mUsbManager.requestPermission(usbDevice, pendingIntent);
|
|
|
|
+ //SystemClock.sleep(100);
|
|
|
|
+ if (mUsbManager.hasPermission(usbDevice)) {
|
|
|
|
+ initDevice();
|
|
|
|
+
|
|
|
|
+ } else {
|
|
|
|
+ mUsbManager.requestPermission(usbDevice, pendingIntent);
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ //mError.setText("请连接USB");
|
|
|
|
+ }
|
|
|
|
+ // }
|
|
|
|
+ }
|
|
|
|
+ } //ThreadPool
|
|
|
|
+ }); //ThreadPool
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 初始化设备(手机) , 当手机进入Accessory模式后 , 手机的PID会变为Google定义的2个常量值其中的一个 ,
|
|
|
|
+ */
|
|
|
|
+ private void initDevice() {
|
|
|
|
+
|
|
|
|
+ HashMap<String, UsbDevice> deviceList = mUsbManager.getDeviceList();
|
|
|
|
+ Collection<UsbDevice> values = deviceList.values();
|
|
|
|
+ if (!values.isEmpty()) {
|
|
|
|
+ for (UsbDevice usbDevice : values) {
|
|
|
|
+ //int productId = usbDevice.getProductId();
|
|
|
|
+ int vendorId = usbDevice.getVendorId();
|
|
|
|
+ //if (productId == 0x0818 || productId == 0x0001 )
|
|
|
|
+ if ((vendorId == 0x27C0) //之前VID错误了,做兼容
|
|
|
|
+ ||(vendorId == 0x27C6) //汇顶的VID
|
|
|
|
+ ||(vendorId == 0x222A) //奕力的VID
|
|
|
|
+ ||(vendorId == 0x056A)) //8191主动笔和Wacom主动笔
|
|
|
|
+ {
|
|
|
|
+ if (mUsbManager.hasPermission(usbDevice)) {
|
|
|
|
+
|
|
|
|
+ UsbInterface usbInterface = usbDevice.getInterface(1);
|
|
|
|
+
|
|
|
|
+ for (int i = 0; i < usbInterface.getEndpointCount(); i++) {
|
|
|
|
+ UsbEndpoint ep = usbInterface.getEndpoint(i);
|
|
|
|
+
|
|
|
|
+ if (ep.getDirection() == UsbConstants.USB_DIR_OUT) {
|
|
|
|
+ //mUsbEndpointIn = ep;
|
|
|
|
+ mUsbEndpointOut = ep;
|
|
|
|
+ } else {
|
|
|
|
+ //mUsbEndpointOut = ep;
|
|
|
|
+ mUsbEndpointIn = ep;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if ((null == mUsbEndpointIn) || (null == mUsbEndpointOut)) {
|
|
|
|
+ mUsbDeviceConnection = mUsbManager.openDevice(usbDevice);
|
|
|
|
+ if (mUsbDeviceConnection!=null) {
|
|
|
|
+ int i = mUsbDeviceConnection.controlTransfer(0x00, 0x09,
|
|
|
|
+ 0x002, 0, null, 0, 100);
|
|
|
|
+ SystemClock.sleep(1000);
|
|
|
|
+ if (i >= 0) {
|
|
|
|
+ //mHandler.sendEmptyMessage(DEBUG_MESSAGE_SUCCESS);
|
|
|
|
+ } else {
|
|
|
|
+ //mHandler.sendEmptyMessage(DEBUG_MESSAGE_ERROR);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ isNeedFindDevice = false;
|
|
|
|
+ mUsbInterface = usbInterface;
|
|
|
|
+ mUsbDeviceConnection = mUsbManager.openDevice(usbDevice);
|
|
|
|
+ mUsbDeviceConnection.claimInterface(mUsbInterface, true);
|
|
|
|
+ if(null != mUsbEndpointIn){
|
|
|
|
+ iProductId = usbDevice.getProductId();
|
|
|
|
+ if ((iProductId == 0x0819) || (iProductId == 0x8191) || (iProductId == 0x0528) )
|
|
|
|
+ {
|
|
|
|
+ byProductType = GT7;
|
|
|
|
+ }
|
|
|
|
+ else{
|
|
|
|
+ byProductType = GT9;
|
|
|
|
+ }
|
|
|
|
+ mHandler.sendEmptyMessage(CONNECTED_SUCCESS);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ mUsbManager.requestPermission(usbDevice, PendingIntent.getBroadcast(mContext, 0, new Intent(""), 0));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ // finish();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //=====================================读取CFG到各个View开始===================================//
|
|
|
|
+ public void ReadCfgUsb(byte[] mBytes){
|
|
|
|
+ int temp;
|
|
|
|
+
|
|
|
|
+ spinInterface.setSelection(mBytes[1] & 0x01);
|
|
|
|
+
|
|
|
|
+ cbMouseRightClickDis.setChecked(false);
|
|
|
|
+ if ((mBytes[1] & 0x02) == 0x02){
|
|
|
|
+ cbMouseRightClickDis.setChecked(true);
|
|
|
|
+ }
|
|
|
|
+ cbMouseDoubleClickEn.setChecked(false);
|
|
|
|
+ if ((mBytes[1] & 0x04) == 0x04){
|
|
|
|
+ cbMouseDoubleClickEn.setChecked(true);
|
|
|
|
+ }
|
|
|
|
+ cbWakeUpEn.setChecked(false);
|
|
|
|
+ if ((mBytes[1] & 0x08) == 0x08){
|
|
|
|
+ cbWakeUpEn.setChecked(true);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ spinReportType.setSelection((mBytes[1] & 0x30) >> 4);
|
|
|
|
+ spinUartProtocal.setSelection((mBytes[1] & 0xC0) >> 6);
|
|
|
|
+
|
|
|
|
+ temp = (int)((mBytes[3] & 0xFF) + mBytes[2] * 256);
|
|
|
|
+ edtVID.setText(Integer.toHexString(temp & 0xFFFF));
|
|
|
|
+
|
|
|
|
+ temp = (int)((mBytes[5] & 0xFF) + mBytes[4] * 256);
|
|
|
|
+ edtPID.setText(Integer.toHexString(temp & 0xFFFF));
|
|
|
|
+
|
|
|
|
+ spinUartBuad.setSelection(mBytes[6] & 0x03);
|
|
|
|
+
|
|
|
|
+ cbLongPressRightKeyEn.setChecked(false);
|
|
|
|
+ if ((mBytes[7] & 0x01) == 0x01){
|
|
|
|
+ cbLongPressRightKeyEn.setChecked(true);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ temp = (int)((mBytes[9] & 0xFF) + mBytes[8] * 256);
|
|
|
|
+ edtDimensionX.setText(Integer.toString(temp & 0xFFFF));
|
|
|
|
+ temp = (int)((mBytes[11] & 0xFF) + mBytes[10] * 256);
|
|
|
|
+ edtDimensionY.setText(Integer.toString(temp & 0xFFFF));
|
|
|
|
+ temp = (int)((mBytes[13] & 0xFF) + mBytes[12] * 256);
|
|
|
|
+ edtUSBResolutionX.setText(Integer.toString(temp & 0xFFFF));
|
|
|
|
+ temp = (int)((mBytes[15] & 0xFF) + mBytes[14] * 256);
|
|
|
|
+ edtUSBResolutionY.setText(Integer.toString(temp & 0xFFFF));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //=====================================读取CFG到各个View结束===================================//
|
|
|
|
+
|
|
|
|
+ //======================================合并配置开始===========================================//
|
|
|
|
+ public void CombineCfg(){
|
|
|
|
+
|
|
|
|
+ for (int i = 0; i < 24; i++){
|
|
|
|
+ mBytes[i] = 0;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ mBytes[0] = 24;//(byte)Integer.parseInt(edtConfigVersion.getText().toString(),10);
|
|
|
|
+
|
|
|
|
+ //mBytes[1]
|
|
|
|
+ mBytes[1] = (byte)spinInterface.getSelectedItemPosition();
|
|
|
|
+ if (cbMouseRightClickDis.isChecked()){
|
|
|
|
+ mBytes[1] += 2;
|
|
|
|
+ }
|
|
|
|
+ if (cbMouseDoubleClickEn.isChecked()){
|
|
|
|
+ mBytes[1] += 4;
|
|
|
|
+ }
|
|
|
|
+ if (cbWakeUpEn.isChecked()){
|
|
|
|
+ mBytes[1] += 8;
|
|
|
|
+ }
|
|
|
|
+ mBytes[1] += (byte)(spinReportType.getSelectedItemPosition() * 16);
|
|
|
|
+ mBytes[1] += (byte)(spinUartProtocal.getSelectedItemPosition() * 64);
|
|
|
|
+
|
|
|
|
+ mBytes[2] = (byte)(Integer.parseInt(edtVID.getText().toString(),16) >> 8 ); //High byte
|
|
|
|
+ mBytes[3] = (byte)(Integer.parseInt(edtVID.getText().toString(),16) & 0x00ff);
|
|
|
|
+
|
|
|
|
+ mBytes[4] = (byte)(Integer.parseInt(edtPID.getText().toString(),16) >> 8 ); //High byte
|
|
|
|
+ mBytes[5] = (byte)(Integer.parseInt(edtPID.getText().toString(),16) & 0x00ff);
|
|
|
|
+
|
|
|
|
+ mBytes[6] = (byte)spinUartBuad.getSelectedItemPosition();
|
|
|
|
+
|
|
|
|
+ //mBytes[7]
|
|
|
|
+ if (cbLongPressRightKeyEn.isChecked()){
|
|
|
|
+ mBytes[7] = 1;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ mBytes[8] = (byte)(Integer.parseInt(edtDimensionX.getText().toString(),10) >> 8 ); //High byte
|
|
|
|
+ mBytes[9] = (byte)(Integer.parseInt(edtDimensionX.getText().toString(),10) & 0x00ff);
|
|
|
|
+
|
|
|
|
+ mBytes[10] = (byte)(Integer.parseInt(edtDimensionY.getText().toString(),10) >> 8 ); //High byte
|
|
|
|
+ mBytes[11] = (byte)(Integer.parseInt(edtDimensionY.getText().toString(),10) & 0x00ff);
|
|
|
|
+
|
|
|
|
+ mBytes[12] = (byte)(Integer.parseInt(edtUSBResolutionX.getText().toString(),10) >> 8 ); //High byte
|
|
|
|
+ mBytes[13] = (byte)(Integer.parseInt(edtUSBResolutionX.getText().toString(),10) & 0x00ff);
|
|
|
|
+
|
|
|
|
+ mBytes[14] = (byte)(Integer.parseInt(edtUSBResolutionY.getText().toString(),10) >> 8 ); //High byte
|
|
|
|
+ mBytes[15] = (byte)(Integer.parseInt(edtUSBResolutionY.getText().toString(),10) & 0x00ff);
|
|
|
|
+
|
|
|
|
+ int checksum = 0;
|
|
|
|
+ for (int i = 0; i < 22; i++) {
|
|
|
|
+ int k = mBytes[i] & 0xFF;
|
|
|
|
+ checksum = checksum + k;
|
|
|
|
+ }
|
|
|
|
+ mBytes[22] = (byte)(checksum >> 8);
|
|
|
|
+
|
|
|
|
+ mBytes[23] = (byte)(checksum & 0xFF);
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ //======================================合并配置结束===========================================//
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public void onClick(final View v) {
|
|
|
|
+
|
|
|
|
+ switch (v.getId()) {
|
|
|
|
+ case R.id.tvusbsetting:
|
|
|
|
+ //case R.id.tvsample:
|
|
|
|
+ vpagerCfg.setCurrentItem(0);
|
|
|
|
+ iChooseVPager = 0;
|
|
|
|
+ break;
|
|
|
|
+
|
|
|
|
+ case R.id.sendcfg: //send cfg
|
|
|
|
+ bottonMode = 1;
|
|
|
|
+
|
|
|
|
+ CombineCfg();
|
|
|
|
+ //iicWrite((byte)0x81, (byte)0x40, (byte)49, mBytes, 0,24);
|
|
|
|
+ iicWrite32Bits((byte)0x01, (byte)0x01, (byte)0x74, (byte)49, mBytes,0,24);
|
|
|
|
+
|
|
|
|
+ mShow.setText("Send cfg success!!");
|
|
|
|
+ break;
|
|
|
|
+ case R.id.readcfg: //read cfg
|
|
|
|
+ bottonMode = 2;
|
|
|
|
+ mSendData = mSendGetGt9ConfigData;
|
|
|
|
+
|
|
|
|
+ //iicRead((byte)0x81, (byte)0x40, (byte)48, mBytes, 24);
|
|
|
|
+ iicRead32Bits((byte)0x01, (byte)0x00, (byte)0x1E, (byte)48, mBytes, 24);
|
|
|
|
+
|
|
|
|
+ ReadCfgUsb(mBytes);
|
|
|
|
+
|
|
|
|
+ mShow.setText("Read cfg success!!");
|
|
|
|
+ break;
|
|
|
|
+ default:
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public void onPageSelected(int index) {
|
|
|
|
+
|
|
|
|
+ Animation animation = null;
|
|
|
|
+ switch (index) {
|
|
|
|
+ case 0:
|
|
|
|
+ /*
|
|
|
|
+ if (currIndex == 1) {
|
|
|
|
+ animation = new TranslateAnimation(one, 0, 0, 0);
|
|
|
|
+ } else if (currIndex == 2) {
|
|
|
|
+ animation = new TranslateAnimation(two, 0, 0, 0);
|
|
|
|
+ }
|
|
|
|
+ */
|
|
|
|
+ animation = new TranslateAnimation(one * currIndex, 0, 0, 0);
|
|
|
|
+ break;
|
|
|
|
+ case 1:
|
|
|
|
+ if (currIndex == 0) {
|
|
|
|
+ animation = new TranslateAnimation(offset, one, 0, 0);
|
|
|
|
+ } else {// if (currIndex == 2) {
|
|
|
|
+ //animation = new TranslateAnimation(two, one, 0, 0);
|
|
|
|
+ animation = new TranslateAnimation(one * currIndex, one, 0, 0);
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ case 2:
|
|
|
|
+ if (currIndex == 0) {
|
|
|
|
+ animation = new TranslateAnimation(offset, two, 0, 0);
|
|
|
|
+ } else {//if (currIndex == 1) {
|
|
|
|
+ //animation = new TranslateAnimation(one, two, 0, 0);
|
|
|
|
+ animation = new TranslateAnimation(one * currIndex, two, 0, 0);
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ case 3:
|
|
|
|
+ if (currIndex == 0) {
|
|
|
|
+ animation = new TranslateAnimation(offset, three, 0, 0);
|
|
|
|
+ } else {//if (currIndex == 1) {
|
|
|
|
+ //animation = new TranslateAnimation(one, two, 0, 0);
|
|
|
|
+ animation = new TranslateAnimation(one * currIndex, three, 0, 0);
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ case 4:
|
|
|
|
+ if (currIndex == 0) {
|
|
|
|
+ animation = new TranslateAnimation(offset, four, 0, 0);
|
|
|
|
+ } else {//if (currIndex == 1) {
|
|
|
|
+ //animation = new TranslateAnimation(one, two, 0, 0);
|
|
|
|
+ animation = new TranslateAnimation(one * currIndex, four, 0, 0);
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ case 5:
|
|
|
|
+ if (currIndex == 0) {
|
|
|
|
+ animation = new TranslateAnimation(offset, five, 0, 0);
|
|
|
|
+ } else {//if (currIndex == 1) {
|
|
|
|
+ //animation = new TranslateAnimation(one, two, 0, 0);
|
|
|
|
+ animation = new TranslateAnimation(one * currIndex, five, 0, 0);
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ case 6:
|
|
|
|
+ if (currIndex == 0) {
|
|
|
|
+ animation = new TranslateAnimation(offset, six, 0, 0);
|
|
|
|
+ } else {//if (currIndex == 1) {
|
|
|
|
+ //animation = new TranslateAnimation(one, two, 0, 0);
|
|
|
|
+ animation = new TranslateAnimation(one * currIndex, six, 0, 0);
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ case 7:
|
|
|
|
+ if (currIndex == 0) {
|
|
|
|
+ animation = new TranslateAnimation(offset, seven, 0, 0);
|
|
|
|
+ } else {//if (currIndex == 1) {
|
|
|
|
+ //animation = new TranslateAnimation(one, two, 0, 0);
|
|
|
|
+ animation = new TranslateAnimation(one * currIndex, seven, 0, 0);
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ case 8:
|
|
|
|
+ if (currIndex == 0) {
|
|
|
|
+ animation = new TranslateAnimation(offset, eight, 0, 0);
|
|
|
|
+ } else {//if (currIndex == 1) {
|
|
|
|
+ //animation = new TranslateAnimation(one, two, 0, 0);
|
|
|
|
+ animation = new TranslateAnimation(one * currIndex, eight, 0, 0);
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ case 9:
|
|
|
|
+ if (currIndex == 0) {
|
|
|
|
+ animation = new TranslateAnimation(offset, nine, 0, 0);
|
|
|
|
+ } else {//if (currIndex == 1) {
|
|
|
|
+ //animation = new TranslateAnimation(one, two, 0, 0);
|
|
|
|
+ animation = new TranslateAnimation(one * currIndex, nine, 0, 0);
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ default:
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ currIndex = index;
|
|
|
|
+ animation.setFillAfter(true);// true表示图片停在动画结束位置
|
|
|
|
+ animation.setDuration(300); //设置动画时间为300毫秒
|
|
|
|
+ img_cursor.startAnimation(animation);//开始动画
|
|
|
|
+ iChooseVPager = index; //获取当前Vpager的索引,以便知道在哪个pager
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public void onPageScrollStateChanged(int i) {
|
|
|
|
+ switch (i){
|
|
|
|
+ case 0:
|
|
|
|
+
|
|
|
|
+ break;
|
|
|
|
+ case 1:
|
|
|
|
+
|
|
|
|
+ break;
|
|
|
|
+ case 2:
|
|
|
|
+
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public void onPageScrolled(int i, float v, int i1) {
|
|
|
|
+ //edtshow3.setText("333");
|
|
|
|
+ switch (i){
|
|
|
|
+ case 0:
|
|
|
|
+
|
|
|
|
+ break;
|
|
|
|
+ case 1:
|
|
|
|
+
|
|
|
|
+ break;
|
|
|
|
+ case 2:
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private byte iicByteData[]={
|
|
|
|
+ //0 1 2 3 4 5 6
|
|
|
|
+ 0x03,0x00,0x0f,0x00,0x00,0x00,0x01,0x00,
|
|
|
|
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
|
|
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
|
|
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
|
|
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
|
|
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
|
|
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
|
|
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
|
|
+
|
|
|
|
+ };
|
|
|
|
+ private byte iicWriteData[]={
|
|
|
|
+ //0 1 2 3 4 5 6
|
|
|
|
+ 0x03,0x00,0x0f,0x00,0x00,0x00,0x39,0x00,
|
|
|
|
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
|
|
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
|
|
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
|
|
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
|
|
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
|
|
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
|
|
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
|
|
+
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ //发送命令,使得S8xx可以通过IIC向GT29xx的固定地址读取任意bytes的数据
|
|
|
|
+ private boolean iicRead32Bits(byte addrfirstbyte,byte addrsecondbyte,byte addrthirdbyte,byte subCommand,byte[] wBuffer,int length) {
|
|
|
|
+
|
|
|
|
+ int i;
|
|
|
|
+
|
|
|
|
+ iicByteData[1] = (byte)(0 | subCommand);//0x0f; //7bit:0-read,1-write;other:command
|
|
|
|
+ //iicByteData[2] = 0x0f; //no command
|
|
|
|
+ iicByteData[2] = addrfirstbyte;
|
|
|
|
+ iicByteData[3] = addrsecondbyte;
|
|
|
|
+ iicByteData[4] = addrthirdbyte;
|
|
|
|
+ iicByteData[5] = 0x00;
|
|
|
|
+ iicByteData[6] = 63; //length 一次接收63个数据
|
|
|
|
+
|
|
|
|
+ for (int j = 7; j < 64; j++) {
|
|
|
|
+ iicByteData[j] = 0x00;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ int address1 = ((addrsecondbyte & 0xff) << 8);
|
|
|
|
+ int address2 = addrthirdbyte & 0xff;
|
|
|
|
+ int address = address1 | address2;
|
|
|
|
+
|
|
|
|
+ int sendTimes = length / 63; //预计是向下取整,所以+1
|
|
|
|
+
|
|
|
|
+ if ((length % 63) != 0)
|
|
|
|
+ {
|
|
|
|
+ sendTimes += 1; //预计是向下取整,所以+1
|
|
|
|
+ }
|
|
|
|
+ //iicByteData[5] = (byte)(length>>8);
|
|
|
|
+ //iicByteData[6] = (byte)length; //length 一次接收63个数据
|
|
|
|
+
|
|
|
|
+ for (int k = 0; k < sendTimes; k++)
|
|
|
|
+ {
|
|
|
|
+ int finalOffset = k*63; //每次只能发57bytes数据
|
|
|
|
+ int offset = k * 64;
|
|
|
|
+
|
|
|
|
+ if(length - (finalOffset ) < 63) {
|
|
|
|
+
|
|
|
|
+ iicByteData[6] = (byte) (length - (finalOffset)); //length
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ iicByteData[6] = 63;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //发送读取命令
|
|
|
|
+ i = mUsbDeviceConnection.bulkTransfer(mUsbEndpointOut, iicByteData, 0, 0x40, 100);
|
|
|
|
+ if (i != 0x40)
|
|
|
|
+ return false; //传输失败
|
|
|
|
+
|
|
|
|
+ // SystemClock.sleep(1);
|
|
|
|
+
|
|
|
|
+ //接收数据
|
|
|
|
+ // i = mUsbDeviceConnection.bulkTransfer(mUsbEndpointIn, wBuffer, offset, 0x40, 100);
|
|
|
|
+ i = mUsbDeviceConnection.bulkTransfer(mUsbEndpointIn, wBuffer, offset, 0x40, 100);
|
|
|
|
+
|
|
|
|
+ //if (i != 0x40) {
|
|
|
|
+ if (i != 0x40) {
|
|
|
|
+ //editname.setText("IIC Read Failed!!");
|
|
|
|
+ return false;
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ address = address + 63;
|
|
|
|
+ iicByteData[3] = (byte)(address>>8);
|
|
|
|
+ iicByteData[4] = (byte)address;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //将report id从数组中去除
|
|
|
|
+ //byte[] temperBuffer =new byte[length];
|
|
|
|
+ if(true) {
|
|
|
|
+ int count1 = 0;
|
|
|
|
+ for (int k = 0; k < length; k++) {
|
|
|
|
+ if (k % 63 == 0) {
|
|
|
|
+ count1++;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ wBuffer[k] = wBuffer[k + count1];
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return true;
|
|
|
|
+ }
|
|
|
|
+ //发送命令,使得S8xx可以通过IIC向GT79xx的固定地址写任意bytes的数据
|
|
|
|
+ private boolean iicWrite32Bits(byte addrfirstbyte,byte addrsecondbyte,byte addrthirdbyte,byte subCommand,byte[] wBuffer,int offset, int length) {
|
|
|
|
+
|
|
|
|
+ int i;
|
|
|
|
+
|
|
|
|
+ iicWriteData[1] = (byte)(0x80 | subCommand);//0x0f; //7bit:0-read,1-write;other:command
|
|
|
|
+ //iicWriteData[2] = 0x0f; //no command
|
|
|
|
+ iicWriteData[2] = addrfirstbyte;
|
|
|
|
+ iicWriteData[3] = addrsecondbyte;
|
|
|
|
+ iicWriteData[4] = addrthirdbyte;
|
|
|
|
+ iicWriteData[5] = 0x00;
|
|
|
|
+ iicWriteData[6] = 63; //length 一次接收63个数据
|
|
|
|
+
|
|
|
|
+ for (int j = 7; j < 64; j++) {
|
|
|
|
+ iicWriteData[j] = 0x00;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ int address1 = ((addrsecondbyte&0xff)<<8);
|
|
|
|
+ int address2 = addrthirdbyte&0xff;
|
|
|
|
+ int address = address1|address2;
|
|
|
|
+
|
|
|
|
+ int sendTimes = length/57 + 1; //预计是向下取整,所以+1
|
|
|
|
+
|
|
|
|
+ //iicByteData[5] = (byte)(length>>8);
|
|
|
|
+ //iicByteData[6] = (byte)length; //length 一次接收63个数据
|
|
|
|
+
|
|
|
|
+ for (int k = 0; k < sendTimes; k++) {
|
|
|
|
+ int finalOffset = offset + k*57; //每次只能发57bytes数据
|
|
|
|
+
|
|
|
|
+ if(length - (finalOffset -offset) < 57) {
|
|
|
|
+
|
|
|
|
+ iicWriteData[6] = (byte) (length - (finalOffset -offset)); //length
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ iicWriteData[6] = 0x39;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ for (int j = 7; j < 64; j++) {
|
|
|
|
+ iicWriteData[j] = wBuffer[finalOffset + j -7];
|
|
|
|
+ }
|
|
|
|
+ i = mUsbDeviceConnection.bulkTransfer(mUsbEndpointOut, iicWriteData, 0, 0x40, 100);
|
|
|
|
+
|
|
|
|
+ if (i != 0x40) {
|
|
|
|
+ mShow.setText("iicWrite Failed");
|
|
|
|
+ return false;
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ address = address + 57;
|
|
|
|
+ //iicWriteData[2] = (byte)((address & 0xFF0000) >> 16);
|
|
|
|
+ iicWriteData[3] = (byte)(address >> 8);
|
|
|
|
+ iicWriteData[4] = (byte)address;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return true;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ boolean memCmp(byte[] sBuffer,byte[] dBuffer,int offset,int length) {
|
|
|
|
+ try {
|
|
|
|
+
|
|
|
|
+ for (int i = 0; i < length; i++) {
|
|
|
|
+ if (sBuffer[i] != dBuffer[offset + i]) {
|
|
|
|
+ // FwUpdateMessage(L"Recall frame data fail,not equal.", MSG_ERR);
|
|
|
|
+ // mError.setText("Recall frame data fail,not equal.");
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ } catch (ArithmeticException e) {
|
|
|
|
+ mShow.setText("ArithmeticException!");
|
|
|
|
+ e.printStackTrace();
|
|
|
|
+ } catch (ArrayIndexOutOfBoundsException e) {
|
|
|
|
+ mShow.setText("ArrayIndexOutOfBoundsException!");
|
|
|
|
+ e.printStackTrace();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return true;
|
|
|
|
+ }
|
|
|
|
+/*
|
|
|
|
+ boolean recallCheck(byte addressHigh,byte addressLow,byte[] wBuffer,int offset,int length)
|
|
|
|
+ {
|
|
|
|
+ //BYTE* pbBuf = new BYTE[wLen];
|
|
|
|
+ byte[] pbBuf =new byte[length+0x3000];
|
|
|
|
+
|
|
|
|
+ //if(false)
|
|
|
|
+ {
|
|
|
|
+ if (!iicRead(addressHigh, addressLow, (byte)0x0f, pbBuf, length)) {
|
|
|
|
+ //FwUpdateMessage(L"recall i2c error failed", MSG_ERR);
|
|
|
|
+ mShow.setText("recall i2c error failed");
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+ if (!memCmp(pbBuf, wBuffer, offset, length)) {
|
|
|
|
+
|
|
|
|
+ // FwUpdateMessage(L"Recall frame data fail,not equal.", MSG_ERR);
|
|
|
|
+ //mMessage.setText("Recall frame data fail,not equal.");
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return true;
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+*/
|
|
|
|
+ @Override
|
|
|
|
+ protected void onDestroy() {
|
|
|
|
+ super.onDestroy();
|
|
|
|
+
|
|
|
|
+ if (mUsbDeviceConnection != null) {
|
|
|
|
+ mUsbDeviceConnection.releaseInterface(mUsbInterface);
|
|
|
|
+ mUsbDeviceConnection.close();
|
|
|
|
+ mUsbDeviceConnection = null;
|
|
|
|
+ }
|
|
|
|
+ mUsbEndpointIn = null;
|
|
|
|
+ mUsbEndpointOut = null;
|
|
|
|
+ isNeedFindDevice = false;
|
|
|
|
+ mThreadPool.shutdownNow();
|
|
|
|
+ // unregisterReceiver(mUsbDetachedReceiver);
|
|
|
|
+ unregisterReceiver(cfgOpenDevicesReceiver);
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|