示例#1
0
        public MainPageModel()
        {
            UpdateWeather()
            .Subscribe(list =>
            {
                LastUpdatedList = list;
                CityWeatherList = list;
            });

            // Add some pseudo time based event
            var TickEvent = Observable.Interval(TimeSpan.FromMilliseconds(5000));


            TickEvent
            .Subscribe(_ => Debug.WriteLine("Timer Event"));


            // Create Commands -----------------------------------------------

            UpdateCommand = ReactiveCommand.CreateFromObservable(() => UpdateWeather());
            UpdateCommand
            .Subscribe(list => CityWeatherList = list);

            UpdateCommand.ThrownExceptions.Subscribe(exception => Debug.WriteLine(exception.Message));


            DoSomeImportantOtherTaskCommand = ReactiveCommand.CreateFromTask(async() => await DoSomethingImportant());

            TickEvent
            .InvokeCommand(DoSomeImportantOtherTaskCommand);



            //we want to prevent that any command is executed while one of the others is running
            CanFilter = DoSomeImportantOtherTaskCommand.IsExecuting
                        .Merge(UpdateCommand.IsExecuting)
                        .DistinctUntilChanged()
                        .Select(b => !b);

            CanFilter.Subscribe(b => Debug.WriteLine("CanFilter: " + b));

            FilterCommand = ReactiveCommand.CreateFromTask <string>(async name => await FilterCities(name), CanFilter);



            // Filter changes ------------------------------------------------------------------------------
            IObservable <string> TextChanging = this.WhenAnyValue(x => x.SearchText)
                                                .Throttle(TimeSpan.FromMilliseconds(500));



            TextChanging
            .InvokeCommand(FilterCommand);
        }
示例#2
0
        /// <summary>
        ///     Ruft das Html dieser Spalte für die Kopf-Zeile der Tabelle ab.
        /// </summary>
        /// <param name="helper">Der HtnmlHelper zum Render mit einer Liste der Einträge der Tabelle als Model.</param>
        /// <returns></returns>
        public string GetHeadHtml(HtmlHelper <IEnumerable <TGridModel> > helper)
        {
            TagBuilder headTagBuilder = new TagBuilder("th");

            /*Add Attributes*/
            foreach (var attribute in _attributes.Keys)
            {
                headTagBuilder.MergeAttribute(attribute, _attributes[attribute]);
            }
            foreach (var attribute in _attributesHead.Keys)
            {
                headTagBuilder.MergeAttribute(attribute, _attributesHead[attribute]);
            }

            headTagBuilder.MergeAttribute(Grid <TModel, TGridModel> .ATTRIBUTE_COLUMN_NAME, ColumnId);
            headTagBuilder.MergeAttribute(Grid <TModel, TGridModel> .ATTRIBUTE_COLUMN_CAN_SORT, CanOrderByColumn.ToString());
            headTagBuilder.MergeAttribute(Grid <TModel, TGridModel> .ATTRIBUTE_COLUMN_CAN_FILTER, CanFilter.ToString());
            // TODO
            headTagBuilder.MergeAttribute(Grid <TModel, TGridModel> .ATTRIBUTE_COLUMN_SAVE_FILTER, true.ToString());
            headTagBuilder.MergeAttribute(Grid <TModel, TGridModel> .ATTRIBUTE_COLUMN_SAVE_FILTER_KEY, string.Format("Filter#{0}", GetActualSaveFilterKey(Grid.GridId + "#" + ColumnId)));

            /*Der Inhalt entspricht dem Titel*/
            headTagBuilder.InnerHtml = GetHeadContent(helper, helper.ViewData.Model);

            return(headTagBuilder.ToString());
        }
