{ Copyright 2019 Espressif Systems (Shanghai) PTE LTD SPDX-License-Identifier: Apache-2.0 } { ------------------------------ Page to select the version of ESP-IDF to download ------------------------------ } var IDFDownloadPage: TInputOptionWizardPage; IDFDownloadAvailableVersions: TArrayOfString; IDFDownloadPath, IDFDownloadVersion: String; function GetSuggestedIDFDirectory(): String; var BaseName: String; RepeatIndex: Integer; begin { Start with Desktop\esp-idf name and if it already exists, keep trying with Desktop\esp-idf-N for N=2 and above. } BaseName := ExpandConstant('{userdesktop}\esp-idf'); Result := BaseName; RepeatIndex := 1; while DirExists(Result) do begin RepeatIndex := RepeatIndex + 1; Result := BaseName + '-' + IntToStr(RepeatIndex); end; end; function GetIDFVersionDescription(Version: String): String; begin if WildCardMatch(Version, 'v*-beta*') then Result := 'beta version' else if WildCardMatch(Version, 'v*-rc*') then Result := 'pre-release version' else if WildCardMatch(Version, 'v*') then Result := 'release version' else if WildCardMatch(Version, 'release/v*') then Result := 'release branch' else if WildCardMatch(Version, 'master') then Result := 'development branch' else Result := ''; end; procedure DownloadIDFVersionsList(); var Url: String; VersionFile: String; begin Url := '{#IDFVersionsURL}'; VersionFile := ExpandConstant('{tmp}\idf_versions.txt'); if idpDownloadFile(Url, VersionFile) then begin Log('Downloaded ' + Url + ' to ' + VersionFile); end else begin Log('Download of ' + Url + ' failed, using a fallback versions list'); ExtractTemporaryFile('idf_versions.txt'); end; end; procedure OnIDFDownloadPagePrepare(Sender: TObject); var Page: TInputOptionWizardPage; VersionFile: String; i: Integer; begin Page := TInputOptionWizardPage(Sender); Log('OnIDFDownloadPagePrepare'); if Page.CheckListBox.Items.Count > 0 then exit; DownloadIDFVersionsList(); VersionFile := ExpandConstant('{tmp}\idf_versions.txt'); if not LoadStringsFromFile(VersionFile, IDFDownloadAvailableVersions) then begin Log('Failed to load versions from ' + VersionFile); exit; end; Log('Versions count: ' + IntToStr(GetArrayLength(IDFDownloadAvailableVersions))) for i := 0 to GetArrayLength(IDFDownloadAvailableVersions) - 1 do begin Log('Version ' + IntToStr(i) + ': ' + IDFDownloadAvailableVersions[i]); Page.Add(IDFDownloadAvailableVersions[i] + ' (' + GetIDFVersionDescription(IDFDownloadAvailableVersions[i]) + ')'); end; Page.SelectedValueIndex := 0; ChoicePageSetInputText(Page, GetSuggestedIDFDirectory()); end; procedure OnIDFDownloadSelectionChange(Sender: TObject); var Page: TInputOptionWizardPage; begin Page := TInputOptionWizardPage(Sender); Log('OnIDFDownloadSelectionChange index=' + IntToStr(Page.SelectedValueIndex)); end; function OnIDFDownloadPageValidate(Sender: TWizardPage): Boolean; var Page: TInputOptionWizardPage; IDFPath: String; begin Result := False; Page := TInputOptionWizardPage(Sender); Log('OnIDFDownloadPageValidate index=' + IntToStr(Page.SelectedValueIndex)); IDFPath := ChoicePageGetInputText(Page); if DirExists(IDFPath) and not DirIsEmpty(IDFPath) then begin MsgBox('Directory already exists and is not empty:' + #13#10 + IDFPath + #13#10 + 'Please choose a different directory.', mbError, MB_OK); exit; end; if Pos(' ', IDFPath) <> 0 then begin MsgBox('ESP-IDF build system does not support spaces in paths.' + #13#10 'Please choose a different directory.', mbError, MB_OK); exit; end; IDFDownloadPath := IDFPath; IDFDownloadVersion := IDFDownloadAvailableVersions[Page.SelectedValueIndex]; Result := True; end; function ShouldSkipIDFDownloadPage(PageID: Integer): Boolean; begin if (PageID = IDFDownloadPage.ID) and not IDFDownloadRequired() then Result := True; end; procedure CreateIDFDownloadPage(); begin IDFDownloadPage := ChoicePageCreate( IDFPage.ID, 'Download ESP-IDF', 'Please choose ESP-IDF version to download', 'For more information about ESP-IDF versions, see' + #13#10 + 'https://docs.espressif.com/projects/esp-idf/en/latest/versions.html', 'Choose a directory to download ESP-IDF to', True, @OnIDFDownloadPagePrepare, @OnIDFDownloadSelectionChange, @OnIDFDownloadPageValidate); end;