"""
**redP_mimoCoRB**: use mimoCoRB with the RedPitaya and redPoscdaq.py 

Input data is provided as numpy-arry of shape (number_of_channels, number_of_samples).
"""

import time
import sys

import redPoscdaq as rp
from mimocorb.buffer_control import rbPut

class redP_mimocorb():            
    """ Interface to the daq rinbuffer mimoCoRB for redPoscdaq
    """    
    def __init__(self, source_list=None, sink_list=None, observe_list=None, config_dict=None,
                 **rb_info):
        # initialize mimoCoRB interface 
        self.action = rbPut(config_dict=config_dict, sink_list=sink_list, **rb_info)
        self.number_of_channels = len(self.action.sink.dtype)
        self.events_required = 1000 if "eventcount" not in config_dict else config_dict["eventcount"]

        self.event_count = 0
        self.active=True
        
    def data_sink(self, data):
        """function called by redPoscdaq  
        """
        if (self.events_required == 0 or self.event_count < self.events_required) and self.active:
           # deliver pulse data and no metadata
           active = self.action(data, None) # send data
           self.event_count += 1
        else:
           active = self.action(None, None) # send None to signal end
           print("redPoscdaq exiting") 
           sys.exit()
           
def redP_to_rb(source_list=None, sink_list=None, observe_list=None, config_dict=None, **rb_info):
    """
    Get data from RedPitaya and pass data to buffer

    The class mimocorb.buffer_control/rbImport is used to interface to the
    newBuffer and Writer classes of the package mimoCoRB.mimo_buffer

    This example may serve as a template for other data sources

    :param config_dict: configuration dictionary

      - events_required: number of events to taken
      - number_of_samples, sample_time_ns, pretrigger_samples and analogue_offset
      - decimation index, invert fags, trigger mode and trigger direction for RedPitaya
    """

    # initialize mimocorb class inside redPoscidaq
    datasource= redP_mimocorb(config_dict=config_dict, sink_list=sink_list, **rb_info)
    #print("data source initialized")

    # start oscilloscope
    #print("starting osci")
    rp.run_rpControl(callback=datasource.data_sink, conf_dict=config_dict)
    

#daq = run_mimoDAQ('redP_mimoCoRB.yaml')
#daq.setup()
#RB_1 = daq.ringbuffers['RB_1']
#sink_dict = RB_1.new_writer()
#datasource= rp.redP_mimocorb(config_dict={}, sink_list=[sink_dict], RB_1='write')
#print("data source initialized")
#rp.run_rpControl(callback=datasource.data_sink)
#print("starting DAQ")
#daq.run()