2010年5月7日 星期五

X20 相信組裝式開發的原因(2)──第二份工作

新的公司標到某個縣市政府便民資訊系統建置的合約,其中包含一套公司內沒人會做的語音傳真系統,因此雇用我在五個月內無中生有地完成那一套語音傳真系統。在當年寫作風格還只是包裝常用API來呼叫的情況下,我當然可以只製作一個僅符合需求規格的系統;不過受到第一個工作使用系統的影響,我選擇了更高一層的挑戰──在DOS下實作相同規模的語音系統。

整個語音系統分為editor與runtime兩大部分,開發人員在editor選好指令製作出流程後,就能在runtime依狀況或使用者選擇進行對應的行為或播放語音內容。延伸來自之前工作的經驗,我應用在這次的系統設計裡:

●語音系統指令的定義
根據之前開發語音系統的經驗,除了補強原有指令的設定參數之外,同時增訂幾個存取資料(讀寫資料庫與文字檔)的指令,另外也加強變數處理功能,儘可能地將常用的行為涵括到指令集內。當然,還是保留呼叫外部客製化程式的[自定函數]功能以應付更複雜的變化。

這是完整的指令表:


●快速的畫面開發與變化
利用控制顯示文字與顏色的兩個bytes[80][25]陣列,將要顯示的內容定義在外部檔,於需要時快速計算貼入陣列裡顯示;建立多層視窗重疊顯示與逐層隱藏,也加快了編輯畫面的開發。像等待來話的設定畫面就先定義在外部檔,在顯示時將兩個中引號之間轉變為輸入欄位,並依設定字元作輸入的檢查。


V0000=╔══════════════════════╗;
V0001=║ □行號:[####] 指令函數:[############] □ ║;
V0002=╠══════════════════════╣;
V0003=║用戶撥入電話執行行號 [DDDD] ║;
V0004=║在等待來話時執行行號 [FFFF] ║;
V0005=║用戶撥入後偵測到對方掛電話執行行號 [DDDD] ║;
V0006=║要清除本線的系統變數範圍 [DD][DD] ║;
V0007=║ <確定><取消> ║;
V0008=╚══════════════════════╝;


●用迴圈控制16條線路的執行
在runtime的實作上就需要模擬多執行緒的技巧。當時並不像現在只要new Thread()就可以獨立撰寫一條線路,必須要依序對每一條線路切割工作狀態,每次迴圈經過時都執行一點點工作就要跳到下一條線路;複雜或時間較長的指令還得再細分為更小的多個步驟來執行,以免因為耽擱過久而造成語音停播的窘況。(聲音取樣為8K/Sec,語音卡緩衝區是4K,也就是半秒內必須保證迴圈繞完一圈──CPU是486DX)

為了保證執行狀態夠快且不會錯,當時做了很多切割方法的測試才終於找到了最佳的結論。自己認為這樣的經驗值磨鍊了許多開發的思維。

●試作報表產生器
利用寫資料庫指令,在流程經過的同時寫下該線路的相關資訊,累積下來就有語音系統的使用資訊。根據記錄的規則填寫對應的參數,就能夠獲得許多類型的常用報表。像是作為服務系統時的來電數統計、選擇項統計、線路用量統計……等,作為外撥系統時的撥號數統計、接通數統計、問題回答統計……等,都能用定義的方式客製化出要顯示的內容。

五個月後,終於如期完成了這個系統。

沒有留言:

張貼留言