martedì 17 gennaio 2012

Creare progetti Android con Eclipse/ADT

Per creare un nuovo progetto Android con Eclipe/ADT si clicchi su File/New/Other/Android Project

Compare quindi la schermata sottostante


in cui Project Name si puo' inserire il nome UDPClient (meglio non usare spazi..non si mai)
in Application Name si puo' inserire il nome in formato libero (spazi,virgole)
in Package Name si deve utilizzare le convenzioni Java per cui il nome puo' essere com.udp.client
in Activity Name si deve inserire il nome della classe che verra' generata in questo caso udpclient


Errori di Eclipse ADT nella creazione di un progetto

lasciando da parte Python sono tornato a rivedere un po' Eclipse e Java mi sono ritrovato con due errori nella fase di creazione di un nuovo progetto mi sono imbattuto in

Debug certificate expired in 03/01/2012.....

che si risolve cancellando il file /.android/debug.keystore (soluzione ripresa da qui) e probabilmente dovuta al fatto che non usavo piu' Eclipse da molto tempo

altro errore
Unable to open class file......R.java
la soluzione (qui) consiste nell'aprire e richiuedere Eclipse oppure cliccare sul progetto nel package explorer sulla sinistra con tasto destro/Source/Format

un altro problemino che0 ho riscontrato (forse a causa di una vecchia versione di ADT) e' che il plug-in cerca il file adb nella directory tools dell'SDK mentre nelle versioni piu' recenti e' stato spostato sotto platform-tools. Si puo' risolvere in modo un po' brutale copiando il file adb nella directory tools

lunedì 16 gennaio 2012

Pygame for Android - Trackpad

Un esempio per usare il telefono come trackpad.
Non ho trovato nell'installazione di Python una funzione si legasse agli eventi del touchscreen cosi' mi sono orientato alla versione di Pygame per Android



sul cellulare ho fatto girare questo script
--------------------------------------------------------------------------------------------------
import pygame
import android
import socket

hostname = "192.168.0.1"; 
port = 21567;
data = "";
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM);
s.connect((hostname,port));

FPS = 10
TIMEREVENT = pygame.USEREVENT

pygame.init()
screen = pygame.display.set_mode((240, 320))
android.init()
android.map_key(android.KEYCODE_BACK, pygame.K_ESCAPE)
pygame.time.set_timer(TIMEREVENT, 1000 / FPS)
while True:
ev = pygame.event.wait()
if android.check_pause():
android.wait_for_resume()
        if ev.type == pygame.MOUSEMOTION:
#print "pos (%d,%d)" % ev.pos
s.send(str(ev.pos[0])+";"+str(ev.pos[1]))
        elif ev.type == pygame.KEYDOWN and ev.key == pygame.K_ESCAPE:
            break

------------------------------------------------------------------------------------------
a differenza di Py4A, per Pygame si deve creare una directory pygame sulla SD e creare una directory per ognuno degli script che si devono testare. All'interno di questa directory si deve inserire un file icona, il file script che si deve necessariamente chiamare main.py ed un file denominato anrdroid.txt (per i dettagli consultare il sito)

A differenza di Py4A non e' possibile importare in modulo bluetooth per cui lo scambio dati e' avvenuta in UDP

Di seguito il programma server che replica a computer i movimenti del dito su telefono
-----------------------------------------------------------------------------------------
import string
from socket import *
import pygame

pygame.init()
size=[240,320]
screen=pygame.display.set_mode(size)
clock=pygame.time.Clock()


host = "192.168.0.1"
port = 21567
buf = 1024
addr = (host,port)

UDPSock = socket(AF_INET,SOCK_DGRAM)
UDPSock.bind(addr)

while 1:
data,addr = UDPSock.recvfrom(buf)
if not data:
print "Client has exited!"
break
else:
valori = string.split(data,";")
screen.set_at((int(valori[0]), int(valori[1])), (255,0,0))
pygame.display.flip()

UDPSock.close()








Conversione MOV to MPEG su Linux

per convertire i file filmato della fotocamera in un formato gestibile da Youtube si puo' fare

mencoder -of mpeg -ovc lavc -lavcopts vcodec=mpeg1video -nosound input.mov -o output.mpg

Log su Android

Per vedere il log delle attivita' del terminale Android si puo', collegando il cavo dati al PC, digitare il comando

adb logcat

