From 17e19250340cc6d507c34e8c9c9ea402ad9be4b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D0=BE=D1=88=D0=BA=D0=BE=D1=84=D0=BB=D0=B8=D0=BA?= =?UTF-8?q?=D1=82?= <121az348@gmail.com> Date: Wed, 15 Apr 2026 05:41:21 +0000 Subject: [PATCH] revert e622c95666ed1a1bca5f38078b5b19bfe3c1f911 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit revert #2: Добавлено отслеживение длины нажатий кнопки. Это нужно для отключения самбы и размонтирования флешки. (спустя два часа страданий) --- src/main/kotlin/ButtonListener.kt | 109 ++++++------------------------ src/main/kotlin/Main.kt | 21 +----- 2 files changed, 24 insertions(+), 106 deletions(-) diff --git a/src/main/kotlin/ButtonListener.kt b/src/main/kotlin/ButtonListener.kt index fd38e1e..4aa9077 100644 --- a/src/main/kotlin/ButtonListener.kt +++ b/src/main/kotlin/ButtonListener.kt @@ -7,11 +7,11 @@ import java.io.BufferedReader import java.io.InputStreamReader import java.util.concurrent.atomic.AtomicBoolean +// Событие клика по кнопке class ButtonClickEvent -class ButtonLongPressEvent +// Слушатель событий клика typealias ButtonClickListener = (ButtonClickEvent) -> Unit -typealias ButtonLongPressListener = (ButtonLongPressEvent) -> Unit class ButtonListener( private var process: Process? = null, @@ -19,128 +19,63 @@ class ButtonListener( private var isListening: AtomicBoolean = AtomicBoolean(false), private var listenerJob: Job? = null ) { + private val clickListeners = mutableListOf() - private val longPressListeners = mutableListOf() - - var shortPressThresholdMs: Long = 100 - var longPressThresholdMs: Long = 1000 - - private var pressStartTime: Long = 0 fun addClickListener(listener: ButtonClickListener) { clickListeners.add(listener) } - fun removeClickListener(listener: ButtonClickListener) { - clickListeners.remove(listener) - } - - fun addLongPressListener(listener: ButtonLongPressListener) { - longPressListeners.add(listener) - } - - fun removeLongPressListener(listener: ButtonLongPressListener) { - longPressListeners.remove(listener) - } - private fun notifyClick() { - println("=== [CLICK] Короткое нажатие ===") val event = ButtonClickEvent() clickListeners.forEach { it.invoke(event) } } - private fun notifyLongPress() { - println("=== [LONG] Длинное нажатие ===") - val event = ButtonLongPressEvent() - longPressListeners.forEach { it.invoke(event) } - } - fun startListening(onStateChange: ((Boolean) -> Unit)? = null): Boolean { if (isListening.get()) { return currentButtonState.get() } - startListeningInternal(onStateChange) - return currentButtonState.get() - } - - private fun startListeningInternal(onStateChange: ((Boolean) -> Unit)? = null) { try { val cmd = listOf("gpiomon", "--chip=0", "$BUTTON") val processBuilder = ProcessBuilder(cmd) .redirectErrorStream(true) + // Сохраняем процесс в поле process = processBuilder.start() isListening.set(true) listenerJob = CoroutineScope(Dispatchers.IO).launch { + // Используем process, который теперь не null val reader = BufferedReader(InputStreamReader(process!!.inputStream)) var line: String? - try { - while (reader.readLine().also { line = it } != null) { - println(if (isDebug) "$line" else "") - when { - line?.contains("rising") == true -> { - currentButtonState.set(true) - onStateChange?.invoke(true) - pressStartTime = System.currentTimeMillis() - println(if (isDebug) "Кнопка нажата, время: $pressStartTime" else "") - } - line?.contains("falling") == true -> { - val pressDuration = System.currentTimeMillis() - pressStartTime - currentButtonState.set(false) - onStateChange?.invoke(false) - println(if (isDebug) "Кнопка отпущена, длительность: ${pressDuration}ms" else "") - - // Определяем тип нажатия по длительности - when { - pressDuration >= longPressThresholdMs -> { - println(if (isDebug) "Длинное нажатие (${pressDuration}ms)" else "") - notifyLongPress() - } - pressDuration >= shortPressThresholdMs -> { - println(if (isDebug) "Короткое нажатие (${pressDuration}ms)" else "") - notifyClick() - } - else -> { - println(if (isDebug) "Слишком короткое нажатие (${pressDuration}ms) - игнорируем" else "") - } - } - } + while (reader.readLine().also { line = it } != null) { + println(if (isDebug) "$line" else "") + when { + line?.contains("rising") == true -> { + currentButtonState.set(true) + onStateChange?.invoke(true) + println(if (isDebug) "Кнопка нажата" else "") + // Генерируем событие клика при нажатии + notifyClick() + } + line?.contains("falling") == true -> { + currentButtonState.set(false) + onStateChange?.invoke(false) + println(if (isDebug) "Кнопка разжата" else "") + // Убрана проверка на разжатие для генерации события } } - } catch (e: Exception) { - println("Ошибка чтения процесса: ${e.message}") } - val exitCode = process!!.waitFor() - println("Процесс завершён ($exitCode)") + println(if (isDebug) "Процесс завершён ($exitCode)" else "") isListening.set(false) - - // Автоматически перезапускаем прослушивание, если оно должно быть активно - if (isListening.get()) { - println("Перезапуск прослушивания...") - delay(100) - startListeningInternal(onStateChange) - } } } catch (e: Exception) { e.printStackTrace() isListening.set(false) } - } - - fun stopListening() { - isListening.set(false) - listenerJob?.cancel() - process?.destroy() - process = null - } - - fun restartListening(onStateChange: ((Boolean) -> Unit)? = null) { - stopListening() - Thread.sleep(200) - startListening(onStateChange) + return currentButtonState.get() } } \ No newline at end of file diff --git a/src/main/kotlin/Main.kt b/src/main/kotlin/Main.kt index 3a720f5..b7eb689 100644 --- a/src/main/kotlin/Main.kt +++ b/src/main/kotlin/Main.kt @@ -27,7 +27,7 @@ object DebugMode { // Состояния системы enum class SystemState { - IDLE, SCANNING, CLEAN, INFECTED, ERROR, INIT, SAMBA + IDLE, SCANNING, CLEAN, INFECTED, ERROR, INIT } class USBVirusScanner { @@ -159,11 +159,6 @@ class USBVirusScanner { yellowLed.setValue(0) blinkLed(redLed, 500) } - SystemState.SAMBA -> { - blinkLed(greenLed, 1000) - blinkLed(yellowLed, 1000) - redLed.setValue(0) - } } } } @@ -321,7 +316,7 @@ class USBVirusScanner { try { // Проверяем установлен ли ClamAV - val checkProcess = ProcessBuilder("which", "clamdscan").start() + val checkProcess = ProcessBuilder("which", "clamscan").start() val checkExitCode = checkProcess.waitFor() if (checkExitCode != 0) { @@ -543,20 +538,9 @@ fun main(args: Array) { scanner.initialize() val buttonListener = ButtonListener() - - buttonListener.shortPressThresholdMs = 100 - buttonListener.longPressThresholdMs = 1000 - buttonListener.addClickListener { event -> scanner.startScan() } - - buttonListener.addLongPressListener { event -> - println(if (isDebug) "ДЛИННОЕ НАЖАТИЕ МЯУ" else "") - println("TODO(\"Добавить отключение samba и размонтирование флешки\")") - - } - buttonListener.startListening() println(if (isDebug) """ @@ -580,5 +564,4 @@ fun main(args: Array) { scanner.shutdown() exitProcess(1) } - } \ No newline at end of file