Align constants namespace
[e-mobility-charging-stations-simulator.git] / src / charging-station / AutomaticTransactionGenerator.ts
index 877339c2da8069e1a9fa5db799bffb0b864d1642..0e0982a201dd7165f39212dc3acaba7b8e893002 100644 (file)
@@ -2,7 +2,7 @@
 
 import { AuthorizationStatus, AuthorizeResponse, StartTransactionResponse, StopTransactionReason, StopTransactionResponse } from '../types/ocpp/Transaction';
 
-import ChargingStation from './ChargingStation';
+import type ChargingStation from './ChargingStation';
 import Constants from '../utils/Constants';
 import PerformanceStatistics from '../performance/PerformanceStatistics';
 import { Status } from '../types/AutomaticTransactionGenerator';
@@ -10,17 +10,25 @@ import Utils from '../utils/Utils';
 import logger from '../utils/Logger';
 
 export default class AutomaticTransactionGenerator {
+  private static readonly instances: Map<string, AutomaticTransactionGenerator> = new Map<string, AutomaticTransactionGenerator>();
   public started: boolean;
-  private chargingStation: ChargingStation;
-  private connectorsStatus: Map<number, Status>;
+  private readonly chargingStation: ChargingStation;
+  private readonly connectorsStatus: Map<number, Status>;
 
-  constructor(chargingStation: ChargingStation) {
+  private constructor(chargingStation: ChargingStation) {
     this.chargingStation = chargingStation;
     this.connectorsStatus = new Map<number, Status>();
     this.stopConnectors();
     this.started = false;
   }
 
+  public static getInstance(chargingStation: ChargingStation): AutomaticTransactionGenerator {
+    if (!AutomaticTransactionGenerator.instances.has(chargingStation.id)) {
+      AutomaticTransactionGenerator.instances.set(chargingStation.id, new AutomaticTransactionGenerator(chargingStation));
+    }
+    return AutomaticTransactionGenerator.instances.get(chargingStation.id);
+  }
+
   public start(): void {
     if (this.started) {
       logger.error(`${this.logPrefix()} trying to start while already started`);
@@ -40,6 +48,9 @@ export default class AutomaticTransactionGenerator {
   }
 
   private startConnectors(): void {
+    if (this.connectorsStatus?.size > 0 && this.connectorsStatus.size !== this.chargingStation.getNumberOfConnectors()) {
+      this.connectorsStatus.clear();
+    }
     for (const connectorId of this.chargingStation.connectors.keys()) {
       if (connectorId > 0) {
         this.startConnector(connectorId);
@@ -63,8 +74,8 @@ export default class AutomaticTransactionGenerator {
         this.stopConnector(connectorId);
         break;
       }
-      if (!this.chargingStation.isRegistered()) {
-        logger.error(this.logPrefix(connectorId) + ' entered in transaction loop while the charging station is not registered');
+      if (!this.chargingStation.isInAcceptedState()) {
+        logger.error(this.logPrefix(connectorId) + ' entered in transaction loop while the charging station is not in accepted state');
         this.stopConnector(connectorId);
         break;
       }