Este artigo foi traduzido por máquina.

Windows Mobile e acelerômetros

Agite e pule para interagir com suas músicas

Chris Mitchell
Baixar o código de exemplo

O Sensor G ou accelerometer, está se tornando um grampo no arsenal de desenvolvimento móvel rapidamente.Os dispositivos Windows Mobile associou a matriz de gadgets oferecendo recursos que permitem que os desenvolvedores fazer tudo de determinar a freqüência alguém cai seu telefone para permitir que os usuários controlar aplicativos e jogos por inclinar, sacudindo, atingindo ou emitir seus telefones sobre — a última ação precisa talvez um aviso de isenção Íntegro anexado.Este artigo analisa como acessar e usar dados accelerometer com um losango HTC para reprodução de música de controle, para que o telefone ignora faixas no Windows Media Player Mobile quando um usuário shakes-lo.

Porque o uso de accelerometers é uma nova área de desenvolvimento para o Windows Mobile e para manter com a finalidade geral do artigo, eu escrito o aplicativo arrasar ’n ignorar (mostrada na Figura 1) para que seja fácil de determinar como iniciar, obter dados e feche o sensor, bem como alterar função ’s o aplicativo de exemplo com algumas linhas de código.O aplicativo discutido neste artigo pode ser facilmente recoded para abrir um navegador da Internet, bloquear o dispositivo ou fazer mais nada que você quiser tentar, todos com mínimo esforço de codificação.Além disso, o aplicativo tem um agente de log que permite a saída bruta do sensor para serem exibidas para que outras técnicas de detecção além o algoritmo de detecção de arrasar simples descritas aqui podem ser desenvolvidas.Esses algoritmos podem abranger a detecção de outros gestos de telefone para controlar seus aplicativos e jogos.

Você pode ler mais sobre o desenvolvimento com o accelerometer Diamond HTC em blog.enterprisemobile.com/2008/07/using-htc-diamonds-sensor-sdk-from-managed-code/.Observe que o código neste artigo funciona com losango HTC e outros dispositivos HTC, mas não irá funcionar com outros telefones.


A Figura 1As capturas de tela do aplicativo arrasar ' n ignorar (esquerda) e controlado Windows
Media Player Mobile (à direita).

Discussão de aplicativo

O arrasar ‘ n ignorar aplicativo precisa executar várias tarefas.Primeiro, ele precisa obter as informações mais atualizadas periodicamente no sensor.Em segundo lugar, ele precisa englobar uma métrica que possa detectar se o telefone está sendo shaken.Em terceiro lugar, se o aplicativo determina que o telefone está sendo shaken, ele precisará executar a ação relevante, que neste exemplo é fazer com que um media player do Windows Mobile pular para a próxima faixa.No aplicativo de exemplo, simulo pressionamentos de teclas para iniciar e controlar o Windows Media Player.Esse método permite que você controle muita funcionalidade ’s o telefone, retornar à tela inicial, bloquear o dispositivo ou iniciar qualquer aplicativo.

Muitos dos aplicativos que usam accelerometers estiverem fazendo uma nova concessão em até aplicativos e jogos mais antigos.Por exemplo, Labyrinth, um jogo em que você move uma bola ao redor em um quadro mazelike, tentando obter através do Labirinto sem implantar a bola em um buraco, tem sido ao redor por um longo tempo.Um brinquedo Labyrinth foi patenteado como tempo atrás 1891 por S.D.NIX.Qualquer pessoa pensar ele preocupado com suficiente MIPS sobressalentes para executar seu aplicativo, ou que ele investigados usando controle de vibração para simular uma bola atingindo o lado do Labirinto alguns velocidade?Muitos dos aplicativos usar o accelerometer de diferentes maneiras para criar uma nova interface atraente para o telefone e também podem combinar o accelerometer com outras saídas para criar algumas experiências do usuário muito atraente.

Accelerometers

Uma definição rápida para obter nós iniciado: um accelerometer é um sensor mede aceleração, a taxa de alteração na velocidade longo do tempo.Velocidade é descrita usando um vetor, que, ao contrário de um escalar, tem uma magnitude e uma direção — algo que ’m se você se lembrar de física 101.

