Ejemplo n.º 1
0
 def mouth_text(self, text=""):
     """Display text (scrolling as needed)
     Args:
         text (str): text string to display
     """
     DisplayManager.set_active(self.name)
     self.ws.emit(Message("enclosure.mouth.text", {'text': text}))
Ejemplo n.º 2
0
 def mouth_text(self, text=""):
     """Display text (scrolling as needed)
     Args:
         text (str): text string to display
     """
     DisplayManager.set_active(self.name)
     self.ws.emit(Message("enclosure.mouth.text", {'text': text}))
Ejemplo n.º 3
0
 def register(self, skill_name=""):
     """Registers a skill as active. Used for speak() and speak_dialog()
     to 'patch' a previous implementation. Somewhat hacky.
     """
     if self.name != "":
         DisplayManager.set_active(self.name)
     else:
         DisplayManager.set_active(skill_name)
Ejemplo n.º 4
0
 def register(self, skill_name=""):
     """Registers a skill as active. Used for speak() and speak_dialog()
     to 'patch' a previous implementation. Somewhat hacky.
     """
     if self.name != "":
         DisplayManager.set_active(self.name)
     else:
         DisplayManager.set_active(skill_name)
Ejemplo n.º 5
0
    def weather_display(self, img_code, temp):
        """Show a the temperature and a weather icon

        Args:
            img_code (char): one of the following icon codes
                         0 = sunny
                         1 = partly cloudy
                         2 = cloudy
                         3 = light rain
                         4 = raining
                         5 = stormy
                         6 = snowing
                         7 = wind/mist
            temp (int): the temperature (either C or F, not indicated)
        """
        DisplayManager.set_active(self.name)
        self.ws.emit(Message("enclosure.weather.display",
                             {'img_code': img_code, 'temp': temp}))
Ejemplo n.º 6
0
    def weather_display(self, img_code, temp):
        """Show a the temperature and a weather icon

        Args:
            img_code (char): one of the following icon codes
                         0 = sunny
                         1 = partly cloudy
                         2 = cloudy
                         3 = light rain
                         4 = raining
                         5 = stormy
                         6 = snowing
                         7 = wind/mist
            temp (int): the temperature (either C or F, not indicated)
        """
        DisplayManager.set_active(self.name)
        self.ws.emit(Message("enclosure.weather.display",
                             {'img_code': img_code, 'temp': temp}))
Ejemplo n.º 7
0
 def mouth_display(self, img_code="", x=0, y=0, refresh=True):
     """Display images on faceplate. Currently supports images up to 16x8,
        or half the face. You can use the 'x' parameter to cover the other
        half of the faceplate.
     Args:
         img_code (str): text string that encodes a black and white image
         x (int): x offset for image
         y (int): y offset for image
         refresh (bool): specify whether to clear the faceplate before
                         displaying the new image or not.
                         Useful if you'd like to display muliple images
                         on the faceplate at once.
     """
     DisplayManager.set_active(self.name)
     self.ws.emit(Message('enclosure.mouth.display',
                          {'img_code': img_code,
                           'xOffset': x,
                           'yOffset': y,
                           'clearPrev': refresh}))
Ejemplo n.º 8
0
 def mouth_display(self, img_code="", x=0, y=0, refresh=True):
     """Display images on faceplate. Currently supports images up to 16x8,
        or half the face. You can use the 'x' parameter to cover the other
        half of the faceplate.
     Args:
         img_code (str): text string that encodes a black and white image
         x (int): x offset for image
         y (int): y offset for image
         refresh (bool): specify whether to clear the faceplate before
                         displaying the new image or not.
                         Useful if you'd like to display muliple images
                         on the faceplate at once.
     """
     DisplayManager.set_active(self.name)
     self.ws.emit(Message('enclosure.mouth.display',
                          {'img_code': img_code,
                           'xOffset': x,
                           'yOffset': y,
                           'clearPrev': refresh}))
