def digital_message(self, data):
port = data[<NUM_LIT:0>]<EOL>port_data = (data[self.MSB] << <NUM_LIT:7>) + data[self.LSB]<EOL>pin = port * <NUM_LIT:8><EOL>for pin in range(pin, min(pin + <NUM_LIT:8>, self.total_pins_discovered)):<EOL><INDENT>with self.pymata.data_lock:<EOL><INDENT>prev_data = self.digital_response_table[pin][self.RESPONSE_TABLE_PIN_DATA_VALUE]<EOL>self.digital_response_table[pin][self.RESPONSE_TABLE_PIN_DATA_VALUE] = port_data & <NUM_LIT><EOL>if prev_data != port_data & <NUM_LIT>:<EOL><INDENT>callback = self.digital_response_table[pin][self.RESPONSE_TABLE_CALLBACK]<EOL>if callback:<EOL><INDENT>callback([self.pymata.DIGITAL, pin,<EOL>self.digital_response_table[pin][self.RESPONSE_TABLE_PIN_DATA_VALUE]])<EOL><DEDENT><DEDENT>latching_entry = self.digital_latch_table[pin]<EOL>if latching_entry[self.LATCH_STATE] == self.LATCH_ARMED:<EOL><INDENT>if latching_entry[self.LATCHED_THRESHOLD_TYPE] == self.DIGITAL_LATCH_LOW:<EOL><INDENT>if (port_data & <NUM_LIT>) == <NUM_LIT:0>:<EOL><INDENT>if latching_entry[self.DIGITAL_LATCH_CALLBACK] is not None:<EOL><INDENT>self.digital_latch_table[pin] = [<NUM_LIT:0>, <NUM_LIT:0>, <NUM_LIT:0>, <NUM_LIT:0>, None]<EOL>latching_entry[self.DIGITAL_LATCH_CALLBACK](<EOL>[self.pymata.OUTPUT | self.pymata.LATCH_MODE,<EOL>pin, <NUM_LIT:0>, time.time()])<EOL><DEDENT>else:<EOL><INDENT>updated_latch_entry = latching_entry<EOL>updated_latch_entry[self.LATCH_STATE] = self.LATCH_LATCHED<EOL>updated_latch_entry[self.DIGITAL_LATCHED_DATA] = self.DIGITAL_LATCH_LOW<EOL>updated_latch_entry[self.DIGITAL_TIME_STAMP] = time.time()<EOL><DEDENT><DEDENT>else:<EOL><INDENT>pass<EOL><DEDENT><DEDENT>elif latching_entry[self.LATCHED_THRESHOLD_TYPE] == self.DIGITAL_LATCH_HIGH:<EOL><INDENT>if port_data & <NUM_LIT>:<EOL><INDENT>if latching_entry[self.DIGITAL_LATCH_CALLBACK] is not None:<EOL><INDENT>self.digital_latch_table[pin] = [<NUM_LIT:0>, <NUM_LIT:0>, <NUM_LIT:0>, <NUM_LIT:0>, None]<EOL>latching_entry[self.DIGITAL_LATCH_CALLBACK](<EOL>[self.pymata.OUTPUT | self.pymata.LATCH_MODE,<EOL>pin, <NUM_LIT:1>, time.time()])<EOL><DEDENT>else:<EOL><INDENT>updated_latch_entry = latching_entry<EOL>updated_latch_entry[self.LATCH_STATE] = self.LATCH_LATCHED<EOL>updated_latch_entry[self.DIGITAL_LATCHED_DATA] = self.DIGITAL_LATCH_HIGH<EOL>updated_latch_entry[self.DIGITAL_TIME_STAMP] = time.time()<EOL><DEDENT><DEDENT>else:<EOL><INDENT>pass<EOL><DEDENT><DEDENT><DEDENT>else:<EOL><INDENT>pass<EOL><DEDENT><DEDENT>port_data >>= <NUM_LIT:1><EOL><DEDENT>
This method handles the incoming digital message.
It stores the data values in the digital response table.
Data is stored for all 8 bits of a  digital port

:param data: Message data from Firmata

:return: No return value.