Работа с G - Sensor (акселерометром) на HTC C#
Недавно озадачился (в связи с приобретением девайса HTC HD2) а как же в нём, взять с акселерометра данные? И вот результат трудов, маленькая библиотека для доступа к G-Сенсору в HTC (теоретически должна подходить для всех HTC с акселерометром). Разумеется всё это с исходным кодом, используйте на ваше удовольствие в своих разработках.
Исходный код самой библиотеки:
using System;
using System.Linq;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
namespace htcGS
{
//Структура данных с сенсора
public struct SensorData
{
public short TiltX; // От -1000 до 1000, 0 лежит
public short TiltY; // От -1000 до 1000, 0 лежит
public short TiltZ; // От -1000 до 1000, 0 = стоит, -1000 = лежит, 1000 = перевёрнут
public short Unknown1; // Всегда ноль
public int AngleY; // От 0 до 359
public int AngleX; // От 0 до 359
public int Unknown2; // Непонятно что.
};
public class HTCGSensor : IDisposable
{
[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);
public void Dispose()
{
//Останавливаем...
IntPtr hEvent = CreateEvent(IntPtr.Zero, true, false, "HTC_GSENSOR_SERVICESTOP");
CloseHandle(hEvent);
}
public void GetSensorData(ref SensorData data)
{
//Инициализирует, стартует и принимает данные.
IntPtr Handle = HTCSensorOpen(1);
IntPtr hEvent = CreateEvent
(IntPtr.Zero, true, false, "HTC_GSENSOR_SERVICESTART");
EventModify(hEvent, 3);
CloseHandle(hEvent);
HTCSensorGetDataOutput(Handle, out data);
return;
}
}
}
Теперь как это всё использовать, исходный код программы которая работает с библиотекой:
using System;
using System.Linq;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using htcGS;
namespace SmartDeviceProject3
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//Запускаем таймер...
private void button1_Click(object sender, EventArgs e)
{
timer1.Enabled = true;
}
//Останавливаем всю эту беду и выходим из приложения.
private void button2_Click(object sender, EventArgs e)
{
timer1.Enabled = false;
htcGS.HTCGSensor nw = new HTCGSensor();
nw.Dispose();
Application.Exit();
}
//Это то что выполняем по таймеру (выводим параметры с G-Sensor-а)
private void timer1_Tick(object sender, EventArgs e)
{
SensorData sd = new SensorData();
htcGS.HTCGSensor nw = new HTCGSensor();
nw.GetSensorData(ref sd);
label1.Text = sd.TiltX.ToString();
label2.Text = sd.TiltY.ToString();
label3.Text = sd.TiltZ.ToString();
label4.Text = sd.AngleX.ToString();
label5.Text = sd.AngleY.ToString();
label6.Text = sd.Unknown1.ToString();
label7.Text = sd.Unknown2.ToString();
}
}
}
При нажатии на кнопку button1 программа включает таймер который начинает получать данные с акселерометра и выводить их на экран, по нажатии на button2 — программа выключает таймер и закрывает приложение.
Скачать приложения с исходниками можно здесь:
Скачать файл: htcgsensor.rar [50.94 Kb] (cкачиваний: 3)