… И решил я написать об этой идее пост на Хабрахабре.
Вчера ко мне в голову пришла «мысля» о том, что… ну нехорошо как-то получается: на смартфонах в беззвучном режиме о наличии уведомлений с помощью LED-индикатора узнать можно, а на компьютере — нет.
Представим себе ситуацию, что вы забыли отключить от ноутбука наушники. Тут вам в фоне написали, скажем, в ВК, а узнать вы об этом, если уведомления в браузере не включены, никак не сможете.
После примерно получаса дум, я пришёл к… dll-файлу, упрощающему жизнь, а заодно и разработку моей будущей программы. DLL’ник сей именуется «escapi».
Т.к. с C++ я знаком не шибко, решил разработать "по-нубски упрощённо", зато быстро и без особых сложностей. (Статью писал по мере разработки, так что тут я оказался глубоко неправ…)
Перейдём, наконец, к делу.
Скачав вышеуказанную библиотеку, сразу же полез в папку «Examples». Обнаружил там несколько скомпилированных примеров, а так же их исходники. На самый простой и подходящий мне пример взгляд мой упал сразу же. Логично, ведь он называется «simplest.exe». Вот его исходник:
/* "simplest", example of simply enumerating the available devices with ESCAPI */ #include <stdio.h> #include "escapi.h" void main() { int i, j; /* Initialize ESCAPI */ int devices = setupESCAPI(); if (devices == 0) { printf("ESCAPI initialization failure or no devices found.\n"); return; } /* Set up capture parameters. * ESCAPI will scale the data received from the camera * (with point sampling) to whatever values you want. * Typically the native resolution is 320*240. */ struct SimpleCapParams capture; capture.mWidth = 24; capture.mHeight = 18; capture.mTargetBuf = new int[24 * 18]; /* Initialize capture - only one capture may be active per device, * but several devices may be captured at the same time. * * 0 is the first device. */ if (initCapture(0, &capture) == 0) { printf("Capture failed - device may already be in use.\n"); return; } /* Go through 10 capture loops so that the camera has * had time to adjust to the lighting conditions and * should give us a sane image.. */ for (i = 0; i < 10; i++) { /* request a capture */ doCapture(0); while (isCaptureDone(0) == 0) { /* Wait until capture is done. * Warning: if capture init failed, or if the capture * simply fails (i.e, user unplugs the web camera), this * will be an infinite loop. */ } } /* now we have the data.. what shall we do with it? let's * render it in ASCII.. (using 3 top bits of green as the value) */ char light[] = " .,-o+O0@"; for (i = 0; i < 18; i++) { for (j = 0; j < 24; j++) { printf("%c", light[(capture.mTargetBuf[i*24+j] >> 13) & 7]); } printf("\n"); } deinitCapture(0); }
Вкратце: программа включает веб-камеру, делает 10 снимков подряд, дабы дать камере сфокусироваться, установить выдержку и т.п., затем берёт последний кадр и выводит некую его часть в ASCII.
Нам, для «мигания» светодиодом камеры необходимо делать лишь один снимок, не выводя его на экран и/или делая с ним что-либо ещё. Ибо, если светодиод камеры включается только тогда, когда она (камера) активна, нам остаётся лишь убрать лишнюю часть кода, и… вуаля! Екзекьютэбл готов.
Новый код:
/* WebCamLED Notifier 1.0 by Sdore */ #include <stdio.h> #include "escapi.h" void led() { struct SimpleCapParams capture; capture.mWidth = 24; capture.mHeight = 18; capture.mTargetBuf = new int[24 * 18]; initCapture(0, &capture); doCapture(0); deinitCapture(0); }
Компилируем в пачке с библиотекой escapi, запускаем. Светодиод камеры загорается и сразу гаснет. Работает! Ну, осталось только найти применение. Следуя задумке, вполне логично сделать систему уведомлений. Программу набросаю в своей любимой среде разработки «Алгоритм 2».
Но это уже в следующей части.
P.S. Это мой первый пост, но, надеюсь, далеко не последний…
Спасибо за внимание, удачи!
ссылка на оригинал статьи http://habrahabr.ru/post/271125/
Добавить комментарий