Explorar o código

护士主机增加T4型号点阵屏兼容,增加一些点阵屏设置,删掉些无用文件,其他优化

weizhengliang hai 1 ano
pai
achega
0b91929c64
Modificáronse 18 ficheiros con 867 adicións e 1130 borrados
  1. 166 120
      android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/activity/NurseHomeActivity.kt
  2. 0 428
      android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/activity/RegisterActivity.kt.bak
  3. 0 273
      android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/fragment/EntraceGuardVideoFragment.kt.bak
  4. 86 7
      android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/fragment/LedSettingsFragment.kt
  5. 236 61
      android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/led/LedC2MManager.java
  6. 1 0
      android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/led/LedItem.java
  7. 4 3
      android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/led/LedManager.java
  8. 6 0
      android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/led/LedManagerUtils.java
  9. 0 215
      android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/service/RTCKeepLiveService.java.bak
  10. 49 0
      android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/settingconfig/SettingConfig.java
  11. 174 10
      android_host/src/main/res/layout/fragment_led_settings.xml
  12. 7 0
      android_host/src/main/res/values-es/strings.xml
  13. 7 0
      android_host/src/main/res/values-ru/strings.xml
  14. 6 0
      android_host/src/main/res/values-zh/strings.xml
  15. 6 0
      android_host/src/main/res/values/strings.xml
  16. 26 5
      listenvision/src/main/java/com/listenvision/led.java
  17. 92 7
      listenvision/src/main/java/com/listenvision/model/VoiceModel.java
  18. 1 1
      middleware/src/main/code/com/wdkl/ncs/android/middleware/common/Constant.java

+ 166 - 120
android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/activity/NurseHomeActivity.kt

@@ -178,6 +178,7 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter, ActivityNewN
 //    //当前选中的button id
 //    private var select_id: Int = 0
 
+    private var checkTime: Long = 0
     private var pressTime: Long = 0
     private var hookonTime: Long = 0
     private var hookoffTime: Long = 0
@@ -300,6 +301,19 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter, ActivityNewN
 
         Thread {
             AppUtil.changePingMode()
+
+            try {
+                Thread.sleep(15000)
+
+                if (LedManagerUtils.getInstance().ledList.size > 0
+                    && !SettingConfig.getLedControl(activity)
+                /*&& SettingConfig.getLedType(activity) == 0*/
+                ) {
+                    LedManagerUtils.getInstance().removeAllProgram()
+                }
+            } catch (e: Exception) {
+                //
+            }
         }.start()
 
         //记录app启动时间
