Spaces:
Sleeping
Sleeping
from time import sleep | |
from playsound import playsound | |
import numpy as np | |
import matplotlib.pyplot as plt | |
import os | |
from datetime import datetime, timedelta | |
from frontend import Frontend | |
from leds import LEDs, Color | |
DEFAULT_FRONTEND_CONFIG = [ | |
0x3E, # ID (RO) | |
0x96, # Datarate = 250 SPS | |
0xC0, # No tests | |
0x60, # Power-down reference buffer, no bias | |
0x00, # No lead-off | |
0x61, # Channel 1 active, 24 gain, no SRB2 & input shorted | |
0x61, # Channel 2 active, 24 gain, no SRB2 & input shorted | |
0x61, # Channel 3 active, 24 gain, no SRB2 & input shorted | |
0x61, # Channel 4 active, 24 gain, no SRB2 & input shorted | |
0x61, # Channel 5 active, 24 gain, no SRB2 & input shorted | |
0x61, # Channel 6 active, 24 gain, no SRB2 & input shorted | |
0x61, # Channel 7 active, 24 gain, no SRB2 & input shorted | |
0x61, # Channel 8 active, 24 gain, no SRB2 & input shorted | |
0x00, # No bias | |
0x00, # No bias | |
0x00, # No lead-off | |
0x00, # No lead-off | |
0x00, # No lead-off flip | |
0x00, # Lead-off positive status (RO) | |
0x00, # Laed-off negative status (RO) | |
0x0F, # All GPIOs as inputs | |
0x00, # Disable SRB1 | |
0x00, # Unused | |
0x00, # Single-shot, lead-off comparator disabled | |
] | |
FRONTEND_CONFIG = [ | |
0x3E, # ID (RO) | |
0x95, # Datarate = 500 SPS | |
0xC0, # No tests | |
0xE0, # Power-down reference buffer, no bias | |
0x00, # No lead-off | |
0x68, # Channel 1 active, 24 gain, no SRB2 & normal input | |
0x68, # Channel 2 active, 24 gain, no SRB2 & normal input | |
0x68, # Channel 3 active, 24 gain, no SRB2 & normal input | |
0x68, # Channel 4 active, 24 gain, no SRB2 & normal input | |
0x68, # Channel 5 active, 24 gain, no SRB2 & normal input | |
0x68, # Channel 6 active, 24 gain, no SRB2 & normal input | |
0x68, # Channel 7 active, 24 gain, no SRB2 & normal input | |
0xE0, # Channel 8 disabled, 24 gain, no SRB2 & normal input | |
0x00, # No bias | |
0x00, # No bias | |
0xFF, # Lead-off on all positive pins? | |
0xFF, # Lead-off on all negative pins? | |
0x00, # Normal lead-off | |
0x00, # Lead-off positive status (RO) | |
0x00, # Lead-off negative status (RO) | |
0x00, # All GPIOs as output ? | |
0x20, # Disable SRB1 | |
] | |
frontend = Frontend() | |
leds = LEDs() | |
try: | |
data = frontend.read_regs(0x00, 1) | |
assert data == [0x3E], "Wrong output" | |
print("EEG Frontend responsive") | |
leds.led2(Color.BLUE) | |
print("Configuring EEG Frontend") | |
frontend.write_regs(0x00, FRONTEND_CONFIG) | |
#config = DEFAULT_FRONTEND_CONFIG[:] | |
#config[0x02] = 0xD0 # Activate test signals | |
#config[0x03] = 0xE0 # Power-up reference buffer | |
#for i in range(0x05, 0x0D): | |
# config[i] = 0x05 # Channel active, 1 gain, no SRB2 & Test signal | |
#frontend.write_regs(0x00, config) | |
data = frontend.read_regs(0x00, len(FRONTEND_CONFIG)) | |
assert data == FRONTEND_CONFIG, f"Wrong config: {data} vs {FRONTEND_CONFIG}" | |
frontend.start() | |
print("EEG Frontend configured") | |
leds.led2(Color.PURPLE) | |
while not frontend.is_ready(): | |
pass | |
print("Ready for data") | |
leds.aquisition(True) | |
sleep(0.5) | |
leds.aquisition(False) | |
sleep(0.5) | |
leds.aquisition(True) | |
points = [] | |
START = datetime.now() | |
NUM_STEPS = 2000 | |
#times = [timedelta(milliseconds=i) for i in range(NUM_STEPS)] | |
times = [i / 250 for i in range(NUM_STEPS)] | |
for x in range(NUM_STEPS): | |
while not frontend.is_ready(): | |
pass | |
values = frontend.read() | |
print(values.channels()) | |
points.append(values.channels()) | |
while frontend.is_ready(): | |
pass | |
leds.aquisition(False) | |
points = np.transpose(np.array(points)) | |
fig, ax = plt.subplots() | |
for i in [0]:#range(8): | |
ax.plot(times, points[i] * 4.5 / 2**24, label='channel #' + str(i)) | |
ax.set_xlabel('Time since start (s)') | |
ax.set_ylabel('Value') | |
ax.set_title('Test readings') | |
ax.legend() | |
plt.savefig('readings.png') | |
finally: | |
frontend.close() | |
leds.close() | |