/*
* This file is part of WhereYouGo.
*
* WhereYouGo 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.
*
* WhereYouGo 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 WhereYouGo. If not, see <http://www.gnu.org/licenses/>.
*
* Copyright (C) 2012 Menion <whereyougo@asamm.cz>
*/
package menion.android.whereyougo.gui.location;
import menion.android.whereyougo.R;
import menion.android.whereyougo.hardware.location.SatellitePosition;
import menion.android.whereyougo.settings.Loc;
import menion.android.whereyougo.utils.Const;
import menion.android.whereyougo.utils.Images;
import menion.android.whereyougo.utils.Logger;
import menion.android.whereyougo.utils.Utils;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Align;
import android.graphics.Paint.Style;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.View;
/**
* @author menion
* @since 26.3.2010 2010
*/
public class Satellite2DView extends View {
private static final String TAG = "Satellite2DView";
private static final float SAT_TEXT_SIZE = Utils.getDpPixels(10.0f);
private boolean drawLock;
private float r1;
private float spSize;
private Drawable bitCompassBg;
private Bitmap bitSnr;
private float satsPanelHeigh;
private float space;
private float lineWidth;
private float snrWidth;
private float spX;
private float spY;
private Bitmap[] satImages;
private Paint mPaintBitmap;
private Paint mPaintText;
private Paint mPaintSignalLine;
public Satellite2DView(Context context) {
super(context);
setBasics();
}
public Satellite2DView(Context context, AttributeSet att) {
super(context, att);
setBasics();
}
private void setBasics() {
this.drawLock = false;
space = Utils.getDpPixels(6.0f);
// background image
bitCompassBg = Images.getImageD(R.drawable.var_skyplot);
// load other images
int imgSize = (int) Utils.getDpPixels(20);
satImages = new Bitmap[3];
satImages[0] = Images.getImageB(R.drawable.ic_sat_01, imgSize);
satImages[1] = Images.getImageB(R.drawable.ic_sat_02, imgSize);
satImages[2] = Images.getImageB(R.drawable.ic_sat_03, imgSize);
mPaintBitmap = new Paint();
mPaintBitmap.setAntiAlias(true);
mPaintBitmap.setFilterBitmap(true);
mPaintText = new Paint();
mPaintText.setAntiAlias(true);
mPaintText.setTextAlign(Align.CENTER);
mPaintText.setTextSize(SAT_TEXT_SIZE);
mPaintText.setShadowLayer(SAT_TEXT_SIZE / 4.0f, 0, 0, Color.WHITE);
mPaintSignalLine = new Paint();
mPaintSignalLine.setAntiAlias(true);
mPaintSignalLine.setStyle(Style.STROKE);
mPaintSignalLine.setStrokeWidth(2.0f);
mPaintSignalLine.setColor(Color.GRAY);
}
private int lastWidth;
private void setConstants(Canvas c) {
if (lastWidth == c.getWidth())
return;
lastWidth = c.getWidth();
// set basic constants
int w = c.getClipBounds().width();
int h = c.getClipBounds().height();
// define bottom satellite images
lineWidth = (w - 2 * space) / 20;
snrWidth = lineWidth - 2.0f;
// now get SNR image
bitSnr = Images.getImageB(R.drawable.var_skyplot_bar, (int) snrWidth);
// define bottom panel height
satsPanelHeigh = bitSnr.getHeight() + space + mPaintText.getTextSize();
float skyplotHeight = h - satsPanelHeigh - space;
spSize = Math.min(w, skyplotHeight);
r1 = spSize / 2.0f * 0.95f;
// define skyplot center
spX = c.getClipBounds().width() / 2;
spY = spSize / 2.0f;
//Logger.d(TAG, "W:" + Const.SCREEN_WIDTH + ", " + Const.SCREEN_HEIGHT + ", " + c.getClipBounds() + ", lineWidth:" + lineWidth + ", " + satsPanelHeigh + ", " + spX + ", " + spY);
}
protected void onDraw (Canvas c) {
if (drawLock)
return;
try {
drawLock = true;
setConstants(c);
float x, y, angle, dist;
int satCount = SatelliteScreen.satellites.size();
// draw background
bitCompassBg.setBounds(
(int) (spX - r1),
(int) (spY - r1),
(int) (spX + r1),
(int) (spY + r1));
bitCompassBg.draw(c);
// draw not satellites text
mPaintText.setColor(Color.BLACK);
if (satCount == 0) {
mPaintText.setTextSize(Utils.getDpPixels(20.0f));
c.drawText(Loc.get(R.string.no_satellites), spX, spY + mPaintText.descent(), mPaintText);
drawLock = false;
return;
}
mPaintText.setTextSize(SAT_TEXT_SIZE);
int snrHeight = bitSnr.getHeight();
// draw satellite line
c.drawLine(0, spSize + snrHeight, c.getClipBounds().width(), spSize + snrHeight, mPaintSignalLine);
double ln100 = Math.log(100.0);
for (int i = 0; i < satCount; i++) {
SatellitePosition sat = SatelliteScreen.satellites.get(i);
float xCenter;
if (satCount % 2 == 0) {
xCenter = spX + (i - satCount / 2) * lineWidth + lineWidth / 2;
} else {
xCenter = spX + (i - (satCount - 1) / 2) * lineWidth;
}
//Logger.d(TAG, "drawSatellite(), sat:" + sat.getPrn() + ", " + sat.getSnr() + ", " + sat.getAzimuth() + ", " + sat.getElevation());
// draw satellite number
if (sat.isFixed()) {
mPaintText.setColor(Color.GREEN);
} else {
mPaintText.setColor(Color.LTGRAY);
}
c.drawText((sat.getPrn() < 10 ? "0" : "") + sat.getPrn(),
xCenter, spSize + satsPanelHeigh, mPaintText);
int height = (int) (Math.log(sat.getSnr() > 0 ? sat.getSnr() : 1) / ln100 * snrHeight);
if (height <= 0)
height = 1;
Bitmap snrToDraw = Bitmap.createBitmap(bitSnr, 0, snrHeight - height, bitSnr.getWidth(), height);
c.drawBitmap(snrToDraw, xCenter - snrWidth / 2, spSize + snrHeight - height, mPaintBitmap);
// draw satellite image
angle = sat.getAzimuth();
dist = (float) (r1 - Math.sin(sat.getElevation() / Const.RHO) * r1);
dist *= 0.90f;
x = (float) (spX + dist * Math.sin(angle / Const.RHO));
y = (float) (spY - dist * Math.cos(angle / Const.RHO));
// draw satellite number
mPaintText.setColor(Color.BLACK);
Bitmap imgSat = getSatImage(sat.getSnr());
c.drawText("" + sat.getPrn(), x, y - imgSat.getHeight() / 2 - 5, mPaintText);
c.drawBitmap(imgSat, x - imgSat.getWidth() / 2, y - imgSat.getHeight() / 2, mPaintBitmap);
}
} catch (Exception e) {
Logger.e(TAG, "onDraw()", e);
}
drawLock = false;
}
private Bitmap getSatImage(float snr) {
if (snr < 25.0f) {
return satImages[0];
} else if (snr >= 20.0f && snr < 40.0f) {
return satImages[1];
} else {
return satImages[2];
}
}
}