@@ -1121,24 +1135,10 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter, ActivityNewN
     private fun startScheduledExecutor() {
         val timerTask: TimerTask = object : TimerTask() {
             override fun run() {
-                //当前不在通话中且laterRestart=true则重启app
-                if (Constant.LATER_RESTART && !DeviceChannel.calling) {
-                    AppUpdateHelper.restartApp(activity)
-                } else {
-                    updateTime(false)
-                    runOnUiThread {
-                        updateNetState()
-                        updateTcpState()
-                    }
-
-                    /*if (Constants.LED_EXIST) {
-                        val calendar = Calendar.getInstance()
-                        val hour = calendar[Calendar.HOUR_OF_DAY]
-                        val minute = calendar[Calendar.MINUTE]
-                        if (hour == 23 && minute == 0) {
-                            LedManagerUtils.getInstance().syncTime()
-                        }
-                    }*/
+                try {
+                    scheduleTask()
+                } catch (e: Exception) {
+                    //
                 }
             }
         }
@@ -1146,139 +1146,185 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter, ActivityNewN
         executor!!.scheduleAtFixedRate(timerTask, 100, 90, TimeUnit.SECONDS)
     }
 
+    private fun scheduleTask() {
+        //当前不在通话中且laterRestart=true则重启app
+        if (Constant.LATER_RESTART && !DeviceChannel.calling) {
+            AppUpdateHelper.restartApp(activity)
+        } else {
+            updateTime(false)
+            runOnUiThread {
+                updateNetState()
+                updateTcpState()
+            }
+
+            val calendar = Calendar.getInstance()
+            val hour = calendar[Calendar.HOUR_OF_DAY]
+            val year = calendar[Calendar.YEAR]
+            val time = System.currentTimeMillis()
+            //点阵屏5个小时同步一次时间
+            if (year > 2022 && time - checkTime >= 5*60*60*1000) {
+                checkTime = time
+
+                if (SettingConfig.getLedAutoSyncTime(activity)) {
+                    if (Constant.LED_EXIST) {
+                        LedManagerUtils.getInstance().syncTime()
+                    }
+                }
+
+                /*if (hour == 23) {
+                    deleteLog()
+                }*/
+            }
+        }
+    }
+
 
     private fun startTransferScheduledExecutor() {
         val timerTask: TimerTask = object : TimerTask() {
             override fun run() {
-                if (!SettingConfiguration.getInstance().transferCall) {
-                    return
-                }
-                if (SettingConfiguration.getInstance().hostTransferDuration <= 0) {
-                    SettingConfiguration.getInstance().hostTransferDuration = 30
+                try {
+                    transferCallTask()
+                } catch (e: Exception) {
+                    //e.printStackTrace()
                 }
-                //紧急呼叫转移
-                if (sosItemList.size > 0) {
-                    val iterator = sosItemList.iterator()
-                    while (iterator.hasNext()) {
-                        val it = iterator.next()
-                        if (System.currentTimeMillis() - it.startTime >= SettingConfiguration.getInstance().hostTransferDuration*1000L) {
-                            Log.d(TAG, "紧急呼叫转移...")
-                            if (it.interactionVO != null) {
-                                runOnUiThread {
-                                    showMessage(R.string.call_sos_forwarding)
-                                    declineSosItem(it.interactionVO)
-                                }
-                                OtherUtil.sendSosTransfer(it.tid, Constant.DEVICE_ID, it.interactionVO.fromDeviceId, it.interactionVO)
-                                iterator.remove()
-                            }
-                            break
+            }
+        }
+        val executor = Executors.newSingleThreadScheduledExecutor()
+        executor.scheduleAtFixedRate(timerTask, 20, 5, TimeUnit.SECONDS)
+    }
+
+    private fun transferCallTask() {
+        if (!SettingConfiguration.getInstance().transferCall) {
+            return
+        }
+        if (SettingConfiguration.getInstance().hostTransferDuration <= 0) {
+            SettingConfiguration.getInstance().hostTransferDuration = 30
+        }
+        //紧急呼叫转移
+        if (sosItemList.size > 0) {
+            val iterator = sosItemList.iterator()
+            while (iterator.hasNext()) {
+                val it = iterator.next()
+                if (System.currentTimeMillis() - it.startTime >= SettingConfiguration.getInstance().hostTransferDuration*1000L) {
+                    Log.d(TAG, "紧急呼叫转移...")
+                    if (it.interactionVO != null) {
+                        runOnUiThread {
+                            showMessage(R.string.call_sos_forwarding)
+                            declineSosItem(it.interactionVO)
                         }
+                        OtherUtil.sendSosTransfer(it.tid, Constant.DEVICE_ID, it.interactionVO.fromDeviceId, it.interactionVO)
+                        iterator.remove()
                     }
+                    break
                 }
+            }
+        }
 
-                //语音呼叫转移
-                if (callingList.size > 0) {
-                    val iterator2 = callingList.iterator()
-                    while (iterator2.hasNext()) {
-                        val item = iterator2.next()
-                        if (System.currentTimeMillis() - item.startTime >= SettingConfiguration.getInstance().hostTransferDuration*1000L) {
-                            Log.d(TAG, "语音呼叫转移...")
-                            if (item.interactionVO != null) {
-                                runOnUiThread {
-                                    showMessage(R.string.call_voice_forwarding)
-                                }
-                                if (SettingConfig.getTtsMode(activity) == SettingConfig.TTS_ON) {
-                                    var frameName: String? = ""
-                                    if (DeviceTypeEnum.DOCTOR_HOST.value() == item.interactionVO.fromDeviceType
-                                        || DeviceTypeEnum.NURSE_HOST.value() == item.interactionVO.fromDeviceType
-                                        || DeviceTypeEnum.OTHER_HOST.value() == item.interactionVO.fromDeviceType) {
-                                        //医生机,护士主机,其他主机,总控主机等
-                                        frameName = item.interactionVO.fromDeviceName
-                                    } else if (DeviceTypeEnum.NURSE_WATCH.value() == item.interactionVO.fromDeviceType) {
-                                        //移动设备
-                                        frameName = item.interactionVO.fromMemberName
-                                    } else {
-                                        //其他
-                                        if (Locale.CHINESE.getLanguage().equals(language)) {
-                                            frameName = Util.appendSpace(item.interactionVO.fromFrameFullName.replace("-", ","))
-                                        } else {
-                                            frameName = item.interactionVO.fromFrameFullName.replace("-", "")
-                                        }
-                                    }
-                                    val text = BaseApplication.appContext.getString(R.string.voice_call_speech, frameName)
-                                    SpeechUtil.getInstance().removeSpeak(text)
+        //语音呼叫转移
+        if (callingList.size > 0) {
+            val iterator2 = callingList.iterator()
+            while (iterator2.hasNext()) {
+                val item = iterator2.next()
+                if (System.currentTimeMillis() - item.startTime >= SettingConfiguration.getInstance().hostTransferDuration*1000L) {
+                    Log.d(TAG, "语音呼叫转移...")
+                    if (item.interactionVO != null) {
+                        runOnUiThread {
+                            showMessage(R.string.call_voice_forwarding)
+                        }
+                        if (SettingConfig.getTtsMode(activity) == SettingConfig.TTS_ON) {
+                            var frameName: String? = ""
+                            if (DeviceTypeEnum.DOCTOR_HOST.value() == item.interactionVO.fromDeviceType
+                                || DeviceTypeEnum.NURSE_HOST.value() == item.interactionVO.fromDeviceType
+                                || DeviceTypeEnum.OTHER_HOST.value() == item.interactionVO.fromDeviceType) {
+                                //医生机,护士主机,其他主机,总控主机等
+                                frameName = item.interactionVO.fromDeviceName
+                            } else if (DeviceTypeEnum.NURSE_WATCH.value() == item.interactionVO.fromDeviceType) {
+                                //移动设备
+                                frameName = item.interactionVO.fromMemberName
+                            } else {
+                                //其他
+                                if (Locale.CHINESE.getLanguage().equals(language)) {
+                                    frameName = Util.appendSpace(item.interactionVO.fromFrameFullName.replace("-", ","))
                                 } else {
-                                    //如果呼叫列表只有一个呼叫了,说明删除这个之后就清空了,此时关闭铃声或音乐
-                                    if (callingList.size == 1) {
-                                        RingPlayHelper.stopRingTone()
-                                    }
+                                    frameName = item.interactionVO.fromFrameFullName.replace("-", "")
                                 }
-                                //VoiceUtil.transferAudioCall(Constants.ids, item.interactionVO.fromDeviceId, item.interactionVO)
-                                val callTcp = VoiceUtil.voiceTransfer(item.tid, Constant.DEVICE_ID, item.interactionVO.fromDeviceId, item.interactionVO.id)
-                                TcpClient.getInstance().sendMsg(callTcp.toJson())
-
-                                EventBus.getDefault().post(MessageEvent(item.interactionVO, Constant.EVENT_TRANSFER_CALL))
-                                iterator2.remove()
                             }
-                            break
+                            val text = BaseApplication.appContext.getString(R.string.voice_call_speech, frameName)
+                            SpeechUtil.getInstance().removeSpeak(text)
+                        } else {
+                            //如果呼叫列表只有一个呼叫了,说明删除这个之后就清空了,此时关闭铃声或音乐
+                            if (callingList.size == 1) {
+                                RingPlayHelper.stopRingTone()
+                            }
                         }
+                        val callTcp = VoiceUtil.voiceTransfer(item.tid, Constant.DEVICE_ID, item.interactionVO.fromDeviceId, item.interactionVO.id)
+                        TcpClient.getInstance().sendMsg(callTcp.toJson())
+
+                        EventBus.getDefault().post(MessageEvent(item.interactionVO, Constant.EVENT_TRANSFER_CALL))
+                        iterator2.remove()
                     }
+                    break
                 }
             }
         }
-        val executor = Executors.newSingleThreadScheduledExecutor()
-        executor.scheduleAtFixedRate(timerTask, 20, 5, TimeUnit.SECONDS)
     }
 
     private fun startRemoveCallScheduledExecutor() {
         val timeIndex = SettingConfig.getCallStayTime(activity)
         if (timeIndex > 0) {
-            val time = timeIndex*5*60*1000
+            val time = timeIndex*5*60*1000L
             val timerTask: TimerTask = object : TimerTask() {
                 override fun run() {
-                    if (Constant.CALL_STATE == Constant.CALL_CALLING
-                        || Constant.CALL_STATE == Constant.CALL_OUTGOING
-                        || Constant.CALL_STATE == Constant.CALL_VISITING
-                    ) {
-                        return
+                    try {
+                        removeCallTask(time)
+                    } catch (e: Exception) {
+                        //
                     }
+                }
+            }
+            val executor = Executors.newSingleThreadScheduledExecutor()
+            executor.scheduleAtFixedRate(timerTask, 120, 30, TimeUnit.SECONDS)
+        }
+    }
 
-                    //语音呼叫超时清除
-                    if (callingList.size > 0) {
-                        val iterator = callingList.iterator()
-                        while (iterator.hasNext()) {
-                            val item = iterator.next()
-                            if (System.currentTimeMillis() - item.startTime >= time) {
-                                if (item.interactionVO != null) {
-                                    if (SettingConfig.getTtsMode(activity) == SettingConfig.TTS_ON) {
-                                        var frameName: String
-                                        if (Locale.CHINESE.getLanguage().equals(language)) {
-                                            frameName = Util.appendSpace(item.interactionVO.fromFrameFullName.replace("-", ","))
-                                        } else {
-                                            frameName = item.interactionVO.fromFrameFullName.replace("-", "")
-                                        }
-                                        val text = BaseApplication.appContext.getString(
-                                                R.string.voice_call_speech,
-                                                frameName
-                                        )
-                                        SpeechUtil.getInstance().removeSpeak(text)
-                                    } else {
-                                        //如果呼叫列表只有一个呼叫了,说明删除这个之后就清空了,此时关闭铃声或音乐
-                                        if (callingList.size == 1) {
-                                            RingPlayHelper.stopRingTone()
-                                        }
-                                    }
-                                    EventBus.getDefault().post(MessageEvent(item, Constant.EVENT_REMOVE_CALL))
-                                    //iterator.remove()
-                                }
-                                break
+    private fun removeCallTask(time: Long) {
+        if (Constant.CALL_STATE == Constant.CALL_CALLING
+            || Constant.CALL_STATE == Constant.CALL_OUTGOING
+            || Constant.CALL_STATE == Constant.CALL_VISITING
+        ) {
+            return
+        }
+
+        //语音呼叫超时清除
+        if (callingList.size > 0) {
+            val iterator = callingList.iterator()
+            while (iterator.hasNext()) {
+                val item = iterator.next()
+                if (System.currentTimeMillis() - item.startTime >= time) {
+                    if (item.interactionVO != null) {
+                        if (SettingConfig.getTtsMode(activity) == SettingConfig.TTS_ON) {
+                            val frameName: String
+                            if (Locale.CHINESE.getLanguage().equals(language)) {
+                                frameName = Util.appendSpace(item.interactionVO.fromFrameFullName.replace("-", ","))
+                            } else {
+                                frameName = item.interactionVO.fromFrameFullName.replace("-", "")
+                            }
+                            val text = BaseApplication.appContext.getString(
+                                R.string.voice_call_speech,
+                                frameName
+                            )
+                            SpeechUtil.getInstance().removeSpeak(text)
+                        } else {
+                            //如果呼叫列表只有一个呼叫了,说明删除这个之后就清空了,此时关闭铃声或音乐
+                            if (callingList.size == 1) {
+                                RingPlayHelper.stopRingTone()
                             }
                         }
+                        EventBus.getDefault().post(MessageEvent(item, Constant.EVENT_REMOVE_CALL))
                     }
+                    break
                 }
             }
-            val executor = Executors.newSingleThreadScheduledExecutor()
-            executor.scheduleAtFixedRate(timerTask, 120, 30, TimeUnit.SECONDS)
         }
     }
 

+ 0 - 428
android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/activity/RegisterActivity.kt.bak

@@ -1,428 +0,0 @@
-package com.wdkl.ncs.android.component.nursehome.activity
-
-import android.Manifest
-import android.graphics.Color
-import android.os.Build
-import android.os.Handler
-import android.provider.Settings.Global.DEVICE_NAME
-import android.text.TextUtils
-import android.util.Log
-import android.view.View
-import com.enation.javashop.android.jrouter.external.annotation.Router
-import com.enation.javashop.net.engine.model.NetState
-import com.enation.javashop.net.engine.plugin.permission.RxPermissions
-import com.wdkl.ncs.android.component.nursehome.R
-import com.wdkl.ncs.android.component.nursehome.databinding.ActivityRegisterBinding
-import com.wdkl.ncs.android.component.nursehome.launch.NurseHomeLaunch
-import com.wdkl.ncs.android.lib.base.BaseActivity
-import io.reactivex.Observable
-import com.wdkl.ncs.android.component.nursehome.BuildConfig
-import com.wdkl.ncs.android.component.nursehome.helper.SoundPoolManager
-import com.wdkl.ncs.android.component.nursehome.util.*
-import com.wdkl.ncs.android.lib.base.BaseApplication
-import com.wdkl.ncs.android.lib.utils.*
-import com.wdkl.ncs.android.middleware.api.UrlManager
-import com.wdkl.ncs.android.middleware.common.Constant
-import com.wdkl.ncs.android.middleware.common.MessageEvent
-import com.wdkl.ncs.android.middleware.logic.contract.nursehome.DeviceContract
-import com.wdkl.ncs.android.middleware.logic.presenter.nursehome.DevicePresenter
-import com.wdkl.ncs.android.middleware.model.ThirdServerInfo
-import com.wdkl.ncs.android.middleware.model.vo.NurseDeviceInfoVO
-import com.wdkl.ncs.android.middleware.tcp.enums.DeviceTypeEnum
-import com.wdkl.ncs.android.middleware.udp.ServerInfoUtil
-import com.wdkl.ncs.android.middleware.utils.CommonUtils
-import kotlinx.android.synthetic.main.activity_register.*
-import okhttp3.OkHttpClient
-import okhttp3.Request
-import org.greenrobot.eventbus.Subscribe
-import org.greenrobot.eventbus.ThreadMode
-import serialporttest.utils.SerialPortUtil
-import java.lang.StringBuilder
-import java.util.concurrent.TimeUnit
-
-/**
- *注册页Activity
- */
-@Router(path = "/nursehome/register")
-class RegisterActivity : BaseActivity<DevicePresenter, ActivityRegisterBinding>(),  DeviceContract.View {
-    var TAG = RegisterActivity::class.java.getSimpleName()
-
-    val QR_CODE_PATH = "http://m.wdklian.com/care/apk/care.user?type=NCS_DEVICE"
-
-    private val handler by lazy { Handler() }
-
-    private var serverIp = ""
-    private var serverSuccess = false
-    private var cancelRestart = false
-    private var homeLaunch = false
-
-    /**
-     * 提供layoutID
-     */
-    override fun getLayId(): Int {
-        return R.layout.activity_register
-    }
-    /**
-     *初始化依赖注入
-     */
-    override fun bindDagger() {
-        NurseHomeLaunch.component.inject(this)
-    }
-    /**
-     *初始化操作
-     */
-    override fun init() {
-        AppTool.SystemUI.showNavigationBar(this,false)
-        AppTool.SystemUI.ImmersiveWithBottomBarColor(this, Color.BLACK)
-
-        //open serial port
-        SerialPortUtil.getInstance().openSerialPort()
-
-        requestPermissions()
-
-        SoundPoolManager.getInstance().init()
-
-        if ("rk3128" == Build.MODEL) {
-            btn_test.visibility = View.VISIBLE
-        } else {
-            btn_test.visibility = View.GONE
-        }
-    }
-
-    private fun reload() {
-        tv_local_ip.text = "IP: " + NetHelper.getInstance().localIP + ", server: " + serverIp
-
-        handler.postDelayed({
-            presenter.loadData(Constant.DEVICE_REGISTER_ID!!)
-        }, 30000)
-    }
-
-    private fun permissionGranted() {
-        Constant.DEVICE_REGISTER_ID = NetHelper.getInstance().macAddress
-        Log.e(TAG,"mac "+ Constant.DEVICE_REGISTER_ID)
-        tv_local_mac.text = "MAC:"+ Constant.DEVICE_REGISTER_ID
-
-        Thread{
-            //val logoBitmap = BitmapFactory.decodeResource(resources, R.mipmap.erlogo)
-            var builder = StringBuilder()
-            builder.append(QR_CODE_PATH)
-            builder.append("&code=")
-            builder.append(Constant.DEVICE_CODE)
-            builder.append("&mac=")
-            builder.append(Constant.DEVICE_REGISTER_ID)
-            builder.append("&model=")
-            builder.append(Constant.DEVICE_MODEL)
-            builder.append("&hard_ver=")
-            builder.append(Constant.DEVICE_HARD_VER)
-            builder.append("&soft_ver=")
-            builder.append(Constant.DEVICE_SOFT_VER)
-            builder.append("&device_type=")
-            builder.append(DeviceTypeEnum.NURSE_HOST.value())
-            builder.append("&device_name=")
-            builder.append(DeviceTypeEnum.NURSE_HOST.typeName())
-            val code = EcodeHelper().createQRImage(builder.toString(),320, null)
-            activity.runOnUiThread {
-                view_qr_code?.setImageBitmap(code)
-            }
-        }.start()
-        //val macAddr = NetHelper.getInstance().macAddress
-        val ipAddr = NetHelper.getInstance().localIP
-        val buildUrl = UrlManager.build()
-        serverIp =  buildUrl.buyer.substringAfterLast("//").substringBefore(":")
-
-        tv_local_ip.text = "IP: " + ipAddr + ", server: " + serverIp
-        tv_local_mac.text = "MAC: " + Constant.DEVICE_REGISTER_ID
-        val str = ("App name: " + getString(R.string.wdkl_app_name)
-                + "\r\nAPP version: V" + BuildConfig.VERSION_NAME + "_" + BuildConfig.VERSION_CODE + "_" + Build.MODEL
-                + "\r\nRelease:" + BuildConfig.BUILD_TIME
-                + "\r\nSDK: " + Build.VERSION.SDK_INT)
-
-        if (Constant.DEVICE_7INCH) {
-            tv_app_version.text = str + "\r\n--7inch"
-        } else {
-            tv_app_version.text = str
-        }
-        //tv_mcu_version.text = "MCU版本: " + Constants.MCU_VERSION_NUMBER
-
-        //检查服务器地址接口是否可用,可用则进入下一步获取设备信息,不可用则稍后再次尝试
-        checkServer()
-    }
-
-    private fun requestPermissions(){
-        Observable.just("").compose(
-            RxPermissions(this).ensure(
-                Manifest.permission.CAMERA,
-                Manifest.permission.READ_EXTERNAL_STORAGE,
-                Manifest.permission.WRITE_EXTERNAL_STORAGE,
-                Manifest.permission.ACCESS_WIFI_STATE,
-                Manifest.permission.RECORD_AUDIO,
-                Manifest.permission.READ_PHONE_STATE
-            )
-        ).subscribe {
-            if (it){
-                Log.e(TAG,"拿到APP所有权限")
-                permissionGranted()
-            }else{
-                showMessage(R.string.permission_grant_tips)
-                requestPermissions()
-            }
-        }.joinManager(disposableManager)
-    }
-
-    private fun checkServer() {
-        Thread {
-            while (!serverSuccess) {
-                val okHttpClient = OkHttpClient().newBuilder()
-                    .connectTimeout(15 * 1000L, TimeUnit.MILLISECONDS)
-                    .readTimeout(15 * 1000L, TimeUnit.MILLISECONDS)
-                    .writeTimeout(15 * 1000L, TimeUnit.MILLISECONDS)
-                    .build()
-                val url: String = CommonUtils.getUrl(BaseApplication.appContext)
-                val port: String = CommonUtils.getUrlPort(BaseApplication.appContext)
-                val request = Request.Builder()
-                    .url("http://$url:$port/ncs_url/server_info")
-                    .get()
-                    .build()
-
-                try {
-                    val response = okHttpClient.newCall(request).execute()
-                    if (response != null && response.isSuccessful) {
-                        //接口数据获取成功,进入下一步获取设备信息
-                        serverSuccess = true
-                        presenter.loadData(Constant.DEVICE_REGISTER_ID!!)
-                    } else {
-                        //接口数据获取失败,可能服务器ip不对,尝试重新获取服务器ip
-                        val info = ServerInfoUtil.get(Constant.DEVICE_REGISTER_ID!!)
-                        checkServerInfo(info)
-                    }
-                } catch (e: Exception) {
-                    //接口数据获取失败,可能服务器ip不对,尝试重新获取服务器ip
-                    val info = ServerInfoUtil.get(Constant.DEVICE_REGISTER_ID!!)
-                    checkServerInfo(info)
-                    //e.printStackTrace()
-                }
-
-                try {
-                    Thread.sleep(30000)
-                } catch (ex: Exception) {
-                    ex.printStackTrace()
-                }
-            }
-        }.start()
-    }
-
-    private fun checkServerInfo(info: ThirdServerInfo?) {
-        //检查获取到的服务器ip是否可用,可用则重启app重新初始化,不可用则什么都不做,等待下次重新获取服务器ip
-        if (info != null) {
-            if (info.thirdServer == null || info.thirdServerPort == null) {
-                Log.d(TAG, "server info data null")
-                showMsgMain("get server data null")
-            } else {
-                val okHttpClient = OkHttpClient().newBuilder()
-                    .connectTimeout(15 * 1000L, TimeUnit.MILLISECONDS)
-                    .readTimeout(15 * 1000L, TimeUnit.MILLISECONDS)
-                    .writeTimeout(15 * 1000L, TimeUnit.MILLISECONDS)
-                    .build()
-                val request = Request.Builder()
-                    .url("http://${info.thirdServer}:${info.thirdServerPort}/ncs_url/server_info")
-                    .get()
-                    .build()
-
-                try {
-                    val response = okHttpClient.newCall(request).execute()
-                    if (response != null && response.isSuccessful) {
-                        //接口数据获取成功,稍后重启app
-                        serverSuccess = true
-                        CommonUtils.setUrl(activity, info.thirdServer)
-                        CommonUtils.setUrlPort(activity, info.thirdServerPort.toString())
-                        showMsgMain("restart...")
-                        handler.postDelayed({
-                            if (!cancelRestart) {
-                                AppUpdateHelper.restartApp(activity)
-                            }
-                        }, 10000)
-                    }
-                } catch (e: Exception) {
-                    e.printStackTrace()
-                    showMsgMain("server error or net error")
-                }
-            }
-        } else {
-            Log.d(TAG, "server info null")
-            showMsgMain("get server null")
-        }
-    }
-
-    private fun showMsgMain(msg: String) {
-        runOnUiThread {
-            showMessage(msg)
-        }
-    }
-
-    /**
-     *显示数据
-     */
-    override fun showData(data : NurseDeviceInfoVO) {
-        Log.e(TAG,"收到返回的设备信息 "+data.hospitalName)
-        Log.e(TAG,"收到返回的设备信息 "+data.partName)
-        Log.e(TAG,"收到返回的设备信息 "+data.partId)
-        Log.e(TAG,"收到返回的设备信息 "+data.id)
-        Log.e(TAG,"收到返回的设备信息 "+data.sipId)
-        Log.e(TAG,"收到返回的设备信息 "+data.toString())
-
-        Constant.hospital_name = data.hospitalName
-        Constant.part_name = data.partName
-        Constant.partDisplay = data.partDisplay
-        Constant.part_id = data.partId
-        Constant.DEVICE_ID = data.id
-        Constant.SIP_ID = data.sipId
-        Constant.eth_ip = data.ethIp
-        if (data.hospitalId != null) {
-            Constant.hospital_id = data.hospitalId
-        }
-        if (data.sipIp != null) {
-            Constant.sip_ip = data.sipIp
-        }
-
-        Constant.DEVICE_CODE = data.code
-        Constant.DEVICE_MODEL =  data.model
-        Constant.DEVICE_HARD_VER =  data.hardVer
-        Constant.DEVICE_SOFT_VER = data.softVer
-        if (data.deviceType != null) {
-            Constant.DEVICE_TYPE = data.deviceType
-        }
-        if (data.name != null) {
-            Constant.DEVICE_NAME = data.name
-        }
-        if (data.backupId != null) {
-            Constant.back_id = data.backupId
-        }
-
-        if(TextUtils.isEmpty(data.partId.toString())|| TextUtils.isEmpty(data.id.toString())
-                || TextUtils.isEmpty(data.sipId)){
-            feedback_device_info_tv.setText(R.string.device_init_fail)
-            showMessage(R.string.device_init_fail)
-            reload()
-            return
-        } else if (data.status != null && data.status == 0) {
-            feedback_device_info_tv.setText(R.string.device_disabled)
-            showMessage(R.string.device_disabled)
-            reload()
-            return
-        }
-
-        handler.removeCallbacksAndMessages(null)
-
-        AppTool.Time.delay(1000) {
-            if (!homeLaunch) {
-                homeLaunch = true
-                push("/nursehome/main")
-                finish()
-            }
-        }
-    }
-
-    /**
-     *绑定事件
-     */
-    override fun bindEvent() {
-        btn_reload.isEnabled = false
-        btn_reload.setOnClickListener {
-            btn_reload.isEnabled = false
-            presenter.loadData(Constant.DEVICE_REGISTER_ID!!)
-        }
-
-        btn_get_server.setOnClickListener {
-            btn_get_server.isEnabled = false
-            Thread {
-                val info = ServerInfoUtil.get(Constant.DEVICE_REGISTER_ID!!)
-                runOnUiThread {
-                    btn_get_server.isEnabled = true
-                    if (info != null) {
-                        Log.d(TAG, "server info-" + info.thirdServer)
-                        showMessage("server info: ${info.thirdServer}")
-                        tv_local_ip.text = "IP: ${NetHelper.getInstance().localIP}, server: ${info.thirdServer}"
-                    } else {
-                        Log.d(TAG, "server info null")
-                        showMessage("server info null")
-                    }
-                }
-
-                if (info != null && info.thirdServer != null && info.thirdServerPort != null) {
-                    CommonUtils.setUrl(activity, info.thirdServer)
-                    CommonUtils.setUrlPort(activity, info.thirdServerPort.toString())
-                }
-            }.start()
-        }
-
-        btn_set_server.setOnClickListener {
-            cancelRestart = true
-            handler.removeCallbacksAndMessages(null)
-            ServerConfigDialogHelper.showPasswordDialog(activity)
-        }
-
-        btn_reboot.setOnClickListener {
-            cancelRestart = true
-            handler.removeCallbacksAndMessages(null)
-            AppUpdateHelper.restartApp(activity)
-        }
-
-        btn_set_language.setOnClickListener {
-            cancelRestart = true
-            handler.removeCallbacksAndMessages(null)
-            LanguageSetDialogHelper.showDialog(activity)
-        }
-
-        btn_test.setOnClickListener {
-            cancelRestart = true
-            handler.removeCallbacksAndMessages(null)
-            PasswordDialogHelper.showPasswordDialog(activity) {
-                push("/nursehome/test")
-            }
-        }
-    }
-    /**
-     *页面销毁回调
-     */
-    override fun destory() {
-        handler.removeCallbacksAndMessages(null)
-        SoundPoolManager.getInstance().release()
-    }
-
-    /**
-     *处理错误信息
-     */
-    override fun onError(message: String, type: Int) {
-        btn_reload.isEnabled = true
-        showMessage("Load error: $message")
-        reload()
-    }
-
-    override fun onNoneNet() {
-        //Log.e(TAG,"none net ")
-        btn_reload.isEnabled = true
-        showMessage("None net")
-        reload()
-    }
-
-    /**
-     *耗时加载完成
-     */
-    override fun complete(message: String, type: Int) {
-    }
-    /**
-     *耗时加载开始
-     */
-    override fun start() {
-    }
-    /**
-     *处理网络状态
-     */
-    override fun networkMonitor(state: NetState) {
-    }
-
-    @Subscribe(threadMode = ThreadMode.MAIN)
-    fun onMoonEvent(messageEvent: MessageEvent) {
-    }
-
-}

+ 0 - 273
android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/fragment/EntraceGuardVideoFragment.kt.bak

@@ -1,273 +0,0 @@
-package com.wdkl.ncs.android.component.nursehome.fragment
-
-import android.os.Bundle
-import android.os.Handler
-import android.os.Looper
-import android.support.v4.app.Fragment
-import android.util.Log
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import com.enation.javashop.utils.base.tool.BaseToolActivity
-import com.wdkl.core.voip.VoipEvent
-import com.wdkl.ncs.android.component.nursehome.R
-import com.wdkl.ncs.android.middleware.common.Constants
-import com.wdkl.ncs.android.component.nursehome.util.RingPlayHelper
-import com.wdkl.ncs.android.middleware.model.vo.InteractionVO
-import com.wdkl.ncs.android.middleware.tcp.TcpClient
-import com.wdkl.ncs.android.middleware.tcp.channel.DeviceChannel
-import com.wdkl.ncs.android.middleware.tcp.channel.EntraceGuardUtil
-import com.wdkl.ncs.android.middleware.tcp.dto.TcpModel
-import com.wdkl.ncs.android.middleware.tcp.enums.TcpAction
-import com.wdkl.ncs.android.middleware.tcp.enums.TcpType
-import com.wdkl.ncs.android.middleware.utils.MessageEvent
-import com.wdkl.skywebrtc.CallSession
-import com.wdkl.skywebrtc.EnumType
-import com.wdkl.skywebrtc.SkyEngineKit
-import com.wdkl.skywebrtc.except.NotInitializedException
-import kotlinx.android.synthetic.main.fragment_entraceguard_video.*
-import org.greenrobot.eventbus.EventBus
-import org.greenrobot.eventbus.Subscribe
-import org.greenrobot.eventbus.ThreadMode
-import org.webrtc.SurfaceViewRenderer
-
-/**
- * 门禁机请求开门视频界面fragment
- */
-class EntraceGuardVideoFragment : Fragment(), CallSession.CallSessionCallback {
-
-    private var layout: View? = null
-    protected lateinit var baseActivity: BaseToolActivity
-
-    protected var gEngineKit: SkyEngineKit? = null
-
-    private var isMute: Boolean = true
-    private var remoteSurfaceView: SurfaceViewRenderer? = null
-
-    private val handler = Handler(Looper.getMainLooper())
-
-    var interactionVO: InteractionVO? = null
-    var tcpModel: TcpModel? = null
-
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        EventBus.getDefault().register(this)
-    }
-
-    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
-        if (layout == null) {
-            layout = inflater.inflate(R.layout.fragment_entraceguard_video, null)
-        }
-
-        /**初始化宿主Activity*/
-        baseActivity = getActivity() as BaseToolActivity
-
-        return layout
-    }
-
-    override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {
-        super.onViewCreated(view, savedInstanceState)
-        EntraceGuardUtil.acceptStranger(tcpModel)
-
-        try {
-            SkyEngineKit.init(VoipEvent())
-            gEngineKit = SkyEngineKit.Instance()
-        } catch (e: NotInitializedException) {
-            SkyEngineKit.init(VoipEvent())
-            try {
-                gEngineKit = SkyEngineKit.Instance()
-            } catch (ex: NotInitializedException) {
-                ex.printStackTrace()
-                baseActivity.finish()
-            }
-        }
-
-        init()
-        bindEvent()
-    }
-
-
-    override fun onDestroy() {
-        super.onDestroy()
-        RingPlayHelper.stopRingTone()
-        EventBus.getDefault().unregister(this)
-    }
-
-
-    private fun init() {
-        val session = gEngineKit?.getCurrentSession()
-        if (session != null) {
-            session.setSessionCallback(this)
-        }
-        title.setText(interactionVO!!.fromDeviceName + ",请求开门")
-        RingPlayHelper.playRingTone(activity, R.raw.door_bell, true)
-        speaker_on.isSelected = isMute
-
-    }
-
-    private fun bindEvent() {
-
-        unlock_door.setOnClickListener {
-            var tcpModel = EntraceGuardUtil.unlockDoor(interactionVO)
-            TcpClient.getInstance().sendMsg(tcpModel.toJson())
-            SkyEngineKit.Instance().endCall()
-            Constants.CALL_STATE = Constants.CALL_STANDBY
-            DeviceChannel.calling = false
-            backToMain()
-        }
-
-        sky_voice_call_hangup.setOnClickListener {
-
-            //发送挂断消息
-            TcpClient.getInstance().sendMsg(EntraceGuardUtil.hangup(interactionVO).toJson())
-            //结束sip通话
-            SkyEngineKit.Instance().endCall()
-            Constants.CALL_STATE = Constants.CALL_STANDBY
-            DeviceChannel.calling = false
-            backToMain()
-        }
-
-        speaker_on.setOnClickListener {
-            var session = gEngineKit?.currentSession
-            if (session != null) {
-                isMute = !isMute
-                session.toggleMuteAudio(isMute)
-                session.toggleSpeaker(!isMute)
-                speaker_on.isSelected = isMute
-                TcpClient.getInstance().sendMsg(EntraceGuardUtil.toggleAudio(interactionVO, isMute).toJson())
-            }
-            RingPlayHelper.stopRingTone()
-        }
-
-    }
-
-    private fun backToMain() {
-
-        RingPlayHelper.stopRingTone()
-        EventBus.getDefault().post(MessageEvent("BackCall", Constants.EVENT_REMOVE_CALL_FRAGMENT))
-    }
-
-
-    @Subscribe(threadMode = ThreadMode.MAIN)
-    fun onMoonEvent(messageEvent: MessageEvent) {
-        when (messageEvent.getType()) {
-            Constants.EVENT_JOIN_HOME_READY -> {
-                Log.i("wdkl", "准备加入房间")
-                val session = SkyEngineKit.Instance().getCurrentSession()
-                if (session != null) {
-                    session.toggleSpeaker(false)
-                    session.toggleMuteAudio(true)
-                    Log.d("WDKL", "session = " + session + "; session.getState() = " + session.state + ",roomId=" + session.roomId)
-                    session.setSessionCallback(this)
-                    session.joinHome(session.roomId)
-                }else{ //会话未成功建立
-                    EntraceGuardUtil.rejectStranger(interactionVO)
-                    backToMain()
-                }
-            }
-            Constants.EVENT_TCP_MSG -> {
-                var tcpModel = messageEvent.getMessage() as TcpModel
-                if (tcpModel.getType() == TcpType.ENTRACEGUARD) { //超时未响应,结束通话退出界面
-                    if(tcpModel.action == TcpAction.EntraceGuardAction.TIMEOUT){
-                        SkyEngineKit.Instance().endCall()
-                        backToMain()
-                    }
-
-                }
-            }
-        }
-    }
-
-
-    //视频来电接通
-    private fun joinVideoCall() {
-        val session = gEngineKit?.getCurrentSession()
-        if (session != null) {
-            Log.e("dds", "video call session state: " + session.state)
-
-//            if (session.state == EnumType.CallState.Incoming) {
-//                val surfaceView = gEngineKit!!.currentSession.setupLocalVideo(false)
-//                if (surfaceView != null) {
-//                    localSurfaceView = surfaceView as SurfaceViewRenderer
-//                    localSurfaceView!!.setZOrderMediaOverlay(false)
-//                    fullscreen_video_frame.addView(localSurfaceView)
-//                }
-//
-//                session.joinHome(session.roomId)
-//                session.toggleSpeaker(true)
-//            } else if (session.state == EnumType.CallState.Idle) {
-//                callEnd()
-//                return
-//            }
-
-//            Handler().postDelayed({
-//                if (session.state == EnumType.CallState.Connected){
-//                    //showCalling(onlyAudio)
-//                } else {
-//                    gEngineKit?.endCall()
-//                    callEnd()
-//                }
-//            }, 2000)
-        }
-    }
-
-    override fun didChangeState(var1: EnumType.CallState?) {
-
-    }
-
-    override fun didDisconnected(userId: String?) {
-
-    }
-
-    override fun didCreateLocalVideoTrack() {
-
-    }
-
-    override fun didError(error: String?) {
-
-    }
-
-    //处理远端视频画面
-    override fun didReceiveRemoteVideoTrack(userId: String?) {
-        Log.e("dds", "didReceiveRemoteVideoTrack  userId: " + userId)
-        handler.post {
-            val session = gEngineKit!!.currentSession
-            if (session != null) {
-//                //本地画面
-//                if (localSurfaceView != null) {
-//                    localSurfaceView!!.setZOrderMediaOverlay(true)
-//                    if (outGoing) {
-//                        if (localSurfaceView!!.parent != null) {
-//                            (localSurfaceView!!.parent as ViewGroup).removeView(localSurfaceView)
-//                        }
-//                        pip_video_frame!!.addView(localSurfaceView)
-//                    }
-//                }
-
-                //远端画面
-                val surfaceView = gEngineKit!!.currentSession.setupRemoteVideo(userId, false)
-                Log.e("dds", "didReceiveRemoteVideoTrack,surfaceView = $surfaceView")
-                if (surfaceView != null) {
-                    remoteSurfaceView = surfaceView as SurfaceViewRenderer
-                    remote_video_surface.removeAllViews()
-//                        if (remoteSurfaceView!!.parent != null) {
-//                            (remoteSurfaceView!!.parent as ViewGroup).removeView(remoteSurfaceView)
-//                        }
-                    remote_video_surface.addView(remoteSurfaceView)
-                }
-            }
-        }
-    }
-
-    override fun didCallEndWithReason(var1: EnumType.CallEndReason?) {
-
-    }
-
-    override fun didChangeMode(isAudioOnly: Boolean) {
-
-    }
-
-    override fun didUserLeave(userId: String?) {
-
-    }
-}

+ 86 - 7
android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/fragment/LedSettingsFragment.kt

@@ -81,7 +81,7 @@ class LedSettingsFragment: Fragment() {
                 val font = BaseApplication.appContext.getString(R.string.led_font_size, item.fontSize)
                 tv_led_font_size.setText(font)
 
-                btn_ping.visibility = View.VISIBLE
+                ll_led_buttons.visibility = View.VISIBLE
                 btn_ping.setOnClickListener {
                     //ping点阵屏设备
                     if (!TextUtils.isEmpty(item.ip)) {
@@ -102,6 +102,22 @@ class LedSettingsFragment: Fragment() {
                         }.start()
                     }
                 }
+
+                btn_led_on.setOnClickListener {
+                    if (!TextUtils.isEmpty(item.ip)) {
+                        LedManagerUtils.getInstance().powerOnOff(item.ip, true)
+                    } else {
+                        showMessage("No Led device")
+                    }
+                }
+
+                btn_led_off.setOnClickListener {
+                    if (!TextUtils.isEmpty(item.ip)) {
+                        LedManagerUtils.getInstance().powerOnOff(item.ip, false)
+                    } else {
+                        showMessage("No Led device")
+                    }
+                }
             }
         })
 
@@ -113,6 +129,7 @@ class LedSettingsFragment: Fragment() {
         val ledProgramTime = SettingConfig.getLedProgramTime(baseActivity)
         val ledVoiceVolume = SettingConfig.getLedVoiceVolume(baseActivity)
         val ledVoiceTimes = SettingConfig.getLedVoiceTimes(baseActivity)
+        val ledVoiceSpeed = SettingConfig.getLedVoiceSpeed(baseActivity)
         val ledInfoType = SettingConfig.getLedInfoType(baseActivity)
         val info = SettingConfig.getLedCustomInfo(baseActivity)
 
@@ -128,6 +145,10 @@ class LedSettingsFragment: Fragment() {
         tv_led_voice_times.setText(ledTimes)
         skb_led_voice_times.progress = ledVoiceTimes
 
+        val voiceSpeed = BaseApplication.appContext.getString(R.string.led_voice_speed, ledVoiceSpeed)
+        tv_led_voice_speed.setText(voiceSpeed)
+        skb_led_voice_speed.progress = ledVoiceSpeed
+
         //led_refresh.setRefreshFooter(ClassicsFooter(activity))
 
         if (ledInfoType == 1) {
@@ -138,6 +159,26 @@ class LedSettingsFragment: Fragment() {
             rb_date_time.isChecked = true
             led_custom_content.visibility = View.INVISIBLE
         }
+
+        if (SettingConfig.getLedType(baseActivity) == 0) {
+            //T卡
+            radio_led_type_t4.isChecked = true
+        } else {
+            //C卡
+            radio_led_type_c2m.isChecked = true
+        }
+
+        if (SettingConfig.getLedAutoSyncTime(baseActivity)) {
+            radio_led_sync_time_on.isChecked = true
+        } else {
+            radio_led_sync_time_off.isChecked = true
+        }
+
+        if (SettingConfig.getLedTimeShowSeconds(baseActivity) == 1) {
+            radio_led_time_seconds_on.isChecked = true
+        } else {
+            radio_led_time_seconds_off.isChecked = true
+        }
     }
 
     private fun bindEvent() {
@@ -145,12 +186,6 @@ class LedSettingsFragment: Fragment() {
             CommonUtils.hideInputKeyboard(activity?.window?.decorView?.windowToken)
         }
 
-        btn_back.setOnClickListener {
-            CommonUtils.hideInputKeyboard(activity?.window?.decorView?.windowToken)
-
-            (activity as? NurseHomeActivity)?.backToHome()
-        }
-
         btn_sync_time.setOnClickListener {
             LedManagerUtils.getInstance().syncTime()
         }
@@ -235,6 +270,26 @@ class LedSettingsFragment: Fragment() {
             }
         })
 
+        skb_led_voice_speed.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {
+            override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
+                val times = BaseApplication.appContext.getString(R.string.led_voice_speed, progress)
+                tv_led_voice_speed.setText(times)
+            }
+
+            override fun onStartTrackingTouch(seekBar: SeekBar?) {
+                //
+            }
+
+            override fun onStopTrackingTouch(seekBar: SeekBar?) {
+                if (seekBar!!.progress <= 0) {
+                    val text = BaseApplication.appContext.getString(R.string.less_then, 1)
+                    showMessage(text)
+                    seekBar.progress = 1
+                }
+                SettingConfig.setLedVoiceSpeed(baseActivity, seekBar.progress)
+            }
+        })
+
         val info = SettingConfig.getLedCustomInfo(baseActivity)
         group_led_info_type.setOnCheckedChangeListener { group, checkedId ->
             if (checkedId == R.id.rb_date_time) {
@@ -244,6 +299,30 @@ class LedSettingsFragment: Fragment() {
                 led_custom_content.visibility = View.VISIBLE
             }
         }
+
+        group_led_type.setOnCheckedChangeListener { group, checkedId ->
+            if (checkedId == R.id.radio_led_type_c2m) {
+                SettingConfig.setLedType(baseActivity, 3)
+            } else if (checkedId == R.id.radio_led_type_t4) {
+                SettingConfig.setLedType(baseActivity, 0)
+            }
+        }
+
+        group_led_sync_time.setOnCheckedChangeListener { group, checkedId ->
+            if (checkedId == R.id.radio_led_sync_time_on) {
+                SettingConfig.setLedAutoSyncTime(baseActivity, true)
+            } else if (checkedId == R.id.radio_led_sync_time_off) {
+                SettingConfig.setLedAutoSyncTime(baseActivity, false)
+            }
+        }
+
+        group_led_time_seconds.setOnCheckedChangeListener { group, checkedId ->
+            if (checkedId == R.id.radio_led_time_seconds_on) {
+                SettingConfig.setLedTimeShowSeconds(baseActivity, 1)
+            } else {
+                SettingConfig.setLedTimeShowSeconds(baseActivity, 0)
+            }
+        }
     }
 
     override fun onStart() {

+ 236 - 61
android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/led/LedC2MManager.java

@@ -6,10 +6,10 @@ import android.util.Log;
 
 import com.listenvision.LedC2M;
 import com.listenvision.model.VoiceModel;
+import com.wdkl.ncs.android.component.nursehome.settingconfig.SettingConfig;
 import com.wdkl.ncs.android.lib.base.BaseApplication;
 import com.wdkl.ncs.android.lib.core.locale.LocaleMangerUtils;
 import com.wdkl.ncs.android.middleware.common.Constant;
-import com.wdkl.ncs.android.component.nursehome.settingconfig.SettingConfig;
 
 import java.io.File;
 import java.io.OutputStream;
@@ -29,6 +29,8 @@ import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 
+import static com.wdkl.ncs.android.lib.utils.ExtendMethodsKt.debugLog;
+
 public class LedC2MManager extends LedManager {
     private static final String TAG = "ledC2M";
 
@@ -41,7 +43,7 @@ public class LedC2MManager extends LedManager {
     private static String deleteVoiceText;
     private static boolean stopVoice = false;
 
-    private static long LED_TIMEOUT = 30*60*1000L;
+    private static long LED_TIMEOUT = 60*60*1000L;
 
     private final static Object lockObject = new Object();
 
@@ -54,7 +56,7 @@ public class LedC2MManager extends LedManager {
         this.application = application;
         File file = new File(Constant.C2M_LED_FONT_PATH);
         if (file.exists()) {
-                Constant.ledFontExist=true;
+            Constant.ledFontExist = true;
         } else {
             copyFont();
         }
@@ -69,8 +71,7 @@ public class LedC2MManager extends LedManager {
             ledC2M.copyFontFile(new LedC2M.LedFontCheck() {
                 @Override
                 public void onChecked(boolean check) {
-                    Constant.ledFontExist=check;
-                    //ExtendMethodsKt.showMessage("字库文件copy完成...");
+                    Constant.ledFontExist = check;
                     Log.d(TAG, "led font copy end...");
                 }
             });
@@ -133,15 +134,33 @@ public class LedC2MManager extends LedManager {
         int server_port = 9999;
         String text = "";
         byte[] data;
+        int led_type = SettingConfig.getLedType(BaseApplication.appContext);
 
         if (stopVoice) {
-            data = VoiceModel.getStopVoiceData();
+            if (led_type == 0) {
+                //T卡
+                data = VoiceModel.getStopVoiceDataT4();
+            } else {
+                //默认C卡
+                data = VoiceModel.getStopVoiceDataC2M();
+            }
         } else {
             text = voiceText;
             for (int j = 0; j < 2; j++) {
                 text = text + "," + voiceText;
             }
-            data = VoiceModel.getVoiceData(text);
+
+            int volume = SettingConfig.getLedVoiceVolume(BaseApplication.appContext);
+            int speed = SettingConfig.getLedVoiceSpeed(BaseApplication.appContext);
+            text = "[v" + volume +"]" + "[s" + speed + "]" + text;
+
+            if (led_type == 0) {
+                //T卡
+                data = VoiceModel.getVoiceDataT4(text);
+            } else {
+                //默认C卡
+                data = VoiceModel.getVoiceDataC2M(text);
+            }
         }
 
         DatagramSocket s = null;
@@ -161,8 +180,7 @@ public class LedC2MManager extends LedManager {
             if (Constant.OPEN_DEBUG) {
                 Log.d(TAG, "udp send voice text: " + voiceText + ", voice data hex string: " + VoiceModel.bytesToHexString(data));
             }
-            DatagramPacket p = new DatagramPacket(data, data.length, local,
-                    server_port);
+            DatagramPacket p = new DatagramPacket(data, data.length, local, server_port);
             try {
                 s.send(p);
                 s.close();
@@ -177,18 +195,35 @@ public class LedC2MManager extends LedManager {
         try {
             byte[] data;
             String text = "";
+            int led_type = SettingConfig.getLedType(BaseApplication.appContext);
 
             if (stopVoice) {
-                data = VoiceModel.getStopVoiceData();
+                if (led_type == 0) {
+                    //T卡
+                    data = VoiceModel.getStopVoiceDataT4();
+                } else {
+                    //默认C卡
+                    data = VoiceModel.getStopVoiceDataC2M();
+                }
             } else {
                 text = voiceText;
+                //voiceText.replaceAll("(\\d{1})", " $1");
                 int loop = SettingConfig.getLedVoiceTimes(BaseApplication.appContext) - 1;
                 for (int j = 0; j < loop; j++) {
                     text = text + "," + voiceText;
                 }
-                String volume = Integer.toString(SettingConfig.getLedVoiceVolume(BaseApplication.appContext));
-                text = "[v" + volume +"]" + text;
-                data = VoiceModel.getVoiceData(text);
+
+                int volume = SettingConfig.getLedVoiceVolume(BaseApplication.appContext);
+                int speed = SettingConfig.getLedVoiceSpeed(BaseApplication.appContext);
+                text = "[v" + volume +"]" + "[s" + speed + "]" + text;
+
+                if (led_type == 0) {
+                    //T卡
+                    data = VoiceModel.getVoiceDataT4(text);
+                } else {
+                    //默认C卡
+                    data = VoiceModel.getVoiceDataC2M(text);
+                }
             }
 
             Socket socket = new Socket(ip, 10000);
@@ -216,7 +251,7 @@ public class LedC2MManager extends LedManager {
         @Override
         public void run() {
             //开始组建节目: 如果字体文件不存在则直接返回
-            if (!Constant.LED_EXIST) {
+            if (!Constant.ledFontExist) {
                 return;
             }
 
@@ -232,7 +267,7 @@ public class LedC2MManager extends LedManager {
                         //停止语音
                         stopVoice = true;
                         long h = createDefaultProgram(ledItem.getResolution(), ledItem.getFontSize(), infoType, 3);
-                        if (h != 0) {
+                        if (h != 0 && !TextUtils.isEmpty(ledItem.getIp())) {
                             int result = ledC2M.NetWorkSend(ledItem.getIp(), h);
                             //语音节目
                             if (ledItem.getVoiceOn()) {
@@ -265,7 +300,7 @@ public class LedC2MManager extends LedManager {
                 for (LedItem ledItem : ledList) {
                     if (ledItem != null) {
                         long h = createCallingProgram(ledItem.getResolution(), ledItem.getFontSize());
-                        if (h != 0) {
+                        if (h != 0 && !TextUtils.isEmpty(ledItem.getIp())) {
                             int result = ledC2M.NetWorkSend(ledItem.getIp(), h);
                             //语音节目
                             if (ledItem.getVoiceOn()) {
@@ -284,14 +319,49 @@ public class LedC2MManager extends LedManager {
     }
 
     private long createDefaultProgram(String ledResolution, int fontSize, int type, int savaType) {
+        /*if (!Strings.isNullOrEmpty(ledResolution)){
+            ledWidth = Integer.parseInt(ledResolution.split("x")[0]);
+            ledHeight = Integer.parseInt(ledResolution.split("x")[1]);
+        }*/
+
         long hProgram = 0;
         String language = LocaleMangerUtils.getApplicationLocale().getLanguage();
+        int ledType = SettingConfig.getLedType(application);
+        int isSeconds = SettingConfig.getLedTimeShowSeconds(application);
+        int grayLevel = 1;
+        int nLayout = 0;
+        ledC2M.InitLedType(ledType);
+        if (ledType == 0) {
+            grayLevel = 0;
+            nLayout = 1;
+        }
+
         if (type == 0) {
             //仅显示时间
-            if (LedItem.TYPE_64_16.equals(ledResolution)) {
+            if (LedItem.TYPE_192_32.equals(ledResolution)) {
+                //192x32
+                hProgram = ledC2M.CreateProgram(192, 32, 1,1, savaType);
+                ledC2M.AddProgram(hProgram, 0, 10, 1);
+                if (Locale.CHINESE.getLanguage().equals(language)) {
+                    //左边添加一个静字
+                    ledC2M.AddImageTextArea(hProgram, 0, 1, 0, 0, 48, 32, 0);
+                    ledC2M.AddStaticTextToImageTextArea(hProgram, 0, 1, 0, "静", Constant.C2M_LED_FONT_PATH, 28, 0xff, 1, 0, 0, 0, 1, 1);
+                    //时间
+                    ledC2M.AddDigitalClockArea(hProgram, 0, 2, 48, 0, 144, 32, Constant.C2M_LED_FONT_PATH,
+                            16, 0xff, 0, 0, 0,
+                            1, 0, 1, 1, 1, 1, isSeconds,
+                            0, 0xff, 0, 0xff, 2, 0xff, 1);
+                } else {
+                    ledC2M.AddDigitalClockArea(hProgram, 0, 1, 0, 0, 192, 32, Constant.C2M_LED_FONT_PATH,
+                            16, 0xff, 0, 0, 0,
+                            1, 0, 1, 1, 1, 1, isSeconds,
+                            4, 0xff, 0, 0xff, 2, 0xff, 1);
+                }
+            } else if (LedItem.TYPE_64_16.equals(ledResolution)) {
                 //64x16
-                hProgram = ledC2M.CreateProgram(64, 16, 1,1,savaType);
+                hProgram = ledC2M.CreateProgram(64, 16, 1,grayLevel,savaType);
                 ledC2M.AddProgram(hProgram, 0, 10, 1);
+
                 if (Locale.CHINESE.getLanguage().equals(language)) {
                     ledC2M.AddDigitalClockArea(hProgram, 0, 1, 0, 0, 64, 16, Constant.C2M_LED_FONT_PATH,
                             16, 0xff, 0, 0, 0,
@@ -305,7 +375,7 @@ public class LedC2MManager extends LedManager {
                 }
             } else if (LedItem.TYPE_128_16.equals(ledResolution)) {
                 //128x16
-                hProgram = ledC2M.CreateProgram(128, 16, 1,1,savaType);
+                hProgram = ledC2M.CreateProgram(128, 16, 1,grayLevel,savaType);
                 ledC2M.AddProgram(hProgram, 0, 10, 1);
                 ledC2M.AddDigitalClockArea(hProgram, 0, 1, 0, 0, 128, 16, Constant.C2M_LED_FONT_PATH,
                         16, 0xff, 0, 0, 0,
@@ -313,26 +383,47 @@ public class LedC2MManager extends LedManager {
                         4, 0xff, 0, 0xff, 2, 0xff, 0);
             } else {
                 //默认为128x32
-                hProgram = ledC2M.CreateProgram(128, 32, 1,1, savaType);
+                hProgram = ledC2M.CreateProgram(128, 32, 1,grayLevel, savaType);
                 ledC2M.AddProgram(hProgram, 0, 10, 1);
                 if (Locale.CHINESE.getLanguage().equals(language)) {
                     ledC2M.AddDigitalClockArea(hProgram, 0, 1, 0, 0, 128, 32, Constant.C2M_LED_FONT_PATH,
                             16, 0xff, 0, 0, 0,
-                            1, 0, 1, 1, 1, 1, 1,
+                            1, 0, 1, 1, 1, 1, isSeconds,
                             0, 0xff, 0, 0xff, 2, 0xff, 1);
                 } else {
                     ledC2M.AddDigitalClockArea(hProgram, 0, 1, 0, 0, 128, 32, Constant.C2M_LED_FONT_PATH,
                             16, 0xff, 0, 0, 0,
-                            1, 0, 1, 1, 1, 1, 1,
+                            1, 0, 1, 1, 1, 1, isSeconds,
                             4, 0xff, 0, 0xff, 2, 0xff, 1);
                 }
             }
         } else if (type == 1) {
             //显示时间和自定义内容
             String text = SettingConfig.getLedCustomInfo(application);
-            if (LedItem.TYPE_64_16.equals(ledResolution)) {
+            if (LedItem.TYPE_192_32.equals(ledResolution)) {
+                //192x32
+                hProgram = ledC2M.CreateProgram(192, 32, 1,1,savaType);
+                ledC2M.AddProgram(hProgram, 0, 10, 1);
+                if (Locale.CHINESE.getLanguage().equals(language)) {
+                    ledC2M.AddDigitalClockArea(hProgram, 0, 1, 0, 0, 192, 32, Constant.C2M_LED_FONT_PATH,
+                            16, 0xff, 0, 0, 0,
+                            1, 0, 1, 1, 1, 1, isSeconds,
+                            0, 0xff, 0, 0xff, 2, 0xff, 1);
+                } else {
+                    ledC2M.AddDigitalClockArea(hProgram, 0, 1, 0, 0, 192, 32, Constant.C2M_LED_FONT_PATH,
+                            16, 0xff, 0, 0, 0,
+                            1, 0, 1, 1, 1, 1, isSeconds,
+                            4, 0xff, 0, 0xff, 2, 0xff, 1);
+                }
+
+                if (!TextUtils.isEmpty(text)) {
+                    ledC2M.AddProgram(hProgram, 1, 10, 1);
+                    ledC2M.AddImageTextArea(hProgram, 1, 1, 0, 0, 192, 32, 0);
+                    ledC2M.AddMultiLineTextToImageTextArea(hProgram, 1, 1, 0, text, Constant.C2M_LED_FONT_PATH, fontSize, 0xff, 0, 0, 0, 4, 5, 3, 1, 1);
+                }
+            } else if (LedItem.TYPE_64_16.equals(ledResolution)) {
                 //64x16
-                hProgram = ledC2M.CreateProgram(64, 16, 1,1,savaType);
+                hProgram = ledC2M.CreateProgram(64, 16, 1,grayLevel,savaType);
                 ledC2M.AddProgram(hProgram, 0, 10, 1);
                 if (Locale.CHINESE.getLanguage().equals(language)) {
                     ledC2M.AddDigitalClockArea(hProgram, 0, 1, 0, 0, 64, 16, Constant.C2M_LED_FONT_PATH,
@@ -345,14 +436,15 @@ public class LedC2MManager extends LedManager {
                             0, 0, 0, 0, 1, 1, 0,
                             4, 0xff, 0, 0xff, 2, 0xff, 1);
                 }
+
                 if (!TextUtils.isEmpty(text)) {
                     ledC2M.AddProgram(hProgram, 1, 10, 1);
-                    ledC2M.AddImageTextArea(hProgram, 1, 1, 0, 0, 64, 16, 0);
+                    ledC2M.AddImageTextArea(hProgram, 1, 1, 0, 0, 64, 16, nLayout);
                     ledC2M.AddMultiLineTextToImageTextArea(hProgram, 1, 1, 0, text, Constant.C2M_LED_FONT_PATH, 16, 0xff, 0, 0, 0, 4, 5, 3, 1, 1);
                 }
             } else if (LedItem.TYPE_128_16.equals(ledResolution)){
                 //128x16
-                hProgram = ledC2M.CreateProgram(128, 16, 1,1,savaType);
+                hProgram = ledC2M.CreateProgram(128, 16, 1,grayLevel,savaType);
                 ledC2M.AddProgram(hProgram, 0, 10, 1);
                 ledC2M.AddDigitalClockArea(hProgram, 0, 1, 0, 0, 128, 16, Constant.C2M_LED_FONT_PATH,
                         16, 0xff, 0, 0, 0,
@@ -360,28 +452,28 @@ public class LedC2MManager extends LedManager {
                         4, 0xff, 0, 0xff, 2, 0xff, 0);
                 if (!TextUtils.isEmpty(text)) {
                     ledC2M.AddProgram(hProgram, 1, 10, 1);
-                    ledC2M.AddImageTextArea(hProgram, 1, 1, 0, 0, 128, 16, 0);
+                    ledC2M.AddImageTextArea(hProgram, 1, 1, 0, 0, 128, 16, nLayout);
                     ledC2M.AddMultiLineTextToImageTextArea(hProgram, 1, 1, 0, text, Constant.C2M_LED_FONT_PATH, fontSize, 0xff, 0, 0, 0, 4, 5, 3, 1, 1);
                 }
             } else {
                 //128x32
-                hProgram = ledC2M.CreateProgram(128, 32, 1,1,savaType);
+                hProgram = ledC2M.CreateProgram(128, 32, 1,grayLevel,savaType);
                 ledC2M.AddProgram(hProgram, 0, 10, 1);
                 if (Locale.CHINESE.getLanguage().equals(language)) {
-                    ledC2M.AddDigitalClockArea(hProgram, 0, 1, 0, 0, 128, 32,Constant.C2M_LED_FONT_PATH,
+                    ledC2M.AddDigitalClockArea(hProgram, 0, 1, 0, 0, 128, 32, Constant.C2M_LED_FONT_PATH,
                             16, 0xff, 0, 0, 0,
-                            1, 0, 1, 1, 1, 1, 1,
+                            1, 0, 1, 1, 1, 1, isSeconds,
                             0, 0xff, 0, 0xff, 2, 0xff, 1);
                 } else {
                     ledC2M.AddDigitalClockArea(hProgram, 0, 1, 0, 0, 128, 32, Constant.C2M_LED_FONT_PATH,
                             16, 0xff, 0, 0, 0,
-                            1, 0, 1, 1, 1, 1, 1,
+                            1, 0, 1, 1, 1, 1, isSeconds,
                             4, 0xff, 0, 0xff, 2, 0xff, 1);
                 }
 
                 if (!TextUtils.isEmpty(text)) {
                     ledC2M.AddProgram(hProgram, 1, 10, 1);
-                    ledC2M.AddImageTextArea(hProgram, 1, 1, 0, 0, 128, 32, 0);
+                    ledC2M.AddImageTextArea(hProgram, 1, 1, 0, 0, 128, 32, nLayout);
                     ledC2M.AddMultiLineTextToImageTextArea(hProgram, 1, 1, 0, text, Constant.C2M_LED_FONT_PATH, fontSize, 0xff, 0, 0, 0, 4, 5, 3, 1, 1);
                 }
             }
@@ -392,31 +484,88 @@ public class LedC2MManager extends LedManager {
 
     private long createCallingProgram(String ledResolution, int fontSize) {
         long hProgram = 0;
-        if (LedItem.TYPE_64_16.equals(ledResolution)) {
-            //64x16
-            hProgram = ledC2M.CreateProgram(64, 16, 1, 1, 3);
-            for (int i = 0; i < programTextList.size(); i++) {
-                String text = programTextList.get(i).getText();
-                ledC2M.AddProgram(hProgram, i, SettingConfig.getLedProgramTime(BaseApplication.appContext), 1);
-                ledC2M.AddImageTextArea(hProgram, i, 1, 0, 0, 64, 16, 0);
-                ledC2M.AddMultiLineTextToImageTextArea(hProgram, i, 1, 0, text, Constant.C2M_LED_FONT_PATH, 16, 0xff, 0, 0, 0, 4, 5, 3, 1, 1);
-            }
-        } else if (LedItem.TYPE_128_16.equals(ledResolution)){
-            //128x16
-            hProgram = ledC2M.CreateProgram(128, 16, 1, 1, 3);
-            for (int i = 0; i < programTextList.size(); i++) {
-                ledC2M.AddProgram(hProgram, i, SettingConfig.getLedProgramTime(BaseApplication.appContext), 1);
-                ledC2M.AddImageTextArea(hProgram, i, 1, 0, 0, 128, 16, 0);
-                ledC2M.AddMultiLineTextToImageTextArea(hProgram, i, 1, 0, programTextList.get(i).getText(), Constant.C2M_LED_FONT_PATH, fontSize, 0xff, 0, 0, 0, 4, 5, 3, 1, 1);
+        try {
+            int ledType = SettingConfig.getLedType(application);
+            int grayLevel = 1;
+            int nLayout = 0;
+            ledC2M.InitLedType(ledType);
+            if (ledType == 0) {
+                grayLevel = 0;
+                nLayout = 1;
             }
-        } else {
-            //128x32
-            hProgram = ledC2M.CreateProgram(128, 32, 1, 1, 3);
-            for (int i = 0; i < programTextList.size(); i++) {
-                ledC2M.AddProgram(hProgram, i, SettingConfig.getLedProgramTime(BaseApplication.appContext), 1);
-                ledC2M.AddImageTextArea(hProgram, i, 1, 0, 0, 128, 32, 0);
-                ledC2M.AddMultiLineTextToImageTextArea(hProgram, i, 1, 0, programTextList.get(i).getText(), Constant.C2M_LED_FONT_PATH, fontSize, 0xff, 0, 0, 0, 4, 5, 3, 1, 1);
+
+            if (LedItem.TYPE_192_32.equals(ledResolution)) {
+                //192x32,双行显示
+                hProgram = ledC2M.CreateProgram(192, 32, 1, 1, 3);
+                int programTextCount = programTextList.size(); //呼叫信息数量
+                if (programTextCount == 1) {
+                    ledC2M.AddProgram(hProgram, 0, SettingConfig.getLedProgramTime(BaseApplication.appContext), 1);
+                    //左边添加一个静字
+                    ledC2M.AddImageTextArea(hProgram, 0, 1, 0, 0, 48, 32, 0);
+                    ledC2M.AddStaticTextToImageTextArea(hProgram, 0, 1, 0, "静", Constant.C2M_LED_FONT_PATH, 28, 0xff, 1, 0, 0, 0, 1, 1);
+
+                    ledC2M.AddImageTextArea(hProgram, 0, 2, 48, 0, 144, 16, 0);
+                    //ledC2M.AddSinglelineTextToImageTextArea(hProgram, 0, 1, 0, programTextList.get(0).getText(), Constants.Companion.getC2M_LED_FONT_PATH(), fontSize, 0xff, 0, 0, 0, 4, 5, 3);
+                    ledC2M.AddMultiLineTextToImageTextArea(hProgram, 0, 2, 0, programTextList.get(0).getText(), Constant.C2M_LED_FONT_PATH, fontSize, 0xff, 0, 0, 0, 4, 2, 8, 1, 1);
+                } else {
+                    //一个节目分上下两块区域显示,一个区域显示一个呼叫信息,所以一共需要显示(pSize/2)个节目
+                    int pSize;
+                    if (programTextCount % 2 == 0) {
+                        pSize = programTextCount / 2;
+                    } else {
+                        pSize = programTextCount / 2 + 1;
+                    }
+
+                    Log.e(TAG, "programTextCount= " + programTextCount + ", pSize= " + pSize);
+                    for (int i = 0; i < pSize; i++) {
+                        int textIndex = i * 2;
+                        ledC2M.AddProgram(hProgram, i, SettingConfig.getLedProgramTime(BaseApplication.appContext), 1);
+                        //左边添加一个静字
+                        ledC2M.AddImageTextArea(hProgram, i, 1, 0, 0, 48, 32, 0);
+                        ledC2M.AddStaticTextToImageTextArea(hProgram, i, 1, 0, "静", Constant.C2M_LED_FONT_PATH, 28, 0xff, 1, 0, 0, 0, 1, 1);
+
+                        //上面一行
+                        ledC2M.AddImageTextArea(hProgram, i, 2, 48, 0, 144, 16, 0);
+                        //ledC2M.AddSinglelineTextToImageTextArea(hProgram, i, 1, 0, programTextList.get(textIndex).getText(), Constants.Companion.getC2M_LED_FONT_PATH(), fontSize, 0xff, 0, 0, 0, 4, 5, 3);
+                        ledC2M.AddMultiLineTextToImageTextArea(hProgram, i, 2, 0, programTextList.get(textIndex).getText(), Constant.C2M_LED_FONT_PATH, fontSize, 0xff, 0, 0, 0, 4, 2, 8, 1, 1);
+
+                        if (textIndex + 1 < programTextCount) {
+                            //下面一行
+                            ledC2M.AddImageTextArea(hProgram, i, 3, 48, 16, 144, 16, 0);
+                            //ledC2M.AddSinglelineTextToImageTextArea(hProgram, i, 2, 0, programTextList.get(textIndex + 1).getText(), Constants.Companion.getC2M_LED_FONT_PATH(), fontSize, 0xff, 0, 0, 0, 4, 5, 3);
+                            ledC2M.AddMultiLineTextToImageTextArea(hProgram, i, 3, 0, programTextList.get(textIndex + 1).getText(), Constant.C2M_LED_FONT_PATH, fontSize, 0xff, 0, 0, 0, 4, 2, 8, 1, 1);
+                        }
+                    }
+                }
+            } else if (LedItem.TYPE_64_16.equals(ledResolution)) {
+                //64x16
+                hProgram = ledC2M.CreateProgram(64, 16, 1, grayLevel, 3);
+                for (int i = 0; i < programTextList.size(); i++) {
+                    String text = programTextList.get(i).getText();
+                    ledC2M.AddProgram(hProgram, i, SettingConfig.getLedProgramTime(BaseApplication.appContext), 1);
+                    ledC2M.AddImageTextArea(hProgram, i, 1, 0, 0, 64, 16, nLayout);
+                    ledC2M.AddMultiLineTextToImageTextArea(hProgram, i, 1, 0, text, Constant.C2M_LED_FONT_PATH, 16, 0xff, 0, 0, 0, 4, 5, 3, 1, 1);
+                }
+            } else if (LedItem.TYPE_128_16.equals(ledResolution)) {
+                //128x16
+                hProgram = ledC2M.CreateProgram(128, 16, 1, grayLevel, 3);
+                for (int i = 0; i < programTextList.size(); i++) {
+                    ledC2M.AddProgram(hProgram, i, SettingConfig.getLedProgramTime(BaseApplication.appContext), 1);
+                    ledC2M.AddImageTextArea(hProgram, i, 1, 0, 0, 128, 16, nLayout);
+                    ledC2M.AddMultiLineTextToImageTextArea(hProgram, i, 1, 0, programTextList.get(i).getText(), Constant.C2M_LED_FONT_PATH, fontSize, 0xff, 0, 0, 0, 4, 5, 3, 1, 1);
+                }
+            } else {
+                //128x32
+                hProgram = ledC2M.CreateProgram(128, 32, 1, grayLevel, 3);
+                for (int i = 0; i < programTextList.size(); i++) {
+                    ledC2M.AddProgram(hProgram, i, SettingConfig.getLedProgramTime(BaseApplication.appContext), 1);
+                    ledC2M.AddImageTextArea(hProgram, i, 1, 0, 0, 128, 32, nLayout);
+                    ledC2M.AddMultiLineTextToImageTextArea(hProgram, i, 1, 0, programTextList.get(i).getText(), Constant.C2M_LED_FONT_PATH, fontSize, 0xff, 0, 0, 0, 4, 5, 3, 1, 1);
+                }
             }
+        } catch (Exception e) {
+            Log.e(TAG, "createCallingProgram call exception...");
+            e.printStackTrace();
         }
 
         return hProgram;
@@ -427,6 +576,7 @@ public class LedC2MManager extends LedManager {
     @Override
     public synchronized void updateProgram(String text, int action) {
         synchronized (lockObject) {
+            Log.d(TAG, "update program text: " + text + ", action: " + action);
             if (text == null) {
                 return;
             }
@@ -483,7 +633,7 @@ public class LedC2MManager extends LedManager {
             public void run() {
                 synchronized (lockObject) {
                     //如果字体文件不存在则直接返回
-                    if (!Constant.LED_EXIST) {
+                    if (!Constant.ledFontExist) {
                         return;
                     }
 
@@ -495,7 +645,7 @@ public class LedC2MManager extends LedManager {
                     for (LedItem ledItem : ledList) {
                         if (ledItem != null) {
                             long h = createDefaultProgram(ledItem.getResolution(), ledItem.getFontSize(), infoType, 0);
-                            if (h != 0) {
+                            if (h != 0 && !TextUtils.isEmpty(ledItem.getIp())) {
                                 int result = ledC2M.NetWorkSend(ledItem.getIp(), h);
                                 //语音节目
                                 //if (Constants.Companion.getLedVoiceOn() == 1) {
@@ -505,11 +655,15 @@ public class LedC2MManager extends LedManager {
                                 if (Constant.OPEN_DEBUG) {
                                     Log.d(TAG, "send default program to " + ledItem.getIp() + ", result: " + result);
                                 }
+                                if (result != 0) {
+                                    //节目发送失败
+                                    debugLog(TAG,"send default program to: " + ledItem.getIp() + ", result: " + result);
+                                }
                                 ledC2M.DeleteProgram(h);
-                            }
 
-                            if (needReboot) {
-                                ledC2M.PowerOnOff(ledItem.getIp(), 2);
+                                if (needReboot) {
+                                    ledC2M.PowerOnOff(ledItem.getIp(), 2);
+                                }
                             }
                         }
                     }
@@ -529,7 +683,11 @@ public class LedC2MManager extends LedManager {
     @Override
     public void removeAllProgram() {
         programTextList.clear();
-        sendDefaultProgram(true);
+        if (SettingConfig.getLedType(application) == 0) {
+            sendDefaultProgram(false);
+        } else {
+            sendDefaultProgram(true);
+        }
     }
 
     @Override
@@ -538,6 +696,7 @@ public class LedC2MManager extends LedManager {
             @Override
             public void run() {
                 synchronized (lockObject) {
+                    Log.d(TAG, "sync led time...");
                     for (int i = 0; i < ledList.size(); i++) {
                         ledC2M.AdjustTime(ledList.get(i).getIp());
                     }
@@ -569,6 +728,22 @@ public class LedC2MManager extends LedManager {
     }
 
     @Override
+    public void powerOnOff(final String ip, final boolean on) {
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                int res;
+                if (on) {
+                    res = ledC2M.PowerOnOff(ip, 0);
+                } else {
+                    res = ledC2M.PowerOnOff(ip, 1);
+                }
+                Log.d(TAG, "powerOnOff --> " + ip + ", res=" + res);
+            }
+        }).start();
+    }
+
+    @Override
     public void release() {
         programTextList.clear();
     }

+ 1 - 0
android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/led/LedItem.java

@@ -6,6 +6,7 @@ public class LedItem {
     * type:点阵屏类型,128x32代表128x32点阵,64x16代表64x16点阵,默认为128x32
      */
 
+    public static final String TYPE_192_32 = "192x32";
     public static final String TYPE_128_32 = "128x32";
     public static final String TYPE_128_16 = "128x16";
     public static final String TYPE_64_16 = "64x16";

+ 4 - 3
android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/led/LedManager.java

@@ -2,7 +2,6 @@ package com.wdkl.ncs.android.component.nursehome.led;
 
 import android.app.Application;
 
-
 import com.wdkl.ncs.android.middleware.common.Constant;
 
 import java.io.File;
@@ -33,15 +32,17 @@ public abstract class LedManager {
 
     public abstract void powerOnOff();
 
+    public abstract void powerOnOff(String ip, boolean on);
+
     public abstract void release();
 
     public long checkLedFont() {
         File file = new File(Constant.C2M_LED_FONT_PATH);
         if (file.exists()) {
-            Constant.LED_EXIST=true;
+            Constant.ledFontExist = true;
             return file.length();
         } else {
-            Constant.LED_EXIST=false;
+            Constant.ledFontExist = false;
             return -1;
         }
     }

+ 6 - 0
android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/led/LedManagerUtils.java

@@ -78,6 +78,12 @@ public class LedManagerUtils {
         }
     }
 
+    public void powerOnOff(String ip, boolean on) {
+        if (ledManager != null) {
+            ledManager.powerOnOff(ip, on);
+        }
+    }
+
     public void checkFontFile() {
         if (ledManager != null) {
             long size = ledManager.checkLedFont();

+ 0 - 215
android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/service/RTCKeepLiveService.java.bak

@@ -1,215 +0,0 @@
-package com.wdkl.ncs.android.component.nursehome.service;
-
-import android.app.Service;
-import android.content.Intent;
-import android.os.IBinder;
-import android.support.annotation.Nullable;
-
-import com.starrtc.demo.utils.AEvent;
-import com.starrtc.demo.utils.IEventListener;
-
-
-/**
- * Created by zhangjt on 2017/8/6.
- */
-
-public class RTCKeepLiveService extends Service implements IEventListener {
-    private String TAG = RTCKeepLiveService.class.getSimpleName();
-
-    private String DeviceSipId = "";
-    @Nullable
-    @Override
-    public IBinder onBind(Intent intent) {
-        return null;
-    }
-
-    @Override
-    public void onCreate() {
-        super.onCreate();
-    }
-
-    @Override
-    public void onDestroy()
-    {
-        super.onDestroy();
-        removeListener();
-    }
-
-    @Override
-    public int onStartCommand(Intent intent, int flags, int startId) {
-//        try {
-//            if(intent != null){
-//                DeviceSipId = intent.getStringExtra("DeviceSipId");
-//            }
-//        } catch (Exception e) {
-//            e.printStackTrace();
-//        }
-        initSDK();
-        return super.onStartCommand(intent, flags, startId);
-    }
-
-    private void initSDK(){
-//        MLOC.init(this);
-        initFree();
-    }
-
-    private boolean isLogin = false;
-    //开放版SDK初始化
-    private void initFree(){
-//        MLOC.d("RTCKeepLiveService","initFree");
-//        isLogin = XHClient.getInstance().getIsOnline();
-//        Log.e("RTCKeepLiveService","isLogin "+isLogin);
-//        Log.e("RTCKeepLiveService","MLOC.userId  "+MLOC.userId);
-//        if(!isLogin){
-//            if(!MLOC.userId.equals(DeviceSipId)){
-////                MLOC.userId = ""+(new Random().nextInt(900000)+100000);
-////                MLOC.userId = "0000";
-////                MLOC.saveUserId(MLOC.userId);
-//
-//                MLOC.userId = DeviceSipId;
-//                Log.e(TAG,"userId "+DeviceSipId);
-//                MLOC.saveUserId(MLOC.userId);
-//
-//            }
-            addListener();
-
-//            XHCustomConfig customConfig =  XHCustomConfig.getInstance(this);
-//            customConfig.setChatroomServerUrl(MLOC.CHATROOM_SERVER_URL);
-//            customConfig.setLiveSrcServerUrl(MLOC.LIVE_SRC_SERVER_URL);
-//            customConfig.setLiveVdnServerUrl(MLOC.LIVE_VDN_SERVER_URL);
-//            customConfig.setImServerUrl(MLOC.IM_SERVER_URL);
-//            customConfig.setVoipServerUrl(MLOC.VOIP_SERVER_URL);
-//            customConfig.setLogEnable(false); //关闭SDK调试日志
-////            customConfig.setDefConfigOpenGLESEnable(false);
-////            customConfig.setDefConfigCameraId(1);//设置默认摄像头方向  0后置  1前置
-////            customConfig.setDefConfigVideoSize(XHConstants.XHCropTypeEnum.STAR_VIDEO_CONFIG_360BW_640BH_180SW_320SH);
-//            customConfig.setLogDirPath(Environment.getExternalStorageDirectory().getPath()+"/starrtcLog");
-////            customConfig.setDefConfigCamera2Enable(false);
-////            StarCamera.setFrameBufferEnable(false);
-//            customConfig.initSDKForFree(MLOC.userId, new IXHErrorCallback() {
-//                @Override
-//                public void error(final String errMsg, Object data) {
-//                    MLOC.e("RTCKeepLiveService","error:"+errMsg);
-//                    MLOC.showMsg(RTCKeepLiveService.this,errMsg);
-//                }
-//            },new Handler());
-//
-//            XHClient.getInstance().getChatManager().addListener(new XHChatManagerListener());
-//            XHClient.getInstance().getGroupManager().addListener(new XHGroupManagerListener());
-//            XHClient.getInstance().getVoipManager().addListener(new XHVoipManagerListener());
-//            XHClient.getInstance().getVoipP2PManager().addListener(new XHVoipP2PManagerListener());
-//            XHClient.getInstance().getLoginManager().addListener(new XHLoginManagerListener());
-//            XHVideoSourceManager.getInstance().setVideoSourceCallback(new DemoVideoSourceCallback());
-//
-//            XHClient.getInstance().getLoginManager().loginFree(new IXHResultCallback() {
-//                @Override
-//                public void success(Object data) {
-//                    MLOC.d("RTCKeepLiveService","loginSuccess");
-//                    isLogin = true;
-//                }
-//                @Override
-//                public void failed(final String errMsg) {
-//                    MLOC.d("RTCKeepLiveService","loginFailed "+errMsg);
-//                    MLOC.showMsg(RTCKeepLiveService.this,errMsg);
-//                }
-//            });
-//        }
-    }
-
-    @Override
-    public void dispatchEvent(String aEventID, boolean success, Object eventObj) {
-        switch (aEventID){
-            case AEvent.AEVENT_VOIP_REV_CALLING:{
-//                Intent intent = new Intent(this, VoipRingingActivity.class);
-//                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK );
-//                intent.putExtra("targetId",eventObj.toString());
-//                startActivity(intent);
-            }
-            break;
-            case AEvent.AEVENT_VOIP_REV_CALLING_AUDIO:{
-                //todo 原生startRTC 语音呼入 启动原生的activity
-//                Intent intent = new Intent(this, VoipAudioRingingActivity.class);
-//                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK );
-//                intent.putExtra("targetId",eventObj.toString());
-//                startActivity(intent);
-                //todo 原生startRTC 语音呼入 启动自己修改的activity
-//                Intent intent = new Intent(this, RTCVoipAudioRingingActivity.class);
-//                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK );
-//                intent.putExtra("targetId",eventObj.toString());
-//                startActivity(intent);
-//
-//                Log.e("TAG","本地启动。。。");
-
-            }
-            break;
-            case AEvent.AEVENT_VOIP_P2P_REV_CALLING:
-//                if(MLOC.canPickupVoip){
-//                    Intent intent = new Intent(this, VoipP2PRingingActivity.class);
-//                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK );
-//                    intent.putExtra("targetId",eventObj.toString());
-//                    startActivity(intent);
-//                }
-                break;
-            case AEvent.AEVENT_VOIP_P2P_REV_CALLING_AUDIO:
-//                if(MLOC.canPickupVoip){
-//                    Intent intent = new Intent(this, VoipP2PRingingActivity.class);
-//                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK );
-//                    intent.putExtra("targetId",eventObj.toString());
-//                    startActivity(intent);
-//                }
-                break;
-            case AEvent.AEVENT_C2C_REV_MSG:
-            case AEvent.AEVENT_REV_SYSTEM_MSG:
-//                MLOC.hasNewC2CMsg = true;
-                break;
-            case AEvent.AEVENT_GROUP_REV_MSG:
-//                MLOC.hasNewGroupMsg = true;
-                break;
-            case AEvent.AEVENT_LOGOUT:
-//                removeListener();
-//                this.stopSelf();
-                break;
-            case AEvent.AEVENT_USER_KICKED:
-            case AEvent.AEVENT_CONN_DEATH:
-//                MLOC.d("RTCKeepLiveService","AEVENT_USER_KICKED OR AEVENT_CONN_DEATH");
-//                XHClient.getInstance().getLoginManager().loginFree(new IXHResultCallback() {
-//                    @Override
-//                    public void success(Object data) {
-//                        MLOC.d("RTCKeepLiveService","loginSuccess");
-//                        isLogin = true;
-//                    }
-//                    @Override
-//                    public void failed(final String errMsg) {
-//                        MLOC.d("RTCKeepLiveService","loginFailed "+errMsg);
-//                        MLOC.showMsg(RTCKeepLiveService.this,errMsg);
-//                    }
-//                });
-                break;
-        }
-    }
-
-    private void addListener(){
-        AEvent.addListener(AEvent.AEVENT_LOGOUT,this);
-        AEvent.addListener(AEvent.AEVENT_VOIP_REV_CALLING,this);
-        AEvent.addListener(AEvent.AEVENT_VOIP_REV_CALLING_AUDIO,this);
-        AEvent.addListener(AEvent.AEVENT_VOIP_P2P_REV_CALLING,this);
-        AEvent.addListener(AEvent.AEVENT_C2C_REV_MSG,this);
-        AEvent.addListener(AEvent.AEVENT_REV_SYSTEM_MSG,this);
-        AEvent.addListener(AEvent.AEVENT_GROUP_REV_MSG,this);
-        AEvent.addListener(AEvent.AEVENT_USER_KICKED,this);
-        AEvent.addListener(AEvent.AEVENT_CONN_DEATH,this);
-    }
-
-    private void removeListener(){
-        AEvent.removeListener(AEvent.AEVENT_LOGOUT,this);
-        AEvent.removeListener(AEvent.AEVENT_VOIP_REV_CALLING,this);
-        AEvent.removeListener(AEvent.AEVENT_VOIP_REV_CALLING_AUDIO,this);
-        AEvent.removeListener(AEvent.AEVENT_VOIP_P2P_REV_CALLING,this);
-        AEvent.removeListener(AEvent.AEVENT_C2C_REV_MSG,this);
-        AEvent.removeListener(AEvent.AEVENT_REV_SYSTEM_MSG,this);
-        AEvent.removeListener(AEvent.AEVENT_GROUP_REV_MSG,this);
-        AEvent.removeListener(AEvent.AEVENT_USER_KICKED,this);
-        AEvent.removeListener(AEvent.AEVENT_CONN_DEATH,this);
-    }
-
-}

+ 49 - 0
android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/settingconfig/SettingConfig.java

@@ -121,9 +121,15 @@ public class SettingConfig {
     private static final String KEY_SP_LED_PROGRAM_TIME = "KEY_SP_LED_PROGRAM_TIME";
     private static final String KEY_SP_LED_VOICE_VOLUME = "KEY_SP_LED_VOICE_VOLUME";
     private static final String KEY_SP_LED_VOICE_TIMES = "KEY_SP_LED_VOICE_TIMES";
+    private static final String KEY_SP_LED_VOICE_SPEED = "KEY_SP_LED_VOICE_SPEED";
     private static final String KEY_SP_LED_INFO_TYPE = "KEY_SP_LED_INFO_TYPE";
     private static final String KEY_SP_LED_CUSTOM_INFO = "KEY_SP_LED_CUSTOM_INFO";
 
+    //点阵屏控制卡型号
+    private static final String KEY_SP_LED_TYPE = "KEY_SP_LED_TYPE";
+    private static final String KEY_SP_LED_AUTO_SYNC_TIME = "KEY_SP_LED_AUTO_SYNC_TIME";
+    private static final String KEY_SP_LED_TIME_SHOW_SEC = "KEY_SP_LED_TIME_SHOW_SEC";
+
     //app上次启动时间
     private static final String KEY_SP_APP_START_TIME = "KEY_SP_APP_START_TIME";
 
@@ -212,6 +218,31 @@ public class SettingConfig {
         getEditor(context).putBoolean(KEY_SP_HOST_IS_BROADCAST, on).apply();
     }
 
+    //0--T卡,3--C卡
+    public static int getLedType(Context context) {
+        return getSP(context).getInt(KEY_SP_LED_TYPE, 3);
+    }
+
+    public static void setLedType(Context context, int type) {
+        getEditor(context).putInt(KEY_SP_LED_TYPE, type).apply();
+    }
+
+    public static boolean getLedAutoSyncTime(Context context) {
+        return getSP(context).getBoolean(KEY_SP_LED_AUTO_SYNC_TIME, false);
+    }
+
+    public static void setLedAutoSyncTime(Context context, boolean enable) {
+        getEditor(context).putBoolean(KEY_SP_LED_AUTO_SYNC_TIME, enable).apply();
+    }
+
+    public static int getLedTimeShowSeconds(Context context) {
+        return getSP(context).getInt(KEY_SP_LED_TIME_SHOW_SEC, 0);
+    }
+
+    public static void setLedTimeShowSeconds(Context context, int showSeconds) {
+        getEditor(context).putInt(KEY_SP_LED_TIME_SHOW_SEC, showSeconds).apply();
+    }
+
 
     //语音播报模式
     public static int getTtsMode(Context context) {
@@ -856,6 +887,24 @@ public class SettingConfig {
     }
 
     /**
+     * 获取点阵屏语音播报语速
+     *
+     * @return
+     */
+    public static int getLedVoiceSpeed(Context context) {
+        return getSP(context).getInt(KEY_SP_LED_VOICE_SPEED, 4);
+    }
+
+    /**
+     * 设置点阵屏语音播报语速
+     *
+     * @param value
+     */
+    public static void setLedVoiceSpeed(Context context, int value) {
+        getEditor(context).putInt(KEY_SP_LED_VOICE_SPEED, value).apply();
+    }
+
+    /**
      * 获取点阵屏默认显示类型
      *
      * @return

+ 174 - 10
android_host/src/main/res/layout/fragment_led_settings.xml

@@ -15,7 +15,7 @@
         <RelativeLayout
             android:layout_width="match_parent"
             android:layout_height="wrap_content">
-            <Button
+            <!--<Button
                 android:id="@+id/btn_back"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
@@ -23,7 +23,7 @@
                 android:background="@drawable/selector_button_bg2"
                 android:button="@null"
                 android:text="@string/str_back"
-                android:textSize="20sp" />
+                android:textSize="20sp" />-->
 
             <TextView
                 android:id="@+id/tv_led_empty_titile"
@@ -92,20 +92,159 @@
                     android:text=""
                     android:textSize="20sp" />
 
-                <Button
-                    android:id="@+id/btn_ping"
-                    android:layout_width="wrap_content"
+                <LinearLayout
+                    android:id="@+id/ll_led_buttons"
+                    android:layout_width="match_parent"
                     android:layout_height="wrap_content"
                     android:layout_marginTop="10dp"
-                    android:background="@drawable/selector_button_bg2"
-                    android:button="@null"
-                    android:text="PING"
-                    android:textSize="20sp"
-                    android:visibility="gone"/>
+                    android:visibility="gone">
+                    <Button
+                        android:id="@+id/btn_ping"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:text="PING"
+                        android:textSize="20sp" />
+
+                    <Button
+                        android:id="@+id/btn_led_on"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginLeft="16dp"
+                        android:text="ON"
+                        android:textSize="20sp" />
+
+                    <Button
+                        android:id="@+id/btn_led_off"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginLeft="16dp"
+                        android:text="OFF"
+                        android:textSize="20sp" />
+                </LinearLayout>
             </LinearLayout>
         </LinearLayout>
 
         <!--点阵屏全局设置-->
+        <LinearLayout
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="20dp"
+            android:padding="10dp"
+            android:orientation="horizontal">
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center_vertical"
+                android:text="@string/led_type"
+                android:textColor="#000000"
+                android:textSize="24sp" />
+
+            <RadioGroup
+                android:id="@+id/group_led_type"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="20dp"
+                android:orientation="horizontal">
+
+                <RadioButton
+                    android:id="@+id/radio_led_type_c2m"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/led_type_c2m"
+                    android:textSize="24sp" />
+
+                <RadioButton
+                    android:id="@+id/radio_led_type_t4"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_marginLeft="20dp"
+                    android:text="@string/led_type_t4"
+                    android:textSize="24sp" />
+            </RadioGroup>
+
+        </LinearLayout>
+
+        <LinearLayout
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="20dp"
+            android:padding="10dp"
+            android:orientation="horizontal">
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center_vertical"
+                android:text="@string/led_auto_sync_time"
+                android:textColor="#000000"
+                android:textSize="24sp" />
+
+            <RadioGroup
+                android:id="@+id/group_led_sync_time"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="20dp"
+                android:orientation="horizontal">
+
+                <RadioButton
+                    android:id="@+id/radio_led_sync_time_on"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/str_yes"
+                    android:textSize="24sp" />
+
+                <RadioButton
+                    android:id="@+id/radio_led_sync_time_off"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_marginLeft="20dp"
+                    android:text="@string/str_no"
+                    android:textSize="24sp" />
+            </RadioGroup>
+
+        </LinearLayout>
+
+        <LinearLayout
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="20dp"
+            android:padding="10dp"
+            android:orientation="horizontal">
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center_vertical"
+                android:text="@string/led_time_show_seconds"
+                android:textColor="#000000"
+                android:textSize="24sp" />
+
+            <RadioGroup
+                android:id="@+id/group_led_time_seconds"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="20dp"
+                android:orientation="horizontal">
+
+                <RadioButton
+                    android:id="@+id/radio_led_time_seconds_on"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/str_yes"
+                    android:textSize="24sp" />
+
+                <RadioButton
+                    android:id="@+id/radio_led_time_seconds_off"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_marginLeft="20dp"
+                    android:text="@string/str_no"
+                    android:textSize="24sp" />
+            </RadioGroup>
+
+        </LinearLayout>
+
         <RelativeLayout
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
@@ -243,6 +382,31 @@
                 android:thumb="@drawable/seekbar_thumb"/>
         </LinearLayout>
 
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="10dp"
+            android:padding="14dp"
+            android:orientation="vertical">
+            <TextView
+                android:id="@+id/tv_led_voice_speed"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:text=""
+                android:textSize="22sp" />
+
+            <SeekBar
+                android:id="@+id/skb_led_voice_speed"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center_vertical"
+                android:layout_marginTop="8dp"
+                android:max="10"
+                android:maxHeight="2dp"
+                android:progressDrawable="@drawable/po_seekbar"
+                android:thumb="@drawable/seekbar_thumb"/>
+        </LinearLayout>
+
         <RelativeLayout
             android:layout_width="match_parent"
             android:layout_height="wrap_content"

+ 7 - 0
android_host/src/main/res/values-es/strings.xml

@@ -56,6 +56,12 @@
     <string name="no_custom">Cama vacía o sin dispositivo, llamada fallida</string>
     <string name="no_device">No device</string>
     <string name="not_support_video_call">Not support video call</string>
+
+    <string name="led_auto_sync_time">Sincronización automátiva de led:</string>
+    <string name="led_time_show_seconds">Time show seconds:</string>
+    <string name="led_type">Tipo de LED: </string>
+    <string name="led_type_c2m">C2M</string>
+    <string name="led_type_t4">T4</string>
     <string name="led_resolution">Resolución LED: %s</string>
     <string name="led_voice_on">Voz LED: Encendido</string>
     <string name="led_voice_off">Voz LED: Apagado</string>
@@ -63,6 +69,7 @@
     <string name="led_info_duration">Duración de información de llamada de LED: %d</string>
     <string name="led_voice_volume">Volumen de llamada LED: %d</string>
     <string name="led_voice_times">Tiempos de llamada de LED: %d</string>
+    <string name="led_voice_speed">Velocidad de voz LED: %d</string>
     <string name="less_then">No puede ser menor que: %d</string>
     <string name="led_no_font">Sin archivo de fuente</string>
     <string name="led_font_file_size">Tama?o del archivo de fuente: %d</string>

+ 7 - 0
android_host/src/main/res/values-ru/strings.xml

@@ -57,6 +57,12 @@
     <string name="no_custom">Нет пользовательских настроек или устройств, ошибка вызова</string>
     <string name="no_device">Нет устройства</string>
     <string name="not_support_video_call">Not support video call</string>
+
+    <string name="led_auto_sync_time">Auto sync led time:</string>
+    <string name="led_time_show_seconds">Time show seconds:</string>
+    <string name="led_type">Led Type: </string>
+    <string name="led_type_c2m">C2M</string>
+    <string name="led_type_t4">T4</string>
     <string name="led_resolution">Разрешение экрана: %s</string>
     <string name="led_voice_on">Голосовая трансляция: вкл.</string>
     <string name="led_voice_off">Голосовая трансляция: выкл.</string>
@@ -64,6 +70,7 @@
     <string name="led_info_duration">Продолжительность показа информации о звонке: %d</string>
     <string name="led_voice_volume">Громкость звонка: %d</string>
     <string name="led_voice_times">время вызова экрана: %d</string>
+    <string name="led_voice_speed">Скорость передачи голоса светодиодом: %d</string>
     <string name="less_then">Не может быть меньше: %d</string>
     <string name="led_no_font">Нет файла шрифта</string>
     <string name="led_font_file_size">размер файла шрифта: %d</string>

+ 6 - 0
android_host/src/main/res/values-zh/strings.xml

@@ -56,6 +56,11 @@
     <string name="no_device">没有设备,无法呼叫</string>
     <string name="not_support_video_call">不支持视频通话</string>
 
+    <string name="led_auto_sync_time">自动校准点阵屏时间:</string>
+    <string name="led_time_show_seconds">时间显示秒:</string>
+    <string name="led_type">点阵屏类型: </string>
+    <string name="led_type_c2m">C2M</string>
+    <string name="led_type_t4">T4</string>
     <string name="led_resolution">点阵屏规格: %s</string>
     <string name="led_voice_on">点阵屏语音播报: 开启</string>
     <string name="led_voice_off">点阵屏语音播报: 关闭</string>
@@ -63,6 +68,7 @@
     <string name="led_info_duration">点阵屏呼叫信息显示时长: %d</string>
     <string name="led_voice_volume">点阵屏语音呼叫音量: %d</string>
     <string name="led_voice_times">点阵屏语音呼叫次数: %d</string>
+    <string name="led_voice_speed">点阵屏语音播报语速: %d</string>
     <string name="less_then">不能小于: %d</string>
     <string name="led_no_font">字库文件不存在</string>
     <string name="led_font_file_size">字库文件大小: %d</string>

+ 6 - 0
android_host/src/main/res/values/strings.xml

@@ -57,6 +57,11 @@
     <string name="no_device">No device</string>
     <string name="not_support_video_call">Not support video call</string>
 
+    <string name="led_auto_sync_time">Auto sync led time:</string>
+    <string name="led_time_show_seconds">Time show seconds:</string>
+    <string name="led_type">Led Type: </string>
+    <string name="led_type_c2m">C2M</string>
+    <string name="led_type_t4">T4</string>
     <string name="led_resolution">LED resolution: %s</string>
     <string name="led_voice_on">LED voice: On</string>
     <string name="led_voice_off">LED voice: Off</string>
@@ -64,6 +69,7 @@
     <string name="led_info_duration">LED call info duration: %d</string>
     <string name="led_voice_volume">LED call volume: %d</string>
     <string name="led_voice_times">LED call times: %d</string>
+    <string name="led_voice_speed">LED voice speed: %d</string>
     <string name="less_then">Cannot be less than: %d</string>
     <string name="led_no_font">No font file</string>
     <string name="led_font_file_size">font file size: %d</string>

+ 26 - 5
listenvision/src/main/java/com/listenvision/led.java

@@ -59,16 +59,27 @@ public class led {
             37=冒泡
             38=下雪
          */
-	
+
+	/********************************************************************************************
+	 *	InitLedType				初始化控制卡型号,程序启动,初始化调用一次即可
+	 *
+	 *	参数说明
+	 *				LedType		卡型号   0   	T/A/U/XC/W
+	 *									1   	E
+	 *									2		X
+	 *									3		C
+	 ********************************************************************************************/
+	public native void InitLedType(int LedType);
+
 	/********************************************************************************************
-	 *	CreateProgram				创建节目对象,成功返回节目对象句柄
+	 *	CreateProgram				创建节目对象,成功返回节目对象句柄,注意此处屏宽高及颜色参数必需与设置屏参的屏宽高及颜色一致,否则发送时会提示错误
 	 *
 	 *	参数说明
 	 *				LedWidth		屏的宽度
 	 *				LedHeight		屏的高度
-	 *				ColorType		屏的颜色 1.单色  2.双基色  3.三基色
-	 *				GrayLevel		灰度等级  赋值  1-5对应的灰度等级分别为 无,4,8,16,32
-	 *				SaveType		节目保存位置,默认为0保存为flash节目,3保存为ram节目
+	 *				ColorType		屏的颜色 1.单色  2.双基色  3.三基色     注:C卡全彩参数为3      X系列卡参数固定为 4
+	 *				GrayLevel		灰度等级  赋值  1-5对应的灰度等级分别为 无,4,8,16,32     除C卡外,其它卡传0
+	 *				SaveType		节目保存位置,默认为0保存为flash节目,3保存为ram节目。注:flash节目掉电不清除,ram节目掉电清除。应用场景需要实时刷新的,建议保持为ram节目
 	 *	返回值
 	 *				0				创建节目对象失败
 	 *				非0				创建节目对象成功
@@ -383,6 +394,16 @@ public class led {
 	public native int SetLedCommunicationParameter(String IpStr,String NewIp,String NewNetMask,String NewGateway,String NewMac,int IsClient,String ServerIp,int ServerPort,int IsDHCP,int IsHeartBeat,int HeartBeatTime);
 
 	/*********************************************************************************************
+	 *	GetErrorCodeInfo								获取错误信息
+	 *
+	 *	参数说明
+	 *				nErrCode					错误码
+	 *	返回值
+	 *				返回错误信息
+	 ********************************************************************************************/
+	public native String GetErrorCodeInfo(int nErrCode);
+
+	/*********************************************************************************************
 	*	LedInitServer			启动控制卡心跳包服务
 	*	
 	*	参数说明

+ 92 - 7
listenvision/src/main/java/com/listenvision/model/VoiceModel.java

@@ -8,6 +8,7 @@ import android.text.TextUtils;
 
 public class VoiceModel {
 
+    //C系列控制卡
     //帧头4字节:0x55,0xaa,0x00,0x00
     //地址1字节:0x01  --485通讯屏号,默认1
     //标识1字节:0x01
@@ -18,12 +19,28 @@ public class VoiceModel {
     //帧长度2字节:0x21,0x00
     //语音数据最多512字节:帧头[0xfd],长度[0x00,0x1e],命令字[0x01],文字编码格式[0x00],待合成语音文本[...]
     //帧尾4字节:0x00,0x00,0x0d,0x0a
+    //sample C2M: 55AA0000010111D5000000000000120000001200FD000F01003132333435D3EFD2F4CEC4B1BE00000D0A
 
-    private static byte[] head = {(byte)0x55, (byte)0xaa, (byte)0x00, (byte)0x00, (byte)0x01, (byte)0x01, (byte)0x11, (byte)0xd5, (byte)0x00, (byte)0x00,
+    //T系列控制卡:
+    //帧头:55 AA 00 00
+    //地址:01(可配置)
+    //标志:01
+    //操作码:00 D9
+    //保留:00 00
+    //帧序号:00 00 00 00
+    //总长:“数据”字段的长度。(可不给长度,由控制卡自动计算)
+    //帧长:“数据”字段的长度。(同总长,可不给长度,由控制卡自动计算)
+    //数据:有效数据,格式详细参见 下一节“数据字段格式”。
+    //帧尾:00 00 0D 0A
+    //sample T4:  55AA0000010100D90000000000000000000000002474656C6C3A3132333435D3EFD2F4CEC4B1BE00000D0A
+
+    private static final byte[] head_c = {(byte)0x55, (byte)0xaa, (byte)0x00, (byte)0x00, (byte)0x01, (byte)0x01, (byte)0x11, (byte)0xd5, (byte)0x00, (byte)0x00,
             (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00};
-    private static byte[] end = {(byte)0x00, (byte)0x00, (byte)0x0d, (byte)0x0a};
+    private static final byte[] head_t = {(byte)0x55, (byte)0xaa, (byte)0x00, (byte)0x00, (byte)0x01, (byte)0x01, (byte)0x00, (byte)0xd9, (byte)0x00, (byte)0x00,
+            (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00};
+    private static final byte[] end = {(byte)0x00, (byte)0x00, (byte)0x0d, (byte)0x0a};
 
-    public static byte[] getVoiceData(String text) {
+    public static byte[] getVoiceDataC2M(String text) {
         if (!TextUtils.isEmpty(text)) {
             try {
                 //语音文本字节数组
@@ -46,7 +63,7 @@ public class VoiceModel {
                 //总长度
                 int dataLen = len + 24;
                 byte[] data = new byte[dataLen];
-                System.arraycopy(head, 0, data, 0, 14 /*head.length*/);
+                System.arraycopy(head_c, 0, data, 0, 14 /*head.length*/);
                 System.arraycopy(len2, 0, data, 14 /*head.length*/, 4 /*len2.length*/);
                 System.arraycopy(len1, 0, data, 14+4 /*head.length+len2.length*/, 2 /*len1.length*/);
                 System.arraycopy(voiceData, 0, data, 14+4+2 /*head.length+len2.length+len1.length*/, len /*voiceData.length*/);
@@ -61,8 +78,31 @@ public class VoiceModel {
         return null;
     }
 
-    public static byte[] getStopVoiceData() {
-        byte[] data = {(byte)0x55, (byte)0xaa, (byte)0x00, (byte)0x00, //帧头
+    public static byte[] getVoiceDataT4(String text) {
+        if (!TextUtils.isEmpty(text)) {
+            try {
+                text = "$tell:" + text;
+                //语音文本字节数组
+                byte[] textBytes = text.getBytes("GBK");
+                //总长度
+                int len = textBytes.length;
+                int dataLen = len + 24;
+                byte[] data = new byte[dataLen];
+                System.arraycopy(head_t, 0, data, 0, 20 /*head.length*/);
+                System.arraycopy(textBytes, 0, data, 20 /*head.length*/, len /*voiceData.length*/);
+                System.arraycopy(end, 0, data, 20+len /*head.length+voiceData.length*/, 4 /*end.length*/);
+
+                return data;
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+
+        return null;
+    }
+
+    public static byte[] getStopVoiceDataC2M() {
+        return new byte[]{(byte)0x55, (byte)0xaa, (byte)0x00, (byte)0x00, //帧头
                 (byte)0x01, //地址
                 (byte)0x01, //标识
                 (byte)0x11, (byte)0xd5, //操作码
@@ -73,7 +113,27 @@ public class VoiceModel {
                 (byte)0xfd, (byte)0x00, (byte)0x01, (byte)0x02, //语音数据区域
                 (byte)0x00, (byte)0x00, (byte)0x0d, (byte)0x0a  //帧尾
         };
-        return data;
+    }
+
+    public static byte[] getStopVoiceDataT4() {
+        try {
+            String text = "$tell:";
+            //语音文本字节数组
+            byte[] textBytes = text.getBytes("GBK");
+            //总长度
+            int len = textBytes.length;
+            int dataLen = len + 24;
+            byte[] data = new byte[dataLen];
+            System.arraycopy(head_t, 0, data, 0, 20 /*head.length*/);
+            System.arraycopy(textBytes, 0, data, 20 /*head.length*/, len /*voiceData.length*/);
+            System.arraycopy(end, 0, data, 20+len /*head.length+voiceData.length*/, 4 /*end.length*/);
+
+            return data;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        return null;
     }
 
     //int转字节数组:低字节在前
@@ -118,4 +178,29 @@ public class VoiceModel {
         }
         return sb.toString();
     }
+
+    public static byte[] hexStr2Bytes(String hex) {
+        int len = hex.length();
+        byte[] result;
+        if (len % 2 == 1){
+            //奇数
+            len++;
+            result = new byte[(len/2)];
+            hex="0"+hex;
+        }else {
+            //偶数
+            result = new byte[(len/2)];
+        }
+
+        int j=0;
+        for (int i = 0; i < len; i+=2){
+            result[j]=hexToByte(hex.substring(i,i+2));
+            j++;
+        }
+        return result;
+    }
+
+    public static byte hexToByte(String inHex){
+        return (byte)Integer.parseInt(inHex,16);
+    }
 }

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

@@ -43,7 +43,7 @@ public class Constant {
     public static final String DEV_W_DCHK_10 = "11";//外购大成慧康10寸,带手柄
 
     public static Integer TTSSTATE = 1;
-    public static boolean OPEN_DEBUG = false;
+    public static boolean OPEN_DEBUG = true;
     //红色按键按下时发送广播: com.key.home_down
     //红色按键抬起时发送广播: com.key.home_up
     //外接手柄按键按下时发送广播: com.key.call_down