summaryrefslogtreecommitdiffstats
path: root/Demo/sgi/video/VCR.py
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1993-06-10 13:32:32 (GMT)
committerGuido van Rossum <guido@python.org>1993-06-10 13:32:32 (GMT)
commitfa04170682a1b361d874937a541e57dbc16115a5 (patch)
treedbf5014bf68912417d2d48dc45a4cd425f090434 /Demo/sgi/video/VCR.py
parent672754a4880eb204ad4351b3f3b473bacf78651e (diff)
downloadcpython-fa04170682a1b361d874937a541e57dbc16115a5.zip
cpython-fa04170682a1b361d874937a541e57dbc16115a5.tar.gz
cpython-fa04170682a1b361d874937a541e57dbc16115a5.tar.bz2
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).
Diffstat (limited to 'Demo/sgi/video/VCR.py')
-rwxr-xr-xDemo/sgi/video/VCR.py143
1 files changed, 137 insertions, 6 deletions
diff --git a/Demo/sgi/video/VCR.py b/Demo/sgi/video/VCR.py
index ea123cb..d99fce6 100755
--- a/Demo/sgi/video/VCR.py
+++ b/Demo/sgi/video/VCR.py
@@ -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)