martedì 31 gennaio 2012

HP-97

Tempo fa mi e' stato donato la calcolatrice programmabile nelle foto


Calcolatrice

Memoria esterna

Purtroppo chi mi ha dato l'oggetto mi ha detto che era funzionante ma non ha menzionato il fatto che funzionasse a 110 Volts..per cui quando ho cercato di dare corrente il calcolatore e' esploso (nel vero senso della parola....una volta aperto ho trovato un paio di componenti elettronici completamente distrutti) per cui adesso assolve alla funzione di soprammobile




lunedì 30 gennaio 2012

Sign an app

Per poter distribuire una applicazione Android e' necessario firmarla in modo digitale (vedere qui). Il certificato digitale non e' necessario che sia validato da una autorita' esterna.
Per poter firmare una applicazione da dentro Eclipse si puo' cliccare con il tasto destro sul progetto di cui si vuole rilasciare l'apk e scegliere Android Tool/Export Signed Application Package.
Si apre una finestra nel quale si sceglie il nome dell'applicazione e poi si puo' scegliere una firma digitale gia' creata oppure una gia' pronta

Prima schermata
Seconda Schermata

Definizione di una nuova chiave

Per quanta riguarda le versioni di debug queste sono firmate con una speciale chiave che puo' essere usata sull'emulatore o sul telefono di test ma non funziona su altri sistemi

DGPS Test

Mettendo insieme i vari pezzi di codice precedenti e' stata effettuata una prova usando sia  il sensore GPS Bluetooth che il sensore GPS Android.
I due sensori sono stati posti in acquisizione per tre minuti ad una distanza di pochi centimetri l'uno dall'altra e sincronizzati in modo empirico,

Calcolata la posizione media derivate dai due sensori sono stati calcolati e plottati i delta rispetto al valore medio
Grafico delle fluttuazioni GPS 

Si nota immediatamente come i due sensori lavorino in modo molto differente. Il sensore Bluetooth risente di fluttuazioni piu' ampie mentre il sensore Android si stabilizza rapidamente su una HDOP prossima ai 2 m. Riportando in pianta i dati si vede inoltre che la fluttuazione GPS ha un andamento completamente differente

Fluttuazioni in pianta del segnale GPS

Dettaglio della fluttuazione GPS per i due sensori
Al termine i punti medi dei due GPS risultano distanti 5 m mentre nella realta' si trovavano a pochi centimetri di distanza quindi il test e' stato un insuccesso... ma perche'????
Il sensore GPS del Bluetooth fornisce dati in formato DD MM.dd (gradi minuti.decimi minuto) il che vuole dire che la minima distanza apprezzata vale un centesimo di minuto
Prendiamo per esempio due punti entrambi a latitudine 45°N e longitudine 11°45,32' e 11°45,33' (ovvero distanti di 0.01 primi) che equivalgono a 11°45'19,19'' e 11°45'19,79''. La distanza tra queste
due posizioni risulta essere di circa 13 m. Quindi in linea di principio la colpa e' da attribuire nella scarsa sensibilita' del sensore GPS


Track GPS su Android Java

Ho fatto qualche tentativo di utilizzare Python per registrare i dati del GPS mediante il semplice script



--------------------------------------------------------------------------------------------------------------
import android,time
droid = android.Android()


droid.startLocating()
time.sleep(15)
while True:
loc = droid.readLocation().result
if loc == {}:
loc = getLastKnownLocation().result
if loc != {}:
try:
n = loc['gps']
except KeyError:
n = loc['network']
la = n['latitude']
lo = n['longitude']
print la,lo

--------------------------------------------------------------------------------------------------------------
ma dopo pochi secondi di utilizzo l'icona del GPS si spenge e viene visualizzato sempre lo stesso valore di latitudine e longitudine nonostante le normali fluttuazioni che affliggono tutti i sensori GPS.
Francamente non ho chiaro se il problema derivi dal mio hardware o dalle modifiche al firmware software del telefono (dato che il medesimo script ad altre persone funziona)
In ogni caso l'unica soluzione e' stata quella di convertire il progetto in Java

