1 from .pykms import * 2 from enum import Enum 3 import os 4 import struct 5 6 # 7 # Common RGB colours 8 # 9 10 red = RGB(255, 0, 0) 11 green = RGB(0, 255, 0) 12 blue = RGB(0, 0, 255) 13 yellow = RGB(255, 255, 0) 14 purple = RGB(255, 0, 255) 15 white = RGB(255, 255, 255) 16 cyan = RGB(0, 255, 255) 17 18 # 19 # Rotation enum 20 # 21 22 class Rotation(int, Enum): 23 ROTATE_0 = 1 << 0 24 ROTATE_90 = 1 << 1 25 ROTATE_180 = 1 << 2 26 ROTATE_270 = 1 << 3 27 ROTATE_MASK = ROTATE_0 | ROTATE_90 | ROTATE_180 | ROTATE_270 28 REFLECT_X = 1 << 4 29 REFLECT_Y = 1 << 5 30 REFLECT_MASK = REFLECT_X | REFLECT_Y 31 32 # 33 # DrmObject API extensions 34 # 35 36 def __obj_set_prop(self, prop, value): 37 if self.card.has_atomic: 38 areq = AtomicReq(self.card) 39 areq.add(self, prop, value) 40 if areq.commit_sync() != 0: 41 print("commit failed") 42 else: 43 if self.set_prop_value(prop, value) != 0: 44 print("setting property failed") 45 46 def __obj_set_props(self, map): 47 if self.card.has_atomic: 48 areq = AtomicReq(self.card) 49 50 for key, value in map.items(): 51 areq.add(self, key, value) 52 53 if areq.commit_sync() != 0: 54 print("commit failed") 55 else: 56 for propid,propval in map.items(): 57 if self.set_prop_value(propid, propval) != 0: 58 print("setting property failed") 59 60 DrmObject.set_prop = __obj_set_prop 61 DrmObject.set_props = __obj_set_props 62 63 # 64 # Card API extensions 65 # 66 67 def __card_disable_planes(self): 68 areq = AtomicReq(self) 69 70 for p in self.planes: 71 areq.add(p, "FB_ID", 0) 72 areq.add(p, "CRTC_ID", 0) 73 74 if areq.commit_sync() != 0: 75 print("disabling planes failed") 76 77 Card.disable_planes = __card_disable_planes 78 79 class DrmEventType(Enum): 80 VBLANK = 0x01 81 FLIP_COMPLETE = 0x02 82 83 # struct drm_event { 84 # __u32 type; 85 # __u32 length; 86 #}; 87 # 88 89 _drm_ev = struct.Struct("II") 90 91 #struct drm_event_vblank { 92 # struct drm_event base; 93 # __u64 user_data; 94 # __u32 tv_sec; 95 # __u32 tv_usec; 96 # __u32 sequence; 97 # __u32 reserved; 98 #}; 99 100 _drm_ev_vbl = struct.Struct("QIIII") # Note: doesn't contain drm_event 101 102 class DrmEvent: 103 def __init__(self, type, seq, time, data): 104 self.type = type 105 self.seq = seq 106 self.time = time 107 self.data = data 108 109 # Return DrmEvents. Note: blocks if there's nothing to read 110 def __card_read_events(self): 111 buf = os.read(self.fd, _drm_ev_vbl.size * 20) 112 113 if len(buf) == 0: 114 return 115 116 if len(buf) < _drm_ev.size: 117 raise RuntimeError("Partial DRM event") 118 119 idx = 0 120 121 while idx < len(buf): 122 ev_tuple = _drm_ev.unpack_from(buf, idx) 123 124 type = DrmEventType(ev_tuple[0]) 125 126 if type != DrmEventType.VBLANK and type != DrmEventType.FLIP_COMPLETE: 127 raise RuntimeError("Illegal DRM event type") 128 129 vbl_tuple = _drm_ev_vbl.unpack_from(buf, idx + _drm_ev.size) 130 131 seq = vbl_tuple[3] 132 time = vbl_tuple[1] + vbl_tuple[2] / 1000000.0; 133 udata = vbl_tuple[0] 134 135 yield DrmEvent(type, seq, time, udata) 136 137 idx += ev_tuple[1] 138 139 Card.read_events = __card_read_events 140