def read_matrix_inp_resp(self, chain_serial, msg):
        """Read matrix switch changes.

        Args:
        ----
            chain_serial: Serial of the chain which received the message.
            msg: Message to parse.
        """
        # Single read gen2 input response.  Receive function breaks them down

        # Verify the CRC8 is correct
        if len(msg) < 11:
            self.log.warning("Msg too short: %s.", "".join(HEX_FORMAT % b for b in msg))
            self.opp_connection[chain_serial].lost_synch()
            return

        crc8 = OppRs232Intf.calc_crc8_part_msg(msg, 0, 10)
        if msg[10] != ord(crc8):
            self._bad_crc(chain_serial, msg)
        else:
            if chain_serial + '-' + str(msg[0]) not in self.matrix_inp_addr_dict:
                self.log.warning("Got input response for invalid matrix card: %s. Msg: %s.", msg[0],
                                 "".join(HEX_FORMAT % b for b in msg))
                return
            opp_inp = self.matrix_inp_addr_dict[chain_serial + '-' + str(msg[0])]
            new_state = ((msg[2] << 56) | (msg[3] << 48) | (msg[4] << 40) | (msg[5] << 32) |
                         (msg[6] << 24) | (msg[7] << 16) | (msg[8] << 8) | msg[9])

            changes = opp_inp.old_state ^ new_state
            if changes != 0:
                curr_bit = 1
                for index in range(32, 96):
                    if (curr_bit & changes) != 0:
                        if (curr_bit & new_state) == 0:
                            self.machine.switch_controller.process_switch_by_num(
                                state=1,
                                num=opp_inp.chain_serial + '-' + opp_inp.card_num + '-' + str(index),
                                platform=self)
                        else:
                            self.machine.switch_controller.process_switch_by_num(
                                state=0,
                                num=opp_inp.chain_serial + '-' + opp_inp.card_num + '-' + str(index),
                                platform=self)
                    curr_bit <<= 1
            opp_inp.old_state = new_state

        # we can continue to poll
        self._poll_response_received[chain_serial].set()