pretty code

2022年3月29日 星期二

Kobo Libra 2 vs Logitech R500

為了測試 Libra 2 這台的藍牙是否真如傳說中的不堪?狠下心來購買了它,一試之下,果然跟傳說中的一樣爛XD

在 debug 過程中,無意間發現了一支程式 /bin/bluetoothctl,查了一下似乎可以用來設定藍牙?好不容易在 unpair 和 pair 的過程中,終於可以成功與我的 Logitech R500 成功連接。


感覺研究研究,搞不好可以找到問題在哪?

另外,使用 logread 讀取 log,可以看到一個錯誤訊息。

Mar 29 23:18:52 bluetoothd[1397]: src/service.c:service_accept() input-hog profile accept failed for EF:06:4D:1A:69:69

雖然藍牙初嘗試不是很順利,但至少我的 KoboPageTurner 可以成功使用,直接使用 Elipsa 觸控封包格式即可,總算不是一事無成。

2022/03/30 更新

比對了一下 Elipsa 和 Libra 2,目前看到有兩個差異,Elipsa 的 kernel 和 Bluetooth management interface 都比 Libra 2 新,感覺是 kernel issue?


Bluetooth management interface 1.9 (1.14).

2022/03/31 更新


雖然不懂藍牙,但這幾天查了一些資料,我覺得問題可能是出現在以下幾個地方:

1. CONFIG_RFKILL kernel 未編譯進去。
2. 一樣是 kernel 哪邊的問題 (uhid)。
3. BT chip 本身的問題 (RTL8723DS vs RTL8821CS)。

看起來似乎不是改改設定就可以解決的事,至少嘗試調整 /etc/bluetooth/main.conf 或是 /etc/bluetooth/input.conf 中的參數,看起來都沒有幫助。

2022/04/01 更新

無意間在網路上看到一份 porting guide,看起來要支援 HOG,kernel 應該要打開一些功能,就不知道 RTL8723DS 本身是否有支援就是?假設不是 BT chip 的問題也不是 Kobo 為了市場區隔的問題,後續只要系統更新,應該就能支援翻頁器了。


另外,大部份的 Linux 使用的 Bluetooth Stack 都是 BlueZ,其 daemon 是 bluetoothd,路徑為 /libexec/bluetooth/bluetoothd,在 Kobo 下如果嘗試要修改設定,可以使用 kill 砍掉它,再重新背景執行 deamon 即可。

晚上使用 bluetoothd -d -n 開啟 debug 訊息,可以看到 Elipsa 對待 R500 的方式。

profiles/gap/gas.c:gap_probe() GAP profile probe (EF:06:4D:1A:69:70)
src/service.c:change_state() 0x183a8c8: device EF:06:4D:1A:69:70 profile gap-profile state changed: unavailable -> disconnected (0)
profiles/input/hog.c:hog_probe() path /org/bluez/hci0/dev_EF_06_4D_1A_69_70
src/device.c:gatt_debug() (chan 0x1837f58) ATT PDU received: 0x1b
src/device.c:gatt_debug() (chan 0x1837f58) ATT PDU received: 0x1b

上面最後兩行是按下 R500 翻頁鍵後 Elipsa 吐出來的訊息,Libra 2 雖然無法使用 R500,按下翻頁鍵後一樣能吐出相同的訊息,真的覺得更新 kernel 應該就可以正常了?

另外,Bluetooth 的 spec 看起來是公開的,目前是 Core_v5.3。

2022/04/03 更新

前幾天買了一支便宜的藍牙滑鼠,原本以為使用 kobo-btpt 專案就可以正常使用,但還是不如預期,留個 log 當記錄。


晚上又認真比對了 Elipsa 和 Libra 2 配對 R500 的行為。

Elipsa:
bluetoothd 沒有錯誤訊息,會長出一個 /dev/input/eventX 的裝置,使用 evtest 可以成功補捉左右鍵的 scan code。

Libra 2:
bluetoothd 有錯誤訊息,無法長出 /dev/input/eventX 裝置,故錯誤訊息其實不是斷線,pair 和 connect 都有成功。

2022/04/04 更新

evtest 的 value 是 16 進位數字,在修正了此錯誤後,終於可以使用我的藍牙滑鼠(E-books E-PCG233)翻頁,真是得來不易呀。雖然這個滑鼠按下一次鍵會發送 2 次 event,但我只是想要研究 Libra 2 的藍牙,故對我來說,這個學習已經完成XD

2022/04/05 更新

