Alex Chan
initial commit
999c5c9
"""
DeepLabCut Toolbox (deeplabcut.org)
© A. & M. Mathis Labs
Licensed under GNU Lesser General Public License v3.0
"""
from dlclive.processor.processor import Processor
import serial
import struct
import pickle
import time
class TeensyLaser(Processor):
def __init__(
self, com, baudrate=115200, pulse_freq=50, pulse_width=5, max_stim_dur=0
):
super().__init__()
self.ser = serial.Serial(com, baudrate)
self.pulse_freq = pulse_freq
self.pulse_width = pulse_width
self.max_stim_dur = (
max_stim_dur if (max_stim_dur >= 0) and (max_stim_dur < 65356) else 0
)
self.stim_on = False
self.stim_on_time = []
self.stim_off_time = []
def close_serial(self):
self.ser.close()
def turn_stim_on(self):
# command to activate PWM signal to laser is the letter 'O' followed by three 16 bit integers -- pulse frequency, pulse width, and max stim duration
if not self.stim_on:
self.ser.write(
b"O"
+ struct.pack(
"HHH", self.pulse_freq, self.pulse_width, self.max_stim_dur
)
)
self.stim_on = True
self.stim_on_time.append(time.time())
def turn_stim_off(self):
# command to turn off PWM signal to laser is the letter 'X'
if self.stim_on:
self.ser.write(b"X")
self.stim_on = False
self.stim_off_time.append(time.time())
def process(self, pose, **kwargs):
# define criteria to stimulate (e.g. if first point is in a corner of the video)
box = [[0, 100], [0, 100]]
if (
(pose[0][0] > box[0][0])
and (pose[0][0] < box[0][1])
and (pose[0][1] > box[1][0])
and (pose[0][1] < box[1][1])
):
self.turn_stim_on()
else:
self.turn_stim_off()
return pose
def save(self, file=None):
### save stim on and stim off times
save_code = 0
if file:
try:
pickle.dump(
{"stim_on": self.stim_on_time, "stim_off": self.stim_off_time},
open(file, "wb"),
)
save_code = 1
except Exception:
save_code = -1
return save_code