mirror of
https://github.com/Sneed-Group/Poodletooth-iLand
synced 2024-12-29 06:32:40 -06:00
140 lines
4 KiB
Python
140 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()
|