def __init__(self):
        mqttBrokerCredentials = cr.getMqttBrokerCredentials()
        self.mqttServerClient = sv.MqttServerClient(
            mqttBrokerCredentials[0],
            mqttBrokerCredentials[1],
            mqttBrokerCredentials[3],
            brokerAddress=mqttBrokerCredentials[2],
            logger=logger)
        self.mqttServerClient.createClient()
        self.mqttServerClient.startConnection()
        mySqlDbCredentials = cr.getMySqlDatabaseCredentials()
        self.mySqlConnector = sv.MySqlConnector(mySqlDbCredentials[0],
                                                mySqlDbCredentials[1],
                                                mySqlDbCredentials[2],
                                                'localhost',
                                                self.getSshLocalBindPort(),
                                                logger=logger)
        self.mySqlConnector.startConnection()
        logger.info('connections established.', topic=topMan)

        spaces = self.stringToTuple(self.mySqlConnector.getParkingSpaces())
        self.spaces = spaces[0]
        self.spacesWithEntry = spaces[1]
        self.roads = self.stringToTuple(
            self.mySqlConnector.getParkingRoads())[0]
        self.spacesAndRoads = self.spaces + self.roads
        self.pathFinder = pf.PathFinder(self.spaces, self.roads, logger)

        self.pathFinder.generateGrid()
        squareHeight = 100
        squareWidth = 100

        self.simulator = sim.Simulator(self.pathFinder.grid, squareHeight,
                                       squareWidth)
 def generatePath(self, beginCoordinates, endCoordinates, prevCoordinates,
                  entryCoordinates, entryAtEnd):
     path = self.pathFinder.getPath(beginCoordinates, endCoordinates,
                                    prevCoordinates, entryCoordinates,
                                    entryAtEnd)
     self.simulator.setPath(path[0].copy())
     self.simulator.setPathColor()
     self.simulator.simulateCarMovement()
     path[0] = self.replaceCoordinatesInPathWithTagIds(path[0])
     logger.info('path generation successful.', topic=topMan)
     logger.info('generated path :', path, topic=topMan)
     return path
 def carAuthentication(self, carId):
     carInDb = self.mySqlConnector.checkCarId(carId)
     if carInDb:
         result = False  # carId already in db so new car needs to get new id: return false
     else:
         self.mySqlConnector.registerCar(carId)
         logger.info('registered car',
                     carId,
                     'state as ==arriving==.',
                     topic=topMan)
         result = True
     logger.info('car authentication result:', result, topic=topMan)
     return result
 def registerArrival(self, carId):
     carState = self.mySqlConnector.getCarState(carId)
     if carState == 'arriving':
         self.mySqlConnector.setCarState(carId, 'parked')
         logger.info('registered car',
                     carId,
                     'state as ==parked==.',
                     topic=topMan)
         return 'parked'
     else:
         self.mySqlConnector.deleteCar(carId)
         logger.info('unregistered car',
                     carId,
                     'from parking lot.',
                     topic=topMan)
         return 'clearName'
    def getSpecificPath(self, carId, startTag, prevTag):
        beginCoordintates = self.getCoordinates(startTag)
        entryCoordinates = None
        entryAtEnd = None

        prevCor = ''
        if prevTag:
            prevCor = self.getCoordinates(prevTag)

        carState = self.mySqlConnector.getCarState(carId)
        if carState == 'arriving':
            endTag = self.mySqlConnector.getAssignedCarToSpace(carId)
            if endTag:
                endCoordinates = self.getCoordinates(endTag[0][2])
            else:
                newParkingSpaceTag = self.mySqlConnector.getRandomParkingSpace(
                )[2]
                self.mySqlConnector.assignCarToSpace(carId, newParkingSpaceTag)
                endCoordinates = self.getCoordinates(newParkingSpaceTag)
            logger.debug('generating arriving path..', topic=topMan)
        else:
            if carState == 'parked':
                self.mySqlConnector.setCarState(carId, 'leaving')
                logger.info('registered car',
                            carId,
                            'state as ==leaving==.',
                            topic=topMan)
                self.mySqlConnector.unassignCarFromSpace(carId)
            endTag = self.mySqlConnector.getExit()[0][1]
            endCoordinates = self.getCoordinates(endTag)
            logger.debug('generating leaving path..', topic=topMan)

        for _, a, b in self.spacesWithEntry:
            if a == endCoordinates:
                entryCoordinates = b
                entryAtEnd = True
            if a == beginCoordintates:
                entryCoordinates = b
                entryAtEnd = False
        return self.generatePath(beginCoordintates, endCoordinates, prevCor,
                                 entryCoordinates, entryAtEnd)
    def processMessage(self):
        logger.info('listening for messages...', topic=topMsg)
        genericMessage = self.mqttServerClient.getMsg()
        topic = genericMessage[0]
        message = genericMessage[1]

        # Authentication (messages sent to this topic are meant to make sure car registered are unique)
        if topic == 'AU':
            logger.info(message, 'requests authentication...', topic=topCar)
            self.mqttServerClient.sendPublish(message,
                                              self.carAuthentication(message),
                                              1)

        # Get Path (messages sent to this topic are to whether generate path to the parking space OR exit)
        elif topic == "GP":
            logger.info(message, 'requests path...', topic=topCar)
            carInfo = message.split(',')
            self.mqttServerClient.sendPublish(
                carInfo[0],
                self.getSpecificPath(carInfo[0], carInfo[1], carInfo[2]), 1)

        # Last Tag (messages sent to this topic are to let the parking manager know that the car is arrived at their destination)
        elif topic == 'LT':
            logger.info(message,
                        'requests to register arrival...',
                        topic=topCar)
            self.mqttServerClient.sendPublish(message,
                                              self.registerArrival(message), 1)

        elif topic == 'ST':
            splitMsg = message.split(',')
            carId = splitMsg[0]
            tagId = splitMsg[1]
            tagCoordinates = self.getCoordinates(tagId)
            self.simulator.simulateCarMovement()
            print('received tag')
        else:
            logger.error('topic of message not recognised', topic=topMsg)
        print()