package controller import ( "MeterService/controller/dto" "MeterService/core/api" "MeterService/core/utils" "MeterService/data" "MeterService/meter" "MeterService/service/downStreamService/proto" "MeterService/service/downStreamService/proto/acrel" "MeterService/service/downStreamService/proto/pmc350b" "MeterService/service/rtuService" "github.com/gin-gonic/gin" ) func SetMeterAddress(c *gin.Context) { req := dto.SetMeterAddressReq{} if req.AddrNew == req.AddrOld { api.Fail(c, "电表地址错误") } if req.AddrOld < 1 || req.AddrOld > 254 || req.AddrNew < 1 || req.AddrNew > 254 { api.Fail(c, "电表地址错误") } meterHandler, w := GetClientHandler(c, req.SN, req.Type, req.AddrOld) if !meterHandler.SetAddress(w, req.AddrNew) { api.Fail(c, "电表地址设置失败") } api.Ok(c) } func SetMeterRatio(c *gin.Context) { req := dto.SetMeterRatioReq{} if req.Addr < 1 || req.Addr > 254 { api.Fail(c, "电表地址错误") } meterHandler, w := GetClientHandler(c, req.SN, req.Type, req.Addr) if !meterHandler.SetRatio(w, req.SerData) { api.Fail(c, "电表比例设置失败") } } func GetMeterRatio(c *gin.Context) { req := dto.GetMeterRatioReq{} if req.Addr < 1 || req.Addr > 254 { api.Fail(c, "电表地址错误") } meterHandler, w := GetClientHandler(c, req.SN, req.Type, req.Addr) dataStr, ok := meterHandler.GetRatio(w) if !ok { api.Fail(c, "电表比例设置失败") } api.Ok2(c, dataStr) } func GetClientHandler(c *gin.Context, sn string, mType string, addr int) (proto.MeterHandler, rtuService.RtuNetPgr) { if !meter.VerifyMeterProto(mType) { api.Fail(c, "电表协议错误") } _, ok := data.DtuMap.Get(sn) if !ok { api.Fail(c, "没有找到电表") } client, ok := data.OnlineSN.Get(sn) if !ok { api.Fail(c, "电表正在通信或已离线,请稍后再试") } client.MLock.Lock() defer client.MLock.Unlock() w := rtuService.NewRtuNetPgr(utils.IntoByte(addr)) w.SetClientState(client) w.SetSerialNumber(sn) var meterHandler proto.MeterHandler switch mType { case meter.MeterAdw300: meterHandler = acrel.NewAdw300MeterHandler() case meter.MeterPmc350b: meterHandler = pmc350b.NewPmc350bMeterHandler() default: api.Fail(c, "电表协议未提供支持") } return meterHandler, w }