示例#1
0
def elevator_setter(elevator, tic):
    """Elevator Setter
    
    This is a procedure, which functions as a setter for all attributes of the elevator.
    When called the level and direction of the elevator are updated.
    """

    if elevator.spec_list[tic] != 10:
        elevator.set_level(elevator.spec_list[tic])
        try:
            if elevator.get_level() > elevator.spec_list[-1]:
                elevator.set_direction("down")
            elif elevator.spec_list[-1] > elevator.get_level():
                elevator.set_direction("up")
            else:
                elevator.set_direction("none")
        except IndexError:
            elevator.set_direction("none")
    elif elevator.spec_list[tic] == 10 and len(elevator.spec_list[tic:]) > 1:
        if elevator.get_level() > elevator.spec_list[-1]:
            elevator.set_direction("down")
        elif elevator.spec_list[-1] > elevator.get_level():
            elevator.set_direction("up")
        else:
            elevator.set_direction("none")
    else:
        elevator.set_direction("none")
def assign_common_stop(destination, elevator, match_tic, tic):
    """Assign a common stop

    This procedure is called from the main controller for an elevator after 
    the comparision, for which elevator the job should be assigned to. 
    Then the job is built as a list in range from level to destination. 
    This list is then appended to the list of levels which the elevator
    passes.
    """

    list = []
    destination = int(destination)

    if elevator.get_level() > destination:
        list.append("r")
        for lev in range(elevator.get_level(), destination - 1, -1):
            list.append(lev)
    elif elevator.get_level() < destination:
        list.append("h")
        for lev in range(elevator.get_level(), destination + 1):
            list.append(lev)
    elif elevator.get_level() == destination:
        list.append("same floor")
        list = [destination]

    for level in level_stop(destination):
        list.insert(-1, level)

    if elevator.spec_list[tic] == 10 and len(elevator.spec_list[tic:]) == 1:
        print("Starts from idle-position.")
        elevator.spec_list.extend(list[2:])
    else:
        for level in level_stop(destination):
            elevator.spec_list.insert(
                elevator.spec_list[tic:].index(destination) + tic, level)
def common_job_comparer(elevator, job, tic):
    """Common Job Assigner

    The common jobs from outside the elevator are passed to this function. It 
    takes the job and checks if it is possible to assign it to an elevator. It
    return values which are then compared by the main controller.
    """

    print("Common Job Assigner for:", job)
    new_tic = -1
    match_number = 0
    direction = ""
    match = False
    infos = ""

    # if no jobs left get people from floors
    if elevator.spec_list[tic] == 10 and len(elevator.spec_list[tic:]) == 1:
        if len(job) > 2:
            infos = abs(elevator.get_level() - (-1))
        else:
            infos = abs(elevator.get_level() - int(job[0]))
        return infos

    # check if elevator passes level and check if direction of elevator is
    # equal to job direction
    for lev in elevator.spec_list[tic:]:
        new_tic += 1

        if int(job[0]) == lev:
            match = True

        if match is True:
            if elevator.get_level() > elevator.spec_list[tic + new_tic]:
                direction = "r"
            elif elevator.get_level() < elevator.spec_list[tic + new_tic]:
                direction = "h"
            if direction == job[1] and match is True:
                match_number += 1
                return new_tic + 1

            else:
                break

    return "no match"
def job_builder(elevator, jobs):
    """Job Builder

    Takes a job and and builds a list with numbers in range from current level
    to destination of job.
    Return the list.
    """

    built_jobs = []

    for job in jobs:
        if job == elevator.name + "c":
            built_jobs.append(elevator.name + 'c')
            continue
        if len(job) != 0:
            if elevator.get_name() == job[0]:

                list = []

                if len(job) < 3:
                    destination = int(job[1])
                else:
                    destination = -1

                if elevator.get_level() > destination:
                    for lev in range(elevator.get_level(), destination - 1,
                                     -1):
                        list.append(lev)
                elif elevator.get_level() < destination:
                    for lev in range(elevator.get_level(), destination + 1):
                        list.append(lev)
                elif elevator.get_level() == destination:
                    list.append("same floor")
                    list = [destination]

                list.extend(level_stop(destination))

                built_jobs.append(list)

                # jobs.remove(job)  # removes the converted jobs

    return built_jobs
