---
tags: TPW1
---
TPW3 專案可更改區塊
# **TPW1_MAIN_CONTROLLER**
1. setting.json 由 UserSettings.java 來寫入、設定資料 內容有:
* `public final static String FILE_PATH = FileSystemView.getFileSystemView().getDefaultDirectory().toString() + File.separator + "TPW1_MAIN_CONTROLLER11";` 從此段更改json file存取位置。
* `private String patrolPlanImagePath = FILE_PATH + File.separator + "PatrolPlanImage";` 巡邏圖片結果存取位置
* `private String patrolPlanRecordPath = FILE_PATH+ File.separator + "PatrolPlanRecord",` 巡邏結果存取位置
* `public void save() {
JsonFileManager.save(FILE_PATH, FILE_NAME, instance);
}`
儲存檔案,自動產生資料夾。 此方法被引入至Connect Controller,在該檔案中負責在參數更改後,儲存至原路徑的資料夾中。
Parameters:
path 檔案路徑,若不存在則自動產生
fileName 檔案名稱
object Json物件
Returns: 若有錯誤則回傳
2. 巡邏拍攝結果 由 PatrolPlanImageManager.java 來寫入、設定資料 內容有:
* `public static String addNewImage(String patrolPlanId, BufferedImage img)` 創資料夾、寫入.jpg檔。
>
```java
public static String addNewImage(String patrolPlanId, BufferedImage img) {
UserSettings us = UserSettings.getInstance();
File folder = new File(us.getPatrolPlanImagePath() + File.separator + patrolPlanId);
if(!folder.exists())
folder.mkdirs();
try {
String imgName = getCurrTimeStr()+".jpg";
File imgFile = new File(folder.getAbsolutePath() + File.separator + imgName);
ImageIO.write(img, "jpg", imgFile);
return imgName;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
```
3. 執行巡邏任務 由 PatrolPlanExecutor.java 來執行
* `private void initPatrol() ` 啟動。
>
```java
private void initPatrol() {
StatusHolder.getInstance().setAndAddToNotifyQueue("Patrolling", "true");
b_running = true;
b_force_stop = false;
Date startDateTime = new Date();
logger.info(String.format("Task %s(%s) 執行時間:%s", pp.getIdName().getName(), pp.getIdName().getId(), startDateTime));
patrolPlanRecordFolder = createRecordFolder(startDateTime);
}
```
* `private String createRecordFolder(Date startTime) ` 創資料夾、並回傳絕對路徑。
4. 存取巡邏後資料 由 private void savePatrolData(PatrolData pd) > PatrolPlanExecutor.java 來執行
>
```java
private void savePatrolData(PatrolData pd) {
pd.setSaveTime(getCurrTimeStrForData(new Date()));
String fileName = "";
if(predefineStep.get(currStep) != null) { // is predefine step
fileName = currStep;
if(pd.getErrorMsg() != null)
fileName += "_has_error";
} else {
if(pd.getErrorMsg() == null)
fileName = String.format("Action_%d", pd.getActionIdx());
else
fileName = String.format("Action_%d_has_error", pd.getActionIdx());
}
JsonFileManager.save(patrolPlanRecordFolder, fileName, pd);
}
```
* `JsonFileManager.save(patrolPlanRecordFolder, fileName, pd);` 將PatrolData 以fileName(目前進度)命名 寫入 patrolPlanRecordFolder這個路徑底下的資料夾。
* 而此方法再被呼叫的位置應該在 PatrolPlanExecutor.java 324行 ,doMainProcedure()這個方法。
>
```java
private boolean doMainProcedure() {
List<Action> actions = pp.getActions();
for(int i = 0;i<actions.size();i++) {
Action action = actions.get(i);
currActionIdx = ( i + 1 ); //輸出的文字檔與ui介面內容均從1開始計數
PatrolData patrolData = initPatrolData(action, currActionIdx);
Action lastAction = null;
if(i >= 1)
lastAction = actions.get(i-1);
if(!moveRobotAndHead(lastAction, action, patrolData))
return false;
if(!doRGBCameraAction(action, patrolData))
return false;
if(!doThermalCameraAction(action, patrolData))
return false;
if(!doAudioAction(action, patrolData))
return false;
recordHumidityAndTemperature(patrolData);
savePatrolData(patrolData);
}
return true;
}
```
* `savePatrolData(patrolData);`在此呼叫上面提及存取巡邏後資料的方法。
* 存取動作的位置關係: JsonFileManager.save(patrolPlanRecordFolder, fileName, pd); => savePatrolData(PatrolData pd) => doMainProcedure() => doPatrol() => run() => ?? 以上均在PatrolPlanExecutor.java中。