1:bf539ff23816
Anton Shestakov <engored@ya.ru>, Sun, 13 Oct 2013 13:18:14 +0900
Wiring svg.

previous change 0:d3c896ca5a17

chukmote.py

Permissions: -rw-r--r--

Other formats: Feeds:
#!/usr/bin/env python3
import atexit
import curses
import sys
class UI:
def init(self):
self.stdscr = curses.initscr()
curses.noecho()
curses.cbreak()
curses.curs_set(0)
self.stdscr.keypad(1)
self.nubwin = self.stdscr.subwin(9, 17, 2, 4)
self.inwin = self.stdscr.subwin(10, 20, 2, 23)
self.lthwin = self.stdscr.subwin(9, 4, 2, 45)
self.rthwin = self.stdscr.subwin(9, 4, 2, 50)
self.outwin = self.stdscr.subwin(10, 20, 2, 56)
def draw(self):
self.stdscr.box()
self.nubwin.box()
self.inwin.box()
self.inwin.addstr(0, 1, ' Input ')
self.inwin.addstr(2, 4, 'Nub X:')
self.inwin.addstr(3, 4, 'Nub Y:')
self.inwin.addstr(4, 4, 'Pitch:')
self.inwin.addstr(5, 4, 'Roll:')
self.inwin.addstr(6, 4, 'C:')
self.inwin.addstr(7, 4, 'Z:')
self.lthwin.box()
self.rthwin.box()
self.outwin.box()
self.outwin.addstr(0, 1, ' Output ')
self.outwin.addstr(2, 4, 'Left:')
self.outwin.addstr(3, 4, 'Right:')
self.stdscr.refresh()
def update(self, rawinput, lspd, rspd):
self.inwin.addstr(2, 10, '{0:5}'.format(rawinput.x))
self.inwin.addstr(3, 10, '{0:5}'.format(rawinput.y))
self.inwin.addstr(4, 10, '{0:5}'.format(rawinput.pitch))
self.inwin.addstr(5, 10, '{0:5}'.format(rawinput.roll))
self.inwin.addstr(6, 8, 'on ' if rawinput.c else 'off')
self.inwin.addstr(7, 8, 'on ' if rawinput.z else 'off')
self.inwin.refresh()
self.nubwin.erase()
self.nubwin.box()
self.nubwin.addch(4 - round(rawinput.y / 42), 8 + round(rawinput.x / 21), 'o')
self.nubwin.refresh()
self.lthwin.erase()
self.lthwin.box()
llim = 4 - round(lspd / 42)
for i in range(min(llim, 4), max(llim, 4) + 1):
self.lthwin.addstr(i, 1, ' ', curses.A_REVERSE)
self.lthwin.refresh()
self.rthwin.erase()
self.rthwin.box()
rlim = 4 - round(rspd / 42)
for i in range(min(rlim, 4), max(rlim, 4) + 1):
self.rthwin.addstr(i, 1, ' ', curses.A_REVERSE)
self.rthwin.refresh()
self.outwin.addstr(2, 10, '{0:5}'.format(lspd))
self.outwin.addstr(3, 10, '{0:5}'.format(rspd))
self.outwin.refresh()
def error(self, error):
self.stdscr.addstr(22, 2, error)
self.stdscr.refresh()
def finish(self):
self.stdscr.keypad(0)
curses.nocbreak()
curses.echo()
curses.endwin()
class Driver:
deadzone = 10
lspd = 0
rspd = 0
def update(self, rawinput):
self.lspd = 0
self.rspd = 0
if abs(rawinput.y) > self.deadzone:
self.lspd = rawinput.y
self.rspd = rawinput.y
if abs(rawinput.x) > self.deadzone:
self.lspd += rawinput.x
self.rspd -= rawinput.x
if self.lspd < -128: self.lspd = -128
if self.lspd > 127: self.lspd = 127
if self.rspd < -128: self.rspd = -128
if self.rspd > 127: self.rspd = 127
class RawInput:
def __init__(self, x=0, y=0, pitch=0, roll=0, c=False, z=False):
self.x = x
self.y = y
self.pitch = pitch
self.roll = roll
self.c = c
self.z = z
def decode_input(line):
parts = line.strip().split(',')
x = int(parts[0])
y = int(parts[1])
pitch = int(parts[2])
roll = int(parts[3])
c = parts[4] == 'C'
z = parts[5] == 'Z'
return RawInput(x, y, pitch, roll, c, z)
def encode_output(lspd, rspd):
return '{0},{1}\n'.format(lspd, rspd)
def main():
tty_in = open(sys.argv[1], 'rb', 0)
tty_out = open(sys.argv[2], 'wb', 0)
driver = Driver()
ui = UI()
ui.init()
atexit.register(ui.finish)
ui.draw()
with tty_in, tty_out:
while True:
try:
line = tty_in.readline().decode()
rawinput = decode_input(line)
except (IndexError, ValueError):
ui.error('bad line "{0}"'.format(line.strip('\n')))
else:
driver.update(rawinput)
ui.update(rawinput, driver.lspd, driver.rspd)
tty_out.write(encode_output(driver.lspd, driver.rspd).encode())
if __name__ == '__main__':
main()