Switch to unified view

a b/python/example_render_encrypted_data.py
1
#!/usr/bin/python
2
# Renders a window with graph values for each sensor and a box for gyro values.
3
try:
4
    import psyco
5
6
    psyco.full()
7
except ImportError:
8
    print('No psyco. Expect poor performance. Not really...')
9
import platform
10
import sys
11
import time
12
13
import pygame
14
from pygame import FULLSCREEN
15
16
from emokit.emotiv import Emotiv
17
from emokit.packet import EmotivExtraPacket
18
from emokit.util import get_quality_scale_level_color
19
20
if platform.system() == "Windows":
21
    pass
22
23
24
class Grapher(object):
25
    """
26
    Worker that draws a line for the sensor value.
27
    """
28
29
    def __init__(self, screen, name, i, old_model=False):
30
        """
31
        Initializes graph worker
32
        """
33
        self.screen = screen
34
        self.name = name
35
        self.range = float(1 << 13)
36
        self.x_offset = 40
37
        self.y = i * gheight
38
        self.buffer = []
39
        font = pygame.font.Font(None, 24)
40
        self.text = font.render(self.name, 1, (255, 0, 0))
41
        self.text_pos = self.text.get_rect()
42
        self.text_pos.centery = self.y + gheight
43
        self.first_packet = True
44
        self.y_offset = 0
45
        self.old_model = old_model
46
47
    def update(self, packet):
48
        """
49
        Appends value and quality values to drawing buffer.
50
        """
51
        if len(self.buffer) == 800 - self.x_offset:
52
            self.buffer = self.buffer[1:]
53
        self.buffer.append([packet.sensors[self.name]['value'], packet.sensors[self.name]['quality']])
54
55
    def calc_y(self, val):
56
        """
57
        Calculates line height from value.
58
        """
59
        return (val * 1.5) - self.y_offset + gheight
60
61
    def draw(self):
62
        """
63
        Draws a line from values stored in buffer.
64
        """
65
        if len(self.buffer) == 0:
66
            return
67
68
        if self.first_packet:
69
            self.y_offset = self.buffer[0][0] * 1.5
70
            # print(self.y_offset)
71
            self.first_packet = False
72
        pos = self.x_offset, self.calc_y(self.buffer[0][0]) + self.y
73
        for i, (value, quality) in enumerate(self.buffer):
74
            y = self.calc_y(value) + self.y
75
            color = get_quality_scale_level_color(quality, self.old_model)
76
            pygame.draw.line(self.screen, color, pos, (self.x_offset + i, y))
77
            pos = (self.x_offset + i, y)
78
        self.screen.blit(self.text, self.text_pos)
79
80
81
def main():
82
    """
83
    Creates pygame window and graph drawing workers for each sensor.
84
    """
85
    global gheight
86
    pygame.init()
87
    screen = pygame.display.set_mode((800, 600))
88
    graphers = []
89
    recordings = []
90
    recording = False
91
    record_packets = []
92
    updated = False
93
    cursor_x, cursor_y = 400, 300
94
    fullscreen = False
95
    "emotiv_encrypted_data_UD20160103001874_2017-04-05.17-42-23.292665.csv"
96
    "emotiv_encrypted_data_UD20160103001874_2017-04-05.17-39-48.516489.csv"
97
    "emotiv_encrypted_data_UD20160103001874_2017-04-05.17-21-32.384061.csv"
98
    with Emotiv(display_output=False, verbose=False, is_research=False, force_epoc_mode=False, force_old_crypto=False,
99
                input_source="emotiv_encrypted_data_UD20160103001874_2017-04-05.17-39-48.516489.csv") as emotiv:
100
        for name in 'AF3 F7 F3 FC5 T7 P7 O1 O2 P8 T8 FC6 F4 F8 AF4'.split(' '):
101
            graphers.append(Grapher(screen, name, len(graphers), emotiv.old_model))
102
        while emotiv.running:
103
            for event in pygame.event.get():
104
                if event.type == pygame.QUIT:
105
                    emotiv.close()
106
                    return
107
                if event.type == pygame.KEYDOWN:
108
                    if event.key == pygame.K_ESCAPE:
109
                        emotiv.close()
110
                        return
111
                    elif event.key == pygame.K_f:
112
                        if fullscreen:
113
                            screen = pygame.display.set_mode((800, 600))
114
                            fullscreen = False
115
                        else:
116
                            screen = pygame.display.set_mode((800, 600), FULLSCREEN, 16)
117
                            fullscreen = True
118
                    elif event.key == pygame.K_r:
119
                        if not recording:
120
                            record_packets = []
121
                            recording = True
122
                        else:
123
                            recording = False
124
                            recordings.append(list(record_packets))
125
                            record_packets = None
126
            packets_in_queue = 0
127
            try:
128
                while packets_in_queue < 8:
129
                    packet = emotiv.dequeue()
130
131
                    if packet is not None:
132
                        if type(packet) != EmotivExtraPacket:
133
                            if abs(packet.sensors['X']['value']) > 1:
134
                                cursor_x = max(0, min(cursor_x, 800))
135
                                cursor_x -= packet.sensors['X']['value']
136
                            if abs(packet.sensors['Y']['value']) > 1:
137
                                cursor_y += packet.sensors['Y']['value']
138
                                cursor_y = max(0, min(cursor_y, 600))
139
                            map(lambda x: x.update(packet), graphers)
140
                            if recording:
141
                                record_packets.append(packet)
142
                            updated = True
143
                            packets_in_queue += 1
144
                    time.sleep(0.001)
145
            except Exception as ex:
146
                print("EmotivRender DequeuePlotError ", sys.exc_info()[0], sys.exc_info()[1], sys.exc_info()[2],
147
                      " : ", ex)
148
149
            if updated:
150
                screen.fill((75, 75, 75))
151
                map(lambda x: x.draw(), graphers)
152
                pygame.draw.rect(screen, (255, 255, 255), (cursor_x - 5, cursor_y - 5, 10, 10), 0)
153
                pygame.display.flip()
154
                updated = False
155
156
157
if __name__ == "__main__":
158
    try:
159
        gheight = 580 // 14
160
        main()
161
    except Exception as ex:
162
        print("EmotivRender ", sys.exc_info()[0], sys.exc_info()[1], sys.exc_info()[2], " : ", ex)