Форум: "Media";
Текущий архив: 2011.11.27;
Скачать: [xml.tar.bz2];
ВнизПодскажите, как можно проверить открыт ли CD-ROM Найти похожие ветки
← →
СССР (2008-08-26 19:47) [0]Доброе время суток
Подскажите, как можно проверить открыт ли CD-ROM, желательно с примерам кода.
← →
МистерТ (2008-08-27 09:09) [1]1) удостовериться, что к компьютеру подключена веб-камера
2) выдать пользователю окошко с просьбой навести камеру на CD-ROM
3) прогнать полученную с камеры картинку через модуль распознания изображения и сравнить с эталонной картинкой открытого CD-ROM
мелочами типа юстировки направления "взгляда" камеры можно принебречь, если составить хорошую базу фотографий открытого CD-ROM с разных ракурсов.
← →
{RASkov} © (2008-08-27 11:12) [2]http://yandex.ru/yandsearch?clid=9582&text=%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%B8%D1%82%D1%8C+%D0%BE%D1%82%D0%BA%D1%80%D1%8B%D1%82+%D0%BB%D0%B8+CD-ROM
Но у меня способ из первых ссылок не сработал, поэтому я сразу не стал отвечать, но после [1].... толи присоединится к первому посту, толи... :)
Я не задавался таким вопросом, возможно есть способ "более менее 100-процентный", но так же нужно учитывать, что приводы могут и не иметь лотка для CD т.е. выдвигаться там нечему... Может еще какие нюансы есть, как например маленький нюансик - кол-во приводов в системе...
← →
han_malign © (2008-08-29 16:10) [3]номер раз http://www.rsdn.ru/article/baseserv/scsi.xml
номер три(глобальный) http://www.t10.org/
номер два(конкретный, но на Ц и для wnaspi32(NT/2000/9X))int haid, target, lun;
DWORD dwResult;
haid = atoi(argv[1]);
if (argc < 3) target = 0;
else target = atoi(argv[2]);
if (argc < 4) lun = 0;
else lun = atoi(argv[3]);
dwResult = GetASPI32SupportInfo();
if (BYTE(dwResult >>8) != SS_COMP)
{
printf("Error: SCSI %Xh. Initializaton failed.\n", BYTE(dwResult >> 8));
return 1;
}
HANDLE hEvent;
hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
if (hEvent == NULL)
{
printf("Error: System %Xh. Can not create event.\n", GetLastError());
return 2;
}
SRB_ExecSCSICmd esc;
BYTE buf[8];
ZeroMemory(buf, 8);
ZeroMemory(&esc, sizeof(SRB_ExecSCSICmd));
esc.SRB_Cmd = SC_EXEC_SCSI_CMD;
esc.SRB_HaId = haid;
esc.SRB_Flags = SRB_EVENT_NOTIFY | SRB_DIR_IN;
esc.SRB_Target = target;
esc.SRB_Lun = lun;
esc.SRB_SenseLen = SENSE_LEN;
esc.SRB_BufLen = 0x8;
esc.SRB_BufPointer = buf;
esc.SRB_CDBLen = 10;
esc.SRB_PostProc = hEvent;
esc.CDBByte[0] = 0x4A; // SCSI Command (Get Event/Status Notification)
esc.CDBByte[1] = 0x1; // IMMED is set
esc.CDBByte[2] = 0x0;
esc.CDBByte[3] = 0x0;
esc.CDBByte[4] = 0x10; // Notification Class (Media Status Class Event)
esc.CDBByte[5] = 0x0;
esc.CDBByte[6] = 0x0;
esc.CDBByte[7] = 0x0; // Allocation Lenght MSB
esc.CDBByte[8] = 0x8; // Allocation Length LSB
esc.CDBByte[9] = 0x0;
dwResult = SendASPI32Command((LPSRB)&esc);
if (dwResult == SS_PENDING)
{
dwResult = WaitForSingleObject(hEvent, INFINITE);
if (dwResult == WAIT_FAILED)
{
dwResult = GetLastError();
CloseHandle(hEvent);
printf("Error: System %Xh. Waiting failed.\n", dwResult);
return 3;
}
dwResult = esc.SRB_Status;
}
CloseHandle(hEvent);
if (dwResult != SS_COMP)
{
printf("Error: SCSI %Xh. SCSI command failed.\n", esc.SRB_Status);
return 4;
}
if ((buf[2] & 0x7) == 4) printf("Result: door %s\n", (buf[5] & 0x1) ? "open" : "closed");
else printf("Result: door status unknown.\n");
- осталось срастить номер раз и номер два...
← →
KilkennyCat © (2008-08-30 23:43) [4]Мне способ с веб-камерой кажется наиболее достоверным, но я бы все-таки использовал старую мышь.
Мышь разобрать, и прикрепит одним из наиболее удобных способов напротив лотка сидирома так, чтобы при выдвижении он нажимал на кнопку или перекрывал фотодатчик. Если мышь с колесиком, то прикрепить так, чтобы лоток прокручивал колесико, это позволит анализировать не только состояния "открыт" "закрыт" но и собственно процесс.
Страницы: 1 вся ветка
Форум: "Media";
Текущий архив: 2011.11.27;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.004 c