Last active
June 27, 2022 06:04
-
-
Save jigpu/e05b17e24a60825c6f3bf59fe9638736 to your computer and use it in GitHub Desktop.
Control brightness and contrast of a monitor exposing DDC over an FTDI F232H.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/python3 | |
"""Control brightness and contrast of a monitor exposing DDC over an FTDI F232H. | |
Usage: | |
ddc-ftdi.py [<brightness> <contrast>] | |
Arguments: | |
<brightness> Brightness value to set (0..100) | |
<contrast> Contrast value to set (0..100) | |
""" | |
from pyftdi.i2c import I2cController | |
import pyftdi.misc | |
import time | |
import sys | |
def checksum(data, addr): | |
sum = addr | |
for c in data: | |
sum = sum ^ c | |
return sum | |
def ftdi_init(): | |
i2c = I2cController() | |
i2c.configure('ftdi://ftdi:232h/1', frequency=100000.0) | |
print("Opened i2c connection at {}Hz".format(i2c.frequency)) | |
return i2c.get_port(0x37) | |
def ddc_write(slave, message, sleep=0.04): | |
x = message + bytes({checksum(message, 0x6E)}) | |
print("Writing: {}".format(pyftdi.misc.hexline(x))) | |
slave.write(x) | |
time.sleep(sleep) | |
def ddc_read(slave): | |
data = slave.read(2) | |
if data[0] != 0x6E: | |
raise IOError("Unexpected reply from address {}".format(data[0])) | |
data = data + slave.read((data[1] & 0x7F) + 1) | |
x = checksum(data, 0x50) | |
print("Read: {}".format(pyftdi.misc.hexline(data))) | |
if x != 0: | |
print("BAD checksum: got {})".format(x)) | |
return data | |
def ddc_query(slave, message, sleep=0.04): | |
ddc_write(slave, message, sleep) | |
return ddc_read(slave) | |
# http://www.boichat.ch/nicolas/ddcci/specs.html | |
controls = { | |
'brightness': 0x10, | |
'contrast': 0x12 | |
} | |
def get_value(slave, control): | |
message = b'\x51\x82\x01' + bytes({control}) | |
data = ddc_query(slave, message) | |
print("Maximum: {}, Current: {}".format(data[7], data[9])) | |
def set_value(slave, control, value): | |
message = b'\x51\x84\x03' + bytes({control}) + b'\x00' + bytes({value}) | |
data = ddc_write(slave, message) | |
def main(): | |
if len(sys.argv) != 3: | |
brightness = 75 | |
contrast = 50 | |
else: | |
brightness = int(sys.argv[1]) | |
contrast = int(sys.argv[2]) | |
slave = ftdi_init() | |
get_value(slave, controls['brightness']) | |
set_value(slave, controls['brightness'], brightness) | |
get_value(slave, controls['contrast']) | |
set_value(slave, controls['contrast'], contrast) | |
if __name__=="__main__": | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment