Exemplo n.º 1
0
def main():
    try:
        system=System()
        system.setGPIO()
        
    except KeyboardInterrupt:
            run = False
    finally:
        GPIO.cleanup();
Exemplo n.º 2
0
def main(argv):
    # TODO: Make mirror display diagnostic info on startup (especially warnings)
    # TODO: Make mirror clear warnings and start loop on first sensor activation (or after X seconds?)

    log = Logger()  # this has to be called at least once
    Logger.write.info('Starting up')
    try:
        Logger.write.debug('Initializing pygame')
        pygame.init()
    except (KeyboardInterrupt, SystemExit) as err:
        Logger.write.error('FATAL:' + err)
        raise

    relay_list = list(RELAYS.values())
    MirrorIO.init_gpio(relay_list, quiet=False)

    sensor = ActivationSensor(relay_list)
    last_input_state = sensor.read_input_state

    done = False

    try:
        log.write.info('Ready, starting loop')
        while not done:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    done = True
                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_SPACE:
                        new_state = not sensor.switch_override_state
                        log.write.info("Setting state " + str(new_state))
                        sensor.input_override(new_state)
                    elif event.key == pygame.K_ESCAPE or event.key == pygame.K_q:
                        done = True

            input_state = sensor.read_input_state()
            if input_state != last_input_state:
                time.sleep(DEBOUNCE_TIME)  # wait to make sure it really changed
                if input_state != last_input_state:
                    last_input_state = input_state
                    sensor.state_changed(input_state)
            time.sleep(0.1)
    except (KeyboardInterrupt, SystemExit):
        # TODO: fix GPIO emulator threading bug that prevents clean shutdown
        GPIO.cleanup()
        sys.exit
    finally:
        sensor.dme.stop()
        GPIO.cleanup()
        sys.exit
Exemplo n.º 3
0
def Main():
    try:
        GPIO.setmode(GPIO.BCM)

        GPIO.setwarnings(False)

        GPIO.setup("P8_7", GPIO.OUT, initial=GPIO.LOW)
        GPIO.setup("P8_8", GPIO.IN, initial=GPIO.LOW)

        # GPIO.setup(4, GPIO.OUT)
        # GPIO.setup(17, GPIO.OUT, initial = GPIO.LOW)
        # GPIO.setup(18, GPIO.OUT, initial = GPIO.LOW)
        # GPIO.setup(21, GPIO.OUT, initial = GPIO.LOW)
        # GPIO.setup(23, GPIO.IN, pull_up_down = GPIO.PUD_UP)
        # GPIO.setup(15, GPIO.IN, pull_up_down = GPIO.PUD_DOWN)
        # GPIO.setup(24, GPIO.IN, pull_up_down = GPIO.PUD_DOWN)
        # GPIO.setup(26, GPIO.IN)

        while (True):
            pass
            # if (GPIO.input(23) == False):
            #     GPIO.output(4,GPIO.HIGH)
            #     GPIO.output(17,GPIO.HIGH)
            #     time.sleep(1)

            # if (GPIO.input(15) == True):
            #     GPIO.output(18,GPIO.HIGH)
            #     GPIO.output(21,GPIO.HIGH)
            #     time.sleep(1)

            # if (GPIO.input(24) == True):
            #     GPIO.output(18,GPIO.LOW)
            #     GPIO.output(21,GPIO.LOW)
            #     time.sleep(1)

            # if (GPIO.input(26) == True):
            #     GPIO.output(4,GPIO.LOW)
            #     GPIO.output(17,GPIO.LOW)
            #     time.sleep(1)

    except Exception as ex:
        traceback.print_exc()
    finally:
        GPIO.cleanup()  #this ensures a clean exit
