shayne_lo преди 3 месеца
родител
ревизия
35c3a1e11f
променени са 34 файла, в които са добавени 920 реда и са изтрити 317 реда
  1. 35 11
      ApiTest/MainWindow.xaml
  2. 22 3
      ApiTest/MainWindow.xaml.cs
  3. 4 4
      ApiTest/Properties/AssemblyInfo.cs
  4. 15 0
      AwInitilizer/Converter/MesErrorCodeMaper.cs
  5. 1 0
      AwInitilizer/Initializer.csproj
  6. 74 18
      AwInitilizer/MainWindow.xaml.cs
  7. 7 0
      AwInitilizer/Model/UpdateData.cs
  8. 167 136
      AwInitilizer/Procedure/ButtonStatusCheckPorcedure.cs
  9. 46 3
      AwInitilizer/Procedure/FirmwareBundleUploadProcedure.cs
  10. 25 6
      AwInitilizer/Procedure/FirmwareCheckVersionProcedure.cs
  11. 177 0
      AwInitilizer/Procedure/NetworkInterfaceSetupProcedure.cs
  12. 21 4
      AwInitilizer/Procedure/VersionLogProcedure.cs
  13. 22 8
      AwInitilizer/Procedure/WifRssiCheckProcedure.cs
  14. 4 4
      AwInitilizer/Properties/AssemblyInfo.cs
  15. 9 0
      AwInitilizer/Resx/AppResources.Designer.cs
  16. 3 0
      AwInitilizer/Resx/AppResources.resx
  17. 3 0
      AwInitilizer/Resx/AppResources.zh-CHS.resx
  18. 4 0
      ConfigEditor/MainWindow.xaml
  19. 4 4
      ConfigEditor/Properties/AssemblyInfo.cs
  20. 3 1
      ConfigEditor/SubPage/EvseConfig/EvseConfigPanel.xaml
  21. 63 22
      ConfigEditor/SubPage/EvseConfig/EvseConfigPanel.xaml.cs
  22. 3 2
      ConfigEditor/SubPage/EvseConfig/FirmwareVersionPanel.xaml.cs
  23. 25 0
      CsuWebApiLib/EvApi.cs
  24. 4 3
      CsuWebApiLib/Model/ButtonStatus.cs
  25. 4 4
      CsuWebApiLib/Properties/AssemblyInfo.cs
  26. 4 4
      Editor/Properties/AssemblyInfo.cs
  27. 1 1
      GitVersion.yml
  28. 40 56
      InitializerModel/EvseSettingConfig.cs
  29. 110 0
      InitializerModel/EvseSettingConfigCompatableModel.cs
  30. 8 12
      InitializerModel/EvseSettingConfigModel.cs
  31. 1 0
      InitializerModel/InitializerModel.csproj
  32. 4 4
      InitializerModel/Properties/AssemblyInfo.cs
  33. 3 3
      Initilizer/AssemblyInfo.cs
  34. 4 4
      MesAdaptor/Properties/AssemblyInfo.cs

+ 35 - 11
ApiTest/MainWindow.xaml

@@ -14,32 +14,49 @@
             <RowDefinition Height="50" />
             <RowDefinition Height="*" />
         </Grid.RowDefinitions>
-        <StackPanel Orientation="Horizontal">
-            <TextBlock VerticalAlignment="Center" Text="IP" />
-            <TextBox
+        <Grid Grid.Row="0">
+            <StackPanel Orientation="Horizontal" HorizontalAlignment="Left">
+                <TextBlock VerticalAlignment="Center" Text="IP" />
+                <TextBox
                 x:Name="uxIp"
                 Width="120"
                 VerticalAlignment="Center"
                 Text="192.168.1.10" />
-            <TextBlock VerticalAlignment="Center" Text="account" />
-            <TextBox
+                <TextBlock VerticalAlignment="Center" Text="account" />
+                <TextBox
                 x:Name="uxAccount"
                 Width="120"
                 VerticalAlignment="Center"
                 Text="" />
-            <TextBlock VerticalAlignment="Center" Text="pass" />
-            <TextBox
+                <TextBlock VerticalAlignment="Center" Text="pass" />
+                <TextBox
                 x:Name="uxPass"
                 Width="120"
                 VerticalAlignment="Center"
                 Text="" />
-        </StackPanel>
+            </StackPanel>
+            <StackPanel Orientation="Horizontal" HorizontalAlignment="Right">
+                <TextBlock VerticalAlignment="Center" Text="p0" />
+                <TextBox
+                x:Name="uxP0"
+                Width="120"
+                VerticalAlignment="Center"
+                Text="" />
+                <TextBlock VerticalAlignment="Center" Text="p1" />
+                <TextBox
+                x:Name="uxP1"
+                Width="120"
+                VerticalAlignment="Center"
+                Text="" />
+            </StackPanel>
+        </Grid>
         <Grid Grid.Row="1">
             <Grid.ColumnDefinitions>
-                <ColumnDefinition Width="150" />
+                <ColumnDefinition Width="170" />
                 <ColumnDefinition Width="*" />
             </Grid.ColumnDefinitions>
-            <StackPanel Grid.Column="0">
+            <ScrollViewer HorizontalScrollBarVisibility="Disabled" Grid.Column="0">
+            <StackPanel >
                 <Button Margin="5" Click="GetVersion_Click">
                     <TextBlock Text="GetVersion" />
                 </Button>
@@ -76,7 +93,14 @@
                 <Button Margin="5" Click="BtnStatus_Click">
                     <TextBlock Text="BtnStatus" />
                 </Button>
-            </StackPanel>
+                <Button Margin="5" Click="SetWifiStation_Click">
+                    <TextBlock Text="SetWifiStation" />
+                </Button>
+                <Button Margin="5" Click="SetTelcom_Click">
+                    <TextBlock Text="EnableTelcom" />
+                </Button>
+                </StackPanel>
+            </ScrollViewer>
             <TextBox
                 x:Name="uxResult"
                 Grid.Column="1"

+ 22 - 3
ApiTest/MainWindow.xaml.cs

@@ -26,12 +26,15 @@ namespace ApiTest
         {
             InitializeComponent();
 
+            uxIp.Text = "192.168.100.1";
+            uxAccount.Text = "account";
+            uxPass.Text = "password";
+
+#if DEBUG
             uxIp.Text = "192.168.80.129";
             uxAccount.Text = "zerova";
             uxPass.Text = "t6sji4j83";
-            //uxIp.Text = "192.168.100.1";
-            //uxAccount.Text = "zerova";
-            //uxPass.Text = "t6sji4j83";
+#endif
         }
 
         private async void GetVersion_Click(object sender, RoutedEventArgs e)
@@ -157,5 +160,21 @@ namespace ApiTest
             var result = await EvApi.GetButtonStatus();
             uxResult.Text = JsonConvert.SerializeObject(result.Result);
         }
+
+        private async void SetWifiStation_Click(object sender, RoutedEventArgs e)
+        {
+            TryUpdateConfig();
+
+            var result = await EvApi.SetWifiStationMode(uxP0.Text, uxP1.Text);
+            uxResult.Text = JsonConvert.SerializeObject(result.Response);
+        }
+
+        private async void SetTelcom_Click(object sender, RoutedEventArgs e)
+        {
+            TryUpdateConfig();
+
+            var result = await EvApi.SetTelcomEnabled(true);
+            uxResult.Text = JsonConvert.SerializeObject(result.Response);
+        }
     }
 }

+ 4 - 4
ApiTest/Properties/AssemblyInfo.cs

@@ -50,7 +50,7 @@ using System.Windows;
 //
 // 您可以指定所有的值,也可以使用 '*' 將組建和修訂編號
 // 設為預設,如下所示:
-// [assembly: AssemblyVersion("1.14.2.0")]
-[assembly: AssemblyVersion("1.14.2.0")]
-[assembly: AssemblyFileVersion("1.14.2.0")]
-[assembly: AssemblyInformationalVersion("d85d388")]
+// [assembly: AssemblyVersion("1.15.0.0")]
+[assembly: AssemblyVersion("1.15.0.0")]
+[assembly: AssemblyFileVersion("1.15.0.0")]
+[assembly: AssemblyInformationalVersion("6d350b1")]

+ 15 - 0
AwInitilizer/Converter/MesErrorCodeMaper.cs

@@ -32,6 +32,8 @@ namespace AwInitilizer.Converter
                     return GetMesErrorCode((Procedure.VersionLog.VersionLogProcedure)procedure);
                 case "MacAddressLogProcedure":
                     return GetMesErrorCode((Procedure.MacAddressLog.MacAddressLogProcedure)procedure);
+                case "NetworkInterfaceSetupProcedure":
+                    return GetMesErrorCode((Procedure.NetworkInterfaceSetup.NetworkInterfaceSetupProcedure)procedure);
                 default:
                     return MesErrorCode.None;
             }
@@ -129,6 +131,8 @@ namespace AwInitilizer.Converter
                     return MesErrorCode.GreenButtonTestFail;
                 case Procedure.ButtonStatusCheck.ErrorType.SecondButtonCheckFail:
                     return MesErrorCode.BlueButtonTestFail;
+                case Procedure.ButtonStatusCheck.ErrorType.ThirdButtonCheckFail:
+                    return MesErrorCode.BlueButtonTestFail;
                 case Procedure.ButtonStatusCheck.ErrorType.EmergencyButtonCheckFail:
                     return MesErrorCode.EmergencyButtonTestFail;
             }
@@ -159,5 +163,16 @@ namespace AwInitilizer.Converter
                 return MesErrorCode.ChargerConnectFail;
             return MesErrorCode.None;
         }
+
+        public static MesErrorCode GetMesErrorCode(Procedure.NetworkInterfaceSetup.NetworkInterfaceSetupProcedure procedure)
+        {
+            if (procedure.Error == Procedure.NetworkInterfaceSetup.ErrorType.WiFiSetFailed)
+                return MesErrorCode.WifiModeNotClient;
+            if (procedure.Error == Procedure.NetworkInterfaceSetup.ErrorType.TelcomSetFailed)
+                return MesErrorCode.FourthGenSimInfoMismatch;
+            if (procedure.Error == Procedure.NetworkInterfaceSetup.ErrorType.RestartFailed)
+                return MesErrorCode.FactoryResetFail;
+            return MesErrorCode.None;
+        }
     }
 }

+ 1 - 0
AwInitilizer/Initializer.csproj

@@ -125,6 +125,7 @@
     <Compile Include="Procedure\FirmwareUploadProcedure.cs" />
     <Compile Include="Procedure\DsiableChargeAuthProcedure.cs" />
     <Compile Include="Procedure\MacAddressLogProcedure.cs" />
