meter.go 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. package controller
  2. import (
  3. "MeterService/controller/dto"
  4. "MeterService/core/api"
  5. "MeterService/core/utils"
  6. "MeterService/data"
  7. "MeterService/meter"
  8. "MeterService/service/downStreamService/proto"
  9. "MeterService/service/downStreamService/proto/acrel"
  10. "MeterService/service/downStreamService/proto/pmc350b"
  11. "MeterService/service/rtuService"
  12. "github.com/gin-gonic/gin"
  13. )
  14. func SetMeterAddress(c *gin.Context) {
  15. req := dto.SetMeterAddressReq{}
  16. if req.AddrNew == req.AddrOld {
  17. api.Fail(c, "电表地址错误")
  18. }
  19. if req.AddrOld < 1 || req.AddrOld > 254 || req.AddrNew < 1 || req.AddrNew > 254 {
  20. api.Fail(c, "电表地址错误")
  21. }
  22. meterHandler, w := GetClientHandler(c, req.SN, req.Type, req.AddrOld)
  23. if !meterHandler.SetAddress(w, req.AddrNew) {
  24. api.Fail(c, "电表地址设置失败")
  25. }
  26. api.Ok(c)
  27. }
  28. func SetMeterRatio(c *gin.Context) {
  29. req := dto.SetMeterRatioReq{}
  30. if req.Addr < 1 || req.Addr > 254 {
  31. api.Fail(c, "电表地址错误")
  32. }
  33. meterHandler, w := GetClientHandler(c, req.SN, req.Type, req.Addr)
  34. if !meterHandler.SetRatio(w, req.SerData) {
  35. api.Fail(c, "电表比例设置失败")
  36. }
  37. }
  38. func GetMeterRatio(c *gin.Context) {
  39. req := dto.GetMeterRatioReq{}
  40. if req.Addr < 1 || req.Addr > 254 {
  41. api.Fail(c, "电表地址错误")
  42. }
  43. meterHandler, w := GetClientHandler(c, req.SN, req.Type, req.Addr)
  44. dataStr, ok := meterHandler.GetRatio(w)
  45. if !ok {
  46. api.Fail(c, "电表比例设置失败")
  47. }
  48. api.Ok2(c, dataStr)
  49. }
  50. func GetClientHandler(c *gin.Context, sn string, mType string, addr int) (proto.MeterHandler, rtuService.RtuNetPgr) {
  51. if !meter.VerifyMeterProto(mType) {
  52. api.Fail(c, "电表协议错误")
  53. }
  54. _, ok := data.DtuMap.Get(sn)
  55. if !ok {
  56. api.Fail(c, "没有找到电表")
  57. }
  58. client, ok := data.OnlineSN.Get(sn)
  59. if !ok {
  60. api.Fail(c, "电表正在通信或已离线,请稍后再试")
  61. }
  62. client.MLock.Lock()
  63. defer client.MLock.Unlock()
  64. w := rtuService.NewRtuNetPgr(utils.IntoByte(addr))
  65. w.SetClientState(client)
  66. w.SetSerialNumber(sn)
  67. var meterHandler proto.MeterHandler
  68. switch mType {
  69. case meter.MeterAdw300:
  70. meterHandler = acrel.NewAdw300MeterHandler()
  71. case meter.MeterPmc350b:
  72. meterHandler = pmc350b.NewPmc350bMeterHandler()
  73. default:
  74. api.Fail(c, "电表协议未提供支持")
  75. }
  76. return meterHandler, w
  77. }