昨天順手在 kobo-btpt 裡加了一個 filter,避免過短時間內收到相同的 event,不過在 Libra 2 無法成功,且呼叫 Kobo 藍牙翻頁的函數感覺是非同步?但同樣的 filter 在 Elipsa 就可以正常工作。

晚上又認真的在 Elipsa 上試了一下 R500,使用 evtest 補捉的結果,一樣是按一下鍵會送 2 次 event,既然是一樣的行為,那為什麼 Kobo 只會翻一次頁,我想這裡面可能還有我不知道的事在?

Event: time 1649163457.612279, type 4 (Misc), code 4 (ScanCode), value 70050
Event: time 1649163457.612279 ------- Report Sync ------ x: 400 y: 80 p: 0 ------------
Event: time 1649163457.657992, type 4 (Misc), code 4 (ScanCode), value 70050
Event: time 1649163457.657992 ------- Report Sync ------ x: 400 y: 80 p: 0 ------------

如果要我猜的話,會不會 1 個是按下事件,1 個是放開事件?故 kobo-btpt 應該要有能力去判斷放開事件,可能要從別的 event,因為 type MISC 的 press value 應該都一樣,以上面例子來看都是 0x70050。不過問題來了,evtest 只有顯示出 Report Sync 並未顯示出其他 event ,會不會是 evtest 並沒有能力解析,故才沒有顯示呢?

2022/04/06 更新

太相信 Kobo 內附的 evtest tool 了,明明藍牙滑鼠有其他更適合的 event 可以監聽,詳此篇

最後正確的設定檔如下:

prevPage 1 272 1
nextPage 1 273 1

2022/04/07 更新

昨天晚上本來以為已經妥當了,沒想到用了 EV_KEY  後,行為還是不符預期,一樣會觸發翻頁兩次,再加上剛到的 8BitDo Zero 2 gamepad 在 Libra 2 也是時好時壞,有時候可以長出 device,有時候又不行,如果不是像我一樣 telnet 進去閱讀器的人,一定不知道到底發生了什麼事?

就在正準備睡覺的時候,熊熊想到,之前改了 kobo-btpt source code 來 debug,把原始的 libbtpt.so 改個名字,一樣放在 /usr/local/Kobo/imageformats 裡面,這個資料夾裡的 .so 檔,應該是會被 Kobo 自動載入,故我其實是同時在跑兩支 libbtpt.so 而不自知,難怪之前的 debug 訊息才會覺得如此之怪,移除之後,果然一切恢復正常,搞定收工(還是不應該使用 EV_MSC type,因為會收到兩次事件,之前的問題是組合技,既用了不該用的 type,也執行了兩支 libbtpt.so)。

2022/04/08 更新

找到檢查 Linux Kernel Config 的方法了(/proc/config.gz),看起來 Libra 2 禁用了很多 Elipsa 有打開的項目,就不知道是 Kobo 為了市場區隔,還是只是單純的因為 Libra 2 的藍牙晶片不支援的緣故呢?


2022/04/09 更新

昨天晚上下班後決定要來編譯模組了,目標放在 uhid.ko。

CONFIG_HIDRAW=y (這個也許沒影響?)
CONFIG_UHID=m


使用環境

Windows 10 + Docker Desktop (ghcr.io/pgaskin/nickeltc)
linux-4.1.15.tar.gz
Copy /proc/config.gz of Libra 2 to /linux-source/.config

make ARCH=arm CROSS_COMPILE=/tc/arm-nickel-linux-gnueabihf/bin/arm-nickel-linux-gnueabihf- oldconfig
make ARCH=arm CROSS_COMPILE=/tc/arm-nickel-linux-gnueabihf/bin/arm-nickel-linux-gnueabihf-

中間有遇到找不到 bc 及 lzop 兩個執行檔錯誤,我檢查一下 Windows 10 Docker Desktop,感覺底層還是 Windows 的那個 Linux Subsytem(WSL),故我直接複製 WSL 裡的這兩個執行檔及相關的 so 檔進去我的 docker instance,然後建立 soft link(ln -s liblzo2.so.2.0.0 liblzo2.so.2 ... ),看起來這樣就過了?雖然我前後總共重 build 了 3 次就是!

感謝有 make,只有初始檢查比較久,編譯過的都不用再重新編譯,但我的 8 歲老筆電果然很吃力呀,打文章的同時,整個程序都還沒跑完,我只是先偷跑去 /linux-source/drivers/hid 下,把 build 好的 uhid.ko 複製出來測試XD


阿母,我成功了!我的 Logitech R500 終於可以爽爽用了,要感謝的人太多了,就感謝天吧XD


