1
mirror of https://github.com/DarkFlippers/unleashed-firmware.git synced 2025-12-12 04:34:43 +04:00

Merge branch 'fz-dev' into dev

This commit is contained in:
MX
2022-11-02 22:53:12 +03:00
54 changed files with 804 additions and 294 deletions

View File

@@ -33,10 +33,6 @@ coreenv = SConscript(
) )
SConscript("site_scons/cc.scons", exports={"ENV": coreenv}) SConscript("site_scons/cc.scons", exports={"ENV": coreenv})
# Store root dir in environment for certain tools
coreenv["ROOT_DIR"] = Dir(".")
# Create a separate "dist" environment and add construction envs to it # Create a separate "dist" environment and add construction envs to it
distenv = coreenv.Clone( distenv = coreenv.Clone(
tools=[ tools=[
@@ -233,13 +229,13 @@ distenv.PhonyTarget(
# Linter # Linter
distenv.PhonyTarget( distenv.PhonyTarget(
"lint", "lint",
"${PYTHON3} scripts/lint.py check ${LINT_SOURCES}", "${PYTHON3} ${FBT_SCRIPT_DIR}/lint.py check ${LINT_SOURCES}",
LINT_SOURCES=firmware_env["LINT_SOURCES"], LINT_SOURCES=firmware_env["LINT_SOURCES"],
) )
distenv.PhonyTarget( distenv.PhonyTarget(
"format", "format",
"${PYTHON3} scripts/lint.py format ${LINT_SOURCES}", "${PYTHON3} ${FBT_SCRIPT_DIR}/lint.py format ${LINT_SOURCES}",
LINT_SOURCES=firmware_env["LINT_SOURCES"], LINT_SOURCES=firmware_env["LINT_SOURCES"],
) )
@@ -280,7 +276,7 @@ distenv.PhonyTarget(
) )
# Start Flipper CLI via PySerial's miniterm # Start Flipper CLI via PySerial's miniterm
distenv.PhonyTarget("cli", "${PYTHON3} scripts/serial_cli.py") distenv.PhonyTarget("cli", "${PYTHON3} ${FBT_SCRIPT_DIR}/serial_cli.py")
# Find blackmagic probe # Find blackmagic probe

Binary file not shown.

After

Width:  |  Height:  |  Size: 308 B

View File

@@ -9,7 +9,7 @@ App(
], ],
stack_size=4 * 1024, stack_size=4 * 1024,
order=30, order=30,
fap_icon="../../../assets/icons/Archive/125_10px.png", fap_icon="125_10px.png",
fap_category="Tools", fap_category="Tools",
fap_libs=["mbedtls"], fap_libs=["mbedtls"],
fap_private_libs=[ fap_private_libs=[

View File

@@ -9,8 +9,6 @@
#include <furi_hal.h> #include <furi_hal.h>
#include <stdlib.h> #include <stdlib.h>
#include <st25r3916.h>
#include <rfal_analogConfig.h>
#include <rfal_rf.h> #include <rfal_rf.h>
#include <platform.h> #include <platform.h>

View File

@@ -1,5 +1,4 @@
#include "rfal_picopass.h" #include "rfal_picopass.h"
#include "utils.h"
#define RFAL_PICOPASS_TXRX_FLAGS \ #define RFAL_PICOPASS_TXRX_FLAGS \
(FURI_HAL_NFC_LL_TXRX_FLAGS_CRC_TX_MANUAL | FURI_HAL_NFC_LL_TXRX_FLAGS_AGC_ON | \ (FURI_HAL_NFC_LL_TXRX_FLAGS_CRC_TX_MANUAL | FURI_HAL_NFC_LL_TXRX_FLAGS_AGC_ON | \
@@ -97,7 +96,7 @@ FuriHalNfcReturn rfalPicoPassPollerSelect(uint8_t* csn, rfalPicoPassSelectRes* s
rfalPicoPassSelectReq selReq; rfalPicoPassSelectReq selReq;
selReq.CMD = RFAL_PICOPASS_CMD_SELECT; selReq.CMD = RFAL_PICOPASS_CMD_SELECT;
ST_MEMCPY(selReq.CSN, csn, RFAL_PICOPASS_UID_LEN); memcpy(selReq.CSN, csn, RFAL_PICOPASS_UID_LEN);
uint16_t recvLen = 0; uint16_t recvLen = 0;
uint32_t flags = RFAL_PICOPASS_TXRX_FLAGS; uint32_t flags = RFAL_PICOPASS_TXRX_FLAGS;
uint32_t fwt = furi_hal_nfc_ll_ms2fc(20); uint32_t fwt = furi_hal_nfc_ll_ms2fc(20);
@@ -146,8 +145,8 @@ FuriHalNfcReturn rfalPicoPassPollerCheck(uint8_t* mac, rfalPicoPassCheckRes* chk
FuriHalNfcReturn ret; FuriHalNfcReturn ret;
rfalPicoPassCheckReq chkReq; rfalPicoPassCheckReq chkReq;
chkReq.CMD = RFAL_PICOPASS_CMD_CHECK; chkReq.CMD = RFAL_PICOPASS_CMD_CHECK;
ST_MEMCPY(chkReq.mac, mac, 4); memcpy(chkReq.mac, mac, 4);
ST_MEMSET(chkReq.null, 0, 4); memset(chkReq.null, 0, 4);
uint16_t recvLen = 0; uint16_t recvLen = 0;
uint32_t flags = RFAL_PICOPASS_TXRX_FLAGS; uint32_t flags = RFAL_PICOPASS_TXRX_FLAGS;
uint32_t fwt = furi_hal_nfc_ll_ms2fc(20); uint32_t fwt = furi_hal_nfc_ll_ms2fc(20);

View File

@@ -378,6 +378,8 @@ int32_t snake_game_app(void* p) {
case InputKeyBack: case InputKeyBack:
processing = false; processing = false;
break; break;
default:
break;
} }
} }
} else if(event.type == EventTypeTick) { } else if(event.type == EventTypeTick) {

View File

@@ -3,7 +3,7 @@
#include <furi.h> #include <furi.h>
#include <furi_hal.h> #include <furi_hal.h>
#define WS_VERSION_APP "0.3.1" #define WS_VERSION_APP "0.4"
#define WS_DEVELOPED "SkorP" #define WS_DEVELOPED "SkorP"
#define WS_GITHUB "https://github.com/flipperdevices/flipperzero-firmware" #define WS_GITHUB "https://github.com/flipperdevices/flipperzero-firmware"

View File

@@ -4,7 +4,7 @@
/* /*
* Help * Help
* https://github.com/merbanan/rtl_433/blob/5bef4e43133ac4c0e2d18d36f87c52b4f9458453/src/devices/acurite.c * https://github.com/merbanan/rtl_433/blob/master/src/devices/acurite.c
* *
* Acurite 592TXR Temperature Humidity sensor decoder * Acurite 592TXR Temperature Humidity sensor decoder
* Message Type 0x04, 7 bytes * Message Type 0x04, 7 bytes

View File

@@ -0,0 +1,278 @@
#include "ambient_weather.h"
#include <lib/toolbox/manchester_decoder.h>
#define TAG "WSProtocolAmbient_Weather"
/*
* Help
* https://github.com/merbanan/rtl_433/blob/master/src/devices/ambient_weather.c
*
* Decode Ambient Weather F007TH, F012TH, TF 30.3208.02, SwitchDoc F016TH.
* Devices supported:
* - Ambient Weather F007TH Thermo-Hygrometer.
* - Ambient Weather F012TH Indoor/Display Thermo-Hygrometer.
* - TFA senders 30.3208.02 from the TFA "Klima-Monitor" 30.3054,
* - SwitchDoc Labs F016TH.
* This decoder handles the 433mhz/868mhz thermo-hygrometers.
* The 915mhz (WH*) family of devices use different modulation/encoding.
* Byte 0 Byte 1 Byte 2 Byte 3 Byte 4 Byte 5
* xxxxMMMM IIIIIIII BCCCTTTT TTTTTTTT HHHHHHHH MMMMMMMM
* - x: Unknown 0x04 on F007TH/F012TH
* - M: Model Number?, 0x05 on F007TH/F012TH/SwitchDocLabs F016TH
* - I: ID byte (8 bits), volatie, changes at power up,
* - B: Battery Low
* - C: Channel (3 bits 1-8) - F007TH set by Dip switch, F012TH soft setting
* - T: Temperature 12 bits - Fahrenheit * 10 + 400
* - H: Humidity (8 bits)
* - M: Message integrity check LFSR Digest-8, gen 0x98, key 0x3e, init 0x64
*
* three repeats without gap
* full preamble is 0x00145 (the last bits might not be fixed, e.g. 0x00146)
* and on decoding also 0xffd45
*/
#define AMBIENT_WEATHER_PACKET_HEADER_1 0xFFD440000000000 //0xffd45 .. 0xffd46
#define AMBIENT_WEATHER_PACKET_HEADER_2 0x001440000000000 //0x00145 .. 0x00146
#define AMBIENT_WEATHER_PACKET_HEADER_MASK 0xFFFFC0000000000
static const SubGhzBlockConst ws_protocol_ambient_weather_const = {
.te_short = 500,
.te_long = 1000,
.te_delta = 120,
.min_count_bit_for_found = 48,
};
struct WSProtocolDecoderAmbient_Weather {
SubGhzProtocolDecoderBase base;
SubGhzBlockDecoder decoder;
WSBlockGeneric generic;
ManchesterState manchester_saved_state;
uint16_t header_count;
};
struct WSProtocolEncoderAmbient_Weather {
SubGhzProtocolEncoderBase base;
SubGhzProtocolBlockEncoder encoder;
WSBlockGeneric generic;
};
const SubGhzProtocolDecoder ws_protocol_ambient_weather_decoder = {
.alloc = ws_protocol_decoder_ambient_weather_alloc,
.free = ws_protocol_decoder_ambient_weather_free,
.feed = ws_protocol_decoder_ambient_weather_feed,
.reset = ws_protocol_decoder_ambient_weather_reset,
.get_hash_data = ws_protocol_decoder_ambient_weather_get_hash_data,
.serialize = ws_protocol_decoder_ambient_weather_serialize,
.deserialize = ws_protocol_decoder_ambient_weather_deserialize,
.get_string = ws_protocol_decoder_ambient_weather_get_string,
};
const SubGhzProtocolEncoder ws_protocol_ambient_weather_encoder = {
.alloc = NULL,
.free = NULL,
.deserialize = NULL,
.stop = NULL,
.yield = NULL,
};
const SubGhzProtocol ws_protocol_ambient_weather = {
.name = WS_PROTOCOL_AMBIENT_WEATHER_NAME,
.type = SubGhzProtocolWeatherStation,
.flag = SubGhzProtocolFlag_433 | SubGhzProtocolFlag_315 | SubGhzProtocolFlag_868 |
SubGhzProtocolFlag_AM | SubGhzProtocolFlag_Decodable,
.decoder = &ws_protocol_ambient_weather_decoder,
.encoder = &ws_protocol_ambient_weather_encoder,
};
void* ws_protocol_decoder_ambient_weather_alloc(SubGhzEnvironment* environment) {
UNUSED(environment);
WSProtocolDecoderAmbient_Weather* instance = malloc(sizeof(WSProtocolDecoderAmbient_Weather));
instance->base.protocol = &ws_protocol_ambient_weather;
instance->generic.protocol_name = instance->base.protocol->name;
return instance;
}
void ws_protocol_decoder_ambient_weather_free(void* context) {
furi_assert(context);
WSProtocolDecoderAmbient_Weather* instance = context;
free(instance);
}
void ws_protocol_decoder_ambient_weather_reset(void* context) {
furi_assert(context);
WSProtocolDecoderAmbient_Weather* instance = context;
manchester_advance(
instance->manchester_saved_state,
ManchesterEventReset,
&instance->manchester_saved_state,
NULL);
}
static bool ws_protocol_ambient_weather_check_crc(WSProtocolDecoderAmbient_Weather* instance) {
uint8_t msg[] = {
instance->decoder.decode_data >> 40,
instance->decoder.decode_data >> 32,
instance->decoder.decode_data >> 24,
instance->decoder.decode_data >> 16,
instance->decoder.decode_data >> 8};
uint8_t crc = subghz_protocol_blocks_lfsr_digest8(msg, 5, 0x98, 0x3e) ^ 0x64;
return (crc == (uint8_t)(instance->decoder.decode_data & 0xFF));
}
/**
* Analysis of received data
* @param instance Pointer to a WSBlockGeneric* instance
*/
static void ws_protocol_ambient_weather_remote_controller(WSBlockGeneric* instance) {
instance->id = (instance->data >> 32) & 0xFF;
instance->battery_low = (instance->data >> 31) & 1;
instance->channel = ((instance->data >> 28) & 0x07) + 1;
instance->temp = ws_block_generic_fahrenheit_to_celsius(
((float)((instance->data >> 16) & 0x0FFF) - 400.0f) / 10.0f);
instance->humidity = (instance->data >> 8) & 0xFF;
instance->btn = WS_NO_BTN;
// ToDo maybe it won't be needed
/*
Sanity checks to reduce false positives and other bad data
Packets with Bad data often pass the MIC check.
- humidity > 100 (such as 255) and
- temperatures > 140 F (such as 369.5 F and 348.8 F
Specs in the F007TH and F012TH manuals state the range is:
- Temperature: -40 to 140 F
- Humidity: 10 to 99%
@todo - sanity check b[0] "model number"
- 0x45 - F007TH and F012TH
- 0x?5 - SwitchDocLabs F016TH temperature sensor (based on comment b[0] & 0x0f == 5)
- ? - TFA 30.3208.02
if (instance->humidity < 0 || instance->humidity > 100) {
ERROR;
}
if (instance->temp < -40.0 || instance->temp > 140.0) {
ERROR;
}
*/
}
void ws_protocol_decoder_ambient_weather_feed(void* context, bool level, uint32_t duration) {
furi_assert(context);
WSProtocolDecoderAmbient_Weather* instance = context;
ManchesterEvent event = ManchesterEventReset;
if(!level) {
if(DURATION_DIFF(duration, ws_protocol_ambient_weather_const.te_short) <
ws_protocol_ambient_weather_const.te_delta) {
event = ManchesterEventShortLow;
} else if(
DURATION_DIFF(duration, ws_protocol_ambient_weather_const.te_long) <
ws_protocol_ambient_weather_const.te_delta * 2) {
event = ManchesterEventLongLow;
}
} else {
if(DURATION_DIFF(duration, ws_protocol_ambient_weather_const.te_short) <
ws_protocol_ambient_weather_const.te_delta) {
event = ManchesterEventShortHigh;
} else if(
DURATION_DIFF(duration, ws_protocol_ambient_weather_const.te_long) <
ws_protocol_ambient_weather_const.te_delta * 2) {
event = ManchesterEventLongHigh;
}
}
if(event != ManchesterEventReset) {
bool data;
bool data_ok = manchester_advance(
instance->manchester_saved_state, event, &instance->manchester_saved_state, &data);
if(data_ok) {
instance->decoder.decode_data = (instance->decoder.decode_data << 1) | !data;
}
if(((instance->decoder.decode_data & AMBIENT_WEATHER_PACKET_HEADER_MASK) ==
AMBIENT_WEATHER_PACKET_HEADER_1) ||
((instance->decoder.decode_data & AMBIENT_WEATHER_PACKET_HEADER_MASK) ==
AMBIENT_WEATHER_PACKET_HEADER_2)) {
if(ws_protocol_ambient_weather_check_crc(instance)) {
instance->decoder.decode_data = instance->decoder.decode_data;
instance->generic.data = instance->decoder.decode_data;
instance->generic.data_count_bit =
ws_protocol_ambient_weather_const.min_count_bit_for_found;
ws_protocol_ambient_weather_remote_controller(&instance->generic);
if(instance->base.callback)
instance->base.callback(&instance->base, instance->base.context);
instance->decoder.decode_data = 0;
instance->decoder.decode_count_bit = 0;
}
}
} else {
instance->decoder.decode_data = 0;
instance->decoder.decode_count_bit = 0;
manchester_advance(
instance->manchester_saved_state,
ManchesterEventReset,
&instance->manchester_saved_state,
NULL);
}
}
uint8_t ws_protocol_decoder_ambient_weather_get_hash_data(void* context) {
furi_assert(context);
WSProtocolDecoderAmbient_Weather* instance = context;
return subghz_protocol_blocks_get_hash_data(
&instance->decoder, (instance->decoder.decode_count_bit / 8) + 1);
}
bool ws_protocol_decoder_ambient_weather_serialize(
void* context,
FlipperFormat* flipper_format,
SubGhzRadioPreset* preset) {
furi_assert(context);
WSProtocolDecoderAmbient_Weather* instance = context;
return ws_block_generic_serialize(&instance->generic, flipper_format, preset);
}
bool ws_protocol_decoder_ambient_weather_deserialize(void* context, FlipperFormat* flipper_format) {
furi_assert(context);
WSProtocolDecoderAmbient_Weather* instance = context;
bool ret = false;
do {
if(!ws_block_generic_deserialize(&instance->generic, flipper_format)) {
break;
}
if(instance->generic.data_count_bit !=
ws_protocol_ambient_weather_const.min_count_bit_for_found) {
FURI_LOG_E(TAG, "Wrong number of bits in key");
break;
}
ret = true;
} while(false);
return ret;
}
void ws_protocol_decoder_ambient_weather_get_string(void* context, FuriString* output) {
furi_assert(context);
WSProtocolDecoderAmbient_Weather* instance = context;
furi_string_printf(
output,
"%s %dbit\r\n"
"Key:0x%lX%08lX\r\n"
"Sn:0x%lX Ch:%d Bat:%d\r\n"
"Temp:%d.%d C Hum:%d%%",
instance->generic.protocol_name,
instance->generic.data_count_bit,
(uint32_t)(instance->generic.data >> 32),
(uint32_t)(instance->generic.data),
instance->generic.id,
instance->generic.channel,
instance->generic.battery_low,
(int16_t)instance->generic.temp,
abs(((int16_t)(instance->generic.temp * 10) - (((int16_t)instance->generic.temp) * 10))),
instance->generic.humidity);
}

View File

@@ -0,0 +1,79 @@
#pragma once
#include <lib/subghz/protocols/base.h>
#include <lib/subghz/blocks/const.h>
#include <lib/subghz/blocks/decoder.h>
#include <lib/subghz/blocks/encoder.h>
#include "ws_generic.h"
#include <lib/subghz/blocks/math.h>
#define WS_PROTOCOL_AMBIENT_WEATHER_NAME "Ambient_Weather"
typedef struct WSProtocolDecoderAmbient_Weather WSProtocolDecoderAmbient_Weather;
typedef struct WSProtocolEncoderAmbient_Weather WSProtocolEncoderAmbient_Weather;
extern const SubGhzProtocolDecoder ws_protocol_ambient_weather_decoder;
extern const SubGhzProtocolEncoder ws_protocol_ambient_weather_encoder;
extern const SubGhzProtocol ws_protocol_ambient_weather;
/**
* Allocate WSProtocolDecoderAmbient_Weather.
* @param environment Pointer to a SubGhzEnvironment instance
* @return WSProtocolDecoderAmbient_Weather* pointer to a WSProtocolDecoderAmbient_Weather instance
*/
void* ws_protocol_decoder_ambient_weather_alloc(SubGhzEnvironment* environment);
/**
* Free WSProtocolDecoderAmbient_Weather.
* @param context Pointer to a WSProtocolDecoderAmbient_Weather instance
*/
void ws_protocol_decoder_ambient_weather_free(void* context);
/**
* Reset decoder WSProtocolDecoderAmbient_Weather.
* @param context Pointer to a WSProtocolDecoderAmbient_Weather instance
*/
void ws_protocol_decoder_ambient_weather_reset(void* context);
/**
* Parse a raw sequence of levels and durations received from the air.
* @param context Pointer to a WSProtocolDecoderAmbient_Weather instance
* @param level Signal level true-high false-low
* @param duration Duration of this level in, us
*/
void ws_protocol_decoder_ambient_weather_feed(void* context, bool level, uint32_t duration);
/**
* Getting the hash sum of the last randomly received parcel.
* @param context Pointer to a WSProtocolDecoderAmbient_Weather instance
* @return hash Hash sum
*/
uint8_t ws_protocol_decoder_ambient_weather_get_hash_data(void* context);
/**
* Serialize data WSProtocolDecoderAmbient_Weather.
* @param context Pointer to a WSProtocolDecoderAmbient_Weather instance
* @param flipper_format Pointer to a FlipperFormat instance
* @param preset The modulation on which the signal was received, SubGhzRadioPreset
* @return true On success
*/
bool ws_protocol_decoder_ambient_weather_serialize(
void* context,
FlipperFormat* flipper_format,
SubGhzRadioPreset* preset);
/**
* Deserialize data WSProtocolDecoderAmbient_Weather.
* @param context Pointer to a WSProtocolDecoderAmbient_Weather instance
* @param flipper_format Pointer to a FlipperFormat instance
* @return true On success
*/
bool ws_protocol_decoder_ambient_weather_deserialize(void* context, FlipperFormat* flipper_format);
/**
* Getting a textual representation of the received data.
* @param context Pointer to a WSProtocolDecoderAmbient_Weather instance
* @param output Resulting text
*/
void ws_protocol_decoder_ambient_weather_get_string(void* context, FuriString* output);

View File

@@ -4,7 +4,7 @@
/* /*
* Help * Help
* https://github.com/merbanan/rtl_433/blob/5f0ff6db624270a4598958ab9dd79bb385ced3ef/src/devices/gt_wt_03.c * https://github.com/merbanan/rtl_433/blob/master/src/devices/gt_wt_03.c
* *
* *
* Globaltronics GT-WT-03 sensor on 433.92MHz. * Globaltronics GT-WT-03 sensor on 433.92MHz.

View File

@@ -4,7 +4,7 @@
/* /*
* Help * Help
* https://github.com/merbanan/rtl_433/blob/7e83cfd27d14247b6c3c81732bfe4a4f9a974d30/src/devices/lacrosse_tx141x.c * https://github.com/merbanan/rtl_433/blob/master/src/devices/lacrosse_tx141x.c
* *
* iiii iiii | bkcc tttt | tttt tttt | hhhh hhhh | cccc cccc | u * iiii iiii | bkcc tttt | tttt tttt | hhhh hhhh | cccc cccc | u
* - i: identification; changes on battery switch * - i: identification; changes on battery switch

View File

@@ -4,7 +4,7 @@
/* /*
* Help * Help
* https://github.com/merbanan/rtl_433/blob/ef2d37cf51e3264d11cde9149ef87de2f0a4d37a/src/devices/nexus.c * https://github.com/merbanan/rtl_433/blob/master/src/devices/nexus.c
* *
* Nexus sensor protocol with ID, temperature and optional humidity * Nexus sensor protocol with ID, temperature and optional humidity
* also FreeTec (Pearl) NC-7345 sensors for FreeTec Weatherstation NC-7344, * also FreeTec (Pearl) NC-7345 sensors for FreeTec Weatherstation NC-7344,

View File

@@ -9,6 +9,7 @@ const SubGhzProtocol* weather_station_protocol_registry_items[] = {
&ws_protocol_lacrosse_tx141thbv2, &ws_protocol_lacrosse_tx141thbv2,
&ws_protocol_oregon2, &ws_protocol_oregon2,
&ws_protocol_acurite_592txr, &ws_protocol_acurite_592txr,
&ws_protocol_ambient_weather,
}; };
const SubGhzProtocolRegistry weather_station_protocol_registry = { const SubGhzProtocolRegistry weather_station_protocol_registry = {

View File

@@ -9,5 +9,6 @@
#include "lacrosse_tx141thbv2.h" #include "lacrosse_tx141thbv2.h"
#include "oregon2.h" #include "oregon2.h"
#include "acurite_592txr.h" #include "acurite_592txr.h"
#include "ambient_weather.h"
extern const SubGhzProtocolRegistry weather_station_protocol_registry; extern const SubGhzProtocolRegistry weather_station_protocol_registry;

View File

@@ -12,6 +12,7 @@ App(
order=70, order=70,
sdk_headers=[ sdk_headers=[
"gui.h", "gui.h",
"icon_i.h",
"elements.h", "elements.h",
"canvas_i.h", "canvas_i.h",
"view_dispatcher.h", "view_dispatcher.h",

View File

@@ -7,61 +7,51 @@
// TODO add mutex to view_port ops // TODO add mutex to view_port ops
static void view_port_remap_buttons_vertical(InputEvent* event) { _Static_assert(ViewPortOrientationMAX == 4, "Incorrect ViewPortOrientation count");
switch(event->key) { _Static_assert(
case InputKeyUp: (ViewPortOrientationHorizontal == 0 && ViewPortOrientationHorizontalFlip == 1 &&
event->key = InputKeyRight; ViewPortOrientationVertical == 2 && ViewPortOrientationVerticalFlip == 3),
break; "Incorrect ViewPortOrientation order");
case InputKeyDown: _Static_assert(InputKeyMAX == 6, "Incorrect InputKey count");
event->key = InputKeyLeft; _Static_assert(
break; (InputKeyUp == 0 && InputKeyDown == 1 && InputKeyRight == 2 && InputKeyLeft == 3 &&
case InputKeyRight: InputKeyOk == 4 && InputKeyBack == 5),
event->key = InputKeyDown; "Incorrect InputKey order");
break;
case InputKeyLeft:
event->key = InputKeyUp;
break;
default:
break;
}
}
static void view_port_remap_buttons_vertical_flip(InputEvent* event) { /** InputKey directional keys mappings for different screen orientations
switch(event->key) { *
case InputKeyUp: */
event->key = InputKeyLeft; static const InputKey view_port_input_mapping[ViewPortOrientationMAX][InputKeyMAX] = {
break; {InputKeyUp,
case InputKeyDown: InputKeyDown,
event->key = InputKeyRight; InputKeyRight,
break; InputKeyLeft,
case InputKeyRight: InputKeyOk,
event->key = InputKeyUp; InputKeyBack}, //ViewPortOrientationHorizontal
break; {InputKeyDown,
case InputKeyLeft: InputKeyUp,
event->key = InputKeyDown; InputKeyLeft,
break; InputKeyRight,
default: InputKeyOk,
break; InputKeyBack}, //ViewPortOrientationHorizontalFlip
} {InputKeyRight,
} InputKeyLeft,
InputKeyDown,
InputKeyUp,
InputKeyOk,
InputKeyBack}, //ViewPortOrientationVertical
{InputKeyLeft,
InputKeyRight,
InputKeyUp,
InputKeyDown,
InputKeyOk,
InputKeyBack}, //ViewPortOrientationVerticalFlip
};
static void view_port_remap_buttons_horizontal_flip(InputEvent* event) { // Remaps directional pad buttons on Flipper based on ViewPort orientation
switch(event->key) { static void view_port_map_input(InputEvent* event, ViewPortOrientation orientation) {
case InputKeyUp: furi_assert(orientation < ViewPortOrientationMAX && event->key < InputKeyMAX);
event->key = InputKeyDown; event->key = view_port_input_mapping[orientation][event->key];
break;
case InputKeyDown:
event->key = InputKeyUp;
break;
case InputKeyRight:
event->key = InputKeyLeft;
break;
case InputKeyLeft:
event->key = InputKeyRight;
break;
default:
break;
}
} }
static void view_port_setup_canvas_orientation(const ViewPort* view_port, Canvas* canvas) { static void view_port_setup_canvas_orientation(const ViewPort* view_port, Canvas* canvas) {
@@ -170,19 +160,7 @@ void view_port_input(ViewPort* view_port, InputEvent* event) {
if(view_port->input_callback) { if(view_port->input_callback) {
ViewPortOrientation orientation = view_port_get_orientation(view_port); ViewPortOrientation orientation = view_port_get_orientation(view_port);
switch(orientation) { view_port_map_input(event, orientation);
case ViewPortOrientationHorizontalFlip:
view_port_remap_buttons_horizontal_flip(event);
break;
case ViewPortOrientationVertical:
view_port_remap_buttons_vertical(event);
break;
case ViewPortOrientationVerticalFlip:
view_port_remap_buttons_vertical_flip(event);
break;
default:
break;
}
view_port->input_callback(event, view_port->input_callback_context); view_port->input_callback(event, view_port->input_callback_context);
} }
} }

View File

@@ -19,6 +19,7 @@ typedef enum {
ViewPortOrientationHorizontalFlip, ViewPortOrientationHorizontalFlip,
ViewPortOrientationVertical, ViewPortOrientationVertical,
ViewPortOrientationVerticalFlip, ViewPortOrientationVerticalFlip,
ViewPortOrientationMAX, /**< Special value, don't use it */
} ViewPortOrientation; } ViewPortOrientation;
/** ViewPort Draw callback /** ViewPort Draw callback

View File

@@ -60,8 +60,9 @@ const char* input_get_type_name(InputType type) {
return "Long"; return "Long";
case InputTypeRepeat: case InputTypeRepeat:
return "Repeat"; return "Repeat";
default:
return "Unknown";
} }
return "Unknown";
} }
int32_t input_srv(void* p) { int32_t input_srv(void* p) {

View File

@@ -22,6 +22,7 @@ typedef enum {
InputTypeShort, /**< Short event, emitted after InputTypeRelease done withing INPUT_LONG_PRESS interval */ InputTypeShort, /**< Short event, emitted after InputTypeRelease done withing INPUT_LONG_PRESS interval */
InputTypeLong, /**< Long event, emmited after INPUT_LONG_PRESS interval, asynchronouse to InputTypeRelease */ InputTypeLong, /**< Long event, emmited after INPUT_LONG_PRESS interval, asynchronouse to InputTypeRelease */
InputTypeRepeat, /**< Repeat event, emmited with INPUT_REPEATE_PRESS period after InputTypeLong event */ InputTypeRepeat, /**< Repeat event, emmited with INPUT_REPEATE_PRESS period after InputTypeLong event */
InputTypeMAX, /**< Special value for exceptional */
} InputType; } InputType;
/** Input Event, dispatches with FuriPubSub */ /** Input Event, dispatches with FuriPubSub */

View File

@@ -405,6 +405,10 @@ static void rpc_system_storage_write_process(const PB_Main* request, void* conte
if(!fs_operation_success) { if(!fs_operation_success) {
send_response = true; send_response = true;
command_status = rpc_system_storage_get_file_error(file); command_status = rpc_system_storage_get_file_error(file);
if(command_status == PB_CommandStatus_OK) {
// Report errors not handled by underlying APIs
command_status = PB_CommandStatus_ERROR_STORAGE_INTERNAL;
}
} }
if(send_response) { if(send_response) {

View File

@@ -1,6 +1,7 @@
Import("ENV", "fw_build_meta") Import("ENV", "fw_build_meta")
from SCons.Errors import UserError from SCons.Errors import UserError
from SCons.Node import FS
import itertools import itertools
from fbt_extra.util import ( from fbt_extra.util import (
@@ -14,7 +15,6 @@ env = ENV.Clone(
("compilation_db", {"COMPILATIONDB_COMSTR": "\tCDB\t${TARGET}"}), ("compilation_db", {"COMPILATIONDB_COMSTR": "\tCDB\t${TARGET}"}),
"fwbin", "fwbin",
"fbt_apps", "fbt_apps",
"fbt_sdk",
], ],
COMPILATIONDB_USE_ABSPATH=False, COMPILATIONDB_USE_ABSPATH=False,
BUILD_DIR=fw_build_meta["build_dir"], BUILD_DIR=fw_build_meta["build_dir"],
@@ -112,7 +112,9 @@ lib_targets = env.BuildModules(
# Now, env is fully set up with everything to build apps # Now, env is fully set up with everything to build apps
fwenv = env.Clone() fwenv = env.Clone(FW_ARTIFACTS=[])
fw_artifacts = fwenv["FW_ARTIFACTS"]
# Set up additional app-specific build flags # Set up additional app-specific build flags
SConscript("site_scons/firmwareopts.scons", exports={"ENV": fwenv}) SConscript("site_scons/firmwareopts.scons", exports={"ENV": fwenv})
@@ -130,7 +132,14 @@ if extra_int_apps := GetOption("extra_int_apps"):
if fwenv["FAP_EXAMPLES"]: if fwenv["FAP_EXAMPLES"]:
fwenv.Append(APPDIRS=[("applications/examples", False)]) fwenv.Append(APPDIRS=[("applications/examples", False)])
fwenv.LoadApplicationManifests() for app_dir, _ in env["APPDIRS"]:
app_dir_node = env.Dir("#").Dir(app_dir)
for entry in app_dir_node.glob("*"):
if isinstance(entry, FS.Dir) and not str(entry).startswith("."):
fwenv.LoadAppManifest(entry)
fwenv.PrepareApplicationsBuild() fwenv.PrepareApplicationsBuild()
# Build external apps # Build external apps
@@ -138,6 +147,7 @@ if env["IS_BASE_FIRMWARE"]:
extapps = fwenv["FW_EXTAPPS"] = SConscript( extapps = fwenv["FW_EXTAPPS"] = SConscript(
"site_scons/extapps.scons", exports={"ENV": fwenv} "site_scons/extapps.scons", exports={"ENV": fwenv}
) )
fw_artifacts.append(extapps["sdk_tree"])
# Add preprocessor definitions for current set of apps # Add preprocessor definitions for current set of apps
@@ -220,7 +230,10 @@ Depends(fwelf, lib_targets)
AddPostAction(fwelf, fwenv["APPBUILD_DUMP"]) AddPostAction(fwelf, fwenv["APPBUILD_DUMP"])
AddPostAction( AddPostAction(
fwelf, fwelf,
Action('${PYTHON3} "${ROOT_DIR}/scripts/fwsize.py" elf ${TARGET}', "Firmware size"), Action(
'${PYTHON3} "${BIN_SIZE_SCRIPT}" elf ${TARGET}',
"Firmware size",
),
) )
# Produce extra firmware files # Produce extra firmware files
@@ -228,7 +241,7 @@ fwhex = fwenv["FW_HEX"] = fwenv.HEXBuilder("${FIRMWARE_BUILD_CFG}")
fwbin = fwenv["FW_BIN"] = fwenv.BINBuilder("${FIRMWARE_BUILD_CFG}") fwbin = fwenv["FW_BIN"] = fwenv.BINBuilder("${FIRMWARE_BUILD_CFG}")
AddPostAction( AddPostAction(
fwbin, fwbin,
Action('@${PYTHON3} "${ROOT_DIR}/scripts/fwsize.py" bin ${TARGET}'), Action('@${PYTHON3} "${BIN_SIZE_SCRIPT}" bin ${TARGET}'),
) )
fwdfu = fwenv["FW_DFU"] = fwenv.DFUBuilder("${FIRMWARE_BUILD_CFG}") fwdfu = fwenv["FW_DFU"] = fwenv.DFUBuilder("${FIRMWARE_BUILD_CFG}")
@@ -238,12 +251,14 @@ fwdump = fwenv.ObjDump("${FIRMWARE_BUILD_CFG}")
Alias(fwenv["FIRMWARE_BUILD_CFG"] + "_list", fwdump) Alias(fwenv["FIRMWARE_BUILD_CFG"] + "_list", fwdump)
fw_artifacts = fwenv["FW_ARTIFACTS"] = [ fw_artifacts.extend(
fwhex, [
fwbin, fwhex,
fwdfu, fwbin,
fwenv["FW_VERSION_JSON"], fwdfu,
] fwenv["FW_VERSION_JSON"],
]
)
fwcdb = fwenv.CompilationDatabase() fwcdb = fwenv.CompilationDatabase()
@@ -272,34 +287,5 @@ if should_gen_cdb_and_link_dir(fwenv, BUILD_TARGETS):
Alias(fwenv["FIRMWARE_BUILD_CFG"] + "_all", fw_artifacts) Alias(fwenv["FIRMWARE_BUILD_CFG"] + "_all", fw_artifacts)
if fwenv["IS_BASE_FIRMWARE"]:
sdk_source = fwenv.SDKPrebuilder(
"sdk_origin",
# Deps on root SDK headers and generated files
(fwenv["SDK_HEADERS"], fwenv["FW_ASSETS_HEADERS"]),
)
# Extra deps on headers included in deeper levels
Depends(sdk_source, fwenv.ProcessSdkDepends("sdk_origin.d"))
fwenv["SDK_DIR"] = fwenv.Dir("sdk")
sdk_tree = fwenv.SDKTree(fwenv["SDK_DIR"], "sdk_origin")
fw_artifacts.append(sdk_tree)
# AlwaysBuild(sdk_tree)
Alias("sdk_tree", sdk_tree)
sdk_apicheck = fwenv.SDKSymUpdater(fwenv["SDK_DEFINITION"], "sdk_origin")
Precious(sdk_apicheck)
NoClean(sdk_apicheck)
AlwaysBuild(sdk_apicheck)
Alias("sdk_check", sdk_apicheck)
sdk_apisyms = fwenv.SDKSymGenerator(
"assets/compiled/symbols.h", fwenv["SDK_DEFINITION"]
)
Alias("api_syms", sdk_apisyms)
if fwenv["FORCE"]:
fwenv.AlwaysBuild(sdk_source, sdk_tree, sdk_apicheck, sdk_apisyms)
Return("fwenv") Return("fwenv")

View File

@@ -2,11 +2,10 @@ Import("env")
env.Append( env.Append(
LINT_SOURCES=["firmware"], LINT_SOURCES=["firmware"],
# SDK_HEADERS=[env.File("#/firmware/targets/furi_hal_include/furi_hal.h")],
SDK_HEADERS=[ SDK_HEADERS=[
*env.GlobRecursive("*.h", "#/firmware/targets/furi_hal_include", "*_i.h"), *env.GlobRecursive("*.h", "targets/furi_hal_include", "*_i.h"),
*env.GlobRecursive("*.h", "#/firmware/targets/f${TARGET_HW}/furi_hal", "*_i.h"), *env.GlobRecursive("*.h", "targets/f${TARGET_HW}/furi_hal", "*_i.h"),
File("#/firmware/targets/f7/platform_specific/intrinsic_export.h"), File("targets/f7/platform_specific/intrinsic_export.h"),
File("#/firmware/targets/furi_hal_include/furi_hal_subghz.h"), File("#/firmware/targets/furi_hal_include/furi_hal_subghz.h"),
], ],
) )

View File

@@ -8,6 +8,7 @@ Header,+,applications/services/dolphin/dolphin.h,,
Header,+,applications/services/gui/canvas_i.h,, Header,+,applications/services/gui/canvas_i.h,,
Header,+,applications/services/gui/elements.h,, Header,+,applications/services/gui/elements.h,,
Header,+,applications/services/gui/gui.h,, Header,+,applications/services/gui/gui.h,,
Header,+,applications/services/gui/icon_i.h,,
Header,+,applications/services/gui/modules/button_menu.h,, Header,+,applications/services/gui/modules/button_menu.h,,
Header,+,applications/services/gui/modules/button_panel.h,, Header,+,applications/services/gui/modules/button_panel.h,,
Header,+,applications/services/gui/modules/byte_input.h,, Header,+,applications/services/gui/modules/byte_input.h,,
@@ -123,6 +124,33 @@ Header,+,lib/lfrfid/lfrfid_raw_worker.h,,
Header,+,lib/lfrfid/lfrfid_worker.h,, Header,+,lib/lfrfid/lfrfid_worker.h,,
Header,+,lib/lfrfid/protocols/lfrfid_protocols.h,, Header,+,lib/lfrfid/protocols/lfrfid_protocols.h,,
Header,+,lib/lfrfid/tools/bit_lib.h,, Header,+,lib/lfrfid/tools/bit_lib.h,,
Header,+,lib/libusb_stm32/inc/hid_usage_button.h,,
Header,+,lib/libusb_stm32/inc/hid_usage_consumer.h,,
Header,+,lib/libusb_stm32/inc/hid_usage_desktop.h,,
Header,+,lib/libusb_stm32/inc/hid_usage_device.h,,
Header,+,lib/libusb_stm32/inc/hid_usage_game.h,,
Header,+,lib/libusb_stm32/inc/hid_usage_keyboard.h,,
Header,+,lib/libusb_stm32/inc/hid_usage_led.h,,
Header,+,lib/libusb_stm32/inc/hid_usage_ordinal.h,,
Header,+,lib/libusb_stm32/inc/hid_usage_power.h,,
Header,+,lib/libusb_stm32/inc/hid_usage_simulation.h,,
Header,+,lib/libusb_stm32/inc/hid_usage_sport.h,,
Header,+,lib/libusb_stm32/inc/hid_usage_telephony.h,,
Header,+,lib/libusb_stm32/inc/hid_usage_vr.h,,
Header,+,lib/libusb_stm32/inc/usb.h,,
Header,+,lib/libusb_stm32/inc/usb_cdc.h,,
Header,+,lib/libusb_stm32/inc/usb_cdca.h,,
Header,+,lib/libusb_stm32/inc/usb_cdce.h,,
Header,+,lib/libusb_stm32/inc/usb_cdci.h,,
Header,+,lib/libusb_stm32/inc/usb_cdcp.h,,
Header,+,lib/libusb_stm32/inc/usb_cdcw.h,,
Header,+,lib/libusb_stm32/inc/usb_dfu.h,,
Header,+,lib/libusb_stm32/inc/usb_hid.h,,
Header,+,lib/libusb_stm32/inc/usb_std.h,,
Header,+,lib/libusb_stm32/inc/usb_tmc.h,,
Header,+,lib/libusb_stm32/inc/usbd_core.h,,
Header,+,lib/mbedtls/include/mbedtls/des.h,,
Header,+,lib/mbedtls/include/mbedtls/sha1.h,,
Header,+,lib/micro-ecc/uECC.h,, Header,+,lib/micro-ecc/uECC.h,,
Header,+,lib/one_wire/ibutton/ibutton_worker.h,, Header,+,lib/one_wire/ibutton/ibutton_worker.h,,
Header,+,lib/one_wire/maxim_crc.h,, Header,+,lib/one_wire/maxim_crc.h,,
@@ -417,6 +445,7 @@ Function,-,_system_r,int,"_reent*, const char*"
Function,-,_tempnam_r,char*,"_reent*, const char*, const char*" Function,-,_tempnam_r,char*,"_reent*, const char*, const char*"
Function,-,_tmpfile_r,FILE*,_reent* Function,-,_tmpfile_r,FILE*,_reent*
Function,-,_tmpnam_r,char*,"_reent*, char*" Function,-,_tmpnam_r,char*,"_reent*, char*"
Function,-,_tzset_r,void,_reent*
Function,-,_ungetc_r,int,"_reent*, int, FILE*" Function,-,_ungetc_r,int,"_reent*, int, FILE*"
Function,-,_unsetenv_r,int,"_reent*, const char*" Function,-,_unsetenv_r,int,"_reent*, const char*"
Function,-,_vasiprintf_r,int,"_reent*, char**, const char*, __gnuc_va_list" Function,-,_vasiprintf_r,int,"_reent*, char**, const char*, __gnuc_va_list"
@@ -464,6 +493,8 @@ Function,+,args_read_hex_bytes,_Bool,"FuriString*, uint8_t*, size_t"
Function,+,args_read_int_and_trim,_Bool,"FuriString*, int*" Function,+,args_read_int_and_trim,_Bool,"FuriString*, int*"
Function,+,args_read_probably_quoted_string_and_trim,_Bool,"FuriString*, FuriString*" Function,+,args_read_probably_quoted_string_and_trim,_Bool,"FuriString*, FuriString*"
Function,+,args_read_string_and_trim,_Bool,"FuriString*, FuriString*" Function,+,args_read_string_and_trim,_Bool,"FuriString*, FuriString*"
Function,-,asctime,char*,const tm*
Function,-,asctime_r,char*,"const tm*, char*"
Function,-,asin,double,double Function,-,asin,double,double
Function,-,asinf,float,float Function,-,asinf,float,float
Function,-,asinh,double,double Function,-,asinh,double,double
@@ -645,6 +676,7 @@ Function,+,cli_read_timeout,size_t,"Cli*, uint8_t*, size_t, uint32_t"
Function,+,cli_session_close,void,Cli* Function,+,cli_session_close,void,Cli*
Function,+,cli_session_open,void,"Cli*, void*" Function,+,cli_session_open,void,"Cli*, void*"
Function,+,cli_write,void,"Cli*, const uint8_t*, size_t" Function,+,cli_write,void,"Cli*, const uint8_t*, size_t"
Function,-,clock,clock_t,
Function,-,copysign,double,"double, double" Function,-,copysign,double,"double, double"
Function,-,copysignf,float,"float, float" Function,-,copysignf,float,"float, float"
Function,-,copysignl,long double,"long double, long double" Function,-,copysignl,long double,"long double, long double"
@@ -657,6 +689,8 @@ Function,-,cosl,long double,long double
Function,+,crc32_calc_buffer,uint32_t,"uint32_t, const void*, size_t" Function,+,crc32_calc_buffer,uint32_t,"uint32_t, const void*, size_t"
Function,+,crc32_calc_file,uint32_t,"File*, const FileCrcProgressCb, void*" Function,+,crc32_calc_file,uint32_t,"File*, const FileCrcProgressCb, void*"
Function,-,ctermid,char*,char* Function,-,ctermid,char*,char*
Function,-,ctime,char*,const time_t*
Function,-,ctime_r,char*,"const time_t*, char*"
Function,-,cuserid,char*,char* Function,-,cuserid,char*,char*
Function,+,delete_mutex,_Bool,ValueMutex* Function,+,delete_mutex,_Bool,ValueMutex*
Function,+,dialog_ex_alloc,DialogEx*, Function,+,dialog_ex_alloc,DialogEx*,
@@ -683,6 +717,7 @@ Function,+,dialog_message_set_icon,void,"DialogMessage*, const Icon*, uint8_t, u
Function,+,dialog_message_set_text,void,"DialogMessage*, const char*, uint8_t, uint8_t, Align, Align" Function,+,dialog_message_set_text,void,"DialogMessage*, const char*, uint8_t, uint8_t, Align, Align"
Function,+,dialog_message_show,DialogMessageButton,"DialogsApp*, const DialogMessage*" Function,+,dialog_message_show,DialogMessageButton,"DialogsApp*, const DialogMessage*"
Function,+,dialog_message_show_storage_error,void,"DialogsApp*, const char*" Function,+,dialog_message_show_storage_error,void,"DialogsApp*, const char*"
Function,-,difftime,double,"time_t, time_t"
Function,-,digital_signal_alloc,DigitalSignal*,uint32_t Function,-,digital_signal_alloc,DigitalSignal*,uint32_t
Function,-,digital_signal_append,_Bool,"DigitalSignal*, DigitalSignal*" Function,-,digital_signal_append,_Bool,"DigitalSignal*, DigitalSignal*"
Function,-,digital_signal_free,void,DigitalSignal* Function,-,digital_signal_free,void,DigitalSignal*
@@ -1495,6 +1530,8 @@ Function,-,getenv,char*,const char*
Function,-,gets,char*,char* Function,-,gets,char*,char*
Function,-,getsubopt,int,"char**, char**, char**" Function,-,getsubopt,int,"char**, char**, char**"
Function,-,getw,int,FILE* Function,-,getw,int,FILE*
Function,-,gmtime,tm*,const time_t*
Function,-,gmtime_r,tm*,"const time_t*, tm*"
Function,+,gui_add_framebuffer_callback,void,"Gui*, GuiCanvasCommitCallback, void*" Function,+,gui_add_framebuffer_callback,void,"Gui*, GuiCanvasCommitCallback, void*"
Function,+,gui_add_view_port,void,"Gui*, ViewPort*, GuiLayer" Function,+,gui_add_view_port,void,"Gui*, ViewPort*, GuiLayer"
Function,+,gui_get_framebuffer_size,size_t,Gui* Function,+,gui_get_framebuffer_size,size_t,Gui*
@@ -1694,6 +1731,8 @@ Function,+,loader_update_menu,void,
Function,+,loading_alloc,Loading*, Function,+,loading_alloc,Loading*,
Function,+,loading_free,void,Loading* Function,+,loading_free,void,Loading*
Function,+,loading_get_view,View*,Loading* Function,+,loading_get_view,View*,Loading*
Function,-,localtime,tm*,const time_t*
Function,-,localtime_r,tm*,"const time_t*, tm*"
Function,-,log,double,double Function,-,log,double,double
Function,-,log10,double,double Function,-,log10,double,double
Function,-,log10f,float,float Function,-,log10f,float,float
@@ -1722,6 +1761,36 @@ Function,+,manchester_encoder_advance,_Bool,"ManchesterEncoderState*, const _Boo
Function,+,manchester_encoder_finish,ManchesterEncoderResult,ManchesterEncoderState* Function,+,manchester_encoder_finish,ManchesterEncoderResult,ManchesterEncoderState*
Function,+,manchester_encoder_reset,void,ManchesterEncoderState* Function,+,manchester_encoder_reset,void,ManchesterEncoderState*
Function,+,maxim_crc8,uint8_t,"const uint8_t*, const uint8_t, const uint8_t" Function,+,maxim_crc8,uint8_t,"const uint8_t*, const uint8_t, const uint8_t"
Function,-,mbedtls_des3_crypt_cbc,int,"mbedtls_des3_context*, int, size_t, unsigned char[8], const unsigned char*, unsigned char*"
Function,-,mbedtls_des3_crypt_ecb,int,"mbedtls_des3_context*, const unsigned char[8], unsigned char[8]"
Function,-,mbedtls_des3_free,void,mbedtls_des3_context*
Function,-,mbedtls_des3_init,void,mbedtls_des3_context*
Function,-,mbedtls_des3_set2key_dec,int,"mbedtls_des3_context*, const unsigned char[8 * 2]"
Function,-,mbedtls_des3_set2key_enc,int,"mbedtls_des3_context*, const unsigned char[8 * 2]"
Function,-,mbedtls_des3_set3key_dec,int,"mbedtls_des3_context*, const unsigned char[8 * 3]"
Function,-,mbedtls_des3_set3key_enc,int,"mbedtls_des3_context*, const unsigned char[8 * 3]"
Function,-,mbedtls_des_crypt_cbc,int,"mbedtls_des_context*, int, size_t, unsigned char[8], const unsigned char*, unsigned char*"
Function,-,mbedtls_des_crypt_ecb,int,"mbedtls_des_context*, const unsigned char[8], unsigned char[8]"
Function,-,mbedtls_des_free,void,mbedtls_des_context*
Function,-,mbedtls_des_init,void,mbedtls_des_context*
Function,-,mbedtls_des_key_check_key_parity,int,const unsigned char[8]
Function,-,mbedtls_des_key_check_weak,int,const unsigned char[8]
Function,-,mbedtls_des_key_set_parity,void,unsigned char[8]
Function,-,mbedtls_des_self_test,int,int
Function,-,mbedtls_des_setkey,void,"uint32_t[32], const unsigned char[8]"
Function,-,mbedtls_des_setkey_dec,int,"mbedtls_des_context*, const unsigned char[8]"
Function,-,mbedtls_des_setkey_enc,int,"mbedtls_des_context*, const unsigned char[8]"
Function,-,mbedtls_internal_sha1_process,int,"mbedtls_sha1_context*, const unsigned char[64]"
Function,-,mbedtls_platform_gmtime_r,tm*,"const mbedtls_time_t*, tm*"
Function,-,mbedtls_platform_zeroize,void,"void*, size_t"
Function,-,mbedtls_sha1,int,"const unsigned char*, size_t, unsigned char[20]"
Function,-,mbedtls_sha1_clone,void,"mbedtls_sha1_context*, const mbedtls_sha1_context*"
Function,-,mbedtls_sha1_finish,int,"mbedtls_sha1_context*, unsigned char[20]"
Function,-,mbedtls_sha1_free,void,mbedtls_sha1_context*
Function,-,mbedtls_sha1_init,void,mbedtls_sha1_context*
Function,-,mbedtls_sha1_self_test,int,int
Function,-,mbedtls_sha1_starts,int,mbedtls_sha1_context*
Function,-,mbedtls_sha1_update,int,"mbedtls_sha1_context*, const unsigned char*, size_t"
Function,-,mblen,int,"const char*, size_t" Function,-,mblen,int,"const char*, size_t"
Function,-,mbstowcs,size_t,"wchar_t*, const char*, size_t" Function,-,mbstowcs,size_t,"wchar_t*, const char*, size_t"
Function,-,mbtowc,int,"wchar_t*, const char*, size_t" Function,-,mbtowc,int,"wchar_t*, const char*, size_t"
@@ -1762,6 +1831,7 @@ Function,-,mkostemps,int,"char*, int, int"
Function,-,mkstemp,int,char* Function,-,mkstemp,int,char*
Function,-,mkstemps,int,"char*, int" Function,-,mkstemps,int,"char*, int"
Function,-,mktemp,char*,char* Function,-,mktemp,char*,char*
Function,-,mktime,time_t,tm*
Function,-,modf,double,"double, double*" Function,-,modf,double,"double, double*"
Function,-,modff,float,"float, float*" Function,-,modff,float,"float, float*"
Function,-,modfl,long double,"long double, long double*" Function,-,modfl,long double,"long double, long double*"
@@ -2302,6 +2372,8 @@ Function,+,stream_write_vaformat,size_t,"Stream*, const char*, va_list"
Function,-,strerror,char*,int Function,-,strerror,char*,int
Function,-,strerror_l,char*,"int, locale_t" Function,-,strerror_l,char*,"int, locale_t"
Function,-,strerror_r,char*,"int, char*, size_t" Function,-,strerror_r,char*,"int, char*, size_t"
Function,-,strftime,size_t,"char*, size_t, const char*, const tm*"
Function,-,strftime_l,size_t,"char*, size_t, const char*, const tm*, locale_t"
Function,+,string_stream_alloc,Stream*, Function,+,string_stream_alloc,Stream*,
Function,-,strlcat,size_t,"char*, const char*, size_t" Function,-,strlcat,size_t,"char*, const char*, size_t"
Function,+,strlcpy,size_t,"char*, const char*, size_t" Function,+,strlcpy,size_t,"char*, const char*, size_t"
@@ -2316,6 +2388,8 @@ Function,-,strndup,char*,"const char*, size_t"
Function,-,strnlen,size_t,"const char*, size_t" Function,-,strnlen,size_t,"const char*, size_t"
Function,-,strnstr,char*,"const char*, const char*, size_t" Function,-,strnstr,char*,"const char*, const char*, size_t"
Function,-,strpbrk,char*,"const char*, const char*" Function,-,strpbrk,char*,"const char*, const char*"
Function,-,strptime,char*,"const char*, const char*, tm*"
Function,-,strptime_l,char*,"const char*, const char*, tm*, locale_t"
Function,+,strrchr,char*,"const char*, int" Function,+,strrchr,char*,"const char*, int"
Function,-,strsep,char*,"char**, const char*" Function,-,strsep,char*,"char**, const char*"
Function,-,strsignal,char*,int Function,-,strsignal,char*,int
@@ -2926,6 +3000,7 @@ Function,-,tga_save,void,const char*
Function,-,tgamma,double,double Function,-,tgamma,double,double
Function,-,tgammaf,float,float Function,-,tgammaf,float,float
Function,-,tgammal,long double,long double Function,-,tgammal,long double,long double
Function,-,time,time_t,time_t*
Function,+,timerCalculateTimer,uint32_t,uint16_t Function,+,timerCalculateTimer,uint32_t,uint16_t
Function,-,timerDelay,void,uint16_t Function,-,timerDelay,void,uint16_t
Function,+,timerIsExpired,_Bool,uint32_t Function,+,timerIsExpired,_Bool,uint32_t
@@ -3998,6 +4073,7 @@ Function,-,u8x8_upscale_byte,uint16_t,uint8_t
Function,-,u8x8_utf8_init,void,u8x8_t* Function,-,u8x8_utf8_init,void,u8x8_t*
Function,-,u8x8_utf8_next,uint16_t,"u8x8_t*, uint8_t" Function,-,u8x8_utf8_next,uint16_t,"u8x8_t*, uint8_t"
Function,-,u8x8_utoa,const char*,uint16_t Function,-,u8x8_utoa,const char*,uint16_t
Function,-,tzset,void,
Function,-,uECC_compress,void,"const uint8_t*, uint8_t*, uECC_Curve" Function,-,uECC_compress,void,"const uint8_t*, uint8_t*, uECC_Curve"
Function,+,uECC_compute_public_key,int,"const uint8_t*, uint8_t*, uECC_Curve" Function,+,uECC_compute_public_key,int,"const uint8_t*, uint8_t*, uECC_Curve"
Function,-,uECC_curve_private_key_size,int,uECC_Curve Function,-,uECC_curve_private_key_size,int,uECC_Curve
@@ -4256,10 +4332,13 @@ Variable,-,MSIRangeTable,const uint32_t[16],
Variable,-,SmpsPrescalerTable,const uint32_t[4][6], Variable,-,SmpsPrescalerTable,const uint32_t[4][6],
Variable,+,SystemCoreClock,uint32_t, Variable,+,SystemCoreClock,uint32_t,
Variable,+,_ctype_,const char[], Variable,+,_ctype_,const char[],
Variable,-,_daylight,int,
Variable,+,_global_impure_ptr,_reent*, Variable,+,_global_impure_ptr,_reent*,
Variable,+,_impure_ptr,_reent*, Variable,+,_impure_ptr,_reent*,
Variable,-,_sys_errlist,const char*[], Variable,-,_sys_errlist,const char*[],
Variable,-,_sys_nerr,int, Variable,-,_sys_nerr,int,
Variable,-,_timezone,long,
Variable,-,_tzname,char*[2],
Variable,+,cli_vcp,CliSession, Variable,+,cli_vcp,CliSession,
Variable,+,furi_hal_i2c_bus_external,FuriHalI2cBus, Variable,+,furi_hal_i2c_bus_external,FuriHalI2cBus,
Variable,+,furi_hal_i2c_bus_power,FuriHalI2cBus, Variable,+,furi_hal_i2c_bus_power,FuriHalI2cBus,
1 entry status name type params
8 Header + applications/services/gui/canvas_i.h
9 Header + applications/services/gui/elements.h
10 Header + applications/services/gui/gui.h
11 Header + applications/services/gui/icon_i.h
12 Header + applications/services/gui/modules/button_menu.h
13 Header + applications/services/gui/modules/button_panel.h
14 Header + applications/services/gui/modules/byte_input.h
124 Header + lib/lfrfid/lfrfid_worker.h
125 Header + lib/lfrfid/protocols/lfrfid_protocols.h
126 Header + lib/lfrfid/tools/bit_lib.h
127 Header + lib/libusb_stm32/inc/hid_usage_button.h
128 Header + lib/libusb_stm32/inc/hid_usage_consumer.h
129 Header + lib/libusb_stm32/inc/hid_usage_desktop.h
130 Header + lib/libusb_stm32/inc/hid_usage_device.h
131 Header + lib/libusb_stm32/inc/hid_usage_game.h
132 Header + lib/libusb_stm32/inc/hid_usage_keyboard.h
133 Header + lib/libusb_stm32/inc/hid_usage_led.h
134 Header + lib/libusb_stm32/inc/hid_usage_ordinal.h
135 Header + lib/libusb_stm32/inc/hid_usage_power.h
136 Header + lib/libusb_stm32/inc/hid_usage_simulation.h
137 Header + lib/libusb_stm32/inc/hid_usage_sport.h
138 Header + lib/libusb_stm32/inc/hid_usage_telephony.h
139 Header + lib/libusb_stm32/inc/hid_usage_vr.h
140 Header + lib/libusb_stm32/inc/usb.h
141 Header + lib/libusb_stm32/inc/usb_cdc.h
142 Header + lib/libusb_stm32/inc/usb_cdca.h
143 Header + lib/libusb_stm32/inc/usb_cdce.h
144 Header + lib/libusb_stm32/inc/usb_cdci.h
145 Header + lib/libusb_stm32/inc/usb_cdcp.h
146 Header + lib/libusb_stm32/inc/usb_cdcw.h
147 Header + lib/libusb_stm32/inc/usb_dfu.h
148 Header + lib/libusb_stm32/inc/usb_hid.h
149 Header + lib/libusb_stm32/inc/usb_std.h
150 Header + lib/libusb_stm32/inc/usb_tmc.h
151 Header + lib/libusb_stm32/inc/usbd_core.h
152 Header + lib/mbedtls/include/mbedtls/des.h
153 Header + lib/mbedtls/include/mbedtls/sha1.h
154 Header + lib/micro-ecc/uECC.h
155 Header + lib/one_wire/ibutton/ibutton_worker.h
156 Header + lib/one_wire/maxim_crc.h
445 Function - _tempnam_r char* _reent*, const char*, const char*
446 Function - _tmpfile_r FILE* _reent*
447 Function - _tmpnam_r char* _reent*, char*
448 Function - _tzset_r void _reent*
449 Function - _ungetc_r int _reent*, int, FILE*
450 Function - _unsetenv_r int _reent*, const char*
451 Function - _vasiprintf_r int _reent*, char**, const char*, __gnuc_va_list
493 Function + args_read_int_and_trim _Bool FuriString*, int*
494 Function + args_read_probably_quoted_string_and_trim _Bool FuriString*, FuriString*
495 Function + args_read_string_and_trim _Bool FuriString*, FuriString*
496 Function - asctime char* const tm*
497 Function - asctime_r char* const tm*, char*
498 Function - asin double double
499 Function - asinf float float
500 Function - asinh double double
676 Function + cli_session_close void Cli*
677 Function + cli_session_open void Cli*, void*
678 Function + cli_write void Cli*, const uint8_t*, size_t
679 Function - clock clock_t
680 Function - copysign double double, double
681 Function - copysignf float float, float
682 Function - copysignl long double long double, long double
689 Function + crc32_calc_buffer uint32_t uint32_t, const void*, size_t
690 Function + crc32_calc_file uint32_t File*, const FileCrcProgressCb, void*
691 Function - ctermid char* char*
692 Function - ctime char* const time_t*
693 Function - ctime_r char* const time_t*, char*
694 Function - cuserid char* char*
695 Function + delete_mutex _Bool ValueMutex*
696 Function + dialog_ex_alloc DialogEx*
717 Function + dialog_message_set_text void DialogMessage*, const char*, uint8_t, uint8_t, Align, Align
718 Function + dialog_message_show DialogMessageButton DialogsApp*, const DialogMessage*
719 Function + dialog_message_show_storage_error void DialogsApp*, const char*
720 Function - difftime double time_t, time_t
721 Function - digital_signal_alloc DigitalSignal* uint32_t
722 Function - digital_signal_append _Bool DigitalSignal*, DigitalSignal*
723 Function - digital_signal_free void DigitalSignal*
1530 Function - gets char* char*
1531 Function - getsubopt int char**, char**, char**
1532 Function - getw int FILE*
1533 Function - gmtime tm* const time_t*
1534 Function - gmtime_r tm* const time_t*, tm*
1535 Function + gui_add_framebuffer_callback void Gui*, GuiCanvasCommitCallback, void*
1536 Function + gui_add_view_port void Gui*, ViewPort*, GuiLayer
1537 Function + gui_get_framebuffer_size size_t Gui*
1731 Function + loading_alloc Loading*
1732 Function + loading_free void Loading*
1733 Function + loading_get_view View* Loading*
1734 Function - localtime tm* const time_t*
1735 Function - localtime_r tm* const time_t*, tm*
1736 Function - log double double
1737 Function - log10 double double
1738 Function - log10f float float
1761 Function + manchester_encoder_finish ManchesterEncoderResult ManchesterEncoderState*
1762 Function + manchester_encoder_reset void ManchesterEncoderState*
1763 Function + maxim_crc8 uint8_t const uint8_t*, const uint8_t, const uint8_t
1764 Function - mbedtls_des3_crypt_cbc int mbedtls_des3_context*, int, size_t, unsigned char[8], const unsigned char*, unsigned char*
1765 Function - mbedtls_des3_crypt_ecb int mbedtls_des3_context*, const unsigned char[8], unsigned char[8]
1766 Function - mbedtls_des3_free void mbedtls_des3_context*
1767 Function - mbedtls_des3_init void mbedtls_des3_context*
1768 Function - mbedtls_des3_set2key_dec int mbedtls_des3_context*, const unsigned char[8 * 2]
1769 Function - mbedtls_des3_set2key_enc int mbedtls_des3_context*, const unsigned char[8 * 2]
1770 Function - mbedtls_des3_set3key_dec int mbedtls_des3_context*, const unsigned char[8 * 3]
1771 Function - mbedtls_des3_set3key_enc int mbedtls_des3_context*, const unsigned char[8 * 3]
1772 Function - mbedtls_des_crypt_cbc int mbedtls_des_context*, int, size_t, unsigned char[8], const unsigned char*, unsigned char*
1773 Function - mbedtls_des_crypt_ecb int mbedtls_des_context*, const unsigned char[8], unsigned char[8]
1774 Function - mbedtls_des_free void mbedtls_des_context*
1775 Function - mbedtls_des_init void mbedtls_des_context*
1776 Function - mbedtls_des_key_check_key_parity int const unsigned char[8]
1777 Function - mbedtls_des_key_check_weak int const unsigned char[8]
1778 Function - mbedtls_des_key_set_parity void unsigned char[8]
1779 Function - mbedtls_des_self_test int int
1780 Function - mbedtls_des_setkey void uint32_t[32], const unsigned char[8]
1781 Function - mbedtls_des_setkey_dec int mbedtls_des_context*, const unsigned char[8]
1782 Function - mbedtls_des_setkey_enc int mbedtls_des_context*, const unsigned char[8]
1783 Function - mbedtls_internal_sha1_process int mbedtls_sha1_context*, const unsigned char[64]
1784 Function - mbedtls_platform_gmtime_r tm* const mbedtls_time_t*, tm*
1785 Function - mbedtls_platform_zeroize void void*, size_t
1786 Function - mbedtls_sha1 int const unsigned char*, size_t, unsigned char[20]
1787 Function - mbedtls_sha1_clone void mbedtls_sha1_context*, const mbedtls_sha1_context*
1788 Function - mbedtls_sha1_finish int mbedtls_sha1_context*, unsigned char[20]
1789 Function - mbedtls_sha1_free void mbedtls_sha1_context*
1790 Function - mbedtls_sha1_init void mbedtls_sha1_context*
1791 Function - mbedtls_sha1_self_test int int
1792 Function - mbedtls_sha1_starts int mbedtls_sha1_context*
1793 Function - mbedtls_sha1_update int mbedtls_sha1_context*, const unsigned char*, size_t
1794 Function - mblen int const char*, size_t
1795 Function - mbstowcs size_t wchar_t*, const char*, size_t
1796 Function - mbtowc int wchar_t*, const char*, size_t
1831 Function - mkstemp int char*
1832 Function - mkstemps int char*, int
1833 Function - mktemp char* char*
1834 Function - mktime time_t tm*
1835 Function - modf double double, double*
1836 Function - modff float float, float*
1837 Function - modfl long double long double, long double*
2372 Function - strerror char* int
2373 Function - strerror_l char* int, locale_t
2374 Function - strerror_r char* int, char*, size_t
2375 Function - strftime size_t char*, size_t, const char*, const tm*
2376 Function - strftime_l size_t char*, size_t, const char*, const tm*, locale_t
2377 Function + string_stream_alloc Stream*
2378 Function - strlcat size_t char*, const char*, size_t
2379 Function + strlcpy size_t char*, const char*, size_t
2388 Function - strnlen size_t const char*, size_t
2389 Function - strnstr char* const char*, const char*, size_t
2390 Function - strpbrk char* const char*, const char*
2391 Function - strptime char* const char*, const char*, tm*
2392 Function - strptime_l char* const char*, const char*, tm*, locale_t
2393 Function + strrchr char* const char*, int
2394 Function - strsep char* char**, const char*
2395 Function - strsignal char* int
3000 Function - tgamma double double
3001 Function - tgammaf float float
3002 Function - tgammal long double long double
3003 Function - time time_t time_t*
3004 Function + timerCalculateTimer uint32_t uint16_t
3005 Function - timerDelay void uint16_t
3006 Function + timerIsExpired _Bool uint32_t
4073 Function - u8x8_utf8_init void u8x8_t*
4074 Function - u8x8_utf8_next uint16_t u8x8_t*, uint8_t
4075 Function - u8x8_utoa const char* uint16_t
4076 Function - tzset void
4077 Function - uECC_compress void const uint8_t*, uint8_t*, uECC_Curve
4078 Function + uECC_compute_public_key int const uint8_t*, uint8_t*, uECC_Curve
4079 Function - uECC_curve_private_key_size int uECC_Curve
4332 Variable - SmpsPrescalerTable const uint32_t[4][6]
4333 Variable + SystemCoreClock uint32_t
4334 Variable + _ctype_ const char[]
4335 Variable - _daylight int
4336 Variable + _global_impure_ptr _reent*
4337 Variable + _impure_ptr _reent*
4338 Variable - _sys_errlist const char*[]
4339 Variable - _sys_nerr int
4340 Variable - _timezone long
4341 Variable - _tzname char*[2]
4342 Variable + cli_vcp CliSession
4343 Variable + furi_hal_i2c_bus_external FuriHalI2cBus
4344 Variable + furi_hal_i2c_bus_power FuriHalI2cBus

View File

@@ -20,6 +20,7 @@ typedef enum {
InputKeyLeft, InputKeyLeft,
InputKeyOk, InputKeyOk,
InputKeyBack, InputKeyBack,
InputKeyMAX, /**< Special value */
} InputKey; } InputKey;
/* Light */ /* Light */

View File

@@ -17,12 +17,12 @@ env.Append(
"lib/print", "lib/print",
], ],
SDK_HEADERS=[ SDK_HEADERS=[
File("#/lib/one_wire/one_wire_host_timing.h"), File("one_wire/one_wire_host_timing.h"),
File("#/lib/one_wire/one_wire_host.h"), File("one_wire/one_wire_host.h"),
File("#/lib/one_wire/one_wire_slave.h"), File("one_wire/one_wire_slave.h"),
File("#/lib/one_wire/one_wire_device.h"), File("one_wire/one_wire_device.h"),
File("#/lib/one_wire/ibutton/ibutton_worker.h"), File("one_wire/ibutton/ibutton_worker.h"),
File("#/lib/one_wire/maxim_crc.h"), File("one_wire/maxim_crc.h"),
File("#/lib/u8g2/u8g2.h"), File("#/lib/u8g2/u8g2.h"),
], ],
) )

View File

@@ -5,7 +5,7 @@ env.Append(
"#/lib/flipper_application", "#/lib/flipper_application",
], ],
SDK_HEADERS=[ SDK_HEADERS=[
File("#/lib/flipper_application/flipper_application.h"), File("flipper_application.h"),
], ],
) )

