Serial port 用FIFO模拟串行鼠标
我一直在尝试几种方法来模拟DoxBox模拟器的串行鼠标(以便在第2版中玩两人游戏) 我还没有找到任何有效的解决方案,所以我试着做了自己的。dosbox似乎可以使用任何/dev/ttyS*作为串行输入。所以我认为直接向FIFO中写入一些数据作为一个串行鼠标应该可以做到这一点!不幸的是,它没有真正起作用,因为我显然错过了一些步骤(特别是初始化,告诉驱动程序这是一个鼠标?),我觉得我不太了解串行端口的工作原理 除了鼠标协议,我没有找到太多关于鼠标协议的内容。我试着输出合理的字节。但似乎什么也没发生,dosbox说它无法打开串行端口 以下是我实施的内容:Serial port 用FIFO模拟串行鼠标,serial-port,mouse,emulation,Serial Port,Mouse,Emulation,我一直在尝试几种方法来模拟DoxBox模拟器的串行鼠标(以便在第2版中玩两人游戏) 我还没有找到任何有效的解决方案,所以我试着做了自己的。dosbox似乎可以使用任何/dev/ttyS*作为串行输入。所以我认为直接向FIFO中写入一些数据作为一个串行鼠标应该可以做到这一点!不幸的是,它没有真正起作用,因为我显然错过了一些步骤(特别是初始化,告诉驱动程序这是一个鼠标?),我觉得我不太了解串行端口的工作原理 除了鼠标协议,我没有找到太多关于鼠标协议的内容。我试着输出合理的字节。但似乎什么也没发生,d
def bits(byte):
b = []
for i in xrange(8):
b.append((byte >> i) & 1)
return b
def pack(*args):
# packs the bits into a string
s = ""
for i in args:
v = 0
for bit in i:
v = v<<1
v+=bit
s+=chr(v)
return s
def makebytes(ld,rd,dx,dy):
# left down, right down, delta x, delta y
# create 3 byte message for mouse
dx = bits(dx)
dy = bits(dy)
A = [0,1,
1 if ld else 0,
1 if rd else 0,
dx[7],dx[6],
dy[7],dy[6]]
B = [0,0]+dx[::-1][2:]
C = [0,0]+dy[::-1][2:]
return pack(A,B,C)
# this is the FIFO I created with go+rw
f = file("/dev/ttyS42",'w')
print "Got"
import time
while 1:
# send some mouse movement
f.write(makebytes(0,0,10,10))
print "sent 1"
time.sleep(0.5)
f.write(makebytes(0,0,-10,-10))
print "sent 2"
def位(字节):
b=[]
对于x范围内的i(8):
b、 追加((字节>>i)&1)
返回b
def包(*args):
#将位打包成字符串
s=“”
对于args中的i:
v=0
对于i中的位:
v=v查看DosBox源,由于DosBox处理串行端口的方式,使用FIFO似乎会有问题
在src/hardware/serialport/libserial.cpp
的第295行中,您可以看到串行设备是如何在unices中打开的:
无论如何,将O_RDWR与FIFO一起使用会导致未指定的行为(请参阅关于O_RDWR)
此外,即使open()
调用成功,当DosBox串行库试图获取设备的终端属性时,您也会被阻止(同一文件的第298行)
将失败,因为它无法从FIFO检索termios
数据
我想FIFO不是模拟设备的方法,您应该尝试滚动您自己的内核模块,修改dosbox或使用外部适配器在串行端口上连接第二个物理鼠标。而不是使用FIFO,您可能想尝试
cp->porthandle = open (extended_portname, O_RDWR | O_NOCTTY | O_NONBLOCK);
result = tcgetattr(cp->porthandle,&cp->backup);