Browse Source

主机呼叫分机支持自动接听和手动接听,手动接听模式下按手柄按键接听,按面板按键挂断

weizhengliang 3 years ago
parent
commit
aa4e73d14c

+ 49 - 16
conversion_box/src/main/java/com/wdkl/app/ncs/conversion_box/activity/MainActivity.kt

@@ -258,8 +258,10 @@ class MainActivity :BaseActivity<MainActivityPresenter, MainActivityLayoutBindin
 
         //设备启用,进入正常模式
         if (Constant.DEVICE_STATUS == 1) {
+            connectSocket()
             tv_device_status.setText("设备状态: 已启用")
             SerialPortHelper.changeRegisterState()
+            SerialPortHelper.changeCallingMode("0") //双工模式
             isMacRegister = true
         } else {
             tv_device_status.setText("设备状态: 未注册或未启用")
@@ -273,10 +275,6 @@ class MainActivity :BaseActivity<MainActivityPresenter, MainActivityLayoutBindin
             presenter.loadPartSettings(Constant.PART_ID)
         }
 
-        if (Constant.DEVICE_STATUS == 1) {
-            connectSocket()
-        }
-
         //检查版本
         //checkAppVersion()
     }
@@ -388,8 +386,14 @@ class MainActivity :BaseActivity<MainActivityPresenter, MainActivityLayoutBindin
                 val addr = content[1].substring(0, content[1].length - 1)
                 when (content[0]) {
                     "A" -> {
-                        //分机呼叫
-                        startOutCall(addr)
+                        if (Constant.CALL_STATE == Constant.CALL_INCOMING && addr.equals(curDeviceUart)) {
+                            //分机接听
+                            RingPlayHelper.stopRingTone()
+                            VoiceUtil.acceptAudioCall(curDeviceId, fromId, curInteractionVO!!.id)
+                        } else {
+                            //分机呼叫
+                            startOutCall(addr)
+                        }
                     }
 
                     "B" -> {
@@ -398,7 +402,11 @@ class MainActivity :BaseActivity<MainActivityPresenter, MainActivityLayoutBindin
                             //通话中直接挂断
                             gEngineKit!!.endCall()
                             Constant.CALL_STATE = Constant.CALL_STANDBY
-                        } else if (Constant.CALL_STATE == Constant.CALL_OUTGOING || Constant.CALL_STATE == Constant.CALL_OUT_SUCCESS) {
+                        } else if (Constant.CALL_STATE == Constant.CALL_INCOMING) {
+                            rejectCall()
+                            SerialPortHelper.closeSoundChannel(addr)
+                            RingPlayHelper.stopRingTone()
+                        } else {
                             //呼叫时取消
                             cancelOutCall(addr)
                         }
@@ -416,7 +424,6 @@ class MainActivity :BaseActivity<MainActivityPresenter, MainActivityLayoutBindin
                             val curTime = System.currentTimeMillis()
                             if (sosList.size > 0) {
                                 val sosItem = sosList.stream().filter { addr.equals(it.addr) }.findFirst().orElse(null)
-
                                 if (sosItem == null) {
                                     //该按钮还没有呼叫过
                                     //Log.e("serialport", "sosclick 111111111: " + addr)
@@ -482,7 +489,9 @@ class MainActivity :BaseActivity<MainActivityPresenter, MainActivityLayoutBindin
                         curDeviceId = frameDevice.device.id
                         updateCallText("正在呼叫-->$uart, $curDeviceId")
                         VoiceUtil.startAudioCall(curDeviceId)
-                        Constant.CALL_STATE = Constant.CALL_OUTGOING
+                        if (Constant.CALL_STATE == Constant.CALL_STANDBY) {
+                            Constant.CALL_STATE = Constant.CALL_OUTGOING
+                        }
                     }
                 }
             }
@@ -503,6 +512,12 @@ class MainActivity :BaseActivity<MainActivityPresenter, MainActivityLayoutBindin
         }
     }
 
