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
|
Brewfile.lock.json
|
||||||
|
|
||||||
# Visual Studio Code
|
# Visual Studio Code
|
||||||
.vscode/
|
/.vscode/
|
||||||
|
|
||||||
# Kate
|
# Kate
|
||||||
.kateproject
|
.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;
|
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;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -85,11 +85,6 @@ bool nfc_scene_read_on_event(void* context, SceneManagerEvent event) {
|
|||||||
scene_manager_next_scene(nfc->scene_manager, NfcSceneMfDesfireReadSuccess);
|
scene_manager_next_scene(nfc->scene_manager, NfcSceneMfDesfireReadSuccess);
|
||||||
DOLPHIN_DEED(DolphinDeedNfcReadSuccess);
|
DOLPHIN_DEED(DolphinDeedNfcReadSuccess);
|
||||||
consumed = true;
|
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) {
|
} else if(event.event == NfcWorkerEventReadMfClassicDictAttackRequired) {
|
||||||
if(mf_classic_dict_check_presence(MfClassicDictTypeSystem)) {
|
if(mf_classic_dict_check_presence(MfClassicDictTypeSystem)) {
|
||||||
scene_manager_next_scene(nfc->scene_manager, NfcSceneMfClassicDictAttack);
|
scene_manager_next_scene(nfc->scene_manager, NfcSceneMfClassicDictAttack);
|
||||||
|
|||||||
@ -5,7 +5,6 @@ enum SubmenuIndex {
|
|||||||
SubmenuIndexReadMifareClassic,
|
SubmenuIndexReadMifareClassic,
|
||||||
SubmenuIndexReadMifareDesfire,
|
SubmenuIndexReadMifareDesfire,
|
||||||
SubmenuIndexReadMfUltralight,
|
SubmenuIndexReadMfUltralight,
|
||||||
SubmenuIndexReadEMV,
|
|
||||||
SubmenuIndexReadNFCA,
|
SubmenuIndexReadNFCA,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -37,12 +36,6 @@ void nfc_scene_read_card_type_on_enter(void* context) {
|
|||||||
SubmenuIndexReadMfUltralight,
|
SubmenuIndexReadMfUltralight,
|
||||||
nfc_scene_read_card_type_submenu_callback,
|
nfc_scene_read_card_type_submenu_callback,
|
||||||
nfc);
|
nfc);
|
||||||
submenu_add_item(
|
|
||||||
submenu,
|
|
||||||
"Read EMV card",
|
|
||||||
SubmenuIndexReadEMV,
|
|
||||||
nfc_scene_read_card_type_submenu_callback,
|
|
||||||
nfc);
|
|
||||||
submenu_add_item(
|
submenu_add_item(
|
||||||
submenu,
|
submenu,
|
||||||
"Read NFC-A data",
|
"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);
|
scene_manager_next_scene(nfc->scene_manager, NfcSceneRead);
|
||||||
consumed = true;
|
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) {
|
if(event.event == SubmenuIndexReadNFCA) {
|
||||||
nfc->dev->dev_data.read_mode = NfcReadModeNFCA;
|
nfc->dev->dev_data.read_mode = NfcReadModeNFCA;
|
||||||
scene_manager_next_scene(nfc->scene_manager, NfcSceneRead);
|
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)) {
|
(subghz->txrx->txrx_state == SubGhzTxRxStateSleep)) {
|
||||||
if(!subghz_tx_start(subghz, subghz->txrx->fff_data)) {
|
if(!subghz_tx_start(subghz, subghz->txrx->fff_data)) {
|
||||||
subghz->txrx->rx_key_state = SubGhzRxKeyStateBack;
|
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 {
|
} else {
|
||||||
if(scene_manager_has_previous_scene(
|
if(scene_manager_has_previous_scene(
|
||||||
subghz->scene_manager, SubGhzSceneSaved) ||
|
subghz->scene_manager, SubGhzSceneSaved) ||
|
||||||
|
|||||||
@ -70,9 +70,7 @@ bool subghz_scene_transmitter_on_event(void* context, SceneManagerEvent event) {
|
|||||||
}
|
}
|
||||||
if((subghz->txrx->txrx_state == SubGhzTxRxStateIDLE) ||
|
if((subghz->txrx->txrx_state == SubGhzTxRxStateIDLE) ||
|
||||||
(subghz->txrx->txrx_state == SubGhzTxRxStateSleep)) {
|
(subghz->txrx->txrx_state == SubGhzTxRxStateSleep)) {
|
||||||
if(!subghz_tx_start(subghz, subghz->txrx->fff_data)) {
|
if(subghz_tx_start(subghz, subghz->txrx->fff_data)) {
|
||||||
scene_manager_next_scene(subghz->scene_manager, SubGhzSceneShowOnlyRx);
|
|
||||||
} else {
|
|
||||||
subghz->state_notifications = SubGhzNotificationStateTx;
|
subghz->state_notifications = SubGhzNotificationStateTx;
|
||||||
subghz_scene_transmitter_update_data_show(subghz);
|
subghz_scene_transmitter_update_data_show(subghz);
|
||||||
DOLPHIN_DEED(DolphinDeedSubGhzSend);
|
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_subghz_set_frequency_and_path(frequency);
|
||||||
furi_hal_gpio_write(&gpio_cc1101_g0, false);
|
furi_hal_gpio_write(&gpio_cc1101_g0, false);
|
||||||
furi_hal_gpio_init(&gpio_cc1101_g0, GpioModeOutputPushPull, GpioPullNo, GpioSpeedLow);
|
furi_hal_gpio_init(&gpio_cc1101_g0, GpioModeOutputPushPull, GpioPullNo, GpioSpeedLow);
|
||||||
subghz_speaker_on(subghz);
|
|
||||||
bool ret = furi_hal_subghz_tx();
|
bool ret = furi_hal_subghz_tx();
|
||||||
subghz->txrx->txrx_state = SubGhzTxRxStateTx;
|
if(ret) {
|
||||||
|
subghz_speaker_on(subghz);
|
||||||
|
subghz->txrx->txrx_state = SubGhzTxRxStateTx;
|
||||||
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -115,6 +117,7 @@ void subghz_idle(SubGhz* subghz) {
|
|||||||
furi_assert(subghz);
|
furi_assert(subghz);
|
||||||
furi_assert(subghz->txrx->txrx_state != SubGhzTxRxStateSleep);
|
furi_assert(subghz->txrx->txrx_state != SubGhzTxRxStateSleep);
|
||||||
furi_hal_subghz_idle();
|
furi_hal_subghz_idle();
|
||||||
|
subghz_speaker_off(subghz);
|
||||||
subghz->txrx->txrx_state = SubGhzTxRxStateIDLE;
|
subghz->txrx->txrx_state = SubGhzTxRxStateIDLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -56,7 +56,6 @@ typedef enum {
|
|||||||
NfcReadModeMfClassic,
|
NfcReadModeMfClassic,
|
||||||
NfcReadModeMfUltralight,
|
NfcReadModeMfUltralight,
|
||||||
NfcReadModeMfDesfire,
|
NfcReadModeMfDesfire,
|
||||||
NfcReadModeEMV,
|
|
||||||
NfcReadModeNFCA,
|
NfcReadModeNFCA,
|
||||||
} NfcReadMode;
|
} NfcReadMode;
|
||||||
|
|
||||||
|
|||||||
@ -229,69 +229,6 @@ static bool nfc_worker_read_mf_desfire(NfcWorker* nfc_worker, FuriHalNfcTxRxCont
|
|||||||
return read_success;
|
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) {
|
static bool nfc_worker_read_nfca(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* tx_rx) {
|
||||||
FuriHalNfcDevData* nfc_data = &nfc_worker->dev_data->nfc_data;
|
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;
|
nfc_worker->dev_data->protocol = NfcDeviceProtocolUnknown;
|
||||||
}
|
}
|
||||||
card_read = true;
|
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 {
|
} else {
|
||||||
nfc_worker->dev_data->protocol = NfcDeviceProtocolUnknown;
|
nfc_worker->dev_data->protocol = NfcDeviceProtocolUnknown;
|
||||||
card_read = true;
|
card_read = true;
|
||||||
@ -358,9 +287,6 @@ void nfc_worker_read(NfcWorker* nfc_worker) {
|
|||||||
} else if(dev_data->protocol == NfcDeviceProtocolMifareDesfire) {
|
} else if(dev_data->protocol == NfcDeviceProtocolMifareDesfire) {
|
||||||
event = NfcWorkerEventReadMfDesfire;
|
event = NfcWorkerEventReadMfDesfire;
|
||||||
break;
|
break;
|
||||||
} else if(dev_data->protocol == NfcDeviceProtocolEMV) {
|
|
||||||
event = NfcWorkerEventReadBankCard;
|
|
||||||
break;
|
|
||||||
} else if(dev_data->protocol == NfcDeviceProtocolUnknown) {
|
} else if(dev_data->protocol == NfcDeviceProtocolUnknown) {
|
||||||
event = NfcWorkerEventReadUidNfcA;
|
event = NfcWorkerEventReadUidNfcA;
|
||||||
break;
|
break;
|
||||||
@ -444,12 +370,6 @@ void nfc_worker_read_type(NfcWorker* nfc_worker) {
|
|||||||
event = NfcWorkerEventReadMfDesfire;
|
event = NfcWorkerEventReadMfDesfire;
|
||||||
break;
|
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) {
|
} else if(read_mode == NfcReadModeNFCA) {
|
||||||
nfc_worker->dev_data->protocol = NfcDeviceProtocolUnknown;
|
nfc_worker->dev_data->protocol = NfcDeviceProtocolUnknown;
|
||||||
event = NfcWorkerEventReadUidNfcA;
|
event = NfcWorkerEventReadUidNfcA;
|
||||||
|
|||||||
@ -39,7 +39,6 @@ typedef enum {
|
|||||||
NfcWorkerEventReadMfClassicDone,
|
NfcWorkerEventReadMfClassicDone,
|
||||||
NfcWorkerEventReadMfClassicLoadKeyCache,
|
NfcWorkerEventReadMfClassicLoadKeyCache,
|
||||||
NfcWorkerEventReadMfClassicDictAttackRequired,
|
NfcWorkerEventReadMfClassicDictAttackRequired,
|
||||||
NfcWorkerEventReadBankCard,
|
|
||||||
|
|
||||||
// Nfc worker common events
|
// Nfc worker common events
|
||||||
NfcWorkerEventSuccess,
|
NfcWorkerEventSuccess,
|
||||||
|
|||||||
@ -6,7 +6,6 @@
|
|||||||
#include <lib/toolbox/stream/file_stream.h>
|
#include <lib/toolbox/stream/file_stream.h>
|
||||||
|
|
||||||
#include <lib/nfc/protocols/nfc_util.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_common.h>
|
||||||
#include <lib/nfc/protocols/mifare_ultralight.h>
|
#include <lib/nfc/protocols/mifare_ultralight.h>
|
||||||
#include <lib/nfc/protocols/mifare_classic.h>
|
#include <lib/nfc/protocols/mifare_classic.h>
|
||||||
|
|||||||
@ -181,9 +181,9 @@ class Main(App):
|
|||||||
) as zf:
|
) as zf:
|
||||||
for component_key in sdk_components_keys:
|
for component_key in sdk_components_keys:
|
||||||
component_path = self._dist_components.get(component_key)
|
component_path = self._dist_components.get(component_key)
|
||||||
components_paths[component_key] = basename(component_path)
|
|
||||||
|
|
||||||
if component_key.endswith(".dir"):
|
if component_key.endswith(".dir"):
|
||||||
|
components_paths[component_key] = basename(component_path)
|
||||||
for root, dirnames, files in walk(component_path):
|
for root, dirnames, files in walk(component_path):
|
||||||
if "__pycache__" in dirnames:
|
if "__pycache__" in dirnames:
|
||||||
dirnames.remove("__pycache__")
|
dirnames.remove("__pycache__")
|
||||||
@ -199,7 +199,9 @@ class Main(App):
|
|||||||
),
|
),
|
||||||
)
|
)
|
||||||
else:
|
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(
|
zf.writestr(
|
||||||
"components.json",
|
"components.json",
|
||||||
|
|||||||
@ -163,6 +163,18 @@ dist_env.Alias("flash", openocd_target)
|
|||||||
if env["FORCE"]:
|
if env["FORCE"]:
|
||||||
env.AlwaysBuild(openocd_target)
|
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(
|
firmware_debug = dist_env.PhonyTarget(
|
||||||
"debug",
|
"debug",
|
||||||
"${GDBPYCOM}",
|
"${GDBPYCOM}",
|
||||||
@ -391,3 +403,13 @@ AddPostAction(
|
|||||||
dist_env.Precious(app_template_dist)
|
dist_env.Precious(app_template_dist)
|
||||||
dist_env.NoClean(app_template_dist)
|
dist_env.NoClean(app_template_dist)
|
||||||
dist_env.Alias("create", 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
|
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||||
"version": "0.2.0",
|
"version": "0.2.0",
|
||||||
"inputs": [
|
"inputs": [
|
||||||
// {
|
{
|
||||||
// "id": "BLACKMAGIC",
|
"id": "BLACKMAGIC",
|
||||||
// "type": "command",
|
"type": "command",
|
||||||
// "command": "shellCommand.execute",
|
"command": "shellCommand.execute",
|
||||||
// "args": {
|
"args": {
|
||||||
// "useSingleResult": true,
|
"description": "Get Blackmagic device",
|
||||||
// "env": {
|
"useSingleResult": true,
|
||||||
// "PATH": "${workspaceFolder};${env:PATH}"
|
"command": "ufbt -s get_blackmagic",
|
||||||
// },
|
}
|
||||||
// "command": "./fbt get_blackmagic",
|
},
|
||||||
// "description": "Get Blackmagic device",
|
|
||||||
// }
|
|
||||||
// },
|
|
||||||
],
|
],
|
||||||
"configurations": [
|
"configurations": [
|
||||||
{
|
{
|
||||||
@ -57,26 +54,26 @@
|
|||||||
],
|
],
|
||||||
// "showDevDebugOutput": "raw",
|
// "showDevDebugOutput": "raw",
|
||||||
},
|
},
|
||||||
// {
|
{
|
||||||
// "name": "Attach FW (blackmagic)",
|
"name": "Attach FW (blackmagic)",
|
||||||
// "cwd": "${workspaceFolder}",
|
"cwd": "${workspaceFolder}",
|
||||||
// "executable": "@UFBT_FIRMWARE_ELF@",
|
"executable": "@UFBT_FIRMWARE_ELF@",
|
||||||
// "request": "attach",
|
"request": "attach",
|
||||||
// "type": "cortex-debug",
|
"type": "cortex-debug",
|
||||||
// "servertype": "external",
|
"servertype": "external",
|
||||||
// "gdbTarget": "${input:BLACKMAGIC}",
|
"gdbTarget": "${input:BLACKMAGIC}",
|
||||||
// "svdFile": "@UFBT_DEBUG_DIR@/STM32WB55_CM4.svd",
|
"svdFile": "@UFBT_DEBUG_DIR@/STM32WB55_CM4.svd",
|
||||||
// "rtos": "FreeRTOS",
|
"rtos": "FreeRTOS",
|
||||||
// "postAttachCommands": [
|
"postAttachCommands": [
|
||||||
// "monitor swdp_scan",
|
"monitor swdp_scan",
|
||||||
// "attach 1",
|
"attach 1",
|
||||||
// "set confirm off",
|
"set confirm off",
|
||||||
// "set mem inaccessible-by-default off",
|
"set mem inaccessible-by-default off",
|
||||||
// "source @UFBT_DEBUG_DIR@/flipperapps.py",
|
"source @UFBT_DEBUG_DIR@/flipperapps.py",
|
||||||
// "fap-set-debug-elf-root @UFBT_DEBUG_ELF_DIR@"
|
"fap-set-debug-elf-root @UFBT_DEBUG_ELF_DIR@"
|
||||||
// ]
|
]
|
||||||
// // "showDevDebugOutput": "raw",
|
// "showDevDebugOutput": "raw",
|
||||||
// },
|
},
|
||||||
{
|
{
|
||||||
"name": "Attach FW (JLink)",
|
"name": "Attach FW (JLink)",
|
||||||
"cwd": "${workspaceFolder}",
|
"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",
|
"type": "shell",
|
||||||
"command": "ufbt"
|
"command": "ufbt"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"label": "Clean",
|
||||||
|
"group": "build",
|
||||||
|
"type": "shell",
|
||||||
|
"command": "ufbt -c"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"label": "Flash FW (ST-Link)",
|
"label": "Flash FW (ST-Link)",
|
||||||
"group": "build",
|
"group": "build",
|
||||||
"type": "shell",
|
"type": "shell",
|
||||||
"command": "ufbt FORCE=1 flash"
|
"command": "ufbt FORCE=1 flash"
|
||||||
},
|
},
|
||||||
// {
|
{
|
||||||
// "label": "[NOTIMPL] Flash FW (blackmagic)",
|
"label": "Flash FW (blackmagic)",
|
||||||
// "group": "build",
|
"group": "build",
|
||||||
// "type": "shell",
|
"type": "shell",
|
||||||
// "command": "ufbt flash_blackmagic"
|
"command": "ufbt flash_blackmagic"
|
||||||
// },
|
},
|
||||||
// {
|
{
|
||||||
// "label": "[NOTIMPL] Flash FW (JLink)",
|
"label": "Flash FW (JLink)",
|
||||||
// "group": "build",
|
"group": "build",
|
||||||
// "type": "shell",
|
"type": "shell",
|
||||||
// "command": "ufbt FORCE=1 jflash"
|
"command": "ufbt FORCE=1 jflash"
|
||||||
// },
|
},
|
||||||
{
|
{
|
||||||
"label": "Flash FW (USB, with resources)",
|
"label": "Flash FW (USB, with resources)",
|
||||||
"group": "build",
|
"group": "build",
|
||||||
@ -49,6 +55,12 @@
|
|||||||
"group": "build",
|
"group": "build",
|
||||||
"type": "shell",
|
"type": "shell",
|
||||||
"command": "ufbt update"
|
"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,
|
apptype=FlipperAppType.EXTERNAL,
|
||||||
entry_point="@FBT_APPID@_app",
|
entry_point="@FBT_APPID@_app",
|
||||||
stack_size=2 * 1024,
|
stack_size=2 * 1024,
|
||||||
fap_category="Misc",
|
fap_category="Examples",
|
||||||
# Optional values
|
# Optional values
|
||||||
# fap_version=(0, 1), # (major, minor)
|
# fap_version=(0, 1), # (major, minor)
|
||||||
fap_icon="@FBT_APPID@.png", # 10x10 1-bit PNG
|
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"]):
|
if not sdk_state["meta"]["hw_target"].endswith(sdk_data["hardware"]):
|
||||||
raise StopError("SDK state file doesn't match hardware target")
|
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"])
|
scripts_dir = sdk_current_sdk_dir_node.Dir(sdk_components["scripts.dir"])
|
||||||
env.SetDefault(
|
env.SetDefault(
|
||||||
# Paths
|
# Paths
|
||||||
|
|||||||
@ -1,5 +1,4 @@
|
|||||||
from dataclasses import dataclass, field
|
from dataclasses import dataclass, field
|
||||||
from os.path import dirname
|
|
||||||
|
|
||||||
from SCons.Node import NodeList
|
from SCons.Node import NodeList
|
||||||
from SCons.Warnings import warn, WarningOnByDefault
|
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")
|
appenv["SDK_DIR"] = appenv.Dir("${BUILD_DIR}/sdk_headers")
|
||||||
sdk_header_tree = appenv.SDKHeaderTreeExtractor(appenv["SDK_DIR"], amalgamated_api)
|
sdk_header_tree = appenv.SDKHeaderTreeExtractor(appenv["SDK_DIR"], amalgamated_api)
|
||||||
|
Depends(sdk_header_tree, appenv["SDK_DEFINITION"])
|
||||||
# AlwaysBuild(sdk_tree)
|
# AlwaysBuild(sdk_tree)
|
||||||
Alias("sdk_tree", sdk_header_tree)
|
Alias("sdk_tree", sdk_header_tree)
|
||||||
extapps.sdk_tree = sdk_header_tree
|
extapps.sdk_tree = sdk_header_tree
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user