Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions app/src/main/java/org/koreader/launcher/TestActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import org.koreader.launcher.device.lights.OnyxC67Controller
import org.koreader.launcher.device.lights.OnyxColorController
import org.koreader.launcher.device.lights.OnyxSdkLightsController
import org.koreader.launcher.device.lights.OnyxWarmthController
import org.koreader.launcher.device.lights.OnyxPalma2ProController
import org.koreader.launcher.device.lights.TolinoRootController
import org.koreader.launcher.device.lights.TolinoNtxController
import org.koreader.launcher.device.lights.TolinoNtxNoWarmthController
Expand Down Expand Up @@ -79,6 +80,7 @@ class TestActivity: AppCompatActivity() {
lightsMap["Onyx Color"] = OnyxColorController()
lightsMap["Onyx SDK (lights)"] = OnyxSdkLightsController()
lightsMap["Onyx (warmth)"] = OnyxWarmthController()
lightsMap["Onyx Palma2 Pro"] = OnyxPalma2ProController()
lightsMap["Tolino Root"] = TolinoRootController()
lightsMap["Tolino Ntx"] = TolinoNtxController()
lightsMap["Tolino Ntx (no warmth)"] = TolinoNtxNoWarmthController()
Expand Down
5 changes: 5 additions & 0 deletions app/src/main/java/org/koreader/launcher/device/DeviceInfo.kt
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,7 @@ object DeviceInfo {
ONYX_PAGE,
ONYX_PALMA,
ONYX_PALMA2,
ONYX_PALMA2_PRO,
ONYX_POKE2,
ONYX_POKE3,
ONYX_POKE4,
Expand Down Expand Up @@ -531,6 +532,10 @@ object DeviceInfo {
BRAND == "onyx" && MODEL == "palma2"
-> Id.ONYX_PALMA2

// Onyx Palma2 Pro (Palma2_Pro_C)
BRAND == "onyx" && MODEL == "palma2_pro_c"
-> Id.ONYX_PALMA2_PRO

// Onyx Poke 2
MANUFACTURER == "onyx" && PRODUCT == "poke2"
-> Id.ONYX_POKE2
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,7 @@ object EPDFactory {
DeviceInfo.Id.ONYX_PAGE,
DeviceInfo.Id.ONYX_PALMA,
DeviceInfo.Id.ONYX_PALMA2,
DeviceInfo.Id.ONYX_PALMA2_PRO,
DeviceInfo.Id.ONYX_POKE2,
DeviceInfo.Id.ONYX_POKE3,
DeviceInfo.Id.ONYX_POKE4,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,11 @@ object LightsFactory {
logController("TolinoB300Controller")
TolinoB300Controller()
}
DeviceInfo.Id.ONYX_PALMA2_PRO,
-> {
logController("OnyxPalma2Pro")
OnyxPalma2ProController()
}
else -> {
logController("Generic")
GenericController()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
package org.koreader.launcher.device.lights

import android.app.Activity
import android.util.Log
import org.koreader.launcher.device.LightsInterface
import org.koreader.launcher.extensions.read
import org.koreader.launcher.extensions.write
import java.io.File

/* Controller for Onyx Boox Palma 2 Pro with brightness and warmth support.
* Uses onyx_bl_br for brightness and onyx_bl_ct for warmth (color temperature).
* Dynamically reads max values from sysfs.
*/

class OnyxPalma2ProController : LightsInterface {
companion object {
private const val TAG = "Lights"
private const val MIN = 0
private const val DEFAULT_BRIGHTNESS_MAX = 255
private const val DEFAULT_WARMTH_MAX = 32

private const val BRIGHTNESS_FILE = "/sys/class/backlight/onyx_bl_br/brightness"
private const val BRIGHTNESS_MAX_FILE = "/sys/class/backlight/onyx_bl_br/max_brightness"
private const val WARMTH_FILE = "/sys/class/backlight/onyx_bl_ct/brightness"
private const val WARMTH_MAX_FILE = "/sys/class/backlight/onyx_bl_ct/max_brightness"
}

private val cachedBrightnessMax: Int by lazy {
try {
val value = File(BRIGHTNESS_MAX_FILE).read()
if (value > 0) value else DEFAULT_BRIGHTNESS_MAX
} catch (e: Exception) {
Log.w(TAG, "Failed to read max brightness, using default: $e")
DEFAULT_BRIGHTNESS_MAX
}
}

private val cachedWarmthMax: Int by lazy {
try {
val value = File(WARMTH_MAX_FILE).read()
if (value > 0) value else DEFAULT_WARMTH_MAX
} catch (e: Exception) {
Log.w(TAG, "Failed to read max warmth, using default: $e")
DEFAULT_WARMTH_MAX
}
}

override fun getPlatform(): String {
return "onyx-palma2pro"
}

override fun hasFallback(): Boolean {
return false
}

override fun hasWarmth(): Boolean {
return true
}

override fun needsPermission(): Boolean {
return false
}

override fun getBrightness(activity: Activity): Int {
return try {
File(BRIGHTNESS_FILE).read()
} catch (e: Exception) {
Log.w(TAG, "Failed to read brightness: $e")
0
}
}

override fun getWarmth(activity: Activity): Int {
return try {
File(WARMTH_FILE).read()
} catch (e: Exception) {
Log.w(TAG, "Failed to read warmth: $e")
0
}
}

override fun setBrightness(activity: Activity, brightness: Int) {
if (brightness !in MIN..cachedBrightnessMax) {
Log.w(TAG, "brightness value out of range: $brightness (max: $cachedBrightnessMax)")
return
}
Log.v(TAG, "Setting brightness to $brightness")
try {
File(BRIGHTNESS_FILE).write(brightness)
} catch (e: Exception) {
Log.e(TAG, "Failed to set brightness: $e")
}
}

override fun setWarmth(activity: Activity, warmth: Int) {
if (warmth !in MIN..cachedWarmthMax) {
Log.w(TAG, "warmth value out of range: $warmth (max: $cachedWarmthMax)")
return
}
Log.v(TAG, "Setting warmth to $warmth")
try {
File(WARMTH_FILE).write(warmth)
} catch (e: Exception) {
Log.e(TAG, "Failed to set warmth: $e")
}
}

override fun getMinWarmth(): Int {
return MIN
}

override fun getMaxWarmth(): Int {
return cachedWarmthMax
}

override fun getMinBrightness(): Int {
return MIN
}

override fun getMaxBrightness(): Int {
return cachedBrightnessMax
}

override fun enableFrontlightSwitch(activity: Activity): Int {
return 1
}

override fun hasStandaloneWarmth(): Boolean {
return true
}
}