Exemplo n.º 4
0
def setupGPIO():
	try:
		#GPIO.setmode(GPIO.BOARD) 		# sets input to unified board pin numbers
		GPIO.setmode(GPIO.BCM)			# sets input to chip numbers, can differ per poard type

		GPIO.setwarnings(False)

		GPIO.setup(4, GPIO.OUT)
		GPIO.setup(17, GPIO.OUT, initial = GPIO.LOW)
		GPIO.setup(18, GPIO.OUT, initial = GPIO.LOW)
		GPIO.setup(21, GPIO.OUT, initial = GPIO.LOW)
		GPIO.setup(23, GPIO.IN, pull_up_down = GPIO.PUD_UP)
		GPIO.setup(15, GPIO.IN, pull_up_down = GPIO.PUD_DOWN)
		GPIO.setup(24, GPIO.IN, pull_up_down = GPIO.PUD_DOWN)
		GPIO.setup(26, GPIO.IN)

		while(True):
			if (GPIO.input(23) == False):
				GPIO.output(4,GPIO.HIGH)
				GPIO.output(17,GPIO.HIGH)
				time.sleep(1)

			if (GPIO.input(15) == True):
				GPIO.output(18,GPIO.HIGH)
				GPIO.output(21,GPIO.HIGH)
				time.sleep(1)

			if (GPIO.input(24) == True):
				GPIO.output(18,GPIO.LOW)
				GPIO.output(21,GPIO.LOW)
				time.sleep(1)

			if (GPIO.input(26) == True):
				GPIO.output(4,GPIO.LOW)
				GPIO.output(17,GPIO.LOW)
				time.sleep(1)

	except Exception as ex:
		traceback.print_exc()
	finally:
		GPIO.cleanup() #this ensures a clean exit
