X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Fcharging-station%2FAutomaticTransactionGenerator.ts;h=95483b8ec54dd80072f9fe48171e45fe08761de0;hb=d990f4bc8ad5366a200fd3d89be76c084fd71cea;hp=3d53fc812488b7c8a9b7b47d72460510ec8aca8c;hpb=a19b897d3aa5cb0f12177a42d8168121ce6ada97;p=e-mobility-charging-stations-simulator.git diff --git a/src/charging-station/AutomaticTransactionGenerator.ts b/src/charging-station/AutomaticTransactionGenerator.ts index 3d53fc81..95483b8e 100644 --- a/src/charging-station/AutomaticTransactionGenerator.ts +++ b/src/charging-station/AutomaticTransactionGenerator.ts @@ -19,7 +19,7 @@ import { } from '../types/index.js' import { Constants, - cloneObject, + clone, convertToDate, formatDurationMilliSeconds, getRandomInteger, @@ -66,7 +66,12 @@ export class AutomaticTransactionGenerator { return AutomaticTransactionGenerator.instances.get(chargingStation.stationInfo!.hashId) } - public start (): void { + public static deleteInstance (chargingStation: ChargingStation): boolean { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + return AutomaticTransactionGenerator.instances.delete(chargingStation.stationInfo!.hashId) + } + + public start (stopAbsoluteDuration?: boolean): void { if (!checkChargingStation(this.chargingStation, this.logPrefix())) { return } @@ -79,7 +84,7 @@ export class AutomaticTransactionGenerator { return } this.starting = true - this.startConnectors() + this.startConnectors(stopAbsoluteDuration) this.started = true this.starting = false } @@ -99,7 +104,7 @@ export class AutomaticTransactionGenerator { this.stopping = false } - public startConnector (connectorId: number): void { + public startConnector (connectorId: number, stopAbsoluteDuration?: boolean): void { if (!checkChargingStation(this.chargingStation, this.logPrefix(connectorId))) { return } @@ -108,7 +113,7 @@ export class AutomaticTransactionGenerator { throw new BaseError(`Connector ${connectorId} does not exist`) } if (this.connectorsStatus.get(connectorId)?.start === false) { - this.internalStartConnector(connectorId).catch(Constants.EMPTY_FUNCTION) + this.internalStartConnector(connectorId, stopAbsoluteDuration).catch(Constants.EMPTY_FUNCTION) } else if (this.connectorsStatus.get(connectorId)?.start === true) { logger.warn(`${this.logPrefix(connectorId)} is already started on connector`) } @@ -127,7 +132,7 @@ export class AutomaticTransactionGenerator { } } - private startConnectors (): void { + private startConnectors (stopAbsoluteDuration?: boolean): void { if ( this.connectorsStatus.size > 0 && this.connectorsStatus.size !== this.chargingStation.getNumberOfConnectors() @@ -139,14 +144,14 @@ export class AutomaticTransactionGenerator { for (const [evseId, evseStatus] of this.chargingStation.evses) { if (evseId > 0) { for (const connectorId of evseStatus.connectors.keys()) { - this.startConnector(connectorId) + this.startConnector(connectorId, stopAbsoluteDuration) } } } } else { for (const connectorId of this.chargingStation.connectors.keys()) { if (connectorId > 0) { - this.startConnector(connectorId) + this.startConnector(connectorId, stopAbsoluteDuration) } } } @@ -170,8 +175,11 @@ export class AutomaticTransactionGenerator { } } - private async internalStartConnector (connectorId: number): Promise { - this.setStartConnectorStatus(connectorId) + private async internalStartConnector ( + connectorId: number, + stopAbsoluteDuration?: boolean + ): Promise { + this.setStartConnectorStatus(connectorId, stopAbsoluteDuration) logger.info( `${this.logPrefix( connectorId @@ -185,6 +193,7 @@ export class AutomaticTransactionGenerator { while (this.connectorsStatus.get(connectorId)?.start === true) { await this.waitChargingStationAvailable(connectorId) await this.waitConnectorAvailable(connectorId) + await this.waitRunningTransactionStopped(connectorId) if (!this.canStartConnector(connectorId)) { this.stopConnector(connectorId) break @@ -257,12 +266,15 @@ export class AutomaticTransactionGenerator { ) } - private setStartConnectorStatus (connectorId: number): void { + private setStartConnectorStatus ( + connectorId: number, + stopAbsoluteDuration = this.chargingStation.getAutomaticTransactionGeneratorConfiguration() + ?.stopAbsoluteDuration + ): void { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion this.connectorsStatus.get(connectorId)!.startDate = new Date() if ( - this.chargingStation.getAutomaticTransactionGeneratorConfiguration()?.stopAbsoluteDuration === - false || + stopAbsoluteDuration === false || // eslint-disable-next-line @typescript-eslint/no-non-null-assertion !isValidDate(this.connectorsStatus.get(connectorId)!.stopDate) ) { @@ -317,6 +329,15 @@ export class AutomaticTransactionGenerator { ) return false } + const connectorStatus = this.chargingStation.getConnectorStatus(connectorId) + if (connectorStatus?.transactionStarted === true) { + logger.info( + `${this.logPrefix( + connectorId + )} entered in transaction loop while a transaction ${connectorStatus.transactionId} is already started on connector ${connectorId}` + ) + return false + } return true } @@ -331,7 +352,7 @@ export class AutomaticTransactionGenerator { ) logged = true } - await sleep(Constants.CHARGING_STATION_ATG_AVAILABILITY_TIME) + await sleep(Constants.DEFAULT_ATG_WAIT_TIME) } } @@ -346,7 +367,23 @@ export class AutomaticTransactionGenerator { ) logged = true } - await sleep(Constants.CHARGING_STATION_ATG_AVAILABILITY_TIME) + await sleep(Constants.DEFAULT_ATG_WAIT_TIME) + } + } + + private async waitRunningTransactionStopped (connectorId: number): Promise { + const connectorStatus = this.chargingStation.getConnectorStatus(connectorId) + let logged = false + while (connectorStatus?.transactionStarted === true) { + if (!logged) { + logger.info( + `${this.logPrefix( + connectorId + )} transaction loop waiting for started transaction ${connectorStatus.transactionId} on connector ${connectorId} to be stopped` + ) + logged = true + } + await sleep(Constants.DEFAULT_ATG_WAIT_TIME) } } @@ -369,22 +406,23 @@ export class AutomaticTransactionGenerator { } private getConnectorStatus (connectorId: number): Status { - const connectorStatus = - this.chargingStation.getAutomaticTransactionGeneratorStatuses()?.[connectorId - 1] != null - ? cloneObject( - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - this.chargingStation.getAutomaticTransactionGeneratorStatuses()![connectorId - 1] - ) - : undefined + const statusIndex = connectorId - 1 + let connectorStatus: Status | undefined + if (this.chargingStation.getAutomaticTransactionGeneratorStatuses()?.[statusIndex] != null) { + connectorStatus = clone( + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + this.chargingStation.getAutomaticTransactionGeneratorStatuses()![statusIndex] + ) + } else if (this.chargingStation.getAutomaticTransactionGeneratorStatuses() != null) { + logger.warn( + `${this.logPrefix(connectorId)} no status found for connector #${connectorId} in charging station configuration file. New status will be created` + ) + } if (connectorStatus != null) { - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - connectorStatus.startDate = convertToDate(connectorStatus.startDate)! - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - connectorStatus.lastRunDate = convertToDate(connectorStatus.lastRunDate)! - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - connectorStatus.stopDate = convertToDate(connectorStatus.stopDate)! - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - connectorStatus.stoppedDate = convertToDate(connectorStatus.stoppedDate)! + connectorStatus.startDate = convertToDate(connectorStatus.startDate) + connectorStatus.lastRunDate = convertToDate(connectorStatus.lastRunDate) + connectorStatus.stopDate = convertToDate(connectorStatus.stopDate) + connectorStatus.stoppedDate = convertToDate(connectorStatus.stoppedDate) if ( !this.started && (connectorStatus.start ||