|
@@ -15,10 +15,10 @@ import (
|
|
|
)
|
|
|
|
|
|
const (
|
|
|
- DEF_SAMPLE_PERIOD = 30 * time.Second // time.Minute
|
|
|
- DEF_SAMPLE_PEER_DURATION = 10 * time.Second
|
|
|
- DEF_TCP_READ_TIMEOUT = 1 * time.Minute
|
|
|
- POSTPONE_PERSIST_TIME = 1 * time.Minute
|
|
|
+ DEF_SAMPLE_PERIOD = 10 * time.Minute
|
|
|
+ DEF_SAMPLE_PEER_DURATION = 60 * time.Second
|
|
|
+ DEF_TCP_READ_TIMEOUT = 30 * time.Second
|
|
|
+ POSTPONE_PERSIST_TIME = 5 * time.Minute
|
|
|
)
|
|
|
|
|
|
//amList map[string]*Ammeter
|
|
@@ -62,6 +62,7 @@ type AmMeterHub struct {
|
|
|
chnExit chan bool
|
|
|
loopserver bool
|
|
|
sampleTmr *time.Timer
|
|
|
+ amIndex []string //avoid map chaos order,even map read only
|
|
|
amList map[string]*Ammeter //key=[code + address], each meter id must be unique
|
|
|
persitList map[string]*meterPersist
|
|
|
tmrPersist *time.Timer
|
|
@@ -116,20 +117,7 @@ func (dev *AmMeterHub) ChannelDispatch(stream []byte, args interface{}) bus.ChnD
|
|
|
}
|
|
|
|
|
|
func (dev *AmMeterHub) IssueSampleCmd(tmrTx *time.Timer) (pam *Ammeter) {
|
|
|
- i := 0
|
|
|
- for _, am := range dev.amList {
|
|
|
- if i == 0 {
|
|
|
- pam = am
|
|
|
- }
|
|
|
- if i == dev.queryIdx {
|
|
|
- pam = am
|
|
|
- break
|
|
|
- }
|
|
|
- i++
|
|
|
- }
|
|
|
- if pam == nil {
|
|
|
- return nil
|
|
|
- }
|
|
|
+ pam = dev.amList[dev.amIndex[dev.queryIdx]]
|
|
|
pack := dev.Route[1].iproto.PackageCmd("TotalActivePower", pam.Code+pam.Address)
|
|
|
dev.Route[1].ibus.Send(dev.Route[1].iChn, pack)
|
|
|
tmrTx.Reset(1 * time.Second)
|
|
@@ -139,7 +127,7 @@ func (dev *AmMeterHub) IssueSampleCmd(tmrTx *time.Timer) (pam *Ammeter) {
|
|
|
func (dev *AmMeterHub) SchedulNextSample(tmrTx *time.Timer) {
|
|
|
tmrTx.Stop()
|
|
|
dev.queryIdx++
|
|
|
- log.Info("Schedul next:(%d/%d)", dev.queryIdx, len(dev.amList))
|
|
|
+
|
|
|
if dev.queryIdx >= len(dev.amList) {
|
|
|
dev.queryIdx = 0
|
|
|
dev.sampleTmr.Reset(DEF_SAMPLE_PERIOD)
|
|
@@ -339,7 +327,9 @@ func (drv *AmmeterDrv) CreateDevice(model interface{}) (int, []IDevice) {
|
|
|
if len(mod.Code) < 4 || len(mod.Address) < 8 {
|
|
|
continue
|
|
|
}
|
|
|
+ //AmMeterHub is device!!! communication target is the hub
|
|
|
hub := drv.mountHub(&mod, &devlist)
|
|
|
+
|
|
|
id := mod.Code + mod.Address
|
|
|
am, has := hub.(*AmMeterHub).amList[id]
|
|
|
if !has {
|
|
@@ -361,14 +351,22 @@ func (drv *AmmeterDrv) CreateDevice(model interface{}) (int, []IDevice) {
|
|
|
}
|
|
|
|
|
|
for _, hub := range drv.DevList {
|
|
|
+ hub.(*AmMeterHub).amIndex = make([]string, 0)
|
|
|
for id, am := range hub.(*AmMeterHub).amList {
|
|
|
if am.TsUpdate != ts {
|
|
|
delete(hub.(*AmMeterHub).amList, id)
|
|
|
+ log.Info("Delete ammeter:", id)
|
|
|
+ } else {
|
|
|
+ hub.(*AmMeterHub).amIndex = append(hub.(*AmMeterHub).amIndex, id)
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- return int(ts), devlist
|
|
|
+ if len(drv.DevList) == 0 {
|
|
|
+ drv.Uninstall()
|
|
|
+ }
|
|
|
+
|
|
|
+ return len(devlist), devlist
|
|
|
}
|
|
|
|
|
|
func (drv *AmmeterDrv) GetModel() interface{} {
|