From a222514ca569774b48d3ea9cd7c792114e2dc0b2 Mon Sep 17 00:00:00 2001 From: lenting1027 Date: Fri, 28 Mar 2025 11:20:15 +0800 Subject: [PATCH 01/12] =?UTF-8?q?=E4=B8=8A=E5=82=B3=E6=AA=94=E6=A1=88?= =?UTF-8?q?=E5=88=B0=E3=80=8Csrc/unitdev04=E3=80=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit XBee --- src/unitdev04/change_mode.py | 109 +++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 src/unitdev04/change_mode.py diff --git a/src/unitdev04/change_mode.py b/src/unitdev04/change_mode.py new file mode 100644 index 0000000..e81f195 --- /dev/null +++ b/src/unitdev04/change_mode.py @@ -0,0 +1,109 @@ + import curses +import serial +import struct +from pymavlink.dialects.v20 import ardupilotmega as mavlink2 + +PORT = "COM5" # or "/dev/ttyUSB0" +BAUD = 57600 +target_system = 5 +target_component = 1 +MAV_CMD_DO_SET_MODE = 176 + +mode_list = [ + ("STABILIZE", 0), + ("AUTO", 3), + ("GUIDED", 4), + ("LOITER", 5) +] + +ser = serial.Serial(PORT, BAUD) + +class PacketCapture: + def __init__(self): + self.data = bytearray() + def write(self, b): + self.data.extend(b) + return len(b) + +def build_api_tx_frame(data: bytes, frame_id=0x01): + frame_type = 0x10 + dest_addr64 = b'\x00\x00\x00\x00\x00\x00\xFF\xFF' # 廣播 + dest_addr16 = b'\xFF\xFE' + broadcast_radius = 0x00 + options = 0x00 + + frame = struct.pack(">B", frame_type) + struct.pack(">B", frame_id) + frame += dest_addr64 + dest_addr16 + frame += struct.pack(">BB", broadcast_radius, options) + data + checksum = 0xFF - (sum(frame) & 0xFF) + return b'\x7E' + struct.pack(">H", len(frame)) + frame + struct.pack("B", checksum) + +def curses_main(stdscr): + curses.curs_set(0) + selected = 0 + + while True: + stdscr.clear() + h, w = stdscr.getmaxyx() + + stdscr.addstr(1, 2, "🛫 模式選單(使用 ↑↓ 選擇,Enter 發送,q 離開)") + + for i, (name, _) in enumerate(mode_list): + if i == selected: + stdscr.attron(curses.A_REVERSE) + stdscr.addstr(i + 3, 4, f"> {name}") + stdscr.attroff(curses.A_REVERSE) + else: + stdscr.addstr(i + 3, 4, f" {name}") + + key = stdscr.getch() + + if key == curses.KEY_UP: + selected = (selected - 1) % len(mode_list) + elif key == curses.KEY_DOWN: + selected = (selected + 1) % len(mode_list) + elif key in [10, 13]: # Enter + name, custom_mode = mode_list[selected] + capture = PacketCapture() + mav = mavlink2.MAVLink(capture, srcSystem=1, srcComponent=1) + mav.version = 2 + + msg = mav.command_long_encode( + target_system=target_system, + target_component=target_component, + command=MAV_CMD_DO_SET_MODE, + confirmation=0, + param1=1, + param2=custom_mode, + param3=0, param4=0, param5=0, param6=0, param7=0 + ) + print("🧪 msg =", msg) # 確認封包物件生成 + + mav.send(msg) # ✅ 改為 send() 會寫入 capture + print("📦 RAW HEX:", capture.data.hex()) + + api_frame = build_api_tx_frame(capture.data) + ser.write(api_frame) + + # 顯示封包資訊 + msg_line = min(h - 4, len(mode_list) + 5) + stdscr.addstr(msg_line, 2, f"✅ 發送模式切換:{name} ({custom_mode})") + stdscr.addstr(msg_line + 1, 2, f"📦 MAVLink HEX: {' '.join(f'{b:02x}' for b in capture.data)[:w-4]}") + stdscr.addstr(msg_line + 2, 2, f"📡 XBee API HEX: {' '.join(f'{b:02x}' for b in api_frame)[:w-4]}") + stdscr.refresh() + curses.napms(1500) + + elif key in [ord('q'), ord('Q')]: + break + + stdscr.refresh() + + +try: + curses.wrapper(lambda stdscr: curses_main(stdscr)) # 使用 lambda 函數來傳遞 ser + +except Exception as e: + print(f"❌ 發生錯誤: {e}") +finally: + ser.close() + print("👋 程式結束,串口已關閉") From 21dce163edb7d3fa8f8a67b75866420512b672f2 Mon Sep 17 00:00:00 2001 From: lenting1027 Date: Fri, 28 Mar 2025 11:22:57 +0800 Subject: [PATCH 02/12] =?UTF-8?q?=E5=88=AA=E9=99=A4=E3=80=8Csrc/unitdev04/?= =?UTF-8?q?change=5Fmode.py=E3=80=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/unitdev04/change_mode.py | 109 ----------------------------------- 1 file changed, 109 deletions(-) delete mode 100644 src/unitdev04/change_mode.py diff --git a/src/unitdev04/change_mode.py b/src/unitdev04/change_mode.py deleted file mode 100644 index e81f195..0000000 --- a/src/unitdev04/change_mode.py +++ /dev/null @@ -1,109 +0,0 @@ - import curses -import serial -import struct -from pymavlink.dialects.v20 import ardupilotmega as mavlink2 - -PORT = "COM5" # or "/dev/ttyUSB0" -BAUD = 57600 -target_system = 5 -target_component = 1 -MAV_CMD_DO_SET_MODE = 176 - -mode_list = [ - ("STABILIZE", 0), - ("AUTO", 3), - ("GUIDED", 4), - ("LOITER", 5) -] - -ser = serial.Serial(PORT, BAUD) - -class PacketCapture: - def __init__(self): - self.data = bytearray() - def write(self, b): - self.data.extend(b) - return len(b) - -def build_api_tx_frame(data: bytes, frame_id=0x01): - frame_type = 0x10 - dest_addr64 = b'\x00\x00\x00\x00\x00\x00\xFF\xFF' # 廣播 - dest_addr16 = b'\xFF\xFE' - broadcast_radius = 0x00 - options = 0x00 - - frame = struct.pack(">B", frame_type) + struct.pack(">B", frame_id) - frame += dest_addr64 + dest_addr16 - frame += struct.pack(">BB", broadcast_radius, options) + data - checksum = 0xFF - (sum(frame) & 0xFF) - return b'\x7E' + struct.pack(">H", len(frame)) + frame + struct.pack("B", checksum) - -def curses_main(stdscr): - curses.curs_set(0) - selected = 0 - - while True: - stdscr.clear() - h, w = stdscr.getmaxyx() - - stdscr.addstr(1, 2, "🛫 模式選單(使用 ↑↓ 選擇,Enter 發送,q 離開)") - - for i, (name, _) in enumerate(mode_list): - if i == selected: - stdscr.attron(curses.A_REVERSE) - stdscr.addstr(i + 3, 4, f"> {name}") - stdscr.attroff(curses.A_REVERSE) - else: - stdscr.addstr(i + 3, 4, f" {name}") - - key = stdscr.getch() - - if key == curses.KEY_UP: - selected = (selected - 1) % len(mode_list) - elif key == curses.KEY_DOWN: - selected = (selected + 1) % len(mode_list) - elif key in [10, 13]: # Enter - name, custom_mode = mode_list[selected] - capture = PacketCapture() - mav = mavlink2.MAVLink(capture, srcSystem=1, srcComponent=1) - mav.version = 2 - - msg = mav.command_long_encode( - target_system=target_system, - target_component=target_component, - command=MAV_CMD_DO_SET_MODE, - confirmation=0, - param1=1, - param2=custom_mode, - param3=0, param4=0, param5=0, param6=0, param7=0 - ) - print("🧪 msg =", msg) # 確認封包物件生成 - - mav.send(msg) # ✅ 改為 send() 會寫入 capture - print("📦 RAW HEX:", capture.data.hex()) - - api_frame = build_api_tx_frame(capture.data) - ser.write(api_frame) - - # 顯示封包資訊 - msg_line = min(h - 4, len(mode_list) + 5) - stdscr.addstr(msg_line, 2, f"✅ 發送模式切換:{name} ({custom_mode})") - stdscr.addstr(msg_line + 1, 2, f"📦 MAVLink HEX: {' '.join(f'{b:02x}' for b in capture.data)[:w-4]}") - stdscr.addstr(msg_line + 2, 2, f"📡 XBee API HEX: {' '.join(f'{b:02x}' for b in api_frame)[:w-4]}") - stdscr.refresh() - curses.napms(1500) - - elif key in [ord('q'), ord('Q')]: - break - - stdscr.refresh() - - -try: - curses.wrapper(lambda stdscr: curses_main(stdscr)) # 使用 lambda 函數來傳遞 ser - -except Exception as e: - print(f"❌ 發生錯誤: {e}") -finally: - ser.close() - print("👋 程式結束,串口已關閉") From 716b3726c237e826c38de4b806d96a2211d9d73a Mon Sep 17 00:00:00 2001 From: lenting1027 Date: Fri, 28 Mar 2025 11:23:42 +0800 Subject: [PATCH 03/12] Mavlink and XBee packet transfer --- src/unitdev04/change_mode.py | 109 +++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 src/unitdev04/change_mode.py diff --git a/src/unitdev04/change_mode.py b/src/unitdev04/change_mode.py new file mode 100644 index 0000000..e81f195 --- /dev/null +++ b/src/unitdev04/change_mode.py @@ -0,0 +1,109 @@ + import curses +import serial +import struct +from pymavlink.dialects.v20 import ardupilotmega as mavlink2 + +PORT = "COM5" # or "/dev/ttyUSB0" +BAUD = 57600 +target_system = 5 +target_component = 1 +MAV_CMD_DO_SET_MODE = 176 + +mode_list = [ + ("STABILIZE", 0), + ("AUTO", 3), + ("GUIDED", 4), + ("LOITER", 5) +] + +ser = serial.Serial(PORT, BAUD) + +class PacketCapture: + def __init__(self): + self.data = bytearray() + def write(self, b): + self.data.extend(b) + return len(b) + +def build_api_tx_frame(data: bytes, frame_id=0x01): + frame_type = 0x10 + dest_addr64 = b'\x00\x00\x00\x00\x00\x00\xFF\xFF' # 廣播 + dest_addr16 = b'\xFF\xFE' + broadcast_radius = 0x00 + options = 0x00 + + frame = struct.pack(">B", frame_type) + struct.pack(">B", frame_id) + frame += dest_addr64 + dest_addr16 + frame += struct.pack(">BB", broadcast_radius, options) + data + checksum = 0xFF - (sum(frame) & 0xFF) + return b'\x7E' + struct.pack(">H", len(frame)) + frame + struct.pack("B", checksum) + +def curses_main(stdscr): + curses.curs_set(0) + selected = 0 + + while True: + stdscr.clear() + h, w = stdscr.getmaxyx() + + stdscr.addstr(1, 2, "🛫 模式選單(使用 ↑↓ 選擇,Enter 發送,q 離開)") + + for i, (name, _) in enumerate(mode_list): + if i == selected: + stdscr.attron(curses.A_REVERSE) + stdscr.addstr(i + 3, 4, f"> {name}") + stdscr.attroff(curses.A_REVERSE) + else: + stdscr.addstr(i + 3, 4, f" {name}") + + key = stdscr.getch() + + if key == curses.KEY_UP: + selected = (selected - 1) % len(mode_list) + elif key == curses.KEY_DOWN: + selected = (selected + 1) % len(mode_list) + elif key in [10, 13]: # Enter + name, custom_mode = mode_list[selected] + capture = PacketCapture() + mav = mavlink2.MAVLink(capture, srcSystem=1, srcComponent=1) + mav.version = 2 + + msg = mav.command_long_encode( + target_system=target_system, + target_component=target_component, + command=MAV_CMD_DO_SET_MODE, + confirmation=0, + param1=1, + param2=custom_mode, + param3=0, param4=0, param5=0, param6=0, param7=0 + ) + print("🧪 msg =", msg) # 確認封包物件生成 + + mav.send(msg) # ✅ 改為 send() 會寫入 capture + print("📦 RAW HEX:", capture.data.hex()) + + api_frame = build_api_tx_frame(capture.data) + ser.write(api_frame) + + # 顯示封包資訊 + msg_line = min(h - 4, len(mode_list) + 5) + stdscr.addstr(msg_line, 2, f"✅ 發送模式切換:{name} ({custom_mode})") + stdscr.addstr(msg_line + 1, 2, f"📦 MAVLink HEX: {' '.join(f'{b:02x}' for b in capture.data)[:w-4]}") + stdscr.addstr(msg_line + 2, 2, f"📡 XBee API HEX: {' '.join(f'{b:02x}' for b in api_frame)[:w-4]}") + stdscr.refresh() + curses.napms(1500) + + elif key in [ord('q'), ord('Q')]: + break + + stdscr.refresh() + + +try: + curses.wrapper(lambda stdscr: curses_main(stdscr)) # 使用 lambda 函數來傳遞 ser + +except Exception as e: + print(f"❌ 發生錯誤: {e}") +finally: + ser.close() + print("👋 程式結束,串口已關閉") From df2a4590706becce7c3670e30a8f68e48f2118f1 Mon Sep 17 00:00:00 2001 From: lenting1027 Date: Fri, 28 Mar 2025 11:24:02 +0800 Subject: [PATCH 04/12] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E3=80=8Csrc/unitdev04/?= =?UTF-8?q?change=5Fmode.py=E3=80=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/unitdev04/change_mode.py | 218 +++++++++++++++++------------------ 1 file changed, 109 insertions(+), 109 deletions(-) diff --git a/src/unitdev04/change_mode.py b/src/unitdev04/change_mode.py index e81f195..58d0023 100644 --- a/src/unitdev04/change_mode.py +++ b/src/unitdev04/change_mode.py @@ -1,109 +1,109 @@ - import curses -import serial -import struct -from pymavlink.dialects.v20 import ardupilotmega as mavlink2 - -PORT = "COM5" # or "/dev/ttyUSB0" -BAUD = 57600 -target_system = 5 -target_component = 1 -MAV_CMD_DO_SET_MODE = 176 - -mode_list = [ - ("STABILIZE", 0), - ("AUTO", 3), - ("GUIDED", 4), - ("LOITER", 5) -] - -ser = serial.Serial(PORT, BAUD) - -class PacketCapture: - def __init__(self): - self.data = bytearray() - def write(self, b): - self.data.extend(b) - return len(b) - -def build_api_tx_frame(data: bytes, frame_id=0x01): - frame_type = 0x10 - dest_addr64 = b'\x00\x00\x00\x00\x00\x00\xFF\xFF' # 廣播 - dest_addr16 = b'\xFF\xFE' - broadcast_radius = 0x00 - options = 0x00 - - frame = struct.pack(">B", frame_type) + struct.pack(">B", frame_id) - frame += dest_addr64 + dest_addr16 - frame += struct.pack(">BB", broadcast_radius, options) + data - checksum = 0xFF - (sum(frame) & 0xFF) - return b'\x7E' + struct.pack(">H", len(frame)) + frame + struct.pack("B", checksum) - -def curses_main(stdscr): - curses.curs_set(0) - selected = 0 - - while True: - stdscr.clear() - h, w = stdscr.getmaxyx() - - stdscr.addstr(1, 2, "🛫 模式選單(使用 ↑↓ 選擇,Enter 發送,q 離開)") - - for i, (name, _) in enumerate(mode_list): - if i == selected: - stdscr.attron(curses.A_REVERSE) - stdscr.addstr(i + 3, 4, f"> {name}") - stdscr.attroff(curses.A_REVERSE) - else: - stdscr.addstr(i + 3, 4, f" {name}") - - key = stdscr.getch() - - if key == curses.KEY_UP: - selected = (selected - 1) % len(mode_list) - elif key == curses.KEY_DOWN: - selected = (selected + 1) % len(mode_list) - elif key in [10, 13]: # Enter - name, custom_mode = mode_list[selected] - capture = PacketCapture() - mav = mavlink2.MAVLink(capture, srcSystem=1, srcComponent=1) - mav.version = 2 - - msg = mav.command_long_encode( - target_system=target_system, - target_component=target_component, - command=MAV_CMD_DO_SET_MODE, - confirmation=0, - param1=1, - param2=custom_mode, - param3=0, param4=0, param5=0, param6=0, param7=0 - ) - print("🧪 msg =", msg) # 確認封包物件生成 - - mav.send(msg) # ✅ 改為 send() 會寫入 capture - print("📦 RAW HEX:", capture.data.hex()) - - api_frame = build_api_tx_frame(capture.data) - ser.write(api_frame) - - # 顯示封包資訊 - msg_line = min(h - 4, len(mode_list) + 5) - stdscr.addstr(msg_line, 2, f"✅ 發送模式切換:{name} ({custom_mode})") - stdscr.addstr(msg_line + 1, 2, f"📦 MAVLink HEX: {' '.join(f'{b:02x}' for b in capture.data)[:w-4]}") - stdscr.addstr(msg_line + 2, 2, f"📡 XBee API HEX: {' '.join(f'{b:02x}' for b in api_frame)[:w-4]}") - stdscr.refresh() - curses.napms(1500) - - elif key in [ord('q'), ord('Q')]: - break - - stdscr.refresh() - - -try: - curses.wrapper(lambda stdscr: curses_main(stdscr)) # 使用 lambda 函數來傳遞 ser - -except Exception as e: - print(f"❌ 發生錯誤: {e}") -finally: - ser.close() - print("👋 程式結束,串口已關閉") +import curses +import serial +import struct +from pymavlink.dialects.v20 import ardupilotmega as mavlink2 + +PORT = "COM5" # or "/dev/ttyUSB0" +BAUD = 57600 +target_system = 5 +target_component = 1 +MAV_CMD_DO_SET_MODE = 176 + +mode_list = [ + ("STABILIZE", 0), + ("AUTO", 3), + ("GUIDED", 4), + ("LOITER", 5) +] + +ser = serial.Serial(PORT, BAUD) + +class PacketCapture: + def __init__(self): + self.data = bytearray() + def write(self, b): + self.data.extend(b) + return len(b) + +def build_api_tx_frame(data: bytes, frame_id=0x01): + frame_type = 0x10 + dest_addr64 = b'\x00\x00\x00\x00\x00\x00\xFF\xFF' # 廣播 + dest_addr16 = b'\xFF\xFE' + broadcast_radius = 0x00 + options = 0x00 + + frame = struct.pack(">B", frame_type) + struct.pack(">B", frame_id) + frame += dest_addr64 + dest_addr16 + frame += struct.pack(">BB", broadcast_radius, options) + data + checksum = 0xFF - (sum(frame) & 0xFF) + return b'\x7E' + struct.pack(">H", len(frame)) + frame + struct.pack("B", checksum) + +def curses_main(stdscr): + curses.curs_set(0) + selected = 0 + + while True: + stdscr.clear() + h, w = stdscr.getmaxyx() + + stdscr.addstr(1, 2, "🛫 模式選單(使用 ↑↓ 選擇,Enter 發送,q 離開)") + + for i, (name, _) in enumerate(mode_list): + if i == selected: + stdscr.attron(curses.A_REVERSE) + stdscr.addstr(i + 3, 4, f"> {name}") + stdscr.attroff(curses.A_REVERSE) + else: + stdscr.addstr(i + 3, 4, f" {name}") + + key = stdscr.getch() + + if key == curses.KEY_UP: + selected = (selected - 1) % len(mode_list) + elif key == curses.KEY_DOWN: + selected = (selected + 1) % len(mode_list) + elif key in [10, 13]: # Enter + name, custom_mode = mode_list[selected] + capture = PacketCapture() + mav = mavlink2.MAVLink(capture, srcSystem=1, srcComponent=1) + mav.version = 2 + + msg = mav.command_long_encode( + target_system=target_system, + target_component=target_component, + command=MAV_CMD_DO_SET_MODE, + confirmation=0, + param1=1, + param2=custom_mode, + param3=0, param4=0, param5=0, param6=0, param7=0 + ) + print("🧪 msg =", msg) # 確認封包物件生成 + + mav.send(msg) # ✅ 改為 send() 會寫入 capture + print("📦 RAW HEX:", capture.data.hex()) + + api_frame = build_api_tx_frame(capture.data) + ser.write(api_frame) + + # 顯示封包資訊 + msg_line = min(h - 4, len(mode_list) + 5) + stdscr.addstr(msg_line, 2, f"✅ 發送模式切換:{name} ({custom_mode})") + stdscr.addstr(msg_line + 1, 2, f"📦 MAVLink HEX: {' '.join(f'{b:02x}' for b in capture.data)[:w-4]}") + stdscr.addstr(msg_line + 2, 2, f"📡 XBee API HEX: {' '.join(f'{b:02x}' for b in api_frame)[:w-4]}") + stdscr.refresh() + curses.napms(1500) + + elif key in [ord('q'), ord('Q')]: + break + + stdscr.refresh() + + +try: + curses.wrapper(lambda stdscr: curses_main(stdscr)) # 使用 lambda 函數來傳遞 ser + +except Exception as e: + print(f"❌ 發生錯誤: {e}") +finally: + ser.close() + print("👋 程式結束,串口已關閉") From 6c1441d0c614a600e9bab396c8f373f5bb2a05ea Mon Sep 17 00:00:00 2001 From: lenting1027 Date: Fri, 28 Mar 2025 11:25:16 +0800 Subject: [PATCH 05/12] Mavlink and XBee packet transfer --- src/unitdev04/change_mode.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/unitdev04/change_mode.py b/src/unitdev04/change_mode.py index 58d0023..4a71d5f 100644 --- a/src/unitdev04/change_mode.py +++ b/src/unitdev04/change_mode.py @@ -3,7 +3,7 @@ import serial import struct from pymavlink.dialects.v20 import ardupilotmega as mavlink2 -PORT = "COM5" # or "/dev/ttyUSB0" +PORT = "COM5" # or "/dev/ttyUSB0" BAUD = 57600 target_system = 5 target_component = 1 From cdf139f4e81380a8facc1326371dbeb1426c7d5a Mon Sep 17 00:00:00 2001 From: lenting1027 Date: Wed, 9 Apr 2025 14:20:29 +0800 Subject: [PATCH 06/12] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E3=80=8Csrc/unitdev04/?= =?UTF-8?q?change=5Fmode.py=E3=80=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/unitdev04/change_mode.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/unitdev04/change_mode.py b/src/unitdev04/change_mode.py index 4a71d5f..30106de 100644 --- a/src/unitdev04/change_mode.py +++ b/src/unitdev04/change_mode.py @@ -46,7 +46,7 @@ def curses_main(stdscr): stdscr.clear() h, w = stdscr.getmaxyx() - stdscr.addstr(1, 2, "🛫 模式選單(使用 ↑↓ 選擇,Enter 發送,q 離開)") + stdscr.addstr(1, 2, "模式選單(使用 ↑↓ 選擇,Enter 發送,q 離開)") for i, (name, _) in enumerate(mode_list): if i == selected: @@ -77,19 +77,19 @@ def curses_main(stdscr): param2=custom_mode, param3=0, param4=0, param5=0, param6=0, param7=0 ) - print("🧪 msg =", msg) # 確認封包物件生成 + print("msg =", msg) # 確認封包物件生成 - mav.send(msg) # ✅ 改為 send() 會寫入 capture - print("📦 RAW HEX:", capture.data.hex()) + mav.send(msg) # 改為 send() 會寫入 capture + print("RAW HEX:", capture.data.hex()) api_frame = build_api_tx_frame(capture.data) ser.write(api_frame) # 顯示封包資訊 msg_line = min(h - 4, len(mode_list) + 5) - stdscr.addstr(msg_line, 2, f"✅ 發送模式切換:{name} ({custom_mode})") - stdscr.addstr(msg_line + 1, 2, f"📦 MAVLink HEX: {' '.join(f'{b:02x}' for b in capture.data)[:w-4]}") - stdscr.addstr(msg_line + 2, 2, f"📡 XBee API HEX: {' '.join(f'{b:02x}' for b in api_frame)[:w-4]}") + stdscr.addstr(msg_line, 2, f"發送模式切換:{name} ({custom_mode})") + stdscr.addstr(msg_line + 1, 2, f"MAVLink HEX: {' '.join(f'{b:02x}' for b in capture.data)[:w-4]}") + stdscr.addstr(msg_line + 2, 2, f"XBee API HEX: {' '.join(f'{b:02x}' for b in api_frame)[:w-4]}") stdscr.refresh() curses.napms(1500) @@ -103,7 +103,7 @@ try: curses.wrapper(lambda stdscr: curses_main(stdscr)) # 使用 lambda 函數來傳遞 ser except Exception as e: - print(f"❌ 發生錯誤: {e}") + print(f"發生錯誤: {e}") finally: ser.close() - print("👋 程式結束,串口已關閉") + print("程式結束,串口已關閉") From e4919cfe782608fc72cf82c8b835ccacd0b83c2c Mon Sep 17 00:00:00 2001 From: lenting1027 Date: Tue, 15 Apr 2025 00:39:19 +0800 Subject: [PATCH 07/12] =?UTF-8?q?XBee=E5=B0=81=E5=8C=85=E8=BD=89=E6=8F=9B(?= =?UTF-8?q?change=20mode)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/unitdev04/change_mode.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/unitdev04/change_mode.py b/src/unitdev04/change_mode.py index 30106de..53c96f3 100644 --- a/src/unitdev04/change_mode.py +++ b/src/unitdev04/change_mode.py @@ -46,7 +46,7 @@ def curses_main(stdscr): stdscr.clear() h, w = stdscr.getmaxyx() - stdscr.addstr(1, 2, "模式選單(使用 ↑↓ 選擇,Enter 發送,q 離開)") + stdscr.addstr(1, 2, "模式選單(使用:箭頭選擇,Enter:發送,q:離開)") for i, (name, _) in enumerate(mode_list): if i == selected: From d312f644c89b2c392f7d969b703d39271bfde05c Mon Sep 17 00:00:00 2001 From: lenting1027 Date: Tue, 15 Apr 2025 00:40:12 +0800 Subject: [PATCH 08/12] =?UTF-8?q?XBee=E8=A7=A3=E8=AE=80heartbeat=E8=B3=87?= =?UTF-8?q?=E8=A8=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/unitdev04/receive.py | 60 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 src/unitdev04/receive.py diff --git a/src/unitdev04/receive.py b/src/unitdev04/receive.py new file mode 100644 index 0000000..9136d3c --- /dev/null +++ b/src/unitdev04/receive.py @@ -0,0 +1,60 @@ +from xbee import XBee +import serial +from pymavlink import mavutil +import time + +# 配置 XBee 串口連接 +#ser = serial.Serial('COM5', 57600) # XBee 串口 + + +# 無人機系統 ID(假設為 5)和目標系統 ID(假設為 1) +system_id = 5 +target_system_id = 1 # 設定目標系統 ID,這裡假設目標系統 ID 是 1 + +# 目標設備的 64 位地址(請替換為實際的無人機地址) +target_address = b'\x00\x13\xa2\x00\x40\x5f\x88\x56' # 例如:00 13 A2 00 40 5F 88 56 + +def decode_mavlink_data(data,master): + """解碼 MAVLink 的原始數據並處理 HEARTBEAT 訊息""" + + try: + msg = master.parse_char(data) + if msg: + if msg.get_type() == "HEARTBEAT": + print(f"Raw MAVLink Data (Hex): {data.hex()}") + print(f"Received MAVLink message: {msg}") + print(f"System status: {msg.system_status}") + print(f"Flight mode: {mavutil.mode_string_v10(msg)}") + print(f"System ID: {msg.get_srcSystem()}") # 使用 get_srcSystem() 獲取 system_id + except Exception as e: + print(f"Failed to decode MAVLink data: {e}") + +def receive_packets(ser): + xbee = XBee(ser) + # 創建 MAVLink 解析器並與 XBee 串口連接 + master = mavutil.mavlink.MAVLink(ser) + + while True: + try: + # 從 XBee 接收數據 + xbee_data = xbee.wait_read_frame() + + # 讀取 `rf_data` 而非 `payload` + raw_data = xbee_data.get('rf_data', None) + if raw_data is None: + print("Warning: No 'rf_data' found in received XBee data!") + continue # 跳過此次循環 + + # 解碼 MAVLink 訊息 + decode_mavlink_data(raw_data,master) + + # 根據需要觸發模式切換,例如根據用戶輸入更改模式 + + + except KeyboardInterrupt: + print("Exiting...") + break + except Exception as e: + print(f"Error: {e}") + + time.sleep(0.1) From 5f73324a34d01f012e326ab7921bd201512b5cff Mon Sep 17 00:00:00 2001 From: lenting1027 Date: Tue, 15 Apr 2025 00:42:11 +0800 Subject: [PATCH 09/12] =?UTF-8?q?API=20XBee=E5=82=B3=E9=80=81=E5=AD=97?= =?UTF-8?q?=E4=B8=B2=E8=A8=8A=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/unitdev04/coordinator_api.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/unitdev04/coordinator_api.py b/src/unitdev04/coordinator_api.py index a4c98bf..e29f0a3 100644 --- a/src/unitdev04/coordinator_api.py +++ b/src/unitdev04/coordinator_api.py @@ -35,7 +35,6 @@ def send_messages(): # Start the message sending thread send_thread = threading.Thread(target=send_messages, daemon=True) send_thread.start() - print("Broadcast chat mode activated. Type a message and press Enter to send.\n") # Keep the program running From f465b44b795a74a3b911a64207aa84b8e9ba27ef Mon Sep 17 00:00:00 2001 From: lenting1027 Date: Tue, 15 Apr 2025 00:43:03 +0800 Subject: [PATCH 10/12] =?UTF-8?q?API=20XBee=E5=82=B3=E9=80=81=E4=B8=A6?= =?UTF-8?q?=E6=8E=A5=E6=94=B6=E5=AD=97=E4=B8=B2=E8=A8=8A=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/unitdev04/coordinator_api.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/unitdev04/coordinator_api.py b/src/unitdev04/coordinator_api.py index e29f0a3..a4c98bf 100644 --- a/src/unitdev04/coordinator_api.py +++ b/src/unitdev04/coordinator_api.py @@ -35,6 +35,7 @@ def send_messages(): # Start the message sending thread send_thread = threading.Thread(target=send_messages, daemon=True) send_thread.start() + print("Broadcast chat mode activated. Type a message and press Enter to send.\n") # Keep the program running From 7073eaf3e6cf62b9aadd5733107ed11951efed38 Mon Sep 17 00:00:00 2001 From: lenting1027 Date: Tue, 15 Apr 2025 00:43:58 +0800 Subject: [PATCH 11/12] =?UTF-8?q?AT=20XBee=E5=82=B3=E9=80=81=E4=B8=A6?= =?UTF-8?q?=E6=8E=A5=E6=94=B6=E5=AD=97=E4=B8=B2=E8=A8=8A=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/unitdev04/endpoint_at.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/unitdev04/endpoint_at.py b/src/unitdev04/endpoint_at.py index b6e0bfb..21c53f4 100644 --- a/src/unitdev04/endpoint_at.py +++ b/src/unitdev04/endpoint_at.py @@ -38,4 +38,4 @@ try: pass except KeyboardInterrupt: print("\nProgram terminated.") - ser.close() + ser.close() \ No newline at end of file From b1109ad10200a017a9f892db96fe274b34164f0a Mon Sep 17 00:00:00 2001 From: lenting1027 Date: Tue, 15 Apr 2025 10:20:09 +0800 Subject: [PATCH 12/12] =?UTF-8?q?XBee=E8=A7=A3=E8=AE=80heartbeat=E8=B3=87?= =?UTF-8?q?=E8=A8=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/unitdev04/receive.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/unitdev04/receive.py b/src/unitdev04/receive.py index 9136d3c..eab6436 100644 --- a/src/unitdev04/receive.py +++ b/src/unitdev04/receive.py @@ -4,7 +4,7 @@ from pymavlink import mavutil import time # 配置 XBee 串口連接 -#ser = serial.Serial('COM5', 57600) # XBee 串口 +ser = serial.Serial('COM5', 57600) # XBee 串口 # 無人機系統 ID(假設為 5)和目標系統 ID(假設為 1)