/**
 *  Copyright (c)2020 CEA LIST, Committer Name, and others.
 * 
 *  All rights reserved. This program and the accompanying materials
 *  are made available under the terms of the Eclipse Public License 2.0
 *  which accompanies this distribution, and is available at
 *  https://www.eclipse.org/legal/epl-2.0/
 * 
 *  SPDX-License-Identifier: EPL-2.0
 * 
 *  Contributors:
 *  CEA LIST - Initial API and implementation
 *  Gabriel Pedroza (CEA LIST) gabriel.pedroza@cea.fr
 *  Patrick Tessier (CEA LIST) Patrick.tessier@cea.fr 
 * 
 */
package org.eclipse.papyrus.pdp4eng.designer.profile.pdp4engDesign.impl;

import org.eclipse.emf.common.notify.Notification;

import org.eclipse.emf.ecore.EClass;

import org.eclipse.emf.ecore.impl.ENotificationImpl;

import org.eclipse.papyrus.pdp4eng.designer.profile.pdp4engDesign.CITSFrame;
import org.eclipse.papyrus.pdp4eng.designer.profile.pdp4engDesign.pdp4engDesignPackage;

/**
 * <!-- begin-user-doc -->
 * An implementation of the model object '<em><b>CITS Frame</b></em>'.
 * <!-- end-user-doc -->
 * <p>
 * The following features are implemented:
 * </p>
 * <ul>
 *   <li>{@link org.eclipse.papyrus.pdp4eng.designer.profile.pdp4engDesign.impl.CITSFrameImpl#getTime <em>Time</em>}</li>
 *   <li>{@link org.eclipse.papyrus.pdp4eng.designer.profile.pdp4engDesign.impl.CITSFrameImpl#getVehicleID <em>Vehicle ID</em>}</li>
 *   <li>{@link org.eclipse.papyrus.pdp4eng.designer.profile.pdp4engDesign.impl.CITSFrameImpl#getLatitude <em>Latitude</em>}</li>
 *   <li>{@link org.eclipse.papyrus.pdp4eng.designer.profile.pdp4engDesign.impl.CITSFrameImpl#getLongitude <em>Longitude</em>}</li>
 *   <li>{@link org.eclipse.papyrus.pdp4eng.designer.profile.pdp4engDesign.impl.CITSFrameImpl#getSpeedValue <em>Speed Value</em>}</li>
 *   <li>{@link org.eclipse.papyrus.pdp4eng.designer.profile.pdp4engDesign.impl.CITSFrameImpl#getHeadingValue <em>Heading Value</em>}</li>
 *   <li>{@link org.eclipse.papyrus.pdp4eng.designer.profile.pdp4engDesign.impl.CITSFrameImpl#isBrakePedalEngaged <em>Brake Pedal Engaged</em>}</li>
 *   <li>{@link org.eclipse.papyrus.pdp4eng.designer.profile.pdp4engDesign.impl.CITSFrameImpl#isGasPedalEngaged <em>Gas Pedal Engaged</em>}</li>
 *   <li>{@link org.eclipse.papyrus.pdp4eng.designer.profile.pdp4engDesign.impl.CITSFrameImpl#isEmergencyBrakeEngaged <em>Emergency Brake Engaged</em>}</li>
 *   <li>{@link org.eclipse.papyrus.pdp4eng.designer.profile.pdp4engDesign.impl.CITSFrameImpl#isCollisionWarningEngaged <em>Collision Warning Engaged</em>}</li>
 *   <li>{@link org.eclipse.papyrus.pdp4eng.designer.profile.pdp4engDesign.impl.CITSFrameImpl#isAccEngaged <em>Acc Engaged</em>}</li>
 *   <li>{@link org.eclipse.papyrus.pdp4eng.designer.profile.pdp4engDesign.impl.CITSFrameImpl#isCruiseControlEngaged <em>Cruise Control Engaged</em>}</li>
 *   <li>{@link org.eclipse.papyrus.pdp4eng.designer.profile.pdp4engDesign.impl.CITSFrameImpl#isSpeedLimiterEngaged <em>Speed Limiter Engaged</em>}</li>
 *   <li>{@link org.eclipse.papyrus.pdp4eng.designer.profile.pdp4engDesign.impl.CITSFrameImpl#getCertificateID <em>Certificate ID</em>}</li>
 * </ul>
 *
 * @generated
 */
