refactor: cleanup reservation handling code
[e-mobility-charging-stations-simulator.git] / src / charging-station / AutomaticTransactionGenerator.ts
index 1499f8fb09e1936848738854c732b9aae2285009..0389526fd6a9400a90404903a360d8d607448fd6 100644 (file)
@@ -31,11 +31,15 @@ export class AutomaticTransactionGenerator extends AsyncResource {
 
   public readonly connectorsStatus: Map<number, Status>;
   public started: boolean;
+  private starting: boolean;
+  private stopping: boolean;
   private readonly chargingStation: ChargingStation;
 
   private constructor(chargingStation: ChargingStation) {
     super(moduleName);
     this.started = false;
+    this.starting = false;
+    this.stopping = false;
     this.chargingStation = chargingStation;
     this.connectorsStatus = new Map<number, Status>();
     this.initializeConnectorsStatus();
@@ -63,8 +67,14 @@ export class AutomaticTransactionGenerator extends AsyncResource {
       logger.warn(`${this.logPrefix()} is already started`);
       return;
     }
+    if (this.starting === true) {
+      logger.warn(`${this.logPrefix()} is already starting`);
+      return;
+    }
+    this.starting = true;
     this.startConnectors();
     this.started = true;
+    this.starting = false;
   }
 
   public stop(): void {
@@ -72,8 +82,14 @@ export class AutomaticTransactionGenerator extends AsyncResource {
       logger.warn(`${this.logPrefix()} is already stopped`);
       return;
     }
+    if (this.stopping === true) {
+      logger.warn(`${this.logPrefix()} is already stopping`);
+      return;
+    }
+    this.stopping = true;
     this.stopConnectors();
     this.started = false;
+    this.stopping = false;
   }
 
   public startConnector(connectorId: number): void {
@@ -225,11 +241,9 @@ export class AutomaticTransactionGenerator extends AsyncResource {
       const wait =
         Utils.getRandomInteger(
           this.chargingStation.getAutomaticTransactionGeneratorConfiguration()
-            .maxDelayBetweenTwoTransactions ??
-            Constants.DEFAULT_ATG_MAX_DELAY_BETWEEN_TWO_TRANSACTIONS,
+            .maxDelayBetweenTwoTransactions,
           this.chargingStation.getAutomaticTransactionGeneratorConfiguration()
-            .minDelayBetweenTwoTransactions ??
-            Constants.DEFAULT_ATG_MIN_DELAY_BETWEEN_TWO_TRANSACTIONS
+            .minDelayBetweenTwoTransactions
         ) * 1000;
       logger.info(
         `${this.logPrefix(connectorId)} waiting for ${Utils.formatDurationMilliSeconds(wait)}`
@@ -247,10 +261,8 @@ export class AutomaticTransactionGenerator extends AsyncResource {
           // Wait until end of transaction
           const waitTrxEnd =
             Utils.getRandomInteger(
-              this.chargingStation.getAutomaticTransactionGeneratorConfiguration().maxDuration ??
-                Constants.DEFAULT_ATG_MAX_DURATION,
-              this.chargingStation.getAutomaticTransactionGeneratorConfiguration().minDuration ??
-                Constants.DEFAULT_ATG_MIN_DURATION
+              this.chargingStation.getAutomaticTransactionGeneratorConfiguration().maxDuration,
+              this.chargingStation.getAutomaticTransactionGeneratorConfiguration().minDuration
             ) * 1000;
           logger.info(
             `${this.logPrefix(connectorId)} transaction started with id ${this.chargingStation
@@ -307,8 +319,7 @@ export class AutomaticTransactionGenerator extends AsyncResource {
     this.connectorsStatus.get(connectorId).startDate = new Date();
     this.connectorsStatus.get(connectorId).stopDate = new Date(
       this.connectorsStatus.get(connectorId).startDate.getTime() +
-        (this.chargingStation.getAutomaticTransactionGeneratorConfiguration().stopAfterHours ??
-          Constants.DEFAULT_ATG_STOP_AFTER_HOURS) *
+        this.chargingStation.getAutomaticTransactionGeneratorConfiguration().stopAfterHours *
           3600 *
           1000 -
         previousRunDuration
@@ -321,45 +332,45 @@ export class AutomaticTransactionGenerator extends AsyncResource {
       for (const [evseId, evseStatus] of this.chargingStation.evses) {
         if (evseId > 0) {
           for (const connectorId of evseStatus.connectors.keys()) {
-            this.connectorsStatus.set(connectorId, {
-              start: false,
-              authorizeRequests: 0,
-              acceptedAuthorizeRequests: 0,
-              rejectedAuthorizeRequests: 0,
-              startTransactionRequests: 0,
-              acceptedStartTransactionRequests: 0,
-              rejectedStartTransactionRequests: 0,
-              stopTransactionRequests: 0,
-              acceptedStopTransactionRequests: 0,
-              rejectedStopTransactionRequests: 0,
-              skippedConsecutiveTransactions: 0,
-              skippedTransactions: 0,
-            });
+            this.connectorsStatus.set(connectorId, this.getConnectorStatus(connectorId));
           }
         }
       }
     } else {
       for (const connectorId of this.chargingStation.connectors.keys()) {
         if (connectorId > 0) {
-          this.connectorsStatus.set(connectorId, {
-            start: false,
-            authorizeRequests: 0,
-            acceptedAuthorizeRequests: 0,
-            rejectedAuthorizeRequests: 0,
-            startTransactionRequests: 0,
-            acceptedStartTransactionRequests: 0,
-            rejectedStartTransactionRequests: 0,
-            stopTransactionRequests: 0,
-            acceptedStopTransactionRequests: 0,
-            rejectedStopTransactionRequests: 0,
-            skippedConsecutiveTransactions: 0,
-            skippedTransactions: 0,
-          });
+          this.connectorsStatus.set(connectorId, this.getConnectorStatus(connectorId));
         }
       }
     }
   }
 
+  private getConnectorStatus(connectorId: number): Status {
+    const connectorStatus = Utils.cloneObject(
+      this.chargingStation.getAutomaticTransactionGeneratorStatuses()
+    )[connectorId];
+    delete connectorStatus?.startDate;
+    delete connectorStatus?.lastRunDate;
+    delete connectorStatus?.stopDate;
+    delete connectorStatus?.stoppedDate;
+    return (
+      connectorStatus ?? {
+        start: false,
+        authorizeRequests: 0,
+        acceptedAuthorizeRequests: 0,
+        rejectedAuthorizeRequests: 0,
+        startTransactionRequests: 0,
+        acceptedStartTransactionRequests: 0,
+        rejectedStartTransactionRequests: 0,
+        stopTransactionRequests: 0,
+        acceptedStopTransactionRequests: 0,
+        rejectedStopTransactionRequests: 0,
+        skippedConsecutiveTransactions: 0,
+        skippedTransactions: 0,
+      }
+    );
+  }
+
   private async startTransaction(
     connectorId: number
   ): Promise<StartTransactionResponse | undefined> {