分類彙整: GTK

寫了一個 Serial Port Tool

最近用 Rust 寫了一個 serial port tool 給自己用,GUI 的部分使用 gtk-rs, serial port 通訊的部分使用 tokio-serial (serialport-rs 的 tokio 運行時版本),USB hotplug 的部分使用 rusb (libusb 的 Rust 包裝)。

不過,因為 libusb 不支持 Windows 上的 hotplug,所以在 Windows 上執行時,我使用一個 loop 每隔一秒列舉一次 USB 裝置,來判斷是否有 USB 裝置插入或拔出。

Serial Port Tool 的原始碼:https://github.com/riddleling/serial-tool

然後可以用 Arduino 寫一個 serial echo 程式來測試,把寫入 serial port 的字元回傳回來:

// Arduino serial echo

void setup() {
    Serial.begin(115200);
}

void loop() {    
    if (Serial.available() > 0) {
        Serial.print((char)Serial.read());
    }
}

在 Linux (Raspberry Pi OS) 上執行 serial port tool 的畫面:

在 Windows 上執行的 demo 影片 (透過 serial port 傳輸指令,打開或關閉 LED):

用 Raspberry Pi 打造一台 Spotify 播放器 – Part 2

延續上一篇的內容,要接著說明控制端的 GUI app 如何編譯執行。

在開始之前,先用 ssh 連到 Raspberry Pi,然後安裝 mDNS 的套件包與修改主機名稱。

$ ssh pi@<Raspberry Pi's IP address>
$ sudo apt -y install avahi-daemon
$ sudo raspi-config

執行 sudo raspi-config 後,會看到一個文字介面的選單,選擇 System Options => Hostname,然後把 Hostname 改成 spotifypi (或是你喜歡的名字)。改完後請重新開幾。


Raspberry Pi 開啟 mDNS 的服務後,我們就可以透過 <hostname>.local 這個網址來取代 IP 位址,例如:假設 Raspberry Pi 的 IP 位址是 192.168.1.110,那我們透過 WebSocket 去控制時的 URL 是 ws://192.168.1.110:9487,現在有了 mDNS,可以把 URL 改成 ws://spotifypi.local:9487。

不過,如果控制端的電腦不是 macOS (macOS 內建 mDNS 的支持),那還需要安裝一些軟體。在 Linux 上,需要安裝 avahi。Windows 則比較麻煩,以前在 Windows 上安裝 Apple 的 Bonjour Print Services 就可以開始用 mDNS,後來在某次的 Windows 10 更新後, Bonjour 就不能用了,還需要修改 Windows 登錄機碼才行,有興趣的人可以參考這裡


開始來說明控制端的 GUI app。我這個 app 是用 Rust 寫的,GUI 的部分使用 gtk-rs,WebSocket 的部分使用 tokio-tungstenite。

編譯之前需要先設定開發環境,首先,先安裝 rustup。然後需要安裝 GTK 3 的開發套件包。

在 macOS 上安裝 GTK 3 的開發套件包:

$ brew install gtk+3
$ brew install gnome-icon-theme

在 Debian / Ubuntu 上安裝 GTK 3 的開發套件包:

$ sudo apt install libgtk-3-dev build-essential

在 Windows 上安裝 GTK 3 的開發環境:請參考這篇


下載控制端 GUI app 的程式碼,並且編譯:

$ git clone https://github.com/wlelab/SpotifyPi-Control-Panel.git
$ cd SpotifyPi-Control-Panel
$ cargo build --release

編譯需要一段時間。編譯完成後,執行檔會放在 SpotifyPi-Control-Panel/target/release 目錄下。

在 Windows 上,直接執行 SpotifyPi-Control-Panel\target\release 目錄下的 spotifypi-control-panel.exe 即可,在 Linux / macOS 上,可以透過終端機執行:

$ ./target/release/spotifypi-control-panel

Windows 上的執行畫面:

Demo 影片:

筆記》Windows 安裝 gtk-rs 開發環境

步驟 1:安裝 rustup

步驟 2:安裝 MSYS2

步驟 3:開啟一個「MSYS2 MSYS」shell:

更新套件包與資料庫:

$ pacman -Syu

更新套件包 :

$ pacman -Su

安裝 GCC toolchain:

$ pacman -S --needed base-devel mingw-w64-x86_64-toolchain

安裝 GTK 3:

$ pacman -S mingw-w64-x86_64-gtk3

步驟 4:編輯 Windows 環境變數:

  • 在使用者變數的 Path 裡加入:C:\msys64\mingw64\bin
  • 在使用者變數新增一個 GTK_LIB_DIR 變數,變數值為:C:\msys64\mingw64\lib
  • 修改完環境變數後,將 Windows 重新啟動。

步驟 5:開啟一個 Windows Terminal 或是 PowerShell:

輸入以下指令添加 target:

PS C:\> rustup target add x86_64-pc-windows-gnu

然後輸入「rustup show」指令查看 target,應該可以看到這兩行:

stable-x86_64-pc-windows-gnu
stable-x86_64-pc-windows-msvc (default)

接著輸入下列指令,把預設的 toolchain 改成 GNU:

PS C:\> rustup default stable-x86_64-pc-windows-gnu

步驟 6:使用 cargo 指令建立一個新專案:

PS C:\> cargo new my-gtk-app
PS C:\> cd my-gtk-app

然後在 Cargo.toml 的 dependencies 裡加入 gtk:

[dependencies]
gtk = "0.14.3"

編譯執行,看看有沒有錯誤訊息:

PS C:\> cargo run