martedì 7 gennaio 2014

Problemi con QGis in Debian

Al momento di usare QGis su Debian mi e' comparso il seguente messaggio


La cosa curiosa e' che avevo di recente usato QGis senza errori di sorta. Ho verificato che il malfunzionamento deriva dall'aggiornamento di alcune librerie di appoggio di QGis e del mancato aggiornamento di QGis stesso (il repository ufficiale non e' sincronizzato)
La soluzione e' quella di impiegare come repository direttamente qgis.org

per prima cosa si rimuove la versione di default di QGis

apt-get remove qgis python-qgis qgis-plugin-grass

si aggiunge al file /etc/apt/sources.list il repository di QGis
deb http://qgis.org/debian jessie main

si aggiungono le chiavi
gpg --recv-key 47765B75 gpg --export --armor 47765B75 | sudo apt-key add -
e si reinstalla QGis dalla nuova sorgente
sudo apt-get update sudo apt-get install qgis python-qgis qgis-plugin-grass
come risultato sono passato da una versione 1.7 non funzionante (o meglio con i plugin Python non funzionanti) ad una fiammante versione 2.0

Fauna caldinese - Caprioli

Affacciarsi alla finestra e vedere tre caprioli placidamente seduti nel prato a cento metri dal paese e' gradevole. Sapere che proprio li' sotto c'e' il bar dei cacciatori non ha prezzo


Da notare che seduti, con la livrea invernale e visti di coda,i caprioli  sono praticamente invisibili (se non evidenziati dai quadratini rossi)

lunedì 6 gennaio 2014

RS232-TTL su Arduino con Max3232

Arduino ha una o piu' di una porta seriali (Arduino Uno ne ha una nei pin 0-RX ed 1-TX)
Non e' pero' possibile collegarla direttamente alla seriale a causa dei differenti livelli logici. Per questo motivo si deve usare un chip MAX 3232 (per semplicita' ho comprato a circa 5 euro una basetta gia' montata)



I collegamenti sono semplici
VCC -> 5 V Arduino
GND -> GND Arduino
Tx -> Rx Arduino
Rx->Tx Arduino
(i pin della fila piu' interna non sono necessari)

Per verificare il funzionamento si puo' usare Minicom (e nel mio caso un caso USB-Seriale in quanto il portatile non dispone di una porta seriale vera)

minicom -D /dev/ttyUSB0 -b 9600

Lo sketch di prova e' particolarmente semplice
---------------------------------------
void setup() {
  Serial.begin(9600);
}

void loop() {
  Serial.println("Luca");
  delay(1000);        
}

domenica 5 gennaio 2014

Texas CC1101 su Arduino con libreria Panstamp

Dopo lo scarso successo della precedente prova e stimolato da un commento ho riprovato ad usare il modulo Texas CC1101 con le librerie Panstamp

Viste le modeste dimensioni delle scritte sul circuito riporto la pedinatura del modulo CC1101 (non l'integrato ma tutto il modulo) in modo da rendere piu' semplici i collegamenti

I collegamenti con Arduino sono
GND / GND
VCC / VCC (3.3V)
CSN / D10
MOSI /D11
MISO / D12
SCK / D13
GD0 / D2

Le prove sono state effettuate con la IDE 1.5.5 su Windows
E' stato seguito l'esempio riportato a questo link (Erwan's Blog) e la libreria associata  (grazie per l'aiuto)
Il primo tentativo e' miseramente fallito perche' ho modificato il programma cambiando il settaggio del baudrate dello sketch originale (da 38400 a 19200). Questa modifica la avevo effettuata perche' nel Monitor Seriale di Arduino non e' prevista la velocita' di 38400....questa insignificante modifica rendeva non funzionante lo sketch (lo ho scoperto dopo un paio di giorni e quasi per caso

Riportati gli sketch all'origine mi sono adattato a monitorare la seriale via Minicom con il comando

minicom -D /dev/ttyACM0 -b 38400

in questo modo la trasmissione e ricezione funzionano correttamente. Ma quale e' la massima distanza di trasmissione con questa libreria??
Dopo varie prove, anche invertendo le schede Arduino che fungono da trasmettitore e ricevitore oppure invertendo le antenne, il risultato e' stato identico alla prova precedente con una portata di circa 25 metri (l'RSSI parte da un valore di circa 78 con le antenne praticamente attaccate e scende a circa 100 alla massima distanza)

Viste le esperienze di altre persone che hanno mostrato trasmissioni con una distanza di oltre 200 metri mi sta venendo il dubbio che il problema sia hardware

Emettitore
-------------------------------------
#include "EEPROM.h"
#include "cc1101.h"

CC1101 cc1101;

// The LED is wired to the Arduino Output 4 (physical panStamp pin 19)
#define LEDOUTPUT 7

// counter to get increment in each loop
byte counter;
byte b;
byte syncWord = 199;

void blinker(){
digitalWrite(LEDOUTPUT, HIGH);
delay(100);
digitalWrite(LEDOUTPUT, LOW);
delay(100);
}

void setup()
{
Serial.begin(38400);
Serial.println(" start ");

// setup the blinker output
pinMode(LEDOUTPUT, OUTPUT);
digitalWrite(LEDOUTPUT, LOW);

// blink once to signal the setup
blinker();

// reset the counter
counter=0;
Serial.println(" initializing… ");
// initialize the RF Chip
cc1101.init();

cc1101.setSyncWord(&syncWord, false);
cc1101.setCarrierFreq(CFREQ_433);
cc1101.disableAddressCheck();
//cc1101.setTxPowerAmp(PA_LowPower);

delay(1000);

Serial.print(" CC1101_PARTNUM " ); //cc1101=0
Serial.println(cc1101.readReg(CC1101_PARTNUM, CC1101_STATUS_REGISTER));
Serial.print(" CC1101_VERSION " ); //cc1101=4
Serial.println(cc1101.readReg(CC1101_VERSION, CC1101_STATUS_REGISTER));
Serial.print(" CC1101_MARCSTATE " );
Serial.println(cc1101.readReg(CC1101_MARCSTATE, CC1101_STATUS_REGISTER) & 0x1f);

Serial.println(" device initialized ");
//Serial.println(" done ");
}

void send_data() {
CCPACKET data;
data.length=10;
byte blinkCount=counter++;
data.data[0]=5;
data.data[1]=blinkCount;data.data[2]=0;
data.data[3]=1;data.data[4]=0;
//cc1101.flushTxFifo ();
Serial.print(" CC1101_MARCSTATE " );
Serial.println(cc1101.readReg(CC1101_MARCSTATE, CC1101_STATUS_REGISTER) & 0x1f);
if(cc1101.sendData(data)){
Serial.print(blinkCount,HEX);
Serial.println( " sent ok :)  ");
blinker();
}else{
Serial.println(" sent failed :( " );
blinker();
blinker();
}
}

void loop()
{
send_data();
delay(4000);
}
-------------------------------------

Ricevitore
--------------------------------------
#include "EEPROM.h"
#include "cc1101.h"

// The LED is wired to the Arduino Output 4 (physical panStamp pin 19)
#define LEDOUTPUT 4

// The connection to the hardware chip CC1101 the RF Chip
CC1101 cc1101;

byte b;
byte i;
byte syncWord = 199;
long counter=0;
byte chan=0;

// a flag that a wireless packet has been received
boolean packetAvailable = false;

void blinker(){
digitalWrite(LEDOUTPUT, HIGH);
delay(100);
digitalWrite(LEDOUTPUT, LOW);
delay(100);
}

/* Handle interrupt from CC1101 (INT0) gdo0 on pin2 */
void cc1101signalsInterrupt(void){
// set the flag that a package is available
packetAvailable = true;
}

void setup()
{
Serial.begin(38400);
Serial.println(" start ");

// setup the blinker output
pinMode(LEDOUTPUT, OUTPUT);
digitalWrite(LEDOUTPUT, LOW);

// blink once to signal the setup
blinker();
// initialize the RF Chip
cc1101.init();

cc1101.setSyncWord(&syncWord, false);
cc1101.setCarrierFreq(CFREQ_433);
cc1101.disableAddressCheck(); //if not specified, will only display " packet received "
//cc1101.setTxPowerAmp(PA_LowPower);

Serial.print(" CC1101_PARTNUM " ); //cc1101=0
Serial.println(cc1101.readReg(CC1101_PARTNUM, CC1101_STATUS_REGISTER));
Serial.print(" CC1101_VERSION " ); //cc1101=4
Serial.println(cc1101.readReg(CC1101_VERSION, CC1101_STATUS_REGISTER));
Serial.print(" CC1101_MARCSTATE " );
Serial.println(cc1101.readReg(CC1101_MARCSTATE, CC1101_STATUS_REGISTER) & 0x1f);

attachInterrupt(0, cc1101signalsInterrupt, FALLING);

Serial.println(" device initialized ");
}

void ReadLQI()
{
byte lqi=0;
byte value=0;
lqi=(cc1101.readReg(CC1101_LQI, CC1101_STATUS_REGISTER));
value = 0x3F - (lqi & 0x3F);
//value = 0x3F – (lqi & 0x3F);
Serial.print(" CC1101_LQI " );
Serial.println(value);
}

void ReadRSSI()
{
byte rssi=0;
byte value=0;

rssi=(cc1101.readReg(CC1101_RSSI, CC1101_STATUS_REGISTER));

if (rssi >= 128)
{
value = 255 -rssi;
//value = 255 – rssi;
value /= 2;
value += 74;
}
else
{
value = rssi/2;
value += 74;
}
Serial.print(" CC1101_RSSI " );
Serial.println(value);
}

void loop()
{
if(packetAvailable){
Serial.println(" packet received ");
// Disable wireless reception interrupt
detachInterrupt(0);

ReadRSSI();
ReadLQI();
// clear the flag
packetAvailable = false;

CCPACKET packet;

if(cc1101.receiveData(&packet) > 0){
if(!packet.crc_ok) {
Serial.println(" crc not ok ");
}

if(packet.length > 0){
Serial.print(" packet: len " );
Serial.print(packet.length);
Serial.print( " data: " );
for(int j=0; j<packet.length; j++){
Serial.print(packet.data[j],HEX);
Serial.print( " " );
}
Serial.println(" . ");
}
}
// Enable wireless reception interrupt
attachInterrupt(0, cc1101signalsInterrupt, FALLING);
}
}


venerdì 3 gennaio 2014

Esperimenti con telefonia mobile ed Android

Per continuare gli esperimenti di questo post, ho creato una piccola applicazione (assolutamente non ottimizzata) che registra in continuita' la posizione GPS ed i dati di telefonia. I dati vengono registrati su in file testo per la successiva elaborazione




I dati registrati sono coerenti ed ho provato ad incrociare il segnale con la distanza dalle antenne ripresa dai database che sono disponibili su Internet (non e' dato sapere quale sia il grado di attendibilita' della posizione GPS dell'antenna)


Mettendo in grafico un po' di distanze dall'antenna contro il segnale misurato si ha una notevole dispersione dei punti

Per adesso il sistema e' stato provato solo in ambito urbano con una notevole densita' di antenne e di disturbi.Il suo uso reale sara' in aree lontane dall'ambiente urbano e sono previste prove nei prossimi giorni


Manifest
-------------------------------------------------
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.test.onrelease"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />
    
    <uses-permission android:name="android.permission.SEND_SMS" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
     

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.test.onrelease.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
-------------------------------------------------
Layout
-------------------------------------------------
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <Button
        android:id="@+id/button1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="Invia" />

    <TextView
        android:id="@+id/lat"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/button1"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="15dp"
        android:gravity="center_horizontal"
        android:text="TextView" />

    <TextView
        android:id="@+id/p1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignTop="@+id/button1"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="18dp"
        android:gravity="center_horizontal"
        android:text="TextView" />

    <TextView
        android:id="@+id/p2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/p1"
        android:layout_centerHorizontal="true"
        android:gravity="center_horizontal"
        android:text="TextView" />

    <TextView
        android:id="@+id/segnale"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/p2"
        android:layout_centerHorizontal="true"
        android:gravity="center_horizontal"
        android:text="TextView" />

    <TextView
        android:id="@+id/gpsfix"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_above="@+id/lat"
        android:layout_alignLeft="@+id/button1"
        android:layout_marginBottom="14dp"
        android:gravity="center_horizontal"
        android:text="TextView" />

    <TextView
        android:id="@+id/last_pos"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_above="@+id/gpsfix"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="18dp"
        android:gravity="center_horizontal" />

    <TextView
        android:id="@+id/tipo"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/segnale"
        android:layout_centerHorizontal="true"
        android:text="TextView" />

</RelativeLayout>

-------------------------------------------------


Main
--------------------------------------------------
package com.test.onrelease;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.sql.Date;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.TimeZone;

import android.location.Location;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.Environment;
import android.os.PowerManager;
import android.os.PowerManager.WakeLock;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.telephony.CellLocation;
import android.telephony.NeighboringCellInfo;
import android.telephony.PhoneStateListener;
import android.telephony.SignalStrength;
import android.telephony.SmsManager;
import android.telephony.TelephonyManager;
import android.telephony.gsm.GsmCellLocation;
import android.util.Log;
import android.view.*;
import android.view.View.OnTouchListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import android.location.LocationListener;

public class MainActivity extends Activity {

private Button pulsante;
//gestione dei tempi di pressione del pulsante
long lastDown;
long lastDuration;
//gestione del GPS
private double latitudine;
private double longitudine;
private double last_lat;
private double last_long;

private String tempo_gps;
private long old_time; //tempo ultima acquisizione
private long last_time;
    private boolean gps_fix; //true se si ha il fix del GPS

private LocationManager mlocManager;
private MyLocationListener mlocListener;
private TextView gpsfix;
private TextView posizione;
private String nr_phone;
    private int signalStrengthValue;

private int cid;
private int lac;
private int mcc;
private int mnc;
private int rssi;
private TextView ph1;
private TextView ph2;
private TextView segnale;
private TelephonyManager mTelephonyMgr;
private String networkOperator;
private GsmCellLocation cellLocation;
private TextView last_pos;
private TextView type;
private TextView vicini;
private WakeLock wl;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
gps_fix = false;
last_time = 0;
mlocManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
mlocListener = new MyLocationListener();
        mlocManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, 0, 0, mlocListener);

        // se il GPS non e' abilitato richiede l'intervento dell'utente
        if (!mlocManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
        startActivity(new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS));
        }

        //prende il numero di telefono se disponibile
        //TelephonyManager mTelephonyMgr;
        mTelephonyMgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
        // richiede le informazioni di cella
        networkOperator = mTelephonyMgr.getNetworkOperator();
        cellLocation = (GsmCellLocation) mTelephonyMgr.getCellLocation();
        //il numero di telefono non e' codificato nella SIM
        nr_phone = mTelephonyMgr.getLine1Number();
        cid = cellLocation.getCid();
        lac = cellLocation.getLac();
        if (networkOperator != null) {
            mcc = Integer.parseInt(networkOperator.substring(0, 3));
            mnc = Integer.parseInt(networkOperator.substring(3));
        }
        
        
        //definisce il tipo di connessione (UTMS/HDSPA/GPRS
        int tipo = mTelephonyMgr.getNetworkType();

        
        type = (TextView)findViewById(R.id.tipo);
        
        switch (tipo)
        {
        case 7:
            type.setText("1xRTT");
            break;
        case 4:
            type.setText("CDMA");
            break;      
        case 2:
        type.setText("EDGE");
            break;  
        case 14:
        type.setText("eHRPD");
            break;      
        case 5:
        type.setText("EVDO rev. 0");
            break;  
        case 6:
        type.setText("EVDO rev. A");
            break;  
        case 12:
        type.setText("EVDO rev. B");
            break;  
        case 1:
        type.setText("GPRS/GSM");
            break;      
        case 8:
        type.setText("HSDPA");
            break;      
        case 10:
        type.setText("HSPA");
            break;          
        case 15:
        type.setText("HSPA+");
            break;          
        case 9:
        type.setText("HSUPA");
            break;          
        case 11:
        type.setText("iDen");
            break;
        case 13:
        type.setText("LTE");
            break;
        case 3:
        type.setText("UMTS");
            break;          
        case 0:
        type.setText("Unknown");
            break;
        }
        
        
        //la ricerca delle celle vicine sembra funzionare solo in 2G
        List<NeighboringCellInfo> NeighboringList = mTelephonyMgr.getNeighboringCellInfo();
        String stringNeighboring = "Neighboring List- Lac : Cid : RSSI\n";
        for(int i=0; i < NeighboringList.size(); i++){
         
        String dBm;
        int rssi = NeighboringList.get(i).getRssi();
        if(rssi == NeighboringCellInfo.UNKNOWN_RSSI){
        dBm = "Unknown RSSI";
        }else{
        dBm = String.valueOf(-113 + 2 * rssi) + " dBm";
        }
 
        stringNeighboring = stringNeighboring
         + String.valueOf(NeighboringList.get(i).getLac()) +" : "
         + String.valueOf(NeighboringList.get(i).getCid()) +" : "
         + dBm +"\n";
        }
        
      
        AndroidPhoneStateListener phoneStateListener = new AndroidPhoneStateListener ();  
        mTelephonyMgr.listen(phoneStateListener, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);
        
        
pulsante = (Button)  findViewById(R.id.button1);
pulsante.setText("In attesa posizione GPS");
pulsante.setEnabled(false);
posizione = (TextView)findViewById(R.id.lat);
gpsfix = (TextView)findViewById(R.id.gpsfix);
ph1 = (TextView) findViewById(R.id.p1);
ph2 = (TextView) findViewById(R.id.p2);
segnale = (TextView) findViewById(R.id.segnale);
last_pos = (TextView) findViewById(R.id.last_pos);
gpsfix.setText("00:00:00");
posizione.setText("0/0");
ph1.setText("CID:"+Integer.toString(cid)+" LAC:"+Integer.toString(lac));
ph2.setText("MCC:"+Integer.toString(mcc)+" MNC:"+Integer.toString(mnc));
//gestione della pressione del pulsante
pulsante.setOnTouchListener(new OnTouchListener() {
    public boolean onTouch(View v, MotionEvent event) {
    // registra il tempo di pressione del pulsante
       if(event.getAction() == MotionEvent.ACTION_DOWN) {
          lastDown = System.currentTimeMillis();
       } else if (event.getAction() == MotionEvent.ACTION_UP) {
        // registra il rilascio del pulsante
          lastDuration = System.currentTimeMillis() - lastDown;
          // se il tasto e' stato premuto almeno 1 sec genera l'evento di invio SMS
          if (lastDuration > 1000)
          {
           pulsante.setBackgroundColor(Color.RED);
           pulsante.setText("Richiesta accettata. Invio in corso");
           
           // invio SMS
           try {
    SmsManager smsManager = SmsManager.getDefault();
    String testo_sms = Double.toString(latitudine)+"/"+Double.toString(longitudine)+"/"+tempo_gps+"/"+nr_phone+"/"+Integer.toString(cid)+"/"+Integer.toString(lac)+"/"+Integer.toString(mcc)+"/"+Integer.toString(mnc)+"/"+Integer.toString(signalStrengthValue);
    smsManager.sendTextMessage("xxxxxxxx", null, testo_sms, null, null);
    Toast.makeText(getApplicationContext(), "SMS Inviato",
    Toast.LENGTH_LONG).show();
     } catch (Exception e) {
    Toast.makeText(getApplicationContext(),
    "Ritento spedizione SMS",
    Toast.LENGTH_LONG).show();
    e.printStackTrace();
     }
           // fine invio SMS
          }
           else
           {
           pulsante.setBackgroundColor(Color.GREEN);
           pulsante.setText("Premere il pulsante per almeno 1 secondo");
           }
       }
return false;
    }
 });
}
public class MyLocationListener implements LocationListener
     {
  @Override
     public void onLocationChanged(Location loc)
     {
     latitudine = loc.getLatitude();
     longitudine = loc.getLongitude();
     long tempo = loc.getTime();
     
     // e' considerato di avere il fix gps se non ci sono piu' di 5 secondi
     // tra due letture consecutive
     if ((tempo-old_time < 5000) && (old_time > 0))
     {
             gps_fix = true;
            pulsante.setEnabled(true);
          pulsante.setBackgroundColor(Color.GREEN);
          pulsante.setText("Premere il pulsante per almeno 1 secondo");

             
             Date date = new Date(tempo);
             SimpleDateFormat format = new SimpleDateFormat("dd/MM/yy HH:mm:ss zzz a");
             format.setTimeZone(TimeZone.getTimeZone("GMT"));
             tempo_gps= format.format(date);
             gpsfix.setText(tempo_gps);
             posizione.setText(loc.convert(longitudine, loc.FORMAT_SECONDS)+"/"+loc.convert(latitudine, loc.FORMAT_SECONDS));
             
             //se sono passati 10 minuti dall'ultimo scambio variabili
             //popolando le variabili dell'ultima posizione
             if (last_time - tempo > 600000)
             {
            last_time = tempo;
            last_lat=latitudine;
            last_long = longitudine;
            last_pos.setText(Location.convert(last_long, loc.FORMAT_SECONDS)+"/"+loc.convert(last_lat, loc.FORMAT_SECONDS));
             }
     }
     old_time = tempo;
     }


     @Override
     public void onProviderDisabled(String provider)
     {
     gps_fix = false;
     Toast.makeText( getApplicationContext(),R.string.gps_disabled,Toast.LENGTH_SHORT ).show();
     }


     @Override
     public void onProviderEnabled(String provider)
     {
     Toast.makeText( getApplicationContext(),R.string.gps_enabled,Toast.LENGTH_SHORT).show();
     }
     
     @Override
     public void onStatusChanged(String provider, int status, Bundle extras)
     {

     }
   }
 
   @Override
   protected void onStop()
   {
       //mlocManager.removeUpdates(mlocListener);
       super.onStop();
   }
   
   @Override
   protected void onDestroy()
   {
       mlocManager.removeUpdates(mlocListener);
       super.onStop();
   }
 
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
public double FSPL(int db)
{
double distanza;
distanza = Math.pow(10,(-db - 98.89)/20);
return distanza;
}
public double FSPLDbm(int dbm)
{
double distanza;
double db1;
double Pm = 1000*Math.pow(10,(dbm/10)); 
db1 = 10*Math.log10(Pm);
distanza = Math.pow(10,(-db1 - 98.89)/20);
return distanza;
}
public class AndroidPhoneStateListener extends PhoneStateListener {

private double d;

public void ononCellLocationChanged(CellLocation location)
{
networkOperator = mTelephonyMgr.getNetworkOperator();
       cellLocation = (GsmCellLocation) mTelephonyMgr.getCellLocation();
       //il numero di telefono non e' codificato nella SIM
       nr_phone = mTelephonyMgr.getLine1Number();
       cid = cellLocation.getCid();
       lac = cellLocation.getLac();
       if (networkOperator != null) {
           mcc = Integer.parseInt(networkOperator.substring(0, 3));
           mnc = Integer.parseInt(networkOperator.substring(3));
       }
ph1.setText("CID:"+Integer.toString(cid)+" LAC:"+Integer.toString(lac));
ph2.setText("MCC:"+Integer.toString(mcc)+" MNC:"+Integer.toString(mnc));
       
       
       //definisce il tipo di connessione (UTMS/HDSPA/GPRS
       int tipo = mTelephonyMgr.getNetworkType();

       
       type = (TextView)findViewById(R.id.tipo);
       
       switch (tipo)
       {
       case 7:
           type.setText("1xRTT");
           break;
       case 4:
           type.setText("CDMA");
           break;      
       case 2:
        type.setText("EDGE");
           break;  
       case 14:
        type.setText("eHRPD");
           break;      
       case 5:
        type.setText("EVDO rev. 0");
           break;  
       case 6:
        type.setText("EVDO rev. A");
           break;  
       case 12:
        type.setText("EVDO rev. B");
           break;  
       case 1:
        type.setText("GPRS/GSM");
           break;      
       case 8:
        type.setText("HSDPA");
           break;      
       case 10:
        type.setText("HSPA");
           break;          
       case 15:
        type.setText("HSPA+");
           break;          
       case 9:
        type.setText("HSUPA");
           break;          
       case 11:
        type.setText("iDen");
           break;
       case 13:
        type.setText("LTE");
           break;
       case 3:
        type.setText("UMTS");
           break;          
       case 0:
        type.setText("Unknown");
           break;
       }
 
}
 
         @Override
         public void onSignalStrengthsChanged(SignalStrength signalStrength) {
             super.onSignalStrengthsChanged(signalStrength);
             
networkOperator = mTelephonyMgr.getNetworkOperator();
       cellLocation = (GsmCellLocation) mTelephonyMgr.getCellLocation();
       //il numero di telefono non e' codificato nella SIM
       nr_phone = mTelephonyMgr.getLine1Number();
       cid = cellLocation.getCid();
       lac = cellLocation.getLac();
       if (networkOperator != null) {
           mcc = Integer.parseInt(networkOperator.substring(0, 3));
           mnc = Integer.parseInt(networkOperator.substring(3));
       }
ph1.setText("CID:"+Integer.toString(cid)+" LAC:"+Integer.toString(lac));
ph2.setText("MCC:"+Integer.toString(mcc)+" MNC:"+Integer.toString(mnc));
       
       
       //definisce il tipo di connessione (UTMS/HDSPA/GPRS
       int tipo = mTelephonyMgr.getNetworkType();

       
       type = (TextView)findViewById(R.id.tipo);
       
       switch (tipo)
       {
       case 7:
           type.setText("1xRTT");
           break;
       case 4:
           type.setText("CDMA");
           break;      
       case 2:
        type.setText("EDGE");
           break;  
       case 14:
        type.setText("eHRPD");
           break;      
       case 5:
        type.setText("EVDO rev. 0");
           break;  
       case 6:
        type.setText("EVDO rev. A");
           break;  
       case 12:
        type.setText("EVDO rev. B");
           break;  
       case 1:
        type.setText("GPRS/GSM");
           break;      
       case 8:
        type.setText("HSDPA");
           break;      
       case 10:
        type.setText("HSPA");
           break;          
       case 15:
        type.setText("HSPA+");
           break;          
       case 9:
        type.setText("HSUPA");
           break;          
       case 11:
        type.setText("iDen");
           break;
       case 13:
        type.setText("LTE");
           break;
       case 3:
        type.setText("UMTS");
           break;          
       case 0:
        type.setText("Unknown");
           break;
       }
             
             if (signalStrength.isGsm()) {
                 if (signalStrength.getGsmSignalStrength() != 99)
                     signalStrengthValue = signalStrength.getGsmSignalStrength() * 2 - 113;
                 else
                     signalStrengthValue = signalStrength.getGsmSignalStrength();
             }
             
             if (!signalStrength.isGsm()){
                 signalStrengthValue = signalStrength.getCdmaDbm();
                 if (signalStrength.getCdmaDbm() < signalStrength.getEvdoDbm())
                 {
                signalStrengthValue = signalStrength.getCdmaDbm();
                 }
                 else
                 {
                signalStrengthValue = signalStrength.getEvdoDbm();
                 }
                 
             }
             if (signalStrength.isGsm())
             {
            d = FSPL(signalStrengthValue);  
             }
             else 
             {
            d = FSPLDbm(signalStrengthValue);
             }
             
             DecimalFormat df = new DecimalFormat("#.##");
             segnale.setText("Segnale : "+Integer.toString(signalStrengthValue)+"dB / "+df.format(d)+"Km");

             // salva su file
             File root = Environment.getExternalStorageDirectory();
             if (root.canWrite()){
                 File data_file = new File(root, "onrelease.txt");
                 FileWriter data_file_writer = null;
try {
data_file_writer = new FileWriter(data_file,true);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
                 BufferedWriter out = new BufferedWriter(data_file_writer);
                 try {
out.write(gpsfix.getText().toString()+";"+Double.toString(longitudine)+";"+Double.toString(latitudine)+";"+type.getText().toString()+";"+Integer.toString(mnc)+";"+Integer.toString(mcc)+";"+Integer.toString(lac)+";"+Integer.toString(cid)+";"+Integer.toString(signalStrengthValue)+";"+df.format(d)+"\n");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
                 try {
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}        
             }
             
         }
     }
}


Opencv camera calibration in cpp

Oltre che con uno script Python come visto qui la calibrazione della camera si puo' fare anche con il programma in CPP Questo il proce...