private String CheckConditionsBeforeSendPending(String pending) { if (!LastSent.IsOnTheFly()) { string md = GetMessagingDevice(); if (md == MessagingDevice.Garmin && BaseDeviceCommand.createFrom(pending, this, null).isGarminMessage()) { if (IsGarminConnected == null || !IsGarminConnected.Value) { // var mid = NextSequence; // pending = GarminFmi.EncodePing().ToTraxFm<String>(mid, this); // LastSent = new INodeMessage(mid, pending, DateTime.UtcNow) { IsOnTheFly = true }; // STrace.Debug(typeof(IFoteable).FullName, this.GetDeviceId(), "GARMIN PING Sent"); LastSent = null; return(null); } } else { ulong mid = ParserUtils.GetMsgIdTaip(pending); if (pending.StartsWith(Reporte.WriteGgPrefix) && !_sdSession) { //si quiero escribir en la sd tengo que abrir sesion antes, y antes tengo que pedir la password para abrir sesion STrace.Debug(typeof(Parser).FullName, Id, "Sesion de escritura en sd QUERING"); mid = NextSequence; pending = Mensaje.Factory(mid, this, Reporte.QuerySdSessionPassword.TrimStart('>')); LastSent = new INodeMessage(mid, pending, DateTime.UtcNow) { IsOnTheFly = true }; } } } return(pending); }
// TODO: unificar GTEDeviceCommand e INodeMessage si se puede private void SendPendingFota(ref IMessage msg) { string pending = Fota.Peek(this); if (String.IsNullOrEmpty(pending)) { return; } if (CheckImageSession(pending)) { return; } //procesar primero el pendiente pending = CheckConditionsBeforeSendPending(pending); if (String.IsNullOrEmpty(pending)) { return; } #region SendPending var gteDC = BaseDeviceCommand.createFrom(pending, this, null); pending = gteDC.ToString(true); msg = (msg ?? new UserMessage(Id, 0)); msg.AddStringToPostSend(pending); if (LastSent == null || LastSent.GetText(null) != pending) { LastSent = new INodeMessage((ulong)Id, pending, DateTime.UtcNow); } #endregion SendPending }
private bool CheckLastSentAndDequeueIt(String buffer, ulong msgId, ref IMessage salida) { var result = true; string LastCmd = LastSent.GetText(String.Empty); ulong LastId = LastSent.GetId(); if (buffer.StartsWith(Reporte.SdLocked)) { _sdSession = false; STrace.Debug(typeof(Parser).FullName, Id, "Sesion de escritura en sd BORRANDO_POR_LOCKED"); } else if (buffer.StartsWith(Reporte.SdPassword)) { //Debug.Assert(LastSent.IsOnTheFly() == true); if (LastCmd.StartsWith(Reporte.StartGgWriteSession) && (LastId == msgId)) { LastSent = null; _sdSession = true; STrace.Debug(typeof(Parser).FullName, Id, "Sesion de escritura en sd ABIERTA"); } else if (_sdSession) { STrace.Debug(typeof(Parser).FullName, Id, "Sesion de escritura en sd NO_MANEJADO"); } else if (LastId == msgId) { ulong mid = NextSequence; LastSent = new INodeMessage(mid, Mensaje.Factory(mid, this, String.Format("{0}{1}", Reporte.StartGgWriteSession.TrimStart('>'), buffer.Substring(8, 8))), DateTime.MinValue) { IsOnTheFly = true }; salida.AddStringToSend(LastSent.Text); STrace.Debug(typeof(Parser).FullName, Id, "Sesion de escritura en sd ABRIENDO"); } else { STrace.Debug(typeof(Parser).FullName, Id, String.Format("Sesion de escritura en sd NADA (LastSent.GetId()={0} msgId={1})", LastSent.GetId(), msgId)); } } else if (LastSent != null) { if (LastSent.IsExpired()) { LastSent = null; } else { var lastDC = BaseDeviceCommand.createFrom(LastCmd, this, null); var respStatus = lastDC.isExpectedResponse(BaseDeviceCommand.createFrom(buffer, this, null)); switch (respStatus) { case DeviceCommandResponseStatus.Valid: result = true; Fota.Dequeue(this, lastDC.MessageId ?? null); break; case DeviceCommandResponseStatus.Invalid: result = false; break; case DeviceCommandResponseStatus.Exception: Fota.RollbackLastTransaction(this, lastDC.MessageId ?? null); result = false; break; } } } return(result); }