package plc_address import ( "apsClient/constvar" "apsClient/pkg/logx" "apsClient/utils/file" "fmt" "github.com/spf13/cast" "os" "strings" "sync" ) type addressMap struct { store sync.Map } var defaultAddressMap *addressMap func newAddressMap() *addressMap { return &addressMap{store: sync.Map{}} } func init() { defaultAddressMap = newAddressMap() } func Set(key string, value int) { defaultAddressMap.store.Store(key, value) } func Get(key string) (value int, ok bool) { if v, ok := defaultAddressMap.store.Load(key); ok { return v.(int), ok } return 0, false } var LoadOk bool func IsLoad() bool { return LoadOk } func LoadAddressFromFile() (loadOk bool) { keyFileName := fmt.Sprintf("%s%s", constvar.PlcAddressDataPath, constvar.PlcAddressDataKeyFileName) addressFileName := fmt.Sprintf("%s%s", constvar.PlcAddressDataPath, constvar.PlcAddressDataValueFileName) if !file.Exists(keyFileName) || !file.Exists(addressFileName) { return } keyData, err := os.ReadFile(keyFileName) if err != nil { logx.Errorf("LoadAddressFromFile ReadFile err: %v", err.Error()) return } addressData, err := os.ReadFile(addressFileName) if err != nil { logx.Errorf("LoadAddressFromFile ReadFile err: %v", err.Error()) return } keyString := string(keyData) addressString := string(addressData) keys := strings.Split(keyString, "\n") addresses := strings.Split(addressString, "\n") if len(keys) != len(addresses) { logx.Error("plc address message error: key length not equal address length") return } for i := 0; i < len(keys); i++ { key := strings.ReplaceAll(keys[i], "\r", "") address := cast.ToInt(strings.ReplaceAll(addresses[i], "\r", "")) Set(key, address) } LoadOk = true return true }