Часы с кукушкой

Опубликовано 12.11.2008 в 15:35 в разделе ,
Теги: ,
На правах рекламы: На http://kakdvapalca.ru/remont/kompyuterov/price/ прайс на ремонт ноутбуков в Зеленограде.

Думаю, все ещё помнят такое замечетельное изобретение, как часы с кукушкой, описанные в цитате с БашОрга ( http://www.bash.org.ru/ )

x0: зобацал часы с кукушкой на серваке
x0: в cron.hourly пешу скрыпт

KUKU=`/bin/date +%I`
while [ $KUKU -gt 0 ]; do
eject /dev/cdrom
cat /root/xxx/kuku.au > /dev/dsp
eject -t /dev/cdrom
KUKU=$((KUKU-1))
done

x0: ночальнег в полдень зашел и окуел
x0: сцуко спасская биг тауэр

Проблема этих часов заключалась только в одном — они были созданы для Linux-систем, и пользователи Windows не могли похвастаться таким-вот изобретением у себя дома. От нечего делать, я решил реализовать эту же идею под Windows и разместить здесь все исходники.

Программка реализована стопроцентно просто. Она запускается, впадает в спячку до наступления времени хх:59:59, после чего судорожно начинает считать миллисекунды, и ровно в хх:00:00 хх-раз вызывает функцию выпуска-вставки cd-rom’а. После этого программка вновь засыпает в ожидании лучших времён. Использование памяти — незначительно, загрузка процессора — нулевая. Если прописать это чудо в автозагрузку, то будет просто замечательно …)

Для тех, кто искал, каким образом можно управлять впуском-выпуском сидюшника:
Функция, с помощью которой можно выдвинуть и задвинуть лоток CD-ROM’а — mciSendString() . Она объявлена в mmsystem, поэтому не забудьте дописывать #include <mmsystem.h> в проекте.
Строки, отвечающие за открытие и закрытие лотка: «set cdaudio door open» и «set cdaudio door closed».
Подробнее смотрите в исходном коде программы …

Для интересующихся, вот собственно исходный код программульки:

#include <windows.h>
#include <mmsystem.h>
#include "resource.h"

void kuku(int kukus) 
{
	LPCTSTR command_door_open	= "set cdaudio door open";
	LPCTSTR command_door_close	= "set cdaudio door closed";

	for (int i = 0; i < kukus; i++) {
		mciSendString(command_door_open, 0, 0, 0);			// open tray
		PlaySound("KuKu", 0, SND_RESOURCE | SND_ASYNC);		// play sound
		mciSendString(command_door_close, 0, 0, 0);			// close tray
	}
}

int __stdcall WinMain(HINSTANCE hModule, HINSTANCE, LPSTR , int) 
{
	SYSTEMTIME the_now;
	int time_to_sleep;

	while (1) {
		GetSystemTime(&amp;the_now);
		if (the_now.wMinute == 0) {
			kuku(the_now.wHour);
			Sleep(3580000);
		} else if (the_now.wMinute == 59) {
			if (the_now.wSecond < 55) {
				Sleep(5000);
			} else {
                Sleep(250);
			}
		} else {
			time_to_sleep = (59 - the_now.wMinute) * 60;
			Sleep(time_to_sleep);	
		}
	}

	return 0;
}

Это всё! А можно и ещё меньше сделать, при желании …

Дополнительно, я публикую все материалы по этой программке, думаю, по названиям будет не сложно разобраться, что есть что …

  • kuku-src.zip — исходные коды программы для C++
  • kuku-exe.zip — сама программка, уже скомпилированная

Звуки часов с кукушкой kuku.au и kuku.wav

У меня часто пытаются отыскать хорошие звуки часов с кукушкой. Специально для всех страждущих:

Надеюсь, это будет полезно)

Если кому-то это было полезно, очень рад) Если же у кого есть критика, дополнения или идеи — рад буду выслушать)

Скомпилировано в Visual Studio 2008 по лицензии ФЭТ МГУ им.Н.П.Огарёва.

  • Ilya

    Баг. :) Если 24х часовой формат, то, например, в 3 часа открывается 15 раз. :)

    • Это не баг, это задокументированная фича ;)

      Чтобы устранить это, надо строчку:
      kuku(the_now.wHour);
      Заменить на:
      kuku( ((the_now.wHour+1) % 12) — 1 );