View File

@@ -5,8 +5,8 @@ env.Append(
"#/lib/flipper_format", "#/lib/flipper_format",
], ],
SDK_HEADERS=[ SDK_HEADERS=[
File("#/lib/flipper_format/flipper_format.h"), File("flipper_format.h"),
File("#/lib/flipper_format/flipper_format_i.h"), File("flipper_format_i.h"),
], ],
) )

View File

@@ -6,9 +6,9 @@ env.Append(
"#/lib/infrared/worker", "#/lib/infrared/worker",
], ],
SDK_HEADERS=[ SDK_HEADERS=[
File("#/lib/infrared/worker/infrared_transmit.h"), File("encoder_decoder/infrared.h"),
File("#/lib/infrared/worker/infrared_worker.h"), File("worker/infrared_worker.h"),
File("#/lib/infrared/encoder_decoder/infrared.h"), File("worker/infrared_transmit.h"),
], ],
) )

View File

@@ -8,12 +8,12 @@ env.Append(
"#/lib/lfrfid", "#/lib/lfrfid",
], ],
SDK_HEADERS=[ SDK_HEADERS=[
File("#/lib/lfrfid/lfrfid_worker.h"), File("lfrfid_worker.h"),
File("#/lib/lfrfid/lfrfid_raw_worker.h"), File("lfrfid_raw_worker.h"),
File("#/lib/lfrfid/lfrfid_raw_file.h"), File("lfrfid_raw_file.h"),
File("#/lib/lfrfid/lfrfid_dict_file.h"), File("lfrfid_dict_file.h"),
File("#/lib/lfrfid/tools/bit_lib.h"), File("tools/bit_lib.h"),
File("#/lib/lfrfid/protocols/lfrfid_protocols.h"), File("protocols/lfrfid_protocols.h"),
], ],
) )

View File

@@ -7,6 +7,10 @@ env.Append(
CPPDEFINES=[ CPPDEFINES=[
("USB_PMASIZE", "0x400"), ("USB_PMASIZE", "0x400"),
], ],
SDK_HEADERS=env.GlobRecursive(
"*.h",
Dir("libusb_stm32/inc"),
),
) )

View File

@@ -5,6 +5,10 @@ env.Append(
"#/lib/mbedtls", "#/lib/mbedtls",
"#/lib/mbedtls/include", "#/lib/mbedtls/include",
], ],
SDK_HEADERS=[
File("mbedtls/include/mbedtls/des.h"),
File("mbedtls/include/mbedtls/sha1.h"),
],
) )

View File

@@ -13,7 +13,7 @@ env.Append(
"PB_ENABLE_MALLOC", "PB_ENABLE_MALLOC",
], ],
SDK_HEADERS=[ SDK_HEADERS=[
File("#/lib/micro-ecc/uECC.h"), File("micro-ecc/uECC.h"),
], ],
) )

View File

@@ -98,7 +98,7 @@ for wrapped_fn in wrapped_fn_list:
env.Append( env.Append(
SDK_HEADERS=[ SDK_HEADERS=[
File("#/lib/print/wrappers.h"), File("wrappers.h"),
], ],
) )

