3

我一直在尝试几件事来模拟 DoxBox 模拟器的串行鼠标(为了在 Settlers 2 中玩 2 人游戏)。

我还没有找到任何可行的解决方案,所以我尝试自己制作。似乎 dosbox 可以使用任何 /dev/ttyS* 作为串行输入。所以我认为直接将一些位写入 FIFO 以伪装成串行鼠标应该可以做到这一点!不幸的是,它并没有真正起作用,因为我显然错过了一些步骤(特别是初始化,告诉驱动程序它是鼠标?),而且我觉得我并不真正了解串行端口的工作原理。

除了Microsoft 串行鼠标协议外,我在鼠标协议上没有找到太多东西。我尝试输出合理的字节。但似乎什么都没有发生,dosbox 说它无法打开串口。

这是我实现的:

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"

所以,我现在不知道在哪里看,任何帮助将不胜感激。

4

2 回答 2

4

查看 DosBox 源代码,您似乎很难使用 FIFO,因为 dosbox 如何处理串行端口。

src/hardware/serialport/libserial.cpp第 295 行,您可以看到串行设备是如何在 unices 中打开的:

cp->porthandle = open (extended_portname, O_RDWR | O_NOCTTY | O_NONBLOCK);

无论如何,将 O_RDWR 与 FIFO 一起使用会导致未指定的行为(请参阅关于 O_RDWR的open(3) )。

此外,即使open()调用成功,当 DosBox 串行库尝试获取您设备的终端属性时,您也会被阻止(同一文件的第 298 行)

result = tcgetattr(cp->porthandle,&cp->backup);

tcgetattr()将失败,因为它无法termios从 FIFO 中检索数据。

我想 FIFO 不是模拟设备的方法,您应该尝试滚动自己的内核模块,修改 dosbox 或使用外部适配器在串行端口上连接物理第二个鼠标。

于 2012-06-20T15:10:52.740 回答
3

您可能想尝试使用Pseudo TTY ,而不是使用 FIFO

于 2012-06-20T21:50:45.570 回答