---
# System prepended metadata

title: '**TPW1_MAIN_CONTROLLER**'
tags: [TPW1]

---

---
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中。