Mapper-light-sensor
From Shmuma
Проблема с датчиком освещения и маппером
Давно напрягало: едешь себе по мапперу, все хорошо видно, экран светиться ярко. Въезжаешь в тоннель ненадолго, яркость экрана снижается (что логично). Выезжаешь на солнце — и все, ничего не видно. Причем прежняя яркость не восстанавливается (мне кажется до перезагрузки маппера, это стоит проверить. Upd: да, именно до перезагрузки маппера).
Сегодня меня это окончательно достало, начал разбираться.
Поиски
Если лень читать, можно сразу посмотреть решение проблемы.
Полез смотреть что делает маппер для запрета гашения экрана. Оказалось вот что:
#define UNBLANK_SCREEN(MOVING, APPROACHING_WAYPOINT) { \
/* Check if we need to unblank the screen. */ \
switch(_unblank_option) \
{ \
case UNBLANK_NEVER: \
break; \
case UNBLANK_WAYPOINT: \
if(APPROACHING_WAYPOINT) \
{ \
printf("Unblanking screen...\n"); \
osso_display_state_on(_osso); \
osso_display_blanking_pause(_osso); \
} \
break; \
default: \
case UNBLANK_FULLSCREEN: \
if(!_fullscreen) \
break; \
case UNBLANK_WHEN_MOVING: \
if(!(MOVING)) \
break; \
case UNBLANK_WITH_GPS: \
printf("Unblanking screen...\n"); \
osso_display_state_on(_osso); \
osso_display_blanking_pause(_osso); \
} \
}
Видимо, что-то здесь не так... Вот тут лежит описание на libosso. Изучаю.
В проекте autolock нашел какой файл нужно прочитать для получения освещенности датчика: /sys/bus/i2c/devices/0-0029/lux, в другом проекте (advanced-backlight) нашел файл со значением яркости экрана: /sys/devices/platform/omapfb/panel/backlight_level.
Написал маленькую утилитку выводящую эти значения в цикле:
#include <libosso.h>
#include <stdlib.h>
#include <stdio.h>
const char *LUX_FILE = "/sys/bus/i2c/devices/0-0029/lux";
const char *BRI_FILE = "/sys/devices/platform/omapfb/panel/backlight_level";
int get_lux(const char* file)
{
int x;
FILE *f;
while(1) {
f = fopen(file, "r");
if( f ) {
fscanf(f, "%d", &x);
fclose(f);
break;
}
sleep(1);
}
return x;
}
int main ()
{
osso_context_t* context;
context = osso_initialize ("light", "0.1", 0, NULL);
if (!context) {
printf ("Init failed\n");
return 1;
}
while (1) {
printf ("lux: %d\tbri: %d\n", get_lux (LUX_FILE), get_lux (BRI_FILE));
sleep (1);
}
osso_deinitialize (context);
return 0;
}
Собираю так:
light: light.c gcc -o light `pkg-config --libs --cflags libosso` light.c -losso clean: rm -f light
Экспериментирую, прикрывая датчик/включая лампу, попутно наблюдая за значениями. Вроде все нормально.
Пытаюсь добавлять вызов функций, вызываемых маппером для запрета гашения экрана. Ага, вот оно: osso_display_state_on. Если её вызывать каждую секунду, то освещенность датчика перестает влиять на яркость экрана. Причем, наблюдается странный глюк: иногда яркость экрана на мгновение резко падает до нуля (это при освещении яркой лампой-то). После чего яркость снова меняется на ту что была раньше, независимо от освещенности датчика. Ровно то самое что наблюдаю я. Похоже маппер если и виноват, то не сильно. Глючит фигня которая меняет по датчику освещенности яркость экрана. Зараза.
Тэкс, пробуем вторую функцию osso_display_blanking_pause. Эта функция работает адекватно: не дает таблетке погасить экран и в то же время яркость меняется в соответствии с освещенностью. Красота. Тогда нужно просто убрать из маппера нафиг osso_display_state_on и все.
Решение
К странному поведению яркости экрана приводят вызовы функции osso_display_state_on в макросе UNBLANK_SCREEN. Убрав этот вызов, все становится нормально.