增加GPS 星值 测试窗口,给天线调试用。
authorsnickersun <scy@incartech.cn>
Tue, 17 Mar 2020 10:18:58 +0000 (18:18 +0800)
committersnickersun <scy@incartech.cn>
Tue, 17 Mar 2020 10:18:58 +0000 (18:18 +0800)
14 files changed:
app/build.gradle
app/src/main/AndroidManifest.xml
app/src/main/java/mobile/miki/GPSActivity.java [new file with mode: 0644]
app/src/main/java/mobile/miki/LocationSnrAdapter.java [new file with mode: 0644]
app/src/main/java/mobile/miki/SnrEntriy.java [new file with mode: 0644]
app/src/main/java/mobile/miki/SnrHistogramView.java [new file with mode: 0644]
app/src/main/java/mobile/miki/mainui/TestMainList.java
app/src/main/res/layout/activity_shutdown_activity.xml
app/src/main/res/layout/dig_layout_testlist.xml
app/src/main/res/layout/gps_full_test_activity.xml [new file with mode: 0644]
app/src/main/res/layout/item_snr_layout.xml [new file with mode: 0644]
app/src/main/res/layout/motor_test_layout.xml
app/src/main/res/values/colors.xml
app/src/main/res/values/styles.xml

index 8ab944c..1997d4a 100644 (file)
@@ -37,7 +37,7 @@ android {
             outputFileName = "FactoryMode.apk"\r
         }\r
     }\r
