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';
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`);
}
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);
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;
}