Exemplo n.º 5
0
def main():
    try:
        #Variables

        # Hard Coded LEDs and sensors as it relates to the PI's GPIO Pins
        LEDS = [
            15, 18, 23, 24, 8, 7, 12, 16, 21, 26, 19, 13, 5, 11, 9, 10, 27, 17,
            4, 3
        ]
        sensors = [14, 25, 20, 6, 22]
        #LEDS = [16,12,17,27,5,20,19,21]
        #sensors = [23,18]
        vehicles = [
        ]  # An array that contains vehicles that are currently traversing the PI's track. The data each element contain is a dict in the format of: {"currentPos": CurrentPos, "timePlaced": TimePlaced, "speed": Speed, "visionRange": VisionRange}

        LEDsMult = int(
            len(LEDS) /
            len(sensors))  # How many LEDs that is between two sensors
        sensorsNum = len(sensors)  # How many sensors that were entered
        sensorTime = [
            0
        ] * sensorsNum  # Time at which the sensor was passed, initialized to 0 because that is the lowest possible time that can be achieved
        sensorState = [
            0
        ] * sensorsNum  # Since the sensor is 'enabled' for the length of time the vehicle passes near the sensor, this is used to keep check of the exact point where the state changes from 0 to 1 which dictates exactly when the car has passed sensor.
        expectedSensorPass = [
            -1
        ] * sensorsNum  # Keeps note of which vehicle is expected to pass which sensor, this is necessary for speed updates to occur to the correct vehicle as it passes another sensor

        LEDsNum = len(LEDS)  # How many LEDs that were entered
        LEDsStateNew = [
            0
        ] * LEDsNum  # used to keep check of what the new state is after the set of "stepThrough" functions are run,single element can be, 1 meaning light on, 0 meaning light off, or - meaning keep corresponding state of LEDsState. Ensures a vehicle's associated LEDs does not clash with another vehicle's LEDs
        LEDsState = [
            0
        ] * LEDsNum  # single element can be either 1 meaning light on or 0 meaning light off

        LEDsDistance = [
        ]  # Distance from one sensor to another sensor, this is for the situation where street lights were already placed but with uneven distances between them for any particular reason
        sensorsDistance = []  # similar reason ^^
        lastPiSensorTime = -1  # The time the last sensor in the track was passed, this is stored to pass to the leading PI to calculate vehicles speed
        run = True

        # data to nbe use for pushing into firebase
        id = 1
        dataModelInit = {
            'id': id,
            'avgSpeed': 0,
            'numOfNewCars': 0,
            'LEDsTurnedOn': {}
        }
        dataModel = dataModelInit
        now = datetime.datetime.now()
        min = now.minute
        secChanged = 0
        LEDsModel = genLEDsFirebaseModel(LEDsNum)
        timeBeforeLEDUpdate = time.clock()

        # Set GPIO pins
        setGPIOIn(sensors)
        setGPIOOut(LEDS)

        # Init distance
        setAllsensorsDistance(sensors, sensorsDistance, 5)
        setAllLEDsDistance(sensors, sensorsDistance, LEDsMult, LEDsDistance)

        # Initialize data to be sent and reveived between PIs to ensure no garbage data
        passToLeadingPi = PassToLeadingPi()
        receiveFromTrailingPi = ReceiveFromTrailingPi()
        passToTrailingPi = PassToTrailingPi()
        receiveFromLeadingPi = ReceiveFromLeadingPi()

        # Used for setting up which light and sensor goes to which physical location

        # Init States
        initSensorState(sensorState, sensorsNum)
        initLEDsState(LEDsState, LEDsNum)

        while run:
            initLEDsStateNew(LEDsStateNew,
                             LEDsNum)  # Ensures the stateNew is empty

            # Pi to Pi communication
            receiveFromLeadingPi = ReceiveFromLeadingPiStore(
                receiveFromLeadingPi, LEDsStateNew)
            receiveFromTrailingPi = ReceiveFromTrailingPiStore(
                receiveFromTrailingPi, LEDsStateNew, expectedSensorPass,
                vehicles, lastPiSensorTime, sensorsNum, passToLeadingPi)

            # Keeps scanning for motion
            for i in range(0, sensorsNum):
                state = scan(sensors[i])
                if state and sensorState[
                        i] == 0:  # Vehicle has now passed the sensor
                    sensorTime[i] = time.clock(
                    )  #the time which the sensor was triggered is stored

                    # passToLeadingPi-LastSensorTime
                    if state == sensorsNum - 1:
                        passToLeadingPi.lastSensorTime(sensorTime[i])

                    sensorState[i] = 1

                    #*(to delete fnction isNewVehicle) Create new vehicle if 1st sensor is passed
                    if i == 0:
                        # AddVehicle
                        vehicles.append(vehicle(0, sensorTime[i], -1, -1))
                        addVehicleStartingLEDs(passToLeadingPi,
                                               passToTrailingPi, LEDsMult,
                                               LEDsNum, LEDsState, i)
                        updateExpectedSensorPass(
                            expectedSensorPass, sensorsNum, passToLeadingPi,
                            i + 1,
                            len(vehicles) - 1
                        )  # Update expectedSensorPass of the next index to this vehicle that was just appended. This is to ensure that the correct vehicle speed is updated

                        #increment car counter to pass to firebase
                        dataModel[
                            "numOfNewCars"] = dataModel["numOfNewCars"] + 1
                    else:
                        # Since vehicle already exist, update its speed with the new speed
                        if vehicles[len(
                                vehicles
                        ) - 1]["speed"] == -1:  # If the last vehicle that entered the track speed=-1, then the starting lights must be removed
                            removeVehicleStartingLEDs(LEDsStateNew,
                                                      passToLeadingPi,
                                                      passToTrailingPi,
                                                      LEDsMult, LEDsNum, i - 1)
                            #print(passToTrailingPi.getData()["fade"])

                        if i - 1 < 0:  # if this condition is met, then the sensorTime of the previous pi will be required to complete the speed update
                            vehicles[
                                expectedSensorPass[i]]["speed"] = calcSpeed(
                                    sensorsDistance[i],
                                    sensorTime[i] - lastPiSensorTime)
                        else:
                            #*(for now treat it as though there is no previous pi, this line will be removed)
                            vehicles[
                                expectedSensorPass[i]]["speed"] = calcSpeed(
                                    sensorsDistance[i],
                                    sensorTime[i] - sensorTime[i - 1])

                        #Update vision range because speed changed
                        vehicles[expectedSensorPass[i]][
                            "visionRange"] = calcVisionRange(
                                vehicles[expectedSensorPass[i]]["speed"])

                        #add onto maxSpeed with current speed value to calulate avg
                        vehicles[expectedSensorPass[i]]["maxSpeed"] = vehicles[
                            expectedSensorPass[i]]["maxSpeed"] + vehicles[
                                expectedSensorPass[i]]["speed"]
                        vehicles[
                            expectedSensorPass[i]]["sensorsPassed"] = vehicles[
                                expectedSensorPass[i]]["sensorsPassed"] + 1

                elif state and sensorState[
                        i] == 1:  # Vehicle is still passing the sensor
                    sensorState[i] = 1
                elif state == 0 and sensorState[
                        i] == 1:  # Vehicle has finished passing the sensor
                    sensorState[i] = 0
            #pass and receive data

            #creates cycle if multiple PIs does not exist
            passToLeadingPi = PassToLeadingPiSend(passToLeadingPi,
                                                  receiveFromTrailingPi)
            passToTrailingPi = PassToTrailingPiSend(receiveFromLeadingPi,
                                                    passToTrailingPi)

            # PI to PI communication
            # receiveFromLeadingPi.setData(ast.literal_eval(clientStart.rec()))
            # receiveFromTrailingPi.setData(ast.literal_eval(clientEnd.rec()))
            # serverEnd.send(passToLeadingPi.getData())
            # serverStart.send(passToTrailingPi.getData())
            #reset pi to transfer data
            passToLeadingPi = PassToLeadingPi()
            passToTrailingPi = PassToTrailingPi()

            #turn on lights
            #print(LEDsStateNew)
            stepThrough(LEDsStateNew, LEDsDistance, LEDsNum, vehicles,
                        passToTrailingPi, passToLeadingPi, dataModel)
            updateStateFromNew(LEDsState, LEDsStateNew, LEDsNum)
            timeAtLEDUpdate = time.clock()
            LEDsModel = updateLEDsModel(LEDsModel,
                                        timeAtLEDUpdate - timeBeforeLEDUpdate,
                                        LEDsState)
            timeBeforeLEDUpdate = timeAtLEDUpdate
            turnOnLEDs(LEDsState, LEDsNum, LEDS)

            # Push data to firebase if the minute changes
            now = datetime.datetime.now()
            if now.minute > min:
                # resetdata
                secChanged = 0
                sec = now.second

                #calculate avgspeed
                noOfCars = 0
                avgSpeed = 0
                maxSpeed = 0
                for i in range(0, len(vehicles)):
                    print(vehicles[i]["maxSpeed"])
                    print(vehicles[i]["sensorsPassed"])
                    vehicles[i]["avgSpeed"] = vehicles[i]["maxSpeed"] / (
                        vehicles[i]["sensorsPassed"] + 1
                    )  #* # avg speed of that vehicle
                    maxSpeed = maxSpeed + vehicles[i][
                        "avgSpeed"]  #add average speed of all vehicles
                avgSpeed = maxSpeed / dataModel[
                    "numOfNewCars"]  #calculate avg speed of all new vehicles
                #reset vehicles data for next minute
                for i in range(0, len(vehicles)):
                    vehicles[i]["avgSpeed"] = 0
                    vehicles[i]["maxSpeed"] = 0
                    vehicles[i]["sensorsPassed"] = 0

                #append avgspeed
                dataModel["avgSpeed"] = avgSpeed
                dataModel["LEDsTurnedOn"] = LEDsModel
                #pushData(dataModel)
                t1 = threading.Thread(target=pushData, args=(dataModel, ))
                t1.start()

                #print dataModel
                print(dataModel)

                #reset data
                dataModel = dataModelInit
                LEDsModel = genLEDsFirebaseModel(LEDsNum)
                dataModel["LEDsTurnedOn"] = LEDsModel

    except KeyboardInterrupt:
        run = False
    finally:
        GPIO.cleanup()
