通过晃动选播您的音乐
在 G 的传感器,或 accelerometer,是快速成为该移动开发集中在一个书钉。Windows Mobile 设备已加入提供功能,让开发人员完成所有从确定有人频率除去他使用户能够控制应用程序和游戏 tilting、 shaking、 命中,或有关引发其电话的电话的小工具的数组最后一次操作可能需要附加一个正常免责声明。本文探讨了如何访问和电话跳过在 Windows Media Player移动跟踪用户 shakes 它时使 accelerometer 数据使用的 HTC 菱形,来控制音乐的播放。
因为 accelerometers 的使用是新的区域的开发 Windows Mobile,保留与相应的文章的一般用途,’ve 写入应用程序晃动 ’n 跳过 (显示为的图 1),使其很容易确定濡備綍鍚 姩,从获取数据和关闭该的感应器,以及更改示例应用程序已经使用的函数几行代码。在本文中讨论的应用程序可以很容易地被 recoded 打开 Internet 浏览器、 锁定设备,或做别的任何事情要尝试,所有与最小的编码工作。鍙 ﹀ 的方式 应用程序具有一个记录器,使原始感应器,以便可以开发简单晃动检测算法此处所述之外的其他检测技术查看输出。这样的算法可能会包含控制您的应用程序和游戏的其他电话笔势的检测。
您可以阅读更多有关使用 blog.enterprisemobile.com/2008/07/using-htc-diamondssensor-sdk-从的托管代码 在该 HTC 菱形 accelerometer 开发。请注意本文中的,代码在 HTC 菱形和其他 HTC 设备,但将不使用其他的电话。
图 1 (左) 晃动与跳过应用程序的屏幕快照并控制 Windows
媒体播放器移动 (右)。
讨论应用程序
在晃动 ‘ n 跳过应用程序需要执行几个任务。首先,它需要定期从感应器中获得最新的信息。第二个,它需要包括可以检测是否 shaken 电话的跃点数。第三个,如果应用程序决定电话被 shaken,则需要采取相关措施即在此示例中会导致 Windows Mobile 媒体播放机跳到下一曲目。在示例应用程序中我 ’ll 模拟启动并控制 Windows Media Player 的按键。此方法使您可以控制返回到主屏幕上的电话已经功能的很多,锁定设备,或启动任何应用程序。
许多应用程序使用 accelerometers 上较旧应用程序和游戏的生命周期为新租约。渚嬪的方式 Labyrinth,在其中您移动一个球 mazelike 棋盘, 尝试通过该迷宫无需滚动到一个的孔的球游戏已经很长时间。一个 Labyrinth 玩具是为长以前为 1891 patented 按 S。鏁扮爜鏁堟nix。任何人都不会认为他担心有足够的备用 MIPS 运行自己的应用程序或他调查使用 vibration 控件来模拟一个球在一些速度迷宫的一侧的命中吗?许多应用程序的不同方式来创建一个吸引人的新界面,用于电话使用该 accelerometer,也可以创建一些非常引人注目的用户体验的其他输出与组合在 accelerometer。
accelerometers
获取我们启动快速定义:一个 accelerometer 一个感应器衡量加速,更改时间之间的速度的速率。速度使用一个向量的与标量,不同一个量值和方向描述 — 我 ’m 确保您记得从物理学 101 的内容。
ere Th 很多的差异 erent 类型,accelerometers,从一个与我们在手机中使用集成电路类型显示的加速方向的空气气泡水管。HTC 菱形将使用一个 MEMS (微-Electro 机械系统) 的基于 accelerometer,一的类型窗体在 micrometer 缩放比例 (一个 millionth 的一个表中) 中的小结构的维度,用于。市场上的其他大多数电话以及执行操作。在电话,方向,该值指示是否电话面向上移或下移电话向您在屏幕上与位置还是上下离开,屏幕与和中间的所有组合,提供了一个三个轴 accelerometer。可以使用下面的三个值描述 Th 电子方向的任何时刻电话:
- TiltX 或回滚 ;在 fl 0。测量绕中心的运行纵向嘴段从该 earphone 电话。
- TiltY 或间距 ;在 fl 0。测量绕中心电话 widthwise 运行在屏幕上的旋转。
- TiltZ (不 yaw) ;0 是直接设置,减号 (-) 是平面,加号 (+) 是上下颠倒。这些措施可以在图 2,显示原始的输出与轴一起 中的更清楚地看到。请记住下列三个值一起构成一个向量,显示的引力方向。
图 2 图表从该 Accelerometer 的电话位置显示输出
现在,我们需要检测时,电话被 shaken 并在这种情况下,发出命令跳过 Windows Media Player中的一个跟踪。
系统组件
Th 电子晃动 ‘ n 跳过应用程序不承载 Windows Mobile 的媒体播放器,也不承载某些类型的插件,尽管插件在应用程序正在重新分发的明显的选择。应用程序是为简单移动 Win 表单写,因此可以用于许多不同 erent 重用应用程序并测试您自己的想法,为如何使用该 accelerometer。应用程序允许您感应器已经数据输出到一个日志文件可以然后测试脱机查看您算法的想法如何工作的。图 3 显示应用程序的逻辑流。
图 3 系统流的监视和警报的可识别位置的任务
应用程序已经感应器组件组成单个函数接受对结构的引用,并在该结构中返回的值。Th 是一个定期计时器上称为感应器组件。在该的应用程序调用此函数每 100 毫秒为单位设置计时器。如果您更改此值,因为您可以得到别名 eff ects 如果设置得过低的值要小心。晃动算法妫 € 娴嬪也组成一个采用最新数据从感应器组件返回的函数。Th 电子晃动算法进行比较,Euclidean 距离 (稍后介绍) 上一次传感器数据最新的传感器数据。然后确定,是否通过比较一组数已检测到一个晃动使用一个的阈值。成功检测到一个晃动所需的比较的两个输入的决定:检测窗口,并重新设置窗口。已检测到一个晃动后,该命令的组件有条件地调用取决于该接口上所选操作的模式的两个函数:为应用程序或记录器 KeyCommand。KeyCommand 的应用程序的应用程序需要命名 Wmplayer.exe 和电话密钥,以模拟被按下。记录器 Gsensorlog.txt,文件放在您的电话已经存储的根以将数据记录从该 accelerometer。为简单起见,添加同一命名空间创建 Visual Studio 的应用程序类。命名空间包含默认类继承窗体保存在用户界面的类。
绯荤粺缁勪欢 — G 的传感器
访问 accelerometer 已经数据需要从托管的 C# 环境调用非托管 DLL HTC 电话上提供的查询感应器提供数据。此感应器的调用需要三个部分设置 up.The 第一部分是封送并存储从主例程的调用非托管的 DLL 所需信息的结构。变量 AngleY 和 AngleX 将都没有在应用程序中使用,但返回到其各自的平面的度为单位的数量。
//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;
};
在下面的代码中可以看到,也需要几个 Pinvoke 调用。值得注意,如果希望访问的外部的 DLL 函数,如 CreateEvent 但被列为 User32 用作 DLL 函数,可以用上在大许多情况下 Windows Mobile Coredll User32 替换调用仍然有效。
[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);
图 4。通过两个 shakes 显示 Euclidean 距离更改一个图表
图 5。一个图表,显示到 TiltX 更改 (蓝色),TiltY (红色) 和 TiltZ (绿色) 超过两个 shakes
获取数据的最后一部分是调用以下所示的函数代码,并传入 SensorData 结构来处理数据。CreateEvent 调用同步对象通知操作系统线程可以继续之前必须发生的 HTC_ GSENSOR_SERVICESTART 运行。该事件时再次可以安排线程的 CPU 时间。计划之后,该线程将继续运行。在应用程序线程现在感应器事件与同步。
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;
}
绯荤粺缁勪欢 — 晃动算法
现在,该感应器的信息可以获得我们需要 Fi 和使我们能够检测到一个晃动使用该数据的算法。
在考虑后面算法的开发进入如下:shaking 电话快速更改在中创建引力相对于电话已经轴的方向。 这意味着我们应该看到在 TiltX TiltY,TiltZ 值的快速更改,并且如果我们设置一个阈值,以确定发生足够快速的更改时,我们应该能够出降低的移动 Fi lter 更改 — 渚嬪的方式 应答或领料电话而 shaking。
但是,我们仍然需要检测快速更改量值。 最明显的方法是查看两组数据之间的距离。 如果距离大于某个值,我们可以说迅速发生更改。
给定 为计算距离
Euclidean 距离 ’ve 用于测量快速更改一个简单的距离度量。 Th 电子计算需要过去三个轴 accelerometer 输出 并将结果与当前的输出进行比较
. 但是,删除电话急剧或命中电话可能也生成快速更改,因此我们需要一次功能还插入该算法,以确保只有一个 protracted 的晃动将触发晃动检测组件。
图 6 的主晃动-检测函数
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;
}
项和 Windows Mobile 的键代码
有很多 相当复杂可以通过模拟键按下最小的编程的 Windows Mobile 设备上执行的操作。 要显示今日屏幕吗? 希望应答呼叫或锁定您的电话吗? 为所有三个,可以使用相同的命令。 Windows Mobile 维护一个使它可以支持各种键盘的 device– 独立键盘模型。 最低级别键盘上的每个键与扫描代码时将生成键按下并释放。 扫描代码是一个 hardware–dependent 编号的 identifi es 键。 键盘驱动程序转换或映射到虚拟键代码的每个扫描代码。 虚拟键代码是一个 hardware–independent 十六进制数字的 identifi es 键。
const int KEYEVENTF_KEYUP = 0x02;
const int KEYEVENTF_KEYDOWN = 0x00;
keybd_event(VK, 0, KEYEVENTF_KEYDOWN, 0);
keybd_event(VK, 0, KEYEVENTF_KEYUP, 0);
应答呼叫:
byte VK = 0x72; // Simulate answer phone call being pushed.
锁定设备:
byte VK = 0x85; // Simulate phone being locked.
请转到主页:
byte VK = 0x5B; // Simulate home key being pressed.
详细信息,请参阅 msdn.microsoft.com/en-us/library/bb431750.aspx
正如您可以从 图 4,一个大的和 (最重要的) 持续的距离值差异 erentiates 看到被从其普通的静止位置 shaken 电话。 如果您看了图 5,您将看到相应的感应器值。 您应该能够看到的电话被 shaken 向上朝该屏幕。 TiltX 更改是由我手腕 twisting 到摇电话,TiltY 值更改很小,因为电话已持有主要平面停留时和正在 shaken 而引起的。 在的图 6 中的该代码显示了 Euclidean 距离和电话已被 shaken 确定策略的计算。
值得一提算法的一个其他的功能是重置计数。 我发现它是很有用,不仅需要多个连续值但还允许两个高的值,后面跟有另一个大触发晃动检测的一个小 — — 一个较低值由分隔的三个连续的高值。 若要处理与这些类似的方案,我使用两个计数器而不是一个。 第一个所需数量的检测到超出阈值的高 Euclidean 值向上计数。 第二个保留零的一大更改检测,重置计数,并可以重置整个计数,如果给定的数目的较大的更改没有检测到连续在最后一个大的更改后。 而且,现在,我们已经有一个跃点数可用于确定是否 shaken 电话,我们需要知道如何使用此信息,它可以控制哪些内容。
观看该晃动 ‘ n 跳过视频
若要查看如何将晃动 ‘ n 的跳过应用程序工作可以监视与在 https://code.msdn.microsoft.com/ 本文的联机版本可用的视频。
系统组件跳过跟踪
我前面所述的一个原因构造应用程序作为 Win 窗体应用程序是确保应用程序可以重复使用尽可能。 若要继续此线的简单,我可以使用一种 Windows Mobile 媒体播放器涉及模拟键盘可用于实现大量活动控件的控件的特定技术。 (请参阅项和 Windows Mobile Keycodes 侧栏)。此方法与使用系统诊断以确保在启动应用程序的命名空间和在该视图在 Windows Mobile 设备上的 Forefront 联接。 此处 ’s 启动应用程序,并模拟设备上的按一键的代码。
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);
}
总结
我确定此处使用该算法是一些简单和可能可以提高,但下测试应用程序功能的有限好。 移动应用程序开发中 accelerometers Th 电子使用是可能会增加。 这与组合 (请参阅 msdn.microsoft.com/magazine/dd315419.aspx) 移动的 GPS,浅传感器和其他输入时, 应用程序的新的和令人兴奋交互就会成为可能。
由于与 Scott Seligman Koushik Dutta,它们很好的页面上使用的 HTC 已经 accelerometer 代码的很多。 此外多由于 Craig bexmedia。 使视频外观适合我的网络。
Chris Mitchell 完成他的女士 在计算机中学习音乐/声音通知进程,然后是一个 Kauffman/NCGE 家伙。 他是一个设置启动剑桥市,英国的公司中当前涉及。 您可以在 chris.mitchell@anglia.ac.uk 与他联系。