예제 #1
0
        public async Task <DeviceSample[]> GetSamplesFromDevice(SamplesReadingCallback samplesReadingCallback)
        {
            var result = new List <DeviceSample>();
            await Task.Run(() =>
            {
                WithSerialPort(() =>
                {
                    var details = new DeviceDetails();
                    GetInfoDetails1(details);

                    var data = new DataMessageSample[details.NumberOfSamples];
                    GetData(data, samplesReadingCallback);

                    int sampleNumber = 1;
                    foreach (var sample in data)
                    {
                        result.Add(new DeviceSample
                        {
                            ID          = sampleNumber++,
                            Temperature = Convert.ToDecimal(sample.Temperature) / 10M,
                            TimeStamp   = sample.GetTimeStamp()
                        });
                    }
                });
            });

            return(result.ToArray());
        }
예제 #2
0
 public void GetSamplesFromDevice(SamplesReadingCallback samplesReadingCallback)
 {
     var result = new List <LoggerSample>();
 }
예제 #3
0
        private void DoCallback(int offset, int totalBytes, SamplesReadingCallback callback)
        {
            var p = Convert.ToInt32(offset * 100.0 / totalBytes);

            callback(p, offset, totalBytes);
        }
예제 #4
0
        private void GetData(DataMessageSample[] data, SamplesReadingCallback callback)
        {
            var messageCount = data.Length / 15;
            var totalBytes   = messageCount * Marshal.SizeOf <DataMessage>();
            var rest         = data.Length % 15;

            if (rest > 0)
            {
                messageCount++;
                totalBytes = totalBytes + Marshal.SizeOf <DataMessageHeader>() +
                             rest * Marshal.SizeOf <DataMessageSample>() +
                             Marshal.SizeOf <DataMessageTail>();
            }
            var buffer = new byte[Marshal.SizeOf <DataMessage>() * messageCount];
            var offset = 0;

            var estimatedTransferTime = Convert.ToInt64(totalBytes * serialFrameSize * 1000) / serialPort.BaudRate;

            logger.Info($"Data : {totalBytes} estimated transfer time {estimatedTransferTime} ms");

            var question = Messages.GetDataMessage(SerialNumber);

            SendQuestion(question);

            sw.Restart();
            while (offset < totalBytes)
            {
                //TODO 1 JS PROTECT AGAINST ENDLESS LOOP
                var bytecount = buffer.Length - offset;
                int r         = serialPort.BaseStream.Read(buffer, offset, bytecount);
                offset += r;
                decimal progress = Convert.ToDecimal(offset * 100 / buffer.Length);
                if (r > 0)
                {
                    logger.Debug($"\treceived {r} bytes ({offset} of {buffer.Length}) ({ progress:##0.##}%)");
                }
                if (r == 0)
                {
                    Thread.Sleep(1);
                }
                DoCallback(offset, totalBytes, callback);
            }
            sw.Start();
            logger.Info($"Received a total of {offset} bytes in {sw.Elapsed}");
            if (rest > 0)
            {
                var dmts        = Marshal.SizeOf <DataMessageTail>();
                var targetIndex = buffer.Length - Marshal.SizeOf <DataMessageTail>();
                var srcIndex    = targetIndex - (15 - rest) * Marshal.SizeOf <DataMessageSample>();
                Array.Copy(buffer, srcIndex, buffer, targetIndex, dmts);
            }



            var dataMessages = Utils.MapArray <DataMessage>(buffer);
            var c            = 0;

            for (int i = 0; i < dataMessages.Length; i++)
            {
                var samples = dataMessages[i].GetSamples();
                for (int j = 0; j < 15 && c < data.Length; j++, c++)
                {
                    data[c] = samples[j];
                }
            }
        }