public static long GetMicroseconds() { lock (_lock) { long microseconds = _lastMicroseconds; while (microseconds == _lastMicroseconds) { microseconds = TimeZero.Add(_sw.Elapsed).TotalMicroseconds(); } _lastMicroseconds = microseconds; return(microseconds); } }
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)); } }