From 4d12f780ea83eeb30356cd1cb5494b2a241cbd68 Mon Sep 17 00:00:00 2001 From: "844143714@qq,com" <844143714@qq,com> Date: Mon, 27 Apr 2026 22:48:58 +0800 Subject: [PATCH] =?UTF-8?q?=E7=89=A9=E7=90=86=E6=8C=89=E9=94=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/libs/ZY-Interface.jar | Bin 0 -> 11911 bytes .../com/example/kingway/ptt/pttActivity.java | 2 +- .../java/com/stand/standapp/LoginActivity.kt | 13 ++- .../java/com/stand/standapp/MainActivity.kt | 38 ++++--- .../com/stand/standapp/utils/GpioManager.kt | 102 ++++++++++++++++++ 5 files changed, 139 insertions(+), 16 deletions(-) create mode 100644 app/libs/ZY-Interface.jar create mode 100644 app/src/main/java/com/stand/standapp/utils/GpioManager.kt diff --git a/app/libs/ZY-Interface.jar b/app/libs/ZY-Interface.jar new file mode 100644 index 0000000000000000000000000000000000000000..6dd32195259d40cc953cda5ff9a6198109708341 GIT binary patch literal 11911 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 literal 0 HcmV?d00001 diff --git a/app/src/main/java/com/example/kingway/ptt/pttActivity.java b/app/src/main/java/com/example/kingway/ptt/pttActivity.java index edcd36c..0ab8d33 100644 --- a/app/src/main/java/com/example/kingway/ptt/pttActivity.java +++ b/app/src/main/java/com/example/kingway/ptt/pttActivity.java @@ -52,7 +52,7 @@ public class pttActivity extends AppCompatActivity { findViewById(R.id.login).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - SendAtUtil.toLogin("gzzdweb01", "123456", "61.243.1.123", 1, 1); + SendAtUtil.toLogin("admin", "poc123456", "220.154.131.231", 1, 1); } }); diff --git a/app/src/main/java/com/stand/standapp/LoginActivity.kt b/app/src/main/java/com/stand/standapp/LoginActivity.kt index 906d7b3..0394ebb 100644 --- a/app/src/main/java/com/stand/standapp/LoginActivity.kt +++ b/app/src/main/java/com/stand/standapp/LoginActivity.kt @@ -131,17 +131,25 @@ class LoginActivity : AppCompatActivity() { Toast.makeText(this@LoginActivity, "登录成功", Toast.LENGTH_SHORT).show() + // 1. 确保 PTT 引擎已初始化并登录 try { // 确保 PTT 引擎已初始化 com.example.kingway.ptt.MyApplication.init(this@LoginActivity) // 异步初始化 PTT 登录 (区分 Android 业务登录) com.example.kingway.ptt.SendAtUtil.toLogin("gzzdweb01", "123456", "61.243.1.123", 1, 1) } catch (e: Exception) { - Timber.tag("Login").e(e, "检查更新失败") + Timber.tag("PTT").e(e, "PTT init error") } - // 初始化打印机 (异步) + // 2. 启动硬件 GPIO 监听 + try { + com.stand.standapp.utils.GpioManager.init(this@LoginActivity) + com.stand.standapp.utils.GpioManager.startListening() + } catch (e: Exception) { + Timber.tag("GPIO").e(e, "GPIO init error") + } + // 3. 初始化打印机 (异步) PrinterManager.init(this@LoginActivity) startActivity(Intent(this@LoginActivity, MainActivity::class.java)) @@ -150,6 +158,7 @@ class LoginActivity : AppCompatActivity() { val msg = json.optString("msg", "登录失败") Toast.makeText(this@LoginActivity, msg, Toast.LENGTH_SHORT).show() } + } catch (e: Exception) { Timber.tag("Login").e(e, "解析响应失败") Toast.makeText(this@LoginActivity, "服务器响应异常", Toast.LENGTH_SHORT).show() diff --git a/app/src/main/java/com/stand/standapp/MainActivity.kt b/app/src/main/java/com/stand/standapp/MainActivity.kt index 1ae2bd5..8259e4a 100644 --- a/app/src/main/java/com/stand/standapp/MainActivity.kt +++ b/app/src/main/java/com/stand/standapp/MainActivity.kt @@ -37,9 +37,31 @@ class MainActivity : AppCompatActivity() { Timber.tag("MainActivity").d("onPttLoginSuccess called from Native") executeJs("onPttLoginSuccess") } + + // 硬件按键触发 + @JvmStatic + fun onHardwarePttDown() { + instance?.runOnUiThread { + // 直接调用 JSBridge 对象的逻辑以复用保护机制 + val jsInterface = instance?.mAgentWeb?.webCreator?.webView?.tag as? AndroidInterface + // 或者更直接一点,我们把逻辑抽离出来 + instance?.pttInterface?.pttSpeakPlay() + // 通知 H5 更新 UI + executeJs("onHardwarePttDown") + } + } + + @JvmStatic + fun onHardwarePttUp() { + instance?.runOnUiThread { + instance?.pttInterface?.pttSpeakRelease() + executeJs("onHardwarePttUp") + } + } } private var mAgentWeb: AgentWeb? = null + private var pttInterface: AndroidInterface? = null private val mHandler = android.os.Handler(android.os.Looper.getMainLooper()) private val TIMEOUT_MS = 30000L @@ -79,21 +101,11 @@ class MainActivity : AppCompatActivity() { } }) .setWebViewClient(object : WebViewClient() { - override fun onPageFinished(view: WebView?, url: String?) { - super.onPageFinished(view, url) - cancelTimeoutTimer() - } - - override fun onReceivedError(view: WebView?, request: WebResourceRequest?, error: WebResourceError?) { - Timber.tag("WebError").e("URL: ${request?.url}, Error: ${error?.description} (Code: ${error?.errorCode})") - if (request?.isForMainFrame == true) { - showErrorPage() - } - super.onReceivedError(view, request, error) - } + // ... }) - .addJavascriptInterface("android", AndroidInterface(this)) + .addJavascriptInterface("android", AndroidInterface(this).also { pttInterface = it }) .createAgentWeb() + .ready() .go(finalUrl) diff --git a/app/src/main/java/com/stand/standapp/utils/GpioManager.kt b/app/src/main/java/com/stand/standapp/utils/GpioManager.kt new file mode 100644 index 0000000..b4472ee --- /dev/null +++ b/app/src/main/java/com/stand/standapp/utils/GpioManager.kt @@ -0,0 +1,102 @@ +package com.stand.standapp.utils + +import android.app.ZysjSystemManager +import android.content.Context +import android.os.Handler +import android.os.Looper +import com.stand.standapp.MainActivity +import timber.log.Timber + +/** + * 硬件 GPIO 监听管理类 (用于物理 PTT 按键) + */ +object GpioManager { + private var mZysjSystemManager: ZysjSystemManager? = null + private var mIsRunning = false + private var mThread: Thread? = null + private var lastGpioValue = 1 // 默认松开状态 (1) + + fun init(context: Context) { + if (mZysjSystemManager != null) return + try { + mZysjSystemManager = context.applicationContext.getSystemService("zysj") as? ZysjSystemManager + Timber.tag("GPIO").i("ZysjSystemManager initialized: ${mZysjSystemManager != null}") + } catch (e: Exception) { + Timber.tag("GPIO").e(e, "Failed to get ZysjSystemManager") + } + } + + fun startListening() { + if (mIsRunning) return + mIsRunning = true + mThread = Thread { + Timber.tag("GPIO").i("Start GPIO listening thread") + while (mIsRunning) { + try { + // 硬件轮询频率优化:50ms 既能保证响应速度,又能降低 CPU 消耗 + Thread.sleep(50) + val manager = mZysjSystemManager ?: continue + + // 获取 GPIO 1 的值 (0 按下, 1 松开) + val currentValue = manager.get_zysj_gpio_value(1) + + if (currentValue != lastGpioValue) { + Timber.tag("GPIO").d("GPIO 1 Value changed: $lastGpioValue -> $currentValue") + handleGpioChange(currentValue) + lastGpioValue = currentValue + } + } catch (e: Exception) { + Timber.tag("GPIO").e(e, "Error in GPIO loop") + } + } + }.apply { start() } + } + + fun stopListening() { + mIsRunning = false + mThread = null + } + + private var isSpeaking = false + private var lastSpeakTime = 0L + private val MIN_SPEAK_DURATION = 200L + + private fun handleGpioChange(value: Int) { + // 切换到主线程处理逻辑,确保线程安全且方便使用 Handler + Handler(Looper.getMainLooper()).post { + if (value == 0) { + // 硬件按下 PTT + if (!isSpeaking) { + isSpeaking = true + lastSpeakTime = System.currentTimeMillis() + com.example.kingway.ptt.SendAtUtil.speakPlay() + Timber.tag("GPIO").d("PTT Speak Play (Hardware)") + } + } else { + // 硬件松开 PTT + if (isSpeaking) { + val now = System.currentTimeMillis() + val duration = now - lastSpeakTime + + if (duration < MIN_SPEAK_DURATION) { + val delay = MIN_SPEAK_DURATION - duration + Timber.tag("GPIO").d("Hardware speak duration too short ($duration ms), delaying release by $delay ms") + Handler(Looper.getMainLooper()).postDelayed({ + realRelease() + }, delay) + } else { + realRelease() + } + } + } + } + } + + private fun realRelease() { + if (isSpeaking) { + isSpeaking = false + com.example.kingway.ptt.SendAtUtil.speakRelease() + Timber.tag("GPIO").d("PTT Speak Release (Hardware)") + } + } +}