imporoving code style. grid_recorder.py is the new main recording file

This commit is contained in:
tillraab 2022-05-04 14:11:59 +02:00
parent 63ec461e90
commit e5efa3187b
5 changed files with 532 additions and 53 deletions

View File

@ -28,13 +28,14 @@
General:
Experiment.Name : tube competition
StartDate : ~
StartTime : ~
Location : Colombia - leticia
StartTime : 10:00
EndTime : 14:00
Location : Tuebingen
Position : ~N, ~W
WaterTemperature : 20.0C
WaterConductivity: 5.0uS/cm
WaterpH : 7.0pH
WaterOxygen : 0.0mg/l
WaterTemperature : 25.0C
WaterConductivity: 200.0uS/cm
WaterpH : ~pH
WaterOxygen : ~mg/l
Comment : ~
Experimenter : T. Raab et al. :)
*Recording

View File

@ -45,7 +45,8 @@ def main():
GPIO.output(LED2_pin, GPIO.LOW)
GPIO.cleanup()
os.system('python3 /home/pi/code/Rasp_grid/rasp_grid.py')
# os.system('python3 /home/pi/code/Rasp_grid/rasp_grid.py')
os.system('python3 /home/pi/code/Rasp_grid/grid_recorder.py')
sleep(5)

459
grid_recorder.py Normal file
View File

