Pull to refresh

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

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

Вчера ко мне в голову пришла «мысля» о том, что… ну нехорошо как-то получается: на смартфонах в беззвучном режиме о наличии уведомлений с помощью 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.
Об этом-то я как раз и забыл сказать. Спасибо за дополнение.
Tags:
Hubs:
Total votes 15: ↑10 and ↓5+5
Comments17

Articles