|
@@ -17,9 +17,10 @@ import (
|
|
|
|
|
|
const (
|
|
const (
|
|
DEF_SAMPLE_PERIOD = 10 * time.Minute
|
|
DEF_SAMPLE_PERIOD = 10 * time.Minute
|
|
- DEF_SAMPLE_PEER_DURATION = 60 * time.Second
|
|
|
|
- DEF_TCP_READ_TIMEOUT = (DEF_SAMPLE_PERIOD + 10*time.Minute)
|
|
|
|
|
|
+ DEF_SAMPLE_PEER_DURATION = 5 * time.Second
|
|
|
|
+ DEF_TCP_READ_TIMEOUT = (1 * time.Minute)
|
|
POSTPONE_PERSIST_TIME = 5 * time.Minute
|
|
POSTPONE_PERSIST_TIME = 5 * time.Minute
|
|
|
|
+ MIN_TIMEOUT_TIMES = 2
|
|
)
|
|
)
|
|
|
|
|
|
//amList map[string]*Ammeter
|
|
//amList map[string]*Ammeter
|
|
@@ -63,6 +64,7 @@ type AmMeterHub struct {
|
|
chnExit chan bool
|
|
chnExit chan bool
|
|
loopserver bool
|
|
loopserver bool
|
|
sampleTmr *time.Timer
|
|
sampleTmr *time.Timer
|
|
|
|
+ errCount []int
|
|
amIndex []string //avoid map chaos order,even map read only
|
|
amIndex []string //avoid map chaos order,even map read only
|
|
amList map[string]*Ammeter //key=[code + address], each meter id must be unique
|
|
amList map[string]*Ammeter //key=[code + address], each meter id must be unique
|
|
persitList map[string]*meterPersist
|
|
persitList map[string]*meterPersist
|
|
@@ -81,6 +83,9 @@ func (dev *AmMeterHub) Close() error {
|
|
|
|
|
|
func (dev *AmMeterHub) OnAttach(chn bus.IChannel) {
|
|
func (dev *AmMeterHub) OnAttach(chn bus.IChannel) {
|
|
log.Info(dev.DutSn, " Attached!")
|
|
log.Info(dev.DutSn, " Attached!")
|
|
|
|
+ for i := 0; i < len(dev.errCount); i++ {
|
|
|
|
+ dev.errCount[i] = 0
|
|
|
|
+ }
|
|
chn.SetTimeout(DEF_TCP_READ_TIMEOUT)
|
|
chn.SetTimeout(DEF_TCP_READ_TIMEOUT)
|
|
dev.sampleTmr.Reset(DEF_SAMPLE_PEER_DURATION)
|
|
dev.sampleTmr.Reset(DEF_SAMPLE_PEER_DURATION)
|
|
dev.baseDevice.OnAttach(chn)
|
|
dev.baseDevice.OnAttach(chn)
|
|
@@ -129,20 +134,20 @@ func (dev *AmMeterHub) IssueSampleCmd(tmrTx *time.Timer) (pam *Ammeter) {
|
|
if _, err := dev.Route[1].ibus.Send(dev.Route[1].iChn, pack); err != nil {
|
|
if _, err := dev.Route[1].ibus.Send(dev.Route[1].iChn, pack); err != nil {
|
|
dev.OnDetach(dev.Route[1].iChn)
|
|
dev.OnDetach(dev.Route[1].iChn)
|
|
} else {
|
|
} else {
|
|
- tmrTx.Reset(1 * time.Second)
|
|
|
|
|
|
+ tmrTx.Reset(DEF_TCP_READ_TIMEOUT)
|
|
}
|
|
}
|
|
return pam
|
|
return pam
|
|
}
|
|
}
|
|
|
|
|
|
-func (dev *AmMeterHub) SchedulNextSample(tmrTx *time.Timer) {
|
|
|
|
|
|
+func (dev *AmMeterHub) SchedulNextSample(tmrTx *time.Timer, timoutdiff time.Duration) {
|
|
tmrTx.Stop()
|
|
tmrTx.Stop()
|
|
dev.queryIdx++
|
|
dev.queryIdx++
|
|
|
|
|
|
if dev.queryIdx >= len(dev.amList) {
|
|
if dev.queryIdx >= len(dev.amList) {
|
|
dev.queryIdx = 0
|
|
dev.queryIdx = 0
|
|
- dev.sampleTmr.Reset(DEF_SAMPLE_PERIOD)
|
|
|
|
|
|
+ dev.sampleTmr.Reset(DEF_SAMPLE_PERIOD - timoutdiff)
|
|
} else {
|
|
} else {
|
|
- dev.sampleTmr.Reset(DEF_SAMPLE_PEER_DURATION)
|
|
|
|
|
|
+ dev.sampleTmr.Reset(DEF_SAMPLE_PEER_DURATION - timoutdiff)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -191,6 +196,7 @@ func (dev *AmMeterHub) Run() error {
|
|
for dev.loopserver {
|
|
for dev.loopserver {
|
|
select {
|
|
select {
|
|
case msg := <-dev.Route[1].router[0]:
|
|
case msg := <-dev.Route[1].router[0]:
|
|
|
|
+ dev.errCount[dev.queryIdx] = 0
|
|
if reflect.TypeOf(msg).Kind() == reflect.Slice {
|
|
if reflect.TypeOf(msg).Kind() == reflect.Slice {
|
|
b := msg.([]byte)
|
|
b := msg.([]byte)
|
|
log.Info("[", dev.DutSn, "]:", hex.EncodeToString(b)) //[9521003697]:fefefefe68040042050821689108333333338b694c331c16
|
|
log.Info("[", dev.DutSn, "]:", hex.EncodeToString(b)) //[9521003697]:fefefefe68040042050821689108333333338b694c331c16
|
|
@@ -204,16 +210,26 @@ func (dev *AmMeterHub) Run() error {
|
|
dev.Route[0].ibus.Send(dev.Route[0].iChn, telemetry)
|
|
dev.Route[0].ibus.Send(dev.Route[0].iChn, telemetry)
|
|
am.TsSample = time.Now().Unix()
|
|
am.TsSample = time.Now().Unix()
|
|
}
|
|
}
|
|
- dev.SchedulNextSample(tmrTxTimout)
|
|
|
|
|
|
+ dev.SchedulNextSample(tmrTxTimout, 0)
|
|
}
|
|
}
|
|
} else if reflect.TypeOf(msg).Kind() == reflect.String {
|
|
} else if reflect.TypeOf(msg).Kind() == reflect.String {
|
|
if msg.(string) == "closed" {
|
|
if msg.(string) == "closed" {
|
|
-
|
|
|
|
dev.OnDetach(dev.Route[1].iChn)
|
|
dev.OnDetach(dev.Route[1].iChn)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
case <-tmrTxTimout.C:
|
|
case <-tmrTxTimout.C:
|
|
- dev.SchedulNextSample(tmrTxTimout)
|
|
|
|
|
|
+ dev.errCount[dev.queryIdx]++
|
|
|
|
+ keepconnect := false
|
|
|
|
+ for errcnt := range dev.errCount {
|
|
|
|
+ if errcnt < MIN_TIMEOUT_TIMES {
|
|
|
|
+ dev.SchedulNextSample(tmrTxTimout, DEF_TCP_READ_TIMEOUT)
|
|
|
|
+ keepconnect = true
|
|
|
|
+ break
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if !keepconnect {
|
|
|
|
+ dev.Route[1].ibus.Disconnect(dev.Route[1].iChn)
|
|
|
|
+ }
|
|
case <-dev.sampleTmr.C:
|
|
case <-dev.sampleTmr.C:
|
|
dev.IssueSampleCmd(tmrTxTimout)
|
|
dev.IssueSampleCmd(tmrTxTimout)
|
|
case <-dev.chnExit:
|
|
case <-dev.chnExit:
|
|
@@ -381,6 +397,7 @@ func (drv *AmmeterDrv) CreateDevice(model interface{}) (int, []IDevice) {
|
|
hub.(*AmMeterHub).amIndex = append(hub.(*AmMeterHub).amIndex, id)
|
|
hub.(*AmMeterHub).amIndex = append(hub.(*AmMeterHub).amIndex, id)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+ hub.(*AmMeterHub).errCount = make([]int, len(hub.(*AmMeterHub).amList))
|
|
}
|
|
}
|
|
|
|
|
|
if len(drv.DevList) == 0 {
|
|
if len(drv.DevList) == 0 {
|