Created
July 30, 2017 13:12
-
-
Save carlfindahl/4cbb335ce9a5c4d23d0d5ba4797812b8 to your computer and use it in GitHub Desktop.
Live Speedometer
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.