Files
odroid-power-mate/example/powermate-console-frontend/forms.go
YoungSoo Shin a7ed7f9df2 WIP
Signed-off-by: YoungSoo Shin <shinys000114@gmail.com>
(cherry picked from commit 61db696a03)
2025-12-16 06:08:22 +09:00

174 lines
5.3 KiB
Go

package main
import (
"fmt"
"github.com/charmbracelet/huh"
)
func (m *model) initLoginForm() {
m.loginForm = huh.NewForm(
huh.NewGroup(
huh.NewNote().Title("ODROID Connector").Description("Enter credentials"),
huh.NewInput().Title("IP Address").Value(&m.formData.IP),
huh.NewInput().Title("Username").Value(&m.formData.Username),
huh.NewInput().Title("Password").Value(&m.formData.Password).EchoMode(huh.EchoModePassword),
),
).WithTheme(huh.ThemeBase())
}
func (m *model) initSettingsMenu() {
*m.menuSelection = "scan"
m.settingsForm = huh.NewForm(
huh.NewGroup(
huh.NewSelect[string]().
Title("Settings Menu").
Key("menu_select").
Options(
huh.NewOption("1. Scan Networks", "scan"),
huh.NewOption("2. Manual Connection", "manual"),
huh.NewOption("3. IP Configuration", "ip"),
huh.NewOption("4. AP Mode Settings", "ap"),
huh.NewOption("5. System (UART/Sensor)", "system"),
huh.NewOption("6. Safety (Current Limits)", "safety"),
huh.NewOption("7. Account Settings", "account"),
huh.NewOption("8. Reboot Device", "reboot"),
huh.NewOption("Esc. Exit", "exit"),
).
Value(m.menuSelection),
),
).WithTheme(huh.ThemeDracula())
}
func (m *model) initWifiScanForm() {
opts := make([]huh.Option[string], 0)
for _, ap := range m.wifiScanList {
label := fmt.Sprintf("%s (%ddBm, %s)", ap.SSID, ap.RSSI, ap.AuthMode)
opts = append(opts, huh.NewOption(label, ap.SSID))
}
if len(opts) == 0 {
opts = append(opts, huh.NewOption("(No Networks Found - Back)", ""))
}
// [수정] 터미널 높이를 계산하여 리스트 최대 높이 제한 (스크롤 활성화)
listHeight := 10
if m.height > 20 {
listHeight = m.height - 10 // 여백 고려
}
m.settingsForm = huh.NewForm(
huh.NewGroup(
huh.NewSelect[string]().
Title("Select Wi-Fi Network").
Key("scan_ssid").
Options(opts...).
Value(&m.settingsData.WifiSSID).
WithHeight(listHeight), // [핵심] 높이 제한으로 터미널 뚫림 방지
),
).WithTheme(huh.ThemeDracula())
}
func (m *model) initWifiForm() {
m.settingsForm = huh.NewForm(
huh.NewGroup(
huh.NewNote().Title("Connect to Wi-Fi"),
huh.NewInput().Title("SSID").Value(&m.settingsData.WifiSSID),
huh.NewInput().Title("Password").Value(&m.settingsData.WifiPass).EchoMode(huh.EchoModePassword),
),
).WithTheme(huh.ThemeDracula())
}
func (m *model) initIPForm() {
m.settingsForm = huh.NewForm(
huh.NewGroup(
huh.NewSelect[string]().
Title("Network Type").
Options(
huh.NewOption("DHCP", "dhcp"),
huh.NewOption("Static", "static"),
).
Value(&m.settingsData.NetType),
),
huh.NewGroup(
huh.NewNote().Title("Static IP Details"),
huh.NewInput().Title("IP Address").Value(&m.settingsData.IP),
huh.NewInput().Title("Gateway").Value(&m.settingsData.Gateway),
huh.NewInput().Title("Subnet Mask").Value(&m.settingsData.Subnet),
huh.NewInput().Title("DNS 1").Value(&m.settingsData.DNS1),
huh.NewInput().Title("DNS 2").Value(&m.settingsData.DNS2),
).WithHideFunc(func() bool {
// [수정] DHCP일 때 완벽히 숨김 처리
return m.settingsData.NetType != "static"
}),
).WithTheme(huh.ThemeDracula())
}
func (m *model) initAPForm() {
m.settingsForm = huh.NewForm(
huh.NewGroup(
huh.NewSelect[string]().
Title("WiFi Mode").
Options(
huh.NewOption("Station Only (STA)", "sta"),
huh.NewOption("AP + Station (APSTA)", "apsta"),
).
Value(&m.settingsData.Mode),
),
huh.NewGroup(
huh.NewNote().Title("AP Settings"),
huh.NewInput().Title("AP SSID").Value(&m.settingsData.APSSID),
huh.NewInput().Title("AP Password").Value(&m.settingsData.APPass).EchoMode(huh.EchoModePassword),
).WithHideFunc(func() bool {
// [수정] APSTA가 아닐 때 숨김 처리
return m.settingsData.Mode != "apsta"
}),
).WithTheme(huh.ThemeDracula())
}
func (m *model) initSystemForm() {
m.settingsForm = huh.NewForm(
huh.NewGroup(
huh.NewNote().Title("System Configuration"),
huh.NewSelect[string]().
Title("UART Baudrate").
Options(
huh.NewOption("9600", "9600"),
huh.NewOption("19200", "19200"),
huh.NewOption("38400", "38400"),
huh.NewOption("57600", "57600"),
huh.NewOption("115200", "115200"),
huh.NewOption("1500000", "1500000"),
).
Value(&m.settingsData.Baudrate),
huh.NewInput().
Title("Sensor Period (ms)").
Value(&m.settingsData.Period),
),
).WithTheme(huh.ThemeDracula())
}
func (m *model) initSafetyForm() {
vinStr := fmt.Sprintf("%.2f", m.settingsData.VinLimit)
mainStr := fmt.Sprintf("%.2f", m.settingsData.MainLimit)
usbStr := fmt.Sprintf("%.2f", m.settingsData.UsbLimit)
m.settingsForm = huh.NewForm(
huh.NewGroup(
huh.NewNote().Title("Current Limits (Ampere)"),
// Key를 명시하여 update.go에서 안전하게 파싱
huh.NewInput().Title("VIN Limit").Value(&vinStr).Key("vin_limit"),
huh.NewInput().Title("Main (12V) Limit").Value(&mainStr).Key("main_limit"),
huh.NewInput().Title("USB (5V) Limit").Value(&usbStr).Key("usb_limit"),
),
).WithTheme(huh.ThemeDracula())
}
func (m *model) initAccountForm() {
m.settingsForm = huh.NewForm(
huh.NewGroup(
huh.NewNote().Title("Change Credentials"),
huh.NewInput().Title("New Username").Value(&m.settingsData.NewUser),
huh.NewInput().Title("New Password").Value(&m.settingsData.NewPass).EchoMode(huh.EchoModePassword),
),
).WithTheme(huh.ThemeDracula())
}