diff --git a/rasp_grid.py b/rasp_grid.py index 3cf3132..85da674 100644 --- a/rasp_grid.py +++ b/rasp_grid.py @@ -158,67 +158,131 @@ def read_cfg(cfg_file, now, init_read=False): # continue -def led_controll(pin, t0, dt, stop_flag, save_f=None): - next = t0 - - while True: - if stop_flag(): - break - if time() > next: - save_t = next + time() - next - GPIO.output(pin, GPIO.HIGH) - sleep(0.1) - GPIO.output(pin, GPIO.LOW) - - if save_f != None: - save_f.write('%.4f' % (save_t)) - save_f.flush() - next += dt +# def led_controll(pin, t0, dt, stop_flag, save_f=None): +# next = t0 +# +# while True: +# if stop_flag(): +# break +# if time() > next: +# save_t = next + time() - next +# GPIO.output(pin, GPIO.HIGH) +# sleep(0.1) +# GPIO.output(pin, GPIO.LOW) +# +# if save_f != None: +# save_f.write('%.4f' % (save_t)) +# save_f.flush() +# next += dt +# +# +# +# def temp_rec(w1_bus_path, temp_f, t0, dt, stop_flag): +# next = t0 +# while True: +# if stop_flag(): +# break +# if time() > next: +# w1_f = open(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 +# temp_f.write('%6.0f; %7.3f\n' % (next, temp)) +# temp_f.flush() +# break +# w1_f.close() +# next += dt +# +# def clock_controll(end_clock, run_led_pin, sync_led_pin, w1_bus_path, temp_f, led_f, stop_flag): +# t0 = time() +# sub_stop_flag = False +# +# run_led_interval = 2 +# run_thread = threading.Thread(target=led_controll, args=(run_led_pin, t0, run_led_interval, lambda: sub_stop_flag, None)) +# +# sync_led_interval = 1 +# sync_thread = threading.Thread(target=led_controll, args=(sync_led_pin, t0, sync_led_interval, lambda: sub_stop_flag, led_f)) +# +# temp_interval = 300 +# temp_thread = threading.Thread(target=temp_rec, args=(w1_bus_path, temp_f, t0, temp_interval, lambda: sub_stop_flag)) +# +# run_thread.start() +# sync_thread.start() +# temp_thread.start() +# +# while True: +# if stop_flag(): +# sub_stop_flag = True +# sync_thread.join() +# run_thread.join() +# break +# if datetime.datetime.now().hour == end_clock[0] and datetime.datetime.now().minute == end_clock[1]: +# break +def clock_process(end_clock, run_led_pin, sync_led_pin, w1_bus_path, temp_f, led_f): + t0 = time() + run_led_interval = 2 + sync_led_interval = 1 + temp_interval = 300 + next_t_t = 0 + next_l_t = 0 + print("\nDatetime: %.0f:%0f o'clock" % (datetime.datetime.now().hour, datetime.datetime.now().minute)) + print("Terminate: %.0f:%0f o'clock" % (end_clock[0], end_clock[1])) -def temp_rec(w1_bus_path, temp_f, t0, dt, stop_flag): - next = t0 while True: - if stop_flag(): + if datetime.datetime.now().hour >= end_clock[0] and datetime.datetime.now().minute >= end_clock[1]: + print('\nEnd time reached ...') break - if time() > next: + if (time() - t0) % temp_interval <= 0.1: + GPIO.output(run_led_pin, GPIO.HIGH) + GPIO.output(sync_led_pin, GPIO.HIGH) + sleep(0.1) + GPIO.output(run_led_pin, GPIO.LOW) + GPIO.output(sync_led_pin, GPIO.LOW) + w1_f = open(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 - temp_f.write('%6.0f; %7.3f\n' % (next, temp)) + temp_f.write('%6.0f; %7.3f\n' % (next_t_t, temp)) temp_f.flush() break w1_f.close() - next += dt - -def clock_controll(end_clock, run_led_pin, sync_led_pin, w1_bus_path, temp_f, led_f, stop_flag): - t0 = time() - sub_stop_flag = False - - run_led_interval = 2 - run_thread = threading.Thread(target=led_controll, args=(run_led_pin, t0, run_led_interval, lambda: sub_stop_flag, None)) + next_t_t += temp_interval - sync_led_interval = 1 - sync_thread = threading.Thread(target=led_controll, args=(sync_led_pin, t0, sync_led_interval, lambda: sub_stop_flag, led_f)) + elif (time() - t0) % run_led_interval <= 0.1: + GPIO.output(run_led_pin, GPIO.HIGH) + GPIO.output(sync_led_pin, GPIO.HIGH) + sleep(0.1) + GPIO.output(run_led_pin, GPIO.LOW) + GPIO.output(sync_led_pin, GPIO.LOW) - temp_interval = 300 - temp_thread = threading.Thread(target=temp_rec, args=(w1_bus_path, temp_f, t0, temp_interval, lambda: sub_stop_flag)) + elif (time() - t0) % sync_led_interval <= 0.1: + GPIO.output(sync_led_pin, GPIO.HIGH) + sleep(0.1) + GPIO.output(sync_led_pin, GPIO.LOW) - run_thread.start() - sync_thread.start() - temp_thread.start() + if led_f != None: + led_f.write('%.4f' % (next_l_t)) + led_f.flush() + next_l_t += sync_led_interval + else: + pass +def save_process(q, f, gain): while True: - if stop_flag(): - sub_stop_flag = True - sync_thread.join() - run_thread.join() - break - if datetime.datetime.now().hour == end_clock[0] and datetime.datetime.now().minute == end_clock[1]: - break + if q.empty(): + pass + elif q.full(): + print('\n!!! Queue full !!!') + else: + Cdata = q.get() + # print(Cdata[:10]) + Cdata.tofile(f) + f.flush() # def duration_control(end_clock, stop_flag): # while True: @@ -368,9 +432,10 @@ def main(): low_channel = 0 high_channel = channels - 1 - samples_per_channel = rate * 20 # * channels = Buffer size + buffer_sec = 20 + samples_per_channel = rate * buffer_sec # * channels = Buffer size buffer_size = samples_per_channel * channels - print('channels: %.0f' % channels) + print('\nChannels: %.0f' % channels) # rate = 20000 scan_options = ScanOption.CONTINUOUS flags = AInScanFlag.DEFAULT @@ -463,15 +528,22 @@ def main(): start_clock = [h, m] end_clock = [h + 6, m] - clock_thread = threading.Thread(target=clock_controll, args=(end_clock, LED1_pin, LED_out_pin, w1_bus_path, temp_f, led_f, lambda: stop_flag)) + #clock_thread = threading.Thread(target=clock_controll, args=(end_clock, LED1_pin, LED_out_pin, w1_bus_path, temp_f, led_f, lambda: stop_flag)) + #clock_thread.start() + + clock_thread = mp.Process(target=clock_process, args=(end_clock, LED1_pin, LED_out_pin, w1_bus_path, temp_f, led_f)) clock_thread.start() - print('go') + q = mp.Queue() + save_thread = mp.Process(target=save_process, args=(q, f, gain)) + save_thread.start() + + print('\nRecording started.') data = create_float_buffer(channel_count, samples_per_channel) print('----') - print(len(data)) - print(samples_per_channel) - print(channel_count) + print('Buffer size: %.0fn; %.0fsec' % (len(data), buffer_sec)) + print('Channels: %.0f' % channel_count) + print('Samples per channel: %.0f' % samples_per_channel) print('----') rate = ai_device.a_in_scan(low_channel, high_channel, input_mode, ranges[range_index], samples_per_channel, @@ -515,6 +587,7 @@ def main(): # print(index) if index >= save_range[0] and index < save_range[1]: + GPIO.output(LED2_pin, GPIO.HIGH) dt = time() - cont_t cont_t = time() @@ -522,11 +595,18 @@ def main(): print('samples = %.0f' % (len(data[save_range[0]:save_range[1]]) / 15)) print('rate = %.2f Hz\n' % (len(data[save_range[0]:save_range[1]]) / 15 /dt)) - (np.array(data[save_range[0]:save_range[1]], dtype=np.float32) / gain).tofile(f) - f.flush() + # (np.array(data[save_range[0]:save_range[1]], dtype=np.float32) / gain).tofile(f) + # f.flush() + + Cdata = np.copy(np.array(data[save_range[0]:save_range[1]], dtype=np.float32) / gain) + q.put(Cdata) + save_ranges = np.roll(save_ranges, 1, axis=0) save_range = save_ranges[0] + + GPIO.output(LED2_pin, GPIO.LOW) + # if index < 0 or index == last_idx: # continue # @@ -545,9 +625,14 @@ def main(): # print('save n flush') # last_idx = index - stop_flag = True - clock_thread.join() - print('end') + #stop_flag = True + #clock_thread.join() + print('\nEmpty Queue') + while not q.empty(): + sleep(0.01) + clock_thread.terminate() + save_thread.terminate() + print('\nDone!') f.close() temp_f.close()