package iWish_Activity;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Arrays;
import com.androidplot.xy.LineAndPointFormatter;
import com.androidplot.xy.SimpleXYSeries;
import com.androidplot.xy.XYPlot;
import com.androidplot.xy.XYSeries;
import com.androidplot.xy.XYStepMode;
import com.progect.iwish.R;
import iWish_Bluetooth.BluetoothLeService;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.graphics.Shader;
import android.os.Bundle;
import android.view.View;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.BitmapShader;
import android.graphics.LinearGradient;
import android.graphics.Color;
import android.graphics.DashPathEffect;
import android.graphics.Matrix;
import android.graphics.RectF;
import com.androidplot.xy.BoundaryMode;
public class GraphicActivity extends Activity{
private ArrayList<Double> lista = new ArrayList<Double>();
private double X;
private double Y;
private boolean mConnected = false;
private XYPlot plot;
private Shader WHITE_SHADER = new LinearGradient(1, 1, 1, 1, Color.WHITE, Color.WHITE, Shader.TileMode.REPEAT);
private boolean styleOn;
//private String totBeats;
private ArrayList<String> totBeats2;
private boolean finitoBeatPassati;
private int cominciaDa;
private int y;
private boolean mStarting;
// Handles various events fired by the Service.
// ACTION_GATT_CONNECTED: connected to a GATT server.
// ACTION_GATT_DISCONNECTED: disconnected from a GATT server.
// ACTION_GATT_SERVICES_DISCOVERED: discovered GATT services.
// ACTION_DATA_AVAILABLE: received data from the device. This can be a result of read
// or notification operations.
private final BroadcastReceiver mGattUpdateReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
if (BluetoothLeService.ACTION_GATT_CONNECTED.equals(action)) {
mConnected = true;
//posso sostituirlo con qualche avviso di connessione al BLE
//updateConnectionState(R.string.connected);
}
else if (BluetoothLeService.ACTION_GATT_DISCONNECTED.equals(action)) {
mConnected = false;
//posso sostituirlo con qualche avviso di disconnessione al BLE
//updateConnectionState(R.string.disconnected);
//aggiornava l'attuale testo dei battiti che sono ora in heartRate
//mDataField.setText(R.string.no_data);
//heartRate.setText("--");
//qualcosa da fare se si disconnette
}
else if (BluetoothLeService.ACTION_GATT_SERVICES_DISCOVERED.equals(action)) {
// Show all the supported services and characteristics on the user interface.
//non pi� utilizzato non metto a video tutti i servizi
}
else if (BluetoothLeService.ACTION_DATA_AVAILABLE.equals(action)) {
//qui viene inviato alla TextView il dato aggiornato dei battiti cardiaci che ora si chiama heartRate
if(mStarting){
displayDataGraphic(intent.getStringExtra(BluetoothLeService.EXTRA_DATA));
}
}
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.graphic);
//mHandler = new Handler();
//mStarting = false;
final Intent intent = getIntent();
//totBeats = intent.getStringExtra("beats");
totBeats2 = (ArrayList<String>) intent.getSerializableExtra("beats");
mStarting = intent.getBooleanExtra("run", true);
finitoBeatPassati = false;
cominciaDa = (int) intent.getIntExtra("tempo", 0);
y = 0;//(int) intent.getIntExtra("tempo", 0);
if(totBeats2!=null){
getArrayListBeats(totBeats2);
}
//mDeviceAddress = intent.getStringExtra(EXTRAS_DEVICE_ADDRESS);
//mActivities = (Activities) intent.getSerializableExtra("a");
// Start heartRate.
plot = (XYPlot) findViewById(R.id.graphic);
styleOn = true;
//distanza tra righe verticali
//plot.setDomainStep(XYStepMode.INCREMENT_BY_VAL, 10);
//distanza tra righe orizzontali
plot.setRangeStep(XYStepMode.INCREMENT_BY_VAL, 20);
//colore sfondo grafico
plot.getGraphWidget().getGridBackgroundPaint().setShader(WHITE_SHADER);
//colore line verticali
plot.getGraphWidget().getDomainGridLinePaint().setColor(Color.rgb(255, 255, 255));
//colore linee orizzontali
plot.getGraphWidget().getRangeGridLinePaint().setColor(Color.rgb(0, 0, 0));
plot.getGraphWidget().getRangeGridLinePaint().setPathEffect(new DashPathEffect(new float[]{3, 3}, 1));
//valori numerici della y
plot.setRangeBoundaries(30, 210, BoundaryMode.FIXED);
//valori numerici della x
if(cominciaDa<60){
plot.setDomainBoundaries(0, 60, BoundaryMode.FIXED);
}
else{
plot.setDomainBoundaries(cominciaDa-60, cominciaDa, BoundaryMode.FIXED);
}
// scala dei numeri del grafico in decimale
plot.setRangeValueFormat(new DecimalFormat("0"));
plot.setDomainValueFormat(new DecimalFormat("0"));
//linee verticali
plot.setDomainStep(XYStepMode.SUBDIVIDE, 7);
//plot.setDomainStep(XYStepMode.INCREMENT_BY_VAL, 30);
// plot.setRangeStep(XYStepMode.INCREMENT_BY_VAL, 60);
// qui c'era il for di riempimento lista
//passo la lista
XYSeries series = new SimpleXYSeries(lista, SimpleXYSeries.ArrayFormat.XY_VALS_INTERLEAVED,"Segnale");
//colore linea grafico impostazioni
LineAndPointFormatter seriesFormat = new LineAndPointFormatter(Color.rgb(0, 0, 0),0x000000, 0x000000, null);
plot.clear();
plot.addSeries(series, seriesFormat);
}
@Override
protected void onResume() {
super.onResume();
registerReceiver(mGattUpdateReceiver, makeGattUpdateIntentFilter());
}
@Override
protected void onPause() {
super.onPause();
unregisterReceiver(mGattUpdateReceiver);
}
@Override
protected void onDestroy() {
super.onDestroy();
}
private static IntentFilter makeGattUpdateIntentFilter() {
final IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(BluetoothLeService.ACTION_GATT_CONNECTED);
intentFilter.addAction(BluetoothLeService.ACTION_GATT_DISCONNECTED);
intentFilter.addAction(BluetoothLeService.ACTION_GATT_SERVICES_DISCOVERED);
intentFilter.addAction(BluetoothLeService.ACTION_DATA_AVAILABLE);
return intentFilter;
}
private void displayDataGraphic(String dataGraphic){
//qui devo aggiornare il grafico
if(finitoBeatPassati){
try{
if(cominciaDa>60){
y++;
X = X + 1;
lista.remove(0);
lista.add(X);
Y = (double) Integer.parseInt(dataGraphic);
lista.remove(0);
lista.add(Y);
plot.setDomainBoundaries(0+y, 60+y, BoundaryMode.FIXED);
}
else{
X = X + 1;
lista.add(X);
Y = (double) Integer.parseInt(dataGraphic);
lista.add(Y);
}
//passo la lista
XYSeries series = new SimpleXYSeries(lista, SimpleXYSeries.ArrayFormat.XY_VALS_INTERLEAVED,"segnale");
//colore linea grafico impostazioni
LineAndPointFormatter seriesFormat = new LineAndPointFormatter(Color.rgb(0, 0, 0),0x000000, 0x000000, null);
plot.clear();
plot.addSeries(series, seriesFormat);
plot.redraw();
cominciaDa++;
}
catch (Exception e){
e.printStackTrace();
}
}
}
private void getArrayListBeats(ArrayList<String> totBeat){
String[] beatStr = totBeat.toArray(new String[totBeat.size()]);
try{
for(int i=0; i<beatStr.length; i++){
//cominciaDa++;
if(i==0 && cominciaDa>60){
//i = beatStr.length - 60 -1;
X = cominciaDa - 60 -2; //- 50 -2;
y = cominciaDa - 60 -1;// beatStr.length - 60 -1;
}
if(i==0 && cominciaDa<60){
X = 0;
}
else{
X = X + 1;
}
lista.add(X);
Y = (double) Integer.parseInt(beatStr[i]);
lista.add(Y);
}
}
catch (Exception e){
e.printStackTrace();
}
finitoBeatPassati = true;
}
public void onGraphStyleToggle(View v) {
RectF rect = plot.getGraphWidget().getGridRect();
BitmapShader myShader = new BitmapShader(
Bitmap.createScaledBitmap(
BitmapFactory.decodeResource(
getResources(),
R.drawable.graph_background),
1,
(int) rect.height(),
false),
Shader.TileMode.REPEAT,
Shader.TileMode.REPEAT);
Matrix m = new Matrix();
m.setTranslate(rect.left, rect.top);
myShader.setLocalMatrix(m);
if (styleOn){
plot.getGraphWidget().getGridBackgroundPaint().setShader(
myShader);
styleOn = false;
}
else{
plot.getGraphWidget().getGridBackgroundPaint().setShader(WHITE_SHADER);
styleOn = true;
}
plot.redraw();
}
}