You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

118 lines
2.5 KiB

package m9zApi
import (
"encoding/json"
"os"
"path/filepath"
"sync"
g "tgk-touch/internal/global"
"github.com/towgo/towgo/lib/system"
"github.com/towgo/towgo/towgo"
)
type ScanConfigManager struct {
mu sync.RWMutex
loopCount int
}
type ScanConfigData struct {
LoopCount int `json:"loop_count"`
}
var scanConfigManager = &ScanConfigManager{}
func getScanConfigFilePath() string {
return filepath.Join(system.GetPathOfProgram(), "data", "scanConfig.json")
}
func (m *ScanConfigManager) GetLoopCount() int {
m.mu.RLock()
defer m.mu.RUnlock()
return normalizeLoopCount(m.loopCount)
}
func (m *ScanConfigManager) SetLoopCount(loopCount int) error {
m.mu.Lock()
defer m.mu.Unlock()
m.loopCount = loopCount
if err := m.saveToFile(); err != nil {
return err
}
g.GVA_Config.DeviceInfo.LoopCount = loopCount
return nil
}
func (m *ScanConfigManager) loadFromFile() error {
m.mu.Lock()
defer m.mu.Unlock()
filePath := getScanConfigFilePath()
jsonData, err := os.ReadFile(filePath)
if err != nil {
if os.IsNotExist(err) {
m.loopCount = normalizeLoopCount(g.Config().DeviceInfo.LoopCount)
return m.saveToFile()
}
return err
}
var data ScanConfigData
if err := json.Unmarshal(jsonData, &data); err != nil {
return err
}
m.loopCount = normalizeLoopCount(data.LoopCount)
g.GVA_Config.DeviceInfo.LoopCount = m.loopCount
return nil
}
func (m *ScanConfigManager) saveToFile() error {
filePath := getScanConfigFilePath()
dir := filepath.Dir(filePath)
if err := os.MkdirAll(dir, 0755); err != nil {
return err
}
jsonData, err := json.Marshal(ScanConfigData{
LoopCount: normalizeLoopCount(m.loopCount),
})
if err != nil {
return err
}
return os.WriteFile(filePath, jsonData, 0600)
}
func getScanConfig(rpcConn towgo.JsonRpcConnection) {
rpcConn.WriteResult(map[string]interface{}{
"loop_count": scanConfigManager.GetLoopCount(),
"max_loop_count": maxLoopCount,
"min_loop_count": 1,
})
}
type SetScanConfigReq struct {
LoopCount int `json:"loop_count"`
}
func setScanConfig(rpcConn towgo.JsonRpcConnection) {
var req SetScanConfigReq
rpcConn.ReadParams(&req)
if req.LoopCount < 1 || req.LoopCount > maxLoopCount {
rpcConn.WriteError(400, "loop_count must be between 1 and 10")
return
}
if err := scanConfigManager.SetLoopCount(req.LoopCount); err != nil {
rpcConn.WriteError(500, "save scan config failed: "+err.Error())
return
}
rpcConn.WriteResult(map[string]interface{}{
"success": true,
"loop_count": scanConfigManager.GetLoopCount(),
"max_loop_count": maxLoopCount,
"min_loop_count": 1,
})
}