+    <Compile Include="Procedure\NetworkInterfaceSetupProcedure.cs" />
     <Compile Include="Procedure\VersionLogProcedure.cs" />
     <Compile Include="Procedure\TelcomModemImeiRecordProcedure.cs" />
     <Compile Include="Procedure\WifRssiCheckProcedure.cs" />

+ 74 - 18
AwInitilizer/MainWindow.xaml.cs

@@ -341,14 +341,12 @@ namespace AwInitilizer
                 }
             }
 
-            if (updateData.FirmwareUpdateModels == null)
+            if (updateData.FirmwareUpdateModels != null)
             {
                 //alertMsg += "FirmwareUpdateModels should be decalred\n";
-                alertMsg += Resx.AppResources.FirmwareListNullAlert + "\n";
-                isAvaliable = false;
-            }
-            else
-            {
+                //alertMsg += Resx.AppResources.FirmwareListNullAlert + "\n";
+                //isAvaliable = false;
+
                 foreach (var model in updateData.FirmwareUpdateModels)
                 {
                     if (string.IsNullOrEmpty(model.Module))
@@ -364,11 +362,24 @@ namespace AwInitilizer
                         alertMsg += Resx.AppResources.FirmwareVersionEmptyAlert + "\n";
                         isAvaliable = false;
                     }
+                }
+            }
+
+            if (updateData.PreFlashFirmwareUpdateModels != null)
+            {
+                foreach (var model in updateData.PreFlashFirmwareUpdateModels)
+                {
+                    if (string.IsNullOrEmpty(model.Module))
+                    {
+                        //alertMsg += "Firmware module name is Required\n";
+                        alertMsg += Resx.AppResources.FirmwareNameEmptyAlert + "\n";
+                        isAvaliable = false;
+                    }
 
-                    if (string.IsNullOrEmpty(model.FirmwareFileName))
+                    if (string.IsNullOrEmpty(model.Version))
                     {
-                        //alertMsg += "Firmware file is Required\n";
-                        alertMsg += Resx.AppResources.FirmwareFileEmptyAlert + "\n";
+                        //alertMsg += "Firmware module name is Required\n";
+                        alertMsg += Resx.AppResources.FirmwareVersionEmptyAlert + "\n";
                         isAvaliable = false;
                     }
                 }
@@ -528,11 +539,29 @@ namespace AwInitilizer
             fileWriter.WriteLine($"4G Module Version:{ ViewModel.FourGenModuleVersion}");
             fileWriter.WriteLine($"Is sim insert:{ ViewModel.IsSimInsert}");
             fileWriter.WriteLine($"sim ICCID:{ ViewModel.SimICCID}");
-            fileWriter.WriteLine($"sim IMSI:{ ViewModel.SimIMSI}");
-
-            foreach (var model in ViewModel.FirmwareUpdateModels)
-            {
-                fileWriter.WriteLine($"{model.Module} version:{ model.Version}");
+            fileWriter.WriteLine($"sim IMSI:{ ViewModel.SimIMSI}");
+
+            if (ViewModel.PreFlashFirmwareUpdateModels != null &&
+                ViewModel.PreFlashFirmwareUpdateModels.Count > 0)
+            {
+                fileWriter.WriteLine("==========================");
+                fileWriter.WriteLine($"Preflash firmwares:");
+                foreach (var model in ViewModel.PreFlashFirmwareUpdateModels)
+                {
+                    fileWriter.WriteLine($"{model.Module} version:{model.Version}");
+                }
+            }
+
+
+            if (ViewModel.FirmwareUpdateModels != null &&
+                ViewModel.FirmwareUpdateModels.Count > 0)
+            {
+                fileWriter.WriteLine("==========================");
+                fileWriter.WriteLine($"Flash firmwares:");
+                foreach (var model in ViewModel.FirmwareUpdateModels)
+                {
+                    fileWriter.WriteLine($"{model.Module} version:{model.Version}");
+                }
             }
 
             var procedureList = ViewModel.UpdateProcedure.ToList();
@@ -740,6 +769,10 @@ namespace AwInitilizer
             ViewModel.FirmwareUpdateModels = setting.FirmwareUpdateList is null ?
                 new List<FirmwareUpdateModel>() :
                 setting.FirmwareUpdateList.Where(x => !string.IsNullOrEmpty(x.Module) && !string.IsNullOrEmpty(x.FirmwareFileName)
+                ).ToList();
+            ViewModel.PreFlashFirmwareUpdateModels = setting.PreFlashFirmwareUpdateList is null ?
+                new List<FirmwareUpdateModel>() :
+                setting.PreFlashFirmwareUpdateList.Where(x => !string.IsNullOrEmpty(x.Module) && !string.IsNullOrEmpty(x.FirmwareFileName)
                 ).ToList();
 
             UpdateProcedure();
@@ -752,11 +785,34 @@ namespace AwInitilizer
         {
             List<ProcedureBase> procedures = new List<ProcedureBase>();
 
-            //init intilize procedure list
-
+            //init intilize procedure list
             procedures.Add(new Procedure.BasicInfoUpdate.BasicInfoUpdateProcedure());
-            procedures.Add(new Procedure.FirmwareBundleUpload.FirmwareBundleUploadProcedure());
-            procedures.Add(new Procedure.FirmwareCheckVersion.FirmwareCheckVersionProcedure());
+            procedures.Add(new Procedure.FirmwareBundleUpload.FirmwareBundleUploadProcedure()
+            {
+                Name = "PreFlash Firmware Upload",
+                Content = "Upload preflash Firemware",
+                GetFirmwareUpdateModel = (x) => x.PreFlashFirmwareUpdateModels,
+            });
+            procedures.Add(new Procedure.FirmwareCheckVersion.FirmwareCheckVersionProcedure()
+            {
+                Name = "PreFlash Firmware Version Check",
+                Content = "Wait restart and check preflash firmware versions",
+                GetFirmwareUpdateModel = (x) => x.PreFlashFirmwareUpdateModels,
+            });
+            procedures.Add(new Procedure.FirmwareBundleUpload.FirmwareBundleUploadProcedure()
+            {
+                Name = "Firmware Upload",
+                Content = "Upload all Firemware",
+                GetFirmwareUpdateModel = (x) => x.FirmwareUpdateModels,
+            });
+            procedures.Add(new Procedure.FirmwareCheckVersion.FirmwareCheckVersionProcedure()
+            {
+                Name = "Firmware Version Check",
+                Content = "Wait restart and check firmware versions",
+                GetFirmwareUpdateModel = (x) => x.FirmwareUpdateModels,
+            });
+
+            procedures.Add(new Procedure.NetworkInterfaceSetup.NetworkInterfaceSetupProcedure());
             procedures.Add(new Procedure.FourGenModuleCheck.FourGenModuleCheckProcedure());
             procedures.Add(new Procedure.WifRssiCheck.WifRssiCheckProcedure());
             procedures.Add(new Procedure.TelcomModemImeiRecord.TelcomModemImeiRecordProcedure());

+ 7 - 0
AwInitilizer/Model/UpdateData.cs

@@ -174,5 +174,12 @@ namespace AwInitilizer.Model
             get => _FirmwareUpdateModels;
             set => SetProperty(ref _FirmwareUpdateModels, value);
         }
+
+        private List<FirmwareUpdateModel> _PreFlashFirmwareUpdateModels;
+        public List<FirmwareUpdateModel> PreFlashFirmwareUpdateModels
+        {
+            get => _PreFlashFirmwareUpdateModels;
+            set => SetProperty(ref _PreFlashFirmwareUpdateModels, value);
+        }
     }
 }

+ 167 - 136
AwInitilizer/Procedure/ButtonStatusCheckPorcedure.cs

@@ -2,6 +2,7 @@
 using AwInitilizer.Model;
 using CsuWebApiLib;
 using CsuWebApiLib.Model;
+using FluentFTP;
 using InitializerModel;
 using Newtonsoft.Json;
 using System;
@@ -14,6 +15,7 @@ using System.Security.AccessControl;
 using System.Text;
 using System.Text.RegularExpressions;
 using System.Threading.Tasks;
+using System.Web;
 using System.Windows;
 
 namespace AwInitilizer.Procedure.ButtonStatusCheck
@@ -26,6 +28,7 @@ namespace AwInitilizer.Procedure.ButtonStatusCheck
         FirstButtonCheckFail,
         SecondButtonCheckFail,
         EmergencyButtonCheckFail,
+        ThirdButtonCheckFail
     }
 
     public enum LogEvent
@@ -50,6 +53,11 @@ namespace AwInitilizer.Procedure.ButtonStatusCheck
         };
 
         private HintDialog hintDialog = new HintDialog();
+        private bool isBtn1NeedTest = false;
+        private bool isBtn2NeedTest = false;
+        private bool isBtn3NeedTest = false;
+        private bool isEmergencyNeedTest = false;
+
         public ButtonStatusCheckPorcedure() : base()
         {
             Name = "Button Press Test";
@@ -69,12 +77,7 @@ namespace AwInitilizer.Procedure.ButtonStatusCheck
                 return true;
             }
 
-            //await PressBtnCheck(0);
-            //DismisDialog();
-            //await PressBtnCheck(1);
-            //DismisDialog();
-            //await PressBtnCheck(2);
-            //DismisDialog();
+            UpdateButtonNeedTestVar();
 
             var response = await GetButtonStatus();
             if (response == null)
@@ -92,36 +95,41 @@ namespace AwInitilizer.Procedure.ButtonStatusCheck
             //Logger.Print("Button press Status check Start");
             //MessageBox.Show("Press Button1,Button2,EmergencyButton in order\neach press continuous 2 secondes\nPress Ok to start", "Starting Button test");
 
