Logo Zephyrnet

Tạo màn hình khởi động thiết bị y tế cho QNX

Ngày:

Màn hình khởi động thiết bị y tế QNX

Hầu hết nếu không phải tất cả các thiết bị chính (bao gồm cả thiết bị y tế) trên toàn thế giới đều có một dạng màn hình khởi động nào đó. Hoạt ảnh thường hào nhoáng nhưng đôi khi đơn giản này thực hiện hai mục đích. Một là nó trông đẹp và các công ty có thể cá nhân hóa và thêm thương hiệu của họ vào đó. Nhưng lý do thứ hai được cho là quan trọng hơn; nó cho người dùng biết rằng thiết bị đang hoạt động và hiện vẫn đang trong giai đoạn khởi động.
Blog này sẽ rất kỹ thuật vì nó mô tả cách thiết kế và tạo màn hình khởi động.

Đặc biệt, blog chia sẻ các mẹo để giải quyết các cạm bẫy và sự phức tạp xảy ra khi thiết kế màn hình khởi động cho Hệ điều hành (HĐH) tuân thủ POSIX, QNX. QNX là một hệ điều hành vi nhân được thiết kế để chạy trên các hệ thống nhúng và cụ thể hơn là phần cứng quan trọng về an toàn. Để trợ giúp về các chi tiết kỹ thuật, các tài liệu tham khảo đến tài liệu QNX được đưa vào xuyên suốt để làm rõ thêm.

Xác định QNX tệp xây dựng hệ điều hành

Bước đầu tiên để thiết kế màn hình khởi động là thiết lập QNX để đảm bảo màn hình khởi động sẽ được hiển thị trong thời gian sớm nhất có thể trong trình tự khởi động. Để sử dụng QNX, nhà phát triển sẽ cần xác định một Tập tin xây dựng hệ điều hành về cơ bản nó sẽ mô tả trình điều khiển, ứng dụng và các tệp không liên quan khác cần được đưa vào hình ảnh hệ điều hành. Hình ảnh hệ điều hành này sau đó sẽ được flash vào hệ thống đích và kiểm soát ứng dụng và trình điều khiển nào được khởi động khi khởi động. QNX có một hệ thống đồ họa được gọi là Hệ thống con màn hình. Nó sẽ được sử dụng để hiển thị hình ảnh lên một màn hình cụ thể được gắn vào phần cứng. Việc này nên được bắt đầu càng sớm càng tốt trong quá trình khởi động. Trình tự khởi động được xác định trong tệp xây dựng dưới dạng thẻ tập lệnh sẽ trông như sau:

[+script] .script={}

với bất kỳ dòng được xác định nào bên trong dấu ngoặc nhọn hoạt động giống như một tập lệnh shell. Đây là nơi hệ thống con Screen sẽ được bắt đầu.

Lệnh khởi động hệ thống con Screen sẽ có dạng:

màn hình -c {path_to_config_file}.

Có thể tìm thấy thêm thông tin tại đây. Khi hệ thống con Màn hình đã được khởi động, hệ thống nhị phân màn hình khởi động sau đó có thể được khởi động.

Làm việc với hệ thống màn hình

Bước tiếp theo là tự phát triển màn hình khởi động. QNX không có cách riêng để hiển thị hình ảnh hoặc hoạt ảnh như một phần của trình tự khởi động. Điều này sẽ cần phải được phát triển trên cơ sở từng thiết bị. Vì API màn hình được viết bằng C nên màn hình khởi động cũng phải được viết bằng C. Ngoài ra, việc sử dụng C sẽ đảm bảo rằng màn hình khởi động có thể được khởi động nhanh hơn nhiều và do đó giảm thời gian thông báo cho người dùng về hoạt động của thiết bị. Màn hình khởi động cần thiết lập một số mã soạn sẵn để giao tiếp với API màn hình. Có thể tìm thấy chi tiết cụ thể tại đây nhưng để liệt kê chúng ra, màn hình khởi động sẽ cần tạo một đối tượng bối cảnh, một đối tượng mục tiêu kết xuất (trong trường hợp này, mục tiêu kết xuất cần thiết là mục tiêu cửa sổ) và cuối cùng là đối tượng bộ đệm màn hình. Về mặt kỹ thuật, vì C không hướng đối tượng nên khái niệm đối tượng không tồn tại trong ngôn ngữ. Nhưng để dễ giải thích, thuật ngữ đối tượng sẽ được sử dụng để mô tả các loại cấu trúc được sử dụng.