示例#3
0
        private parseResult parseCanMessage(ref List <byte> ls, ref int idx, out canMessage2 msg)
        {
            // reset a message
            msg = null;

            // min length is: marker + 3 id + dlc
            const int minPossibleLen = 5;

            // check the lenght
            if (ls.Count - idx < minPossibleLen)
            {
                return(parseResult.parseBuffTooLow);
            }

            // get a marker
            byte marker = ls[idx];

            int  frameIdLen = 0;
            bool is29bitId  = false;

            if (marker == 't')
            {
                frameIdLen = 3;         // 11 bit message
            }
            else if (marker == 'T')     // 29 bit message
            {
                frameIdLen = 8;         // marker + 8b can id + dlc + dlc*2 + 4b timestamp (optionally) + endbyte
                is29bitId  = true;
            }
            else
            {
                return(parseResult.parseWrongParam);
            }

            int posCanId = 1;
            int posDlc   = posCanId + frameIdLen;
            int posData  = posDlc + 1;

            if (ls.Count - idx <= posDlc)
            {
                return(parseResult.parseBuffTooLow);
            }

            // get dlc
            int dlc = char2int(ls[posDlc + idx]);

            if (dlc < 0 || dlc > 8)
            {
                return(parseResult.parseWrongFormat);
            }

            // calc expecting frame len and try to get eof
            // marker + can id + dlc + dlc*2 data + 4b timestamp + endbyte
            int expLen = 1 + frameIdLen + 1 + dlc * 2 + 4 + 1;

            if (ls.Count - idx < expLen)
            {
                return(parseResult.parseBuffTooLow);
            }
            if (ls[expLen - 1 + idx] != '\r')
            {
                // it is possible that timestamp is disabled
                // check it
                int lenWithNoTs = expLen - 4;
                if (ls[lenWithNoTs - 1 + idx] == '\r')
                {
                    //ls.RemoveRange(0, lenWithNoTs);
                    idx += lenWithNoTs;
                    return(parseResult.parseNoTimeStamp);
                }

                return(parseResult.parseWrongFormat);
            }
            // the frame looks great, parse it
            int canId = 0;

            for (int i = 0; i < frameIdLen; i++)
            {
                canId |= char2int(ls[posCanId + i + idx]) << ((frameIdLen - 1 - i) * 4);
            }


            if (CanFilter.Contains(canId, dlc, is29bitId))
            {
                idx += expLen;
                return(parseResult.parseFiltered);
            }

            byte[] data = new byte[dlc];
            for (int i = 0; i < dlc; i++)
            {
                int b = char2int(ls[posData + idx + i * 2]) << 4 | char2int(ls[posData + idx + i * 2 + 1]);
                data[i] = (byte)b;
            }

            int posTs = posData + dlc * 2;
            int ts    = 0;

            for (int i = 0; i < 4; i++)
            {
                ts |= char2int(ls[posTs + i + idx]) << ((4 - 1 - i) * 4);
            }


            // there is a bug with timestamps:
            // t 1 0 0 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 5 F E
            // t 1 0 0 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 5 0 0
            // t 1 0 0 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 6 0 0
            // t 1 0 0 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 6 0 1

            // timestamp correction
            if (ts_prev >= 0 && ts < ts_prev)
            {
                if (((ts & 0x00FF) == 0) && ((ts & 0xF000) == (ts_prev & 0xF000)))
                {
                    // looks like correction is required
                    // how much should we add? 0x100
                    int tmp = ts;
                    ts += 0x100;
                    //Debug.WriteLine(string.Format("Ts correction: prev {0}, cur {1}, new {2}",
                    //    ts_prev, tmp, ts));
                }
            }

            // create a message
            msg = new canMessage2(canId, is29bitId, data, ts);

            // calculate an absolute ts value
            int  ts_since_start = 0;
            long now            = DateTimeOffset.Now.ToUnixTimeMilliseconds();

            if (ts_unix_prev > 0)
            {
                ts_since_start  = ts - ts_offset;
                ts_since_start += 60000 * ts_mul;

                long unix_diff = now - ts_unix_prev;
                // update mul
                if (unix_diff > 60000)
                {
                    while (unix_diff > 60000)
                    {
                        ts_mul++;
                        ts_since_start += 60000;
                        unix_diff      -= 60000;
                    }
                }
                else if (ts < ts_prev)
                {
                    ts_mul++;
                    ts_since_start += 60000;
                }
            }
            else
            {
                ts_offset = ts;
            }

            // set
            msg.timestamp_absolute = ts_since_start;

            // update
            ts_unix_prev = now;
            ts_prev      = ts;

            //Debug.WriteLine(string.Format("TS = {0}, can = {1}", ts_since_start, ts));

            // remove bytes
            idx += expLen;
            return(parseResult.parseOk);
        }