Ejemplo n.º 1
0
        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;
        }
Ejemplo n.º 2
0
        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);
        }