浏览代码

1、增加S928的识别(这里后续要修改,增加2933/2931的选择,或者增加转接芯片版本号的判断,单纯从PID无法判断触控IC是什么)
2、增加保存测试Log功能,.tp文件命名和存放位置不受限制
在根目录下,创建新的文件夹test_result,测试信息Log文件默认保存到里面
测试Log文件的文件名格式为:
FW version_Config version_Chanel number_OK/NG_日期-时间.csv
在电脑上可用excel打开测试Log文件来查看里面的内容,文件内容包含:
[Chip Config]、[Chanel Number]、[Test Result]、[MaximumThresholdArray]、[MinimumThresholdArray] 和16帧Rawdata
3、可以保存配置,在根目录下,创建新的文件夹saveconfig,.cfg文件默认保存到里面

robbin 3 月之前
父节点
当前提交
acd33b962a

+ 2 - 2
app/build.gradle

@@ -7,14 +7,14 @@ android {
         minSdkVersion 18
         targetSdkVersion 28
         versionCode 1
-        versionName "3.0.5"
+        versionName "3.0.7"
         testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
     }
     android.applicationVariants.all {
         variant ->
             variant.outputs.all{
                 //此处指定生成的apk文件名
-                outputFileName = "WingCoolAPK_V3.0.5_20240329_debug.apk"
+                outputFileName = "WingCoolAPK_V3.0.7_20250103_debug.apk"
             }
     }
     lintOptions {

+ 4 - 2
app/src/main/java/com/example/administrator/wingcool_gt9_apk/Config.java

@@ -2028,7 +2028,7 @@ public class Config extends AppCompatActivity
                                     byProductType = GT29336;
                                 }
                                 */
-                                if ((iProductId == 0x0829) || (iProductId == 0x0528))
+                                if ((iProductId == 0x0829) || (iProductId == 0x0528) || (iProductId == 0x0928))
                                 {
                                     byProductType = GT29336;
                                 }
@@ -4354,6 +4354,8 @@ public class Config extends AppCompatActivity
 
                         StringBuilder configBuilder = new StringBuilder("");
 
+                        configBuilder.append(edtConfigDataShow.getText().toString());
+                    /*
                         if (iChooseVPager == 8){ //在ram cfg界面
 
                             if (byProductType == GT9) {
@@ -4857,7 +4859,7 @@ public class Config extends AppCompatActivity
                                 configBuilder.append("0x01");  //mBytes[185],最后置上1
                             }
                         }
-
+                    */
                         filePath = Environment.getExternalStorageDirectory() + "/saveconfig/";
                         //File file = new File(filePath);
                         fileName = editname.getText().toString();

+ 466 - 90
app/src/main/java/com/example/administrator/wingcool_gt9_apk/DataAnalysis.java

@@ -24,10 +24,12 @@ 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.v7.app.AppCompatActivity;
 import android.util.DisplayMetrics;
+import android.util.Log;
 import android.view.Gravity;
 import android.view.KeyEvent;
 import android.view.View;
@@ -46,10 +48,14 @@ 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.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.Locale;
 import java.util.concurrent.ExecutorService;
@@ -148,7 +154,21 @@ public class DataAnalysis extends AppCompatActivity
     String updateLogShow= "";  //短路测试信息合并起来存放字符串
 
     private byte showFlag = 0;  //
-    private byte btTestStep = 0;
+    private static final byte RAWDATA_FLAG = 0x01;           //rawdata
+    private static final byte MANUALDATA_FLAG = 0x02;        //manualdiff and manualreff
+    private static final byte DIFFDATA_1BYTE_FLAG = 0x03;    //1 byte diffdata(GT9xxx)
+    private static final byte DIFFDATA_2BYTES_FLAG = 0x04;   //2 bytes diffdata
+    private static final byte REFFDATA_FLAG = 0x05;          //reffdata
+    private static final byte TESTING_FLAG = 0x06;           //testing
+    private static final byte TEST_END_FLAG = 0x07;          //test end
+    private static final byte STYLUSDATA_FLAG = 0x08;        //stylus data
+    private static final byte STOP_FLAG = 0x09;              //stop
+
+    private byte btTestStep = 0;  //1.maximum and minimum test 2.change to normal mode 3.shorttest
+    private boolean bSaveShortTestResult = false;
+    private String strSaveRawdata1 = " ", strSaveRawdata2 = " ", strSaveRawdata3 = " ", strSaveRawdata4 = " ", strSaveRawdata5 = " ", strSaveRawdata6 = " ", strSaveRawdata7 = " ", strSaveRawdata8 = " ";
+    private String strSaveRawdata9 = " ", strSaveRawdata10 = " ", strSaveRawdata11 = " ", strSaveRawdata12 = " ", strSaveRawdata13 = " ", strSaveRawdata14 = " ", strSaveRawdata15 = " ", strSaveRawdata16 = " ";
+    private String strSaveRawDataMax = " ", strSaveRawDataMin = " ";
 
     private boolean bShowDataFlag = false;
 
@@ -633,17 +653,17 @@ public class DataAnalysis extends AppCompatActivity
         //btn_StylusDataShow.setEnabled(false);
         //btn_Stop.setEnabled(false);
 
