13.3.1.6. เอกสารอ้างอิง API

พื้นผิวสาธารณะของแพ็กเกจ openmv คือคลาส Camera สำหรับสื่อสารกับกล้อง และลำดับชั้น OMVException สำหรับข้อผิดพลาดของโปรโตคอล ทั้งสองถูกจัดทำเอกสารไว้ในหน้านี้

13.3.1.6.1. คลาส Camera

class openmv.Camera(port: str, *, baudrate: int = 921600, crc: bool = True, seq: bool = True, ack: bool = True, events: bool = True, timeout: float = 1.0, max_retry: int = 3, max_payload: int = 4096, drop_rate: float = 0.0)

พร็อกซีฝั่งโฮสต์สำหรับ OpenMV cam ที่เชื่อมต่อผ่าน USB serial

พารามิเตอร์:
  • port -- พาธของอุปกรณ์ serial บน Linux ใช้ /dev/ttyACMx สำหรับ USB CDC และ /dev/ttyUSBx สำหรับบริดจ์ USB-to-UART บน macOS ใช้ /dev/tty.usbmodem... หรือ /dev/cu.usbmodem... บน Windows ใช้ COMx

  • baudrate -- อัตราบอด serial ผ่าน USB ค่า 921600 คือ ค่าพิเศษ ที่สลับกล้องจากโหมด MicroPython REPL ไปยังโปรโตคอล OpenMV ค่าอื่นใดบนลิงก์ USB จะทิ้งกล้องไว้ในโหมด REPL ดังนั้นต้องใช้ค่าเริ่มต้น สำหรับลิงก์ UART ค่านี้คืออัตราบอดของสายจริงและสามารถตั้งค่าได้อย่างอิสระทั้งสองฝั่ง

  • crc -- เปิดใช้งานการตรวจสอบ CRC ในทุกแพ็กเก็ต

  • seq -- เปิดใช้งานหมายเลขลำดับต่อแพ็กเก็ต

  • ack -- กำหนดให้มีการยืนยันรับแพ็กเก็ต

  • events -- เปิดใช้งานการแจ้งเตือนอีเวนต์จากกล้อง

  • timeout -- การหมดเวลาต่อการดำเนินการหน่วยเป็นวินาที

  • max_retry -- จำนวนครั้งที่ลองซ้ำก่อนยกเลิกเมื่อแพ็กเก็ตล้มเหลว

  • max_payload -- ขนาดเพย์โหลดสูงสุดที่ต่อรองได้ในหน่วยไบต์ กล้องอาจต่อรองลดลง

  • drop_rate -- ความน่าจะเป็นของการทิ้งแพ็กเก็ตสำหรับการทดสอบเท่านั้น ใน [0.0, 1.0] ปล่อยเป็น 0.0 ในโหมดใช้งานจริง

คลาสนี้รองรับโปรโตคอล context-manager ใช้ with Camera(port) as cam: จะเรียก connect() เมื่อเข้า และเรียก disconnect() เมื่อออก

13.3.1.6.2. การเชื่อมต่อ

Camera.connect() None

เปิดพอร์ต serial และดำเนินการ protocol handshake สถานะที่แคชไว้ (รายการช่องสัญญาณ, ข้อมูลระบบ, ข้อมูลเวอร์ชัน) จะถูกกรอกข้อมูลเป็นผลข้างเคียง เรียกโดยอัตโนมัติโดย context manager

Camera.disconnect() None

ปิดพอร์ต serial และปล่อยการขนส่ง เรียกโดยอัตโนมัติเมื่อ context manager ออก

Camera.is_connected() bool
ค่าที่ส่งคืน:

True ถ้าพอร์ต serial เปิดอยู่

Camera.reset() None

รีเซ็ตกล้อง การเชื่อมต่อจะถูกตัดเพราะกล้องรีบูต

Camera.boot() None

ให้กล้องข้ามไปยัง bootloader การเชื่อมต่อจะถูกตัดเพราะกล้องรีบูต

Camera.update_capabilities() None

ต่อรอง capabilities ของโปรโตคอล (CRC, การตรวจสอบลำดับ, ACK, อีเวนต์, เพย์โหลดสูงสุด) กับกล้องใหม่ กล้องรายงานเพย์โหลดสูงสุดที่รองรับได้ คำขอของโฮสต์จะถูกตัดให้พอดี และการตั้งค่าที่ตกลงกันจะถูกส่งกลับ เรียกโดยอัตโนมัติโดย connect() ไม่จำเป็นต้องเรียกจากโค้ดผู้ใช้ เว้นแต่ต้องการต่อรอง flags ของตัวสร้างใหม่บนการเชื่อมต่อที่มีอยู่

Camera.poll_events() None

เรียกใช้ path รับของการขนส่งหนึ่งครั้งเพื่อประมวลผลอีเวนต์ที่รอดำเนินการจากกล้องโดยไม่ต้องส่งคำสั่ง มีประโยชน์สำหรับโปรแกรมที่ทำงานนานซึ่งไม่มี I/O อื่นเป็นเวลาหลายนาที และต้องการแสดงอีเวนต์การลงทะเบียนช่องสัญญาณอย่างรวดเร็ว

13.3.1.6.3. การรันสคริปต์

Camera.exec(script: str) None

อัปโหลด script (สตริงซอร์สโค้ด Python) เข้าบัฟเฟอร์ stdin ของกล้องและเริ่มรัน

พารามิเตอร์:

script -- ซอร์สโค้ด MicroPython ที่จะรัน

Camera.stop() None

หยุดสคริปต์ที่กำลังรัน เทียบเท่ากับปุ่ม Stop ของ IDE

Camera.read_stdout() str | None

อ่านไบต์ที่สคริปต์ที่กำลังรันเขียนไปยัง stdout ตั้งแต่การเรียกครั้งล่าสุด

ค่าที่ส่งคืน:

ผลลัพธ์เป็นสตริงที่ถอดรหัสแล้ว หรือ None ถ้าไม่มีข้อมูลรอดำเนินการ

13.3.1.6.4. การสตรีม

Camera.streaming(enable: bool, raw: bool = False, resolution: tuple[int, int] | None = None) None

เปิดหรือปิดสตรีมเฟรมและเลือกรูปแบบการส่งข้อมูล

พารามิเตอร์:
  • enable -- True เปิดการสตรีม False ปิดการสตรีม

  • raw -- เมื่อเป็น False (ค่าเริ่มต้น) กล้องจะบีบอัด JPEG แต่ละเฟรมก่อนวางลงในช่องสัญญาณสตรีม และ read_frame() จะคลายการบีบอัดบนโฮสต์ เมื่อเป็น True กล้องจะส่งบัฟเฟอร์พิกเซลที่ถ่ายโดยไม่บีบอัด ซึ่งเป็นตัวเลือกที่เหมาะสำหรับกล้องที่ไม่มีการรองรับ JPEG แบบฮาร์ดแวร์ ซึ่งการบีบอัดด้วยซอฟต์แวร์เป็นขั้นตอนที่ช้าที่สุดในลูป

  • resolution -- (width, height) เป้าหมายที่กล้องปรับขนาดแต่ละเฟรมดิบลงก่อนส่ง เนื่องจากเฟรมที่ไม่บีบอัดมีขนาดใหญ่กว่าเฟรมที่บีบอัด JPEG มาก จำเป็นเมื่อ raw=True และถูกละเว้นในกรณีอื่น

Camera.read_frame() dict | None

อ่านเฟรมล่าสุดจากช่องสัญญาณสตรีม

ค่าที่ส่งคืน:

None ถ้าไม่มีเฟรมรอดำเนินการ หรือ dict ที่มีคีย์ width (int, พิกเซล), height (int, พิกเซล), format (int, ตัวระบุรูปแบบพิกเซลที่กล้องประกาศ), depth (int, ขนาดภาพที่บีบอัดในหน่วยไบต์สำหรับเฟรม JPEG / PNG ไม่ได้ใช้สำหรับรูปแบบที่ไม่บีบอัด), data (bytes, RGB888 ของความยาว width * height * 3), และ raw_size (int, ไบต์ที่กล้องส่งผ่าน USB ก่อนถอดรหัส)

