Bump patch level is firmware version at reboot at firmware update
authorJérôme Benoit <jerome.benoit@sap.com>
Mon, 9 Jan 2023 12:42:49 +0000 (13:42 +0100)
committerJérôme Benoit <jerome.benoit@sap.com>
Mon, 9 Jan 2023 12:42:49 +0000 (13:42 +0100)
Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com>
src/charging-station/ChargingStation.ts
src/charging-station/ocpp/1.6/OCPP16IncomingRequestService.ts
src/utils/Constants.ts

index 8d7907bad7c111968344a10502dd7df1224133a6..84aa81ca649336eda64779744c87600ac5d9a098 100644 (file)
@@ -825,21 +825,6 @@ export default class ChargingStation {
       'supervisionUrl',
       'supervisionUrls'
     );
-    const firmwareVersionRegExp = stationTemplate.firmwareVersionPattern
-      ? new RegExp(stationTemplate.firmwareVersionPattern)
-      : Constants.SEMVER_REGEXP;
-    if (
-      stationTemplate.firmwareVersion &&
-      firmwareVersionRegExp.test(stationTemplate.firmwareVersion) === false
-    ) {
-      logger.warn(
-        `${this.logPrefix()} Firmware version '${
-          stationTemplate.firmwareVersion
-        }' in template file ${
-          this.templateFile
-        } does not match regular expression '${firmwareVersionRegExp.toString()}'`
-      );
-    }
     const stationInfo: ChargingStationInfo =
       ChargingStationUtils.stationTemplateToStationInfo(stationTemplate);
     stationInfo.hashId = ChargingStationUtils.getHashId(this.index, stationTemplate);
@@ -862,6 +847,18 @@ export default class ChargingStation {
           ? stationTemplate.power * 1000
           : stationTemplate.power;
     }
+    stationInfo.firmwareVersionPattern =
+      stationTemplate.firmwareVersionPattern ?? Constants.SEMVER_PATTERN;
+    if (
+      stationInfo.firmwareVersion &&
+      new RegExp(stationInfo.firmwareVersionPattern).test(stationInfo.firmwareVersion) === false
+    ) {
+      logger.warn(
+        `${this.logPrefix()} Firmware version '${stationInfo.firmwareVersion}' in template file ${
+          this.templateFile
+        } does not match firmware version pattern '${stationInfo.firmwareVersionPattern}'`
+      );
+    }
     stationInfo.resetTime = stationTemplate.resetTime
       ? stationTemplate.resetTime * 1000
       : Constants.CHARGING_STATION_DEFAULT_RESET_TIME;
@@ -1000,6 +997,18 @@ export default class ChargingStation {
         status: RegistrationStatusEnumType.ACCEPTED,
       };
     }
+    if (
+      this.stationInfo.firmwareStatus === FirmwareStatus.Installing &&
+      this.stationInfo.firmwareVersion &&
+      this.stationInfo.firmwareVersionPattern
+    ) {
+      const match = this.stationInfo.firmwareVersion
+        .match(new RegExp(this.stationInfo.firmwareVersionPattern))
+        .slice(1, this.stationInfo.firmwareVersion.split('.').length + 1);
+      const patchLevelIndex = match.length - 1;
+      match[patchLevelIndex] = (Utils.convertToInt(match[patchLevelIndex]) + 1).toString();
+      this.stationInfo.firmwareVersion = match.join('.');
+    }
   }
 
   private initializeOcppConfiguration(): void {
@@ -1846,8 +1855,8 @@ export default class ChargingStation {
         status: FirmwareStatus.Installed,
       });
       this.stationInfo.firmwareStatus = FirmwareStatus.Installed;
-      // TODO: bump firmware version
     }
+
     // Start the ATG
     if (this.getAutomaticTransactionGeneratorConfigurationFromTemplate()?.enable === true) {
       this.startAutomaticTransactionGenerator();
index e0ba24d4b467352ff680151590e9c9e012217082..0df0954feede6f3d681f6dce3eaa151109d38835 100644 (file)
@@ -1082,6 +1082,8 @@ export default class OCPP16IncomingRequestService extends OCPPIncomingRequestSer
           status: OCPP16ChargePointStatus.UNAVAILABLE,
           errorCode: OCPP16ChargePointErrorCode.NO_ERROR,
         });
+        chargingStation.getConnectorStatus(connectorId).status =
+          OCPP16ChargePointStatus.UNAVAILABLE;
       }
     }
     await chargingStation.ocppRequestService.requestHandler<
index fb9e20046ac059ef341f722645a109dfd3f43580..c7e767eb49690fa6177b2d3b939978f0574ed0ef 100644 (file)
@@ -10,8 +10,8 @@ export default class Constants {
   static readonly CHARGING_STATION_ATG_DEFAULT_STOP_AFTER_HOURS = 0.25; // Hours
 
   // See https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string
-  static readonly SEMVER_REGEXP =
-    /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/;
+  static readonly SEMVER_PATTERN =
+    '^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$';
 
   static readonly DEFAULT_CIRCULAR_BUFFER_CAPACITY = Number.MAX_SAFE_INTEGER;