+    private fun rejectCall() {
+        updateCallText("待机中")
+        VoiceUtil.rejectAudioCall(curDeviceId, fromId, curInteractionVO!!.id)
+        Constant.CALL_STATE = Constant.CALL_STANDBY
+    }
+
     private fun startSosCall(uart: String) {
         if (FrameHelper.frameDeviceList.size > 0 ) {
             for (frameDevice in FrameHelper.frameDeviceList) {
@@ -694,6 +709,7 @@ class MainActivity :BaseActivity<MainActivityPresenter, MainActivityLayoutBindin
                             fromId = tcpModel.fromId
                             curDeviceUart = interactionVO.toEthMac
                             curInteractionVO = interactionVO
+                            curDeviceId = interactionVO.toDeviceId
 
                             //关闭门灯
                             val doorAddr = getDoorLightAddr(interactionVO.toEthMac)
@@ -701,10 +717,16 @@ class MainActivity :BaseActivity<MainActivityPresenter, MainActivityLayoutBindin
                                 SerialPortHelper.closeDoorLight(doorAddr)
                             }
 
-                            //todo
                             updateCallText("收到来电")
                             Constant.CALL_STATE = Constant.CALL_INCOMING
-                            VoiceUtil.acceptAudioCall(tcpModel.toId, fromId, interactionVO?.id)
+                            if (Constant.autoAnswer) {
+                                //自动接听
+                                VoiceUtil.acceptAudioCall(tcpModel.toId, fromId, interactionVO?.id)
+                            } else {
+                                //响铃并手动接听
+                                SerialPortHelper.callInChannel(interactionVO.toEthMac)
+                                RingPlayHelper.playRingTone(activity, R.raw.incoming_call2, false)
+                            }
                         } else if (tcpModel.getAction() == TcpAction.VoiceAction.ACCEPT) {
                             //我方呼出,对方接受
                             fromId = tcpModel.fromId
@@ -755,9 +777,17 @@ class MainActivity :BaseActivity<MainActivityPresenter, MainActivityLayoutBindin
                             }
                         } else if (tcpModel.getAction() == TcpAction.VoiceAction.CALLING) {
                             //我方呼出,对方通话中
-                            Constant.CALL_STATE = Constant.CALL_STANDBY
-                            updateCallText("待机中")
+                            if (curInteractionVO!!.id == interactionVO.id) {
+                                Constant.CALL_STATE = Constant.CALL_STANDBY
+                                updateCallText("待机中")
+                            }
                             showMessage("对方忙线中")
+                            //关闭分机呼叫和门灯
+                            SerialPortHelper.closeSoundChannel(interactionVO.fromEthMac)
+                            val doorAddr = getDoorLightAddr(interactionVO.fromEthMac)
+                            if (!TextUtils.isEmpty(doorAddr)) {
+                                SerialPortHelper.closeDoorLight(doorAddr)
+                            }
                         } else if (tcpModel.getAction() == TcpAction.VoiceAction.FAILED) {
                             //我方呼出,对方不在线,设备离线或其它错误
                             Constant.CALL_STATE = Constant.CALL_STANDBY
@@ -788,6 +818,8 @@ class MainActivity :BaseActivity<MainActivityPresenter, MainActivityLayoutBindin
                                 Constant.CALL_STATE = Constant.CALL_STANDBY
                                 updateCallText("待机中")
                                 showMessage("对方取消呼叫")
+                                RingPlayHelper.stopRingTone()
+                                SerialPortHelper.closeSoundChannel(curDeviceUart)
                             }
                         }
                     } else if (tcpModel.type == TcpType.SOS) {
@@ -831,6 +863,7 @@ class MainActivity :BaseActivity<MainActivityPresenter, MainActivityLayoutBindin
         handler.post {
             if (state == EnumType.CallState.Connected) {
                 //更新界面显示
+                callEnded = false
                 Constant.CALL_STATE = Constant.CALL_CALLING
                 updateCallText("通话中")
                 SerialPortHelper.openSoundChannel(curDeviceUart)
@@ -923,7 +956,7 @@ class MainActivity :BaseActivity<MainActivityPresenter, MainActivityLayoutBindin
         }
 
         SerialPortHelper.closeSoundChannel(curDeviceUart)
-        Constant.CALL_STATE = Constant.CALL_CALLING
+        Constant.CALL_STATE = Constant.CALL_STANDBY
         updateCallText("待机中")
     }
 
@@ -989,7 +1022,7 @@ class MainActivity :BaseActivity<MainActivityPresenter, MainActivityLayoutBindin
     private fun updateTcpState() {
         if (Constant.TCP_CONNECTED) {
             view_title_layout_iv_tcp.setImageResource(R.mipmap.ic_tcp_success)
-            if (SocketManager.getInstance().userState == 0) {
+            if (Constant.DEVICE_STATUS == 1 && SocketManager.getInstance().userState == 0) {
                 //如果socket断开了则重连
                 connectSocket()
             }
@@ -1043,7 +1076,7 @@ class MainActivity :BaseActivity<MainActivityPresenter, MainActivityLayoutBindin
                     if (!Constant.TCP_CONNECTED) {
                         TcpClient.getInstance().doConnect()
                     }
-                    if (SocketManager.getInstance().userState == 0) {
+                    if (Constant.DEVICE_STATUS == 1 && SocketManager.getInstance().userState == 0) {
                         //如果socket断开了则重连
                         connectSocket()
                     }

+ 5 - 1
conversion_box/src/main/java/com/wdkl/app/ncs/conversion_box/helper/SerialPortHelper.java

@@ -24,10 +24,14 @@ public class SerialPortHelper {
 
     //SIP挂断(主机挂断分机) address为FFFFF时,为关闭全部通道
     public static void closeSoundChannel(String address) {
-        Log.e("wzl", "closeSoundChannel: " + address);
         SerialPortUtil.getInstance().send(SerialPortUtil.C_HEARD + "5" + SerialPortUtil.C_SEPARATE + address + "F" + SerialPortUtil.C_END);
     }
 
+    //主机呼分机,分机响铃,按手柄接听或面板挂断
+    public static void callInChannel(String address) {
+        SerialPortUtil.getInstance().send(SerialPortUtil.C_HEARD + "6" + SerialPortUtil.C_SEPARATE + address + "F" + SerialPortUtil.C_END);
+    }
+
     //开启广播模式
     public static void openBroadcast() {
         SerialPortUtil.getInstance().send(SerialPortUtil.C_HEARD + "6" + SerialPortUtil.C_SEPARATE + "FFFF" + "F" + SerialPortUtil.C_END);

BIN
conversion_box/src/main/res/raw/incoming_call2.mp3


+ 1 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/common/Constant.java

@@ -43,6 +43,7 @@ public class Constant {
     //通话状态
     public static int CALL_STATE = CALL_STANDBY;
 
+    public static boolean autoAnswer = false;
 
     //MAC地址
     public static String LOCAL_MAC = "";

+ 3 - 3
resource/build.gradle

@@ -22,9 +22,9 @@ android {
         }
     }
    dependencies{
-       compile 'com.android.support:design:26.+'
-       compile 'com.android.support:support-v4:26.+'
-       compile 'com.android.support:cardview-v7:26.+'
+       compile "com.android.support:design:$support_library_version"
+       compile "com.android.support:support-v4:$support_library_version"
+       compile "com.android.support:cardview-v7:$support_library_version"
        /**
         * 单元测试
         */