per vedere solo i log generati da Python si puo' scrivere invece

adb logcat -s python:*

Datalogger su Bluetooth

Esempio di comunicazione via Bluetooth
Per funzionare si deve caricare sia sul telefono che sul computer la libreria PyBluez.
Per il telefono si deve seguire la procedura per importare i moduli di Py4a e quindi si deve scaricare il file .egg da posizionare poi nella directory download della scheda SD
Per la libreria sul computer ho riscontrato che scaricando i file tgz ed eseguendo python setup.py install si genera un errore di compilazione su gcc. Per questo motivo ho installato il pacchetto Debian gia' compilato python-bluez
----------------------------------------------------------------------------------------------------------------------------
# file: rfcomm-server.py
# auth: Albert Huang <albert@csail.mit.edu>
# desc: simple demonstration of a server application that uses RFCOMM sockets
#
# $Id: rfcomm-server.py 518 2007-08-10 07:20:07Z albert $


from bluetooth import *


server_sock=BluetoothSocket( RFCOMM )
server_sock.bind(("",PORT_ANY))
server_sock.listen(1)


port = server_sock.getsockname()[1]


uuid = "94f39d29-7d6d-437d-973b-fba39e49d4ee"


advertise_service( server_sock, "SampleServer",
                   service_id = uuid,
                   service_classes = [ uuid, SERIAL_PORT_CLASS ],
                   profiles = [ SERIAL_PORT_PROFILE ], 
#                   protocols = [ OBEX_UUID ] 
                    )
                   
print "Waiting for connection on RFCOMM channel %d" % port


client_sock, client_info = server_sock.accept()
print "Accepted connection from ", client_info


try:
    while True:
        data = client_sock.recv(1024)
        if len(data) == 0: break
        print "%s" % data
except IOError:
    pass


print "disconnected"


client_sock.close()
server_sock.close()
----------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------

# file: rfcomm-client.py
# auth: Albert Huang <albert@csail.mit.edu>
# desc: simple demonstration of a client application that uses RFCOMM sockets
#       intended for use with rfcomm-server
#
# $Id: rfcomm-client.py 424 2006-08-24 03:35:54Z albert $


from bluetooth import *
import sys
import android
import time
import math


addr = None


droid = android.Android();
droid.startSensingTimed(1,1000)
time.sleep(3)


uuid = "94f39d29-7d6d-437d-973b-fba39e49d4ee"
service_matches = find_service( uuid = uuid, address = addr )


if len(service_matches) == 0:
    print "couldn't find the SampleServer service =("
    sys.exit(0)


first_match = service_matches[0]
port = first_match["port"]
name = first_match["name"]
host = first_match["host"]


sock=BluetoothSocket( RFCOMM )
sock.connect((host, port))


print "Connesso"
while True:
az = str(math.degrees(droid.sensorsReadOrientation().result[0]))
pitch = str(math.degrees(droid.sensorsReadOrientation().result[1]))
roll =  str(math.degrees(droid.sensorsReadOrientation().result[2]))
    data = az+";"+pitch+";"+roll
    if len(data) == 0: break
    sock.send(data)


sock.close()

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

Datalogger in UDP


L'ennesima versione del datalogger che usa il protocollo UDP per scambiare i dati
-----------------------------------------------------------------------------------------------------
import android
import socket
import time
import math




droid = android.Android();




hostname = "192.168.0.1"; 
port = 21567;
data = "";
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM);
s.connect((hostname,port));


droid.startSensingTimed(1,1000)
time.sleep(3)
while True:
az = str(math.degrees(droid.sensorsReadOrientation().result[0]))
pitch = str(math.degrees(droid.sensorsReadOrientation().result[1]))
roll =  str(math.degrees(droid.sensorsReadOrientation().result[2]))
s.sendto(az+";"+pitch+";"+roll,(hostname,port));
-----------------------------------------------------------------------------------------------------
# Server program

import string
from socket import *

host = "192.168.0.1"
port = 21567
buf = 1024
addr = (host,port)

UDPSock = socket(AF_INET,SOCK_DGRAM)
UDPSock.bind(addr)

while 1:
data,addr = UDPSock.recvfrom(buf)
if not data:
print "Client has exited!"
break
else:
valori = string.split(data,";")
print valori[0]
print valori[1]
print valori[2]

# Close socket
UDPSock.close()

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