2023/07/02 更新

6 月份買了一台 Clare 2E,為了取代電池快卦掉的 PW3,試了一下,藍牙跟 Libra 2 有一樣的問題,由於 kernel 版本一樣,直接拿原本的 solution 來用,完全無痛接軌。

另外,我的 KoboPageTurner 專案一樣可以用在 Clare 2E 上,raw data 使用 Elipsa 格式,觸控座標設成跟 Clare 一樣即可。

2022年3月21日 星期一

error C2059: syntax error : 'string'

今天幫忙看一個 compiler error,第一個錯誤如標題所述,但因為 Visual C++ 還多顯示了其他很奇怪的錯誤,故一時還真看不出錯誤在哪,還好在半小時之內還是順利的解決了。

簡單把 Code 簡化一下,我們可以看到因為 structure Record 的成員變數 ID行數 7 的 define 相衝突,故在行數 14 的時候,會被前置處理器取代成 ptr->"id",故 VC 才會吐出這個錯誤,相較之下 GCC 的錯誤易懂多了,也算是學到一課了。

當然這是已經簡化 Code 後的結果,想像一下,如果 struct Record 與 define 分別位在不同的檔案,乍看之下,真的不容易發現問題,故在寫 C code 時,如果需要使用 define,最好是使用大寫(公司專案發生問題剛好是因為 define 用小寫,跟這邊的例子不一樣),比較不容易遇到這種鳥問題。

程式人最開心的事

kobofileserver 已經開發完快 3 個月了,用到現在一直覺得很滿意,雖然對不懂程式的人在初期安裝上有些困難,但我覺得這是非戰之罪,為了 patch Kobo 系統,不得不透過 NickelMenu 這樣的啟動器來啟動第三方軟體。也因為這樣的緣故,我也很懶得去推廣,只有剛好看到有關的論壇討論才會稍微提及這個專案。

前幾天無聊用關鍵字查詢一下,居然看到有人在 reddit 提及這個軟體,而且還提了兩次,看起來這個網友應該是覺得 kobofileserver 專案還可以吧XD

我想這應該也是程式人最開心的一件事吧 ~~


2022/04/08 更新

感謝 usimon 的使用,在 usimon 的建議下,新增了上傳多檔的功能,感覺還行,雖然我不太會用到就是XD

2022年3月7日 星期一

C++ Standards Support in GCC

最近為了某些原因,需要了解一下目前有那些 C++ 標準。底下是 GCC 的支援情形。

C++98
C++11
C++14
C++17
C++20
C++23

2022/04/26 更新

我目前使用的版本是 gcc 9.2.0,如果沒有指定,其預設參數分別是:

C -> -std=gnu11
C++ -> -std=gnu++14

gnu 或 gnu++ 指的是 Standard + GNU extensions.

2023/12/06 更新

可以使用下面語法來簡單檢查一下 C++ 版本。

std::cout << "Standard: " << __cplusplus << std::endl;

檢查結果如下。

Standard: 201402

2022年3月2日 星期三

PDF-XChange Editor Plus 體驗

前一陣子在社團有人推薦用此套軟體來編輯 PDF 書籤,正好我的 Acrobat Pro 的一年訂閱也快到期了,想說乾脆直上 Plus 版,測試一下 Enhanced OCR 功能是否好用?

我使用的書是固定版面的 EPUB 轉 PDF,經我測試的結果,中英文一起的辨視效果很差,Acrobat 我已經覺得夠差了,這一套雖然是使用 ABBYY,但效果比 Acrobat 還差。

如果是想試試 OCR 功能的人就不要購買了XD

2022/03/02 更新

差點誤會它了,購買後,記得去檔案 -> 偏好設置 -> 光學字元識別,將當前的 OCR 引擎改成「增強 (FineReader)」,測試的結果目前看起來還行。

2022/03/05 更新

陸續轉了好幾本書,目前感覺辨識度至少有八成五,以《C++ Primer Plus中文版 (第六版)》這本 Google 販賣的 PDF 為例,共有 183 個書簽項目,,我只改了不到 10 個字,做好書籤不用 10 分鐘!果然不枉費我買了兩套的錢,一套放辦公室,一套放家裡,Coding 累了,就順手來整理一下手上的電子書吧,感覺我都要踏入指玄境了XD


2022/03/14 更新

作書籤時,如果項目有兩個半形冒號的話,例如 std::out,這個書籤便無法正常匯入,我猜可能是程式有用到冒號做什麼判斷導致。