diff --git a/models/mqtt_data.go b/models/mqtt_data.go index f3e1c7c..eef6ed9 100644 --- a/models/mqtt_data.go +++ b/models/mqtt_data.go @@ -4,40 +4,62 @@ import "gorm.io/gorm" type MqttHeartRateRecord struct { gorm.Model - Identifier string `gorm:"uniqueIndex;size:255" json:"identifier"` - Topic string `gorm:"size:255;index" json:"topic"` - RegionID uint32 `gorm:"index" json:"regionId"` - GatewayMAC string `gorm:"size:32;index" json:"gatewayMac"` - BandID uint32 `gorm:"index" json:"bandId"` - BeltAddr string `gorm:"size:64;index" json:"beltAddr"` - PacketNum uint32 `gorm:"index" json:"packetNum"` - HeartRate int `gorm:"type:int" json:"heartRate"` - HrConfidence int `gorm:"type:int" json:"hrConfidence"` - IsActive bool `json:"isActive"` - IsOnSkin bool `json:"isOnSkin"` - Battery uint32 `json:"battery"` - SignalRSSINeg float64 `gorm:"type:double precision" json:"signalRssiNeg"` - SNR float64 `gorm:"type:double precision" json:"snr"` - HubBusID uint32 `json:"hubBusId"` - HubSubDevID uint32 `json:"hubSubDevId"` - ReceivedAt int64 `gorm:"type:bigint;index" json:"receivedAt"` + Identifier string `gorm:"uniqueIndex;size:255" json:"identifier"` + Topic string `gorm:"size:255;index" json:"topic"` + RegionID uint32 `gorm:"index" json:"regionId"` + GatewayMAC string `gorm:"size:32;index" json:"gatewayMac"` + GatewaySchemaVersion uint32 `json:"gatewaySchemaVersion"` + GatewayActiveUplink int32 `gorm:"type:int" json:"gatewayActiveUplink"` + GatewayCellularIMEI string `gorm:"size:64" json:"gatewayCellularImei"` + GatewayCellularRSSI int32 `gorm:"type:int" json:"gatewayCellularRssi"` + GatewayCellularBER int32 `gorm:"type:int" json:"gatewayCellularBer"` + BandID uint32 `gorm:"index" json:"bandId"` + BeltAddr string `gorm:"size:64;index" json:"beltAddr"` + PacketNum uint32 `gorm:"index" json:"packetNum"` + HeartRate int `gorm:"type:int" json:"heartRate"` + HrConfidence int `gorm:"type:int" json:"hrConfidence"` + IsActive bool `json:"isActive"` + IsOnSkin bool `json:"isOnSkin"` + Battery uint32 `json:"battery"` + PacketStatusSource string `gorm:"size:16" json:"packetStatusSource"` + SignalRSSINeg float64 `gorm:"type:double precision" json:"signalRssiNeg"` + SNR float64 `gorm:"type:double precision" json:"snr"` + RawSignalRSSIX2Neg uint32 `json:"rawSignalRssiX2Neg"` + RawSnrPktX4 int32 `gorm:"type:int" json:"rawSnrPktX4"` + HubBusID uint32 `json:"hubBusId"` + HubSubDevID uint32 `json:"hubSubDevId"` + HubRadioBW int32 `gorm:"type:int" json:"hubRadioBw"` + HubRadioSF uint32 `json:"hubRadioSf"` + HubRadioFrequencyMHz float64 `gorm:"type:double precision" json:"hubRadioFrequencyMHz"` + ReceivedAt int64 `gorm:"type:bigint;index" json:"receivedAt"` } type MqttStepCountRecord struct { gorm.Model - Identifier string `gorm:"uniqueIndex;size:255" json:"identifier"` - Topic string `gorm:"size:255;index" json:"topic"` - RegionID uint32 `gorm:"index" json:"regionId"` - GatewayMAC string `gorm:"size:32;index" json:"gatewayMac"` - BandID uint32 `gorm:"index" json:"bandId"` - BeltAddr string `gorm:"size:64;index" json:"beltAddr"` - PacketNum uint32 `gorm:"index" json:"packetNum"` - StepCount uint32 `json:"stepCount"` - SignalRSSINeg float64 `gorm:"type:double precision" json:"signalRssiNeg"` - SNR float64 `gorm:"type:double precision" json:"snr"` - HubBusID uint32 `json:"hubBusId"` - HubSubDevID uint32 `json:"hubSubDevId"` - ReceivedAt int64 `gorm:"type:bigint;index" json:"receivedAt"` + Identifier string `gorm:"uniqueIndex;size:255" json:"identifier"` + Topic string `gorm:"size:255;index" json:"topic"` + RegionID uint32 `gorm:"index" json:"regionId"` + GatewayMAC string `gorm:"size:32;index" json:"gatewayMac"` + GatewaySchemaVersion uint32 `json:"gatewaySchemaVersion"` + GatewayActiveUplink int32 `gorm:"type:int" json:"gatewayActiveUplink"` + GatewayCellularIMEI string `gorm:"size:64" json:"gatewayCellularImei"` + GatewayCellularRSSI int32 `gorm:"type:int" json:"gatewayCellularRssi"` + GatewayCellularBER int32 `gorm:"type:int" json:"gatewayCellularBer"` + BandID uint32 `gorm:"index" json:"bandId"` + BeltAddr string `gorm:"size:64;index" json:"beltAddr"` + PacketNum uint32 `gorm:"index" json:"packetNum"` + StepCount uint32 `json:"stepCount"` + PacketStatusSource string `gorm:"size:16" json:"packetStatusSource"` + SignalRSSINeg float64 `gorm:"type:double precision" json:"signalRssiNeg"` + SNR float64 `gorm:"type:double precision" json:"snr"` + RawSignalRSSIX2Neg uint32 `json:"rawSignalRssiX2Neg"` + RawSnrPktX4 int32 `gorm:"type:int" json:"rawSnrPktX4"` + HubBusID uint32 `json:"hubBusId"` + HubSubDevID uint32 `json:"hubSubDevId"` + HubRadioBW int32 `gorm:"type:int" json:"hubRadioBw"` + HubRadioSF uint32 `json:"hubRadioSf"` + HubRadioFrequencyMHz float64 `gorm:"type:double precision" json:"hubRadioFrequencyMHz"` + ReceivedAt int64 `gorm:"type:bigint;index" json:"receivedAt"` } type MqttGatewayStatusRecord struct { @@ -46,6 +68,11 @@ type MqttGatewayStatusRecord struct { Topic string `gorm:"size:255;index" json:"topic"` RegionID uint32 `gorm:"index" json:"regionId"` GatewayMAC string `gorm:"size:32;index" json:"gatewayMac"` + GatewaySchemaVersion uint32 `json:"gatewaySchemaVersion"` + GatewayActiveUplink int32 `gorm:"type:int" json:"gatewayActiveUplink"` + GatewayCellularIMEI string `gorm:"size:64" json:"gatewayCellularImei"` + GatewayCellularRSSI int32 `gorm:"type:int" json:"gatewayCellularRssi"` + GatewayCellularBER int32 `gorm:"type:int" json:"gatewayCellularBer"` BootCount uint32 `json:"bootCount"` UptimeMs uint32 `json:"uptimeMs"` DurationMsSinceLastPacket uint32 `json:"durationMsSinceLastPacket"` diff --git a/mqtt/listener.go b/mqtt/listener.go index 954a454..99b9120 100644 --- a/mqtt/listener.go +++ b/mqtt/listener.go @@ -23,6 +23,14 @@ const ( defaultWorkers = 4 ) +type packetStatusSnapshot struct { + source string + signalRSSINeg float64 + snr float64 + rawSignalRSSIX2Neg uint32 + rawSnrPktX4 int32 +} + type Listener struct { db *gorm.DB cfg config.MQTTConfig @@ -245,75 +253,107 @@ func (l *Listener) persistTrainingSession(record *models.MqttTrainingSessionReco } func buildHeartRateRecord(measurement *whgw_hrpb.HrMeasurement, topic string, now int64) models.MqttHeartRateRecord { - regionID := measurement.GetGatewayInfo().GetRegionId() + gatewayInfo := measurement.GetGatewayInfo() + hubInfo := measurement.GetHubInfo() + regionID := gatewayInfo.GetRegionId() if regionID == 0 { regionID = parseRegionFromTopic(topic) } - gatewayMAC := formatMAC(measurement.GetGatewayInfo().GetGatewayMac()) + gatewayMAC := formatMAC(gatewayInfo.GetGatewayMac()) packet := measurement.GetHrPacket() - rssi, snr := parsePacketStatus(measurement.GetPacketStatus()) + status := parsePacketStatus(measurement.GetPacketStatus()) beltAddr := fmt.Sprintf("%d-%d", regionID, packet.GetId()) return models.MqttHeartRateRecord{ - Identifier: fmt.Sprintf("hr:%d:%s:%d:%d", regionID, gatewayMAC, packet.GetId(), packet.GetPacketNum()), - Topic: topic, - RegionID: regionID, - GatewayMAC: gatewayMAC, - BandID: packet.GetId(), - BeltAddr: beltAddr, - PacketNum: packet.GetPacketNum(), - HeartRate: int(packet.GetHr()), - HrConfidence: int(packet.GetStatus().GetHrConfidence().Number()), - IsActive: packet.GetStatus().GetIsActive(), - IsOnSkin: packet.GetStatus().GetIsOnSkin(), - Battery: packet.GetStatus().GetBattery(), - SignalRSSINeg: rssi, - SNR: snr, - HubBusID: measurement.GetHubInfo().GetBusId(), - HubSubDevID: measurement.GetHubInfo().GetSubDevId(), - ReceivedAt: now, + Identifier: fmt.Sprintf("hr:%d:%s:%d:%d", regionID, gatewayMAC, packet.GetId(), packet.GetPacketNum()), + Topic: topic, + RegionID: regionID, + GatewayMAC: gatewayMAC, + GatewaySchemaVersion: gatewayInfo.GetExtra().GetSchemaVersion(), + GatewayActiveUplink: int32(gatewayInfo.GetExtra().GetActiveUplink().Number()), + GatewayCellularIMEI: gatewayInfo.GetExtra().GetCellularModem().GetImei(), + GatewayCellularRSSI: gatewayInfo.GetExtra().GetCellularModem().GetRssi(), + GatewayCellularBER: gatewayInfo.GetExtra().GetCellularModem().GetBer(), + BandID: packet.GetId(), + BeltAddr: beltAddr, + PacketNum: packet.GetPacketNum(), + HeartRate: int(packet.GetHr()), + HrConfidence: int(packet.GetStatus().GetHrConfidence().Number()), + IsActive: packet.GetStatus().GetIsActive(), + IsOnSkin: packet.GetStatus().GetIsOnSkin(), + Battery: packet.GetStatus().GetBattery(), + PacketStatusSource: status.source, + SignalRSSINeg: status.signalRSSINeg, + SNR: status.snr, + RawSignalRSSIX2Neg: status.rawSignalRSSIX2Neg, + RawSnrPktX4: status.rawSnrPktX4, + HubBusID: hubInfo.GetBusId(), + HubSubDevID: hubInfo.GetSubDevId(), + HubRadioBW: int32(hubInfo.GetRadioParameters().GetBw().Number()), + HubRadioSF: hubInfo.GetRadioParameters().GetSf(), + HubRadioFrequencyMHz: float64(hubInfo.GetRadioParameters().GetFrequencyMhz()), + ReceivedAt: now, } } func buildStepCountRecord(measurement *whgw_hrpb.StepCountMeasurement, topic string, now int64) models.MqttStepCountRecord { - regionID := measurement.GetGatewayInfo().GetRegionId() + gatewayInfo := measurement.GetGatewayInfo() + hubInfo := measurement.GetHubInfo() + regionID := gatewayInfo.GetRegionId() if regionID == 0 { regionID = parseRegionFromTopic(topic) } - gatewayMAC := formatMAC(measurement.GetGatewayInfo().GetGatewayMac()) + gatewayMAC := formatMAC(gatewayInfo.GetGatewayMac()) packet := measurement.GetStepCountPacket() - rssi, snr := parsePacketStatus(measurement.GetPacketStatus()) + status := parsePacketStatus(measurement.GetPacketStatus()) beltAddr := fmt.Sprintf("%d-%d", regionID, packet.GetId()) return models.MqttStepCountRecord{ - Identifier: fmt.Sprintf("step:%d:%s:%d:%d", regionID, gatewayMAC, packet.GetId(), packet.GetPacketNum()), - Topic: topic, - RegionID: regionID, - GatewayMAC: gatewayMAC, - BandID: packet.GetId(), - BeltAddr: beltAddr, - PacketNum: packet.GetPacketNum(), - StepCount: packet.GetStepCount(), - SignalRSSINeg: rssi, - SNR: snr, - HubBusID: measurement.GetHubInfo().GetBusId(), - HubSubDevID: measurement.GetHubInfo().GetSubDevId(), - ReceivedAt: now, + Identifier: fmt.Sprintf("step:%d:%s:%d:%d", regionID, gatewayMAC, packet.GetId(), packet.GetPacketNum()), + Topic: topic, + RegionID: regionID, + GatewayMAC: gatewayMAC, + GatewaySchemaVersion: gatewayInfo.GetExtra().GetSchemaVersion(), + GatewayActiveUplink: int32(gatewayInfo.GetExtra().GetActiveUplink().Number()), + GatewayCellularIMEI: gatewayInfo.GetExtra().GetCellularModem().GetImei(), + GatewayCellularRSSI: gatewayInfo.GetExtra().GetCellularModem().GetRssi(), + GatewayCellularBER: gatewayInfo.GetExtra().GetCellularModem().GetBer(), + BandID: packet.GetId(), + BeltAddr: beltAddr, + PacketNum: packet.GetPacketNum(), + StepCount: packet.GetStepCount(), + PacketStatusSource: status.source, + SignalRSSINeg: status.signalRSSINeg, + SNR: status.snr, + RawSignalRSSIX2Neg: status.rawSignalRSSIX2Neg, + RawSnrPktX4: status.rawSnrPktX4, + HubBusID: hubInfo.GetBusId(), + HubSubDevID: hubInfo.GetSubDevId(), + HubRadioBW: int32(hubInfo.GetRadioParameters().GetBw().Number()), + HubRadioSF: hubInfo.GetRadioParameters().GetSf(), + HubRadioFrequencyMHz: float64(hubInfo.GetRadioParameters().GetFrequencyMhz()), + ReceivedAt: now, } } func buildGatewayStatusRecord(status *whgw_hrpb.GatewayStatus, topic string, now int64) models.MqttGatewayStatusRecord { - regionID := status.GetInfo().GetRegionId() + gatewayInfo := status.GetInfo() + regionID := gatewayInfo.GetRegionId() if regionID == 0 { regionID = parseRegionFromTopic(topic) } - gatewayMAC := formatMAC(status.GetInfo().GetGatewayMac()) + gatewayMAC := formatMAC(gatewayInfo.GetGatewayMac()) return models.MqttGatewayStatusRecord{ Identifier: fmt.Sprintf("gateway:%d:%s:%d:%d:%d", regionID, gatewayMAC, status.GetStat().GetBootCount(), status.GetStat().GetUptimeMs(), status.GetStat().GetRxCount()), Topic: topic, RegionID: regionID, GatewayMAC: gatewayMAC, + GatewaySchemaVersion: gatewayInfo.GetExtra().GetSchemaVersion(), + GatewayActiveUplink: int32(gatewayInfo.GetExtra().GetActiveUplink().Number()), + GatewayCellularIMEI: gatewayInfo.GetExtra().GetCellularModem().GetImei(), + GatewayCellularRSSI: gatewayInfo.GetExtra().GetCellularModem().GetRssi(), + GatewayCellularBER: gatewayInfo.GetExtra().GetCellularModem().GetBer(), BootCount: status.GetStat().GetBootCount(), UptimeMs: status.GetStat().GetUptimeMs(), DurationMsSinceLastPacket: status.GetStat().GetDurationMsSinceLastPacket(), @@ -325,17 +365,27 @@ func buildGatewayStatusRecord(status *whgw_hrpb.GatewayStatus, topic string, now } } -func parsePacketStatus(status *whgw_hrpb.IPacketStatus) (float64, float64) { +func parsePacketStatus(status *whgw_hrpb.IPacketStatus) packetStatusSnapshot { if status == nil { - return 0, 0 + return packetStatusSnapshot{} } if parsed := status.GetParsed(); parsed != nil { - return float64(parsed.GetSignalRssiNeg()), float64(parsed.GetSnrPkt()) + return packetStatusSnapshot{ + source: "parsed", + signalRSSINeg: float64(parsed.GetSignalRssiNeg()), + snr: float64(parsed.GetSnrPkt()), + } } if raw := status.GetRaw(); raw != nil { - return -float64(raw.GetSignalRssiX2Neg()) / 2, float64(raw.GetSnrPktX4()) / 4 + return packetStatusSnapshot{ + source: "raw", + signalRSSINeg: -float64(raw.GetSignalRssiX2Neg()) / 2, + snr: float64(raw.GetSnrPktX4()) / 4, + rawSignalRSSIX2Neg: raw.GetSignalRssiX2Neg(), + rawSnrPktX4: raw.GetSnrPktX4(), + } } - return 0, 0 + return packetStatusSnapshot{} } func formatMAC(data []byte) string { diff --git a/proto/hr_packet_v2.pb.go b/proto/hr_packet_v2.pb.go index 54d4af1..c2daf36 100644 --- a/proto/hr_packet_v2.pb.go +++ b/proto/hr_packet_v2.pb.go @@ -23,10 +23,14 @@ const ( type HrConfidence int32 const ( - HrConfidence_ZERO HrConfidence = 0 - HrConfidence_LOW HrConfidence = 1 + // [0,25) + HrConfidence_ZERO HrConfidence = 0 + // [25,50) + HrConfidence_LOW HrConfidence = 1 + // [50,75] HrConfidence_MEDIUM HrConfidence = 2 - HrConfidence_HIGH HrConfidence = 3 + // (75,100] + HrConfidence_HIGH HrConfidence = 3 ) // Enum value maps for HrConfidence. @@ -75,15 +79,26 @@ func (HrConfidence) EnumDescriptor() ([]byte, []int) { type LoRaBW int32 const ( - LoRaBW_BW_NONE LoRaBW = 0 - LoRaBW_BW_10_4 LoRaBW = 8 - LoRaBW_BW_15_6 LoRaBW = 1 - LoRaBW_BW_20_8 LoRaBW = 9 + // nobody is using 7.8 kHz bandwidth + // so to satisfy protobuf, we use NONE for zero value + LoRaBW_BW_NONE LoRaBW = 0 + // 10.4 kHz + LoRaBW_BW_10_4 LoRaBW = 8 + // 15.6 kHz + LoRaBW_BW_15_6 LoRaBW = 1 + // 20.8 kHz + LoRaBW_BW_20_8 LoRaBW = 9 + // 31.25 kHz LoRaBW_BW_31_25 LoRaBW = 2 - LoRaBW_BW_41_7 LoRaBW = 10 - LoRaBW_BW_62_5 LoRaBW = 3 + // 41.7 kHz + LoRaBW_BW_41_7 LoRaBW = 10 + // 62.5 kHz + LoRaBW_BW_62_5 LoRaBW = 3 + // 125.0 kHz LoRaBW_BW_125_0 LoRaBW = 4 + // 250.0 kHz LoRaBW_BW_250_0 LoRaBW = 5 + // 500.0 kHz LoRaBW_BW_500_0 LoRaBW = 6 ) @@ -200,12 +215,63 @@ func (PacketKind) EnumDescriptor() ([]byte, []int) { return file_proto_hr_packet_v2_proto_rawDescGZIP(), []int{2} } +type NetworkUplinkKind int32 + +const ( + NetworkUplinkKind_NETWORK_UPLINK_UNKNOWN NetworkUplinkKind = 0 + NetworkUplinkKind_NETWORK_UPLINK_WIFI NetworkUplinkKind = 1 + NetworkUplinkKind_NETWORK_UPLINK_CELLULAR NetworkUplinkKind = 2 +) + +// Enum value maps for NetworkUplinkKind. +var ( + NetworkUplinkKind_name = map[int32]string{ + 0: "NETWORK_UPLINK_UNKNOWN", + 1: "NETWORK_UPLINK_WIFI", + 2: "NETWORK_UPLINK_CELLULAR", + } + NetworkUplinkKind_value = map[string]int32{ + "NETWORK_UPLINK_UNKNOWN": 0, + "NETWORK_UPLINK_WIFI": 1, + "NETWORK_UPLINK_CELLULAR": 2, + } +) + +func (x NetworkUplinkKind) Enum() *NetworkUplinkKind { + p := new(NetworkUplinkKind) + *p = x + return p +} + +func (x NetworkUplinkKind) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (NetworkUplinkKind) Descriptor() protoreflect.EnumDescriptor { + return file_proto_hr_packet_v2_proto_enumTypes[3].Descriptor() +} + +func (NetworkUplinkKind) Type() protoreflect.EnumType { + return &file_proto_hr_packet_v2_proto_enumTypes[3] +} + +func (x NetworkUplinkKind) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use NetworkUplinkKind.Descriptor instead. +func (NetworkUplinkKind) EnumDescriptor() ([]byte, []int) { + return file_proto_hr_packet_v2_proto_rawDescGZIP(), []int{3} +} + type GatewayConfigEntryKind int32 const ( - GatewayConfigEntryKind_REGION_ID GatewayConfigEntryKind = 0 - GatewayConfigEntryKind_WIFI_SSID GatewayConfigEntryKind = 1 - GatewayConfigEntryKind_WIFI_PASSWORD GatewayConfigEntryKind = 2 + GatewayConfigEntryKind_REGION_ID GatewayConfigEntryKind = 0 + GatewayConfigEntryKind_WIFI_SSID GatewayConfigEntryKind = 1 + GatewayConfigEntryKind_WIFI_PASSWORD GatewayConfigEntryKind = 2 + GatewayConfigEntryKind_NETWORK_UPLINK GatewayConfigEntryKind = 3 + GatewayConfigEntryKind_CELLULAR_APN GatewayConfigEntryKind = 4 ) // Enum value maps for GatewayConfigEntryKind. @@ -214,11 +280,15 @@ var ( 0: "REGION_ID", 1: "WIFI_SSID", 2: "WIFI_PASSWORD", + 3: "NETWORK_UPLINK", + 4: "CELLULAR_APN", } GatewayConfigEntryKind_value = map[string]int32{ - "REGION_ID": 0, - "WIFI_SSID": 1, - "WIFI_PASSWORD": 2, + "REGION_ID": 0, + "WIFI_SSID": 1, + "WIFI_PASSWORD": 2, + "NETWORK_UPLINK": 3, + "CELLULAR_APN": 4, } ) @@ -233,11 +303,11 @@ func (x GatewayConfigEntryKind) String() string { } func (GatewayConfigEntryKind) Descriptor() protoreflect.EnumDescriptor { - return file_proto_hr_packet_v2_proto_enumTypes[3].Descriptor() + return file_proto_hr_packet_v2_proto_enumTypes[4].Descriptor() } func (GatewayConfigEntryKind) Type() protoreflect.EnumType { - return &file_proto_hr_packet_v2_proto_enumTypes[3] + return &file_proto_hr_packet_v2_proto_enumTypes[4] } func (x GatewayConfigEntryKind) Number() protoreflect.EnumNumber { @@ -246,7 +316,7 @@ func (x GatewayConfigEntryKind) Number() protoreflect.EnumNumber { // Deprecated: Use GatewayConfigEntryKind.Descriptor instead. func (GatewayConfigEntryKind) EnumDescriptor() ([]byte, []int) { - return file_proto_hr_packet_v2_proto_rawDescGZIP(), []int{3} + return file_proto_hr_packet_v2_proto_rawDescGZIP(), []int{4} } type LoRaParameters struct { @@ -506,11 +576,15 @@ func (x *StepCountPacket) GetStepCount() uint32 { } type RawPacketStatus struct { - state protoimpl.MessageState `protogen:"open.v1"` - SignalRssiX2Neg uint32 `protobuf:"varint,1,opt,name=signal_rssi_x2_neg,json=signalRssiX2Neg,proto3" json:"signal_rssi_x2_neg,omitempty"` - SnrPktX4 int32 `protobuf:"varint,2,opt,name=snr_pkt_x4,json=snrPktX4,proto3" json:"snr_pkt_x4,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + // Estimation of RSSI of the LoRa signal (after despreading) on last packet received. + // to get the actual RSSI in dBm, divide by 2 and negate + SignalRssiX2Neg uint32 `protobuf:"varint,1,opt,name=signal_rssi_x2_neg,json=signalRssiX2Neg,proto3" json:"signal_rssi_x2_neg,omitempty"` + // Estimation of RSSI of the LoRa signal (after despreading) on last packet received. + // to get the actual SNR in dB, divide by 4 + SnrPktX4 int32 `protobuf:"varint,2,opt,name=snr_pkt_x4,json=snrPktX4,proto3" json:"snr_pkt_x4,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *RawPacketStatus) Reset() { @@ -558,9 +632,11 @@ func (x *RawPacketStatus) GetSnrPktX4() int32 { } type PacketStatus struct { - state protoimpl.MessageState `protogen:"open.v1"` - SignalRssiNeg float32 `protobuf:"fixed32,1,opt,name=signal_rssi_neg,json=signalRssiNeg,proto3" json:"signal_rssi_neg,omitempty"` - SnrPkt float32 `protobuf:"fixed32,2,opt,name=snr_pkt,json=snrPkt,proto3" json:"snr_pkt,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + // Estimation of RSSI of the LoRa signal (after despreading) on last packet received. + SignalRssiNeg float32 `protobuf:"fixed32,1,opt,name=signal_rssi_neg,json=signalRssiNeg,proto3" json:"signal_rssi_neg,omitempty"` + // Estimation of RSSI of the LoRa signal (after despreading) on last packet received. + SnrPkt float32 `protobuf:"fixed32,2,opt,name=snr_pkt,json=snrPkt,proto3" json:"snr_pkt,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -610,10 +686,11 @@ func (x *PacketStatus) GetSnrPkt() float32 { } type HubInfo struct { - state protoimpl.MessageState `protogen:"open.v1"` - BusId uint32 `protobuf:"varint,1,opt,name=bus_id,json=busId,proto3" json:"bus_id,omitempty"` - SubDevId uint32 `protobuf:"varint,2,opt,name=sub_dev_id,json=subDevId,proto3" json:"sub_dev_id,omitempty"` - RadioParameters *LoRaParameters `protobuf:"bytes,3,opt,name=radio_parameters,json=radioParameters,proto3" json:"radio_parameters,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + BusId uint32 `protobuf:"varint,1,opt,name=bus_id,json=busId,proto3" json:"bus_id,omitempty"` + SubDevId uint32 `protobuf:"varint,2,opt,name=sub_dev_id,json=subDevId,proto3" json:"sub_dev_id,omitempty"` + // * optional * + RadioParameters *LoRaParameters `protobuf:"bytes,3,opt,name=radio_parameters,json=radioParameters,proto3" json:"radio_parameters,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -729,20 +806,209 @@ func (x *RadioData) GetData() []byte { return nil } +type CellularModemInfo struct { + state protoimpl.MessageState `protogen:"open.v1"` + Imei string `protobuf:"bytes,1,opt,name=imei,proto3" json:"imei,omitempty"` + Rssi int32 `protobuf:"varint,2,opt,name=rssi,proto3" json:"rssi,omitempty"` + Ber int32 `protobuf:"varint,3,opt,name=ber,proto3" json:"ber,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CellularModemInfo) Reset() { + *x = CellularModemInfo{} + mi := &file_proto_hr_packet_v2_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CellularModemInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CellularModemInfo) ProtoMessage() {} + +func (x *CellularModemInfo) ProtoReflect() protoreflect.Message { + mi := &file_proto_hr_packet_v2_proto_msgTypes[8] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CellularModemInfo.ProtoReflect.Descriptor instead. +func (*CellularModemInfo) Descriptor() ([]byte, []int) { + return file_proto_hr_packet_v2_proto_rawDescGZIP(), []int{8} +} + +func (x *CellularModemInfo) GetImei() string { + if x != nil { + return x.Imei + } + return "" +} + +func (x *CellularModemInfo) GetRssi() int32 { + if x != nil { + return x.Rssi + } + return 0 +} + +func (x *CellularModemInfo) GetBer() int32 { + if x != nil { + return x.Ber + } + return 0 +} + +type GatewayInfoExtra struct { + state protoimpl.MessageState `protogen:"open.v1"` + SchemaVersion uint32 `protobuf:"varint,1,opt,name=schema_version,json=schemaVersion,proto3" json:"schema_version,omitempty"` + ActiveUplink NetworkUplinkKind `protobuf:"varint,2,opt,name=active_uplink,json=activeUplink,proto3,enum=whgw_hr.NetworkUplinkKind" json:"active_uplink,omitempty"` + CellularModem *CellularModemInfo `protobuf:"bytes,3,opt,name=cellular_modem,json=cellularModem,proto3" json:"cellular_modem,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GatewayInfoExtra) Reset() { + *x = GatewayInfoExtra{} + mi := &file_proto_hr_packet_v2_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GatewayInfoExtra) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GatewayInfoExtra) ProtoMessage() {} + +func (x *GatewayInfoExtra) ProtoReflect() protoreflect.Message { + mi := &file_proto_hr_packet_v2_proto_msgTypes[9] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GatewayInfoExtra.ProtoReflect.Descriptor instead. +func (*GatewayInfoExtra) Descriptor() ([]byte, []int) { + return file_proto_hr_packet_v2_proto_rawDescGZIP(), []int{9} +} + +func (x *GatewayInfoExtra) GetSchemaVersion() uint32 { + if x != nil { + return x.SchemaVersion + } + return 0 +} + +func (x *GatewayInfoExtra) GetActiveUplink() NetworkUplinkKind { + if x != nil { + return x.ActiveUplink + } + return NetworkUplinkKind_NETWORK_UPLINK_UNKNOWN +} + +func (x *GatewayInfoExtra) GetCellularModem() *CellularModemInfo { + if x != nil { + return x.CellularModem + } + return nil +} + +type GatewayStateReportExtra struct { + state protoimpl.MessageState `protogen:"open.v1"` + SchemaVersion uint32 `protobuf:"varint,1,opt,name=schema_version,json=schemaVersion,proto3" json:"schema_version,omitempty"` + SelectedUplink NetworkUplinkKind `protobuf:"varint,2,opt,name=selected_uplink,json=selectedUplink,proto3,enum=whgw_hr.NetworkUplinkKind" json:"selected_uplink,omitempty"` + ActiveUplink NetworkUplinkKind `protobuf:"varint,3,opt,name=active_uplink,json=activeUplink,proto3,enum=whgw_hr.NetworkUplinkKind" json:"active_uplink,omitempty"` + CellularModemPresent bool `protobuf:"varint,4,opt,name=cellular_modem_present,json=cellularModemPresent,proto3" json:"cellular_modem_present,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GatewayStateReportExtra) Reset() { + *x = GatewayStateReportExtra{} + mi := &file_proto_hr_packet_v2_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GatewayStateReportExtra) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GatewayStateReportExtra) ProtoMessage() {} + +func (x *GatewayStateReportExtra) ProtoReflect() protoreflect.Message { + mi := &file_proto_hr_packet_v2_proto_msgTypes[10] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GatewayStateReportExtra.ProtoReflect.Descriptor instead. +func (*GatewayStateReportExtra) Descriptor() ([]byte, []int) { + return file_proto_hr_packet_v2_proto_rawDescGZIP(), []int{10} +} + +func (x *GatewayStateReportExtra) GetSchemaVersion() uint32 { + if x != nil { + return x.SchemaVersion + } + return 0 +} + +func (x *GatewayStateReportExtra) GetSelectedUplink() NetworkUplinkKind { + if x != nil { + return x.SelectedUplink + } + return NetworkUplinkKind_NETWORK_UPLINK_UNKNOWN +} + +func (x *GatewayStateReportExtra) GetActiveUplink() NetworkUplinkKind { + if x != nil { + return x.ActiveUplink + } + return NetworkUplinkKind_NETWORK_UPLINK_UNKNOWN +} + +func (x *GatewayStateReportExtra) GetCellularModemPresent() bool { + if x != nil { + return x.CellularModemPresent + } + return false +} + type GatewayStateReport struct { - state protoimpl.MessageState `protogen:"open.v1"` - NetworkHasConnection bool `protobuf:"varint,1,opt,name=network_has_connection,json=networkHasConnection,proto3" json:"network_has_connection,omitempty"` - NetworkHasIp bool `protobuf:"varint,2,opt,name=network_has_ip,json=networkHasIp,proto3" json:"network_has_ip,omitempty"` - NetworkHasMqttConnection bool `protobuf:"varint,3,opt,name=network_has_mqtt_connection,json=networkHasMqttConnection,proto3" json:"network_has_mqtt_connection,omitempty"` - BluetoothHasConnect bool `protobuf:"varint,4,opt,name=bluetooth_has_connect,json=bluetoothHasConnect,proto3" json:"bluetooth_has_connect,omitempty"` - ErrorCode uint32 `protobuf:"varint,5,opt,name=error_code,json=errorCode,proto3" json:"error_code,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + NetworkHasConnection bool `protobuf:"varint,1,opt,name=network_has_connection,json=networkHasConnection,proto3" json:"network_has_connection,omitempty"` + NetworkHasIp bool `protobuf:"varint,2,opt,name=network_has_ip,json=networkHasIp,proto3" json:"network_has_ip,omitempty"` + NetworkHasMqttConnection bool `protobuf:"varint,3,opt,name=network_has_mqtt_connection,json=networkHasMqttConnection,proto3" json:"network_has_mqtt_connection,omitempty"` + BluetoothHasConnect bool `protobuf:"varint,4,opt,name=bluetooth_has_connect,json=bluetoothHasConnect,proto3" json:"bluetooth_has_connect,omitempty"` + ErrorCode uint32 `protobuf:"varint,5,opt,name=error_code,json=errorCode,proto3" json:"error_code,omitempty"` + Extra *GatewayStateReportExtra `protobuf:"bytes,6,opt,name=extra,proto3" json:"extra,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } func (x *GatewayStateReport) Reset() { *x = GatewayStateReport{} - mi := &file_proto_hr_packet_v2_proto_msgTypes[8] + mi := &file_proto_hr_packet_v2_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -754,7 +1020,7 @@ func (x *GatewayStateReport) String() string { func (*GatewayStateReport) ProtoMessage() {} func (x *GatewayStateReport) ProtoReflect() protoreflect.Message { - mi := &file_proto_hr_packet_v2_proto_msgTypes[8] + mi := &file_proto_hr_packet_v2_proto_msgTypes[11] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -767,7 +1033,7 @@ func (x *GatewayStateReport) ProtoReflect() protoreflect.Message { // Deprecated: Use GatewayStateReport.ProtoReflect.Descriptor instead. func (*GatewayStateReport) Descriptor() ([]byte, []int) { - return file_proto_hr_packet_v2_proto_rawDescGZIP(), []int{8} + return file_proto_hr_packet_v2_proto_rawDescGZIP(), []int{11} } func (x *GatewayStateReport) GetNetworkHasConnection() bool { @@ -805,6 +1071,14 @@ func (x *GatewayStateReport) GetErrorCode() uint32 { return 0 } +func (x *GatewayStateReport) GetExtra() *GatewayStateReportExtra { + if x != nil { + return x.Extra + } + return nil +} + +// ** Hub (S) to Gateway (M) ** type HubSlaveOutGatewayMasterInMsg struct { state protoimpl.MessageState `protogen:"open.v1"` // Types that are valid to be assigned to Choice: @@ -818,7 +1092,7 @@ type HubSlaveOutGatewayMasterInMsg struct { func (x *HubSlaveOutGatewayMasterInMsg) Reset() { *x = HubSlaveOutGatewayMasterInMsg{} - mi := &file_proto_hr_packet_v2_proto_msgTypes[9] + mi := &file_proto_hr_packet_v2_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -830,7 +1104,7 @@ func (x *HubSlaveOutGatewayMasterInMsg) String() string { func (*HubSlaveOutGatewayMasterInMsg) ProtoMessage() {} func (x *HubSlaveOutGatewayMasterInMsg) ProtoReflect() protoreflect.Message { - mi := &file_proto_hr_packet_v2_proto_msgTypes[9] + mi := &file_proto_hr_packet_v2_proto_msgTypes[12] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -843,7 +1117,7 @@ func (x *HubSlaveOutGatewayMasterInMsg) ProtoReflect() protoreflect.Message { // Deprecated: Use HubSlaveOutGatewayMasterInMsg.ProtoReflect.Descriptor instead. func (*HubSlaveOutGatewayMasterInMsg) Descriptor() ([]byte, []int) { - return file_proto_hr_packet_v2_proto_rawDescGZIP(), []int{9} + return file_proto_hr_packet_v2_proto_rawDescGZIP(), []int{12} } func (x *HubSlaveOutGatewayMasterInMsg) GetChoice() isHubSlaveOutGatewayMasterInMsg_Choice { @@ -887,6 +1161,7 @@ func (*HubSlaveOutGatewayMasterInMsg_NtfRadioData) isHubSlaveOutGatewayMasterInM func (*HubSlaveOutGatewayMasterInMsg_NtfBatteryInfo) isHubSlaveOutGatewayMasterInMsg_Choice() {} +// ** Gateway (M) to Hub (S) ** type GatewayMasterOutHubSlaveInMsg struct { state protoimpl.MessageState `protogen:"open.v1"` // Types that are valid to be assigned to Choice: @@ -899,7 +1174,7 @@ type GatewayMasterOutHubSlaveInMsg struct { func (x *GatewayMasterOutHubSlaveInMsg) Reset() { *x = GatewayMasterOutHubSlaveInMsg{} - mi := &file_proto_hr_packet_v2_proto_msgTypes[10] + mi := &file_proto_hr_packet_v2_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -911,7 +1186,7 @@ func (x *GatewayMasterOutHubSlaveInMsg) String() string { func (*GatewayMasterOutHubSlaveInMsg) ProtoMessage() {} func (x *GatewayMasterOutHubSlaveInMsg) ProtoReflect() protoreflect.Message { - mi := &file_proto_hr_packet_v2_proto_msgTypes[10] + mi := &file_proto_hr_packet_v2_proto_msgTypes[13] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -924,7 +1199,7 @@ func (x *GatewayMasterOutHubSlaveInMsg) ProtoReflect() protoreflect.Message { // Deprecated: Use GatewayMasterOutHubSlaveInMsg.ProtoReflect.Descriptor instead. func (*GatewayMasterOutHubSlaveInMsg) Descriptor() ([]byte, []int) { - return file_proto_hr_packet_v2_proto_rawDescGZIP(), []int{10} + return file_proto_hr_packet_v2_proto_rawDescGZIP(), []int{13} } func (x *GatewayMasterOutHubSlaveInMsg) GetChoice() isGatewayMasterOutHubSlaveInMsg_Choice { @@ -954,6 +1229,7 @@ type GatewayMasterOutHubSlaveInMsg_SigGatewayStateReport struct { func (*GatewayMasterOutHubSlaveInMsg_SigGatewayStateReport) isGatewayMasterOutHubSlaveInMsg_Choice() { } +// ** Gateway to MQTT ** type GatewaySlaveOutCloudMasterInMsg struct { state protoimpl.MessageState `protogen:"open.v1"` // Types that are valid to be assigned to Choice: @@ -968,7 +1244,7 @@ type GatewaySlaveOutCloudMasterInMsg struct { func (x *GatewaySlaveOutCloudMasterInMsg) Reset() { *x = GatewaySlaveOutCloudMasterInMsg{} - mi := &file_proto_hr_packet_v2_proto_msgTypes[11] + mi := &file_proto_hr_packet_v2_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -980,7 +1256,7 @@ func (x *GatewaySlaveOutCloudMasterInMsg) String() string { func (*GatewaySlaveOutCloudMasterInMsg) ProtoMessage() {} func (x *GatewaySlaveOutCloudMasterInMsg) ProtoReflect() protoreflect.Message { - mi := &file_proto_hr_packet_v2_proto_msgTypes[11] + mi := &file_proto_hr_packet_v2_proto_msgTypes[14] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -993,7 +1269,7 @@ func (x *GatewaySlaveOutCloudMasterInMsg) ProtoReflect() protoreflect.Message { // Deprecated: Use GatewaySlaveOutCloudMasterInMsg.ProtoReflect.Descriptor instead. func (*GatewaySlaveOutCloudMasterInMsg) Descriptor() ([]byte, []int) { - return file_proto_hr_packet_v2_proto_rawDescGZIP(), []int{11} + return file_proto_hr_packet_v2_proto_rawDescGZIP(), []int{14} } func (x *GatewaySlaveOutCloudMasterInMsg) GetChoice() isGatewaySlaveOutCloudMasterInMsg_Choice { @@ -1064,7 +1340,7 @@ type BatteryInfo struct { func (x *BatteryInfo) Reset() { *x = BatteryInfo{} - mi := &file_proto_hr_packet_v2_proto_msgTypes[12] + mi := &file_proto_hr_packet_v2_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1076,7 +1352,7 @@ func (x *BatteryInfo) String() string { func (*BatteryInfo) ProtoMessage() {} func (x *BatteryInfo) ProtoReflect() protoreflect.Message { - mi := &file_proto_hr_packet_v2_proto_msgTypes[12] + mi := &file_proto_hr_packet_v2_proto_msgTypes[15] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1089,7 +1365,7 @@ func (x *BatteryInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use BatteryInfo.ProtoReflect.Descriptor instead. func (*BatteryInfo) Descriptor() ([]byte, []int) { - return file_proto_hr_packet_v2_proto_rawDescGZIP(), []int{12} + return file_proto_hr_packet_v2_proto_rawDescGZIP(), []int{15} } func (x *BatteryInfo) GetVoltageMv() uint32 { @@ -1117,13 +1393,14 @@ type GatewayInfo struct { state protoimpl.MessageState `protogen:"open.v1"` RegionId uint32 `protobuf:"varint,1,opt,name=region_id,json=regionId,proto3" json:"region_id,omitempty"` GatewayMac []byte `protobuf:"bytes,2,opt,name=gateway_mac,json=gatewayMac,proto3" json:"gateway_mac,omitempty"` + Extra *GatewayInfoExtra `protobuf:"bytes,3,opt,name=extra,proto3" json:"extra,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } func (x *GatewayInfo) Reset() { *x = GatewayInfo{} - mi := &file_proto_hr_packet_v2_proto_msgTypes[13] + mi := &file_proto_hr_packet_v2_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1135,7 +1412,7 @@ func (x *GatewayInfo) String() string { func (*GatewayInfo) ProtoMessage() {} func (x *GatewayInfo) ProtoReflect() protoreflect.Message { - mi := &file_proto_hr_packet_v2_proto_msgTypes[13] + mi := &file_proto_hr_packet_v2_proto_msgTypes[16] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1148,7 +1425,7 @@ func (x *GatewayInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use GatewayInfo.ProtoReflect.Descriptor instead. func (*GatewayInfo) Descriptor() ([]byte, []int) { - return file_proto_hr_packet_v2_proto_rawDescGZIP(), []int{13} + return file_proto_hr_packet_v2_proto_rawDescGZIP(), []int{16} } func (x *GatewayInfo) GetRegionId() uint32 { @@ -1165,6 +1442,13 @@ func (x *GatewayInfo) GetGatewayMac() []byte { return nil } +func (x *GatewayInfo) GetExtra() *GatewayInfoExtra { + if x != nil { + return x.Extra + } + return nil +} + type IPacketStatus struct { state protoimpl.MessageState `protogen:"open.v1"` // Types that are valid to be assigned to Choice: @@ -1178,7 +1462,7 @@ type IPacketStatus struct { func (x *IPacketStatus) Reset() { *x = IPacketStatus{} - mi := &file_proto_hr_packet_v2_proto_msgTypes[14] + mi := &file_proto_hr_packet_v2_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1190,7 +1474,7 @@ func (x *IPacketStatus) String() string { func (*IPacketStatus) ProtoMessage() {} func (x *IPacketStatus) ProtoReflect() protoreflect.Message { - mi := &file_proto_hr_packet_v2_proto_msgTypes[14] + mi := &file_proto_hr_packet_v2_proto_msgTypes[17] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1203,7 +1487,7 @@ func (x *IPacketStatus) ProtoReflect() protoreflect.Message { // Deprecated: Use IPacketStatus.ProtoReflect.Descriptor instead. func (*IPacketStatus) Descriptor() ([]byte, []int) { - return file_proto_hr_packet_v2_proto_rawDescGZIP(), []int{14} + return file_proto_hr_packet_v2_proto_rawDescGZIP(), []int{17} } func (x *IPacketStatus) GetChoice() isIPacketStatus_Choice { @@ -1259,7 +1543,7 @@ type HrMeasurement struct { func (x *HrMeasurement) Reset() { *x = HrMeasurement{} - mi := &file_proto_hr_packet_v2_proto_msgTypes[15] + mi := &file_proto_hr_packet_v2_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1271,7 +1555,7 @@ func (x *HrMeasurement) String() string { func (*HrMeasurement) ProtoMessage() {} func (x *HrMeasurement) ProtoReflect() protoreflect.Message { - mi := &file_proto_hr_packet_v2_proto_msgTypes[15] + mi := &file_proto_hr_packet_v2_proto_msgTypes[18] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1284,7 +1568,7 @@ func (x *HrMeasurement) ProtoReflect() protoreflect.Message { // Deprecated: Use HrMeasurement.ProtoReflect.Descriptor instead. func (*HrMeasurement) Descriptor() ([]byte, []int) { - return file_proto_hr_packet_v2_proto_rawDescGZIP(), []int{15} + return file_proto_hr_packet_v2_proto_rawDescGZIP(), []int{18} } func (x *HrMeasurement) GetHrPacket() *HrPacket { @@ -1327,7 +1611,7 @@ type StepCountMeasurement struct { func (x *StepCountMeasurement) Reset() { *x = StepCountMeasurement{} - mi := &file_proto_hr_packet_v2_proto_msgTypes[16] + mi := &file_proto_hr_packet_v2_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1339,7 +1623,7 @@ func (x *StepCountMeasurement) String() string { func (*StepCountMeasurement) ProtoMessage() {} func (x *StepCountMeasurement) ProtoReflect() protoreflect.Message { - mi := &file_proto_hr_packet_v2_proto_msgTypes[16] + mi := &file_proto_hr_packet_v2_proto_msgTypes[19] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1352,7 +1636,7 @@ func (x *StepCountMeasurement) ProtoReflect() protoreflect.Message { // Deprecated: Use StepCountMeasurement.ProtoReflect.Descriptor instead. func (*StepCountMeasurement) Descriptor() ([]byte, []int) { - return file_proto_hr_packet_v2_proto_rawDescGZIP(), []int{16} + return file_proto_hr_packet_v2_proto_rawDescGZIP(), []int{19} } func (x *StepCountMeasurement) GetStepCountPacket() *StepCountPacket { @@ -1384,19 +1668,25 @@ func (x *StepCountMeasurement) GetHubInfo() *HubInfo { } type GatewayStatistic struct { - state protoimpl.MessageState `protogen:"open.v1"` - BootCount uint32 `protobuf:"varint,1,opt,name=boot_count,json=bootCount,proto3" json:"boot_count,omitempty"` - UptimeMs uint32 `protobuf:"varint,2,opt,name=uptime_ms,json=uptimeMs,proto3" json:"uptime_ms,omitempty"` - DurationMsSinceLastPacket uint32 `protobuf:"varint,3,opt,name=duration_ms_since_last_packet,json=durationMsSinceLastPacket,proto3" json:"duration_ms_since_last_packet,omitempty"` - RxCount uint32 `protobuf:"varint,4,opt,name=rx_count,json=rxCount,proto3" json:"rx_count,omitempty"` - BatteryInfo *BatteryInfo `protobuf:"bytes,5,opt,name=battery_info,json=batteryInfo,proto3" json:"battery_info,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + // Number of times the gateway has booted in history + BootCount uint32 `protobuf:"varint,1,opt,name=boot_count,json=bootCount,proto3" json:"boot_count,omitempty"` + // Uptime of the device (in ms) + UptimeMs uint32 `protobuf:"varint,2,opt,name=uptime_ms,json=uptimeMs,proto3" json:"uptime_ms,omitempty"` + // Duration (in ms) since last packet received + // would be the duration since boot if no packets received yet + DurationMsSinceLastPacket uint32 `protobuf:"varint,3,opt,name=duration_ms_since_last_packet,json=durationMsSinceLastPacket,proto3" json:"duration_ms_since_last_packet,omitempty"` + // Total number of packets received since boot + RxCount uint32 `protobuf:"varint,4,opt,name=rx_count,json=rxCount,proto3" json:"rx_count,omitempty"` + // optional, battery info + BatteryInfo *BatteryInfo `protobuf:"bytes,5,opt,name=battery_info,json=batteryInfo,proto3" json:"battery_info,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *GatewayStatistic) Reset() { *x = GatewayStatistic{} - mi := &file_proto_hr_packet_v2_proto_msgTypes[17] + mi := &file_proto_hr_packet_v2_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1408,7 +1698,7 @@ func (x *GatewayStatistic) String() string { func (*GatewayStatistic) ProtoMessage() {} func (x *GatewayStatistic) ProtoReflect() protoreflect.Message { - mi := &file_proto_hr_packet_v2_proto_msgTypes[17] + mi := &file_proto_hr_packet_v2_proto_msgTypes[20] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1421,7 +1711,7 @@ func (x *GatewayStatistic) ProtoReflect() protoreflect.Message { // Deprecated: Use GatewayStatistic.ProtoReflect.Descriptor instead. func (*GatewayStatistic) Descriptor() ([]byte, []int) { - return file_proto_hr_packet_v2_proto_rawDescGZIP(), []int{17} + return file_proto_hr_packet_v2_proto_rawDescGZIP(), []int{20} } func (x *GatewayStatistic) GetBootCount() uint32 { @@ -1469,7 +1759,7 @@ type GatewayStatus struct { func (x *GatewayStatus) Reset() { *x = GatewayStatus{} - mi := &file_proto_hr_packet_v2_proto_msgTypes[18] + mi := &file_proto_hr_packet_v2_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1481,7 +1771,7 @@ func (x *GatewayStatus) String() string { func (*GatewayStatus) ProtoMessage() {} func (x *GatewayStatus) ProtoReflect() protoreflect.Message { - mi := &file_proto_hr_packet_v2_proto_msgTypes[18] + mi := &file_proto_hr_packet_v2_proto_msgTypes[21] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1494,7 +1784,7 @@ func (x *GatewayStatus) ProtoReflect() protoreflect.Message { // Deprecated: Use GatewayStatus.ProtoReflect.Descriptor instead. func (*GatewayStatus) Descriptor() ([]byte, []int) { - return file_proto_hr_packet_v2_proto_rawDescGZIP(), []int{18} + return file_proto_hr_packet_v2_proto_rawDescGZIP(), []int{21} } func (x *GatewayStatus) GetInfo() *GatewayInfo { @@ -1521,7 +1811,7 @@ type Status struct { func (x *Status) Reset() { *x = Status{} - mi := &file_proto_hr_packet_v2_proto_msgTypes[19] + mi := &file_proto_hr_packet_v2_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1533,7 +1823,7 @@ func (x *Status) String() string { func (*Status) ProtoMessage() {} func (x *Status) ProtoReflect() protoreflect.Message { - mi := &file_proto_hr_packet_v2_proto_msgTypes[19] + mi := &file_proto_hr_packet_v2_proto_msgTypes[22] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1546,7 +1836,7 @@ func (x *Status) ProtoReflect() protoreflect.Message { // Deprecated: Use Status.ProtoReflect.Descriptor instead. func (*Status) Descriptor() ([]byte, []int) { - return file_proto_hr_packet_v2_proto_rawDescGZIP(), []int{19} + return file_proto_hr_packet_v2_proto_rawDescGZIP(), []int{22} } func (x *Status) GetCode() int32 { @@ -1570,6 +1860,8 @@ type GatewayConfigEntry struct { // *GatewayConfigEntry_RegionId // *GatewayConfigEntry_WifiSsid // *GatewayConfigEntry_WifiPassword + // *GatewayConfigEntry_NetworkUplink + // *GatewayConfigEntry_CellularApn Choice isGatewayConfigEntry_Choice `protobuf_oneof:"choice"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache @@ -1577,7 +1869,7 @@ type GatewayConfigEntry struct { func (x *GatewayConfigEntry) Reset() { *x = GatewayConfigEntry{} - mi := &file_proto_hr_packet_v2_proto_msgTypes[20] + mi := &file_proto_hr_packet_v2_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1589,7 +1881,7 @@ func (x *GatewayConfigEntry) String() string { func (*GatewayConfigEntry) ProtoMessage() {} func (x *GatewayConfigEntry) ProtoReflect() protoreflect.Message { - mi := &file_proto_hr_packet_v2_proto_msgTypes[20] + mi := &file_proto_hr_packet_v2_proto_msgTypes[23] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1602,7 +1894,7 @@ func (x *GatewayConfigEntry) ProtoReflect() protoreflect.Message { // Deprecated: Use GatewayConfigEntry.ProtoReflect.Descriptor instead. func (*GatewayConfigEntry) Descriptor() ([]byte, []int) { - return file_proto_hr_packet_v2_proto_rawDescGZIP(), []int{20} + return file_proto_hr_packet_v2_proto_rawDescGZIP(), []int{23} } func (x *GatewayConfigEntry) GetChoice() isGatewayConfigEntry_Choice { @@ -1639,6 +1931,24 @@ func (x *GatewayConfigEntry) GetWifiPassword() string { return "" } +func (x *GatewayConfigEntry) GetNetworkUplink() NetworkUplinkKind { + if x != nil { + if x, ok := x.Choice.(*GatewayConfigEntry_NetworkUplink); ok { + return x.NetworkUplink + } + } + return NetworkUplinkKind_NETWORK_UPLINK_UNKNOWN +} + +func (x *GatewayConfigEntry) GetCellularApn() string { + if x != nil { + if x, ok := x.Choice.(*GatewayConfigEntry_CellularApn); ok { + return x.CellularApn + } + } + return "" +} + type isGatewayConfigEntry_Choice interface { isGatewayConfigEntry_Choice() } @@ -1655,12 +1965,24 @@ type GatewayConfigEntry_WifiPassword struct { WifiPassword string `protobuf:"bytes,3,opt,name=wifi_password,json=wifiPassword,proto3,oneof"` } +type GatewayConfigEntry_NetworkUplink struct { + NetworkUplink NetworkUplinkKind `protobuf:"varint,4,opt,name=network_uplink,json=networkUplink,proto3,enum=whgw_hr.NetworkUplinkKind,oneof"` +} + +type GatewayConfigEntry_CellularApn struct { + CellularApn string `protobuf:"bytes,5,opt,name=cellular_apn,json=cellularApn,proto3,oneof"` +} + func (*GatewayConfigEntry_RegionId) isGatewayConfigEntry_Choice() {} func (*GatewayConfigEntry_WifiSsid) isGatewayConfigEntry_Choice() {} func (*GatewayConfigEntry_WifiPassword) isGatewayConfigEntry_Choice() {} +func (*GatewayConfigEntry_NetworkUplink) isGatewayConfigEntry_Choice() {} + +func (*GatewayConfigEntry_CellularApn) isGatewayConfigEntry_Choice() {} + type GatewayConfigMasterOutSlaveInMsg struct { state protoimpl.MessageState `protogen:"open.v1"` // Types that are valid to be assigned to Choice: @@ -1675,7 +1997,7 @@ type GatewayConfigMasterOutSlaveInMsg struct { func (x *GatewayConfigMasterOutSlaveInMsg) Reset() { *x = GatewayConfigMasterOutSlaveInMsg{} - mi := &file_proto_hr_packet_v2_proto_msgTypes[21] + mi := &file_proto_hr_packet_v2_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1687,7 +2009,7 @@ func (x *GatewayConfigMasterOutSlaveInMsg) String() string { func (*GatewayConfigMasterOutSlaveInMsg) ProtoMessage() {} func (x *GatewayConfigMasterOutSlaveInMsg) ProtoReflect() protoreflect.Message { - mi := &file_proto_hr_packet_v2_proto_msgTypes[21] + mi := &file_proto_hr_packet_v2_proto_msgTypes[24] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1700,7 +2022,7 @@ func (x *GatewayConfigMasterOutSlaveInMsg) ProtoReflect() protoreflect.Message { // Deprecated: Use GatewayConfigMasterOutSlaveInMsg.ProtoReflect.Descriptor instead. func (*GatewayConfigMasterOutSlaveInMsg) Descriptor() ([]byte, []int) { - return file_proto_hr_packet_v2_proto_rawDescGZIP(), []int{21} + return file_proto_hr_packet_v2_proto_rawDescGZIP(), []int{24} } func (x *GatewayConfigMasterOutSlaveInMsg) GetChoice() isGatewayConfigMasterOutSlaveInMsg_Choice { @@ -1772,7 +2094,7 @@ type GatewayConfigMasterInSlaveOutMsg struct { func (x *GatewayConfigMasterInSlaveOutMsg) Reset() { *x = GatewayConfigMasterInSlaveOutMsg{} - mi := &file_proto_hr_packet_v2_proto_msgTypes[22] + mi := &file_proto_hr_packet_v2_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1784,7 +2106,7 @@ func (x *GatewayConfigMasterInSlaveOutMsg) String() string { func (*GatewayConfigMasterInSlaveOutMsg) ProtoMessage() {} func (x *GatewayConfigMasterInSlaveOutMsg) ProtoReflect() protoreflect.Message { - mi := &file_proto_hr_packet_v2_proto_msgTypes[22] + mi := &file_proto_hr_packet_v2_proto_msgTypes[25] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1797,7 +2119,7 @@ func (x *GatewayConfigMasterInSlaveOutMsg) ProtoReflect() protoreflect.Message { // Deprecated: Use GatewayConfigMasterInSlaveOutMsg.ProtoReflect.Descriptor instead. func (*GatewayConfigMasterInSlaveOutMsg) Descriptor() ([]byte, []int) { - return file_proto_hr_packet_v2_proto_rawDescGZIP(), []int{22} + return file_proto_hr_packet_v2_proto_rawDescGZIP(), []int{25} } func (x *GatewayConfigMasterInSlaveOutMsg) GetChoice() isGatewayConfigMasterInSlaveOutMsg_Choice { @@ -1904,195 +2226,250 @@ var file_proto_hr_packet_v2_proto_rawDesc = []byte{ 0x2e, 0x77, 0x68, 0x67, 0x77, 0x5f, 0x68, 0x72, 0x2e, 0x52, 0x61, 0x77, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0f, 0x72, 0x61, 0x77, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, - 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x82, 0x02, - 0x0a, 0x12, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x70, 0x6f, 0x72, 0x74, 0x12, 0x34, 0x0a, 0x16, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, - 0x68, 0x61, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x61, 0x73, - 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x0e, 0x6e, 0x65, - 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x68, 0x61, 0x73, 0x5f, 0x69, 0x70, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0c, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x61, 0x73, 0x49, 0x70, - 0x12, 0x3d, 0x0a, 0x1b, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x68, 0x61, 0x73, 0x5f, - 0x6d, 0x71, 0x74, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x61, - 0x73, 0x4d, 0x71, 0x74, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x32, 0x0a, 0x15, 0x62, 0x6c, 0x75, 0x65, 0x74, 0x6f, 0x6f, 0x74, 0x68, 0x5f, 0x68, 0x61, 0x73, - 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, - 0x62, 0x6c, 0x75, 0x65, 0x74, 0x6f, 0x6f, 0x74, 0x68, 0x48, 0x61, 0x73, 0x43, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x63, 0x6f, 0x64, - 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, - 0x64, 0x65, 0x22, 0xa7, 0x01, 0x0a, 0x1d, 0x48, 0x75, 0x62, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x4f, - 0x75, 0x74, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x49, - 0x6e, 0x4d, 0x73, 0x67, 0x12, 0x3a, 0x0a, 0x0e, 0x6e, 0x74, 0x66, 0x5f, 0x72, 0x61, 0x64, 0x69, - 0x6f, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x77, - 0x68, 0x67, 0x77, 0x5f, 0x68, 0x72, 0x2e, 0x52, 0x61, 0x64, 0x69, 0x6f, 0x44, 0x61, 0x74, 0x61, - 0x48, 0x00, 0x52, 0x0c, 0x6e, 0x74, 0x66, 0x52, 0x61, 0x64, 0x69, 0x6f, 0x44, 0x61, 0x74, 0x61, - 0x12, 0x40, 0x0a, 0x10, 0x6e, 0x74, 0x66, 0x5f, 0x62, 0x61, 0x74, 0x74, 0x65, 0x72, 0x79, 0x5f, - 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x77, 0x68, 0x67, - 0x77, 0x5f, 0x68, 0x72, 0x2e, 0x42, 0x61, 0x74, 0x74, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, - 0x48, 0x00, 0x52, 0x0e, 0x6e, 0x74, 0x66, 0x42, 0x61, 0x74, 0x74, 0x65, 0x72, 0x79, 0x49, 0x6e, - 0x66, 0x6f, 0x42, 0x08, 0x0a, 0x06, 0x63, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x22, 0x81, 0x01, 0x0a, - 0x1d, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x4f, 0x75, - 0x74, 0x48, 0x75, 0x62, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x49, 0x6e, 0x4d, 0x73, 0x67, 0x12, 0x56, - 0x0a, 0x18, 0x73, 0x69, 0x67, 0x5f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x73, 0x74, - 0x61, 0x74, 0x65, 0x5f, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1b, 0x2e, 0x77, 0x68, 0x67, 0x77, 0x5f, 0x68, 0x72, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x48, 0x00, 0x52, - 0x15, 0x73, 0x69, 0x67, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x08, 0x0a, 0x06, 0x63, 0x68, 0x6f, 0x69, 0x63, 0x65, - 0x22, 0x99, 0x02, 0x0a, 0x1f, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x53, 0x6c, 0x61, 0x76, - 0x65, 0x4f, 0x75, 0x74, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x49, - 0x6e, 0x4d, 0x73, 0x67, 0x12, 0x46, 0x0a, 0x12, 0x6e, 0x74, 0x66, 0x5f, 0x68, 0x72, 0x5f, 0x6d, - 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x16, 0x2e, 0x77, 0x68, 0x67, 0x77, 0x5f, 0x68, 0x72, 0x2e, 0x48, 0x72, 0x4d, 0x65, 0x61, - 0x73, 0x75, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x10, 0x6e, 0x74, 0x66, 0x48, - 0x72, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x46, 0x0a, 0x12, - 0x6e, 0x74, 0x66, 0x5f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x77, 0x68, 0x67, 0x77, 0x5f, - 0x68, 0x72, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x48, 0x00, 0x52, 0x10, 0x6e, 0x74, 0x66, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x5c, 0x0a, 0x1a, 0x6e, 0x74, 0x66, 0x5f, 0x73, 0x74, 0x65, 0x70, - 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x77, 0x68, 0x67, 0x77, 0x5f, - 0x68, 0x72, 0x2e, 0x53, 0x74, 0x65, 0x70, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x4d, 0x65, 0x61, 0x73, - 0x75, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x17, 0x6e, 0x74, 0x66, 0x53, 0x74, - 0x65, 0x70, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x42, 0x08, 0x0a, 0x06, 0x63, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x22, 0x8d, 0x01, 0x0a, - 0x0b, 0x42, 0x61, 0x74, 0x74, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1d, 0x0a, 0x0a, - 0x76, 0x6f, 0x6c, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x6d, 0x76, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x09, 0x76, 0x6f, 0x6c, 0x74, 0x61, 0x67, 0x65, 0x4d, 0x76, 0x12, 0x25, 0x0a, 0x0e, 0x73, - 0x6f, 0x63, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x73, 0x6f, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, - 0x67, 0x65, 0x12, 0x38, 0x0a, 0x18, 0x63, 0x68, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x72, - 0x61, 0x74, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x11, 0x52, 0x16, 0x63, 0x68, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x67, 0x52, 0x61, - 0x74, 0x65, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x22, 0x4b, 0x0a, 0x0b, - 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1b, 0x0a, 0x09, 0x72, - 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, - 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x5f, 0x6d, 0x61, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4d, 0x61, 0x63, 0x22, 0x78, 0x0a, 0x0d, 0x49, 0x50, 0x61, - 0x63, 0x6b, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2c, 0x0a, 0x03, 0x72, 0x61, - 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x77, 0x68, 0x67, 0x77, 0x5f, 0x68, - 0x72, 0x2e, 0x52, 0x61, 0x77, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x48, 0x00, 0x52, 0x03, 0x72, 0x61, 0x77, 0x12, 0x2f, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x73, - 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x77, 0x68, 0x67, 0x77, 0x5f, - 0x68, 0x72, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x48, - 0x00, 0x52, 0x06, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x42, 0x08, 0x0a, 0x06, 0x63, 0x68, 0x6f, - 0x69, 0x63, 0x65, 0x22, 0xe2, 0x01, 0x0a, 0x0d, 0x48, 0x72, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x09, 0x68, 0x72, 0x5f, 0x70, 0x61, 0x63, 0x6b, - 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x77, 0x68, 0x67, 0x77, 0x5f, - 0x68, 0x72, 0x2e, 0x48, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x08, 0x68, 0x72, 0x50, - 0x61, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x3b, 0x0a, 0x0d, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x5f, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x77, - 0x68, 0x67, 0x77, 0x5f, 0x68, 0x72, 0x2e, 0x49, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x0c, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x37, 0x0a, 0x0c, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x69, 0x6e, - 0x66, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x77, 0x68, 0x67, 0x77, 0x5f, - 0x68, 0x72, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2b, 0x0a, 0x08, 0x68, - 0x75, 0x62, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, - 0x77, 0x68, 0x67, 0x77, 0x5f, 0x68, 0x72, 0x2e, 0x48, 0x75, 0x62, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x07, 0x68, 0x75, 0x62, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0xff, 0x01, 0x0a, 0x14, 0x53, 0x74, 0x65, - 0x70, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x12, 0x44, 0x0a, 0x11, 0x73, 0x74, 0x65, 0x70, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, - 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x77, - 0x68, 0x67, 0x77, 0x5f, 0x68, 0x72, 0x2e, 0x53, 0x74, 0x65, 0x70, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x0f, 0x73, 0x74, 0x65, 0x70, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x3b, 0x0a, 0x0d, 0x70, 0x61, 0x63, 0x6b, 0x65, - 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, - 0x2e, 0x77, 0x68, 0x67, 0x77, 0x5f, 0x68, 0x72, 0x2e, 0x49, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0c, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x37, 0x0a, 0x0c, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, - 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x77, 0x68, 0x67, - 0x77, 0x5f, 0x68, 0x72, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x0b, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2b, 0x0a, - 0x08, 0x68, 0x75, 0x62, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x10, 0x2e, 0x77, 0x68, 0x67, 0x77, 0x5f, 0x68, 0x72, 0x2e, 0x48, 0x75, 0x62, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x07, 0x68, 0x75, 0x62, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0xe4, 0x01, 0x0a, 0x10, 0x47, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x12, - 0x1d, 0x0a, 0x0a, 0x62, 0x6f, 0x6f, 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x09, 0x62, 0x6f, 0x6f, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1b, - 0x0a, 0x09, 0x75, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x08, 0x75, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x4d, 0x73, 0x12, 0x40, 0x0a, 0x1d, 0x64, - 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x73, 0x5f, 0x73, 0x69, 0x6e, 0x63, 0x65, - 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x19, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x73, 0x53, 0x69, - 0x6e, 0x63, 0x65, 0x4c, 0x61, 0x73, 0x74, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x19, 0x0a, - 0x08, 0x72, 0x78, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x07, 0x72, 0x78, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x37, 0x0a, 0x0c, 0x62, 0x61, 0x74, 0x74, - 0x65, 0x72, 0x79, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, - 0x2e, 0x77, 0x68, 0x67, 0x77, 0x5f, 0x68, 0x72, 0x2e, 0x42, 0x61, 0x74, 0x74, 0x65, 0x72, 0x79, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x62, 0x61, 0x74, 0x74, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x66, - 0x6f, 0x22, 0x68, 0x0a, 0x0d, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x28, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x14, 0x2e, 0x77, 0x68, 0x67, 0x77, 0x5f, 0x68, 0x72, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x12, 0x2d, 0x0a, 0x04, - 0x73, 0x74, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x77, 0x68, 0x67, - 0x77, 0x5f, 0x68, 0x72, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x53, 0x74, 0x61, 0x74, - 0x69, 0x73, 0x74, 0x69, 0x63, 0x52, 0x04, 0x73, 0x74, 0x61, 0x74, 0x22, 0x36, 0x0a, 0x06, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x22, 0x83, 0x01, 0x0a, 0x12, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1d, 0x0a, 0x09, 0x72, 0x65, - 0x67, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x00, 0x52, - 0x08, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x09, 0x77, 0x69, 0x66, - 0x69, 0x5f, 0x73, 0x73, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, - 0x77, 0x69, 0x66, 0x69, 0x53, 0x73, 0x69, 0x64, 0x12, 0x25, 0x0a, 0x0d, 0x77, 0x69, 0x66, 0x69, - 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, - 0x00, 0x52, 0x0c, 0x77, 0x69, 0x66, 0x69, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x42, - 0x08, 0x0a, 0x06, 0x63, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x22, 0xe1, 0x01, 0x0a, 0x20, 0x47, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4d, 0x61, 0x73, 0x74, 0x65, - 0x72, 0x4f, 0x75, 0x74, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x49, 0x6e, 0x4d, 0x73, 0x67, 0x12, 0x41, - 0x0a, 0x0d, 0x63, 0x6e, 0x66, 0x5f, 0x67, 0x65, 0x74, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x77, 0x68, 0x67, 0x77, 0x5f, 0x68, 0x72, 0x2e, + 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x4d, 0x0a, + 0x11, 0x43, 0x65, 0x6c, 0x6c, 0x75, 0x6c, 0x61, 0x72, 0x4d, 0x6f, 0x64, 0x65, 0x6d, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6d, 0x65, 0x69, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x69, 0x6d, 0x65, 0x69, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x73, 0x73, 0x69, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x72, 0x73, 0x73, 0x69, 0x12, 0x10, 0x0a, 0x03, 0x62, 0x65, + 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x62, 0x65, 0x72, 0x22, 0xbd, 0x01, 0x0a, + 0x10, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x45, 0x78, 0x74, 0x72, + 0x61, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x3f, 0x0a, 0x0d, 0x61, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x5f, 0x75, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x1a, 0x2e, 0x77, 0x68, 0x67, 0x77, 0x5f, 0x68, 0x72, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x55, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x0c, 0x61, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x55, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x12, 0x41, 0x0a, 0x0e, 0x63, 0x65, 0x6c, + 0x6c, 0x75, 0x6c, 0x61, 0x72, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x77, 0x68, 0x67, 0x77, 0x5f, 0x68, 0x72, 0x2e, 0x43, 0x65, 0x6c, 0x6c, + 0x75, 0x6c, 0x61, 0x72, 0x4d, 0x6f, 0x64, 0x65, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0d, 0x63, + 0x65, 0x6c, 0x6c, 0x75, 0x6c, 0x61, 0x72, 0x4d, 0x6f, 0x64, 0x65, 0x6d, 0x22, 0xfc, 0x01, 0x0a, + 0x17, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, + 0x6f, 0x72, 0x74, 0x45, 0x78, 0x74, 0x72, 0x61, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x0d, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x43, 0x0a, 0x0f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x75, 0x70, 0x6c, 0x69, + 0x6e, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x77, 0x68, 0x67, 0x77, 0x5f, + 0x68, 0x72, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x55, 0x70, 0x6c, 0x69, 0x6e, 0x6b, + 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x0e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x55, 0x70, + 0x6c, 0x69, 0x6e, 0x6b, 0x12, 0x3f, 0x0a, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x75, + 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x77, 0x68, + 0x67, 0x77, 0x5f, 0x68, 0x72, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x55, 0x70, 0x6c, + 0x69, 0x6e, 0x6b, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x0c, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, + 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x12, 0x34, 0x0a, 0x16, 0x63, 0x65, 0x6c, 0x6c, 0x75, 0x6c, 0x61, + 0x72, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6d, 0x5f, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x63, 0x65, 0x6c, 0x6c, 0x75, 0x6c, 0x61, 0x72, 0x4d, + 0x6f, 0x64, 0x65, 0x6d, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x22, 0xba, 0x02, 0x0a, 0x12, + 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, + 0x72, 0x74, 0x12, 0x34, 0x0a, 0x16, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x68, 0x61, + 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x14, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x61, 0x73, 0x43, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x0e, 0x6e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x5f, 0x68, 0x61, 0x73, 0x5f, 0x69, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0c, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x61, 0x73, 0x49, 0x70, 0x12, 0x3d, + 0x0a, 0x1b, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x68, 0x61, 0x73, 0x5f, 0x6d, 0x71, + 0x74, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x18, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x61, 0x73, 0x4d, + 0x71, 0x74, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x0a, + 0x15, 0x62, 0x6c, 0x75, 0x65, 0x74, 0x6f, 0x6f, 0x74, 0x68, 0x5f, 0x68, 0x61, 0x73, 0x5f, 0x63, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x62, 0x6c, + 0x75, 0x65, 0x74, 0x6f, 0x6f, 0x74, 0x68, 0x48, 0x61, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x64, 0x65, + 0x12, 0x36, 0x0a, 0x05, 0x65, 0x78, 0x74, 0x72, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x20, 0x2e, 0x77, 0x68, 0x67, 0x77, 0x5f, 0x68, 0x72, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x45, 0x78, 0x74, 0x72, + 0x61, 0x52, 0x05, 0x65, 0x78, 0x74, 0x72, 0x61, 0x22, 0xa7, 0x01, 0x0a, 0x1d, 0x48, 0x75, 0x62, + 0x53, 0x6c, 0x61, 0x76, 0x65, 0x4f, 0x75, 0x74, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4d, + 0x61, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x4d, 0x73, 0x67, 0x12, 0x3a, 0x0a, 0x0e, 0x6e, 0x74, + 0x66, 0x5f, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x77, 0x68, 0x67, 0x77, 0x5f, 0x68, 0x72, 0x2e, 0x52, 0x61, 0x64, + 0x69, 0x6f, 0x44, 0x61, 0x74, 0x61, 0x48, 0x00, 0x52, 0x0c, 0x6e, 0x74, 0x66, 0x52, 0x61, 0x64, + 0x69, 0x6f, 0x44, 0x61, 0x74, 0x61, 0x12, 0x40, 0x0a, 0x10, 0x6e, 0x74, 0x66, 0x5f, 0x62, 0x61, + 0x74, 0x74, 0x65, 0x72, 0x79, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x14, 0x2e, 0x77, 0x68, 0x67, 0x77, 0x5f, 0x68, 0x72, 0x2e, 0x42, 0x61, 0x74, 0x74, 0x65, + 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x48, 0x00, 0x52, 0x0e, 0x6e, 0x74, 0x66, 0x42, 0x61, 0x74, + 0x74, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x08, 0x0a, 0x06, 0x63, 0x68, 0x6f, 0x69, + 0x63, 0x65, 0x22, 0x81, 0x01, 0x0a, 0x1d, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4d, 0x61, + 0x73, 0x74, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x48, 0x75, 0x62, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x49, + 0x6e, 0x4d, 0x73, 0x67, 0x12, 0x56, 0x0a, 0x18, 0x73, 0x69, 0x67, 0x5f, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x77, 0x68, 0x67, 0x77, 0x5f, 0x68, 0x72, + 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, + 0x6f, 0x72, 0x74, 0x48, 0x00, 0x52, 0x15, 0x73, 0x69, 0x67, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x08, 0x0a, 0x06, + 0x63, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x22, 0x99, 0x02, 0x0a, 0x1f, 0x47, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x4f, 0x75, 0x74, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x4d, + 0x61, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x4d, 0x73, 0x67, 0x12, 0x46, 0x0a, 0x12, 0x6e, 0x74, + 0x66, 0x5f, 0x68, 0x72, 0x5f, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x77, 0x68, 0x67, 0x77, 0x5f, 0x68, 0x72, + 0x2e, 0x48, 0x72, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x48, 0x00, + 0x52, 0x10, 0x6e, 0x74, 0x66, 0x48, 0x72, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x12, 0x46, 0x0a, 0x12, 0x6e, 0x74, 0x66, 0x5f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, + 0x2e, 0x77, 0x68, 0x67, 0x77, 0x5f, 0x68, 0x72, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x48, 0x00, 0x52, 0x10, 0x6e, 0x74, 0x66, 0x47, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x5c, 0x0a, 0x1a, 0x6e, 0x74, + 0x66, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x6d, 0x65, 0x61, + 0x73, 0x75, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x2e, 0x77, 0x68, 0x67, 0x77, 0x5f, 0x68, 0x72, 0x2e, 0x53, 0x74, 0x65, 0x70, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, + 0x17, 0x6e, 0x74, 0x66, 0x53, 0x74, 0x65, 0x70, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x4d, 0x65, 0x61, + 0x73, 0x75, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x08, 0x0a, 0x06, 0x63, 0x68, 0x6f, 0x69, + 0x63, 0x65, 0x22, 0x8d, 0x01, 0x0a, 0x0b, 0x42, 0x61, 0x74, 0x74, 0x65, 0x72, 0x79, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x6f, 0x6c, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x6d, 0x76, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x76, 0x6f, 0x6c, 0x74, 0x61, 0x67, 0x65, 0x4d, + 0x76, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x6f, 0x63, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, + 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x73, 0x6f, 0x63, 0x50, 0x65, + 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x12, 0x38, 0x0a, 0x18, 0x63, 0x68, 0x61, 0x72, + 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, + 0x74, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x11, 0x52, 0x16, 0x63, 0x68, 0x61, 0x72, + 0x67, 0x69, 0x6e, 0x67, 0x52, 0x61, 0x74, 0x65, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, + 0x67, 0x65, 0x22, 0x7c, 0x0a, 0x0b, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1f, + 0x0a, 0x0b, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x6d, 0x61, 0x63, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4d, 0x61, 0x63, 0x12, + 0x2f, 0x0a, 0x05, 0x65, 0x78, 0x74, 0x72, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, + 0x2e, 0x77, 0x68, 0x67, 0x77, 0x5f, 0x68, 0x72, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x49, 0x6e, 0x66, 0x6f, 0x45, 0x78, 0x74, 0x72, 0x61, 0x52, 0x05, 0x65, 0x78, 0x74, 0x72, 0x61, + 0x22, 0x78, 0x0a, 0x0d, 0x49, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x2c, 0x0a, 0x03, 0x72, 0x61, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, + 0x2e, 0x77, 0x68, 0x67, 0x77, 0x5f, 0x68, 0x72, 0x2e, 0x52, 0x61, 0x77, 0x50, 0x61, 0x63, 0x6b, + 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x48, 0x00, 0x52, 0x03, 0x72, 0x61, 0x77, 0x12, + 0x2f, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x15, 0x2e, 0x77, 0x68, 0x67, 0x77, 0x5f, 0x68, 0x72, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x48, 0x00, 0x52, 0x06, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, + 0x42, 0x08, 0x0a, 0x06, 0x63, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x22, 0xe2, 0x01, 0x0a, 0x0d, 0x48, + 0x72, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x09, + 0x68, 0x72, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x11, 0x2e, 0x77, 0x68, 0x67, 0x77, 0x5f, 0x68, 0x72, 0x2e, 0x48, 0x72, 0x50, 0x61, 0x63, 0x6b, + 0x65, 0x74, 0x52, 0x08, 0x68, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x3b, 0x0a, 0x0d, + 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x77, 0x68, 0x67, 0x77, 0x5f, 0x68, 0x72, 0x2e, 0x49, 0x50, + 0x61, 0x63, 0x6b, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0c, 0x70, 0x61, 0x63, + 0x6b, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x37, 0x0a, 0x0c, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x14, 0x2e, 0x77, 0x68, 0x67, 0x77, 0x5f, 0x68, 0x72, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x2b, 0x0a, 0x08, 0x68, 0x75, 0x62, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x77, 0x68, 0x67, 0x77, 0x5f, 0x68, 0x72, 0x2e, 0x48, + 0x75, 0x62, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x68, 0x75, 0x62, 0x49, 0x6e, 0x66, 0x6f, 0x22, + 0xff, 0x01, 0x0a, 0x14, 0x53, 0x74, 0x65, 0x70, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x4d, 0x65, 0x61, + 0x73, 0x75, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x44, 0x0a, 0x11, 0x73, 0x74, 0x65, 0x70, + 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x77, 0x68, 0x67, 0x77, 0x5f, 0x68, 0x72, 0x2e, 0x53, 0x74, + 0x65, 0x70, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x0f, 0x73, + 0x74, 0x65, 0x70, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x3b, + 0x0a, 0x0d, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x77, 0x68, 0x67, 0x77, 0x5f, 0x68, 0x72, 0x2e, + 0x49, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0c, 0x70, + 0x61, 0x63, 0x6b, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x37, 0x0a, 0x0c, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x14, 0x2e, 0x77, 0x68, 0x67, 0x77, 0x5f, 0x68, 0x72, 0x2e, 0x47, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2b, 0x0a, 0x08, 0x68, 0x75, 0x62, 0x5f, 0x69, 0x6e, 0x66, 0x6f, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x77, 0x68, 0x67, 0x77, 0x5f, 0x68, 0x72, + 0x2e, 0x48, 0x75, 0x62, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x68, 0x75, 0x62, 0x49, 0x6e, 0x66, + 0x6f, 0x22, 0xe4, 0x01, 0x0a, 0x10, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x53, 0x74, 0x61, + 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x6f, 0x6f, 0x74, 0x5f, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x62, 0x6f, 0x6f, 0x74, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x5f, + 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x75, 0x70, 0x74, 0x69, 0x6d, 0x65, + 0x4d, 0x73, 0x12, 0x40, 0x0a, 0x1d, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, + 0x73, 0x5f, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x63, + 0x6b, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x19, 0x64, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x4d, 0x73, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x4c, 0x61, 0x73, 0x74, 0x50, 0x61, + 0x63, 0x6b, 0x65, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x72, 0x78, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x72, 0x78, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, + 0x37, 0x0a, 0x0c, 0x62, 0x61, 0x74, 0x74, 0x65, 0x72, 0x79, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x77, 0x68, 0x67, 0x77, 0x5f, 0x68, 0x72, 0x2e, + 0x42, 0x61, 0x74, 0x74, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x62, 0x61, 0x74, + 0x74, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x68, 0x0a, 0x0d, 0x47, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x28, 0x0a, 0x04, 0x69, 0x6e, 0x66, + 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x77, 0x68, 0x67, 0x77, 0x5f, 0x68, + 0x72, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x69, + 0x6e, 0x66, 0x6f, 0x12, 0x2d, 0x0a, 0x04, 0x73, 0x74, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x19, 0x2e, 0x77, 0x68, 0x67, 0x77, 0x5f, 0x68, 0x72, 0x2e, 0x47, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x52, 0x04, 0x73, 0x74, + 0x61, 0x74, 0x22, 0x36, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04, + 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, + 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xed, 0x01, 0x0a, 0x12, 0x47, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x1d, 0x0a, 0x09, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0d, 0x48, 0x00, 0x52, 0x08, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x49, 0x64, + 0x12, 0x1d, 0x0a, 0x09, 0x77, 0x69, 0x66, 0x69, 0x5f, 0x73, 0x73, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x77, 0x69, 0x66, 0x69, 0x53, 0x73, 0x69, 0x64, 0x12, + 0x25, 0x0a, 0x0d, 0x77, 0x69, 0x66, 0x69, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0c, 0x77, 0x69, 0x66, 0x69, 0x50, 0x61, + 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x43, 0x0a, 0x0e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x5f, 0x75, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, + 0x2e, 0x77, 0x68, 0x67, 0x77, 0x5f, 0x68, 0x72, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x55, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x4b, 0x69, 0x6e, 0x64, 0x48, 0x00, 0x52, 0x0d, 0x6e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x55, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x12, 0x23, 0x0a, 0x0c, 0x63, + 0x65, 0x6c, 0x6c, 0x75, 0x6c, 0x61, 0x72, 0x5f, 0x61, 0x70, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x00, 0x52, 0x0b, 0x63, 0x65, 0x6c, 0x6c, 0x75, 0x6c, 0x61, 0x72, 0x41, 0x70, 0x6e, + 0x42, 0x08, 0x0a, 0x06, 0x63, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x22, 0xe1, 0x01, 0x0a, 0x20, 0x47, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4d, 0x61, 0x73, 0x74, + 0x65, 0x72, 0x4f, 0x75, 0x74, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x49, 0x6e, 0x4d, 0x73, 0x67, 0x12, + 0x41, 0x0a, 0x0d, 0x63, 0x6e, 0x66, 0x5f, 0x67, 0x65, 0x74, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x77, 0x68, 0x67, 0x77, 0x5f, 0x68, 0x72, + 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x48, 0x00, 0x52, 0x0b, 0x63, 0x6e, 0x66, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x39, 0x0a, 0x0f, 0x63, 0x6e, 0x66, 0x5f, 0x67, 0x65, 0x74, 0x5f, 0x66, 0x61, + 0x69, 0x6c, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x77, 0x68, + 0x67, 0x77, 0x5f, 0x68, 0x72, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x48, 0x00, 0x52, 0x0d, + 0x63, 0x6e, 0x66, 0x47, 0x65, 0x74, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x12, 0x35, 0x0a, + 0x0d, 0x63, 0x6e, 0x66, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x77, 0x68, 0x67, 0x77, 0x5f, 0x68, 0x72, 0x2e, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x48, 0x00, 0x52, 0x0b, 0x63, 0x6e, 0x66, 0x53, 0x65, 0x74, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x42, 0x08, 0x0a, 0x06, 0x63, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x22, 0xb6, + 0x01, 0x0a, 0x20, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x4f, 0x75, 0x74, + 0x4d, 0x73, 0x67, 0x12, 0x45, 0x0a, 0x0d, 0x69, 0x6e, 0x66, 0x5f, 0x67, 0x65, 0x74, 0x5f, 0x65, + 0x6e, 0x74, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x77, 0x68, 0x67, + 0x77, 0x5f, 0x68, 0x72, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x4b, 0x69, 0x6e, 0x64, 0x48, 0x00, 0x52, 0x0b, 0x69, + 0x6e, 0x66, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x41, 0x0a, 0x0d, 0x69, 0x6e, + 0x66, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1b, 0x2e, 0x77, 0x68, 0x67, 0x77, 0x5f, 0x68, 0x72, 0x2e, 0x47, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x48, 0x00, + 0x52, 0x0b, 0x69, 0x6e, 0x66, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x08, 0x0a, + 0x06, 0x63, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x2a, 0x37, 0x0a, 0x0c, 0x48, 0x72, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x5a, 0x45, 0x52, 0x4f, 0x10, + 0x00, 0x12, 0x07, 0x0a, 0x03, 0x4c, 0x4f, 0x57, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x4d, 0x45, + 0x44, 0x49, 0x55, 0x4d, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x48, 0x49, 0x47, 0x48, 0x10, 0x03, + 0x2a, 0x8e, 0x01, 0x0a, 0x06, 0x4c, 0x6f, 0x52, 0x61, 0x42, 0x57, 0x12, 0x0b, 0x0a, 0x07, 0x42, + 0x57, 0x5f, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x42, 0x57, 0x5f, 0x31, + 0x30, 0x5f, 0x34, 0x10, 0x08, 0x12, 0x0b, 0x0a, 0x07, 0x42, 0x57, 0x5f, 0x31, 0x35, 0x5f, 0x36, + 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x42, 0x57, 0x5f, 0x32, 0x30, 0x5f, 0x38, 0x10, 0x09, 0x12, + 0x0c, 0x0a, 0x08, 0x42, 0x57, 0x5f, 0x33, 0x31, 0x5f, 0x32, 0x35, 0x10, 0x02, 0x12, 0x0b, 0x0a, + 0x07, 0x42, 0x57, 0x5f, 0x34, 0x31, 0x5f, 0x37, 0x10, 0x0a, 0x12, 0x0b, 0x0a, 0x07, 0x42, 0x57, + 0x5f, 0x36, 0x32, 0x5f, 0x35, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x42, 0x57, 0x5f, 0x31, 0x32, + 0x35, 0x5f, 0x30, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x42, 0x57, 0x5f, 0x32, 0x35, 0x30, 0x5f, + 0x30, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x42, 0x57, 0x5f, 0x35, 0x30, 0x30, 0x5f, 0x30, 0x10, + 0x06, 0x2a, 0x42, 0x0a, 0x0a, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x12, + 0x07, 0x0a, 0x03, 0x4e, 0x54, 0x46, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x53, 0x49, 0x47, 0x10, + 0x01, 0x12, 0x07, 0x0a, 0x03, 0x49, 0x4e, 0x46, 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x43, 0x4e, + 0x46, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x52, 0x45, 0x51, 0x10, 0x04, 0x12, 0x07, 0x0a, 0x03, + 0x52, 0x53, 0x50, 0x10, 0x05, 0x2a, 0x65, 0x0a, 0x11, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x55, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x1a, 0x0a, 0x16, 0x4e, 0x45, + 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x55, 0x50, 0x4c, 0x49, 0x4e, 0x4b, 0x5f, 0x55, 0x4e, 0x4b, + 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, + 0x4b, 0x5f, 0x55, 0x50, 0x4c, 0x49, 0x4e, 0x4b, 0x5f, 0x57, 0x49, 0x46, 0x49, 0x10, 0x01, 0x12, + 0x1b, 0x0a, 0x17, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x55, 0x50, 0x4c, 0x49, 0x4e, + 0x4b, 0x5f, 0x43, 0x45, 0x4c, 0x4c, 0x55, 0x4c, 0x41, 0x52, 0x10, 0x02, 0x2a, 0x6f, 0x0a, 0x16, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x48, 0x00, 0x52, 0x0b, 0x63, 0x6e, 0x66, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x39, 0x0a, 0x0f, 0x63, 0x6e, 0x66, 0x5f, 0x67, 0x65, 0x74, 0x5f, 0x66, 0x61, 0x69, - 0x6c, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x77, 0x68, 0x67, - 0x77, 0x5f, 0x68, 0x72, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x48, 0x00, 0x52, 0x0d, 0x63, - 0x6e, 0x66, 0x47, 0x65, 0x74, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x12, 0x35, 0x0a, 0x0d, - 0x63, 0x6e, 0x66, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x77, 0x68, 0x67, 0x77, 0x5f, 0x68, 0x72, 0x2e, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x48, 0x00, 0x52, 0x0b, 0x63, 0x6e, 0x66, 0x53, 0x65, 0x74, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x42, 0x08, 0x0a, 0x06, 0x63, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x22, 0xb6, 0x01, - 0x0a, 0x20, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4d, - 0x61, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x4f, 0x75, 0x74, 0x4d, - 0x73, 0x67, 0x12, 0x45, 0x0a, 0x0d, 0x69, 0x6e, 0x66, 0x5f, 0x67, 0x65, 0x74, 0x5f, 0x65, 0x6e, - 0x74, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x77, 0x68, 0x67, 0x77, - 0x5f, 0x68, 0x72, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x4b, 0x69, 0x6e, 0x64, 0x48, 0x00, 0x52, 0x0b, 0x69, 0x6e, - 0x66, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x41, 0x0a, 0x0d, 0x69, 0x6e, 0x66, - 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1b, 0x2e, 0x77, 0x68, 0x67, 0x77, 0x5f, 0x68, 0x72, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x48, 0x00, 0x52, - 0x0b, 0x69, 0x6e, 0x66, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x08, 0x0a, 0x06, - 0x63, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x2a, 0x37, 0x0a, 0x0c, 0x48, 0x72, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x5a, 0x45, 0x52, 0x4f, 0x10, 0x00, - 0x12, 0x07, 0x0a, 0x03, 0x4c, 0x4f, 0x57, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x4d, 0x45, 0x44, - 0x49, 0x55, 0x4d, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x48, 0x49, 0x47, 0x48, 0x10, 0x03, 0x2a, - 0x8e, 0x01, 0x0a, 0x06, 0x4c, 0x6f, 0x52, 0x61, 0x42, 0x57, 0x12, 0x0b, 0x0a, 0x07, 0x42, 0x57, - 0x5f, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x42, 0x57, 0x5f, 0x31, 0x30, - 0x5f, 0x34, 0x10, 0x08, 0x12, 0x0b, 0x0a, 0x07, 0x42, 0x57, 0x5f, 0x31, 0x35, 0x5f, 0x36, 0x10, - 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x42, 0x57, 0x5f, 0x32, 0x30, 0x5f, 0x38, 0x10, 0x09, 0x12, 0x0c, - 0x0a, 0x08, 0x42, 0x57, 0x5f, 0x33, 0x31, 0x5f, 0x32, 0x35, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, - 0x42, 0x57, 0x5f, 0x34, 0x31, 0x5f, 0x37, 0x10, 0x0a, 0x12, 0x0b, 0x0a, 0x07, 0x42, 0x57, 0x5f, - 0x36, 0x32, 0x5f, 0x35, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x42, 0x57, 0x5f, 0x31, 0x32, 0x35, - 0x5f, 0x30, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x42, 0x57, 0x5f, 0x32, 0x35, 0x30, 0x5f, 0x30, - 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x42, 0x57, 0x5f, 0x35, 0x30, 0x30, 0x5f, 0x30, 0x10, 0x06, - 0x2a, 0x42, 0x0a, 0x0a, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x07, - 0x0a, 0x03, 0x4e, 0x54, 0x46, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x53, 0x49, 0x47, 0x10, 0x01, - 0x12, 0x07, 0x0a, 0x03, 0x49, 0x4e, 0x46, 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x43, 0x4e, 0x46, - 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x52, 0x45, 0x51, 0x10, 0x04, 0x12, 0x07, 0x0a, 0x03, 0x52, - 0x53, 0x50, 0x10, 0x05, 0x2a, 0x49, 0x0a, 0x16, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x0d, - 0x0a, 0x09, 0x52, 0x45, 0x47, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x44, 0x10, 0x00, 0x12, 0x0d, 0x0a, - 0x09, 0x57, 0x49, 0x46, 0x49, 0x5f, 0x53, 0x53, 0x49, 0x44, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, - 0x57, 0x49, 0x46, 0x49, 0x5f, 0x50, 0x41, 0x53, 0x53, 0x57, 0x4f, 0x52, 0x44, 0x10, 0x02, 0x42, - 0x1d, 0x5a, 0x1b, 0x68, 0x72, 0x5f, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x2f, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x3b, 0x77, 0x68, 0x67, 0x77, 0x5f, 0x68, 0x72, 0x70, 0x62, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x72, 0x79, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x45, 0x47, 0x49, 0x4f, 0x4e, + 0x5f, 0x49, 0x44, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x57, 0x49, 0x46, 0x49, 0x5f, 0x53, 0x53, + 0x49, 0x44, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x57, 0x49, 0x46, 0x49, 0x5f, 0x50, 0x41, 0x53, + 0x53, 0x57, 0x4f, 0x52, 0x44, 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x4e, 0x45, 0x54, 0x57, 0x4f, + 0x52, 0x4b, 0x5f, 0x55, 0x50, 0x4c, 0x49, 0x4e, 0x4b, 0x10, 0x03, 0x12, 0x10, 0x0a, 0x0c, 0x43, + 0x45, 0x4c, 0x4c, 0x55, 0x4c, 0x41, 0x52, 0x5f, 0x41, 0x50, 0x4e, 0x10, 0x04, 0x42, 0x1d, 0x5a, + 0x1b, 0x68, 0x72, 0x5f, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x3b, 0x77, 0x68, 0x67, 0x77, 0x5f, 0x68, 0x72, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -2107,73 +2484,84 @@ func file_proto_hr_packet_v2_proto_rawDescGZIP() []byte { return file_proto_hr_packet_v2_proto_rawDescData } -var file_proto_hr_packet_v2_proto_enumTypes = make([]protoimpl.EnumInfo, 4) -var file_proto_hr_packet_v2_proto_msgTypes = make([]protoimpl.MessageInfo, 23) +var file_proto_hr_packet_v2_proto_enumTypes = make([]protoimpl.EnumInfo, 5) +var file_proto_hr_packet_v2_proto_msgTypes = make([]protoimpl.MessageInfo, 26) var file_proto_hr_packet_v2_proto_goTypes = []any{ (HrConfidence)(0), // 0: whgw_hr.HrConfidence (LoRaBW)(0), // 1: whgw_hr.LoRaBW (PacketKind)(0), // 2: whgw_hr.PacketKind - (GatewayConfigEntryKind)(0), // 3: whgw_hr.GatewayConfigEntryKind - (*LoRaParameters)(nil), // 4: whgw_hr.LoRaParameters - (*StatusFlag)(nil), // 5: whgw_hr.StatusFlag - (*HrPacket)(nil), // 6: whgw_hr.HrPacket - (*StepCountPacket)(nil), // 7: whgw_hr.StepCountPacket - (*RawPacketStatus)(nil), // 8: whgw_hr.RawPacketStatus - (*PacketStatus)(nil), // 9: whgw_hr.PacketStatus - (*HubInfo)(nil), // 10: whgw_hr.HubInfo - (*RadioData)(nil), // 11: whgw_hr.RadioData - (*GatewayStateReport)(nil), // 12: whgw_hr.GatewayStateReport - (*HubSlaveOutGatewayMasterInMsg)(nil), // 13: whgw_hr.HubSlaveOutGatewayMasterInMsg - (*GatewayMasterOutHubSlaveInMsg)(nil), // 14: whgw_hr.GatewayMasterOutHubSlaveInMsg - (*GatewaySlaveOutCloudMasterInMsg)(nil), // 15: whgw_hr.GatewaySlaveOutCloudMasterInMsg - (*BatteryInfo)(nil), // 16: whgw_hr.BatteryInfo - (*GatewayInfo)(nil), // 17: whgw_hr.GatewayInfo - (*IPacketStatus)(nil), // 18: whgw_hr.IPacketStatus - (*HrMeasurement)(nil), // 19: whgw_hr.HrMeasurement - (*StepCountMeasurement)(nil), // 20: whgw_hr.StepCountMeasurement - (*GatewayStatistic)(nil), // 21: whgw_hr.GatewayStatistic - (*GatewayStatus)(nil), // 22: whgw_hr.GatewayStatus - (*Status)(nil), // 23: whgw_hr.Status - (*GatewayConfigEntry)(nil), // 24: whgw_hr.GatewayConfigEntry - (*GatewayConfigMasterOutSlaveInMsg)(nil), // 25: whgw_hr.GatewayConfigMasterOutSlaveInMsg - (*GatewayConfigMasterInSlaveOutMsg)(nil), // 26: whgw_hr.GatewayConfigMasterInSlaveOutMsg + (NetworkUplinkKind)(0), // 3: whgw_hr.NetworkUplinkKind + (GatewayConfigEntryKind)(0), // 4: whgw_hr.GatewayConfigEntryKind + (*LoRaParameters)(nil), // 5: whgw_hr.LoRaParameters + (*StatusFlag)(nil), // 6: whgw_hr.StatusFlag + (*HrPacket)(nil), // 7: whgw_hr.HrPacket + (*StepCountPacket)(nil), // 8: whgw_hr.StepCountPacket + (*RawPacketStatus)(nil), // 9: whgw_hr.RawPacketStatus + (*PacketStatus)(nil), // 10: whgw_hr.PacketStatus + (*HubInfo)(nil), // 11: whgw_hr.HubInfo + (*RadioData)(nil), // 12: whgw_hr.RadioData + (*CellularModemInfo)(nil), // 13: whgw_hr.CellularModemInfo + (*GatewayInfoExtra)(nil), // 14: whgw_hr.GatewayInfoExtra + (*GatewayStateReportExtra)(nil), // 15: whgw_hr.GatewayStateReportExtra + (*GatewayStateReport)(nil), // 16: whgw_hr.GatewayStateReport + (*HubSlaveOutGatewayMasterInMsg)(nil), // 17: whgw_hr.HubSlaveOutGatewayMasterInMsg + (*GatewayMasterOutHubSlaveInMsg)(nil), // 18: whgw_hr.GatewayMasterOutHubSlaveInMsg + (*GatewaySlaveOutCloudMasterInMsg)(nil), // 19: whgw_hr.GatewaySlaveOutCloudMasterInMsg + (*BatteryInfo)(nil), // 20: whgw_hr.BatteryInfo + (*GatewayInfo)(nil), // 21: whgw_hr.GatewayInfo + (*IPacketStatus)(nil), // 22: whgw_hr.IPacketStatus + (*HrMeasurement)(nil), // 23: whgw_hr.HrMeasurement + (*StepCountMeasurement)(nil), // 24: whgw_hr.StepCountMeasurement + (*GatewayStatistic)(nil), // 25: whgw_hr.GatewayStatistic + (*GatewayStatus)(nil), // 26: whgw_hr.GatewayStatus + (*Status)(nil), // 27: whgw_hr.Status + (*GatewayConfigEntry)(nil), // 28: whgw_hr.GatewayConfigEntry + (*GatewayConfigMasterOutSlaveInMsg)(nil), // 29: whgw_hr.GatewayConfigMasterOutSlaveInMsg + (*GatewayConfigMasterInSlaveOutMsg)(nil), // 30: whgw_hr.GatewayConfigMasterInSlaveOutMsg } var file_proto_hr_packet_v2_proto_depIdxs = []int32{ 1, // 0: whgw_hr.LoRaParameters.bw:type_name -> whgw_hr.LoRaBW 0, // 1: whgw_hr.StatusFlag.hr_confidence:type_name -> whgw_hr.HrConfidence - 5, // 2: whgw_hr.HrPacket.status:type_name -> whgw_hr.StatusFlag - 4, // 3: whgw_hr.HubInfo.radio_parameters:type_name -> whgw_hr.LoRaParameters - 10, // 4: whgw_hr.RadioData.hub_info:type_name -> whgw_hr.HubInfo - 8, // 5: whgw_hr.RadioData.raw_packet_status:type_name -> whgw_hr.RawPacketStatus - 11, // 6: whgw_hr.HubSlaveOutGatewayMasterInMsg.ntf_radio_data:type_name -> whgw_hr.RadioData - 16, // 7: whgw_hr.HubSlaveOutGatewayMasterInMsg.ntf_battery_info:type_name -> whgw_hr.BatteryInfo - 12, // 8: whgw_hr.GatewayMasterOutHubSlaveInMsg.sig_gateway_state_report:type_name -> whgw_hr.GatewayStateReport - 19, // 9: whgw_hr.GatewaySlaveOutCloudMasterInMsg.ntf_hr_measurement:type_name -> whgw_hr.HrMeasurement - 22, // 10: whgw_hr.GatewaySlaveOutCloudMasterInMsg.ntf_gateway_status:type_name -> whgw_hr.GatewayStatus - 20, // 11: whgw_hr.GatewaySlaveOutCloudMasterInMsg.ntf_step_count_measurement:type_name -> whgw_hr.StepCountMeasurement - 8, // 12: whgw_hr.IPacketStatus.raw:type_name -> whgw_hr.RawPacketStatus - 9, // 13: whgw_hr.IPacketStatus.parsed:type_name -> whgw_hr.PacketStatus - 6, // 14: whgw_hr.HrMeasurement.hr_packet:type_name -> whgw_hr.HrPacket - 18, // 15: whgw_hr.HrMeasurement.packet_status:type_name -> whgw_hr.IPacketStatus - 17, // 16: whgw_hr.HrMeasurement.gateway_info:type_name -> whgw_hr.GatewayInfo - 10, // 17: whgw_hr.HrMeasurement.hub_info:type_name -> whgw_hr.HubInfo - 7, // 18: whgw_hr.StepCountMeasurement.step_count_packet:type_name -> whgw_hr.StepCountPacket - 18, // 19: whgw_hr.StepCountMeasurement.packet_status:type_name -> whgw_hr.IPacketStatus - 17, // 20: whgw_hr.StepCountMeasurement.gateway_info:type_name -> whgw_hr.GatewayInfo - 10, // 21: whgw_hr.StepCountMeasurement.hub_info:type_name -> whgw_hr.HubInfo - 16, // 22: whgw_hr.GatewayStatistic.battery_info:type_name -> whgw_hr.BatteryInfo - 17, // 23: whgw_hr.GatewayStatus.info:type_name -> whgw_hr.GatewayInfo - 21, // 24: whgw_hr.GatewayStatus.stat:type_name -> whgw_hr.GatewayStatistic - 24, // 25: whgw_hr.GatewayConfigMasterOutSlaveInMsg.cnf_get_entry:type_name -> whgw_hr.GatewayConfigEntry - 23, // 26: whgw_hr.GatewayConfigMasterOutSlaveInMsg.cnf_get_failure:type_name -> whgw_hr.Status - 23, // 27: whgw_hr.GatewayConfigMasterOutSlaveInMsg.cnf_set_entry:type_name -> whgw_hr.Status - 3, // 28: whgw_hr.GatewayConfigMasterInSlaveOutMsg.inf_get_entry:type_name -> whgw_hr.GatewayConfigEntryKind - 24, // 29: whgw_hr.GatewayConfigMasterInSlaveOutMsg.inf_set_entry:type_name -> whgw_hr.GatewayConfigEntry - 30, // [30:30] is the sub-list for method output_type - 30, // [30:30] is the sub-list for method input_type - 30, // [30:30] is the sub-list for extension type_name - 30, // [30:30] is the sub-list for extension extendee - 0, // [0:30] is the sub-list for field type_name + 6, // 2: whgw_hr.HrPacket.status:type_name -> whgw_hr.StatusFlag + 5, // 3: whgw_hr.HubInfo.radio_parameters:type_name -> whgw_hr.LoRaParameters + 11, // 4: whgw_hr.RadioData.hub_info:type_name -> whgw_hr.HubInfo + 9, // 5: whgw_hr.RadioData.raw_packet_status:type_name -> whgw_hr.RawPacketStatus + 3, // 6: whgw_hr.GatewayInfoExtra.active_uplink:type_name -> whgw_hr.NetworkUplinkKind + 13, // 7: whgw_hr.GatewayInfoExtra.cellular_modem:type_name -> whgw_hr.CellularModemInfo + 3, // 8: whgw_hr.GatewayStateReportExtra.selected_uplink:type_name -> whgw_hr.NetworkUplinkKind + 3, // 9: whgw_hr.GatewayStateReportExtra.active_uplink:type_name -> whgw_hr.NetworkUplinkKind + 15, // 10: whgw_hr.GatewayStateReport.extra:type_name -> whgw_hr.GatewayStateReportExtra + 12, // 11: whgw_hr.HubSlaveOutGatewayMasterInMsg.ntf_radio_data:type_name -> whgw_hr.RadioData + 20, // 12: whgw_hr.HubSlaveOutGatewayMasterInMsg.ntf_battery_info:type_name -> whgw_hr.BatteryInfo + 16, // 13: whgw_hr.GatewayMasterOutHubSlaveInMsg.sig_gateway_state_report:type_name -> whgw_hr.GatewayStateReport + 23, // 14: whgw_hr.GatewaySlaveOutCloudMasterInMsg.ntf_hr_measurement:type_name -> whgw_hr.HrMeasurement + 26, // 15: whgw_hr.GatewaySlaveOutCloudMasterInMsg.ntf_gateway_status:type_name -> whgw_hr.GatewayStatus + 24, // 16: whgw_hr.GatewaySlaveOutCloudMasterInMsg.ntf_step_count_measurement:type_name -> whgw_hr.StepCountMeasurement + 14, // 17: whgw_hr.GatewayInfo.extra:type_name -> whgw_hr.GatewayInfoExtra + 9, // 18: whgw_hr.IPacketStatus.raw:type_name -> whgw_hr.RawPacketStatus + 10, // 19: whgw_hr.IPacketStatus.parsed:type_name -> whgw_hr.PacketStatus + 7, // 20: whgw_hr.HrMeasurement.hr_packet:type_name -> whgw_hr.HrPacket + 22, // 21: whgw_hr.HrMeasurement.packet_status:type_name -> whgw_hr.IPacketStatus + 21, // 22: whgw_hr.HrMeasurement.gateway_info:type_name -> whgw_hr.GatewayInfo + 11, // 23: whgw_hr.HrMeasurement.hub_info:type_name -> whgw_hr.HubInfo + 8, // 24: whgw_hr.StepCountMeasurement.step_count_packet:type_name -> whgw_hr.StepCountPacket + 22, // 25: whgw_hr.StepCountMeasurement.packet_status:type_name -> whgw_hr.IPacketStatus + 21, // 26: whgw_hr.StepCountMeasurement.gateway_info:type_name -> whgw_hr.GatewayInfo + 11, // 27: whgw_hr.StepCountMeasurement.hub_info:type_name -> whgw_hr.HubInfo + 20, // 28: whgw_hr.GatewayStatistic.battery_info:type_name -> whgw_hr.BatteryInfo + 21, // 29: whgw_hr.GatewayStatus.info:type_name -> whgw_hr.GatewayInfo + 25, // 30: whgw_hr.GatewayStatus.stat:type_name -> whgw_hr.GatewayStatistic + 3, // 31: whgw_hr.GatewayConfigEntry.network_uplink:type_name -> whgw_hr.NetworkUplinkKind + 28, // 32: whgw_hr.GatewayConfigMasterOutSlaveInMsg.cnf_get_entry:type_name -> whgw_hr.GatewayConfigEntry + 27, // 33: whgw_hr.GatewayConfigMasterOutSlaveInMsg.cnf_get_failure:type_name -> whgw_hr.Status + 27, // 34: whgw_hr.GatewayConfigMasterOutSlaveInMsg.cnf_set_entry:type_name -> whgw_hr.Status + 4, // 35: whgw_hr.GatewayConfigMasterInSlaveOutMsg.inf_get_entry:type_name -> whgw_hr.GatewayConfigEntryKind + 28, // 36: whgw_hr.GatewayConfigMasterInSlaveOutMsg.inf_set_entry:type_name -> whgw_hr.GatewayConfigEntry + 37, // [37:37] is the sub-list for method output_type + 37, // [37:37] is the sub-list for method input_type + 37, // [37:37] is the sub-list for extension type_name + 37, // [37:37] is the sub-list for extension extendee + 0, // [0:37] is the sub-list for field type_name } func init() { file_proto_hr_packet_v2_proto_init() } @@ -2181,33 +2569,35 @@ func file_proto_hr_packet_v2_proto_init() { if File_proto_hr_packet_v2_proto != nil { return } - file_proto_hr_packet_v2_proto_msgTypes[9].OneofWrappers = []any{ + file_proto_hr_packet_v2_proto_msgTypes[12].OneofWrappers = []any{ (*HubSlaveOutGatewayMasterInMsg_NtfRadioData)(nil), (*HubSlaveOutGatewayMasterInMsg_NtfBatteryInfo)(nil), } - file_proto_hr_packet_v2_proto_msgTypes[10].OneofWrappers = []any{ + file_proto_hr_packet_v2_proto_msgTypes[13].OneofWrappers = []any{ (*GatewayMasterOutHubSlaveInMsg_SigGatewayStateReport)(nil), } - file_proto_hr_packet_v2_proto_msgTypes[11].OneofWrappers = []any{ + file_proto_hr_packet_v2_proto_msgTypes[14].OneofWrappers = []any{ (*GatewaySlaveOutCloudMasterInMsg_NtfHrMeasurement)(nil), (*GatewaySlaveOutCloudMasterInMsg_NtfGatewayStatus)(nil), (*GatewaySlaveOutCloudMasterInMsg_NtfStepCountMeasurement)(nil), } - file_proto_hr_packet_v2_proto_msgTypes[14].OneofWrappers = []any{ + file_proto_hr_packet_v2_proto_msgTypes[17].OneofWrappers = []any{ (*IPacketStatus_Raw)(nil), (*IPacketStatus_Parsed)(nil), } - file_proto_hr_packet_v2_proto_msgTypes[20].OneofWrappers = []any{ + file_proto_hr_packet_v2_proto_msgTypes[23].OneofWrappers = []any{ (*GatewayConfigEntry_RegionId)(nil), (*GatewayConfigEntry_WifiSsid)(nil), (*GatewayConfigEntry_WifiPassword)(nil), + (*GatewayConfigEntry_NetworkUplink)(nil), + (*GatewayConfigEntry_CellularApn)(nil), } - file_proto_hr_packet_v2_proto_msgTypes[21].OneofWrappers = []any{ + file_proto_hr_packet_v2_proto_msgTypes[24].OneofWrappers = []any{ (*GatewayConfigMasterOutSlaveInMsg_CnfGetEntry)(nil), (*GatewayConfigMasterOutSlaveInMsg_CnfGetFailure)(nil), (*GatewayConfigMasterOutSlaveInMsg_CnfSetEntry)(nil), } - file_proto_hr_packet_v2_proto_msgTypes[22].OneofWrappers = []any{ + file_proto_hr_packet_v2_proto_msgTypes[25].OneofWrappers = []any{ (*GatewayConfigMasterInSlaveOutMsg_InfGetEntry)(nil), (*GatewayConfigMasterInSlaveOutMsg_InfSetEntry)(nil), } @@ -2216,8 +2606,8 @@ func file_proto_hr_packet_v2_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_proto_hr_packet_v2_proto_rawDesc, - NumEnums: 4, - NumMessages: 23, + NumEnums: 5, + NumMessages: 26, NumExtensions: 0, NumServices: 0, }, diff --git a/proto/hr_packet_v2.proto b/proto/hr_packet_v2.proto index 49b928b..5887941 100644 --- a/proto/hr_packet_v2.proto +++ b/proto/hr_packet_v2.proto @@ -5,22 +5,37 @@ package whgw_hr; option go_package = "hr_receiver/proto;whgw_hrpb"; enum HrConfidence { + // [0,25) ZERO = 0; + // [25,50) LOW = 1; + // [50,75] MEDIUM = 2; + // (75,100] HIGH = 3; } enum LoRaBW { + // nobody is using 7.8 kHz bandwidth + // so to satisfy protobuf, we use NONE for zero value BW_NONE = 0; + // 10.4 kHz BW_10_4 = 0x08; + // 15.6 kHz BW_15_6 = 0x01; + // 20.8 kHz BW_20_8 = 0x09; + // 31.25 kHz BW_31_25 = 0x02; + // 41.7 kHz BW_41_7 = 0x0A; + // 62.5 kHz BW_62_5 = 0x03; + // 125.0 kHz BW_125_0 = 0x04; + // 250.0 kHz BW_250_0 = 0x05; + // 500.0 kHz BW_500_0 = 0x06; } @@ -32,11 +47,12 @@ message LoRaParameters { message StatusFlag { HrConfidence hr_confidence = 1; - bool is_active = 2; - bool is_on_skin = 3; - uint32 battery = 4; + bool is_active = 2; + bool is_on_skin = 3; + uint32 battery = 4; } + message HrPacket { StatusFlag status = 1; uint32 id = 2; @@ -51,27 +67,51 @@ message StepCountPacket { } message RawPacketStatus { + // Estimation of RSSI of the LoRa signal (after despreading) on last packet received. + // to get the actual RSSI in dBm, divide by 2 and negate uint32 signal_rssi_x2_neg = 1; - int32 snr_pkt_x4 = 2; + // Estimation of RSSI of the LoRa signal (after despreading) on last packet received. + // to get the actual SNR in dB, divide by 4 + int32 snr_pkt_x4 = 2; } message PacketStatus { + // Estimation of RSSI of the LoRa signal (after despreading) on last packet received. float signal_rssi_neg = 1; + // Estimation of RSSI of the LoRa signal (after despreading) on last packet received. float snr_pkt = 2; } message HubInfo { - uint32 bus_id = 1; - uint32 sub_dev_id = 2; + uint32 bus_id = 1; + uint32 sub_dev_id = 2; + /** optional **/ LoRaParameters radio_parameters = 3; } message RadioData { - HubInfo hub_info = 1; + HubInfo hub_info = 1; RawPacketStatus raw_packet_status = 2; - bytes data = 3; + bytes data = 3; } +/** + + NOTIFY (NTF): MISO, unack + SIGNAL (SIG): MOSI, unack + + INDICATE (INF): MISO, needs MOSI CONFIRM + CONFIRM (CNF): MOSI, confirms MISO INDICATE + + REQUEST (REQ): MOSI, needs MISO RESPONSE + RESPONSE (RSP): MISO, responds to MOSI REQUEST + + note that frame type is only about its direction and acknowledge behavior, + the actual semantics are dependent on the payload + + * + **/ + enum PacketKind { NTF = 0; SIG = 1; @@ -81,27 +121,57 @@ enum PacketKind { RSP = 5; } -message GatewayStateReport { - bool network_has_connection = 1; - bool network_has_ip = 2; - bool network_has_mqtt_connection = 3; - bool bluetooth_has_connect = 4; - uint32 error_code = 5; +enum NetworkUplinkKind { + NETWORK_UPLINK_UNKNOWN = 0; + NETWORK_UPLINK_WIFI = 1; + NETWORK_UPLINK_CELLULAR = 2; } +message CellularModemInfo { + string imei = 1; + int32 rssi = 2; + int32 ber = 3; +} + +message GatewayInfoExtra { + uint32 schema_version = 1; + NetworkUplinkKind active_uplink = 2; + CellularModemInfo cellular_modem = 3; +} + +message GatewayStateReportExtra { + uint32 schema_version = 1; + NetworkUplinkKind selected_uplink = 2; + NetworkUplinkKind active_uplink = 3; + bool cellular_modem_present = 4; +} + +message GatewayStateReport { + bool network_has_connection = 1; + bool network_has_ip = 2; + bool network_has_mqtt_connection = 3; + bool bluetooth_has_connect = 4; + uint32 error_code = 5; + GatewayStateReportExtra extra = 6; +} + +/*** Hub (S) to Gateway (M) ***/ message HubSlaveOutGatewayMasterInMsg { oneof choice { - RadioData ntf_radio_data = 1; + RadioData ntf_radio_data = 1; BatteryInfo ntf_battery_info = 2; } } +/*** Gateway (M) to Hub (S) ***/ message GatewayMasterOutHubSlaveInMsg { oneof choice { GatewayStateReport sig_gateway_state_report = 1; } } + +/*** Gateway to MQTT ***/ message GatewaySlaveOutCloudMasterInMsg { oneof choice { HrMeasurement ntf_hr_measurement = 1; @@ -110,6 +180,8 @@ message GatewaySlaveOutCloudMasterInMsg { } } +/** note that the endpoint should be v2 **/ + message BatteryInfo { uint32 voltage_mv = 1; uint32 soc_percentage = 2; @@ -118,52 +190,64 @@ message BatteryInfo { message GatewayInfo { uint32 region_id = 1; - bytes gateway_mac = 2; + bytes gateway_mac = 2; + GatewayInfoExtra extra = 3; } message IPacketStatus { oneof choice { RawPacketStatus raw = 1; - PacketStatus parsed = 2; + PacketStatus parsed = 2; } } message HrMeasurement { - HrPacket hr_packet = 1; + HrPacket hr_packet = 1; IPacketStatus packet_status = 2; - GatewayInfo gateway_info = 3; - HubInfo hub_info = 4; + GatewayInfo gateway_info = 3; + HubInfo hub_info = 4; } message StepCountMeasurement { StepCountPacket step_count_packet = 1; - IPacketStatus packet_status = 2; - GatewayInfo gateway_info = 3; - HubInfo hub_info = 4; + IPacketStatus packet_status = 2; + GatewayInfo gateway_info = 3; + HubInfo hub_info = 4; } message GatewayStatistic { - uint32 boot_count = 1; - uint32 uptime_ms = 2; - uint32 duration_ms_since_last_packet = 3; - uint32 rx_count = 4; + // Number of times the gateway has booted in history + uint32 boot_count = 1; + // Uptime of the device (in ms) + uint32 uptime_ms = 2; + // Duration (in ms) since last packet received + // would be the duration since boot if no packets received yet + uint32 duration_ms_since_last_packet = 3; + // Total number of packets received since boot + uint32 rx_count = 4; + // optional, battery info BatteryInfo battery_info = 5; } message GatewayStatus { - GatewayInfo info = 1; + GatewayInfo info = 1; GatewayStatistic stat = 2; } message Status { - int32 code = 1; + int32 code = 1; string message = 2; } +/** Gateway Configuration Messages **/ +/** Master is Gateway; Slave is config client (bluetooth central, phone etc.) **/ + enum GatewayConfigEntryKind { REGION_ID = 0; WIFI_SSID = 1; WIFI_PASSWORD = 2; + NETWORK_UPLINK = 3; + CELLULAR_APN = 4; } message GatewayConfigEntry { @@ -171,14 +255,16 @@ message GatewayConfigEntry { uint32 region_id = 1; string wifi_ssid = 2; string wifi_password = 3; + NetworkUplinkKind network_uplink = 4; + string cellular_apn = 5; } } message GatewayConfigMasterOutSlaveInMsg { oneof choice { GatewayConfigEntry cnf_get_entry = 1; - Status cnf_get_failure = 2; - Status cnf_set_entry = 3; + Status cnf_get_failure = 2; + Status cnf_set_entry = 3; } } @@ -188,3 +274,4 @@ message GatewayConfigMasterInSlaveOutMsg { GatewayConfigEntry inf_set_entry = 2; } } +