Manifest.xml (da notare le modifiche alle uses-permission ed all'icona personalizzata)

--------------------------------------------------------------------------------------------------------------
<?xml version="1.0" encoding="utf-8"?>


<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.test.gpstest"
    android:versionCode="1"
    android:versionName="1.0" >


    <uses-sdk android:minSdkVersion="8" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>

    <application
        android:icon="@drawable/icon"
        android:label="@string/app_name" >
        <activity
            android:name=".GpsTestActivity"
            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>


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


GpsTestActivity.java
In questo codice viene acquisita la posizione, l'accuratezza e l'ora, dati che poi vengono scritti sulla SD card su un file cvs dati_gps_android.txt
--------------------------------------------------------------------------------------------------------------

package com.test.gpstest;


import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;


import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.widget.Toast;


public class GpsTestActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        /* Use the LocationManager class to obtain GPS locations */
        LocationManager mlocManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
        LocationListener mlocListener = new MyLocationListener();
        mlocManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, 0, 0, mlocListener);
    }
    public class MyLocationListener implements LocationListener
    {
    @Override
    public void onLocationChanged(Location loc)
    {
    loc.getLatitude();
    loc.getLongitude();
    loc.getAccuracy();
    String Text = "My current location is: " + "Latitud = " + loc.getLatitude() +"Longitud = " + loc.getLongitude()+" Accuracy = " + loc.getAccuracy();
    Toast.makeText( getApplicationContext(),Text,Toast.LENGTH_SHORT).show();
    // scrive i dati sul file
    try {
        File root = Environment.getExternalStorageDirectory();
        if (root.canWrite()){
            File gpxfile = new File(root, "dati_gps_android.txt");
            FileWriter gpxwriter = new FileWriter(gpxfile,true);
            BufferedWriter out = new BufferedWriter(gpxwriter);
            //String currentDateTimeString = DateFormat.getDateInstance().format(new Date());
            String currentTimeString = new SimpleDateFormat("HH:mm:ss").format(new Date());
            out.write(currentTimeString+";"+loc.getLatitude()+";"+loc.getLongitude()+";"+loc.getAccuracy()+"\n");
            out.close();
        }
    } catch (IOException e) {
   
    }


    }




    @Override
    public void onProviderDisabled(String provider)
    {
    Toast.makeText( getApplicationContext(),"Gps Disabled",Toast.LENGTH_SHORT ).show();
    }




    @Override
    public void onProviderEnabled(String provider)
    {
    Toast.makeText( getApplicationContext(),"Gps Enabled",Toast.LENGTH_SHORT).show();
    }




    @Override
    public void onStatusChanged(String provider, int status, Bundle extras)
    {


    }


    }/* End of Class MyLocationListener */
    
}

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

Rispetto al test precedente effettuato con un senbsore bluetooth esterno le condizioni di visibilita' del cielo erano decisamente migliori per cui l'errore di posizione e' risultato inferiore ai 5 m



Icone su applicazione Android

Per inserire una icona personalizzata in un progetto Android e' sufficiente inserire nelle directory una immagine .png come suggerito qui


res/drawable-hdpi
res/drawable-mdpi
res/drawable-ldpi


rispettivamente alle risoluzioni 72x72 (hdpi), 48x48 (mdpi) e 36x36 (ldpi) ed usando sempre lo stesso nome (per esempio miaicona.png)

Successivamente si dovra' modificare il file Manifest.xml

   <application
        android:icon="@drawable/miaicona"


inserendo il nome dell'icona dopo la scritta @drawable senza l'estensione png

Scrivere dati su SD Card


Modificando il codice ritrovato qui e' possibile scrivere i dati su un file presente nella SD Card
In questo esempio, mettendo a True, l'attributo di FileWrite si mette la scrittura in Append in modo da accodare i risultati in fondo al file
---------------------------------------------------------------------------------------------------------------------------

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

        double lat = 12.55;
        double lon = 43.14;
        try {
            File root = Environment.getExternalStorageDirectory();
            if (root.canWrite()){
                File gpxfile = new File(root, "gpxfile.gpx");  //nome del file
                FileWriter gpxwriter = new FileWriter(gpxfile,true);
                BufferedWriter out = new BufferedWriter(gpxwriter);
                String currentDateTimeString = DateFormat.getDateInstance().format(new Date());
                String currentTimeString = new SimpleDateFormat("HH:mm:ss").format(new Date());
                out.write(currentTimeString+";"+lon+";"+lat+"\n"); // stringa da scrivere
               // a differenza di Python si puo' scrivere su file anche dati float senza effettuare una esplicita conversione in string
                out.close();
            }
        } catch (IOException e) {
       
        }
---------------------------------------------------------------------------------------------------------------------------
Per rendere il codice operativo bisogna impostare nel file Manifest.xml la seguente riga prima del tag <application>

---------------------------------------------------------------------------------------------------------------------------
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
---------------------------------------------------------------------------------------------------------------------------

Suggerimenti di Eclipse



Usando Eclipse puo' tornare comodo usare i suggerimenti di completamento del codice
Se si digitano le seguenti righe pero'

--------------------------------------------------------------------------------------------
String currentDateTimeString = DateFormat.getDateInstance().format(new Date());
String currentTimeString = new SimpleDateFormat("HH:mm:ss").format(new Date());
--------------------------------------------------------------------------------------------

vengono proposti alcuni import mentre quelli corretti sono

--------------------------------------------------------------------------------------------
import java.text.DateFormat;
import java.text.SimpleDateFormat;
--------------------------------------------------------------------------------------------
In caso contrario il codice non compila

Il motivo dell'errore risiede nel fatto che i comandi sono contenuti, con lo stesso nome, in piu' librerie e quindi Eclipse, non sapendo quale scegliere, sbaglia





Debugger integrato ESP32S3

Aggiornamento In realta' il Jtag USB funziona anche sui moduli cinesi Il problema risiede  nell'ID USB della porta Jtag. Nel modulo...