@@ -79,6 +79,8 @@ private enum SysupgradePhase
7979 private static readonly Regex MtdLineRegex =
8080 new ( @"^(?<dev>mtd\d+):\s+(?<size>[0-9a-fA-F]+)\s+(?<erasesize>[0-9a-fA-F]+)\s+""(?<name>[^""]+)""" ,
8181 RegexOptions . Compiled ) ;
82+ private const string OpenIpcFirmwareSource = "OpenIPC Builder" ;
83+ private const string GregApfpvFirmwareSource = "Greg APFPV" ;
8284 #endregion
8385
8486 #region Observable Properties
@@ -106,6 +108,7 @@ private enum SysupgradePhase
106108 [ ObservableProperty ] private bool _firmwareUpgradeInProgress ;
107109 [ ObservableProperty ] private bool _isFirmwareExpanded = true ;
108110 [ ObservableProperty ] private bool _isBootloaderExpanded ;
111+ [ ObservableProperty ] private string _selectedFirmwareSource ;
109112
110113 #endregion
111114
@@ -114,7 +117,7 @@ private enum SysupgradePhase
114117 /// <summary>
115118 /// Gets whether dropdowns should be enabled based on connection and firmware selection state
116119 /// </summary>
117- public bool CanUseDropdowns => IsConnected ;
120+ public bool CanUseDropdowns => IsConnected && ! IsGregApfpvSourceSelected ( ) ;
118121
119122 /// <summary>
120123 /// Gets whether soc dropdowns should be enabled based on connection and firmware selection state
@@ -147,6 +150,11 @@ private enum SysupgradePhase
147150 /// </summary>
148151 public ObservableCollection < string > FirmwareBySoc { get ; set ; } = new ( ) ;
149152 public ObservableCollection < string > Bootloaders { get ; set ; } = new ( ) ;
153+ public ObservableCollection < string > FirmwareSources { get ; } = new ( )
154+ {
155+ OpenIpcFirmwareSource ,
156+ GregApfpvFirmwareSource
157+ } ;
150158
151159 #endregion
152160
@@ -201,6 +209,7 @@ private void InitializeProperties()
201209 FirmwareUpgradeInProgress = false ;
202210 IsFirmwareExpanded = true ;
203211 IsBootloaderExpanded = false ;
212+ SelectedFirmwareSource = OpenIpcFirmwareSource ;
204213 }
205214
206215 partial void OnIsFirmwareExpandedChanged ( bool value )
@@ -299,6 +308,15 @@ partial void OnSelectedFirmwareBySocChanged(string value)
299308 _bRecursionSelectGuard = false ;
300309 UpdateCanExecuteCommands ( ) ;
301310 }
311+
312+ partial void OnSelectedFirmwareSourceChanged ( string value )
313+ {
314+ if ( string . IsNullOrWhiteSpace ( value ) || _bRecursionSelectGuard )
315+ return ;
316+
317+ ClearFirmwareSelectionsAndCollections ( ) ;
318+ _ = LoadManufacturersAsync ( ) ;
319+ }
302320
303321 partial void OnSelectedManufacturerChanged ( string value )
304322 {
@@ -593,6 +611,30 @@ private void ClearForm()
593611 UpdateCanExecuteCommands ( ) ;
594612 }
595613
614+ private void ClearFirmwareSelectionsAndCollections ( )
615+ {
616+ _bRecursionSelectGuard = true ;
617+
618+ SelectedManufacturer = string . Empty ;
619+ SelectedDevice = string . Empty ;
620+ SelectedFirmware = string . Empty ;
621+ SelectedFirmwareBySoc = string . Empty ;
622+ ManualLocalFirmwarePackageFile = string . Empty ;
623+
624+ IsLocalFirmwarePackageSelected = false ;
625+ IsManufacturerDeviceFirmwareComboSelected = false ;
626+ IsManualUpdateEnabled = true ;
627+ IsFirmwareBySocSelected = false ;
628+
629+ Manufacturers . Clear ( ) ;
630+ Devices . Clear ( ) ;
631+ Firmwares . Clear ( ) ;
632+ FirmwareBySoc . Clear ( ) ;
633+
634+ _bRecursionSelectGuard = false ;
635+ UpdateCanExecuteCommands ( ) ;
636+ }
637+
596638 private bool CanExecuteDownloadFirmware ( )
597639 {
598640 return CanConnect &&
@@ -646,7 +688,9 @@ private async Task<FirmwareData> FetchFirmwareListAsync()
646688
647689 Logger . Information ( $ "Fetched { filenames . Count ( ) } firmware files.") ;
648690
649- FirmwareData firmwareData = ProcessFilenames ( filenames ) ;
691+ FirmwareData firmwareData = IsGregApfpvSourceSelected ( )
692+ ? new FirmwareData { Manufacturers = new ObservableCollection < Manufacturer > ( ) }
693+ : ProcessFilenames ( filenames ) ;
650694
651695 // Populate FirmwareBySoc
652696 PopulateFirmwareBySoc ( filenames ) ; // Calling populate method here
@@ -696,11 +740,31 @@ private void PopulateFirmwareBySoc(IEnumerable<string> filenames)
696740
697741 private async Task < IEnumerable < string > > GetFilenamesAsync ( )
698742 {
699- var response = await _gitHubService . GetGitHubDataAsync ( OpenIPC . OpenIPCBuilderGitHubApiUrl ) ;
700- var releaseData = JObject . Parse ( response . ToString ( ) ) ;
701- var assets = releaseData [ "assets" ] ;
702- return assets ? . Select ( asset => asset [ "name" ] ? . ToString ( ) ) . Where ( name => ! string . IsNullOrEmpty ( name ) ) ??
703- Enumerable . Empty < string > ( ) ;
743+ if ( IsGregApfpvSourceSelected ( ) )
744+ {
745+ var response = await _gitHubService . GetGitHubDataAsync ( OpenIPC . GregApfpvContentsGitHubApiUrl ) ;
746+ if ( string . IsNullOrEmpty ( response ) )
747+ return Enumerable . Empty < string > ( ) ;
748+
749+ var items = JArray . Parse ( response ) ;
750+ return items
751+ . Where ( item => item [ "type" ] ? . ToString ( ) == "file" )
752+ . Select ( item => item [ "name" ] ? . ToString ( ) )
753+ . Where ( name => ! string . IsNullOrEmpty ( name ) )
754+ . Select ( name => name ! )
755+ . Where ( name => name . EndsWith ( ".tgz" , StringComparison . OrdinalIgnoreCase ) ) ;
756+ }
757+ else
758+ {
759+ var response = await _gitHubService . GetGitHubDataAsync ( OpenIPC . OpenIPCBuilderGitHubApiUrl ) ;
760+ if ( string . IsNullOrEmpty ( response ) )
761+ return Enumerable . Empty < string > ( ) ;
762+
763+ var releaseData = JObject . Parse ( response ) ;
764+ var assets = releaseData [ "assets" ] ;
765+ return assets ? . Select ( asset => asset [ "name" ] ? . ToString ( ) ) . Where ( name => ! string . IsNullOrEmpty ( name ) ) ??
766+ Enumerable . Empty < string > ( ) ;
767+ }
704768 }
705769
706770 private async Task < IEnumerable < string > > GetBootloaderFilenamesAsync ( )
@@ -1385,7 +1449,7 @@ private async Task PerformFirmwareUpgradeFromSocAsync()
13851449 if ( ! string . IsNullOrEmpty ( firmwwareFile ) )
13861450 {
13871451 filename = firmwwareFile ;
1388- downloadUrl = $ "https://github.com/OpenIPC/builder/releases/download/latest/ { firmwwareFile } " ;
1452+ downloadUrl = BuildFirmwareDownloadUrl ( firmwwareFile ) ;
13891453 }
13901454
13911455 else
@@ -1441,7 +1505,7 @@ private async Task PerformFirmwareUpgradeFromDropdownAsync()
14411505 ! string . IsNullOrEmpty ( firmware ? . Name ) )
14421506 {
14431507 filename = firmware . PackageFile ;
1444- downloadUrl = $ "https://github.com/OpenIPC/builder/releases/download/latest/ { filename } " ;
1508+ downloadUrl = BuildFirmwareDownloadUrl ( filename ) ;
14451509 }
14461510
14471511 else
@@ -1727,6 +1791,19 @@ public async Task SelectLocalFirmwarePackage(Window window)
17271791 }
17281792 }
17291793
1794+ private bool IsGregApfpvSourceSelected ( )
1795+ {
1796+ return string . Equals ( SelectedFirmwareSource , GregApfpvFirmwareSource , StringComparison . OrdinalIgnoreCase ) ;
1797+ }
1798+
1799+ private string BuildFirmwareDownloadUrl ( string firmwareFilename )
1800+ {
1801+ if ( IsGregApfpvSourceSelected ( ) )
1802+ return $ "{ OpenIPC . GregApfpvRawBaseUrl } { firmwareFilename } ";
1803+
1804+ return $ "https://github.com/OpenIPC/builder/releases/download/latest/{ firmwareFilename } ";
1805+ }
1806+
17301807 #endregion
17311808}
17321809
0 commit comments