Ejemplo n.º 1
0
        public void DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            if (!Port.IsOpen)
            {
                return;
            }

            _TempString += Port.ReadExisting();

            if (_TempString.Contains("\r\n"))
            {
#if DEBUG
                Console.WriteLine(_TempString);
#endif

                string commandResponse = _TempString.Substring(0, _TempString.IndexOf("\r\n") + 2);
                _TempString = _TempString.Replace(commandResponse, "");

                //========== ismeterconnected request (returns software version) ==========
                if (commandResponse.StartsWith("?"))
                {
                    if (commandResponse.Split(new char [] { '.' }).Length == 3)
                    {
                        _MeterResponded = true;
                    }
                }

                if (commandResponse.StartsWith("S "))
                {
                    _MeterResponded = true;
                }

                //========== serial number response ==========
                if (commandResponse.StartsWith("@"))
                {
                    _MeterResponded = true;
                    SerialNumber    = commandResponse.Split(new char[] { ' ' })[1].Replace('\"', ' ').Trim();
#if DEBUG
                    Console.WriteLine("SerialNumber: " + SerialNumber);
#endif
                }//if

                //========== patient record response ==========
                else if (commandResponse.StartsWith("P"))
                {
                    if (!_HeaderRead)
                    {
                        //first row of P records is the header
                        _HeaderRead  = true;
                        _RecordCount = 0;
                        string[] header = commandResponse.Split(new char[] { ',' });
                        SampleCount  = int.Parse(header[0].Split(new char[] { ' ' })[1]);
                        SerialNumber = header[1].Replace("\"", "");
                        SampleFormat = header[2].Substring(header[2].IndexOf('\"') + 1, header[2].LastIndexOf('\"') - (header[2].IndexOf('\"') + 1)).ToLower().Trim() == "mg/dl" ? SampleFormat.MGDL : SampleFormat.MMOL;

#if DEBUG
                        Console.WriteLine("SampleCount: " + SampleCount);
                        Console.WriteLine("SampleFormat: " + SampleFormat.ToString());
                        Console.WriteLine("SerialNumber: " + SerialNumber);
#endif

                        OnHeaderRead(new HeaderReadEventArgs(SampleCount, this));
                    }//if
                    else
                    {
                        //all other P records are glucose records
                        Console.WriteLine("Record: " + commandResponse);
                        string[] parsedMsg  = commandResponse.Replace("\"", "").Replace(" ", "").Split(new char[] { ',' });
                        string[] parsedDate = parsedMsg[1].Split(new char[] { '/' });
                        string[] parsedTime = parsedMsg[2].Split(new char[] { ':' });

                        try
                        {
                            DateTime dtTimeStamp = new DateTime(int.Parse(parsedDate[2].ToString()), int.Parse(parsedDate[0].ToString()), int.Parse(parsedDate[1].ToString()), int.Parse(parsedTime[0].ToString()), int.Parse(parsedTime[1].ToString()), int.Parse(parsedTime[2].ToString()));

                            if (dtTimeStamp.Year < 100)
                            {
                                //two digit year encountered (all dates are assumed to be in 2000+)
                                dtTimeStamp = dtTimeStamp.AddYears(2000);
                            }//if

                            OnRecordRead(new RecordReadEventArgs(Records.AddRecordRow(dtTimeStamp, Int32.Parse(parsedMsg[3].ToString()), "mg/dl")));//always returns data in mg/dl
                        }//try
                        catch { }
                        finally
                        {
                            ++_RecordCount;
                        }

                        if (_RecordCount == SampleCount)
                        {
                            //all records read so close the port and dispose
                            OnReadFinished(new ReadFinishedEventArgs(this));
                            Dispose();
                        } //if
                    }
                }         //elseif
            }             //if
        }