2012-06-11 67 views
3

我一直在嘗試幾件事來模擬DoxBox模擬器的串行鼠標(爲了在Settlers 2中玩2人遊戲)。使用FIFO模擬串行鼠標

我還沒有找到任何工作解決方案,所以我試着做我自己的。看來,dosbox可以使用任何/ dev/ttyS *作爲串行輸入。所以我想直接寫一些位到FIFO來作爲串行鼠標的mascarade應該做的事情!不幸的是,它並沒有真正的工作,因爲我顯然錯過了一些步驟(特別是初始化,告訴驅動程序它是鼠標?),我覺得我不太瞭解串口的工作原理。

我沒有找到太多的鼠標協議,除了Microsoft serial mouse protocol。我試圖輸出合理的字節。但似乎並沒有真正發生,並且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

看着DosBox的源代碼,看起來你會遇到使用FIFO的麻煩,因爲dosbox如何處理串口。

src/hardware/serialport/libserial.cpp,線路295看到串行設備是如何在Unix系統開通:

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

以任何方式,使用O_RDWR與FIFO導致未指定的行爲(見open(3)約O_RDWR)。

而且,即使open()調用成功,你將被阻止時DOSBox中串行LIB試圖讓您的設備(在同一文件的行298)的終端屬性

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

tcgetattr()將失敗因爲它無法從FIFO中檢索termios數據。

我想FIFO不是模擬你的設備的方法,你應該嘗試推出你自己的內核模塊,修改dosbox或使用外部adaptater來連接串口上的物理第二個鼠標。

3

而不是使用FIFO,你可能想嘗試一個Pseudo TTY