pretty code

2023年10月23日 星期一

Use pure bluetooth in KOReader v2021.10.1

KOReader is an awesome application on Kobo device. The architecture of application is very flexible.

I follow the guides of NiLuJe to modify source code a little to let my Kobo Elipsa to use bluetooth.

The only file you modify is koreader/frontend/device/kobo/device.lua

01. Add "hasKeys = yes," in KoboEuropa object.

-- Kobo Elipsa
local KoboEuropa = Kobo:new{
    model = "Kobo_europa",
    isSunxi = yes,
    canToggleChargingLED = yes,
    hasFrontlight = yes,
    hasKeys = yes,
    hasGSensor = yes,
    canToggleGSensor = yes,
    pressure_event = C.ABS_MT_PRESSURE,
    misc_ntx_gsensor_protocol = true,
    display_dpi = 227,
    boot_rota = C.FB_ROTATE_CCW,
    battery_sysfs = "/sys/class/power_supply/battery",
    ntx_dev = "/dev/input/by-path/platform-ntx_event0-event",
    touch_dev = "/dev/input/by-path/platform-0-0010-event",
    isSMP = yes,
}

02. Modify key code for your pageturner, I use Logitech R500.

-- NOTE: For the Forma, with the buttons on the right, 193 is Top, 194 Bottom.
    self.input = require("device/input"):new{
        device = self,
        event_map = {
            [35] = "SleepCover",  -- KEY_H, Elipsa
            [59] = "SleepCover",
            [90] = "LightButton",
            [102] = "Home",
            [105] = "RPgBack",
            [106] = "RPgFwd",
            [116] = "Power",
            [331] = "Eraser",
            [332] = "Highlighter",
        },
        
03. Open your pageturner manually. My pageturner is event4.

-- NOTE: usb hotplug event is also available in /tmp/nickel-hardware-status (... but only when Nickel is running ;p)
    self.input.open("fake_events")
    self.input.open("/dev/input/event4")
    
Enjoy it.

------------------------------------------------------------------------

The issue of entering Kobo again is that we can't use bluetooth anymore. The below messages are from logread command. Maybe we can google these keywords to get the solution ?

Oct 23 20:49:02 nickel: (   144.927 @ 0x374c538) QObject::disconnect: Unexpected null parameter
Oct 23 20:49:02 nickel: (   144.927 @ 0x374c538 / ui.warning) cancelled before full sync has started
Oct 23 20:49:02 nickel: (   144.977 @ 0x374c538 / libraryLayout.warning) void AbstractLibraryController<C>::layout(bool) [with C = BluetoothDevice] view is null
Oct 23 20:49:02 nickel: (   144.999 @ 0x374c538 / libraryLayout.warning) void AbstractLibraryController<C>::layout(bool) [with C = BluetoothDevice] source has no rows
Oct 23 20:49:02 nickel: (   145.000 @ 0x374c538 / libraryLayout.warning) void AbstractLibraryController<C>::layout(bool) [with C = BluetoothDevice] source has no rows
Oct 23 20:49:53 bluetoothd[3342]: Endpoint unregistered: sender=:1.2 path=/org/bluez/hci0/A2DP/SBC/Source/1
Oct 23 20:49:53 bluetoothd[3342]: Endpoint unregistered: sender=:1.2 path=/org/bluez/hci0/A2DP/SBC/Source/2
Oct 23 20:49:57 bluetoothd[3342]: Terminating
Oct 23 20:49:57 nickel: (   200.505 @ 0x374c538 / bt.warning) void BluetoothManager::objectManagerInterfacesRemoved(const QDBusObjectPath&, const QStringList&) adapter already destroyed
Oct 23 20:49:57 bluetoothd[3342]: Stopping SDP server
Oct 23 20:49:57 bluetoothd[3342]: Exit
Oct 23 20:50:13 bluetoothd[3352]: Bluetooth daemon 5.63
Oct 23 20:50:13 bluetoothd[3352]: src/main.c:check_options() Unknown key InitVolume for group General in /etc/bluetooth/main.conf
Oct 23 20:50:13 bluetoothd[3352]: Starting SDP server
Oct 23 20:50:13 bluetoothd[3352]: Bluetooth management interface 1.14 initialized
Oct 23 20:50:13 bluetoothd[3352]: src/adapter.c:reset_adv_monitors_complete() Failed to reset Adv Monitors: Unknown Command (0x01)
Oct 23 20:50:23 bluetoothd[3352]: Failed to set mode: Failed (0x03)
Oct 23 20:50:23 bluetoothd[3352]: Player registered: sender=:1.4 path=/com/kobo/bluetooth/MediaPlayer
Oct 23 20:50:24 bluealsa: Couldn't get HCI version: Network is down
Oct 23 20:50:24 bluetoothd[3352]: Endpoint registered: sender=:1.8 path=/org/bluez/hci0/A2DP/SBC/Source/1
Oct 23 20:50:24 bluetoothd[3352]: Endpoint registered: sender=:1.8 path=/org/bluez/hci0/A2DP/SBC/Source/2
Oct 23 20:50:31 bluetoothd[3352]: Endpoint unregistered: sender=:1.8 path=/org/bluez/hci0/A2DP/SBC/Source/1
Oct 23 20:50:31 bluetoothd[3352]: Endpoint unregistered: sender=:1.8 path=/org/bluez/hci0/A2DP/SBC/Source/2

2023年10月22日 星期日

管委會相關事項備忘

下層鐵櫃從左至右分別如下,報表新的在上:

10306 ~ 10412
10501 ~ 10612
10701 ~ 10812
10901 ~ 11012
11101 ~ 11209

滅火器更換,區公所可補助一半(不確定是否常態?)
節能燈具更換,政府補助一半(不確定是否常態?)

B1 or B2 汙水管疏通,工法會切管,一次好幾支約兩萬多。
車道坑洞切換會分批做,避免影響車輛進出。
電梯按鍵一顆以前約 578。
化糞池清洗有分下不下池,下池約再多一半錢。

報表電子資料如何保存,是否要走會計辦法(複式簿記)?
01. 使用 GNU Cash。
02. 使用 Daily Money。
03. 自行寫程式配合 chart.js 放在 github page。
04. 原本的 Excel 檔案(確認 Python module 是否可以加公式或是使用 VBA)。

Note:若要加上公式,Use openpyxl 即可,但將 Excel 檔上傳到 Google Drive 後,如果儲存格是 refer to other cell,Excel 程式會顯示 0,但 Google Drive 不會,故折線圖會不連續,最好將月報表未發生費用值填上 0。

自行寫程式 JSON 格式暫訂:
{
    "init": [
        {
            "bank1": 10000
        },
        {
            "bank2": 20000
        }
    ],
    "accounts": [
        {
            "item": 40100,
            "desc":"管理費收入"        
        }    
    ],
    "reports": [
        {   
            "10601": [
                {
                    "item": 50100,
                    "dollar": 3454,
                    "detail":"B2車道修補"
                }
            ]
        }
    ]
}

防水工程科目名稱改防水及土木工程(車道坑洞修補)
安全缺失改消防安全缺失改進。
活存轉定存目前先放置在其他不屬於每月雜支科目。

費用分析時需將裝潢保證金扣除避免失真。

確認國盛回饋金是否是舊衣回收? -> Yes
資源回收每月約在 90 ~ 400 內。

2023年10月15日 星期日

放空的六日

連續兩個假期都在搞結構光系統,剛好把這三季學到的東西做個總結,雖然最後為了孩子的學習還是多買了一台 webcam,個人還是覺得收穫良多!

這次六日便打定主意完全不煮飯好好來放鬆一下,開開心心來打我的暗黑 2 重製版,也順利的讓我的亞馬升到 93 級。

時間來到星期日的晚上,離睡前還有點時間,來試試 KOReader issue #9059 提到的修改 lua code 使用藍牙翻頁器的討論串好了。

果不期然,事情沒那麼簡單,過程中需要一些指令來做驗證,奈何相關指令散落在我 blog 中的好幾篇文章中。

還是整理一下好了,下次就不會那麼累了。

01. logread

logread 可以來看訊息,一些 third-party app 也會吐訊息在這裡,配合 grep 檢查訊息。

02 藍牙相關

bluetoothctl  (show, info, devices, connect) 配合括弧裡的參數可以來確認藍牙狀態。
不清楚有哪些參數可以打 bluetoothctl help。

/libexec/bluetooth/bluetoothd is a bluettooth daemon
可以砍掉此 process,重新執行 /libexec/bluetooth/bluetoothd -d -n 開啟 debug message。

03. Linux input subsystem

cat /proc/bus/input/devices 可以看到系統長出哪些 /dev/input/eventX 裝置。

04. third-party .so path

像 libbtpt.so 就位在 /usr/local/Kobo/imageformat 裡面,直接砍掉就是 uninstall 了。

05. KOReader debug message

logger.info("xxxxxxx") 便可以在 koreader/crash.log 中看到相關訊息。


2023/10/19 更新

在 KOReader 加入一些 debug message,目前看來在我 Elipsa 上的 v2021.10.1 版本,啟動時並不會砍掉 bluetoothd,故我的藍牙連接是正常的,在 Input:handleKeyBoardEv 確實也有看到我的 R500 按鍵的訊息,感覺是在更上層的地方,沒有人去處理 ?


2023/10/23 更新

果然是沒有人處理,幸好 KOReader 是一個很有彈性的軟體,加個參數騙過它即可XD