126 lines
2.4 KiB
Go
126 lines
2.4 KiB
Go
package tui
|
|
|
|
import (
|
|
"ble_simulator/internal/device"
|
|
)
|
|
|
|
// ControlType represents the type of control
|
|
type ControlType int
|
|
|
|
const (
|
|
ControlButton ControlType = iota
|
|
ControlSlider
|
|
)
|
|
|
|
// Control represents an interactive control in the TUI
|
|
type Control struct {
|
|
Name string
|
|
Type ControlType
|
|
Action func() // For buttons
|
|
GetValue func() int // For sliders
|
|
SetValue func(int) // For sliders
|
|
Min int // For sliders
|
|
Max int // For sliders
|
|
Step int // For sliders
|
|
}
|
|
|
|
// FocusPanel represents which panel is focused
|
|
type FocusPanel int
|
|
|
|
const (
|
|
PanelControls FocusPanel = iota
|
|
PanelLogs
|
|
)
|
|
|
|
// Model is the main Bubble Tea model
|
|
type Model struct {
|
|
state *device.DeviceState
|
|
logBuffer *LogBuffer
|
|
notifyCh chan string // Channel to send alarm notifications
|
|
|
|
controls []Control
|
|
focusedCtrl int
|
|
focusedPanel FocusPanel
|
|
|
|
logOffset int // Scroll offset for log view
|
|
|
|
width int
|
|
height int
|
|
|
|
quitting bool
|
|
}
|
|
|
|
// NewModel creates a new TUI model
|
|
func NewModel(state *device.DeviceState, logBuffer *LogBuffer, notifyCh chan string) Model {
|
|
m := Model{
|
|
state: state,
|
|
logBuffer: logBuffer,
|
|
notifyCh: notifyCh,
|
|
focusedCtrl: 0,
|
|
focusedPanel: PanelControls,
|
|
logOffset: 0,
|
|
width: 80,
|
|
height: 24,
|
|
}
|
|
|
|
// Setup controls
|
|
m.controls = []Control{
|
|
{
|
|
Name: "Trigger Alarm",
|
|
Type: ControlButton,
|
|
Action: func() {
|
|
state.TriggerAlarm("TRIGGERED")
|
|
logBuffer.Info("Alarm triggered manually")
|
|
if notifyCh != nil {
|
|
select {
|
|
case notifyCh <- "ALARM: TRIGGERED":
|
|
default:
|
|
}
|
|
}
|
|
},
|
|
},
|
|
{
|
|
Name: "Trigger Tamper",
|
|
Type: ControlButton,
|
|
Action: func() {
|
|
state.TriggerAlarm("TAMPER")
|
|
logBuffer.Info("Tamper alarm triggered manually")
|
|
if notifyCh != nil {
|
|
select {
|
|
case notifyCh <- "ALARM: TAMPER":
|
|
default:
|
|
}
|
|
}
|
|
},
|
|
},
|
|
{
|
|
Name: "Reset Alarm",
|
|
Type: ControlButton,
|
|
Action: func() {
|
|
state.ResetAlarm()
|
|
logBuffer.Info("Alarm reset")
|
|
},
|
|
},
|
|
{
|
|
Name: "Sensor Value",
|
|
Type: ControlSlider,
|
|
GetValue: state.GetSensorValue,
|
|
SetValue: state.SetSensorValue,
|
|
Min: 0,
|
|
Max: 4095,
|
|
Step: 50,
|
|
},
|
|
{
|
|
Name: "Jitter Range",
|
|
Type: ControlSlider,
|
|
GetValue: state.GetJitterRange,
|
|
SetValue: state.SetJitterRange,
|
|
Min: 0,
|
|
Max: 100,
|
|
Step: 5,
|
|
},
|
|
}
|
|
|
|
return m
|
|
}
|