Exemplo n.º 6
0
    elif req.door_id == 3:
        GPIO.output(4, GPIO.HIGH)
        time.sleep(1)
        GPIO.output(4, GPIO.LOW)

    return True


def door_server():
    rospy.init_node('door_server')
    s = rospy.Service('door', opendoor, handle_door)
    rospy.loginfo("ready to open doors ")
    rospy.spin()


if __name__ == "__main__":
    try:
        GPIO.setmode(GPIO.BCM)

        GPIO.setwarnings(False)

        GPIO.setup(2, GPIO.OUT, initial=GPIO.LOW)
        GPIO.setup(3, GPIO.OUT, initial=GPIO.LOW)
        GPIO.setup(4, GPIO.OUT, initial=GPIO.LOW)

        door_server()
    except Exception as ex:
        traceback.print_exc()
    finally:
        GPIO.cleanup()  #this ensures a clean exit
Exemplo n.º 7
0
#import the Raspberry pinout library and time
from EmulatorGUI import GPIO
#import rpi.GPIO as GPIO
import threading
import tkinter

#won't have to write timeit.Timer every time
from threading import Timer

#clean all pinout settings
GPIO.cleanup()
 
#Mode of pinout numbering, BOARD or BCM available
GPIO.setmode(GPIO.BCM)
 