@ -0,0 +1,459 @@
from __future__ import print_function
import os
import sys
import glob
import datetime
from shutil import copyfile
import subprocess
import numpy as np
import threading
import multiprocessing as mp
from time import sleep, time
from IPython import embed
from uldaq import (get_daq_device_inventory, DaqDevice, AInScanFlag, ScanStatus,
ScanOption, create_float_buffer, InterfaceType, AiInputMode)
try:
import RPi.GPIO as GPIO
except:
pass
class Configuration():
def __init__(self):
# recording setup
self.channels = None
self.samplerate = None
self.max_v = None
self.gain = None
self.record_temp = False
# electrodes
self.n_cols = 0
self.n_rows = 0
self.n_extra = 0
# timestamps
self._now = datetime.datetime.now()
self._start_clock = None
self._end_clock = None
# paths
self.path = './'
self.path_format = '%04Y-%02m-%02d-%02H_%02M'
self._base_path = '/media/pi/data1'
# files (paths)
self.file = os.path.join('.', 'traces-grid1.raw')
self.temp_file = os.path.join('.', 'temperatures.csv')
self.led_file = os.path.join('.', 'led_times.csv')
self.led_file2 = os.path.join('.', 'led_idxs.csv')
# init calls
self.read_cfg()
self.create_file_structure()
def GPIO_setup(self, LED1_pin, LED2_pin, LED_out_pin, Button1_pin, Button2_pin, power_controll_pin):
GPIO.setmode(GPIO.BOARD)
GPIO.setup(LED1_pin, GPIO.OUT) # 1
GPIO.output(LED1_pin, GPIO.LOW)
GPIO.setup(LED2_pin, GPIO.OUT) # 2
GPIO.output(LED2_pin, GPIO.LOW)
GPIO.setup(LED_out_pin, GPIO.OUT)
GPIO.output(LED_out_pin, GPIO.LOW)
LED_status = [False, False, False]
GPIO.setup(power_controll_pin, GPIO.IN)
GPIO.setup(Button1_pin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(Button2_pin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
return LED_status
def read_cfg(self):
cfg_file = os.path.join(self._base_path, 'fishgrid.cfg')
cfg_f = open(cfg_file, 'r+')
cfg = cfg_f.readlines()
for line in cfg:
if 'Columns1' in line:
self.n_cols = int(line.split(':')[1].strip())
elif 'Rows1' in line:
self.n_rows = int(line.split(':')[1].strip())
elif 'Extra1' in line:
self.n_extra = int(line.split(':')[1].strip())
elif "AISampleRate" in line:
self.samplerate = int(float(line.split(':')[-1].strip().replace('kHz', '')) * 1000)
elif "AIMaxVolt" in line:
self.max_v = float(line.split(':')[1].strip().replace('mV', ''))
elif 'Gain' in line:
self.gain = int(line.split(':')[1].strip())
# ToDo: add option to start now !!!
elif 'StartTime' in line:
self.start_clock = np.array(line.strip().replace(' ', '').split(':')[1:], dtype=int)
elif 'EndTime' in line:
self.end_clock = np.array(line.strip().replace(' ', '').split(':')[1:], dtype=int)
elif 'Gain' in line:
self.gain = int(line.split(':')[1].strip())
self.channels = self.n_rows * self.n_cols + self.n_extra
def create_file_structure(self):
start_str = ('%2.f_%2.f' % (self.start_clock[0], self.start_clock[1])).replace(' ', '0')
self.path = os.path.join(self._base_path, self._now.strftime('-'.join(self.path_format.split('-')[:3])) + start_str) # ToDo: Edit here
if not os.path.exists(self.path):
os.makedirs(self.path)
copyfile(os.path.join(self._base_path, 'fishgrid.cfg'), os.path.join(self.path, 'fishgrid.cfg'))
cfg_file = os.path.join(self.path, 'fishgrid.cfg')
cfg_f = open(cfg_file, 'r+')
cfg = cfg_f.readlines()
for enu, line in enumerate(cfg):
if "StartDate" in line:
cfg[enu] = (' StartDate : %s\n' % self._now.strftime('-'.join(self.path_format.split('-')[:3])))
elif "StartTime" in line:
if not hasattr(self.start_clock, '__len__'):
cfg[enu] = (' StartTime : %s\n' % (self._now.strftime('%H:%M:%S') + self._now.strftime(".%f")[:4]))
else:
cfg[enu] = (' StartTime : %s\n' % ('%2.f:%2.f:00' % (self.start_clock[0], self.start_clock[1])))
cfg_f.close()
cfg_f = open(cfg_file, 'w+')
for line in cfg:
cfg_f.write(line)
cfg_f.close()
self.file = os.path.join(self.path, 'traces-grid1.raw')
self.temp_file = os.path.join(self.path, 'temperatures.csv')
self.led_file = os.path.join(self.path, 'led_times.csv')
self.led_file2 = os.path.join(self.path, 'led_idxs.csv')
# @property
# def start_clock(self):
# return self._start_clock
#
# @start_clock.setter
# def start_clock(self, val):
# try:
# h, s = int(val[:2]), int(val[2:])
# self._start_clock = [h, s]
# except ValueError:
# self._start_clock = [10, 0]
#
# @property
# def end_clock(self):
# return self._end_clock
#
# @end_clock.setter
# def end_clock(self, val):
# try:
# h, s = int(val[:2]), int(val[2:])
# self._end_clock = [h, s]
# except ValueError:
# self._end_clock = [16, 0]
class Recorder():
def __init__(self, config):
self.config = config
self._last_button_2_t = time()
self.config._now = self._now
self.LED1_pin = 11
self.Button1_pin = 16
self.LED2_pin = 13
self.Button2_pin = 18
self.LED_out_pin = 35
self.power_controll_pin = 37
self.LED_status = self.config.GPIO_setup(LED1_pin = self.LED1_pin, Button1_pin = self.Button1_pin,
LED2_pin = self.LED2_pin, Button2_pin = self.Button2_pin,
LED_out_pin = self.LED_out_pin, power_controll_pin = self.power_controll_pin)
def DAQ_setup(self):
status = ScanStatus.IDLE
descriptor_index = 0
self.range_index = 0
interface_type = InterfaceType.USB
self.low_channel = 0
self.high_channel = self.config.channels - 1
self.buffer_sec = 20
self.samples_per_channel = self.samplerate * self.buffer_sec # * channels = Buffer size
self.buffer_size = self.samples_per_channel * self.config.channels
print('\nChannels: %.0f' % self.config.channels)
# rate = 20000
self.scan_options = ScanOption.CONTINUOUS
self.flags = AInScanFlag.DEFAULT
# Get descriptors for all of the available DAQ devices.
devices = get_daq_device_inventory(interface_type)
number_of_devices = len(devices)
if number_of_devices == 0:
raise Exception('Error: No DAQ devices found')
print('Found', number_of_devices, 'DAQ device(s):')
for i in range(number_of_devices):
print(' ', devices[i].product_name, ' (', devices[i].unique_id, ')', sep='')
# Create the DAQ device object associated with the specified descriptor index.
self.daq_device = None
self.daq_device = DaqDevice(devices[descriptor_index])
# Get the AiDevice object and verify that it is valid.
self.ai_device = None
self.ai_device = self.daq_device.get_ai_device()
if self.ai_device is None:
raise Exception('Error: The DAQ device does not support analog input')
# Verify that the specified device supports hardware pacing for analog input.
ai_info = self.ai_device.get_info()
if not ai_info.has_pacer():
raise Exception('\nError: The specified DAQ device does not support hardware paced analog input')
# Establish a connection to the DAQ device.
descriptor = self.daq_device.get_descriptor()
print('\nConnecting to', descriptor.dev_string, '- please wait...')
self.daq_device.connect()
# The default input mode is SINGLE_ENDED.
self.input_mode = AiInputMode.SINGLE_ENDED
# If SINGLE_ENDED input mode is not supported, set to DIFFERENTIAL.
if ai_info.get_num_chans_by_mode(AiInputMode.SINGLE_ENDED) <= 0:
self.input_mode = AiInputMode.DIFFERENTIAL
# Get the number of channels and validate the high channel number.
number_of_channels = ai_info.get_num_chans_by_mode(self.input_mode)
if self.high_channel >= number_of_channels:
self.high_channel = number_of_channels - 1
self.channel_count = self.high_channel - self.low_channel + 1
# Get a list of supported ranges and validate the range index.
self.ranges = ai_info.get_ranges(self.input_mode)
int_ranges = []
for r in self.ranges:
int_ranges.append(int(r.name.replace('BIP', '').replace('VOLTS', '')))
for idx in np.argsort(int_ranges):
if self.config.max_v * self.config.gain / 1000 <= int_ranges[idx]:
self.range_index = idx
break
print(self.ranges[self.range_index])
def open_recording_files(self, file, temp_file, led_file, led_file2):
self.temp_f = None
w1_bus_path = glob.glob('/sys/bus/w1/devices/28*/w1_slave')
if len(w1_bus_path) > 0:
self.w1_bus_path = w1_bus_path[0]
self.record_temp = True
self.temp_f = open(temp_file, 'w')
self.temp_f.write('%-6s; %-7s\n' % ('time/s', 'T/C'))
self.f = open(file, 'wb')
self.led_f = open(led_file, 'w')
self.led_f2 = open(led_file2, 'w')
def run(self):
self.open_recording_files(self.config.file, self.config.temp_file, self.config.led_file, self.config.led_file2)
self.DAQ_setup()
GPIO.output(self.LED1_pin, GPIO.HIGH)
self.LED_status[0] = True
GPIO.output(self.LED2_pin, GPIO.LOW)
self.LED_status[1] = False
sleep(.5)
GPIO.output(self.LED1_pin, GPIO.LOW)
self.LED_status[0] = False
GPIO.output(self.LED2_pin, GPIO.HIGH)
self.LED_status[1] = True
sleep(.5)
GPIO.output(self.LED1_pin, GPIO.HIGH)
self.LED_status[0] = True
GPIO.output(self.LED2_pin, GPIO.LOW)
self.LED_status[1] = False
sleep(.5)
GPIO.output(self.LED1_pin, GPIO.LOW)
self.LED_status[0] = False
GPIO.output(self.LED2_pin, GPIO.HIGH)
self.LED_status[1] = True
sleep(.5)
GPIO.output(self.LED2_pin, GPIO.LOW)
self.LED_status[1] = False
self.record()
def record(self):
while True:
if datetime.datetime.now().hour == self.config.start_clock[0] and datetime.datetime.now().minute == self.config.start_clock[1]:
break
elif datetime.datetime.now().hour * 60 + datetime.datetime.now().minute > \
self.config.start_clock[0] * 60 + self.config.start_clock[1]:
h = datetime.datetime.now().hour
m = datetime.datetime.now().minute
self.config.start_clock = ('%2.f%2.f' % (h, m)).replace(' ', '0')
GPIO.output(self.LED2_pin, GPIO.HIGH)
self.LED_status[1] = True
print('\nRecording started.')
data = create_float_buffer(self.channel_count, self.samples_per_channel)
print('----')
print('Buffer size: %.0fn; %.0fsec' % (len(data), self.buffer_sec))
print('Channels: %.0f' % self.channel_count)
print('Samples per channel: %.0f' % self.samples_per_channel)
print('----')
LED_t0 = time()
LED_t_interval = 5
sync_LED_t_interval = 1
temp_t0 = time()
next_temp_t = 0
temp_interval = 300 # sec --> 5 min
disp_eth_power = True
self.samplerate = self.ai_device.a_in_scan(self.low_channel, self.high_channel, self.input_mode, self.ranges[self.range_index], self.samples_per_channel,
self.samplerate, self.scan_options, self.flags, data)
status, transfer_status = self.ai_device.get_scan_status()
last_idx = 0
buffer_no = 0
while GPIO.input(self.Button1_pin) == GPIO.LOW:
if GPIO.input(self.Button2_pin) == GPIO.HIGH:
if (time() - self._last_button_2_t) > 5:
if disp_eth_power == True:
subprocess.run(['tvservice', '-o'])
subprocess.run(['vcgencmd', 'display_power', '0']) #
subprocess.run(['sudo', 'ip', 'link', 'set', 'eth0', 'down'])
GPIO.output(self.LED2_pin, GPIO.LOW)
disp_eth_power = False
elif disp_eth_power == False:
subprocess.run(['tvservice', '-p'])
subprocess.run(['vcgencmd', 'display_power', '1'])
subprocess.run(['sudo', '/bin/chvt', '6'])
subprocess.run(['sudo', '/bin/chvt', '7']) #
subprocess.run(['sudo', 'ip', 'link', 'set', 'eth0', 'up'])
GPIO.output(self.LED2_pin, GPIO.HIGH)
disp_eth_power = True
last_button_2_t = time()
if self.record_temp == True:
if time() - temp_t0 > next_temp_t:
w1_f = open(self.w1_bus_path, 'r')
w1_file = w1_f.readlines()
for line in w1_file:
if 't=' in line:
temp = float((line.split('=')[-1].strip())) / 1000
self.temp_f.write('%6.0f; %7.3f\n' % (next_temp_t, temp))
self.temp_f.flush()
break
w1_f.close()
next_temp_t += temp_interval
# blinking LED (run)
if (time() - LED_t0) % LED_t_interval < .5 and self.LED_status[0] == False:
self.LED_status[0] = True
GPIO.output(self.LED1_pin, GPIO.HIGH)
elif (time() - LED_t0) % LED_t_interval >= .5 and self.LED_status[0] == True:
self.LED_status[0] = False
GPIO.output(self.LED1_pin, GPIO.LOW)
else:
pass
# sync LED
if (time() - LED_t0) % sync_LED_t_interval < .1 and self.LED_status[2] == False:
if self.led_f != None:
Cidx = int((self.buffer_size * buffer_no + last_idx) / self.channels)
self.led_f.write('%.4f\n' % (time() - LED_t0))
self.led_f.flush()
self.led_f2.write('%.0f\n' % Cidx)
self.led_f2.flush()
self.LED_status[2] = True
GPIO.output(self.LED_out_pin, GPIO.HIGH)
elif (time() - LED_t0) % sync_LED_t_interval >= .1 and self.LED_status[2] == True:
self.LED_status[2] = False
GPIO.output(self.LED_out_pin, GPIO.LOW)
else:
pass
##########################################
# Get the status of the background operation
status, transfer_status = self.ai_device.get_scan_status()
index = transfer_status.current_index
# print(index)
if index < 0 or index == last_idx:
continue
if index > last_idx:
(np.array(data[last_idx:index], dtype=np.float32) / self.config.gain).tofile(self.f)
else:
(np.array(data[last_idx:], dtype=np.float32) / self.config.gain).tofile(self.f)
if datetime.datetime.now().hour * 60 + datetime.datetime.now().minute >= self.end_clock[0] * 60 + self.end_clock[1]:
self.f.flush()
GPIO.output(self.LED1_pin, GPIO.LOW)
GPIO.output(self.LED_out_pin, GPIO.LOW)
break
(np.array(data[:index], dtype=np.float32) / self.config.gain).tofile(self.f)
self.f.flush()
buffer_no += 1
last_idx = index
print('\nDone!')
self.f.close()
self.temp_f.close()
self.led_f.close()
GPIO.output(self.LED1_pin, GPIO.HIGH)
GPIO.output(self.LED2_pin, GPIO.HIGH)
sleep(2)
GPIO.output(self.LED1_pin, GPIO.LOW)
GPIO.output(self.LED2_pin, GPIO.LOW)
if self.daq_device:
# Stop the acquisition if it is still running.
if status == ScanStatus.RUNNING:
self.ai_device.scan_stop()
if self.daq_device.is_connected():
self.daq_device.disconnect()
self.daq_device.release()
if disp_eth_power == False:
subprocess.run(['tvservice', '-p'])
subprocess.run(['vcgencmd', 'display_power', '1'])
subprocess.run(['sudo', '/bin/chvt', '6'])
subprocess.run(['sudo', '/bin/chvt', '7'])
GPIO.cleanup()
def main():
config = Configuration()
rc = Recorder(config)
rc.run()
if __name__ == '__main__':
main()

View File

@ -14,10 +14,10 @@ import threading
import multiprocessing as mp
from time import sleep, time
from IPython import embed
from uldaq import (get_daq_device_inventory, DaqDevice, AInScanFlag, ScanStatus,
ScanOption, create_float_buffer, InterfaceType, AiInputMode)
def GPIO_setup(LED1_pin, LED2_pin, LED_out_pin, Button1_pin, Button2_pin, power_controll_pin):
# LED output pins
GPIO.setmode(GPIO.BOARD)
@ -143,6 +143,7 @@ def clock_process(end_clock, run_led_pin, sync_led_pin, w1_bus_path, temp_f, led
else:
pass
def save_process(q, f, gain):
while True:
if q.empty():
@ -155,6 +156,7 @@ def save_process(q, f, gain):
Cdata.tofile(f)
f.flush()
def save_controll(q, pin):
while True:
if q.empty():
@ -198,7 +200,6 @@ def main():
start_clock = [10, 0]
end_clock = [16, 0]
# get init cfg
if os.path.exists('/media/pi/data1'):
init_path = '/media/pi/data1'
@ -238,7 +239,6 @@ def main():
led_file = os.path.join(path, 'led_times.csv')
led_file2 = os.path.join(path, 'led_idxs.csv')
# find w1bus for temp
record_temp = False
temp_f = None
@ -256,11 +256,12 @@ def main():
# f.close()
# DAQ setup
if True:
status = ScanStatus.IDLE
descriptor_index = 0 # ToDo: ????
range_index = 0 # ToDo: ????
descriptor_index = 0
range_index = 0
interface_type = InterfaceType.USB
low_channel = 0
@ -328,7 +329,6 @@ def main():
break
print(ranges[range_index])
GPIO.output(LED1_pin, GPIO.HIGH)
LED_status[0] = True
GPIO.output(LED2_pin, GPIO.LOW)
@ -356,6 +356,11 @@ def main():
GPIO.output(LED2_pin, GPIO.LOW)
LED_status[1] = False
########################## ToDo: continue here !!!
disp_eth_power = True
stop_flag = False
@ -396,7 +401,7 @@ def main():
LED_t0 = time()
LED_t_interval = 5
sync_LED_t_interval = 5
sync_LED_t_interval = 1
temp_t0 = time()
next_temp_t = 0
@ -469,7 +474,7 @@ def main():
else:
pass
if (time() - LED_t0) % sync_LED_t_interval < .5 and LED_status[2] == False:
if (time() - LED_t0) % sync_LED_t_interval < .1 and LED_status[2] == False:
if led_f != None:
Cidx = int((buffer_size * buffer_no + last_idx) / channels)
led_f.write('%.4f\n' % (time()-LED_t0))
@ -480,7 +485,7 @@ def main():
LED_status[2] = True
GPIO.output(LED_out_pin, GPIO.HIGH)
elif (time() - LED_t0) % sync_LED_t_interval >= .5 and LED_status[2] == True:
elif (time() - LED_t0) % sync_LED_t_interval >= .1 and LED_status[2] == True:
LED_status[2] = False
GPIO.output(LED_out_pin, GPIO.LOW)
else:

View File

@ -197,12 +197,13 @@ class Recording_settings(QWidget):
self.experiment_name_val = 'recording fish behavior'
self.startdate_val = '~'
self.starttime_val = '~'
self.location_val = 'Colombia - Los Llanos'
self.endtime_val = '~'
self.location_val = '~'
self.position_val = '~N, ~W'
self.water_temp_val = 20
self.water_cond_val = 5
self.water_ph_val = 7
self.water_oxy_val = 0
self.water_temp_val = '~'
self.water_cond_val = '~'
self.water_ph_val = '~'
self.water_oxy_val = '~'
self.comment_val = '~'
self.experimenter_val = 'T. Raab et al. :)'
self.datatime_val = 100
@ -231,60 +232,69 @@ class Recording_settings(QWidget):
self.gridlayout.addWidget(self.start_date, 1, 1)
start_timeL = QLabel('Start Time:', self)
start_timeU = QLabel('HH:MM', self)
self.start_time = QLineEdit(self.starttime_val, self)
self.gridlayout.addWidget(start_timeL, 2, 0)
self.gridlayout.addWidget(self.start_time, 2, 1)
self.gridlayout.addWidget(start_timeU, 2, 2)
end_timeL = QLabel('End Time:', self)
end_timeU = QLabel('HH:MM', self)
self.end_time = QLineEdit(self.endtime_val, self)
self.gridlayout.addWidget(end_timeL, 3, 0)
self.gridlayout.addWidget(self.end_time, 3, 1)
self.gridlayout.addWidget(end_timeU, 3, 2)
locationL = QLabel('Location:', self)
self.location = QLineEdit(self.location_val, self)
self.gridlayout.addWidget(locationL, 3, 0)
self.gridlayout.addWidget(self.location, 3, 1)
self.gridlayout.addWidget(locationL, 4, 0)
self.gridlayout.addWidget(self.location, 4, 1)
positionL = QLabel('Position:', self)
self.position = QLineEdit(self.position_val, self)
self.gridlayout.addWidget(positionL, 4, 0)
self.gridlayout.addWidget(self.position, 4, 1)
self.gridlayout.addWidget(positionL, 5, 0)
self.gridlayout.addWidget(self.position, 5, 1)
waterTempU = QLabel('C', self)
waterTempL = QLabel('Water Temp:', self)
self.waterTemp = QLineEdit('%.1f' % self.water_temp_val, self)
self.gridlayout.addWidget(waterTempL, 5, 0)
self.gridlayout.addWidget(self.waterTemp, 5, 1)
self.gridlayout.addWidget(waterTempU, 5, 2)
self.waterTemp = QLineEdit('%s' % self.water_temp_val, self)
self.gridlayout.addWidget(waterTempL, 6, 0)
self.gridlayout.addWidget(self.waterTemp, 6, 1)
self.gridlayout.addWidget(waterTempU, 6, 2)
waterCondU = QLabel('uS/cm', self)
waterCondL = QLabel('Water cond.:', self)
self.waterCond = QLineEdit('%.1f' % self.water_cond_val, self)
self.gridlayout.addWidget(waterCondL, 6, 0)
self.gridlayout.addWidget(self.waterCond, 6, 1)
self.gridlayout.addWidget(waterCondU, 6, 2)
self.waterCond = QLineEdit('%s' % self.water_cond_val, self)
self.gridlayout.addWidget(waterCondL, 7, 0)
self.gridlayout.addWidget(self.waterCond, 7, 1)
self.gridlayout.addWidget(waterCondU, 7, 2)
waterpHU = QLabel('pH')
waterpHL = QLabel('Water-pH:')
self.waterpH = QLineEdit('%.1f' % self.water_ph_val, self)
self.gridlayout.addWidget(waterpHL, 7, 0)
self.gridlayout.addWidget(self.waterpH, 7, 1)
self.gridlayout.addWidget(waterpHU, 7, 2)
self.waterpH = QLineEdit('%s' % self.water_ph_val, self)
self.gridlayout.addWidget(waterpHL, 8, 0)
self.gridlayout.addWidget(self.waterpH, 8, 1)
self.gridlayout.addWidget(waterpHU, 8, 2)
waterOxyU = QLabel('mg/l', self)
waterOxyL = QLabel('Water Oxygen:', self)
self.waterOxy = QLineEdit('%.1f' % self.water_oxy_val, self)
self.gridlayout.addWidget(waterOxyL, 8, 0)
self.gridlayout.addWidget(self.waterOxy, 8, 1)
self.gridlayout.addWidget(waterOxyU, 8, 2)
self.waterOxy = QLineEdit('%s' % self.water_oxy_val, self)
self.gridlayout.addWidget(waterOxyL, 9, 0)
self.gridlayout.addWidget(self.waterOxy, 9, 1)
self.gridlayout.addWidget(waterOxyU, 9, 2)
commentL = QLabel('Comment:', self)
self.comment = QLineEdit(self.comment_val, self)
self.gridlayout.addWidget(commentL, 9, 0)
self.gridlayout.addWidget(self.comment, 9, 1)
self.gridlayout.addWidget(commentL, 10, 0)
self.gridlayout.addWidget(self.comment, 10, 1)
experimenterL = QLabel('Experimenter:', self)
self.experimenter = QLineEdit(self.experimenter_val, self)
self.gridlayout.addWidget(experimenterL, 10, 0)
self.gridlayout.addWidget(self.experimenter, 10, 1)
self.gridlayout.addWidget(experimenterL, 11, 0)
self.gridlayout.addWidget(self.experimenter, 11, 1)
space = QLabel('', self)
self.gridlayout.addWidget(space, 11, 0)
self.gridlayout.addWidget(space, 12, 0)
class MainWindow(QTabWidget):
@ -294,7 +304,6 @@ class MainWindow(QTabWidget):
def initMe(self):
self.setGeometry(300, 150, 500, 600)
self.setWindowTitle('Fishgrid.cfg')
@ -361,6 +370,7 @@ class MainWindow(QTabWidget):
self.Recording.experiment_name_val = 'recording fish behavior'
self.Recording.startdate_val = '~'
self.Recording.starttime_val = '~'
self.Recording.endtime_val = '~'
self.Recording.location_val = 'Colombia - Los Llanos'
self.Recording.position_val = '~N, ~W'
self.Recording.water_temp_val = 20
@ -431,6 +441,8 @@ class MainWindow(QTabWidget):
self.Recording.startdate_val = line.split(':')[-1].strip()
elif "StartTime" in line:
self.Recording.starttime_val = ':'.join(line.split(':')[1:]).strip()
elif "EndTime" in line:
self.Recording.endtime_val = ':'.join(line.split(':')[1:]).strip()
elif "Location" in line:
self.Recording.location_val = line.split(':')[-1].strip()
elif "Position" in line:
@ -440,9 +452,9 @@ class MainWindow(QTabWidget):
elif "WaterConductivity" in line:
self.Recording.water_cond_val = float(line.split(':')[-1].strip().replace('uS/cm', ''))
elif 'WaterpH' in line:
self.Recording.water_ph_val = float(line.split(':')[-1].strip().replace('pH', ''))
self.Recording.water_ph_val = line.split(':')[-1].strip().replace('pH', '')
elif "WaterOxygen" in line:
self.Recording.water_oxy_val = float(line.split(':')[-1].strip().replace('mg/l', ''))
self.Recording.water_oxy_val = line.split(':')[-1].strip().replace('mg/l', '')
elif "Comment" in line:
self.Recording.comment_val = ':'.join(line.split(':')[1:]).strip()
elif "Experimenter" in line:
@ -494,12 +506,13 @@ class MainWindow(QTabWidget):
f.write(' Experiment.Name : %s\n' % self.Recording.exp_name.text())
f.write(' StartDate : %s\n' % self.Recording.start_date.text())
f.write(' StartTime : %s\n' % self.Recording.start_time.text())
f.write(' EndTime : %s\n' % self.Recording.end_time.text())
f.write(' Location : %s\n' % self.Recording.location.text())
f.write(' Position : %s\n' % self.Recording.position.text())
f.write(' WaterTemperature : %.1fC\n' % float(self.Recording.waterTemp.text()))
f.write(' WaterConductivity: %.1fuS/cm\n' % float(self.Recording.waterCond.text()))
f.write(' WaterpH : %.1fpH\n' % float(self.Recording.waterpH.text()))
f.write(' WaterOxygen : %.1fmg/l\n' % float(self.Recording.waterOxy.text()))
f.write(' WaterTemperature : %sC\n' % self.Recording.waterTemp.text())
f.write(' WaterConductivity: %suS/cm\n' % self.Recording.waterCond.text())
f.write(' WaterpH : %spH\n' % self.Recording.waterpH.text())
f.write(' WaterOxygen : %smg/l\n' % self.Recording.waterOxy.text())
f.write(' Comment : %s\n' % self.Recording.comment.text())
f.write(' Experimenter : %s\n' % self.Recording.experimenter.text())
# f.write(' Buffers and timing:\n')