# 久正逢甲產學合作案 - 主機方(PC)主動與採取方(PI)溝通方式
- 此次我們使用protobuf作為溝通格式
- Protobuf 格式定義為附檔中的 **types.proto** 檔
- 目前設計方式為由主機方( PC )主動與採取方( PI )溝通
- 因此使用方法為
- **Step 1** : 主機方 ( PC )會組織一個 Command 封包傳送至採取方( PI )
- **Step 2** : 採取方將會依照 Command 封包執行指令動作,並將回一個 Result 封包
- **Step 3** : Result 封包資料暫定為:
- 如有錯誤,**status** 應填入非 **0** 值,並可在 result 中填入錯誤相關資料
- 反之,正常執行,**status** 應填入 **0**
- 詳細可看以下範例情境
- 目前定義的 Command 有以下幾種
| | Command | Feature |
| --- |:----------------------:|:----------------------------------:|
| 1 | CMD_UNKNOWN | 代表此欄位未初始化 |
| 2 | CMD_START_SAMPLING | 告知**採取方**開始採取,並開始回傳資料 |
| 3 | CMD_STOP_SAMPLING | 告知**採取方**停止採取,並停止回傳資料 |
| 4 | CMD_GET_FEATURES | 待討論 |
| 5 | CMD_GET_SAMPLE_RATE | 取得**採取方**的採樣頻率 |
| 6 | CMD_GET_CHANNELS | 取得**採取方**的採樣欄位數 |
| 7 | CMD_GET_CHANNEL_FORMAT | 取得**採取方**的採樣欄位型態 |
| 8 | CMD_GET_ROTATION_SPEED | 取得**採取方**的採樣平台轉速 |
| 9 | CMD_GET_NORMAL_FORCE | 取得**採取方**的採樣平台探針下壓力 |
## 範例情境
### 與採取方取得採樣頻率
1. 主機方送出以下封包
```
Command {
kind = MSG_CMD,
seq = 0,
cmd = CMD_GET_SAMPLE_RATE,
args = <ignored>,
}
```
2. 採取方回應
```
Result {
kind = MSG_RET,
seq = 0,
status = 0,
result = <1000 in bytes, 4bytes, little endian>,
}
```
### 與採取方取得平臺轉速
1. 主機方送出以下封包
```
Command {
kind = MSG_CMD,
seq = 1,
cmd = CMD_GET_ROTATION_SPEED,
args = <ignored>,
}
```
2. 採取方回應
```
Result {
kind = MSG_RET,
seq = 1,
status = 0,
result = <100 in bytes, 4bytes, little endian>,
}
```
### 請求採取方開始採集資料並回傳至主機方,直到主機方送出停止採集的指令
1. 主機方送出以下封包
```
Command {
kind = MSG_CMD,
seq = 2,
cmd = CMD_START_SAMPLING,
args = <ignored>,
}
```
2. 採取方回應
```
Result {
kind = MSG_RET,
seq = 2,
status = 0,
result = <ignored>,
}
```
3. 開始持續回傳採樣資料
```
Sample {
kind = MSG_SAMPLES,
count = 1,
value = <sampled values>
}
```
> 如上格式持續送出
4. 主機方送出以下封包
```
Command {
kind = MSG_CMD,
seq = 3,
cmd = CMD_STOP_SAMPLING,
args = <ignored>,
}
```
5. 採取方停止回傳採樣資料並回應
> 續 3
```
Sample {
kind = MSG_SAMPLES,
count = 1,
value = <sampled values>
}
```
```
Result {
kind = MSG_RET,
seq = 3,
status = 0,
result = <ignored>,
}
```
> 停止