• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1from .pykms import *
2from enum import Enum
3import os
4import struct
5
6#
7# Common RGB colours
8#
9
10red = RGB(255, 0, 0)
11green = RGB(0, 255, 0)
12blue = RGB(0, 0, 255)
13yellow = RGB(255, 255, 0)
14purple = RGB(255, 0, 255)
15white = RGB(255, 255, 255)
16cyan = RGB(0, 255, 255)
17
18#
19# Rotation enum
20#
21
22class 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
36def __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
46def __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
60DrmObject.set_prop = __obj_set_prop
61DrmObject.set_props = __obj_set_props
62
63#
64# Card API extensions
65#
66
67def __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
77Card.disable_planes = __card_disable_planes
78
79class 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
102class 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
110def __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
139Card.read_events = __card_read_events
140