class MyModel(gtkmvc.ModelMT):
    
    analogueValuesList = None
    displacement = None
    __observables__ = ['analogueValuesList', 'displacement']

    def __init__(self):
        gtkmvc.ModelMT.__init__(self)
        self.testingMachine = TestingMachine()
        self._setInitialValuesOfVariables()
        
    def _setInitialValuesOfVariables(self):
        self.nEvents = 0
        self.dataDirectory = '/home/crush/tmp'
        self.squashStroke = 44 # mm
        self.squashSpeed = 22 # mm/min
        self.fastSpeed = 110 # mm/min
        self.upStroke = -5 # mm
        self.downStroke = 5 # mm
        self.acceleration = 1.0 # mm/sec/sec
        self.boxId = 0

    def squash(self, nEventsAtStartOfSquashing):
        self._openFileForWriting()
        self.startSquashTime = time.time()
        self.testingMachine.moveUpDown(self.squashStroke, self.squashSpeed, \
            self.acceleration)
        self._recordTest(nEventsAtStartOfSquashing)
        self.cleanUpAfterSquashTest(nEventsAtStartOfSquashing)
        
    def _cleanUpAfterSquashTest(self, nEventsAtStart):
        self.testingMachine.moveUpDown(-self.squashStroke, self.squashSpeed, \
            self.acceleration)
        self.nEvents += 1

    def _recordTest(self, nEventsAtStartOfSquashing):
        try:
            while (self.testingMachine.isAtTargetPosition()==False and \
                self.nEvents==nEventsAtStartOfSquashing):
                self.updateAnalogueValuesList()
                self.writeOneLineOfDataToFile()
        finally:
            self._closeFile()

    def updateAnalgoueValuesList(self):
        tmp = []
        for i in range(6):
            tmp.append(self.testingMachine.getAnalogueMillivoltage(i))
        self.analogueValuesList = tmp
    
    def _writeOneLineOfDataToFile(self):
        self.displacement = self.testingMachine.getPASIUnits()
        lineToWriteToFile = '%f.3, %d, %d, %d, %d, %d, %d, %f.3\n' % \
            (self.displacement, \
                self.analogueValuesList[0], \
                self.analogueValuesList[1], \
                self.analogueValuesList[2], \
                self.analogueValuesList[3], \
                self.analogueValuesList[4], \
                self.analogueValuesList[5], \
                time.time() - self.startSquashTime)
        self.fid.write(lineToWriteToFile)

    def _openFileForWriting(self):
        self.fid = open('%s/box%s.csv' % (self.dataDirectory, \
            str(self.boxId)), 'w')
        self._writeHeader()

    def _writeHeader(self):
        self.fid.write('# distance_mm, load_cell_mV, time_seconds\n')

    def _closeFile(self):
        self.fid.close()

    def _tidyUpAfterSquash(self):
        self.testingMachine.stopMotor()
        self.nEvents += 1
        self.closeFile()
        self.testingMachine.moveSIUnits(0,returnToStartPosition())
    
    def _returnToStartPosition(self):
        self.moveUpDown(self.nEvents, -self.stroke)
        print('Box squashed')

    def moveUp(self, nEvents):
        self.testingMachine.moveUpDown(self.upStroke, self.fastSpeed, \
            self.acceleration)

    def moveDown(self, nEvents):
        self.testingMachine.moveUpDown(self.downStroke, self.fastSpeed, \
            self.acceleration)

    def moveDown(self, nEvents):
        self.testingMachine.moveUpDown(self.downStroke, self.fastSpeed, \
            self.acceleration)

    def stop(self, nEvents):
        self.testingMachine.stopMotor()        
 def __init__(self):
     gtkmvc.ModelMT.__init__(self)
     self.testingMachine = TestingMachine()
     self._setInitialValuesOfVariables()