Cơ chế SendMessage trong GRASS5

Một phần của tài liệu Luận văn:Nghiên cứu chuyển đổi phần mềm grass từ nền unix lên windows pdf (Trang 133 - 144)

Ớ Ớ

Để 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 (adsbygoogle = window.adsbygoogle || []).push({});

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); (adsbygoogle = window.adsbygoogle || []).push({});

_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 ) (adsbygoogle = window.adsbygoogle || []).push({});

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 (adsbygoogle = window.adsbygoogle || []).push({});

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 (adsbygoogle = window.adsbygoogle || []).push({});

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 Ờ (adsbygoogle = window.adsbygoogle || []).push({});

Đ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

Một phần của tài liệu Luận văn:Nghiên cứu chuyển đổi phần mềm grass từ nền unix lên windows pdf (Trang 133 - 144)