sdev 0.3.6__tar.gz → 0.4.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- sdev-0.4.0/PKG-INFO +119 -0
- sdev-0.4.0/README.md +85 -0
- {sdev-0.3.6 → sdev-0.4.0}/pyproject.toml +6 -2
- sdev-0.4.0/sdev/__init__.py +40 -0
- sdev-0.4.0/sdev/class_wrapper.py +67 -0
- sdev-0.4.0/sdev/cli_wrapper.py +141 -0
- sdev-0.4.0/sdev/core.py +315 -0
- sdev-0.4.0/sdev/demoboard/__init__.py +10 -0
- sdev-0.4.0/sdev/demoboard/functional.py +142 -0
- sdev-0.4.0/sdev/relay/__init__.py +8 -0
- sdev-0.4.0/sdev/relay/functional.py +16 -0
- sdev-0.4.0/sdev.egg-info/PKG-INFO +119 -0
- {sdev-0.3.6 → sdev-0.4.0}/sdev.egg-info/SOURCES.txt +6 -1
- {sdev-0.3.6 → sdev-0.4.0}/setup.py +1 -1
- sdev-0.3.6/PKG-INFO +0 -103
- sdev-0.3.6/README.md +0 -69
- sdev-0.3.6/sdev/__init__.py +0 -13
- sdev-0.3.6/sdev/cli_wrapper.py +0 -81
- sdev-0.3.6/sdev/core.py +0 -309
- sdev-0.3.6/sdev.egg-info/PKG-INFO +0 -103
- {sdev-0.3.6 → sdev-0.4.0}/LICENSE +0 -0
- {sdev-0.3.6 → sdev-0.4.0}/MANIFEST.in +0 -0
- {sdev-0.3.6 → sdev-0.4.0}/sdev.egg-info/dependency_links.txt +0 -0
- {sdev-0.3.6 → sdev-0.4.0}/sdev.egg-info/entry_points.txt +0 -0
- {sdev-0.3.6 → sdev-0.4.0}/sdev.egg-info/requires.txt +0 -0
- {sdev-0.3.6 → sdev-0.4.0}/sdev.egg-info/top_level.txt +0 -0
- {sdev-0.3.6 → sdev-0.4.0}/setup.cfg +0 -0
sdev-0.4.0/PKG-INFO
ADDED
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: sdev
|
|
3
|
+
Version: 0.4.0
|
|
4
|
+
Summary: 串口控制器工具包
|
|
5
|
+
Home-page: https://github.com/klrc/sdev
|
|
6
|
+
Author: klrc
|
|
7
|
+
Author-email: klrc <144069824@qq.com>
|
|
8
|
+
License: MIT
|
|
9
|
+
Project-URL: Homepage, https://github.com/klrc/sdev
|
|
10
|
+
Project-URL: Repository, https://github.com/klrc/sdev
|
|
11
|
+
Project-URL: Bug Tracker, https://github.com/klrc/sdev/issues
|
|
12
|
+
Keywords: serial,controller,hardware,embedded
|
|
13
|
+
Classifier: Development Status :: 3 - Alpha
|
|
14
|
+
Classifier: Intended Audience :: Developers
|
|
15
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
16
|
+
Classifier: Operating System :: OS Independent
|
|
17
|
+
Classifier: Programming Language :: Python :: 3
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.7
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.8
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
23
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
24
|
+
Classifier: Topic :: System :: Hardware
|
|
25
|
+
Requires-Python: >=3.7
|
|
26
|
+
Description-Content-Type: text/markdown
|
|
27
|
+
License-File: LICENSE
|
|
28
|
+
Requires-Dist: pyserial>=3.5
|
|
29
|
+
Requires-Dist: loguru>=0.6.0
|
|
30
|
+
Dynamic: author
|
|
31
|
+
Dynamic: home-page
|
|
32
|
+
Dynamic: license-file
|
|
33
|
+
Dynamic: requires-python
|
|
34
|
+
|
|
35
|
+
# SDEV
|
|
36
|
+
|
|
37
|
+
串口控制器工具包:后台按行读缓冲、按 flag 扫描与回显着色、执行命令、存活检测。
|
|
38
|
+
|
|
39
|
+
**注意**:同一串口同一时间只能被一个 sdev 进程使用。系统会自动处理跨进程锁,后来的进程会阻塞等待。
|
|
40
|
+
|
|
41
|
+
## 安装
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
pip install sdev
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## 命令行用法
|
|
48
|
+
|
|
49
|
+
安装后可使用 `sdev` 命令。默认会执行存活检测(check_alive)。
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
# 执行单条命令并回显
|
|
53
|
+
sdev shell "lsmod | grep -E 'mmz|nnp|vdsp'"
|
|
54
|
+
|
|
55
|
+
# 指定串口和波特率
|
|
56
|
+
sdev -p /dev/ttyUSB1 -b 115200 shell "ls"
|
|
57
|
+
|
|
58
|
+
# 跳过存活检测执行命令
|
|
59
|
+
sdev --no-check-alive shell "echo hello"
|
|
60
|
+
|
|
61
|
+
# 检查本机所有串口状态
|
|
62
|
+
sdev demoboard status
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
- `-p` / `--port`:串口路径(默认取环境变量 `SDEV_PORT` 或 `/dev/ttyUSB0`)
|
|
66
|
+
- `-b` / `--baudrate`:波特率(默认取 `SDEV_BAUDRATE` 或 `115200`)
|
|
67
|
+
- `--flag`:提示符结束标志(默认 `" #"`)
|
|
68
|
+
- `--timeout`:等待输出超时秒数
|
|
69
|
+
|
|
70
|
+
## Python API 使用
|
|
71
|
+
|
|
72
|
+
推荐使用 `sdev()` 工厂函数或 `Demoboard` 类,它们提供了更高层的封装。
|
|
73
|
+
|
|
74
|
+
### 推荐做法
|
|
75
|
+
|
|
76
|
+
```python
|
|
77
|
+
from sdev import sdev
|
|
78
|
+
|
|
79
|
+
# 使用上下文管理器,自动处理 connect() / disconnect()
|
|
80
|
+
with sdev("/dev/ttyUSB0", 115200) as board:
|
|
81
|
+
# 默认 connect 时会阻塞直到拿到串口锁
|
|
82
|
+
# 执行命令,返回输出行列表
|
|
83
|
+
output = board.shell("ls")
|
|
84
|
+
print(output)
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### 存活检测
|
|
88
|
+
|
|
89
|
+
`Demoboard.check_alive()` 能够处理设备处于 U-Boot、内核启动中或已进入 Shell 的各种状态:
|
|
90
|
+
|
|
91
|
+
```python
|
|
92
|
+
with sdev("/dev/ttyUSB0") as board:
|
|
93
|
+
# 自动识别 U-Boot 并执行 reboot,直到进入 Shell
|
|
94
|
+
board.check_alive()
|
|
95
|
+
board.shell("cat /proc/version")
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### 核心 API 说明
|
|
99
|
+
|
|
100
|
+
| 类/方法 | 说明 |
|
|
101
|
+
|-------------|------|
|
|
102
|
+
| `sdev(port, baudrate, device_type="demoboard")` | 工厂函数,返回设备实例(Demoboard 或 Relay) |
|
|
103
|
+
| `Demoboard.shell(cmd, prompt_flag=" #", timeout=None, stream=False)` | 执行命令。`stream=True` 时返回 generator |
|
|
104
|
+
| `Demoboard.check_alive(...)` | 综合检查存活状态,支持 U-Boot 自动重启和等待唤醒 |
|
|
105
|
+
| `SerialDevice.send(text)` | 底层接口:发送一行(自动加换行) |
|
|
106
|
+
| `SerialDevice.scan(end_flag, timeout)` | 底层接口:从缓冲中读取直到匹配 flag |
|
|
107
|
+
|
|
108
|
+
## 特色
|
|
109
|
+
|
|
110
|
+
- **回显着色**:匹配到 flag 的行为绿色,命令回显行为青色,其余灰色。
|
|
111
|
+
- **拼行匹配**:设备折行时会自动拼接多行进行 flag 匹配,提高成功率。
|
|
112
|
+
- **跨进程互斥**:基于文件锁,确保多进程安全访问串口。
|
|
113
|
+
- **异步读取**:后台线程实时消费串口数据,避免缓冲区溢出丢失数据。
|
|
114
|
+
|
|
115
|
+
## 依赖
|
|
116
|
+
|
|
117
|
+
- Python >= 3.7
|
|
118
|
+
- pyserial >= 3.5
|
|
119
|
+
- loguru >= 0.6.0
|
sdev-0.4.0/README.md
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# SDEV
|
|
2
|
+
|
|
3
|
+
串口控制器工具包:后台按行读缓冲、按 flag 扫描与回显着色、执行命令、存活检测。
|
|
4
|
+
|
|
5
|
+
**注意**:同一串口同一时间只能被一个 sdev 进程使用。系统会自动处理跨进程锁,后来的进程会阻塞等待。
|
|
6
|
+
|
|
7
|
+
## 安装
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
pip install sdev
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## 命令行用法
|
|
14
|
+
|
|
15
|
+
安装后可使用 `sdev` 命令。默认会执行存活检测(check_alive)。
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
# 执行单条命令并回显
|
|
19
|
+
sdev shell "lsmod | grep -E 'mmz|nnp|vdsp'"
|
|
20
|
+
|
|
21
|
+
# 指定串口和波特率
|
|
22
|
+
sdev -p /dev/ttyUSB1 -b 115200 shell "ls"
|
|
23
|
+
|
|
24
|
+
# 跳过存活检测执行命令
|
|
25
|
+
sdev --no-check-alive shell "echo hello"
|
|
26
|
+
|
|
27
|
+
# 检查本机所有串口状态
|
|
28
|
+
sdev demoboard status
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
- `-p` / `--port`:串口路径(默认取环境变量 `SDEV_PORT` 或 `/dev/ttyUSB0`)
|
|
32
|
+
- `-b` / `--baudrate`:波特率(默认取 `SDEV_BAUDRATE` 或 `115200`)
|
|
33
|
+
- `--flag`:提示符结束标志(默认 `" #"`)
|
|
34
|
+
- `--timeout`:等待输出超时秒数
|
|
35
|
+
|
|
36
|
+
## Python API 使用
|
|
37
|
+
|
|
38
|
+
推荐使用 `sdev()` 工厂函数或 `Demoboard` 类,它们提供了更高层的封装。
|
|
39
|
+
|
|
40
|
+
### 推荐做法
|
|
41
|
+
|
|
42
|
+
```python
|
|
43
|
+
from sdev import sdev
|
|
44
|
+
|
|
45
|
+
# 使用上下文管理器,自动处理 connect() / disconnect()
|
|
46
|
+
with sdev("/dev/ttyUSB0", 115200) as board:
|
|
47
|
+
# 默认 connect 时会阻塞直到拿到串口锁
|
|
48
|
+
# 执行命令,返回输出行列表
|
|
49
|
+
output = board.shell("ls")
|
|
50
|
+
print(output)
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### 存活检测
|
|
54
|
+
|
|
55
|
+
`Demoboard.check_alive()` 能够处理设备处于 U-Boot、内核启动中或已进入 Shell 的各种状态:
|
|
56
|
+
|
|
57
|
+
```python
|
|
58
|
+
with sdev("/dev/ttyUSB0") as board:
|
|
59
|
+
# 自动识别 U-Boot 并执行 reboot,直到进入 Shell
|
|
60
|
+
board.check_alive()
|
|
61
|
+
board.shell("cat /proc/version")
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### 核心 API 说明
|
|
65
|
+
|
|
66
|
+
| 类/方法 | 说明 |
|
|
67
|
+
|-------------|------|
|
|
68
|
+
| `sdev(port, baudrate, device_type="demoboard")` | 工厂函数,返回设备实例(Demoboard 或 Relay) |
|
|
69
|
+
| `Demoboard.shell(cmd, prompt_flag=" #", timeout=None, stream=False)` | 执行命令。`stream=True` 时返回 generator |
|
|
70
|
+
| `Demoboard.check_alive(...)` | 综合检查存活状态,支持 U-Boot 自动重启和等待唤醒 |
|
|
71
|
+
| `SerialDevice.send(text)` | 底层接口:发送一行(自动加换行) |
|
|
72
|
+
| `SerialDevice.scan(end_flag, timeout)` | 底层接口:从缓冲中读取直到匹配 flag |
|
|
73
|
+
|
|
74
|
+
## 特色
|
|
75
|
+
|
|
76
|
+
- **回显着色**:匹配到 flag 的行为绿色,命令回显行为青色,其余灰色。
|
|
77
|
+
- **拼行匹配**:设备折行时会自动拼接多行进行 flag 匹配,提高成功率。
|
|
78
|
+
- **跨进程互斥**:基于文件锁,确保多进程安全访问串口。
|
|
79
|
+
- **异步读取**:后台线程实时消费串口数据,避免缓冲区溢出丢失数据。
|
|
80
|
+
|
|
81
|
+
## 依赖
|
|
82
|
+
|
|
83
|
+
- Python >= 3.7
|
|
84
|
+
- pyserial >= 3.5
|
|
85
|
+
- loguru >= 0.6.0
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "sdev"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.4.0"
|
|
8
8
|
description = "串口控制器工具包"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = {text = "MIT"}
|
|
@@ -38,4 +38,8 @@ sdev = "sdev.cli_wrapper:main"
|
|
|
38
38
|
[project.urls]
|
|
39
39
|
Homepage = "https://github.com/klrc/sdev"
|
|
40
40
|
Repository = "https://github.com/klrc/sdev"
|
|
41
|
-
"Bug Tracker" = "https://github.com/klrc/sdev/issues"
|
|
41
|
+
"Bug Tracker" = "https://github.com/klrc/sdev/issues"
|
|
42
|
+
|
|
43
|
+
[tool.ruff.lint]
|
|
44
|
+
# 注释里使用中文逗号等全角标点不报错
|
|
45
|
+
ignore = ["RUF003"]
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"""
|
|
2
|
+
SDEV - 串口控制器工具包
|
|
3
|
+
|
|
4
|
+
- SerialDevice:底层串口基础类(连接、后台异步读、send/scan/display/clear);
|
|
5
|
+
- Demoboard / Relay:面向对象封装;
|
|
6
|
+
- sdev() 工厂方法:快速构建设备实例;
|
|
7
|
+
- sdev.demoboard:Demoboard 相关函数式 API(shell, check_alive)。
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
from typing import Literal
|
|
13
|
+
|
|
14
|
+
from .core import SerialDevice
|
|
15
|
+
from .class_wrapper import Demoboard, Relay
|
|
16
|
+
|
|
17
|
+
__version__ = "0.4.0"
|
|
18
|
+
__author__ = "klrc"
|
|
19
|
+
__email__ = "1440698245@qq.com"
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def sdev(
|
|
23
|
+
port: str,
|
|
24
|
+
baudrate: int = 115200,
|
|
25
|
+
*,
|
|
26
|
+
device_type: Literal["demoboard", "relay"] = "demoboard",
|
|
27
|
+
):
|
|
28
|
+
"""
|
|
29
|
+
构造一个设备实例。
|
|
30
|
+
|
|
31
|
+
默认返回 Demoboard,后续可根据需要扩展其它类型。
|
|
32
|
+
"""
|
|
33
|
+
if device_type == "demoboard":
|
|
34
|
+
return Demoboard(port, baudrate)
|
|
35
|
+
if device_type == "relay":
|
|
36
|
+
return Relay(port, baudrate)
|
|
37
|
+
raise ValueError(f"unsupported device_type: {device_type!r}")
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
__all__ = ["SerialDevice", "Demoboard", "Relay", "sdev"]
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"""
|
|
2
|
+
面向对象封装:
|
|
3
|
+
|
|
4
|
+
- Demoboard:继承 SerialDevice,并把 demoboard.functional 里的函数挂成方法;
|
|
5
|
+
- Relay:占位类,后续扩展继电器相关串口控制。
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
from typing import Optional
|
|
11
|
+
|
|
12
|
+
from .core import SerialDevice
|
|
13
|
+
from .demoboard import check_alive as _check_alive_func
|
|
14
|
+
from .demoboard import shell as _shell_func
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class Demoboard(SerialDevice):
|
|
18
|
+
"""
|
|
19
|
+
Demoboard 设备:
|
|
20
|
+
- 保留 SerialDevice 的所有底层能力;
|
|
21
|
+
- 提供 shell() / check_alive() 等高层方法。
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
def shell(
|
|
25
|
+
self,
|
|
26
|
+
cmd: str,
|
|
27
|
+
*,
|
|
28
|
+
prompt_flag: str = " #",
|
|
29
|
+
timeout: Optional[float] = None,
|
|
30
|
+
stream: bool = False,
|
|
31
|
+
):
|
|
32
|
+
return _shell_func(self, cmd, prompt_flag=prompt_flag, timeout=timeout, stream=stream)
|
|
33
|
+
|
|
34
|
+
def check_alive(
|
|
35
|
+
self,
|
|
36
|
+
*,
|
|
37
|
+
uboot_flag: str = "uboot#",
|
|
38
|
+
awaken_flag: str = "Process",
|
|
39
|
+
prompt_flag: str = " #",
|
|
40
|
+
ctrl_c_timeout: float = 5.0,
|
|
41
|
+
reboot_timeout: float = 120.0,
|
|
42
|
+
prompt_timeout: float = 60.0,
|
|
43
|
+
) -> None:
|
|
44
|
+
_check_alive_func(
|
|
45
|
+
self,
|
|
46
|
+
uboot_flag=uboot_flag,
|
|
47
|
+
awaken_flag=awaken_flag,
|
|
48
|
+
prompt_flag=prompt_flag,
|
|
49
|
+
ctrl_c_timeout=ctrl_c_timeout,
|
|
50
|
+
reboot_timeout=reboot_timeout,
|
|
51
|
+
prompt_timeout=prompt_timeout,
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
class Relay(SerialDevice):
|
|
56
|
+
"""
|
|
57
|
+
继电器设备占位类:
|
|
58
|
+
- 继承 SerialDevice;
|
|
59
|
+
- 具体继电器控制逻辑后续在 sdev.relay.functional 中补充。
|
|
60
|
+
"""
|
|
61
|
+
|
|
62
|
+
# 先占位,避免 API 变动;后续按需要扩展方法。
|
|
63
|
+
pass
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
__all__ = ["Demoboard", "Relay"]
|
|
67
|
+
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
"""
|
|
2
|
+
命令行入口:
|
|
3
|
+
|
|
4
|
+
- sdev shell "cmd":在串口设备上执行单条命令并回显输出;
|
|
5
|
+
- sdev demoboard status:枚举本机串口并通过 check_alive 检查是否存活。
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import argparse
|
|
11
|
+
import os
|
|
12
|
+
import sys
|
|
13
|
+
from typing import List
|
|
14
|
+
|
|
15
|
+
from serial.tools import list_ports
|
|
16
|
+
|
|
17
|
+
from .class_wrapper import Demoboard
|
|
18
|
+
from .demoboard.functional import check_alive as demoboard_check_alive
|
|
19
|
+
from .demoboard.functional import shell as demoboard_shell
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def _get_default_port() -> str:
|
|
23
|
+
return os.environ.get("SDEV_PORT", "/dev/ttyUSB0")
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def _get_default_baudrate() -> int:
|
|
27
|
+
try:
|
|
28
|
+
return int(os.environ.get("SDEV_BAUDRATE", "115200"))
|
|
29
|
+
except ValueError:
|
|
30
|
+
return 115200
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def _list_serial_ports() -> List[str]:
|
|
34
|
+
"""跨平台列出本机可用串口设备路径。"""
|
|
35
|
+
ports = [info.device for info in list_ports.comports()]
|
|
36
|
+
return sorted(ports)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def cmd_shell(args: argparse.Namespace) -> int:
|
|
40
|
+
port = args.port or _get_default_port()
|
|
41
|
+
baudrate = args.baudrate or _get_default_baudrate()
|
|
42
|
+
with Demoboard(port, baudrate) as board:
|
|
43
|
+
try:
|
|
44
|
+
if not args.no_check_alive:
|
|
45
|
+
demoboard_check_alive(board)
|
|
46
|
+
demoboard_shell(board, args.command, prompt_flag=args.flag, timeout=args.timeout)
|
|
47
|
+
except TimeoutError as e:
|
|
48
|
+
print(e, file=sys.stderr)
|
|
49
|
+
return 1
|
|
50
|
+
return 0
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def cmd_demoboard_status(args: argparse.Namespace) -> int: # noqa: ARG001
|
|
54
|
+
"""
|
|
55
|
+
sdev demoboard status
|
|
56
|
+
|
|
57
|
+
通过 check_alive 检查本机所有串口是否「alive」。
|
|
58
|
+
"""
|
|
59
|
+
GREEN = "\033[32m"
|
|
60
|
+
RED = "\033[31m"
|
|
61
|
+
RESET = "\033[0m"
|
|
62
|
+
|
|
63
|
+
baudrate = _get_default_baudrate()
|
|
64
|
+
ports = _list_serial_ports()
|
|
65
|
+
if not ports:
|
|
66
|
+
print("no serial ports found")
|
|
67
|
+
return 0
|
|
68
|
+
|
|
69
|
+
for port in ports:
|
|
70
|
+
try:
|
|
71
|
+
with Demoboard(port, baudrate) as board:
|
|
72
|
+
# 使用较短的超时时间,避免 status 长时间卡死
|
|
73
|
+
demoboard_check_alive(
|
|
74
|
+
board,
|
|
75
|
+
ctrl_c_timeout=2.0,
|
|
76
|
+
reboot_timeout=30.0,
|
|
77
|
+
prompt_timeout=10.0,
|
|
78
|
+
)
|
|
79
|
+
print(f"{GREEN}{port} alive{RESET}")
|
|
80
|
+
except Exception: # noqa: BLE001
|
|
81
|
+
print(f"{RED}{port} not connected{RESET}")
|
|
82
|
+
return 0
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def main() -> int:
|
|
86
|
+
parser = argparse.ArgumentParser(
|
|
87
|
+
prog="sdev",
|
|
88
|
+
description="串口开发板控制器:在串口设备上执行命令或检查状态。",
|
|
89
|
+
)
|
|
90
|
+
parser.add_argument(
|
|
91
|
+
"-p",
|
|
92
|
+
"--port",
|
|
93
|
+
default=None,
|
|
94
|
+
help="串口路径(默认: SDEV_PORT 或 /dev/ttyUSB0)",
|
|
95
|
+
)
|
|
96
|
+
parser.add_argument(
|
|
97
|
+
"-b",
|
|
98
|
+
"--baudrate",
|
|
99
|
+
type=int,
|
|
100
|
+
default=None,
|
|
101
|
+
help="波特率(默认: SDEV_BAUDRATE 或 115200)",
|
|
102
|
+
)
|
|
103
|
+
subparsers = parser.add_subparsers(dest="subcommand", required=True)
|
|
104
|
+
|
|
105
|
+
# sdev shell "cmd"
|
|
106
|
+
shell_parser = subparsers.add_parser("shell", help="在板子上执行单条命令并回显输出")
|
|
107
|
+
shell_parser.add_argument(
|
|
108
|
+
"command",
|
|
109
|
+
help='要执行的命令,如: ls 或 "lsmod | grep nnp"',
|
|
110
|
+
)
|
|
111
|
+
shell_parser.add_argument(
|
|
112
|
+
"--flag",
|
|
113
|
+
default=" #",
|
|
114
|
+
help="提示符结束标志(默认: %(default)r)",
|
|
115
|
+
)
|
|
116
|
+
shell_parser.add_argument(
|
|
117
|
+
"--timeout",
|
|
118
|
+
type=float,
|
|
119
|
+
default=None,
|
|
120
|
+
help="等待命令输出的超时秒数",
|
|
121
|
+
)
|
|
122
|
+
shell_parser.add_argument(
|
|
123
|
+
"--no-check-alive",
|
|
124
|
+
action="store_true",
|
|
125
|
+
help="connect 后不执行 check_alive",
|
|
126
|
+
)
|
|
127
|
+
shell_parser.set_defaults(func=cmd_shell)
|
|
128
|
+
|
|
129
|
+
# sdev demoboard status
|
|
130
|
+
demoboard_parser = subparsers.add_parser("demoboard", help="Demoboard 相关操作")
|
|
131
|
+
demoboard_subparsers = demoboard_parser.add_subparsers(dest="demoboard_subcommand", required=True)
|
|
132
|
+
|
|
133
|
+
status_parser = demoboard_subparsers.add_parser("status", help="检查本机关联的 Demoboard 串口状态")
|
|
134
|
+
status_parser.set_defaults(func=cmd_demoboard_status)
|
|
135
|
+
|
|
136
|
+
parsed = parser.parse_args()
|
|
137
|
+
return parsed.func(parsed)
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
if __name__ == "__main__":
|
|
141
|
+
sys.exit(main())
|