Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2016.07.24;
Скачать: CL | DM;

Вниз

EDID. Получить ID монитора (Работа с байтами)   Найти похожие ветки 

 
K-1000 ©   (2015-10-26 00:33) [0]

Нужно получить ID монитора из реестра. (EDID)
В  спеке написано, что данные лежат в 8-9 байте:
https://en.wikipedia.org/wiki/Extended_Display_Identification_Data
Получил бинарные данные. Объединяю их в word.


var
 A: word;
begin
 Name:= MAKEWORD(EDID[8], EDID[9]);
end;


И теперь не знаю как получить из битов нужный ID:

Manufacturer ID. These IDs are assigned by Microsoft, they are PNP IDs "00001=A”; “00010=B”; ... “11010=Z”. Bit 7 (at address 08h) is 0, the first character (letter) is located at bits 6 → 2 (at address 08h), the second character (letter) is located at bits 1 & 0 (at address 08h) and bits 7 → 5 (at address 09h), and the third character (letter) is located at bits 4 → 0 (at address 09h).
Bit 15  (Reserved, always 0)
Bits 14–10  First letter of manufacturer ID (byte 8, bits 6–2)
Bits 9–5  Second letter of manufacturer ID (byte 8, bit 1 through byte 9 bit 5)
Bits 4–0  Third letter of manufacturer ID (byte 9 bits 4–0)


Объясните пожалуйста как это сделать.


 
K-1000 ©   (2015-10-26 00:33) [1]

*Работа с битами.


 
Andy BitOff ©   (2015-10-26 01:04) [2]

http://rlu.ru/qEEi

Если нет желания учить булеву алгебру, то
var
 a: TBits;
begin
 a := TBits.Create;
 a.Size := 9;
 if not a.Bits[0] then
   a.Bits[7] := true;
 a.Bits[1] := not a.Bits[2];


 
K-1000 ©   (2015-10-26 01:10) [3]

Я знаю как установить бит, проверить установлен ли он и т.д.
Не ясно, что написано в спецификации.


 
Andy BitOff ©   (2015-10-26 01:46) [4]

А-а, ну тады я тебя не понял.


 
Pavia ©   (2015-10-26 06:29) [5]

Там ID состоит как бы из двух половинок.Буков и цифр. Которые проще декодировать по разному.

 Memo1.Lines.Add("EDID Cheack Sum OK");
 id:=buf[9]+buf[8] shl 8;
s:="   "+InttoHex((Word(BUF[10])+BUF[11] shl 8),4);
s[3]:=Char(id and 31+$40);
s[2]:=Char(id shr 5 and 31+$40);
s[1]:=Char(id shr 10 and 31+$40);
Memo1.Lines.Add("Monitir ID: "+s);
Memo1.Lines.Add(Format("Sireal: %x",[BUF[12]]));


 
Pavia ©   (2015-10-26 06:30) [6]

PS. Код рабочий проверенный, но писал лет 5 назад поэтому что к чему плохо помню.


 
Игорь Шевченко ©   (2015-10-26 10:16) [7]


>  Memo1.Lines.Add("EDID Cheack Sum OK");


> Memo1.Lines.Add("Monitir ID: "+s);


> Memo1.Lines.Add(Format("Sireal: %x",[BUF[12]]));


То есть, у тебя с любым языком беда...


 
K-1000 ©   (2015-10-26 12:13) [8]


> Pavia ©   (26.10.15 06:29) [5]
>
> Там ID состоит как бы из двух половинок.Буков и цифр. Которые
> проще декодировать по разному.
>


Работает. Почитал я спеку и похоже нужного мне не найти.
"Manufacturer ID" оказывается не то. Он уже у меня есть без EDID.
Нужно получить имя монитора.
Одна прога, читающая EDID его выводит, хотя в спеке найти не могу подобное.


 
K-1000 ©   (2015-10-26 12:13) [9]

Может это программа и не из EDID его достаёт.


 
Andy BitOff ©   (2015-10-26 12:56) [10]

Посмотри на torry был исходничек Monitorinfo по-моему. Можкт поможет чем.


 
Pavia ©   (2015-10-26 14:09) [11]

Моя из EDID берёт Monitor Name смотри ветку  case $FC.

function GetStr0A(p:Pchar):String;
var i:integer;
s:String;
begin
i:=0;
s:="";
while p[i]<>#10 do
begin
 s:=s+p[i];
 inc(i);
end;
GetStr0A:=s;
end;

...
begin
...
for i:=0 to 3 do
begin
case buf[54+i*18+3] of
$FF: Memo1.Lines.Add("Serial Number: "+GetStr0A(@buf[54+i*18+5]));
$FE: Memo1.Lines.Add("ASCII String: "+ GetStr0A(@buf[54+i*18+5]));
  ...
$FC: Memo1.Lines.Add("Monitor Name: "+ GetStr0A(@buf[54+i*18+5]));
 ...
else
 ...
end; // case
end; // for


 
Кто б сомневался ©   (2015-10-26 14:19) [12]

Кстати, а кто нибудь в курсе, есть ли какой нибудь универсальный Display API, чтобы к примеру яркость монитора поменять программно.


 
K-1000 ©   (2015-10-26 14:44) [13]


> Andy BitOff ©   (26.10.15 12:56) [10]
>
> Посмотри на torry был исходничек Monitorinfo по-моему. Можкт
> поможет чем.
> Pavia ©   (26.10.15 14:09) [11]
>
> Моя из EDID берёт Monitor Name смотри ветку  case $FC.


То что нужно, спасиб. :)


 
Pavia ©   (2015-10-26 16:48) [14]


>  есть ли какой нибудь универсальный Display API, чтобы к
> примеру яркость монитора поменять программно.

Нету. Можно к примеру через:
https://msdn.microsoft.com/en-us/library/dd692972(v=vs.85).aspx
Но по факту обычно эта функция виртуальная и делается средствами видео карты, а не монитора. А так обратный канал и протокол для управления монитором есть, вопрос в том что разработчики видеокарт не делают API на доступ.


 
Кто б сомневался ©   (2015-10-26 21:23) [15]


> Но по факту обычно эта функция виртуальная и делается средствами
> видео карты

Виртуальная - это всмысле делать картинку изображения на мониторе ярче\слабее, но яркость и контраст самого монитора не меняется?

А протокол там стандартный, или у каждого монитора (компании) свой?
Может самому можно разобраться? Есть какие то ключевые слова для поиска?
Странно что таких программ нету, они бы очень пригодились.


 
K-1000 ©   (2015-10-27 10:14) [16]


> Кто б сомневался ©   (26.10.15 21:23) [15]


Можно ещё посмотреть функции:
SetDeviceGammaRamp() и ChangeDisplaySettingsEx() с флагом CDS_VIDEOPARAMETERS.



Страницы: 1 вся ветка

Текущий архив: 2016.07.24;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.018 c
15-1445722205
Юрий
2015-10-25 00:30
2016.07.24
С днем рождения ! 25 октября 2015 воскресенье


2-1416638766
SKIPtr
2014-11-22 09:46
2016.07.24
тип числа со знаком и плавающей запятой


15-1445780305
Кто б сомневался
2015-10-25 16:38
2016.07.24
Посоветуйте какие то интересные сайты, типа хабра


15-1444562106
pavelnk
2015-10-11 14:15
2016.07.24
Подскажите компонент


15-1444234918
aka
2015-10-07 19:21
2016.07.24
offline переводчик для андроид