Dưới đây là phần làm rõ và gợi ý về một số tham số cụ thể cho các đối tượng vừa được xác định. Khi tạo đối tượng ngữ cảnh màn hình cho màn hình khởi động, loại SCREEN_APPLICATION_CONTEXT là không đủ. Thay vào đó, màn hình khởi động cần SCREEN_WINDOW_MANAGER_CONTEXT. Lý do sẽ được giải thích đầy đủ sau, nhưng về cơ bản nó liên quan đến việc biết khi nào màn hình khởi động cần kết thúc. Thêm thông tin là tại đây.

Tiếp theo, khi xác định thuộc tính sử dụng của mục tiêu kết xuất, trong trường hợp này là cửa sổ, thuộc tính này ít nhất phải được đặt thành SCREEN_USAGE_WRITE vì màn hình khởi động dự định ghi vào bộ đệm kết xuất nhưng không nhất thiết phải đọc từ nó. Mặc định là sự kết hợp của cờ ghi và cờ đọc. Thêm thông tin là tại đây.

Cuối cùng, số lượng bộ đệm lý tưởng được sử dụng bởi mục tiêu kết xuất có thể được đặt thành một hoặc hai tùy thuộc vào loại màn hình khởi động được sử dụng. Nếu thiết bị có màn hình khởi động tĩnh, sẽ tạo thành một hình ảnh duy nhất thì chỉ cần 1 bộ đệm. Tuy nhiên, nếu nó hiển thị hình ảnh động thì nên sử dụng hai hình ảnh động. Sử dụng kết hợp cả hai với mục tiêu hiển thị của cửa sổ sẽ cho phép màn hình khởi động được đệm đôi. Nói cách khác, trong khi một khung hình của hoạt ảnh đang được tải vào một bộ đệm thì hệ thống con Màn hình có thể hiển thị bộ đệm khác. Sau đó, khi bộ đệm được tải vào xong, hệ thống con Màn hình sẽ hoán đổi bộ đệm đang hoạt động sang bộ đệm mới.

Làm việc với thư viện hình ảnh

Bây giờ, thư viện QNX thứ hai cần được sử dụng để phân tích và tải các khung hình cụ thể của hình ảnh hoặc hoạt ảnh trên màn hình khởi động. Hệ thống con Screen không xử lý việc này. Thay vào đó, Thư viện hình ảnh Được sử dụng. Tùy thuộc vào loại tệp hình ảnh sẽ được sử dụng cho màn hình khởi động, sẽ cần các tệp Codec Shared Object (.so) khác nhau. Những thứ này sẽ được bao gồm trong tệp xây dựng hình ảnh hệ điều hành và danh sách những cái có sẵn là tại đây. Cần phải thực hiện một chuỗi các bước để hiển thị khung hình động cho màn hình đính kèm.

Các bước này được xác định tại đây với một vài cảnh báo. Một lưu ý quan trọng là có khả năng tùy thuộc vào phần cứng được sử dụng, toàn bộ tập hợp khung hình của hoạt ảnh sẽ không vừa với bộ nhớ. Trong trường hợp này, các khung hình sẽ cần được tải nhanh chóng và hiển thị khi chúng được tải. Lưu ý thứ hai là cả img_load_file() và img_load() (cả hai đều được tham chiếu trong liên kết ở trên) sẽ chỉ tải khung đầu tiên. Đối với ảnh tĩnh, điều này là đủ, nhưng đối với ảnh động thì không. Việc sử dụng các hàm này trong một vòng lặp để đọc từng khung cũng sẽ không có tác dụng vì không có cách nào chỉ định số khung cần truy xuất. Nó sẽ luôn trả về khung hình đầu tiên.

Thay vào đó, để giải quyết cả hai cảnh báo, mã sẽ tải và giải mã khung, sau đó, trong lệnh gọi lại giải mã, hãy ghi khung hoạt ảnh vào bộ đệm của hệ thống con Màn hình. Hàm img_decode_frame() cho phép xác định các lệnh gọi lại và nó đặc biệt nằm trong lệnh gọi lại frame_f() (xem tại đây) nên đặt mã để tải hình ảnh vào bộ đệm.

Các bước để tải dữ liệu như sau: Trích xuất mục tiêu kết xuất (màn hình trong trường hợp này) được truyền vào dưới dạng tham số dữ liệu (điều này sẽ cần được truyền từ uintptr_t sang screen_window_t). Sau đó, SCREEN_PROPERTY_POINTER và SCREEN_PROPERTY_STRIDE của bộ đệm (xem tại đây) phải được đặt thành dữ liệu và bước tiến tương ứng của hình ảnh (tham số img_t của lệnh gọi lại). Bước cuối cùng là sử dụng screen_post_window() (do mục tiêu kết xuất là một cửa sổ) để hiển thị hình ảnh mới được tải lên màn hình.

