#-------------------------------------------------------------------------------
# Name:          PumpInterface
# Purpose:       Allows communication with the syringe pumps
# Authors:       Eric N
#
# Last Version:  22.09.2022
# Copyright:     (c) Institute of Technical Biocatalysis TUHH
# Licence:       GNU GPL-v3 
#-------------------------------------------------------------------------------
import time
from pumps_new_era import pumps_new_era

class PumpInterface:

    def __init__(self,InputManager) -> None:
        # get InputManager Data
        self.InputManager = InputManager
        self.AdminValues = self.InputManager.getAdminValues()
        self.startValues = self.InputManager.getStartValues()
        self.PumpMode = self.InputManager.getPumpMode()
        self.ControlMode = self.InputManager.getControlMode()

        if self.PumpMode == 1:
            self.nPumps = 1
        elif self.PumpMode == 2:
            self.nPumps = 2
        elif self.PumpMode == 3:
            self.nPumps = 4

        self.Rates = {}

        # setup the pumps
        self.setupPumps()

        # setup the purgeExperiment
        self.setupPurge()

    def setupPumps(self):
        self.pump = pumps_new_era()
        
        self.pump.setDiameter('01',self.startValues.DiameterS1)
        self.pump.setDiameter('02',self.startValues.DiameterS2)
        if self.PumpMode == 3:
            self.pump.setDiameter('03',self.startValues.DiameterS3)
            self.pump.setDiameter('04',self.startValues.DiameterS4)

    def setupPurge(self):
        self.purgeExperiment = {}
        for i in range(0,self.nPumps,2):
            self.purgeExperiment['FlowrateS%i'%(i+1)] = 0
            self.purgeExperiment['FlowrateS%i'%(i+2)] = self.AdminValues.PurgeFlow
        
    def runExperiment(self,experiment):
        self.pausePumps()
        self.setRates(experiment)
        self.runPumps()

    def purge(self):
        print("Starting long purge")
        self.runExperiment(self.purgeExperiment)
        time.sleep(self.AdminValues.PurgeTime*60*self.AdminValues.LastPurgeFactor)
        self.stopPumps()
        print("Finished long purge\n")

    def shortPurge(self):
        print("Starting short purge")
        self.runExperiment(self.purgeExperiment)
        time.sleep(self.AdminValues.PurgeTime*60)
        self.pausePumps()
        print("Finished short purge\n")

    def step(self):
        self.runExperiment(self.stepExperiment['Base'])
        time.sleep(60)
        self.runExperiment(self.stepExperiment['Step'])
        time.sleep(self.AdminValues.StepResTime*60)
        self.runExperiment(self.stepExperiment['Base'])
        time.sleep(self.AdminValues.StepMaxDelay*60)
        self.pausePumps()

    def setRates(self,experiment):
        for i in range(self.nPumps):
            self.Rates['Pump%i'%(i+1)] = experiment['FlowrateS%i'%(i+1)]
            self.pump.setRate('0%i'%(i+1),self.Rates['Pump%i'%(i+1)])

    def runPumps(self):
        for i in range(self.nPumps):
            # TODO: adjust check
            if self.Rates['Pump%i'%(i+1)] > 8.349/1000/60:
                self.pump.run('0%i'%(i+1))
            else:
                self.pump.pause('0%i'%(i+1))

    def pausePumps(self):
        for i in range(self.nPumps):
            self.pump.pause('0%i'%(i+1))

    def stopPumps(self):
        for i in range(self.nPumps):
            self.pump.stop('0%i'%(i+1))


if __name__ == '__main__':
    pass