TH ere são muitos tipos de erent de comparação de accelerometers, de um tubo de água com um bolhas ar que mostra a direção de aceleração para os tipos de circuito integrado trabalhamos com em telefones móveis.Losango HTC usa um MEMS (Micro-monitor sistema mecânico) - com base accelerometer, um tipo que formulários pequenas estruturas com dimensões na escala de micrometer (um millionth de um medidor de).A maioria dos telefones no mercado fazer assim.No telefone, um accelerometer três eixos fornece orientação, que indica se o telefone é opostas cima ou para baixo, se o telefone está permanente backup com a tela em direção a você ou se é cabeça para baixo com a tela e todas as combinações intermediária.TH e orientação do telefone em qualquer ponto pode ser descrita com os seguintes três valores:

  1. TiltX ou rotação;0 é fl no.Mede a rotação ao redor o centro do telefone que esteja executando lengthwise de parte boca para o earphone.
  2. TiltY ou densidade;0 é fl no.Mede a rotação ao redor o centro do telefone executando widthwise pela tela.
  3. TiltZ (não guinada);0 é imediatamente para cima, o sinal de subtração (-) é simples e o sinal de mais (+) de cabeça para baixo.Essas medidas podem ser vistas mais claramente Figura 2, que mostra a saída não processada juntamente com o eixo.Tenha em mente que esses três valores juntos formam um vetor que mostra a direção da gravidade.


Figura 2 A gráfico Mostrar saída de Accelerometer para uma posição de telefone

Agora precisamos detectar quando o telefone está sendo shaken e, nesse caso, para emitir um comando para ignorar uma faixa no Windows Media Player.

Componentes de sistema

TH e arrasar ‘ n ignorar aplicativo não está hospedando o player de mídia do Windows Mobile, nem o aplicativo hospedado em algum tipo de plug-in, apesar de um plug-in está a opção óbvia para redistribuição.O aplicativo é escrito como um formulário e móvel simples, para que possa reutilizar o aplicativo para várias finalidades erent de comparação e teste suas próprias idéias de como você pode usar o accelerometer.O aplicativo permite que você dados ’s sensor para um arquivo log que você pode, em seguida, testar off-line para ver quanto trabalho suas idéias de algoritmo de saída.Figura 3 mostra o fluxo lógico do aplicativo.


Figura 3 Fluxo de sistema para monitoramento e alertas de tarefas com reconhecimento de local

Componente de sensor ’s o aplicativo é composto de uma única função que leva uma referência a uma estrutura e retorna os valores na estrutura de.TH é sensor componente é chamado em um timer periódico.No aplicativo, o timer é definido para chamar essa função cada 100 milissegundos.Tome cuidado se você alterar este valor porque você poderia acabar com alias eff etos se o valor for definido muito baixo.O algoritmo de detecção de arrasar também é composta de uma única função que leva os dados mais recentes retornados do componente de sensor.TH e arrasar algoritmo compara a distância Euclidean (descrita posteriormente) entre os dados de sensor últimos e os dados mais recentes do sensor.Em seguida, determina, usando um limite, se um arrasar foi detectada durante um número de conjunto de comparações.O número de comparações com êxito necessária para detectar um arrasar é determinado por duas entradas: detectar janela e redefinir a janela.Depois que um arrasar foi detectado, o componente de comando condicionalmente chama duas funções, dependendo do modo de operação selecionado na interface: KeyCommand para aplicativo ou agente de log.KeyCommand para o aplicativo usa um aplicativo chamado Wmplayer.exe e uma chave de telefone para simular que está sendo pressionado.O agente de log registra os dados do accelerometer para Gsensorlog.txt, um arquivo colocado na raiz de armazenamento ’s seu telefone.Para manter a simplicidade, adicionei a classe para o aplicativo ao mesmo espaço para nome criado pelo Visual Studio.O espaço para nome contém a classe padrão herdada da classe formulário que contém a interface do usuário.

Componentes do sistema — G-sensor

O acesso a dados ’s accelerometer requer a chamada de um ambiente translation from VPE for Csharp gerenciado para a DLL não gerenciada fornecida no HTC telefones que consulta o sensor e fornece os dados.Essa chamada de sensor requer três partes para ser definido up.The primeira parte é uma estrutura que é empacotada e armazena as informações necessárias de rotina principal que chama a DLL não gerenciada.As variáveis AngleY e AngleX não são usadas no aplicativo, mas retorna o número de graus para seus respectivos planos.

//Data structure passed to sensor query api
public struct SensorData
{
public short TiltX;
public short TiltY;
public short TiltZ;
public short Unknown1;
public int AngleY;
public int AngleX;
public int Unknown2;
};

Várias chamadas de PInvoke são necessários, como você pode ver no código a seguir. Vale a pena observar que, se você desejar acessar uma função de DLL externa, como CreateEvent, mas a função está listada como usando User32 como a DLL, você pode substituir User32 com Coredll no Windows Mobile em um grande número de situações e a chamada ainda funcionará.

[DllImport("HTCSensorSDK")]
extern static IntPtr HTCSensorGetDataOutput(IntPtr handle,
out SensorData sensorData);
[DllImport("HTCSensorSDK")]
extern static IntPtr HTCSensorOpen(int sensor);
[DllImport("HTCSensorSDK")]
extern static void HTCSensorClose(IntPtr handle);
[DllImport("coredll", SetLastError = true)]
extern static IntPtr CreateEvent(IntPtr eventAttributes, bool
manualReset, bool intialState, string name);
[DllImport("coredll", SetLastError = true)]
extern static bool EventModify(IntPtr handle, uint func);
[DllImport("coredll")]
extern static bool CloseHandle(IntPtr handle);


