abstract class MeteringCommunicationEvent {
  const MeteringCommunicationEvent();
}

abstract class SourceEvent extends MeteringCommunicationEvent {
  const SourceEvent();
}

abstract class ScreenEvent extends MeteringCommunicationEvent {
  const ScreenEvent();
}

class MeasureEvent extends ScreenEvent {
  const MeasureEvent();
}

abstract class MeasuredEvent extends SourceEvent {
  final double? ev100;

  const MeasuredEvent(this.ev100);
}

class MeteringInProgressEvent extends MeasuredEvent {
  const MeteringInProgressEvent(super.ev100);

  @override
  bool operator ==(Object other) {
    if (identical(this, other)) return true;
    if (other.runtimeType != runtimeType) return false;
    return other is MeteringInProgressEvent && other.ev100 == ev100;
  }

  @override
  int get hashCode => Object.hash(ev100, runtimeType);
}

class MeteringEndedEvent extends MeasuredEvent {
  const MeteringEndedEvent(super.ev100);

  @override
  bool operator ==(Object other) {
    if (identical(this, other)) return true;
    if (other.runtimeType != runtimeType) return false;
    return other is MeteringEndedEvent && other.ev100 == ev100;
  }

  @override
  int get hashCode => Object.hash(ev100, runtimeType);
}

class ScreenOnTopOpenedEvent extends ScreenEvent {
  const ScreenOnTopOpenedEvent();
}

class ScreenOnTopClosedEvent extends ScreenEvent {
  const ScreenOnTopClosedEvent();
}