lunedì 30 gennaio 2012

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





MOD su U8150

Per vari motivi ho provato a cambiare il sistema Android montato di fabbrica sul mio Huawei Ideos 8150 della Vodafone con risultati alterni. In particolare


  • Dronix 0.4 : francamente la migliore che ho provato. Veloce, parca di batteria, multitouch abilitato, permessi di root
  • Dronix 0.5.4 : un mezzo inferno. Venendo dalla positiva esperienza ho provato l'upgrade alla 0.5.4 piu' che altro per sperimentare l'USB Host per un futuro utilizzo con Arduino. Il telefono funziona abbastanza bene ma non vengono installati gli aggiornamenti del Market, non e' possibile installare gli apk compilati da Eclipse,  il kernel modificato per l'USB Host azzera la batteria nel giro di poche ore
  • CyanogenMod 7.2: una volta installata richiede il PIN per attivare il telefono ogni 10 secondi. Scartata immediatamente senza ulteriori prove
In tutto cio' ho provato a reinstallare anche il firmware originale della Vodafone ma devo ammettere di non essere riuscito a tornare indietro per cui adesso sto usando, con soddisfazione, la Dronix 0.4

sabato 28 gennaio 2012

Studio GPS per DGPS

Sto lavorando ad una idea su come poter utilizzare telefoni Android o GPS Bluetooth a basso costo per creare un sistema di GPS Differenziale (DGPS) per migliorare le prestazioni e ridurre l'errore di localizzazione.

Il primo passo che ho fatto e' stato quello di studiare un sensore GPS Bluetooth della BlueSoleil
Per stimare l'errore sono state fatte circa 700 misure mantenendo il sensore fermo e leggendo con uno script Python i codici NMEA che vengono generati sulla seriale

Lo script di acquisizione e' il seguente
Per la definizione dei codici NMEA e' stato utilizzato questo sito
Per il calcolo del checksum della stringa NMEA e' stato modificato il codice trovato qui
La parte principale del codice e' accreditata a http://www.robertprice.co.uk/robblog/archive/2007/1/Using_A_Bluetooth_GPS_From_Python.shtml
(il mio contributo e' modesto ma nessuno dei codici da solo era completo e corretto..diciamo che ho messo insieme i pezzi giusti)
-----------------------------------------------------------------------

import bluetooth
import re


def checksum(sentence):
    if re.search("\n$", sentence):
        sentence = sentence[:-1]


    nmeadata,cksum = re.split('\*', sentence)
    nmeadata = nmeadata[1:]
    calc_cksum = 0
    print "nmeadata "+nmeadata
    print "check :"+str(int(cksum,16))


    for s in nmeadata:
        calc_cksum ^= ord(s)
    print "check calc :"+str(calc_cksum)
    return nmeadata,int(cksum,16),calc_cksum






# bluetooth address of the GPS device.
addr = "00:0A:3A:1F:A4:2E"


# port to use.
port = 1


# create a socket and connect to it.
socket = bluetooth.BluetoothSocket(bluetooth.RFCOMM)
socket.connect((addr, port))
data = ""
olddata = ""


f = open('dati_gps.txt','w')


while True:
data = socket.recv(1024)
#print data
  # make sure we actually have some data.
if len(data) > 0:
  
    # append the old data to the front of data.
data = olddata + data


    # split the data into a list of lines, but make
    # sure we preserve the end of line information.
    lines = data.splitlines(1)


    # iterate over each line
    for line in lines:
    
      # if the line has a carriage return and a
      # linefeed, we know we have a complete line so
      # we can remove those characters and print it.
      if line.find("\r\n") != -1 :
        line = line.strip()
       
gpsstring = line.split(',')
if gpsstring[0] == '$GPRMC':
#print line
data,cksum,calc_cksum = checksum(line)
#print cksum
#print calc_cksum
if cksum == calc_cksum:
#print "GPRMC-------------"

print "Tempo: " + gpsstring[1]
#print "Stato: " + gpsstring[2]
print gpsstring[3][:2]
print gpsstring[3][2:]
print gpsstring[5][:3]
print gpsstring[5][3:]

  lat_d = float(gpsstring[3][:2])+(float(gpsstring[3][2:])/60)
lon_d = float(gpsstring[5][:3])+(float(gpsstring[5][3:])/60)
  print "Lat:  " + gpsstring[3]+gpsstring[4]
  print "Long: " + gpsstring[5]+gpsstring[6]
print str(lat_d)
print str(lon_d)
  #print "Nodi: " + gpsstring[7]
print "Data : "+ gpsstring[9]
#print "Checksum : "+ gpsstring[12]
#print "------------------\n"
f.write(gpsstring[1]+";"+str(lat_d)+";"+str(lon_d)+"\n")




#if gpsstring[0] == '$GPGGA' :
#print "GPGGA-------------"
#print  line
  #print "Tempo :  " + gpsstring[1]

  #print "Lat:  " + gpsstring[2]+gpsstring[3]
  #print "Long: " + gpsstring[4]+gpsstring[5]
#print "Fix: " + gpsstring[6]
#print "Satelliti in vista: " + gpsstring[7]
#print "HDOP: " + gpsstring[7]
#print "Altezza: " + gpsstring[8]
#print "------------------\n"




#if gpsstring[0] == '$GPGSA' :
#print "GPGSA-------------"
#print  line
  #print "PDOP: " + gpsstring[14]
  #print "HDOP: " + gpsstring[15]
  #print "VDOP: " + gpsstring[16]
#print "------------------\n"




        # empty the olddata variable now we have
        # used the data.
        olddata = ""
      # else we need to keep the line to add to data
      else :
        olddata = line
-----------------------------------------------------------------------
Il sensore GPS acquisisce una volta al secondo (sembra impossibile modificare tale valore) in un formato gradi, minuti, decimi di minuto. I dati vengono salvati su file con ora,latitudine,longitudine

Per vedere la fluttuazione del segnale e' stata fatta una prova con una acquisizione di 10 minuti in condizioni non ottimali (il sensore era posto sul davanzale di una finestra e riusciva a vedere solo la meta' del cielo)

