Merge remote-tracking branch 'origin/dev' into release-candidate
This commit is contained in:
		
						commit
						728320b713
					
				
							
								
								
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -30,7 +30,7 @@ bindings/ | ||||
| Brewfile.lock.json | ||||
| 
 | ||||
| # Visual Studio Code | ||||
| .vscode/ | ||||
| /.vscode/ | ||||
| 
 | ||||
| # Kate | ||||
| .kateproject | ||||
|  | ||||
| @ -152,7 +152,12 @@ bool avr_isp_auto_set_spi_speed_start_pmode(AvrIsp* instance) { | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     if(instance->spi) avr_isp_spi_sw_free(instance->spi); | ||||
| 
 | ||||
|     if(instance->spi) { | ||||
|         avr_isp_spi_sw_free(instance->spi); | ||||
|         instance->spi = NULL; | ||||
|     } | ||||
| 
 | ||||
|     return false; | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -317,7 +317,12 @@ static bool avr_isp_prog_auto_set_spi_speed_start_pmode(AvrIspProg* instance) { | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     if(instance->spi) avr_isp_spi_sw_free(instance->spi); | ||||
| 
 | ||||
|     if(instance->spi) { | ||||
|         avr_isp_spi_sw_free(instance->spi); | ||||
|         instance->spi = NULL; | ||||
|     } | ||||
| 
 | ||||
|     return false; | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -85,11 +85,6 @@ bool nfc_scene_read_on_event(void* context, SceneManagerEvent event) { | ||||
|             scene_manager_next_scene(nfc->scene_manager, NfcSceneMfDesfireReadSuccess); | ||||
|             DOLPHIN_DEED(DolphinDeedNfcReadSuccess); | ||||
|             consumed = true; | ||||
|         } else if(event.event == NfcWorkerEventReadBankCard) { | ||||
|             notification_message(nfc->notifications, &sequence_success); | ||||
|             scene_manager_next_scene(nfc->scene_manager, NfcSceneEmvReadSuccess); | ||||
|             DOLPHIN_DEED(DolphinDeedNfcReadSuccess); | ||||
|             consumed = true; | ||||
|         } else if(event.event == NfcWorkerEventReadMfClassicDictAttackRequired) { | ||||
|             if(mf_classic_dict_check_presence(MfClassicDictTypeSystem)) { | ||||
|                 scene_manager_next_scene(nfc->scene_manager, NfcSceneMfClassicDictAttack); | ||||
|  | ||||
| @ -5,7 +5,6 @@ enum SubmenuIndex { | ||||
|     SubmenuIndexReadMifareClassic, | ||||
|     SubmenuIndexReadMifareDesfire, | ||||
|     SubmenuIndexReadMfUltralight, | ||||
|     SubmenuIndexReadEMV, | ||||
|     SubmenuIndexReadNFCA, | ||||
| }; | ||||
| 
 | ||||
| @ -37,12 +36,6 @@ void nfc_scene_read_card_type_on_enter(void* context) { | ||||
|         SubmenuIndexReadMfUltralight, | ||||
|         nfc_scene_read_card_type_submenu_callback, | ||||
|         nfc); | ||||
|     submenu_add_item( | ||||
|         submenu, | ||||
|         "Read EMV card", | ||||
|         SubmenuIndexReadEMV, | ||||
|         nfc_scene_read_card_type_submenu_callback, | ||||
|         nfc); | ||||
|     submenu_add_item( | ||||
|         submenu, | ||||
|         "Read NFC-A data", | ||||
| @ -75,11 +68,6 @@ bool nfc_scene_read_card_type_on_event(void* context, SceneManagerEvent event) { | ||||
|             scene_manager_next_scene(nfc->scene_manager, NfcSceneRead); | ||||
|             consumed = true; | ||||
|         } | ||||
|         if(event.event == SubmenuIndexReadEMV) { | ||||
|             nfc->dev->dev_data.read_mode = NfcReadModeEMV; | ||||
|             scene_manager_next_scene(nfc->scene_manager, NfcSceneRead); | ||||
|             consumed = true; | ||||
|         } | ||||
|         if(event.event == SubmenuIndexReadNFCA) { | ||||
|             nfc->dev->dev_data.read_mode = NfcReadModeNFCA; | ||||
|             scene_manager_next_scene(nfc->scene_manager, NfcSceneRead); | ||||
|  | ||||
| @ -230,7 +230,11 @@ bool subghz_scene_read_raw_on_event(void* context, SceneManagerEvent event) { | ||||
|                    (subghz->txrx->txrx_state == SubGhzTxRxStateSleep)) { | ||||
|                     if(!subghz_tx_start(subghz, subghz->txrx->fff_data)) { | ||||
|                         subghz->txrx->rx_key_state = SubGhzRxKeyStateBack; | ||||
|                         scene_manager_next_scene(subghz->scene_manager, SubGhzSceneShowOnlyRx); | ||||
|                         subghz_read_raw_set_status( | ||||
|                             subghz->subghz_read_raw, | ||||
|                             SubGhzReadRAWStatusIDLE, | ||||
|                             "", | ||||
|                             subghz->txrx->raw_threshold_rssi); | ||||
|                     } else { | ||||
|                         if(scene_manager_has_previous_scene( | ||||
|                                subghz->scene_manager, SubGhzSceneSaved) || | ||||
|  | ||||
| @ -70,9 +70,7 @@ bool subghz_scene_transmitter_on_event(void* context, SceneManagerEvent event) { | ||||
|             } | ||||
|             if((subghz->txrx->txrx_state == SubGhzTxRxStateIDLE) || | ||||
|                (subghz->txrx->txrx_state == SubGhzTxRxStateSleep)) { | ||||
|                 if(!subghz_tx_start(subghz, subghz->txrx->fff_data)) { | ||||
|                     scene_manager_next_scene(subghz->scene_manager, SubGhzSceneShowOnlyRx); | ||||
|                 } else { | ||||
|                 if(subghz_tx_start(subghz, subghz->txrx->fff_data)) { | ||||
|                     subghz->state_notifications = SubGhzNotificationStateTx; | ||||
|                     subghz_scene_transmitter_update_data_show(subghz); | ||||
|                     DOLPHIN_DEED(DolphinDeedSubGhzSend); | ||||
|  | ||||
| @ -105,9 +105,11 @@ static bool subghz_tx(SubGhz* subghz, uint32_t frequency) { | ||||
|     furi_hal_subghz_set_frequency_and_path(frequency); | ||||
|     furi_hal_gpio_write(&gpio_cc1101_g0, false); | ||||
|     furi_hal_gpio_init(&gpio_cc1101_g0, GpioModeOutputPushPull, GpioPullNo, GpioSpeedLow); | ||||
|     subghz_speaker_on(subghz); | ||||
|     bool ret = furi_hal_subghz_tx(); | ||||
|     if(ret) { | ||||
|         subghz_speaker_on(subghz); | ||||
|         subghz->txrx->txrx_state = SubGhzTxRxStateTx; | ||||
|     } | ||||
|     return ret; | ||||
| } | ||||
| 
 | ||||
| @ -115,6 +117,7 @@ void subghz_idle(SubGhz* subghz) { | ||||
|     furi_assert(subghz); | ||||
|     furi_assert(subghz->txrx->txrx_state != SubGhzTxRxStateSleep); | ||||
|     furi_hal_subghz_idle(); | ||||
|     subghz_speaker_off(subghz); | ||||
|     subghz->txrx->txrx_state = SubGhzTxRxStateIDLE; | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -56,7 +56,6 @@ typedef enum { | ||||
|     NfcReadModeMfClassic, | ||||
|     NfcReadModeMfUltralight, | ||||
|     NfcReadModeMfDesfire, | ||||
|     NfcReadModeEMV, | ||||
|     NfcReadModeNFCA, | ||||
| } NfcReadMode; | ||||
| 
 | ||||
|  | ||||
| @ -229,69 +229,6 @@ static bool nfc_worker_read_mf_desfire(NfcWorker* nfc_worker, FuriHalNfcTxRxCont | ||||
|     return read_success; | ||||
| } | ||||
| 
 | ||||
| static bool nfc_worker_read_bank_card(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* tx_rx) { | ||||
|     bool read_success = false; | ||||
|     EmvApplication emv_app = {}; | ||||
|     EmvData* result = &nfc_worker->dev_data->emv_data; | ||||
| 
 | ||||
|     if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug)) { | ||||
|         reader_analyzer_prepare_tx_rx(nfc_worker->reader_analyzer, tx_rx, false); | ||||
|         reader_analyzer_start(nfc_worker->reader_analyzer, ReaderAnalyzerModeDebugLog); | ||||
|     } | ||||
| 
 | ||||
|     // Bank cards require strong field to start application. If we find AID, try at least several
 | ||||
|     // times to start EMV application
 | ||||
|     uint8_t start_application_attempts = 0; | ||||
|     while(start_application_attempts < 3) { | ||||
|         if(nfc_worker->state != NfcWorkerStateRead) break; | ||||
|         start_application_attempts++; | ||||
|         if(!furi_hal_nfc_detect(&nfc_worker->dev_data->nfc_data, 300)) break; | ||||
|         if(emv_read_bank_card(tx_rx, &emv_app)) { | ||||
|             FURI_LOG_D(TAG, "Bank card number read from %d attempt", start_application_attempts); | ||||
|             break; | ||||
|         } else if(emv_app.aid_len && !emv_app.app_started) { | ||||
|             FURI_LOG_D( | ||||
|                 TAG, | ||||
|                 "AID found but failed to start EMV app from %d attempt", | ||||
|                 start_application_attempts); | ||||
|             furi_hal_nfc_sleep(); | ||||
|             continue; | ||||
|         } else { | ||||
|             FURI_LOG_D(TAG, "Failed to find AID"); | ||||
|             break; | ||||
|         } | ||||
|     } | ||||
|     // Copy data
 | ||||
|     if(emv_app.aid_len) { | ||||
|         result->aid_len = emv_app.aid_len; | ||||
|         memcpy(result->aid, emv_app.aid, result->aid_len); | ||||
|         read_success = true; | ||||
|     } | ||||
|     if(emv_app.card_number_len) { | ||||
|         result->number_len = emv_app.card_number_len; | ||||
|         memcpy(result->number, emv_app.card_number, result->number_len); | ||||
|     } | ||||
|     if(emv_app.name_found) { | ||||
|         memcpy(result->name, emv_app.name, sizeof(emv_app.name)); | ||||
|     } | ||||
|     if(emv_app.exp_month) { | ||||
|         result->exp_mon = emv_app.exp_month; | ||||
|         result->exp_year = emv_app.exp_year; | ||||
|     } | ||||
|     if(emv_app.country_code) { | ||||
|         result->country_code = emv_app.country_code; | ||||
|     } | ||||
|     if(emv_app.currency_code) { | ||||
|         result->currency_code = emv_app.currency_code; | ||||
|     } | ||||
| 
 | ||||
|     if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug)) { | ||||
|         reader_analyzer_stop(nfc_worker->reader_analyzer); | ||||
|     } | ||||
| 
 | ||||
|     return read_success; | ||||
| } | ||||
| 
 | ||||
| static bool nfc_worker_read_nfca(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* tx_rx) { | ||||
|     FuriHalNfcDevData* nfc_data = &nfc_worker->dev_data->nfc_data; | ||||
| 
 | ||||
| @ -315,14 +252,6 @@ static bool nfc_worker_read_nfca(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* t | ||||
|             nfc_worker->dev_data->protocol = NfcDeviceProtocolUnknown; | ||||
|         } | ||||
|         card_read = true; | ||||
|     } else if(nfc_data->interface == FuriHalNfcInterfaceIsoDep) { | ||||
|         FURI_LOG_I(TAG, "ISO14443-4 card detected"); | ||||
|         nfc_worker->dev_data->protocol = NfcDeviceProtocolEMV; | ||||
|         if(!nfc_worker_read_bank_card(nfc_worker, tx_rx)) { | ||||
|             FURI_LOG_I(TAG, "Unknown card. Save UID"); | ||||
|             nfc_worker->dev_data->protocol = NfcDeviceProtocolUnknown; | ||||
|         } | ||||
|         card_read = true; | ||||
|     } else { | ||||
|         nfc_worker->dev_data->protocol = NfcDeviceProtocolUnknown; | ||||
|         card_read = true; | ||||
| @ -358,9 +287,6 @@ void nfc_worker_read(NfcWorker* nfc_worker) { | ||||
|                     } else if(dev_data->protocol == NfcDeviceProtocolMifareDesfire) { | ||||
|                         event = NfcWorkerEventReadMfDesfire; | ||||
|                         break; | ||||
|                     } else if(dev_data->protocol == NfcDeviceProtocolEMV) { | ||||
|                         event = NfcWorkerEventReadBankCard; | ||||
|                         break; | ||||
|                     } else if(dev_data->protocol == NfcDeviceProtocolUnknown) { | ||||
|                         event = NfcWorkerEventReadUidNfcA; | ||||
|                         break; | ||||
| @ -444,12 +370,6 @@ void nfc_worker_read_type(NfcWorker* nfc_worker) { | ||||
|                         event = NfcWorkerEventReadMfDesfire; | ||||
|                         break; | ||||
|                     } | ||||
|                 } else if(read_mode == NfcReadModeEMV) { | ||||
|                     nfc_worker->dev_data->protocol = NfcDeviceProtocolEMV; | ||||
|                     if(nfc_worker_read_bank_card(nfc_worker, &tx_rx)) { | ||||
|                         event = NfcWorkerEventReadBankCard; | ||||
|                         break; | ||||
|                     } | ||||
|                 } else if(read_mode == NfcReadModeNFCA) { | ||||
|                     nfc_worker->dev_data->protocol = NfcDeviceProtocolUnknown; | ||||
|                     event = NfcWorkerEventReadUidNfcA; | ||||
|  | ||||
| @ -39,7 +39,6 @@ typedef enum { | ||||
|     NfcWorkerEventReadMfClassicDone, | ||||
|     NfcWorkerEventReadMfClassicLoadKeyCache, | ||||
|     NfcWorkerEventReadMfClassicDictAttackRequired, | ||||
|     NfcWorkerEventReadBankCard, | ||||
| 
 | ||||
|     // Nfc worker common events
 | ||||
|     NfcWorkerEventSuccess, | ||||
|  | ||||
| @ -6,7 +6,6 @@ | ||||
| #include <lib/toolbox/stream/file_stream.h> | ||||
| 
 | ||||
| #include <lib/nfc/protocols/nfc_util.h> | ||||
| #include <lib/nfc/protocols/emv.h> | ||||
| #include <lib/nfc/protocols/mifare_common.h> | ||||
| #include <lib/nfc/protocols/mifare_ultralight.h> | ||||
| #include <lib/nfc/protocols/mifare_classic.h> | ||||
|  | ||||
| @ -181,9 +181,9 @@ class Main(App): | ||||
|         ) as zf: | ||||
|             for component_key in sdk_components_keys: | ||||
|                 component_path = self._dist_components.get(component_key) | ||||
|                 components_paths[component_key] = basename(component_path) | ||||
| 
 | ||||
|                 if component_key.endswith(".dir"): | ||||
|                     components_paths[component_key] = basename(component_path) | ||||
|                     for root, dirnames, files in walk(component_path): | ||||
|                         if "__pycache__" in dirnames: | ||||
|                             dirnames.remove("__pycache__") | ||||
| @ -199,7 +199,9 @@ class Main(App): | ||||
|                                 ), | ||||
|                             ) | ||||
|                 else: | ||||
|                     zf.write(component_path, basename(component_path)) | ||||
|                     # We use fixed names for files to avoid having to regenerate VSCode project | ||||
|                     components_paths[component_key] = component_key | ||||
|                     zf.write(component_path, component_key) | ||||
| 
 | ||||
|             zf.writestr( | ||||
|                 "components.json", | ||||
|  | ||||
| @ -163,6 +163,18 @@ dist_env.Alias("flash", openocd_target) | ||||
| if env["FORCE"]: | ||||
|     env.AlwaysBuild(openocd_target) | ||||
| 
 | ||||
| 
 | ||||
| firmware_jflash = dist_env.JFlash( | ||||
|     dist_env["UFBT_STATE_DIR"].File("jflash"), | ||||
|     dist_env["FW_BIN"], | ||||
|     JFLASHADDR="0x20000000", | ||||
| ) | ||||
| dist_env.Alias("firmware_jflash", firmware_jflash) | ||||
| dist_env.Alias("jflash", firmware_jflash) | ||||
| if env["FORCE"]: | ||||
|     env.AlwaysBuild(firmware_jflash) | ||||
| 
 | ||||
| 
 | ||||
| firmware_debug = dist_env.PhonyTarget( | ||||
|     "debug", | ||||
|     "${GDBPYCOM}", | ||||
| @ -391,3 +403,13 @@ AddPostAction( | ||||
| dist_env.Precious(app_template_dist) | ||||
| dist_env.NoClean(app_template_dist) | ||||
| dist_env.Alias("create", app_template_dist) | ||||
| 
 | ||||
| dist_env.PhonyTarget( | ||||
|     "get_blackmagic", | ||||
|     "@echo $( ${BLACKMAGIC_ADDR} $)", | ||||
| ) | ||||
| 
 | ||||
| dist_env.PhonyTarget( | ||||
|     "get_apiversion", | ||||
|     "@echo $( ${UFBT_API_VERSION} $)", | ||||
| ) | ||||
|  | ||||
| @ -2,19 +2,16 @@ | ||||
|     // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 | ||||
|     "version": "0.2.0", | ||||
|     "inputs": [ | ||||
|         // { | ||||
|         //     "id": "BLACKMAGIC", | ||||
|         //     "type": "command", | ||||
|         //     "command": "shellCommand.execute", | ||||
|         //     "args": { | ||||
|         //         "useSingleResult": true, | ||||
|         //         "env": { | ||||
|         //             "PATH": "${workspaceFolder};${env:PATH}" | ||||
|         //         }, | ||||
|         //         "command": "./fbt get_blackmagic", | ||||
|         //         "description": "Get Blackmagic device", | ||||
|         //     } | ||||
|         // }, | ||||
|         { | ||||
|             "id": "BLACKMAGIC", | ||||
|             "type": "command", | ||||
|             "command": "shellCommand.execute", | ||||
|             "args": { | ||||
|                 "description": "Get Blackmagic device", | ||||
|                 "useSingleResult": true, | ||||
|                 "command": "ufbt -s get_blackmagic", | ||||
|             } | ||||
|         }, | ||||
|     ], | ||||
|     "configurations": [ | ||||
|         { | ||||
| @ -57,26 +54,26 @@ | ||||
|             ], | ||||
|             // "showDevDebugOutput": "raw", | ||||
|         }, | ||||
|         // { | ||||
|         //     "name": "Attach FW (blackmagic)", | ||||
|         //     "cwd": "${workspaceFolder}", | ||||
|         //     "executable": "@UFBT_FIRMWARE_ELF@", | ||||
|         //     "request": "attach", | ||||
|         //     "type": "cortex-debug", | ||||
|         //     "servertype": "external", | ||||
|         //     "gdbTarget": "${input:BLACKMAGIC}", | ||||
|         //     "svdFile": "@UFBT_DEBUG_DIR@/STM32WB55_CM4.svd", | ||||
|         //     "rtos": "FreeRTOS", | ||||
|         //     "postAttachCommands": [ | ||||
|         //         "monitor swdp_scan", | ||||
|         //         "attach 1", | ||||
|         //         "set confirm off", | ||||
|         //         "set mem inaccessible-by-default off", | ||||
|         //         "source @UFBT_DEBUG_DIR@/flipperapps.py", | ||||
|         //         "fap-set-debug-elf-root @UFBT_DEBUG_ELF_DIR@" | ||||
|         //     ] | ||||
|         //     // "showDevDebugOutput": "raw", | ||||
|         // }, | ||||
|         { | ||||
|             "name": "Attach FW (blackmagic)", | ||||
|             "cwd": "${workspaceFolder}", | ||||
|             "executable": "@UFBT_FIRMWARE_ELF@", | ||||
|             "request": "attach", | ||||
|             "type": "cortex-debug", | ||||
|             "servertype": "external", | ||||
|             "gdbTarget": "${input:BLACKMAGIC}", | ||||
|             "svdFile": "@UFBT_DEBUG_DIR@/STM32WB55_CM4.svd", | ||||
|             "rtos": "FreeRTOS", | ||||
|             "postAttachCommands": [ | ||||
|                 "monitor swdp_scan", | ||||
|                 "attach 1", | ||||
|                 "set confirm off", | ||||
|                 "set mem inaccessible-by-default off", | ||||
|                 "source @UFBT_DEBUG_DIR@/flipperapps.py", | ||||
|                 "fap-set-debug-elf-root @UFBT_DEBUG_ELF_DIR@" | ||||
|             ] | ||||
|             // "showDevDebugOutput": "raw", | ||||
|         }, | ||||
|         { | ||||
|             "name": "Attach FW (JLink)", | ||||
|             "cwd": "${workspaceFolder}", | ||||
|  | ||||
							
								
								
									
										36
									
								
								scripts/ufbt/project_template/.vscode/tasks.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										36
									
								
								scripts/ufbt/project_template/.vscode/tasks.json
									
									
									
									
										vendored
									
									
								
							| @ -20,24 +20,30 @@ | ||||
|             "type": "shell", | ||||
|             "command": "ufbt" | ||||
|         }, | ||||
|         { | ||||
|             "label": "Clean", | ||||
|             "group": "build", | ||||
|             "type": "shell", | ||||
|             "command": "ufbt -c" | ||||
|         }, | ||||
|         { | ||||
|             "label": "Flash FW (ST-Link)", | ||||
|             "group": "build", | ||||
|             "type": "shell", | ||||
|             "command": "ufbt FORCE=1 flash" | ||||
|         }, | ||||
|         // { | ||||
|         //     "label": "[NOTIMPL] Flash FW (blackmagic)", | ||||
|         //     "group": "build", | ||||
|         //     "type": "shell", | ||||
|         //     "command": "ufbt flash_blackmagic" | ||||
|         // }, | ||||
|         // { | ||||
|         //     "label": "[NOTIMPL] Flash FW (JLink)", | ||||
|         //     "group": "build", | ||||
|         //     "type": "shell", | ||||
|         //     "command": "ufbt FORCE=1 jflash" | ||||
|         // }, | ||||
|         { | ||||
|             "label": "Flash FW (blackmagic)", | ||||
|             "group": "build", | ||||
|             "type": "shell", | ||||
|             "command": "ufbt flash_blackmagic" | ||||
|         }, | ||||
|         { | ||||
|             "label": "Flash FW (JLink)", | ||||
|             "group": "build", | ||||
|             "type": "shell", | ||||
|             "command": "ufbt FORCE=1 jflash" | ||||
|         }, | ||||
|         { | ||||
|             "label": "Flash FW (USB, with resources)", | ||||
|             "group": "build", | ||||
| @ -49,6 +55,12 @@ | ||||
|             "group": "build", | ||||
|             "type": "shell", | ||||
|             "command": "ufbt update" | ||||
|         }, | ||||
|         { | ||||
|             "label": "Update VSCode config for current SDK", | ||||
|             "group": "build", | ||||
|             "type": "shell", | ||||
|             "command": "ufbt vscode_dist" | ||||
|         } | ||||
|     ] | ||||
| } | ||||
| @ -6,7 +6,7 @@ App( | ||||
|     apptype=FlipperAppType.EXTERNAL, | ||||
|     entry_point="@FBT_APPID@_app", | ||||
|     stack_size=2 * 1024, | ||||
|     fap_category="Misc", | ||||
|     fap_category="Examples", | ||||
|     # Optional values | ||||
|     # fap_version=(0, 1),  # (major, minor) | ||||
|     fap_icon="@FBT_APPID@.png",  # 10x10 1-bit PNG | ||||
|  | ||||
| @ -75,12 +75,6 @@ def generate(env, **kw): | ||||
|     if not sdk_state["meta"]["hw_target"].endswith(sdk_data["hardware"]): | ||||
|         raise StopError("SDK state file doesn't match hardware target") | ||||
| 
 | ||||
|     if sdk_state["meta"]["version"] != ufbt_state["version"]: | ||||
|         warn( | ||||
|             WarningOnByDefault, | ||||
|             f"Version mismatch: SDK state vs uFBT: {sdk_state['meta']['version']} vs {ufbt_state['version']}", | ||||
|         ) | ||||
| 
 | ||||
|     scripts_dir = sdk_current_sdk_dir_node.Dir(sdk_components["scripts.dir"]) | ||||
|     env.SetDefault( | ||||
|         # Paths | ||||
|  | ||||
| @ -1,5 +1,4 @@ | ||||
| from dataclasses import dataclass, field | ||||
| from os.path import dirname | ||||
| 
 | ||||
| from SCons.Node import NodeList | ||||
| from SCons.Warnings import warn, WarningOnByDefault | ||||
| @ -131,6 +130,7 @@ Depends(sdk_source, appenv.ProcessSdkDepends(f"{amalgamated_api}.d")) | ||||
| 
 | ||||
| appenv["SDK_DIR"] = appenv.Dir("${BUILD_DIR}/sdk_headers") | ||||
| sdk_header_tree = appenv.SDKHeaderTreeExtractor(appenv["SDK_DIR"], amalgamated_api) | ||||
| Depends(sdk_header_tree, appenv["SDK_DEFINITION"]) | ||||
| # AlwaysBuild(sdk_tree) | ||||
| Alias("sdk_tree", sdk_header_tree) | ||||
| extapps.sdk_tree = sdk_header_tree | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Aleksandr Kutuzov
						Aleksandr Kutuzov