public void AssignBlocks(List <StepsBlock> blocks) { List <WalkStepsBlock> walkSteps = new List <WalkStepsBlock>(); List <RunStepsBlock> runSteps = new List <RunStepsBlock>(); foreach (var block in blocks) { if (block.Mode == (int)ActivityCategory.Moving) { WalkStepsBlock walkBlock = new WalkStepsBlock(block.Start, block.End, block.Steps, block.Runs); walkSteps.Add(walkBlock); } if (block.Mode == (int)ActivityCategory.Moving2) { RunStepsBlock runBlock = new RunStepsBlock(block.Start, block.End, block.Steps, block.Runs); runSteps.Add(runBlock); } } this.walkSteps = walkSteps; this.runSteps = runSteps; }
private bool processSteps(DateTime date, bool force) { // comprobamos primero que este dia no este ya analizado var periodAlready = DB.GetStepsPeriods(date, date).FirstOrDefault(); if (periodAlready != null) { Debug.WriteLine("[ProcessSteps] el dia " + date.ToString() + " ya tiene un periodo"); return(true); } // cogemos los frames desde hoy a las 00:00 hasta las 23:59 List <ActivityFrame> frames = DB.GetActivityFrames(date, date.AddHours(23).AddMinutes(59).AddSeconds(59)); if (!force && frames.Count != 1440) { Debug.WriteLine("ProcessSteps] El dia " + date.ToString() + " no tiene todos los frames. (" + frames.Count + ")"); return(false); } var steps = frames.Where(f => f.Mode == (byte)ActivityCategory.Moving || f.Mode == (byte)ActivityCategory.Moving2).OrderBy(f => f.TimeStamp); if (steps.Count() > 0) { // iteramos por cada frame, metiendo en una misma lista los que son del mismo tipo, para luego generar los periodos List <List <ActivityFrame> > stepsBlocks = new List <List <ActivityFrame> >(); List <ActivityFrame> currentBlock = new List <ActivityFrame>(); for (int i = 0; i < steps.Count(); i++) { // frame actual var current = steps.ElementAt(i); // si no hay frames en la lista if (currentBlock.Count == 0) { // lo añadimos directamente currentBlock.Add(current); continue; } // si la lista ya tiene frames vemos que sea del mismo tipo que el primero if (current.Mode == currentBlock.First().Mode) { // si lo es lo guardamos currentBlock.Add(current); continue; } // si es de diferente tipo guardamos la lista stepsBlocks.Add(currentBlock); // y creamos otra currentBlock = new List <ActivityFrame>(); // retrocedemos el indice para que en la siguiente vuelta coja el mismo frame i--; } // guardamos el ultimo bloque if (currentBlock.Count() > 0) { stepsBlocks.Add(currentBlock); } // ahora que tenemos los bloques los transformamos a clases especificas para guardar en la BD List <Steps.WalkStepsBlock> walkSteps = new List <Steps.WalkStepsBlock>(); List <Steps.RunStepsBlock> runSteps = new List <Steps.RunStepsBlock>(); foreach (var block in stepsBlocks) { ActivityCategory mode = (ActivityCategory)block.First().Mode; DateTime start = block.Min(f => f.TimeStamp); DateTime end = block.Max(f => f.TimeStamp); int stepCount = block.Sum(f => f.Steps); int runs = block.Sum(f => f.Runs); if (mode == ActivityCategory.Moving) { Steps.WalkStepsBlock section = new Steps.WalkStepsBlock(start, end, stepCount, runs); walkSteps.Add(section); } if (mode == ActivityCategory.Moving2) { Steps.RunStepsBlock section = new Steps.RunStepsBlock(start, end, stepCount, runs); runSteps.Add(section); } } // una vez transformados creamos el periodo Steps.StepsPeriod period = new Steps.StepsPeriod(walkSteps, runSteps); // y lo guardamos en la base de datos DB.AddStepsPeriod(period); // guardamos los bloques del periodo por separado (FIXME seguro?) DB.AddStepsBlocks(period.RetrieveBlocks()); return(true); } return(false); }