In figura sono riportati i punti delle varie misure ed in rosso il valore della misura media. La distribuzione lungo un solo asse e' da imputare alla visione del cielo da parte del sensore


giovedì 26 gennaio 2012

webView su Android per Python


Python per SL4A e' un linguaggio completo ma con scarso controllo sulla grafica dell'output
Per poter avere una interfaccia utente piu' completa (al di la' della schermata terminale) si puo' usare il controllo di webView che permette di impaginare la schermata come una pagina html

di seguito un esempio minimale

--------------------------------------------------------------------------------------------------------------------
import time
import android
from string import Template
pagina = '''<html><body>
<h1>Contatore</h1>
<ul>
<li><strong>Contatore: $contatore</li>
</ul>
</body></html>'''
if __name__ == '__main__':
    droid = android.Android()
    contatore = 1
    while contatore < 10:
        f = open('/sdcard/sl4a/scripts/contatore.html', 'w')
        s = Template(pagina)
        modifica = s.safe_substitute(contatore=str(contatore))
        f.write(modifica)
        f.close()
        droid.webViewShow('file:///sdcard/sl4a/scripts/contatore.html')
        time.sleep(1)
        contatore = contatore + 1

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


pagina e' una stringa che contiene il codice html piu' un tag speciale $contatore che sara' sostituito in modo dinamico durante l'esecuzione dello script.
In pratica la stringa Html diventa un template che viene modificato per sostituzione del tag speciale con il valore desiderato; il template poi viene riconvertito in stringa e poi salvato su file che sara' visualizzato da webView
E' possibile impaginare anche mediante css

Attenzione: se si perde il controllo dello script e' difficile interromperlo perche' sara' visualizzato a pieno schermo la finestra di webView

martedì 24 gennaio 2012

Calcola tempo passato in Python

il secondo pezzo che mi manca per calcolare la velocita' (nel post precedente era stata definita la distanza) e' quello di calcolare il tempo intercorso con l'approssimazione dei centesimi di secondo

scritto in Python il sistema e'
--------------------------------------------------------------------------------

import time


a = time.time()
time.sleep(1)
b = time.time()
print b - a

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

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...