Ejemplo n.º 9
0
    def mouth_display_png(self,
                          image_absolute_path,
                          threshold=70,
                          invert=False,
                          x=0,
                          y=0,
                          refresh=True):
        """Converts a png image into the appropriate encoding for the
            Arduino Mark I enclosure.

            NOTE: extract this out of api.py when re structuing the
                  enclosure folder

            Args:
                image_absolute_path (string): The absolute path of the image
                threshold (int): The value ranges from 0 to 255. The pixel will
                                 draw on the faceplate it the value is below a
                                 threshold
                invert (bool): inverts the image being drawn.
                x (int): x offset for image
                y (int): y offset for image
                refresh (bool): specify whether to clear the faceplate before
                                displaying the new image or not.
                                Useful if you'd like to display muliple images
                                on the faceplate at once.
            """
        DisplayManager.set_active(self.name)

        # to understand how this funtion works you need to understand how the
        # Mark I arduino proprietary encoding works to display to the faceplate
        img = Image.open(image_absolute_path).convert("RGBA")
        img2 = Image.new('RGBA', img.size, (255, 255, 255))
        width = img.size[0]
        height = img.size[1]

        # strips out alpha value and blends it with the RGB values
        img = Image.alpha_composite(img2, img)
        img = img.convert("L")

        # crop image to only allow a max width of 16
        if width > 32:
            img = img.crop((0, 0, 32, height))
            width = img.size[0]
            height = img.size[1]

        # crop the image to limit the max height of 8
        if height > 8:
            img = img.crop((0, 0, width, 8))
            width = img.size[0]
            height = img.size[1]

        encode = ""

        # Each char value represents a width number starting with B=1
        # then increment 1 for the next. ie C=2
        width_codes = [
            'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
            'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '[',
            '\\', ']', '^', '_', '`', 'a'
        ]

        height_codes = ['B', 'C', 'D', 'E', 'F', 'G', 'H', 'I']

        encode += width_codes[width - 1]
        encode += height_codes[height - 1]

        # Turn the image pixels into binary values 1's and 0's
        # the Mark I face plate encoding uses binary values to
        # binary_values returns a list of 1's and 0s'. ie ['1', '1', '0', ...]
        binary_values = []
        for i in range(width):
            for j in range(height):
                if img.getpixel((i, j)) < threshold:
                    if invert is False:
                        binary_values.append('1')
                    else:
                        binary_values.append('0')
                else:
                    if invert is False:
                        binary_values.append('0')
                    else:
                        binary_values.append('1')

        # these values are used to determine how binary values
        # needs to be grouped together
        number_of_top_pixel = 0
        number_of_bottom_pixel = 0

        if height > 4:
            number_of_top_pixel = 4
            number_of_bottom_pixel = height - 4
        else:
            number_of_top_pixel = height

        # this loop will group together the individual binary values
        # ie. binary_list = ['1111', '001', '0101', '100']
        binary_list = []
        binary_code = ''
        increment = 0
        alternate = False
        for val in binary_values:
            binary_code += val
            increment += 1
            if increment == number_of_top_pixel and alternate is False:
                # binary code is reversed for encoding
                binary_list.append(binary_code[::-1])
                increment = 0
                binary_code = ''
                alternate = True
            elif increment == number_of_bottom_pixel and alternate is True:
                binary_list.append(binary_code[::-1])
                increment = 0
                binary_code = ''
                alternate = False

        # Code to let the Makrk I arduino know where to place the
        # pixels on the faceplate
        pixel_codes = [
            'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
            'N', 'O', 'P'
        ]

        for binary_values in binary_list:
            number = int(binary_values, 2)
            pixel_code = pixel_codes[number]
            encode += pixel_code

        self.ws.emit(
            Message(
                "enclosure.mouth.display", {
                    'img_code': encode,
                    'xOffset': x,
                    'yOffset': y,
                    'clearPrev': refresh
                }))
Ejemplo n.º 10
0
 def mouth_reset(self):
     """Restore the mouth display to normal (blank)"""
     self.ws.emit(Message("enclosure.mouth.reset"))
     DisplayManager.set_active(self.name)
Ejemplo n.º 11
0
 def mouth_smile(self):
     """Show a 'smile' image or animation"""
     self.ws.emit(Message("enclosure.mouth.smile"))
     DisplayManager.set_active(self.name)
Ejemplo n.º 12
0
 def mouth_listen(self):
     """Show a 'thinking' image or animation"""
     self.ws.emit(Message("enclosure.mouth.listen"))
     DisplayManager.set_active(self.name)
Ejemplo n.º 13
0
 def mouth_talk(self):
     """Show a generic 'talking' animation for non-synched speech"""
     self.ws.emit(Message("enclosure.mouth.talk"))
     DisplayManager.set_active(self.name)
Ejemplo n.º 14
0
 def mouth_reset(self):
     """Restore the mouth display to normal (blank)"""
     self.ws.emit(Message("enclosure.mouth.reset"))
     DisplayManager.set_active(self.name)
Ejemplo n.º 15
0
 def mouth_talk(self):
     """Show a generic 'talking' animation for non-synched speech"""
     self.ws.emit(Message("enclosure.mouth.talk"))
     DisplayManager.set_active(self.name)
Ejemplo n.º 16
0
    def mouth_display_png(self, image_absolute_path, threshold=70,
                          invert=False, x=0, y=0, refresh=True):
        """Converts a png image into the appropriate encoding for the
            Arduino Mark I enclosure.

            NOTE: extract this out of api.py when re structuing the
                  enclosure folder

            Args:
                image_absolute_path (string): The absolute path of the image
                threshold (int): The value ranges from 0 to 255. The pixel will
                                 draw on the faceplate it the value is below a
                                 threshold
                invert (bool): inverts the image being drawn.
                x (int): x offset for image
                y (int): y offset for image
                refresh (bool): specify whether to clear the faceplate before
                                displaying the new image or not.
                                Useful if you'd like to display muliple images
                                on the faceplate at once.
            """
        DisplayManager.set_active(self.name)

        # to understand how this funtion works you need to understand how the
        # Mark I arduino proprietary encoding works to display to the faceplate
        img = Image.open(image_absolute_path).convert("RGBA")
        img2 = Image.new('RGBA', img.size, (255, 255, 255))
        width = img.size[0]
        height = img.size[1]

        # strips out alpha value and blends it with the RGB values
        img = Image.alpha_composite(img2, img)
        img = img.convert("L")

        # crop image to only allow a max width of 16
        if width > 32:
            img = img.crop((0, 0, 32, height))
            width = img.size[0]
            height = img.size[1]

        # crop the image to limit the max height of 8
        if height > 8:
            img = img.crop((0, 0, width, 8))
            width = img.size[0]
            height = img.size[1]

        encode = ""

        # Each char value represents a width number starting with B=1
        # then increment 1 for the next. ie C=2
        width_codes = ['B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L',
                       'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
                       'X', 'Y', 'Z', '[', '\\', ']', '^', '_', '`', 'a']

        height_codes = ['B', 'C', 'D', 'E', 'F', 'G', 'H', 'I']

        encode += width_codes[width - 1]
        encode += height_codes[height - 1]

        # Turn the image pixels into binary values 1's and 0's
        # the Mark I face plate encoding uses binary values to
        # binary_values returns a list of 1's and 0s'. ie ['1', '1', '0', ...]
        binary_values = []
        for i in range(width):
            for j in range(height):
                if img.getpixel((i, j)) < threshold:
                    if invert is False:
                        binary_values.append('1')
                    else:
                        binary_values.append('0')
                else:
                    if invert is False:
                        binary_values.append('0')
                    else:
                        binary_values.append('1')

        # these values are used to determine how binary values
        # needs to be grouped together
        number_of_top_pixel = 0
        number_of_bottom_pixel = 0

        if height > 4:
            number_of_top_pixel = 4
            number_of_bottom_pixel = height - 4
        else:
            number_of_top_pixel = height

        # this loop will group together the individual binary values
        # ie. binary_list = ['1111', '001', '0101', '100']
        binary_list = []
        binary_code = ''
        increment = 0
        alternate = False
        for val in binary_values:
            binary_code += val
            increment += 1
            if increment == number_of_top_pixel and alternate is False:
                # binary code is reversed for encoding
                binary_list.append(binary_code[::-1])
                increment = 0
                binary_code = ''
                alternate = True
            elif increment == number_of_bottom_pixel and alternate is True:
                binary_list.append(binary_code[::-1])
                increment = 0
                binary_code = ''
                alternate = False

        # Code to let the Makrk I arduino know where to place the
        # pixels on the faceplate
        pixel_codes = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
                       'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P']

        for binary_values in binary_list:
            number = int(binary_values, 2)
            pixel_code = pixel_codes[number]
            encode += pixel_code

        self.ws.emit(Message("enclosure.mouth.display",
                             {'img_code': encode,
                              'xOffset': x,
                              'yOffset': y,
                              'clearPrev': refresh}))
Ejemplo n.º 17
0
 def mouth_listen(self):
     """Show a 'thinking' image or animation"""
     self.ws.emit(Message("enclosure.mouth.listen"))
     DisplayManager.set_active(self.name)
Ejemplo n.º 18
0
 def mouth_smile(self):
     """Show a 'smile' image or animation"""
     self.ws.emit(Message("enclosure.mouth.smile"))
     DisplayManager.set_active(self.name)