View File

@@ -8,23 +8,23 @@ env.Append(
"#/lib/toolbox", "#/lib/toolbox",
], ],
SDK_HEADERS=[ SDK_HEADERS=[
File("#/lib/toolbox/manchester_decoder.h"), File("manchester_decoder.h"),
File("#/lib/toolbox/manchester_encoder.h"), File("manchester_encoder.h"),
File("#/lib/toolbox/path.h"), File("path.h"),
File("#/lib/toolbox/random_name.h"), File("random_name.h"),
File("#/lib/toolbox/hmac_sha256.h"), File("hmac_sha256.h"),
File("#/lib/toolbox/crc32_calc.h"), File("crc32_calc.h"),
File("#/lib/toolbox/dir_walk.h"), File("dir_walk.h"),
File("#/lib/toolbox/md5.h"), File("md5.h"),
File("#/lib/toolbox/args.h"), File("args.h"),
File("#/lib/toolbox/saved_struct.h"), File("saved_struct.h"),
File("#/lib/toolbox/version.h"), File("version.h"),
File("#/lib/toolbox/tar/tar_archive.h"), File("tar/tar_archive.h"),
File("#/lib/toolbox/stream/stream.h"), File("stream/stream.h"),
File("#/lib/toolbox/stream/file_stream.h"), File("stream/file_stream.h"),
File("#/lib/toolbox/stream/string_stream.h"), File("stream/string_stream.h"),
File("#/lib/toolbox/stream/buffered_file_stream.h"), File("stream/buffered_file_stream.h"),
File("#/lib/toolbox/protocols/protocol_dict.h"), File("protocols/protocol_dict.h"),
], ],
) )