-        //选择本地文件
+        //选择文件
         btn_ImportFileButton = (Button) findViewById(R.id.importtestpara);
         btn_ImportFileButton.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
                 //ActivityCompat.requestPermissions(  Config.this, new String[]{android
                 //        .Manifest.permission.READ_EXTERNAL_STORAGE}, 2);
-                Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
+                Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
                 intent.setType("*/*");//设置类型,我这里是任意类型,任意后缀的可以这样写。
                 intent.addCategory(Intent.CATEGORY_OPENABLE);
-                startActivityForResult(intent, 2);
+                startActivityForResult(intent, 1);
             }
         });
     }
@@ -701,42 +721,60 @@ public class DataAnalysis extends AppCompatActivity
             String configString = "";
             Uri uri = data.getData();
             String fileString = "";
-            if (requestCode == 1) {  //U 盘 文 件
+            if (requestCode == 1 && resultCode == Activity.RESULT_OK) {  //U 盘 文 件
+
+                //uri = null;
+                //if (data != null){
+                //    uri = data.getData();
+                //}
 
-                byte[] filebuffer;
-                int len;
                 try {
+                    InputStream inputStream = getContentResolver().openInputStream(uri);
+                    BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
+                    String line;
+                    StringBuilder stringBuilder = new StringBuilder();
 
-                    //String fileString = "";
-                    File storage = new File("/storage");
-                    File[] files = storage.listFiles();
-                    for (final File file : files) {
-                        if (file.canRead()) {
-                            if (!file.getName().equals(Environment.getExternalStorageDirectory().getName())) {
-                                //满足该条件的文件夹就是u盘在手机上的目录
-                                fileString = (file.getPath()+"/GTxxxx_wingcool.tp");
-                                fileString = fileString.replaceAll(":", "/");  //将:改为/,以防某些系统文件目录读出是:
-                                edit_search.setText(fileString);
-                            }
-                        }
+                    while ((line = reader.readLine()) != null){
+                        stringBuilder.append(line);
                     }
 
-                    buffer = new StringBuffer();
-                    //String storageState = Environment.getExternalStorageState();
-                    //if (storageState.equals(Environment.MEDIA_MOUNTED)) {
-                    FileInputStream fileInputStream = new FileInputStream(fileString);
-                    filebuffer = new byte[1024];
-                    len = fileInputStream.read(filebuffer);
-                    while (len > 0) {
-                        buffer.append(new String(filebuffer, 0, len));
-                        len = fileInputStream.read(filebuffer);
-                    }
-                    fileInputStream.close();
-                    //}
+                    reader.close();
 
-                    configString = buffer.toString();
+                    configString = stringBuilder.toString();
+
+                    //edit_search.setText(fileData);
+                    edit_search.setText(uri.getPath());
+
+                    //edtShortCircuitInfo.setText(configString);
+
+                    int i,j,k,l= 0;
+
+                    String stringMaxVal,stringMinVal;
+
+                    i = configString.indexOf("[Node threshold]");
+
+                    j = configString.indexOf("Max=", i);
+
+                    k = configString.indexOf("Min=", i);
+
+                    l = configString.indexOf("[TEST]", i);
+
+                    stringMaxVal = configString.substring(j + 4, k);
+                    stringMinVal = configString.substring(k + 4, l);
+
+                    //value = value.trim();  //去除空格
+                    //configString = configString.replaceAll("0x", ""); //0x转换为没有
+                    //editdetail.setText(configString.toString()); //buffer.toString())就是读出的内容字符
+
+                    String[] stringMaxValArr = stringMaxVal.split(",");
+                    String[] stringMinValArr = stringMinVal.split(",");
+
+                    for (i = 0; i < stringMaxValArr.length - 1; i++){
+                        iRawDataMaxVal[i] = Integer.parseInt(stringMaxValArr[i], 10);
+                        iRawDataMinVal[i] = Integer.parseInt(stringMinValArr[i], 10);
+                    }
 
-                } catch (IOException ex) {
+                } catch (IOException c) {
                     edit_search.setText(uri.getPath() + "——" + getResources().getString(R.string.invalidfile));
                     return;
                 }
@@ -940,7 +978,7 @@ public class DataAnalysis extends AppCompatActivity
                                 //{
                                 //    byProductType = GT7;
                                 //}
-                                if ((iProductId == 0x0829) || (iProductId == 0x0528))
+                                if ((iProductId == 0x0829) || (iProductId == 0x0528) || (iProductId == 0x0928))
                                 {
                                     byProductType = GT29336;
                                 }
@@ -1340,7 +1378,7 @@ public class DataAnalysis extends AppCompatActivity
         int i;
         int length = 0;
         //switch to read data mode
-        if (showFlag == 1) {
+        if (showFlag == RAWDATA_FLAG) {
             if (byProductType == GT29336) {  //send 0x00 0x00 0x04 0x02 0x06 0x00 to [0x10174],read rawdata
                 mBytes[0] = 0x00;
                 mBytes[1] = 0x00;
@@ -1362,7 +1400,7 @@ public class DataAnalysis extends AppCompatActivity
                 length = 7;
             }
         }
-        else if (showFlag == 7)
+        else if (showFlag == DIFFDATA_2BYTES_FLAG)
         {
             if (byProductType == GT29336) {  //send 0x00 0x00 0x04 0x01 0x05 0x00 to [0x10174],read diffdata
                 mBytes[0] = 0x00;
@@ -1457,14 +1495,14 @@ public class DataAnalysis extends AppCompatActivity
         byte mdata;
         int ilength = colnum * rownum * 2;
 
-        if (showFlag == 8)
+        if (showFlag == STYLUSDATA_FLAG)
         {
             ilength = (colnum + rownum + 2) * 2;
         }
 
         switch (showFlag){
-            case 1:  //rawdata
-            case 6:  //test
+            case RAWDATA_FLAG:  //rawdata
+            case TESTING_FLAG:  //test
                 if (byProductType == GT29336) {
                     if (!iicRead32Bits((byte) 0x01, (byte) 0xA6, (byte) 0x7C, mRawdataBytes, ilength)) {
                         return false;
@@ -1475,10 +1513,10 @@ public class DataAnalysis extends AppCompatActivity
                     }
                 }
                 break;
-            //case 2:  //manual diffdata
-            //case 4:  //reffdata
-            case 7:  //diffdata低位在前
-            case 3:  //diffdata
+            //case MANUALDATA_FLAG:  //manual diffdata
+            //case TEST_END_FLAG:  //reffdata
+            case DIFFDATA_2BYTES_FLAG:  //diffdata低位在前
+            case DIFFDATA_1BYTE_FLAG:  //diffdata
                 if (byProductType == GT29336) {
                     if (!iicRead32Bits((byte) 0x01, (byte) 0xC1, (byte) 0x4C, mRawdataBytes, ilength)) {
                         return false;
@@ -1497,7 +1535,7 @@ public class DataAnalysis extends AppCompatActivity
         int tempcol = 0;
         int i = 0;
 
-        if (showFlag != 8)  {
+        if (showFlag != STYLUSDATA_FLAG)  {
             //控制行数
             for (int row = 0; row < rownum; row++) {  //Sen
                 //控制列数
@@ -1530,7 +1568,7 @@ public class DataAnalysis extends AppCompatActivity
                 return false;
             }
         }else {
-            if (showFlag == 1)  //rawdata
+            if (showFlag == RAWDATA_FLAG)  //rawdata
             {
                 if (!IicWriteOneByte((byte) 0x01, (byte) 0x03, (byte) 0x08, (byte) 0x0f, (byte) 0)) {
                     return false;
@@ -1576,7 +1614,7 @@ public class DataAnalysis extends AppCompatActivity
                     maddressHigh = (byte) 0x82;
                 }
 
-                if (showFlag == 6)
+                if (showFlag == TESTING_FLAG)
                 {
                     btTestStep = 1;  //
 
@@ -1586,11 +1624,11 @@ public class DataAnalysis extends AppCompatActivity
 
                     //btTestStep = 2;
 
-                    showFlag = 1;  //先进入读原始值状态
+                    showFlag = RAWDATA_FLAG;  //先进入读原始值状态
 
                     changeToDebugMode();
 
-                    showFlag = 6;  //切回测试模式
+                    showFlag = TESTING_FLAG;  //切回测试模式
 
                     stTestLogShow = "";
 
@@ -1598,7 +1636,7 @@ public class DataAnalysis extends AppCompatActivity
                     stTestLogShow = stTestLogShow.concat(stTestLog);
                 }
                 int checktimes;
-                while(showFlag != 4) {
+                while(showFlag != TEST_END_FLAG) {
 
                     if(count-- == 0)
                     {
@@ -1614,7 +1652,7 @@ public class DataAnalysis extends AppCompatActivity
                             }
                         }else {
 
-                            if (showFlag == 1) {  //rawdata
+                            if (showFlag == RAWDATA_FLAG) {  //rawdata
                                 if (!iicRead32Bits((byte) 0x01, (byte) 0x03, (byte) 0x08, mBytes, 1)) {  //轮询读取0x010308
                                     SystemClock.sleep(1);
                                     continue;
@@ -1630,7 +1668,7 @@ public class DataAnalysis extends AppCompatActivity
 
                         if (mBytes[0] == (byte)0x80)  //读到0x80则跳出去读数据
                         {
-                            if (showFlag != 6) {
+                            if (showFlag != TESTING_FLAG) {
                                 if (byDisplayFrame == byDisplayFrameCount) {
                                     for (int i = 0; i < mRawdataBytes.length; i++) {
                                         mRawdataBytes[i] = (byte) 0x00;
@@ -1648,20 +1686,20 @@ public class DataAnalysis extends AppCompatActivity
                     }
                     if (byDisplayFrame == byDisplayFrameCount) {
 
-                        if ((showFlag != 6) && (showFlag != 8) && (showFlag != 5) && (count < 999)) {  //测试模式、读取主动笔数据和停止时
+                        if ((showFlag != TESTING_FLAG) && (showFlag != STYLUSDATA_FLAG) && (showFlag != STOP_FLAG) && (count < 999)) {  //测试模式、读取主动笔数据和停止时
                             byDisplayFrameCount = 0;
                         }
 
                         if (getRawdata() == true) {
 
                             switch (showFlag) {
-                                case 1://rawdata
-                                case 7:// GT7XXX diffdata
+                                case RAWDATA_FLAG://rawdata
+                                case DIFFDATA_2BYTES_FLAG:// GT7XXX diffdata
 
                                     mHandler.sendEmptyMessage(RAWDATA_MESSAGE);
 
                                     break;
-                                case 2://manual diff
+                                case MANUALDATA_FLAG://manual diff
                                     if (count == 999)   //第一帧备份rawdata作为基准
                                     {
                                         if (byProductType == GT7) {
@@ -1683,18 +1721,18 @@ public class DataAnalysis extends AppCompatActivity
                                     mHandler.sendEmptyMessage(MANUALDIFF_MESSAGE);
                                     // mHandler.sendEmptyMessage(RAWDATA_MESSAGE);
                                     break;
-                                case 3://diffdata
+                                case DIFFDATA_1BYTE_FLAG://diffdata
                                     mHandler.sendEmptyMessage(DIFF_MESSAGE);
                                     break;
-                                case 5:  //stop
+                                case STOP_FLAG:  //stop
                                     changeToNormalMode();
                                     SystemClock.sleep(40);
-                                    showFlag = 4;
+                                    showFlag = TEST_END_FLAG;
                                     count = 1000;
                                     btTestStep = 0;
                                     SystemClock.sleep(10);
                                     break;
-                                case 6:  //test
+                                case TESTING_FLAG:  //test
                                     if (btTestStep == 1) {
                                         mHandler.sendEmptyMessage(TEST_DATA_MESSAGE);
                                     }
@@ -1796,15 +1834,18 @@ public class DataAnalysis extends AppCompatActivity
 
                                         //btTestStep = 4;
 
-                                        showFlag = 4;  //stop
+                                        showFlag = TEST_END_FLAG;  //stop
                                         count = 1000;
                                         btTestStep = 0;
+
+                                        ActivityCompat.requestPermissions(  DataAnalysis.this, new String[]{android
+                                                .Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
                                     }
 
 
 
                                     break;
-                                case 8:  //stylusdata
+                                case STYLUSDATA_FLAG:  //stylusdata
                                     mHandler.sendEmptyMessage(STYLUS_DATA_MESSAGE);
                                     break;
                                 default:
@@ -1875,7 +1916,7 @@ public class DataAnalysis extends AppCompatActivity
                                 {
                                     //iDataShow[i] = ((mRawdataBytes[idtemp + 1] & 0xFF) << 8) + (mRawdataBytes[idtemp] & 0xFF);
 
-                                    if ((showFlag == 7) && (iDataShow[i] > 50)){  //GT7XXX diffdata
+                                    if ((showFlag == DIFFDATA_2BYTES_FLAG) && (iDataShow[i] > 50)){  //GT7XXX diffdata
                                         textView.setTextColor(Color.parseColor("#FF0000"));
                                     }
 
@@ -2090,7 +2131,13 @@ public class DataAnalysis extends AppCompatActivity
 
                         textGridLayout.removeAllViews();
 
+                        byTestCount++;
+
+                        if (byTestCount <= 3)
+                            break;
+
                         i = 0;
+                        String rawdata_temp_string = " ";
                         //控制行数
                         for (int row = 0; row < rownum; row++) {   //sen
                             //控制列数
@@ -2098,6 +2145,11 @@ public class DataAnalysis extends AppCompatActivity
 
                                 int temp = col * rownum + row;  //Rawdata存放和测试阈值存放,行列相反
 
+                                rawdata_temp_string += Integer.toString(datatemp[i] & 0xFFFF) + ",";
+
+                                if (col == colnum - 1)
+                                    rawdata_temp_string += "\n";
+
                                 //获取最大值
                                 if (datatemp[i] > iRawDataMaxVal[temp]) {
                                     byOverMaxCount[i]++;
@@ -2118,7 +2170,7 @@ public class DataAnalysis extends AppCompatActivity
                                 i++;
                             }
                         }
-
+                        rawdata_temp_string += "\n";
                         /*
                         if (maxdata > iMaximum)  //统计最大值大于阈值的次数
                         {
@@ -2136,10 +2188,84 @@ public class DataAnalysis extends AppCompatActivity
                         //    byMaximumOverCount++;
                         //}
 
-                        byTestCount++;
-                        stTestLog = getResources().getString(R.string.sampling) + Integer.toString(byTestCount) + getResources().getString(R.string.frame);
 
-                        if (byTestCount >= 16) {
+                        //if (byTestCount > 3)
+                        {
+                            stTestLog = getResources().getString(R.string.sampling) + Integer.toString(byTestCount - 3) + getResources().getString(R.string.frame);
+
+                            switch (byTestCount - 3)
+                            {
+                                case 1:
+                                    strSaveRawdata1 = rawdata_temp_string;
+                                    break;
+
+                                case 2:
+                                    strSaveRawdata2 = rawdata_temp_string;
+                                    break;
+
+                                case 3:
+                                    strSaveRawdata3 = rawdata_temp_string;
+                                    break;
+
+                                case 4:
+                                    strSaveRawdata4 = rawdata_temp_string;
+                                    break;
+
+                                case 5:
+                                    strSaveRawdata5 = rawdata_temp_string;
+                                    break;
+
+                                case 6:
+                                    strSaveRawdata6 = rawdata_temp_string;
+                                    break;
+
+                                case 7:
+                                    strSaveRawdata7 = rawdata_temp_string;
+                                    break;
+
+                                case 8:
+                                    strSaveRawdata8 = rawdata_temp_string;
+                                    break;
+
+                                case 9:
+                                    strSaveRawdata9 = rawdata_temp_string;
+                                    break;
+
+                                case 10:
+                                    strSaveRawdata10 = rawdata_temp_string;
+                                    break;
+
+                                case 11:
+                                    strSaveRawdata11 = rawdata_temp_string;
+                                    break;
+
+                                case 12:
+                                    strSaveRawdata12 = rawdata_temp_string;
+                                    break;
+
+                                case 13:
+                                    strSaveRawdata13 = rawdata_temp_string;
+                                    break;
+
+                                case 14:
+                                    strSaveRawdata14 = rawdata_temp_string;
+                                    break;
+
+                                case 15:
+                                    strSaveRawdata15 = rawdata_temp_string;
+                                    break;
+
+                                case 16:
+                                    strSaveRawdata16 = rawdata_temp_string;
+                                    break;
+
+                                default:
+                                    break;
+                            }
+                        }
+
+
+                        if (byTestCount >= 16 + 3) {
                             stTestLogShow = "";
 
                             stTestLog = getResources().getString(R.string.maxmintestfinish);
@@ -2213,7 +2339,7 @@ public class DataAnalysis extends AppCompatActivity
                                     }
                                 }
                             }
-                            //showFlag = 5;  //stop
+                            //showFlag = STOP_FLAG;  //stop
                             btTestStep = 2;
                             //btn_RawdataShow.setEnabled(true);
                             //btn_DiffdataShow.setEnabled(true);
@@ -2238,7 +2364,7 @@ public class DataAnalysis extends AppCompatActivity
                     }
                     /*
                     else if (btTestStep == 4){
-                        showFlag = 4;  //stop
+                        showFlag = TEST_END_FLAG;  //stop
                         count = 1000;
                         btTestStep = 0;
 
@@ -4199,6 +4325,8 @@ public class DataAnalysis extends AppCompatActivity
         Update_log = getResources().getString(R.string.startshorttest);
         mHandler.sendEmptyMessage(TEST_DATA_MESSAGE);
 
+        bSaveShortTestResult = false;
+
         if (!ShortTestrRunCode())
         {
             Update_log += ", short test run code failed, test is NG!!";
@@ -4315,6 +4443,8 @@ public class DataAnalysis extends AppCompatActivity
 
         msubcommand = (byte)0x2A ;  //最高位置1,写命令42 ENABLE_ESD_CHECK
         IicWriteOneByte(addrfirstbyte, addrsecondbyte, addrthirdbyte, msubcommand, mdata);
+
+        bSaveShortTestResult = true;
     }
 
     //------------------------------------GT29xx short circuit test code end---------------------------------------------------------------//
@@ -4332,7 +4462,7 @@ public class DataAnalysis extends AppCompatActivity
 
         switch (view.getId()) {
             case R.id.stop:    //back
-                showFlag = 5;
+                showFlag = STOP_FLAG;
 
                 btn_RawdataShow.setEnabled(true);
                 btn_DiffdataShow.setEnabled(true);
@@ -4525,7 +4655,7 @@ public class DataAnalysis extends AppCompatActivity
                     edt_RowNum.setText(Integer.toString(rownum));
                 }
 
-                if (showFlag != 8) {
+                if (showFlag != STYLUSDATA_FLAG) {
                     textGridLayout.removeAllViews();
 
                     textGridLayout.setColumnCount(colnum + 1);
@@ -4551,7 +4681,7 @@ public class DataAnalysis extends AppCompatActivity
                 switch (view.getId()) {
                     case R.id.rawdata:   //Read RawData
 
-                        showFlag = 1;
+                        showFlag = RAWDATA_FLAG;
 
                         changeToDebugMode();
                         //count = 1000;
@@ -4573,10 +4703,10 @@ public class DataAnalysis extends AppCompatActivity
 
                     case R.id.diffdata:
 
-                        //showFlag = 3;
+                        //showFlag = DIFFDATA_1BYTE_FLAG;
                         //if (byProductType == GT7)
                         {
-                            showFlag = 7; //GT7系列的差值是2bytes,按照RawData的方式去显示
+                            showFlag = DIFFDATA_2BYTES_FLAG; //GT7系列的差值是2bytes,按照RawData的方式去显示
                         }
 
                         changeToDebugMode();
@@ -4594,8 +4724,8 @@ public class DataAnalysis extends AppCompatActivity
 
                         break;
 
-                    case R.id.reffdata:
-                        showFlag = 4;
+                    case R.id.reffdata:  //暂时没用
+                        showFlag = REFFDATA_FLAG;
                         count = 1000;
                         showAddressHigh = (byte) 0x81;
                         showAddressLow = (byte) 0xc0;
@@ -4616,7 +4746,7 @@ public class DataAnalysis extends AppCompatActivity
                         break;
 
                     case R.id.manualdiff:
-                        showFlag = 2;
+                        showFlag = MANUALDATA_FLAG;
                         btn_Manualreff.setEnabled(true);
                         changeToDebugMode();
                         showAddressHigh = (byte) 0x8b;
@@ -4634,7 +4764,7 @@ public class DataAnalysis extends AppCompatActivity
                         break;
 
                     case R.id.manualreff:  //set up manual ref
-                        showFlag = 2;
+                        showFlag = MANUALDATA_FLAG;
                         btn_Manualreff.setEnabled(true);
                         count = 1000;
 
@@ -4650,7 +4780,7 @@ public class DataAnalysis extends AppCompatActivity
                     case R.id.stylusdata:  //主动笔数据
                         if (byProductType == GT7)  //GT7系列才显示
                         {
-                            showFlag = 8;
+                            showFlag = STYLUSDATA_FLAG;
 
                             changeToDebugMode();
 
@@ -4849,7 +4979,7 @@ public class DataAnalysis extends AppCompatActivity
                     break;
                 }
 
-                showFlag = 6;
+                showFlag = TESTING_FLAG;
                 byTestCount = 0;
                 byMaximumOverCount = 0;
                 byMinimumOverCount = 0;
@@ -4876,11 +5006,33 @@ public class DataAnalysis extends AppCompatActivity
                         bTestMaxResult = true;
                         bTestMinResult = true;
 
-                        showFlag = 6;
+                        showFlag = TESTING_FLAG;
                         byTestCount = 0;
                         byMaximumOverCount = 0;
                         byMinimumOverCount = 0;
                         byReTestCount = 0;
+
+                        strSaveRawDataMax = "";
+                        strSaveRawDataMin = "";
+                        //控制行数
+                        for (int row = 0; row < rownum; row++) {   //sen
+                            //控制列数
+                            for (int col = 0; col < colnum; col++) {  //drv
+
+                                int temp = col * rownum + row;  //Rawdata存放和测试阈值存放,行列相反
+
+                                strSaveRawDataMax += Integer.toString(iRawDataMaxVal[temp] & 0xFFFF) + ",";
+                                strSaveRawDataMin += Integer.toString(iRawDataMinVal[temp] & 0xFFFF) + ",";
+
+                                if (col == colnum - 1) {
+                                    strSaveRawDataMax += "\n";
+                                    strSaveRawDataMin += "\n";
+                                }
+                            }
+                        }
+                        strSaveRawDataMax += "\n";
+                        strSaveRawDataMin += "\n";
+
                         if (count == 1000) {
                             //tvDataContent.setText("["+getResources().getString(R.string.rawdata)+"]");
                             showRawdata();
@@ -4888,7 +5040,7 @@ public class DataAnalysis extends AppCompatActivity
                         break;
                     /*
                     case R.id.stop:    //back
-                        showFlag = 5;
+                        showFlag = STOP_FLAG;
 
                         btn_RawdataShow.setEnabled(true);
                         //btn_DiffdataShow.setEnabled(true);
@@ -4949,13 +5101,13 @@ public class DataAnalysis extends AppCompatActivity
 
              */
             switch (showFlag){
-                case 1:  //GT9 rawdata
-                case 2:  //manualdiff
-                case 3:  //diffdata
-                case 6:  //test
-                case 7:  //GT738X rawdata
-                case 8:  //stylusdata
-                    showFlag = 5;
+                case RAWDATA_FLAG:  //GT9 rawdata
+                case MANUALDATA_FLAG:  //manualdiff
+                case DIFFDATA_1BYTE_FLAG:  //diffdata
+                case TESTING_FLAG:  //test
+                case DIFFDATA_2BYTES_FLAG:  //GT738X rawdata
+                case STYLUSDATA_FLAG:  //stylusdata
+                    showFlag = STOP_FLAG;
 
                     btn_RawdataShow.setEnabled(true);
                     btn_DiffdataShow.setEnabled(true);
@@ -4966,8 +5118,8 @@ public class DataAnalysis extends AppCompatActivity
                     btn_Test.setEnabled(true);
 
                     break;
-                case 4:  //test end
-                case 5:  //stop
+                case TEST_END_FLAG:  //test end
+                case STOP_FLAG:  //stop
                 default:
                     finish();
                     break;
@@ -4976,4 +5128,228 @@ public class DataAnalysis extends AppCompatActivity
         }
         return super.onKeyDown(keyCode, event);
     }
+
+    @Override
+    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
+        switch (requestCode) {
+            case 1:
+                String filePath;// = Environment.getExternalStorageDirectory() + "/saveconfig/";
+                String fileName;
+                String temp_string;
+                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
+                    //创建文件夹
+                    if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
+
+                        StringBuilder configBuilder = new StringBuilder("");
+
+                        //1.save config
+                        configBuilder.append("[Chip Config]\n");
+                        int iConfigSize = 64 + (int)(byConfigBak[60] & 0xFF) * 256 + (byConfigBak[59] & 0xFF);   //the head lend is 64
+
+                        for (int i = 0; i < iConfigSize; i++) {
+                            configBuilder.append("0x" + Integer.toHexString(byConfigBak[i] & 0xFF) + ",");
+                        }
+                        configBuilder.append("\n\n");
+
+                        //2.save Chanel Number
+                        configBuilder.append("[Chanel Number]\n");
+                        configBuilder.append("SensorNum:" + edt_RowNum.getText() + "\n");
+                        configBuilder.append("DriverNum:" + edt_ColNum.getText() + "\n\n");
+
+                        //3.save test result
+                        configBuilder.append("[Test Result]\n");
+
+                        temp_string = "Pass";
+                        if (bTestMaxResult == false || bTestMinResult == false)
+                        {
+                            temp_string = "Failed";
+                        }
+                        configBuilder.append("MaxMinTest:" + temp_string + "\n");
+
+                        temp_string = "Pass";
+                        if (bSaveShortTestResult == false)
+                        {
+                            temp_string = "Failed";
+                        }
+                        configBuilder.append("ShortTest:" + temp_string + "\n");
+                        configBuilder.append(edtShortCircuitInfo.getText() + "\n\n");
+
+                        //4.save maxvalue & minvalue
+                        configBuilder.append("[MaximumThresholdArray]\n");
+                        configBuilder.append(strSaveRawDataMax);
+                        configBuilder.append("[MinimumThresholdArray]\n");
+                        configBuilder.append(strSaveRawDataMin);
+
+                        //5.save rawdata
+                        configBuilder.append("[Rawdata[0]]\n");
+                        configBuilder.append(strSaveRawdata1);
+                        configBuilder.append("[Rawdata[1]]\n");
+                        configBuilder.append(strSaveRawdata2);
+                        configBuilder.append("[Rawdata[2]]\n");
+                        configBuilder.append(strSaveRawdata3);
+                        configBuilder.append("[Rawdata[3]]\n");
+                        configBuilder.append(strSaveRawdata4);
+                        configBuilder.append("[Rawdata[4]]\n");
+                        configBuilder.append(strSaveRawdata5);
+                        configBuilder.append("[Rawdata[5]]\n");
+                        configBuilder.append(strSaveRawdata6);
+                        configBuilder.append("[Rawdata[6]]\n");
+                        configBuilder.append(strSaveRawdata7);
+                        configBuilder.append("[Rawdata[7]]\n");
+                        configBuilder.append(strSaveRawdata8);
+                        configBuilder.append("[Rawdata[8]]\n");
+                        configBuilder.append(strSaveRawdata9);
+                        configBuilder.append("[Rawdata[9]]\n");
+                        configBuilder.append(strSaveRawdata10);
+                        configBuilder.append("[Rawdata[10]]\n");
+                        configBuilder.append(strSaveRawdata11);
+                        configBuilder.append("[Rawdata[11]]\n");
+                        configBuilder.append(strSaveRawdata12);
+                        configBuilder.append("[Rawdata[12]]\n");
+                        configBuilder.append(strSaveRawdata13);
+                        configBuilder.append("[Rawdata[13]]\n");
+                        configBuilder.append(strSaveRawdata14);
+                        configBuilder.append("[Rawdata[14]]\n");
+                        configBuilder.append(strSaveRawdata15);
+                        configBuilder.append("[Rawdata[15]]\n");
+                        configBuilder.append(strSaveRawdata16);
+
+                        filePath = Environment.getExternalStorageDirectory() + "/test_result/";
+                        //File file = new File(filePath);
+
+                        temp_string = "GT";
+                        String hv = "";
+                        iicRead32Bits((byte)0x01, (byte)0x00, (byte)0x14,mBytes, 23);
+
+                        for (int i = 10; i < 15; i++)  //Get PID
+                        {
+                            if (mBytes[i] == 0)
+                                break;
+
+                            int v = (mBytes[i] - 48) & 0xFF;  //ASCII码减去48
+                            hv = Integer.toHexString(v);
+                            temp_string += hv;
+                        }
+
+                        if (temp_string.length() < 6)
+                        {
+                            temp_string = "Null";
+                        } else{
+
+                            temp_string += "_";
+
+                            for (int i = 18; i < 22; i++)  //Get version
+                            {
+                                int v = mBytes[i] & 0xFF;
+                                hv = Integer.toHexString(v);
+                                if (hv.length() < 2){
+                                    hv = "0" + hv;
+                                }
+
+                                temp_string += hv;
+
+                                if (i < 21)
+                                {
+                                    temp_string += ".";
+                                }
+                            }
+                        }
+                        temp_string += "_v" + Integer.toString(byConfigBak[34] & 0xFF) + "_";
+                        temp_string += edt_RowNum.getText() + "x" + edt_ColNum.getText() + "_";
+
+
+                        if (bTestMaxResult == false || bTestMinResult == false || bSaveShortTestResult == false)
+                        {
+                            temp_string += "NG_";
+                        }
+                        else
+                        {
+                            temp_string += "OK_";
+                        }
+
+                        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
+                        Date date = new Date(System.currentTimeMillis());  //获取当前系统时间
+
+                        fileName = temp_string + simpleDateFormat.format(date) + ".csv";//editname.getText().toString();
+                        writeTxtToFile(configBuilder.toString().trim(), filePath, fileName);
+
+                        //mShow.setText(fileName + getResources().getString(R.string.saveto) + filePath.toString());
+
+                    }
+                }
+                break;
+            case 2:
+                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
+                    //创建文件夹
+                    if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
+
+                    }
+                }
+                break;
+
+            case 3:
+                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
+                    //权限已成功申请
+                }else{
+                    //用户拒绝授权
+                    Toast.makeText(this,getResources().getString(R.string.nopermission), Toast.LENGTH_SHORT).show();
+                    finish();
+                }
+                break;
+            default:
+                super.onRequestPermissionsResult(requestCode, permissions, grantResults);
+                break;
+        }
+    }
+    // 将字符串写入到文本文件中
+    public void writeTxtToFile(String strcontent, String filePath, String fileName) {
+        // 生成文件夹之后,再生成文件,不然会出错
+        makeFilePath(filePath, fileName);
+
+        String strFilePath = filePath + fileName;
+        // 每次写入时,都换行写
+        String strContent = strcontent + "\r\n";
+        try {
+            File file = new File(strFilePath);
+            if (!file.exists()) {
+                Log.d("TestFile", "Create the file:" + strFilePath);
+                file.getParentFile().mkdirs();
+                file.createNewFile();
+            }
+            RandomAccessFile raf = new RandomAccessFile(file, "rwd");
+            raf.seek(file.length());
+            raf.write(strContent.getBytes());
+            raf.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    // 生成文件
+    public File makeFilePath(String filePath, String fileName) {
+        File file = null;
+        makeRootDirectory(filePath);
+        try {
+            file = new File(filePath + fileName);
+            if (!file.exists()) {
+                file.createNewFile();
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return file;
+    }
+
+    // 生成文件夹
+    public static void makeRootDirectory(String filePath) {
+        File file = null;
+        try {
+            file = new File(filePath);
+            if (!file.exists()) {
+                file.mkdir();
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
 }

+ 1 - 1
app/src/main/java/com/example/administrator/wingcool_gt9_apk/FirmwareUpdate.java

@@ -496,7 +496,7 @@ public class FirmwareUpdate extends AppCompatActivity
                                 //    byProductType = GT9;
                                 //}
 
-                                if ((iProductId == 0x0829) || (iProductId == 0x0528))
+                                if ((iProductId == 0x0829) || (iProductId == 0x0528) || (iProductId == 0x0928))
                                 {
                                     byProductType = GT29336;
                                 }

+ 1 - 1
app/src/main/java/com/example/administrator/wingcool_gt9_apk/UsbSetting.java

@@ -437,7 +437,7 @@ public class UsbSetting extends AppCompatActivity
                             mUsbDeviceConnection.claimInterface(mUsbInterface, true);
                             if(null != mUsbEndpointIn){
                                 iProductId = usbDevice.getProductId();
-                                if ((iProductId == 0x0819) || (iProductId == 0x8191) || (iProductId == 0x0528) )
+                                if ((iProductId == 0x0819) || (iProductId == 0x8191) || (iProductId == 0x0528) || (iProductId == 0x0928) )
                                 {
                                     byProductType = GT7;
                                 }

+ 2 - 2
app/src/main/res/values-en/strings.xml

@@ -106,10 +106,10 @@
     <string name="enteraddress">Please enter the correct address</string>
 
     <!-- Activity_contact_us -->
-    <string name="companyaddr">Address:Room 2008, Chuangxingda Business Building, No.36 Liuxian 3rd Road, Baoan District, Shenzhen</string>
+    <string name="companyaddr">Address:Room 2006, Chuangxingda Business Building, No.36 Liuxian 3rd Road, Baoan District, Shenzhen</string>
     <string name="telephonenum">Telephone:186 8896 1937</string>
     <string name="emailaddr">Email:robbin@wingcool.cn</string>
-    <string name="version">APK Version:v3.0.5_20240329-Debug Version</string>
+    <string name="version">APK Version:v3.0.7_20250103-Debug Version</string>
 
     <!-- other -->
     <string name="app_name">WingCoolAPK</string>

+ 2 - 2
app/src/main/res/values/strings.xml

@@ -106,10 +106,10 @@
     <string name="enteraddress">请输入正确的地址</string>
 
     <!-- Activity_contact_us -->
-    <string name="companyaddr">地址:深圳市宝安区留仙三路 36 号创兴达商务大厦 2008 室</string>
+    <string name="companyaddr">地址:深圳市宝安区留仙三路 36 号创兴达商务大厦 2006 室</string>
     <string name="telephonenum">电话:186 8896 1937</string>
     <string name="emailaddr">邮箱:robbin@wingcool.cn</string>
-    <string name="version">APK版本:v3.0.5_20240329-debug版本</string>
+    <string name="version">APK版本:v3.0.7_20250103-debug版本</string>
 
     <!-- other -->
     <string name="app_name">WingCoolAPK</string>