O exemplo proposto simula o movimento de uma bola na tela utilizando o acelerômetro encontrado em alguns dispositivos como o Nokia N95. Os dados recebidos pelo acelerometro são tratados e convertidos para coordenadas da tela. Utiliza-se uma lista circular para reduzir possíveis distorções dos dados e para conversão destes dados em coordenadas de tela utiliza-se o algoritmo proposto por
Jouni Miettunen.
import sensor
import e32
import appuifw
import graphics
BOLA_RAIO = 10
TAMANHO_BUFFER = 16
class RingBuffer:
def __init__(self, size):
self.data = [0 for i in xrange(size)]
def append(self, x):
self.data.pop(0)
self.data.append(x)
def media(self):
soma = 0
media = 0
while soma < len(self.data):
media = media + self.data[soma]
soma = soma + 1
return media/TAMANHO_BUFFER
class Acelerometro:
def __init__(self):
self.lista_sensores = sensor.sensors()
self.buffer_x = RingBuffer(TAMANHO_BUFFER)
self.buffer_y = RingBuffer(TAMANHO_BUFFER)
def iniciar_sensor(self):
if self.lista_sensores.has_key('AccSensor'): # verifica se o acelerometro esta presente
self.dados_sensor = self.lista_sensores['AccSensor']
self.acc_sensor = sensor.Sensor( self.dados_sensor['id'], self.dados_sensor['category'] )
self.acc_sensor.set_event_filter( sensor.EventFilter() ) # determina o filtro para os dados do acelerometro
self.acc_sensor.connect( self.tratar_dados ) # callback que recebera os dados do acelerometro
def tratar_dados(self, dados):
self.buffer_x.append( dados['data_2'] )
self.buffer_y.append( dados['data_1'] )
class Bola:
def __init__(self):
self.coordenadas = [100, 140, 120, 160]
self.cor = (255,0,0)
class App:
def __init__(self):
self.app_estado = 1
self.temporizador = e32.Ao_timer()
self.bola = Bola()
self.acelerometro = Acelerometro()
appuifw.app.screen = 'full'
self.canvas = appuifw.Canvas()
appuifw.app.body = self.canvas
appuifw.app.exit_key_handler = self.sair
self.img_buffer = graphics.Image.new( self.canvas.size )
def iniciar(self):
self.acelerometro.iniciar_sensor()
self.loop()
def loop(self):
while self.app_estado:
self.gerar_coordenadas_bola()
self.desenhar()
self.temporizador.after(0.01)
def desenhar(self):
self.img_buffer.clear()
self.img_buffer.ellipse( self.bola.coordenadas, fill = self.bola.cor )
self.canvas.blit(self.img_buffer)
def gerar_coordenadas_bola(self):
self.bola.coordenadas[0] = self.definir_coordenada(self.acelerometro.buffer_x.media(), self.canvas.size[0])
self.bola.coordenadas[1] = self.definir_coordenada(self.acelerometro.buffer_y.media(), self.canvas.size[1])
self.bola.coordenadas[2] = self.bola.coordenadas[0] + (BOLA_RAIO*2)
self.bola.coordenadas[3] = self.bola.coordenadas[1] + (BOLA_RAIO*2)
def definir_coordenada(self, dados_acc, dimensao_tela):
return dimensao_tela - ((dados_acc + 300) * dimensao_tela)/600
def sair(self):
self.app_estado = 0
self.canvas = None
aplicacao = App()
aplicacao.iniciar()