def update_incand(self):
        """Update all the incandescents connected to OPP hardware.

        This is done once per game loop if changes have been made.

        It is currently assumed that the UART oversampling will guarantee proper
        communication with the boards.  If this does not end up being the case,
        this will be changed to update all the incandescents each loop.

        This is used for board with firmware < 2.1.0
        """
        for incand in self.opp_incands.values():
            if self.min_version[incand.chain_serial] >= 0x02010000:
                continue
            whole_msg = bytearray()
            # Check if any changes have been made
            if incand.old_state is None or (incand.old_state ^ incand.new_state) != 0:
                # Update card
                incand.old_state = incand.new_state
                msg = bytearray()
                msg.append(incand.addr)
                msg.extend(OppRs232Intf.INCAND_CMD)
                msg.extend(OppRs232Intf.INCAND_SET_ON_OFF)
                msg.append((incand.new_state >> 24) & 0xff)
                msg.append((incand.new_state >> 16) & 0xff)
                msg.append((incand.new_state >> 8) & 0xff)
                msg.append(incand.new_state & 0xff)
                msg.extend(OppRs232Intf.calc_crc8_whole_msg(msg))
                whole_msg.extend(msg)

            if whole_msg:
                # Note:  No need to send EOM at end of cmds
                send_cmd = bytes(whole_msg)

                if self.debug:
                    self.debug_log("Update incand on %s cmd:%s", incand.chain_serial,
                                   "".join(HEX_FORMAT % b for b in send_cmd))
                self.send_to_processor(incand.chain_serial, send_cmd)