Индикация уведомлений светодиодом веб-камеры [Часть 1]

от автора

… И решил я написать об этой идее пост на Хабрахабре.

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

Спасибо за внимание, удачи!

ссылка на оригинал статьи http://habrahabr.ru/post/271125/