Làm việc với hệ thống sự kiện QNX

Cuối cùng, vì màn hình khởi động về cơ bản là một vòng lặp vô hạn có thể hiển thị đi hiển thị lại hình ảnh động nên màn hình khởi động cần biết khi nào nên kết thúc. Đây là lúc việc đặt loại ngữ cảnh thành SCREEN_WINDOW_MANAGER_CONTEXT trở nên quan trọng. QNX có Hệ thống sự kiện nơi các sự kiện được tạo nếu các cửa sổ mới được tạo, hủy, lấy tiêu điểm, v.v. Danh sách đầy đủ các sự kiện là tại đây. Việc sử dụng SCREEN_WINDOW_MANAGER_CONTEXT cho phép màn hình khởi động lắng nghe các sự kiện tạo cửa sổ và tập trung vào cửa sổ do các ứng dụng khác tạo ra.

Hai sự kiện quan trọng đối với màn hình khởi động là sự kiện SCREEN_EVENT_CREATE và SCREEN_EVENT_PROPERTY. Sự kiện SCREEN_EVENT_CREATE được sử dụng để lắng nghe khi ứng dụng chính (hiển thị giao diện người dùng chính của thiết bị) tạo cửa sổ và do đó khi màn hình khởi động sẽ bắt đầu trình tự tắt máy. Các thuộc tính khác có thể được truy vấn về sự kiện này bằng cách sử dụng tập hợp hàm screen_get_event_property_X(). X được sử dụng để biểu thị loại thuộc tính được truy vấn. Nếu ứng dụng chính xác định SCREEN_PROPERTY_GROUP thì nó có thể được truy vấn để tìm hiểu xem ứng dụng cụ thể có kích hoạt sự kiện hay không.

Sự kiện SCREEN_EVENT_PROPERTY có thể được sử dụng cùng với thuộc tính SCREEN_PROPERTY_FOCUS được đặt khi một cửa sổ khác lấy tiêu điểm (đọc thêm thông tin tại đây). Việc sử dụng hệ thống sự kiện thay vì sử dụng hoạt ảnh dài X giây (trong đó X là độ dài của quá trình khởi động của thiết bị) có nghĩa là hoạt ảnh có thể được lặp lại nếu ứng dụng chính chưa được khởi động. Điều này cho phép khả năng di chuyển tốt hơn nhiều giữa các phần cứng khác nhau vì thời gian rất có thể sẽ khác nhau.

Về chủ đề thời gian, vì các sự kiện không thể được theo dõi liên tục (nếu có, nó sẽ khóa luồng chính khiến hoạt ảnh không hiển thị các khung tiếp theo), cần phải sử dụng một chiến thuật khác. Nếu màn hình khởi động là một khung tĩnh thì điều này sẽ không thành vấn đề. Tuy nhiên, tùy thuộc vào độ dài của hoạt ảnh, những sự kiện này có thể cần được lắng nghe trong khoảng một phần tư bộ khung. Nghĩa là, mỗi khi một phần tư khung hình của hoạt ảnh được tải, trước khi quý tiếp theo bắt đầu tải, hãy kiểm tra mọi sự kiện có thể xảy ra.

Kết luận

Tóm lại, blog này giải thích tại sao màn hình khởi động lại quan trọng, cung cấp chi tiết về cách thiết lập màn hình khởi động thiết bị y tế cho QNX, đồng thời đưa ra những cảnh báo và đề xuất thiết kế có thể hữu ích. Tuy nhiên, màn hình khởi động của mỗi thiết bị đều có những yêu cầu khác nhau. Do đó, blog này cung cấp các đề xuất thay vì quy trình từng bước. Tuy nhiên, những đề xuất và chi tiết này sẽ cho phép các nhà phát triển thiết lập màn hình khởi động QNX cho thiết bị y tế đáp ứng nhu cầu cụ thể của họ.

Dendy Addison là một Kỹ sư phần mềm tại Starfish Medical, nơi giúp khách hàng phát triển phần mềm thiết bị y tế an toàn, hiệu quả và hiệu quả. Anh ấy có niềm đam mê tạo ra sự khác biệt trong cuộc sống của mọi người thông qua phần mềm mà anh ấy phát triển. Dendy thích làm việc trên mọi khía cạnh của thiết bị y tế từ phần sụn đến giao diện người dùng.

 

Chia sẻ cái này…

tại chỗ_img

Tin tức mới nhất

tại chỗ_img