-    buildToolsVersion '27.0.3'\r
+//    buildToolsVersion '20.0.3'\r
 \r
     sourceSets {\r
         main {\r
@@ -51,14 +51,18 @@ android {
 }\r
 \r
 dependencies {\r
-    implementation 'com.android.support:support-v4:20.0.0'\r
+//    implementation 'com.android.support:support-v4:20.0.0'\r
    // compileOnly files('libs/framework.jar')\r
-    provided files('libs/framework.jar')\r
+    compileOnly files('libs/framework.jar')\r
     implementation 'com.squareup.okhttp3:okhttp:3.4.1'\r
     implementation 'io.reactivex:rxandroid:1.2.1'\r
     implementation 'com.liulishuo.filedownloader:library:1.6.3'\r
     compileOnly files('libs/IAtChannel_classes.jar')\r
     implementation files('libs/LineWrapContainer.aar')\r
+    implementation 'com.android.support:appcompat-v7:27.1.1'\r
+    implementation 'com.android.support:recyclerview-v7:27.1.1'\r
+//    implementation 'com.android.support:recyclerview-v7:20.0.0'\r
+\r
 }\r
 preBuild {\r
 \r
index 5c1711a..d588831 100644 (file)
@@ -70,6 +70,7 @@
         android:icon="@drawable/ic_gravity"
         android:label="@string/app_name">
         <activity android:name=".shutdown_activity"></activity>
+        <activity android:name=".GPSActivity"></activity>
         <activity
             android:name=".mainui.TestMainList"
             android:label="@string/app_name"
diff --git a/app/src/main/java/mobile/miki/GPSActivity.java b/app/src/main/java/mobile/miki/GPSActivity.java
new file mode 100644 (file)
index 0000000..4e1622e
--- /dev/null
@@ -0,0 +1,505 @@
+package mobile.miki;\r
+\r
+import android.content.Context;\r
+import android.graphics.Color;\r
+import android.graphics.Rect;\r
+import android.location.Criteria;\r
+import android.location.GpsStatus;\r
+import android.location.Location;\r
+import android.location.LocationListener;\r
+import android.location.LocationManager;\r
+import android.os.Bundle;\r
+import android.os.Handler;\r
+import android.os.Message;\r
+import android.os.PowerManager;\r
+import android.provider.Settings;\r
+import android.support.v7.widget.LinearLayoutManager;\r
+import android.support.v7.widget.RecyclerView;\r
+import android.view.View;\r
+import android.widget.TextView;\r
+\r
+\r
+import java.text.DecimalFormat;\r
+import java.text.SimpleDateFormat;\r
+import java.util.ArrayList;\r
+import java.util.Date;\r
+import java.util.List;\r
+import java.util.Timer;\r
+\r
+import mobile.miki.util.Logger;\r
+\r
+import static android.location.LocationManager.GPS_PROVIDER;\r
+\r
+public class GPSActivity extends BaseActivity  {\r
+\r
+    private RecyclerView mRv;\r
+\r
+    private TextView mFix;\r
+    private TextView mStar;\r
+    private TextView mHoop;\r
+    private TextView mSearchCount;\r
+    private boolean showmessage=false;\r
+    private Timer timer;\r
+    final LocationSnrAdapter adapter = new LocationSnrAdapter(testSnrEntriyDate(null));\r
+\r
+\r
+\r
+    @Override\r
+    protected void onCreate(Bundle savedInstanceState) {\r
+        super.onCreate(savedInstanceState);\r
+        setContentView(R.layout.gps_full_test_activity);\r
+\r
+        mRv = (RecyclerView)findViewById(R.id.app_list);\r
+\r
+        mFix=(TextView)findViewById(R.id.ic_lc_fix_value);\r
+        mStar =(TextView) findViewById(R.id.ic_lc_star_value);\r
+        mHoop =  (TextView)findViewById(R.id.ic_lc_hoop_value);\r
+        mSearchCount= (TextView)findViewById(R.id.ic_lc_searchCount_value);\r
+        mRv.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false));\r
+\r
+        mRv.addItemDecoration(new SpacesItemDecoration(10));\r
+        mRv.setAdapter(adapter);\r
+\r
+        mFix.setText("notFixed");\r
+        mStar.setText("0 in 0/ inMap 0");\r
+        mHoop.setText("0.0米");\r
+        mSearchCount.setText("0秒");\r
+        locationManager = (LocationManager)this.getSystemService(Context.LOCATION_SERVICE);\r
+        startListen();\r
+    }\r
+\r
+    public void on_locating_changed(GPS_locationStatus gps_status) {\r
+\r
+        gps_status_show.numSatelliteList.clear();\r
+        gps_status_show.hdop=gps_status.hdop;\r
+        gps_status_show.locating_status=gps_status.locating_status;\r
+        gps_status_show.satlite_numbss=gps_status.satlite_numbss;\r
+        gps_status_show.search_time_cost=gps_status.search_time_cost;\r
+        gps_status_show.used_gps_numbs=gps_status.used_gps_numbs;\r
+//        gps_status_show.numSatelliteList=gps_status.numSatelliteList;\r
+        for (int i=0;i<gps_status.numSatelliteList.size();i++) {\r
+            gps_status_show.numSatelliteList.add(i, new GpsSatellitePriv(gps_status.numSatelliteList.get(i).prn,gps_status.numSatelliteList.get(i).snr));\r
+        }\r
+\r
+      mHandler.sendEmptyMessage(0);\r
+    }\r
+\r
+    public class SpacesItemDecoration extends RecyclerView.ItemDecoration {\r
+        private int space;\r
+\r
+        public SpacesItemDecoration(int space) {\r
+            this.space = space;\r
+        }\r
+\r
+        @Override\r
+        public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {\r
+            outRect.right = space;\r
+        }\r
+    }\r
+    public static String getLocalTime2() { return getLocalTime2(System.currentTimeMillis()); }\r
+\r
+    public static String getLocalTime2(long paramLong) { return (new SimpleDateFormat("MMdd-HHmmss")).format(new Date(paramLong)); }\r
+    public static class  GpsSatellitePriv {\r
+        int prn;\r
+        float snr;\r
+        public GpsSatellitePriv(int _prn, float _snr) {\r
+            prn=_prn;\r
+            snr=_snr;\r
+        }\r
+        public int getPrn() {\r
+            return prn;\r
+        }\r
+        public float getSnr() {\r
+            return snr;\r
+        }\r
+    }\r
+    public static class GPS_locationStatus{\r
+        public List<GpsSatellitePriv> numSatelliteList = new ArrayList<GpsSatellitePriv>(); // 卫星信号\r
+        public int used_gps_numbs;\r
+        public float hdop;\r
+        public int satlite_numbss;\r
+        public int search_time_cost;\r
+        public int locating_status;\r
+    }\r
+    public ArrayList<SnrEntriy> testSnrEntriyDate(List<GpsSatellitePriv> gpslist) {\r
+        ArrayList<SnrEntriy> entity = new ArrayList<>();\r
+\r
+        if (gpslist!=null) {\r
+            for (int i = 0; i < gpslist.size(); i++) {\r
+\r
+                float snr=gpslist.get(i).getSnr();\r
+                int prn=gpslist.get(i).getPrn();\r
+                Logger.d("testSnrEntriyDate snr="+snr+",prn="+prn);\r
+                SnrEntriy info = new SnrEntriy(snr,prn , (snr>=40? Color.GREEN:((snr>=25&&snr<40)? Color.YELLOW: Color.RED)));\r
+                entity.add(info);\r
+            }\r
+        }\r
+        return entity;\r
+    }\r
+    PowerManager.WakeLock screenOnWakelock=null;\r
+    @Override\r
+    protected  void onResume() {\r
+        super.onResume();\r
+        if (screenOnWakelock==null)\r
+            screenOnWakelock = getScreenOnWakeLock(this,GPSActivity.class.getSimpleName());\r
+\r
+    }\r
+    public static PowerManager.WakeLock getScreenOnWakeLock(Context context, String tag) {\r
+        PowerManager.WakeLock wakeLock = ((PowerManager)(context.getSystemService(Context.POWER_SERVICE))).newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, tag);\r
+        wakeLock.acquire();\r
+        return wakeLock;\r
+    }\r
+    @Override\r
+    protected void onPause() {\r
+        super.onPause();\r
+        if(screenOnWakelock!=null) {\r
+            if (screenOnWakelock.isHeld()) {\r
+                screenOnWakelock.release();\r
+            }\r
+            screenOnWakelock=null;\r
+        }\r
+\r
+\r
+    }\r
+\r
+    @Override\r
+    protected  void onDestroy(){\r
+        super.onDestroy();\r
+        stopListen();\r
+\r
+    }\r
+\r
+    private class myGpsListener implements GpsStatus.NmeaListener, LocationListener{\r
+\r
+        @Override\r
+        public void onNmeaReceived(long l, String s) {\r
+            mOnNmeaReceived(l,s);\r
+        }\r
+\r
+        @Override\r
+        public void onLocationChanged(Location location) {\r
+\r
+        }\r
+\r
+        @Override\r
+        public void onStatusChanged(String s, int i, Bundle bundle) {\r
+\r
+        }\r
+\r
+        @Override\r
+        public void onProviderEnabled(String s) {\r
+\r
+        }\r
+\r
+        @Override\r
+        public void onProviderDisabled(String s) {\r
+\r
+        }\r
+    }\r
+\r
+    Handler mHandler=new Handler(new Handler.Callback() {\r
+        @Override\r
+        public boolean handleMessage(Message message) {\r
+\r
+            List<GpsSatellitePriv> gpslist =gps_status_show.numSatelliteList;\r
+            adapter.updateLocationValue(testSnrEntriyDate(gpslist));\r
+            String fixed=new StringBuilder().append(gps_status_show.locating_status>0?\r
+                    "Fixed ":"notFixed ").append(getLocalTime2()).toString();\r
+            String satlites=new StringBuilder("used ").append(gps_status_show.used_gps_numbs).append(" in ")\r
+                    .append(gps_status_show.numSatelliteList.size()).append("/ inMap ").append(gps_status_show.satlite_numbss).toString();\r
+            String locationTime=new StringBuilder().append(gps_status_show.search_time_cost).append("秒").toString();\r
+            String hdop=new StringBuilder().append(String.valueOf(gps_status_show.hdop)).append("米").toString();\r
+            mFix.setText(fixed);\r
+            mStar.setText(satlites);\r
+            mHoop.setText(hdop);\r
+            mSearchCount.setText(locationTime);\r
+\r
+            return false;\r
+        }\r
+    });\r
+    myGpsListener  gpsListener=new myGpsListener();\r
+    private boolean listening=false;\r
+    public boolean startListen() {\r
+\r
+        if (this.listening == false) {\r
+            Settings.Secure.setLocationProviderEnabled(this.getContentResolver(), GPS_PROVIDER, true);\r
+\r
+\r
+            Criteria criteria = new Criteria();\r
+            criteria.setAccuracy(Criteria.ACCURACY_FINE);// 设置为最大精度\r
+            criteria.setAltitudeRequired(false);//不要求海拔信息\r
+            criteria.setBearingRequired(false);// 不要求方位信息\r
+            criteria.setCostAllowed(true);//是否允许付费\r
+            criteria.setPowerRequirement(Criteria.POWER_LOW);// 对电量的要求\r
+\r
+            String provider = locationManager.getBestProvider(criteria, true);\r
+\r
+            Logger.d("GPS StartListen with Provider " + provider);\r
+            this.locationManager.requestLocationUpdates(provider, 0L, 0.0F, gpsListener);\r
+\r
+            this.listening = true;\r
+            longitude = 0;\r
+            latitude = 0;\r
+            searchCout = 0;\r
+            locationFixedCount=0;\r
+\r
+//      locationManager.addGpsStatusListener(statusListener);//监听搜星状态\r
+            locationManager.addNmeaListener(gpsListener); //监听NMEA 协议数据。\r
+\r
+            //做个热启动\r
+            return true;//gpsHotStart();\r
+        }else{\r
+            Logger.d(" location listening, skip !");\r
+            return true;\r
+        }\r
+    }\r
+\r
+\r
+    public void stopListen() {\r
+        this.locationManager.removeNmeaListener(gpsListener);\r
+        this.locationManager.removeUpdates(gpsListener);\r
+        this.listening = false;\r
+        Logger.d("stopListen 定位 ");\r
+\r
+        Settings.Secure.setLocationProviderEnabled(this.getContentResolver(), GPS_PROVIDER, false);\r
+\r
+    }\r
+\r
+    private LocationManager locationManager;\r
+    private double longitude;\r
+    private double latitude;\r
+\r
+    private int searchCout=0;\r
+\r
+    private GPS_locationStatus gps_status = new GPS_locationStatus();\r
+    private GPS_locationStatus gps_status_show = new GPS_locationStatus();\r
+\r
+    private static int locationFixedCount=0;\r
+    static int satindex=0;\r
+    public void mOnNmeaReceived(long paramLong, String nmeastr) {\r
+//    EqcAlgorithmNative.native_EqcAlgorithmMethod5(paramString);\r
+//    ICLogger.i("Nmea :"+nmeastr+" "+paramLong);\r
+\r
+        if(nmeastr.startsWith("$RD_RSSI"))  {\r
+\r
+            searchCout++;\r
+             on_locating_changed(gps_status);\r
+            gps_status.numSatelliteList.clear();\r
+            gps_status.search_time_cost=searchCout;\r
+        }\r
+\r
+\r
+        if (nmeastr.startsWith("$GPGLL,")){\r
+            String tmplist[]=nmeastr.split(",");\r
+//      GPGLL编辑\r
+//(地理定位信息)\r
+//      例:$GPGLL,4250.5589,S,14718.5084,E,092204.999,A*2D\r
+//      字段0:$GPGLL,语句ID,表明该语句为Geographic Position(GLL)地理定位信息\r
+//      字段1:纬度ddmm.mmmm,度分格式(前导位数不足则补0)\r
+//      字段2:纬度N(北纬)或S(南纬)\r
+//      字段3:经度dddmm.mmmm,度分格式(前导位数不足则补0)\r
+//      字段4:经度E(东经)或W(西经)\r
+//      字段5:UTC时间,hhmmss.sss格式\r
+//      字段6:状态,A=定位,V=未定位\r
+//      字段7:校验值($与*之间的数异或后的值)\r
+            String Lat=tmplist[1];\r
+            String lon=tmplist[3];\r
+            String fixed=tmplist[6];\r
+//      ICLogger.i("GPGLL Lat="+Lat+",Lon="+lon+",fixed="+fixed);\r
+\r
+        }else if (nmeastr.startsWith("$GPRMC,")) {\r
+//      GPRMC编辑\r
+//(推荐定位信息数据格式)\r
+//      例:$GPRMC,024813.640,A,3158.4608,N,11848.3737,E,10.05,324.27,150706,,,A*50\r
+//      字段0:$GPRMC,语句ID,表明该语句为Recommended Minimum Specific GPS/TRANSIT Data(RMC)推荐最小定位信息\r
+//      字段1:UTC时间,hhmmss.sss格式\r
+//      字段2:状态,A=定位,V=未定位\r
+//      字段3:纬度ddmm.mmmm,度分格式(前导位数不足则补0)\r
+//      字段4:纬度N(北纬)或S(南纬)\r
+//      字段5:经度dddmm.mmmm,度分格式(前导位数不足则补0)\r
+//      字段6:经度E(东经)或W(西经)\r
+//      字段7:速度,节,Knots\r
+//      字段8:方位角,度\r
+//      字段9:UTC日期,DDMMYY格式\r
+//      字段10:磁偏角,(000 - 180)度(前导位数不足则补0)\r
+//      字段11:磁偏角方向,E=东W=西\r
+//      字段12:模式,A=自动,D=差分,E=估测,N=数据无效(3.0协议内容)\r
+//      字段13:校验值($与*之间的数异或后的值)\r
+            String tmplist[]=nmeastr.split(",");\r
+            String utctime=tmplist[1];\r
+            String Lat=tmplist[3];\r
+            String lon=tmplist[5];\r
+            String fixed=tmplist[2];\r
+            String speed=tmplist[7];\r
+//      ICLogger.i("GPRMC GPSTime="+utctime+",Lat="+Lat+",Lon="+lon+",fixed="+fixed+",speed="+speed);\r
+//      if (Config.LOG_TOFILE)\r
+//        FileOutputUtil.fileOutput(this.runtime.getCacheDir(), "GPS", "GPRMC GPSTime="+utctime+",Lat="+Lat+",Lon="+lon+",fixed="+fixed+",speed="+speed);\r
+            if (fixed.trim().equals("A")) {\r
+                if (speed.trim().isEmpty()) speed = "0.0";\r
+            }\r
+\r
+\r
+        }else if (nmeastr.startsWith("$GPGSV,")) {\r
+\r
+//    GPGSV编辑\r
+//            (可见卫星信息)\r
+//    例:$GPGSV,3,1,10,20,78,331,45,01,59,235,47,22,41,069,,13,32,252,45*70\r
+//    字段0:$GPGSV,语句ID,表明该语句为GPS Satellites in View(GSV)可见卫星信息\r
+//    字段1:本次GSV语句的总数目(1 - 3)\r
+//    字段2:本条GSV语句是本次GSV语句的第几条(1 - 3)\r
+//    字段3:当前可见卫星总数(00 - 12)(前导位数不足则补0)\r
+//    字段4:PRN 码(伪随机噪声码)(01 - 32)(前导位数不足则补0)\r
+//    字段5:卫星仰角(00 - 90)度(前导位数不足则补0)\r
+//    字段6:卫星方位角(00 - 359)度(前导位数不足则补0)\r
+//    字段7:信噪比(00-99)dbHz\r
+//    字段8:PRN 码(伪随机噪声码)(01 - 32)(前导位数不足则补0)\r
+//    字段9:卫星仰角(00 - 90)度(前导位数不足则补0)\r
+//    字段10:卫星方位角(00 - 359)度(前导位数不足则补0)\r
+//    字段11:信噪比(00-99)dbHz\r
+//    字段12:PRN 码(伪随机噪声码)(01 - 32)(前导位数不足则补0)\r
+//    字段13:卫星仰角(00 - 90)度(前导位数不足则补0)\r
+////    字段14:卫星方位角(00 - 359)度(前导位数不足则补0)\r
+////    字段15:信噪比(00-99)dbHz\r
+//    字段16:校验值($与*之间的数异或后的值)\r
+\r
+            String tmplist[]=nmeastr.split(",");\r
+            int maxPageCount= Integer.valueOf(tmplist[1]);\r
+            int currentPage= Integer.valueOf(tmplist[2]);\r
+            int SatlitesCount= Integer.valueOf(tmplist[3]);\r
+            if (maxPageCount>0 && currentPage==1){\r
+                //第一页把数组初始化一遍。\r
+                satindex=0;\r
+                gps_status.satlite_numbss=SatlitesCount;\r
+            }\r
+            int satcount=(tmplist.length-4)/4;\r
+//      ICLogger.i("Nmea :"+nmeastr+" "+satcount);\r
+             for (int i=0;i<satcount;i++){\r
+                satindex++;\r
+                String prn=tmplist[i*4+4];\r
+                String snr=tmplist[i*4+4+3];\r
+                if (snr.contains("*")){\r
+                    snr=snr.substring(0,snr.indexOf("*"));\r
+                }\r
+                if (snr.trim().isEmpty()){\r
+                    snr="0";\r
+                }\r
+                Logger.d("Sat="+satindex+",prn="+prn+",snr="+snr);\r
+\r
+                int intprn= Integer.valueOf(prn);\r
+                float floatsnr= Float.valueOf(snr);\r
+                if (floatsnr>0) {\r
+                    gps_status.numSatelliteList.add(new GpsSatellitePriv(intprn, floatsnr));\r
+                }\r
+            }\r
+\r
+            if (maxPageCount==currentPage) {\r
+                //最后一页,打印搜星情况,并作一些判断。\r
+                StringBuilder sb=new StringBuilder();\r
+                sb.append("搜索"+searchCout+"次,搜索到卫星个数" + SatlitesCount+", [SNR>0] ="+ gps_status.numSatelliteList.size());\r
+\r
+                Logger.d( sb.toString());\r
+\r
+            }\r
+        }else if (nmeastr.startsWith("$GPGGA,")) {\r
+\r
+//    GPGGA编辑\r
+//(定位信息)\r
+//    例:$GPGGA,092204.999,4250.5589,S,14718.5084,E,1,04,24.4,12.2,M,19.7,M,,0000*1F\r
+//    字段0:$GPGGA,语句ID,表明该语句为Global Positioning System Fix Data(GGA)GPS定位信息\r
+//    字段1:UTC 时间,hhmmss.sss,时分秒格式\r
+//    字段2:纬度ddmm.mmmm,度分格式(前导位数不足则补0)\r
+//    字段3:纬度N(北纬)或S(南纬)\r
+//    字段4:经度dddmm.mmmm,度分格式(前导位数不足则补0)\r
+//    字段5:经度E(东经)或W(西经)\r
+//    字段6:GPS状态,0=不可用(FIX NOT valid),1=单点定位(GPS FIX),2=差分定位(DGPS),3=无效PPS,4=实时差分定位(RTK FIX),5=RTK FLOAT,6=正在估算\r
+//    字段7:正在使用的卫星数量(00 - 12)(前导位数不足则补0)\r
+//    字段8:HDOP水平精度因子(0.5 - 99.9)\r
+//    字段9:海拔高度(-9999.9 - 99999.9)\r
+//    字段10:单位:M(米)\r
+//    字段11:地球椭球面相对大地水准面的高度 WGS84水准面划分\r
+//    字段12:WGS84水准面划分单位:M(米)\r
+//    字段13:差分时间(从接收到差分信号开始的秒数,如果不是差分定位将为空)\r
+//    字段14:差分站ID号0000 - 1023(前导位数不足则补0,如果不是差分定位将为空)\r
+//    字段15:校验值($与*之间的数异或后的值)\r
+\r
+            String tmplist[]=nmeastr.split(",");\r
+            String utctime=tmplist[1];\r
+            String Lat=tmplist[2];\r
+            String lon=tmplist[4];\r
+            String fixed=tmplist[6];\r
+            String usedStarts=tmplist[7];\r
+            String hdop=tmplist[8];\r
+\r
+\r
+            if ( (fixed.trim().equals("1"))||(fixed.trim().equals("2"))||(fixed.trim().equals("6"))){\r
+\r
+\r
+                // 转换GPS坐标为度,以便在各种应用中可以方便查找。\r
+                latitude= Double.valueOf(Lat);\r
+                longitude= Double.valueOf(lon);\r
+                // 转换单位,从分转换到度\r
+\r
+                double intdu= (int)(longitude /100f); //小数转换到分为单位\r
+                double du=(longitude - intdu*100)/60f;\r
+                double last= intdu+du;\r
+                longitude =last;\r
+                intdu= (int)(latitude /100f); //小数转换到分为单位\r
+                du=(latitude - intdu*100)/60f;\r
+                last= intdu+du;\r
+                latitude=last;\r
+\r
+                // 经纬度 保留4位小数点\r
+                DecimalFormat df = new DecimalFormat("#.000000");\r
+                String strLatitude = df.format(latitude);\r
+                String strLongitude = df.format(longitude);\r
+\r
+                //定位\r
+                StringBuilder sb=new StringBuilder();\r
+                sb.append("GPGGA, location time= " + getLocalTime2() + ", FixedCount=" + locationFixedCount + ", GPSTime="+utctime+", Lat="+Lat+" ("+strLatitude+"), Lon="+lon+" ("+strLongitude+"), fixed="+fixed+", hdop="+hdop+", usedStarts="+usedStarts);\r
+                Logger.d(sb.toString());\r
+\r
+                gps_status.locating_status=1; //fixed\r
+            }else{\r
+                gps_status.locating_status=0; //notfixed\r
+            }\r
+            gps_status.hdop= Float.valueOf(hdop.trim());\r
+            gps_status.used_gps_numbs= Integer.valueOf(usedStarts.trim());\r
+\r
+\r
+        }else if (nmeastr.startsWith("$GPGSA,")) {\r
+\r
+//    GPGSA编辑\r
+//( 当前卫星信息)\r
+//    例:$GPGSA,A,3,01,20,19,13,,,,,,,,,40.4,24.4,32.2*0A\r
+//    字段0:$GPGSA,语句ID,表明该语句为GPS DOP and Active Satellites(GSA)当前卫星信息\r
+//    字段1:定位模式(选择2D/3D),A=自动选择,M=手动选择\r
+//    字段2:定位类型,1=未定位,2=2D定位,3=3D定位\r
+//    字段3:PRN码(伪随机噪声码),第1信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)\r
+//    字段4:PRN码(伪随机噪声码),第2信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)\r
+//    字段5:PRN码(伪随机噪声码),第3信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)\r
+//    字段6:PRN码(伪随机噪声码),第4信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)\r
+//    字段7:PRN码(伪随机噪声码),第5信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)\r
+//    字段8:PRN码(伪随机噪声码),第6信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)\r
+//    字段9:PRN码(伪随机噪声码),第7信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)\r
+//    字段10:PRN码(伪随机噪声码),第8信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)\r
+//    字段11:PRN码(伪随机噪声码),第9信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)\r
+//    字段12:PRN码(伪随机噪声码),第10信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)\r
+//    字段13:PRN码(伪随机噪声码),第11信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)\r
+//    字段14:PRN码(伪随机噪声码),第12信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)\r
+//    字段15:PDOP综合位置精度因子(0.5 - 99.9)\r
+//    字段16:HDOP水平精度因子(0.5 - 99.9)\r
+//    字段17:VDOP垂直精度因子(0.5 - 99.9)\r
+//    字段18:校验值($与*之间的数异或后的值)\r
+\r
+//      String tmplist[]=nmeastr.split(",");\r
+//      String locationmod=tmplist[1];\r
+//      String fixed=tmplist[2];\r
+//      String hdop=tmplist[16];\r
+//      if (!fixed.trim().equals("1")){\r
+//        //定位\r
+//        ICLogger.i("GPGSA fixed="+fixed+",hdop="+hdop);\r
+//      }\r
+        }\r
+    }\r
+\r
+}\r
diff --git a/app/src/main/java/mobile/miki/LocationSnrAdapter.java b/app/src/main/java/mobile/miki/LocationSnrAdapter.java
new file mode 100644 (file)
index 0000000..1a32224
--- /dev/null
@@ -0,0 +1,58 @@
+package mobile.miki;\r
+\r
+import android.support.annotation.NonNull;\r
+import android.support.v7.widget.RecyclerView;\r
+import android.view.LayoutInflater;\r
+import android.view.View;\r
+import android.view.ViewGroup;\r
+\r
+import java.util.ArrayList;\r
+\r
+public class LocationSnrAdapter extends RecyclerView.Adapter<LocationSnrAdapter.SnrHolder> {\r
+\r
+\r
+    private ArrayList<SnrEntriy> mSnrList = new ArrayList<>();\r
+\r
+    public LocationSnrAdapter(ArrayList<SnrEntriy> mSnrList) {\r
+        this.mSnrList = mSnrList;\r
+    }\r
+\r
+    public void updateLocationValue(ArrayList<SnrEntriy> snrEntriys){\r
+        mSnrList.clear();\r
+        mSnrList.addAll(snrEntriys);\r
+        notifyDataSetChanged();\r
+    }\r
+\r
+    @NonNull\r
+    @Override\r
+    public SnrHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {\r
+        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_snr_layout, parent, false);\r
+        return new SnrHolder(view);\r
+    }\r
+\r
+    @Override\r
+    public void onBindViewHolder(@NonNull SnrHolder holder, int position) {\r
+        holder.updateSnrValue(mSnrList.get(position));\r
+    }\r
+\r
+    @Override\r
+    public int getItemCount() {\r
+        return mSnrList.size();\r
+    }\r
+\r
+    static class SnrHolder extends RecyclerView.ViewHolder {\r
+\r
+        private SnrHistogramView snrView;\r
+\r
+        public SnrHolder(@NonNull View itemView) {\r
+            super(itemView);\r
+            snrView = (SnrHistogramView)itemView.findViewById(R.id.item_snr_view);\r
+        }\r
+\r
+\r
+        public void updateSnrValue(SnrEntriy entriy){\r
+            snrView.updateValue(entriy.getSnrValue(),entriy.getSnrNumber(),entriy.getSnrBg());\r
+        }\r
+\r
+    }\r
+}\r
diff --git a/app/src/main/java/mobile/miki/SnrEntriy.java b/app/src/main/java/mobile/miki/SnrEntriy.java
new file mode 100644 (file)
index 0000000..822aa18
--- /dev/null
@@ -0,0 +1,40 @@
+package mobile.miki;\r
+\r
+public class SnrEntriy {\r
+    private float snrValue;\r
+    private int snrNumber;\r
+    private int snrBg;\r
+\r
+    public SnrEntriy() {\r
+    }\r
+\r
+    public SnrEntriy(float snrValue, int snrNumber, int snrBg) {\r
+        this.snrNumber = snrNumber;\r
+        this.snrValue = snrValue;\r
+        this.snrBg = snrBg;\r
+    }\r
+\r
+    public float getSnrValue() {\r
+        return snrValue;\r
+    }\r
+\r
+    public void setSnrValue(int snrValue) {\r
+        this.snrValue = snrValue;\r
+    }\r
+\r
+    public int getSnrNumber() {\r
+        return snrNumber;\r
+    }\r
+\r
+    public void setSnrNumber(int snrNumber) {\r
+        this.snrNumber = snrNumber;\r
+    }\r
+\r
+    public int getSnrBg() {\r
+        return snrBg;\r
+    }\r
+\r
+    public void setSnrBg(int snrBg) {\r
+        this.snrBg = snrBg;\r
+    }\r
+}\r
diff --git a/app/src/main/java/mobile/miki/SnrHistogramView.java b/app/src/main/java/mobile/miki/SnrHistogramView.java
new file mode 100644 (file)
index 0000000..76fd6e3
--- /dev/null
@@ -0,0 +1,120 @@
+package mobile.miki;\r
+\r
+import android.content.Context;\r
+import android.graphics.Canvas;\r
+import android.graphics.Color;\r
+import android.graphics.Paint;\r
+import android.support.annotation.Nullable;\r
+import android.util.AttributeSet;\r
+import android.util.TypedValue;\r
+import android.view.View;\r
+\r
+\r
+public class SnrHistogramView extends View {\r
+\r
+\r
+    private int mWidth = 0;\r
+    private int mHeight = 0;\r
+\r
+    private Paint mPaint;\r
+    private Paint mTextPaint;\r
+\r
+    private String mSnrValue = "80";\r
+    private String mSnrNmber = "60";\r
+\r
+    private float mBL=1f;\r
+\r
+    public SnrHistogramView(Context context) {\r
+        this(context, null);\r
+    }\r
+\r
+    public SnrHistogramView(Context context, @Nullable AttributeSet attrs) {\r
+        this(context, attrs, 0);\r
+    }\r
+\r
+    public SnrHistogramView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {\r
+        super(context, attrs, defStyleAttr);\r
+        mPaint = new Paint();\r
+        mTextPaint = new Paint();\r
+\r
+        mPaint.setAntiAlias(true);\r
+        mPaint.setDither(true);\r
+        int mBgColor = Color.GREEN;\r
+        mPaint.setColor(mBgColor);\r
+        mPaint.setStyle(Paint.Style.FILL);\r
+\r
+        mTextPaint.setAntiAlias(true);\r
+        mTextPaint.setDither(true);\r
+        mTextPaint.setColor(Color.WHITE);\r
+        mTextPaint.setStyle(Paint.Style.FILL);\r
+        mTextPaint.setTextSize(spToPx(24));\r
+    }\r
+\r
+    @Override\r
+    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {\r
+        super.onMeasure(widthMeasureSpec, heightMeasureSpec);\r
+\r
+\r
+        int widthSize = MeasureSpec.getSize(widthMeasureSpec);\r
+        int widthMode = MeasureSpec.getMode(widthMeasureSpec);\r
+        int heightSize = MeasureSpec.getSize(heightMeasureSpec);\r
+        int heightMode = MeasureSpec.getMode(heightMeasureSpec);\r
+\r
+\r
+        if (widthMode == MeasureSpec.AT_MOST\r
+                || widthMode == MeasureSpec.UNSPECIFIED\r
+                || heightMeasureSpec == MeasureSpec.AT_MOST\r
+                || heightMeasureSpec == MeasureSpec.UNSPECIFIED) {\r
+            //宽度高度至少有一个确定的值,不能同时为wrap_content\r
+            return;\r
+        } else { //至少有一个为确定值,要获取其中的最小值\r
+            if (widthMode == MeasureSpec.EXACTLY) {\r
+                mWidth = widthSize;\r
+            }\r
+\r
+            if (heightMode == MeasureSpec.EXACTLY) {\r
+                mHeight = heightSize;\r
+            }\r
+        }\r
+    }\r
+\r
+\r
+    @Override\r
+    protected void onDraw(Canvas canvas) {\r
+        super.onDraw(canvas);\r
+\r
+        float[] snrNmber = measureTextWidth(mSnrNmber, mTextPaint);\r
+        float[] snrValue = measureTextWidth(mSnrValue, mTextPaint);\r
+\r
+        float hv = getHistogramHeight(snrValue[1], snrNmber[1], mBL);\r
+\r
+        canvas.drawText(mSnrNmber, (mWidth - snrNmber[0]) / 2, mHeight, mTextPaint);\r
+        canvas.drawText(mSnrValue, (mWidth - snrValue[0]) / 2, mHeight - snrNmber[1] - hv, mTextPaint);\r
+\r
+        canvas.drawRect(0, mHeight - (hv + snrNmber[1] - 2), mWidth, mHeight - snrNmber[1], mPaint);\r
+    }\r
+\r
+    private float getHistogramHeight(float vh, float nh, float bl) {\r
+        return (mHeight - vh - nh) * bl;\r
+    }\r
+\r
+    private float[] measureTextWidth(String mText, Paint textPaint) {\r
+        Paint.FontMetrics fontMetrics = textPaint.getFontMetrics();\r
+        float height1 = fontMetrics.bottom - fontMetrics.top;\r
+        float strWidth = textPaint.measureText(mText);\r
+        return new float[]{strWidth, height1};\r
+    }\r
+\r
+    private float spToPx(float sp) {\r
+        return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, sp, getResources().getDisplayMetrics());\r
+    }\r
+\r
+    public void updateValue(float value,int number,int bgColor){\r
+        mPaint.setColor(bgColor);\r
+        mSnrNmber = String.valueOf(number);\r
+        mSnrValue = String.valueOf((int)value);\r
+        mBL=value*0.025F;\r
+\r
+        invalidate();\r
+    }\r
+}\r
index 6248cea..10294c6 100644 (file)
@@ -21,6 +21,7 @@ import java.util.Timer;
 import java.util.TimerTask;
 
 import mobile.miki.BaseActivity;