-            //Button1,Button2,EmergencyButton in order 0,1,2
-            for (int testType = 0; testType < 3; testType++)
+            //Button1,Button2,Button3,EmergencyButton in order 0,1,2,3
+            for (int testType = 0; testType < 4; testType++)
             {
-                if ((testType == 1 || testType == 0) &&
-                    UpdateData.ButtonTestMode == ButtonTestModeType.SkipNormalButton)
-                {
-                    continue;
-                }
-
-                if (testType == 2 &&
-                    UpdateData.ButtonTestMode == ButtonTestModeType.SkipEmergencyButton)
-                {
-                    continue;
+                if ((!isBtn1NeedTest && testType == 0) ||
+                    (!isBtn2NeedTest && testType == 1) ||
+                    (!isBtn3NeedTest && testType == 2) ||
+                    (!isEmergencyNeedTest && testType == 3))
+                {
+                    continue;
                 }
 
                 var checkResult = await PressBtnCheck(testType);
                 if (!checkResult)
                 {
-                    if (testType == 0)
-                        Error = ErrorType.FirstButtonCheckFail;
-                    else if (testType == 1)
-                        Error = ErrorType.SecondButtonCheckFail;
-                    else if (testType == 2)
-                        Error = ErrorType.EmergencyButtonCheckFail;
+                    switch (testType)
+                    {
+                        case 0:
+                            Error = ErrorType.FirstButtonCheckFail;
+                            break;
+                        case 1:
+                            Error = ErrorType.SecondButtonCheckFail;
+                            break;
+                        case 2:
+                            Error = ErrorType.ThirdButtonCheckFail;
+                            break;
+                        case 3:
+                            Error = ErrorType.EmergencyButtonCheckFail;
+                            break;
+                    }
                     return false;
                 }
             }
             return true;
-        }
-
+        }
+
         private async Task<bool> CheckUnpressAllBtn()
         {
             ShowDialog(
@@ -139,56 +147,57 @@ namespace AwInitilizer.Procedure.ButtonStatusCheck
 
             //LogWriter.Report(LogEvent.UnpressButtonTest, string.Format("{0}{1}{2}", status.Button1, status.Button2, status.EmergencyButton));
 
-            LogWriter.Log(string.Format("Button unpress test result : {0}{1}{2}, Expect:000",
-                status.Button1, status.Button2, status.EmergencyButton));
+            LogWriter.Log(string.Format("Button unpress test result : {0}/{1}/{2}/{3}, Expect:0000",
+                status.Button1, status.Button2, status.Button3, status.EmergencyButton));
 
             LogWriter.Log(
-                string.Format("Button1:{0},Button2:{1},EmgerncyButton:{2}",
+                string.Format("Button1:{0},Button2:{1},Button3:{2},EmgerncyButton:{3}",
                     GetBtnStatusString(status.Button1),
                     GetBtnStatusString(status.Button2),
-                    GetBtnStatusString(status.EmergencyButton)));
+                    GetBtnStatusString(status.Button3),
+                    GetBtnStatusString(status.EmergencyButton)
+                ));
 
             bool isAllMatched = true;
             if (status != null)
             {
-                if (UpdateData.ButtonTestMode != ButtonTestModeType.SkipNormalButton)
+                if (isBtn1NeedTest && status.Button1 != 0)
                 {
-                    if (status.Button1 != 0)
-                    {
-                        Error = ErrorType.FirstButtonCheckFail;
-                        LogWriter.Log("Button1 status ERROR, unpress is expected", isError: true);
-                        //Logger.Print("Button1 status ERROR, unpress is expected", isError: true);
-                        isAllMatched = false;
-                    }
-                    if (status.Button2 != 0)
-                    {
-                        Error = ErrorType.SecondButtonCheckFail;
-                        LogWriter.Log("Button2 status ERROR, unpress is expected", isError: true);
-                        //Logger.Print("Button2 status ERROR, unpress is expected", isError: true);
-                        isAllMatched = false;
-                    }
-                }
-
-                if (UpdateData.ButtonTestMode != ButtonTestModeType.SkipEmergencyButton)
+                    Error = ErrorType.FirstButtonCheckFail;
+                    LogWriter.Log("Button1 status ERROR, unpress is expected", isError: true);
+                    isAllMatched = false;
+                }
+
+                if (isBtn2NeedTest && status.Button2 != 0)
                 {
-                    if (status.EmergencyButton != 0)
-                    {
-                        Error = ErrorType.EmergencyButtonCheckFail;
-                        LogWriter.Log("EmergencyButton status ERROR, unpress is expected", isError: true);
-                        //Logger.Print("EmergencyButton status ERROR, unpress is expected", isError: true);
-                        isAllMatched = false;
-                    }
+                    Error = ErrorType.SecondButtonCheckFail;
+                    LogWriter.Log("Button2 status ERROR, unpress is expected", isError: true);
+                    isAllMatched = false;
+                }
+
+                if (isBtn3NeedTest && status.Button3 != 0)
+                {
+                    Error = ErrorType.ThirdButtonCheckFail;
+                    LogWriter.Log("Button3 status ERROR, unpress is expected", isError: true);
+                    isAllMatched = false;
+                }
+
+                if (isEmergencyNeedTest && status.EmergencyButton != 0)
+                {
+                    Error = ErrorType.EmergencyButtonCheckFail;
+                    LogWriter.Log("EmergencyButton status ERROR, unpress is expected", isError: true);
+                    isAllMatched = false;
                 }
 
                 if (isAllMatched)
                 {
                     LogWriter.Log("Unpress Check passed");
-                    LogWriter.Report(LogEvent.UnpressButtonTest, string.Format("{0}{1}{2}", status.Button1, status.Button2, status.EmergencyButton));
+                    LogWriter.Report(LogEvent.UnpressButtonTest, string.Format("{0}{1}{2}{3}", status.Button1, status.Button2, status.Button3, status.EmergencyButton));
                     return true;
                 }
                 else
                 {
-                    LogWriter.Report(LogEvent.UnpressButtonTest, string.Format("{0}{1}{2}", status.Button1, status.Button2, status.EmergencyButton), isError: true);
+                    LogWriter.Report(LogEvent.UnpressButtonTest, string.Format("{0}{1}{2}{3}", status.Button1, status.Button2, status.Button3, status.EmergencyButton), isError: true);
                     return false;
                 }
             }
@@ -206,7 +215,7 @@ namespace AwInitilizer.Procedure.ButtonStatusCheck
             string btn, btnLang, imgUrl;
             (btn, btnLang, imgUrl) = GetBtnParam(btnInt);
 
-            if (btnInt == 2)
+            if (btnInt == 3)
             {
                 ShowEmergencyBtnPressRequestDialog(imgUrl);
             }
@@ -224,15 +233,17 @@ namespace AwInitilizer.Procedure.ButtonStatusCheck
             //LogWriter.Report($"{btn}PressTest", string.Format("{0}{1}{2}", btnStatus.Button1, btnStatus.Button2, btnStatus.EmergencyButton));
             LogWriter.Log($"Press check stage {btn} result:");
             LogWriter.Log(
-                string.Format("Button1:{0},Button2:{1},EmgerncyButton:{2}",
+                string.Format("Button1:{0},Button2:{1},Button3:{2},EmgerncyButton:{3}",
                     GetBtnStatusString(btnStatus.Button1),
                     GetBtnStatusString(btnStatus.Button2),
-                    GetBtnStatusString(btnStatus.EmergencyButton)));
+                    GetBtnStatusString(btnStatus.Button3),
+                    GetBtnStatusString(btnStatus.EmergencyButton)
+                    ));
 
             DismisDialog();
-            var btnStatusIsMatchedRequred = CheckBtnStatus(btnInt, btnStatus);
-            LogWriter.Report($"{btn}PressTest", string.Format("{0}{1}{2}", btnStatus.Button1, btnStatus.Button2, btnStatus.EmergencyButton), isError: !btnStatusIsMatchedRequred);
-            return btnStatusIsMatchedRequred;
+            var btnStatusIsMatchedRequired = CheckOneBtnPressStatus(btnInt, btnStatus);
+            LogWriter.Report($"{btn}PressTest", string.Format("{0}{1}{2}{3}", btnStatus.Button1, btnStatus.Button2, btnStatus.Button3, btnStatus.EmergencyButton), isError: !btnStatusIsMatchedRequired);
+            return btnStatusIsMatchedRequired;
         }
 
         private async Task<ButtonStatus> WaitAndtGetPressBtn()
@@ -249,54 +260,44 @@ namespace AwInitilizer.Procedure.ButtonStatusCheck
                     return null;
                 }
 
-                var isAnyButtonIsPressed = false;
-
-                if (UpdateData.ButtonTestMode != ButtonTestModeType.SkipNormalButton)
+                if (IsAnyButtonPressed(pressStatus))
                 {
-                    if (pressStatus.Button1 != 0 || pressStatus.Button2 != 0 )
-                    {
-                        isAnyButtonIsPressed = true;
-                    }
-                }
-
-                if (UpdateData.ButtonTestMode != ButtonTestModeType.SkipEmergencyButton)
-                {
-                    if (pressStatus.EmergencyButton != 0)
-                    {
-                        isAnyButtonIsPressed = true;
-                    }
-                }
-
-                //if any button is pressed
-                //if (pressStatus.Button1 != 0 ||
-                //    pressStatus.Button2 != 0 ||
-                //    pressStatus.EmergencyButton != 0)
-                if (isAnyButtonIsPressed)
-                {
+
                     await WaitAllBtnRelease();
-                    break;
+                    break;
                 }
             }
             return pressStatus;
         }
 
