Esempio n. 1
0
    def _state_pouring(self):
        self.driver.led_dispense()

        recipe = {}
        size = 0
        log_lines = {}
        dispensers = db.session.query(Dispenser).order_by(Dispenser.id).all()
        for booze_id in sorted(self.recipe.data.keys()):
            found = False
            for i in xrange(self.disp_count):
                disp = dispensers[i]

                if booze_id == disp.booze_id:
                    # if we're out of booze, don't consider this drink
                    if app.options.use_liquid_level_sensors and disp.out == LL_OUT:
                        raise BartendroCantPourError(
                            "Cannot make drink: Dispenser %d is out of booze."
                            % (i + 1))

                    found = True
                    ml = self.recipe.data[booze_id]
                    if ml <= 0:
                        log_lines[i] = "  %-2d %-32s %d ml (not dispensed)" % (
                            i, "%s (%d)" %
                            (disp.booze.name, disp.booze.id), ml)
                        continue

                    if ml > MAX_DISPENSE:
                        raise BartendroCantPourError(
                            "Cannot make drink. Invalid dispense quantity: %d ml. (Max %d ml)"
                            % (ml, MAX_DISPENSE))

                    recipe[i] = ml
                    size += ml
                    log_lines[i] = "  %-2d %-32s %d ml" % (
                        i, "%s (%d)" % (disp.booze.name, disp.booze.id), ml)
                    self.driver.set_motor_direction(i, MOTOR_DIRECTION_FORWARD)
                    continue

            if not found:
                raise BartendroCantPourErro(
                    "Cannot make drink. I don't have the required booze: %d" %
                    booze_id)

        self._dispense_recipe(recipe)

        if self.recipe.drink:
            log.info("Made cocktail: %s" % self.recipe.drink.name.name)
        else:
            log.info("Made custom drink:")
        for line in sorted(log_lines.keys()):
            log.info(log_lines[line])
        log.info("%s ml dispensed. done." % size)

        return fsm.EVENT_POUR_DONE
Esempio n. 2
0
    def _state_pre_shot(self):

        if not app.options.use_liquid_level_sensors:
            return fsm.EVENT_LL_OK

        try:
            ll = self._check_liquid_levels()
        except BartendroLiquidLevelReadError:
            raise BartendroBrokenError("Failed to read liquid levels")

        booze_id = self.recipe.data.keys()[0]
        dispensers = db.session.query(Dispenser).order_by(Dispenser.id).all()
        for i, disp in enumerate(dispensers):
            if disp.booze_id == booze_id:
                if disp.out == LL_OUT:
                    if ll == LL_OK:
                        app.globals.set_state(fsm.STATE_OK)
                    elif ll == LL_LOW:
                        app.globals.set_state(fsm.STATE_LOW)
                    elif ll == LL_OUT:
                        app.globals.set_state(fsm.STATE_OUT)
                    else:
                        app.globals.set_state(fsm.STATE_HARD_OUT)

                    raise BartendroCantPourError(
                        "Cannot make drink: Dispenser %d is out of booze." %
                        (i + 1))
                break

        return fsm.EVENT_LL_OK
Esempio n. 3
0
    def _state_pre_pour(self):
        try:
            ll = self._check_liquid_levels()
        except BartendroLiquidLevelReadError:
            raise BartendroBrokenError("Failed to read liquid levels")

        # update the list of drinks we can make
        drinks = self.get_available_drink_list()
        if len(drinks) == 0:
            raise BartendroCantPourError("Cannot make this drink now.")

        if ll == LL_OK:
            return fsm.EVENT_LL_OK

        if ll == LL_LOW:
            return fsm.EVENT_LL_LOW

        return LL_OUT