def spec_job_assigner(elevator, tic, jobs):
    """ Specific Job Assigner

    This function takes the specific jobs and assigns them to their elevator.
    If a job is not in the direction of the elevator it remains and is later
    on reassigned to the specific-jobs. At the beginning we take our jobs, 
    which we received from the main_controller, and build a list with the 
    range of numbers from the current level to our destination. Then we run 
    every list through our "function", which either assigns it to the elevator
    or appends it to the remaining job list, which is later on returned. 
    (In the function we take the first element of our job and the first 
    element of the current job list of the elevator and compare them. If 
    they are not identical we the next level of the current job list of the
    elevator. If we have a match the next level from the elevator is compared.
    If those are identical we go on. If not we take the next level from the
    job and start over until one of the cases is reached (1. Compared every 
    element 2. Had a match and now not anymore 3. List only consist of 
    one job 4. No current elevator jobs). The return value of this function
    is always the remaining job list.
    """

    remaining_spec_jobs = []

    jobs = improved_controller.delete_doubles(jobs)

    converted_jobs = job_builder(elevator, jobs)

    for job in converted_jobs:

        improved_controller.elevator_setter(elevator, tic)

        if job == elevator.name + "c":
            print("Doors closing --- Caution!")
            if len(elevator.spec_list[tic:]) >= 2:
                if elevator.spec_list[tic] == elevator.spec_list[tic + 1]:
                    elevator.spec_list.remove(elevator.spec_list[tic + 1])
            continue

        counter = -1
        tic_plus_x = 0
        hit = False

        # we determine the job direction
        job_direction = "none"
        if int(job[-1]) > elevator.get_level():
            job_direction = "up"
        elif int(job[-1]) < elevator.get_level():
            job_direction = "down"

        if elevator.get_direction() == job_direction or elevator.get_direction(
        ) == "none":
            # only append the jobs that are in the same direction

            if elevator.spec_list[tic] == 10 and len(
                    elevator.spec_list[tic:]) == 1:  # 4.
                elevator.spec_list.extend(job[1:])
                continue

            for lev in job:
                counter += 1

                if tic_plus_x == len(
                        elevator.spec_list[tic:]) and hit is True:  # 1.
                    elevator.spec_list.extend(job[counter:])
                    break

                if hit is True and elevator.spec_list[tic +
                                                      tic_plus_x] != lev:  # 2.
                    for level in job[counter:]:
                        elevator.spec_list.insert(tic + tic_plus_x - 1, level)
                    break

                for spec_lev in elevator.spec_list[tic + tic_plus_x:]:
                    # [tic:] means look at all levels after the current tic

                    if tic_plus_x - 1 == len(
                            elevator.spec_list[tic:]) and hit is True:  # 2.
                        break

                    if job[-1] == spec_lev:  # 3.
                        try:
                            if job[-1] == elevator.spec_list[tic + tic_plus_x +
                                                             1]:
                                break
                        except IndexError:
                            print("Not in List")

                    if lev == spec_lev:
                        hit = True
                        tic_plus_x += 1
                        continue

                    elif hit is True:
                        break

                    tic_plus_x += 1

                if tic_plus_x - 1 == len(
                        elevator.spec_list[tic:]) and hit is True:  # 1.
                    elevator.spec_list.extend(job[counter:])
                    break

                try:
                    if job[-1] == spec_lev and job[-1] == elevator.spec_list[
                            tic + tic_plus_x + 1]:
                        break
                except IndexError:
                    break

        # if a job can not be assigned, because it is not in the same
        # direction it is appended
        # to the remaining_job_list
        else:
            if job[-1] == -1:
                rema_job = elevator.name + "-1"
            else:
                rema_job = elevator.name + str(job[-1])
            try:
                remaining_spec_jobs.remove(rema_job)
            except ValueError:
                None
            remaining_spec_jobs.append(rema_job)  # save the remaining jobs

    return remaining_spec_jobs