private async startOnConnector(connectorId: number): Promise<void> {
logger.info(this.logPrefix(connectorId) + ' started on connector');
- let transactionSkip = 0;
- let totalTransactionSkip = 0;
+ let skippedTransactions = 0;
+ let skippedTransactionsTotal = 0;
while (this.started) {
if ((new Date()) > this.stopDate) {
await this.stop();
await Utils.sleep(wait);
const start = Utils.secureRandom();
if (start < this.chargingStation.stationInfo.AutomaticTransactionGenerator.probabilityOfStart) {
- transactionSkip = 0;
+ skippedTransactions = 0;
// Start transaction
const startResponse = await this.startTransaction(connectorId);
if (startResponse?.idTagInfo?.status !== AuthorizationStatus.ACCEPTED) {
}
}
} else {
- transactionSkip++;
- totalTransactionSkip++;
- logger.info(this.logPrefix(connectorId) + ' skipped transaction ' + transactionSkip.toString() + '/' + totalTransactionSkip.toString());
+ skippedTransactions++;
+ skippedTransactionsTotal++;
+ logger.info(this.logPrefix(connectorId) + ' skipped transaction ' + skippedTransactions.toString() + '/' + skippedTransactionsTotal.toString());
}
this.lastRunDate = new Date();
}
} catch (error) {
console.error(chalk.red('Bootstrap start error '), error);
}
+ } else {
+ console.error(chalk.red('Cannot start an already started charging stations simulator'));
}
}
if (isMainThread && this.started) {
await Bootstrap.workerImplementation.stop();
await Bootstrap.storage.close();
+ } else {
+ console.error(chalk.red('Trying to stop the charging stations simulator while not started'));
}
this.started = false;
}
minutesStr = '0' + minutes.toString();
}
if (seconds < 10) {
- secondsStr = ('0' + seconds.toString()).substring(0, 6);
+ secondsStr = '0' + seconds.toString();
}
- return hoursStr + ':' + minutesStr + ':' + secondsStr;
+ return hoursStr + ':' + minutesStr + ':' + secondsStr.substring(0, 6);
}
public static formatDurationSeconds(duration: number): string {
return Utils.formatDurationMilliSeconds(duration * 1000);
}
- public static removeExtraEmptyLines(tab: string[]): void {
- // Start from the end
- for (let i = tab.length - 1; i > 0; i--) {
- // Two consecutive empty lines?
- if (tab[i].length === 0 && tab[i - 1].length === 0) {
- // Remove the last one
- tab.splice(i, 1);
- }
- // Check last line
- if (i === 1 && tab[i - 1].length === 0) {
- // Remove the first one
- tab.splice(i - 1, 1);
- }
- }
- }
-
public static convertToDate(value: unknown): Date {
// Check
if (!value) {
}
public static getRandomFloat(max: number, min = 0, negative = false): number {
+ if (max < min || min < 0 || max < 0) {
+ throw new RangeError('Invalid interval');
+ }
const randomPositiveFloat = crypto.randomBytes(4).readUInt32LE() / 0xffffffff;
const sign = (negative && randomPositiveFloat < 0.5) ? 1 : -1;
return sign * (randomPositiveFloat * (max - min) + min);
return false;
}
- public static isEmptyJSon(document: unknown): boolean {
- // Empty?
- if (!document) {
- return true;
- }
- // Check type
- if (typeof document !== 'object') {
- return true;
- }
- // Check
- return Object.keys(document).length === 0;
- }
-
public static isString(value: unknown): boolean {
return typeof value === 'string';
}