public class CITSFrameImpl extends DataImpl implements CITSFrame {
	/**
	 * The default value of the '{@link #getTime() <em>Time</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getTime()
	 * @generated
	 * @ordered
	 */
	protected static final double TIME_EDEFAULT = 0.0;

	/**
	 * The cached value of the '{@link #getTime() <em>Time</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getTime()
	 * @generated
	 * @ordered
	 */
	protected double time = TIME_EDEFAULT;

	/**
	 * The default value of the '{@link #getVehicleID() <em>Vehicle ID</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getVehicleID()
	 * @generated
	 * @ordered
	 */
	protected static final double VEHICLE_ID_EDEFAULT = 0.0;

	/**
	 * The cached value of the '{@link #getVehicleID() <em>Vehicle ID</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getVehicleID()
	 * @generated
	 * @ordered
	 */
	protected double vehicleID = VEHICLE_ID_EDEFAULT;

	/**
	 * The default value of the '{@link #getLatitude() <em>Latitude</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getLatitude()
	 * @generated
	 * @ordered
	 */
	protected static final double LATITUDE_EDEFAULT = 0.0;

	/**
	 * The cached value of the '{@link #getLatitude() <em>Latitude</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getLatitude()
	 * @generated
	 * @ordered
	 */
	protected double latitude = LATITUDE_EDEFAULT;

	/**
	 * The default value of the '{@link #getLongitude() <em>Longitude</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getLongitude()
	 * @generated
	 * @ordered
	 */
	protected static final double LONGITUDE_EDEFAULT = 0.0;

	/**
	 * The cached value of the '{@link #getLongitude() <em>Longitude</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getLongitude()
	 * @generated
	 * @ordered
	 */
	protected double longitude = LONGITUDE_EDEFAULT;

	/**
	 * The default value of the '{@link #getSpeedValue() <em>Speed Value</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getSpeedValue()
	 * @generated
	 * @ordered
	 */
	protected static final double SPEED_VALUE_EDEFAULT = 0.0;

	/**
	 * The cached value of the '{@link #getSpeedValue() <em>Speed Value</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getSpeedValue()
	 * @generated
	 * @ordered
	 */
	protected double speedValue = SPEED_VALUE_EDEFAULT;

	/**
	 * The default value of the '{@link #getHeadingValue() <em>Heading Value</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getHeadingValue()
	 * @generated
	 * @ordered
	 */
	protected static final double HEADING_VALUE_EDEFAULT = 0.0;

	/**
	 * The cached value of the '{@link #getHeadingValue() <em>Heading Value</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getHeadingValue()
	 * @generated
	 * @ordered
	 */
	protected double headingValue = HEADING_VALUE_EDEFAULT;

	/**
	 * The default value of the '{@link #isBrakePedalEngaged() <em>Brake Pedal Engaged</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #isBrakePedalEngaged()
	 * @generated
	 * @ordered
	 */
	protected static final boolean BRAKE_PEDAL_ENGAGED_EDEFAULT = false;

	/**
	 * The cached value of the '{@link #isBrakePedalEngaged() <em>Brake Pedal Engaged</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #isBrakePedalEngaged()
	 * @generated
	 * @ordered
	 */
	protected boolean brakePedalEngaged = BRAKE_PEDAL_ENGAGED_EDEFAULT;

	/**
	 * The default value of the '{@link #isGasPedalEngaged() <em>Gas Pedal Engaged</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #isGasPedalEngaged()
	 * @generated
	 * @ordered
	 */
	protected static final boolean GAS_PEDAL_ENGAGED_EDEFAULT = false;

