Esempio n. 1
0
    def __init__(self, lotus):
        self.lotus = lotus
        self.patterns = []
        self.rewards = []
        self.frame = 0
        self.counter = 0
        self.lilypad_frame = 0
        self.lilypad = 0
        self.lilypad_hue = 0.0
        self.paparazzi = Paparazzi()
        self.black = Black()
        self.attract_count = 0
        self.mode = FOREPLAY_MODE

        GPIO.setwarnings(False)
        GPIO.setmode(GPIO.BOARD)
        GPIO.setup(12, GPIO.OUT)
        GPIO.setup(16, GPIO.OUT)
        GPIO.output(12, 0)
        GPIO.output(16, 0) 

        images = [f for f in listdir(settings.ATTRACT_PATH) if isfile(join(settings.ATTRACT_PATH, f))]
        for image in images:
            self.patterns.append(SlitScan(join(settings.ATTRACT_PATH, image), 1))

        images = [f for f in listdir(settings.REWARD_PATH) if isfile(join(settings.REWARD_PATH, f))]
        for image in images:
            self.rewards.append(SlitScan(join(settings.REWARD_PATH, image), 1))
Esempio n. 2
0
class GeyserMode:

    def __init__(self, lotus):
        self.lotus = lotus
        self.patterns = []
        self.rewards = []
        self.frame = 0
        self.counter = 0
        self.lilypad_frame = 0
        self.lilypad = 0
        self.lilypad_hue = 0.0
        self.paparazzi = Paparazzi()
        self.black = Black()
        self.attract_count = 0
        self.mode = FOREPLAY_MODE

        GPIO.setwarnings(False)
        GPIO.setmode(GPIO.BOARD)
        GPIO.setup(12, GPIO.OUT)
        GPIO.setup(16, GPIO.OUT)
        GPIO.output(12, 0)
        GPIO.output(16, 0) 

        images = [f for f in listdir(settings.ATTRACT_PATH) if isfile(join(settings.ATTRACT_PATH, f))]
        for image in images:
            self.patterns.append(SlitScan(join(settings.ATTRACT_PATH, image), 1))

        images = [f for f in listdir(settings.REWARD_PATH) if isfile(join(settings.REWARD_PATH, f))]
        for image in images:
            self.rewards.append(SlitScan(join(settings.REWARD_PATH, image), 1))

    def openLotus(self):
        GPIO.output(12, 1)
        GPIO.output(16, 0)

    def closeLotus(self):
        GPIO.output(12, 0)
        GPIO.output(16, 1)
        self.blossom_pattern.speed = -1

    def showLotus(self):
        GPIO.output(12, 0)
        GPIO.output(16, 0)

    def hideLotus(self):
        GPIO.output(12, 0)
        GPIO.output(16, 0)
        self.mode = ATTRACT_MODE
        self.front_pattern = self.black
        self.back_pattern = self.black
        self.frame = settings.BLACK_FRAMES
        self.attract_count = -1

    def startMode(self):
        for lilypad in self.lotus.lilypads:
            lilypad.setColor(0)

        self.lotus.blossom.clear()
        self.frame = settings.FOREPLAY_FRAMES

        self.transition = 64
        self.back_pattern = random.choice(self.patterns)
        self.front_pattern = None
        self.is_transitioning = False

    def stopMode(self):
        GPIO.output(12, 0)
        GPIO.output(16, 0)

    def update(self):
        if self.mode == BLOSSOM_MODE:
            self.lotus.blossom.data = self.blossom_pattern.draw()

        elif self.mode == FOREPLAY_MODE:
            self.lotus.blossom.data = self.paparazzi.draw()
            self.frame -= 1

            if self.frame == 0:
                self.mode = BLOSSOM_MODE
                self.openLotus()
                reactor.callLater(settings.BLOSSOM_OPEN_TIME, self.showLotus)
                reactor.callLater(settings.BLOSSOM_OPEN_TIME + settings.BLOSSOM_SHOW_TIME, self.closeLotus)
                reactor.callLater((settings.BLOSSOM_OPEN_TIME + settings.BLOSSOM_CLOSE_TIME) + settings.BLOSSOM_SHOW_TIME, self.hideLotus)
                self.blossom_pattern = random.choice(self.rewards)
                self.blossom_pattern.speed = 2


        elif self.mode == TRANSITION_MODE:
            if self.transition == 0:
                self.back_pattern = self.front_pattern
                self.lotus.blossom.data = self.back_pattern.draw()
                self.frame = random.randint(settings.MIN_ATTRACT_FRAMES, settings.MAX_ATTRACT_FRAMES)
                self.frame -= 1
                self.front_pattern = None
                self.mode = ATTRACT_MODE

            else:
                inv = 4 * self.transition + 1
                alpha = 257 - inv

                back_buffer = self.back_pattern.draw()
                front_buffer = self.front_pattern.draw()

                for i in range(len(self.lotus.blossom.data)):
                    self.lotus.blossom.data[i] = (front_buffer[i] * alpha + back_buffer[i] * inv) >> 8

                self.transition -= 1

        else:
            self.lotus.blossom.data = self.back_pattern.draw()
            self.frame -= 1

            # done with pattern, pick the next one
            if self.frame == 0:
                self.attract_count += 1

                if self.attract_count == settings.BLOSSOM_RATE:
                    self.mode = FOREPLAY_MODE
                    self.frame = settings.FOREPLAY_FRAMES

                else:
                    self.mode = TRANSITION_MODE
                    self.front_pattern = random.choice(self.patterns)
                    while self.front_pattern == self.back_pattern:
                        self.front_pattern = random.choice(self.patterns)
                    self.front_pattern.speed = random.choice([-1, 1])

                    self.transition = 64

#        make the lilypads spin
        if self.lilypad_frame == 0:
            self.lilypad_hue = math.fmod(self.lilypad_hue, 1)
            rgb = colorsys.hsv_to_rgb(self.lilypad_hue, 1, settings.ATTRACT_LILYPAD_BRIGHTNESS)

            self.lilypad_hue += settings.ATTRACT_LILYPAD_HUE_STEP
            self.lilypad += 1
            self.lilypad %= settings.LILYPADS

            for i, lilypad in enumerate(self.lotus.lilypads):
                if i != self.lilypad:
                    lilypad.setColor(0)
                else:
                    lilypad.setColor(int(rgb[0] * 255) << 16 | int(rgb[1] * 255) << 8 | int(rgb[2] * 255))

        self.lilypad_frame += 1

        if self.lilypad_frame == settings.ATTRACT_LILYPAD_RATE:
            self.lilypad_frame = 0