Browse Source

파일로드 기능 구현

v2
원형 1 year ago
parent
commit
44ee5fa332
  1. 6
      src/main/java/org/mobidgim/mobidigimproject/common/api/Api.java
  2. 6
      src/main/java/org/mobidgim/mobidigimproject/common/api/Result.java
  3. 23
      src/main/java/org/mobidgim/mobidigimproject/controller/Controller.java
  4. 19
      src/main/java/org/mobidgim/mobidigimproject/model/device/enums/CanSpeed.java
  5. 17
      src/main/java/org/mobidgim/mobidigimproject/model/device/enums/Rs485Baudrate.java
  6. 17
      src/main/java/org/mobidgim/mobidigimproject/model/device/enums/Rs485Parity.java
  7. 3
      src/main/java/org/mobidgim/mobidigimproject/model/device/subDTO/CanBus.java
  8. 11
      src/main/java/org/mobidgim/mobidigimproject/model/device/subDTO/Rs485.java
  9. 9
      src/main/java/org/mobidgim/mobidigimproject/service/SettingService.java
  10. 41
      src/main/resources/static/index.html

6
src/main/java/org/mobidgim/mobidigimproject/common/api/Api.java

@ -21,6 +21,12 @@ public class Api<T> {
api.body = Data; api.body = Data;
return api; return api;
} }
public static Api<Object> ERROR(String description){
var api = new Api<Object>();
api.result = Result.ERROR(description);
return api;
}
public static Api<Object> ERROR(Result result){ public static Api<Object> ERROR(Result result){
var api = new Api<Object>(); var api = new Api<Object>();
api.result = result; api.result = result;

6
src/main/java/org/mobidgim/mobidigimproject/common/api/Result.java

@ -23,6 +23,12 @@ public class Result {
.resultDescription("성공") .resultDescription("성공")
.build(); .build();
} }
public static Result ERROR(String description){
return Result.builder()
.resultDescription(description)
.build();
}
public static Result ERROR(ErrorCodeIfs errorCodeIfs){ public static Result ERROR(ErrorCodeIfs errorCodeIfs){
return Result.builder() return Result.builder()
.resultCode(errorCodeIfs.getErrorCode()) .resultCode(errorCodeIfs.getErrorCode())

23
src/main/java/org/mobidgim/mobidigimproject/controller/Controller.java

@ -1,14 +1,11 @@
package org.mobidgim.mobidigimproject.controller; package org.mobidgim.mobidigimproject.controller;
import jakarta.servlet.ServletResponse;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import org.mobidgim.mobidigimproject.common.api.Api; import org.mobidgim.mobidigimproject.common.api.Api;
import org.mobidgim.mobidigimproject.model.device.DeviceDTO; import org.mobidgim.mobidigimproject.model.device.DeviceDTO;
import org.mobidgim.mobidigimproject.service.SettingService; import org.mobidgim.mobidigimproject.service.SettingService;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.io.IOException; import java.io.IOException;
@ -20,11 +17,21 @@ public class Controller {
private SettingService settingService; private SettingService settingService;
@PostMapping("/device") @PostMapping("/device")
public Api<DeviceDTO> settingDevice(@RequestBody DeviceDTO request) throws IOException { public ResponseEntity<Api<Object>> settingDevice(@RequestBody DeviceDTO request) throws IOException {
settingService.saveFileWithDevice(request); try{
settingService.saveFileWithDevice(request);
return ResponseEntity.ok().body(Api.OK("저장성공"));
}catch(IOException e){
return ResponseEntity.internalServerError().body(Api.ERROR("저장실패"));
}
}
return Api.OK(request); @GetMapping("/get-device")
public ResponseEntity<Api<DeviceDTO>> getDevice() throws IOException {
var entity = settingService.readFileWithDevice();
return ResponseEntity.ok().body(Api.OK(entity));
} }
// @PostMapping("/register") // @PostMapping("/register")
// public Api<RegisterDTO> settingRegister(@RequestBody RegisterDTO request)throws IOException{ // public Api<RegisterDTO> settingRegister(@RequestBody RegisterDTO request)throws IOException{
// settingService.saveFileWithRegister(request); // settingService.saveFileWithRegister(request);

19
src/main/java/org/mobidgim/mobidigimproject/model/device/enums/CanSpeed.java

@ -0,0 +1,19 @@
package org.mobidgim.mobidigimproject.model.device.enums;
import com.fasterxml.jackson.annotation.JsonValue;
import lombok.AllArgsConstructor;
@AllArgsConstructor
public enum CanSpeed {
CAN_SPEED_1000(1000),
CAN_SPEED_2500(2500),
CAN_SPEED_5000(5000),
CAN_SPEED_10000(10000);
private final int value;
@JsonValue
public int getValue() {
return value;
}
}

17
src/main/java/org/mobidgim/mobidigimproject/model/device/enums/Rs485Baudrate.java

@ -0,0 +1,17 @@
package org.mobidgim.mobidigimproject.model.device.enums;
import com.fasterxml.jackson.annotation.JsonValue;
import lombok.AllArgsConstructor;
@AllArgsConstructor
public enum Rs485Baudrate {
MODBUS_SPEED_9600(9600),
MODBUS_SPEED_115200(115200);
private final int value;
@JsonValue
public int getValue() {
return value;
}
}

17
src/main/java/org/mobidgim/mobidigimproject/model/device/enums/Rs485Parity.java

@ -0,0 +1,17 @@
package org.mobidgim.mobidigimproject.model.device.enums;
import com.fasterxml.jackson.annotation.JsonValue;
import lombok.AllArgsConstructor;
@AllArgsConstructor
public enum Rs485Parity {
NONE("no"),
EVEN("even"),
ODD("odd");
private final String value;
@JsonValue
public String getValue() {
return value;
}
}

3
src/main/java/org/mobidgim/mobidigimproject/model/device/subDTO/CanBus.java

@ -4,10 +4,11 @@ package org.mobidgim.mobidigimproject.model.device.subDTO;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import org.mobidgim.mobidigimproject.model.device.enums.CanBusType; import org.mobidgim.mobidigimproject.model.device.enums.CanBusType;
import org.mobidgim.mobidigimproject.model.device.enums.CanSpeed;
@Getter @Getter
@Setter @Setter
public class CanBus { public class CanBus {
private CanBusType canBusType; private CanBusType canBusType;
private int canBudrate; private CanSpeed canBaudrate;
} }

11
src/main/java/org/mobidgim/mobidigimproject/model/device/subDTO/Rs485.java

@ -2,14 +2,21 @@ package org.mobidgim.mobidigimproject.model.device.subDTO;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import org.mobidgim.mobidigimproject.model.device.enums.Rs485Parity;
import org.mobidgim.mobidigimproject.model.device.enums.Rs485Baudrate;
import org.mobidgim.mobidigimproject.model.device.enums.Rs485Mode; import org.mobidgim.mobidigimproject.model.device.enums.Rs485Mode;
@Getter @Getter
@Setter @Setter
public class Rs485 { public class Rs485 {
private Rs485Mode rs485Mode; private Rs485Mode rs485Mode;
private int rs485Baudrate;
private Rs485Baudrate rs485Baudrate;
private int rs485DataBits; private int rs485DataBits;
private String rs485Parity;
private Rs485Parity rs485Parity;
private int rs485StopBits; private int rs485StopBits;
} }

9
src/main/java/org/mobidgim/mobidigimproject/service/SettingService.java

@ -1,11 +1,14 @@
package org.mobidgim.mobidigimproject.service; package org.mobidgim.mobidigimproject.service;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.PropertyNamingStrategies; import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import org.mobidgim.mobidigimproject.model.device.DeviceDTO; import org.mobidgim.mobidigimproject.model.device.DeviceDTO;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.swing.text.html.parser.Parser;
import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Paths; import java.nio.file.Paths;
@ -21,6 +24,12 @@ public class SettingService {
Files.writeString(Paths.get(filename), json); Files.writeString(Paths.get(filename), json);
} }
public DeviceDTO readFileWithDevice() throws IOException {
ObjectMapper mapper = new ObjectMapper();
mapper.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE);
return mapper.readValue(new File("./temp/deviceConfig.json"), DeviceDTO.class);
}
// public RegisterDTO saveFileWithRegister(RegisterDTO request) throws IOException { // public RegisterDTO saveFileWithRegister(RegisterDTO request) throws IOException {
// ObjectMapper mapper = new ObjectMapper(); // ObjectMapper mapper = new ObjectMapper();
// mapper.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE); // mapper.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE);

41
src/main/resources/static/index.html

@ -47,12 +47,13 @@
/* I/O */ /* I/O */
.io-top{display:grid;grid-template-columns:repeat(auto-fit,minmax(360px,1fr));gap:40px;margin-bottom:32px} .io-top{display:grid;grid-template-columns:repeat(auto-fit,minmax(360px,1fr));gap:40px;margin-bottom:32px}
.io-bot{display:grid;grid-template-columns:repeat(auto-fit,minmax(360px,1fr));gap:40px} .io-bot{display:flex; gap: 40px ;flex-wrap:wrap;}
.io-group{flex:1 1 0;min-width:320px;}
.io-group h4{font-size:20px;font-weight:600;margin-bottom:16px;display:flex;align-items:center;gap:8px} .io-group h4{font-size:20px;font-weight:600;margin-bottom:16px;display:flex;align-items:center;gap:8px}
.io-group h4::before{content:"";width:8px;height:8px;background:#aaa;display:inline-block} .io-group h4::before{content:"";width:8px;height:8px;background:#aaa;display:inline-block}
.io-fieldset{border:1px solid #bbb;padding:24px 32px;border-radius:4px;display:flex;flex-direction:column;gap:16px;width:100%} .io-fieldset{border:1px solid #bbb;padding:24px 32px;border-radius:4px;display:flex;flex-direction:column;gap:16px;width:100%}
.io-row{display:grid;grid-template-columns:120px 12px 1fr;align-items:center;gap:8px} .io-row{display:grid;grid-template-columns:120px 12px 1fr;align-items:center;gap:8px}
.io-row input,.io-row select{padding:4px 6px;border:1px solid #aaa;border-radius:4px;font-size:14px;width:100%} .io-row input,.io-row select{padding:4px 6px;border:1px solid #aaa;border-radius:4px;font-size:14px;width:50%}
/* 비활성 input 시각화 */ /* 비활성 input 시각화 */
.disabled{background:#f5f5f5;cursor:not-allowed} .disabled{background:#f5f5f5;cursor:not-allowed}
@ -173,8 +174,15 @@
<option value="full">full</option> <option value="full">full</option>
</select> </select>
</div> </div>
<div class="io-row"><span>Speed</span><span>:</span><input id="rs485_baudrate"></div> <div class="io-row"><span>Speed</span><span>:</span><select id="rs485_baudrate">
<div class="io-row"><span>Parity</span><span>:</span><input id="rs485_parity"></div> <option value="9600">9600</option>
<option value="115200">115200</option>
</select></div>
<div class="io-row"><span>Parity</span><span>:</span><select id="rs485_parity">
<option value="no">NONE</option>
<option value="odd">ODD</option>
<option value="EVEN">EVEN</option>
</select></div>
</div> </div>
<!-- CAN --> <!-- CAN -->
@ -186,7 +194,15 @@
<option value="standard">standard</option> <option value="standard">standard</option>
</select> </select>
</div> </div>
<div class="io-row"><span>Speed</span><span>:</span><input id="can_baudrate"></div>
<div class="io-row"><span>Speed</span><span>:</span>
<select id="can_baudrate">
<option value="1000">100kb/s</option>
<option value="2500">250kb/s</option>
<option value="5000">500kb/s</option>
<option value="10000">1M/s</option>
</select>
</div> </div>
<!-- IMU --> <!-- IMU -->
@ -220,6 +236,7 @@
</select></div> </select></div>
</div> </div>
</div> </div>
</div>
</div> </div>
</section> </section>
@ -230,8 +247,7 @@
<!-- 공통 액션 버튼 --> <!-- 공통 액션 버튼 -->
<div class="actions"> <div class="actions">
<button id="load-local">Load Local File</button> <button id="load-local">Load Device File</button>
<button id="save-local">Save Local File</button>
<button id="save-device">Save to Device</button> <button id="save-device">Save to Device</button>
</div> </div>
</main> </main>
@ -239,7 +255,7 @@
<!-- ───── Script ───── --> <!-- ───── Script ───── -->
<script> <script>
/* ───────────── 1. 기본 데이터 구조 ───────────── */
const data = { const data = {
/* Wi-Fi */ /* Wi-Fi */
wifi_static : 'off', wifi_ip:'', wifi_netmask:'', wifi_gateway:'', wifi_dns1:'', wifi_dns2:'', wifi_static : 'off', wifi_ip:'', wifi_netmask:'', wifi_gateway:'', wifi_dns1:'', wifi_dns2:'',
@ -271,7 +287,7 @@
WIFI_SSID:[{wifi_ssid:'',wifi_password:'',wifi_security:'none'}] WIFI_SSID:[{wifi_ssid:'',wifi_password:'',wifi_security:'none'}]
}; };
/* ───────────── 2. 페이지 전환 ───────────── */
const pages = { const pages = {
ssid : document.getElementById('page-ssid'), ssid : document.getElementById('page-ssid'),
network: document.getElementById('page-network'), network: document.getElementById('page-network'),
@ -288,7 +304,7 @@
}); });
}); });
/* ───────────── 3. SSID 행 생성 / 수집 ───────────── */
const ssidList = document.getElementById('ssid-list'); const ssidList = document.getElementById('ssid-list');
const ssidTmpl = document.getElementById('ssid-template'); const ssidTmpl = document.getElementById('ssid-template');
@ -333,7 +349,7 @@
} }
document.querySelectorAll('input[name="ipMode"]').forEach(r=>r.addEventListener('change', toggleNetInputs)); document.querySelectorAll('input[name="ipMode"]').forEach(r=>r.addEventListener('change', toggleNetInputs));
/* ───────────── 5. IMU Re-map 보조 함수 ───────────── */
function axisValueToPair(val){ function axisValueToPair(val){
return val.startsWith('-') return val.startsWith('-')
? {axis:val.slice(1), sign:'minus'} ? {axis:val.slice(1), sign:'minus'}
@ -370,7 +386,6 @@
} }
loadFromData(data); loadFromData(data);
/* ───────────── 7. 화면 → 데이터 수집 ───────────── */
function collectData(){ function collectData(){
const res = {...data}; const res = {...data};
@ -395,7 +410,7 @@
return res; return res;
} }
/* ───────────── 8. 저장 버튼 POST ───────────── */
document.getElementById('save-device').addEventListener('click', ()=>{ document.getElementById('save-device').addEventListener('click', ()=>{
fetch('http://localhost:8080/setting/device',{ fetch('http://localhost:8080/setting/device',{
method :'POST', method :'POST',

Loading…
Cancel
Save