Android Open Source - satstat Gps Status View






From Project

Back to project page satstat.

License

The source code is released under:

GNU General Public License

If you think the Android project satstat listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

/*
 * Copyright  2013 Michael von Glasow.//from  w w w  . ja  v  a2 s .c  o  m
 * 
 * This file is part of LSRN Tools.
 *
 * LSRN Tools is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * LSRN Tools is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with LSRN Tools.  If not, see <http://www.gnu.org/licenses/>.
 */

package com.vonglasow.michael.satstat.widgets;

import java.util.ArrayList;
import java.util.Arrays;

import com.vonglasow.michael.satstat.R;

import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.RectF;
import android.location.GpsSatellite;
import android.util.AttributeSet;
import android.util.Log;

public class GpsStatusView extends SquareView {
  private float mYaw = 0;
  private float mRotation = 0;
  private int mW = 0;
  private int mH = 0;
  private Iterable<GpsSatellite> mSats;
  
  private Paint activePaint;
  private Paint inactivePaint;
  private Paint northPaint;
  private Paint gridPaint;
  private Paint gridBorderPaint;
  private Paint labelPaint;
  private Path northArrow = new Path();
  private Path labelPathN = new Path();
  private Path labelPathE = new Path();
  private Path labelPathS = new Path();
  private Path labelPathW = new Path();

  
  //FIXME: these two should be DPI-dependent, this is OK for MDPI
  private int gridStrokeWidth = 2;
  private float snrScale = 0.2f;
  
  // Compensation for display rotation. Use Surface.ROTATION_* as index (0, 90, 180, 270 deg).
  @SuppressWarnings("boxing")
  private final static Integer zeroYaw[] = {0, 90, 180, 270};
  
  public GpsStatusView(Context context) {
    super(context);
    doInit();
  }

  public GpsStatusView(Context context, AttributeSet attrs) {
    super(context, attrs);
    doInit();
  }
  
  public GpsStatusView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    doInit();
  }
  
  private void doInit() {
    activePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
    activePaint.setColor(Color.parseColor("#FF33B5E5"));
    activePaint.setStyle(Paint.Style.FILL);
    
    inactivePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
    inactivePaint.setColor(Color.parseColor("#FFFF4444"));
    inactivePaint.setStyle(Paint.Style.FILL);
    
    gridPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
    gridPaint.setColor(Color.parseColor("#FFFF8800"));
    gridPaint.setStyle(Paint.Style.STROKE);
    gridPaint.setStrokeWidth(gridStrokeWidth);
    
    gridBorderPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
    gridBorderPaint.setColor(Color.parseColor("#50FF8800"));
    gridBorderPaint.setStyle(Paint.Style.STROKE);
    
    northPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
    northPaint.setColor(Color.parseColor("#FFCC0000"));
    northPaint.setStyle(Paint.Style.FILL);
    
    labelPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
    labelPaint.setColor(Color.parseColor("#FFFF8800"));
    labelPaint.setStyle(Paint.Style.FILL);
    labelPaint.setTextAlign(Paint.Align.CENTER);
  }
  
  /*
   * Draws a satellite in the sky grid.
   */
  private void drawSat(Canvas canvas, int prn, float azimuth, float elevation, float snr, boolean used) {

    float r = (90 - elevation) * mW * 0.9f / 200;
    float x = (float) (r * Math.sin(azimuth * Math.PI / 180));
    float y = (float) -(r * Math.cos(azimuth * Math.PI / 180));
    
    canvas.drawCircle(x, y, snr * snrScale, used?activePaint:inactivePaint);
  }
  
  @Override
  protected void onDraw(Canvas canvas) {
    int cx = mW / 2;
    int cy = mH / 2;

    //Log.d("GpsStatusView", String.format("Drawing on a %dx%d canvas", w, h));

    canvas.translate(cx, cy);
    canvas.rotate(-mRotation);
    
    canvas.drawCircle(0, 0, mW * 0.37125f, gridBorderPaint);
    
    canvas.drawLine(-mW * 0.405f, 0, mW * 0.405f, 0, gridPaint);
    canvas.drawLine(0, -mH * 0.405f, 0, mH * 0.405f, gridPaint);
    
    canvas.drawCircle(0,  0,  mW * 0.405f, gridPaint);
    canvas.drawCircle(0,  0,  mW * 0.27f, gridPaint);
    canvas.drawCircle(0,  0,  mW * 0.135f, gridPaint);
    
    canvas.drawPath(northArrow, northPaint);
    
    canvas.drawTextOnPath(((Activity) getContext()).getString(R.string.value_N),
        labelPathN, 0, -labelPaint.descent(), labelPaint);

    canvas.drawTextOnPath(((Activity) getContext()).getString(R.string.value_S),
        labelPathS, 0, -labelPaint.descent(), labelPaint);

    canvas.drawTextOnPath(((Activity) getContext()).getString(R.string.value_E),
        labelPathE, 0, -labelPaint.descent(), labelPaint);

    canvas.drawTextOnPath(((Activity) getContext()).getString(R.string.value_W),
        labelPathW, 0, -labelPaint.descent(), labelPaint);
    
    if (mSats != null) {
      for (GpsSatellite sat : mSats) {
        float azDelta = Math.abs((sat.getAzimuth() + 180) % 360 -180);
        float eleDelta = Math.abs((sat.getAzimuth() + 90) % 180 - 90);
        if ((azDelta < 5) && (eleDelta < 5)) {
          Log.d("GpsStatusView", String.format("Satellite %d, snr=%f, azimuth=%f, elevation=%f, almanac=%b, ephemeris=%b, used=%b", sat.getPrn(), sat.getSnr(), sat.getAzimuth(), sat.getElevation(), sat.hasAlmanac(), sat.hasEphemeris(), sat.usedInFix()));
        }
        drawSat(canvas, sat.getPrn(), sat.getAzimuth(), sat.getElevation(), sat.getSnr(), sat.usedInFix());
      }
    }
  }
  
  @Override
  protected void onSizeChanged (int w, int h, int oldw, int oldh) {
    mW = w;
    mH = h;
    refreshGeometries();
  }
  
  public void refreshGeometries() {
    gridBorderPaint.setStrokeWidth(mW * 0.0625f);
    
    northArrow.reset();
    northArrow.moveTo(-8, - mH * 0.27f);
    northArrow.lineTo(8, - mH * 0.27f);
    northArrow.lineTo(0, - mH * 0.405f - gridStrokeWidth * 2);
    northArrow.close();

    labelPaint.setTextSize(mH * 0.045f);
    
    float offsetX = mW * 0.0275f * (float) Math.cos(Math.toRadians(mRotation + 90));
    float offsetY = mW * 0.0275f * (float) Math.sin(Math.toRadians(mRotation + 90));
    float relX = mW * (float) Math.cos(Math.toRadians(mRotation));
    float relY = mH * (float) Math.sin(Math.toRadians(mRotation));
    
    labelPathN.reset();
    labelPathN.moveTo(offsetX - relX, - mH * 0.4275f + offsetY - relY);
    labelPathN.rLineTo(2 * relX, 2 * relY);
    
    labelPathE.reset();
    labelPathE.moveTo(mW * 0.4275f + offsetX - relX, offsetY - relY);
    labelPathE.rLineTo(2 * relX, 2 * relY);
    
    labelPathS.reset();
    labelPathS.moveTo(offsetX - relX, mH * 0.4275f + offsetY - relY);
    labelPathS.rLineTo(2 * relX, 2 * relY);
    
    labelPathW.reset();
    labelPathW.moveTo(- mW * 0.4275f + offsetX - relX, offsetY - relY);
    labelPathW.rLineTo(2 * relX, 2 * relY);
  }
  
  public void setYaw(float yaw) {
    mYaw = yaw;
    mRotation = mYaw + zeroYaw[((Activity) getContext()).getWindowManager().getDefaultDisplay().getRotation()];
    refreshGeometries();
    invalidate();
  }
  
  public void showSats(Iterable<GpsSatellite> sats) {
    mSats = sats;
    invalidate();
  }
}




Java Source Code List

com.vonglasow.michael.satstat.AboutActivity.java
com.vonglasow.michael.satstat.GpsEventReceiver.java
com.vonglasow.michael.satstat.MainActivity.java
com.vonglasow.michael.satstat.PasvLocListenerService.java
com.vonglasow.michael.satstat.SettingsActivity.java
com.vonglasow.michael.satstat.WifiCapabilities.java
com.vonglasow.michael.satstat.data.CellTowerCdma.java
com.vonglasow.michael.satstat.data.CellTowerGsm.java
com.vonglasow.michael.satstat.data.CellTowerListCdma.java
com.vonglasow.michael.satstat.data.CellTowerListGsm.java
com.vonglasow.michael.satstat.data.CellTowerListLte.java
com.vonglasow.michael.satstat.data.CellTowerList.java
com.vonglasow.michael.satstat.data.CellTowerLte.java
com.vonglasow.michael.satstat.data.CellTower.java
com.vonglasow.michael.satstat.mapsforge.FileLRUCache.java
com.vonglasow.michael.satstat.mapsforge.ImageFileNameFilter.java
com.vonglasow.michael.satstat.mapsforge.PersistentTileCache.java
com.vonglasow.michael.satstat.widgets.GpsSnrView.java
com.vonglasow.michael.satstat.widgets.GpsStatusView.java
com.vonglasow.michael.satstat.widgets.LocProviderPreference.java
com.vonglasow.michael.satstat.widgets.MapViewPager.java
com.vonglasow.michael.satstat.widgets.NetworkTypePreference.java
com.vonglasow.michael.satstat.widgets.SquareView.java