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 {
- for (const connector in this.chargingStation.connectors) {
- const connectorId = Utils.convertToInt(connector);
+ 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);
}
}
private stopConnectors(): void {
- for (const connector in this.chargingStation.connectors) {
- const connectorId = Utils.convertToInt(connector);
+ for (const connectorId of this.chargingStation.connectors.keys()) {
if (connectorId > 0) {
this.stopConnector(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;
}
// Wait until end of transaction
const waitTrxEnd = Utils.getRandomInteger(this.chargingStation.stationInfo.AutomaticTransactionGenerator.maxDuration,
this.chargingStation.stationInfo.AutomaticTransactionGenerator.minDuration) * 1000;
- logger.info(this.logPrefix(connectorId) + ' transaction ' + this.chargingStation.getConnector(connectorId).transactionId.toString() + ' started and will stop in ' + Utils.formatDurationMilliSeconds(waitTrxEnd));
+ logger.info(this.logPrefix(connectorId) + ' transaction ' + this.chargingStation.getConnectorStatus(connectorId).transactionId.toString() + ' started and will stop in ' + Utils.formatDurationMilliSeconds(waitTrxEnd));
this.connectorsStatus.get(connectorId).acceptedStartTransactionRequests++;
await Utils.sleep(waitTrxEnd);
// Stop transaction
- logger.info(this.logPrefix(connectorId) + ' stop transaction ' + this.chargingStation.getConnector(connectorId).transactionId.toString());
+ logger.info(this.logPrefix(connectorId) + ' stop transaction ' + this.chargingStation.getConnectorStatus(connectorId).transactionId.toString());
await this.stopTransaction(connectorId);
}
} else {
const beginId = PerformanceStatistics.beginMeasure(measureId);
let transactionId = 0;
let stopResponse: StopTransactionResponse;
- if (this.chargingStation.getConnector(connectorId)?.transactionStarted) {
- transactionId = this.chargingStation.getConnector(connectorId).transactionId;
+ if (this.chargingStation.getConnectorStatus(connectorId)?.transactionStarted) {
+ transactionId = this.chargingStation.getConnectorStatus(connectorId).transactionId;
stopResponse = await this.chargingStation.ocppRequestService.sendStopTransaction(transactionId,
this.chargingStation.getEnergyActiveImportRegisterByTransactionId(transactionId),
this.chargingStation.getTransactionIdTag(transactionId),