Exemplo n.º 1
0
 public static long GetMicroseconds()
 {
     lock (_lock)
     {
         long microseconds = _lastMicroseconds;
         while (microseconds == _lastMicroseconds)
         {
             microseconds = TimeZero.Add(_sw.Elapsed).TotalMicroseconds();
         }
         _lastMicroseconds = microseconds;
         return(microseconds);
     }
 }
Exemplo n.º 2
0
        private void SerialPort_DataReceived(byte[] buffer)
        {
            DateTimeOffset dateTimeOffsetStartRead = DateTimeOffset.Now;

            lock (this._serialPortBuffer)
            {
                List <string> tmpLines = new List <string>(System.Text.ASCIIEncoding.ASCII.GetString(Combine(_serialPortBuffer, buffer)).Replace("\r", "").Split(separator: new char[] { '\n' }));

                bool processedAny     = false;
                int  highestProcessed = 0;
                // first entry may be incomplete, be ok skipping it if there are more, but keep it if there are only one
                for (highestProcessed = 0; highestProcessed < tmpLines.Count; highestProcessed++)
                {
                    try
                    {
                        if (tmpLines[highestProcessed].Contains("\"c\":"))
                        {
                            ResponseRoot responseRoot = parseResponse(tmpLines[highestProcessed]);
                            updateMuteStatus(responseRoot.toMuteStatus());
                            updatePowerStatus(responseRoot.toPowerStatus());
                            _logger.LogInformation(message: "status: " + this.MuteStatus.ToString());
                            if (TimeZero.Equals(DateTimeOffset.UnixEpoch))
                            {
                                _megaMuteTimeOffset = responseRoot.t;
                                TimeZero            = dateTimeOffsetStartRead;
                            }
                            if (responseRoot.c == 1)
                            {
                                _logger.LogInformation(message: "CHANGE status update at millis since power on {t}", responseRoot.t);
                            }
                            else
                            {
                                _logger.LogInformation(message: "interval push status update at millis since power on {t}", responseRoot.t);
                            }
                        }
                        else if (tmpLines[highestProcessed].Contains("\"command\":"))
                        {
                            PingResponse pingResponse = parsePing(tmpLines[highestProcessed]);
                            LastPing            = dateTimeOffsetStartRead;
                            _megaMuteTimeOffset = pingResponse.time;
                            TimeZero            = dateTimeOffsetStartRead;
                            _logger.LogInformation(message: "PING response to command {c} at millis since power on {t}", pingResponse.command, pingResponse.time);
                        }
                        else
                        {
                            continue;
                        }
                        processedAny = true;
                    }
                    catch (Exception e)
                    {
                        if (highestProcessed == 0)
                        {
                            continue;
                        }
                        else
                        {
                            break;
                        }
                    }
                }
                // if we processed any, remove any below where we are
                if (processedAny)
                {
                    tmpLines.RemoveRange(0, highestProcessed);
                }
                this._serialPortBuffer = System.Text.ASCIIEncoding.ASCII.GetBytes(String.Join("\n", tmpLines));
            }
        }