View File

@@ -1,11 +1,11 @@
import SCons import SCons
from SCons.Subst import quote_spaces from SCons.Subst import quote_spaces
from SCons.Errors import StopError from SCons.Errors import StopError
from SCons.Node.FS import _my_normcase
import re import re
import os import os
import random
import string
WINPATHSEP_RE = re.compile(r"\\([^\"'\\]|$)") WINPATHSEP_RE = re.compile(r"\\([^\"'\\]|$)")
@@ -41,3 +41,14 @@ def link_dir(target_path, source_path, is_windows):
def single_quote(arg_list): def single_quote(arg_list):
return " ".join(f"'{arg}'" if " " in arg else str(arg) for arg in arg_list) return " ".join(f"'{arg}'" if " " in arg else str(arg) for arg in arg_list)
def extract_abs_dir_path(node):
if isinstance(node, SCons.Node.FS.EntryProxy):
node = node.get()
for repo_dir in node.get_all_rdirs():
if os.path.exists(repo_dir.abspath):
return repo_dir.abspath
raise StopError(f"Can't find absolute path for {node.name}")

View File

@@ -37,6 +37,21 @@ def _get_tool_version(env, tool):
def generate(env, **kw): def generate(env, **kw):
if not env.get("VERBOSE", False):
env.SetDefault(
CCCOMSTR="\tCC\t${SOURCE}",
CXXCOMSTR="\tCPP\t${SOURCE}",
ASCOMSTR="\tASM\t${SOURCE}",
ARCOMSTR="\tAR\t${TARGET}",
RANLIBCOMSTR="\tRANLIB\t${TARGET}",
LINKCOMSTR="\tLINK\t${TARGET}",
INSTALLSTR="\tINSTALL\t${TARGET}",
APPSCOMSTR="\tAPPS\t${TARGET}",
VERSIONCOMSTR="\tVERSION\t${TARGET}",
STRIPCOMSTR="\tSTRIP\t${TARGET}",
OBJDUMPCOMSTR="\tOBJDUMP\t${TARGET}",
)
for orig_tool in (asm, gcc, gxx, ar, gnulink, strip, gdb, objdump): for orig_tool in (asm, gcc, gxx, ar, gnulink, strip, gdb, objdump):
orig_tool.generate(env) orig_tool.generate(env)
env.SetDefault( env.SetDefault(

View File

@@ -2,7 +2,7 @@ from SCons.Builder import Builder
from SCons.Action import Action from SCons.Action import Action
from SCons.Warnings import warn, WarningOnByDefault from SCons.Warnings import warn, WarningOnByDefault
import SCons import SCons
import os.path from ansi.color import fg
from fbt.appmanifest import ( from fbt.appmanifest import (
FlipperAppType, FlipperAppType,
@@ -16,21 +16,20 @@ from fbt.appmanifest import (
# AppBuildset env["APPBUILD"] - contains subset of apps, filtered for current config # AppBuildset env["APPBUILD"] - contains subset of apps, filtered for current config
def LoadApplicationManifests(env): def LoadAppManifest(env, entry):
appmgr = env["APPMGR"] = AppManager() try:
for app_dir, _ in env["APPDIRS"]: APP_MANIFEST_NAME = "application.fam"
app_dir_node = env.Dir("#").Dir(app_dir) manifest_glob = entry.glob(APP_MANIFEST_NAME)
if len(manifest_glob) == 0:
raise FlipperManifestException(
f"Folder {entry}: manifest {APP_MANIFEST_NAME} is missing"
)
for entry in app_dir_node.glob("*", ondisk=True, source=True): app_manifest_file_path = manifest_glob[0].rfile().abspath
if isinstance(entry, SCons.Node.FS.Dir) and not str(entry).startswith("."): env["APPMGR"].load_manifest(app_manifest_file_path, entry)
try: env.Append(PY_LINT_SOURCES=[app_manifest_file_path])
app_manifest_file_path = os.path.join( except FlipperManifestException as e:
entry.abspath, "application.fam" warn(WarningOnByDefault, str(e))
)
appmgr.load_manifest(app_manifest_file_path, entry)
env.Append(PY_LINT_SOURCES=[app_manifest_file_path])
except FlipperManifestException as e:
warn(WarningOnByDefault, str(e))
def PrepareApplicationsBuild(env): def PrepareApplicationsBuild(env):
@@ -46,12 +45,12 @@ def PrepareApplicationsBuild(env):
def DumpApplicationConfig(target, source, env): def DumpApplicationConfig(target, source, env):
print(f"Loaded {len(env['APPMGR'].known_apps)} app definitions.") print(f"Loaded {len(env['APPMGR'].known_apps)} app definitions.")
print("Firmware modules configuration:") print(fg.boldgreen("Firmware modules configuration:"))
for apptype in FlipperAppType: for apptype in FlipperAppType:
app_sublist = env["APPBUILD"].get_apps_of_type(apptype) app_sublist = env["APPBUILD"].get_apps_of_type(apptype)
if app_sublist: if app_sublist:
print( print(
f"{apptype.value}:\n\t", fg.green(f"{apptype.value}:\n\t"),
", ".join(app.appid for app in app_sublist), ", ".join(app.appid for app in app_sublist),
) )
@@ -65,8 +64,11 @@ def build_apps_c(target, source, env):
def generate(env): def generate(env):
env.AddMethod(LoadApplicationManifests) env.AddMethod(LoadAppManifest)
env.AddMethod(PrepareApplicationsBuild) env.AddMethod(PrepareApplicationsBuild)
env.SetDefault(
APPMGR=AppManager(),
)
env.Append( env.Append(
BUILDERS={ BUILDERS={

View File

@@ -1,11 +1,10 @@
import SCons
from SCons.Builder import Builder from SCons.Builder import Builder
from SCons.Action import Action from SCons.Action import Action
from SCons.Node.FS import File from SCons.Errors import SConsEnvironmentError
import os import os
import subprocess import subprocess
from ansi.color import fg
def icons_emitter(target, source, env): def icons_emitter(target, source, env):
@@ -13,7 +12,6 @@ def icons_emitter(target, source, env):
target[0].File(env.subst("${ICON_FILE_NAME}.c")), target[0].File(env.subst("${ICON_FILE_NAME}.c")),
target[0].File(env.subst("${ICON_FILE_NAME}.h")), target[0].File(env.subst("${ICON_FILE_NAME}.h")),
] ]
source = env.GlobRecursive("*.*", env["ICON_SRC_DIR"])
return target, source return target, source
@@ -86,7 +84,7 @@ def proto_ver_generator(target, source, env):
) )
except (subprocess.CalledProcessError, EnvironmentError) as e: except (subprocess.CalledProcessError, EnvironmentError) as e:
# Not great, not terrible # Not great, not terrible
print("Git: fetch failed") print(fg.boldred("Git: fetch failed"))
try: try:
git_describe = _invoke_git( git_describe = _invoke_git(
@@ -94,10 +92,8 @@ def proto_ver_generator(target, source, env):
source_dir=src_dir, source_dir=src_dir,
) )
except (subprocess.CalledProcessError, EnvironmentError) as e: except (subprocess.CalledProcessError, EnvironmentError) as e:
print("Git: describe failed") raise SConsEnvironmentError("Git: describe failed")
Exit("git error")
# print("describe=", git_describe)
git_major, git_minor = git_describe.split(".") git_major, git_minor = git_describe.split(".")
version_file_data = ( version_file_data = (
"#pragma once", "#pragma once",
@@ -116,7 +112,7 @@ def CompileIcons(env, target_dir, source_dir, *, icon_bundle_name="assets_icons"
icons = env.IconBuilder( icons = env.IconBuilder(
target_dir, target_dir,
ICON_SRC_DIR=source_dir, source_dir,
ICON_FILE_NAME=icon_bundle_name, ICON_FILE_NAME=icon_bundle_name,
) )
env.Depends(icons, icons_src) env.Depends(icons, icons_src)
@@ -125,8 +121,8 @@ def CompileIcons(env, target_dir, source_dir, *, icon_bundle_name="assets_icons"
def generate(env): def generate(env):
env.SetDefault( env.SetDefault(
ASSETS_COMPILER="${ROOT_DIR.abspath}/scripts/assets.py", ASSETS_COMPILER="${FBT_SCRIPT_DIR}/assets.py",
NANOPB_COMPILER="${ROOT_DIR.abspath}/lib/nanopb/generator/nanopb_generator.py", NANOPB_COMPILER="${ROOT_DIR}/lib/nanopb/generator/nanopb_generator.py",
) )
env.AddMethod(CompileIcons) env.AddMethod(CompileIcons)
@@ -143,7 +139,7 @@ def generate(env):
BUILDERS={ BUILDERS={
"IconBuilder": Builder( "IconBuilder": Builder(
action=Action( action=Action(
'${PYTHON3} "${ASSETS_COMPILER}" icons ${ICON_SRC_DIR} ${TARGET.dir} --filename ${ICON_FILE_NAME}', '${PYTHON3} "${ASSETS_COMPILER}" icons ${ABSPATHGETTERFUNC(SOURCE)} ${TARGET.dir} --filename ${ICON_FILE_NAME}',
"${ICONSCOMSTR}", "${ICONSCOMSTR}",
), ),
emitter=icons_emitter, emitter=icons_emitter,

View File

@@ -103,7 +103,7 @@ def DistCommand(env, name, source, **kw):
command = env.Command( command = env.Command(
target, target,
source, source,
'@${PYTHON3} "${ROOT_DIR.abspath}/scripts/sconsdist.py" copy -p ${DIST_PROJECTS} -s "${DIST_SUFFIX}" ${DIST_EXTRA}', '@${PYTHON3} "${DIST_SCRIPT}" copy -p ${DIST_PROJECTS} -s "${DIST_SUFFIX}" ${DIST_EXTRA}',
**kw, **kw,
) )
env.Pseudo(target) env.Pseudo(target)
@@ -121,6 +121,9 @@ def generate(env):
env.SetDefault( env.SetDefault(
COPRO_MCU_FAMILY="STM32WB5x", COPRO_MCU_FAMILY="STM32WB5x",
SELFUPDATE_SCRIPT="${FBT_SCRIPT_DIR}/selfupdate.py",
DIST_SCRIPT="${FBT_SCRIPT_DIR}/sconsdist.py",
COPRO_ASSETS_SCRIPT="${FBT_SCRIPT_DIR}/assets.py",
) )
env.Append( env.Append(
@@ -128,7 +131,7 @@ def generate(env):
"UsbInstall": Builder( "UsbInstall": Builder(
action=[ action=[
Action( Action(
'${PYTHON3} "${ROOT_DIR.abspath}/scripts/selfupdate.py" dist/${DIST_DIR}/f${TARGET_HW}-update-${DIST_SUFFIX}/update.fuf' '${PYTHON3} "${SELFUPDATE_SCRIPT}" dist/${DIST_DIR}/f${TARGET_HW}-update-${DIST_SUFFIX}/update.fuf'
), ),
Touch("${TARGET}"), Touch("${TARGET}"),
] ]
@@ -136,7 +139,7 @@ def generate(env):
"CoproBuilder": Builder( "CoproBuilder": Builder(
action=Action( action=Action(
[ [
'${PYTHON3} "${ROOT_DIR.abspath}/scripts/assets.py" ' '${PYTHON3} "${COPRO_ASSETS_SCRIPT}" '
"copro ${COPRO_CUBE_DIR} " "copro ${COPRO_CUBE_DIR} "
"${TARGET} ${COPRO_MCU_FAMILY} " "${TARGET} ${COPRO_MCU_FAMILY} "
"--cube_ver=${COPRO_CUBE_VERSION} " "--cube_ver=${COPRO_CUBE_VERSION} "

View File

@@ -1,15 +1,18 @@
import shutil
from SCons.Builder import Builder from SCons.Builder import Builder
from SCons.Action import Action from SCons.Action import Action
from SCons.Errors import UserError from SCons.Errors import UserError
import SCons.Warnings import SCons.Warnings
import os
import pathlib
from fbt.elfmanifest import assemble_manifest_data from fbt.elfmanifest import assemble_manifest_data
from fbt.appmanifest import FlipperApplication, FlipperManifestException from fbt.appmanifest import FlipperApplication, FlipperManifestException
from fbt.sdk.cache import SdkCache from fbt.sdk.cache import SdkCache
from fbt.util import extract_abs_dir_path
import os
import pathlib
import itertools import itertools
import shutil
from ansi.color import fg from ansi.color import fg
@@ -62,7 +65,7 @@ def BuildAppElf(env, app):
lib_src_root_path = os.path.join(app_work_dir, "lib", lib_def.name) lib_src_root_path = os.path.join(app_work_dir, "lib", lib_def.name)
app_env.AppendUnique( app_env.AppendUnique(
CPPPATH=list( CPPPATH=list(
app_env.Dir(lib_src_root_path).Dir(incpath).srcnode() app_env.Dir(lib_src_root_path).Dir(incpath).srcnode().rfile().abspath
for incpath in lib_def.fap_include_paths for incpath in lib_def.fap_include_paths
), ),
) )
@@ -82,7 +85,12 @@ def BuildAppElf(env, app):
*lib_def.cflags, *lib_def.cflags,
], ],
CPPDEFINES=lib_def.cdefines, CPPDEFINES=lib_def.cdefines,
CPPPATH=list(map(app._appdir.Dir, lib_def.cincludes)), CPPPATH=list(
map(
lambda cpath: extract_abs_dir_path(app._appdir.Dir(cpath)),
lib_def.cincludes,
)
),
) )
lib = private_lib_env.StaticLibrary( lib = private_lib_env.StaticLibrary(
@@ -157,7 +165,6 @@ def prepare_app_metadata(target, source, env):
app = env["APP"] app = env["APP"]
meta_file_name = source[0].path + ".meta" meta_file_name = source[0].path + ".meta"
with open(meta_file_name, "wb") as f: with open(meta_file_name, "wb") as f:
# f.write(f"hello this is {app}")
f.write( f.write(
assemble_manifest_data( assemble_manifest_data(
app_manifest=app, app_manifest=app,
@@ -236,7 +243,10 @@ def fap_dist_action(target, source, env):
def generate(env, **kw): def generate(env, **kw):
env.SetDefault(EXT_APPS_WORK_DIR=kw.get("EXT_APPS_WORK_DIR")) env.SetDefault(
EXT_APPS_WORK_DIR=kw.get("EXT_APPS_WORK_DIR"),
APP_RUN_SCRIPT="${FBT_SCRIPT_DIR}/runfap.py",
)
if not env["VERBOSE"]: if not env["VERBOSE"]:
env.SetDefault( env.SetDefault(

View File

@@ -46,7 +46,9 @@ def prebuild_sdk_emitter(target, source, env):
def prebuild_sdk_create_origin_file(target, source, env): def prebuild_sdk_create_origin_file(target, source, env):
mega_file = env.subst("${TARGET}.c", target=target[0]) mega_file = env.subst("${TARGET}.c", target=target[0])
with open(mega_file, "wt") as sdk_c: with open(mega_file, "wt") as sdk_c:
sdk_c.write("\n".join(f"#include <{h.path}>" for h in env["SDK_HEADERS"])) sdk_c.write(
"\n".join(f"#include <{h.srcnode().path}>" for h in env["SDK_HEADERS"])
)
class SdkMeta: class SdkMeta:
@@ -62,18 +64,25 @@ class SdkMeta:
"cc_args": self._wrap_scons_vars("$CCFLAGS $_CCCOMCOM"), "cc_args": self._wrap_scons_vars("$CCFLAGS $_CCCOMCOM"),
"cpp_args": self._wrap_scons_vars("$CXXFLAGS $CCFLAGS $_CCCOMCOM"), "cpp_args": self._wrap_scons_vars("$CXXFLAGS $CCFLAGS $_CCCOMCOM"),
"linker_args": self._wrap_scons_vars("$LINKFLAGS"), "linker_args": self._wrap_scons_vars("$LINKFLAGS"),
"linker_script": self.env.subst("${LINKER_SCRIPT_PATH}"), "linker_libs": self.env.subst("${LIBS}"),
"app_ep_subst": self.env.subst("${APP_ENTRY}"),
"sdk_path_subst": self.env.subst("${SDK_DIR_SUBST}"),
"hardware": self.env.subst("${TARGET_HW}"),
} }
with open(json_manifest_path, "wt") as f: with open(json_manifest_path, "wt") as f:
json.dump(meta_contents, f, indent=4) json.dump(meta_contents, f, indent=4)
def _wrap_scons_vars(self, vars: str): def _wrap_scons_vars(self, vars: str):
expanded_vars = self.env.subst(vars, target=Entry("dummy")) expanded_vars = self.env.subst(
vars,
target=Entry("dummy"),
)
return expanded_vars.replace("\\", "/") return expanded_vars.replace("\\", "/")
class SdkTreeBuilder: class SdkTreeBuilder:
SDK_DIR_SUBST = "SDK_ROOT_DIR" SDK_DIR_SUBST = "SDK_ROOT_DIR"
SDK_APP_EP_SUBST = "SDK_APP_EP_SUBST"
def __init__(self, env, target, source) -> None: def __init__(self, env, target, source) -> None:
self.env = env self.env = env
@@ -87,6 +96,11 @@ class SdkTreeBuilder:
self.sdk_root_dir = target[0].Dir(".") self.sdk_root_dir = target[0].Dir(".")
self.sdk_deploy_dir = self.sdk_root_dir.Dir(self.target_sdk_dir_name) self.sdk_deploy_dir = self.sdk_root_dir.Dir(self.target_sdk_dir_name)
self.sdk_env = self.env.Clone(
APP_ENTRY=self.SDK_APP_EP_SUBST,
SDK_DIR_SUBST=self.SDK_DIR_SUBST,
)
def _parse_sdk_depends(self): def _parse_sdk_depends(self):
deps_file = self.source[0] deps_file = self.source[0]
with open(deps_file.path, "rt") as deps_f: with open(deps_file.path, "rt") as deps_f:
@@ -95,38 +109,36 @@ class SdkTreeBuilder:
self.header_depends = list( self.header_depends = list(
filter(lambda fname: fname.endswith(".h"), depends.split()), filter(lambda fname: fname.endswith(".h"), depends.split()),
) )
self.header_depends.append(self.env.subst("${LINKER_SCRIPT_PATH}")) self.header_depends.append(self.sdk_env.subst("${LINKER_SCRIPT_PATH}"))
self.header_depends.append(self.env.subst("${SDK_DEFINITION}")) self.header_depends.append(self.sdk_env.subst("${SDK_DEFINITION}"))
self.header_dirs = sorted( self.header_dirs = sorted(
set(map(os.path.normpath, map(os.path.dirname, self.header_depends))) set(map(os.path.normpath, map(os.path.dirname, self.header_depends)))
) )
def _generate_sdk_meta(self): def _generate_sdk_meta(self):
filtered_paths = [self.target_sdk_dir_name] filtered_paths = ["."]
full_fw_paths = list( full_fw_paths = list(
map( map(
os.path.normpath, os.path.normpath,
(self.env.Dir(inc_dir).relpath for inc_dir in self.env["CPPPATH"]), (
self.sdk_env.Dir(inc_dir).relpath
for inc_dir in self.sdk_env["CPPPATH"]
),
) )
) )
sdk_dirs = ", ".join(f"'{dir}'" for dir in self.header_dirs) sdk_dirs = ", ".join(f"'{dir}'" for dir in self.header_dirs)
filtered_paths.extend( filtered_paths.extend(
map( filter(lambda path: path in sdk_dirs, full_fw_paths),
self.build_sdk_file_path,
filter(lambda path: path in sdk_dirs, full_fw_paths),
)
) )
filtered_paths = list(map(self.build_sdk_file_path, filtered_paths))
sdk_env = self.env.Clone() self.sdk_env.Replace(
sdk_env.Replace(
CPPPATH=filtered_paths, CPPPATH=filtered_paths,
LINKER_SCRIPT=self.env.subst("${APP_LINKER_SCRIPT}"),
ORIG_LINKER_SCRIPT_PATH=self.env["LINKER_SCRIPT_PATH"], ORIG_LINKER_SCRIPT_PATH=self.env["LINKER_SCRIPT_PATH"],
LINKER_SCRIPT_PATH=self.build_sdk_file_path("${ORIG_LINKER_SCRIPT_PATH}"), LINKER_SCRIPT_PATH=self.build_sdk_file_path("${ORIG_LINKER_SCRIPT_PATH}"),
) )
meta = SdkMeta(self.sdk_env, self)
meta = SdkMeta(sdk_env, self)
meta.save_to(self.target[0].path) meta.save_to(self.target[0].path)
def build_sdk_file_path(self, orig_path: str) -> str: def build_sdk_file_path(self, orig_path: str) -> str:
@@ -211,7 +223,7 @@ def validate_sdk_cache(source, target, env):
current_sdk = SdkCollector() current_sdk = SdkCollector()
current_sdk.process_source_file_for_sdk(source[0].path) current_sdk.process_source_file_for_sdk(source[0].path)
for h in env["SDK_HEADERS"]: for h in env["SDK_HEADERS"]:
current_sdk.add_header_to_sdk(pathlib.Path(h.path).as_posix()) current_sdk.add_header_to_sdk(pathlib.Path(h.srcnode().path).as_posix())
sdk_cache = SdkCache(target[0].path) sdk_cache = SdkCache(target[0].path)
sdk_cache.validate_api(current_sdk.get_api()) sdk_cache.validate_api(current_sdk.get_api())

View File

@@ -12,11 +12,14 @@ def version_emitter(target, source, env):
def generate(env): def generate(env):
env.SetDefault(
VERSION_SCRIPT="${FBT_SCRIPT_DIR}/version.py",
)
env.Append( env.Append(
BUILDERS={ BUILDERS={
"VersionBuilder": Builder( "VersionBuilder": Builder(
action=Action( action=Action(
'${PYTHON3} "${ROOT_DIR.abspath}/scripts/version.py" generate -t ${TARGET_HW} -o ${TARGET.dir.posix} --dir "${ROOT_DIR}"', '${PYTHON3} "${VERSION_SCRIPT}" generate -t ${TARGET_HW} -o ${TARGET.dir.posix} --dir "${ROOT_DIR}"',
"${VERSIONCOMSTR}", "${VERSIONCOMSTR}",
), ),
emitter=version_emitter, emitter=version_emitter,

View File

@@ -8,7 +8,8 @@ __NM_ARM_BIN = "arm-none-eabi-nm"
def generate(env): def generate(env):
env.SetDefault( env.SetDefault(
BIN2DFU="${ROOT_DIR.abspath}/scripts/bin2dfu.py", BIN2DFU="${FBT_SCRIPT_DIR}/bin2dfu.py",
BIN_SIZE_SCRIPT="${FBT_SCRIPT_DIR}/fwsize.py",
OBJCOPY=__OBJCOPY_ARM_BIN, # FIXME OBJCOPY=__OBJCOPY_ARM_BIN, # FIXME
NM=__NM_ARM_BIN, # FIXME NM=__NM_ARM_BIN, # FIXME
) )

View File

@@ -1,6 +1,7 @@
import logging import logging
import argparse import argparse
import sys import sys
import colorlog
class App: class App:
@@ -10,7 +11,7 @@ class App:
self.parser = argparse.ArgumentParser() self.parser = argparse.ArgumentParser()
self.parser.add_argument("-d", "--debug", action="store_true", help="Debug") self.parser.add_argument("-d", "--debug", action="store_true", help="Debug")
# Logging # Logging
self.logger = logging.getLogger() self.logger = colorlog.getLogger()
# Application specific initialization # Application specific initialization
self.init() self.init()
@@ -21,10 +22,17 @@ class App:
self.log_level = logging.DEBUG if self.args.debug else logging.INFO self.log_level = logging.DEBUG if self.args.debug else logging.INFO
self.logger.setLevel(self.log_level) self.logger.setLevel(self.log_level)
if not self.logger.hasHandlers(): if not self.logger.hasHandlers():
self.handler = logging.StreamHandler(sys.stdout) self.handler = colorlog.StreamHandler(sys.stdout)
self.handler.setLevel(self.log_level) self.handler.setLevel(self.log_level)
self.formatter = logging.Formatter( self.formatter = colorlog.ColoredFormatter(
"%(asctime)s [%(levelname)s] %(message)s" "%(log_color)s%(asctime)s [%(levelname)s] %(message)s",
log_colors={
"DEBUG": "cyan",
# "INFO": "white",
"WARNING": "yellow",
"ERROR": "red",
"CRITICAL": "red,bg_white",
},
) )
self.handler.setFormatter(self.formatter) self.handler.setFormatter(self.formatter)
self.logger.addHandler(self.handler) self.logger.addHandler(self.handler)

View File

@@ -131,7 +131,9 @@ class Main(App):
self.copy_single_project(project) self.copy_single_project(project)
self.logger.info( self.logger.info(
fg.green(f"Firmware binaries can be found at:\n\t{self.output_dir_path}") fg.boldgreen(
f"Firmware binaries can be found at:\n\t{self.output_dir_path}"
)
) )
if self.args.version: if self.args.version:
@@ -175,7 +177,7 @@ class Main(App):
if (bundle_result := UpdateMain(no_exit=True)(bundle_args)) == 0: if (bundle_result := UpdateMain(no_exit=True)(bundle_args)) == 0:
self.logger.info( self.logger.info(
fg.green( fg.boldgreen(
f"Use this directory to self-update your Flipper:\n\t{bundle_dir}" f"Use this directory to self-update your Flipper:\n\t{bundle_dir}"
) )
) )

0
scripts/testing/await_flipper.py Normal file → Executable file
View File

0
scripts/testing/units.py Normal file → Executable file
View File

View File

@@ -13,19 +13,22 @@ if not [%FBT_NOENV%] == [] (
exit /b 0 exit /b 0
) )
set "FLIPPER_TOOLCHAIN_VERSION=16" set "FLIPPER_TOOLCHAIN_VERSION=17"
set "FBT_TOOLCHAIN_ROOT=%FBT_ROOT%\toolchain\x86_64-windows"
if [%FBT_TOOLCHAIN_ROOT%] == [] (
set "FBT_TOOLCHAIN_ROOT=%FBT_ROOT%\toolchain\x86_64-windows"
)
if not exist "%FBT_TOOLCHAIN_ROOT%" ( if not exist "%FBT_TOOLCHAIN_ROOT%" (
powershell -ExecutionPolicy Bypass -File "%FBT_ROOT%\scripts\toolchain\windows-toolchain-download.ps1" "%flipper_toolchain_version%" powershell -ExecutionPolicy Bypass -File "%FBT_ROOT%\scripts\toolchain\windows-toolchain-download.ps1" "%flipper_toolchain_version%" "%FBT_TOOLCHAIN_ROOT%"
) )
if not exist "%FBT_TOOLCHAIN_ROOT%\VERSION" ( if not exist "%FBT_TOOLCHAIN_ROOT%\VERSION" (
powershell -ExecutionPolicy Bypass -File "%FBT_ROOT%\scripts\toolchain\windows-toolchain-download.ps1" "%flipper_toolchain_version%" powershell -ExecutionPolicy Bypass -File "%FBT_ROOT%\scripts\toolchain\windows-toolchain-download.ps1" "%flipper_toolchain_version%" "%FBT_TOOLCHAIN_ROOT%"
) )
set /p REAL_TOOLCHAIN_VERSION=<"%FBT_TOOLCHAIN_ROOT%\VERSION" set /p REAL_TOOLCHAIN_VERSION=<"%FBT_TOOLCHAIN_ROOT%\VERSION"
if not "%REAL_TOOLCHAIN_VERSION%" == "%FLIPPER_TOOLCHAIN_VERSION%" ( if not "%REAL_TOOLCHAIN_VERSION%" == "%FLIPPER_TOOLCHAIN_VERSION%" (
powershell -ExecutionPolicy Bypass -File "%FBT_ROOT%\scripts\toolchain\windows-toolchain-download.ps1" "%flipper_toolchain_version%" powershell -ExecutionPolicy Bypass -File "%FBT_ROOT%\scripts\toolchain\windows-toolchain-download.ps1" "%flipper_toolchain_version%" "%FBT_TOOLCHAIN_ROOT%"
) )

View File

@@ -5,7 +5,7 @@
# public variables # public variables
DEFAULT_SCRIPT_PATH="$(pwd -P)"; DEFAULT_SCRIPT_PATH="$(pwd -P)";
SCRIPT_PATH="${SCRIPT_PATH:-$DEFAULT_SCRIPT_PATH}"; SCRIPT_PATH="${SCRIPT_PATH:-$DEFAULT_SCRIPT_PATH}";
FBT_TOOLCHAIN_VERSION="${FBT_TOOLCHAIN_VERSION:-"16"}"; FBT_TOOLCHAIN_VERSION="${FBT_TOOLCHAIN_VERSION:-"17"}";
FBT_TOOLCHAIN_PATH="${FBT_TOOLCHAIN_PATH:-$SCRIPT_PATH}"; FBT_TOOLCHAIN_PATH="${FBT_TOOLCHAIN_PATH:-$SCRIPT_PATH}";
fbtenv_show_usage() fbtenv_show_usage()
@@ -62,7 +62,7 @@ fbtenv_check_sourced()
fbtenv_show_usage; fbtenv_show_usage;
return 1; return 1;
fi fi
case ${0##*/} in dash|-dash|bash|-bash|ksh|-ksh|sh|-sh|*.sh|fbt) case ${0##*/} in dash|-dash|bash|-bash|ksh|-ksh|sh|-sh|*.sh|fbt|ufbt)
return 0;; return 0;;
esac esac
fbtenv_show_usage; fbtenv_show_usage;
@@ -76,8 +76,8 @@ fbtenv_chck_many_source()
return 0; return 0;
fi fi
fi fi
echo "Warning! FBT environment script sourced more than once!"; echo "Warning! FBT environment script was sourced more than once!";
echo "This may signal that you are making mistakes, please open a new shell!"; echo "You might be doing things wrong, please open a new shell!";
return 1; return 1;
} }
@@ -93,8 +93,8 @@ fbtenv_set_shell_prompt()
fbtenv_check_script_path() fbtenv_check_script_path()
{ {
if [ ! -x "$SCRIPT_PATH/fbt" ]; then if [ ! -x "$SCRIPT_PATH/fbt" ] && [ ! -x "$SCRIPT_PATH/ufbt" ] ; then
echo "Please source this script being into flipperzero-firmware root directory, or specify 'SCRIPT_PATH' manually"; echo "Please source this script from [u]fbt root directory, or specify 'SCRIPT_PATH' variable manually";
echo "Example:"; echo "Example:";
printf "\tSCRIPT_PATH=lang/c/flipperzero-firmware source lang/c/flipperzero-firmware/scripts/fbtenv.sh\n"; printf "\tSCRIPT_PATH=lang/c/flipperzero-firmware source lang/c/flipperzero-firmware/scripts/fbtenv.sh\n";
echo "If current directory is right, type 'unset SCRIPT_PATH' and try again" echo "If current directory is right, type 'unset SCRIPT_PATH' and try again"
@@ -108,7 +108,7 @@ fbtenv_get_kernel_type()
SYS_TYPE="$(uname -s)"; SYS_TYPE="$(uname -s)";
ARCH_TYPE="$(uname -m)"; ARCH_TYPE="$(uname -m)";
if [ "$ARCH_TYPE" != "x86_64" ] && [ "$SYS_TYPE" != "Darwin" ]; then if [ "$ARCH_TYPE" != "x86_64" ] && [ "$SYS_TYPE" != "Darwin" ]; then
echo "Now we provide toolchain only for x86_64 arhitecture, sorry.."; echo "We only provide toolchain for x86_64 CPUs, sorry..";
return 1; return 1;
fi fi
if [ "$SYS_TYPE" = "Darwin" ]; then if [ "$SYS_TYPE" = "Darwin" ]; then
@@ -129,10 +129,10 @@ fbtenv_get_kernel_type()
TOOLCHAIN_URL=$FBT_TOOLS_CUSTOM_LINK; TOOLCHAIN_URL=$FBT_TOOLS_CUSTOM_LINK;
fi fi
elif echo "$SYS_TYPE" | grep -q "MINGW"; then elif echo "$SYS_TYPE" | grep -q "MINGW"; then
echo "In MinGW shell use \"fbt.cmd\" instead of \"fbt\""; echo "In MinGW shell use \"[u]fbt.cmd\" instead of \"[u]fbt\"";
return 1; return 1;
else else
echo "Your system is not recognized. Sorry.. Please report us your configuration."; echo "Your system configuration is not supported. Sorry.. Please report us your configuration.";
return 1; return 1;
fi fi
return 0; return 0;
@@ -152,7 +152,7 @@ fbtenv_check_rosetta()
fbtenv_check_tar() fbtenv_check_tar()
{ {
printf "Checking tar.."; printf "Checking for tar..";
if ! tar --version > /dev/null 2>&1; then if ! tar --version > /dev/null 2>&1; then
echo "no"; echo "no";
return 1; return 1;
@@ -163,7 +163,7 @@ fbtenv_check_tar()
fbtenv_check_downloaded_toolchain() fbtenv_check_downloaded_toolchain()
{ {
printf "Checking downloaded toolchain tgz.."; printf "Checking if downloaded toolchain tgz exists..";
if [ ! -f "$FBT_TOOLCHAIN_PATH/toolchain/$TOOLCHAIN_TAR" ]; then if [ ! -f "$FBT_TOOLCHAIN_PATH/toolchain/$TOOLCHAIN_TAR" ]; then
echo "no"; echo "no";
return 1; return 1;
@@ -214,7 +214,7 @@ fbtenv_unpack_toolchain()
fbtenv_clearing() fbtenv_clearing()
{ {
printf "Clearing.."; printf "Cleaning up..";
if [ -n "${FBT_TOOLCHAIN_PATH:-""}" ]; then if [ -n "${FBT_TOOLCHAIN_PATH:-""}" ]; then
rm -rf "${FBT_TOOLCHAIN_PATH:?}/toolchain/"*.tar.gz; rm -rf "${FBT_TOOLCHAIN_PATH:?}/toolchain/"*.tar.gz;
rm -rf "${FBT_TOOLCHAIN_PATH:?}/toolchain/"*.part; rm -rf "${FBT_TOOLCHAIN_PATH:?}/toolchain/"*.part;

View File

@@ -1,34 +1,46 @@
Set-StrictMode -Version 2.0 Set-StrictMode -Version 2.0
$ErrorActionPreference = "Stop" $ErrorActionPreference = "Stop"
[Net.ServicePointManager]::SecurityProtocol = "tls12, tls11, tls" [Net.ServicePointManager]::SecurityProtocol = "tls12, tls11, tls"
$repo_root = (Get-Item "$PSScriptRoot\..\..").FullName # TODO: fix
$download_dir = (Get-Item "$PSScriptRoot\..\..").FullName
$toolchain_version = $args[0] $toolchain_version = $args[0]
$toolchain_url = "https://update.flipperzero.one/builds/toolchain/gcc-arm-none-eabi-10.3-x86_64-windows-flipper-$toolchain_version.zip" $toolchain_target_path = $args[1]
$toolchain_zip = "gcc-arm-none-eabi-10.3-x86_64-windows-flipper-$toolchain_version.zip"
$toolchain_dir = "gcc-arm-none-eabi-10.3-x86_64-windows-flipper"
if (Test-Path -LiteralPath "$repo_root\toolchain\x86_64-windows") { $toolchain_url = "https://update.flipperzero.one/builds/toolchain/gcc-arm-none-eabi-10.3-x86_64-windows-flipper-$toolchain_version.zip"
$toolchain_dist_folder = "gcc-arm-none-eabi-10.3-x86_64-windows-flipper"
$toolchain_zip = "$toolchain_dist_folder-$toolchain_version.zip"
$toolchain_zip_temp_path = "$download_dir\$toolchain_zip"
$toolchain_dist_temp_path = "$download_dir\$toolchain_dist_folder"
if (Test-Path -LiteralPath "$toolchain_target_path") {
Write-Host -NoNewline "Removing old Windows toolchain.." Write-Host -NoNewline "Removing old Windows toolchain.."
Remove-Item -LiteralPath "$repo_root\toolchain\x86_64-windows" -Force -Recurse Remove-Item -LiteralPath "$toolchain_target_path" -Force -Recurse
Write-Host "done!" Write-Host "done!"
} }
if (!(Test-Path -Path "$repo_root\$toolchain_zip" -PathType Leaf)) { if (!(Test-Path -Path "$toolchain_zip_temp_path" -PathType Leaf)) {
Write-Host -NoNewline "Downloading Windows toolchain.." Write-Host -NoNewline "Downloading Windows toolchain.."
$wc = New-Object net.webclient $wc = New-Object net.webclient
$wc.Downloadfile("$toolchain_url", "$repo_root\$toolchain_zip") $wc.Downloadfile("$toolchain_url", "$toolchain_zip_temp_path")
Write-Host "done!" Write-Host "done!"
} }
if (!(Test-Path -LiteralPath "$repo_root\toolchain")) { if (!(Test-Path -LiteralPath "$toolchain_target_path\..")) {
New-Item "$repo_root\toolchain" -ItemType Directory New-Item "$toolchain_target_path\.." -ItemType Directory -Force
} }
Write-Host -NoNewline "Extracting Windows toolchain.." Write-Host -NoNewline "Extracting Windows toolchain.."
# This is faster than Expand-Archive
Add-Type -Assembly "System.IO.Compression.Filesystem" Add-Type -Assembly "System.IO.Compression.Filesystem"
[System.IO.Compression.ZipFile]::ExtractToDirectory("$repo_root\$toolchain_zip", "$repo_root\") [System.IO.Compression.ZipFile]::ExtractToDirectory("$toolchain_zip_temp_path", "$download_dir")
Move-Item -Path "$repo_root\$toolchain_dir" -Destination "$repo_root\toolchain\x86_64-windows" # Expand-Archive -LiteralPath "$toolchain_zip_temp_path" -DestinationPath "$download_dir"
Write-Host -NoNewline "moving.."
Move-Item -LiteralPath "$toolchain_dist_temp_path" -Destination "$toolchain_target_path"
Write-Host "done!" Write-Host "done!"
Write-Host -NoNewline "Cleaning up temporary files.." Write-Host -NoNewline "Cleaning up temporary files.."
Remove-Item -LiteralPath "$repo_root\$toolchain_zip" -Force Remove-Item -LiteralPath "$toolchain_zip_temp_path" -Force
Write-Host "done!" Write-Host "done!"
# dasdasd

View File

@@ -30,10 +30,9 @@ ENV.AppendUnique(
"-ffunction-sections", "-ffunction-sections",
"-fsingle-precision-constant", "-fsingle-precision-constant",
"-fno-math-errno", "-fno-math-errno",
"-fstack-usage", # Generates .su files with stack usage information
# "-fstack-usage",
"-g", "-g",
# "-Wno-stringop-overread",
# "-Wno-stringop-overflow",
], ],
CPPDEFINES=[ CPPDEFINES=[
"_GNU_SOURCE", "_GNU_SOURCE",

View File

@@ -1,5 +1,10 @@
from SCons.Platform import TempFileMunge from SCons.Platform import TempFileMunge
from fbt.util import tempfile_arg_esc_func, single_quote, wrap_tempfile from fbt.util import (
tempfile_arg_esc_func,
single_quote,
wrap_tempfile,
extract_abs_dir_path,
)
import os import os
import multiprocessing import multiprocessing
@@ -53,6 +58,12 @@ coreenv = VAR_ENV.Clone(
MAXLINELENGTH=2048, MAXLINELENGTH=2048,
PROGSUFFIX=".elf", PROGSUFFIX=".elf",
ENV=forward_os_env, ENV=forward_os_env,
SINGLEQUOTEFUNC=single_quote,
ABSPATHGETTERFUNC=extract_abs_dir_path,
# Setting up temp file parameters - to overcome command line length limits
TEMPFILEARGESCFUNC=tempfile_arg_esc_func,
FBT_SCRIPT_DIR=Dir("#/scripts"),
ROOT_DIR=Dir("#"),
) )
# If DIST_SUFFIX is set in environment, is has precedence (set by CI) # If DIST_SUFFIX is set in environment, is has precedence (set by CI)
@@ -61,24 +72,6 @@ if os_suffix := os.environ.get("DIST_SUFFIX", None):
DIST_SUFFIX=os_suffix, DIST_SUFFIX=os_suffix,
) )
# print(coreenv.Dump())
if not coreenv["VERBOSE"]:
coreenv.SetDefault(
CCCOMSTR="\tCC\t${SOURCE}",
CXXCOMSTR="\tCPP\t${SOURCE}",
ASCOMSTR="\tASM\t${SOURCE}",
ARCOMSTR="\tAR\t${TARGET}",
RANLIBCOMSTR="\tRANLIB\t${TARGET}",
LINKCOMSTR="\tLINK\t${TARGET}",
INSTALLSTR="\tINSTALL\t${TARGET}",
APPSCOMSTR="\tAPPS\t${TARGET}",
VERSIONCOMSTR="\tVERSION\t${TARGET}",
STRIPCOMSTR="\tSTRIP\t${TARGET}",
OBJDUMPCOMSTR="\tOBJDUMP\t${TARGET}",
# GDBCOMSTR="\tGDB\t${SOURCE}",
# GDBPYCOMSTR="\tGDB-PY\t${SOURCE}",
)
# Default value for commandline options # Default value for commandline options
SetOption("num_jobs", multiprocessing.cpu_count()) SetOption("num_jobs", multiprocessing.cpu_count())
@@ -91,12 +84,7 @@ SetOption("max_drift", 1)
# Random task queue - to discover isses with build logic faster # Random task queue - to discover isses with build logic faster
# SetOption("random", 1) # SetOption("random", 1)
# Setting up temp file parameters - to overcome command line length limits
coreenv["TEMPFILEARGESCFUNC"] = tempfile_arg_esc_func
wrap_tempfile(coreenv, "LINKCOM") wrap_tempfile(coreenv, "LINKCOM")
wrap_tempfile(coreenv, "ARCOM") wrap_tempfile(coreenv, "ARCOM")
coreenv["SINGLEQUOTEFUNC"] = single_quote
Return("coreenv") Return("coreenv")

View File

@@ -3,10 +3,9 @@ from SCons.Errors import UserError
Import("ENV") Import("ENV")
from fbt.appmanifest import FlipperAppType from fbt.appmanifest import FlipperAppType
appenv = ENV.Clone( appenv = ENV["APPENV"] = ENV.Clone(
tools=[ tools=[
( (
"fbt_extapps", "fbt_extapps",
@@ -17,6 +16,7 @@ appenv = ENV.Clone(
}, },
), ),
"fbt_assets", "fbt_assets",
"fbt_sdk",
] ]
) )
@@ -66,6 +66,7 @@ extapps = appenv["_extapps"] = {
"validators": {}, "validators": {},
"dist": {}, "dist": {},
"resources_dist": None, "resources_dist": None,
"sdk_tree": None,
} }
@@ -115,10 +116,41 @@ if appsrc := appenv.subst("$APPSRC"):
app_manifest, fap_file, app_validator = appenv.GetExtAppFromPath(appsrc) app_manifest, fap_file, app_validator = appenv.GetExtAppFromPath(appsrc)
appenv.PhonyTarget( appenv.PhonyTarget(
"launch_app", "launch_app",
'${PYTHON3} scripts/runfap.py ${SOURCE} --fap_dst_dir "/ext/apps/${FAP_CATEGORY}"', '${PYTHON3} "${APP_RUN_SCRIPT}" ${SOURCE} --fap_dst_dir "/ext/apps/${FAP_CATEGORY}"',
source=fap_file, source=fap_file,
FAP_CATEGORY=app_manifest.fap_category, FAP_CATEGORY=app_manifest.fap_category,
) )
appenv.Alias("launch_app", app_validator) appenv.Alias("launch_app", app_validator)
# SDK management
sdk_origin_path = "${BUILD_DIR}/sdk_origin"
sdk_source = appenv.SDKPrebuilder(
sdk_origin_path,
# Deps on root SDK headers and generated files
(appenv["SDK_HEADERS"], appenv["FW_ASSETS_HEADERS"]),
)
# Extra deps on headers included in deeper levels
Depends(sdk_source, appenv.ProcessSdkDepends(f"{sdk_origin_path}.d"))
appenv["SDK_DIR"] = appenv.Dir("${BUILD_DIR}/sdk")
sdk_tree = extapps["sdk_tree"] = appenv.SDKTree(appenv["SDK_DIR"], sdk_origin_path)
# AlwaysBuild(sdk_tree)
Alias("sdk_tree", sdk_tree)
sdk_apicheck = appenv.SDKSymUpdater(appenv["SDK_DEFINITION"], sdk_origin_path)
Precious(sdk_apicheck)
NoClean(sdk_apicheck)
AlwaysBuild(sdk_apicheck)
Alias("sdk_check", sdk_apicheck)
sdk_apisyms = appenv.SDKSymGenerator(
"${BUILD_DIR}/assets/compiled/symbols.h", appenv["SDK_DEFINITION"]
)
Alias("api_syms", sdk_apisyms)
if appenv["FORCE"]:
appenv.AlwaysBuild(sdk_source, sdk_tree, sdk_apicheck, sdk_apisyms)
Return("extapps") Return("extapps")