Figura 4. Um gráfico exibição alterar distância Euclidean sobre dois Shakes

 
Figura 5. Um gráfico mostrando alterações para TiltX (azul), TiltY (vermelho) e TiltZ (verde) por dois Shakes

A parte final de obter os dados é chamar as funções mostradas no exemplo a seguir de código e passar a estrutura SensorData para manipular os dados. O objeto de sincronização de chamada de CreateEvent informa OS que HTC_ GSENSOR_SERVICESTART deve ocorrer antes que o thread poderá continuar em execução. Quando esse evento ocorre, o thread novamente pode ser agendado para tempo de CPU. Depois que estiver agendado, o segmento continua em execução. Segmento do aplicativo agora está sincronizado com o evento de sensor.

public void GetSensorData(ref SensorData data)
{
//Initialise and start sensor
IntPtr Handle = HTCSensorOpen(1);
IntPtr hEvent = CreateEvent
(IntPtr.Zero, true, false, "HTC_GSENSOR_SERVICESTART");
EventModify(hEvent, 3);
CloseHandle(hEvent);
HTCSensorGetDataOutput(Handle, out data);
return;
}

Componentes do sistema — sacuda algoritmo

Agora que as informações de sensor podem ser obtidas, precisamos fi nd um algoritmo que permite detectar um arrasar usando esses dados.

O raciocínio por trás o desenvolvimento do algoritmo de fica assim: Aperto de um telefone cria alteração rápida na direção da gravidade em relação ao eixo ’s o telefone. Isso significa deveremos ver rápida alteração nos valores TiltX TiltY e TiltZ e se é definir um valor limite para determinar quando ocorre alteração rápida o suficiente, nós deve ser capazes fi lter saída movendo lento alterar — por exemplo, responder ou o telefone de separação em vez de sacudindo.

Entretanto, ainda precisamos uma medida para detectar a alteração rápida. A maneira mais óbvia é examinar a distância medida entre dois conjuntos de dados. Se a distância for maior do que um determinado valor, podemos dizer que a alteração está ocorrendo rapidamente.

Fornecido a distância é calculada como

Distância Euclidean é uma métrica de distância simples que ’ve usei para medir a alteração rápida. TH e cálculo leva as saídas de accelerometer nos últimos três eixos e compara o resultado com o resultado atual . No entanto, descartando o telefone muito ou pressionar o telefone pode também gerar uma alteração rápida, portanto, precisamos inserir também um recurso de tempo no algoritmo para garantir que somente um arrasar protracted irá disparar o componente de detecção de arrasar.

Figura 6 Principal função de detecção de arrasar

public bool DetectShake(SensorDataOld dataold, SensorData datanew,
int threshold, int detectwindow, int resetwindow)
{
if (FirstTimeEntryFlag != 0)
{
//Convert values to use inbuilt Math library
double Xold = Convert.ToDouble(dataold.TiltX);
double Yold = Convert.ToDouble(dataold.TiltY);
double Zold = Convert.ToDouble(dataold.TiltZ);
double X = Convert.ToDouble(datanew.TiltX);
double Y = Convert.ToDouble(datanew.TiltY);
double Z = Convert.ToDouble(datanew.TiltZ);
//Set new values to old
dataold.TiltX = datanew.TiltX;
dataold.TiltY = datanew.TiltY;
dataold.TiltZ = datanew.TiltZ;
//Calculate Euclidean distance between old and data points
double EuclideanDistance = Math.Sqrt(Math.Pow(X - Xold, 2)
+ Math.Pow(Y - Xold, 2)
+ Math.Pow(Y - Yold, 2));
//Set shake to true if distance between data points is
//greater than the defined threshold
if (EuclideanDistance > threshold)
{
DetectWindowCount++;
if (DetectWindowCount > detectwindow)
{DetectWindowCount = 0; ResetWindowCount = 0; return true;}
}
else
{
ResetWindowCount++;
if (ResetWindowCount > resetwindow)
{DetectWindowCount = 0; ResetWindowCount = 0; return false;}
}
}
//No longer the first run.
FirstTimeEntryFlag = 1;
return false;
}

Chaves e códigos de chave para o Windows Mobile

Há muitos bastante sofisticados ações que podem ser executadas em dispositivos Windows Mobile com programação mínimo simulando pressionamentos de teclas. Deseja mostrar a tela hoje? Deseja responder a uma chamada ou bloquear seu telefone? O mesmo comando pode ser usado para todos os três. Windows Mobile mantém um modelo de teclado independentes device– que permite que oferecem suporte a uma variedade de teclados. No nível mais baixo, cada tecla no teclado gera um código de verificação quando a chave é pressionada e liberada. O código de verificação é um hardware–dependent número que es identifi a chave. O driver de teclado converte ou mapeia cada código de verificação para um código de tecla virtual. O código de chave virtual é um hardware–independent número hexadecimal que es identifi a chave.