+import mobile.miki.GPSActivity;
 import mobile.miki.MyApplication;
 import mobile.miki.R;
 import mobile.miki.VersionActivity;
@@ -43,7 +44,7 @@ public class TestMainList extends BaseActivity implements OnClickListener {
        private LinearLayout shutdown_system;
        private LinearLayout dial;
        private LinearLayout flagPosition;
-
+    private LinearLayout gpsFulltest;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
                // TODO Auto-generated method stub
@@ -61,6 +62,9 @@ public class TestMainList extends BaseActivity implements OnClickListener {
                shutdown_system = (LinearLayout)findViewById(R.id.shutdown_system);
                dial = (LinearLayout)findViewById(R.id.dail);
                download_mode.setVisibility(View.GONE);
+
+        gpsFulltest = (LinearLayout) findViewById(R.id.gps_full_test);
+
                flagPosition = (LinearLayout)findViewById(R.id.flagposiontion);
                if (!FTUtils.isSugar()) {
                        flagPosition.setVisibility(View.GONE);
@@ -82,7 +86,7 @@ public class TestMainList extends BaseActivity implements OnClickListener {
                dial.setOnClickListener(this);
                flagPosition.setOnClickListener(this);
                shutdown_system.setOnClickListener(this);
-
+        gpsFulltest.setOnClickListener(this);
 //             Log.d(TAG, "onCreate");
                Settings.System.putInt(getContentResolver(), "mobile.miki.FactoryModeRunning", 1);
        }
@@ -180,7 +184,10 @@ public class TestMainList extends BaseActivity implements OnClickListener {
                        intent = new Intent(TestMainList.this, FlagPositionActivity.class);
                        startActivity(intent);
                        break;
-
+        case R.id.gps_full_test:
+            intent = new Intent(TestMainList.this, GPSActivity.class);
+            startActivity(intent);
+            break;
                default:
                        break;
                }
index a753d68..74c1739 100644 (file)
@@ -7,13 +7,13 @@
 \r
     <LinearLayout\r
         android:layout_width="match_parent"\r
-        android:layout_height="match_parent"\r
+        android:layout_height="wrap_content"\r
         android:layout_centerInParent="true"\r
         android:orientation="vertical">\r
 \r
         <TextView\r
             android:id="@+id/shutdownText"\r
-            android:layout_width="match_parent"\r
+            android:layout_width="wrap_content"\r
             android:layout_height="match_parent"\r
             android:layout_gravity="center|center_horizontal|center_vertical"\r
             android:text="@string/poweroff"\r
index 2cf5b72..ab98eb3 100644 (file)
                 android:textSize="22sp" />\r
         </LinearLayout>\r
 \r
+        <View\r
+            android:id="@+id/view2"\r
+            android:layout_width="match_parent"\r
+            android:layout_height="1dp"\r
+            android:background="#c0c0c0" />\r
+\r
+        <LinearLayout\r
+            android:id="@+id/gps_full_test"\r
+            android:layout_width="match_parent"\r
+            android:layout_height="match_parent"\r
+            android:layout_weight="1"\r
+            android:background="@drawable/listpress"\r
+            android:gravity="center_vertical"\r
+            android:orientation="vertical">\r
+\r
+            <TextView\r
+                style="@style/title_text_large_style"\r
+                android:layout_width="match_parent"\r
+                android:layout_height="match_parent"\r
+                android:gravity="center"\r
+                android:text="@string/gps"\r
+                android:textSize="22sp" />\r
+\r
+            <TextView\r
+                style="@style/content_text_medium_style"\r
+                android:layout_width="match_parent"\r
+                android:layout_height="match_parent"\r
+                android:layout_marginTop="2dp"\r
+                android:gravity="center_vertical"\r
+                android:text="@string/Engineer_mode_title"\r
+                android:visibility="gone" />\r
+\r
+        </LinearLayout>\r
+\r
         <View\r
             android:layout_width="match_parent"\r
             android:layout_height="1dp"\r
         </LinearLayout>\r
 \r
         <View\r
-            android:id="@+id/view2"\r
+            android:id="@+id/view5"\r
             android:layout_width="match_parent"\r
             android:layout_height="1dp"\r
             android:background="#c0c0c0" />\r
             android:gravity="center_vertical"\r
             android:orientation="vertical">\r
 \r
+            <TextView\r
+                android:id="@+id/textView15"\r
+                style="@style/content_text_medium_style"\r
+                android:layout_width="match_parent"\r
+                android:layout_height="match_parent"\r
+                android:layout_marginTop="2dp"\r
+                android:layout_weight="1"\r
+                android:gravity="center_vertical"\r
+                android:text="@string/Engineer_mode_title"\r
+                android:visibility="gone" />\r
+\r
             <TextView\r
                 style="@style/title_text_large_style"\r
                 android:layout_width="match_parent"\r
diff --git a/app/src/main/res/layout/gps_full_test_activity.xml b/app/src/main/res/layout/gps_full_test_activity.xml
new file mode 100644 (file)
index 0000000..18aed43
--- /dev/null
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"\r
+    xmlns:app="http://schemas.android.com/apk/res-auto"\r
+    xmlns:tools="http://schemas.android.com/tools"\r
+    android:layout_width="match_parent"\r
+    android:layout_height="match_parent"\r
+    tools:context=".GPSActivity"\r
+    android:background="@color/colorIcBg">\r
+\r
+    <TextView\r
+        android:id="@+id/ic_lc_fix_name"\r
+        style="@style/IcTextStyle"\r
+        android:text="GPS状态:"\r
+        android:textSize="20sp" />\r
+\r
+    <TextView\r
+        android:id="@+id/ic_lc_fix_value"\r
+        style="@style/IcTextStyle"\r
+        android:layout_marginStart="10dp"\r
+        android:layout_toEndOf="@id/ic_lc_fix_name"\r
+        android:textSize="20sp" />\r
+\r
+    <TextView\r
+        android:id="@+id/ic_lc_star_name"\r
+        style="@style/IcTextStyle"\r
+        android:layout_below="@id/ic_lc_fix_name"\r
+        android:text="星数:"\r
+        android:textSize="20sp" />\r
+\r
+    <TextView\r
+        android:id="@+id/ic_lc_star_value"\r
+        style="@style/IcTextStyle"\r
+        android:layout_below="@id/ic_lc_fix_name"\r
+        android:layout_marginStart="10dp"\r
+        android:layout_toEndOf="@id/ic_lc_star_name"\r
+        android:textSize="20sp" />\r
+\r
+    <TextView\r
+        android:id="@+id/ic_lc_hoop_name"\r
+        style="@style/IcTextStyle"\r
+        android:layout_below="@id/ic_lc_star_name"\r
+        android:text="精度:"\r
+        android:textSize="20sp" />\r
+\r
+    <TextView\r
+        android:id="@+id/ic_lc_hoop_value"\r
+        style="@style/IcTextStyle"\r
+        android:layout_below="@id/ic_lc_star_name"\r
+        android:layout_marginStart="10dp"\r
+        android:layout_toEndOf="@id/ic_lc_hoop_name"\r
+        android:textSize="20sp" />\r
+\r
+\r
+\r
+    <TextView\r
+        android:id="@+id/ic_lc_searchCount"\r
+        style="@style/IcTextStyle"\r
+        android:layout_width="wrap_content"\r
+        android:layout_height="wrap_content"\r
+        android:layout_below="@id/ic_lc_hoop_name"\r
+        android:text="扫描时间:"\r
+        android:textSize="20sp" />\r
+\r
+    <TextView\r
+        android:id="@+id/ic_lc_searchCount_value"\r
+        style="@style/IcTextStyle"\r
+        android:layout_width="wrap_content"\r
+        android:layout_height="wrap_content"\r
+        android:layout_below="@id/ic_lc_hoop_name"\r
+        android:layout_marginStart="10dp"\r
+        android:layout_toEndOf="@id/ic_lc_searchCount"\r
+        android:textSize="20sp" />\r
+    <android.support.v7.widget.RecyclerView\r
+        android:id="@+id/app_list"\r
+        android:layout_below="@id/ic_lc_searchCount"\r
+        android:layout_width="match_parent"\r
+        android:layout_height="match_parent"/>\r
+</RelativeLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_snr_layout.xml b/app/src/main/res/layout/item_snr_layout.xml
new file mode 100644 (file)
index 0000000..0194fa0
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<mobile.miki.SnrHistogramView xmlns:android="http://schemas.android.com/apk/res/android"\r
+    android:id="@+id/item_snr_view"\r
+    android:layout_width="24sp"\r
+    android:layout_height="match_parent"/>
\ No newline at end of file
index 9b1f29c..56902d0 100644 (file)
@@ -13,8 +13,8 @@
 \r
         <ImageView\r
             android:id="@+id/imageView1"\r
-            android:layout_width="wrap_content"\r
-            android:layout_height="wrap_content"\r
+            android:layout_width="108dp"\r
+            android:layout_height="110dp"\r
             android:contentDescription="@string/shakeTest"\r
             android:src="@drawable/ic_motor" />\r
 \r
index 2b8f7ef..4a7f3b7 100644 (file)
     <color name="black">#000000</color> <!-- 黑色 -->\r
     <color name="sub_menu_title_color">#B2B2B2</color> <!-- 黑色 -->\r
 \r
+    <color name="colorIcBg">#000000</color>\r
+    <color name="colorIcTextView">#FFFFFF</color>\r
+\r
 </resources>
\ No newline at end of file
index 85aa27f..b2052f6 100644 (file)
             backward-compatibility can go here.\r
         -->\r
     </style>\r
-    \r
+\r
+\r
+    <style name="IcTextStyle">\r
+        <item name="android:layout_width">wrap_content</item>\r
+        <item name="android:layout_height">wrap_content</item>\r
+        <item name="android:textColor">@color/colorIcTextView</item>\r
+        <item name="android:textSize">32sp</item>\r
+    </style>\r
 </resources>\r