… И решил я написать об этой идее пост на Хабрахабре.
Вчера ко мне в голову пришла «мысля» о том, что… ну нехорошо как-то получается: на смартфонах в беззвучном режиме о наличии уведомлений с помощью 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.Об этом-то я как раз и забыл сказать. Спасибо за дополнение.