13.3.1.6.5. ช่องสัญญาณกำหนดเอง

Camera.has_channel(name: str) bool
ค่าที่ส่งคืน:

True ถ้าช่องสัญญาณที่ลงทะเบียนด้วย name มีอยู่บนกล้อง

Camera.channel_size(name: str) int
ค่าที่ส่งคืน:

จำนวนไบต์ที่ช่องสัญญาณที่ระบุชื่อมีอยู่ในปัจจุบัน หรือ 0 เมื่อช่องสัญญาณว่างเปล่าหรือไม่มีอยู่

Camera.channel_read(name: str, size: int | None = None) bytes | None

อ่านจากช่องสัญญาณกำหนดเอง

พารามิเตอร์:
  • name -- ชื่อช่องสัญญาณที่ลงทะเบียนโดยสคริปต์ฝั่งกล้อง

  • size -- ไบต์ที่จะอ่าน หรือ None เพื่ออ่านสิ่งที่มีอยู่

ค่าที่ส่งคืน:

ไบต์ หรือ None ถ้าช่องสัญญาณไม่มีอยู่

Camera.channel_write(name: str, data: bytes) bool

เขียน data ลงในช่องสัญญาณกำหนดเอง การเขียนที่ใหญ่กว่าเพย์โหลดจะถูกแยกข้ามแพ็กเก็ตโดยอัตโนมัติ

พารามิเตอร์:
  • name -- ชื่อช่องสัญญาณที่ลงทะเบียนโดยสคริปต์ฝั่งกล้อง

  • data -- เพย์โหลดคล้ายไบต์ที่จะส่ง

ค่าที่ส่งคืน:

True ถ้าช่องสัญญาณมีอยู่และการเขียนถูกส่งแล้ว False ในกรณีอื่น

Camera.read_status() dict[str, bool]

สำรวจทุกช่องสัญญาณที่ลงทะเบียน

ค่าที่ส่งคืน:

Dict ที่แมปชื่อช่องสัญญาณกับบูลีนของ "ข้อมูลพร้อมอ่าน"

Camera.update_channels() None

รีเฟรชรายการช่องสัญญาณที่แคชไว้จากกล้อง รันโดยอัตโนมัติในครั้งถัดไปที่มีการค้นหาช่องสัญญาณตามชื่อหลังจากได้รับอีเวนต์การลงทะเบียนช่องสัญญาณ แอปพลิเคชันที่ต้องการรู้จักช่องสัญญาณที่ลงทะเบียนใหม่ทันทีสามารถเรียกสิ่งนี้โดยตรง

Camera.get_channel(name: str | None = None, channel_id: int | None = None) int | str | None

ค้นหาช่องสัญญาณตามชื่อ (คืนค่า ID ตัวเลข) หรือตาม ID (คืนค่าชื่อ) รีเฟรชแคชช่องสัญญาณผ่าน update_channels() ก่อนถ้ามีอีเวนต์การลงทะเบียนช่องสัญญาณรอดำเนินการ

พารามิเตอร์:
  • name -- ชื่อช่องสัญญาณที่จะแปลงเป็น ID

  • channel_id -- Channel ID ที่จะแปลงเป็นชื่อ

ค่าที่ส่งคืน:

ID หรือชื่อที่สอดคล้องกัน หรือ None เมื่อช่องสัญญาณไม่มีอยู่ ต้องระบุ name หรือ channel_id อย่างใดอย่างหนึ่ง

13.3.1.6.6. การตรวจสอบอุปกรณ์

Camera.version() dict

คืนค่าเวอร์ชันโปรโตคอล, bootloader และ เฟิร์มแวร์ของกล้องเป็นสามชุด แคชไว้หลังจาก connect() แต่ละชุดคือ tuple (major, minor, patch) ของ int:

  • protocol_version -- เวอร์ชันของโปรโตคอล wire ของ OpenMV ที่กล้องรองรับ

  • bootloader_version -- ภาพ bootloader ที่อยู่ในแฟลช

  • firmware_version -- เฟิร์มแวร์ MicroPython ที่กำลังรันอยู่

Camera.system_info() dict

คืนค่าข้อมูล capability ของฮาร์ดแวร์และหน่วยความจำของกล้อง แคชไว้หลังจาก connect() คีย์ของ dict ที่ส่งคืนแบ่งออกเป็นสี่กลุ่ม

อัตลักษณ์

  • cpu_id -- ตัวระบุ CPU 32 บิต

  • device_id -- 3-tuple ของคำ 32 บิต หมายเลขซีเรียลอุปกรณ์เฉพาะที่ฝังอยู่ในซิลิคอน

  • chip_id -- 3-tuple ของคำ 32 บิต หนึ่งรายการต่อ image sensor ที่เชื่อมต่อกับกล้อง

  • usb_vid -- USB vendor ID

  • usb_pid -- USB product ID

ขนาดหน่วยความจำ (ทั้งหมดในหน่วยกิโลไบต์)

  • flash_size_kb -- แฟลชภายในทั้งหมด

  • ram_size_kb -- RAM ทั้งหมด

  • framebuffer_size_kb -- RAM ที่สำรองสำหรับการถ่ายภาพ

  • stream_buffer_size_kb -- RAM ที่สำรองสำหรับช่องสัญญาณสตรีมที่ส่งเฟรมไปยังโฮสต์

ค่าสถานะ capability (บูลีนหนึ่งตัวต่อลักษณะเด่น ทั้งหมดตั้งชื่อว่า <feature>_present)

  • gpu_present -- หน่วยประมวลผลกราฟิก

  • npu_present -- หน่วยประมวลผลประสาทเทียม

  • isp_present -- โปรเซสเซอร์สัญญาณภาพ

  • venc_present -- ตัวเข้ารหัสวิดีโอ

  • jpeg_present -- ตัวเข้ารหัส JPEG แบบฮาร์ดแวร์

  • dram_present -- DRAM ภายนอก

  • crc_present -- ตัวเร่งความเร็ว CRC

  • pmu_present -- หน่วยตรวจสอบประสิทธิภาพ

  • wifi_present -- วิทยุ Wi-Fi

  • bt_present -- วิทยุ Bluetooth

  • sd_present -- ช่องเสียบการ์ด SD

  • eth_present -- Ethernet PHY

  • multicore_present -- คอร์ CPU หลายตัว

อื่นๆ

  • usb_highspeed -- บูลีน True เมื่อ USB ถูก enumerate ในโหมดความเร็วสูง (USB 2.0 HS, 480 Mbps)

  • pmu_eventcnt -- จำนวนตัวนับอีเวนต์ PMU ที่มีอยู่ 0 เมื่อไม่มี PMU

Camera.print_system_info() None

บันทึกบล็อกข้อมูลระบบที่จัดรูปแบบไปยัง logging ที่ระดับ INFO CLI ใช้สิ่งนี้เมื่อเชื่อมต่อ

13.3.1.6.7. การวินิจฉัย

Camera.host_stats() dict
ค่าที่ส่งคืน:

ตัวนับชั้นการขนส่งที่ติดตามบนฝั่งโฮสต์: sent, received, checksum, sequence

Camera.device_stats() dict
ค่าที่ส่งคืน:

ตัวนับชั้นการขนส่งที่ติดตามบนฝั่งกล้อง: sent, received, checksum, sequence, retransmit, transport, sent_events, max_ack_queue_depth

13.3.1.6.8. Profiler

profiler รายงานจำนวนการเรียกต่อฟังก์ชันและเวลาการรันต่ำสุด / สูงสุด / รวมสำหรับโมดูลเฟิร์มแวร์ที่ถูก instrument ปัจจุบันคือ image, ml และ ulab การเข้าและออกจากฟังก์ชันจะถูกดักจับในเวลาคอมไพล์ รันไทม์จะสุ่มตัวอย่างตัวนับไมโครวินาที monotonic ในแต่ละครั้ง สะสมผลลัพธ์ต่อฟังก์ชัน และเปิดเผยตารางนั้นไปยังโฮสต์ผ่านช่องสัญญาณ profile

profiler ถูกสร้างลงใน เฟิร์มแวร์เฉพาะเมื่อส่ง PROFILE_ENABLE=1 ไปยัง make ภาพ เฟิร์มแวร์ stock ไม่รวมมัน ค่าสถานะ -finstrument-functions ที่ build เพิ่มไปยังโมดูลที่ติดตามมี overhead รันไทม์ที่ไม่น้อย ดังนั้น profiling builds จะถูกผลิตจากซอร์สสำหรับ session การดีบักที่ต้องการ เมื่อ เฟิร์มแวร์ไม่ได้ถูก build ด้วยค่าสถานะ ช่องสัญญาณ profile จะไม่ถูกลงทะเบียน และทุกเมธอด profiler ในหน้านี้จะส่งคืนอย่างเงียบๆ โดยไม่ทำอะไร

Arm Performance Monitoring Unit (PMU) คือบล็อก hardware counter ของ Cortex-M55 ซึ่งเป็นชุดตัวนับที่กำหนดค่าได้ขนาดเล็กที่ติดตามจำนวนรอบ, cache hits และ misses, พฤติกรรม branch และอีเวนต์ที่กำหนดโดยสถาปัตยกรรมอื่นๆ โดยไม่ทำให้โค้ดที่วัดช้าลง บนกล้องที่มี ได้แก่ AE3 และ N6 สองกล้องในกลุ่มผลิตภัณฑ์ OpenMV ที่สร้างบน M55 profiler จะสุ่มตัวอย่างตัวนับเหล่านี้พร้อมกับข้อมูลเวลา และยอดรวมอีเวนต์จะปรากฏในแต่ละบันทึกต่อฟังก์ชัน กล้องที่ไม่มี PMU ยังคงสร้างบันทึกเวลา ฟิลด์อีเวนต์จะคืนค่าเป็นศูนย์ และ profiler_event() จะเป็น no-op

Camera.profiler_mode(exclusive: bool = False) None

สลับระหว่างการจับเวลาแบบ inclusive และ exclusive การจับเวลาแบบ inclusive จะนับเวลาของ callee ไปยัง caller การจับเวลาแบบ exclusive จะไม่นับ

พารามิเตอร์:

exclusive -- True เลือกการจับเวลาแบบ exclusive False เลือกการจับเวลาแบบ inclusive

Camera.profiler_reset(config: list | None = None) None

ล้างตัวนับ profile ทั้งหมด config=None ยังคืนค่าการกำหนด PMU event เริ่มต้น

พารามิเตอร์:

config -- สำรองไว้สำหรับการ override การกำหนดค่าต่อตัวนับในอนาคต ส่ง None เพื่อเก็บค่าเริ่มต้น

Camera.profiler_event(counter_num: int, event_id: int) None

ผูกหนึ่งใน PMU counter slots กับ hardware event ที่กำหนด

พารามิเตอร์:
  • counter_num -- ดัชนีตัวนับ

  • event_id -- ตัวระบุอีเวนต์ที่กำหนดโดยสถาปัตยกรรม

Camera.read_profile() list[dict] | None

คืนค่าบันทึก profile ต่อฟังก์ชันที่เก็บตั้งแต่การรีเซ็ตครั้งล่าสุด แต่ละบันทึกคือ dict ที่มี address, caller, call_count, min_ticks, max_ticks, total_ticks, total_cycles และ tuple events ที่มีขนาดตาม pmu_eventcnt ของกล้อง

ค่าที่ส่งคืน:

รายการ record dicts หรือ None ถ้าช่องสัญญาณ profile ไม่มีอยู่หรือยังไม่มีข้อมูลถูกเก็บ

13.3.1.6.9. การสร้าง subclass และส่วนภายในของช่องสัญญาณ

เมธอดที่จัดทำเอกสารข้างต้นครอบคลุมการใช้งานทั่วไปของแพ็กเกจทุกอย่าง รูปแบบบางอย่าง เช่น การจัดการอีเวนต์ฝั่งกล้องที่โฮสต์ต้องการตอบสนอง การล็อกช่องสัญญาณสำหรับการแลกเปลี่ยนหลายขั้นตอน การสื่อสารกับช่องสัญญาณที่พกข้อมูลที่มีรูปแบบแทนที่จะเป็น byte stream แบบเรียบ หรือการขับเคลื่อนคำสั่ง control เฉพาะช่องสัญญาณ จำเป็นต้องใช้เมธอดที่ Camera เก็บไว้ด้วยคำนำหน้าขีดล่าง ชื่อเหล่านี้เป็น private ตามธรรมเนียม (Python ไม่ทำ name mangling สำหรับพวกเขา) และแอปพลิเคชันที่ต้องการพวกเขาคาดว่าจะ subclass Camera หรือเรียกเมธอดโดยตรง

การสร้าง subclass เพื่อตอบสนองต่ออีเวนต์ ทุกอีเวนต์ที่กล้องส่งออกมาจะมาถึงผ่าน Camera._handle_event() การสร้าง subclass ของ Camera และ override เมธอดคือวิธีที่แอปพลิเคชันตอบสนองต่ออีเวนต์ที่สคริปต์ฝั่งกล้องสร้างขึ้น หน้า เหตุการณ์ จะอธิบายรูปแบบเต็ม

Camera._handle_event(channel_id: int, event: int) None

Dispatch อีเวนต์หนึ่งจากกล้อง เรียกโดยชั้นการขนส่งเมื่อใดก็ตามที่แพ็กเก็ตอีเวนต์มาถึง Override ใน subclass เพื่อเพิ่มการจัดการเฉพาะแอปพลิเคชัน เรียก super()._handle_event(...) เพื่อเก็บพฤติกรรมเริ่มต้น (รีเฟรชรายการช่องสัญญาณเมื่อ CHANNEL_REGISTERED ติดตามสถานะพร้อมเฟรมบนช่องสัญญาณ stream การบันทึกเริ่ม / หยุดของช่องสัญญาณ stdin)

พารามิเตอร์:
  • channel_id -- 0 สำหรับ system events มิฉะนั้น Channel ID ที่ลงทะเบียน

  • event -- ตัวระบุอีเวนต์ ค่าต่างๆ มาจาก enum EventType สำหรับ system events และจากสิ่งที่ channel backend ฝั่งกล้องเลือกสำหรับ channel events

subclass ที่เพิ่มเมธอดที่พูดคุยกับโปรโตคอลของตัวเองควร decorate ด้วย retry_if_failed() เพื่อให้พวกเขาสืบทอดพฤติกรรม resync-and-retry เดียวกันกับทุกเมธอดที่ส่งมาในหน้านี้

static Camera.retry_if_failed(func)

Decorator ห่อ instance method เพื่อให้ retry หนึ่งครั้งเมื่อการขนส่ง raise ResyncException เมธอดใดก็ตามที่เรียกไปยัง _send_cmd_wait_resp() (โดยตรงหรือผ่าน wrappers _channel_*) ควรมี decorator นี้:

class MyCamera(Camera):
    @Camera.retry_if_failed
    def my_custom_command(self, payload):
        return self._send_cmd_wait_resp(Opcode.MY_CMD,
                                        0, payload)

Channel locking รับประกันว่าสถานะของช่องสัญญาณไม่เปลี่ยนแปลงระหว่างสองการดำเนินการที่เกี่ยวข้อง (เช่น _channel_size() ตามด้วย _channel_read() บนช่องสัญญาณที่เพิ่มข้อมูลต่อเนื่อง) read_frame() และ read_profile() ใช้สิ่งนี้ภายใน แอปพลิเคชันที่ขับเคลื่อนช่องสัญญาณกำหนดเองด้วยการเข้าถึงหลายขั้นตอนก็ทำเช่นเดียวกัน

Camera._channel_lock(channel_id: int) bool

รับ lock สิทธิ์พิเศษบนช่องสัญญาณ การดำเนินการอื่นบนช่องสัญญาณเดียวกันของโฮสต์จะบล็อกจนกว่า lock จะถูกปล่อย

พารามิเตอร์:

channel_id -- Channel ID ตัวเลข โดยทั่วไปจะแปลงด้วย get_channel()

ค่าที่ส่งคืน:

True เมื่อ lock ถูกให้

Camera._channel_unlock(channel_id: int) bool

ปล่อย lock ที่ถูกรับด้วย _channel_lock() ก่อนหน้า จับคู่กับการเรียก lock เสมอ ใช้ try / finally เพื่อให้แน่ใจว่าการปล่อย lock เกิดขึ้นแม้ว่าการอ่านระหว่างกลาง raise

พารามิเตอร์:

channel_id -- Channel ID ตัวเลข โดยทั่วไปจะแปลงด้วย get_channel()

Shaped channels บรรจุบันทึกที่มีโครงสร้างแทนที่จะเป็น byte stream แบบเรียบ ช่องสัญญาณ profiler คือตัวอย่างที่มาพร้อมกัน shape ของมันคือ (record_count, record_size) และโฮสต์ที่ต้องการทราบว่ามีบันทึกกี่รายการที่รอดำเนินการจะอ่าน shape แทนขนาดไบต์

Camera._channel_shape(channel_id: int) tuple[int, ...]

อ่าน shape descriptor ของช่องสัญญาณ

พารามิเตอร์:

channel_id -- Channel ID ตัวเลข โดยทั่วไปจะแปลงด้วย get_channel()

ค่าที่ส่งคืน:

Tuple ของจำนวนเต็มไม่มีเครื่องหมาย 32 บิตที่อธิบาย layout ของช่องสัญญาณ ความหมายนั้นขึ้นอยู่กับช่องสัญญาณ

Channel-specific control commands เช่น start, stop, reset, configure ส่งผ่าน opcode เดียว (CHANNEL_IOCTL) พร้อมหมายเลขคำสั่งเฉพาะช่องสัญญาณและ payload struct.pack ที่เป็นตัวเลือก เมธอดที่มาพร้อมกัน เช่น stop(), exec() และ streaming() เป็น thin wrappers รอบการเรียก _channel_ioctl() กับช่องสัญญาณ stdin และ stream ช่องสัญญาณกำหนดเองฝั่งกล้องที่กำหนด ioctl menu ของตัวเองจะถูกขับเคลื่อนในทำนองเดียวกัน

Camera._channel_ioctl(channel_id: int, cmd: int, fmt: str | None = None, *args) bytes | None

ออก ioctl command บนช่องสัญญาณ

พารามิเตอร์:
  • channel_id -- Channel ID ตัวเลข โดยทั่วไปจะแปลงด้วย get_channel()

  • cmd -- หมายเลขคำสั่งที่กำหนดโดย channel backend ฝั่งกล้อง

  • fmt -- สตริงรูปแบบ struct ที่เป็นตัวเลือกสำหรับ argument tuple ส่ง None สำหรับ ioctls ที่ไม่รับ arguments

  • args -- ค่าที่ตรงกับ fmt

ค่าที่ส่งคืน:

เพย์โหลดใดก็ตามที่ช่องสัญญาณส่งคืน หรือ None

ตัวแปร byte-stream ตาม ID ของเมธอดช่องสัญญาณสาธารณะจะข้ามการค้นหาชื่อเป็น ID และรับ offset ไบต์อย่างชัดเจน ซึ่งมีประโยชน์สำหรับการอ่านส่วนหนึ่งจากกลางของบัฟเฟอร์ขนาดใหญ่ (เช่น บันทึกช่องสัญญาณ profile)

Camera._channel_size(channel_id: int) int
พารามิเตอร์:

channel_id -- Channel ID ตัวเลข โดยทั่วไปจะแปลงด้วย get_channel()

ค่าที่ส่งคืน:

ไบต์ที่มีอยู่บนช่องสัญญาณในขณะนี้

Camera._channel_read(channel_id: int, offset: int, length: int) bytes

อ่าน length ไบต์เริ่มต้นที่ offset การอ่านหลายแพ็กเก็ตจะถูกรวมใหม่โดยอัตโนมัติ