	/**
	 * The cached value of the '{@link #isGasPedalEngaged() <em>Gas Pedal Engaged</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #isGasPedalEngaged()
	 * @generated
	 * @ordered
	 */
	protected boolean gasPedalEngaged = GAS_PEDAL_ENGAGED_EDEFAULT;

	/**
	 * The default value of the '{@link #isEmergencyBrakeEngaged() <em>Emergency Brake Engaged</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #isEmergencyBrakeEngaged()
	 * @generated
	 * @ordered
	 */
	protected static final boolean EMERGENCY_BRAKE_ENGAGED_EDEFAULT = false;

	/**
	 * The cached value of the '{@link #isEmergencyBrakeEngaged() <em>Emergency Brake Engaged</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #isEmergencyBrakeEngaged()
	 * @generated
	 * @ordered
	 */
	protected boolean emergencyBrakeEngaged = EMERGENCY_BRAKE_ENGAGED_EDEFAULT;

	/**
	 * The default value of the '{@link #isCollisionWarningEngaged() <em>Collision Warning Engaged</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #isCollisionWarningEngaged()
	 * @generated
	 * @ordered
	 */
	protected static final boolean COLLISION_WARNING_ENGAGED_EDEFAULT = false;

	/**
	 * The cached value of the '{@link #isCollisionWarningEngaged() <em>Collision Warning Engaged</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #isCollisionWarningEngaged()
	 * @generated
	 * @ordered
	 */
	protected boolean collisionWarningEngaged = COLLISION_WARNING_ENGAGED_EDEFAULT;

	/**
	 * The default value of the '{@link #isAccEngaged() <em>Acc Engaged</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #isAccEngaged()
	 * @generated
	 * @ordered
	 */
	protected static final boolean ACC_ENGAGED_EDEFAULT = false;

	/**
	 * The cached value of the '{@link #isAccEngaged() <em>Acc Engaged</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #isAccEngaged()
	 * @generated
	 * @ordered
	 */
	protected boolean accEngaged = ACC_ENGAGED_EDEFAULT;

	/**
	 * The default value of the '{@link #isCruiseControlEngaged() <em>Cruise Control Engaged</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #isCruiseControlEngaged()
	 * @generated
	 * @ordered
	 */
	protected static final boolean CRUISE_CONTROL_ENGAGED_EDEFAULT = false;

	/**
	 * The cached value of the '{@link #isCruiseControlEngaged() <em>Cruise Control Engaged</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #isCruiseControlEngaged()
	 * @generated
	 * @ordered
	 */
	protected boolean cruiseControlEngaged = CRUISE_CONTROL_ENGAGED_EDEFAULT;

	/**
	 * The default value of the '{@link #isSpeedLimiterEngaged() <em>Speed Limiter Engaged</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #isSpeedLimiterEngaged()
	 * @generated
	 * @ordered
	 */
	protected static final boolean SPEED_LIMITER_ENGAGED_EDEFAULT = false;

	/**
	 * The cached value of the '{@link #isSpeedLimiterEngaged() <em>Speed Limiter Engaged</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #isSpeedLimiterEngaged()
	 * @generated
	 * @ordered
	 */
	protected boolean speedLimiterEngaged = SPEED_LIMITER_ENGAGED_EDEFAULT;

	/**
	 * The default value of the '{@link #getCertificateID() <em>Certificate ID</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getCertificateID()
	 * @generated
	 * @ordered
	 */
	protected static final String CERTIFICATE_ID_EDEFAULT = null;

