def register_tile(self, hw_type, api_major, api_minor, name, fw_major, fw_minor, fw_patch, exec_major, exec_minor, exec_patch, slot, unique_id):
        """Register a tile with this controller.

        This function adds the tile immediately to its internal cache of registered tiles
        and queues RPCs to send all config variables and start tile rpcs back to the tile.
        """

        api_info = (api_major, api_minor)
        fw_info = (fw_major, fw_minor, fw_patch)
        exec_info = (exec_major, exec_minor, exec_patch)

        address = 10 + slot
        info = TileInfo(hw_type, name, api_info, fw_info, exec_info, slot, unique_id, state=TileState.JUST_REGISTERED, address=address)

        self.tile_manager.insert_tile(info)

        debug = int(self.tile_manager.debug_mode)

        if self.tile_manager.safe_mode:
            run_level = RunLevel.SAFE_MODE
            info.state = TileState.SAFE_MODE
            config_rpcs = []
        else:
            run_level = RunLevel.START_ON_COMMAND
            info.state = TileState.BEING_CONFIGURED
            config_rpcs = self.config_database.stream_matching(address, name)

        self.tile_manager.queue.put_nowait((info, config_rpcs))

        return [address, run_level, debug]
Register a tile with this controller.

        This function adds the tile immediately to its internal cache of registered tiles
        and queues RPCs to send all config variables and start tile rpcs back to the tile.