Показать сообщение отдельно
Старый 02.11.2009, 16:56   #1
odd
Мастер
 
Аватар для odd
 
Регистрация: 06.09.2007
Адрес: Донецк, ДНР
Сообщений: 1,023
Написано 298 полезных сообщений
(для 713 пользователей)
Восклицание Lib_jsr256 - Работа с сенсорами телефона

Библиотека немного доработана. Теперь можно обращаться к любым сенсорам.

Для начала неплохо бы вызвать функцию get_version, которая вернет вам установленную на телефоне версию JSR256 или строку "null" если данный JSR там не установлен. Собственно, если вернется "null", то вызов других функций библиотеки может привести к зависанию приложения.

Следующим шагом неплохо бы получить весь список сенсоров, которые есть в телефоне. Для этого служит функция get_list, которая вернет результат в виде строки, разделенной символом "|" в формате:
имя_датчика|имя_сенсора|контекст|....

Мой телефон, к примеру, выдал такой список:

axis_x|acceleration|user
axis_y
|acceleration|user
axis_z
|acceleration|user
handsfree_presence
|com.sonyericsson.io.sensor.handsfree_presence|user
network_field_intensity
|network_field_intensity|device
battery_charge
|battery_charge|device
charger_state
|battery_charge|device
steps_per_minute
|com.sonyericsson.io.sensor.steps_per_minute|user
step_count
|step_count|user
keylock_status
|com.sonyericsson.io.sensor.keylock_changed|user 
Теперь давайте разбираться в списке.
Датчики axis_x, axis_y, axis_z принадлежат к сенсору acceleration,
а в сенсоре battery_charge содержится два датчика: battery_charge и charger_state.
Также есть счетчик шагов, датчик наличия гарнитуры и другие, но сейчас они меня мало интересуют.

Теперь, если я хочу получать данные от какого либо сенсора (не датчика!)
я вызываю функцию Init, которая принимает 3 параметра: имя сенсора, контекст сенсора и количество датчиков в сенсоре.

К примеру, мне нужно прослушать датчики сенсора акселерометра.
Тогда вызывать нужно так: Init('acceleration', 'user', 3); а для прослушивания датчика состояния батареи нужно вызывать: Init('battery_charge', 'device', 2);

Ну и конечно получить данные от датчика сенсора можно функцией get_value, которая принимает только номер датчика.

Таким образом, пример программы для прослушивания, к примеру, состояния батареи:

Program JSR256test;
Uses jsr256;
Var     
sString;
        
iinteger;
Begin
    s
:=get_list;
    
ShowForm;
    
i:=FormAddString(s); // Показ списка датчиков
    
Delay(100000); // 100 секунд я думаю хватит
    
ShowCanvas;
    
Init('battery_charge''device'2); // Подписываемся на прослушивание датчика заряда батареи
    
repeat
        SetColor
(255255255);
        
FillRect(00GetWidthGetHeight);
        
SetColor(000);
        
DrawText(''+get_value(0), 55);
        
DrawText(''+get_value(1), 525);
        
Repaint;
        
Delay(100);
    
until false;
End
Действительно, при запуске получим столбик из двух чисел: заряд батареи в процентах и 0 или 1 если подключено или отключено зарядное устройство.

Вот другой пример, черный шарик, который катается по экрану в зависимости от наклона аппарата:

Program JSR256test;
Uses jsr256;
Var 
xyxsysxayarreal;
Begin
    Init
('acceleration''user'3); // Опрашиваем 3 датчика
    
    
xs:=0ys:=0// Начальная скорость мячика
    
r:=30// Радиус шарика
    
x:=0y:=0// Начальные кординаты
    
    
repeat    // бесконечный цикл
    
        
xa := -get_value(0)*1.0 10000.0// запрашиваем данные у акселерометра
        
ya := get_value(1)*1.0 10000.0;
    
        
SetColor(255255255);
        
FillRect(00GetWidthGetHeight); // Очистка экрана
        
SetColor(000);
        
        
ys := ys ya 9.82;
        
xs := xs xa 9.82// 9.82 - притяжение
        
ys := ys ys 0.01;
        
xs := xs xs 0.01// Немного матана
        
        
if(ys 0.0then
        begin
            ys 
:= -(ys ys 0.15); // 0.15 - это коэффициэнт упругости мячика
            
:= 0.0;
        
end
        
else
        if(
ys GetHeight rthen
        begin
            ys 
:= -(ys ys 0.15);
            
:= GetHeight r;
        
end
        
else := y+ys;
        
        if(
xs 0.0then
        begin
            xs 
:= -(xs xs 0.15);
            
:= 0.0;
        
end
        
else
        if(
xs >= GetWidth rthen
        begin
            xs 
:= -(xs xs 0.15);
            
:= GetWidth r;
        
end
        
else := x+xs;
        
        
FillEllipse(Trunc(x), Trunc(y), Trunc(r), Trunc(r)); // Рисуем мячик
        
Repaint// Перерисовка экрана
    
until false;
End
Таким образом, можно получать информацию практически из любого открытого датчика телефона.
Если у вас есть другие интересные датчики обязательно попробуйте поопрашивать их.
Вложения
Тип файла: zip Lib_jsr256.zip (2.0 Кб, 1260 просмотров)

Последний раз редактировалось ViNT, 04.11.2009 в 19:11.
(Offline)
 
Ответить с цитированием
Эти 7 пользователя(ей) сказали Спасибо odd за это полезное сообщение:
Bruteo (02.11.2009), DIMMON4IK (02.11.2009), Felix KoT (07.04.2010), is.SarCasm (09.07.2010), Skythrone (03.11.2009), Tadeus (04.11.2009), ViNT (02.11.2009)