Skip to content

Commit

Permalink
Nook Glowlight 4/4e/4 plus EInk refresh support (full-only) (#460)
Browse files Browse the repository at this point in the history
  • Loading branch information
Codereamp committed Jan 11, 2024
1 parent 5c4670c commit 40c86ed
Show file tree
Hide file tree
Showing 4 changed files with 126 additions and 1 deletion.
5 changes: 5 additions & 0 deletions app/src/main/java/org/koreader/launcher/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,11 @@ class MainActivity : NativeActivity(), LuaInterface,

val surfaceKind: String = if (device.needsView) {
view = NativeSurfaceView(this)

// The following two lines brings SurfaceView to "top" in order for NGL4 refresh to work, should be compatible with other controllers
view?.setZOrderOnTop(true)
view?.holder?.setFormat(PixelFormat.TRANSPARENT)

window.takeSurface(null)
view?.holder?.addCallback(this)
setContentView(view)
Expand Down
7 changes: 7 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 @@ -52,6 +52,7 @@ object DeviceInfo {
MEEBOOK_P6,
NABUK,
NOOK,
NOOK_GL4,
ONYX_C67,
ONYX_DARWIN7,
ONYX_DARWIN9,
Expand Down Expand Up @@ -188,6 +189,7 @@ object DeviceInfo {
private val MEEBOOK_P6: Boolean
private val NABUK_REGAL_HD: Boolean
private val NOOK: Boolean
private val NOOK_GL4: Boolean
private val ONYX_C67: Boolean
private val ONYX_DARWIN7: Boolean
private val ONYX_DARWIN9: Boolean
Expand Down Expand Up @@ -343,6 +345,10 @@ object DeviceInfo {
&& (MODEL.contentEquals("bnrv510") || MODEL.contentEquals("bnrv520") || MODEL.contentEquals("bnrv700")
|| MODEL.contentEquals("evk_mx6sl") || MODEL.startsWith("ereader"))

// Nook Glowlight 4 (4/4e/4plus)
NOOK_GL4 = (MANUFACTURER.contentEquals("barnesandnoble"))
&& (MODEL.contentEquals("bnrv1000") || MODEL.contentEquals("bnrv1100") || MODEL.contentEquals("bnrv1300"))

// Onyx C67
ONYX_C67 = MANUFACTURER.contentEquals("onyx")
&& (PRODUCT.startsWith("c67") || MODEL.contentEquals("rk30sdk"))
Expand Down Expand Up @@ -613,6 +619,7 @@ object DeviceInfo {
deviceMap[EinkDevice.MEEBOOK_P6] = MEEBOOK_P6
deviceMap[EinkDevice.NABUK] = NABUK_REGAL_HD
deviceMap[EinkDevice.NOOK] = NOOK
deviceMap[EinkDevice.NOOK_GL4] = NOOK_GL4
deviceMap[EinkDevice.ONYX_C67] = ONYX_C67
deviceMap[EinkDevice.ONYX_DARWIN7] = ONYX_DARWIN7
deviceMap[EinkDevice.ONYX_DARWIN9] = ONYX_DARWIN9
Expand Down
6 changes: 5 additions & 1 deletion app/src/main/java/org/koreader/launcher/device/EPDFactory.kt
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import org.koreader.launcher.device.epd.RK3026EPDController
import org.koreader.launcher.device.epd.RK3368EPDController
import org.koreader.launcher.device.epd.OnyxEPDController
import org.koreader.launcher.device.epd.OldTolinoEPDController
import org.koreader.launcher.device.epd.NGL4EPDController

import java.util.*

Expand Down Expand Up @@ -53,7 +54,10 @@ object EPDFactory {
logController("Nook/NTX")
NookEPDController()
}

DeviceInfo.EinkDevice.NOOK_GL4 -> {
logController("NOOK_GL4")
NGL4EPDController()
}
DeviceInfo.EinkDevice.CREMA,
DeviceInfo.EinkDevice.CREMA_CARTA_G,
DeviceInfo.EinkDevice.HANVON_960,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
/* Tested on Nook Glowlight 4e */

package org.koreader.launcher.device.epd

import org.koreader.launcher.device.EPDInterface
import org.koreader.launcher.device.epd.freescale.NTXEPDController
import android.util.Log
import java.util.*

class NGL4EPDController : NTXEPDController(), EPDInterface {

companion object {
private const val NGL4TAG = "NGL4"

// constants taken as is from sunxi-kobo.h (NGL4 prefix inserted for names)

const val NGL4_EINK_INIT_MODE = 0x01
const val NGL4_EINK_DU_MODE = 0x02
const val NGL4_EINK_GC16_MODE = 0x04
const val NGL4_EINK_GC4_MODE = 0x08
const val NGL4_EINK_A2_MODE = 0x10
const val NGL4_EINK_GL16_MODE = 0x20
const val NGL4_EINK_GLR16_MODE = 0x40
const val NGL4_EINK_GLD16_MODE = 0x80
const val NGL4_EINK_GU16_MODE = 0x84
const val NGL4_EINK_GCK16_MODE = 0x90
const val NGL4_EINK_GLK16_MODE = 0x94
const val NGL4_EINK_CLEAR_MODE = 0x88
const val NGL4_EINK_GC4L_MODE = 0x8C
const val NGL4_EINK_GCC16_MODE = 0xA0
const val NGL4_EINK_PARTIAL_MODE = 0x400
const val NGL4_EINK_AUTO_MODE = 0x8000
const val NGL4_EINK_NEGATIVE_MODE = 0x10000
const val NGL4_EINK_REGAL_MODE = 0x80000
const val NGL4_EINK_GAMMA_CORRECT = 0x200000
const val NGL4_EINK_MONOCHROME = 0x400000
const val NGL4_EINK_DITHERING_Y1 = 0x01800000
const val NGL4_EINK_DITHERING_Y4 = 0x02800000
const val NGL4_EINK_DITHERING_SIMPLE = 0x04800000
const val NGL4_EINK_DITHERING_NTX_Y1 = 0x08800000
const val NGL4_EINK_NO_MERGE = Integer.MIN_VALUE //0x80000000

const val NGL4_PAGE_DELAY = 0
const val NGL4_UI_DELAY = 0
const val NGL4_FAST_DELAY = 0
}

override fun getPlatform(): String {
// the platform reported is "freescale" in order to not introduce new unexplained names
return "freescale"
}

override fun getMode(): String {
return "full-only"
}

override fun getWaveformFull(): Int {
return NGL4_EINK_NO_MERGE + NGL4_EINK_GC16_MODE
}

// the mode constants below are effectively not used because getMode returns something other than "all"

override fun getWaveformPartial(): Int {
return NGL4_EINK_GU16_MODE
}

override fun getWaveformFullUi(): Int {
return NGL4_EINK_NO_MERGE + EINK_WAVEFORM_MODE_GLR16
}

override fun getWaveformPartialUi(): Int {
return NGL4_EINK_GLR16_MODE
}

override fun getWaveformFast(): Int {
return NGL4_EINK_GU16_MODE
}

// getWaveformDelay is the only effectively used delay because of getMode being not "all"

override fun getWaveformDelay(): Int {
return NGL4_PAGE_DELAY
}

override fun getWaveformDelayUi(): Int {
return NGL4_UI_DELAY
}

override fun getWaveformDelayFast(): Int {
return NGL4_FAST_DELAY
}

override fun needsView(): Boolean {
return true
}

override fun setEpdMode(targetView: android.view.View,
mode: Int, delay: Long,
x: Int, y: Int, width: Int, height: Int, epdMode: String?)
{

Log.i(NGL4TAG, String.format(Locale.US, "calling requestEpdMode: type:%d delay: %d x:%d y:%d w:%d h:%d",
mode, delay, x, y, width, height))
requestEpdMode(targetView, mode, delay, x, y, width, height)
}

override fun resume() {}
override fun pause() {}
}

0 comments on commit 40c86ed

Please sign in to comment.