mirror of
https://github.com/meshtastic/Meshtastic-Apple.git
synced 2026-04-20 22:13:56 +00:00
Hook up store and forward as reccomended by @GUVWAF
This commit is contained in:
parent
a5ae02978e
commit
e9aec54508
3 changed files with 58 additions and 22 deletions
|
|
@ -2374,7 +2374,8 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate
|
|||
/// send a request for ClientHistory with a time period matching the heartbeat
|
||||
var sfPacket = StoreAndForward()
|
||||
sfPacket.rr = StoreAndForward.RequestResponse.clientHistory
|
||||
sfPacket.history.window = 120 // storeAndForwardMessage.heartbeat.period
|
||||
sfPacket.history.window = UInt32(toUser.userNode?.storeForwardConfig?.historyReturnWindow ?? 120)
|
||||
sfPacket.history.lastRequest = UInt32(toUser.userNode?.storeForwardConfig?.lastRequest?.timeIntervalSince1970 ?? Date().timeIntervalSince1970)
|
||||
var meshPacket: MeshPacket = MeshPacket()
|
||||
meshPacket.to = UInt32(toUser.num)
|
||||
meshPacket.from = UInt32(fromUser.num)
|
||||
|
|
@ -2401,7 +2402,14 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate
|
|||
|
||||
func storeAndForwardPacket(packet: MeshPacket, connectedNodeNum: Int64, context: NSManagedObjectContext) {
|
||||
if let storeAndForwardMessage = try? StoreAndForward(serializedData: packet.decoded.payload) {
|
||||
// Request Response
|
||||
|
||||
// Handle the text variant as a text message packet
|
||||
if storeAndForwardMessage.variant == StoreAndForward.OneOf_Variant.text(packet.decoded.payload) {
|
||||
MeshLogger.log("📮 Store and Forward history text message received \(storeAndForwardMessage)")
|
||||
textMessageAppPacket(packet: packet, connectedNode: connectedNodeNum, context: context)
|
||||
return
|
||||
}
|
||||
// Handle each of the store and forward request / response messages
|
||||
switch storeAndForwardMessage.rr {
|
||||
case .unset:
|
||||
MeshLogger.log("📮 Store and Forward \(storeAndForwardMessage.rr) message received \(storeAndForwardMessage)")
|
||||
|
|
@ -2424,6 +2432,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate
|
|||
newConfig.enabled = true
|
||||
newConfig.isRouter = storeAndForwardMessage.heartbeat.secondary == 0
|
||||
newConfig.lastHeartbeat = Date()
|
||||
routerNode.storeForwardConfig = newConfig
|
||||
}
|
||||
|
||||
do {
|
||||
|
|
@ -2441,6 +2450,24 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate
|
|||
case .routerBusy:
|
||||
MeshLogger.log("🐝 Store and Forward \(storeAndForwardMessage.rr) message received \(storeAndForwardMessage)")
|
||||
case .routerHistory:
|
||||
/// Set the Router History Last Request Value
|
||||
guard let routerNode = getNodeInfo(id: Int64(packet.from), context: context) else {
|
||||
return
|
||||
}
|
||||
if routerNode.storeForwardConfig != nil {
|
||||
routerNode.storeForwardConfig?.lastRequest = Date(timeIntervalSince1970: TimeInterval(storeAndForwardMessage.history.lastRequest))
|
||||
} else {
|
||||
let newConfig = StoreForwardConfigEntity(context: context)
|
||||
newConfig.lastRequest = Date(timeIntervalSince1970: TimeInterval(storeAndForwardMessage.history.lastRequest))
|
||||
routerNode.storeForwardConfig = newConfig
|
||||
}
|
||||
|
||||
do {
|
||||
try context.save()
|
||||
} catch {
|
||||
context.rollback()
|
||||
print("💥 Save Store and Forward Router Error")
|
||||
}
|
||||
MeshLogger.log("📜 Store and Forward \(storeAndForwardMessage.rr) message received \(storeAndForwardMessage)")
|
||||
case .routerStats:
|
||||
MeshLogger.log("📊 Store and Forward \(storeAndForwardMessage.rr) message received \(storeAndForwardMessage)")
|
||||
|
|
|
|||
|
|
@ -130,6 +130,10 @@ enum HardwareModel: SwiftProtobuf.Enum {
|
|||
/// Canary Radio Company - CanaryOne: https://canaryradio.io/products/canaryone
|
||||
case canaryone // = 29
|
||||
|
||||
///
|
||||
/// Waveshare RP2040 LoRa - https://www.waveshare.com/rp2040-lora.htm
|
||||
case rp2040Lora // = 30
|
||||
|
||||
///
|
||||
/// ---------------------------------------------------------------------------
|
||||
/// Less common/prototype boards listed here (needs one more byte over the air)
|
||||
|
|
@ -280,6 +284,7 @@ enum HardwareModel: SwiftProtobuf.Enum {
|
|||
case 27: self = .senseloraRp2040
|
||||
case 28: self = .senseloraS3
|
||||
case 29: self = .canaryone
|
||||
case 30: self = .rp2040Lora
|
||||
case 32: self = .loraRelayV1
|
||||
case 33: self = .nrf52840Dk
|
||||
case 34: self = .ppr
|
||||
|
|
@ -338,6 +343,7 @@ enum HardwareModel: SwiftProtobuf.Enum {
|
|||
case .senseloraRp2040: return 27
|
||||
case .senseloraS3: return 28
|
||||
case .canaryone: return 29
|
||||
case .rp2040Lora: return 30
|
||||
case .loraRelayV1: return 32
|
||||
case .nrf52840Dk: return 33
|
||||
case .ppr: return 34
|
||||
|
|
@ -401,6 +407,7 @@ extension HardwareModel: CaseIterable {
|
|||
.senseloraRp2040,
|
||||
.senseloraS3,
|
||||
.canaryone,
|
||||
.rp2040Lora,
|
||||
.loraRelayV1,
|
||||
.nrf52840Dk,
|
||||
.ppr,
|
||||
|
|
@ -2589,6 +2596,7 @@ extension HardwareModel: SwiftProtobuf._ProtoNameProviding {
|
|||
27: .same(proto: "SENSELORA_RP2040"),
|
||||
28: .same(proto: "SENSELORA_S3"),
|
||||
29: .same(proto: "CANARYONE"),
|
||||
30: .same(proto: "RP2040_LORA"),
|
||||
32: .same(proto: "LORA_RELAY_V1"),
|
||||
33: .same(proto: "NRF52840DK"),
|
||||
34: .same(proto: "PPR"),
|
||||
|
|
|
|||
|
|
@ -66,13 +66,13 @@ struct StoreAndForward {
|
|||
}
|
||||
|
||||
///
|
||||
/// Empty Payload
|
||||
var empty: Bool {
|
||||
/// Text from history message.
|
||||
var text: Data {
|
||||
get {
|
||||
if case .empty(let v)? = variant {return v}
|
||||
return false
|
||||
if case .text(let v)? = variant {return v}
|
||||
return Data()
|
||||
}
|
||||
set {variant = .empty(newValue)}
|
||||
set {variant = .text(newValue)}
|
||||
}
|
||||
|
||||
var unknownFields = SwiftProtobuf.UnknownStorage()
|
||||
|
|
@ -90,8 +90,8 @@ struct StoreAndForward {
|
|||
/// TODO: REPLACE
|
||||
case heartbeat(StoreAndForward.Heartbeat)
|
||||
///
|
||||
/// Empty Payload
|
||||
case empty(Bool)
|
||||
/// Text from history message.
|
||||
case text(Data)
|
||||
|
||||
#if !swift(>=4.1)
|
||||
static func ==(lhs: StoreAndForward.OneOf_Variant, rhs: StoreAndForward.OneOf_Variant) -> Bool {
|
||||
|
|
@ -111,8 +111,8 @@ struct StoreAndForward {
|
|||
guard case .heartbeat(let l) = lhs, case .heartbeat(let r) = rhs else { preconditionFailure() }
|
||||
return l == r
|
||||
}()
|
||||
case (.empty, .empty): return {
|
||||
guard case .empty(let l) = lhs, case .empty(let r) = rhs else { preconditionFailure() }
|
||||
case (.text, .text): return {
|
||||
guard case .text(let l) = lhs, case .text(let r) = rhs else { preconditionFailure() }
|
||||
return l == r
|
||||
}()
|
||||
default: return false
|
||||
|
|
@ -268,11 +268,11 @@ struct StoreAndForward {
|
|||
var heartbeat: Bool = false
|
||||
|
||||
///
|
||||
/// Is the heartbeat enabled on the server?
|
||||
/// Maximum number of messages the server will return.
|
||||
var returnMax: UInt32 = 0
|
||||
|
||||
///
|
||||
/// Is the heartbeat enabled on the server?
|
||||
/// Maximum history window in minutes the server will return messages from.
|
||||
var returnWindow: UInt32 = 0
|
||||
|
||||
var unknownFields = SwiftProtobuf.UnknownStorage()
|
||||
|
|
@ -296,7 +296,8 @@ struct StoreAndForward {
|
|||
var window: UInt32 = 0
|
||||
|
||||
///
|
||||
/// The window of messages that was used to filter the history client requested
|
||||
/// Index in the packet history of the last message sent in a previous request to the server.
|
||||
/// Will be sent to the client before sending the history and can be set in a subsequent request to avoid getting packets the server already sent to the client.
|
||||
var lastRequest: UInt32 = 0
|
||||
|
||||
var unknownFields = SwiftProtobuf.UnknownStorage()
|
||||
|
|
@ -312,7 +313,7 @@ struct StoreAndForward {
|
|||
// methods supported on all messages.
|
||||
|
||||
///
|
||||
/// Number of that will be sent to the client
|
||||
/// Period in seconds that the heartbeat is sent out that will be sent to the client
|
||||
var period: UInt32 = 0
|
||||
|
||||
///
|
||||
|
|
@ -371,7 +372,7 @@ extension StoreAndForward: SwiftProtobuf.Message, SwiftProtobuf._MessageImplemen
|
|||
2: .same(proto: "stats"),
|
||||
3: .same(proto: "history"),
|
||||
4: .same(proto: "heartbeat"),
|
||||
5: .same(proto: "empty"),
|
||||
5: .same(proto: "text"),
|
||||
]
|
||||
|
||||
mutating func decodeMessage<D: SwiftProtobuf.Decoder>(decoder: inout D) throws {
|
||||
|
|
@ -421,11 +422,11 @@ extension StoreAndForward: SwiftProtobuf.Message, SwiftProtobuf._MessageImplemen
|
|||
}
|
||||
}()
|
||||
case 5: try {
|
||||
var v: Bool?
|
||||
try decoder.decodeSingularBoolField(value: &v)
|
||||
var v: Data?
|
||||
try decoder.decodeSingularBytesField(value: &v)
|
||||
if let v = v {
|
||||
if self.variant != nil {try decoder.handleConflictingOneOf()}
|
||||
self.variant = .empty(v)
|
||||
self.variant = .text(v)
|
||||
}
|
||||
}()
|
||||
default: break
|
||||
|
|
@ -454,9 +455,9 @@ extension StoreAndForward: SwiftProtobuf.Message, SwiftProtobuf._MessageImplemen
|
|||
guard case .heartbeat(let v)? = self.variant else { preconditionFailure() }
|
||||
try visitor.visitSingularMessageField(value: v, fieldNumber: 4)
|
||||
}()
|
||||
case .empty?: try {
|
||||
guard case .empty(let v)? = self.variant else { preconditionFailure() }
|
||||
try visitor.visitSingularBoolField(value: v, fieldNumber: 5)
|
||||
case .text?: try {
|
||||
guard case .text(let v)? = self.variant else { preconditionFailure() }
|
||||
try visitor.visitSingularBytesField(value: v, fieldNumber: 5)
|
||||
}()
|
||||
case nil: break
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue