2012年3月13日 星期二

建立 VISCA 設備的測試環境

VISCA 是SONY定義, 透過 RS232 介面來控制 camera 的協定。近日需要使用 Windows端的工具來控制 Sony 鏡頭,因此便開始評估要自行開發 VISCA 程式,或是採用第三方的控制軟體。


一、使用第三方幫忙開發的控制軟件,網路上收集到以下三套軟體
  1. SONY EVI  攝像機串口 控制軟件(D100, D70, HD1) 2.2.2,可以透過 http://www.helmme.com/ 下載體驗版
  2. sony dxc-990p 攝像機串口控制軟件, 從此處下載 。
  3. Camera Control Software for FCB-EH6300 (updated November 18, 2011),從此處下載 
目前還不確定會使用的鏡頭型號,若上述軟體能夠正常執行所需功能,則可以省略自行開發的工作。




二、自行開發,使用 libvisca ,並且進行擴充
libvisca 則是一套可以直接用來開發 VISCA 命令的函數庫,其預設支援的camera為 FCB-IX47。以下將介紹如何使用這套library來完成一個PC端的測試程式。
  1. 首先要到sourceforge下載程式碼。
  2. http://sourceforge.net/projects/libvisca/,直接選擇 Download GNU tarball 即可。此程式碼可以在 Linux 或 Windows 下成功編譯。若是要開發設備端的VISCA程式,則使用此函示庫,並針對所需要增加的指令進行擴充即可。

  3. 接著可以透過作者的網站下載測試用的範例。 
  4. 連線 http://damien.douxchamps.net/libvisca/ 選擇 web control interface and daemon,

  5. 如果使用 Linux 環境,那事情應該很單純; 但是因為我使用的平台是 Windows7,且使用Visual Studio 2008開發,因此編譯過程中會產生一些問題,解決方法如下: 
    • 直接載入 VC2005\libvisca.sln,  直接執行編譯,此時會發生錯誤 "definition of dllimport function not allowed",這是因為 libvisca.c 中的定義 "define VISCA_API __declspec(dllimport)",試圖將 VISCA 包裝成 dll,但 Visual Studio 2008 中此種定義方式只能夠用來宣告函數,不能用來實作函數。此部分可參考MSDN說明 http://support.microsoft.com/kb/815647/zh-tw 直接將  "define VISCA_API __declspec(dllimport)" 改成  "define VISCA_API" 即可。 
    • 預設的編譯環境並非 Windows,因此需要在編譯參數手動加入 /D VISCA_WIN,接著應該就可以成功編譯出 libvisca library,此處函數庫名稱為 libviscad.lib。 
    • 接著可以編譯 visca_cli ,利用此程式測試基本的 visca 指令。同樣的此時也需要在編譯參數手動加入 /D VISCA_WIN,並且讓 visual studio 能夠找到步驟 4.b所編譯好的 libviscad.lib,有兩個方法 
    • 將 libviscad.lib 複製到 \libvisca\VC2005 目錄下
    • 在 project 屬性的 linker\input 選項中加入 "\libvisca\VC2005\Debug\libviscad.lib" 

  6. 編譯成功,接著應該就可以使用 visca_cli 透過 VISCA command 與 Sony Camera 溝通了。但我發現此時程式並無法正確的開啟com port,因為 CreateFile(devicename, x, x, x, x, x, x)函數在Visual Studio 2008之後,將第一個參數由 char 改為 wide char,因此此處的程式碼需要修改。
若是要設計自動測試程式,則自行撰寫是免不了的,因此libvisca 的基本運作邏輯還是要了解,針對 libvisca 程式碼分析如下:   
  1. VISCA_open_serial() 使用 CreateFile()取得對 RS232的控制權。
  2. 使用者可以呼叫 doCommand() 下命令,當收到使用者下達的命令時,libVISCA利用_VISCA_init_packet(),_VISCA_append_byte()組成對應的封包。
  3. 呼叫 _VISCA_send_packet_with_reply() 將封包送給 RS232,並且從RS232讀取資料。如果回應為 ACK,則呼叫 _VISCA_get_packet() 取得對應的資料放入Interface內。分別使用 SendFile()/ReadFile()來送出/讀取RS232的資料。

三、libvisca的擴充應用
在 libvisca 的官方網頁中說明,有一個網頁版本的測試程式可以使用,此程式由兩部分構成 libvisca-deamon + libvisca-web,由於  libvisca-deamon 使用 UNIX 的寫法,因此無法直接使用 Visual Studio 2008編譯成功。若要在Windows下運行,則需要更改程式碼,這部分目前還用不到,待有需要使用時再作介紹。

最後,此次測試環境建置的結果是直接使用 http://www.rmassa.com/manu/sony.htm 所附的應用程式。

補充: visca makefile in linux

OBJS = libvisca.o libvisca_win32.o visca_cli.o

all: visca_cli

%.o: %.c libvisca.h
        gcc -DWIN32 -DDLL_EXPORTS -c $< -o $@

visca_cli: $(OBJS)
        gcc $(OBJS) -o $@

clean:
        rm -f *.o visca_cli.exe



參考資料
  1. Libvisca 官方網站 http://damien.douxchamps.net/libvisca/
  2. Autoconf 的說明 http://www.study-area.org/tips/automake/node3.html
  3. Sony 鏡頭規格   http://www.image-sensing-solutions.eu/fcb_eh6300.html
  4. cygwin(http://cygwin.com/install.html) 
  5. mingw http://www.mingw.org/