#List of output channels for airpumps set as output 0V
output_list = (5, 6, 12, 13, 19, 16, 26, 20, 21)

#NOTICE!!! Initial set to HIGH instead of LOW. Apparently the logic is somewhat inverted, and using initial LOW will enable
#out signal instead of disable it, making the relays close it's circuits instead of leaving them open.

GPIO.setup(5, GPIO.OUT, initial = GPIO.HIGH)
GPIO.setup(6, GPIO.OUT, initial = GPIO.HIGH)
GPIO.setup(12, GPIO.OUT, initial = GPIO.HIGH)
GPIO.setup(13, GPIO.OUT, initial = GPIO.HIGH)
GPIO.setup(19, GPIO.OUT, initial = GPIO.HIGH)
GPIO.setup(16, GPIO.OUT, initial = GPIO.HIGH)
GPIO.setup(26, GPIO.OUT, initial = GPIO.HIGH)
GPIO.setup(20, GPIO.OUT, initial = GPIO.HIGH)
GPIO.setup(21, GPIO.OUT, initial = GPIO.HIGH)
Exemplo n.º 8
0
def Main():

    try:
        GPIO.setmode(GPIO.BCM)

        GPIO.setwarnings(False)

        GPIO.setup(14, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)  # Kasa Açıldı
        GPIO.setup(15, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)  # Ev Kapısı Açıldı
        GPIO.setup(18, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)  # Araba Açık

        GPIO.setup(25, GPIO.IN,
                   pull_up_down=GPIO.PUD_DOWN)  # Araba Kapısı Kapandı
        GPIO.setup(16, GPIO.IN,
                   pull_up_down=GPIO.PUD_DOWN)  # Ev Kapısı Kapandı
        GPIO.setup(8, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)  # Kasa Kapandı

        GPIO.setup(4, GPIO.OUT,
                   initial=GPIO.HIGH)  # Kasa Açık 1, Kasa Kapalı 0
        GPIO.setup(9, GPIO.OUT, initial=GPIO.LOW)  # Ev Açık 1, Ev Kapalı 0
        GPIO.setup(17, GPIO.OUT,
                   initial=GPIO.HIGH)  # Araba Açık 1, Araba Kapalı 0

        GPIO.setup(19, GPIO.OUT, initial=GPIO.LOW)  # Nem kontrol

        GPIO.output(4, GPIO.LOW)
        GPIO.output(9, GPIO.LOW)
        GPIO.output(17, GPIO.LOW)
        Kasakapaliguncelle()
        Evkapaliguncelle()
        Arabakapaliguncelle()

        while (True):

            if (GPIO.input(14) == True):
                GPIO.output(4, GPIO.HIGH)
                Kasaacikguncelle()

            if (GPIO.input(8) == True):
                GPIO.output(4, GPIO.LOW)
                Kasakapaliguncelle()

            if (GPIO.input(15) == True):
                GPIO.output(9, GPIO.HIGH)
                Evacikguncelle()

            if (GPIO.input(16) == True):
                GPIO.output(9, GPIO.LOW)
                Evkapaliguncelle()

            if (GPIO.input(18) == True):
                GPIO.output(17, GPIO.HIGH)
                Arabaacikguncelle()

            if (GPIO.input(25) == True):
                GPIO.output(17, GPIO.LOW)
                Arabakapaliguncelle()

        con.close()
    except Exception as ex:
        traceback.print_exc()
    finally:
        GPIO.cleanup()
