Add template section to list OCPP commands supported (#129)
[e-mobility-charging-stations-simulator.git] / src / charging-station / ChargingStationUtils.ts
index c63a7f27e67411558c7f6f42b3be66859e2fecfa..c216ed6bec8bae64bb3f2ae84bab9db91ba16d3b 100644 (file)
@@ -1,33 +1,40 @@
-import { ChargingProfile, ChargingSchedulePeriod } from '../types/ocpp/ChargingProfile';
-import { ChargingProfileKindType, RecurrencyKindType } from '../types/ocpp/1.6/ChargingProfile';
+import crypto from 'crypto';
+import path from 'path';
+import { fileURLToPath } from 'url';
+
+import moment from 'moment';
+
+import BaseError from '../exception/BaseError';
+import ChargingStationInfo from '../types/ChargingStationInfo';
 import ChargingStationTemplate, {
   AmpereUnits,
   CurrentType,
   Voltage,
 } from '../types/ChargingStationTemplate';
-import { MeterValueMeasurand, MeterValuePhase } from '../types/ocpp/MeterValues';
-
-import BaseError from '../exception/BaseError';
-import { BootNotificationRequest } from '../types/ocpp/Requests';
-import ChargingStation from './ChargingStation';
-import { ChargingStationConfigurationUtils } from './ChargingStationConfigurationUtils';
-import ChargingStationInfo from '../types/ChargingStationInfo';
-import Configuration from '../utils/Configuration';
-import Constants from '../utils/Constants';
-import { FileType } from '../types/FileType';
-import FileUtils from '../utils/FileUtils';
 import { SampledValueTemplate } from '../types/MeasurandPerPhaseSampledValueTemplates';
+import { ChargingProfileKindType, RecurrencyKindType } from '../types/ocpp/1.6/ChargingProfile';
+import { ChargingProfile, ChargingSchedulePeriod } from '../types/ocpp/ChargingProfile';
 import { StandardParametersKey } from '../types/ocpp/Configuration';
-import Utils from '../utils/Utils';
+import { MeterValueMeasurand, MeterValuePhase } from '../types/ocpp/MeterValues';
+import {
+  BootNotificationRequest,
+  IncomingRequestCommand,
+  RequestCommand,
+} from '../types/ocpp/Requests';
 import { WebSocketCloseEventStatusString } from '../types/WebSocket';
 import { WorkerProcessType } from '../types/Worker';
-import crypto from 'crypto';
-import fs from 'fs';
+import Configuration from '../utils/Configuration';
+import Constants from '../utils/Constants';
 import logger from '../utils/Logger';
-import moment from 'moment';
-import path from 'path';
+import Utils from '../utils/Utils';
+import ChargingStation from './ChargingStation';
+import { ChargingStationConfigurationUtils } from './ChargingStationConfigurationUtils';
 
 export class ChargingStationUtils {
+  private constructor() {
+    // This is intentional
+  }
+
   public static getChargingStationId(
     index: number,
     stationTemplate: ChargingStationTemplate
@@ -159,12 +166,12 @@ export class ChargingStationUtils {
 
   public static workerPoolInUse(): boolean {
     return [WorkerProcessType.DYNAMIC_POOL, WorkerProcessType.STATIC_POOL].includes(
-      Configuration.getWorkerProcess()
+      Configuration.getWorker().processType
     );
   }
 
   public static workerDynamicPoolInUse(): boolean {
-    return Configuration.getWorkerProcess() === WorkerProcessType.DYNAMIC_POOL;
+    return Configuration.getWorker().processType === WorkerProcessType.DYNAMIC_POOL;
   }
 
   /**
@@ -235,20 +242,11 @@ export class ChargingStationUtils {
   }
 
   public static createStationInfoHash(stationInfo: ChargingStationInfo): void {
-    const previousInfoHash = stationInfo?.infoHash ?? '';
     delete stationInfo.infoHash;
-    const currentInfoHash = crypto
+    stationInfo.infoHash = crypto
       .createHash(Constants.DEFAULT_HASH_ALGORITHM)
       .update(JSON.stringify(stationInfo))
       .digest('hex');
-    if (
-      Utils.isEmptyString(previousInfoHash) ||
-      (!Utils.isEmptyString(previousInfoHash) && currentInfoHash !== previousInfoHash)
-    ) {
-      stationInfo.infoHash = currentInfoHash;
-    } else {
-      stationInfo.infoHash = previousInfoHash;
-    }
   }
 
   public static createSerialNumber(
@@ -525,42 +523,39 @@ export class ChargingStationUtils {
     );
   }
 
-  public static getAuthorizedTags(
-    stationInfo: ChargingStationInfo,
-    templateFile: string,
-    logPrefix: string
-  ): string[] {
-    let authorizedTags: string[] = [];
-    const authorizationFile = ChargingStationUtils.getAuthorizationFile(stationInfo);
-    if (authorizationFile) {
-      try {
-        // Load authorization file
-        authorizedTags = JSON.parse(fs.readFileSync(authorizationFile, 'utf8')) as string[];
-      } catch (error) {
-        FileUtils.handleFileException(
-          logPrefix,
-          FileType.Authorization,
-          authorizationFile,
-          error as NodeJS.ErrnoException
-        );
-      }
-    } else {
-      logger.info(logPrefix + ' No authorization file given in template file ' + templateFile);
-    }
-    return authorizedTags;
-  }
-
   public static getAuthorizationFile(stationInfo: ChargingStationInfo): string | undefined {
     return (
       stationInfo.authorizationFile &&
       path.join(
-        path.resolve(__dirname, '../'),
+        path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../'),
         'assets',
         path.basename(stationInfo.authorizationFile)
       )
     );
   }
 
+  public static isCommandSupported(
+    command: RequestCommand | IncomingRequestCommand,
+    stationInfo: ChargingStationInfo
+  ): boolean {
+    if (
+      Object.values(IncomingRequestCommand).includes(command as IncomingRequestCommand) &&
+      !stationInfo?.commandsSupport?.incomingCommands
+    ) {
+      return true;
+    }
+    if (
+      Object.values(RequestCommand).includes(command as RequestCommand) &&
+      !stationInfo?.commandsSupport?.outgoingCommands
+    ) {
+      return true;
+    }
+    return (
+      ((stationInfo?.commandsSupport?.incomingCommands[command] as boolean) ?? false) ||
+      ((stationInfo?.commandsSupport?.outgoingCommands[command] as boolean) ?? false)
+    );
+  }
+
   private static getRandomSerialNumberSuffix(params?: {
     randomBytesLength?: number;
     upperCase?: boolean;