コード例 #1
0
class Graph(QtOpenGL.QGLWidget):
	'''
	***********************************************************
	The options for the screen showing
	***********************************************************
	'''
	GRAPH_ONE = 0
	GRAPH_TWO = 1
	BADGE_SCREEN = 2

	def __init__(self, width, height):
		# Base constructor
		QtOpenGL.QGLWidget.__init__(self)		
		self.setMouseTracking(True)
		
		# Load the printer
		self.printer = Printer()
		
		# Load the other OpenGL screens
		'''
		***********************************************************
		New Class
		***********************************************************
		'''
		self.badgeScreen = BadgeScreen(width, height, self.printer)
		
		# Set the attributes
		self.showing = 2
		self.width = width
		self.height = height
		self.rectSize = 33.5
		# self.rectSize = 28.00
		self.gridCols = 0
		self.gridRows = 0
		self.grid = None
		
		# Create the buttons
		self.btnGraph1 = Button(u"\u25c4", 10, 15, 100, 50)
		self.btnGraph2 = Button(u"\u25ba", self.width - 110, 15, 100, 50)
		self.btnGraph3 = Button(u"\u25ba", self.width - 110, 15, 100, 50)
		self.btnGraph4 = Button(u"\u25c4", 10, 15, 100, 50)
		self.btnGraph1.disable()
		self.btnGraph3.disable()
		self.btnGraph4.disable()
		
		# The labels
		self.ube = 0
		self.ld = 0
		self.high = 0
		self.medium = 0
		self.low = 0
		self.timeEvent =[]
		
		# Calculate the proportions
		self.heightFivePercent = self.height * 0.05
		self.graphPadding = 5;
		self.rectPadding = 2;
		self.titleHeight = self.height * 0.1
		self.graphX = self.width * 0.02
		self.graphY = self.titleHeight * 2
		self.graphWidth = self.width * 0.60
		self.graphHeight = self.height * 0.7
		self.dsmX = self.width * 0.64
		self.dsmY = self.height * 0.5
		self.dsmWidth = self.width * 0.35
		self.dsmHeight = self.height * 0.4
		self.lowRiskX = self.dsmX
		self.lowRiskY = self.graphY
		self.mediumRiskX = self.dsmX
		self.mediumRiskY = self.graphY + self.rectSize + 30
		self.highRiskX = self.dsmX
		self.highRiskY = self.graphY + (self.rectSize * 2) + 60
		
		self.pastNumbers = [22, 16, 52]
		self.currentNumbers = [12, 18, 30]
		
		# self.pastNumbersSum = self.pastNumbers[0] + self.pastNumbers[1] + self.pastNumbers[2]
		# self.currentNumbersSum = self.currentNumbers[0] + self.currentNumbers[1] + self.currentNumbers[2]
		# self.glancesGridMaxNum = self.pastNumbersSum if self.pastNumbersSum > self.currentNumbersSum else self.currentNumbersSum
		# self.glancesGridMaxNum = self.glancesGridMaxNum + 10
		self.graph2HorPadding = 100
		self.glancesGridPadding = 50
		self.glancesGridTitleX = self.graph2HorPadding
		self.glancesGridTitleY = self.titleHeight + 10
		self.glancesGridTitleWidth = (self.width - (self.graph2HorPadding * 3)) * 0.5
		self.glancesGridTitleHeight = 70
		self.glancesGridX = self.graph2HorPadding + 30
		self.glancesGridY = self.glancesGridTitleY + self.glancesGridTitleHeight
		self.glancesGridWidth = self.glancesGridTitleWidth
		self.glancesGridHeight = (self.height - self.glancesGridY) - 70
		self.glancesGridBarPaddingTop = 20
		self.glancesGridBarWidth = (self.glancesGridWidth - (self.glancesGridPadding * 3)) / 2
		self.glancesGridBarHeight = self.glancesGridHeight - self.glancesGridBarPaddingTop
		self.tripsTitleX = (self.graph2HorPadding*2) + self.glancesGridWidth
		self.tripsTitleY = self.glancesGridTitleY
		self.tripsTitleWidth = self.glancesGridTitleWidth
		self.tripsTitleHeight = self.glancesGridTitleHeight
		self.glanceNumTitleX = self.tripsTitleX
		self.glanceNumTitleY = self.tripsTitleY + self.tripsTitleHeight + 10
		self.glanceNumTitleWidth = self.tripsTitleWidth
		self.glanceNumTitleHeight = self.tripsTitleHeight
		self.glanceNumPadding = 75 #53
		self.glanceNumRadius = 18
		self.glanceNumPaddingVer = 40
		self.highIconX = self.glanceNumTitleX + self.glanceNumRadius + 90
		self.highIconY = self.glanceNumTitleY + self.glanceNumTitleHeight + 50
		self.highPastTitleX = self.glanceNumTitleX + (self.glanceNumPadding * 4) + self.glanceNumRadius
		self.highPastTitleY = self.highIconY - self.glanceNumRadius
		self.highCurrentTitleX = self.glanceNumTitleX + (self.glanceNumPadding * 7) + self.glanceNumRadius
		self.highCurrentTitleY = self.highPastTitleY
		self.mediumIconX = self.highIconX
		self.mediumIconY = self.highIconY + self.glanceNumRadius + self.glanceNumPaddingVer
		self.mediumPastTitleX = self.highPastTitleX
		self.mediumPastTitleY = self.highPastTitleY + self.glanceNumRadius + self.glanceNumPaddingVer
		self.mediumCurrentTitleX = self.highCurrentTitleX
		self.mediumCurrentTitleY = self.mediumPastTitleY
		self.lowIconX = self.highIconX
		self.lowIconY = self.mediumIconY + self.glanceNumRadius + self.glanceNumPaddingVer
		self.lowPastTitleX = self.mediumPastTitleX
		self.lowPastTitleY = self.mediumPastTitleY + self.glanceNumRadius + self.glanceNumPaddingVer
		self.lowCurrentTitleX = self.highCurrentTitleX
		self.lowCurrentTitleY = self.lowPastTitleY
		self.totalTitleX = self.glanceNumTitleX + 70
		self.totalTitleY = self.lowIconY + 40
		self.totalPastTitleX = self.mediumPastTitleX
		self.totalPastTitleY = self.totalTitleY
		self.totalCurrentTitleX = self.mediumCurrentTitleX
		self.totalCurrentTitleY = self.totalTitleY
		self.safetyMetricsTitleX = self.glanceNumTitleX
		self.safetyMetricsTitleY = self.glanceNumTitleY + 450 #330
		self.safetyMetricsTitleWidth = self.glanceNumTitleWidth
		self.safetyMetricsTitleHeight = self.glanceNumTitleHeight
		self.safeEventTitleX = self.safetyMetricsTitleX + 30
		self.safeEventTitleY = self.safetyMetricsTitleY + self.safetyMetricsTitleHeight + 10
		self.safeEventPastNumTitleX = self.mediumPastTitleX
		self.safeEventPastNumTitleY = self.safeEventTitleY
		self.safeEventCurrentNumTitleX = self.mediumCurrentTitleX
		self.safeEventCurrentNumTitleY = self.safeEventTitleY
		self.unsafeEventTitleX = self.safeEventTitleX
		self.unsafeEventTitleY = self.safeEventTitleY + 50
		self.unsafeEventPastNumTitleX = self.mediumPastTitleX
		self.unsafeEventPastNumTitleY = self.unsafeEventTitleY
		self.unsafeEventCurrentNumTitleX = self.mediumCurrentTitleX
		self.unsafeEventCurrentNumTitleY = self.unsafeEventTitleY
		self.deviationsEventTitleX = self.safeEventTitleX
		self.deviationsEventTitleY = self.unsafeEventTitleY + 50
		self.deviationsEventPastNumTitleX = self.mediumPastTitleX
		self.deviationsEventPastNumTitleY = self.deviationsEventTitleY
		self.deviationsEventCurrentNumTitleX = self.mediumCurrentTitleX
		self.deviationsEventCurrentNumTitleY = self.deviationsEventTitleY
		
	def initializeGL(self):
		# Initialize the context
		gl.glClearColor(1.0, 1.0, 1.0, 1)
		gl.glEnable(gl.GL_LINE_STIPPLE)
		#glEnable (GL_BLEND);
		#glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
		
		'''
		***********************************************************
		Enable textures
		***********************************************************
		'''
		gl.glEnable(gl.GL_TEXTURE_2D)
		self.badgeScreen.init(self.parID,self.gender)
		
		# Use the fixed pipeline
		# Resize the window
		self.resizeGL(self.width, self.height)
		
	def resizeGL(self, width, height):
		# Update the attributes
		self.width = width
		self.height = height
		
		# Set up the viewport
		gl.glViewport(0, 0, width, height)
		
		# Set up an orthographic view
		gl.glMatrixMode(gl.GL_PROJECTION)
		gl.glLoadIdentity()
		gl.glOrtho(0, self.width, self.height, 0, -1, 1)
		gl.glMatrixMode(gl.GL_MODELVIEW)
		gl.glLoadIdentity()
		
	def mouseMoveEvent(self, event):
		self.btnGraph1.update(event.x(), event.y())
		self.btnGraph2.update(event.x(), event.y())
		self.btnGraph3.update(event.x(), event.y())
		self.btnGraph4.update(event.x(), event.y())

		self.repaint()
		
	def mousePressEvent(self, event):
		if self.btnGraph4.isMouseOver() == True:
			self.showing = self.GRAPH_ONE
			self.btnGraph1.enable()
			self.btnGraph2.disable()
			self.btnGraph3.enable()
			self.btnGraph4.disable()
			self.repaint()
	
		if self.btnGraph3.isMouseOver() == True:
			self.showing = self.GRAPH_TWO
			self.btnGraph1.disable()
			self.btnGraph2.disable()
			self.btnGraph3.disable()
			self.btnGraph4.enable()
			self.repaint()
	
		if self.btnGraph2.isMouseOver() == True:
			self.showing = self.GRAPH_ONE
			self.btnGraph1.enable()
			self.btnGraph2.disable()
			if self.enableButton == True:
				self.btnGraph3.enable()
			else:
				self.btnGraph3.disable()
			self.btnGraph4.disable()
			self.repaint()
		
		if self.btnGraph1.isMouseOver() == True:
			self.showing = self.BADGE_SCREEN
			self.btnGraph1.disable()
			self.btnGraph2.enable()
			self.btnGraph3.disable()
			self.btnGraph4.disable()
			self.repaint()
		
	def createGraph(self, parID, rows, cols):
		self.parID = parID.split("_")[0]+"_"+parID.split("_")[1]
		self.gridRows = rows
		self.gridCols = cols
		self.grid = [[0 for x in range(cols)] for x in range(rows)]
		self.ube = 0
		self.ld = 0
		self.high = 0
		self.medium = 0
		self.low = 0
		
		numRows = 900

		# Variables: Counters to keep track of values
		listValues = []
		gridValues = []
		lowCount = 0
		warnCount = 0
		dangerCount = 0
		unsafEvent = 0
		bbTime = 0			# <1.2s
		timeCollision = 0	# <1.5s
		laneDepart = 0		# <-5
		numCollision = 0	# >1
		accelCount = 0		# < -19.3 ft/s**2
		lineCount = 0
		timeUBE = []		# keeps track of where unsafe breaking events
		timeLOG = []		# keeps track of where log events happen
		logEvent = []		# keeps track of where log events and unsave event happen
		ldEvent = []
		isLaneDepart = False
		isAccel = False
		isCollisiton = False

		receiverData = np.genfromtxt('../../participantData/Gamification/%s_data.csv'%self.parID, delimiter=',')
		netclientData = np.genfromtxt('../../participantData/Gamification/%s_net.csv'%self.parID, delimiter=',')

		# Reading Receiver Data
		for i in range(len(receiverData)):
			# Counting for Number of Collisions
			if float(receiverData[i,2]) > 1:
				numCollision += 1
			# Counting for Lane Deviation
			if float(receiverData[i,4]) < -2.7 or float(receiverData[i,4]) > 5.0:
				isLaneDepart = True
			if isLaneDepart == True and (float(receiverData[i,4]) >= -2.7 and float(receiverData[i,4]) <= 5.0):
				isLaneDepart = False
				laneDepart += 1
				ldEvent.append(receiverData[i,0])

		# # Code to include the acceleration based on the LogStream
		for k in range(int(np.max(receiverData[:,1])+1)):
			a = receiverData[receiverData[:,1]==k]
			a = a[0:900,:]
			if k != 0:
				timeLOG.append(a[0,0]) 
			for l in range(len(a)):
				# Counting for Acceleration
				if float(a[l,10]) < -19.3 or (float(a[l,8]) <1.5 and float(a[l,8]) !=0):
					timeUBE.append(a[l,0])
					logEvent.append(int(a[l,1]))
					unsafEvent += 1
					break
		# timeLOG.append(receiverData[len(receiverData)-1,0])

		self.ube = unsafEvent
		self.ld += laneDepart

		# This will take when the log stream happens
		self.timeEvent = (timeLOG-receiverData[0,0])/(receiverData[len(receiverData)-1,0] - receiverData[0,0])
		self.logStreamEvent = logEvent
		self.deviationEvent = (ldEvent-receiverData[0,0])/(receiverData[len(receiverData)-1,0] - receiverData[0,0])

		# Reading Netclient Data
		for j in range(len(netclientData)):
			lineCount += 1
			# Counting for Warning, Danger, and Low Glances
			if float(netclientData[j,5]) == 1:
				warnCount += 1
			if float(netclientData[j,6]) == 1:
				dangerCount += 1
			if float(netclientData[j,8]) == 1:
				lowCount += 1

			if lineCount == numRows or j == range(len(netclientData))[-1]:
				column = [3 for x in range(dangerCount)] + [2 for x in range(warnCount)] + [1 for x in range(lowCount)]
				if len(column) > self.gridRows:
					column = column[0:self.gridRows]
				elif len(column) < self.gridRows:
					column = column + [0 for x in range(self.gridRows-len(column))]
				gridValues.append(column)

				self.high += dangerCount
				self.medium += warnCount
				self.low += lowCount
				
				# Reset all variables
				lineCount = 0
				lowCount = 0
				warnCount = 0 
				dangerCount = 0
		
		self.grid = np.zeros((self.gridRows, self.gridCols))
		minLength = len(gridValues) if self.gridCols > len(gridValues) else self.gridCols
		for i in range(minLength):
			gridValues[i].reverse()
			self.grid[:,i] = np.array(gridValues[i])

		# Saving drives to a file
		driver = parID.split("_")
		if os.path.exists('../../participantData/Gamification/%s_drives.csv'%driver[0]):
			driverData = np.genfromtxt('../../participantData/Gamification/%s_drives.csv'%driver[0], delimiter=',')
			if len(driverData.shape) == 1:
				if str(driver[2]) == "m" or str(driver[2]) == "M":
					self.gender = 0
				else:
					self.gender = 1
			# 
			else:
				self.gender = driverData[1,-1]
		
		with open('../../participantData/Gamification/%s_drives.csv'%driver[0],'ab') as csvfile:
			toFile = csv.writer(csvfile, delimiter=',',quoting=csv.QUOTE_MINIMAL)
			toFile.writerow(['%d'%self.high,'%d'%self.medium,'%d'%self.low,'%d'%self.ld,'%s'%self.ube,'%d'%(8-self.ube),'%d'%self.gender])

		# Using file to determine comparison screen
		driverData = np.genfromtxt('../../participantData/Gamification/%s_drives.csv'%driver[0], delimiter=',')
		if len(driverData.shape) == 1:
			self.enableButton = False
			driverData = np.array([driverData])
		else:
			self.enableButton = True
			self.pastNumbers = map(int,driverData[-2,0:3].tolist())
			self.currentNumbers = map(int,driverData[-1,0:3].tolist())
			self.compLane = map(int,driverData[-2:,3].tolist())
			self.compUnsafe = map(int,driverData[-2:,4].tolist())
			self.compSafe = map(int,driverData[-2:,5].tolist())
			self.pastNumbersSum = self.pastNumbers[0] + self.pastNumbers[1] + self.pastNumbers[2]
			self.currentNumbersSum = self.currentNumbers[0] + self.currentNumbers[1] + self.currentNumbers[2]
			self.glancesGridMaxNum = self.pastNumbersSum if self.pastNumbersSum > self.currentNumbersSum else self.currentNumbersSum
			self.glancesGridMaxNum = int(math.ceil(self.glancesGridMaxNum/10.0) * 10)
	
	def paintLine(self, x1, y1, x2, y2, width, red = 0, green = 0, blue = 0):
		gl.glColor3f(red, green, blue)	
		gl.glBegin(gl.GL_QUADS)
		gl.glVertex2f(x1, y1)#+70
		gl.glVertex2f(x1 + width+2, y1)
		gl.glVertex2f(x2 + width+2, y2-10)
		gl.glVertex2f(x2, y2-10)
		gl.glEnd()
		
	'''
	***********************************************************
	New Function
	***********************************************************
	'''
	def paintLineHorizontal(self, x1, y1, x2, y2, width = 1, red = 0, green = 0, blue = 0):
		top = math.ceil(width/2.0)
		bottom = math.floor(width/2.0)
		
		gl.glColor3f(red, green, blue)
		gl.glBegin(gl.GL_QUADS)
		gl.glVertex2f(x1, y1 - top)
		gl.glVertex2f(x2, y2 - top)
		gl.glVertex2f(x2, y2 + bottom)
		gl.glVertex2f(x1, y1 + bottom)
		gl.glEnd();
	
	def paintRect(self, x, y, red, green, blue):
		# Draw the background of the rectangle
		gl.glColor3f(red, green, blue)
		gl.glBegin(gl.GL_QUADS)
		gl.glVertex2f(x, y)
		gl.glVertex2f(x + self.rectSize, y)
		gl.glVertex2f(x + self.rectSize, y + self.rectSize)
		gl.glVertex2f(x, y + self.rectSize)
		gl.glEnd()
		
		# Revert the drawing mode
		gl.glPolygonMode(gl.GL_FRONT_AND_BACK, gl.GL_FILL)
		
	def paintGrid(self):
		# Draw the border of the grid
		gl.glColor3f(0.9, 0.9, 0.9)
		gl.glLineWidth(2.0)
		# gl.glPolygonMode(gl.GL_FRONT_AND_BACK, gl.GL_LINE)
		gl.glBegin(gl.GL_QUADS);
		gl.glVertex2f(self.graphX, self.graphY)
		gl.glVertex2f(self.graphX + self.graphWidth, self.graphY)
		gl.glVertex2f(self.graphX + self.graphWidth, self.graphY + self.graphHeight)
		gl.glVertex2f(self.graphX, self.graphY + self.graphHeight)
		gl.glEnd()
		gl.glPolygonMode(gl.GL_FRONT_AND_BACK, gl.GL_FILL)
		
		moveX = self.graphWidth - (self.graphPadding * 2) - ((self.gridCols * self.rectSize) + (self.rectPadding * (self.gridCols)))
		moveY = self.graphHeight - (self.graphPadding * 2) - ((self.gridRows * self.rectSize) + (self.rectPadding * (self.gridRows)))
		
		# Draw the background lines
		numLines = int(self.gridRows/5)
		gl.glBegin(gl.GL_LINES)
		baseY = ((self.graphY + self.graphHeight) - self.graphPadding)
		fiveRects = (5 * self.rectSize) + (5 * self.rectPadding)
		for i in range(numLines):
			gl.glVertex2f(self.graphX, baseY - ((i+1) * fiveRects) - 1)
			gl.glVertex2f(self.graphX + self.graphWidth, baseY - ((i+1) * fiveRects) - 1)
		gl.glEnd()

		# Draw the event lines
		for i in range(len(self.timeEvent)):
			xposition = self.graphX + (self.timeEvent[i] * (((self.gridCols * self.rectSize) + (2 * self.graphPadding)) - ((self.gridCols + 1) * self.rectPadding)))
			if xposition < (self.graphX + self.graphWidth):
				if int(i+1) in self.logStreamEvent:
					self.paintLine(xposition, self.graphY, xposition, self.graphY + self.graphHeight, 2, 1.0, 0.0, 0.0) # Red
				else:
					self.paintLine(xposition, self.graphY, xposition, self.graphY + self.graphHeight, 2, 0.16, 0.76, 0.13) # Green

		# Drawing lane deviation lines
		for i in range(len(self.deviationEvent)):
			xposition = self.graphX + (self.deviationEvent[i] * (((self.gridCols * self.rectSize) + (2 * self.graphPadding)) - ((self.gridCols + 1) * self.rectPadding)))
			if xposition < (self.graphX + self.graphWidth):
				# self.paintLine(xposition, self.graphY, xposition, self.graphY + self.graphHeight, 2, 1.0, 0.6, 1.0)
				self.paintLine(xposition, self.graphY, xposition, self.graphY + self.graphHeight, 2, 0.0, 0.0, 0.0)  
		
		# Fill the grid
		gl.glLineWidth(2.0)
		for r, i in enumerate(self.grid):
			for c, v in enumerate(i):
				if v > 0:
					rectx = self.graphX + self.graphPadding + (self.rectPadding * c) + (c * self.rectSize)
					recty = self.graphY + self.graphPadding + moveY + (self.rectPadding * r) + (r * self.rectSize)
					if v == 1:
						self.paintRect(rectx, recty, 0.7, 0.7, 0.7)
					elif v == 2:
						self.paintRect(rectx, recty, 0.9412, 0.6784, 0.3059)
					elif v == 3:
						self.paintRect(rectx, recty, 0.851, 0.3255, 0.3099)

	def paintDSM(self):
		# Draw the border
		gl.glColor3f(0.9, 0.9, 0.9)
		gl.glLineWidth(2.0)
		# gl.glPolygonMode(gl.GL_FRONT_AND_BACK, gl.GL_LINE)
		gl.glBegin(gl.GL_QUADS);
		gl.glVertex2f(self.dsmX, self.dsmY)
		gl.glVertex2f(self.dsmX + self.dsmWidth, self.dsmY)
		gl.glVertex2f(self.dsmX + self.dsmWidth, self.dsmY + self.dsmHeight)
		gl.glVertex2f(self.dsmX, self.dsmY + self.dsmHeight)
		gl.glEnd()
		gl.glPolygonMode(gl.GL_FRONT_AND_BACK, gl.GL_FILL)

		# Adding legend
		self.paintLineHorizontal(self.dsmX + 5, self.dsmY + 100, self.dsmX + 50, self.dsmY + 100, 10, 0.16, 0.76, 0.13)
		self.paintLineHorizontal(self.dsmX + 5, self.dsmY + 230, self.dsmX + 50, self.dsmY + 230, 10, 1.00, 0.00, 0.00)
		self.paintLineHorizontal(self.dsmX + 5, self.dsmY + 350, self.dsmX + 50, self.dsmY + 350, 10, 0.00, 0.00, 0.00)
		
	def paintCircle(self, x, y, radius, red = 0, green = 0, blue = 0):
		gl.glColor3f(red, green, blue)
		gl.glBegin(gl.GL_POLYGON)
		for i in range(360):
			gl.glVertex2f(x + (radius * math.sin(math.radians(i))), y + (radius * math.cos(math.radians(i))))
		gl.glEnd()
		
	def paintEvent(self, event):
		gl.glClear(gl.GL_COLOR_BUFFER_BIT)
		gl.glLoadIdentity();
		
		# Initialize the painter
		painter = QtGui.QPainter()
		painter.begin(self)
		
		'''
		***********************************************************
		Changed the if statement
		Bind the texture to nothing
		***********************************************************
		'''
		gl.glBindTexture(gl.GL_TEXTURE_2D, 0)
		if self.showing == self.GRAPH_ONE:
			# Get the bounding rectangles
			tripEndBR = self.printer.getTextBox(painter, "Trip End", self.printer.fontNormal)
			
			# Draw OpenGL stuff
			self.paintGrid()
			self.paintDSM()
			
			self.paintRect(self.highRiskX, self.highRiskY, 0.851, 0.3255, 0.3099)
			self.paintRect(self.mediumRiskX, self.mediumRiskY, 0.9412, 0.6784, 0.3059)
			self.paintRect(self.lowRiskX, self.lowRiskY, 0.7, 0.7, 0.7)
			
			self.btnGraph1.drawBackground()
			self.btnGraph3.drawBackground()
			
			# Draw painter stuff
			self.printer.printCentered(painter, "Trip Summary", self.printer.fontXLarge, 0, 0, self.width, self.titleHeight, 50, 50, 50)
			self.printer.printCentered(painter, "Glance Patterns to the Display", self.printer.fontLarge, self.graphX, self.graphY - 60, self.graphWidth, self.heightFivePercent, 50, 50, 50)
			self.printer.printText(painter, "Trip Start", self.printer.fontNormal, self.graphX, self.graphY + self.graphHeight, self.width, self.height, 50, 50, 50)
			self.printer.printText(painter, "Trip End", self.printer.fontNormal, self.graphX + self.graphWidth - tripEndBR.right(), self.graphY + self.graphHeight, self.width, self.height, 50, 50, 50)
			self.printer.printCentered(painter, "Driving Safety Metrics", self.printer.fontLarge, self.dsmX, self.dsmY, self.dsmWidth, self.heightFivePercent, 50, 50, 50)
			
			# self.printer.printTextWrap(painter, u"\u2022", self.printer.fontSmall, self.dsmX + 10, self.dsmY + 70, self.dsmWidth - 60, self.dsmHeight, 50, 50, 50)
			self.printer.printTextWrap(painter, " %i"%(8-self.ube), self.printer.fontNormal, self.dsmX + 50, self.dsmY + 70, self.dsmWidth - 30, self.dsmHeight, 40, 193, 34)
			self.printer.printTextWrap(painter, "      out of 8 safe responses to lead    vehicle braking", self.printer.fontNormal, self.dsmX + 50, self.dsmY + 70, self.dsmWidth - 30, self.dsmHeight, 50, 50, 50)
			
			# self.printer.printTextWrap(painter, u"\u2022", self.printer.fontSmall, self.dsmX + 10, self.dsmY + 200, self.dsmWidth - 30, self.dsmHeight, 50, 50, 50)
			self.printer.printTextWrap(painter, " %i"%self.ube, self.printer.fontNormal, self.dsmX + 50, self.dsmY + 200, self.dsmWidth - 30, self.dsmHeight, 255, 0, 0)
			self.printer.printTextWrap(painter, "      out of 8 unsafe responses to    lead vehicle braking", self.printer.fontNormal, self.dsmX + 50, self.dsmY + 200, self.dsmWidth - 30, self.dsmHeight, 50, 50, 50)
			
			# self.printer.printTextWrap(painter, u"\u2022", self.printer.fontSmall, self.dsmX + 10, self.dsmY + 330, self.dsmWidth - 30, self.dsmHeight, 50, 50, 50)
			self.printer.printTextWrap(painter, " %i"%self.ld, self.printer.fontNormal, self.dsmX + 50, self.dsmY + 330, self.dsmWidth - 30, self.dsmHeight, 255, 0, 0)#255, 153, 255)
			self.printer.printTextWrap(painter, "      lane departures", self.printer.fontNormal, self.dsmX + 50, self.dsmY + 330, self.dsmWidth - 30, self.dsmHeight, 50, 50, 50)

			self.printer.printText(painter, str(int(self.low)), self.printer.fontNormal, self.lowRiskX + self.rectSize + 16, self.lowRiskY, self.width, self.height)
			self.printer.printText(painter, str(int(self.medium)), self.printer.fontNormal, self.mediumRiskX + self.rectSize + 16, self.mediumRiskY, self.width, self.height)
			self.printer.printText(painter, str(int(self.high)), self.printer.fontNormal, self.highRiskX + self.rectSize + 16, self.highRiskY, self.width, self.height)
			self.printer.printText(painter, "Low Risk Glances", self.printer.fontNormal, self.lowRiskX + self.rectSize + 150, self.lowRiskY, self.width, self.height)
			self.printer.printText(painter, "Medium Risk Glances", self.printer.fontNormal, self.mediumRiskX + self.rectSize + 150, self.mediumRiskY, self.width, self.height)
			self.printer.printText(painter, "High Risk Glances", self.printer.fontNormal, self.highRiskX + self.rectSize + 150, self.highRiskY, self.width, self.height)
			
			self.btnGraph1.drawText(painter, self.printer, self.printer.fontLarge)
			self.btnGraph3.drawText(painter, self.printer, self.printer.fontLarge)

		elif self.showing == self.GRAPH_TWO:
			self.paintCircle(self.lowIconX, self.lowIconY, self.glanceNumRadius, 0.851, 0.325, 0.31)
			self.paintCircle(self.mediumIconX, self.mediumIconY, self.glanceNumRadius, 0.941, 0.678, 0.305)
			self.paintCircle(self.highIconX, self.highIconY, self.glanceNumRadius, 0.5, 0.5, 0.5)
			
			self.btnGraph4.drawBackground()
			
			'''
			***********************************************************
			Removed the gl.GL_LINES block
			Added the paintLineHorizontal functions
			***********************************************************
			'''
			self.paintLineHorizontal(self.glancesGridX, self.glancesGridY + self.glancesGridBarPaddingTop, self.glancesGridX + self.glancesGridWidth, self.glancesGridY + self.glancesGridBarPaddingTop, 2, 0.3, 0.3, 0.3)
			self.paintLineHorizontal(self.glancesGridX, self.glancesGridY + self.glancesGridBarPaddingTop + (self.glancesGridBarHeight/2.0), self.glancesGridX + self.glancesGridWidth, self.glancesGridY + self.glancesGridBarPaddingTop + (self.glancesGridBarHeight/2.0), 2, 0.3, 0.3, 0.3)
			self.paintLineHorizontal(self.glancesGridX, self.glancesGridY + self.glancesGridHeight, self.glancesGridX + self.glancesGridWidth, self.glancesGridY + self.glancesGridHeight, 2, 0.3, 0.3, 0.3)
			
			gl.glBegin(gl.GL_QUADS)
			gl.glColor3f(0.5, 0.5, 0.5)
			gl.glVertex2f(self.glancesGridX, self.glancesGridTitleY)
			gl.glVertex2f(self.glancesGridX + self.glancesGridWidth, self.glancesGridTitleY)
			gl.glVertex2f(self.glancesGridX + self.glancesGridWidth, self.glancesGridTitleY + self.glancesGridTitleHeight)
			gl.glVertex2f(self.glancesGridX, self.glancesGridTitleY + self.glancesGridTitleHeight)
			gl.glVertex2f(self.tripsTitleX, self.tripsTitleY)
			gl.glVertex2f(self.tripsTitleX + self.tripsTitleWidth, self.tripsTitleY)
			gl.glVertex2f(self.tripsTitleX + self.tripsTitleWidth, self.tripsTitleY + self.tripsTitleHeight)
			gl.glVertex2f(self.tripsTitleX, self.tripsTitleY + self.tripsTitleHeight)

			# Safety metric text block
			gl.glVertex2f(self.safetyMetricsTitleX, self.safetyMetricsTitleY-60)
			gl.glVertex2f(self.safetyMetricsTitleX + self.safetyMetricsTitleWidth, self.safetyMetricsTitleY-60)
			gl.glVertex2f(self.safetyMetricsTitleX + self.safetyMetricsTitleWidth, self.safetyMetricsTitleY + self.safetyMetricsTitleHeight-60)
			gl.glVertex2f(self.safetyMetricsTitleX, self.safetyMetricsTitleY + self.safetyMetricsTitleHeight-60)
			
			# Comparison Bars -- COLOR
			# gl.glColor3f(0.67, 0.78, 0.82)
			gl.glColor3f(0.576, 0.72, 0.85)
			barOffset = self.glancesGridBarHeight - ((float(self.pastNumbersSum) / float(self.glancesGridMaxNum)) * self.glancesGridBarHeight)
			gl.glVertex2f(self.glancesGridX + self.glancesGridPadding, self.glancesGridY + barOffset + self.glancesGridBarPaddingTop)
			gl.glVertex2f(self.glancesGridX + self.glancesGridPadding + self.glancesGridBarWidth, self.glancesGridY + barOffset + self.glancesGridBarPaddingTop)
			gl.glVertex2f(self.glancesGridX + self.glancesGridPadding + self.glancesGridBarWidth, self.glancesGridY + self.glancesGridHeight)
			gl.glVertex2f(self.glancesGridX + self.glancesGridPadding, self.glancesGridY + self.glancesGridHeight)
			# gl.glColor3f(0.576, 0.65, 0.9)
			barOffset = self.glancesGridBarHeight - ((float(self.currentNumbersSum) / float(self.glancesGridMaxNum)) * self.glancesGridBarHeight)
			gl.glVertex2f(self.glancesGridX + (self.glancesGridPadding*2) + self.glancesGridBarWidth, self.glancesGridY + barOffset + self.glancesGridBarPaddingTop)
			gl.glVertex2f(self.glancesGridX + (self.glancesGridPadding*2) + (self.glancesGridBarWidth*2), self.glancesGridY + barOffset + self.glancesGridBarPaddingTop)
			gl.glVertex2f(self.glancesGridX + (self.glancesGridPadding*2) + (self.glancesGridBarWidth*2), self.glancesGridY + self.glancesGridHeight)
			gl.glVertex2f(self.glancesGridX + (self.glancesGridPadding*2) + self.glancesGridBarWidth, self.glancesGridY + self.glancesGridHeight)
			
			gl.glColor3f(0.7, 0.7, 0.7)
			gl.glVertex2f(self.glanceNumTitleX, self.glanceNumTitleY)
			gl.glVertex2f(self.glanceNumTitleX + self.glanceNumTitleWidth, self.glanceNumTitleY)
			gl.glVertex2f(self.glanceNumTitleX + self.glanceNumTitleWidth, self.glanceNumTitleY + self.glanceNumTitleHeight)
			gl.glVertex2f(self.glanceNumTitleX, self.glanceNumTitleY + self.glanceNumTitleHeight)
			
			gl.glVertex2f(self.safetyMetricsTitleX, self.safetyMetricsTitleY+20)
			gl.glVertex2f(self.safetyMetricsTitleX + self.safetyMetricsTitleWidth, self.safetyMetricsTitleY+20)
			gl.glVertex2f(self.safetyMetricsTitleX + self.safetyMetricsTitleWidth, self.safetyMetricsTitleY + self.safetyMetricsTitleHeight+20)
			gl.glVertex2f(self.safetyMetricsTitleX, self.safetyMetricsTitleY + self.safetyMetricsTitleHeight+20)
			gl.glEnd()
			
			bottomBar = self.glancesGridY + self.glancesGridHeight
			self.paintCircle(self.glancesGridX + self.glancesGridPadding + (self.glancesGridBarWidth/2.0), bottomBar - ((self.pastNumbers[2]/float(self.glancesGridMaxNum))*self.glancesGridBarHeight), 18, 0.5, 0.5, 0.5)
			self.paintCircle(self.glancesGridX + self.glancesGridPadding + (self.glancesGridBarWidth/2.0), bottomBar - ((self.pastNumbers[1]/float(self.glancesGridMaxNum))*self.glancesGridBarHeight), 18, 0.941, 0.678, 0.305)
			self.paintCircle(self.glancesGridX + self.glancesGridPadding + (self.glancesGridBarWidth/2.0), bottomBar - ((self.pastNumbers[0]/float(self.glancesGridMaxNum))*self.glancesGridBarHeight), 18, 0.851, 0.325, 0.31)
			self.paintCircle(self.glancesGridX + self.glancesGridBarWidth + (self.glancesGridPadding*2) + (self.glancesGridBarWidth/2.0), bottomBar - ((self.currentNumbers[2]/float(self.glancesGridMaxNum))*self.glancesGridBarHeight), 18, 0.5, 0.5, 0.5)
			self.paintCircle(self.glancesGridX + self.glancesGridBarWidth + (self.glancesGridPadding*2) + (self.glancesGridBarWidth/2.0), bottomBar - ((self.currentNumbers[1]/float(self.glancesGridMaxNum))*self.glancesGridBarHeight), 18, 0.941, 0.678, 0.305)
			self.paintCircle(self.glancesGridX + self.glancesGridBarWidth + (self.glancesGridPadding*2) + (self.glancesGridBarWidth/2.0), bottomBar - ((self.currentNumbers[0]/float(self.glancesGridMaxNum))*self.glancesGridBarHeight), 18, 0.851, 0.325, 0.31)
			
			self.paintLineHorizontal(self.glancesGridX + self.glancesGridPadding + (self.glancesGridBarWidth/2.0), bottomBar - ((self.pastNumbers[2]/float(self.glancesGridMaxNum))*self.glancesGridBarHeight), self.glancesGridX + self.glancesGridBarWidth + (self.glancesGridPadding*2) + (self.glancesGridBarWidth/2.0), bottomBar - ((self.currentNumbers[2]/float(self.glancesGridMaxNum))*self.glancesGridBarHeight), 10, 0.5, 0.5, 0.5)
			self.paintLineHorizontal(self.glancesGridX + self.glancesGridPadding + (self.glancesGridBarWidth/2.0), bottomBar - ((self.pastNumbers[1]/float(self.glancesGridMaxNum))*self.glancesGridBarHeight), self.glancesGridX + self.glancesGridBarWidth + (self.glancesGridPadding*2) + (self.glancesGridBarWidth/2.0), bottomBar - ((self.currentNumbers[1]/float(self.glancesGridMaxNum))*self.glancesGridBarHeight), 10, 0.941, 0.678, 0.305)
			self.paintLineHorizontal(self.glancesGridX + self.glancesGridPadding + (self.glancesGridBarWidth/2.0), bottomBar - ((self.pastNumbers[0]/float(self.glancesGridMaxNum))*self.glancesGridBarHeight), self.glancesGridX + self.glancesGridBarWidth + (self.glancesGridPadding*2) + (self.glancesGridBarWidth/2.0), bottomBar - ((self.currentNumbers[0]/float(self.glancesGridMaxNum))*self.glancesGridBarHeight), 10, 0.851, 0.325, 0.31)
			
			self.paintCircle(self.glancesGridX + self.glancesGridPadding + (self.glancesGridBarWidth/2.0), bottomBar - ((self.pastNumbers[2]/float(self.glancesGridMaxNum))*self.glancesGridBarHeight), 8, 1.0, 1.0, 1.0)
			self.paintCircle(self.glancesGridX + self.glancesGridPadding + (self.glancesGridBarWidth/2.0), bottomBar - ((self.pastNumbers[1]/float(self.glancesGridMaxNum))*self.glancesGridBarHeight), 8, 1.0, 1.0, 1.0)
			self.paintCircle(self.glancesGridX + self.glancesGridPadding + (self.glancesGridBarWidth/2.0), bottomBar - ((self.pastNumbers[0]/float(self.glancesGridMaxNum))*self.glancesGridBarHeight), 8, 1.0, 1.0, 1.0)
			self.paintCircle(self.glancesGridX + self.glancesGridBarWidth + (self.glancesGridPadding*2) + (self.glancesGridBarWidth/2.0), bottomBar - ((self.currentNumbers[2]/float(self.glancesGridMaxNum))*self.glancesGridBarHeight), 8, 1.0, 1.0, 1.0)
			self.paintCircle(self.glancesGridX + self.glancesGridBarWidth + (self.glancesGridPadding*2) + (self.glancesGridBarWidth/2.0), bottomBar - ((self.currentNumbers[1]/float(self.glancesGridMaxNum))*self.glancesGridBarHeight), 8, 1.0, 1.0, 1.0)
			self.paintCircle(self.glancesGridX + self.glancesGridBarWidth + (self.glancesGridPadding*2) + (self.glancesGridBarWidth/2.0), bottomBar - ((self.currentNumbers[0]/float(self.glancesGridMaxNum))*self.glancesGridBarHeight), 8, 1.0, 1.0, 1.0)
			
			self.printer.printCentered(painter, "Compare Recent Trips", self.printer.fontXLarge, 0, 0, self.width, self.titleHeight, 50, 50, 50)
			self.printer.printCentered(painter, "Glances to Display", self.printer.fontLarge, self.glancesGridTitleX, self.glancesGridTitleY, self.glancesGridTitleWidth, self.glancesGridTitleHeight, 240, 240, 240)
			self.printer.printCentered(painter, "Number of Glances", self.printer.fontLarge, self.tripsTitleX, self.tripsTitleY, self.tripsTitleWidth, self.tripsTitleHeight, 240, 240, 240)
			self.printer.printCentered(painter, "Trips:\t\t\t\tPrevious\t\t\t\tCurrent", self.printer.fontLarge, self.glanceNumTitleX, self.glanceNumTitleY, self.glanceNumTitleWidth, self.glanceNumTitleHeight, 240, 240, 240)
			self.printer.printCentered(painter, "Safety Metrics", self.printer.fontLarge, self.safetyMetricsTitleX, self.safetyMetricsTitleY-60, self.glanceNumTitleWidth, self.glanceNumTitleHeight, 240, 240, 240)
			self.printer.printCentered(painter, "Trips:\t\t\t\tPrevious\t\t\t\tCurrent", self.printer.fontLarge, self.safetyMetricsTitleX, self.safetyMetricsTitleY+20, self.glanceNumTitleWidth, self.glanceNumTitleHeight, 240, 240, 240)
			self.printer.printCenteredHor(painter, str(self.glancesGridMaxNum), self.printer.fontNormal, 0, self.glancesGridY + 3, self.glancesGridX, 100, 40, 40, 40)
			self.printer.printCenteredHor(painter, str(int(self.glancesGridMaxNum/2.0)), self.printer.fontNormal, 0, self.glancesGridY + 3 + (self.glancesGridBarHeight/2.0), self.glancesGridX, 100, 40, 40, 40)
			self.printer.printCenteredHor(painter, "0", self.printer.fontNormal, 0, self.glancesGridY + self.glancesGridHeight - 20, self.glancesGridX, 100, 40, 40, 40)
			self.printer.printCenteredHor(painter, "Previous", self.printer.fontNormal, self.glancesGridX + self.glancesGridPadding, self.glancesGridY + self.glancesGridHeight, self.glancesGridBarWidth, 100, 40, 40, 40)
			self.printer.printCenteredHor(painter, "Current", self.printer.fontNormal, self.glancesGridX + (self.glancesGridPadding*2) + self.glancesGridBarWidth, self.glancesGridY + self.glancesGridHeight, self.glancesGridBarWidth, 100, 40, 40, 40)
			self.printer.printText(painter, str(self.pastNumbers[2]), self.printer.fontNormal, self.highPastTitleX+40, self.highPastTitleY, self.width, self.height)
			self.printer.printText(painter, str(self.currentNumbers[2]), self.printer.fontNormal, self.highCurrentTitleX+45, self.highCurrentTitleY, self.width, self.height)
			self.printer.printText(painter, str(self.pastNumbers[1]), self.printer.fontNormal, self.mediumPastTitleX+40, self.mediumPastTitleY, self.width, self.height)
			self.printer.printText(painter, str(self.currentNumbers[1]), self.printer.fontNormal, self.mediumCurrentTitleX+45, self.mediumCurrentTitleY, self.width, self.height)
			self.printer.printText(painter, str(self.pastNumbers[0]), self.printer.fontNormal, self.lowPastTitleX+40, self.lowPastTitleY, self.width, self.height)
			self.printer.printText(painter, str(self.currentNumbers[0]), self.printer.fontNormal, self.lowCurrentTitleX+45, self.lowCurrentTitleY, self.width, self.height)
			self.printer.printText(painter, "Total", self.printer.fontNormal, self.totalTitleX, self.totalTitleY+20, self.width, self.height)
			self.printer.printText(painter, str(self.pastNumbersSum), self.printer.fontNormal, self.totalPastTitleX+40, self.totalPastTitleY+20, self.width, self.height)
			self.printer.printText(painter, str(self.currentNumbersSum), self.printer.fontNormal, self.totalCurrentTitleX+45, self.totalCurrentTitleY+20, self.width, self.height)
			self.printer.printText(painter, "Safe Braking", self.printer.fontNormal, self.safeEventTitleX, self.safeEventTitleY+40, self.width, self.height, 40, 193, 34)
			self.printer.printText(painter, "%s"%str(self.compSafe[0]), self.printer.fontNormal, self.safeEventPastNumTitleX+40, self.safeEventPastNumTitleY+40, self.width, self.height)
			self.printer.printText(painter, "%s"%str(self.compSafe[1]), self.printer.fontNormal, self.safeEventCurrentNumTitleX+45, self.safeEventCurrentNumTitleY+40, self.width, self.height)
			self.printer.printText(painter, "Unsafe Braking", self.printer.fontNormal, self.unsafeEventTitleX, self.unsafeEventTitleY+55, self.width, self.height, 217, 83, 79)
			self.printer.printText(painter, "%s"%str(self.compUnsafe[0]), self.printer.fontNormal, self.unsafeEventPastNumTitleX+40, self.unsafeEventPastNumTitleY+55, self.width, self.height)
			self.printer.printText(painter, "%s"%str(self.compUnsafe[1]), self.printer.fontNormal, self.unsafeEventCurrentNumTitleX+45, self.unsafeEventCurrentNumTitleY+55, self.width, self.height)
			self.printer.printText(painter, "Lane Departures", self.printer.fontNormal, self.deviationsEventTitleX, self.deviationsEventTitleY+70, self.width, self.height, 217, 83, 79)
			self.printer.printText(painter, "%s"%str(self.compLane[0]), self.printer.fontNormal, self.deviationsEventPastNumTitleX+40, self.deviationsEventPastNumTitleY+70, self.width, self.height)
			self.printer.printText(painter, "%s"%str(self.compLane[1]), self.printer.fontNormal, self.deviationsEventCurrentNumTitleX+45, self.deviationsEventCurrentNumTitleY+70, self.width, self.height)
			
			self.btnGraph4.drawText(painter, self.printer, self.printer.fontLarge)
			
		elif self.showing == self.BADGE_SCREEN:
			self.btnGraph2.drawBackground()
			
			self.badgeScreen.draw(painter)
			
			self.btnGraph2.drawText(painter, self.printer, self.printer.fontLarge)
			
		# End the painter
		painter.end()