Commit fa041706 authored by Guido van Rossum's avatar Guido van Rossum

VCR.py: Use unix files instead of stdio files for tty communication,

        because of buffering.  Also added several new commands (Jack).
VFile.py: Made setting of RGB or colormap mode separate methods,
	so they can be overridden (e.g. when using the Glx.draw widget
	the way to change the mode is totally different).
parent 672754a4
......@@ -4,9 +4,30 @@ from IOCTL import *
import sys
import struct
import select
import posix
DEVICE='/dev/ttyd2'
class UnixFile:
def open(self, name, mode):
self.fd = posix.open(name, mode)
return self
def read(self, len):
return posix.read(self.fd, len)
def write(self, data):
dummy = posix.write(self.fd, data)
def flush(self):
pass
def fileno(self):
return self.fd
def close(self):
dummy = posix.close(self.fd)
def packttyargs(*args):
if type(args) <> type(()):
raise 'Incorrect argtype for packttyargs'
......@@ -39,8 +60,8 @@ def unpackttyargs(str):
return (iflag, oflag, cflag, lflag, line, chars)
def initline(name):
fp = open(name, 'r')
ofp = open(name, 'w')
fp = UnixFile().open(name, 2)
ofp = fp
fd = fp.fileno()
rv = fcntl.ioctl(fd, IOCTL.TCGETA, nullttyargs())
iflag, oflag, cflag, lflag, line, chars = unpackttyargs(rv)
......@@ -92,13 +113,31 @@ EJECT='\x2a'
FF ='\xab'
REW ='\xac'
STILL='\x4f'
STEP_FWD ='\xad'
STEP_FWD ='\x2b' # Was: '\xad'
FM_SELECT=EXP_8 + '\xc8'
FM_STILL=EXP_8 + '\xcd'
DM_OFF=EXP_8 + '\xc9'
DM_SET=EXP_8 + '\xc4'
FWD_SHUTTLE='\xb5'
REV_SHUTTLE='\xb6'
EM_SELECT=EXP_8 + '\xc0'
N_FRAME_REC=EXP_8 + '\x92'
IN_ENTRY=EXP_7 + '\x90'
IN_ENTRY_RESET=EXP_7 + '\x91'
IN_ENTRY_SET=EXP_7 + '\x98'
IN_ENTRY_INC=EXP_7 + '\x94'
IN_ENTRY_DEC=EXP_7 + '\x95'
IN_ENTRY_SENSE=EXP_7 + '\x9a'
OUT_ENTRY=EXP_7 + '\x92'
OUT_ENTRY_RESET=EXP_7 + '\x93'
OUT_ENTRY_SET=EXP_7 + '\x99'
OUT_ENTRY_INC=EXP_7 + '\x96'
OUT_ENTRY_DEC=EXP_7 + '\x98'
OUT_ENTRY_SENSE=EXP_7 + '\x9b'
DEBUG=0
class VCR:
def init(self):
......@@ -106,7 +145,8 @@ class VCR:
return self
def _cmd(self, cmd):
## print '>>>',`cmd`
if DEBUG:
print '>>>',`cmd`
self.ofp.write(cmd)
self.ofp.flush()
......@@ -118,8 +158,10 @@ class VCR:
## if rep:
## print 'FLUSHED:', `rep`
return None
# XXXX Niet goed: er is meer gebufferd!
data = self.ifp.read(1)
## print '<<<',`data`
if DEBUG:
print '<<<',`data`
if data == NAK:
return NAK
rep = rep + data
......@@ -143,11 +185,12 @@ class VCR:
return number
def _iflush(self):
dummy = self._waitdata(10000, 1)
dummy = self._waitdata(10000, 0)
## if dummy:
## print 'IFLUSH:', dummy
def simplecmd(self,cmd):
self._iflush()
for ch in cmd:
self._cmd(ch)
rep = self._reply(1)
......@@ -157,6 +200,11 @@ class VCR:
raise error, 'Unexpected reply:' + `rep`
return 1
def replycmd(self, cmd):
if not self.simplecmd(cmd[:-1]):
return 0
self._cmd(cmd[-1])
def _number(self, number, digits):
if number < 0:
raise error, 'Unexpected negative number:'+ `number`
......@@ -258,6 +306,41 @@ class VCR:
return 0
return 1
def editmode(self, mode):
if mode == 'off':
a0 = a1 = a2 = 0
elif mode == 'format':
a0 = 4
a1 = 7
a2 = 4
elif mode == 'asmbl':
a0 = 1
a1 = 7
a2 = 4
elif mode == 'insert-video':
a0 = 2
a1 = 4
a2 = 0
else:
raise 'editmode should be off,format,asmbl or insert-video'
if not self.simplecmd(EM_SELECT):
return 0
self._number(a0, 1)
self._number(a1, 1)
self._number(a2, 1)
if not self.simplecmd(ENTER):
return 0
return 1
def nframerec(self, num):
if not self.simplecmd(N_FRAME_REC):
return 0
self._number(num, 4)
if not self.simplecmd(ENTER):
return 0
self.waitready()
return 1
def fmstill(self):
if not self.simplecmd(FM_STILL):
return 0
......@@ -295,3 +378,51 @@ class VCR:
return 0
self._number(num, 1)
return 1
def getentry(self, which):
if which == 'in':
cmd = IN_ENTRY_SENSE
elif which == 'out':
cmd = OUT_ENTRY_SENSE
self.replycmd(cmd)
h = self._getnumber(2)
print 'h=',h
m = self._getnumber(2)
print 'm=',m
s = self._getnumber(2)
print 's=',s
f = self._getnumber(2)
print 'f=',f
return (h, m, s, f)
def inentry(self, arg):
return self.ioentry(arg, (IN_ENTRY, IN_ENTRY_RESET, \
IN_ENTRY_SET, IN_ENTRY_INC, IN_ENTRY_DEC))
def outentry(self, arg):
return self.ioentry(arg, (OUT_ENTRY, OUT_ENTRY_RESET, \
OUT_ENTRY_SET, OUT_ENTRY_INC, OUT_ENTRY_DEC))
def ioentry(self, arg, (Load, Clear, Set, Inc, Dec)):
if type(arg) == type(()):
h, m, s, f = arg
if not self.simplecmd(Set):
return 0
self._number(h,2)
self._number(m,2)
self._number(s,2)
self._number(f,2)
if not self.simplecmd(ENTER):
return 0
return 1
elif arg == 'reset':
cmd = Clear
elif arg == 'load':
cmd = Load
elif arg == '+':
cmd = Inc
elif arg == '-':
cmd = Dec
else:
raise error, 'Arg should be +,-,reset,load or (h,m,s,f)'
return self.simplecmd(cmd)
......@@ -442,8 +442,7 @@ class Displayer(VideoParams):
self.color0 = None
self.fixcolor0 = 0
if self.format in ('rgb', 'jpeg', 'compress'):
gl.RGBmode()
gl.gconfig()
self.set_rgbmode()
gl.RGBcolor(200, 200, 200) # XXX rather light grey
gl.clear()
return
......@@ -456,8 +455,7 @@ class Displayer(VideoParams):
gl.clear()
gl.pixmode(GL.PM_SIZE, 8)
return
gl.cmode()
gl.gconfig()
self.set_cmode()
self.skipchrom = 0
if self.offset == 0:
self.mask = 0x7ff
......@@ -470,6 +468,18 @@ class Displayer(VideoParams):
if not self.quiet:
sys.stderr.write(' Done.\n')
# Set the window in RGB mode (may be overridden for Glx window)
def set_rgbmode(self):
gl.RGBmode()
gl.gconfig()
# Set the window in colormap mode (may be overridden for Glx window)
def set_cmode(self):
gl.cmode()
gl.gconfig()
# Clear the window to a default color
def clear(self):
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment