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 ใช้COMxbaudrate -- อัตราบอด 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.update_capabilities() None¶
ต่อรอง capabilities ของโปรโตคอล (CRC, การตรวจสอบลำดับ, ACK, อีเวนต์, เพย์โหลดสูงสุด) กับกล้องใหม่ กล้องรายงานเพย์โหลดสูงสุดที่รองรับได้ คำขอของโฮสต์จะถูกตัดให้พอดี และการตั้งค่าที่ตกลงกันจะถูกส่งกลับ เรียกโดยอัตโนมัติโดย
connect()ไม่จำเป็นต้องเรียกจากโค้ดผู้ใช้ เว้นแต่ต้องการต่อรอง flags ของตัวสร้างใหม่บนการเชื่อมต่อที่มีอยู่
13.3.1.6.3. การรันสคริปต์¶
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_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 IDusb_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-- ตัวเร่งความเร็ว CRCpmu_present-- หน่วยตรวจสอบประสิทธิภาพwifi_present-- วิทยุ Wi-Fibt_present-- วิทยุ Bluetoothsd_present-- ช่องเสียบการ์ด SDeth_present-- Ethernet PHYmulticore_present-- คอร์ CPU หลายตัว
อื่นๆ
usb_highspeed-- บูลีนTrueเมื่อ USB ถูก enumerate ในโหมดความเร็วสูง (USB 2.0 HS, 480 Mbps)pmu_eventcnt-- จำนวนตัวนับอีเวนต์ PMU ที่มีอยู่0เมื่อไม่มี PMU
13.3.1.6.7. การวินิจฉัย¶
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เลือกการจับเวลาแบบ exclusiveFalseเลือกการจับเวลาแบบ 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และ tupleeventsที่มีขนาดตาม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 ที่ไม่รับ argumentsargs -- ค่าที่ตรงกับ
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 commandsdata -- เพย์โหลดเฉพาะคำสั่ง
- ค่าที่ส่งคืน:
เพย์โหลดการตอบสนอง หรือ
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()ในการเชื่อมต่อครั้งแรกและโดยทุกเมธอดสาธารณะที่ catchOMVExceptionจากการขนส่ง แอปพลิเคชันที่ 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