Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (853.9 KB, 156 trang )
Tự Động Hóa Đài 116
GVHD:
Phan Đình Mãi – Nguyễn Thanh Liêm
VẬN HÀNH VÀ ĐÁNH GIÁ HỆ THỐNG
Giao Diện Chương Trình
Giao diện chương trình được dùng theo kiểu SDI (Single Document Interface), trong
chương trình này chỉ có 4 kênh hoạt động, nên chỉ dùng một Dialog để hiển thị trạng thái
cho cả 4 kênh. Ngồi ra còn có một số dialog khác để điều chỉnh âm thanh, cập nhật và thử
âm.
Dialog Dialogic System : mỗi hình máy điện thoại mơ tả cho một kênh, có hai trạng
thái gác máy và nhấc máy chỉ cho biết kênh đang chờ đợi cuộc gọi hay đang trao đổi với
bên ngồi. Bên cạnh các máy là các thơng tin mơ tả cho trạng thái, nội dung giao tiếp của
các kênh với người gọi.
∗ Dialog Adjust Volume : có một slider điều chỉnh âm lương phát ra trên từng kênh
tương ứng trong combobox. Có thể điều chỉnh âm lượng ngay cả lúc đang phát âm.
SVTH: Nguyễn Hữu Phú – Trần Lê Trung
Trang 96
Tự Động Hóa Đài 116
GVHD:
Phan Đình Mãi – Nguyễn Thanh Liêm
Dialog ListWord:
Từ cần thêm
Danh sách từ có
sẵn
Chức năng :
− Cho phép cập nhật từ.
− Cho phép thử âm trên SoundBlaster hay trên Telephone.
Cách sử dụng :
Cập nhật từ.
Muốn cập nhật dữ liệu âm, người sử dụng nhập từ cần cập nhật vào EditBox “Add
Word”
− Rồi chọn “Update”. Nếu từ chưa có trong tự điển từ, trình sẽ mở ra hộp thoại u
cầu người dùng cho đường dẫn của file âm thanh.
− Sau khi chọn xong file( lưu ý tên file phải trùng với tên từ cần cập nhật), người sử
dụng chon Open để hòan tất việc cập nhật.
SVTH: Nguyễn Hữu Phú – Trần Lê Trung
Trang 97
Tự Động Hóa Đài 116
GVHD:
Phan Đình Mãi – Nguyễn Thanh Liêm
Thử âm trên SoundBlaster.
Muốn thử âm từ nào, chọn từ đó trong danh sách từ có sẵn, sau đó chọn “Play on
SoundBlaster”.
Vận Hành Chương Trình.
Mục tiêu của ứng dụng này là thực hiện cho tốt q trình giao tiếp với nhiều người
sử dụng ở xa mà họ chỉ sử dụng một máy điện thoại nối kết lên mạng điện thoại. Do vậy,
người sử dụng chính của ứng dụng này là khơng nhìn thấy giao diện chương trình, mà chỉ có
người quản lý dịch vụ này biết được. Do vậy giao diện chương trình được thiết kế khơng vì
mục đích đẹp, hấp dẫn, mà phải làm sao cho người quản lý có thể kiểm tra, bảo trì dễ dàng,
nắm bắt được tồn bộ trạng thái của kênh tại bất kỳ thời điểm nào.
Sử dụng chương trình này rất đơn giản, vào menu Test/Start, sẽ hiển thị một dialog
chính và ta có thể đọc tất cả các thơng tin có liên quan về trạng thái các kênh, qúa trình hoạt
động của từng kênh. Dialog này dùng theo kiểu modeless nên trong khi hiển thị những
thơng tin này, ta vẫn có thể thực hiện những thao tác khác như điều chỉnh các file âm thanh,
chỉnh âm lượng cho từng kênh (menu Option/Adjust Volume).
Đánh Giá Hệ Thống.
Trước khi thử nghiệm tồn bộ hệ thống, chúng tơi thử nghiệm và đánh giá cho từng
module. Sau khi thực hiện thành cơng cho các module, chúng tơi kết hợp lại, thử nghiệm,
điều chỉnh và hồn tất chương trình.
Về q trình giao tiếp :
Đối với module giao tiếp, nếu tất cả các thơng tin cần tìm đều đã được lưu trữ ở
dạng các file âm thanh trên đĩa cứng cục bộ, thời lượng mà thread bị block hầu như khơng
có do tất cả các hàm sử dụng đều là bất đồng bộ. Thread đáp ứng kịp thời tất cả các tất cả
các sự kiện xảy ra trên các kênh đồng thời, và về mặt lý thuyết do sử dụng chỉ một thread để
quản lý nên thời gian đáp ứng của thread đối với các sự kiện là nhanh hơn so với mơ hình
đồng bộ. Chúng tơi cũng có thử nghiệm một bản đơn giản theo mơ hình đồng bộ, nhưng do
chỉ có được 4 kênh, nên việc so sánh tốc độ đáp ứng của các chương trình khi hoạt dộng là
khơng xác nhận được độ chênh lệch.
SVTH: Nguyễn Hữu Phú – Trần Lê Trung
Trang 98
Tự Động Hóa Đài 116
GVHD:
Phan Đình Mãi – Nguyễn Thanh Liêm
Trong một thời điểm khác, nếu ta dùng một hàm lặp chạy trong một thời gian t để
giả lập cho thời lượng tiêu tốn cho q trình tìm kiếm dữ liệu âm cho một kênh, nếu ta tăng
thời gian này lên đáng kể thì khi sử dụng cho nhiều kênh ta sẽ cảm nhận được sự chậm trễ
trong việc đáp ứng đồng thời. Tuy nhiên nếu ta chạy hàm lặp này trong một thread khác thì
cũng với thời gian t trên sự chậm trễ giảm bớt đáng kể.
Với hai bản thử nghiệm ở trên, ta thấy giao diện lập trình ứng dụng (API) mà
Dialogic đưa ra là rất tốt. Ta có thể xây dựng q trình giao tiếp cho nhiều kênh đồng thời.
Tuy nhiên, trong một ứng dụng cụ thể, thời gian tiêu tốn cho việc thực hiện các thao tác
khác là phải có và chấp nhận. Và chính thời gian mới ảnh hưởng nhiều đến q trình giao
tiếp.
Về chất lượng âm thanh:
Những câu chào, nhắc nhở, hay cám ơn … được thu tồn câu : chất lượng âm thanh
gần như hòan hảo.
Phần âm thanh do tổng hợp âm tạo ra đạt được độ trung thực cao : giữa các từ đều có
khỏang lặng đủ cho người nghe phân biệt được các từ, file âm thanh chơitrên card
Dialogic/4 đạt hiệu quả cao.
Tuy nhiên, do hạn chế của phần cứng ( card Dilogic/4 khơng cung cấp khả năng thay
đổi tần số phát âm nên dù đã có gắng, chúng em chưa tạo được giọng thật chuẩn : lên,
xuống giọng ở những vị trí cần thiết trong câu.
Độ hiệu quả của truy xuất dữ liệu:
Truy xuất dữ liệu bằng ODBC trên CSDL biết trước cấu trúc làm tăng độ tin cậy của
truy xuất dữ liệu.
Truy xuất CSDL mang tính chỉ đọc, cho phép tiến hành nhiều tác vụ truy xuất trên
CSDL tại cùng một thời điểm.
Có một hạn chế nhỏ là do CSDL dùng trong ứng dụng là CSDLtạo từ Foxpro nên
khơng cho phép cập nhật dữ liệu khi ứng dụng đang hoạt động. Để giải quyết trường hợp
này, ta phải dùng CSDL tạo bởi Oracle và đây là hướng mở rơng cuả đề tài.
Kết Luận:
Sự kết hợp của ba module đã tạo nên chương trìng ứng dụng về cơ bản đáp ứng
đưỡc u cầu bán tự động Đài 116 Bưu điện Thành phố Hồ Chí Minh.
Với ứng dụng này, khách hàng có thể tìm thấy nhanh chóng và chính xác tên, địa
chỉ, số điện thoại của các th bao. Ưng dụng có thể góp phần giải quyết tình trạng q tải
các cuộc gọi truy xuất thơng tin qua dịch vụ 116.
Tuy nhiên đây là chỉ là một chương trình thử nghiệm với thiết bị còn hạn chế về chất
lượng cũng như các tính năng nên chưa thể hiện thực được tồn bộ ý đồ thiết kế ban đầu, cụ
thể là việc chuyển cuộc gọi sang Điện thoại viên.
SVTH: Nguyễn Hữu Phú – Trần Lê Trung
Trang 99
Tự Động Hóa Đài 116
GVHD:
Phan Đình Mãi – Nguyễn Thanh Liêm
Trong tương lai, ta có thể dễ dàng mở rộng ứng dụng cho các loại card Dialogic với
số kênh nhiều hơn và cho các loại dịch vụ tương tự.
SVTH: Nguyễn Hữu Phú – Trần Lê Trung
Trang 100
CHƯƠNG TRÌNH
NGUỒN
Tự Động Hóa Đài 116
GVHD:
Phan Đình Mãi – Nguyễn Thanh
Liêm
Chương trình được viết theo các Class, mỗi Class có thừa kế MFC hoặc khơng. Một
Class được hiện thực bằng một file TênClass.h ( header) và một file TênClass.cpp.
Có một số Class đã được viết như sau:
− CDlgcSys : gồm các member function thực hiện q trình giao tiếp, xử lý tất cả các
sự kiện.
− CDlgcSysDisplay : hiện thực một Window nhận các message để xử lý tất cả các sự
kiện.
− CSetVolume : điều chỉnh âm lượng cho các kênh.
− CDataAccess : thực hiện q trình truy xuất dữ liệu và chuyển đổi dữ liệu về dạng
âm thanh.
// DlgcSys.h: interface for the DlgcSys
class.////////////////////////////////////////////////////////////////////////#if !
defined(AFX_DLGCSYS_H__C8FF1557_912B_11D3_BB35_C2D227CB6408__INCLU
DED_)#define
AFX_DLGCSYS_H__C8FF1557_912B_11D3_BB35_C2D227CB6408__INCLUDED_
#if _MSC_VER > 1000
SVTH: Nguyễn Hữu Phú – Trần Lê Trung
Trang 102
Tự Động Hóa Đài 116
GVHD:
Phan Đình Mãi – Nguyễn Thanh
Liêm
#pragma once
#endif // _MSC_VER > 1000
// number of Dialogic channels
#define MAXCHANS 4 // Maximum Channels
#define MAXMSG
30 // Maximum messages
#define MAXRING 1 // Maximum rings before answering
#define MAXDTMF 9 // Maximum digits getting
// Define Machine's Status
#define ST_WTRING 1 // Waiting incoming call
#define ST_OFFHOOK 2 // Being in OFFHOOK status
#define ST_INTRO
3 // Playing Introduction files
#define ST_ONHOOK 4 // Being on ONHOOK status
#define ST_PLAY
5 // Playing found Messages
#define ST_MAXDTMF 6 // Getting digits from incoming call
#define ST_INVALID 7 // Playing INVALID message
#define ST_GOODBYE 8 // Playing GOODBYE message
#define ST_ERROR
9 // Receiving TDX_ERROR event
#define ST_PRESSAGAIN 10// Playing PRESSAGAIN message
#define ST_BUSMODE 11// Playing BUSMODE message
// Window header
#include
#include
#include
#include
#include
#include
// Dialogic header
#include
#include
#include
#include "\LVTN\DataAccess.h"
// Added by ClassView
typedef struct _DX_INFO{
long
chdev;
// Channel device
int
prestate;
// Previous state of channel
int
state;
// State of channel
int
msg_fd;
// File description of file
DV_DIGIT
digbuf;
// Buffer for DTMF digit
DX_IOTT
iott[2];
// I/O transfer table
char
msg_name[MAXMSG + 1]; // message file name
} DX_INFO;
class CDlgcSys
{
public:
CStringArray m_strarrAddress[MAXCHANS + 1];
DX_IOTT* m_dxiottPlayAddress[MAXCHANS + 1];
SVTH: Nguyễn Hữu Phú – Trần Lê Trung
Trang 103
Tự Động Hóa Đài 116
GVHD:
Phan Đình Mãi – Nguyễn Thanh
Liêm
int DlgcPlayAddress(int nChanNum);
int m_nBusModeFileDesc;
int m_nPressAgainFileDesc;
int DlgcErrorEvtHandler(int nChanDev);
CDataAccess m_genDataAccess;
void DlgcNotifyEventProcess();
void DlgcNotifyEvent(int OnOff);
int DlgcDialEvtHandler();
int DlgcDefaultHandler();
int DlgcErrorEvtHandler();
int m_nInvalidFileDesc;
int m_nGoodbyeFileDesc;
int DlgcGetDigitHandler();
int DlgcPlayEvtHandler();
int m_nIntroFileDesc;
int DlgcSetHookEvtHandler();
int DlgcCstEvtHandler();
int DlgcGetChanNum(int chdev);
DV_DIGIT* m_pDigitBuf;
int DlgcGetDigits(int nChanNum,DV_DIGIT *pdv_digitBuf);
int DlgcPlay(int nChanNum,int nFileDesc);
int DlgcSetHook(int nChanNum,int nState);
void DlgcQuit();
DX_INFO m_dxinfo[MAXCHANS + 1];
char m_pTmpBuf[256];
int DlgcInit();
CDlgcSys();
virtual ~CDlgcSys();
int m_nMaxChans ;
};
#endif // !
defined(AFX_DLGCSYS_H__C8FF1557_912B_11D3_BB35_C2D227CB6408__INCLU
DED_)
/////////////////////////
/////////////////////////
////////////////////////
// DlgcSys.cpp: implementation of the DlgcSys class.//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Lvtn.h"
#include "DlgcSys.h"
#include "DataAccess.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
SVTH: Nguyễn Hữu Phú – Trần Lê Trung
Trang 104
Tự Động Hóa Đài 116
GVHD:
Phan Đình Mãi – Nguyễn Thanh
Liêm
// Window handler receiving Messages
extern HWND hWnd;
extern CString Ketqua;
extern CStringArray chuoi;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CDlgcSys::CDlgcSys()
{
}
/////////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////////
CDlgcSys::~CDlgcSys()
{
}
/////////////////////////////////////////////////////////////////////////
// Initialize Dialogic System
// Determinate number of channel
// Open channel devices
// Route Analog and Voice channel
// Ready to receiv incoming call
// Set channel to DX_ONHOOk
// RETURN 0: Unsuccessfully
//
1: Successfully
/////////////////////////////////////////////////////////////////////////
int CDlgcSys::DlgcInit()
{
int
nChanNum;
// Channel Number
char
pChanName[30];
// Channel Name
CT_DEVINFO
ct_devinfo;
// Device Infomation(Dialogic Structure)
// m_nMaxChans is number of channels which will open
// This can be choosen by End-users
m_nMaxChans = 4;
if (m_nMaxChans > MAXCHANS)
// MAXCHANS :number of channels
which this program can process
{
// Only MAXCHANS will be used
m_nMaxChans = MAXCHANS;
}
// Initialize INTRO,INVALID,GOODBYE Here
if ((m_nIntroFileDesc = dx_fileopen("Intro.wav",O_RDONLY|O_BINARY)) == -1)
{
AfxMessageBox("Can not open Intro.wav file");
return 0;
SVTH: Nguyễn Hữu Phú – Trần Lê Trung
Trang 105
Tự Động Hóa Đài 116
GVHD:
Phan Đình Mãi – Nguyễn Thanh
Liêm
}
if ((m_nGoodbyeFileDesc = dx_fileopen("Goodbye.wav",O_RDONLY|O_BINARY)) ==
-1)
{
AfxMessageBox("Can not open Goodbye.wav file");
return 0;
}
if ((m_nInvalidFileDesc = dx_fileopen("Invalid.wav",O_RDONLY|O_BINARY)) == -1)
{
AfxMessageBox("Can not open Invalid.wav file");
return 0;
}
if ((m_nPressAgainFileDesc = dx_fileopen("PressAgain.wav",O_RDONLY|
O_BINARY)) == -1)
{
AfxMessageBox("Can not open PressAgain.wav file");
return 0;
}
if ((m_nBusModeFileDesc = dx_fileopen("BusMode.wav",O_RDONLY|O_BINARY))
== -1)
{
AfxMessageBox("Can not open BusMode.wav file");
return 0;
}
// Initial processing for MAXCHANS
// Reset m_dxinfo memory
memset(m_dxinfo,0,(sizeof(DX_INFO) * (m_nMaxChans/*MAXCHANS*/ + 1)));
for (nChanNum = 1;nChanNum <= m_nMaxChans;nChanNum++)
{
// build name of voice channel
sprintf(pChanName,"dxxxB%dC%d",((nChanNum-1)/4) + 1,((nChanNum1)%4) + 1);
// open Dialog/4 voice channels
if ((m_dxinfo[nChanNum].chdev = dx_open(pChanName,0)) == -1)
{
sprintf(m_pTmpBuf,"Failed dx_open(%s), errno = (%d)",
pChanName, dx_fileerrno());
MessageBox(hWnd,m_pTmpBuf,"Error",MB_OK);
//AfxMessageBox(m_pTmpBuf);
if (nChanNum > 1)
{
m_nMaxChans = nChanNum -1;
continue;
}
else
{
return 0;
}
}
SVTH: Nguyễn Hữu Phú – Trần Lê Trung
Trang 106