def __init__(self):
        # Objects
        self.ext = osTools()  # Initialise data key press
        self.xls = xlsLogging(6)  # Initialise excel data logging
        self.pg = plotActiveGraph()  # For graphical plot (PV,SP,OP)
        self.rls = RLS()  # Initialise Recursive Least Squares Object
        self.MVC = MVController()  # Initialise Controller
        if int(sys.argv[1]) == 1:
            self.r = testModel("../../tests/")  # Initialise simulated lab rig
        else:
            self.rw = comClient()  # Initialise Modbus comms class

        # Variables
        self.count = 0  # For 'heart beat' counter
        self.intDataPoints = 10  # Initial Data Points to be read
        self.sampleTime = 40  # Controller loop time
class discreteMVC:
    def __init__(self):
        # Objects
        self.ext = osTools()  # Initialise data key press
        self.xls = xlsLogging(6)  # Initialise excel data logging
        self.pg = plotActiveGraph()  # For graphical plot (PV,SP,OP)
        self.rls = RLS()  # Initialise Recursive Least Squares Object
        self.MVC = MVController()  # Initialise Controller
        if int(sys.argv[1]) == 1:
            self.r = testModel("../../tests/")  # Initialise simulated lab rig
        else:
            self.rw = comClient()  # Initialise Modbus comms class

        # Variables
        self.count = 0  # For 'heart beat' counter
        self.intDataPoints = 10  # Initial Data Points to be read
        self.sampleTime = 40  # Controller loop time

    def run(self):
        z = np.array(
            [[0, self.X[0, self.intDataPoints - 1]], [0, self.X[1, self.intDataPoints - 1]]]
        )  # Array in the form Yt, Ut
        time.sleep(self.sampleTime - (time.time() - self.timer))
        startTime = time.time()  # For time reference
        print "Running Main Method..."

        while True:
            loopTime = time.time()  # Itteration start time
            r = self.dataPipe()  # Read controller data as r
            z[:, 0] = z[:, 1]  # Shift Array
            z[:, 1] = r.getRegister(0), r.getRegister(3)  # Update Array
            self.rls.solve(z[:, 0], z[0, 1])  # Call recursive least squares method
            self.xls.writeXls(startTime, r, self.rls.sysID)  # Pass data to excel for logging purposes
            self.pg.dataUpdate(
                (time.time() - startTime),
                r.getRegister(0),
                r.getRegister(2),
                r.getRegister(3),
                self.rls.sysID[0],
                self.rls.sysID[1],
            )
            u = self.MVC.run(z[0, 1], r.getRegister(2), (self.rls.sysID))

            if int(sys.argv[1]) == 1:
                self.r.writeModel(u)  # Write to model
            else:
                self.rw.dataHandler("w", u)  # Write to MODBUS system

            if self.ext.kbdExit():  # Detect exit condition
                break
            print self.count  # Heartbeat
            self.count += 1  # Heartbeat
            time.sleep(self.sampleTime - (time.time() - loopTime))

    def initialSetup(self):
        self.X = np.array([np.zeros(self.intDataPoints), np.zeros(self.intDataPoints)])
        self.Y = np.array([np.zeros(self.intDataPoints)])

        for i in range(0, self.intDataPoints):
            r = self.dataPipe()
            self.X[0, i] = r.getRegister(0)
            self.X[1, i] = r.getRegister(3)
            if i > 0:
                self.Y[:, i - 1] = self.X[0, i]
            if i < (self.intDataPoints - 1):
                time.sleep(self.sampleTime)
            time.sleep(self.sampleTime)
        self.timer = time.time()
        self.rls.setup(self.X[:, :-1], np.matrix.transpose(self.Y[:, :-1]))
        print "Setup Complete"

    def dataPipe(self):
        if int(sys.argv[1]) == 1:
            self.r.readModel()
            return self.r
        else:
            return self.rw.dataHandler("r")