Skip to content

Instantly share code, notes, and snippets.

@carlfindahl
Created July 30, 2017 13:12
Show Gist options
  • Save carlfindahl/4cbb335ce9a5c4d23d0d5ba4797812b8 to your computer and use it in GitHub Desktop.
Save carlfindahl/4cbb335ce9a5c4d23d0d5ba4797812b8 to your computer and use it in GitHub Desktop.
Live Speedometer
import threading
import time
import curses
class Speedometer(object):
def __init__(self):
# TRACKER VALUES
self.distTravelled = 0
self.distToTarget = 0
self.timeLeft = 0
self.speed = 0
self.interval = 1
self.running = True
def calculateTime(self):
try:
self.timeLeft = ((self.distToTarget / self.speed) * 3600) / 60
self.distTravelled += (self.speed / 3600) / 100
self.distToTarget -= (self.speed / 3600) / 100
except:
pass
# STARTING AND STOPPING CURSES
def play(self):
# GAME WINDOWS
self.screen = curses.initscr()
self.w_header = curses.newwin(1, curses.COLS, 0, 0)
# CURSES INITIALIZATION
curses.start_color()
curses.cbreak()
self.screen.keypad(True)
curses.curs_set(0)
self.screen.nodelay(True)
# INITIATE COLORS
curses.init_pair(1, curses.COLOR_GREEN, curses.COLOR_BLACK)
curses.init_pair(2, curses.COLOR_BLACK, curses.COLOR_WHITE)
# PREPARE WINDOWS
self.w_header.bkgd(' ', curses.color_pair(2))
# START APP
self.t_gameLoop = threading.Thread(target=self.mainLoop)
self.t_gameLoop.start()
self.t_gameLoop.join()
# EXIT APP
self.quit()
def quit(self):
# CURSES SHUTDOWN
self.screen.keypad(False)
curses.nocbreak()
curses.endwin()
def refreshAll(self):
self.screen.noutrefresh()
self.w_header.noutrefresh()
curses.doupdate()
# MAIN LOOP
def mainLoop(self):
while self.running:
# UPDATES
time.sleep(0.01)
self.calculateTime()
self.showEstimates()
self.setheader('LIVE SPEEDOMETER AND SPEED TRACKING')
# REDRAW
self.refreshAll()
# USER INPUT
self.processInput(self.screen.getch())
def processInput(self, ch):
try:
if ch == 27:
self.running = False
elif ch == curses.KEY_UP:
self.speed += self.interval
elif ch == curses.KEY_DOWN:
if self.speed >= self.interval:
self.speed -= self.interval
elif ch == curses.KEY_RIGHT:
self.distToTarget += self.interval
elif ch == curses.KEY_LEFT:
if self.distToTarget >= self.interval:
self.distToTarget -= self.interval
elif ch == curses.PADPLUS:
self.interval += 1
elif ch == curses.PADMINUS:
if self.interval > 1:
self.interval -= 1
except:
pass
def showEstimates(self):
self.screen.clear()
# TITLES
self.screen.addstr(3, 3, 'TIME LEFT:', curses.A_BOLD + curses.color_pair(1))
self.screen.addstr(4, 3, 'DISTANCE LEFT:', curses.A_BOLD + curses.color_pair(1))
self.screen.addstr(5, 3, 'DISTANCE MOVED:', curses.A_BOLD + curses.color_pair(1))
self.screen.addstr(6, 3, 'CURRENT VELOCITY:', curses.A_BOLD + curses.color_pair(1))
self.screen.addstr(curses.LINES - 2, 1, 'INCREASE / DECREASE INTERVAL:',
curses.A_BOLD + curses.color_pair(1))
self.screen.addstr(8, 3, '[UP] and [DOWN] arrows to control speed')
self.screen.addstr(9, 3, '[RIGHT] and [LEFT] arrows to control distance')
self.screen.addstr(10, 3, '[+] and [-] to control interval to change values')
self.screen.addstr(12, 3, '[ESC] to Quit')
# INFO
self.screen.addstr(3, 24, '%.2f minutes' % (self.timeLeft))
self.screen.addstr(4, 24, '%.2f Km' % (self.distToTarget))
self.screen.addstr(5, 24, '%.2f Km' % (self.distTravelled))
self.screen.addstr(6, 24, '%.2f Km/h' % (self.speed))
self.screen.addstr(curses.LINES - 2, 32, '%d' % (self.interval))
def setheader(self, header):
self.w_header.clear()
self.w_header.addstr(0, curses.COLS // 2 - len(header) // 2, header, curses.color_pair(2))
def Main():
speedometer = Speedometer()
speedometer.play()
if __name__ == '__main__':
Main()
@carlfindahl
Copy link
Author

A curses based application to estimate travel times. With live updates to your progress. If you update the speed on your trip it should be really accurate.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment