# QSJNIC 项目 Logcat 日志参考

## 总体约定
- 所有 Java 模块使用 `android.util.Log`（Log.d/i/w/e）
- TAG 定义为 `private static final String TAG = "...";`
- Service/SDK 的 TAG 使用类名
- Demo/测试应用的 TAG 使用模块名

---

## 1. Service (com.qsjnic.mcu.service)

**applicationId**: `com.qsjnic.mcu.service`（debug: `com.qsjnic.mcu.service.dev`）
**TAG 列表**: QsMcuSystemService, McuLink, FrameRouter, McuBinder, QsMcuBootReceiver, QsMcuDevTrigger, UpgradeManager, VehicleFeature, RadioFeature, KeyFeature

**logcat 命令**:
```bash
# 按 TAG 过滤常用 Service TAG
adb logcat -s QsMcuSystemService:D McuLink:D FrameRouter:D McuBinder:D QsMcuBootReceiver:D QsMcuDevTrigger:D UpgradeManager:D VehicleFeature:D RadioFeature:D KeyFeature:D

# 按进程 PID 过滤（推荐，最全）
adb logcat --pid=$(adb shell pidof -s com.qsjnic.mcu.service)
```

**示例代码**:
```java
// QsMcuSystemService.java
private static final String TAG = "QsMcuSystemService";
Log.i(TAG, "onCreate pid=" + Process.myPid() + " uid=" + Process.myUid());
Log.w(TAG, "Serial open failed, retrying in " + delay + "ms (attempt=" + attempt + ")");

// McuLink.java
private static final String TAG = "McuLink";
Log.i(TAG, "libmcujni.so loaded");
Log.e(TAG, "open(" + portPath + "," + baudRate + ") FAILED rc=" + rc);

// FrameRouter.java
private static final String TAG = "FrameRouter";
Log.i(TAG, String.format("KEY value=0x%02X status=0x%02X", p[0] & 0xFF, p[1] & 0xFF));
Log.i(TAG, String.format("RADIO_FREQ %s %d%s signal=%d", band == 0 ? "FM" : "AM", freq, band == 0 ? "(*100KHz)" : "KHz", signal));
```

---

## 2. SDK (com.qsjnic.mcu.sdk，库模块不打APK)

**namespace**: `com.qsjnic.mcu.sdk`
**TAG 列表**: McuClient, McuRadioClient, McuKeyClient, McuVehicleClient, McuUpgradeClient

**logcat 命令**（SDK 日志出现在调用方进程）:
```bash
# 按 TAG
adb logcat -s McuClient:D McuRadioClient:D McuKeyClient:D McuVehicleClient:D McuUpgradeClient:D

# 只过滤某 Demo 进程的 SDK 日志
adb logcat --pid=$(adb shell pidof -s com.qsjnic.demo.radio) -s McuClient:D McuRadioClient:D
```

**示例代码**:
```java
// McuClient.java
private static final String TAG = "McuClient";
Log.i(TAG, "onServiceConnected " + name);
Log.w(TAG, "sendCommand mt=0x%02X cmd=0x%02X — service not bound", msgType, cmd);
Log.i(TAG, "sendCommand mt=0x%02X cmd=0x%02X bodyLen=%d -> rc=%d", msgType, cmd, bodyLen, rc);

// McuKeyClient.java
private static final String TAG = "McuKeyClient";
Log.i(TAG, "registered key listener with Service");
```

---

## 3. radio-demo (com.qsjnic.demo.radio)

**applicationId**: `com.qsjnic.demo.radio`
**TAG**: RadioDemo

**logcat 命令**:
```bash
adb logcat -s RadioDemo:I
adb logcat --pid=$(adb shell pidof -s com.qsjnic.demo.radio)
```

**示例代码**:
```java
private static final String TAG = "RadioDemo";
Log.i(TAG, "onFreqChanged band=" + s.band + " freq=" + s.freq + " signal=" + s.signal);
Log.i(TAG, "SWC keyValue=0x" + Integer.toHexString(keyValue) + " (" + name + ") status=" + keyStatus);
```

---

## 4. vehicle-demo (com.qsjnic.demo.vehicle)

**applicationId**: `com.qsjnic.demo.vehicle`
**TAG**: VehicleDemo

**logcat 命令**:
```bash
adb logcat -s VehicleDemo:I
adb logcat --pid=$(adb shell pidof -s com.qsjnic.demo.vehicle)
```

**示例代码**:
```java
private static final String TAG = "VehicleDemo";
Log.i(TAG, "Speed: " + speedKmh + " km/h");
Log.i(TAG, "SWC keyValue=0x" + Integer.toHexString(keyValue) + " status=" + keyStatus);
Log.i(TAG, "requestTypeInfo(0x01)=" + r1 + ", requestTypeInfo(0x02)=" + r2);
```

---

## 5. ota-demo (com.qsjnic.demo.ota)

**applicationId**: `com.qsjnic.demo.ota`
**TAG**: OtaDemo

**logcat 命令**:
```bash
adb logcat -s OtaDemo:I
adb logcat --pid=$(adb shell pidof -s com.qsjnic.demo.ota)
```

**示例代码**:
```java
private static final String TAG = "OtaDemo";
Log.i(TAG, "startUpgrade -> " + rc);
Log.i(TAG, "stopUpgrade -> " + rc);
```

---

## 6. sdk-smoketest (com.qsjnic.mcu.test)

**applicationId**: `com.qsjnic.mcu.test`
**TAG**: QsmwFullTest

**logcat 命令**:
```bash
adb logcat -s QsmwFullTest:I
adb logcat --pid=$(adb shell pidof -s com.qsjnic.mcu.test)
```

**示例代码**:
```java
private static final String TAG = "QsmwFullTest";
Log.i(TAG, line);  // 统一的 append 方法
String line = "[A2M] " + method + "(" + argStr + ") -> rc=" + rc;
String line = "[M2A] " + method + ": " + detail;
```

---

## 常用组合命令

```bash
# 同时监听 Service + 所有 Demo + SDK
adb logcat -s QsMcuSystemService:D McuLink:D FrameRouter:D McuBinder:D RadioDemo:I VehicleDemo:I OtaDemo:I QsmwFullTest:I McuClient:D McuRadioClient:D McuKeyClient:D McuVehicleClient:D McuUpgradeClient:D

# 只看 Service 进程
adb logcat --pid=$(adb shell pidof -s com.qsjnic.mcu.service)

# 清除并重新开始
adb logcat -c && adb logcat -s QsMcuSystemService:D McuLink:D FrameRouter:D
```

> **注意**: key-demo 模块在项目中不存在。Key 功能通过 SDK 的 McuKeyClient + vehicle-demo/radio-demo 中的 KeyListener 演示。
