123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- package drviers
- import (
- "bytes"
- "errors"
- bus "github.com/ammeter/Bus"
- "github.com/yuguorong/go/log"
- )
- type SAirModel struct {
- Id string `json:"id"`
- DevName string `json:"devName"`
- Code string `json:"code"`
- Protocol string `json:"protocol"`
- GwDevId string `json:"gwDevId"`
- }
- type Uemis struct {
- baseDevice
- devList map[string]SAirModel //name->Id
- chnExit chan bool
- loopserver bool
- }
- func (u *Uemis) ChannelDispatch(stream []byte, args interface{}) bus.ChnDispResult {
- devName := ""
- buf := bytes.NewBuffer(stream)
- mret := u.Route[1].iproto.ParsePacket(buf.Bytes(), &devName)
- if mret != nil && devName != "" {
- devN := devName[8:]
- devN = "SA10" + "-00000000" + devN
- if _, has := u.devList[devN]; has {
- log.Info(u.DeviceName+" Dispatch ["+devN+"]: ", string(stream))
- return bus.DispatchMulti
- }
- }
- return bus.DispatchNone
- }
- func (u *Uemis) Run() error {
- u.loopserver = true
- for u.loopserver {
- select {
- case msg := <-u.Route[1].router[0]:
- b := msg.([]byte)
- devName := ""
- mret := u.Route[1].iproto.ParsePacket(b, &devName)
- if mret != nil && devName != "" {
- v := mret.(map[string]interface{})
- dev := devName[8:]
- dev = "SA10" + "-00000000" + dev
- log.Info(u.baseDevice.Id+"/"+dev, v)
- telemetry := u.Route[0].iproto.PackageCmd(dev, mret)
- u.Route[0].ibus.Send(u.Route[0].iChn, telemetry)
- }
- case <-u.chnExit:
- u.loopserver = false
- }
- }
- return nil
- }
- func (u *Uemis) Open(...interface{}) error {
- lenr := len(u.Route)
- if lenr < 1 {
- return errors.New("wrong route config")
- } else if lenr < 2 {
- u.SetRoute(u, "HJ212", "dtuFtpServer", "HJ212-"+u.Id, 0)
- }
- if !u.loopserver {
- go u.Run()
- }
- return nil
- }
- func (u *Uemis) Close() error {
- u.loopserver = false
- u.chnExit <- true
- return nil
- }
- func (u *Uemis) GetDevice(s string) interface{} {
- return u
- }
- type UemisDrv struct {
- baseDriver
- }
- func (drv *UemisDrv) GetModel() interface{} {
- return &[]SAirModel{}
- }
- func (drv *UemisDrv) CreateDevice(model interface{}, filterGwId string) (int, []IDevice) {
- drv.baseDriver.CreateDevice(model, filterGwId)
- devlist := make([]IDevice, 0)
- mlist := model.(*[]SAirModel)
- var dev *Uemis = nil
- for _, m := range *mlist {
- if m.GwDevId == filterGwId {
- if dev == nil {
- dev = new(Uemis)
- dev.loopserver = false
- dev.devList = make(map[string]SAirModel)
- dev.Id = m.Id
- dev.DeviceName = "S5-" + dev.Id
- dev.Probe(dev.DeviceName, drv)
- drv.baseDriver.DevList[dev.DeviceName] = dev
- devlist = append(devlist, dev)
- }
- //m.DevName = strings.ReplaceAll(m.DevName, "SAIR10", "S10")
- dev.devList[m.DevName] = m
- }
- }
- return len(devlist), devlist
- }
- func NewUemis(param interface{}) IDriver {
- drv := new(UemisDrv)
- return drv
- }
- func init() {
- driverReg["SA10"] = NewUemis
- }
|