From a5eb4e9157286b99c787a12ff76025c36d0b970e Mon Sep 17 00:00:00 2001 From: rdkartono Date: Wed, 20 Nov 2024 16:04:06 +0700 Subject: [PATCH] patches 20/11/2024 --- src/Main.java | 170 +++++++++++++++++++++++++++++++++++++--- src/SBC/GpioInput.java | 44 ++++++++--- src/SBC/GpioOutput.java | 1 + src/SIP/jSIPClient.java | 3 + 4 files changed, 193 insertions(+), 25 deletions(-) diff --git a/src/Main.java b/src/Main.java index faf7914..af140a8 100644 --- a/src/Main.java +++ b/src/Main.java @@ -25,8 +25,14 @@ public class Main { private static GpioOutput pilotLight; private static GpioOutput networkLight; private static GpioOutput callLight; + private static GpioOutput Buzzer; private static Timer timer; private static TimerTask callLightTask; + private static TimerTask BuzzerTask; + private static SIP_Request incomingRequest; + private static SIP_Request oncallRequest; + private static SIP_Response incomingResponse; + private static SIP_Response oncallResponse; public static void main(String[] args) { common.ExtractProperties(currentDir,"config.properties", false); @@ -40,6 +46,12 @@ public class Main { if (callLight!=null && callLight.isInitialized()) callLight.BlinkON(100); } }; + BuzzerTask = new TimerTask() { + @Override + public void run() { + if (Buzzer!=null && Buzzer.isInitialized()) Buzzer.BlinkON(500); + } + }; // SIP Section client = new jSIPClient(config); @@ -47,38 +59,47 @@ public class Main { @Override public void Registering(SIP_Request req) { Logger.info("Registering to SIP Server, Request: {}",req); - - // selama registering, blink dengan interval 500ms - callLightTask.cancel(); - timer.purge(); - timer.scheduleAtFixedRate(callLightTask, 0, 500); + Buzzer_Off(); + callLight_Registering(); } @Override public void RegisterSuccesful(SIP_Response resp) { Logger.info("Registered to SIP Server, Response: {}",resp); - - // setelah register berhasil, blink dengan interval 3000ms - callLightTask.cancel(); - timer.purge(); - timer.scheduleAtFixedRate(callLightTask, 0, 3000); + Buzzer_Off(); + callLight_Idle(); } @Override public void RegisterFailed(SIP_Response resp) { Logger.info("Failed to register to SIP Server, Response: {}",resp); + Buzzer_Off(); } @Override public void IncomingCall(SIP_Request req, SIP_Response resp) { Logger.info("Incoming Call, Request: {}, Response: {}",req,resp); - client.AcceptIncomingCall(req); + callLight_IncomingCall(); + Buzzer_IncomingCall(); + incomingRequest = req; + incomingResponse = resp; + oncallRequest = null; + oncallResponse = null; + //client.AcceptIncomingCall(req); } @Override public void RemoteHangUp(SIP_Request req) { Logger.info("Remote Hangup, Request: {}",req); + callLight_Idle(); + Buzzer_Off(); + client.HangUp(); + incomingRequest = null; + incomingResponse = null; + oncallRequest = null; + oncallResponse = null; + } @Override @@ -99,8 +120,64 @@ public class Main { webserver.Start(); // GPIO Section - callButton = new GpioInput(NanopiDuo2.Pin12.gpionumber); - hangupButton = new GpioInput(NanopiDuo2.Pin14.gpionumber); + callButton = new GpioInput(NanopiDuo2.Pin12.gpionumber, true); + if (callButton.isInitialized()){ + callButton.setOnLongPress(vv->{ + Logger.info("Call Button Long Pressed"); + if (incomingRequest!=null && incomingResponse!=null){ + client.AcceptIncomingCall(incomingRequest); + callLight_OnCall(); + Buzzer_OnCall(); + oncallRequest = incomingRequest; + oncallResponse = incomingResponse; + incomingRequest = null; + incomingResponse = null; + } + }); + callButton.setOnShortPress(vv->{ + Logger.info("Call Button Short Pressed"); + if (incomingRequest!=null && incomingResponse!=null){ + client.AcceptIncomingCall(incomingRequest); + callLight_OnCall(); + Buzzer_OnCall(); + oncallRequest = incomingRequest; + oncallResponse = incomingResponse; + incomingRequest = null; + incomingResponse = null; + } + }); + } + hangupButton = new GpioInput(NanopiDuo2.Pin14.gpionumber, true); + if (hangupButton.isInitialized()){ + hangupButton.setOnShortPress(vv->{ + Logger.info("Hangup Button Short Pressed"); + if (oncallRequest!=null || oncallResponse!=null){ + client.HangUp(); + oncallResponse = null; + oncallRequest = null; + } else if (incomingRequest!=null || incomingResponse!=null){ + client.RejectIncomingCall(incomingRequest); + incomingRequest = null; + incomingResponse = null; + } + callLight_Idle(); + Buzzer_Off(); + }); + hangupButton.setOnLongPress(vv->{ + Logger.info("Hangup Button Long Pressed"); + if (oncallRequest!=null || oncallResponse!=null){ + client.HangUp(); + oncallResponse = null; + oncallRequest = null; + } else if (incomingRequest!=null || incomingResponse!=null){ + client.RejectIncomingCall(incomingRequest); + incomingRequest = null; + incomingResponse = null; + } + callLight_Idle(); + Buzzer_Off(); + }); + } pilotLight = new GpioOutput(NanopiDuo2.Pin16.gpionumber, true); if (pilotLight.isInitialized()){ timer.scheduleAtFixedRate(new TimerTask() { @@ -112,6 +189,7 @@ public class Main { } networkLight = new GpioOutput(NanopiDuo2.Pin18.gpionumber, true); callLight = new GpioOutput(NanopiDuo2.Pin20.gpionumber, true); + Buzzer = new GpioOutput(NanopiDuo2.Pin22.gpionumber, true); // Shutdown Hook Runtime.getRuntime().addShutdownHook(new Thread(() -> { @@ -176,5 +254,71 @@ public class Main { } } + /** + * Registering state, call light is blinking with 500ms interval + */ + private static void callLight_Registering(){ + if (callLightTask!=null) callLightTask.cancel(); + if (timer!=null){ + timer.purge(); + timer.scheduleAtFixedRate(callLightTask, 0, 500); + } + } + /** + * Idle state, call light is blinking with interval 3000ms + */ + private static void callLight_Idle(){ + if (callLightTask!=null) callLightTask.cancel(); + if (timer!=null){ + timer.purge(); + timer.scheduleAtFixedRate(callLightTask, 0, 3000); + } + } + + /** + * Incoming call, call light is blinking with 1000ms interval + */ + private static void callLight_IncomingCall(){ + if (callLightTask!=null) callLightTask.cancel(); + if (timer!=null){ + timer.purge(); + timer.scheduleAtFixedRate(callLightTask, 0, 1000); + } + } + + /** + * On call, call light is on + */ + private static void callLight_OnCall(){ + if (callLightTask!=null) callLightTask.cancel(); + if (timer!=null) timer.purge(); + callLight.SetValue(true); + } + + /** + * Incoming call, buzzer is beeping with 1000ms interval + */ + private static void Buzzer_IncomingCall(){ + if (BuzzerTask!=null) BuzzerTask.cancel(); + if (timer!=null){ + timer.purge(); + timer.scheduleAtFixedRate(BuzzerTask, 0, 1000); + } + } + + /** + * On-call, buzzer is off + */ + private static void Buzzer_OnCall(){ + if (BuzzerTask!=null) BuzzerTask.cancel(); + if (timer!=null) timer.purge(); + Buzzer.SetValue(false); + } + + private static void Buzzer_Off(){ + if (BuzzerTask!=null) BuzzerTask.cancel(); + if (timer!=null) timer.purge(); + Buzzer.SetValue(false); + } } \ No newline at end of file diff --git a/src/SBC/GpioInput.java b/src/SBC/GpioInput.java index 4ac0f1f..3499c8a 100644 --- a/src/SBC/GpioInput.java +++ b/src/SBC/GpioInput.java @@ -7,6 +7,7 @@ import org.pmw.tinylog.Logger; import java.nio.file.Files; import java.nio.file.Path; import java.util.Objects; +import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Consumer; import static code.common.*; @@ -16,24 +17,33 @@ import static code.common.*; public class GpioInput { private boolean initialized = false; private int gpionumber = 0; - private String lastvalue = ""; private Path valuePath; private Path directionPath; - @Setter private Consumer onChange; + private final AtomicInteger OnCounter = new AtomicInteger(0); + @Setter private Consumer onShortPress; + @Setter private Consumer onLongPress; - private void updateValue(String value){ - if (onChange!=null){ - if (ValidString(value)){ - onChange.accept(value); - } - } + // 10 x 10ms timer = 100ms + private final int shortPressTime = 10; + // 200 x 10ms timer = 2000ms + private final int longPressTime = 200; + + private void updateShortPressed(){ + if (onShortPress!=null) onShortPress.accept(null); + } + + private void updateLongPressed(){ + if (onLongPress!=null) onLongPress.accept(null); } /** * Create GpioInput object + * Active Low = true : 0 = ON, 1 = OFF + * Active Low = false : 0 = OFF, 1 = ON * @param gpionumber GPIO number + * @param activeLow Active Low */ - public GpioInput(int gpionumber){ + public GpioInput(int gpionumber, final boolean activeLow){ if (gpionumber>0){ if (HaveGPIO()){ if (WriteFile(gpioExportPath,gpionumber)){ @@ -49,9 +59,19 @@ public class GpioInput { Thread.sleep(10); } catch (Exception ignored) {} String value = ReadFile(valuePath); - if (Objects.equals(lastvalue, value)) continue; - lastvalue = value; - updateValue(value); + if (Objects.equals(value,activeLow?"0":"1")){ + OnCounter.incrementAndGet(); + } else { + int vv = OnCounter.getAndSet(0); + if (vv>= shortPressTime){ + if (vv < longPressTime){ + updateShortPressed(); + } else { + updateLongPressed(); + } + } + // di bawah shortPressTime, diabaikan + } } }).start(); Logger.info("GPIO Input created: {}",gpionumber); diff --git a/src/SBC/GpioOutput.java b/src/SBC/GpioOutput.java index 61ce468..65082b8 100644 --- a/src/SBC/GpioOutput.java +++ b/src/SBC/GpioOutput.java @@ -34,6 +34,7 @@ public class GpioOutput { this.activeHigh = activeHigh; this.gpionumber = gpionumber; initialized = true; + SetValue(false); Logger.info("GPIO Output created: {}",gpionumber); } else Logger.info("Failed to set direction to in: {}",gpionumber); } else Logger.info("Failed to export GPIO: {}",gpionumber); diff --git a/src/SIP/jSIPClient.java b/src/SIP/jSIPClient.java index 22a515a..b8fe6a1 100644 --- a/src/SIP/jSIPClient.java +++ b/src/SIP/jSIPClient.java @@ -135,6 +135,7 @@ public class jSIPClient { if (em!=null) { if (em.IsCreated()) { if (em.CallingInProgress()) { + em.HangUp(); return true; } else raise_log_event("HangUp failed, no call made"); @@ -451,6 +452,7 @@ public class jSIPClient { return sip_request!=null; } + /** * Hang-Up current call */ @@ -458,6 +460,7 @@ public class jSIPClient { if (sip_request!=null) { if (user_agent!=null) { exec.submit(() -> { + user_agent.terminate(sip_request); sip_request = null; });