Ớ
Ớ Ớ
Để cĩ thể trao đổi thơng tin qua lại giữa người sử dụng (hoặc lập trình viên) với thiết bị
Driver, Grass thiết lập một cơ chế Send Event được mơ tả tổng quát như sau:
Khi người sử dụng các hàm của thư viện Display (cĩ tiền tố là D_ ), hoặc các hàm thư
viện của Raster (cĩ tiền tố là R_ ), để thực hiện một cơng việc gì đĩ, giả sử là vẽ ra màn hình một hình chữ nhật chẳng hạn, (hàm R_Box_Abs()Ầ chẳng hạn), thì hàm này sẽ
khơng trực tiếp thực hiện vẽ mà nĩ sẽ gửi một EVENT là cĩ tên là Ộhình chữ nhậtỢ chẳng hạn,Ầ đến cửa sổ MONITOR hiển thị hiện tại, Driver của Monitor này sẽ bắt lấy EVENT Ộhình chữ nhậtỢ này, và thực hiện yêu cầu của EVENT là Ộvẽ hình chữ nhậtỢ ra màn hình MONITOR.
Nếu EVENT gửi đi cĩ yêu cầu nhận kết quả trả về thì Driver sẽ tắnh tốn kết quả cần thiết để trả về cho người dùng.
Các EVENT được xử lý theo nguyên tắc FIFO (First In First Out), EVENT tới trước
được xử lý trướcẦ.
KHOA CNTT Ờ
ĐH KHTN
Mơ hình phác họa:
Programmer/User Ăẳ Display Ăẳ Raster Ăẳ Drivers
Cách thức Send một EVENT & nhận kết quả trả về:
- Mỗi monitor xi bất kỳ đều cĩ 2 file fifo.ia, fifo.ib dùng để nhận và xử lý EVENT (xác
định trong file monitorcap ).
- Send một EVENT tới monitor xi đơn giản chỉ là mở file fifo.ia của monitor xiđĩ ra để ghi EVENT vào
- Chú ý:
Các EVENT đã được quy định sẵn, EVENT được ghi vào file theo 1 định dạng cấu trúc đã
được quy định. Cấu trúc khi ghi 1 EVENT vào file như sau:
COMMAND_ESC EVENT_NAME PARAMETER1, PARAMETER2,Ầ
Trong đĩ,
COMMAND_ESC : là EVENT đặc biệt, đã được quy định sẵn (mã là 127), dùng để thể hiện sự bắt đầu của một EVENT mới
EVENT_NAME : tên của EVENT cần gửi đi
PARAMETER1,PARAMETER2, Ầ.. : Các thơng tin tham số gửi kèm theo event đĩ, tùy theo loại event được gửi đi mà các tham
số này cĩ thể cĩ hoặc khơng. Vắ dụ:
Khi cần yêu cầu vẽ một hình chữ nhật với các tọa độ là (5, 10), (50, 25) ra màn hình, Grass sẽ ghi vào file fifo.ia nội dung như sau:
COMMAND_ESC BOX_ABS 5 10 50 25
KHOA CNTT Ờ
ĐH KHTN
Ghi chú:
Hàm dùng để ghi EVENT vào file fifo.ia là: _send_ident(ỘeventỢ); Hàm này bao gồm cả ghi vào COMMAND_ESC + EVENT
Các hàm dùng để ghi thơng tin tham số vào thường dùng là:
_send_int(int*);
_send_char(char*);
_send_float(float*);
_send_text(char *text);
_send_int_array(int, int*); _send_char_array(int, char*);
Trước khi ghi event vào file bằng hàm _send_ident(..) trên, chúng ta phải mở kết nối đến Driver của Monitor hiện hành bằng hàm: R_Open_Driver()
Lấy vắ dụ trên, yêu cầu vẽ một hình chữ nhật:
if (R_Open_Driver()) // mở kết nối đến file fifo
{
intt;
_send_ident(BOX_ABS); // Send sự kiện BOX_ABS
t = 5;
_send_int(&t); // các thơng tin tham số kèm theo, Ầleft
t = 10;
_send_int(&t); // Ầtop
t = 50;
_send_int(&t); // Ầright
t = 25;
_send_int(&t); // Ầbottom
}
Sau khi gửi EVENT đi, nếu là EVENT cĩ yêu cầu nhận kết quả trả về thì kết quả trả về sẽ được ghi vào file fifo.ib, chỉ cần đọc lên kết quả yêu cầu tương ứng.
KHOA CNTT Ờ
ĐH KHTN
Các hàm dùng để nhận kết quả trả về thơng dụng là: (đọc từ file fifo.ib)
_get_int(int*);
_get_float(float*);
_get_text(char*); char*_get_text2(void);
_get(char*, int);
Lấy vắ dụ gửi một EVENT cĩ yêu cầu kết quả trả về, chẳng hạn là event SCREEN_TOP, event này khi được gửi đi sẽ yêu cầu trả về tọa độ bên trên của màn hình hiện hành :
if (R_Open_Driver()) // mở kết nối đến file fifo {
int Result; // biến lưu kết quả trả về
_send_ident(SCREEN_TOP);// Send sự kiện SCREEN_TOP
_get_int(&Result); // nhận kết quả trả về sau khi send y/c }
Result sẽ chứa kết quả trả về sau khi gửi yêu cầu SCREEN_TOP.
ẳ Các hàm trên đều cài đặt ở trong file src\ libes\ raster\ io.c
Cách thức nhận & xử lý một EVENT:
EVENT chỉđược xử lý khi cĩ cĩ ắt nhất một MONITOR xi đang chạy (d.mon start=xi )
Ớ
Ớ Khi một MONITOR xi được khởi tạo bằng lệnh d.mon start=xi (i = 0, 1, 2Ầ6), nĩ cũng sẽ khởi động một process chạy song song liên tục, process này sẽ mở file fifo.iađể đọc và kiểm tra liên tục các EVENT đang được ghi trong file này. Nĩ sẽ bắt lấy các EVENT
đĩ, và dựa vào EVENT đĩ là gì mà sẽđọc tiếp cấu trúc các tham số truyền theo event và
đưa ra các xử lý thắch hợp. (như vẽ ra màn hình, v.vẦ).
Chú ý là EVENT + tham số truyền ghi vào làm sao thì khi đọc lên phải đọc theo đúng cấu trúc như vậy. Vắ dụ: khi nhận được event BOX_ABS thì phải đọc tiếp theo đúng 4
Ớ
KHOA CNTT Ờ
ĐH KHTN
số liên tiếp nữa để lấy tiếp toạ độ cần vẽ của BOX_ABS. Khơng được đọc ắt hay nhiều hơnẦSẽ gây sai hồn tồn hệ thống.
Nếu EVENT nhận được là event cĩ yêu cầu trả về kết quả, thì kết quả sẽđược tắnh tốn và trả về bằng cách ghi vào file fifo.ib tương ứng.
Ớ
Ghi chú:
- Hàm đọc event từ file fifo.ia lên là : get_command(char*);
- Các hàm thường dùng đểđọc thơng tin các tham số kèm theo event là:
(đọc từ file fifo.ia - cĩ sự tương ứng với các hàm ghi thơng tin tham số ở trên)
read1(char*)
get1(char*)
REC(a, b)
RECTEXT(x, s)
- Các hàm thường dùng để gửi trả lại kết quả cho User (đối với các event cĩ yêu cầu kết quả) là: ( ghi vào file fifo.ib )
SEND(a, b) SENDTEXT(x) RESULT(int) Vắ dụ: Ầ char *event;
get_command(&event); // đọc event trong file fifo.1a
switch (event)
{
caseBOX_ABS: // nếu là yêu cầu vẽ hình chữ nhật REC(&l, sizeof l); // thì đọc tiếp 4 tọa độ vẽ kèm theo REC(&t, sizeof t); // Ầ top
REC(&r, sizeof r); // Ầ right
KHOA CNTT Ờ
ĐH KHTN
REC(&b, sizeof b); // Ầ bottom
Box_abs(l, t, r, b); // thực hiện vẽ hcn ra màn hình
break;
caseSCREEN_TOP: // nếu yêu cầu tắnh tọa độ scr_top Screen_top(&index); // thì tắnh tọa độ scr_top gán cho
// biến index
SEND(&index, sizeof index); // trả kết quả index về cho User
break;
}
ẳ Các hàm trên đều được cài đặt trong file src\ display\ devices\ lib\ command.c
Cấu trúc của file fifo.ia
Là một dãy các cấu trúc sự kiện, mỗi cấu trúc sự kiện cĩ định dạng nhưđã nĩi là:
COMMAND_ESC EVENT_NAME [ PARAMETER1, PARAMETER2,Ầ ]
trong đĩ, parameter là optional, tùy sự kiện được send mà cĩ thể cĩ hoặc khơng.
Cấu trúc của file fifo.ib
Là một dãy các kết quả được trả về tương ứng với sự kiện trong file fifo.ia, kết quả trả về
tuân theo nguyên tắc fifo, và kết quả trả về cĩ thể là một, hoặc nhiều kết quả.
RESULT1 RESULT2 RESULT3 ẦẦ
KHOA CNTT Ờ
ĐH KHTN
Mơ Hình Minh Họa Tổng Thể Cho Cơ Chế Send Event
Window MONITOR [Send Result ] Event Receive Fifo.1a Fifo.1b [ Receive Result ] Event Request DISPLAY REQUEST (Display/Raster)
Hình 3 - 4 Mơ hình minh họa cơ chế Send Event trong GRASS5
KHOA CNTT Ờ
ĐH KHTN
Danh sách các EVENT:
Tên EVENT Mục Đắch
BEGIN Dùng để phát tắn hiệu bắt đầu sẵn sàng nhận event (khi mở Driver fifo.ia)
RESPOND
GET_NUM_COLORS Event này dùng để lấy về số màu
đang dùng để hiển thị window
STANDARD_COLORS Event này dùng để truyền thiết lập màu chuẩn cho window MONITOR.
COLOR Event này dùng để sử dụng màu color mới cho MONITOR
RGB_COLOR Event này giống như COLOR, nhưng tham số màu được truyền với 3 thành phần là : Red, Green, Blue !
COLOR_TALBE_FIXED Tắnh tốn bảng màu của XWindow và trả về trong biến NCOLORS
COLOR_TABLE_FLOAT Giống với
COLOR_TABLE_FLOAT, nhưng kết quả trả về là số thực.
COLOR_OFFSET Thiết lập giá trị color_offset mới
COLOR_PRINT Thiết lập giá trị color_print mới
CONT_ABS Event này yêu cầu vẽđường thẳng tới 2 điểm x, y cho trước
CONT_REL Giống với CONT_ABS, nhưng vẽ từ điểm hiện tại
BOX_ABS Event này yêu cầu vẽ hình chữ nhật với toạđộ 4 điểm cho trước.
KHOA CNTT Ờ
ĐH KHTN
BOX_REL Giống với BOX_ABS nhưng vẽ từ điểm hiện tại.
ERASE MONITOR khi nhận được event này
sẽ thực hiện việc xố tồn bộ màn hình bằng cách send event BOX_ABS với toạ độ hình chữ nhật là toạđộ màn hình.
GET_LOCATION_WITH_BOX Sử dụng thiết bị chuột để lấy về trạng thái của các nút chuột và vị trắ toạđộ
mới của MONITOR.
GET_LOCATION_WITH_LINE Tương tự với
GET_LOCATION_WITH_BOX
GET_LOCATION_WITH_POINTER Tương tự như trên
GRAPH_CLOSE Khi MONITOR nhận được EVENT
này thì nĩ sẽđĩng MONITOR và kết thúc process kiểm tra EVENT.
LINE_MOD
MOVE_ABS Di chuyển vị trắ toạ độ hiện tại trên màn hình sang toạđộ mới MOVE_REL Giống với MOVE_ABS, nhưng di chuyển tự vị trắ hiện tại RASTER_CHAR Ầ RASTER_INT Ầ RGB_RASTER Ầ RGB_COLORS Ầ
POLYGON_ABS Yêu cầu MONITOR vẽ ra hình
Polygon với toạđộ cho trước
POLYGON_REL Giống với POLYGON_ABS nhưng
KHOA CNTT Ờ
ĐH KHTN
vẽ từ vị trắ toạđộ hiện tại.
POLYLINE_ABS Yêu cầu MONITOR vẽ ra hình
Polyline với tập điểm cho trước
POLYLINE_REL Giống với POLYLINE_ABS, nhưng vẽ từ vị trắ toạđộ hiện tại.
POLYDOTS_ABS Yêu cầu MONITOR vẽ ra hình tập
điểm với tập điểm cho trước
POLYDOTS_REL Giống với POLYDOTS_ABS, nhưng vẽ từ vị trắ toạđộ hiện tại.
RESET_COLORS Reset lại colors, cĩ tắnh đến min, max
RESET_COLOR Reset lại colors, khơng tắnh đến min, max
SCREEN_LEFT Yêu cầu trả về giá trị của toạ độ
TRÁI của MONITOR
SCREEN_TOP Yêu cầu trả về giá trị của toạ độ
TRÊN của MONITOR
SCREEN_RITE Yêu cầu trả về giá trị của toạ độ
PHẢI của MONITOR
SCREEN_BOT Yêu cầu trả về giá trị của toạ độ
DƯỚI của MONITOR
SET_WINDOW Thiết lập lại vị trắ (top, left, right, bottom) của MONITOR
GET_TEXT_BOX Lấy về giá trị text trong box cĩ vị trắ toạđộ (t, l, r, b)
FONT Khởi tạo font và trả về ID của font khởi tạo
TEXT Định dạng lại đoạn Text cho trước bằng hàm soft_text(Ầ)
KHOA CNTT Ờ
ĐH KHTN
TEXT_SIZE Trả về kắch thước của đoạn Text cho trước.
TEXT_ROTATION Quay một đoạn text cho trước.
PANEL_SAVE Save một Panel cho trước (một vùng Region trên màn hình) vào file
PANEL_RESTORE Load một Panel đã xây trước đĩ lên màn hình.
PANEL_DELETE Huỷ một Panel đã lưu.
PAD_CREATE Tạo một PAD mới vào xâu pad_list Ghi chú: Các định nghĩa về PAD sẽ được nĩi rõ hơn ở phần sau.
PAD_CURRENT Trả về PAD đang sử dụng hiện tại
PAD_DELETE Huỷ một PAD cho trước ra khỏi xâu pad_list
PAD_INVENT Trả về ID của PAD cho trước
PAD_LIST Trả về con trỏđầu xâu pad_list
PAD_SELECT Chọn một PAD cho trước làm PAD hiện hành.
PAD_GET_ITEM Trả về xâu Item của một PAD cho trước
PAD_SET_ITEM Thiết lập xâu Item của một PAD cho trước.
PAD_APPEND_ITEM Thêm Items vào một PAD cho trước
PAD_DELETE_ITEM Xố Items của một PAD cho trước.
PAD_LIST_ITEMS Liệt kê xâu Items của một PAD cho trước.
KHOA CNTT Ờ
ĐH KHTN