const int KEYEVENTF_KEYUP = 0x02;
const int KEYEVENTF_KEYDOWN = 0x00;
keybd_event(VK, 0, KEYEVENTF_KEYDOWN, 0);
keybd_event(VK, 0, KEYEVENTF_KEYUP, 0);

Responda a uma chamada:

byte VK = 0x72; // Simulate answer phone call being pushed.

Dispositivo de bloqueio:

byte VK = 0x85; // Simulate phone being locked.

Vá para a home page:

byte VK = 0x5B; // Simulate home key being pressed.

Para obter mais informações, consulte msdn.microsoft.com/library/bb431750.aspx

Como você pode ver na Figura 4, uma distância constante grande e (mais importante) valor comparação erentiates o telefone que está sendo shaken de sua posição normal repouso. Se você examinar Figura 5, você verá os valores correspondentes do sensor. Você poderá ver que o telefone foi shaken com a tela opostas para cima. A alteração no TiltX é causada por meu pulso torção para sacuda o telefone, enquanto o valor TiltY alterado muito pouco porque o telefone foi mantido principalmente simples ao posicionar e quando sendo shaken. O código no Figura 6 mostra o cálculo de distância Euclidean e a estratégia para determinar quando o telefone tenha sido shaken.

Um outro recurso do algoritmo que vale a pena mencionar é a contagem de redefinição. Descobri que era útil não apenas para exigir vários valores consecutivos mas também permitem que dois valores altos seguidos por um pequeno seguido de outro grande para disparar a detecção de arrasar — três consecutivos altos valores separados por um valor baixo. Para lidar com situações como essas, usei dois contadores em vez de um. A primeira conta para o número de valores altos Euclidean detectado acima do limite necessário. A segunda mantém uma contagem de redefinição zerada no ponto de uma grande alteração detecção e pode redefinir a contagem inteira se um determinado número de grandes alterações não é detectado consecutivamente após a última alteração grande. E agora que temos uma métrica que pode ser usada para determinar se um telefone está sendo shaken, precisamos saber o que fazer com essas informações e o que pode controlar.

Assista a arrasar ‘ n ignorar vídeo

Para ver como o arrasar ‘ n ignorar aplicativo funciona, você pode assistir um vídeo está disponível com a versão online deste artigo em https://code.msdn.microsoft.com/.

Componentes de sistema – controle ignorar

Como mencionei anteriormente, um dos motivos para construir o aplicativo como um formulário e aplicativo é ter a certeza de que o aplicativo pode ser reutilizado tanto quanto possível. Para continuar este strand de simplicidade, usei uma técnica específica para Windows Mobile media player que envolvidos simulando controles de teclado que podem ser usados para obter um número de atividades do controle. (Consulte a barra lateral, chaves e Keycodes para o Windows Mobile.) Essa técnica é associada com o uso do namespace diagnóstico do sistema para garantir que o aplicativo é iniciado e o forefront do modo de exibição no dispositivo Windows Mobile. ’S aqui o código que inicia um aplicativo e simula um pressionamento de tecla no dispositivo.

public void KeyCommandForApplication(string FileName, byte VK)
{
System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo.FileName = FileName;
p.Start();
const int KEYEVENTF_KEYUP = 0x02;
const int KEYEVENTF_KEYDOWN = 0x00;
keybd_event(VK, 0, KEYEVENTF_KEYDOWN, 0);
keybd_event(VK, 0, KEYEVENTF_KEYUP, 0);
}

Resumindo

Tenho certeza de que o algoritmo usado aqui está um pouco simplista e provavelmente pode ser melhorado, mas em limitado teste as funções de aplicativo bem. É provável que aumentar TH e uso de accelerometers no desenvolvimento de aplicativos móveis. Quando isso é combinado com GPS móvel (consulte msdn.microsoft.com/magazine/dd315419.aspx ), sensores claros e outras entradas, novas e empolgantes interações com os aplicativos se tornam possíveis.

Muitas graças ao Scott Seligman e Koushik Dutta para suas páginas excelentes e código sobre como trabalhar com accelerometer ’s HTC. Também muitas graças a Craig, da bexmedia. NET para tornar a aparência de vídeo bom para mim.

Chris Mitchell concluir seu Ph.d. na máquina aprendizado música/som sinal processo e, em seguida, foi um fellow Kauffman/NCGE. Ele é atualmente envolvido em uma configuração de uma empresa de inicialização Cambridge, Reino Unido. Você pode contatar no chris.mitchell@anglia.ac.uk.