Poodletooth-iLand/panda/python/Lib/smartroom/BeyondQuestion.py
2015-03-03 17:10:12 -05:00

139 lines
4 KiB
Python

#! python
#
# Driver for Beyond Question Remote
__all__ = ["bqReadKeys"]
import re,sys,os
if (os.name != "nt"):
raise "This Beyond Question driver only works under Win 2K/XP"
try:
import win32file
import win32event
import win32con
except:
raise "Cannot use Beyond Question driver until pywin32 has been installed"
import serial,_winreg
CODES = ["0","A","B","C","D","E","F","G","H","I","J",
"check-ans","help-me",
"arrow-up","arrow-left","arrow-right","arrow-down",
"17","jump-left","jump-right","20",
"log-on","22","23","24","25","26","27","28","29","30","31","32"]
SER = None
BUF = ""
OFFS = 0
PAT = re.compile("^R...:K.\r\n$", re.DOTALL)
LO = 0
HI = 0
MOD = 0
def listRegistryKeys(path):
result=[]
index=0
try:
key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, path, 0, _winreg.KEY_READ)
while (1):
result.append(_winreg.EnumKey(key, index))
index = index + 1
except: pass
if (key!=0): _winreg.CloseKey(key)
return result
def getRegistryKey(path, subkey):
k1=0
key=0
try:
key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, path, 0, _winreg.KEY_READ)
k1, k2 = _winreg.QueryValueEx(key, subkey)
except: pass
if (key!=0): _winreg.CloseKey(key)
return k1
def createPort():
global MOD, LO, HI, SER
# Locate the Beyond Question Application.
key = "SOFTWARE\\Classes\\BeyondQuestion.AnswerFile\\DefaultIcon"
iconfile = getRegistryKey(key, "")
if (iconfile == 0):
raise "The Beyond Question Executable is not installed properly."
dir = os.path.dirname(iconfile)
if (os.path.isdir(dir)==0):
raise "The Beyond Question Executable is not installed properly."
exe = os.path.join(dir, "Beyond Question.exe")
ini = os.path.join(dir, "RF.ini")
if (os.path.isfile(exe)==0):
raise "The Beyond Question Executable is not installed properly."
if (os.path.isfile(ini)==0):
raise "Cannot find the Beyond Question RF.INI file in the program directory."
# Read the Beyond Question INI file
try:
f = file(ini, "r")
line1 = f.readline().rstrip("\r\n")
line2 = f.readline().rstrip("\r\n")
line3 = f.readline().rstrip("\r\n")
MOD = int(line1)
LO = int(line2)
HI = int(line3)
f.close()
except:
raise "Could not parse the Beyond Question RF.INI file."
# Locate the appropriate USB COM device.
remote = None
key = "SYSTEM\\CurrentControlSet\\Services\usbser\Enum"
for i in range(16):
val = getRegistryKey(key, str(i))
if (val != 0):
if (val.startswith("USB\\Vid_0471&Pid_0888\\")):
remote = val
if (remote == None):
raise "The Beyond Question USB driver or device does not seem to be installed."
key = "SYSTEM\\CurrentControlSet\\Enum\\" + remote + "\\Device Parameters"
port = getRegistryKey(key, "PortName")
if (port == 0):
raise "The Beyond Question USB driver or device does not seem to be installed."
port = int(port[3:])-1
# Open the serial port for reading.
try:
SER = serial.Serial(port=port, baudrate=38400, timeout=10)
except:
raise "Cannot open COM port for beyond question"
def bqReadKeys():
global SER,BUF,OFFS,MOD,LO,HI
result = []
while 1:
if (OFFS + 9 <= len(BUF)):
pkt = BUF[OFFS:OFFS+9]
if (PAT.match(pkt)):
index = ord(pkt[1])+ord(pkt[2])*256+ord(pkt[3])*65536
index = index >> 3
button = ord(pkt[6])
if (index >= LO) and (index <= HI):
index = (index % MOD) + 1
result.append((index, button, CODES[button]))
OFFS += 9
else:
OFFS += 1
else:
n = SER.inWaiting()
if (n == 0):
return result
BUF = BUF[OFFS:] + SER.read(n)
OFFS = 0
createPort()