-        private bool CheckBtnStatus(int btnInt, ButtonStatus buttonStatus)
+        private bool CheckOneBtnPressStatus(int btnInt, ButtonStatus buttonStatus)
         {
-            if (UpdateData.ButtonTestMode != ButtonTestModeType.SkipNormalButton)
+            if (isBtn1NeedTest &&
+                (buttonStatus.Button1 is null || buttonStatus.Button1 == (btnInt == 0 ? 0 : 1))
+                )
             {
-                if (buttonStatus.Button1 == (btnInt == 0 ? 0 : 1) ||
-                    buttonStatus.Button2 == (btnInt == 1 ? 0 : 1))
-                {
-                    return false; 
-                }
+                return false;
             }
 
-            if (UpdateData.ButtonTestMode != ButtonTestModeType.SkipEmergencyButton)
+            if (isBtn2NeedTest &&
+                (buttonStatus.Button2 is null || buttonStatus.Button2 == (btnInt == 1 ? 0 : 1))
+                )
             {
-                if (buttonStatus.EmergencyButton == (btnInt == 2 ? 0 : 1))
-                {
-                    return false;
-                }
+                return false;
+            }
+
+            if (isBtn3NeedTest &&
+                (buttonStatus.Button3 is null || buttonStatus.Button3 == (btnInt == 2 ? 0 : 1))
+                )
+            {
+                return false;
+            }
+
+            if (isEmergencyNeedTest &&
+                (buttonStatus.EmergencyButton is null || buttonStatus.EmergencyButton == (btnInt == 3 ? 0 : 1))
+                )
+            {
+                return false;
             }
 
             return true;
@@ -323,17 +324,22 @@ namespace AwInitilizer.Procedure.ButtonStatusCheck
             string btn, btnLang, imgUrl;
             switch (btnInt)
             {
-                case 1:
-                    btn = "Green Button";
-                    btnLang = Resx.AppResources.BtnPressGreenBtn;
-                    imgUrl = "pack://application:,,,/AwInitilizer;component/Image/Green.png";
-                    break;
                 case 0:
                     btn = "Blue Button";
                     btnLang = Resx.AppResources.BtnPressBlueBtn;
                     imgUrl = "pack://application:,,,/AwInitilizer;component/Image/Blue.png";
                     break;
+                case 1:
+                    btn = "Green Button";
+                    btnLang = Resx.AppResources.BtnPressGreenBtn;
+                    imgUrl = "pack://application:,,,/AwInitilizer;component/Image/Green.png";
+                    break;
                 case 2:
+                    btn = "Third Button";
+                    btnLang = Resx.AppResources.BtnPressThirdBtn;
+                    imgUrl = "";
+                    break;
+                case 3:
                     btn = "EmergencyButton";
                     btnLang = Resx.AppResources.BtnPressEmergencyBtn;
                     imgUrl = "pack://application:,,,/AwInitilizer;component/Image/Emergency.png";
@@ -349,41 +355,20 @@ namespace AwInitilizer.Procedure.ButtonStatusCheck
 
         private async Task WaitAllBtnRelease()
         {
-            ButtonStatus status;
+            ButtonStatus pressStatus;
             //wait release
             for (var releaseCnt = 0; releaseCnt < 20; releaseCnt++)
             {
                 await Task.Delay(500);
-                status = await GetButtonStatus();
-                if (status == null)
+                pressStatus = await GetButtonStatus();
+                if (pressStatus == null)
                 {
                     //InfoLog += "Get Butoon state failed\n";
                     //Logger.Print("Get Butoon state failed");
                     continue;
                 }
 
-                bool isAllBtnReleased = true;
-
-                if (UpdateData.ButtonTestMode != ButtonTestModeType.SkipNormalButton)
-                {
-                    if (status.Button1 != 0 || status.Button2 != 0)
-                    {
-                        isAllBtnReleased = false;
-                    }
-                }
-
-                if (UpdateData.ButtonTestMode != ButtonTestModeType.SkipEmergencyButton)
-                {
-                    if (status.EmergencyButton != 0)
-                    {
-                        isAllBtnReleased = false;
-                    }
-                }
-
-                //if (status.Button1 == 0 &&
-                //    status.Button2 == 0 &&
-                //    status.EmergencyButton == 0)
-                if (isAllBtnReleased)
+                if (!IsAnyButtonPressed(pressStatus))
                 {
                     break;
                 }
@@ -411,14 +396,19 @@ namespace AwInitilizer.Procedure.ButtonStatusCheck
             return null;
         }
 
-        private string GetBtnStatusString(int status)
+        private string GetBtnStatusString(int? status)
         {
-            if (status == 1)
-                return "Pressed";
-            else if (status == 0)
-                return "Unpressed";
-            else
-                return status.ToString();
+            switch (status)
+            {
+                case 1:
+                    return "Pressed";
+                case 0:
+                    return "Unpressed";
+                case null:
+                    return "Unknown";
+                default:
+                    return status.ToString();
+            }
         }
 
         private void ShowDialog(string msg, string title, string btnText, string imgUrl, bool cancelAble)
@@ -448,6 +438,47 @@ namespace AwInitilizer.Procedure.ButtonStatusCheck
             if (hintDialog == null)
                 return;
             hintDialog.Close();
+        }
+
+        private void UpdateButtonNeedTestVar()
+        {
+            isBtn1NeedTest = false; 
+            isBtn2NeedTest = false; 
+            isBtn3NeedTest = false; 
+            isEmergencyNeedTest = false;
+
+            switch (UpdateData.ButtonTestMode)
+            {
+                case ButtonTestModeType.TwoButtonsWithEmergencyButton:
+                    isBtn1NeedTest = true;
+                    isBtn2NeedTest = true;
+                    isEmergencyNeedTest= true;
+                    break;
+                case ButtonTestModeType.SkipButtonTest:
+                    break;
+                case ButtonTestModeType.EmergencyButtonOnly:
+                    isEmergencyNeedTest = true;
+                    break;
+                case ButtonTestModeType.TwoButtons:
+                    isBtn1NeedTest = true;
+                    isBtn2NeedTest = true;
+                    break;
+                case ButtonTestModeType.ThreeButtonsWithEmergencyButton:
+                    isBtn1NeedTest = true;
+                    isBtn2NeedTest = true;
+                    isBtn3NeedTest= true;
+                    isEmergencyNeedTest = true;
+                    break;
+            }
+        }
+
+        private bool IsAnyButtonPressed(ButtonStatus pressStatus)
+        {
+            return 
+                (isBtn1NeedTest && pressStatus.Button1 == 1) ||
+                (isBtn2NeedTest && pressStatus.Button2 == 1) ||
+                (isEmergencyNeedTest && pressStatus.EmergencyButton == 1) ||
+                (isBtn3NeedTest && pressStatus.Button3 == 1);
         }
     }
 }

+ 46 - 3
AwInitilizer/Procedure/FirmwareBundleUploadProcedure.cs

@@ -12,6 +12,8 @@ using System.Web;
 using System.IO;
 using System.Runtime.InteropServices;
 using CsuWebApiLib;