Exemplo n.º 9
0
def main():
    try:
        # variables
        #This is where LEDS and SENSORs as it relates to the pi is hardcoded
        leds = Leds([
            15, 18, 23, 24, 8, 7, 12, 16, 21, 26, 19, 13, 5, 11, 9, 10, 27, 17,
            4, 3
        ])
        sensors = Sensors([14, 25, 20, 6, 22])

        firebaseSys = FirebaseSys(
            1
        )  #firebase id=1, this id is how the data will be identified on firebase
        passToLeadingPi = LeadingData()
        receiveFromTrailingPi = LeadingData()
        passToTrailingPi = TrailingData()
        receiveFromLeadingPi = TrailingData()
        vehicles = Vehicles()
        LEDsMult = int(
            leds.numLeds() /
            sensors.numSensors())  # How many LEDs that is between two sensors
        LEDsModel = genLEDsFirebaseModel(leds)
        dataModelInit = {
            'id': id,
            'avgSpeed': 0,
            'numOfNewCars': 0,
            'LEDsTurnedOn': {}
        }
        dataModel = dataModelInit

        GPIO.setmode(GPIO.BCM)

        sensors.setAllsensorsDistance(
            5)  # value used in this demo does not matter since it is constant
        sensors.setGPIOIn()
        sensors.initSensorState()
        leds.setAllLEDsDistance(sensors, LEDsMult)
        leds.setGPIOOut()
        leds.initLEDsState()

        lastPiSensorTime = -1

        while True:
            leds.initLEDsStateNew()

            # Pi to Pi communication
            receiveFromLeadingPi = ReceiveFromLeadingPiStore(
                receiveFromLeadingPi, leds)
            receiveFromTrailingPi = ReceiveFromTrailingPiStore(
                receiveFromTrailingPi, leds, vehicles, lastPiSensorTime,
                sensors, passToLeadingPi)

            # Keeps scanning for motion
            for i in range(0, sensors.numSensors()):
                state = sensors.getSensor(i).scan()

                if state and sensors.getSensor(
                        i).state == 0:  # Vehicle has now passed the sensor
                    sensors.getSensor(i).time = time.time(
                    )  #the time which the sensor was triggered is stored

                    # passToLeadingPi-LastSensorTime
                    #if state==sensorsNum-1:
                    #    passToLeadingPi.lastSensorTime(sensors.getSensor(i).time)

                    sensors.getSensor(i).state = 1

                    #*(to delete fnction isNewVehicle) Create new vehicle if 1st sensor is passed
                    if i == 0 and sensors.getSensor(
                            0).expectedSensorPass == -1:
                        # AddVehicle
                        vehicles.addNewVehicle(0,
                                               sensors.getSensor(i).time, -1,
                                               -1)
                        leds.addVehicleStartingLeds(LEDsMult)
                        sensors.updateExpectedSensorPass(
                            passToLeadingPi, i + 1,
                            vehicles.numVehicles() - 1
                        )  # Update expectedSensorPass of the next index to this vehicle that was just appended. This is to ensure that the correct vehicle speed is updated

                        #increment car counter to pass to firebase
                        dataModel[
                            "numOfNewCars"] = dataModel["numOfNewCars"] + 1
                    else:
                        if sensors.getSensor(i).expectedSensorPass >= 0:
                            if vehicles.getVehicle(
                                    sensors.getSensor(i).expectedSensorPass
                            ).speed == -1:  # If the last vehicle that entered the track speed=-1, then the starting lights must be removed
                                leds.removeVehicleStartingLeds(LEDsMult)

                        #update expectedsensor since vehicle is progressing through the track
                        if sensors.getSensor(i).expectedSensorPass != -2:
                            #*(for now treat it as though there is no previous pi, this line will be removed)
                            vehicles.getVehicle(
                                sensors.getSensor(
                                    i).expectedSensorPass).speed = calcSpeed(
                                        sensors.getSensor(i).distance,
                                        sensors.getSensor(i).time -
                                        sensors.getSensor(i - 1).time)

                            veh = sensors.getSensor(i).expectedSensorPass
                            sensors.updateExpectedSensorPass(
                                passToLeadingPi, i + 1, veh)
                            sensors.updateExpectedSensorPass(
                                passToLeadingPi, i, -1)
                        else:  # if it was -2 then the sensor was passed before the vehicle entered the track therefore a wrong
                            sensors.updateExpectedSensorPass(
                                passToLeadingPi, i + 1,
                                len(vehicles) - 1)
                            sensors.updateExpectedSensorPass(
                                sensorsNum, passToLeadingPi, i, -1)

                        #Update vision range because speed changed
                        vehicles.getVehicle(
                            sensors.getSensor(i).expectedSensorPass
                        ).visionRange = calcVisionRange(
                            vehicles.getVehicle(
                                sensors.getSensor(i).expectedSensorPass).speed)

                        #add onto maxSpeed with current speed value to calulate avg
                        vehicles.getVehicle(
                            sensors.getSensor(i).expectedSensorPass
                        ).maxSpeed = vehicles.getVehicle(
                            sensors.getSensor(i).expectedSensorPass
                        ).maxSpeed + vehicles.getVehicle(
                            sensors.getSensor(i).expectedSensorPass).speed
                        vehicles.getVehicle(
                            sensors.getSensor(i).expectedSensorPass
                        ).sensorsPassed = vehicles.getVehicle(
                            sensors.getSensor(
                                i).expectedSensorPass).sensorsPassed + 1

                elif state and sensors.getSensor(
                        i).state == 1:  # Vehicle is still passing the sensor
                    sensors.getSensor(i).state = 1
                elif state == 0 and sensors.getSensor(
                        i
                ).state == 1:  # Vehicle has finished passing the sensor
                    sensors.getSensor(i).state = 0

            #pass and receive data

            #creates cycle if multiple PIs does not exist
            #passToLeadingPi=PassToLeadingPiSend(passToLeadingPi,receiveFromTrailingPi)
            #passToTrailingPi=PassToTrailingPiSend(receiveFromLeadingPi,passToTrailingPi)

            # PI to PI communication
            #insertHere

            #reset pi to transfer data
            passToLeadingPi = LeadingData()
            passToTrailingPi = TrailingData()

            stepThrough(vehicles, sensors, leds, passToLeadingPi,
                        passToTrailingPi)
            leds.updateStateFromNew()

            timeAtLEDUpdate = time.time()
            LEDsModel = updateLEDsModel(
                LEDsModel, timeAtLEDUpdate - firebaseSys.timeBeforeLEDUpdate,
                leds)
            firebaseSys.timeBeforeLEDUpdate = timeAtLEDUpdate

            leds.turnOnLeds()

            # Push data to firebase if the minute changes
            now = datetime.datetime.now()
            if firebaseSys.sec == 60:
                firebaseSys.sec = 59

            if now.minute == firebaseSys.min + 1 and (
                    now.second == firebaseSys.sec
                    or now.second == firebaseSys.sec + 1):
                # resetdata
                firebaseSys.sec = now.second
                firebaseSys.min = now.minute

                #calculate avgspeed
                avgSpeed = 0
                maxSpeed = 0
                for i in range(0, vehicles.numVehicles()):
                    print(vehicles.getVehicle(i).maxSpeed)
                    print(vehicles.getVehicle(i).sensorsPassed)
                    vehicles.getVehicle(i).avgSpeed = vehicles.getVehicle(
                        i).maxSpeed / vehicles.getVehicle(
                            i).sensorsPassed  #* # avg speed of that vehicle
                    maxSpeed = maxSpeed + vehicles.getVehicle(
                        i).avgSpeed  #add average speed of all vehicles
                avgSpeed = maxSpeed / dataModel[
                    "numOfNewCars"]  #calculate avg speed of all new vehicles
                #reset vehicles data for next minute
                for i in range(0, vehicles.numVehicles()):
                    vehicles.getVehicle(i).avgSpeed = 0
                    vehicles.getVehicle(i).maxSpeed = 0
                    vehicles.getVehicle(i).sensorsPassed = 0

                #append avgspeed
                dataModel["avgSpeed"] = avgSpeed
                dataModel["LEDsTurnedOn"] = LEDsModel

                firebase.Sys.pushData(dataModel)

                #reset data
                dataModel = dataModelInit
                LEDsModel = genLEDsFirebaseModel(LEDsNum)
                dataModel["LEDsTurnedOn"] = LEDsModel

    except KeyboardInterrupt:
        run = False
    finally:
        GPIO.cleanup()