diff --git a/.idea/libraries/fasterxml_jackson_core_databind.xml b/.idea/libraries/fasterxml_jackson_core_databind.xml
new file mode 100644
index 0000000..bd16d01
--- /dev/null
+++ b/.idea/libraries/fasterxml_jackson_core_databind.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/FA_Gateway_Java.iml b/FA_Gateway_Java.iml
index 25c4df6..c297cbc 100644
--- a/FA_Gateway_Java.iml
+++ b/FA_Gateway_Java.iml
@@ -17,5 +17,6 @@
+
\ No newline at end of file
diff --git a/additional.config.json b/additional.config.json
new file mode 100644
index 0000000..7c267cc
--- /dev/null
+++ b/additional.config.json
@@ -0,0 +1 @@
+{"Modbus_Port":502,"Modbus_MasterIP":"192.168.10.1","Modbus_SlaveID":"1","VX3KTargetIP":"192.168.14.1","VX3KTargetPort":5000,"Email_SMTPServer":"mail.galva.co.id","Email_SMTPPort":587,"Email_SMTPSSL":true,"Email_SMTPUsername":"admin","Email_SMTPPassword":"admin","Email_SMTPFrom":"fa@galva.co.id","Email_SenderName":"Fire Alarm Gateway","Email_Subject":"Fire Alarm Gateway Notification","MQTT_Broker":"34.101.202.96","MQTT_Port":1883,"MQTT_Topic":"FA_Gateway/status","MQTT_ClientID":"Pekojan","MQTT_Username":"gtcdev","MQTT_Password":"gtcdev2025","WebListenPort":"80"}
\ No newline at end of file
diff --git a/lib/jackson-annotations-2.17.2.jar b/lib/jackson-annotations-2.17.2.jar
new file mode 100644
index 0000000..c13bcb9
Binary files /dev/null and b/lib/jackson-annotations-2.17.2.jar differ
diff --git a/lib/jackson-core-2.17.2.jar b/lib/jackson-core-2.17.2.jar
new file mode 100644
index 0000000..34be902
Binary files /dev/null and b/lib/jackson-core-2.17.2.jar differ
diff --git a/lib/jackson-databind-2.17.2.jar b/lib/jackson-databind-2.17.2.jar
new file mode 100644
index 0000000..3750b8c
Binary files /dev/null and b/lib/jackson-databind-2.17.2.jar differ
diff --git a/src/config.java b/src/additional/config.java
similarity index 86%
rename from src/config.java
rename to src/additional/config.java
index 2fda8a0..ae6b8cd 100644
--- a/src/config.java
+++ b/src/additional/config.java
@@ -1,4 +1,5 @@
-import additional.Somecodes;
+package additional;
+
import lombok.Getter;
import lombok.Setter;
import org.tinylog.Logger;
@@ -33,15 +34,15 @@ public class config {
* If the file does not exist, create default configuration.
*/
public void Load(){
- Path configPath = Path.of(Somecodes.currentdirectory, "config.json");
+ Path configPath = Path.of(Somecodes.currentdirectory, "additional.config.json");
if (Files.exists(configPath)){
// Read the configuration from the file
// and if not complete, create defaults
try{
String configContent = Files.readString(configPath);
- Logger.info("config content: {}", configContent);
+ Logger.info("additional.config content: {}", configContent);
config loadedConfig = Somecodes.gson.fromJson(configContent, config.class);
- Logger.info("Loaded config from {}", loadedConfig.toString());
+ Logger.info("Loaded additional.config from {}", loadedConfig.toString());
if (loadedConfig != null) {
// Copy values from loadedConfig to this instance
this.Modbus_MasterIP = loadedConfig.Modbus_MasterIP;
@@ -66,11 +67,11 @@ public class config {
this.WebListenPort = loadedConfig.WebListenPort;
} else {
- Logger.error("Loaded config is null, creating Default Config");
+ Logger.error("Loaded additional.config is null, creating Default Config");
MakeDefaults();
}
} catch (Exception e){
- Logger.error("Failed to read config file: {}, creating Default Config", e.getMessage());
+ Logger.error("Failed to read additional.config file: {}, creating Default Config", e.getMessage());
MakeDefaults();
}
} else {
@@ -115,14 +116,14 @@ public class config {
* @return true if the save operation was successful, false otherwise.
*/
public boolean Save(){
- Path configPath = Path.of(Somecodes.currentdirectory, "config.json");
+ Path configPath = Path.of(Somecodes.currentdirectory, "additional.config.json");
String gs = Somecodes.gson.toJson(this);
try {
Files.writeString(configPath, gs);
- Logger.info("Default config written to {}", configPath.toAbsolutePath());
+ Logger.info("Default additional.config written to {}", configPath.toAbsolutePath());
return true;
} catch (Exception e) {
- Logger.error("Failed to write default config: {}", e.getMessage());
+ Logger.error("Failed to write default additional.config: {}", e.getMessage());
}
return false;
}
diff --git a/src/html/assets/js/connection.js b/src/html/assets/js/connection.js
index 4fd9c4a..97479ad 100644
--- a/src/html/assets/js/connection.js
+++ b/src/html/assets/js/connection.js
@@ -1,19 +1,13 @@
console.log("Initializing websocket");
if (window.socket==null) {
window.socket = new WebSocket("ws://" + location.host + "/ws");
- console.log("creating window.socket");
- } else {
- console.log("window.socket already exists");
- }
+ }
socket.onopen = () => {
console.log("WebSocket connected");
};
- socket.onmessage = (event) => {
- const data = JSON.parse(event.data);
- console.log("Received from server:", data);
- };
+
socket.onerror = (err) => {
console.error("WebSocket error:", err);
diff --git a/src/html/assets/js/index.js b/src/html/assets/js/index.js
index 76c994d..800f940 100644
--- a/src/html/assets/js/index.js
+++ b/src/html/assets/js/index.js
@@ -2,4 +2,9 @@ document.addEventListener("DOMContentLoaded", function () {
console.log("Index page loaded");
send_data("Hello from Index.html")
+
+ socket.onmessage = (event) => {
+ const data = JSON.parse(event.data);
+ console.log("Received from server:", data);
+ };
});
\ No newline at end of file
diff --git a/src/html/assets/js/setting.js b/src/html/assets/js/setting.js
index 0eac1f8..612e22a 100644
--- a/src/html/assets/js/setting.js
+++ b/src/html/assets/js/setting.js
@@ -1,5 +1,10 @@
document.addEventListener("DOMContentLoaded", function () {
console.log("Setting page loaded");
- send_data("Hello from setting.js");
+
+ socket.onmessage = (event) => {
+ const data = JSON.parse(event.data);
+ console.log("Received from server:", data);
+ };
+ send_data(JSON.stringify({request:"GET_SETTING"}));
});
\ No newline at end of file
diff --git a/src/Main.java b/src/main/Main.java
similarity index 98%
rename from src/Main.java
rename to src/main/Main.java
index 1e643a6..789030d 100644
--- a/src/Main.java
+++ b/src/main/Main.java
@@ -1,3 +1,6 @@
+package main;
+
+import additional.config;
import database.ContactInputData;
import database.Database;
import gpio.NanopiGpio;
@@ -12,7 +15,7 @@ import web.WebServer;
//TIP To Run code, press or
// click the icon in the gutter.
public class Main {
- private static config config;
+ public static config config;
private static MqttClient mqttClient;
private static NanopiGpio gpio;
private static Database db;
@@ -24,7 +27,7 @@ public class Main {
public static void main(String[] args) {
Logger.info("Application started");
- // initialize config
+ // initialize additional.config
config = new config();
config.Load();
diff --git a/src/web/WebServer.java b/src/web/WebServer.java
index 47875b9..e39bead 100644
--- a/src/web/WebServer.java
+++ b/src/web/WebServer.java
@@ -1,7 +1,9 @@
package web;
+import additional.config;
import io.javalin.Javalin;
import lombok.Getter;
+import main.Main;
import org.tinylog.Logger;
import static additional.Somecodes.ValidString;
@@ -47,16 +49,33 @@ public class WebServer {
ws.onMessage(ctx -> {
Logger.info("WebSocket message received: {}", ctx.message());
- webRequest req = gson.fromJson(ctx.message(), webRequest.class);
- if (ValidString(req.request())){
- String cmd = req.request().trim().toUpperCase();
- switch(cmd){
- case "GET_SETTING" :
+ try{
+ webRequest req = ctx.messageAsClass(webRequest.class);
+ if (ValidString(req.request())){
+ String cmd = req.request().trim().toUpperCase();
+ switch(cmd){
+ case "GET_SETTING" :
+ webSettingArgs args1 = new webSettingArgs();
+ args1.mqttBrokerIP = Main.config.getMQTT_Broker();
- break;
+ webResponse response = new webResponse("GET_SETTING", gson.toJson(args1));
+ ctx.send(response);
+ break;
+ case "RESET_DEFAULT":
+ break;
+ case "SET_SETTING":
+ webSettingArgs args2 = gson.fromJson(req.args(), webSettingArgs.class);
+
+ break;
+ }
}
+ } catch (Exception e){
+ Logger.error("Not processing web request: {} because {}", ctx.message(), e.getMessage());
+ webResponse response = new webResponse("ERROR", e.getMessage());
+ ctx.send(response);
}
+
});
ws.onClose(ctx -> {
diff --git a/src/web/webRequest.java b/src/web/webRequest.java
index a6c05fd..04b8884 100644
--- a/src/web/webRequest.java
+++ b/src/web/webRequest.java
@@ -1,4 +1,4 @@
package web;
-public record webRequest(String request, String[] args) {
+public record webRequest(String request, String args) {
}
diff --git a/src/web/webResponse.java b/src/web/webResponse.java
new file mode 100644
index 0000000..b3b7901
--- /dev/null
+++ b/src/web/webResponse.java
@@ -0,0 +1,4 @@
+package web;
+
+public record webResponse(String response, String args) {
+}
diff --git a/src/web/webSettingArgs.java b/src/web/webSettingArgs.java
new file mode 100644
index 0000000..9ba8f72
--- /dev/null
+++ b/src/web/webSettingArgs.java
@@ -0,0 +1,23 @@
+package web;
+
+import lombok.Data;
+
+@Data
+public class webSettingArgs {
+ String smtpServer;
+ int smtpPort;
+ String smtpUsername;
+ String smtpPassword;
+ boolean smtpSSL;
+ String smtpSenderAddress;
+ String smtpSenderName;
+ String smtpSubject;
+ String vx3kIP;
+ int vx3kPort;
+ String mqttBrokerIP;
+ int mqttPort;
+ String mqttUsername;
+ String mqttPassword;
+ String mqttClientID;
+ String mqttTopic;
+}