示例#1
0
        private static void CreateGeogrillaTxtInternal(TaskData td)
        {
            try
            {
                if (td.Device.LastGeogrillaSentTimestamp.AddMinutes(30) > DateTime.UtcNow)
                {
                    STrace.Log(typeof(Mensaje).FullName, null, td.Device.Id, td.Full ? LogTypes.Error : LogTypes.Debug, null, String.Format("No Foteo Geogrilla {0} por tiempo de espera minimo entre actualizaciones no alcanzado, ultima actualizacion: {1}", td.Full ? "full" : "incremental", td.Device.LastGeogrillaSentTimestamp.ToLocalTime()));
                    return;
                }
                td.Device.LastGeogrillaSentTimestamp = DateTime.UtcNow;

                var gg = new GeoGrillas
                {
                    Repository = new Repository
                    {
                        BaseFolderPath = td.Path,
                    }
                };
                var headers = gg.GridStructure;
                //si no esta bien cargado el header fix it
                if (headers.ActiveKey != 0x55AA55AA)
                {
                    headers.ActiveKey = 0x55AA55AA;
                    headers.DataStart = 1;
                }

                //si hay en fota un envio de qtree usar esa revision como base
                var fotaRev = GetPendingFotaRevision(td.Device);
                if (fotaRev > td.BaseRev)
                {
                    td.BaseRev = fotaRev;
                }

                int revision;
                var changedSectorsList = new TransactionLog(gg.Repository, td.Device.Id)
                                         .GetChangedSectorsAndRevision(td.BaseRev, out revision)
                                         .SelectMany(file => file.Value, (file, sectorindex) => (file.Key) + sectorindex)
                                         .ToArray();

                if (td.Full)
                {
                    var countSectors = (int)(Math.Ceiling(headers.Lat_GridCount / 32.0) * Math.Ceiling(headers.Lon_GridCount / 32.0));
                    changedSectorsList = Enumerable.Range(0, countSectors).ToArray();
                }

                if (changedSectorsList.Length == 0)
                {
                    STrace.Debug(typeof(Parser).FullName, td.Device.Id, String.Format("Cancelando envio de geogrilla por no haber sectores cambiados, BaseRev={0} LatestRev={1}", td.BaseRev, revision));
                    return;
                }

                var limit = td.Device.DataProvider.GetDetalleDispositivo(td.Device.Id, "LimiteGeogrillaIncremental").As(20480);
                if (!td.Full && changedSectorsList.Length > limit)
                {
                    //limite en el tamaño del diferencial generado de x sectores o megas, configurable en la plataforma con el detalle de dispositivo "LimiteGeogrillaIncremental".
                    STrace.Trace(typeof(Parser).FullName, td.Device.Id, String.Format(@"Cancelando envio de geogrilla incremental por superar el limite de sectores (detalle de dispositivo ""LimiteGeogrillaIncremental""): limite={0} cantidad={1}", limit, changedSectorsList.Length));
                    return;
                }

                //seteo desde ya la revision en la base por si vuelven a enviar un qtree diferencial que se sume solo lo nuevo
                td.Device.DataProvider.SetDetalleDispositivo(td.Device.Id, "known_qtree_revision", revision.ToString("D4"), "int");

                STrace.Debug(typeof(Parser).FullName, td.Device.Id, String.Format("Generando Geogrilla, BaseRev={0} LatestRev={1} GGName={2}", td.BaseRev, revision, td.Path));

                if (td.Full)
                {
                    var head = td.Device.DataProvider.GetDetalleDispositivo(td.Device.Id, "FullQtreePartitionsSd").AsBoolean(false)
                                                ? String.Format(
                        ">SUV29*<{0}>SUVU55AA<{0}>SSDF,|G1,{1},TestMap<{0}>SUV29AQSDF,14,3,|G1<{0}",
                        Environment.NewLine,
                        td.Device.DataProvider.GetDetalleDispositivo(td.Device.Id, "QtreeSdPartitionSize").As("3800000"))
                                                : String.Empty;
                    Fota.EnqueueLowPriority1(td.Device, 0, SetGGParams(headers, head));
                }

                Fota.EnqueueLowPriority1(td.Device, 0, Fota.VirtualMessageFactory(MessageIdentifier.QtreeStart, td.Device.NextSequence));

                ProccessSectors(td, changedSectorsList, gg, td.Device);

                var bytes  = BitConverter.GetBytes(revision);
                var hexa   = StringUtils.ByteArrayToHexString(bytes, 0, bytes.Length);
                var salida = String.Format("{1}>SSDG1,W0000008004{0}<{2}{1}>QSDG1,R0000008004<{1}", hexa, Environment.NewLine, Fota.VirtualMessageFactory(MessageIdentifier.QtreeSuccess, 0));
                Fota.EnqueueLowPriority2(td.Device, td.MessageId, salida);

                STrace.Trace(typeof(Parser).FullName, td.Device.Id, String.Format("geogrilla a revision: {0} desde: {1} cantidad de sectores: {2}", revision, td.BaseRev, changedSectorsList.Length));
            }
            catch (Exception e)
            {
                STrace.Exception(typeof(Parser).FullName, e, td.Device.Id, "Exception during CreateGeogrillaTxt");
            }
        }