display.py 5.22 KB
Newer Older
Gerd's avatar
Gerd committed
1
2
3
import sys_display
import color

4
5
6
7
8
9
10
# font enumeration
FONT8 = 0
FONT12 = 1
FONT16 = 2
FONT20 = 3
FONT24 = 4

11

Gerd's avatar
Gerd committed
12
13
14
15
16
17
class Display:
    """
    The display class provides methods to allow the lcd display
    in card10 to be used in a safe way. All draw methods return
    the display object so that it is possible to chain calls.
    It is recommended to use a context manager as following:
Rahix's avatar
Rahix committed
18

Gerd's avatar
Gerd committed
19
    .. code-block:: python
Rahix's avatar
Rahix committed
20

Gerd's avatar
Gerd committed
21
22
23
24
25
        import display
        with display.open() as disp:
            disp.clear().update()
    """

Rahix's avatar
Rahix committed
26
27
28
29
30
31
    def __init__(self):
        """
        Opens the display. Will fail the display can't be locked
        """
        sys_display.open()

Gerd's avatar
Gerd committed
32
33
34
35
36
37
38
39
40
41
42
43
44
    def __enter__(self):
        return self

    def __exit__(self, _et, _ev, _t):
        self.close()

    @classmethod
    def open(cls):
        """
        Opens the display. Will fail the display can't be locked
        """
        return cls()

Rahix's avatar
Rahix committed
45
46
    @staticmethod
    def close():
Gerd's avatar
Gerd committed
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
        """
        Closes and unlocks the display. To be able to use it again,
        it is necessary to open and lock it again with Display.open()
        """
        sys_display.close()

    def update(self):
        """
        Updates the display based on the changes previously made by
        various draw functions
        """
        sys_display.update()

    def clear(self, col=None):
        """
        Clears the display using the color provided, or the default
        color black

        :param col: Clearing color (expects RGB triple)
        """
        col = col or color.BLACK
        sys_display.clear(col)
        return self

71
    def print(self, text, *, fg=None, bg=None, posx=0, posy=0, font=FONT20):
Gerd's avatar
Gerd committed
72
73
        """
        Prints a string on the display. Font size is locked to 20px
Rahix's avatar
Rahix committed
74

Gerd's avatar
Gerd committed
75
76
77
78
79
        :param text: Text to print
        :param fg: Foreground color (expects RGB triple)
        :param bg: Background color (expects RGB triple)
        :param posx: X-Position of the first character, 0 <= posx <= 160
        :param posy: Y-Position of the first character, 0 <= posy <= 80
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
        :param font: 0 <= font <= 4 (currently) selects a font

        Avaiable Fonts:

         - :py:data:`display.FONT8`
         - :py:data:`display.FONT12`
         - :py:data:`display.FONT16`
         - :py:data:`display.FONT20`
         - :py:data:`display.FONT24`

         **Example:**

        .. code-block:: python

            with display.open() as d:
                d.clear()
                d.print('Hello Earth!', font=display.FONT24)
                d.update()
Gerd's avatar
Gerd committed
98
99
100
101
        """
        fg = fg or color.WHITE
        bg = bg or color.BLACK

102
        sys_display.print_adv(text, posx, posy, fg, bg, font)
Gerd's avatar
Gerd committed
103
104
        return self

105
106
107
108
109
110
111
112
113
114
115
116
117
118
    def pixel(self, x, y, *, col=None):
        """
        Draws a pixel on the display

        :param x: X coordinate, 0<= x <= 160
        :param y: Y coordinate, 0<= y <= 80
        :param col: color of the pixel (expects RGB tripple)
        """

        col = col or color.WHITE

        sys_display.pixel(x, y, col)
        return self

119
120
121
122
    def backlight(self, brightness):
        """
        Set display backlight brightness

123
        :param brightness: backlight brightness 0 <= brightness <= 100
124
125
126
127
128
        """

        sys_display.backlight(brightness)
        return self

Gerd's avatar
Gerd committed
129
130
131
132
133
134
135
136
137
138
    def line(self, xs, ys, xe, ye, *, col=None, dotted=False, size=1):
        """
        Draws a line on the display.

        :param xs: X start coordinate, 0 <= xs <= 160
        :param ys: Y start coordinate, 0 <= ys <= 80
        :param xe: X end coordinate, 0 <= xe <= 160
        :param ye: Y end coordinate, 0 <= ye <= 80
        :param col: color of the line (expects RGB triple)
        :param dotted: whether the line should be dotted or not
Rahix's avatar
Rahix committed
139
140
           (questionable implementation: draws every other pixel white, draws
           white squares at higher pixel sizes)
Gerd's avatar
Gerd committed
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
        :param size: size of the individual pixels, ranges from 1 to 8
        """

        col = col or color.WHITE

        sys_display.line(xs, ys, xe, ye, col, dotted, size)
        return self

    def rect(self, xs, ys, xe, ye, *, col=None, filled=True, size=1):
        """
        Draws a rectangle on the display.

        :param xs: X start coordinate, 0 <= xs <= 160
        :param ys: Y start coordinate, 0 <= ys <= 80
        :param xe: X end coordinate, 0 <= xe <= 160
        :param ye: Y end coordinate, 0 <= ye <= 80
        :param col: color of the outline and fill (expects RGB triple)
        :param filled: whether the rectangle should be filled or not
        :param size: size of the individual pixels, ranges from 1 to 8
        """

        col = col or color.WHITE

        sys_display.rect(xs, ys, xe, ye, col, filled, size)
        return self

    def circ(self, x, y, rad, *, col=None, filled=True, size=1):
        """
        Draws a circle on the display.
Rahix's avatar
Rahix committed
170

Gerd's avatar
Gerd committed
171
172
173
174
175
176
177
178
179
180
181
182
183
        :param x: center x coordinate, 0 <= x <= 160
        :param y: center y coordinate, 0 <= y <= 80
        :param rad: radius
        :param col: color of the outline and fill (expects RGB triple)
        :param filled: whether the rectangle should be filled or not
        :param size: size of the individual pixels, ranges from 1 to 8
        """

        col = col or color.WHITE

        sys_display.circ(x, y, rad, col, filled, size)
        return self

184

Gerd's avatar
Gerd committed
185
open = Display.open
Rahix's avatar
Rahix committed
186
close = Display.close