Example #1
0
class Motorist(object):
    def __init__(self,f, pi, W, c, t):
        self.f = f
        self.pi = pi
        self.W = W
        self.c = c
        self.cprime = W*((c+W-1)/W)
        self.t = t
        self.Rs = W*((f.width-max(32,c)) / W)  / 8
        self.Ra = W*((f.width-32) / W)  / 8
        pistons = [Piston(f,self.Rs,self.Ra) for i in range(0,pi)]
        self.engine = Engine(pistons)
        self.phase = Phase.Ready

    def startEngine(self, SUV, tagFlag, T, unwrapFlag, forgetFlag):
        assert(self.phase == Phase.Ready)
        self.engine.injectCollective(SUV,True)

        if forgetFlag:
            self._makeKnot()

        r = self._handleTag(tagFlag, T, unwrapFlag)

        if r:
            self.phase = Phase.Riding

        return r

    def wrap(self, I, O, A, T, unwrapFlag, forgetFlag):
        assert(self.phase == Phase.Riding)

        ## i really dont understand the why in this statement
        if not I.hasMore() and not A.hasMore(): self.engine.inject(A)

        while I.hasMore():
            self.engine.crypt(I, O, unwrapFlag)
            self.engine.inject(A)

        while(A.hasMore()):
            self.engine.inject(A)

        if self.pi > 1 or forgetFlag:
            self._makeKnot()

        r = self._handleTag(True, T, unwrapFlag)
        if not r: O.erase()

        return r

    def _makeKnot(self,):
        Tprime = Buffer()
        self.engine.getTags(Tprime, [self.cprime / 8]*self.pi)

        Tprime.seek(0)

        self.engine.injectCollective(Tprime, False)

    def _handleTag(self, tagFlag, T, unwrapFlag):
        Tprime = Buffer()
        if not tagFlag:
            self.engine.getTags(Tprime, [0]*self.pi)
        else:
            l = [0] * self.pi
            l[0] = self.t/8
            self.engine.getTags(Tprime, l)
            if not unwrapFlag:
                T.clone(Tprime)
            elif Tprime != T:
                self.phase = Phase.Failed
                return False
        return True