พารามิเตอร์:
  • channel_id -- Channel ID ตัวเลข โดยทั่วไปจะแปลงด้วย get_channel()

  • offset -- Byte offset ที่จะเริ่มอ่าน

  • length -- จำนวนไบต์ที่จะอ่าน

Camera._channel_write(channel_id: int, data: bytes, offset: int = 0) None

เขียน data ที่ offset ที่กำหนด การเขียนหลายแพ็กเก็ตจะถูกแยกข้ามแพ็กเก็ตโดยอัตโนมัติ

พารามิเตอร์:
  • channel_id -- Channel ID ตัวเลข โดยทั่วไปจะแปลงด้วย get_channel()

  • data -- เพย์โหลดคล้ายไบต์ที่จะเขียน

  • offset -- Byte offset ที่จะเริ่มเขียน

Protocol primitives คือระดับต่ำสุดที่คลาสเปิดเผย ได้แก่ raw send-a-command, fetch-the-raw-channel-list และ manual-resync ที่ทุกอย่างข้างต้นถูกสร้างบน แอปพลิเคชันจะใช้สิ่งเหล่านี้เมื่อส่ง opcode ที่คลาสยังไม่ได้ wrap หรือเมื่อ implement การกู้คืนกำหนดเองใน subclass

Camera._send_cmd_wait_resp(opcode: int, channel: int = 0, data: bytes = b'') bytes | None

ส่ง protocol command และรอการตอบสนองของกล้อง เป็น primitive ที่ทุกเมธอดอื่นในส่วนนี้ถูกสร้างบน

พารามิเตอร์:
  • opcode -- หมายเลขคำสั่ง enum Opcode ที่มาพร้อมกันจะแสดงรายการโค้ดที่ เฟิร์มแวร์มาพร้อม แต่พารามิเตอร์นั้นเป็นเพียงจำนวนเต็ม การ build เฟิร์มแวร์กำหนดเองสามารถกำหนดและตอบสนองต่อ opcode ของตัวเองได้

  • channel -- Channel ID หรือ 0 สำหรับ system commands

  • data -- เพย์โหลดเฉพาะคำสั่ง

ค่าที่ส่งคืน:

เพย์โหลดการตอบสนอง หรือ None สำหรับคำสั่ง เช่น Opcode.SYS_RESET และ Opcode.SYS_BOOT ที่ตัดการเชื่อมต่อ

Camera._channel_list() dict

ดึงรายการช่องสัญญาณปัจจุบันจากกล้องโดยไม่แตะต้อง dict channels_by_id และ channels_by_name ที่ update_channels() กรอกข้อมูล มีประโยชน์สำหรับ subclass ที่ต้องการตรวจสอบสถานะช่องสัญญาณของกล้องโดยตรง

ค่าที่ส่งคืน:

Dict ที่แมป channel ID กับ {'name': str, 'flags': int}

Camera._resync() None

รัน protocol handshake ใหม่ตั้งแต่ต้น เรียกโดยอัตโนมัติโดย connect() ในการเชื่อมต่อครั้งแรกและโดยทุกเมธอดสาธารณะที่ catch OMVException จากการขนส่ง แอปพลิเคชันที่ implement recovery loop ของตัวเองใน subclass อาจเรียกสิ่งนี้โดยตรงหลังจากจัดการข้อผิดพลาดพื้นฐาน

13.3.1.6.10. Exceptions

exception openmv.OMVException

คลาสฐานสำหรับทุก protocol-level error สามคลาสย่อยด้านล่างล้วนสืบทอดมาจากมัน ดังนั้น except OMVException เพียงอย่างเดียวครอบคลุมพื้นผิวข้อผิดพลาดทั้งหมด

exception openmv.TimeoutException

กล้องไม่ตอบสนองภายในการหมดเวลาที่กำหนด subclass ของ OMVException

exception openmv.ChecksumException

CRC ของแพ็กเก็ตไม่ตรงกัน Raise หลังจากโปรโตคอลใช้งบประมาณ retry หมดแล้ว subclass ของ OMVException

exception openmv.SequenceException

แพ็กเก็ตมาถึงพร้อมหมายเลขลำดับที่ไม่คาดคิดหลังจาก retry subclass ของ OMVException