11#include " Arduino.h"
22#include " ddc.h"
33
4- DDC::DDC ()
5- {
6- }
4+ DDC::DDC () {}
75
8- bool DDC::begin ()
9- {
6+ bool DDC::begin () {
107 Wire.begin ();
118 Wire.beginTransmission (_I2CAddress);
12- if (Wire.endTransmission () == 0 )
13- {
9+ if (Wire.endTransmission () == 0 ) {
1410 return true ;
1511 }
1612 return false ;
1713}
1814
19- void DDC::setVCP (byte op, uint16_t value)
20- {
15+ void DDC::setVCP (byte op, uint16_t value) {
2116 Wire.beginTransmission (_I2CAddress);
2217 Wire.write (0x51 );
2318 Wire.write (0x84 );
2419 Wire.write (0x03 );
2520 Wire.write (op);
2621 Wire.write (byte (value >> 8 ));
2722 Wire.write (byte (value));
28- Wire.write ((_I2CAddress << 1 ) ^ 0x51 ^ 0x84 ^ 0x03 ^ op ^ byte (value >> 8 ) ^ byte (value)); // XOR checksum. Include all bytes sent, including slave address!
23+ Wire.write ((_I2CAddress << 1 ) ^ 0x51 ^ 0x84 ^ 0x03 ^ op ^ byte (value >> 8 ) ^
24+ byte (value)); // XOR checksum. Include all bytes sent, including slave address!
2925 Wire.endTransmission ();
3026}
3127
32- uint16_t DDC::getVCP (byte op)
33- {
28+ uint16_t DDC::getVCP (byte op) {
3429 Wire.beginTransmission (_I2CAddress);
3530 Wire.write (0x51 );
3631 Wire.write (0x82 );
3732 Wire.write (0x01 );
3833 Wire.write (op);
39- Wire.write ((_I2CAddress << 1 ) ^ 0x51 ^ 0x82 ^ 0x01 ^ op); // XOR checksum. Include all bytes sent, including slave address!
34+ Wire.write ((_I2CAddress << 1 ) ^ 0x51 ^ 0x82 ^ 0x01 ^
35+ op); // XOR checksum. Include all bytes sent, including slave address!
4036 Wire.endTransmission ();
4137 delay (40 );
4238 Wire.requestFrom (_I2CAddress, (uint8_t )12 );
@@ -52,50 +48,168 @@ uint16_t DDC::getVCP(byte op)
5248 return (response[8 ] << 8 ) + response[9 ];
5349}
5450
55- void DDC::setBrightness (int value)
56- {
57- if (value > 100 )
58- {
51+ void DDC::setBrightness (int value) {
52+ if (value > 100 ) {
5953 value = 100 ;
6054 }
6155 setVCP (0x10 , value);
6256}
6357
64- uint16_t DDC::getBrightness ()
65- {
58+ uint16_t DDC::getBrightness () {
6659 return getVCP (0x10 );
6760}
6861
6962// 0x01:VGA, 0x03:DVI, 0x0f:DP
70- void DDC::setSource (uint16_t value)
71- {
63+ void DDC::setSource (uint16_t value) {
7264 setVCP (0x60 , value);
7365}
7466
75- uint16_t DDC::getSource ()
76- {
67+ uint16_t DDC::getSource () {
7768 return getVCP (0x60 );
7869}
7970
8071// true:on, false:suspend
81- void DDC::setPower (bool value)
82- {
83- if (value)
84- {
72+ void DDC::setPower (bool value) {
73+ if (value) {
8574 setVCP (0xD6 , 0x01 );
86- }
87- else
88- {
75+ } else {
8976 setVCP (0xD6 , 0x03 );
9077 }
9178}
9279
93- bool DDC::getPower ()
94- {
80+ bool DDC::getPower () {
9581 byte power = getVCP (0xD6 );
96- if (power == 0x01 )
97- {
82+ if (power == 0x01 ) {
9883 return true ;
9984 }
10085 return false ;
10186}
87+
88+ void DDC::getEDID (uint8_t * edid) {
89+ for (int i = 0 ; i < 128 ; i += 16 ) {
90+ Wire.beginTransmission (0x50 );
91+ Wire.write (i);
92+ Wire.endTransmission ();
93+ Wire.requestFrom (0x50 , 16 );
94+ for (int j = 0 ; j < 16 && Wire.available (); j++) {
95+ edid[i + j] = Wire.read ();
96+ }
97+ }
98+ }
99+
100+ String DDC::getMfg () {
101+ uint8_t edid[128 ];
102+ getEDID (edid);
103+
104+ char mfg[4 ] = {0 };
105+ uint8_t byte1 = edid[8 ];
106+ uint8_t byte2 = edid[9 ];
107+
108+ mfg[0 ] = ((byte1 & 0x7C ) >> 2 ) + ' @' ;
109+ mfg[1 ] = ((byte1 & 0x03 ) << 3 ) + ((byte2 & 0xE0 ) >> 5 ) + ' @' ;
110+ mfg[2 ] = (byte2 & 0x1F ) + ' @' ;
111+
112+ return String (mfg);
113+ }
114+
115+ String DDC::getModel () {
116+ uint8_t edid[128 ];
117+ getEDID (edid);
118+
119+ for (int i = 54 ; i < 128 ; i += 18 ) {
120+ if (edid[i] == 0x00 && edid[i + 1 ] == 0x00 && edid[i + 2 ] == 0x00 && edid[i + 3 ] == 0xFC ) {
121+ String model = " " ;
122+ for (int j = i + 5 ; j < i + 18 ; j++) {
123+ if (edid[j] == 0x0A || edid[j] == 0x20 ) {
124+ break ;
125+ }
126+ model += (char )edid[j];
127+ }
128+ return model;
129+ }
130+ }
131+
132+ return " " ;
133+ }
134+
135+ String DDC::getProduct () {
136+ uint8_t edid[128 ];
137+ getEDID (edid);
138+
139+ uint16_t productCode = (edid[11 ] << 8 ) | edid[10 ];
140+
141+ return String (productCode);
142+ }
143+
144+ String DDC::getProductSerial () {
145+ uint8_t edid[128 ];
146+ getEDID (edid);
147+
148+ for (int i = 54 ; i < 128 ; i += 18 ) {
149+ if (edid[i] == 0x00 && edid[i + 1 ] == 0x00 && edid[i + 2 ] == 0x00 && edid[i + 3 ] == 0xFF ) {
150+ String serial = " " ;
151+ for (int j = i + 5 ; j < i + 18 ; j++) {
152+ if (edid[j] == 0x0A || edid[j] == 0x20 ) {
153+ break ;
154+ }
155+ serial += (char )edid[j];
156+ }
157+ return serial;
158+ }
159+ }
160+
161+ return " " ;
162+ }
163+
164+ String DDC::getSerial () {
165+ uint8_t edid[128 ];
166+ getEDID (edid);
167+
168+ uint32_t serialNumber =
169+ (edid[0x0F ] << 24 ) | (edid[0x0E ] << 16 ) | (edid[0x0D ] << 8 ) | edid[0x0C ];
170+
171+ char hexString[11 ];
172+ sprintf (hexString, " 0x%08X" , serialNumber);
173+
174+ return String (hexString);
175+ }
176+
177+ uint32_t DDC::getSerialDecimal () {
178+ uint8_t edid[128 ];
179+ getEDID (edid);
180+
181+ uint32_t serialNumber =
182+ (edid[0x0F ] << 24 ) | (edid[0x0E ] << 16 ) | (edid[0x0D ] << 8 ) | edid[0x0C ];
183+
184+ return serialNumber;
185+ }
186+
187+ uint16_t DDC::getYear () {
188+ uint8_t edid[128 ];
189+ getEDID (edid);
190+
191+ uint8_t yearOffset = edid[17 ];
192+ return 1990 + yearOffset;
193+ }
194+
195+ uint8_t DDC::getWeek () {
196+ uint8_t edid[128 ];
197+ getEDID (edid);
198+
199+ return edid[16 ];
200+ }
201+
202+ String DDC::getVCP () {
203+ uint16_t version = getVCP (0xDF );
204+ uint8_t major = (version >> 8 ) & 0xFF ;
205+ uint8_t minor = version & 0xFF ;
206+
207+ String versionString = String (major) + " ." + String (minor);
208+
209+ if (versionString == " 2.0" || versionString == " 2.1" || versionString == " 3.0" ||
210+ versionString == " 2.2" ) {
211+ return versionString;
212+ } else {
213+ return " Detection failed" ;
214+ }
215+ }
0 commit comments