… И решил я написать об этой идее пост на Хабрахабре.
Вчера ко мне в голову пришла «мысля» о том, что… ну нехорошо как-то получается: на смартфонах в беззвучном режиме о наличии уведомлений с помощью LED-индикатора узнать можно, а на компьютере — нет.
Представим себе ситуацию, что вы забыли отключить от ноутбука наушники. Тут вам в фоне написали, скажем, в ВК, а узнать вы об этом, если уведомления в браузере не включены, никак не сможете. Нужно это исправить!
Заинтересовало? Добро пожаловать под кат!
После примерно получаса дум, я пришёл к… dll-файлу, упрощающему жизнь, а заодно и разработку моей будущей программы. DLL'ник сей именуется «escapi».
Т.к. с C++ я знаком не шибко, решил разработатьпо-нубски упрощённо, зато быстро и без особых сложностей. (Статью писал по мере разработки, так что тут я оказался глубоко неправ...)
Скачав вышеуказанную библиотеку, сразу же полез в папку «Examples». Обнаружил там несколько скомпилированных примеров, а так же их исходники. На самый простой и подходящий мне пример взгляд мой упал сразу же. Логично, ведь он называется «simplest.exe». Вот его исходник:
Вкратце: программа включает веб-камеру, делает 10 снимков подряд, дабы дать камере сфокусироваться, установить выдержку и т.п., затем берёт последний кадр и выводит некую его часть в ASCII.
Нам, для «мигания» светодиодом камеры необходимо делать лишь один снимок, не выводя его на экран и/или делая с ним что-либо ещё. Ибо, если светодиод камеры включается только тогда, когда она (камера) активна, нам остаётся лишь убрать лишнюю часть кода, и… вуаля! Екзекьютэбл готов.
Новый код (только функция):
Компилируем в пачке с библиотекой escapi, запускаем. Светодиод камеры загорается и сразу гаснет. Работает! Ну, осталось только найти применение. Следуя задумке, вполне логично сделать систему уведомлений. Программу набросаю в своей любимой среде разработки «Алгоритм 2».
Но это уже в следующей части.
P.S. Это мой первый пост, но, надеюсь, далеко не последний...
Upd: По замечанию одного из комментаторов,
Вчера ко мне в голову пришла «мысля» о том, что… ну нехорошо как-то получается: на смартфонах в беззвучном режиме о наличии уведомлений с помощью 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.Не уверен, что код рабочий, ибо вышесказанное писал наперёд.
P.S. Это мой первый пост, но, надеюсь, далеко не последний...
Спасибо за внимание, удачи!
Upd: По замечанию одного из комментаторов,
Стоило бы упомянуть, что описываемое решение windows-only.Об этом-то я как раз и забыл сказать. Спасибо за дополнение.
