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