+using InitializerModel;
+using Newtonsoft.Json;
 
 namespace AwInitilizer.Procedure.FirmwareBundleUpload
 {
@@ -33,6 +35,8 @@ namespace AwInitilizer.Procedure.FirmwareBundleUpload
     {
         public ErrorType Error { get; set; } = ErrorType.None;
 
+        public Func<UpdateData, List<FirmwareUpdateModel>> GetFirmwareUpdateModel { get; set; }
+
         private ProcedureLog.LogWriter<FirmwareBundleUploadProcedure, LogEvent> LogWriter;
 
         private readonly static Dictionary<LogEvent, string> ReportDict = new Dictionary<LogEvent, string>()
@@ -61,6 +65,13 @@ namespace AwInitilizer.Procedure.FirmwareBundleUpload
 
         internal override async Task<bool> Run()
         {
+            var updateList = GetUpdateList();
+            if (updateList == null || updateList.Count == 0)
+            {
+                LogWriter.Log("firmware list empty, skip procedure");
+                return true;
+            }
+
             bool response = false;
             int pollingCnt = 0;
             for (pollingCnt = 0; pollingCnt < 56; pollingCnt++)
@@ -84,6 +95,12 @@ namespace AwInitilizer.Procedure.FirmwareBundleUpload
 
             LogWriter.Report(LogEvent.UploadStartWait, "success");
 
+            //prerecord frimware version
+            var versions = await GetVersion();
+            if (versions != null)
+            {
+                LogWriter.Log("precorded versions: " + JsonConvert.SerializeObject(versions));
+            }
 
             //upload firmware
             bool result = false;
@@ -106,7 +123,7 @@ namespace AwInitilizer.Procedure.FirmwareBundleUpload
 
         private async Task<bool> UploadWithHttpWebRequest()
         {
-            var updateList = UpdateData.FirmwareUpdateModels;
+            var updateList = GetUpdateList();
             //open all file stream
             //List<FileStream> firmwareFileStream = new List<FileStream>();
             List<UploadFile> UploadFileList = new List<UploadFile>();
@@ -182,7 +199,7 @@ namespace AwInitilizer.Procedure.FirmwareBundleUpload
 
         private async Task<bool> UploadWithApiClass()
         {
-            var updateList = UpdateData.FirmwareUpdateModels;
+            var updateList = GetUpdateList();
             var updateNameList = updateList
                 .Where(x => !string.IsNullOrEmpty(x.FirmwareFileName))
                 .Select(x => x.FirmwareFileName)
@@ -194,7 +211,7 @@ namespace AwInitilizer.Procedure.FirmwareBundleUpload
 
         private async Task<bool> UploadWithRestSharp()
         {
-            var updateList = UpdateData.FirmwareUpdateModels;
+            var updateList = GetUpdateList();
 
             var restClient = new RestSharp.RestClient($"https://{ServerIpAddress}");
             restClient.ConfigureWebRequest((r) => { r.KeepAlive = true; });
@@ -235,6 +252,32 @@ namespace AwInitilizer.Procedure.FirmwareBundleUpload
             }
         }
 
+        private List<FirmwareUpdateModel> GetUpdateList()
+        {
+            var updateList = UpdateData.FirmwareUpdateModels;
+            if (GetFirmwareUpdateModel != null)
+            {
+                updateList = GetFirmwareUpdateModel(UpdateData);
+            }
+            return updateList;
+        }
+
+        internal async Task<Dictionary<string, string>> GetVersion()
+        {
+            try
+            {
+                var result = await EvApi.GetVersion();
+                LogWriter.Log($"get version response:{result.Response}\n", isDebugLog: true);
+                return result.Result;
+            }
+            catch (Exception e)
+            {
+                LogWriter.Log("Get Version Failed", isError: true);
+                LogWriter.Log(e.Message, isDebugLog: true);
+                return null;
+            }
+        }
+
         public async Task<byte[]> UploadFilesRestSharp(string address, IEnumerable<string> files, NameValueCollection values)
         {
             var restClient = new RestSharp.RestClient(address);

+ 25 - 6
AwInitilizer/Procedure/FirmwareCheckVersionProcedure.cs

@@ -1,5 +1,6 @@
 
 using AwInitilizer.Assist;
+using AwInitilizer.Model;
 using CsuWebApiLib;
 using InitializerModel;
 using Newtonsoft.Json;
@@ -27,7 +28,8 @@ namespace AwInitilizer.Procedure.FirmwareCheckVersion
 
     public class FirmwareCheckVersionProcedure : ProcedureBase
     {
-        public ErrorType Error { get; set; } = ErrorType.None;
+        public ErrorType Error { get; set; } = ErrorType.None;
+        public Func<UpdateData, List<FirmwareUpdateModel>> GetFirmwareUpdateModel { get; set; }
 
         private ProcedureLog.LogWriter<FirmwareCheckVersionProcedure, LogEvent> LogWriter;
 
@@ -51,13 +53,20 @@ namespace AwInitilizer.Procedure.FirmwareCheckVersion
             };
         }
 
-        internal override Task<bool> Run()
+        internal override async Task<bool> Run()
         {
+            var updateList = GetUpdateList();
+            if (updateList == null || updateList.Count == 0)
+            {
+                LogWriter.Log("firmware list empty, skip procedure");
+                return true;
+            }
+
             if (UpdateData.IsIdleCheckPass)
             {
-                return RunWithNoBootCheck();
+                return await RunWithNoBootCheck();
             }
-            return RunWithBootCheck();
+            return await RunWithBootCheck();
         }
 
         internal async Task<bool> RunWithNoBootCheck()
@@ -109,7 +118,7 @@ namespace AwInitilizer.Procedure.FirmwareCheckVersion
 
             //get version 
             var versionPair = await GetVersion();
-            var updatedList = UpdateData.FirmwareUpdateModels;
+            var updatedList = GetUpdateList();
 
             if (versionPair == null)
             {
@@ -135,7 +144,7 @@ namespace AwInitilizer.Procedure.FirmwareCheckVersion
         {
             //get version 
             var versionPair = await GetVersion();
-            var updatedList = UpdateData.FirmwareUpdateModels;
+            var updatedList = GetUpdateList();
 
             if (versionPair == null)
             {
@@ -226,6 +235,16 @@ namespace AwInitilizer.Procedure.FirmwareCheckVersion
 
                 return null;
             }
+        }
+
+        private List<FirmwareUpdateModel> GetUpdateList()
+        {
+            var updateList = UpdateData.FirmwareUpdateModels;
+            if (GetFirmwareUpdateModel != null)
+            {
+                updateList = GetFirmwareUpdateModel(UpdateData);
+            }
+            return updateList;
         }
     }
 }

+ 177 - 0
AwInitilizer/Procedure/NetworkInterfaceSetupProcedure.cs

@@ -0,0 +1,177 @@
+using AwInitilizer.Procedure.WifRssiCheck;
+using CsuWebApiLib;
+using InitializerModel;
+using PhihongEv.Lib;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace AwInitilizer.Procedure.NetworkInterfaceSetup
+{
+    public enum ErrorType
+    {
+        None,
+        WiFiSetFailed,
+        TelcomSetFailed,
+        RestartFailed
+    }
+
+    public enum LogEvent
+    {
+    }
+
+    public class NetworkInterfaceSetupProcedure : ProcedureBase
+    {
+        public ErrorType Error { get; set; } = ErrorType.None;
+
+        private ProcedureLog.LogWriter<NetworkInterfaceSetupProcedure, LogEvent> LogWriter;
+
+        private readonly static Dictionary<LogEvent, string> ReportDict = new Dictionary<LogEvent, string>()
+        {
+        };
+
+        private readonly static Dictionary<LogEvent, string> LogDict = new Dictionary<LogEvent, string>()
+        {
+        };
+
+        public NetworkInterfaceSetupProcedure() : base()
+        {
+            Name = "Network Interface Setup";
+            Content = "Set Wi-Fi and Telcom setting if required";
+
+            LogWriter = new ProcedureLog.LogWriter<NetworkInterfaceSetupProcedure, LogEvent>(this)
+            {
+                ReportPair = ReportDict,
+                LogPair = LogDict
+            };
+        }
+
+        internal override async Task<bool> Run()
+        {
+            var isWiFiSettingRequired = UpdateData.SystemID.ModelName.GetWiFiCnt() > 0;
+            var isTelcomSettingRequired = UpdateData.SystemID.ModelName.GetTelecomCnt() > 0;
+
+            if (isWiFiSettingRequired)
+            {
+                var setWifiResult = await SetWifiConfigAsync();
+                if (!setWifiResult)
+                {
+                    Error = ErrorType.WiFiSetFailed;
+                    LogWriter.Log("set wifi to station failed");
+                    return false;
+                }
+            }
+            else
+            {
+                LogWriter.Log("Wifi not supported, skip Wi-Fi setting");
+            }
+
+
+            if (isTelcomSettingRequired)
+            {
+                var setTelcomResult = await EnableTelcomAsync();
+                if (!setTelcomResult)
+                {
+                    Error = ErrorType.TelcomSetFailed;
+                    LogWriter.Log("enable telcom failed");
+                    return false;
+                }
+            }
+            else
+            {
+                LogWriter.Log("Telcom not supported, skip Telcom setting");
+            }
+
+            if (isWiFiSettingRequired || isTelcomSettingRequired)
+            {
+                var rebootResult = await RestartEvseAsync();
+                if (!rebootResult)
+                {
+                    Error = ErrorType.RestartFailed;
+                    LogWriter.Log("enable telcom failed");
+                    return false;
+                }
+            }
+
+            return true;
+        }
+
+        internal async Task<bool> SetWifiConfigAsync()
+        {
+            var ssid = AppSettingConfig.Instance.WifiApSSID;
+            var pwd = AppSettingConfig.Instance.WifiApPassword;
+            EvApiResult<bool> cmdResult;
+
+            int retryCnt = 0;
+            do
+            {
+                LogWriter.Log("Trying to set wifi to station mode");
+                cmdResult = await EvApi.SetWifiStationMode(ssid, pwd);
+                if (cmdResult != null && cmdResult.Result)
+                {
+                    break;
+                }
+                await Task.Delay(TimeSpan.FromMinutes(2));
+                retryCnt++;
+            }
+            while (retryCnt < 5);
+            if (retryCnt >= 5)
+            {
+                return false;
+            }
+
+            return cmdResult.Result;
+        }
+
+        internal async Task<bool> EnableTelcomAsync()
+        {
+            EvApiResult<bool> cmdResult;
+
+            int retryCnt = 0;
+            do
+            {
+                LogWriter.Log("Trying to enable telcom");
+                cmdResult = await EvApi.SetTelcomEnabled(true);
+                if (cmdResult != null && cmdResult.Result)
+                {
+                    break;
+                }
+                await Task.Delay(TimeSpan.FromMinutes(2));
+                retryCnt++;
+            }
+            while (retryCnt < 5);
+            if (retryCnt >= 5)
+            {
+                return false;
+            }
+
+            return cmdResult.Result;
+        }
+
+        internal async Task<bool> RestartEvseAsync()
+        {
+            var restartResult = await EvApi.Restart();
+            if (restartResult == null || !restartResult.Result)
+            {
+                return false;
+            }
+
+            int pollingCnt;
+            for (pollingCnt = 0; pollingCnt < 16; pollingCnt++)
+            {
+                await Task.Delay(TimeSpan.FromSeconds(15));
+                var response = await ChekCsuBootCompelete();
+                if (response)
+                    break;
+            }
+            if (pollingCnt == 16)
+            {
+                LogWriter.Log("Wait reboot complete time out");
+            }
+
+            return true;
+        }
+    }
+}

+ 21 - 4
AwInitilizer/Procedure/VersionLogProcedure.cs

@@ -9,6 +9,7 @@ using System.Linq;
 using System.Net;
 using System.Text;
 using System.Threading.Tasks;
+using System.Windows.Markup;
 
 namespace AwInitilizer.Procedure.VersionLog
 {
@@ -64,6 +65,8 @@ namespace AwInitilizer.Procedure.VersionLog
 
         public ErrorType Error { get; set; } = ErrorType.None;
 
+        public bool ReportToMes { get; set; } = true;
+
         private ProcedureLog.LogWriter<VersionLogProcedure, LogEvent> LogWriter;
 
         public VersionLogProcedure() : base()
@@ -93,7 +96,14 @@ namespace AwInitilizer.Procedure.VersionLog
                 if (!excludeHeaderList.Contains(infoPair.Key))
                 {
                     var mesKey = GetMesReportKey(infoPair.Key);
-                    LogWriter.Report(mesKey, infoPair.Value);
+                    if (ReportToMes)
+                    {
+                        LogWriter.Report(mesKey, infoPair.Value);
+                    }
+                    else
+                    {
+                        LogWriter.Log(string.Format("{0} {1}", mesKey, infoPair.Value));
+                    }
                     //LogPair.Add(infoPair.Key, infoPair.Value);
                 }
             }
@@ -102,9 +112,16 @@ namespace AwInitilizer.Procedure.VersionLog
             var assembly = System.Reflection.Assembly.GetExecutingAssembly();
             var version = assembly.GetName().Version.ToString();
             var gitVersion = System.Diagnostics.FileVersionInfo.GetVersionInfo(assembly.Location).ProductVersion;
-            var logVersion = string.Format("{0}-{1}", version, gitVersion);
-
-            LogWriter.Report(SoftwareVersionHeader, logVersion);
+            var logVersion = string.Format("{0}-{1}", version, gitVersion);
+
+            if (ReportToMes)
+            {
+                LogWriter.Report(SoftwareVersionHeader, logVersion);
+            }
+            else
+            {
+                LogWriter.Log(string.Format("{0} {1}", SoftwareVersionHeader, logVersion));
+            }
 
             return true;
         }

+ 22 - 8
AwInitilizer/Procedure/WifRssiCheckProcedure.cs

@@ -66,12 +66,12 @@ namespace AwInitilizer.Procedure.WifRssiCheck
                 return true;
             }
 
-            var updateWifiConfigResult = await SetWifiConfig();
-            if (!updateWifiConfigResult)
-            {
-                LogWriter.Log("set wifi to station failed");
-                return false;
-            }
+            //var updateWifiConfigResult = await SetWifiConfig();
+            //if (!updateWifiConfigResult)
+            //{
+            //    LogWriter.Log("set wifi to station failed");
+            //    return false;
+            //}
 
             var checkResult = await CheckWifiRssi();
             return checkResult;
@@ -81,8 +81,22 @@ namespace AwInitilizer.Procedure.WifRssiCheck
         {
             var ssid = AppSettingConfig.Instance.WifiApSSID;
             var pwd = AppSettingConfig.Instance.WifiApPassword;
-            var cmdResult = await EvApi.SetWifiStationMode(ssid, pwd);
-            if (cmdResult == null || !cmdResult.Result)
+            EvApiResult<bool> cmdResult;
+
+            int retryCnt = 0;
+            do
+            {
+                LogWriter.Log("Trying to set wifi to station mode");
+                cmdResult = await EvApi.SetWifiStationMode(ssid, pwd);
+                if (cmdResult != null && cmdResult.Result)
+                {
+                    break;
+                }
+                await Task.Delay(TimeSpan.FromMinutes(2));
+                retryCnt++;
+            }
+            while (retryCnt < 5);
+            if (retryCnt >= 5)
             {
                 return false;
             }

+ 4 - 4
AwInitilizer/Properties/AssemblyInfo.cs

@@ -31,7 +31,7 @@ using System.Runtime.InteropServices;
 //
 // You can specify all the values or you can default the Build and Revision Numbers
 // by using the '*' as shown below:
-// [assembly: AssemblyVersion("1.14.2.0")]
-[assembly: AssemblyVersion("1.14.2.0")]
-[assembly: AssemblyFileVersion("1.14.2.0")]
-[assembly: AssemblyInformationalVersion("d85d388")]
+// [assembly: AssemblyVersion("1.15.0.0")]
+[assembly: AssemblyVersion("1.15.0.0")]
+[assembly: AssemblyFileVersion("1.15.0.0")]
+[assembly: AssemblyInformationalVersion("6d350b1")]

+ 9 - 0
AwInitilizer/Resx/AppResources.Designer.cs

@@ -123,6 +123,15 @@ namespace AwInitilizer.Resx {
             }
         }
         
+        /// <summary>
+        ///   查詢類似 third button 的當地語系化字串。
+        /// </summary>
+        public static string BtnPressThirdBtn {
+            get {
+                return ResourceManager.GetString("BtnPressThirdBtn", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   查詢類似 Please make sure all buttons are unpressed,then Press OK... 的當地語系化字串。
         /// </summary>

+ 3 - 0
AwInitilizer/Resx/AppResources.resx

@@ -303,4 +303,7 @@
   <data name="DisableAuth" xml:space="preserve">
     <value>Disable Authentication</value>
   </data>
+  <data name="BtnPressThirdBtn" xml:space="preserve">
+    <value>third button</value>
+  </data>
 </root>

+ 3 - 0
AwInitilizer/Resx/AppResources.zh-CHS.resx

@@ -303,4 +303,7 @@
   <data name="DisableAuth" xml:space="preserve">
     <value>启用随插即充</value>
   </data>
+  <data name="BtnPressThirdBtn" xml:space="preserve">
+    <value>第三按鈕</value>
+  </data>
 </root>

+ 4 - 0
ConfigEditor/MainWindow.xaml

@@ -18,6 +18,10 @@
         <Style TargetType="Label">
             <Setter Property="VerticalContentAlignment" Value="Center" />
         </Style>
+        <Style TargetType="GroupBox">
+            <Setter Property="BorderThickness"  Value="3" />
+            <Setter Property="Padding"  Value="5" />
+        </Style>
     </Window.Resources>
     <TabControl x:Name="uxMainTabControl">
         <TabItem Header="EvseConfig">

+ 4 - 4
ConfigEditor/Properties/AssemblyInfo.cs

@@ -50,7 +50,7 @@ using System.Windows;
 //
 // 您可以指定所有的值,也可以使用 '*' 將組建和修訂編號
 // 設為預設,如下所示:
-// [assembly: AssemblyVersion("1.14.2.0")]
-[assembly: AssemblyVersion("1.14.2.0")]
-[assembly: AssemblyFileVersion("1.14.2.0")]
-[assembly: AssemblyInformationalVersion("d85d388")]
+// [assembly: AssemblyVersion("1.15.0.0")]
+[assembly: AssemblyVersion("1.15.0.0")]
+[assembly: AssemblyFileVersion("1.15.0.0")]
+[assembly: AssemblyInformationalVersion("6d350b1")]

+ 3 - 1
ConfigEditor/SubPage/EvseConfig/EvseConfigPanel.xaml

@@ -163,7 +163,9 @@
                         Text="{Binding SubSimICCID, Mode=TwoWay}" />
                 </Grid>
             </GroupBox>
-            <StackPanel x:Name="uxFrimwareStackPanel" Orientation="Vertical">
+            <StackPanel x:Name="uxPreFlashStackPanel" Orientation="Vertical">
+            </StackPanel>
+            <StackPanel x:Name="uxFirmwareStackPanel" Orientation="Vertical">
                 <Rectangle Height="10" />
                 <GroupBox Header="Version Information">
                     <StackPanel Orientation="Vertical">

+ 63 - 22
ConfigEditor/SubPage/EvseConfig/EvseConfigPanel.xaml.cs

@@ -41,7 +41,7 @@ namespace ConfigEditor.SubPage.EvseConfig
 
             uxButtonTestMode.ItemsSource = Enum.GetValues(typeof(ButtonTestModeType)).Cast<ButtonTestModeType>();
 
-            uxFrimwareStackPanel.Children.Clear();
+            uxFirmwareStackPanel.Children.Clear();
 
             this.DataContext = new EvseSettingConfigModel();
         }
@@ -107,24 +107,56 @@ namespace ConfigEditor.SubPage.EvseConfig
             uxFirstTelcom.Visibility = systemID.ModelName.GetTelecomCnt() > 0 ? Visibility.Visible : Visibility.Collapsed;
             uxSecondTelcom.Visibility = systemID.ModelName.GetTelecomCnt() > 1 ? Visibility.Visible : Visibility.Collapsed;
 
-            var groupedFrimware = config.FirmwareUpdateList is null ? new List<IGrouping<int, FirmwareUpdateModel>>() : config.FirmwareUpdateList.GroupBy(x => EvseVersion.GetVersionIndex(x.Module));
-            groupedFrimware = groupedFrimware.OrderBy(x => x.Key);
-            uxFrimwareStackPanel.Children.Clear();
-
-            foreach (var firmwareGroup in groupedFrimware)
+            int maxDispenser = 0;
+            if (config.PreFlashFirmwareUpdateList != null &&
+                config.PreFlashFirmwareUpdateList.Count > 0)
             {
-                FirmwareVersionPanel firmwarePanel = CreateFirmwarePanel(folderPath, firmwareGroup.Key, firmwareGroup.ToList());
-
-                uxFrimwareStackPanel.Children.Add(new Rectangle() { Height = 10 });
-                uxFrimwareStackPanel.Children.Add(firmwarePanel);
+                var preFlashMaxDispenser = config.PreFlashFirmwareUpdateList.Max(x => EvseVersion.GetVersionIndex(x.Module));
+                maxDispenser = Math.Max(maxDispenser, preFlashMaxDispenser);
+            }
+            if (config.FirmwareUpdateList != null &&
+                config.FirmwareUpdateList.Count > 0)
+            {
+                var flashMaxDispenser = config.FirmwareUpdateList.Max(x => EvseVersion.GetVersionIndex(x.Module));
+                maxDispenser = Math.Max(maxDispenser, flashMaxDispenser);
             }
 
-            if (!groupedFrimware.Select(x => x.Key).Contains(0))
+            InitializeFirmwarePanel(uxPreFlashStackPanel, "PreFlash", folderPath, config.PreFlashFirmwareUpdateList, maxDispenser);
+            InitializeFirmwarePanel(uxFirmwareStackPanel, "", folderPath, config.FirmwareUpdateList, maxDispenser);
+        }
+
+        private void InitializeFirmwarePanel(StackPanel firmwareStackPanel, string headerPrefix, string folderPath, List<FirmwareUpdateModel> preFlashFirmwareUpdateList, int dispenserCnt)
+        {
+            //var groupedPreFlashFrimware = preFlashFirmwareUpdateList is null ? new List<IGrouping<int, FirmwareUpdateModel>>() : preFlashFirmwareUpdateList.GroupBy(x => EvseVersion.GetVersionIndex(x.Module));
+            //groupedPreFlashFrimware = groupedPreFlashFrimware.OrderBy(x => x.Key);
+            Dictionary<int, List<FirmwareUpdateModel>> groupedPreFlashFrimware = preFlashFirmwareUpdateList is null ? new Dictionary<int, List<FirmwareUpdateModel>>(): preFlashFirmwareUpdateList.GroupBy(x => EvseVersion.GetVersionIndex(x.Module)).ToDictionary(x=>x.Key, x=> x.ToList());
+            //groupedPreFlashFrimware = groupedPreFlashFrimware.OrderBy(x => x.Key);
+
+            firmwareStackPanel.Children.Clear();
+
+            for (int index = 0; index <= dispenserCnt; index++)
             {
-                FirmwareVersionPanel firmwarePanel = CreateFirmwarePanel(folderPath, 0, new List<FirmwareUpdateModel>());
-                uxFrimwareStackPanel.Children.Add(new Rectangle() { Height = 10 });
-                uxFrimwareStackPanel.Children.Add(firmwarePanel);
+                var firmwareList = groupedPreFlashFrimware.ContainsKey(index) ?  groupedPreFlashFrimware[index] : new List<FirmwareUpdateModel>();
+                FirmwareVersionPanel firmwarePanel = CreateFirmwarePanel(headerPrefix, folderPath, index, firmwareList);
+
+                firmwareStackPanel.Children.Add(new Rectangle() { Height = 10 });
+                firmwareStackPanel.Children.Add(firmwarePanel);
             }
+
+            //foreach (var firmwareGroup in groupedPreFlashFrimware)
+            //{
+            //    FirmwareVersionPanel firmwarePanel = CreateFirmwarePanel(headerPrefix, folderPath, firmwareGroup.Key, firmwareGroup.ToList());
+
+            //    firmwareStackPanel.Children.Add(new Rectangle() { Height = 10 });
+            //    firmwareStackPanel.Children.Add(firmwarePanel);
+            //}
+
+            //if (!groupedPreFlashFrimware.Select(x => x.Key).Contains(0))
+            //{
+            //    FirmwareVersionPanel firmwarePanel = CreateFirmwarePanel(headerPrefix, folderPath, 0, new List<FirmwareUpdateModel>());
+            //    firmwareStackPanel.Children.Add(new Rectangle() { Height = 10 });
+            //    firmwareStackPanel.Children.Add(firmwarePanel);
+            //}
         }
 
         private void ClearUi()
@@ -134,9 +166,10 @@ namespace ConfigEditor.SubPage.EvseConfig
             uxSecondTelcom.Visibility = Visibility.Collapsed;
         }
 
-        private FirmwareVersionPanel CreateFirmwarePanel(string folderPath, int key, List<FirmwareUpdateModel> firmwareUpdateModels)
+        private FirmwareVersionPanel CreateFirmwarePanel(string headerPrefix, string folderPath, int key, List<FirmwareUpdateModel> firmwareUpdateModels)
         {
             var toReturn = new FirmwareVersionPanel();
+            toReturn.HeaderPrefix = headerPrefix;
             toReturn.Index = key;
             toReturn.FileFolderPath = folderPath;
             toReturn.VersionPairs = firmwareUpdateModels;
@@ -204,10 +237,14 @@ namespace ConfigEditor.SubPage.EvseConfig
 
             EvseSettingConfigModel config = this.DataContext as EvseSettingConfigModel;
 
-            var firmwareUpdateList = LoadFirmwareUpdateListFromPanel();
+            var firmwareUpdateList = LoadFirmwareUpdateListFromPanel(uxFirmwareStackPanel);
             CopyAndRenameFirmwareUpdateList(config.ModelName, firmwareUpdateList);
             config.FirmwareUpdateList = firmwareUpdateList;
 
+            var preFlashFirmwareUpdateList = LoadFirmwareUpdateListFromPanel(uxPreFlashStackPanel);
+            CopyAndRenameFirmwareUpdateList(config.ModelName, preFlashFirmwareUpdateList);
+            config.PreFlashFirmwareUpdateList = preFlashFirmwareUpdateList;
+
             //var test = JsonConvert.SerializeObject(config);
             File.WriteAllText(
                 EvseSettingConfig.GetModelIniPath(config.ModelName),
@@ -220,11 +257,11 @@ namespace ConfigEditor.SubPage.EvseConfig
             Reset();
         }
 
-        private List<FirmwareUpdateModel> LoadFirmwareUpdateListFromPanel()
+        private List<FirmwareUpdateModel> LoadFirmwareUpdateListFromPanel(StackPanel firmwareStackPanel)
         {
             var toReturn = new List<FirmwareUpdateModel>();
 
-            foreach (var uiPanel in uxFrimwareStackPanel.Children)
+            foreach (var uiPanel in firmwareStackPanel.Children)
             {
                 FirmwareVersionPanel firmwareVersionPanel = uiPanel as FirmwareVersionPanel;
                 if (firmwareVersionPanel is null)
@@ -305,7 +342,7 @@ namespace ConfigEditor.SubPage.EvseConfig
         private void AddDispenser_Click(object sender, RoutedEventArgs e)
         {
             List<int> createdFrimwareIndex = new List<int>();
-            foreach (var uiElement in uxFrimwareStackPanel.Children)
+            foreach (var uiElement in uxFirmwareStackPanel.Children)
             {
                 FirmwareVersionPanel firmwarePanel = uiElement as FirmwareVersionPanel;
                 if (firmwarePanel is null)
@@ -330,9 +367,13 @@ namespace ConfigEditor.SubPage.EvseConfig
             var modelName = uxEvseModelNameList.SelectedItem as string;
             var folderPath = EvseSettingConfig.GetModelFolder(modelName);
 
-            FirmwareVersionPanel createdFirmwarePanel = CreateFirmwarePanel(folderPath, toCreateIndex, new List<FirmwareUpdateModel>());
-            uxFrimwareStackPanel.Children.Add(new Rectangle() { Height = 10 });
-            uxFrimwareStackPanel.Children.Add(createdFirmwarePanel);
+            FirmwareVersionPanel createdFirmwarePanel = CreateFirmwarePanel("PreFlash", folderPath, toCreateIndex, new List<FirmwareUpdateModel>());
+            uxPreFlashStackPanel.Children.Add(new Rectangle() { Height = 10 });
+            uxPreFlashStackPanel.Children.Add(createdFirmwarePanel);
+
+            FirmwareVersionPanel createdPreFlashFirmwarePanel = CreateFirmwarePanel("", folderPath, toCreateIndex, new List<FirmwareUpdateModel>());
+            uxFirmwareStackPanel.Children.Add(new Rectangle() { Height = 10 });
+            uxFirmwareStackPanel.Children.Add(createdPreFlashFirmwarePanel);
         }
     }
 }

+ 3 - 2
ConfigEditor/SubPage/EvseConfig/FirmwareVersionPanel.xaml.cs

@@ -43,6 +43,7 @@ namespace ConfigEditor.SubPage.EvseConfig
         }
 
         public string FileFolderPath { get; internal set; }
+        public string HeaderPrefix { get; internal set; }
 
         private void NewFrimware_Click(object sender, RoutedEventArgs e)
         {
@@ -59,11 +60,11 @@ namespace ConfigEditor.SubPage.EvseConfig
         {
             _Index = index;
 
-            string title = "Version Information";
+            string title = $"{HeaderPrefix} Version Information";
 
             if (index > 0)
             {
-                title = $"Version Information Dispenser {index}";
+                title = $"{HeaderPrefix} Version Information Dispenser {index}";
             }
             uxTitleGb.Header = title;
         }

+ 25 - 0
CsuWebApiLib/EvApi.cs

@@ -109,6 +109,7 @@ namespace CsuWebApiLib
                     Response = result
                 };
             }
+
             var values = JsonConvert.DeserializeObject<ButtonStatus>(result);
             return new EvApiResult<ButtonStatus>()
             {
@@ -456,6 +457,30 @@ namespace CsuWebApiLib
             };
         }
 
