"""
Example of a midas frontend that registers a deferred transition.

It is very similar to basic_frontend.py, but with extra functions
showing the use of a deferred transition. Only these extra functions
are documented.
"""

import midas
import midas.frontend
import midas.event
import datetime

class MyPeriodicEquipmentDef(midas.frontend.EquipmentBase):
    def __init__(self, client):
        equip_name = "MyPeriodicEquipmentDef"
        
        default_common = midas.frontend.InitialEquipmentCommon()
        default_common.equip_type = midas.EQ_PERIODIC
        default_common.buffer_name = "SYSTEM"
        default_common.trigger_mask = 0
        default_common.event_id = 1
        default_common.period_ms = 100
        default_common.read_when = midas.RO_RUNNING
        default_common.log_history = 1
        
        midas.frontend.EquipmentBase.__init__(self, client, equip_name, default_common)
        
        self.set_status("Initialized")
        
    def readout_func(self):
        event = midas.event.Event()

        data = [1,2,3,4,5,6,7,8]
        event.create_bank("MYBK", midas.TID_INT, data)
        
        return event

class MyFrontend(midas.frontend.FrontendBase):
    def __init__(self):
        midas.frontend.FrontendBase.__init__(self, "myfe_name_def")
        
        self.add_equipment(MyPeriodicEquipmentDef(self.client))

        # Here we register our callback function, saying we want to defer the
        # "stop run" transition until we've done some extra work.
        self.client.register_deferred_transition_callback(midas.TR_STOP, self.my_deferred_trans_check)
        self.dummy = None

    def my_deferred_trans_check(self, client, trans_type):
        # This function will be called repeatedly. When we're ready to actually
        # stop the run, we return True.
        # In this case, we just wait for 5s to elapse.
        # During these 5s, the run is still in progress, and we continue to write events.
        if self.dummy is None:
            self.dummy = datetime.datetime.now()

        if (datetime.datetime.now() - self.dummy).total_seconds() > 5:
            return True
        
        return False

    def begin_of_run(self, run_number):
        self.dummy = None

        self.set_all_equipment_status("Running", "greenLight")
        self.client.msg("Frontend has seen start of run number %d" % run_number)
        return midas.status_codes["SUCCESS"]
        
    def end_of_run(self, run_number):
        self.set_all_equipment_status("Finished", "greenLight")
        self.client.msg("Frontend has seen end of run number %d" % run_number)
        return midas.status_codes["SUCCESS"]
    
    def frontend_exit(self):
        print("Goodbye from user code!")
        
if __name__ == "__main__":
    with MyFrontend() as my_fe:
        my_fe.run()