BOSIO × BoAYo 개발 문서 전체 소스 ↗
앱과 UI · 앱 SDK

내 앱에 구면 창 붙이기

BoayoSDK로 내용을 그리고 이벤트를 받는 앱 예제를 제공합니다.

여러 Python 앱이 동일한 BoAYo 창 규칙을 쓰려면 boayo_sdk.py를 가져옵니다. SDK가 Bosio IPC 접속, 창 등록, 아래 캡션, 이벤트 분배를 맡고 앱은 내용만 그립니다.

함수와 이벤트를 찾으려면

SDK 함수·이벤트 안내에 함수별 인자와 반환값, BoayoEvent 필드, BoayoSurface 그리기 함수를 정리했습니다.

가장 작은 실행 앱

import time
from boayo_sdk import BoayoSDK, INK

with BoayoSDK("hello") as sdk:
    window = sdk.create_window("Hello", width_deg=38, height_deg=28)

    def draw(canvas, content):
        canvas.text("HELLO", content.x + 20, content.y + 20,
                    INK, scale=3, bold=True)

    window.present(draw)
    while not window.closed:
        for event in sdk.poll_events():
            if (event.window_id == window.window_id
                    and event.type == "pointer_button" and event.pressed):
                print(f"click: ({event.x:.1f}, {event.y:.1f})", flush=True)
        time.sleep(0.05)

create_window()에서 중심 각도를 생략하면 런처가 BOAYO_APP_AZIMUTHBOAYO_APP_ELEVATION으로 전달한 위치에 창이 열립니다. content는 캡션을 제외한 앱 내용 영역이고, 클릭 좌표 event.x/y도 그 영역의 왼쪽 위가 기준입니다. 캡션 클릭은 SDK가 처리하므로 앱 내용의 클릭 이벤트로 전달되지 않습니다.

이미지 전달

# image: NumPy 배열, shape=(높이, 너비, 3), RGB24
window.present_rgb(image, fit="contain")
# 필요하면 fit="stretch"

앱에서 만든 RGB 이미지를 보내면 SDK가 창 내용 영역에 맞춰 놓고 아래 캡션을 그립니다. 글씨의 선명도는 원본 이미지 크기, 창의 각도 크기, M 분할 수, Bosio의 투영 안티에일리어싱에 영향을 받습니다. 작은 글씨는 앱에서 먼저 크게·굵게 그리는 편이 좋습니다.

현재 크기와 포커스 읽기

state = sdk.window_state(window)  # 또는 window.state
print(state.width_deg, state.height_deg)          # 구면 창의 각도 크기(°)
print(state.surface_width, state.surface_height)  # RGB24 표면 픽셀 크기
print(state.content_width, state.content_height)  # 캡션 제외 내용 크기
print(state.focused)                              # 포커스 여부

for event in sdk.poll_events():
    if event.window_id != window.window_id:
        continue
    if event.type == "resize":
        print("size", event.state.width_deg, event.state.height_deg)
        window.present(draw)  # 필요한 경우 내용 다시 그리기
    elif event.type == "focus":
        print("focus", event.focused)

BoayoWindowState는 읽는 시점의 창 상태를 복사한 값입니다. 캡션 조작으로 창의 각도 크기가 바뀌면 resize 이벤트가 sdk.poll_events() 호출당 창별로 최대 한 번 전달됩니다. 드래그가 창 밖으로 이어져도 변경을 감지합니다. 포커스 상태는 이벤트를 읽은 뒤 갱신됩니다. 각도 크기를 조절해도 RGB 이미지와 내용 영역의 픽셀 크기는 바뀌지 않습니다. SDK를 거치지 않고 Bosio IPC에서 직접 바꾼 창 위치·크기는 SDK 창 객체에 자동으로 반영되지 않습니다.

한 앱에서 여러 창

with BoayoSDK("multi-view") as sdk:
    main = sdk.create_window("Main")
    tools = sdk.create_window("Tools", azimuth=20, elevation=0,
                              width_deg=30, height_deg=22)
    main.present(draw_main)
    tools.present(draw_tools)
    while sdk.windows:
        for event in sdk.poll_events():
            if event.window_id == main.window_id:
                handle_main(event)
            elif event.window_id == tools.window_id:
                handle_tools(event)
        time.sleep(0.05)

한 앱에서 여러 창을 만들면 SDK가 이벤트를 한 번 읽어 창 ID별로 나눕니다. 이미지가 바뀌지 않는 앱도 sdk.poll_events()를 계속 호출해야 캡션의 닫기·이동·크기 조절이 작동합니다. 런처 목록에 앱을 표시하려면 apps.json에 실행 command를 등록해야 합니다.

가져올 파일

보드에서 런처 외부 앱을 직접 실행할 때 /home/xilinx/bosio_v2/boayo/home/xilinx/bosio_v2PYTHONPATH에 넣습니다. SDK와 예제의 원본은 SDK 빠른 시작, Pulse 앱, 두 창 예제에 있습니다.

BOSIO × BoAYo · 문서 저장소 · 구현 원본은 각 소스 저장소에서 확인하세요.