+        public static async Task<EvApiResult<bool>> SetTelcomEnabled(bool enabled)
+        {
+            var val = enabled ? "1" : "0";
+            var parm = new Dictionary<string, string>() {
+                { "TelcomEnabled", val }
+            };
+
+            var result = await EvHttpClient.SetNetworkAction(parm);
+            if (!result.IsSuccess)
+            {
+                return new EvApiResult<bool>()
+                {
+                    Result = false,
+                    Response = result.Msg
+                };
+            }
+
+            return new EvApiResult<bool>()
+            {
+                Result = !string.IsNullOrEmpty(result.Msg),
+                Response = result.Msg,
+            };
+        }
+
         public static async Task<EvApiResult<string>> GetTelcomModemFwRev()
         {
             var key = "TelcomModemFwRev";

+ 4 - 3
CsuWebApiLib/Model/ButtonStatus.cs

@@ -8,8 +8,9 @@ namespace CsuWebApiLib.Model
 {
     public class ButtonStatus
     {
-        public int Button1 { get; set; }
-        public int Button2 { get; set; }
-        public int EmergencyButton { get; set; }
+        public int? Button1 { get; set; }
+        public int? Button2 { get; set; }
+        public int? Button3 { get; set; }
+        public int? EmergencyButton { get; set; }
     }
 }

+ 4 - 4
CsuWebApiLib/Properties/AssemblyInfo.cs

@@ -31,7 +31,7 @@ using System.Runtime.InteropServices;
 //
 // 您可以指定所有的值,也可以使用 '*' 將組建和修訂編號
 // 設為預設,如下所示:
-// [assembly: AssemblyVersion("1.14.2.0")]
-[assembly: AssemblyVersion("1.14.2.0")]
-[assembly: AssemblyFileVersion("1.14.2.0")]
-[assembly: AssemblyInformationalVersion("d85d388")]
+// [assembly: AssemblyVersion("1.15.0.0")]
+[assembly: AssemblyVersion("1.15.0.0")]
+[assembly: AssemblyFileVersion("1.15.0.0")]
+[assembly: AssemblyInformationalVersion("6d350b1")]

+ 4 - 4
Editor/Properties/AssemblyInfo.cs

@@ -50,7 +50,7 @@ using System.Windows;
 //
 // 您可以指定所有的值,也可以使用 '*' 將組建和修訂編號
 // 設為預設,如下所示:
-// [assembly: AssemblyVersion("1.14.2.0")]
-[assembly: AssemblyVersion("1.14.2.0")]
-[assembly: AssemblyFileVersion("1.14.2.0")]
-[assembly: AssemblyInformationalVersion("d85d388")]
+// [assembly: AssemblyVersion("1.15.0.0")]
+[assembly: AssemblyVersion("1.15.0.0")]
+[assembly: AssemblyFileVersion("1.15.0.0")]
+[assembly: AssemblyInformationalVersion("6d350b1")]

+ 1 - 1
GitVersion.yml

@@ -1,6 +1,6 @@
 assembly-versioning-scheme: MajorMinorPatch
 assembly-informational-format: '{ShortSha}'
-next-version: 1.14.2
+next-version: 1.15.0
 branches: {}
 ignore:
   sha: []

+ 40 - 56
InitializerModel/EvseSettingConfig.cs

@@ -125,10 +125,10 @@ namespace InitializerModel
             EvseSettingConfigModel setting;
             try
             {
-                setting = JsonConvert.DeserializeObject<EvseSettingConfigModel>(settingString);
-                CompatibilityDataUpdate(setting);
+                var compatableSetting = JsonConvert.DeserializeObject<EvseSettingConfigCompatableModel>(settingString);
+                setting = compatableSetting.ToEvseSettingConfigModel();
             }
-            catch
+            catch(Exception e)
             {
                 toReturn.Error = EvseSettingConfigLoadError.LoadConfigModelInitFormatError;
                 return toReturn;
@@ -187,9 +187,6 @@ namespace InitializerModel
 
                     if (!isNoduleNameVaild)
                     {
-                        //HintDialog.ShowMessage("Firmware module name should not empty");
-                        //HintDialog.ShowMessage(Resx.AppResources.InitFirmwareNameEmptyAlert);
-                        //isCheckPassed = false;
                         toReturn.Error = EvseSettingConfigLoadError.InitFirmwareNameEmpty;
                         return toReturn;
                     }
@@ -197,24 +194,11 @@ namespace InitializerModel
                     {
                         if (!isVersionVaild)
                         {
-                            //HintDialog.ShowMessage($"Version should not empty while {model.Module} firmware is set");
-                            //HintDialog.ShowMessage(string.Format(Resx.AppResources.InitFirmwareVersionEmptyAlert, model.Module));
-                            //isCheckPassed = false;
                             toReturn.Error = EvseSettingConfigLoadError.InitFirmwareVersionEmpty;
                             toReturn.ErrorFirmware = model.Module;
                             return toReturn;
                         }
 
-                        //if (!isFileNameVaild)
-                        //{
-                        //    //HintDialog.ShowMessage($"File name should not empty while {model.Module} version is set");
-                        //    //HintDialog.ShowMessage(string.Format(Resx.AppResources.InitFirmwareFileEmptyAlert, model.Module));
-                        //    //isCheckPassed = false;
-                        //    toReturn.Error = EvseSettingConfigLoadError.InitFirmwareFileEmpty;
-                        //    toReturn.ErrorFirmware = model.Module;
-                        //    return toReturn;
-                        //}
-
                         var folderPath = System.IO.Path.GetDirectoryName(modelSeettingFilePath);
                         if (isVersionVaild && isFileNameVaild)
                         {
@@ -222,30 +206,48 @@ namespace InitializerModel
                             //check file exist
                             if (!File.Exists(filePath))
                             {
-                                ////HintDialog.ShowMessage($"{model.Module} Firemware file is missing");
-                                //HintDialog.ShowMessage(string.Format(Resx.AppResources.InitFirmwareFileMissingAlert, model.Module));
-                                //isCheckPassed = false;
                                 toReturn.Error = EvseSettingConfigLoadError.InitFirmwareFileMissing;
                                 toReturn.ErrorFirmware = model.Module;
                                 return toReturn;
                             }
-                            else
-                            {
-                                try
-                                {
-                                    //isCheckPassed = CheckFileHeaderModel(setting, isCheckPassed, model, filePath);
-                                }
-                                catch
-                                {
-                                    //HintDialog.ShowMessage($"{model.Module} Firemware header ERROR");
-                                    //HintDialog.ShowMessage(string.Format(Resx.AppResources.InitFirmwareFileHeaderFormatAlert, model.Module));
-                                    //isCheckPassed = false;
-                                    toReturn.Error = EvseSettingConfigLoadError.InitFirmwareFileHeaderFormat;
-                                    toReturn.ErrorFirmware = model.Module;
-                                    return toReturn;
-                                }
+                        }
+                    }
+                }
+            }
+
+            if (setting.PreFlashFirmwareUpdateList != null)
+            {
+                for (int firmwareIndex = 0; firmwareIndex < setting.PreFlashFirmwareUpdateList.Count; firmwareIndex++)
+                {
+                    var model = setting.PreFlashFirmwareUpdateList[firmwareIndex];
+                    bool isVersionVaild = !string.IsNullOrEmpty(model.Version);
+                    bool isFileNameVaild = !string.IsNullOrEmpty(model.FirmwareFileName);
+                    bool isNoduleNameVaild = !string.IsNullOrEmpty(model.Module);
 
-                                model.FirmwareFileName = filePath;
+                    if (!isNoduleNameVaild)
+                    {
+                        toReturn.Error = EvseSettingConfigLoadError.InitFirmwareNameEmpty;
+                        return toReturn;
+                    }
+                    if (isVersionVaild || isFileNameVaild)
+                    {
+                        if (!isVersionVaild)
+                        {
+                            toReturn.Error = EvseSettingConfigLoadError.InitFirmwareVersionEmpty;
+                            toReturn.ErrorFirmware = model.Module;
+                            return toReturn;
+                        }
+
+                        var folderPath = System.IO.Path.GetDirectoryName(modelSeettingFilePath);
+                        if (isVersionVaild && isFileNameVaild)
+                        {
+                            var filePath = System.IO.Path.Combine(folderPath, model.FirmwareFileName);
+                            //check file exist
+                            if (!File.Exists(filePath))
+                            {
+                                toReturn.Error = EvseSettingConfigLoadError.InitFirmwareFileMissing;
+                                toReturn.ErrorFirmware = model.Module;
+                                return toReturn;
                             }
                         }
                     }
@@ -259,24 +261,6 @@ namespace InitializerModel
 
         private static void CompatibilityDataUpdate(EvseSettingConfigModel setting)
         {
-            if (string.IsNullOrEmpty(setting.SimICCID))
-            {
-                setting.SimICCID = setting.ICCID;
-            }
-            if (string.IsNullOrEmpty(setting.SimIMSI))
-            {
-                setting.SimIMSI = setting.IMSI;
-            }
-
-            if (setting.SkipButtonTest)
-            {
-                setting.ButtonTestMode = ButtonTestModeType.SkipButtonTest;
-            }
-            if (setting.SkipEmergencyButton)
-            {
-                setting.ButtonTestMode = ButtonTestModeType.SkipEmergencyButton;
-            }
-
             if (string.IsNullOrEmpty(setting.IpAddress))
             {
                 setting.IpAddress = "192.168.1.10";

+ 110 - 0
InitializerModel/EvseSettingConfigCompatableModel.cs

@@ -0,0 +1,110 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace InitializerModel
+{
+    public class EvseSettingConfigCompatableModel
+    {
+        public string ModelName { get; set; }
+        public bool IsModelNameLength15 => string.IsNullOrEmpty(ModelName) ? false : ModelName.Length == 15;
+        public string FourGenModuleVersion { get; set; }
+        public string SubFourGenModuleVersion { get; set; }
+        public bool IsSimInsert { get; set; }
+        [Obsolete]
+        public string ICCID { get; set; }
+        [Obsolete]
+        public string IMSI { get; set; }
+        public string SimICCID { get; set; }
+        public string SimIMSI { get; set; }
+        public bool IsSubSimInsert { get; set; }
+        public string SubSimICCID { get; set; }
+        public string SubSimIMSI { get; set; }
+        public ButtonTestCompatableModeType ButtonTestMode { get; set; }
+        [Obsolete]
+        public bool SkipEmergencyButton { get; set; }
+        [Obsolete]
+        public bool SkipButtonTest { get; set; }
+        public string IpAddress { get; set; }
+        public bool IsDisableAuthRequired { get; set; }
+        public bool IsIdleCheckPass { get; set; }
+        public List<FirmwareUpdateModel> FirmwareUpdateList { get; set; }
+        public List<FirmwareUpdateModel> PreFlashFirmwareUpdateList { get; set; }
+
+        public EvseSettingConfigModel ToEvseSettingConfigModel()
+        {
+            var simICCID = string.IsNullOrEmpty(SimICCID) ? ICCID : SimICCID;
+            var simIMSI = string.IsNullOrEmpty(SimICCID) ? IMSI : SimIMSI;
+            var buttonTestMode = ButtonTestMode;
+            if (SkipEmergencyButton)
+            {
+                buttonTestMode = ButtonTestCompatableModeType.TwoButtons;
+            }
+            if (SkipButtonTest)
+            {
+                buttonTestMode = ButtonTestCompatableModeType.SkipButtonTest;
+            }
+            var ipAddress = string.IsNullOrEmpty(IpAddress) ? "192.168.1.10" : IpAddress;
+            return new EvseSettingConfigModel()
+            {
+                ModelName = ModelName,
+                FourGenModuleVersion = FourGenModuleVersion,
+                SubFourGenModuleVersion = SubFourGenModuleVersion,
+                IsSimInsert = IsSimInsert,
+                SimICCID = simICCID,
+                SimIMSI = simIMSI,
+                IsSubSimInsert = IsSubSimInsert,
+                SubSimICCID = SubSimICCID,
+                SubSimIMSI = SubSimIMSI,
+                ButtonTestMode = GetButtonTestModeType(buttonTestMode),
+                IpAddress = ipAddress,
+                IsDisableAuthRequired = IsDisableAuthRequired,
+                IsIdleCheckPass = IsIdleCheckPass,
+                FirmwareUpdateList = FirmwareUpdateList,
+                PreFlashFirmwareUpdateList = PreFlashFirmwareUpdateList
+            };
+        }
+
+        private ButtonTestModeType GetButtonTestModeType(ButtonTestCompatableModeType source)
+        {
+            ButtonTestModeType toReturn = ButtonTestModeType.TwoButtonsWithEmergencyButton;
+            switch (source)
+            {
+                case ButtonTestCompatableModeType.TwoButtonsWithEmergencyButton:
+                case ButtonTestCompatableModeType.All:
+                    toReturn = ButtonTestModeType.TwoButtonsWithEmergencyButton;
+                    break;
+                case ButtonTestCompatableModeType.SkipButtonTest:
+                    toReturn = ButtonTestModeType.SkipButtonTest;
+                    break;
+                case ButtonTestCompatableModeType.EmergencyButtonOnly:
+                case ButtonTestCompatableModeType.SkipNormalButton:
+                    toReturn = ButtonTestModeType.EmergencyButtonOnly;
+                    break;
+                case ButtonTestCompatableModeType.TwoButtons:
+                case ButtonTestCompatableModeType.SkipEmergencyButton:
+                    toReturn= ButtonTestModeType.TwoButtons;
+                    break;
+                case ButtonTestCompatableModeType.ThreeButtonsWithEmergencyButton:
+                    toReturn = ButtonTestModeType.ThreeButtonsWithEmergencyButton;
+                    break;
+            };
+            return toReturn;
+        }
+    }
+
+    public enum ButtonTestCompatableModeType
+    {
+        TwoButtonsWithEmergencyButton,
+        SkipButtonTest,
+        EmergencyButtonOnly,
+        TwoButtons,
+        ThreeButtonsWithEmergencyButton,
+
+        All,
+        SkipNormalButton,
+        SkipEmergencyButton
+    }
+}

+ 8 - 12
InitializerModel/EvseSettingConfigModel.cs

@@ -1,4 +1,6 @@
-using System;
+using Newtonsoft.Json.Converters;
+using Newtonsoft.Json;
+using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
@@ -13,31 +15,25 @@ namespace InitializerModel
         public string FourGenModuleVersion { get; set; }
         public string SubFourGenModuleVersion { get; set; }
         public bool IsSimInsert { get; set; }
-        [Obsolete]
-        public string ICCID { get; set; }
-        [Obsolete]
-        public string IMSI { get; set; }
         public string SimICCID { get; set; }
         public string SimIMSI { get; set; }
         public bool IsSubSimInsert { get; set; }
         public string SubSimICCID { get; set; }
         public string SubSimIMSI { get; set; }
         public ButtonTestModeType ButtonTestMode { get; set; }
-        [Obsolete]
-        public bool SkipEmergencyButton { get; set; }
-        [Obsolete]
-        public bool SkipButtonTest { get; set; }
         public string IpAddress { get; set; }
         public bool IsDisableAuthRequired { get; set; }
         public bool IsIdleCheckPass { get; set; }
         public List<FirmwareUpdateModel> FirmwareUpdateList { get; set; }
+        public List<FirmwareUpdateModel> PreFlashFirmwareUpdateList { get; set; }
     }
 
     public enum ButtonTestModeType
     {
-        All,
+        TwoButtonsWithEmergencyButton,
         SkipButtonTest,
-        SkipNormalButton,
-        SkipEmergencyButton,
+        EmergencyButtonOnly,
+        TwoButtons,
+        ThreeButtonsWithEmergencyButton,
     }
 }

+ 1 - 0
InitializerModel/InitializerModel.csproj

@@ -50,6 +50,7 @@
     <Compile Include="AppSettingConfig.cs" />
     <Compile Include="AppSettingConfigModel.cs" />
     <Compile Include="EvseSettingConfig.cs" />
+    <Compile Include="EvseSettingConfigCompatableModel.cs" />
     <Compile Include="FirmwareUpdateModel.cs" />
     <Compile Include="ObservableObject.cs" />
     <Compile Include="PredefinedVersionPair.cs" />

+ 4 - 4
InitializerModel/Properties/AssemblyInfo.cs

@@ -31,7 +31,7 @@ using System.Runtime.InteropServices;
 //
 // 您可以指定所有的值,也可以使用 '*' 將組建和修訂編號
 // 設為預設,如下所示:
-// [assembly: AssemblyVersion("1.14.2.0")]
-[assembly: AssemblyVersion("1.14.2.0")]
-[assembly: AssemblyFileVersion("1.14.2.0")]
-[assembly: AssemblyInformationalVersion("d85d388")]
+// [assembly: AssemblyVersion("1.15.0.0")]
+[assembly: AssemblyVersion("1.15.0.0")]
+[assembly: AssemblyFileVersion("1.15.0.0")]
+[assembly: AssemblyInformationalVersion("6d350b1")]

+ 3 - 3
Initilizer/AssemblyInfo.cs

@@ -9,7 +9,7 @@
                                               // app, or any theme specific resource dictionaries)
 )]
 
-[assembly: AssemblyVersion("1.14.2.0")]
-[assembly: AssemblyFileVersion("1.14.2.0")]
-[assembly: AssemblyInformationalVersion("d85d388")]
+[assembly: AssemblyVersion("1.15.0.0")]
+[assembly: AssemblyFileVersion("1.15.0.0")]
+[assembly: AssemblyInformationalVersion("6d350b1")]
 

+ 4 - 4
MesAdaptor/Properties/AssemblyInfo.cs

@@ -31,7 +31,7 @@ using System.Runtime.InteropServices;
 //
 // You can specify all the values or you can default the Build and Revision Numbers
 // by using the '*' as shown below:
-// [assembly: AssemblyVersion("1.14.2.0")]
-[assembly: AssemblyVersion("1.14.2.0")]
-[assembly: AssemblyFileVersion("1.14.2.0")]
-[assembly: AssemblyInformationalVersion("d85d388")]
+// [assembly: AssemblyVersion("1.15.0.0")]
+[assembly: AssemblyVersion("1.15.0.0")]
+[assembly: AssemblyFileVersion("1.15.0.0")]
+[assembly: AssemblyInformationalVersion("6d350b1")]