Home | History | Annotate | Download | only in pykms
      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