	/**
	 * The cached value of the '{@link #getCertificateID() <em>Certificate ID</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getCertificateID()
	 * @generated
	 * @ordered
	 */
	protected String certificateID = CERTIFICATE_ID_EDEFAULT;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected CITSFrameImpl() {
		super();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	protected EClass eStaticClass() {
		return pdp4engDesignPackage.Literals.CITS_FRAME;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public double getTime() {
		return time;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public void setTime(double newTime) {
		double oldTime = time;
		time = newTime;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, pdp4engDesignPackage.CITS_FRAME__TIME, oldTime, time));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public double getVehicleID() {
		return vehicleID;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public void setVehicleID(double newVehicleID) {
		double oldVehicleID = vehicleID;
		vehicleID = newVehicleID;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, pdp4engDesignPackage.CITS_FRAME__VEHICLE_ID, oldVehicleID, vehicleID));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public double getLatitude() {
		return latitude;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public void setLatitude(double newLatitude) {
		double oldLatitude = latitude;
		latitude = newLatitude;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, pdp4engDesignPackage.CITS_FRAME__LATITUDE, oldLatitude, latitude));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public double getLongitude() {
		return longitude;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public void setLongitude(double newLongitude) {
		double oldLongitude = longitude;
		longitude = newLongitude;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, pdp4engDesignPackage.CITS_FRAME__LONGITUDE, oldLongitude, longitude));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public double getSpeedValue() {
		return speedValue;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public void setSpeedValue(double newSpeedValue) {
		double oldSpeedValue = speedValue;
		speedValue = newSpeedValue;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, pdp4engDesignPackage.CITS_FRAME__SPEED_VALUE, oldSpeedValue, speedValue));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public double getHeadingValue() {
		return headingValue;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public void setHeadingValue(double newHeadingValue) {
		double oldHeadingValue = headingValue;
		headingValue = newHeadingValue;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, pdp4engDesignPackage.CITS_FRAME__HEADING_VALUE, oldHeadingValue, headingValue));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public boolean isBrakePedalEngaged() {
		return brakePedalEngaged;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public void setBrakePedalEngaged(boolean newBrakePedalEngaged) {
		boolean oldBrakePedalEngaged = brakePedalEngaged;
		brakePedalEngaged = newBrakePedalEngaged;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, pdp4engDesignPackage.CITS_FRAME__BRAKE_PEDAL_ENGAGED, oldBrakePedalEngaged, brakePedalEngaged));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public boolean isGasPedalEngaged() {
		return gasPedalEngaged;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public void setGasPedalEngaged(boolean newGasPedalEngaged) {
		boolean oldGasPedalEngaged = gasPedalEngaged;
		gasPedalEngaged = newGasPedalEngaged;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, pdp4engDesignPackage.CITS_FRAME__GAS_PEDAL_ENGAGED, oldGasPedalEngaged, gasPedalEngaged));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public boolean isEmergencyBrakeEngaged() {
		return emergencyBrakeEngaged;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public void setEmergencyBrakeEngaged(boolean newEmergencyBrakeEngaged) {
		boolean oldEmergencyBrakeEngaged = emergencyBrakeEngaged;
		emergencyBrakeEngaged = newEmergencyBrakeEngaged;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, pdp4engDesignPackage.CITS_FRAME__EMERGENCY_BRAKE_ENGAGED, oldEmergencyBrakeEngaged, emergencyBrakeEngaged));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public boolean isCollisionWarningEngaged() {
		return collisionWarningEngaged;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public void setCollisionWarningEngaged(boolean newCollisionWarningEngaged) {
		boolean oldCollisionWarningEngaged = collisionWarningEngaged;
		collisionWarningEngaged = newCollisionWarningEngaged;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, pdp4engDesignPackage.CITS_FRAME__COLLISION_WARNING_ENGAGED, oldCollisionWarningEngaged, collisionWarningEngaged));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public boolean isAccEngaged() {
		return accEngaged;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public void setAccEngaged(boolean newAccEngaged) {
		boolean oldAccEngaged = accEngaged;
		accEngaged = newAccEngaged;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, pdp4engDesignPackage.CITS_FRAME__ACC_ENGAGED, oldAccEngaged, accEngaged));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public boolean isCruiseControlEngaged() {
		return cruiseControlEngaged;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public void setCruiseControlEngaged(boolean newCruiseControlEngaged) {
		boolean oldCruiseControlEngaged = cruiseControlEngaged;
		cruiseControlEngaged = newCruiseControlEngaged;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, pdp4engDesignPackage.CITS_FRAME__CRUISE_CONTROL_ENGAGED, oldCruiseControlEngaged, cruiseControlEngaged));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public boolean isSpeedLimiterEngaged() {
		return speedLimiterEngaged;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public void setSpeedLimiterEngaged(boolean newSpeedLimiterEngaged) {
		boolean oldSpeedLimiterEngaged = speedLimiterEngaged;
		speedLimiterEngaged = newSpeedLimiterEngaged;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, pdp4engDesignPackage.CITS_FRAME__SPEED_LIMITER_ENGAGED, oldSpeedLimiterEngaged, speedLimiterEngaged));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public String getCertificateID() {
		return certificateID;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public void setCertificateID(String newCertificateID) {
		String oldCertificateID = certificateID;
		certificateID = newCertificateID;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, pdp4engDesignPackage.CITS_FRAME__CERTIFICATE_ID, oldCertificateID, certificateID));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Object eGet(int featureID, boolean resolve, boolean coreType) {
		switch (featureID) {
			case pdp4engDesignPackage.CITS_FRAME__TIME:
				return getTime();
			case pdp4engDesignPackage.CITS_FRAME__VEHICLE_ID:
				return getVehicleID();
			case pdp4engDesignPackage.CITS_FRAME__LATITUDE:
				return getLatitude();
			case pdp4engDesignPackage.CITS_FRAME__LONGITUDE:
				return getLongitude();
			case pdp4engDesignPackage.CITS_FRAME__SPEED_VALUE:
				return getSpeedValue();
			case pdp4engDesignPackage.CITS_FRAME__HEADING_VALUE:
				return getHeadingValue();
			case pdp4engDesignPackage.CITS_FRAME__BRAKE_PEDAL_ENGAGED:
				return isBrakePedalEngaged();
			case pdp4engDesignPackage.CITS_FRAME__GAS_PEDAL_ENGAGED:
				return isGasPedalEngaged();
			case pdp4engDesignPackage.CITS_FRAME__EMERGENCY_BRAKE_ENGAGED:
				return isEmergencyBrakeEngaged();
			case pdp4engDesignPackage.CITS_FRAME__COLLISION_WARNING_ENGAGED:
				return isCollisionWarningEngaged();
			case pdp4engDesignPackage.CITS_FRAME__ACC_ENGAGED:
				return isAccEngaged();
			case pdp4engDesignPackage.CITS_FRAME__CRUISE_CONTROL_ENGAGED:
				return isCruiseControlEngaged();
			case pdp4engDesignPackage.CITS_FRAME__SPEED_LIMITER_ENGAGED:
				return isSpeedLimiterEngaged();
			case pdp4engDesignPackage.CITS_FRAME__CERTIFICATE_ID:
				return getCertificateID();
		}
		return super.eGet(featureID, resolve, coreType);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public void eSet(int featureID, Object newValue) {
		switch (featureID) {
			case pdp4engDesignPackage.CITS_FRAME__TIME:
				setTime((Double)newValue);
				return;
			case pdp4engDesignPackage.CITS_FRAME__VEHICLE_ID:
				setVehicleID((Double)newValue);
				return;
			case pdp4engDesignPackage.CITS_FRAME__LATITUDE:
				setLatitude((Double)newValue);
				return;
			case pdp4engDesignPackage.CITS_FRAME__LONGITUDE:
				setLongitude((Double)newValue);
				return;
			case pdp4engDesignPackage.CITS_FRAME__SPEED_VALUE:
				setSpeedValue((Double)newValue);
				return;
			case pdp4engDesignPackage.CITS_FRAME__HEADING_VALUE:
				setHeadingValue((Double)newValue);
				return;
			case pdp4engDesignPackage.CITS_FRAME__BRAKE_PEDAL_ENGAGED:
				setBrakePedalEngaged((Boolean)newValue);
				return;
			case pdp4engDesignPackage.CITS_FRAME__GAS_PEDAL_ENGAGED:
				setGasPedalEngaged((Boolean)newValue);
				return;
			case pdp4engDesignPackage.CITS_FRAME__EMERGENCY_BRAKE_ENGAGED:
				setEmergencyBrakeEngaged((Boolean)newValue);
				return;
			case pdp4engDesignPackage.CITS_FRAME__COLLISION_WARNING_ENGAGED:
				setCollisionWarningEngaged((Boolean)newValue);
				return;
			case pdp4engDesignPackage.CITS_FRAME__ACC_ENGAGED:
				setAccEngaged((Boolean)newValue);
				return;
			case pdp4engDesignPackage.CITS_FRAME__CRUISE_CONTROL_ENGAGED:
				setCruiseControlEngaged((Boolean)newValue);
				return;
			case pdp4engDesignPackage.CITS_FRAME__SPEED_LIMITER_ENGAGED:
				setSpeedLimiterEngaged((Boolean)newValue);
				return;
			case pdp4engDesignPackage.CITS_FRAME__CERTIFICATE_ID:
				setCertificateID((String)newValue);
				return;
		}
		super.eSet(featureID, newValue);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public void eUnset(int featureID) {
		switch (featureID) {
			case pdp4engDesignPackage.CITS_FRAME__TIME:
				setTime(TIME_EDEFAULT);
				return;
			case pdp4engDesignPackage.CITS_FRAME__VEHICLE_ID:
				setVehicleID(VEHICLE_ID_EDEFAULT);
				return;
			case pdp4engDesignPackage.CITS_FRAME__LATITUDE:
				setLatitude(LATITUDE_EDEFAULT);
				return;
			case pdp4engDesignPackage.CITS_FRAME__LONGITUDE:
				setLongitude(LONGITUDE_EDEFAULT);
				return;
			case pdp4engDesignPackage.CITS_FRAME__SPEED_VALUE:
				setSpeedValue(SPEED_VALUE_EDEFAULT);
				return;
			case pdp4engDesignPackage.CITS_FRAME__HEADING_VALUE:
				setHeadingValue(HEADING_VALUE_EDEFAULT);
				return;
			case pdp4engDesignPackage.CITS_FRAME__BRAKE_PEDAL_ENGAGED:
				setBrakePedalEngaged(BRAKE_PEDAL_ENGAGED_EDEFAULT);
				return;
			case pdp4engDesignPackage.CITS_FRAME__GAS_PEDAL_ENGAGED:
				setGasPedalEngaged(GAS_PEDAL_ENGAGED_EDEFAULT);
				return;
			case pdp4engDesignPackage.CITS_FRAME__EMERGENCY_BRAKE_ENGAGED:
				setEmergencyBrakeEngaged(EMERGENCY_BRAKE_ENGAGED_EDEFAULT);
				return;
			case pdp4engDesignPackage.CITS_FRAME__COLLISION_WARNING_ENGAGED:
				setCollisionWarningEngaged(COLLISION_WARNING_ENGAGED_EDEFAULT);
				return;
			case pdp4engDesignPackage.CITS_FRAME__ACC_ENGAGED:
				setAccEngaged(ACC_ENGAGED_EDEFAULT);
				return;
			case pdp4engDesignPackage.CITS_FRAME__CRUISE_CONTROL_ENGAGED:
				setCruiseControlEngaged(CRUISE_CONTROL_ENGAGED_EDEFAULT);
				return;
			case pdp4engDesignPackage.CITS_FRAME__SPEED_LIMITER_ENGAGED:
				setSpeedLimiterEngaged(SPEED_LIMITER_ENGAGED_EDEFAULT);
				return;
			case pdp4engDesignPackage.CITS_FRAME__CERTIFICATE_ID:
				setCertificateID(CERTIFICATE_ID_EDEFAULT);
				return;
		}
		super.eUnset(featureID);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public boolean eIsSet(int featureID) {
		switch (featureID) {
			case pdp4engDesignPackage.CITS_FRAME__TIME:
				return time != TIME_EDEFAULT;
			case pdp4engDesignPackage.CITS_FRAME__VEHICLE_ID:
				return vehicleID != VEHICLE_ID_EDEFAULT;
			case pdp4engDesignPackage.CITS_FRAME__LATITUDE:
				return latitude != LATITUDE_EDEFAULT;
			case pdp4engDesignPackage.CITS_FRAME__LONGITUDE:
				return longitude != LONGITUDE_EDEFAULT;
			case pdp4engDesignPackage.CITS_FRAME__SPEED_VALUE:
				return speedValue != SPEED_VALUE_EDEFAULT;
			case pdp4engDesignPackage.CITS_FRAME__HEADING_VALUE:
				return headingValue != HEADING_VALUE_EDEFAULT;
			case pdp4engDesignPackage.CITS_FRAME__BRAKE_PEDAL_ENGAGED:
				return brakePedalEngaged != BRAKE_PEDAL_ENGAGED_EDEFAULT;
			case pdp4engDesignPackage.CITS_FRAME__GAS_PEDAL_ENGAGED:
				return gasPedalEngaged != GAS_PEDAL_ENGAGED_EDEFAULT;
			case pdp4engDesignPackage.CITS_FRAME__EMERGENCY_BRAKE_ENGAGED:
				return emergencyBrakeEngaged != EMERGENCY_BRAKE_ENGAGED_EDEFAULT;
			case pdp4engDesignPackage.CITS_FRAME__COLLISION_WARNING_ENGAGED:
				return collisionWarningEngaged != COLLISION_WARNING_ENGAGED_EDEFAULT;
			case pdp4engDesignPackage.CITS_FRAME__ACC_ENGAGED:
				return accEngaged != ACC_ENGAGED_EDEFAULT;
			case pdp4engDesignPackage.CITS_FRAME__CRUISE_CONTROL_ENGAGED:
				return cruiseControlEngaged != CRUISE_CONTROL_ENGAGED_EDEFAULT;
			case pdp4engDesignPackage.CITS_FRAME__SPEED_LIMITER_ENGAGED:
				return speedLimiterEngaged != SPEED_LIMITER_ENGAGED_EDEFAULT;
			case pdp4engDesignPackage.CITS_FRAME__CERTIFICATE_ID:
				return CERTIFICATE_ID_EDEFAULT == null ? certificateID != null : !CERTIFICATE_ID_EDEFAULT.equals(certificateID);
		}
		return super.eIsSet(featureID);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public String toString() {
		if (eIsProxy()) return super.toString();

		StringBuilder result = new StringBuilder(super.toString());
		result.append(" (time: ");
		result.append(time);
		result.append(", vehicleID: ");
		result.append(vehicleID);
		result.append(", latitude: ");
		result.append(latitude);
		result.append(", longitude: ");
		result.append(longitude);
		result.append(", speedValue: ");
		result.append(speedValue);
		result.append(", headingValue: ");
		result.append(headingValue);
		result.append(", brakePedalEngaged: ");
		result.append(brakePedalEngaged);
		result.append(", gasPedalEngaged: ");
		result.append(gasPedalEngaged);
		result.append(", emergencyBrakeEngaged: ");
		result.append(emergencyBrakeEngaged);
		result.append(", collisionWarningEngaged: ");
		result.append(collisionWarningEngaged);
		result.append(", accEngaged: ");
		result.append(accEngaged);
		result.append(", cruiseControlEngaged: ");
		result.append(cruiseControlEngaged);
		result.append(", speedLimiterEngaged: ");
		result.append(speedLimiterEngaged);
		result.append(", certificateID: ");
		result.append(certificateID);
		result.append(')');
		return result.toString();
	}

} //CITSFrameImpl
